@cartanova/qgrid-cli 2.10.10 → 2.11.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 (313) hide show
  1. package/bundle/dist/_virtual/_rolldown/runtime.js +1 -10
  2. package/bundle/dist/application/monit/log-buffer.js +12 -6
  3. package/bundle/dist/application/monit/monit.frame.js +11 -3
  4. package/bundle/dist/application/monit/monit.types.js +1 -1
  5. package/bundle/dist/application/qgrid/conv-routing.js +9 -6
  6. package/bundle/dist/application/qgrid/expired-token-reminder.js +2 -2
  7. package/bundle/dist/application/qgrid/oauth.js +31 -4
  8. package/bundle/dist/application/qgrid/qgrid-image-generation.js +1 -1
  9. package/bundle/dist/application/qgrid/qgrid-response-format.js +21 -19
  10. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +40 -33
  11. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +128 -93
  12. package/bundle/dist/application/qgrid/qgrid.frame.js +930 -49
  13. package/bundle/dist/application/qgrid/qgrid.types.js +212 -5
  14. package/bundle/dist/application/qgrid/schema-prompt.js +75 -48
  15. package/bundle/dist/application/qgrid/slack-user-map.js +1 -1
  16. package/bundle/dist/application/qgrid/token-death.js +1 -1
  17. package/bundle/dist/application/qgrid/token-subscriber.js +83 -30
  18. package/bundle/dist/application/qgrid/token-trigger-setup.js +1 -1
  19. package/bundle/dist/application/qgrid/token-window-keepalive.js +8 -6
  20. package/bundle/dist/application/qgrid/tool-emulation-schema.js +13 -13
  21. package/bundle/dist/application/qgrid/tool-emulation.js +19 -15
  22. package/bundle/dist/application/request-log/json-schema-type-text.js +29 -12
  23. package/bundle/dist/application/request-log/request-log.model.js +83 -70
  24. package/bundle/dist/application/request-log/request-log.types.js +1 -1
  25. package/bundle/dist/application/request-log/zod-code-format.js +1 -1
  26. package/bundle/dist/application/request-log-step/request-log-step.model.js +1 -1
  27. package/bundle/dist/application/request-log-step/request-log-step.types.js +1 -1
  28. package/bundle/dist/application/setting/setting.constant.js +1 -1
  29. package/bundle/dist/application/setting/setting.model.js +2 -2
  30. package/bundle/dist/application/setting/setting.store.js +2 -2
  31. package/bundle/dist/application/setting/setting.types.js +1 -1
  32. package/bundle/dist/application/sonamu.generated.js +32 -16
  33. package/bundle/dist/application/sonamu.generated.sso.js +1 -1
  34. package/bundle/dist/application/token/token.model.js +26 -9
  35. package/bundle/dist/application/token/token.types.js +20 -3
  36. package/bundle/dist/i18n/en.js +15 -1
  37. package/bundle/dist/i18n/ko.js +15 -1
  38. package/bundle/dist/i18n/sd.generated.js +1 -1
  39. package/bundle/dist/migrations/20260807133553_manual__backfill_request_log_cost.js +8 -6
  40. package/bundle/dist/server-bootstrap.js +4 -2
  41. package/bundle/dist/server-error-handler.js +1 -1
  42. package/bundle/dist/sonamu.config.js +37 -8
  43. package/bundle/dist/startup-migrations.js +17 -7
  44. package/bundle/dist/testing/global.js +1 -1
  45. package/bundle/dist/testing/schema-bench.js +0 -0
  46. package/bundle/dist/testing/test-database-name.js +1 -1
  47. package/bundle/dist/utils/providers/anthropic/anthropic-constants.js +1 -1
  48. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +11 -5
  49. package/bundle/dist/utils/providers/anthropic/anthropic-quota.js +4 -4
  50. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  51. package/bundle/dist/utils/providers/anthropic/claude-session.js +20 -19
  52. package/bundle/dist/utils/providers/anthropic/fence-strip.js +1 -1
  53. package/bundle/dist/utils/providers/anthropic/stream-json-adapter.js +49 -23
  54. package/bundle/dist/utils/providers/common/credentials.js +5 -1
  55. package/bundle/dist/utils/providers/common/effort.js +3 -3
  56. package/bundle/dist/utils/providers/common/model-cost.js +69 -14
  57. package/bundle/dist/utils/providers/common/provider-types.js +29 -1
  58. package/bundle/dist/utils/providers/common/schema-validation.js +78 -40
  59. package/bundle/dist/utils/providers/common/smooth-weighted-round-robin.js +1 -1
  60. package/bundle/dist/utils/providers/common/strictifier.js +62 -43
  61. package/bundle/dist/utils/providers/common/thinking.js +3 -2
  62. package/bundle/dist/utils/providers/common/ttft.js +1 -1
  63. package/bundle/dist/utils/providers/grok/grok-backend-protocol.js +427 -0
  64. package/bundle/dist/utils/providers/grok/grok-constants.js +55 -0
  65. package/bundle/dist/utils/providers/grok/grok-direct-client.js +196 -0
  66. package/bundle/dist/utils/providers/grok/grok-dispatcher.js +1313 -0
  67. package/bundle/dist/utils/providers/grok/grok-headers.js +118 -0
  68. package/bundle/dist/utils/providers/grok/grok-media-client.js +420 -0
  69. package/bundle/dist/utils/providers/grok/grok-models.js +114 -0
  70. package/bundle/dist/utils/providers/grok/grok-oauth.js +455 -0
  71. package/bundle/dist/utils/providers/grok/grok-quota.js +119 -0
  72. package/bundle/dist/utils/providers/grok/grok-refresh.js +192 -0
  73. package/bundle/dist/utils/providers/grok/grok-types.js +186 -0
  74. package/bundle/dist/utils/providers/grok/grok-voice-client.js +199 -0
  75. package/bundle/dist/utils/providers/grok/index.js +11 -0
  76. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +111 -83
  77. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +3 -2
  78. package/bundle/dist/utils/providers/openai/openai-constants.js +1 -1
  79. package/bundle/dist/utils/providers/openai/openai-direct-client.js +23 -7
  80. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +143 -106
  81. package/bundle/dist/utils/providers/openai/openai-image-generation.js +48 -33
  82. package/bundle/dist/utils/providers/openai/openai-oauth.js +28 -13
  83. package/bundle/dist/utils/providers/openai/openai-quota.js +38 -27
  84. package/bundle/dist/utils/providers/openai/openai-refresh.js +17 -9
  85. package/bundle/dist/utils/providers/openai/openai-sse.js +1 -1
  86. package/bundle/dist/utils/providers/openai/openai-transport-config.js +1 -1
  87. package/bundle/dist/utils/quiet-hours.js +1 -1
  88. package/bundle/dist/utils/slack-notify.js +14 -8
  89. package/bundle/dist/utils/subset-loaders.js +4 -5
  90. package/bundle/src/application/monit/log-buffer.ts +23 -9
  91. package/bundle/src/application/monit/monit.frame.ts +22 -5
  92. package/bundle/src/application/monit/monit.types.ts +6 -0
  93. package/bundle/src/application/qgrid/conv-routing.test.ts +76 -4
  94. package/bundle/src/application/qgrid/conv-routing.ts +35 -9
  95. package/bundle/src/application/qgrid/expired-token-reminder.ts +9 -1
  96. package/bundle/src/application/qgrid/oauth.ts +51 -15
  97. package/bundle/src/application/qgrid/qgrid-image-generation.ts +9 -0
  98. package/bundle/src/application/qgrid/qgrid-response-format.ts +50 -25
  99. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +19 -0
  100. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +84 -40
  101. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +97 -0
  102. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +274 -126
  103. package/bundle/src/application/qgrid/qgrid.frame.test.ts +1013 -3
  104. package/bundle/src/application/qgrid/qgrid.frame.ts +1415 -60
  105. package/bundle/src/application/qgrid/qgrid.types.ts +335 -0
  106. package/bundle/src/application/qgrid/schema-prompt.ts +105 -41
  107. package/bundle/src/application/qgrid/slack-user-map.ts +5 -0
  108. package/bundle/src/application/qgrid/token-death.ts +4 -0
  109. package/bundle/src/application/qgrid/token-subscriber.test.ts +21 -19
  110. package/bundle/src/application/qgrid/token-subscriber.ts +186 -53
  111. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -0
  112. package/bundle/src/application/qgrid/token-window-keepalive.ts +49 -6
  113. package/bundle/src/application/qgrid/tool-emulation-schema.ts +33 -29
  114. package/bundle/src/application/qgrid/tool-emulation.ts +52 -27
  115. package/bundle/src/application/request-log/json-schema-type-text.test.ts +5 -5
  116. package/bundle/src/application/request-log/json-schema-type-text.ts +81 -26
  117. package/bundle/src/application/request-log/request-log.model.test.ts +111 -4
  118. package/bundle/src/application/request-log/request-log.model.ts +277 -146
  119. package/bundle/src/application/request-log/request-log.types.ts +6 -0
  120. package/bundle/src/application/request-log/zod-code-format.ts +11 -0
  121. package/bundle/src/application/request-log-step/request-log-step.model.ts +1 -0
  122. package/bundle/src/application/request-log-step/request-log-step.types.ts +2 -0
  123. package/bundle/src/application/setting/setting.constant.ts +9 -0
  124. package/bundle/src/application/setting/setting.model.ts +12 -2
  125. package/bundle/src/application/setting/setting.store.ts +5 -1
  126. package/bundle/src/application/setting/setting.types.ts +8 -0
  127. package/bundle/src/application/sonamu.generated.http +133 -0
  128. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  129. package/bundle/src/application/sonamu.generated.ts +15 -0
  130. package/bundle/src/application/token/token.identity.test.ts +20 -0
  131. package/bundle/src/application/token/token.model.ts +66 -7
  132. package/bundle/src/application/token/token.types.ts +24 -1
  133. package/bundle/src/i18n/en.ts +19 -0
  134. package/bundle/src/i18n/ko.ts +21 -0
  135. package/bundle/src/i18n/sd.generated.ts +23 -2
  136. package/bundle/src/migrations/20260807133553_manual__backfill_request_log_cost.ts +16 -8
  137. package/bundle/src/server-bootstrap.ts +4 -2
  138. package/bundle/src/server-error-handler.ts +1 -0
  139. package/bundle/src/sonamu.config.ts +69 -7
  140. package/bundle/src/startup-migrations.ts +27 -9
  141. package/bundle/src/testing/global.ts +20 -0
  142. package/bundle/src/testing/schema-bench.ts +105 -30
  143. package/bundle/src/testing/test-database-name.ts +2 -0
  144. package/bundle/src/utils/providers/anthropic/anthropic-constants.ts +8 -0
  145. package/bundle/src/utils/providers/anthropic/anthropic-dispatcher.ts +41 -6
  146. package/bundle/src/utils/providers/anthropic/anthropic-quota.ts +7 -3
  147. package/bundle/src/utils/providers/anthropic/anthropic-thinking.ts +6 -0
  148. package/bundle/src/utils/providers/anthropic/claude-session.ts +58 -24
  149. package/bundle/src/utils/providers/anthropic/fence-strip.ts +11 -0
  150. package/bundle/src/utils/providers/anthropic/stream-json-adapter.ts +110 -45
  151. package/bundle/src/utils/providers/common/credentials.ts +8 -0
  152. package/bundle/src/utils/providers/common/effort.ts +9 -2
  153. package/bundle/src/utils/providers/common/model-cost.test.ts +48 -1
  154. package/bundle/src/utils/providers/common/model-cost.ts +259 -158
  155. package/bundle/src/utils/providers/common/provider-dispatcher.ts +98 -2
  156. package/bundle/src/utils/providers/common/provider-types.ts +46 -3
  157. package/bundle/src/utils/providers/common/schema-validation.test.ts +5 -1
  158. package/bundle/src/utils/providers/common/schema-validation.ts +124 -56
  159. package/bundle/src/utils/providers/common/smooth-weighted-round-robin.ts +4 -0
  160. package/bundle/src/utils/providers/common/strictifier.ts +185 -59
  161. package/bundle/src/utils/providers/common/thinking.ts +2 -2
  162. package/bundle/src/utils/providers/common/ttft.ts +4 -2
  163. package/bundle/src/utils/providers/grok/__fixtures__/golden-responses-1.0.60.json +164 -0
  164. package/bundle/src/utils/providers/grok/grok-backend-protocol.test.ts +325 -0
  165. package/bundle/src/utils/providers/grok/grok-backend-protocol.ts +721 -0
  166. package/bundle/src/utils/providers/grok/grok-constants.ts +105 -0
  167. package/bundle/src/utils/providers/grok/grok-direct-client.test.ts +179 -0
  168. package/bundle/src/utils/providers/grok/grok-direct-client.ts +313 -0
  169. package/bundle/src/utils/providers/grok/grok-dispatcher.test.ts +1395 -0
  170. package/bundle/src/utils/providers/grok/grok-dispatcher.ts +2105 -0
  171. package/bundle/src/utils/providers/grok/grok-headers.test.ts +149 -0
  172. package/bundle/src/utils/providers/grok/grok-headers.ts +199 -0
  173. package/bundle/src/utils/providers/grok/grok-media-client.test.ts +446 -0
  174. package/bundle/src/utils/providers/grok/grok-media-client.ts +703 -0
  175. package/bundle/src/utils/providers/grok/grok-models.test.ts +96 -0
  176. package/bundle/src/utils/providers/grok/grok-models.ts +161 -0
  177. package/bundle/src/utils/providers/grok/grok-oauth.test.ts +406 -0
  178. package/bundle/src/utils/providers/grok/grok-oauth.ts +771 -0
  179. package/bundle/src/utils/providers/grok/grok-quota.test.ts +142 -0
  180. package/bundle/src/utils/providers/grok/grok-quota.ts +198 -0
  181. package/bundle/src/utils/providers/grok/grok-refresh.test.ts +239 -0
  182. package/bundle/src/utils/providers/grok/grok-refresh.ts +325 -0
  183. package/bundle/src/utils/providers/grok/grok-types.test.ts +252 -0
  184. package/bundle/src/utils/providers/grok/grok-types.ts +374 -0
  185. package/bundle/src/utils/providers/grok/grok-voice-client.test.ts +321 -0
  186. package/bundle/src/utils/providers/grok/grok-voice-client.ts +284 -0
  187. package/bundle/src/utils/providers/grok/index.ts +20 -0
  188. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +221 -137
  189. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +12 -1
  190. package/bundle/src/utils/providers/openai/openai-constants.ts +2 -0
  191. package/bundle/src/utils/providers/openai/openai-direct-client.ts +111 -21
  192. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +322 -169
  193. package/bundle/src/utils/providers/openai/openai-image-generation.ts +116 -36
  194. package/bundle/src/utils/providers/openai/openai-oauth.ts +48 -20
  195. package/bundle/src/utils/providers/openai/openai-quota.ts +77 -46
  196. package/bundle/src/utils/providers/openai/openai-refresh.ts +42 -18
  197. package/bundle/src/utils/providers/openai/openai-sse.ts +27 -3
  198. package/bundle/src/utils/providers/openai/openai-transport-config.ts +2 -0
  199. package/bundle/src/utils/quiet-hours.ts +12 -1
  200. package/bundle/src/utils/slack-notify.ts +44 -13
  201. package/bundle/src/utils/subset-loaders.ts +7 -7
  202. package/bundle/web-dist/client/assets/clsx-5XM_pHvN.js +1 -0
  203. package/bundle/web-dist/client/assets/index-BA7uQ-6c.js +31 -0
  204. package/bundle/web-dist/client/assets/index-Be2qCZmI.css +1 -0
  205. package/bundle/web-dist/client/assets/logs-C47OJGEI.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BS9no0dU.js +4 -0
  207. package/bundle/web-dist/client/assets/plus-sdACTfH0.js +1 -0
  208. package/bundle/web-dist/client/assets/refresh-cw-CY8o_1cT.js +1 -0
  209. package/bundle/web-dist/client/assets/request-model-BRtFuZvj.js +1 -0
  210. package/bundle/web-dist/client/assets/routes-kqgkUxE8.js +5 -0
  211. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-CefiDXEv.js} +5 -5
  212. package/bundle/web-dist/client/assets/settings-DNDvFGSw.js +1 -0
  213. package/bundle/web-dist/client/assets/show-u8Np69q3.js +2 -0
  214. package/bundle/web-dist/client/assets/tokens-QvP410NW.js +1 -0
  215. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  216. package/bundle/web-dist/client/assets/use-oauth-login-flow-Bzdh28Ws.js +1 -0
  217. package/bundle/web-dist/client/assets/use-update-token-mutation-CfJKaxmR.js +1 -0
  218. package/bundle/web-dist/client/assets/vendor-react-CUFFrVN9.js +244 -0
  219. package/bundle/web-dist/client/assets/vendor-tanstack-Bf_jag9G.js +1 -0
  220. package/bundle/web-dist/client/index.html +6 -6
  221. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  222. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-D8iTIHyn.js} +129 -2
  223. package/bundle/web-dist/server/assets/logs-B3OTd9hy.js +825 -0
  224. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-B2hqorPe.js} +385 -126
  225. package/bundle/web-dist/server/assets/plus-DwG7h9kq.js +28 -0
  226. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-BIYQzBqG.js} +2 -129
  227. package/bundle/web-dist/server/assets/refresh-cw-mMBkwOq0.js +44 -0
  228. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-I6OdODSH.js} +15 -6
  229. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-B95YlUv2.js} +760 -213
  230. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-DQATJ6qf.js} +12820 -12194
  231. package/bundle/web-dist/server/assets/settings-C3gbGk0m.js +830 -0
  232. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-Bxaj3rhH.js} +1350 -418
  233. package/bundle/web-dist/server/assets/tokens-CZjH3cB7.js +1038 -0
  234. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  235. package/bundle/web-dist/server/assets/use-oauth-login-flow-CKDHgc3U.js +2379 -0
  236. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-BEbgOzaa.js} +1 -1
  237. package/bundle/web-dist/server/entry-server.generated.js +4295 -22810
  238. package/dist/cli.js +9 -9
  239. package/package.json +4 -11
  240. package/postinstall.mjs +12 -0
  241. package/skills/qgrid/SKILL.md +1 -0
  242. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  243. package/skills/qgrid/references/decision-rationale.md +23 -0
  244. package/skills/qgrid/references/grok-runtime.md +89 -0
  245. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  246. package/skills/qgrid/references/repo-map.md +10 -0
  247. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  248. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  249. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  250. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  251. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  252. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  253. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  254. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  255. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  262. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  263. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  264. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  265. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  266. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  269. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  270. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  271. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  272. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  273. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  274. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  275. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  276. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  277. package/bundle/dist/node_modules/.pnpm/vite@8.0.3_@emnapi_core@1.11.2_@emnapi_runtime@1.11.2_@types_node@25.0.7_esbuild@0.27.4_5b35fc1fb85d2af4d105e0d74f940f50/node_modules/vite/dist/node/module-runner.js +0 -1265
  278. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/_commonjsHelpers.D26ty3Ew.js +0 -9
  279. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/benchmark.CX_oY03V.js +0 -41
  280. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/evaluatedModules.Dg1zASAC.js +0 -19
  281. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.Chj8NDwU.js +0 -202
  282. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/index.DdgEv5B1.js +0 -46
  283. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/rpc.MzXet3jl.js +0 -119
  284. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/test.DNmyFkvJ.js +0 -3044
  285. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/chunks/utils.BX5Fg8C4.js +0 -59
  286. package/bundle/dist/node_modules/.pnpm/vitest@4.1.10_@opentelemetry_api@1.9.0_@types_node@25.0.7_@vitest_coverage-v8@4.1.10_vi_a1977b93af7bb69308bcb1dbab39b618/node_modules/vitest/dist/index.js +0 -28
  287. package/bundle/dist/testing/setup-mocks.js +0 -16
  288. package/bundle/src/testing/setup-mocks.ts +0 -44
  289. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  290. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  291. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  292. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  293. package/bundle/web-dist/client/assets/plus-B62CuqT8.js +0 -1
  294. package/bundle/web-dist/client/assets/refresh-cw-NNcU0Cmq.js +0 -1
  295. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +0 -1
  296. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  297. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  298. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  299. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  300. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  301. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  302. package/bundle/web-dist/client/assets/vendor-react-DH4kUfK2.js +0 -9
  303. package/bundle/web-dist/client/assets/vendor-tanstack-DJRQAbrY.js +0 -1
  304. package/bundle/web-dist/server/assets/logs-BMyR98rU.js +0 -509
  305. package/bundle/web-dist/server/assets/plus-BZ9I0VgC.js +0 -19
  306. package/bundle/web-dist/server/assets/refresh-cw-CztCFis-.js +0 -23
  307. package/bundle/web-dist/server/assets/settings-CBUZ47Xx.js +0 -461
  308. package/bundle/web-dist/server/assets/tokens-DxrBW512.js +0 -448
  309. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  310. package/dist/cli.d.ts +0 -10
  311. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  312. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  313. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,887 +0,0 @@
1
- import y from "../../../../../tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js";
2
- //#region ../../node_modules/.pnpm/@vitest+pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js
3
- function _mergeNamespaces(n, m) {
4
- m.forEach(function(e) {
5
- e && typeof e !== "string" && !Array.isArray(e) && Object.keys(e).forEach(function(k) {
6
- if (k !== "default" && !(k in n)) {
7
- var d = Object.getOwnPropertyDescriptor(e, k);
8
- Object.defineProperty(n, k, d.get ? d : {
9
- enumerable: true,
10
- get: function() {
11
- return e[k];
12
- }
13
- });
14
- }
15
- });
16
- });
17
- return Object.freeze(n);
18
- }
19
- function getKeysOfEnumerableProperties(object, compareKeys) {
20
- const rawKeys = Object.keys(object);
21
- const keys = compareKeys === null ? rawKeys : rawKeys.sort(compareKeys);
22
- if (Object.getOwnPropertySymbols) {
23
- for (const symbol of Object.getOwnPropertySymbols(object)) if (Object.getOwnPropertyDescriptor(object, symbol).enumerable) keys.push(symbol);
24
- }
25
- return keys;
26
- }
27
- /**
28
- * Return entries (for example, of a map)
29
- * with spacing, indentation, and comma
30
- * without surrounding punctuation (for example, braces)
31
- */
32
- function printIteratorEntries(iterator, config, indentation, depth, refs, printer, separator = ": ") {
33
- let result = "";
34
- let width = 0;
35
- let current = iterator.next();
36
- if (!current.done) {
37
- result += config.spacingOuter;
38
- const indentationNext = indentation + config.indent;
39
- while (!current.done) {
40
- result += indentationNext;
41
- if (width++ === config.maxWidth) {
42
- result += "…";
43
- break;
44
- }
45
- const name = printer(current.value[0], config, indentationNext, depth, refs);
46
- const value = printer(current.value[1], config, indentationNext, depth, refs);
47
- result += name + separator + value;
48
- current = iterator.next();
49
- if (!current.done) result += `,${config.spacingInner}`;
50
- else if (!config.min) result += ",";
51
- }
52
- result += config.spacingOuter + indentation;
53
- }
54
- return result;
55
- }
56
- /**
57
- * Return values (for example, of a set)
58
- * with spacing, indentation, and comma
59
- * without surrounding punctuation (braces or brackets)
60
- */
61
- function printIteratorValues(iterator, config, indentation, depth, refs, printer) {
62
- let result = "";
63
- let width = 0;
64
- let current = iterator.next();
65
- if (!current.done) {
66
- result += config.spacingOuter;
67
- const indentationNext = indentation + config.indent;
68
- while (!current.done) {
69
- result += indentationNext;
70
- if (width++ === config.maxWidth) {
71
- result += "…";
72
- break;
73
- }
74
- result += printer(current.value, config, indentationNext, depth, refs);
75
- current = iterator.next();
76
- if (!current.done) result += `,${config.spacingInner}`;
77
- else if (!config.min) result += ",";
78
- }
79
- result += config.spacingOuter + indentation;
80
- }
81
- return result;
82
- }
83
- /**
84
- * Return items (for example, of an array)
85
- * with spacing, indentation, and comma
86
- * without surrounding punctuation (for example, brackets)
87
- */
88
- function printListItems(list, config, indentation, depth, refs, printer) {
89
- let result = "";
90
- list = list instanceof ArrayBuffer ? new DataView(list) : list;
91
- const isDataView = (l) => l instanceof DataView;
92
- const length = isDataView(list) ? list.byteLength : list.length;
93
- if (length > 0) {
94
- result += config.spacingOuter;
95
- const indentationNext = indentation + config.indent;
96
- for (let i = 0; i < length; i++) {
97
- result += indentationNext;
98
- if (i === config.maxWidth) {
99
- result += "…";
100
- break;
101
- }
102
- if (isDataView(list) || i in list) result += printer(isDataView(list) ? list.getInt8(i) : list[i], config, indentationNext, depth, refs);
103
- if (i < length - 1) result += `,${config.spacingInner}`;
104
- else if (!config.min) result += ",";
105
- }
106
- result += config.spacingOuter + indentation;
107
- }
108
- return result;
109
- }
110
- /**
111
- * Return properties of an object
112
- * with spacing, indentation, and comma
113
- * without surrounding punctuation (for example, braces)
114
- */
115
- function printObjectProperties(val, config, indentation, depth, refs, printer) {
116
- let result = "";
117
- const keys = getKeysOfEnumerableProperties(val, config.compareKeys);
118
- if (keys.length > 0) {
119
- result += config.spacingOuter;
120
- const indentationNext = indentation + config.indent;
121
- for (let i = 0; i < keys.length; i++) {
122
- const key = keys[i];
123
- const name = printer(key, config, indentationNext, depth, refs);
124
- const value = printer(val[key], config, indentationNext, depth, refs);
125
- result += `${indentationNext + name}: ${value}`;
126
- if (i < keys.length - 1) result += `,${config.spacingInner}`;
127
- else if (!config.min) result += ",";
128
- }
129
- result += config.spacingOuter + indentation;
130
- }
131
- return result;
132
- }
133
- const asymmetricMatcher = typeof Symbol === "function" && Symbol.for ? Symbol.for("jest.asymmetricMatcher") : 1267621;
134
- const SPACE$2 = " ";
135
- const serialize$5 = (val, config, indentation, depth, refs, printer) => {
136
- const stringedValue = val.toString();
137
- if (stringedValue === "ArrayContaining" || stringedValue === "ArrayNotContaining") {
138
- if (++depth > config.maxDepth) return `[${stringedValue}]`;
139
- return `${stringedValue + SPACE$2}[${printListItems(val.sample, config, indentation, depth, refs, printer)}]`;
140
- }
141
- if (stringedValue === "ObjectContaining" || stringedValue === "ObjectNotContaining") {
142
- if (++depth > config.maxDepth) return `[${stringedValue}]`;
143
- return `${stringedValue + SPACE$2}{${printObjectProperties(val.sample, config, indentation, depth, refs, printer)}}`;
144
- }
145
- if (stringedValue === "StringMatching" || stringedValue === "StringNotMatching") return stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs);
146
- if (stringedValue === "StringContaining" || stringedValue === "StringNotContaining") return stringedValue + SPACE$2 + printer(val.sample, config, indentation, depth, refs);
147
- if (typeof val.toAsymmetricMatcher !== "function") throw new TypeError(`Asymmetric matcher ${val.constructor.name} does not implement toAsymmetricMatcher()`);
148
- return val.toAsymmetricMatcher();
149
- };
150
- const test$5 = (val) => val && val.$$typeof === asymmetricMatcher;
151
- const plugin$5 = {
152
- serialize: serialize$5,
153
- test: test$5
154
- };
155
- const SPACE$1 = " ";
156
- const OBJECT_NAMES = /* @__PURE__ */ new Set(["DOMStringMap", "NamedNodeMap"]);
157
- const ARRAY_REGEXP = /^(?:HTML\w*Collection|NodeList)$/;
158
- function testName(name) {
159
- return OBJECT_NAMES.has(name) || ARRAY_REGEXP.test(name);
160
- }
161
- const test$4 = (val) => val && val.constructor && !!val.constructor.name && testName(val.constructor.name);
162
- function isNamedNodeMap(collection) {
163
- return collection.constructor.name === "NamedNodeMap";
164
- }
165
- const serialize$4 = (collection, config, indentation, depth, refs, printer) => {
166
- const name = collection.constructor.name;
167
- if (++depth > config.maxDepth) return `[${name}]`;
168
- return (config.min ? "" : name + SPACE$1) + (OBJECT_NAMES.has(name) ? `{${printObjectProperties(isNamedNodeMap(collection) ? [...collection].reduce((props, attribute) => {
169
- props[attribute.name] = attribute.value;
170
- return props;
171
- }, {}) : { ...collection }, config, indentation, depth, refs, printer)}}` : `[${printListItems([...collection], config, indentation, depth, refs, printer)}]`);
172
- };
173
- const plugin$4 = {
174
- serialize: serialize$4,
175
- test: test$4
176
- };
177
- /**
178
- * Copyright (c) Meta Platforms, Inc. and affiliates.
179
- *
180
- * This source code is licensed under the MIT license found in the
181
- * LICENSE file in the root directory of this source tree.
182
- */
183
- function escapeHTML(str) {
184
- return str.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
185
- }
186
- function printProps(keys, props, config, indentation, depth, refs, printer) {
187
- const indentationNext = indentation + config.indent;
188
- const colors = config.colors;
189
- return keys.map((key) => {
190
- const value = props[key];
191
- if (typeof value === "string" && value[0] === "_" && value.startsWith("__vitest_") && value.match(/__vitest_\d+__/)) return "";
192
- let printed = printer(value, config, indentationNext, depth, refs);
193
- if (typeof value !== "string") {
194
- if (printed.includes("\n")) printed = config.spacingOuter + indentationNext + printed + config.spacingOuter + indentation;
195
- printed = `{${printed}}`;
196
- }
197
- return `${config.spacingInner + indentation + colors.prop.open + key + colors.prop.close}=${colors.value.open}${printed}${colors.value.close}`;
198
- }).join("");
199
- }
200
- function printChildren(children, config, indentation, depth, refs, printer) {
201
- return children.map((child) => config.spacingOuter + indentation + (typeof child === "string" ? printText(child, config) : printer(child, config, indentation, depth, refs))).join("");
202
- }
203
- function printShadowRoot(children, config, indentation, depth, refs, printer) {
204
- if (config.printShadowRoot === false) return "";
205
- return [`${config.spacingOuter + indentation}#shadow-root`, printChildren(children, config, indentation + config.indent, depth, refs, printer)].join("");
206
- }
207
- function printText(text, config) {
208
- const contentColor = config.colors.content;
209
- return contentColor.open + escapeHTML(text) + contentColor.close;
210
- }
211
- function printComment(comment, config) {
212
- const commentColor = config.colors.comment;
213
- return `${commentColor.open}<!--${escapeHTML(comment)}-->${commentColor.close}`;
214
- }
215
- function printElement(type, printedProps, printedChildren, config, indentation) {
216
- const tagColor = config.colors.tag;
217
- return `${tagColor.open}<${type}${printedProps && tagColor.close + printedProps + config.spacingOuter + indentation + tagColor.open}${printedChildren ? `>${tagColor.close}${printedChildren}${config.spacingOuter}${indentation}${tagColor.open}</${type}` : `${printedProps && !config.min ? "" : " "}/`}>${tagColor.close}`;
218
- }
219
- function printElementAsLeaf(type, config) {
220
- const tagColor = config.colors.tag;
221
- return `${tagColor.open}<${type}${tagColor.close} …${tagColor.open} />${tagColor.close}`;
222
- }
223
- const ELEMENT_NODE = 1;
224
- const TEXT_NODE = 3;
225
- const COMMENT_NODE = 8;
226
- const FRAGMENT_NODE = 11;
227
- const ELEMENT_REGEXP = /^(?:(?:HTML|SVG)\w*)?Element$/;
228
- function testHasAttribute(val) {
229
- try {
230
- return typeof val.hasAttribute === "function" && val.hasAttribute("is");
231
- } catch {
232
- return false;
233
- }
234
- }
235
- function testNode(val) {
236
- const constructorName = val.constructor.name;
237
- const { nodeType, tagName } = val;
238
- const isCustomElement = typeof tagName === "string" && tagName.includes("-") || testHasAttribute(val);
239
- return nodeType === ELEMENT_NODE && (ELEMENT_REGEXP.test(constructorName) || isCustomElement) || nodeType === TEXT_NODE && constructorName === "Text" || nodeType === COMMENT_NODE && constructorName === "Comment" || nodeType === FRAGMENT_NODE && constructorName === "DocumentFragment";
240
- }
241
- const test$3 = (val) => val?.constructor?.name && testNode(val);
242
- function nodeIsText(node) {
243
- return node.nodeType === TEXT_NODE;
244
- }
245
- function nodeIsComment(node) {
246
- return node.nodeType === COMMENT_NODE;
247
- }
248
- function nodeIsFragment(node) {
249
- return node.nodeType === FRAGMENT_NODE;
250
- }
251
- function filterChildren(children, filterNode) {
252
- let filtered = children.filter((node) => {
253
- if (node.nodeType === TEXT_NODE) return (node.data || "").trim().length > 0;
254
- return true;
255
- });
256
- if (filterNode) filtered = filtered.filter(filterNode);
257
- return filtered;
258
- }
259
- function serializeDOM(node, config, indentation, depth, refs, printer, filterNode) {
260
- if (nodeIsText(node)) return printText(node.data, config);
261
- if (nodeIsComment(node)) return printComment(node.data, config);
262
- const type = nodeIsFragment(node) ? "DocumentFragment" : node.tagName.toLowerCase();
263
- if (++depth > config.maxDepth) return printElementAsLeaf(type, config);
264
- const children = Array.prototype.slice.call(node.childNodes || node.children);
265
- const shadowChildren = nodeIsFragment(node) || !node.shadowRoot ? [] : Array.prototype.slice.call(node.shadowRoot.children);
266
- const resolvedChildren = filterNode ? filterChildren(children, filterNode) : children;
267
- const resolvedShadowChildren = filterNode ? filterChildren(shadowChildren, filterNode) : shadowChildren;
268
- return printElement(type, printProps(nodeIsFragment(node) ? [] : Array.from(node.attributes, (attr) => attr.name).sort(), nodeIsFragment(node) ? {} : [...node.attributes].reduce((props, attribute) => {
269
- props[attribute.name] = attribute.value;
270
- return props;
271
- }, {}), config, indentation + config.indent, depth, refs, printer), (resolvedShadowChildren.length > 0 ? printShadowRoot(resolvedShadowChildren, config, indentation + config.indent, depth, refs, printer) : "") + printChildren(resolvedChildren, config, indentation + config.indent, depth, refs, printer), config, indentation);
272
- }
273
- const serialize$3 = (node, config, indentation, depth, refs, printer) => serializeDOM(node, config, indentation, depth, refs, printer);
274
- function createDOMElementFilter(filterNode) {
275
- return {
276
- test: test$3,
277
- serialize: (node, config, indentation, depth, refs, printer) => serializeDOM(node, config, indentation, depth, refs, printer, filterNode)
278
- };
279
- }
280
- const plugin$3 = {
281
- serialize: serialize$3,
282
- test: test$3
283
- };
284
- const IS_ITERABLE_SENTINEL = "@@__IMMUTABLE_ITERABLE__@@";
285
- const IS_LIST_SENTINEL = "@@__IMMUTABLE_LIST__@@";
286
- const IS_KEYED_SENTINEL = "@@__IMMUTABLE_KEYED__@@";
287
- const IS_MAP_SENTINEL = "@@__IMMUTABLE_MAP__@@";
288
- const IS_ORDERED_SENTINEL = "@@__IMMUTABLE_ORDERED__@@";
289
- const IS_RECORD_SENTINEL = "@@__IMMUTABLE_RECORD__@@";
290
- const IS_SEQ_SENTINEL = "@@__IMMUTABLE_SEQ__@@";
291
- const IS_SET_SENTINEL = "@@__IMMUTABLE_SET__@@";
292
- const IS_STACK_SENTINEL = "@@__IMMUTABLE_STACK__@@";
293
- const getImmutableName = (name) => `Immutable.${name}`;
294
- const printAsLeaf = (name) => `[${name}]`;
295
- const SPACE = " ";
296
- const LAZY = "…";
297
- function printImmutableEntries(val, config, indentation, depth, refs, printer, type) {
298
- return ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : `${getImmutableName(type) + SPACE}{${printIteratorEntries(val.entries(), config, indentation, depth, refs, printer)}}`;
299
- }
300
- function getRecordEntries(val) {
301
- let i = 0;
302
- return { next() {
303
- if (i < val._keys.length) {
304
- const key = val._keys[i++];
305
- return {
306
- done: false,
307
- value: [key, val.get(key)]
308
- };
309
- }
310
- return {
311
- done: true,
312
- value: void 0
313
- };
314
- } };
315
- }
316
- function printImmutableRecord(val, config, indentation, depth, refs, printer) {
317
- const name = getImmutableName(val._name || "Record");
318
- return ++depth > config.maxDepth ? printAsLeaf(name) : `${name + SPACE}{${printIteratorEntries(getRecordEntries(val), config, indentation, depth, refs, printer)}}`;
319
- }
320
- function printImmutableSeq(val, config, indentation, depth, refs, printer) {
321
- const name = getImmutableName("Seq");
322
- if (++depth > config.maxDepth) return printAsLeaf(name);
323
- if (val[IS_KEYED_SENTINEL]) return `${name + SPACE}{${val._iter || val._object ? printIteratorEntries(val.entries(), config, indentation, depth, refs, printer) : LAZY}}`;
324
- return `${name + SPACE}[${val._iter || val._array || val._collection || val._iterable ? printIteratorValues(val.values(), config, indentation, depth, refs, printer) : LAZY}]`;
325
- }
326
- function printImmutableValues(val, config, indentation, depth, refs, printer, type) {
327
- return ++depth > config.maxDepth ? printAsLeaf(getImmutableName(type)) : `${getImmutableName(type) + SPACE}[${printIteratorValues(val.values(), config, indentation, depth, refs, printer)}]`;
328
- }
329
- const serialize$2 = (val, config, indentation, depth, refs, printer) => {
330
- if (val[IS_MAP_SENTINEL]) return printImmutableEntries(val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? "OrderedMap" : "Map");
331
- if (val[IS_LIST_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, "List");
332
- if (val[IS_SET_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, val[IS_ORDERED_SENTINEL] ? "OrderedSet" : "Set");
333
- if (val[IS_STACK_SENTINEL]) return printImmutableValues(val, config, indentation, depth, refs, printer, "Stack");
334
- if (val[IS_SEQ_SENTINEL]) return printImmutableSeq(val, config, indentation, depth, refs, printer);
335
- return printImmutableRecord(val, config, indentation, depth, refs, printer);
336
- };
337
- const test$2 = (val) => val && (val[IS_ITERABLE_SENTINEL] === true || val[IS_RECORD_SENTINEL] === true);
338
- const plugin$2 = {
339
- serialize: serialize$2,
340
- test: test$2
341
- };
342
- function getDefaultExportFromCjs(x) {
343
- return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, "default") ? x["default"] : x;
344
- }
345
- var reactIs$1 = { exports: {} };
346
- var reactIs_production = {};
347
- /**
348
- * @license React
349
- * react-is.production.js
350
- *
351
- * Copyright (c) Meta Platforms, Inc. and affiliates.
352
- *
353
- * This source code is licensed under the MIT license found in the
354
- * LICENSE file in the root directory of this source tree.
355
- */
356
- var hasRequiredReactIs_production;
357
- function requireReactIs_production() {
358
- if (hasRequiredReactIs_production) return reactIs_production;
359
- hasRequiredReactIs_production = 1;
360
- var REACT_ELEMENT_TYPE = Symbol.for("react.transitional.element"), REACT_PORTAL_TYPE = Symbol.for("react.portal"), REACT_FRAGMENT_TYPE = Symbol.for("react.fragment"), REACT_STRICT_MODE_TYPE = Symbol.for("react.strict_mode"), REACT_PROFILER_TYPE = Symbol.for("react.profiler"), REACT_CONSUMER_TYPE = Symbol.for("react.consumer"), REACT_CONTEXT_TYPE = Symbol.for("react.context"), REACT_FORWARD_REF_TYPE = Symbol.for("react.forward_ref"), REACT_SUSPENSE_TYPE = Symbol.for("react.suspense"), REACT_SUSPENSE_LIST_TYPE = Symbol.for("react.suspense_list"), REACT_MEMO_TYPE = Symbol.for("react.memo"), REACT_LAZY_TYPE = Symbol.for("react.lazy"), REACT_VIEW_TRANSITION_TYPE = Symbol.for("react.view_transition"), REACT_CLIENT_REFERENCE = Symbol.for("react.client.reference");
361
- function typeOf(object) {
362
- if ("object" === typeof object && null !== object) {
363
- var $$typeof = object.$$typeof;
364
- switch ($$typeof) {
365
- case REACT_ELEMENT_TYPE: switch (object = object.type, object) {
366
- case REACT_FRAGMENT_TYPE:
367
- case REACT_PROFILER_TYPE:
368
- case REACT_STRICT_MODE_TYPE:
369
- case REACT_SUSPENSE_TYPE:
370
- case REACT_SUSPENSE_LIST_TYPE:
371
- case REACT_VIEW_TRANSITION_TYPE: return object;
372
- default: switch (object = object && object.$$typeof, object) {
373
- case REACT_CONTEXT_TYPE:
374
- case REACT_FORWARD_REF_TYPE:
375
- case REACT_LAZY_TYPE:
376
- case REACT_MEMO_TYPE: return object;
377
- case REACT_CONSUMER_TYPE: return object;
378
- default: return $$typeof;
379
- }
380
- }
381
- case REACT_PORTAL_TYPE: return $$typeof;
382
- }
383
- }
384
- }
385
- reactIs_production.ContextConsumer = REACT_CONSUMER_TYPE;
386
- reactIs_production.ContextProvider = REACT_CONTEXT_TYPE;
387
- reactIs_production.Element = REACT_ELEMENT_TYPE;
388
- reactIs_production.ForwardRef = REACT_FORWARD_REF_TYPE;
389
- reactIs_production.Fragment = REACT_FRAGMENT_TYPE;
390
- reactIs_production.Lazy = REACT_LAZY_TYPE;
391
- reactIs_production.Memo = REACT_MEMO_TYPE;
392
- reactIs_production.Portal = REACT_PORTAL_TYPE;
393
- reactIs_production.Profiler = REACT_PROFILER_TYPE;
394
- reactIs_production.StrictMode = REACT_STRICT_MODE_TYPE;
395
- reactIs_production.Suspense = REACT_SUSPENSE_TYPE;
396
- reactIs_production.SuspenseList = REACT_SUSPENSE_LIST_TYPE;
397
- reactIs_production.isContextConsumer = function(object) {
398
- return typeOf(object) === REACT_CONSUMER_TYPE;
399
- };
400
- reactIs_production.isContextProvider = function(object) {
401
- return typeOf(object) === REACT_CONTEXT_TYPE;
402
- };
403
- reactIs_production.isElement = function(object) {
404
- return "object" === typeof object && null !== object && object.$$typeof === REACT_ELEMENT_TYPE;
405
- };
406
- reactIs_production.isForwardRef = function(object) {
407
- return typeOf(object) === REACT_FORWARD_REF_TYPE;
408
- };
409
- reactIs_production.isFragment = function(object) {
410
- return typeOf(object) === REACT_FRAGMENT_TYPE;
411
- };
412
- reactIs_production.isLazy = function(object) {
413
- return typeOf(object) === REACT_LAZY_TYPE;
414
- };
415
- reactIs_production.isMemo = function(object) {
416
- return typeOf(object) === REACT_MEMO_TYPE;
417
- };
418
- reactIs_production.isPortal = function(object) {
419
- return typeOf(object) === REACT_PORTAL_TYPE;
420
- };
421
- reactIs_production.isProfiler = function(object) {
422
- return typeOf(object) === REACT_PROFILER_TYPE;
423
- };
424
- reactIs_production.isStrictMode = function(object) {
425
- return typeOf(object) === REACT_STRICT_MODE_TYPE;
426
- };
427
- reactIs_production.isSuspense = function(object) {
428
- return typeOf(object) === REACT_SUSPENSE_TYPE;
429
- };
430
- reactIs_production.isSuspenseList = function(object) {
431
- return typeOf(object) === REACT_SUSPENSE_LIST_TYPE;
432
- };
433
- reactIs_production.isValidElementType = function(type) {
434
- return "string" === typeof type || "function" === typeof type || type === REACT_FRAGMENT_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || type === REACT_SUSPENSE_LIST_TYPE || "object" === typeof type && null !== type && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_CONSUMER_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE || type.$$typeof === REACT_CLIENT_REFERENCE || void 0 !== type.getModuleId) ? true : false;
435
- };
436
- reactIs_production.typeOf = typeOf;
437
- return reactIs_production;
438
- }
439
- var hasRequiredReactIs$1;
440
- function requireReactIs$1() {
441
- if (hasRequiredReactIs$1) return reactIs$1.exports;
442
- hasRequiredReactIs$1 = 1;
443
- reactIs$1.exports = requireReactIs_production();
444
- return reactIs$1.exports;
445
- }
446
- var reactIsExports$1 = requireReactIs$1();
447
- var ReactIs19 = /*#__PURE__*/ _mergeNamespaces({
448
- __proto__: null,
449
- default: /* @__PURE__ */ getDefaultExportFromCjs(reactIsExports$1)
450
- }, [reactIsExports$1]);
451
- var reactIs = { exports: {} };
452
- var reactIs_production_min = {};
453
- /**
454
- * @license React
455
- * react-is.production.min.js
456
- *
457
- * Copyright (c) Facebook, Inc. and its affiliates.
458
- *
459
- * This source code is licensed under the MIT license found in the
460
- * LICENSE file in the root directory of this source tree.
461
- */
462
- var hasRequiredReactIs_production_min;
463
- function requireReactIs_production_min() {
464
- if (hasRequiredReactIs_production_min) return reactIs_production_min;
465
- hasRequiredReactIs_production_min = 1;
466
- var b = Symbol.for("react.element"), c = Symbol.for("react.portal"), d = Symbol.for("react.fragment"), e = Symbol.for("react.strict_mode"), f = Symbol.for("react.profiler"), g = Symbol.for("react.provider"), h = Symbol.for("react.context"), k = Symbol.for("react.server_context"), l = Symbol.for("react.forward_ref"), m = Symbol.for("react.suspense"), n = Symbol.for("react.suspense_list"), p = Symbol.for("react.memo"), q = Symbol.for("react.lazy"), t = Symbol.for("react.offscreen"), u = Symbol.for("react.module.reference");
467
- function v(a) {
468
- if ("object" === typeof a && null !== a) {
469
- var r = a.$$typeof;
470
- switch (r) {
471
- case b: switch (a = a.type, a) {
472
- case d:
473
- case f:
474
- case e:
475
- case m:
476
- case n: return a;
477
- default: switch (a = a && a.$$typeof, a) {
478
- case k:
479
- case h:
480
- case l:
481
- case q:
482
- case p:
483
- case g: return a;
484
- default: return r;
485
- }
486
- }
487
- case c: return r;
488
- }
489
- }
490
- }
491
- reactIs_production_min.ContextConsumer = h;
492
- reactIs_production_min.ContextProvider = g;
493
- reactIs_production_min.Element = b;
494
- reactIs_production_min.ForwardRef = l;
495
- reactIs_production_min.Fragment = d;
496
- reactIs_production_min.Lazy = q;
497
- reactIs_production_min.Memo = p;
498
- reactIs_production_min.Portal = c;
499
- reactIs_production_min.Profiler = f;
500
- reactIs_production_min.StrictMode = e;
501
- reactIs_production_min.Suspense = m;
502
- reactIs_production_min.SuspenseList = n;
503
- reactIs_production_min.isAsyncMode = function() {
504
- return false;
505
- };
506
- reactIs_production_min.isConcurrentMode = function() {
507
- return false;
508
- };
509
- reactIs_production_min.isContextConsumer = function(a) {
510
- return v(a) === h;
511
- };
512
- reactIs_production_min.isContextProvider = function(a) {
513
- return v(a) === g;
514
- };
515
- reactIs_production_min.isElement = function(a) {
516
- return "object" === typeof a && null !== a && a.$$typeof === b;
517
- };
518
- reactIs_production_min.isForwardRef = function(a) {
519
- return v(a) === l;
520
- };
521
- reactIs_production_min.isFragment = function(a) {
522
- return v(a) === d;
523
- };
524
- reactIs_production_min.isLazy = function(a) {
525
- return v(a) === q;
526
- };
527
- reactIs_production_min.isMemo = function(a) {
528
- return v(a) === p;
529
- };
530
- reactIs_production_min.isPortal = function(a) {
531
- return v(a) === c;
532
- };
533
- reactIs_production_min.isProfiler = function(a) {
534
- return v(a) === f;
535
- };
536
- reactIs_production_min.isStrictMode = function(a) {
537
- return v(a) === e;
538
- };
539
- reactIs_production_min.isSuspense = function(a) {
540
- return v(a) === m;
541
- };
542
- reactIs_production_min.isSuspenseList = function(a) {
543
- return v(a) === n;
544
- };
545
- reactIs_production_min.isValidElementType = function(a) {
546
- return "string" === typeof a || "function" === typeof a || a === d || a === f || a === e || a === m || a === n || a === t || "object" === typeof a && null !== a && (a.$$typeof === q || a.$$typeof === p || a.$$typeof === g || a.$$typeof === h || a.$$typeof === l || a.$$typeof === u || void 0 !== a.getModuleId) ? true : false;
547
- };
548
- reactIs_production_min.typeOf = v;
549
- return reactIs_production_min;
550
- }
551
- var hasRequiredReactIs;
552
- function requireReactIs() {
553
- if (hasRequiredReactIs) return reactIs.exports;
554
- hasRequiredReactIs = 1;
555
- reactIs.exports = requireReactIs_production_min();
556
- return reactIs.exports;
557
- }
558
- var reactIsExports = requireReactIs();
559
- var ReactIs18 = /*#__PURE__*/ _mergeNamespaces({
560
- __proto__: null,
561
- default: /* @__PURE__ */ getDefaultExportFromCjs(reactIsExports)
562
- }, [reactIsExports]);
563
- const ReactIs = Object.fromEntries([
564
- "isAsyncMode",
565
- "isConcurrentMode",
566
- "isContextConsumer",
567
- "isContextProvider",
568
- "isElement",
569
- "isForwardRef",
570
- "isFragment",
571
- "isLazy",
572
- "isMemo",
573
- "isPortal",
574
- "isProfiler",
575
- "isStrictMode",
576
- "isSuspense",
577
- "isSuspenseList",
578
- "isValidElementType"
579
- ].map((m) => [m, (v) => ReactIs18[m](v) || ReactIs19[m](v)]));
580
- function getChildren(arg, children = []) {
581
- if (Array.isArray(arg)) for (const item of arg) getChildren(item, children);
582
- else if (arg != null && arg !== false && arg !== "") children.push(arg);
583
- return children;
584
- }
585
- function getType(element) {
586
- const type = element.type;
587
- if (typeof type === "string") return type;
588
- if (typeof type === "function") return type.displayName || type.name || "Unknown";
589
- if (ReactIs.isFragment(element)) return "React.Fragment";
590
- if (ReactIs.isSuspense(element)) return "React.Suspense";
591
- if (typeof type === "object" && type !== null) {
592
- if (ReactIs.isContextProvider(element)) return "Context.Provider";
593
- if (ReactIs.isContextConsumer(element)) return "Context.Consumer";
594
- if (ReactIs.isForwardRef(element)) {
595
- if (type.displayName) return type.displayName;
596
- const functionName = type.render.displayName || type.render.name || "";
597
- return functionName === "" ? "ForwardRef" : `ForwardRef(${functionName})`;
598
- }
599
- if (ReactIs.isMemo(element)) {
600
- const functionName = type.displayName || type.type.displayName || type.type.name || "";
601
- return functionName === "" ? "Memo" : `Memo(${functionName})`;
602
- }
603
- }
604
- return "UNDEFINED";
605
- }
606
- function getPropKeys$1(element) {
607
- const { props } = element;
608
- return Object.keys(props).filter((key) => key !== "children" && props[key] !== void 0).sort();
609
- }
610
- const serialize$1 = (element, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? printElementAsLeaf(getType(element), config) : printElement(getType(element), printProps(getPropKeys$1(element), element.props, config, indentation + config.indent, depth, refs, printer), printChildren(getChildren(element.props.children), config, indentation + config.indent, depth, refs, printer), config, indentation);
611
- const test$1 = (val) => val != null && ReactIs.isElement(val);
612
- const plugin$1 = {
613
- serialize: serialize$1,
614
- test: test$1
615
- };
616
- const testSymbol = typeof Symbol === "function" && Symbol.for ? Symbol.for("react.test.json") : 245830487;
617
- function getPropKeys(object) {
618
- const { props } = object;
619
- return props ? Object.keys(props).filter((key) => props[key] !== void 0).sort() : [];
620
- }
621
- const serialize = (object, config, indentation, depth, refs, printer) => ++depth > config.maxDepth ? printElementAsLeaf(object.type, config) : printElement(object.type, object.props ? printProps(getPropKeys(object), object.props, config, indentation + config.indent, depth, refs, printer) : "", object.children ? printChildren(object.children, config, indentation + config.indent, depth, refs, printer) : "", config, indentation);
622
- const test = (val) => val && val.$$typeof === testSymbol;
623
- const plugin = {
624
- serialize,
625
- test
626
- };
627
- const toString = Object.prototype.toString;
628
- const toISOString = Date.prototype.toISOString;
629
- const errorToString = Error.prototype.toString;
630
- const regExpToString = RegExp.prototype.toString;
631
- /**
632
- * Explicitly comparing typeof constructor to function avoids undefined as name
633
- * when mock identity-obj-proxy returns the key as the value for any key.
634
- */
635
- function getConstructorName(val) {
636
- return typeof val.constructor === "function" && val.constructor.name || "Object";
637
- }
638
- /** Is val is equal to global window object? Works even if it does not exist :) */
639
- function isWindow(val) {
640
- return typeof window !== "undefined" && val === window;
641
- }
642
- const SYMBOL_REGEXP = /^Symbol\((.*)\)(.*)$/;
643
- const NEWLINE_REGEXP = /\n/g;
644
- var PrettyFormatPluginError = class extends Error {
645
- constructor(message, stack) {
646
- super(message);
647
- this.stack = stack;
648
- this.name = this.constructor.name;
649
- }
650
- };
651
- function isToStringedArrayType(toStringed) {
652
- return toStringed === "[object Array]" || toStringed === "[object ArrayBuffer]" || toStringed === "[object DataView]" || toStringed === "[object Float32Array]" || toStringed === "[object Float64Array]" || toStringed === "[object Int8Array]" || toStringed === "[object Int16Array]" || toStringed === "[object Int32Array]" || toStringed === "[object Uint8Array]" || toStringed === "[object Uint8ClampedArray]" || toStringed === "[object Uint16Array]" || toStringed === "[object Uint32Array]";
653
- }
654
- function printNumber(val) {
655
- return Object.is(val, -0) ? "-0" : String(val);
656
- }
657
- function printBigInt(val) {
658
- return String(`${val}n`);
659
- }
660
- function printFunction(val, printFunctionName) {
661
- if (!printFunctionName) return "[Function]";
662
- return `[Function ${val.name || "anonymous"}]`;
663
- }
664
- function printSymbol(val) {
665
- return String(val).replace(SYMBOL_REGEXP, "Symbol($1)");
666
- }
667
- function printError(val) {
668
- return `[${errorToString.call(val)}]`;
669
- }
670
- /**
671
- * The first port of call for printing an object, handles most of the
672
- * data-types in JS.
673
- */
674
- function printBasicValue(val, printFunctionName, escapeRegex, escapeString) {
675
- if (val === true || val === false) return `${val}`;
676
- if (val === void 0) return "undefined";
677
- if (val === null) return "null";
678
- const typeOf = typeof val;
679
- if (typeOf === "number") return printNumber(val);
680
- if (typeOf === "bigint") return printBigInt(val);
681
- if (typeOf === "string") {
682
- if (escapeString) return `"${val.replaceAll(/"|\\/g, "\\$&")}"`;
683
- return `"${val}"`;
684
- }
685
- if (typeOf === "function") return printFunction(val, printFunctionName);
686
- if (typeOf === "symbol") return printSymbol(val);
687
- const toStringed = toString.call(val);
688
- if (toStringed === "[object WeakMap]") return "WeakMap {}";
689
- if (toStringed === "[object WeakSet]") return "WeakSet {}";
690
- if (toStringed === "[object Function]" || toStringed === "[object GeneratorFunction]") return printFunction(val, printFunctionName);
691
- if (toStringed === "[object Symbol]") return printSymbol(val);
692
- if (toStringed === "[object Date]") return Number.isNaN(+val) ? "Date { NaN }" : toISOString.call(val);
693
- if (toStringed === "[object Error]") return printError(val);
694
- if (toStringed === "[object RegExp]") {
695
- if (escapeRegex) return regExpToString.call(val).replaceAll(/[$()*+.?[\\\]^{|}]/g, "\\$&");
696
- return regExpToString.call(val);
697
- }
698
- if (val instanceof Error) return printError(val);
699
- return null;
700
- }
701
- /**
702
- * Handles more complex objects ( such as objects with circular references.
703
- * maps and sets etc )
704
- */
705
- function printComplexValue(val, config, indentation, depth, refs, hasCalledToJSON) {
706
- if (refs.includes(val)) return "[Circular]";
707
- refs = [...refs];
708
- refs.push(val);
709
- const hitMaxDepth = ++depth > config.maxDepth;
710
- const min = config.min;
711
- if (config.callToJSON && !hitMaxDepth && val.toJSON && typeof val.toJSON === "function" && !hasCalledToJSON) return printer(val.toJSON(), config, indentation, depth, refs, true);
712
- const toStringed = toString.call(val);
713
- if (toStringed === "[object Arguments]") return hitMaxDepth ? "[Arguments]" : `${min ? "" : "Arguments "}[${printListItems(val, config, indentation, depth, refs, printer)}]`;
714
- if (isToStringedArrayType(toStringed)) return hitMaxDepth ? `[${val.constructor.name}]` : `${min ? "" : !config.printBasicPrototype && val.constructor.name === "Array" ? "" : `${val.constructor.name} `}[${printListItems(val, config, indentation, depth, refs, printer)}]`;
715
- if (toStringed === "[object Map]") return hitMaxDepth ? "[Map]" : `Map {${printIteratorEntries(val.entries(), config, indentation, depth, refs, printer, " => ")}}`;
716
- if (toStringed === "[object Set]") return hitMaxDepth ? "[Set]" : `Set {${printIteratorValues(val.values(), config, indentation, depth, refs, printer)}}`;
717
- return hitMaxDepth || isWindow(val) ? `[${getConstructorName(val)}]` : `${min ? "" : !config.printBasicPrototype && getConstructorName(val) === "Object" ? "" : `${getConstructorName(val)} `}{${printObjectProperties(val, config, indentation, depth, refs, printer)}}`;
718
- }
719
- const ErrorPlugin = {
720
- test: (val) => val && val instanceof Error,
721
- serialize(val, config, indentation, depth, refs, printer) {
722
- if (refs.includes(val)) return "[Circular]";
723
- refs = [...refs, val];
724
- const hitMaxDepth = ++depth > config.maxDepth;
725
- const { message, cause, ...rest } = val;
726
- const entries = {
727
- message,
728
- ...typeof cause !== "undefined" ? { cause } : {},
729
- ...val instanceof AggregateError ? { errors: val.errors } : {},
730
- ...rest
731
- };
732
- const name = val.name !== "Error" ? val.name : getConstructorName(val);
733
- return hitMaxDepth ? `[${name}]` : `${name} {${printIteratorEntries(Object.entries(entries).values(), config, indentation, depth, refs, printer)}}`;
734
- }
735
- };
736
- function isNewPlugin(plugin) {
737
- return plugin.serialize != null;
738
- }
739
- function printPlugin(plugin, val, config, indentation, depth, refs) {
740
- let printed;
741
- try {
742
- printed = isNewPlugin(plugin) ? plugin.serialize(val, config, indentation, depth, refs, printer) : plugin.print(val, (valChild) => printer(valChild, config, indentation, depth, refs), (str) => {
743
- const indentationNext = indentation + config.indent;
744
- return indentationNext + str.replaceAll(NEWLINE_REGEXP, `\n${indentationNext}`);
745
- }, {
746
- edgeSpacing: config.spacingOuter,
747
- min: config.min,
748
- spacing: config.spacingInner
749
- }, config.colors);
750
- } catch (error) {
751
- throw new PrettyFormatPluginError(error.message, error.stack);
752
- }
753
- if (typeof printed !== "string") throw new TypeError(`pretty-format: Plugin must return type "string" but instead returned "${typeof printed}".`);
754
- return printed;
755
- }
756
- function findPlugin(plugins, val) {
757
- for (const plugin of plugins) try {
758
- if (plugin.test(val)) return plugin;
759
- } catch (error) {
760
- throw new PrettyFormatPluginError(error.message, error.stack);
761
- }
762
- return null;
763
- }
764
- function printer(val, config, indentation, depth, refs, hasCalledToJSON) {
765
- let result;
766
- const plugin = findPlugin(config.plugins, val);
767
- if (plugin !== null) result = printPlugin(plugin, val, config, indentation, depth, refs);
768
- else {
769
- const basicResult = printBasicValue(val, config.printFunctionName, config.escapeRegex, config.escapeString);
770
- if (basicResult !== null) result = basicResult;
771
- else result = printComplexValue(val, config, indentation, depth, refs, hasCalledToJSON);
772
- }
773
- config._outputLengthPerDepth[depth] ??= 0;
774
- config._outputLengthPerDepth[depth] += result.length;
775
- if (config._outputLengthPerDepth[depth] > config.maxOutputLength) config.maxDepth = 0;
776
- return result;
777
- }
778
- const DEFAULT_THEME = {
779
- comment: "gray",
780
- content: "reset",
781
- prop: "yellow",
782
- tag: "cyan",
783
- value: "green"
784
- };
785
- const DEFAULT_THEME_KEYS = Object.keys(DEFAULT_THEME);
786
- const DEFAULT_OPTIONS = {
787
- callToJSON: true,
788
- compareKeys: void 0,
789
- escapeRegex: false,
790
- escapeString: true,
791
- highlight: false,
792
- indent: 2,
793
- maxDepth: Number.POSITIVE_INFINITY,
794
- maxOutputLength: 1e6,
795
- maxWidth: Number.POSITIVE_INFINITY,
796
- min: false,
797
- plugins: [],
798
- printBasicPrototype: true,
799
- printFunctionName: true,
800
- printShadowRoot: true,
801
- theme: DEFAULT_THEME
802
- };
803
- function validateOptions(options) {
804
- for (const key of Object.keys(options)) if (!Object.hasOwn(DEFAULT_OPTIONS, key)) throw new Error(`pretty-format: Unknown option "${key}".`);
805
- if (options.min && options.indent !== void 0 && options.indent !== 0) throw new Error("pretty-format: Options \"min\" and \"indent\" cannot be used together.");
806
- }
807
- function getColorsHighlight() {
808
- return DEFAULT_THEME_KEYS.reduce((colors, key) => {
809
- const value = DEFAULT_THEME[key];
810
- const color = value && y[value];
811
- if (color && typeof color.close === "string" && typeof color.open === "string") colors[key] = color;
812
- else throw new Error(`pretty-format: Option "theme" has a key "${key}" whose value "${value}" is undefined in ansi-styles.`);
813
- return colors;
814
- }, Object.create(null));
815
- }
816
- function getColorsEmpty() {
817
- return DEFAULT_THEME_KEYS.reduce((colors, key) => {
818
- colors[key] = {
819
- close: "",
820
- open: ""
821
- };
822
- return colors;
823
- }, Object.create(null));
824
- }
825
- function getPrintFunctionName(options) {
826
- return options?.printFunctionName ?? DEFAULT_OPTIONS.printFunctionName;
827
- }
828
- function getEscapeRegex(options) {
829
- return options?.escapeRegex ?? DEFAULT_OPTIONS.escapeRegex;
830
- }
831
- function getEscapeString(options) {
832
- return options?.escapeString ?? DEFAULT_OPTIONS.escapeString;
833
- }
834
- function getConfig(options) {
835
- return {
836
- callToJSON: options?.callToJSON ?? DEFAULT_OPTIONS.callToJSON,
837
- colors: options?.highlight ? getColorsHighlight() : getColorsEmpty(),
838
- compareKeys: typeof options?.compareKeys === "function" || options?.compareKeys === null ? options.compareKeys : DEFAULT_OPTIONS.compareKeys,
839
- escapeRegex: getEscapeRegex(options),
840
- escapeString: getEscapeString(options),
841
- indent: options?.min ? "" : createIndent(options?.indent ?? DEFAULT_OPTIONS.indent),
842
- maxDepth: options?.maxDepth ?? DEFAULT_OPTIONS.maxDepth,
843
- maxWidth: options?.maxWidth ?? DEFAULT_OPTIONS.maxWidth,
844
- min: options?.min ?? DEFAULT_OPTIONS.min,
845
- plugins: options?.plugins ?? DEFAULT_OPTIONS.plugins,
846
- printBasicPrototype: options?.printBasicPrototype ?? true,
847
- printFunctionName: getPrintFunctionName(options),
848
- printShadowRoot: options?.printShadowRoot ?? true,
849
- spacingInner: options?.min ? " " : "\n",
850
- spacingOuter: options?.min ? "" : "\n",
851
- maxOutputLength: options?.maxOutputLength ?? DEFAULT_OPTIONS.maxOutputLength,
852
- _outputLengthPerDepth: []
853
- };
854
- }
855
- function createIndent(indent) {
856
- return Array.from({ length: indent + 1 }).join(" ");
857
- }
858
- /**
859
- * Returns a presentation string of your `val` object
860
- * @param val any potential JavaScript object
861
- * @param options Custom settings
862
- */
863
- function format(val, options) {
864
- if (options) {
865
- validateOptions(options);
866
- if (options.plugins) {
867
- const plugin = findPlugin(options.plugins, val);
868
- if (plugin !== null) return printPlugin(plugin, val, getConfig(options), "", 0, []);
869
- }
870
- }
871
- const basicResult = printBasicValue(val, getPrintFunctionName(options), getEscapeRegex(options), getEscapeString(options));
872
- if (basicResult !== null) return basicResult;
873
- return printComplexValue(val, getConfig(options), "", 0, []);
874
- }
875
- const plugins = {
876
- AsymmetricMatcher: plugin$5,
877
- DOMCollection: plugin$4,
878
- DOMElement: plugin$3,
879
- Immutable: plugin$2,
880
- ReactElement: plugin$1,
881
- ReactTestComponent: plugin,
882
- Error: ErrorPlugin
883
- };
884
- //#endregion
885
- export { DEFAULT_OPTIONS, createDOMElementFilter, format, plugins };
886
-
887
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6WyJzdHlsZXMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9ub2RlX21vZHVsZXMvLnBucG0vQHZpdGVzdCtwcmV0dHktZm9ybWF0QDQuMS4xMC9ub2RlX21vZHVsZXMvQHZpdGVzdC9wcmV0dHktZm9ybWF0L2Rpc3QvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN0eWxlcyBmcm9tICd0aW55cmFpbmJvdyc7XG5cbmZ1bmN0aW9uIF9tZXJnZU5hbWVzcGFjZXMobiwgbSkge1xuICBtLmZvckVhY2goZnVuY3Rpb24gKGUpIHtcbiAgICBlICYmIHR5cGVvZiBlICE9PSAnc3RyaW5nJyAmJiAhQXJyYXkuaXNBcnJheShlKSAmJiBPYmplY3Qua2V5cyhlKS5mb3JFYWNoKGZ1bmN0aW9uIChrKSB7XG4gICAgICBpZiAoayAhPT0gJ2RlZmF1bHQnICYmICEoayBpbiBuKSkge1xuICAgICAgICB2YXIgZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSwgayk7XG4gICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShuLCBrLCBkLmdldCA/IGQgOiB7XG4gICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGVba107IH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShuKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5c09mRW51bWVyYWJsZVByb3BlcnRpZXMob2JqZWN0LCBjb21wYXJlS2V5cykge1xuXHRjb25zdCByYXdLZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTtcblx0Y29uc3Qga2V5cyA9IGNvbXBhcmVLZXlzID09PSBudWxsID8gcmF3S2V5cyA6IHJhd0tleXMuc29ydChjb21wYXJlS2V5cyk7XG5cdGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0Zm9yIChjb25zdCBzeW1ib2wgb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpKSB7XG5cdFx0XHRpZiAoT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bWJvbCkuZW51bWVyYWJsZSkge1xuXHRcdFx0XHRrZXlzLnB1c2goc3ltYm9sKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGtleXM7XG59XG4vKipcbiogUmV0dXJuIGVudHJpZXMgKGZvciBleGFtcGxlLCBvZiBhIG1hcClcbiogd2l0aCBzcGFjaW5nLCBpbmRlbnRhdGlvbiwgYW5kIGNvbW1hXG4qIHdpdGhvdXQgc3Vycm91bmRpbmcgcHVuY3R1YXRpb24gKGZvciBleGFtcGxlLCBicmFjZXMpXG4qL1xuZnVuY3Rpb24gcHJpbnRJdGVyYXRvckVudHJpZXMoaXRlcmF0b3IsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCBzZXBhcmF0b3IgPSBcIjogXCIpIHtcblx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdGxldCB3aWR0aCA9IDA7XG5cdGxldCBjdXJyZW50ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRpZiAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyO1xuXHRcdGNvbnN0IGluZGVudGF0aW9uTmV4dCA9IGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudDtcblx0XHR3aGlsZSAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdFx0cmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dDtcblx0XHRcdGlmICh3aWR0aCsrID09PSBjb25maWcubWF4V2lkdGgpIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwi4oCmXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgbmFtZSA9IHByaW50ZXIoY3VycmVudC52YWx1ZVswXSwgY29uZmlnLCBpbmRlbnRhdGlvbk5leHQsIGRlcHRoLCByZWZzKTtcblx0XHRcdGNvbnN0IHZhbHVlID0gcHJpbnRlcihjdXJyZW50LnZhbHVlWzFdLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdFx0cmVzdWx0ICs9IG5hbWUgKyBzZXBhcmF0b3IgKyB2YWx1ZTtcblx0XHRcdGN1cnJlbnQgPSBpdGVyYXRvci5uZXh0KCk7XG5cdFx0XHRpZiAoIWN1cnJlbnQuZG9uZSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gYCwke2NvbmZpZy5zcGFjaW5nSW5uZXJ9YDtcblx0XHRcdH0gZWxzZSBpZiAoIWNvbmZpZy5taW4pIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwiLFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG4vKipcbiogUmV0dXJuIHZhbHVlcyAoZm9yIGV4YW1wbGUsIG9mIGEgc2V0KVxuKiB3aXRoIHNwYWNpbmcsIGluZGVudGF0aW9uLCBhbmQgY29tbWFcbiogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoYnJhY2VzIG9yIGJyYWNrZXRzKVxuKi9cbmZ1bmN0aW9uIHByaW50SXRlcmF0b3JWYWx1ZXMoaXRlcmF0b3IsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdGxldCByZXN1bHQgPSBcIlwiO1xuXHRsZXQgd2lkdGggPSAwO1xuXHRsZXQgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTtcblx0aWYgKCFjdXJyZW50LmRvbmUpIHtcblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlcjtcblx0XHRjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cdFx0d2hpbGUgKCFjdXJyZW50LmRvbmUpIHtcblx0XHRcdHJlc3VsdCArPSBpbmRlbnRhdGlvbk5leHQ7XG5cdFx0XHRpZiAod2lkdGgrKyA9PT0gY29uZmlnLm1heFdpZHRoKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBcIuKAplwiO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdHJlc3VsdCArPSBwcmludGVyKGN1cnJlbnQudmFsdWUsIGNvbmZpZywgaW5kZW50YXRpb25OZXh0LCBkZXB0aCwgcmVmcyk7XG5cdFx0XHRjdXJyZW50ID0gaXRlcmF0b3IubmV4dCgpO1xuXHRcdFx0aWYgKCFjdXJyZW50LmRvbmUpIHtcblx0XHRcdFx0cmVzdWx0ICs9IGAsJHtjb25maWcuc3BhY2luZ0lubmVyfWA7XG5cdFx0XHR9IGVsc2UgaWYgKCFjb25maWcubWluKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBcIixcIjtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmVzdWx0ICs9IGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuLyoqXG4qIFJldHVybiBpdGVtcyAoZm9yIGV4YW1wbGUsIG9mIGFuIGFycmF5KVxuKiB3aXRoIHNwYWNpbmcsIGluZGVudGF0aW9uLCBhbmQgY29tbWFcbiogd2l0aG91dCBzdXJyb3VuZGluZyBwdW5jdHVhdGlvbiAoZm9yIGV4YW1wbGUsIGJyYWNrZXRzKVxuKi9cbmZ1bmN0aW9uIHByaW50TGlzdEl0ZW1zKGxpc3QsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdGxldCByZXN1bHQgPSBcIlwiO1xuXHRsaXN0ID0gbGlzdCBpbnN0YW5jZW9mIEFycmF5QnVmZmVyID8gbmV3IERhdGFWaWV3KGxpc3QpIDogbGlzdDtcblx0Y29uc3QgaXNEYXRhVmlldyA9IChsKSA9PiBsIGluc3RhbmNlb2YgRGF0YVZpZXc7XG5cdGNvbnN0IGxlbmd0aCA9IGlzRGF0YVZpZXcobGlzdCkgPyBsaXN0LmJ5dGVMZW5ndGggOiBsaXN0Lmxlbmd0aDtcblx0aWYgKGxlbmd0aCA+IDApIHtcblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlcjtcblx0XHRjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuXHRcdFx0cmVzdWx0ICs9IGluZGVudGF0aW9uTmV4dDtcblx0XHRcdGlmIChpID09PSBjb25maWcubWF4V2lkdGgpIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwi4oCmXCI7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGlzRGF0YVZpZXcobGlzdCkgfHwgaSBpbiBsaXN0KSB7XG5cdFx0XHRcdHJlc3VsdCArPSBwcmludGVyKGlzRGF0YVZpZXcobGlzdCkgPyBsaXN0LmdldEludDgoaSkgOiBsaXN0W2ldLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdFx0fVxuXHRcdFx0aWYgKGkgPCBsZW5ndGggLSAxKSB7XG5cdFx0XHRcdHJlc3VsdCArPSBgLCR7Y29uZmlnLnNwYWNpbmdJbm5lcn1gO1xuXHRcdFx0fSBlbHNlIGlmICghY29uZmlnLm1pbikge1xuXHRcdFx0XHRyZXN1bHQgKz0gXCIsXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc3VsdCArPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb247XG5cdH1cblx0cmV0dXJuIHJlc3VsdDtcbn1cbi8qKlxuKiBSZXR1cm4gcHJvcGVydGllcyBvZiBhbiBvYmplY3Rcbiogd2l0aCBzcGFjaW5nLCBpbmRlbnRhdGlvbiwgYW5kIGNvbW1hXG4qIHdpdGhvdXQgc3Vycm91bmRpbmcgcHVuY3R1YXRpb24gKGZvciBleGFtcGxlLCBicmFjZXMpXG4qL1xuZnVuY3Rpb24gcHJpbnRPYmplY3RQcm9wZXJ0aWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIHtcblx0bGV0IHJlc3VsdCA9IFwiXCI7XG5cdGNvbnN0IGtleXMgPSBnZXRLZXlzT2ZFbnVtZXJhYmxlUHJvcGVydGllcyh2YWwsIGNvbmZpZy5jb21wYXJlS2V5cyk7XG5cdGlmIChrZXlzLmxlbmd0aCA+IDApIHtcblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlcjtcblx0XHRjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBrZXkgPSBrZXlzW2ldO1xuXHRcdFx0Y29uc3QgbmFtZSA9IHByaW50ZXIoa2V5LCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBwcmludGVyKHZhbFtrZXldLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdFx0cmVzdWx0ICs9IGAke2luZGVudGF0aW9uTmV4dCArIG5hbWV9OiAke3ZhbHVlfWA7XG5cdFx0XHRpZiAoaSA8IGtleXMubGVuZ3RoIC0gMSkge1xuXHRcdFx0XHRyZXN1bHQgKz0gYCwke2NvbmZpZy5zcGFjaW5nSW5uZXJ9YDtcblx0XHRcdH0gZWxzZSBpZiAoIWNvbmZpZy5taW4pIHtcblx0XHRcdFx0cmVzdWx0ICs9IFwiLFwiO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXN1bHQgKz0gY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uO1xuXHR9XG5cdHJldHVybiByZXN1bHQ7XG59XG5cbmNvbnN0IGFzeW1tZXRyaWNNYXRjaGVyID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5mb3IgPyBTeW1ib2wuZm9yKFwiamVzdC5hc3ltbWV0cmljTWF0Y2hlclwiKSA6IDEyNjc2MjE7XG5jb25zdCBTUEFDRSQyID0gXCIgXCI7XG5jb25zdCBzZXJpYWxpemUkNSA9ICh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG5cdGNvbnN0IHN0cmluZ2VkVmFsdWUgPSB2YWwudG9TdHJpbmcoKTtcblx0aWYgKHN0cmluZ2VkVmFsdWUgPT09IFwiQXJyYXlDb250YWluaW5nXCIgfHwgc3RyaW5nZWRWYWx1ZSA9PT0gXCJBcnJheU5vdENvbnRhaW5pbmdcIikge1xuXHRcdGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG5cdFx0XHRyZXR1cm4gYFske3N0cmluZ2VkVmFsdWV9XWA7XG5cdFx0fVxuXHRcdHJldHVybiBgJHtzdHJpbmdlZFZhbHVlICsgU1BBQ0UkMn1bJHtwcmludExpc3RJdGVtcyh2YWwuc2FtcGxlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9XWA7XG5cdH1cblx0aWYgKHN0cmluZ2VkVmFsdWUgPT09IFwiT2JqZWN0Q29udGFpbmluZ1wiIHx8IHN0cmluZ2VkVmFsdWUgPT09IFwiT2JqZWN0Tm90Q29udGFpbmluZ1wiKSB7XG5cdFx0aWYgKCsrZGVwdGggPiBjb25maWcubWF4RGVwdGgpIHtcblx0XHRcdHJldHVybiBgWyR7c3RyaW5nZWRWYWx1ZX1dYDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke3N0cmluZ2VkVmFsdWUgKyBTUEFDRSQyfXske3ByaW50T2JqZWN0UHJvcGVydGllcyh2YWwuc2FtcGxlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9fWA7XG5cdH1cblx0aWYgKHN0cmluZ2VkVmFsdWUgPT09IFwiU3RyaW5nTWF0Y2hpbmdcIiB8fCBzdHJpbmdlZFZhbHVlID09PSBcIlN0cmluZ05vdE1hdGNoaW5nXCIpIHtcblx0XHRyZXR1cm4gc3RyaW5nZWRWYWx1ZSArIFNQQUNFJDIgKyBwcmludGVyKHZhbC5zYW1wbGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKTtcblx0fVxuXHRpZiAoc3RyaW5nZWRWYWx1ZSA9PT0gXCJTdHJpbmdDb250YWluaW5nXCIgfHwgc3RyaW5nZWRWYWx1ZSA9PT0gXCJTdHJpbmdOb3RDb250YWluaW5nXCIpIHtcblx0XHRyZXR1cm4gc3RyaW5nZWRWYWx1ZSArIFNQQUNFJDIgKyBwcmludGVyKHZhbC5zYW1wbGUsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKTtcblx0fVxuXHRpZiAodHlwZW9mIHZhbC50b0FzeW1tZXRyaWNNYXRjaGVyICE9PSBcImZ1bmN0aW9uXCIpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKGBBc3ltbWV0cmljIG1hdGNoZXIgJHt2YWwuY29uc3RydWN0b3IubmFtZX0gZG9lcyBub3QgaW1wbGVtZW50IHRvQXN5bW1ldHJpY01hdGNoZXIoKWApO1xuXHR9XG5cdHJldHVybiB2YWwudG9Bc3ltbWV0cmljTWF0Y2hlcigpO1xufTtcbmNvbnN0IHRlc3QkNSA9ICh2YWwpID0+IHZhbCAmJiB2YWwuJCR0eXBlb2YgPT09IGFzeW1tZXRyaWNNYXRjaGVyO1xuY29uc3QgcGx1Z2luJDUgPSB7XG5cdHNlcmlhbGl6ZTogc2VyaWFsaXplJDUsXG5cdHRlc3Q6IHRlc3QkNVxufTtcblxuY29uc3QgU1BBQ0UkMSA9IFwiIFwiO1xuY29uc3QgT0JKRUNUX05BTUVTID0gbmV3IFNldChbXCJET01TdHJpbmdNYXBcIiwgXCJOYW1lZE5vZGVNYXBcIl0pO1xuY29uc3QgQVJSQVlfUkVHRVhQID0gL14oPzpIVE1MXFx3KkNvbGxlY3Rpb258Tm9kZUxpc3QpJC87XG5mdW5jdGlvbiB0ZXN0TmFtZShuYW1lKSB7XG5cdHJldHVybiBPQkpFQ1RfTkFNRVMuaGFzKG5hbWUpIHx8IEFSUkFZX1JFR0VYUC50ZXN0KG5hbWUpO1xufVxuY29uc3QgdGVzdCQ0ID0gKHZhbCkgPT4gdmFsICYmIHZhbC5jb25zdHJ1Y3RvciAmJiAhIXZhbC5jb25zdHJ1Y3Rvci5uYW1lICYmIHRlc3ROYW1lKHZhbC5jb25zdHJ1Y3Rvci5uYW1lKTtcbmZ1bmN0aW9uIGlzTmFtZWROb2RlTWFwKGNvbGxlY3Rpb24pIHtcblx0cmV0dXJuIGNvbGxlY3Rpb24uY29uc3RydWN0b3IubmFtZSA9PT0gXCJOYW1lZE5vZGVNYXBcIjtcbn1cbmNvbnN0IHNlcmlhbGl6ZSQ0ID0gKGNvbGxlY3Rpb24sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiB7XG5cdGNvbnN0IG5hbWUgPSBjb2xsZWN0aW9uLmNvbnN0cnVjdG9yLm5hbWU7XG5cdGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG5cdFx0cmV0dXJuIGBbJHtuYW1lfV1gO1xuXHR9XG5cdHJldHVybiAoY29uZmlnLm1pbiA/IFwiXCIgOiBuYW1lICsgU1BBQ0UkMSkgKyAoT0JKRUNUX05BTUVTLmhhcyhuYW1lKSA/IGB7JHtwcmludE9iamVjdFByb3BlcnRpZXMoaXNOYW1lZE5vZGVNYXAoY29sbGVjdGlvbikgPyBbLi4uY29sbGVjdGlvbl0ucmVkdWNlKChwcm9wcywgYXR0cmlidXRlKSA9PiB7XG5cdFx0cHJvcHNbYXR0cmlidXRlLm5hbWVdID0gYXR0cmlidXRlLnZhbHVlO1xuXHRcdHJldHVybiBwcm9wcztcblx0fSwge30pIDogeyAuLi5jb2xsZWN0aW9uIH0sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YCA6IGBbJHtwcmludExpc3RJdGVtcyhbLi4uY29sbGVjdGlvbl0sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX1dYCk7XG59O1xuY29uc3QgcGx1Z2luJDQgPSB7XG5cdHNlcmlhbGl6ZTogc2VyaWFsaXplJDQsXG5cdHRlc3Q6IHRlc3QkNFxufTtcblxuLyoqXG4qIENvcHlyaWdodCAoYykgTWV0YSBQbGF0Zm9ybXMsIEluYy4gYW5kIGFmZmlsaWF0ZXMuXG4qXG4qIFRoaXMgc291cmNlIGNvZGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlIGZvdW5kIGluIHRoZVxuKiBMSUNFTlNFIGZpbGUgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc291cmNlIHRyZWUuXG4qL1xuZnVuY3Rpb24gZXNjYXBlSFRNTChzdHIpIHtcblx0cmV0dXJuIHN0ci5yZXBsYWNlQWxsKFwiPFwiLCBcIiZsdDtcIikucmVwbGFjZUFsbChcIj5cIiwgXCImZ3Q7XCIpO1xufVxuXG4vLyBSZXR1cm4gZW1wdHkgc3RyaW5nIGlmIGtleXMgaXMgZW1wdHkuXG5mdW5jdGlvbiBwcmludFByb3BzKGtleXMsIHByb3BzLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuXHRjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cdGNvbnN0IGNvbG9ycyA9IGNvbmZpZy5jb2xvcnM7XG5cdHJldHVybiBrZXlzLm1hcCgoa2V5KSA9PiB7XG5cdFx0Y29uc3QgdmFsdWUgPSBwcm9wc1trZXldO1xuXHRcdC8vIGhpZGRlbiBpbmplY3RlZCB2YWx1ZSB0aGF0IHNob3VsZCBub3QgYmUgcHJpbnRlZFxuXHRcdGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgdmFsdWVbMF0gPT09IFwiX1wiICYmIHZhbHVlLnN0YXJ0c1dpdGgoXCJfX3ZpdGVzdF9cIikgJiYgdmFsdWUubWF0Y2goL19fdml0ZXN0X1xcZCtfXy8pKSB7XG5cdFx0XHRyZXR1cm4gXCJcIjtcblx0XHR9XG5cdFx0bGV0IHByaW50ZWQgPSBwcmludGVyKHZhbHVlLCBjb25maWcsIGluZGVudGF0aW9uTmV4dCwgZGVwdGgsIHJlZnMpO1xuXHRcdGlmICh0eXBlb2YgdmFsdWUgIT09IFwic3RyaW5nXCIpIHtcblx0XHRcdGlmIChwcmludGVkLmluY2x1ZGVzKFwiXFxuXCIpKSB7XG5cdFx0XHRcdHByaW50ZWQgPSBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb25OZXh0ICsgcHJpbnRlZCArIGNvbmZpZy5zcGFjaW5nT3V0ZXIgKyBpbmRlbnRhdGlvbjtcblx0XHRcdH1cblx0XHRcdHByaW50ZWQgPSBgeyR7cHJpbnRlZH19YDtcblx0XHR9XG5cdFx0cmV0dXJuIGAke2NvbmZpZy5zcGFjaW5nSW5uZXIgKyBpbmRlbnRhdGlvbiArIGNvbG9ycy5wcm9wLm9wZW4gKyBrZXkgKyBjb2xvcnMucHJvcC5jbG9zZX09JHtjb2xvcnMudmFsdWUub3Blbn0ke3ByaW50ZWR9JHtjb2xvcnMudmFsdWUuY2xvc2V9YDtcblx0fSkuam9pbihcIlwiKTtcbn1cbi8vIFJldHVybiBlbXB0eSBzdHJpbmcgaWYgY2hpbGRyZW4gaXMgZW1wdHkuXG5mdW5jdGlvbiBwcmludENoaWxkcmVuKGNoaWxkcmVuLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuXHRyZXR1cm4gY2hpbGRyZW4ubWFwKChjaGlsZCkgPT4gY29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9uICsgKHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIiA/IHByaW50VGV4dChjaGlsZCwgY29uZmlnKSA6IHByaW50ZXIoY2hpbGQsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKSkpLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBwcmludFNoYWRvd1Jvb3QoY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdGlmIChjb25maWcucHJpbnRTaGFkb3dSb290ID09PSBmYWxzZSkge1xuXHRcdHJldHVybiBcIlwiO1xuXHR9XG5cdHJldHVybiBbYCR7Y29uZmlnLnNwYWNpbmdPdXRlciArIGluZGVudGF0aW9ufSNzaGFkb3ctcm9vdGAsIHByaW50Q2hpbGRyZW4oY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlcildLmpvaW4oXCJcIik7XG59XG5mdW5jdGlvbiBwcmludFRleHQodGV4dCwgY29uZmlnKSB7XG5cdGNvbnN0IGNvbnRlbnRDb2xvciA9IGNvbmZpZy5jb2xvcnMuY29udGVudDtcblx0cmV0dXJuIGNvbnRlbnRDb2xvci5vcGVuICsgZXNjYXBlSFRNTCh0ZXh0KSArIGNvbnRlbnRDb2xvci5jbG9zZTtcbn1cbmZ1bmN0aW9uIHByaW50Q29tbWVudChjb21tZW50LCBjb25maWcpIHtcblx0Y29uc3QgY29tbWVudENvbG9yID0gY29uZmlnLmNvbG9ycy5jb21tZW50O1xuXHRyZXR1cm4gYCR7Y29tbWVudENvbG9yLm9wZW59PCEtLSR7ZXNjYXBlSFRNTChjb21tZW50KX0tLT4ke2NvbW1lbnRDb2xvci5jbG9zZX1gO1xufVxuLy8gU2VwYXJhdGUgdGhlIGZ1bmN0aW9ucyB0byBmb3JtYXQgcHJvcHMsIGNoaWxkcmVuLCBhbmQgZWxlbWVudCxcbi8vIHNvIGEgcGx1Z2luIGNvdWxkIG92ZXJyaWRlIGEgcGFydGljdWxhciBmdW5jdGlvbiwgaWYgbmVlZGVkLlxuLy8gVG9vIGJhZCwgc28gc2FkOiB0aGUgdHJhZGl0aW9uYWwgKGJ1dCB1bm5lY2Vzc2FyeSkgc3BhY2Vcbi8vIGluIGEgc2VsZi1jbG9zaW5nIHRhZ0NvbG9yIHJlcXVpcmVzIGEgc2Vjb25kIHRlc3Qgb2YgcHJpbnRlZFByb3BzLlxuZnVuY3Rpb24gcHJpbnRFbGVtZW50KHR5cGUsIHByaW50ZWRQcm9wcywgcHJpbnRlZENoaWxkcmVuLCBjb25maWcsIGluZGVudGF0aW9uKSB7XG5cdGNvbnN0IHRhZ0NvbG9yID0gY29uZmlnLmNvbG9ycy50YWc7XG5cdHJldHVybiBgJHt0YWdDb2xvci5vcGVufTwke3R5cGV9JHtwcmludGVkUHJvcHMgJiYgdGFnQ29sb3IuY2xvc2UgKyBwcmludGVkUHJvcHMgKyBjb25maWcuc3BhY2luZ091dGVyICsgaW5kZW50YXRpb24gKyB0YWdDb2xvci5vcGVufSR7cHJpbnRlZENoaWxkcmVuID8gYD4ke3RhZ0NvbG9yLmNsb3NlfSR7cHJpbnRlZENoaWxkcmVufSR7Y29uZmlnLnNwYWNpbmdPdXRlcn0ke2luZGVudGF0aW9ufSR7dGFnQ29sb3Iub3Blbn08LyR7dHlwZX1gIDogYCR7cHJpbnRlZFByb3BzICYmICFjb25maWcubWluID8gXCJcIiA6IFwiIFwifS9gfT4ke3RhZ0NvbG9yLmNsb3NlfWA7XG59XG5mdW5jdGlvbiBwcmludEVsZW1lbnRBc0xlYWYodHlwZSwgY29uZmlnKSB7XG5cdGNvbnN0IHRhZ0NvbG9yID0gY29uZmlnLmNvbG9ycy50YWc7XG5cdHJldHVybiBgJHt0YWdDb2xvci5vcGVufTwke3R5cGV9JHt0YWdDb2xvci5jbG9zZX0g4oCmJHt0YWdDb2xvci5vcGVufSAvPiR7dGFnQ29sb3IuY2xvc2V9YDtcbn1cblxuY29uc3QgRUxFTUVOVF9OT0RFID0gMTtcbmNvbnN0IFRFWFRfTk9ERSA9IDM7XG5jb25zdCBDT01NRU5UX05PREUgPSA4O1xuY29uc3QgRlJBR01FTlRfTk9ERSA9IDExO1xuY29uc3QgRUxFTUVOVF9SRUdFWFAgPSAvXig/Oig/OkhUTUx8U1ZHKVxcdyopP0VsZW1lbnQkLztcbmZ1bmN0aW9uIHRlc3RIYXNBdHRyaWJ1dGUodmFsKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YWwuaGFzQXR0cmlidXRlID09PSBcImZ1bmN0aW9uXCIgJiYgdmFsLmhhc0F0dHJpYnV0ZShcImlzXCIpO1xuXHR9IGNhdGNoIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cbmZ1bmN0aW9uIHRlc3ROb2RlKHZhbCkge1xuXHRjb25zdCBjb25zdHJ1Y3Rvck5hbWUgPSB2YWwuY29uc3RydWN0b3IubmFtZTtcblx0Y29uc3QgeyBub2RlVHlwZSwgdGFnTmFtZSB9ID0gdmFsO1xuXHRjb25zdCBpc0N1c3RvbUVsZW1lbnQgPSB0eXBlb2YgdGFnTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiB0YWdOYW1lLmluY2x1ZGVzKFwiLVwiKSB8fCB0ZXN0SGFzQXR0cmlidXRlKHZhbCk7XG5cdHJldHVybiBub2RlVHlwZSA9PT0gRUxFTUVOVF9OT0RFICYmIChFTEVNRU5UX1JFR0VYUC50ZXN0KGNvbnN0cnVjdG9yTmFtZSkgfHwgaXNDdXN0b21FbGVtZW50KSB8fCBub2RlVHlwZSA9PT0gVEVYVF9OT0RFICYmIGNvbnN0cnVjdG9yTmFtZSA9PT0gXCJUZXh0XCIgfHwgbm9kZVR5cGUgPT09IENPTU1FTlRfTk9ERSAmJiBjb25zdHJ1Y3Rvck5hbWUgPT09IFwiQ29tbWVudFwiIHx8IG5vZGVUeXBlID09PSBGUkFHTUVOVF9OT0RFICYmIGNvbnN0cnVjdG9yTmFtZSA9PT0gXCJEb2N1bWVudEZyYWdtZW50XCI7XG59XG5jb25zdCB0ZXN0JDMgPSAodmFsKSA9PiB2YWw/LmNvbnN0cnVjdG9yPy5uYW1lICYmIHRlc3ROb2RlKHZhbCk7XG5mdW5jdGlvbiBub2RlSXNUZXh0KG5vZGUpIHtcblx0cmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IFRFWFRfTk9ERTtcbn1cbmZ1bmN0aW9uIG5vZGVJc0NvbW1lbnQobm9kZSkge1xuXHRyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gQ09NTUVOVF9OT0RFO1xufVxuZnVuY3Rpb24gbm9kZUlzRnJhZ21lbnQobm9kZSkge1xuXHRyZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gRlJBR01FTlRfTk9ERTtcbn1cbmZ1bmN0aW9uIGZpbHRlckNoaWxkcmVuKGNoaWxkcmVuLCBmaWx0ZXJOb2RlKSB7XG5cdC8vIEZpbHRlciBvdXQgdGV4dCBub2RlcyB0aGF0IG9ubHkgY29udGFpbiB3aGl0ZXNwYWNlIHRvIHByZXZlbnQgZW1wdHkgbGluZXNcblx0Ly8gVGhpcyBpcyBkb25lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBhIGZpbHRlck5vZGUgaXMgcHJvdmlkZWRcblx0bGV0IGZpbHRlcmVkID0gY2hpbGRyZW4uZmlsdGVyKChub2RlKSA9PiB7XG5cdFx0Ly8gRmlsdGVyIG91dCB0ZXh0IG5vZGVzIHRoYXQgYXJlIG9ubHkgd2hpdGVzcGFjZVxuXHRcdGlmIChub2RlLm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcblx0XHRcdGNvbnN0IHRleHQgPSBub2RlLmRhdGEgfHwgXCJcIjtcblx0XHRcdC8vIEtlZXAgdGV4dCBub2RlcyB0aGF0IGhhdmUgbm9uLXdoaXRlc3BhY2UgY29udGVudFxuXHRcdFx0cmV0dXJuIHRleHQudHJpbSgpLmxlbmd0aCA+IDA7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9KTtcblx0Ly8gQXBwbHkgYWRkaXRpb25hbCB1c2VyLXByb3ZpZGVkIGZpbHRlciBpZiBzcGVjaWZpZWRcblx0aWYgKGZpbHRlck5vZGUpIHtcblx0XHRmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcihmaWx0ZXJOb2RlKTtcblx0fVxuXHRyZXR1cm4gZmlsdGVyZWQ7XG59XG5mdW5jdGlvbiBzZXJpYWxpemVET00obm9kZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIGZpbHRlck5vZGUpIHtcblx0aWYgKG5vZGVJc1RleHQobm9kZSkpIHtcblx0XHRyZXR1cm4gcHJpbnRUZXh0KG5vZGUuZGF0YSwgY29uZmlnKTtcblx0fVxuXHRpZiAobm9kZUlzQ29tbWVudChub2RlKSkge1xuXHRcdHJldHVybiBwcmludENvbW1lbnQobm9kZS5kYXRhLCBjb25maWcpO1xuXHR9XG5cdGNvbnN0IHR5cGUgPSBub2RlSXNGcmFnbWVudChub2RlKSA/IFwiRG9jdW1lbnRGcmFnbWVudFwiIDogbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdGlmICgrK2RlcHRoID4gY29uZmlnLm1heERlcHRoKSB7XG5cdFx0cmV0dXJuIHByaW50RWxlbWVudEFzTGVhZih0eXBlLCBjb25maWcpO1xuXHR9XG5cdGNvbnN0IGNoaWxkcmVuID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwobm9kZS5jaGlsZE5vZGVzIHx8IG5vZGUuY2hpbGRyZW4pO1xuXHRjb25zdCBzaGFkb3dDaGlsZHJlbiA9IG5vZGVJc0ZyYWdtZW50KG5vZGUpIHx8ICFub2RlLnNoYWRvd1Jvb3QgPyBbXSA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG5vZGUuc2hhZG93Um9vdC5jaGlsZHJlbik7XG5cdGNvbnN0IHJlc29sdmVkQ2hpbGRyZW4gPSBmaWx0ZXJOb2RlID8gZmlsdGVyQ2hpbGRyZW4oY2hpbGRyZW4sIGZpbHRlck5vZGUpIDogY2hpbGRyZW47XG5cdGNvbnN0IHJlc29sdmVkU2hhZG93Q2hpbGRyZW4gPSBmaWx0ZXJOb2RlID8gZmlsdGVyQ2hpbGRyZW4oc2hhZG93Q2hpbGRyZW4sIGZpbHRlck5vZGUpIDogc2hhZG93Q2hpbGRyZW47XG5cdHJldHVybiBwcmludEVsZW1lbnQodHlwZSwgcHJpbnRQcm9wcyhub2RlSXNGcmFnbWVudChub2RlKSA/IFtdIDogQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMsIChhdHRyKSA9PiBhdHRyLm5hbWUpLnNvcnQoKSwgbm9kZUlzRnJhZ21lbnQobm9kZSkgPyB7fSA6IFsuLi5ub2RlLmF0dHJpYnV0ZXNdLnJlZHVjZSgocHJvcHMsIGF0dHJpYnV0ZSkgPT4ge1xuXHRcdHByb3BzW2F0dHJpYnV0ZS5uYW1lXSA9IGF0dHJpYnV0ZS52YWx1ZTtcblx0XHRyZXR1cm4gcHJvcHM7XG5cdH0sIHt9KSwgY29uZmlnLCBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQsIGRlcHRoLCByZWZzLCBwcmludGVyKSwgKHJlc29sdmVkU2hhZG93Q2hpbGRyZW4ubGVuZ3RoID4gMCA/IHByaW50U2hhZG93Um9vdChyZXNvbHZlZFNoYWRvd0NoaWxkcmVuLCBjb25maWcsIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogXCJcIikgKyBwcmludENoaWxkcmVuKHJlc29sdmVkQ2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlciksIGNvbmZpZywgaW5kZW50YXRpb24pO1xufVxuY29uc3Qgc2VyaWFsaXplJDMgPSAobm9kZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHNlcmlhbGl6ZURPTShub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcik7XG5mdW5jdGlvbiBjcmVhdGVET01FbGVtZW50RmlsdGVyKGZpbHRlck5vZGUpIHtcblx0cmV0dXJuIHtcblx0XHR0ZXN0OiB0ZXN0JDMsXG5cdFx0c2VyaWFsaXplOiAobm9kZSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHNlcmlhbGl6ZURPTShub2RlLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgZmlsdGVyTm9kZSlcblx0fTtcbn1cbmNvbnN0IHBsdWdpbiQzID0ge1xuXHRzZXJpYWxpemU6IHNlcmlhbGl6ZSQzLFxuXHR0ZXN0OiB0ZXN0JDNcbn07XG5cbi8vIFNFTlRJTkVMIGNvbnN0YW50cyBhcmUgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW1tdXRhYmxlLWpzXG5jb25zdCBJU19JVEVSQUJMRV9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9JVEVSQUJMRV9fQEBcIjtcbmNvbnN0IElTX0xJU1RfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfTElTVF9fQEBcIjtcbmNvbnN0IElTX0tFWUVEX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX0tFWUVEX19AQFwiO1xuY29uc3QgSVNfTUFQX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX01BUF9fQEBcIjtcbmNvbnN0IElTX09SREVSRURfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfT1JERVJFRF9fQEBcIjtcbmNvbnN0IElTX1JFQ09SRF9TRU5USU5FTCA9IFwiQEBfX0lNTVVUQUJMRV9SRUNPUkRfX0BAXCI7XG5jb25zdCBJU19TRVFfU0VOVElORUwgPSBcIkBAX19JTU1VVEFCTEVfU0VRX19AQFwiO1xuY29uc3QgSVNfU0VUX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX1NFVF9fQEBcIjtcbmNvbnN0IElTX1NUQUNLX1NFTlRJTkVMID0gXCJAQF9fSU1NVVRBQkxFX1NUQUNLX19AQFwiO1xuY29uc3QgZ2V0SW1tdXRhYmxlTmFtZSA9IChuYW1lKSA9PiBgSW1tdXRhYmxlLiR7bmFtZX1gO1xuY29uc3QgcHJpbnRBc0xlYWYgPSAobmFtZSkgPT4gYFske25hbWV9XWA7XG5jb25zdCBTUEFDRSA9IFwiIFwiO1xuY29uc3QgTEFaWSA9IFwi4oCmXCI7XG5mdW5jdGlvbiBwcmludEltbXV0YWJsZUVudHJpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgdHlwZSkge1xuXHRyZXR1cm4gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCA/IHByaW50QXNMZWFmKGdldEltbXV0YWJsZU5hbWUodHlwZSkpIDogYCR7Z2V0SW1tdXRhYmxlTmFtZSh0eXBlKSArIFNQQUNFfXske3ByaW50SXRlcmF0b3JFbnRyaWVzKHZhbC5lbnRyaWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcbn1cbi8vIFJlY29yZCBoYXMgYW4gZW50cmllcyBtZXRob2QgYmVjYXVzZSBpdCBpcyBhIGNvbGxlY3Rpb24gaW4gaW1tdXRhYmxlIHYzLlxuLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciBJbW11dGFibGUgUmVjb3JkIGZyb20gdmVyc2lvbiB2MyBvciB2NC5cbmZ1bmN0aW9uIGdldFJlY29yZEVudHJpZXModmFsKSB7XG5cdGxldCBpID0gMDtcblx0cmV0dXJuIHsgbmV4dCgpIHtcblx0XHRpZiAoaSA8IHZhbC5fa2V5cy5sZW5ndGgpIHtcblx0XHRcdGNvbnN0IGtleSA9IHZhbC5fa2V5c1tpKytdO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0ZG9uZTogZmFsc2UsXG5cdFx0XHRcdHZhbHVlOiBba2V5LCB2YWwuZ2V0KGtleSldXG5cdFx0XHR9O1xuXHRcdH1cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZG9uZTogdHJ1ZSxcblx0XHRcdHZhbHVlOiB1bmRlZmluZWRcblx0XHR9O1xuXHR9IH07XG59XG5mdW5jdGlvbiBwcmludEltbXV0YWJsZVJlY29yZCh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdC8vIF9uYW1lIHByb3BlcnR5IGlzIGRlZmluZWQgb25seSBmb3IgYW4gSW1tdXRhYmxlIFJlY29yZCBpbnN0YW5jZVxuXHQvLyB3aGljaCB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIHNlY29uZCBvcHRpb25hbCBkZXNjcmlwdGl2ZSBuYW1lIGFyZ1xuXHRjb25zdCBuYW1lID0gZ2V0SW1tdXRhYmxlTmFtZSh2YWwuX25hbWUgfHwgXCJSZWNvcmRcIik7XG5cdHJldHVybiArK2RlcHRoID4gY29uZmlnLm1heERlcHRoID8gcHJpbnRBc0xlYWYobmFtZSkgOiBgJHtuYW1lICsgU1BBQ0V9eyR7cHJpbnRJdGVyYXRvckVudHJpZXMoZ2V0UmVjb3JkRW50cmllcyh2YWwpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9fWA7XG59XG5mdW5jdGlvbiBwcmludEltbXV0YWJsZVNlcSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSB7XG5cdGNvbnN0IG5hbWUgPSBnZXRJbW11dGFibGVOYW1lKFwiU2VxXCIpO1xuXHRpZiAoKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aCkge1xuXHRcdHJldHVybiBwcmludEFzTGVhZihuYW1lKTtcblx0fVxuXHRpZiAodmFsW0lTX0tFWUVEX1NFTlRJTkVMXSkge1xuXHRcdHJldHVybiBgJHtuYW1lICsgU1BBQ0V9eyR7dmFsLl9pdGVyIHx8IHZhbC5fb2JqZWN0ID8gcHJpbnRJdGVyYXRvckVudHJpZXModmFsLmVudHJpZXMoKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogTEFaWX19YDtcblx0fVxuXHRyZXR1cm4gYCR7bmFtZSArIFNQQUNFfVske3ZhbC5faXRlciB8fCB2YWwuX2FycmF5IHx8IHZhbC5fY29sbGVjdGlvbiB8fCB2YWwuX2l0ZXJhYmxlID8gcHJpbnRJdGVyYXRvclZhbHVlcyh2YWwudmFsdWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA6IExBWll9XWA7XG59XG5mdW5jdGlvbiBwcmludEltbXV0YWJsZVZhbHVlcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCB0eXBlKSB7XG5cdHJldHVybiArK2RlcHRoID4gY29uZmlnLm1heERlcHRoID8gcHJpbnRBc0xlYWYoZ2V0SW1tdXRhYmxlTmFtZSh0eXBlKSkgOiBgJHtnZXRJbW11dGFibGVOYW1lKHR5cGUpICsgU1BBQ0V9WyR7cHJpbnRJdGVyYXRvclZhbHVlcyh2YWwudmFsdWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX1dYDtcbn1cbmNvbnN0IHNlcmlhbGl6ZSQyID0gKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+IHtcblx0aWYgKHZhbFtJU19NQVBfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIHByaW50SW1tdXRhYmxlRW50cmllcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCB2YWxbSVNfT1JERVJFRF9TRU5USU5FTF0gPyBcIk9yZGVyZWRNYXBcIiA6IFwiTWFwXCIpO1xuXHR9XG5cdGlmICh2YWxbSVNfTElTVF9TRU5USU5FTF0pIHtcblx0XHRyZXR1cm4gcHJpbnRJbW11dGFibGVWYWx1ZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlciwgXCJMaXN0XCIpO1xuXHR9XG5cdGlmICh2YWxbSVNfU0VUX1NFTlRJTkVMXSkge1xuXHRcdHJldHVybiBwcmludEltbXV0YWJsZVZhbHVlcyh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCB2YWxbSVNfT1JERVJFRF9TRU5USU5FTF0gPyBcIk9yZGVyZWRTZXRcIiA6IFwiU2V0XCIpO1xuXHR9XG5cdGlmICh2YWxbSVNfU1RBQ0tfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIHByaW50SW1tdXRhYmxlVmFsdWVzKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIsIFwiU3RhY2tcIik7XG5cdH1cblx0aWYgKHZhbFtJU19TRVFfU0VOVElORUxdKSB7XG5cdFx0cmV0dXJuIHByaW50SW1tdXRhYmxlU2VxKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpO1xuXHR9XG5cdC8vIEZvciBjb21wYXRpYmlsaXR5IHdpdGggaW1tdXRhYmxlIHYzIGFuZCB2NCwgbGV0IHJlY29yZCBiZSB0aGUgZGVmYXVsdC5cblx0cmV0dXJuIHByaW50SW1tdXRhYmxlUmVjb3JkKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpO1xufTtcbi8vIEV4cGxpY2l0bHkgY29tcGFyaW5nIHNlbnRpbmVsIHByb3BlcnRpZXMgdG8gdHJ1ZSBhdm9pZHMgZmFsc2UgcG9zaXRpdmVcbi8vIHdoZW4gbW9jayBpZGVudGl0eS1vYmotcHJveHkgcmV0dXJucyB0aGUga2V5IGFzIHRoZSB2YWx1ZSBmb3IgYW55IGtleS5cbmNvbnN0IHRlc3QkMiA9ICh2YWwpID0+IHZhbCAmJiAodmFsW0lTX0lURVJBQkxFX1NFTlRJTkVMXSA9PT0gdHJ1ZSB8fCB2YWxbSVNfUkVDT1JEX1NFTlRJTkVMXSA9PT0gdHJ1ZSk7XG5jb25zdCBwbHVnaW4kMiA9IHtcblx0c2VyaWFsaXplOiBzZXJpYWxpemUkMixcblx0dGVzdDogdGVzdCQyXG59O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RXhwb3J0RnJvbUNqcyh4KSB7XG5cdHJldHVybiB4ICYmIHguX19lc01vZHVsZSAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoeCwgXCJkZWZhdWx0XCIpID8geFtcImRlZmF1bHRcIl0gOiB4O1xufVxuXG52YXIgcmVhY3RJcyQxID0ge2V4cG9ydHM6IHt9fTtcblxudmFyIHJlYWN0SXNfcHJvZHVjdGlvbiA9IHt9O1xuXG4vKipcbiAqIEBsaWNlbnNlIFJlYWN0XG4gKiByZWFjdC1pcy5wcm9kdWN0aW9uLmpzXG4gKlxuICogQ29weXJpZ2h0IChjKSBNZXRhIFBsYXRmb3JtcywgSW5jLiBhbmQgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgaGFzUmVxdWlyZWRSZWFjdElzX3Byb2R1Y3Rpb247XG5cbmZ1bmN0aW9uIHJlcXVpcmVSZWFjdElzX3Byb2R1Y3Rpb24gKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRSZWFjdElzX3Byb2R1Y3Rpb24pIHJldHVybiByZWFjdElzX3Byb2R1Y3Rpb247XG5cdGhhc1JlcXVpcmVkUmVhY3RJc19wcm9kdWN0aW9uID0gMTtcblx0dmFyIFJFQUNUX0VMRU1FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC50cmFuc2l0aW9uYWwuZWxlbWVudFwiKSxcblx0ICBSRUFDVF9QT1JUQUxfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5wb3J0YWxcIiksXG5cdCAgUkVBQ1RfRlJBR01FTlRfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5mcmFnbWVudFwiKSxcblx0ICBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLFxuXHQgIFJFQUNUX1BST0ZJTEVSX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QucHJvZmlsZXJcIiksXG5cdCAgUkVBQ1RfQ09OU1VNRVJfVFlQRSA9IFN5bWJvbC5mb3IoXCJyZWFjdC5jb25zdW1lclwiKSxcblx0ICBSRUFDVF9DT05URVhUX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3QuY29udGV4dFwiKSxcblx0ICBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmZvcndhcmRfcmVmXCIpLFxuXHQgIFJFQUNUX1NVU1BFTlNFX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksXG5cdCAgUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LnN1c3BlbnNlX2xpc3RcIiksXG5cdCAgUkVBQ1RfTUVNT19UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0Lm1lbW9cIiksXG5cdCAgUkVBQ1RfTEFaWV9UWVBFID0gU3ltYm9sLmZvcihcInJlYWN0LmxhenlcIiksXG5cdCAgUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEUgPSBTeW1ib2wuZm9yKFwicmVhY3Qudmlld190cmFuc2l0aW9uXCIpLFxuXHQgIFJFQUNUX0NMSUVOVF9SRUZFUkVOQ0UgPSBTeW1ib2wuZm9yKFwicmVhY3QuY2xpZW50LnJlZmVyZW5jZVwiKTtcblx0ZnVuY3Rpb24gdHlwZU9mKG9iamVjdCkge1xuXHQgIGlmIChcIm9iamVjdFwiID09PSB0eXBlb2Ygb2JqZWN0ICYmIG51bGwgIT09IG9iamVjdCkge1xuXHQgICAgdmFyICQkdHlwZW9mID0gb2JqZWN0LiQkdHlwZW9mO1xuXHQgICAgc3dpdGNoICgkJHR5cGVvZikge1xuXHQgICAgICBjYXNlIFJFQUNUX0VMRU1FTlRfVFlQRTpcblx0ICAgICAgICBzd2l0Y2ggKCgob2JqZWN0ID0gb2JqZWN0LnR5cGUpLCBvYmplY3QpKSB7XG5cdCAgICAgICAgICBjYXNlIFJFQUNUX0ZSQUdNRU5UX1RZUEU6XG5cdCAgICAgICAgICBjYXNlIFJFQUNUX1BST0ZJTEVSX1RZUEU6XG5cdCAgICAgICAgICBjYXNlIFJFQUNUX1NUUklDVF9NT0RFX1RZUEU6XG5cdCAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX1RZUEU6XG5cdCAgICAgICAgICBjYXNlIFJFQUNUX1NVU1BFTlNFX0xJU1RfVFlQRTpcblx0ICAgICAgICAgIGNhc2UgUkVBQ1RfVklFV19UUkFOU0lUSU9OX1RZUEU6XG5cdCAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG5cdCAgICAgICAgICBkZWZhdWx0OlxuXHQgICAgICAgICAgICBzd2l0Y2ggKCgob2JqZWN0ID0gb2JqZWN0ICYmIG9iamVjdC4kJHR5cGVvZiksIG9iamVjdCkpIHtcblx0ICAgICAgICAgICAgICBjYXNlIFJFQUNUX0NPTlRFWFRfVFlQRTpcblx0ICAgICAgICAgICAgICBjYXNlIFJFQUNUX0ZPUldBUkRfUkVGX1RZUEU6XG5cdCAgICAgICAgICAgICAgY2FzZSBSRUFDVF9MQVpZX1RZUEU6XG5cdCAgICAgICAgICAgICAgY2FzZSBSRUFDVF9NRU1PX1RZUEU6XG5cdCAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuXHQgICAgICAgICAgICAgIGNhc2UgUkVBQ1RfQ09OU1VNRVJfVFlQRTpcblx0ICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7XG5cdCAgICAgICAgICAgICAgZGVmYXVsdDpcblx0ICAgICAgICAgICAgICAgIHJldHVybiAkJHR5cGVvZjtcblx0ICAgICAgICAgICAgfVxuXHQgICAgICAgIH1cblx0ICAgICAgY2FzZSBSRUFDVF9QT1JUQUxfVFlQRTpcblx0ICAgICAgICByZXR1cm4gJCR0eXBlb2Y7XG5cdCAgICB9XG5cdCAgfVxuXHR9XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5Db250ZXh0Q29uc3VtZXIgPSBSRUFDVF9DT05TVU1FUl9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uQ29udGV4dFByb3ZpZGVyID0gUkVBQ1RfQ09OVEVYVF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uRWxlbWVudCA9IFJFQUNUX0VMRU1FTlRfVFlQRTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLkZvcndhcmRSZWYgPSBSRUFDVF9GT1JXQVJEX1JFRl9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uRnJhZ21lbnQgPSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uTGF6eSA9IFJFQUNUX0xBWllfVFlQRTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLk1lbW8gPSBSRUFDVF9NRU1PX1RZUEU7XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5Qb3J0YWwgPSBSRUFDVF9QT1JUQUxfVFlQRTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLlByb2ZpbGVyID0gUkVBQ1RfUFJPRklMRVJfVFlQRTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLlN0cmljdE1vZGUgPSBSRUFDVF9TVFJJQ1RfTU9ERV9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uU3VzcGVuc2UgPSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uU3VzcGVuc2VMaXN0ID0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNDb250ZXh0Q29uc3VtZXIgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05TVU1FUl9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNDb250ZXh0UHJvdmlkZXIgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9DT05URVhUX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc0VsZW1lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIChcblx0ICAgIFwib2JqZWN0XCIgPT09IHR5cGVvZiBvYmplY3QgJiZcblx0ICAgIG51bGwgIT09IG9iamVjdCAmJlxuXHQgICAgb2JqZWN0LiQkdHlwZW9mID09PSBSRUFDVF9FTEVNRU5UX1RZUEVcblx0ICApO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNGb3J3YXJkUmVmID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHQgIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfRk9SV0FSRF9SRUZfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzRnJhZ21lbnQgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9GUkFHTUVOVF9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNMYXp5ID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHQgIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTEFaWV9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNNZW1vID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHQgIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfTUVNT19UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNQb3J0YWwgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QT1JUQUxfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzUHJvZmlsZXIgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9QUk9GSUxFUl9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNTdHJpY3RNb2RlID0gZnVuY3Rpb24gKG9iamVjdCkge1xuXHQgIHJldHVybiB0eXBlT2Yob2JqZWN0KSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLmlzU3VzcGVuc2UgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9UWVBFO1xuXHR9O1xuXHRyZWFjdElzX3Byb2R1Y3Rpb24uaXNTdXNwZW5zZUxpc3QgPSBmdW5jdGlvbiAob2JqZWN0KSB7XG5cdCAgcmV0dXJuIHR5cGVPZihvYmplY3QpID09PSBSRUFDVF9TVVNQRU5TRV9MSVNUX1RZUEU7XG5cdH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbi5pc1ZhbGlkRWxlbWVudFR5cGUgPSBmdW5jdGlvbiAodHlwZSkge1xuXHQgIHJldHVybiBcInN0cmluZ1wiID09PSB0eXBlb2YgdHlwZSB8fFxuXHQgICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgdHlwZSB8fFxuXHQgICAgdHlwZSA9PT0gUkVBQ1RfRlJBR01FTlRfVFlQRSB8fFxuXHQgICAgdHlwZSA9PT0gUkVBQ1RfUFJPRklMRVJfVFlQRSB8fFxuXHQgICAgdHlwZSA9PT0gUkVBQ1RfU1RSSUNUX01PREVfVFlQRSB8fFxuXHQgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfVFlQRSB8fFxuXHQgICAgdHlwZSA9PT0gUkVBQ1RfU1VTUEVOU0VfTElTVF9UWVBFIHx8XG5cdCAgICAoXCJvYmplY3RcIiA9PT0gdHlwZW9mIHR5cGUgJiZcblx0ICAgICAgbnVsbCAhPT0gdHlwZSAmJlxuXHQgICAgICAodHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTEFaWV9UWVBFIHx8XG5cdCAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfTUVNT19UWVBFIHx8XG5cdCAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OVEVYVF9UWVBFIHx8XG5cdCAgICAgICAgdHlwZS4kJHR5cGVvZiA9PT0gUkVBQ1RfQ09OU1VNRVJfVFlQRSB8fFxuXHQgICAgICAgIHR5cGUuJCR0eXBlb2YgPT09IFJFQUNUX0ZPUldBUkRfUkVGX1RZUEUgfHxcblx0ICAgICAgICB0eXBlLiQkdHlwZW9mID09PSBSRUFDVF9DTElFTlRfUkVGRVJFTkNFIHx8XG5cdCAgICAgICAgdm9pZCAwICE9PSB0eXBlLmdldE1vZHVsZUlkKSlcblx0ICAgID8gdHJ1ZVxuXHQgICAgOiBmYWxzZTtcblx0fTtcblx0cmVhY3RJc19wcm9kdWN0aW9uLnR5cGVPZiA9IHR5cGVPZjtcblx0cmV0dXJuIHJlYWN0SXNfcHJvZHVjdGlvbjtcbn1cblxudmFyIGhhc1JlcXVpcmVkUmVhY3RJcyQxO1xuXG5mdW5jdGlvbiByZXF1aXJlUmVhY3RJcyQxICgpIHtcblx0aWYgKGhhc1JlcXVpcmVkUmVhY3RJcyQxKSByZXR1cm4gcmVhY3RJcyQxLmV4cG9ydHM7XG5cdGhhc1JlcXVpcmVkUmVhY3RJcyQxID0gMTtcblxuXHR7XG5cdCAgcmVhY3RJcyQxLmV4cG9ydHMgPSByZXF1aXJlUmVhY3RJc19wcm9kdWN0aW9uKCk7XG5cdH1cblx0cmV0dXJuIHJlYWN0SXMkMS5leHBvcnRzO1xufVxuXG52YXIgcmVhY3RJc0V4cG9ydHMkMSA9IHJlcXVpcmVSZWFjdElzJDEoKTtcbnZhciBpbmRleCQxID0gLypAX19QVVJFX18qL2dldERlZmF1bHRFeHBvcnRGcm9tQ2pzKHJlYWN0SXNFeHBvcnRzJDEpO1xuXG52YXIgUmVhY3RJczE5ID0gLyojX19QVVJFX18qL19tZXJnZU5hbWVzcGFjZXMoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIGRlZmF1bHQ6IGluZGV4JDFcbn0sIFtyZWFjdElzRXhwb3J0cyQxXSk7XG5cbnZhciByZWFjdElzID0ge2V4cG9ydHM6IHt9fTtcblxudmFyIHJlYWN0SXNfcHJvZHVjdGlvbl9taW4gPSB7fTtcblxuLyoqXG4gKiBAbGljZW5zZSBSZWFjdFxuICogcmVhY3QtaXMucHJvZHVjdGlvbi5taW4uanNcbiAqXG4gKiBDb3B5cmlnaHQgKGMpIEZhY2Vib29rLCBJbmMuIGFuZCBpdHMgYWZmaWxpYXRlcy5cbiAqXG4gKiBUaGlzIHNvdXJjZSBjb2RlIGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBmb3VuZCBpbiB0aGVcbiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS5cbiAqL1xuXG52YXIgaGFzUmVxdWlyZWRSZWFjdElzX3Byb2R1Y3Rpb25fbWluO1xuXG5mdW5jdGlvbiByZXF1aXJlUmVhY3RJc19wcm9kdWN0aW9uX21pbiAoKSB7XG5cdGlmIChoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbl9taW4pIHJldHVybiByZWFjdElzX3Byb2R1Y3Rpb25fbWluO1xuXHRoYXNSZXF1aXJlZFJlYWN0SXNfcHJvZHVjdGlvbl9taW4gPSAxO1xudmFyIGI9U3ltYm9sLmZvcihcInJlYWN0LmVsZW1lbnRcIiksYz1TeW1ib2wuZm9yKFwicmVhY3QucG9ydGFsXCIpLGQ9U3ltYm9sLmZvcihcInJlYWN0LmZyYWdtZW50XCIpLGU9U3ltYm9sLmZvcihcInJlYWN0LnN0cmljdF9tb2RlXCIpLGY9U3ltYm9sLmZvcihcInJlYWN0LnByb2ZpbGVyXCIpLGc9U3ltYm9sLmZvcihcInJlYWN0LnByb3ZpZGVyXCIpLGg9U3ltYm9sLmZvcihcInJlYWN0LmNvbnRleHRcIiksaz1TeW1ib2wuZm9yKFwicmVhY3Quc2VydmVyX2NvbnRleHRcIiksbD1TeW1ib2wuZm9yKFwicmVhY3QuZm9yd2FyZF9yZWZcIiksbT1TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VcIiksbj1TeW1ib2wuZm9yKFwicmVhY3Quc3VzcGVuc2VfbGlzdFwiKSxwPVN5bWJvbC5mb3IoXCJyZWFjdC5tZW1vXCIpLHE9U3ltYm9sLmZvcihcInJlYWN0LmxhenlcIiksdD1TeW1ib2wuZm9yKFwicmVhY3Qub2Zmc2NyZWVuXCIpLHU7dT1TeW1ib2wuZm9yKFwicmVhY3QubW9kdWxlLnJlZmVyZW5jZVwiKTtcblx0ZnVuY3Rpb24gdihhKXtpZihcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hKXt2YXIgcj1hLiQkdHlwZW9mO3N3aXRjaChyKXtjYXNlIGI6c3dpdGNoKGE9YS50eXBlLGEpe2Nhc2UgZDpjYXNlIGY6Y2FzZSBlOmNhc2UgbTpjYXNlIG46cmV0dXJuIGE7ZGVmYXVsdDpzd2l0Y2goYT1hJiZhLiQkdHlwZW9mLGEpe2Nhc2UgazpjYXNlIGg6Y2FzZSBsOmNhc2UgcTpjYXNlIHA6Y2FzZSBnOnJldHVybiBhO2RlZmF1bHQ6cmV0dXJuIHJ9fWNhc2UgYzpyZXR1cm4gcn19fXJlYWN0SXNfcHJvZHVjdGlvbl9taW4uQ29udGV4dENvbnN1bWVyPWg7cmVhY3RJc19wcm9kdWN0aW9uX21pbi5Db250ZXh0UHJvdmlkZXI9ZztyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkVsZW1lbnQ9YjtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkZvcndhcmRSZWY9bDtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLkZyYWdtZW50PWQ7cmVhY3RJc19wcm9kdWN0aW9uX21pbi5MYXp5PXE7cmVhY3RJc19wcm9kdWN0aW9uX21pbi5NZW1vPXA7cmVhY3RJc19wcm9kdWN0aW9uX21pbi5Qb3J0YWw9YztyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlByb2ZpbGVyPWY7cmVhY3RJc19wcm9kdWN0aW9uX21pbi5TdHJpY3RNb2RlPWU7cmVhY3RJc19wcm9kdWN0aW9uX21pbi5TdXNwZW5zZT1tO1xuXHRyZWFjdElzX3Byb2R1Y3Rpb25fbWluLlN1c3BlbnNlTGlzdD1uO3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNBc3luY01vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gIGZhbHNlfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzQ29uY3VycmVudE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gIGZhbHNlfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzQ29udGV4dENvbnN1bWVyPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09aH07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc0NvbnRleHRQcm92aWRlcj1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWd9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNFbGVtZW50PWZ1bmN0aW9uKGEpe3JldHVybiBcIm9iamVjdFwiPT09dHlwZW9mIGEmJm51bGwhPT1hJiZhLiQkdHlwZW9mPT09Yn07cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc0ZvcndhcmRSZWY9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1sfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzRnJhZ21lbnQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1kfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzTGF6eT1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PXF9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNNZW1vPWZ1bmN0aW9uKGEpe3JldHVybiB2KGEpPT09cH07XG5cdHJlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNQb3J0YWw9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1jfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzUHJvZmlsZXI9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1mfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLmlzU3RyaWN0TW9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PWV9O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNTdXNwZW5zZT1mdW5jdGlvbihhKXtyZXR1cm4gdihhKT09PW19O3JlYWN0SXNfcHJvZHVjdGlvbl9taW4uaXNTdXNwZW5zZUxpc3Q9ZnVuY3Rpb24oYSl7cmV0dXJuIHYoYSk9PT1ufTtcblx0cmVhY3RJc19wcm9kdWN0aW9uX21pbi5pc1ZhbGlkRWxlbWVudFR5cGU9ZnVuY3Rpb24oYSl7cmV0dXJuIFwic3RyaW5nXCI9PT10eXBlb2YgYXx8XCJmdW5jdGlvblwiPT09dHlwZW9mIGF8fGE9PT1kfHxhPT09Znx8YT09PWV8fGE9PT1tfHxhPT09bnx8YT09PXR8fFwib2JqZWN0XCI9PT10eXBlb2YgYSYmbnVsbCE9PWEmJihhLiQkdHlwZW9mPT09cXx8YS4kJHR5cGVvZj09PXB8fGEuJCR0eXBlb2Y9PT1nfHxhLiQkdHlwZW9mPT09aHx8YS4kJHR5cGVvZj09PWx8fGEuJCR0eXBlb2Y9PT11fHx2b2lkIDAhPT1hLmdldE1vZHVsZUlkKT90cnVlOmZhbHNlfTtyZWFjdElzX3Byb2R1Y3Rpb25fbWluLnR5cGVPZj12O1xuXHRyZXR1cm4gcmVhY3RJc19wcm9kdWN0aW9uX21pbjtcbn1cblxudmFyIGhhc1JlcXVpcmVkUmVhY3RJcztcblxuZnVuY3Rpb24gcmVxdWlyZVJlYWN0SXMgKCkge1xuXHRpZiAoaGFzUmVxdWlyZWRSZWFjdElzKSByZXR1cm4gcmVhY3RJcy5leHBvcnRzO1xuXHRoYXNSZXF1aXJlZFJlYWN0SXMgPSAxO1xuXG5cdHtcblx0ICByZWFjdElzLmV4cG9ydHMgPSByZXF1aXJlUmVhY3RJc19wcm9kdWN0aW9uX21pbigpO1xuXHR9XG5cdHJldHVybiByZWFjdElzLmV4cG9ydHM7XG59XG5cbnZhciByZWFjdElzRXhwb3J0cyA9IHJlcXVpcmVSZWFjdElzKCk7XG52YXIgaW5kZXggPSAvKkBfX1BVUkVfXyovZ2V0RGVmYXVsdEV4cG9ydEZyb21DanMocmVhY3RJc0V4cG9ydHMpO1xuXG52YXIgUmVhY3RJczE4ID0gLyojX19QVVJFX18qL19tZXJnZU5hbWVzcGFjZXMoe1xuICBfX3Byb3RvX186IG51bGwsXG4gIGRlZmF1bHQ6IGluZGV4XG59LCBbcmVhY3RJc0V4cG9ydHNdKTtcblxuY29uc3QgcmVhY3RJc01ldGhvZHMgPSBbXG5cdFwiaXNBc3luY01vZGVcIixcblx0XCJpc0NvbmN1cnJlbnRNb2RlXCIsXG5cdFwiaXNDb250ZXh0Q29uc3VtZXJcIixcblx0XCJpc0NvbnRleHRQcm92aWRlclwiLFxuXHRcImlzRWxlbWVudFwiLFxuXHRcImlzRm9yd2FyZFJlZlwiLFxuXHRcImlzRnJhZ21lbnRcIixcblx0XCJpc0xhenlcIixcblx0XCJpc01lbW9cIixcblx0XCJpc1BvcnRhbFwiLFxuXHRcImlzUHJvZmlsZXJcIixcblx0XCJpc1N0cmljdE1vZGVcIixcblx0XCJpc1N1c3BlbnNlXCIsXG5cdFwiaXNTdXNwZW5zZUxpc3RcIixcblx0XCJpc1ZhbGlkRWxlbWVudFR5cGVcIlxuXTtcbmNvbnN0IFJlYWN0SXMgPSBPYmplY3QuZnJvbUVudHJpZXMocmVhY3RJc01ldGhvZHMubWFwKChtKSA9PiBbbSwgKHYpID0+IFJlYWN0SXMxOFttXSh2KSB8fCBSZWFjdElzMTlbbV0odildKSk7XG4vLyBHaXZlbiBlbGVtZW50LnByb3BzLmNoaWxkcmVuLCBvciBzdWJ0cmVlIGR1cmluZyByZWN1cnNpdmUgdHJhdmVyc2FsLFxuLy8gcmV0dXJuIGZsYXR0ZW5lZCBhcnJheSBvZiBjaGlsZHJlbi5cbmZ1bmN0aW9uIGdldENoaWxkcmVuKGFyZywgY2hpbGRyZW4gPSBbXSkge1xuXHRpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGFyZykge1xuXHRcdFx0Z2V0Q2hpbGRyZW4oaXRlbSwgY2hpbGRyZW4pO1xuXHRcdH1cblx0fSBlbHNlIGlmIChhcmcgIT0gbnVsbCAmJiBhcmcgIT09IGZhbHNlICYmIGFyZyAhPT0gXCJcIikge1xuXHRcdGNoaWxkcmVuLnB1c2goYXJnKTtcblx0fVxuXHRyZXR1cm4gY2hpbGRyZW47XG59XG5mdW5jdGlvbiBnZXRUeXBlKGVsZW1lbnQpIHtcblx0Y29uc3QgdHlwZSA9IGVsZW1lbnQudHlwZTtcblx0aWYgKHR5cGVvZiB0eXBlID09PSBcInN0cmluZ1wiKSB7XG5cdFx0cmV0dXJuIHR5cGU7XG5cdH1cblx0aWYgKHR5cGVvZiB0eXBlID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRyZXR1cm4gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLm5hbWUgfHwgXCJVbmtub3duXCI7XG5cdH1cblx0aWYgKFJlYWN0SXMuaXNGcmFnbWVudChlbGVtZW50KSkge1xuXHRcdHJldHVybiBcIlJlYWN0LkZyYWdtZW50XCI7XG5cdH1cblx0aWYgKFJlYWN0SXMuaXNTdXNwZW5zZShlbGVtZW50KSkge1xuXHRcdHJldHVybiBcIlJlYWN0LlN1c3BlbnNlXCI7XG5cdH1cblx0aWYgKHR5cGVvZiB0eXBlID09PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IG51bGwpIHtcblx0XHRpZiAoUmVhY3RJcy5pc0NvbnRleHRQcm92aWRlcihlbGVtZW50KSkge1xuXHRcdFx0cmV0dXJuIFwiQ29udGV4dC5Qcm92aWRlclwiO1xuXHRcdH1cblx0XHRpZiAoUmVhY3RJcy5pc0NvbnRleHRDb25zdW1lcihlbGVtZW50KSkge1xuXHRcdFx0cmV0dXJuIFwiQ29udGV4dC5Db25zdW1lclwiO1xuXHRcdH1cblx0XHRpZiAoUmVhY3RJcy5pc0ZvcndhcmRSZWYoZWxlbWVudCkpIHtcblx0XHRcdGlmICh0eXBlLmRpc3BsYXlOYW1lKSB7XG5cdFx0XHRcdHJldHVybiB0eXBlLmRpc3BsYXlOYW1lO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZnVuY3Rpb25OYW1lID0gdHlwZS5yZW5kZXIuZGlzcGxheU5hbWUgfHwgdHlwZS5yZW5kZXIubmFtZSB8fCBcIlwiO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uTmFtZSA9PT0gXCJcIiA/IFwiRm9yd2FyZFJlZlwiIDogYEZvcndhcmRSZWYoJHtmdW5jdGlvbk5hbWV9KWA7XG5cdFx0fVxuXHRcdGlmIChSZWFjdElzLmlzTWVtbyhlbGVtZW50KSkge1xuXHRcdFx0Y29uc3QgZnVuY3Rpb25OYW1lID0gdHlwZS5kaXNwbGF5TmFtZSB8fCB0eXBlLnR5cGUuZGlzcGxheU5hbWUgfHwgdHlwZS50eXBlLm5hbWUgfHwgXCJcIjtcblx0XHRcdHJldHVybiBmdW5jdGlvbk5hbWUgPT09IFwiXCIgPyBcIk1lbW9cIiA6IGBNZW1vKCR7ZnVuY3Rpb25OYW1lfSlgO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gXCJVTkRFRklORURcIjtcbn1cbmZ1bmN0aW9uIGdldFByb3BLZXlzJDEoZWxlbWVudCkge1xuXHRjb25zdCB7IHByb3BzIH0gPSBlbGVtZW50O1xuXHRyZXR1cm4gT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoa2V5KSA9PiBrZXkgIT09IFwiY2hpbGRyZW5cIiAmJiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQpLnNvcnQoKTtcbn1cbmNvbnN0IHNlcmlhbGl6ZSQxID0gKGVsZW1lbnQsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA9PiArK2RlcHRoID4gY29uZmlnLm1heERlcHRoID8gcHJpbnRFbGVtZW50QXNMZWFmKGdldFR5cGUoZWxlbWVudCksIGNvbmZpZykgOiBwcmludEVsZW1lbnQoZ2V0VHlwZShlbGVtZW50KSwgcHJpbnRQcm9wcyhnZXRQcm9wS2V5cyQxKGVsZW1lbnQpLCBlbGVtZW50LnByb3BzLCBjb25maWcsIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCwgZGVwdGgsIHJlZnMsIHByaW50ZXIpLCBwcmludENoaWxkcmVuKGdldENoaWxkcmVuKGVsZW1lbnQucHJvcHMuY2hpbGRyZW4pLCBjb25maWcsIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCwgZGVwdGgsIHJlZnMsIHByaW50ZXIpLCBjb25maWcsIGluZGVudGF0aW9uKTtcbmNvbnN0IHRlc3QkMSA9ICh2YWwpID0+IHZhbCAhPSBudWxsICYmIFJlYWN0SXMuaXNFbGVtZW50KHZhbCk7XG5jb25zdCBwbHVnaW4kMSA9IHtcblx0c2VyaWFsaXplOiBzZXJpYWxpemUkMSxcblx0dGVzdDogdGVzdCQxXG59O1xuXG5jb25zdCB0ZXN0U3ltYm9sID0gdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIFN5bWJvbC5mb3IgPyBTeW1ib2wuZm9yKFwicmVhY3QudGVzdC5qc29uXCIpIDogMjQ1ODMwNDg3O1xuZnVuY3Rpb24gZ2V0UHJvcEtleXMob2JqZWN0KSB7XG5cdGNvbnN0IHsgcHJvcHMgfSA9IG9iamVjdDtcblx0cmV0dXJuIHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLmZpbHRlcigoa2V5KSA9PiBwcm9wc1trZXldICE9PSB1bmRlZmluZWQpLnNvcnQoKSA6IFtdO1xufVxuY29uc3Qgc2VyaWFsaXplID0gKG9iamVjdCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpID0+ICsrZGVwdGggPiBjb25maWcubWF4RGVwdGggPyBwcmludEVsZW1lbnRBc0xlYWYob2JqZWN0LnR5cGUsIGNvbmZpZykgOiBwcmludEVsZW1lbnQob2JqZWN0LnR5cGUsIG9iamVjdC5wcm9wcyA/IHByaW50UHJvcHMoZ2V0UHJvcEtleXMob2JqZWN0KSwgb2JqZWN0LnByb3BzLCBjb25maWcsIGluZGVudGF0aW9uICsgY29uZmlnLmluZGVudCwgZGVwdGgsIHJlZnMsIHByaW50ZXIpIDogXCJcIiwgb2JqZWN0LmNoaWxkcmVuID8gcHJpbnRDaGlsZHJlbihvYmplY3QuY2hpbGRyZW4sIGNvbmZpZywgaW5kZW50YXRpb24gKyBjb25maWcuaW5kZW50LCBkZXB0aCwgcmVmcywgcHJpbnRlcikgOiBcIlwiLCBjb25maWcsIGluZGVudGF0aW9uKTtcbmNvbnN0IHRlc3QgPSAodmFsKSA9PiB2YWwgJiYgdmFsLiQkdHlwZW9mID09PSB0ZXN0U3ltYm9sO1xuY29uc3QgcGx1Z2luID0ge1xuXHRzZXJpYWxpemUsXG5cdHRlc3Rcbn07XG5cbmNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbmNvbnN0IHRvSVNPU3RyaW5nID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc7XG5jb25zdCBlcnJvclRvU3RyaW5nID0gRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nO1xuY29uc3QgcmVnRXhwVG9TdHJpbmcgPSBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nO1xuLyoqXG4qIEV4cGxpY2l0bHkgY29tcGFyaW5nIHR5cGVvZiBjb25zdHJ1Y3RvciB0byBmdW5jdGlvbiBhdm9pZHMgdW5kZWZpbmVkIGFzIG5hbWVcbiogd2hlbiBtb2NrIGlkZW50aXR5LW9iai1wcm94eSByZXR1cm5zIHRoZSBrZXkgYXMgdGhlIHZhbHVlIGZvciBhbnkga2V5LlxuKi9cbmZ1bmN0aW9uIGdldENvbnN0cnVjdG9yTmFtZSh2YWwpIHtcblx0cmV0dXJuIHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiB2YWwuY29uc3RydWN0b3IubmFtZSB8fCBcIk9iamVjdFwiO1xufVxuLyoqIElzIHZhbCBpcyBlcXVhbCB0byBnbG9iYWwgd2luZG93IG9iamVjdD8gV29ya3MgZXZlbiBpZiBpdCBkb2VzIG5vdCBleGlzdCA6KSAqL1xuZnVuY3Rpb24gaXNXaW5kb3codmFsKSB7XG5cdHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCA9PT0gd2luZG93O1xufVxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlZ2V4cC9uby1zdXBlci1saW5lYXItYmFja3RyYWNraW5nXG5jb25zdCBTWU1CT0xfUkVHRVhQID0gL15TeW1ib2xcXCgoLiopXFwpKC4qKSQvO1xuY29uc3QgTkVXTElORV9SRUdFWFAgPSAvXFxuL2c7XG5jbGFzcyBQcmV0dHlGb3JtYXRQbHVnaW5FcnJvciBleHRlbmRzIEVycm9yIHtcblx0Y29uc3RydWN0b3IobWVzc2FnZSwgc3RhY2spIHtcblx0XHRzdXBlcihtZXNzYWdlKTtcblx0XHR0aGlzLnN0YWNrID0gc3RhY2s7XG5cdFx0dGhpcy5uYW1lID0gdGhpcy5jb25zdHJ1Y3Rvci5uYW1lO1xuXHR9XG59XG5mdW5jdGlvbiBpc1RvU3RyaW5nZWRBcnJheVR5cGUodG9TdHJpbmdlZCkge1xuXHRyZXR1cm4gdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBBcnJheUJ1ZmZlcl1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgRGF0YVZpZXddXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEZsb2F0MzJBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgRmxvYXQ2NEFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBJbnQ4QXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEludDE2QXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEludDMyQXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFVpbnQ4QXJyYXldXCIgfHwgdG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBVaW50MTZBcnJheV1cIiB8fCB0b1N0cmluZ2VkID09PSBcIltvYmplY3QgVWludDMyQXJyYXldXCI7XG59XG5mdW5jdGlvbiBwcmludE51bWJlcih2YWwpIHtcblx0cmV0dXJuIE9iamVjdC5pcyh2YWwsIC0wKSA/IFwiLTBcIiA6IFN0cmluZyh2YWwpO1xufVxuZnVuY3Rpb24gcHJpbnRCaWdJbnQodmFsKSB7XG5cdHJldHVybiBTdHJpbmcoYCR7dmFsfW5gKTtcbn1cbmZ1bmN0aW9uIHByaW50RnVuY3Rpb24odmFsLCBwcmludEZ1bmN0aW9uTmFtZSkge1xuXHRpZiAoIXByaW50RnVuY3Rpb25OYW1lKSB7XG5cdFx0cmV0dXJuIFwiW0Z1bmN0aW9uXVwiO1xuXHR9XG5cdHJldHVybiBgW0Z1bmN0aW9uICR7dmFsLm5hbWUgfHwgXCJhbm9ueW1vdXNcIn1dYDtcbn1cbmZ1bmN0aW9uIHByaW50U3ltYm9sKHZhbCkge1xuXHRyZXR1cm4gU3RyaW5nKHZhbCkucmVwbGFjZShTWU1CT0xfUkVHRVhQLCBcIlN5bWJvbCgkMSlcIik7XG59XG5mdW5jdGlvbiBwcmludEVycm9yKHZhbCkge1xuXHRyZXR1cm4gYFske2Vycm9yVG9TdHJpbmcuY2FsbCh2YWwpfV1gO1xufVxuLyoqXG4qIFRoZSBmaXJzdCBwb3J0IG9mIGNhbGwgZm9yIHByaW50aW5nIGFuIG9iamVjdCwgaGFuZGxlcyBtb3N0IG9mIHRoZVxuKiBkYXRhLXR5cGVzIGluIEpTLlxuKi9cbmZ1bmN0aW9uIHByaW50QmFzaWNWYWx1ZSh2YWwsIHByaW50RnVuY3Rpb25OYW1lLCBlc2NhcGVSZWdleCwgZXNjYXBlU3RyaW5nKSB7XG5cdGlmICh2YWwgPT09IHRydWUgfHwgdmFsID09PSBmYWxzZSkge1xuXHRcdHJldHVybiBgJHt2YWx9YDtcblx0fVxuXHRpZiAodmFsID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gXCJ1bmRlZmluZWRcIjtcblx0fVxuXHRpZiAodmFsID09PSBudWxsKSB7XG5cdFx0cmV0dXJuIFwibnVsbFwiO1xuXHR9XG5cdGNvbnN0IHR5cGVPZiA9IHR5cGVvZiB2YWw7XG5cdGlmICh0eXBlT2YgPT09IFwibnVtYmVyXCIpIHtcblx0XHRyZXR1cm4gcHJpbnROdW1iZXIodmFsKTtcblx0fVxuXHRpZiAodHlwZU9mID09PSBcImJpZ2ludFwiKSB7XG5cdFx0cmV0dXJuIHByaW50QmlnSW50KHZhbCk7XG5cdH1cblx0aWYgKHR5cGVPZiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdGlmIChlc2NhcGVTdHJpbmcpIHtcblx0XHRcdHJldHVybiBgXCIke3ZhbC5yZXBsYWNlQWxsKC9cInxcXFxcL2csIFwiXFxcXCQmXCIpfVwiYDtcblx0XHR9XG5cdFx0cmV0dXJuIGBcIiR7dmFsfVwiYDtcblx0fVxuXHRpZiAodHlwZU9mID09PSBcImZ1bmN0aW9uXCIpIHtcblx0XHRyZXR1cm4gcHJpbnRGdW5jdGlvbih2YWwsIHByaW50RnVuY3Rpb25OYW1lKTtcblx0fVxuXHRpZiAodHlwZU9mID09PSBcInN5bWJvbFwiKSB7XG5cdFx0cmV0dXJuIHByaW50U3ltYm9sKHZhbCk7XG5cdH1cblx0Y29uc3QgdG9TdHJpbmdlZCA9IHRvU3RyaW5nLmNhbGwodmFsKTtcblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBXZWFrTWFwXVwiKSB7XG5cdFx0cmV0dXJuIFwiV2Vha01hcCB7fVwiO1xuXHR9XG5cdGlmICh0b1N0cmluZ2VkID09PSBcIltvYmplY3QgV2Vha1NldF1cIikge1xuXHRcdHJldHVybiBcIldlYWtTZXQge31cIjtcblx0fVxuXHRpZiAodG9TdHJpbmdlZCA9PT0gXCJbb2JqZWN0IEZ1bmN0aW9uXVwiIHx8IHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl1cIikge1xuXHRcdHJldHVybiBwcmludEZ1bmN0aW9uKHZhbCwgcHJpbnRGdW5jdGlvbk5hbWUpO1xuXHR9XG5cdGlmICh0b1N0cmluZ2VkID09PSBcIltvYmplY3QgU3ltYm9sXVwiKSB7XG5cdFx0cmV0dXJuIHByaW50U3ltYm9sKHZhbCk7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBEYXRlXVwiKSB7XG5cdFx0cmV0dXJuIE51bWJlci5pc05hTigrdmFsKSA/IFwiRGF0ZSB7IE5hTiB9XCIgOiB0b0lTT1N0cmluZy5jYWxsKHZhbCk7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBFcnJvcl1cIikge1xuXHRcdHJldHVybiBwcmludEVycm9yKHZhbCk7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBSZWdFeHBdXCIpIHtcblx0XHRpZiAoZXNjYXBlUmVnZXgpIHtcblx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9iZW5qYW1pbmdyL1JlZ0V4cC5lc2NhcGUvYmxvYi9tYWluL3BvbHlmaWxsLmpzXG5cdFx0XHRyZXR1cm4gcmVnRXhwVG9TdHJpbmcuY2FsbCh2YWwpLnJlcGxhY2VBbGwoL1skKCkqKy4/W1xcXFxcXF1ee3x9XS9nLCBcIlxcXFwkJlwiKTtcblx0XHR9XG5cdFx0cmV0dXJuIHJlZ0V4cFRvU3RyaW5nLmNhbGwodmFsKTtcblx0fVxuXHRpZiAodmFsIGluc3RhbmNlb2YgRXJyb3IpIHtcblx0XHRyZXR1cm4gcHJpbnRFcnJvcih2YWwpO1xuXHR9XG5cdHJldHVybiBudWxsO1xufVxuLyoqXG4qIEhhbmRsZXMgbW9yZSBjb21wbGV4IG9iamVjdHMgKCBzdWNoIGFzIG9iamVjdHMgd2l0aCBjaXJjdWxhciByZWZlcmVuY2VzLlxuKiBtYXBzIGFuZCBzZXRzIGV0YyApXG4qL1xuZnVuY3Rpb24gcHJpbnRDb21wbGV4VmFsdWUodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgaGFzQ2FsbGVkVG9KU09OKSB7XG5cdGlmIChyZWZzLmluY2x1ZGVzKHZhbCkpIHtcblx0XHRyZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG5cdH1cblx0cmVmcyA9IFsuLi5yZWZzXTtcblx0cmVmcy5wdXNoKHZhbCk7XG5cdGNvbnN0IGhpdE1heERlcHRoID0gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aDtcblx0Y29uc3QgbWluID0gY29uZmlnLm1pbjtcblx0aWYgKGNvbmZpZy5jYWxsVG9KU09OICYmICFoaXRNYXhEZXB0aCAmJiB2YWwudG9KU09OICYmIHR5cGVvZiB2YWwudG9KU09OID09PSBcImZ1bmN0aW9uXCIgJiYgIWhhc0NhbGxlZFRvSlNPTikge1xuXHRcdHJldHVybiBwcmludGVyKHZhbC50b0pTT04oKSwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHRydWUpO1xuXHR9XG5cdGNvbnN0IHRvU3RyaW5nZWQgPSB0b1N0cmluZy5jYWxsKHZhbCk7XG5cdGlmICh0b1N0cmluZ2VkID09PSBcIltvYmplY3QgQXJndW1lbnRzXVwiKSB7XG5cdFx0cmV0dXJuIGhpdE1heERlcHRoID8gXCJbQXJndW1lbnRzXVwiIDogYCR7bWluID8gXCJcIiA6IFwiQXJndW1lbnRzIFwifVske3ByaW50TGlzdEl0ZW1zKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIHByaW50ZXIpfV1gO1xuXHR9XG5cdGlmIChpc1RvU3RyaW5nZWRBcnJheVR5cGUodG9TdHJpbmdlZCkpIHtcblx0XHRyZXR1cm4gaGl0TWF4RGVwdGggPyBgWyR7dmFsLmNvbnN0cnVjdG9yLm5hbWV9XWAgOiBgJHttaW4gPyBcIlwiIDogIWNvbmZpZy5wcmludEJhc2ljUHJvdG90eXBlICYmIHZhbC5jb25zdHJ1Y3Rvci5uYW1lID09PSBcIkFycmF5XCIgPyBcIlwiIDogYCR7dmFsLmNvbnN0cnVjdG9yLm5hbWV9IGB9WyR7cHJpbnRMaXN0SXRlbXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9XWA7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBNYXBdXCIpIHtcblx0XHRyZXR1cm4gaGl0TWF4RGVwdGggPyBcIltNYXBdXCIgOiBgTWFwIHske3ByaW50SXRlcmF0b3JFbnRyaWVzKHZhbC5lbnRyaWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyLCBcIiA9PiBcIil9fWA7XG5cdH1cblx0aWYgKHRvU3RyaW5nZWQgPT09IFwiW29iamVjdCBTZXRdXCIpIHtcblx0XHRyZXR1cm4gaGl0TWF4RGVwdGggPyBcIltTZXRdXCIgOiBgU2V0IHske3ByaW50SXRlcmF0b3JWYWx1ZXModmFsLnZhbHVlcygpLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9fWA7XG5cdH1cblx0Ly8gQXZvaWQgZmFpbHVyZSB0byBzZXJpYWxpemUgZ2xvYmFsIHdpbmRvdyBvYmplY3QgaW4ganNkb20gdGVzdCBlbnZpcm9ubWVudC5cblx0Ly8gRm9yIGV4YW1wbGUsIG5vdCBldmVuIHJlbGV2YW50IGlmIHdpbmRvdyBpcyBwcm9wIG9mIFJlYWN0IGVsZW1lbnQuXG5cdHJldHVybiBoaXRNYXhEZXB0aCB8fCBpc1dpbmRvdyh2YWwpID8gYFske2dldENvbnN0cnVjdG9yTmFtZSh2YWwpfV1gIDogYCR7bWluID8gXCJcIiA6ICFjb25maWcucHJpbnRCYXNpY1Byb3RvdHlwZSAmJiBnZXRDb25zdHJ1Y3Rvck5hbWUodmFsKSA9PT0gXCJPYmplY3RcIiA/IFwiXCIgOiBgJHtnZXRDb25zdHJ1Y3Rvck5hbWUodmFsKX0gYH17JHtwcmludE9iamVjdFByb3BlcnRpZXModmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcil9fWA7XG59XG5jb25zdCBFcnJvclBsdWdpbiA9IHtcblx0dGVzdDogKHZhbCkgPT4gdmFsICYmIHZhbCBpbnN0YW5jZW9mIEVycm9yLFxuXHRzZXJpYWxpemUodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgcHJpbnRlcikge1xuXHRcdGlmIChyZWZzLmluY2x1ZGVzKHZhbCkpIHtcblx0XHRcdHJldHVybiBcIltDaXJjdWxhcl1cIjtcblx0XHR9XG5cdFx0cmVmcyA9IFsuLi5yZWZzLCB2YWxdO1xuXHRcdGNvbnN0IGhpdE1heERlcHRoID0gKytkZXB0aCA+IGNvbmZpZy5tYXhEZXB0aDtcblx0XHRjb25zdCB7IG1lc3NhZ2UsIGNhdXNlLCAuLi5yZXN0IH0gPSB2YWw7XG5cdFx0Y29uc3QgZW50cmllcyA9IHtcblx0XHRcdG1lc3NhZ2UsXG5cdFx0XHQuLi50eXBlb2YgY2F1c2UgIT09IFwidW5kZWZpbmVkXCIgPyB7IGNhdXNlIH0gOiB7fSxcblx0XHRcdC4uLnZhbCBpbnN0YW5jZW9mIEFnZ3JlZ2F0ZUVycm9yID8geyBlcnJvcnM6IHZhbC5lcnJvcnMgfSA6IHt9LFxuXHRcdFx0Li4ucmVzdFxuXHRcdH07XG5cdFx0Y29uc3QgbmFtZSA9IHZhbC5uYW1lICE9PSBcIkVycm9yXCIgPyB2YWwubmFtZSA6IGdldENvbnN0cnVjdG9yTmFtZSh2YWwpO1xuXHRcdHJldHVybiBoaXRNYXhEZXB0aCA/IGBbJHtuYW1lfV1gIDogYCR7bmFtZX0geyR7cHJpbnRJdGVyYXRvckVudHJpZXMoT2JqZWN0LmVudHJpZXMoZW50cmllcykudmFsdWVzKCksIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKX19YDtcblx0fVxufTtcbmZ1bmN0aW9uIGlzTmV3UGx1Z2luKHBsdWdpbikge1xuXHRyZXR1cm4gcGx1Z2luLnNlcmlhbGl6ZSAhPSBudWxsO1xufVxuZnVuY3Rpb24gcHJpbnRQbHVnaW4ocGx1Z2luLCB2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzKSB7XG5cdGxldCBwcmludGVkO1xuXHR0cnkge1xuXHRcdHByaW50ZWQgPSBpc05ld1BsdWdpbihwbHVnaW4pID8gcGx1Z2luLnNlcmlhbGl6ZSh2YWwsIGNvbmZpZywgaW5kZW50YXRpb24sIGRlcHRoLCByZWZzLCBwcmludGVyKSA6IHBsdWdpbi5wcmludCh2YWwsICh2YWxDaGlsZCkgPT4gcHJpbnRlcih2YWxDaGlsZCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpLCAoc3RyKSA9PiB7XG5cdFx0XHRjb25zdCBpbmRlbnRhdGlvbk5leHQgPSBpbmRlbnRhdGlvbiArIGNvbmZpZy5pbmRlbnQ7XG5cdFx0XHRyZXR1cm4gaW5kZW50YXRpb25OZXh0ICsgc3RyLnJlcGxhY2VBbGwoTkVXTElORV9SRUdFWFAsIGBcXG4ke2luZGVudGF0aW9uTmV4dH1gKTtcblx0XHR9LCB7XG5cdFx0XHRlZGdlU3BhY2luZzogY29uZmlnLnNwYWNpbmdPdXRlcixcblx0XHRcdG1pbjogY29uZmlnLm1pbixcblx0XHRcdHNwYWNpbmc6IGNvbmZpZy5zcGFjaW5nSW5uZXJcblx0XHR9LCBjb25maWcuY29sb3JzKTtcblx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHR0aHJvdyBuZXcgUHJldHR5Rm9ybWF0UGx1Z2luRXJyb3IoZXJyb3IubWVzc2FnZSwgZXJyb3Iuc3RhY2spO1xuXHR9XG5cdGlmICh0eXBlb2YgcHJpbnRlZCAhPT0gXCJzdHJpbmdcIikge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoYHByZXR0eS1mb3JtYXQ6IFBsdWdpbiBtdXN0IHJldHVybiB0eXBlIFwic3RyaW5nXCIgYnV0IGluc3RlYWQgcmV0dXJuZWQgXCIke3R5cGVvZiBwcmludGVkfVwiLmApO1xuXHR9XG5cdHJldHVybiBwcmludGVkO1xufVxuZnVuY3Rpb24gZmluZFBsdWdpbihwbHVnaW5zLCB2YWwpIHtcblx0Zm9yIChjb25zdCBwbHVnaW4gb2YgcGx1Z2lucykge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAocGx1Z2luLnRlc3QodmFsKSkge1xuXHRcdFx0XHRyZXR1cm4gcGx1Z2luO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgUHJldHR5Rm9ybWF0UGx1Z2luRXJyb3IoZXJyb3IubWVzc2FnZSwgZXJyb3Iuc3RhY2spO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbnVsbDtcbn1cbmZ1bmN0aW9uIHByaW50ZXIodmFsLCBjb25maWcsIGluZGVudGF0aW9uLCBkZXB0aCwgcmVmcywgaGFzQ2FsbGVkVG9KU09OKSB7XG5cdGxldCByZXN1bHQ7XG5cdGNvbnN0IHBsdWdpbiA9IGZpbmRQbHVnaW4oY29uZmlnLnBsdWdpbnMsIHZhbCk7XG5cdGlmIChwbHVnaW4gIT09IG51bGwpIHtcblx0XHRyZXN1bHQgPSBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMpO1xuXHR9IGVsc2Uge1xuXHRcdGNvbnN0IGJhc2ljUmVzdWx0ID0gcHJpbnRCYXNpY1ZhbHVlKHZhbCwgY29uZmlnLnByaW50RnVuY3Rpb25OYW1lLCBjb25maWcuZXNjYXBlUmVnZXgsIGNvbmZpZy5lc2NhcGVTdHJpbmcpO1xuXHRcdGlmIChiYXNpY1Jlc3VsdCAhPT0gbnVsbCkge1xuXHRcdFx0cmVzdWx0ID0gYmFzaWNSZXN1bHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdCA9IHByaW50Q29tcGxleFZhbHVlKHZhbCwgY29uZmlnLCBpbmRlbnRhdGlvbiwgZGVwdGgsIHJlZnMsIGhhc0NhbGxlZFRvSlNPTik7XG5cdFx0fVxuXHR9XG5cdC8vIFBlci1kZXB0aCBvdXRwdXQgYnVkZ2V0IChpbnNwaXJlZCBieSBOb2RlJ3MgdXRpbC5pbnNwZWN0KS5cblx0Ly8gRWFjaCBkZXB0aCBsZXZlbCB0cmFja3Mgb3V0cHV0IGluZGVwZW5kZW50bHksIHNvIG5lc3RlZCByZXN1bHRzXG5cdC8vIGRvbid0IGluZmxhdGUgYSBzaW5nbGUgY291bnRlciAod2hpY2ggd291bGQgdW5kZXJjb3VudCBieSB+TnggZm9yXG5cdC8vIE4gbGV2ZWxzIG9mIG5lc3RpbmcpLiBOb2RlcyBhdCB0aGUgc2FtZSBkZXB0aCBwcm9kdWNlIGRpc2pvaW50IHNwYW5zXG5cdC8vIGluIHRoZSBvdXRwdXQgc3RyaW5nLCBzbyBlYWNoIGJ1Y2tldCBhY2N1cmF0ZWx5IHJlZmxlY3RzIG91dHB1dCBhdFxuXHQvLyB0aGF0IGxldmVsLiBUb3RhbCBvdXRwdXQgaXMgYm91bmRlZCBieSBtYXhEZXB0aCDDlyBtYXhPdXRwdXRMZW5ndGguXG5cdGNvbmZpZy5fb3V0cHV0TGVuZ3RoUGVyRGVwdGhbZGVwdGhdID8/PSAwO1xuXHRjb25maWcuX291dHB1dExlbmd0aFBlckRlcHRoW2RlcHRoXSArPSByZXN1bHQubGVuZ3RoO1xuXHRpZiAoY29uZmlnLl9vdXRwdXRMZW5ndGhQZXJEZXB0aFtkZXB0aF0gPiBjb25maWcubWF4T3V0cHV0TGVuZ3RoKSB7XG5cdFx0Y29uZmlnLm1heERlcHRoID0gMDtcblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufVxuY29uc3QgREVGQVVMVF9USEVNRSA9IHtcblx0Y29tbWVudDogXCJncmF5XCIsXG5cdGNvbnRlbnQ6IFwicmVzZXRcIixcblx0cHJvcDogXCJ5ZWxsb3dcIixcblx0dGFnOiBcImN5YW5cIixcblx0dmFsdWU6IFwiZ3JlZW5cIlxufTtcbmNvbnN0IERFRkFVTFRfVEhFTUVfS0VZUyA9IE9iamVjdC5rZXlzKERFRkFVTFRfVEhFTUUpO1xuY29uc3QgREVGQVVMVF9PUFRJT05TID0ge1xuXHRjYWxsVG9KU09OOiB0cnVlLFxuXHRjb21wYXJlS2V5czogdW5kZWZpbmVkLFxuXHRlc2NhcGVSZWdleDogZmFsc2UsXG5cdGVzY2FwZVN0cmluZzogdHJ1ZSxcblx0aGlnaGxpZ2h0OiBmYWxzZSxcblx0aW5kZW50OiAyLFxuXHRtYXhEZXB0aDogTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLFxuXHRtYXhPdXRwdXRMZW5ndGg6IDFlNixcblx0bWF4V2lkdGg6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSxcblx0bWluOiBmYWxzZSxcblx0cGx1Z2luczogW10sXG5cdHByaW50QmFzaWNQcm90b3R5cGU6IHRydWUsXG5cdHByaW50RnVuY3Rpb25OYW1lOiB0cnVlLFxuXHRwcmludFNoYWRvd1Jvb3Q6IHRydWUsXG5cdHRoZW1lOiBERUZBVUxUX1RIRU1FXG59O1xuZnVuY3Rpb24gdmFsaWRhdGVPcHRpb25zKG9wdGlvbnMpIHtcblx0Zm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcblx0XHRpZiAoIU9iamVjdC5oYXNPd24oREVGQVVMVF9PUFRJT05TLCBrZXkpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHByZXR0eS1mb3JtYXQ6IFVua25vd24gb3B0aW9uIFwiJHtrZXl9XCIuYCk7XG5cdFx0fVxuXHR9XG5cdGlmIChvcHRpb25zLm1pbiAmJiBvcHRpb25zLmluZGVudCAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuaW5kZW50ICE9PSAwKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKFwicHJldHR5LWZvcm1hdDogT3B0aW9ucyBcXFwibWluXFxcIiBhbmQgXFxcImluZGVudFxcXCIgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIuXCIpO1xuXHR9XG59XG5mdW5jdGlvbiBnZXRDb2xvcnNIaWdobGlnaHQoKSB7XG5cdHJldHVybiBERUZBVUxUX1RIRU1FX0tFWVMucmVkdWNlKChjb2xvcnMsIGtleSkgPT4ge1xuXHRcdGNvbnN0IHZhbHVlID0gREVGQVVMVF9USEVNRVtrZXldO1xuXHRcdGNvbnN0IGNvbG9yID0gdmFsdWUgJiYgc3R5bGVzW3ZhbHVlXTtcblx0XHRpZiAoY29sb3IgJiYgdHlwZW9mIGNvbG9yLmNsb3NlID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiBjb2xvci5vcGVuID09PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRjb2xvcnNba2V5XSA9IGNvbG9yO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYHByZXR0eS1mb3JtYXQ6IE9wdGlvbiBcInRoZW1lXCIgaGFzIGEga2V5IFwiJHtrZXl9XCIgd2hvc2UgdmFsdWUgXCIke3ZhbHVlfVwiIGlzIHVuZGVmaW5lZCBpbiBhbnNpLXN0eWxlcy5gKTtcblx0XHR9XG5cdFx0cmV0dXJuIGNvbG9ycztcblx0fSwgT2JqZWN0LmNyZWF0ZShudWxsKSk7XG59XG5mdW5jdGlvbiBnZXRDb2xvcnNFbXB0eSgpIHtcblx0cmV0dXJuIERFRkFVTFRfVEhFTUVfS0VZUy5yZWR1Y2UoKGNvbG9ycywga2V5KSA9PiB7XG5cdFx0Y29sb3JzW2tleV0gPSB7XG5cdFx0XHRjbG9zZTogXCJcIixcblx0XHRcdG9wZW46IFwiXCJcblx0XHR9O1xuXHRcdHJldHVybiBjb2xvcnM7XG5cdH0sIE9iamVjdC5jcmVhdGUobnVsbCkpO1xufVxuZnVuY3Rpb24gZ2V0UHJpbnRGdW5jdGlvbk5hbWUob3B0aW9ucykge1xuXHRyZXR1cm4gb3B0aW9ucz8ucHJpbnRGdW5jdGlvbk5hbWUgPz8gREVGQVVMVF9PUFRJT05TLnByaW50RnVuY3Rpb25OYW1lO1xufVxuZnVuY3Rpb24gZ2V0RXNjYXBlUmVnZXgob3B0aW9ucykge1xuXHRyZXR1cm4gb3B0aW9ucz8uZXNjYXBlUmVnZXggPz8gREVGQVVMVF9PUFRJT05TLmVzY2FwZVJlZ2V4O1xufVxuZnVuY3Rpb24gZ2V0RXNjYXBlU3RyaW5nKG9wdGlvbnMpIHtcblx0cmV0dXJuIG9wdGlvbnM/LmVzY2FwZVN0cmluZyA/PyBERUZBVUxUX09QVElPTlMuZXNjYXBlU3RyaW5nO1xufVxuZnVuY3Rpb24gZ2V0Q29uZmlnKG9wdGlvbnMpIHtcblx0cmV0dXJuIHtcblx0XHRjYWxsVG9KU09OOiBvcHRpb25zPy5jYWxsVG9KU09OID8/IERFRkFVTFRfT1BUSU9OUy5jYWxsVG9KU09OLFxuXHRcdGNvbG9yczogb3B0aW9ucz8uaGlnaGxpZ2h0ID8gZ2V0Q29sb3JzSGlnaGxpZ2h0KCkgOiBnZXRDb2xvcnNFbXB0eSgpLFxuXHRcdGNvbXBhcmVLZXlzOiB0eXBlb2Ygb3B0aW9ucz8uY29tcGFyZUtleXMgPT09IFwiZnVuY3Rpb25cIiB8fCBvcHRpb25zPy5jb21wYXJlS2V5cyA9PT0gbnVsbCA/IG9wdGlvbnMuY29tcGFyZUtleXMgOiBERUZBVUxUX09QVElPTlMuY29tcGFyZUtleXMsXG5cdFx0ZXNjYXBlUmVnZXg6IGdldEVzY2FwZVJlZ2V4KG9wdGlvbnMpLFxuXHRcdGVzY2FwZVN0cmluZzogZ2V0RXNjYXBlU3RyaW5nKG9wdGlvbnMpLFxuXHRcdGluZGVudDogb3B0aW9ucz8ubWluID8gXCJcIiA6IGNyZWF0ZUluZGVudChvcHRpb25zPy5pbmRlbnQgPz8gREVGQVVMVF9PUFRJT05TLmluZGVudCksXG5cdFx0bWF4RGVwdGg6IG9wdGlvbnM/Lm1heERlcHRoID8/IERFRkFVTFRfT1BUSU9OUy5tYXhEZXB0aCxcblx0XHRtYXhXaWR0aDogb3B0aW9ucz8ubWF4V2lkdGggPz8gREVGQVVMVF9PUFRJT05TLm1heFdpZHRoLFxuXHRcdG1pbjogb3B0aW9ucz8ubWluID8/IERFRkFVTFRfT1BUSU9OUy5taW4sXG5cdFx0cGx1Z2luczogb3B0aW9ucz8ucGx1Z2lucyA/PyBERUZBVUxUX09QVElPTlMucGx1Z2lucyxcblx0XHRwcmludEJhc2ljUHJvdG90eXBlOiBvcHRpb25zPy5wcmludEJhc2ljUHJvdG90eXBlID8/IHRydWUsXG5cdFx0cHJpbnRGdW5jdGlvbk5hbWU6IGdldFByaW50RnVuY3Rpb25OYW1lKG9wdGlvbnMpLFxuXHRcdHByaW50U2hhZG93Um9vdDogb3B0aW9ucz8ucHJpbnRTaGFkb3dSb290ID8/IHRydWUsXG5cdFx0c3BhY2luZ0lubmVyOiBvcHRpb25zPy5taW4gPyBcIiBcIiA6IFwiXFxuXCIsXG5cdFx0c3BhY2luZ091dGVyOiBvcHRpb25zPy5taW4gPyBcIlwiIDogXCJcXG5cIixcblx0XHRtYXhPdXRwdXRMZW5ndGg6IG9wdGlvbnM/Lm1heE91dHB1dExlbmd0aCA/PyBERUZBVUxUX09QVElPTlMubWF4T3V0cHV0TGVuZ3RoLFxuXHRcdF9vdXRwdXRMZW5ndGhQZXJEZXB0aDogW11cblx0fTtcbn1cbmZ1bmN0aW9uIGNyZWF0ZUluZGVudChpbmRlbnQpIHtcblx0cmV0dXJuIEFycmF5LmZyb20oeyBsZW5ndGg6IGluZGVudCArIDEgfSkuam9pbihcIiBcIik7XG59XG4vKipcbiogUmV0dXJucyBhIHByZXNlbnRhdGlvbiBzdHJpbmcgb2YgeW91ciBgdmFsYCBvYmplY3RcbiogQHBhcmFtIHZhbCBhbnkgcG90ZW50aWFsIEphdmFTY3JpcHQgb2JqZWN0XG4qIEBwYXJhbSBvcHRpb25zIEN1c3RvbSBzZXR0aW5nc1xuKi9cbmZ1bmN0aW9uIGZvcm1hdCh2YWwsIG9wdGlvbnMpIHtcblx0aWYgKG9wdGlvbnMpIHtcblx0XHR2YWxpZGF0ZU9wdGlvbnMob3B0aW9ucyk7XG5cdFx0aWYgKG9wdGlvbnMucGx1Z2lucykge1xuXHRcdFx0Y29uc3QgcGx1Z2luID0gZmluZFBsdWdpbihvcHRpb25zLnBsdWdpbnMsIHZhbCk7XG5cdFx0XHRpZiAocGx1Z2luICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiBwcmludFBsdWdpbihwbHVnaW4sIHZhbCwgZ2V0Q29uZmlnKG9wdGlvbnMpLCBcIlwiLCAwLCBbXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cdGNvbnN0IGJhc2ljUmVzdWx0ID0gcHJpbnRCYXNpY1ZhbHVlKHZhbCwgZ2V0UHJpbnRGdW5jdGlvbk5hbWUob3B0aW9ucyksIGdldEVzY2FwZVJlZ2V4KG9wdGlvbnMpLCBnZXRFc2NhcGVTdHJpbmcob3B0aW9ucykpO1xuXHRpZiAoYmFzaWNSZXN1bHQgIT09IG51bGwpIHtcblx0XHRyZXR1cm4gYmFzaWNSZXN1bHQ7XG5cdH1cblx0cmV0dXJuIHByaW50Q29tcGxleFZhbHVlKHZhbCwgZ2V0Q29uZmlnKG9wdGlvbnMpLCBcIlwiLCAwLCBbXSk7XG59XG5jb25zdCBwbHVnaW5zID0ge1xuXHRBc3ltbWV0cmljTWF0Y2hlcjogcGx1Z2luJDUsXG5cdERPTUNvbGxlY3Rpb246IHBsdWdpbiQ0LFxuXHRET01FbGVtZW50OiBwbHVnaW4kMyxcblx0SW1tdXRhYmxlOiBwbHVnaW4kMixcblx0UmVhY3RFbGVtZW50OiBwbHVnaW4kMSxcblx0UmVhY3RUZXN0Q29tcG9uZW50OiBwbHVnaW4sXG5cdEVycm9yOiBFcnJvclBsdWdpblxufTtcblxuZXhwb3J0IHsgREVGQVVMVF9PUFRJT05TLCBjcmVhdGVET01FbGVtZW50RmlsdGVyLCBmb3JtYXQsIHBsdWdpbnMgfTtcbiJdLCJ4X2dvb2dsZV9pZ25vcmVMaXN0IjpbMF0sIm1hcHBpbmdzIjoiOztBQUVBLFNBQVMsaUJBQWlCLEdBQUcsR0FBRztDQUM5QixFQUFFLFFB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