@cartanova/qgrid-cli 2.10.10 → 2.11.1

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 (302) 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-Be2qCZmI.css +1 -0
  204. package/bundle/web-dist/client/assets/index-C96h3feE.js +32 -0
  205. package/bundle/web-dist/client/assets/logs-DBM6U0QD.js +1 -0
  206. package/bundle/web-dist/client/assets/monit-BBjXa7vB.js +1 -0
  207. package/bundle/web-dist/client/assets/routes-Crz_PQzi.js +5 -0
  208. package/bundle/web-dist/client/assets/{services.generated-NP-ValHd.js → services.generated-B5lc3aIC.js} +5 -5
  209. package/bundle/web-dist/client/assets/settings-Cdwm3OBB.js +1 -0
  210. package/bundle/web-dist/client/assets/show-DBUhALT1.js +2 -0
  211. package/bundle/web-dist/client/assets/tokens-CVQAVJTo.js +1 -0
  212. package/bundle/web-dist/client/assets/total-cost-MnfKU8IN.js +1 -0
  213. package/bundle/web-dist/client/assets/use-oauth-login-flow-BfxYI4Oh.js +1 -0
  214. package/bundle/web-dist/client/assets/use-update-token-mutation-qKBC2sn7.js +1 -0
  215. package/bundle/web-dist/client/assets/{vendor-tanstack-DJRQAbrY.js → vendor-tanstack-DRPs09ai.js} +1 -1
  216. package/bundle/web-dist/client/index.html +5 -5
  217. package/bundle/web-dist/server/assets/clsx-D_N5PN_2.js +16 -0
  218. package/bundle/web-dist/server/assets/{lazyRouteComponent-CgBdabgd.js → lazyRouteComponent-AKiHfZWp.js} +129 -2
  219. package/bundle/web-dist/server/assets/{logs-BMyR98rU.js → logs-B7QmGJq3.js} +18 -14
  220. package/bundle/web-dist/server/assets/{monit-ZPt66W5M.js → monit-DFt7x3bh.js} +13 -12
  221. package/bundle/web-dist/server/assets/{plus-BZ9I0VgC.js → plus-DaYQRpBt.js} +1 -1
  222. package/bundle/web-dist/server/assets/{react-dom-Ds75e4Jl.js → react-dom-Cv23mm1K.js} +2 -129
  223. package/bundle/web-dist/server/assets/{refresh-cw-CztCFis-.js → refresh-cw-BpXNsAy-.js} +1 -1
  224. package/bundle/web-dist/server/assets/{request-model-DjGldb-h.js → request-model-eHE6YbaF.js} +1 -1
  225. package/bundle/web-dist/server/assets/{routes-Ct-k7nBA.js → routes-_Y-PJfgO.js} +110 -39
  226. package/bundle/web-dist/server/assets/{services.generated-BA4AcAf5.js → services.generated-CMJ8AHbO.js} +582 -172
  227. package/bundle/web-dist/server/assets/{settings-CBUZ47Xx.js → settings-JwJKxn2e.js} +14 -14
  228. package/bundle/web-dist/server/assets/{show-LSFIzvO2.js → show-BEv6z1v_.js} +90 -60
  229. package/bundle/web-dist/server/assets/{tokens-DxrBW512.js → tokens-CNT4mI-f.js} +162 -50
  230. package/bundle/web-dist/server/assets/total-cost-fTE9Xy82.js +18 -0
  231. package/bundle/web-dist/server/assets/use-oauth-login-flow-jkAkT3X6.js +2345 -0
  232. package/bundle/web-dist/server/assets/{use-update-token-mutation-pkArIzCP.js → use-update-token-mutation-Sm6kh02m.js} +1 -1
  233. package/bundle/web-dist/server/entry-server.generated.js +1644 -21655
  234. package/dist/cli.js +9 -9
  235. package/package.json +4 -11
  236. package/postinstall.mjs +12 -0
  237. package/skills/qgrid/SKILL.md +1 -0
  238. package/skills/qgrid/references/cli-env-and-server-boot.md +4 -1
  239. package/skills/qgrid/references/decision-rationale.md +23 -0
  240. package/skills/qgrid/references/grok-runtime.md +89 -0
  241. package/skills/qgrid/references/provider-runtime-differences.md +30 -29
  242. package/skills/qgrid/references/repo-map.md +10 -0
  243. package/skills/qgrid/references/token-auth-quota-lifecycle.md +56 -3
  244. package/bundle/dist/node_modules/.pnpm/@jridgewell_sourcemap-codec@1.5.5/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.js +0 -406
  245. package/bundle/dist/node_modules/.pnpm/@vitest_expect@4.1.10/node_modules/@vitest/expect/dist/index.js +0 -1507
  246. package/bundle/dist/node_modules/.pnpm/@vitest_pretty-format@4.1.10/node_modules/@vitest/pretty-format/dist/index.js +0 -887
  247. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/chunk-artifact.js +0 -2756
  248. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/index.js +0 -8
  249. package/bundle/dist/node_modules/.pnpm/@vitest_runner@4.1.10/node_modules/@vitest/runner/dist/utils.js +0 -8
  250. package/bundle/dist/node_modules/.pnpm/@vitest_snapshot@4.1.10/node_modules/@vitest/snapshot/dist/index.js +0 -922
  251. package/bundle/dist/node_modules/.pnpm/@vitest_spy@4.1.10/node_modules/@vitest/spy/dist/index.js +0 -386
  252. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/chunk-pathe.M-eThtNZ.js +0 -121
  253. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/constants.js +0 -51
  254. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/diff.js +0 -1317
  255. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/display.js +0 -561
  256. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/error.js +0 -40
  257. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/helpers.js +0 -272
  258. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/offset.js +0 -27
  259. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/serialize.js +0 -77
  260. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/source-map.js +0 -381
  261. package/bundle/dist/node_modules/.pnpm/@vitest_utils@4.1.10/node_modules/@vitest/utils/dist/timers.js +0 -51
  262. package/bundle/dist/node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js +0 -2986
  263. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/branding.js +0 -10
  264. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/index.js +0 -109
  265. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/messages.js +0 -10
  266. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/overloads.js +0 -10
  267. package/bundle/dist/node_modules/.pnpm/expect-type@1.3.0/node_modules/expect-type/dist/utils.js +0 -10
  268. package/bundle/dist/node_modules/.pnpm/magic-string@0.30.21/node_modules/magic-string/dist/magic-string.es.js +0 -1126
  269. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/index.js +0 -21
  270. package/bundle/dist/node_modules/.pnpm/pathe@2.0.3/node_modules/pathe/dist/shared/pathe.M-eThtNZ.js +0 -432
  271. package/bundle/dist/node_modules/.pnpm/tinybench@2.9.0/node_modules/tinybench/dist/index.js +0 -517
  272. package/bundle/dist/node_modules/.pnpm/tinyrainbow@3.1.0/node_modules/tinyrainbow/dist/index.js +0 -101
  273. 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
  274. 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
  275. 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
  276. 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
  277. 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
  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/index.DdgEv5B1.js +0 -46
  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/rpc.MzXet3jl.js +0 -119
  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/test.DNmyFkvJ.js +0 -3044
  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/utils.BX5Fg8C4.js +0 -59
  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/index.js +0 -28
  283. package/bundle/dist/testing/setup-mocks.js +0 -16
  284. package/bundle/src/testing/setup-mocks.ts +0 -44
  285. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +0 -1
  286. package/bundle/web-dist/client/assets/index-DZwzUfI-.js +0 -106
  287. package/bundle/web-dist/client/assets/logs-Cog79DU5.js +0 -1
  288. package/bundle/web-dist/client/assets/monit-2auznBys.js +0 -1
  289. package/bundle/web-dist/client/assets/routes-B0lTeLK-.js +0 -5
  290. package/bundle/web-dist/client/assets/settings-D8ZxZGSJ.js +0 -1
  291. package/bundle/web-dist/client/assets/show-CFSERlnM.js +0 -2
  292. package/bundle/web-dist/client/assets/tokens-CZXUyI7O.js +0 -1
  293. package/bundle/web-dist/client/assets/use-oauth-login-flow-hboOs3wG.js +0 -1
  294. package/bundle/web-dist/client/assets/use-update-token-mutation-BQHS0byG.js +0 -1
  295. package/bundle/web-dist/server/assets/use-oauth-login-flow-Gn8flMK5.js +0 -178
  296. package/dist/cli.d.ts +0 -10
  297. /package/bundle/web-dist/client/assets/{cost-DH2jZbrw.js → cost-DB3HbU7T.js} +0 -0
  298. /package/bundle/web-dist/client/assets/{plus-B62CuqT8.js → plus-BsQdY7PS.js} +0 -0
  299. /package/bundle/web-dist/client/assets/{preload-helper-ca-nBW7U.js → preload-helper-DWTEM3RW.js} +0 -0
  300. /package/bundle/web-dist/client/assets/{refresh-cw-NNcU0Cmq.js → refresh-cw-D9IUmT23.js} +0 -0
  301. /package/bundle/web-dist/client/assets/{request-model-CojtinqK.js → request-model-Bpp_rkK8.js} +0 -0
  302. /package/bundle/web-dist/server/assets/{cost-eEHeTRT5.js → cost-BC9yzyA9.js} +0 -0
@@ -1,2986 +0,0 @@
1
- import { __exportAll } from "../../../../../_virtual/_rolldown/runtime.js";
2
- //#region ../../node_modules/.pnpm/chai@6.2.2/node_modules/chai/index.js
3
- var chai_exports = /* @__PURE__ */ __exportAll({
4
- Assertion: () => Assertion,
5
- AssertionError: () => AssertionError,
6
- Should: () => Should,
7
- assert: () => assert,
8
- config: () => config,
9
- expect: () => expect,
10
- should: () => should,
11
- use: () => use,
12
- util: () => utils_exports
13
- });
14
- var __defProp = Object.defineProperty;
15
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, {
16
- enumerable: true,
17
- configurable: true,
18
- writable: true,
19
- value
20
- }) : obj[key] = value;
21
- var __name = (target, value) => __defProp(target, "name", {
22
- value,
23
- configurable: true
24
- });
25
- var __export = (target, all) => {
26
- for (var name in all) __defProp(target, name, {
27
- get: all[name],
28
- enumerable: true
29
- });
30
- };
31
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
32
- var utils_exports = {};
33
- __export(utils_exports, {
34
- addChainableMethod: () => addChainableMethod,
35
- addLengthGuard: () => addLengthGuard,
36
- addMethod: () => addMethod,
37
- addProperty: () => addProperty,
38
- checkError: () => check_error_exports,
39
- compareByInspect: () => compareByInspect,
40
- eql: () => deep_eql_default,
41
- events: () => events,
42
- expectTypes: () => expectTypes,
43
- flag: () => flag,
44
- getActual: () => getActual,
45
- getMessage: () => getMessage2,
46
- getName: () => getName,
47
- getOperator: () => getOperator,
48
- getOwnEnumerableProperties: () => getOwnEnumerableProperties,
49
- getOwnEnumerablePropertySymbols: () => getOwnEnumerablePropertySymbols,
50
- getPathInfo: () => getPathInfo,
51
- hasProperty: () => hasProperty,
52
- inspect: () => inspect2,
53
- isNaN: () => isNaN2,
54
- isNumeric: () => isNumeric,
55
- isProxyEnabled: () => isProxyEnabled,
56
- isRegExp: () => isRegExp2,
57
- objDisplay: () => objDisplay,
58
- overwriteChainableMethod: () => overwriteChainableMethod,
59
- overwriteMethod: () => overwriteMethod,
60
- overwriteProperty: () => overwriteProperty,
61
- proxify: () => proxify,
62
- test: () => test,
63
- transferFlags: () => transferFlags,
64
- type: () => type
65
- });
66
- var check_error_exports = {};
67
- __export(check_error_exports, {
68
- compatibleConstructor: () => compatibleConstructor,
69
- compatibleInstance: () => compatibleInstance,
70
- compatibleMessage: () => compatibleMessage,
71
- getConstructorName: () => getConstructorName,
72
- getMessage: () => getMessage
73
- });
74
- function isErrorInstance(obj) {
75
- return obj instanceof Error || Object.prototype.toString.call(obj) === "[object Error]";
76
- }
77
- __name(isErrorInstance, "isErrorInstance");
78
- function isRegExp(obj) {
79
- return Object.prototype.toString.call(obj) === "[object RegExp]";
80
- }
81
- __name(isRegExp, "isRegExp");
82
- function compatibleInstance(thrown, errorLike) {
83
- return isErrorInstance(errorLike) && thrown === errorLike;
84
- }
85
- __name(compatibleInstance, "compatibleInstance");
86
- function compatibleConstructor(thrown, errorLike) {
87
- if (isErrorInstance(errorLike)) return thrown.constructor === errorLike.constructor || thrown instanceof errorLike.constructor;
88
- else if ((typeof errorLike === "object" || typeof errorLike === "function") && errorLike.prototype) return thrown.constructor === errorLike || thrown instanceof errorLike;
89
- return false;
90
- }
91
- __name(compatibleConstructor, "compatibleConstructor");
92
- function compatibleMessage(thrown, errMatcher) {
93
- const comparisonString = typeof thrown === "string" ? thrown : thrown.message;
94
- if (isRegExp(errMatcher)) return errMatcher.test(comparisonString);
95
- else if (typeof errMatcher === "string") return comparisonString.indexOf(errMatcher) !== -1;
96
- return false;
97
- }
98
- __name(compatibleMessage, "compatibleMessage");
99
- function getConstructorName(errorLike) {
100
- let constructorName = errorLike;
101
- if (isErrorInstance(errorLike)) constructorName = errorLike.constructor.name;
102
- else if (typeof errorLike === "function") {
103
- constructorName = errorLike.name;
104
- if (constructorName === "") constructorName = new errorLike().name || constructorName;
105
- }
106
- return constructorName;
107
- }
108
- __name(getConstructorName, "getConstructorName");
109
- function getMessage(errorLike) {
110
- let msg = "";
111
- if (errorLike && errorLike.message) msg = errorLike.message;
112
- else if (typeof errorLike === "string") msg = errorLike;
113
- return msg;
114
- }
115
- __name(getMessage, "getMessage");
116
- function flag(obj, key, value) {
117
- let flags = obj.__flags || (obj.__flags = /* @__PURE__ */ Object.create(null));
118
- if (arguments.length === 3) flags[key] = value;
119
- else return flags[key];
120
- }
121
- __name(flag, "flag");
122
- function test(obj, args) {
123
- let negate = flag(obj, "negate"), expr = args[0];
124
- return negate ? !expr : expr;
125
- }
126
- __name(test, "test");
127
- function type(obj) {
128
- if (typeof obj === "undefined") return "undefined";
129
- if (obj === null) return "null";
130
- const stringTag = obj[Symbol.toStringTag];
131
- if (typeof stringTag === "string") return stringTag;
132
- return Object.prototype.toString.call(obj).slice(8, -1);
133
- }
134
- __name(type, "type");
135
- var canElideFrames = "captureStackTrace" in Error;
136
- var _AssertionError = class _AssertionError extends Error {
137
- constructor(message = "Unspecified AssertionError", props, ssf) {
138
- super(message);
139
- __publicField(this, "message");
140
- this.message = message;
141
- if (canElideFrames) Error.captureStackTrace(this, ssf || _AssertionError);
142
- for (const key in props) if (!(key in this)) this[key] = props[key];
143
- }
144
- get name() {
145
- return "AssertionError";
146
- }
147
- get ok() {
148
- return false;
149
- }
150
- toJSON(stack) {
151
- return {
152
- ...this,
153
- name: this.name,
154
- message: this.message,
155
- ok: false,
156
- stack: stack !== false ? this.stack : void 0
157
- };
158
- }
159
- };
160
- __name(_AssertionError, "AssertionError");
161
- var AssertionError = _AssertionError;
162
- function expectTypes(obj, types) {
163
- let flagMsg = flag(obj, "message");
164
- let ssfi = flag(obj, "ssfi");
165
- flagMsg = flagMsg ? flagMsg + ": " : "";
166
- obj = flag(obj, "object");
167
- types = types.map(function(t) {
168
- return t.toLowerCase();
169
- });
170
- types.sort();
171
- let str = types.map(function(t, index) {
172
- let art = ~[
173
- "a",
174
- "e",
175
- "i",
176
- "o",
177
- "u"
178
- ].indexOf(t.charAt(0)) ? "an" : "a";
179
- return (types.length > 1 && index === types.length - 1 ? "or " : "") + art + " " + t;
180
- }).join(", ");
181
- let objType = type(obj).toLowerCase();
182
- if (!types.some(function(expected) {
183
- return objType === expected;
184
- })) throw new AssertionError(flagMsg + "object tested must be " + str + ", but " + objType + " given", void 0, ssfi);
185
- }
186
- __name(expectTypes, "expectTypes");
187
- function getActual(obj, args) {
188
- return args.length > 4 ? args[4] : obj._obj;
189
- }
190
- __name(getActual, "getActual");
191
- var ansiColors = {
192
- bold: ["1", "22"],
193
- dim: ["2", "22"],
194
- italic: ["3", "23"],
195
- underline: ["4", "24"],
196
- inverse: ["7", "27"],
197
- hidden: ["8", "28"],
198
- strike: ["9", "29"],
199
- black: ["30", "39"],
200
- red: ["31", "39"],
201
- green: ["32", "39"],
202
- yellow: ["33", "39"],
203
- blue: ["34", "39"],
204
- magenta: ["35", "39"],
205
- cyan: ["36", "39"],
206
- white: ["37", "39"],
207
- brightblack: ["30;1", "39"],
208
- brightred: ["31;1", "39"],
209
- brightgreen: ["32;1", "39"],
210
- brightyellow: ["33;1", "39"],
211
- brightblue: ["34;1", "39"],
212
- brightmagenta: ["35;1", "39"],
213
- brightcyan: ["36;1", "39"],
214
- brightwhite: ["37;1", "39"],
215
- grey: ["90", "39"]
216
- };
217
- var styles = {
218
- special: "cyan",
219
- number: "yellow",
220
- bigint: "yellow",
221
- boolean: "yellow",
222
- undefined: "grey",
223
- null: "bold",
224
- string: "green",
225
- symbol: "green",
226
- date: "magenta",
227
- regexp: "red"
228
- };
229
- var truncator = "…";
230
- function colorise(value, styleType) {
231
- const color = ansiColors[styles[styleType]] || ansiColors[styleType] || "";
232
- if (!color) return String(value);
233
- return `\x1B[${color[0]}m${String(value)}\x1B[${color[1]}m`;
234
- }
235
- __name(colorise, "colorise");
236
- function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [], truncate: truncate2 = Infinity, stylize = String } = {}, inspect3) {
237
- const options = {
238
- showHidden: Boolean(showHidden),
239
- depth: Number(depth),
240
- colors: Boolean(colors),
241
- customInspect: Boolean(customInspect),
242
- showProxy: Boolean(showProxy),
243
- maxArrayLength: Number(maxArrayLength),
244
- breakLength: Number(breakLength),
245
- truncate: Number(truncate2),
246
- seen,
247
- inspect: inspect3,
248
- stylize
249
- };
250
- if (options.colors) options.stylize = colorise;
251
- return options;
252
- }
253
- __name(normaliseOptions, "normaliseOptions");
254
- function isHighSurrogate(char) {
255
- return char >= "\ud800" && char <= "\udbff";
256
- }
257
- __name(isHighSurrogate, "isHighSurrogate");
258
- function truncate(string, length, tail = truncator) {
259
- string = String(string);
260
- const tailLength = tail.length;
261
- const stringLength = string.length;
262
- if (tailLength > length && stringLength > tailLength) return tail;
263
- if (stringLength > length && stringLength > tailLength) {
264
- let end = length - tailLength;
265
- if (end > 0 && isHighSurrogate(string[end - 1])) end = end - 1;
266
- return `${string.slice(0, end)}${tail}`;
267
- }
268
- return string;
269
- }
270
- __name(truncate, "truncate");
271
- function inspectList(list, options, inspectItem, separator = ", ") {
272
- inspectItem = inspectItem || options.inspect;
273
- const size = list.length;
274
- if (size === 0) return "";
275
- const originalLength = options.truncate;
276
- let output = "";
277
- let peek = "";
278
- let truncated = "";
279
- for (let i = 0; i < size; i += 1) {
280
- const last = i + 1 === list.length;
281
- const secondToLast = i + 2 === list.length;
282
- truncated = `${truncator}(${list.length - i})`;
283
- const value = list[i];
284
- options.truncate = originalLength - output.length - (last ? 0 : separator.length);
285
- const string = peek || inspectItem(value, options) + (last ? "" : separator);
286
- const nextLength = output.length + string.length;
287
- const truncatedLength = nextLength + truncated.length;
288
- if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) break;
289
- if (!last && !secondToLast && truncatedLength > originalLength) break;
290
- peek = last ? "" : inspectItem(list[i + 1], options) + (secondToLast ? "" : separator);
291
- if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) break;
292
- output += string;
293
- if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
294
- truncated = `${truncator}(${list.length - i - 1})`;
295
- break;
296
- }
297
- truncated = "";
298
- }
299
- return `${output}${truncated}`;
300
- }
301
- __name(inspectList, "inspectList");
302
- function quoteComplexKey(key) {
303
- if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) return key;
304
- return JSON.stringify(key).replace(/'/g, "\\'").replace(/\\"/g, "\"").replace(/(^"|"$)/g, "'");
305
- }
306
- __name(quoteComplexKey, "quoteComplexKey");
307
- function inspectProperty([key, value], options) {
308
- options.truncate -= 2;
309
- if (typeof key === "string") key = quoteComplexKey(key);
310
- else if (typeof key !== "number") key = `[${options.inspect(key, options)}]`;
311
- options.truncate -= key.length;
312
- value = options.inspect(value, options);
313
- return `${key}: ${value}`;
314
- }
315
- __name(inspectProperty, "inspectProperty");
316
- function inspectArray(array, options) {
317
- const nonIndexProperties = Object.keys(array).slice(array.length);
318
- if (!array.length && !nonIndexProperties.length) return "[]";
319
- options.truncate -= 4;
320
- const listContents = inspectList(array, options);
321
- options.truncate -= listContents.length;
322
- let propertyContents = "";
323
- if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
324
- return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ""} ]`;
325
- }
326
- __name(inspectArray, "inspectArray");
327
- var getArrayName = /* @__PURE__ */ __name((array) => {
328
- if (typeof Buffer === "function" && array instanceof Buffer) return "Buffer";
329
- if (array[Symbol.toStringTag]) return array[Symbol.toStringTag];
330
- return array.constructor.name;
331
- }, "getArrayName");
332
- function inspectTypedArray(array, options) {
333
- const name = getArrayName(array);
334
- options.truncate -= name.length + 4;
335
- const nonIndexProperties = Object.keys(array).slice(array.length);
336
- if (!array.length && !nonIndexProperties.length) return `${name}[]`;
337
- let output = "";
338
- for (let i = 0; i < array.length; i++) {
339
- const string = `${options.stylize(truncate(array[i], options.truncate), "number")}${i === array.length - 1 ? "" : ", "}`;
340
- options.truncate -= string.length;
341
- if (array[i] !== array.length && options.truncate <= 3) {
342
- output += `${truncator}(${array.length - array[i] + 1})`;
343
- break;
344
- }
345
- output += string;
346
- }
347
- let propertyContents = "";
348
- if (nonIndexProperties.length) propertyContents = inspectList(nonIndexProperties.map((key) => [key, array[key]]), options, inspectProperty);
349
- return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ""} ]`;
350
- }
351
- __name(inspectTypedArray, "inspectTypedArray");
352
- function inspectDate(dateObject, options) {
353
- const stringRepresentation = dateObject.toJSON();
354
- if (stringRepresentation === null) return "Invalid Date";
355
- const split = stringRepresentation.split("T");
356
- const date = split[0];
357
- return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, "date");
358
- }
359
- __name(inspectDate, "inspectDate");
360
- function inspectFunction(func, options) {
361
- const functionType = func[Symbol.toStringTag] || "Function";
362
- const name = func.name;
363
- if (!name) return options.stylize(`[${functionType}]`, "special");
364
- return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, "special");
365
- }
366
- __name(inspectFunction, "inspectFunction");
367
- function inspectMapEntry([key, value], options) {
368
- options.truncate -= 4;
369
- key = options.inspect(key, options);
370
- options.truncate -= key.length;
371
- value = options.inspect(value, options);
372
- return `${key} => ${value}`;
373
- }
374
- __name(inspectMapEntry, "inspectMapEntry");
375
- function mapToEntries(map) {
376
- const entries = [];
377
- map.forEach((value, key) => {
378
- entries.push([key, value]);
379
- });
380
- return entries;
381
- }
382
- __name(mapToEntries, "mapToEntries");
383
- function inspectMap(map, options) {
384
- if (map.size === 0) return "Map{}";
385
- options.truncate -= 7;
386
- return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
387
- }
388
- __name(inspectMap, "inspectMap");
389
- var isNaN = Number.isNaN || ((i) => i !== i);
390
- function inspectNumber(number, options) {
391
- if (isNaN(number)) return options.stylize("NaN", "number");
392
- if (number === Infinity) return options.stylize("Infinity", "number");
393
- if (number === -Infinity) return options.stylize("-Infinity", "number");
394
- if (number === 0) return options.stylize(1 / number === Infinity ? "+0" : "-0", "number");
395
- return options.stylize(truncate(String(number), options.truncate), "number");
396
- }
397
- __name(inspectNumber, "inspectNumber");
398
- function inspectBigInt(number, options) {
399
- let nums = truncate(number.toString(), options.truncate - 1);
400
- if (nums !== truncator) nums += "n";
401
- return options.stylize(nums, "bigint");
402
- }
403
- __name(inspectBigInt, "inspectBigInt");
404
- function inspectRegExp(value, options) {
405
- const flags = value.toString().split("/")[2];
406
- const sourceLength = options.truncate - (2 + flags.length);
407
- const source = value.source;
408
- return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, "regexp");
409
- }
410
- __name(inspectRegExp, "inspectRegExp");
411
- function arrayFromSet(set2) {
412
- const values = [];
413
- set2.forEach((value) => {
414
- values.push(value);
415
- });
416
- return values;
417
- }
418
- __name(arrayFromSet, "arrayFromSet");
419
- function inspectSet(set2, options) {
420
- if (set2.size === 0) return "Set{}";
421
- options.truncate -= 7;
422
- return `Set{ ${inspectList(arrayFromSet(set2), options)} }`;
423
- }
424
- __name(inspectSet, "inspectSet");
425
- var stringEscapeChars = /* @__PURE__ */ new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]", "g");
426
- var escapeCharacters = {
427
- "\b": "\\b",
428
- " ": "\\t",
429
- "\n": "\\n",
430
- "\f": "\\f",
431
- "\r": "\\r",
432
- "'": "\\'",
433
- "\\": "\\\\"
434
- };
435
- var hex = 16;
436
- var unicodeLength = 4;
437
- function escape(char) {
438
- return escapeCharacters[char] || `\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-unicodeLength)}`;
439
- }
440
- __name(escape, "escape");
441
- function inspectString(string, options) {
442
- if (stringEscapeChars.test(string)) string = string.replace(stringEscapeChars, escape);
443
- return options.stylize(`'${truncate(string, options.truncate - 2)}'`, "string");
444
- }
445
- __name(inspectString, "inspectString");
446
- function inspectSymbol(value) {
447
- if ("description" in Symbol.prototype) return value.description ? `Symbol(${value.description})` : "Symbol()";
448
- return value.toString();
449
- }
450
- __name(inspectSymbol, "inspectSymbol");
451
- var promise_default = /* @__PURE__ */ __name(() => "Promise{…}", "getPromiseValue");
452
- function inspectObject(object, options) {
453
- const properties = Object.getOwnPropertyNames(object);
454
- const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
455
- if (properties.length === 0 && symbols.length === 0) return "{}";
456
- options.truncate -= 4;
457
- options.seen = options.seen || [];
458
- if (options.seen.includes(object)) return "[Circular]";
459
- options.seen.push(object);
460
- const propertyContents = inspectList(properties.map((key) => [key, object[key]]), options, inspectProperty);
461
- const symbolContents = inspectList(symbols.map((key) => [key, object[key]]), options, inspectProperty);
462
- options.seen.pop();
463
- let sep = "";
464
- if (propertyContents && symbolContents) sep = ", ";
465
- return `{ ${propertyContents}${sep}${symbolContents} }`;
466
- }
467
- __name(inspectObject, "inspectObject");
468
- var toStringTag = typeof Symbol !== "undefined" && Symbol.toStringTag ? Symbol.toStringTag : false;
469
- function inspectClass(value, options) {
470
- let name = "";
471
- if (toStringTag && toStringTag in value) name = value[toStringTag];
472
- name = name || value.constructor.name;
473
- if (!name || name === "_class") name = "<Anonymous Class>";
474
- options.truncate -= name.length;
475
- return `${name}${inspectObject(value, options)}`;
476
- }
477
- __name(inspectClass, "inspectClass");
478
- function inspectArguments(args, options) {
479
- if (args.length === 0) return "Arguments[]";
480
- options.truncate -= 13;
481
- return `Arguments[ ${inspectList(args, options)} ]`;
482
- }
483
- __name(inspectArguments, "inspectArguments");
484
- var errorKeys = [
485
- "stack",
486
- "line",
487
- "column",
488
- "name",
489
- "message",
490
- "fileName",
491
- "lineNumber",
492
- "columnNumber",
493
- "number",
494
- "description",
495
- "cause"
496
- ];
497
- function inspectObject2(error, options) {
498
- const properties = Object.getOwnPropertyNames(error).filter((key) => errorKeys.indexOf(key) === -1);
499
- const name = error.name;
500
- options.truncate -= name.length;
501
- let message = "";
502
- if (typeof error.message === "string") message = truncate(error.message, options.truncate);
503
- else properties.unshift("message");
504
- message = message ? `: ${message}` : "";
505
- options.truncate -= message.length + 5;
506
- options.seen = options.seen || [];
507
- if (options.seen.includes(error)) return "[Circular]";
508
- options.seen.push(error);
509
- const propertyContents = inspectList(properties.map((key) => [key, error[key]]), options, inspectProperty);
510
- return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ""}`;
511
- }
512
- __name(inspectObject2, "inspectObject");
513
- function inspectAttribute([key, value], options) {
514
- options.truncate -= 3;
515
- if (!value) return `${options.stylize(String(key), "yellow")}`;
516
- return `${options.stylize(String(key), "yellow")}=${options.stylize(`"${value}"`, "string")}`;
517
- }
518
- __name(inspectAttribute, "inspectAttribute");
519
- function inspectNodeCollection(collection, options) {
520
- return inspectList(collection, options, inspectNode, "\n");
521
- }
522
- __name(inspectNodeCollection, "inspectNodeCollection");
523
- function inspectNode(node, options) {
524
- switch (node.nodeType) {
525
- case 1: return inspectHTML(node, options);
526
- case 3: return options.inspect(node.data, options);
527
- default: return options.inspect(node, options);
528
- }
529
- }
530
- __name(inspectNode, "inspectNode");
531
- function inspectHTML(element, options) {
532
- const properties = element.getAttributeNames();
533
- const name = element.tagName.toLowerCase();
534
- const head = options.stylize(`<${name}`, "special");
535
- const headClose = options.stylize(`>`, "special");
536
- const tail = options.stylize(`</${name}>`, "special");
537
- options.truncate -= name.length * 2 + 5;
538
- let propertyContents = "";
539
- if (properties.length > 0) {
540
- propertyContents += " ";
541
- propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, " ");
542
- }
543
- options.truncate -= propertyContents.length;
544
- const truncate2 = options.truncate;
545
- let children = inspectNodeCollection(element.children, options);
546
- if (children && children.length > truncate2) children = `${truncator}(${element.children.length})`;
547
- return `${head}${propertyContents}${headClose}${children}${tail}`;
548
- }
549
- __name(inspectHTML, "inspectHTML");
550
- var chaiInspect = typeof Symbol === "function" && typeof Symbol.for === "function" ? /* @__PURE__ */ Symbol.for("chai/inspect") : "@@chai/inspect";
551
- var nodeInspect = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
552
- var constructorMap = /* @__PURE__ */ new WeakMap();
553
- var stringTagMap = {};
554
- var baseTypesMap = {
555
- undefined: /* @__PURE__ */ __name((value, options) => options.stylize("undefined", "undefined"), "undefined"),
556
- null: /* @__PURE__ */ __name((value, options) => options.stylize("null", "null"), "null"),
557
- boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "boolean"),
558
- Boolean: /* @__PURE__ */ __name((value, options) => options.stylize(String(value), "boolean"), "Boolean"),
559
- number: inspectNumber,
560
- Number: inspectNumber,
561
- bigint: inspectBigInt,
562
- BigInt: inspectBigInt,
563
- string: inspectString,
564
- String: inspectString,
565
- function: inspectFunction,
566
- Function: inspectFunction,
567
- symbol: inspectSymbol,
568
- Symbol: inspectSymbol,
569
- Array: inspectArray,
570
- Date: inspectDate,
571
- Map: inspectMap,
572
- Set: inspectSet,
573
- RegExp: inspectRegExp,
574
- Promise: promise_default,
575
- WeakSet: /* @__PURE__ */ __name((value, options) => options.stylize("WeakSet{…}", "special"), "WeakSet"),
576
- WeakMap: /* @__PURE__ */ __name((value, options) => options.stylize("WeakMap{…}", "special"), "WeakMap"),
577
- Arguments: inspectArguments,
578
- Int8Array: inspectTypedArray,
579
- Uint8Array: inspectTypedArray,
580
- Uint8ClampedArray: inspectTypedArray,
581
- Int16Array: inspectTypedArray,
582
- Uint16Array: inspectTypedArray,
583
- Int32Array: inspectTypedArray,
584
- Uint32Array: inspectTypedArray,
585
- Float32Array: inspectTypedArray,
586
- Float64Array: inspectTypedArray,
587
- Generator: /* @__PURE__ */ __name(() => "", "Generator"),
588
- DataView: /* @__PURE__ */ __name(() => "", "DataView"),
589
- ArrayBuffer: /* @__PURE__ */ __name(() => "", "ArrayBuffer"),
590
- Error: inspectObject2,
591
- HTMLCollection: inspectNodeCollection,
592
- NodeList: inspectNodeCollection
593
- };
594
- var inspectCustom = /* @__PURE__ */ __name((value, options, type3, inspectFn) => {
595
- if (chaiInspect in value && typeof value[chaiInspect] === "function") return value[chaiInspect](options);
596
- if (nodeInspect in value && typeof value[nodeInspect] === "function") return value[nodeInspect](options.depth, options, inspectFn);
597
- if ("inspect" in value && typeof value.inspect === "function") return value.inspect(options.depth, options);
598
- if ("constructor" in value && constructorMap.has(value.constructor)) return constructorMap.get(value.constructor)(value, options);
599
- if (stringTagMap[type3]) return stringTagMap[type3](value, options);
600
- return "";
601
- }, "inspectCustom");
602
- var toString = Object.prototype.toString;
603
- function inspect(value, opts = {}) {
604
- const options = normaliseOptions(opts, inspect);
605
- const { customInspect } = options;
606
- let type3 = value === null ? "null" : typeof value;
607
- if (type3 === "object") type3 = toString.call(value).slice(8, -1);
608
- if (type3 in baseTypesMap) return baseTypesMap[type3](value, options);
609
- if (customInspect && value) {
610
- const output = inspectCustom(value, options, type3, inspect);
611
- if (output) {
612
- if (typeof output === "string") return output;
613
- return inspect(output, options);
614
- }
615
- }
616
- const proto = value ? Object.getPrototypeOf(value) : false;
617
- if (proto === Object.prototype || proto === null) return inspectObject(value, options);
618
- if (value && typeof HTMLElement === "function" && value instanceof HTMLElement) return inspectHTML(value, options);
619
- if ("constructor" in value) {
620
- if (value.constructor !== Object) return inspectClass(value, options);
621
- return inspectObject(value, options);
622
- }
623
- if (value === Object(value)) return inspectObject(value, options);
624
- return options.stylize(String(value), type3);
625
- }
626
- __name(inspect, "inspect");
627
- var config = {
628
- /**
629
- * ### config.includeStack
630
- *
631
- * User configurable property, influences whether stack trace
632
- * is included in Assertion error message. Default of false
633
- * suppresses stack trace in the error message.
634
- *
635
- * chai.config.includeStack = true; // enable stack on error
636
- *
637
- * @param {boolean}
638
- * @public
639
- */
640
- includeStack: false,
641
- /**
642
- * ### config.showDiff
643
- *
644
- * User configurable property, influences whether or not
645
- * the `showDiff` flag should be included in the thrown
646
- * AssertionErrors. `false` will always be `false`; `true`
647
- * will be true when the assertion has requested a diff
648
- * be shown.
649
- *
650
- * @param {boolean}
651
- * @public
652
- */
653
- showDiff: true,
654
- /**
655
- * ### config.truncateThreshold
656
- *
657
- * User configurable property, sets length threshold for actual and
658
- * expected values in assertion errors. If this threshold is exceeded, for
659
- * example for large data structures, the value is replaced with something
660
- * like `[ Array(3) ]` or `{ Object (prop1, prop2) }`.
661
- *
662
- * Set it to zero if you want to disable truncating altogether.
663
- *
664
- * This is especially userful when doing assertions on arrays: having this
665
- * set to a reasonable large value makes the failure messages readily
666
- * inspectable.
667
- *
668
- * chai.config.truncateThreshold = 0; // disable truncating
669
- *
670
- * @param {number}
671
- * @public
672
- */
673
- truncateThreshold: 40,
674
- /**
675
- * ### config.useProxy
676
- *
677
- * User configurable property, defines if chai will use a Proxy to throw
678
- * an error when a non-existent property is read, which protects users
679
- * from typos when using property-based assertions.
680
- *
681
- * Set it to false if you want to disable this feature.
682
- *
683
- * chai.config.useProxy = false; // disable use of Proxy
684
- *
685
- * This feature is automatically disabled regardless of this config value
686
- * in environments that don't support proxies.
687
- *
688
- * @param {boolean}
689
- * @public
690
- */
691
- useProxy: true,
692
- /**
693
- * ### config.proxyExcludedKeys
694
- *
695
- * User configurable property, defines which properties should be ignored
696
- * instead of throwing an error if they do not exist on the assertion.
697
- * This is only applied if the environment Chai is running in supports proxies and
698
- * if the `useProxy` configuration setting is enabled.
699
- * By default, `then` and `inspect` will not throw an error if they do not exist on the
700
- * assertion object because the `.inspect` property is read by `util.inspect` (for example, when
701
- * using `console.log` on the assertion object) and `.then` is necessary for promise type-checking.
702
- *
703
- * // By default these keys will not throw an error if they do not exist on the assertion object
704
- * chai.config.proxyExcludedKeys = ['then', 'inspect'];
705
- *
706
- * @param {Array}
707
- * @public
708
- */
709
- proxyExcludedKeys: [
710
- "then",
711
- "catch",
712
- "inspect",
713
- "toJSON"
714
- ],
715
- /**
716
- * ### config.deepEqual
717
- *
718
- * User configurable property, defines which a custom function to use for deepEqual
719
- * comparisons.
720
- * By default, the function used is the one from the `deep-eql` package without custom comparator.
721
- *
722
- * // use a custom comparator
723
- * chai.config.deepEqual = (expected, actual) => {
724
- * return chai.util.eql(expected, actual, {
725
- * comparator: (expected, actual) => {
726
- * // for non number comparison, use the default behavior
727
- * if(typeof expected !== 'number') return null;
728
- * // allow a difference of 10 between compared numbers
729
- * return typeof actual === 'number' && Math.abs(actual - expected) < 10
730
- * }
731
- * })
732
- * };
733
- *
734
- * @param {Function}
735
- * @public
736
- */
737
- deepEqual: null
738
- };
739
- function inspect2(obj, showHidden, depth, colors) {
740
- return inspect(obj, {
741
- colors,
742
- depth: typeof depth === "undefined" ? 2 : depth,
743
- showHidden,
744
- truncate: config.truncateThreshold ? config.truncateThreshold : Infinity
745
- });
746
- }
747
- __name(inspect2, "inspect");
748
- function objDisplay(obj) {
749
- let str = inspect2(obj), type3 = Object.prototype.toString.call(obj);
750
- if (config.truncateThreshold && str.length >= config.truncateThreshold) if (type3 === "[object Function]") return !obj.name || obj.name === "" ? "[Function]" : "[Function: " + obj.name + "]";
751
- else if (type3 === "[object Array]") return "[ Array(" + obj.length + ") ]";
752
- else if (type3 === "[object Object]") {
753
- let keys = Object.keys(obj);
754
- return "{ Object (" + (keys.length > 2 ? keys.splice(0, 2).join(", ") + ", ..." : keys.join(", ")) + ") }";
755
- } else return str;
756
- else return str;
757
- }
758
- __name(objDisplay, "objDisplay");
759
- function getMessage2(obj, args) {
760
- let negate = flag(obj, "negate");
761
- let val = flag(obj, "object");
762
- let expected = args[3];
763
- let actual = getActual(obj, args);
764
- let msg = negate ? args[2] : args[1];
765
- let flagMsg = flag(obj, "message");
766
- if (typeof msg === "function") msg = msg();
767
- msg = msg || "";
768
- msg = msg.replace(/#\{this\}/g, function() {
769
- return objDisplay(val);
770
- }).replace(/#\{act\}/g, function() {
771
- return objDisplay(actual);
772
- }).replace(/#\{exp\}/g, function() {
773
- return objDisplay(expected);
774
- });
775
- return flagMsg ? flagMsg + ": " + msg : msg;
776
- }
777
- __name(getMessage2, "getMessage");
778
- function transferFlags(assertion, object, includeAll) {
779
- let flags = assertion.__flags || (assertion.__flags = /* @__PURE__ */ Object.create(null));
780
- if (!object.__flags) object.__flags = /* @__PURE__ */ Object.create(null);
781
- includeAll = arguments.length === 3 ? includeAll : true;
782
- for (let flag3 in flags) if (includeAll || flag3 !== "object" && flag3 !== "ssfi" && flag3 !== "lockSsfi" && flag3 != "message") object.__flags[flag3] = flags[flag3];
783
- }
784
- __name(transferFlags, "transferFlags");
785
- function type2(obj) {
786
- if (typeof obj === "undefined") return "undefined";
787
- if (obj === null) return "null";
788
- const stringTag = obj[Symbol.toStringTag];
789
- if (typeof stringTag === "string") return stringTag;
790
- return Object.prototype.toString.call(obj).slice(8, -1);
791
- }
792
- __name(type2, "type");
793
- function FakeMap() {
794
- this._key = "chai/deep-eql__" + Math.random() + Date.now();
795
- }
796
- __name(FakeMap, "FakeMap");
797
- FakeMap.prototype = {
798
- get: /* @__PURE__ */ __name(function get(key) {
799
- return key[this._key];
800
- }, "get"),
801
- set: /* @__PURE__ */ __name(function set(key, value) {
802
- if (Object.isExtensible(key)) Object.defineProperty(key, this._key, {
803
- value,
804
- configurable: true
805
- });
806
- }, "set")
807
- };
808
- var MemoizeMap = typeof WeakMap === "function" ? WeakMap : FakeMap;
809
- function memoizeCompare(leftHandOperand, rightHandOperand, memoizeMap) {
810
- if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return null;
811
- var leftHandMap = memoizeMap.get(leftHandOperand);
812
- if (leftHandMap) {
813
- var result = leftHandMap.get(rightHandOperand);
814
- if (typeof result === "boolean") return result;
815
- }
816
- return null;
817
- }
818
- __name(memoizeCompare, "memoizeCompare");
819
- function memoizeSet(leftHandOperand, rightHandOperand, memoizeMap, result) {
820
- if (!memoizeMap || isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return;
821
- var leftHandMap = memoizeMap.get(leftHandOperand);
822
- if (leftHandMap) leftHandMap.set(rightHandOperand, result);
823
- else {
824
- leftHandMap = new MemoizeMap();
825
- leftHandMap.set(rightHandOperand, result);
826
- memoizeMap.set(leftHandOperand, leftHandMap);
827
- }
828
- }
829
- __name(memoizeSet, "memoizeSet");
830
- var deep_eql_default = deepEqual;
831
- function deepEqual(leftHandOperand, rightHandOperand, options) {
832
- if (options && options.comparator) return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
833
- var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
834
- if (simpleResult !== null) return simpleResult;
835
- return extensiveDeepEqual(leftHandOperand, rightHandOperand, options);
836
- }
837
- __name(deepEqual, "deepEqual");
838
- function simpleEqual(leftHandOperand, rightHandOperand) {
839
- if (leftHandOperand === rightHandOperand) return leftHandOperand !== 0 || 1 / leftHandOperand === 1 / rightHandOperand;
840
- if (leftHandOperand !== leftHandOperand && rightHandOperand !== rightHandOperand) return true;
841
- if (isPrimitive(leftHandOperand) || isPrimitive(rightHandOperand)) return false;
842
- return null;
843
- }
844
- __name(simpleEqual, "simpleEqual");
845
- function extensiveDeepEqual(leftHandOperand, rightHandOperand, options) {
846
- options = options || {};
847
- options.memoize = options.memoize === false ? false : options.memoize || new MemoizeMap();
848
- var comparator = options && options.comparator;
849
- var memoizeResultLeft = memoizeCompare(leftHandOperand, rightHandOperand, options.memoize);
850
- if (memoizeResultLeft !== null) return memoizeResultLeft;
851
- var memoizeResultRight = memoizeCompare(rightHandOperand, leftHandOperand, options.memoize);
852
- if (memoizeResultRight !== null) return memoizeResultRight;
853
- if (comparator) {
854
- var comparatorResult = comparator(leftHandOperand, rightHandOperand);
855
- if (comparatorResult === false || comparatorResult === true) {
856
- memoizeSet(leftHandOperand, rightHandOperand, options.memoize, comparatorResult);
857
- return comparatorResult;
858
- }
859
- var simpleResult = simpleEqual(leftHandOperand, rightHandOperand);
860
- if (simpleResult !== null) return simpleResult;
861
- }
862
- var leftHandType = type2(leftHandOperand);
863
- if (leftHandType !== type2(rightHandOperand)) {
864
- memoizeSet(leftHandOperand, rightHandOperand, options.memoize, false);
865
- return false;
866
- }
867
- memoizeSet(leftHandOperand, rightHandOperand, options.memoize, true);
868
- var result = extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options);
869
- memoizeSet(leftHandOperand, rightHandOperand, options.memoize, result);
870
- return result;
871
- }
872
- __name(extensiveDeepEqual, "extensiveDeepEqual");
873
- function extensiveDeepEqualByType(leftHandOperand, rightHandOperand, leftHandType, options) {
874
- switch (leftHandType) {
875
- case "String":
876
- case "Number":
877
- case "Boolean":
878
- case "Date": return deepEqual(leftHandOperand.valueOf(), rightHandOperand.valueOf());
879
- case "Promise":
880
- case "Symbol":
881
- case "function":
882
- case "WeakMap":
883
- case "WeakSet": return leftHandOperand === rightHandOperand;
884
- case "Error": return keysEqual(leftHandOperand, rightHandOperand, [
885
- "name",
886
- "message",
887
- "code"
888
- ], options);
889
- case "Arguments":
890
- case "Int8Array":
891
- case "Uint8Array":
892
- case "Uint8ClampedArray":
893
- case "Int16Array":
894
- case "Uint16Array":
895
- case "Int32Array":
896
- case "Uint32Array":
897
- case "Float32Array":
898
- case "Float64Array":
899
- case "Array": return iterableEqual(leftHandOperand, rightHandOperand, options);
900
- case "RegExp": return regexpEqual(leftHandOperand, rightHandOperand);
901
- case "Generator": return generatorEqual(leftHandOperand, rightHandOperand, options);
902
- case "DataView": return iterableEqual(new Uint8Array(leftHandOperand.buffer), new Uint8Array(rightHandOperand.buffer), options);
903
- case "ArrayBuffer": return iterableEqual(new Uint8Array(leftHandOperand), new Uint8Array(rightHandOperand), options);
904
- case "Set": return entriesEqual(leftHandOperand, rightHandOperand, options);
905
- case "Map": return entriesEqual(leftHandOperand, rightHandOperand, options);
906
- case "Temporal.PlainDate":
907
- case "Temporal.PlainTime":
908
- case "Temporal.PlainDateTime":
909
- case "Temporal.Instant":
910
- case "Temporal.ZonedDateTime":
911
- case "Temporal.PlainYearMonth":
912
- case "Temporal.PlainMonthDay": return leftHandOperand.equals(rightHandOperand);
913
- case "Temporal.Duration": return leftHandOperand.total("nanoseconds") === rightHandOperand.total("nanoseconds");
914
- case "Temporal.TimeZone":
915
- case "Temporal.Calendar": return leftHandOperand.toString() === rightHandOperand.toString();
916
- default: return objectEqual(leftHandOperand, rightHandOperand, options);
917
- }
918
- }
919
- __name(extensiveDeepEqualByType, "extensiveDeepEqualByType");
920
- function regexpEqual(leftHandOperand, rightHandOperand) {
921
- return leftHandOperand.toString() === rightHandOperand.toString();
922
- }
923
- __name(regexpEqual, "regexpEqual");
924
- function entriesEqual(leftHandOperand, rightHandOperand, options) {
925
- try {
926
- if (leftHandOperand.size !== rightHandOperand.size) return false;
927
- if (leftHandOperand.size === 0) return true;
928
- } catch (sizeError) {
929
- return false;
930
- }
931
- var leftHandItems = [];
932
- var rightHandItems = [];
933
- leftHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
934
- leftHandItems.push([key, value]);
935
- }, "gatherEntries"));
936
- rightHandOperand.forEach(/* @__PURE__ */ __name(function gatherEntries(key, value) {
937
- rightHandItems.push([key, value]);
938
- }, "gatherEntries"));
939
- return iterableEqual(leftHandItems.sort(), rightHandItems.sort(), options);
940
- }
941
- __name(entriesEqual, "entriesEqual");
942
- function iterableEqual(leftHandOperand, rightHandOperand, options) {
943
- var length = leftHandOperand.length;
944
- if (length !== rightHandOperand.length) return false;
945
- if (length === 0) return true;
946
- var index = -1;
947
- while (++index < length) if (deepEqual(leftHandOperand[index], rightHandOperand[index], options) === false) return false;
948
- return true;
949
- }
950
- __name(iterableEqual, "iterableEqual");
951
- function generatorEqual(leftHandOperand, rightHandOperand, options) {
952
- return iterableEqual(getGeneratorEntries(leftHandOperand), getGeneratorEntries(rightHandOperand), options);
953
- }
954
- __name(generatorEqual, "generatorEqual");
955
- function hasIteratorFunction(target) {
956
- return typeof Symbol !== "undefined" && typeof target === "object" && typeof Symbol.iterator !== "undefined" && typeof target[Symbol.iterator] === "function";
957
- }
958
- __name(hasIteratorFunction, "hasIteratorFunction");
959
- function getIteratorEntries(target) {
960
- if (hasIteratorFunction(target)) try {
961
- return getGeneratorEntries(target[Symbol.iterator]());
962
- } catch (iteratorError) {
963
- return [];
964
- }
965
- return [];
966
- }
967
- __name(getIteratorEntries, "getIteratorEntries");
968
- function getGeneratorEntries(generator) {
969
- var generatorResult = generator.next();
970
- var accumulator = [generatorResult.value];
971
- while (generatorResult.done === false) {
972
- generatorResult = generator.next();
973
- accumulator.push(generatorResult.value);
974
- }
975
- return accumulator;
976
- }
977
- __name(getGeneratorEntries, "getGeneratorEntries");
978
- function getEnumerableKeys(target) {
979
- var keys = [];
980
- for (var key in target) keys.push(key);
981
- return keys;
982
- }
983
- __name(getEnumerableKeys, "getEnumerableKeys");
984
- function getEnumerableSymbols(target) {
985
- var keys = [];
986
- var allKeys = Object.getOwnPropertySymbols(target);
987
- for (var i = 0; i < allKeys.length; i += 1) {
988
- var key = allKeys[i];
989
- if (Object.getOwnPropertyDescriptor(target, key).enumerable) keys.push(key);
990
- }
991
- return keys;
992
- }
993
- __name(getEnumerableSymbols, "getEnumerableSymbols");
994
- function keysEqual(leftHandOperand, rightHandOperand, keys, options) {
995
- var length = keys.length;
996
- if (length === 0) return true;
997
- for (var i = 0; i < length; i += 1) if (deepEqual(leftHandOperand[keys[i]], rightHandOperand[keys[i]], options) === false) return false;
998
- return true;
999
- }
1000
- __name(keysEqual, "keysEqual");
1001
- function objectEqual(leftHandOperand, rightHandOperand, options) {
1002
- var leftHandKeys = getEnumerableKeys(leftHandOperand);
1003
- var rightHandKeys = getEnumerableKeys(rightHandOperand);
1004
- var leftHandSymbols = getEnumerableSymbols(leftHandOperand);
1005
- var rightHandSymbols = getEnumerableSymbols(rightHandOperand);
1006
- leftHandKeys = leftHandKeys.concat(leftHandSymbols);
1007
- rightHandKeys = rightHandKeys.concat(rightHandSymbols);
1008
- if (leftHandKeys.length && leftHandKeys.length === rightHandKeys.length) {
1009
- if (iterableEqual(mapSymbols(leftHandKeys).sort(), mapSymbols(rightHandKeys).sort()) === false) return false;
1010
- return keysEqual(leftHandOperand, rightHandOperand, leftHandKeys, options);
1011
- }
1012
- var leftHandEntries = getIteratorEntries(leftHandOperand);
1013
- var rightHandEntries = getIteratorEntries(rightHandOperand);
1014
- if (leftHandEntries.length && leftHandEntries.length === rightHandEntries.length) {
1015
- leftHandEntries.sort();
1016
- rightHandEntries.sort();
1017
- return iterableEqual(leftHandEntries, rightHandEntries, options);
1018
- }
1019
- if (leftHandKeys.length === 0 && leftHandEntries.length === 0 && rightHandKeys.length === 0 && rightHandEntries.length === 0) return true;
1020
- return false;
1021
- }
1022
- __name(objectEqual, "objectEqual");
1023
- function isPrimitive(value) {
1024
- return value === null || typeof value !== "object";
1025
- }
1026
- __name(isPrimitive, "isPrimitive");
1027
- function mapSymbols(arr) {
1028
- return arr.map(/* @__PURE__ */ __name(function mapSymbol(entry) {
1029
- if (typeof entry === "symbol") return entry.toString();
1030
- return entry;
1031
- }, "mapSymbol"));
1032
- }
1033
- __name(mapSymbols, "mapSymbols");
1034
- function hasProperty(obj, name) {
1035
- if (typeof obj === "undefined" || obj === null) return false;
1036
- return name in Object(obj);
1037
- }
1038
- __name(hasProperty, "hasProperty");
1039
- function parsePath(path) {
1040
- return path.replace(/([^\\])\[/g, "$1.[").match(/(\\\.|[^.]+?)+/g).map((value) => {
1041
- if (value === "constructor" || value === "__proto__" || value === "prototype") return {};
1042
- const mArr = /^\[(\d+)\]$/.exec(value);
1043
- let parsed = null;
1044
- if (mArr) parsed = { i: parseFloat(mArr[1]) };
1045
- else parsed = { p: value.replace(/\\([.[\]])/g, "$1") };
1046
- return parsed;
1047
- });
1048
- }
1049
- __name(parsePath, "parsePath");
1050
- function internalGetPathValue(obj, parsed, pathDepth) {
1051
- let temporaryValue = obj;
1052
- let res = null;
1053
- pathDepth = typeof pathDepth === "undefined" ? parsed.length : pathDepth;
1054
- for (let i = 0; i < pathDepth; i++) {
1055
- const part = parsed[i];
1056
- if (temporaryValue) {
1057
- if (typeof part.p === "undefined") temporaryValue = temporaryValue[part.i];
1058
- else temporaryValue = temporaryValue[part.p];
1059
- if (i === pathDepth - 1) res = temporaryValue;
1060
- }
1061
- }
1062
- return res;
1063
- }
1064
- __name(internalGetPathValue, "internalGetPathValue");
1065
- function getPathInfo(obj, path) {
1066
- const parsed = parsePath(path);
1067
- const last = parsed[parsed.length - 1];
1068
- const info = {
1069
- parent: parsed.length > 1 ? internalGetPathValue(obj, parsed, parsed.length - 1) : obj,
1070
- name: last.p || last.i,
1071
- value: internalGetPathValue(obj, parsed)
1072
- };
1073
- info.exists = hasProperty(info.parent, info.name);
1074
- return info;
1075
- }
1076
- __name(getPathInfo, "getPathInfo");
1077
- var _Assertion = class _Assertion {
1078
- /**
1079
- * Creates object for chaining.
1080
- * `Assertion` objects contain metadata in the form of flags. Three flags can
1081
- * be assigned during instantiation by passing arguments to this constructor:
1082
- *
1083
- * - `object`: This flag contains the target of the assertion. For example, in
1084
- * the assertion `expect(numKittens).to.equal(7);`, the `object` flag will
1085
- * contain `numKittens` so that the `equal` assertion can reference it when
1086
- * needed.
1087
- *
1088
- * - `message`: This flag contains an optional custom error message to be
1089
- * prepended to the error message that's generated by the assertion when it
1090
- * fails.
1091
- *
1092
- * - `ssfi`: This flag stands for "start stack function indicator". It
1093
- * contains a function reference that serves as the starting point for
1094
- * removing frames from the stack trace of the error that's created by the
1095
- * assertion when it fails. The goal is to provide a cleaner stack trace to
1096
- * end users by removing Chai's internal functions. Note that it only works
1097
- * in environments that support `Error.captureStackTrace`, and only when
1098
- * `Chai.config.includeStack` hasn't been set to `false`.
1099
- *
1100
- * - `lockSsfi`: This flag controls whether or not the given `ssfi` flag
1101
- * should retain its current value, even as assertions are chained off of
1102
- * this object. This is usually set to `true` when creating a new assertion
1103
- * from within another assertion. It's also temporarily set to `true` before
1104
- * an overwritten assertion gets called by the overwriting assertion.
1105
- *
1106
- * - `eql`: This flag contains the deepEqual function to be used by the assertion.
1107
- *
1108
- * @param {unknown} obj target of the assertion
1109
- * @param {string} [msg] (optional) custom error message
1110
- * @param {Function} [ssfi] (optional) starting point for removing stack frames
1111
- * @param {boolean} [lockSsfi] (optional) whether or not the ssfi flag is locked
1112
- */
1113
- constructor(obj, msg, ssfi, lockSsfi) {
1114
- /** @type {{}} */
1115
- __publicField(this, "__flags", {});
1116
- flag(this, "ssfi", ssfi || _Assertion);
1117
- flag(this, "lockSsfi", lockSsfi);
1118
- flag(this, "object", obj);
1119
- flag(this, "message", msg);
1120
- flag(this, "eql", config.deepEqual || deep_eql_default);
1121
- return proxify(this);
1122
- }
1123
- /** @returns {boolean} */
1124
- static get includeStack() {
1125
- console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
1126
- return config.includeStack;
1127
- }
1128
- /** @param {boolean} value */
1129
- static set includeStack(value) {
1130
- console.warn("Assertion.includeStack is deprecated, use chai.config.includeStack instead.");
1131
- config.includeStack = value;
1132
- }
1133
- /** @returns {boolean} */
1134
- static get showDiff() {
1135
- console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
1136
- return config.showDiff;
1137
- }
1138
- /** @param {boolean} value */
1139
- static set showDiff(value) {
1140
- console.warn("Assertion.showDiff is deprecated, use chai.config.showDiff instead.");
1141
- config.showDiff = value;
1142
- }
1143
- /**
1144
- * @param {string} name
1145
- * @param {Function} fn
1146
- */
1147
- static addProperty(name, fn) {
1148
- addProperty(this.prototype, name, fn);
1149
- }
1150
- /**
1151
- * @param {string} name
1152
- * @param {Function} fn
1153
- */
1154
- static addMethod(name, fn) {
1155
- addMethod(this.prototype, name, fn);
1156
- }
1157
- /**
1158
- * @param {string} name
1159
- * @param {Function} fn
1160
- * @param {Function} chainingBehavior
1161
- */
1162
- static addChainableMethod(name, fn, chainingBehavior) {
1163
- addChainableMethod(this.prototype, name, fn, chainingBehavior);
1164
- }
1165
- /**
1166
- * @param {string} name
1167
- * @param {Function} fn
1168
- */
1169
- static overwriteProperty(name, fn) {
1170
- overwriteProperty(this.prototype, name, fn);
1171
- }
1172
- /**
1173
- * @param {string} name
1174
- * @param {Function} fn
1175
- */
1176
- static overwriteMethod(name, fn) {
1177
- overwriteMethod(this.prototype, name, fn);
1178
- }
1179
- /**
1180
- * @param {string} name
1181
- * @param {Function} fn
1182
- * @param {Function} chainingBehavior
1183
- */
1184
- static overwriteChainableMethod(name, fn, chainingBehavior) {
1185
- overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
1186
- }
1187
- /**
1188
- * ### .assert(expression, message, negateMessage, expected, actual, showDiff)
1189
- *
1190
- * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
1191
- *
1192
- * @name assert
1193
- * @param {unknown} _expr to be tested
1194
- * @param {string | Function} msg or function that returns message to display if expression fails
1195
- * @param {string | Function} _negateMsg or function that returns negatedMessage to display if negated expression fails
1196
- * @param {unknown} expected value (remember to check for negation)
1197
- * @param {unknown} _actual (optional) will default to `this.obj`
1198
- * @param {boolean} showDiff (optional) when set to `true`, assert will display a diff in addition to the message if expression fails
1199
- * @returns {void}
1200
- */
1201
- assert(_expr, msg, _negateMsg, expected, _actual, showDiff) {
1202
- const ok = test(this, arguments);
1203
- if (false !== showDiff) showDiff = true;
1204
- if (void 0 === expected && void 0 === _actual) showDiff = false;
1205
- if (true !== config.showDiff) showDiff = false;
1206
- if (!ok) {
1207
- msg = getMessage2(this, arguments);
1208
- const assertionErrorObjectProperties = {
1209
- actual: getActual(this, arguments),
1210
- expected,
1211
- showDiff
1212
- };
1213
- const operator = getOperator(this, arguments);
1214
- if (operator) assertionErrorObjectProperties.operator = operator;
1215
- throw new AssertionError(msg, assertionErrorObjectProperties, config.includeStack ? this.assert : flag(this, "ssfi"));
1216
- }
1217
- }
1218
- /**
1219
- * Quick reference to stored `actual` value for plugin developers.
1220
- *
1221
- * @returns {unknown}
1222
- */
1223
- get _obj() {
1224
- return flag(this, "object");
1225
- }
1226
- /**
1227
- * Quick reference to stored `actual` value for plugin developers.
1228
- *
1229
- * @param {unknown} val
1230
- */
1231
- set _obj(val) {
1232
- flag(this, "object", val);
1233
- }
1234
- };
1235
- __name(_Assertion, "Assertion");
1236
- var Assertion = _Assertion;
1237
- var events = new EventTarget();
1238
- var _PluginEvent = class _PluginEvent extends Event {
1239
- constructor(type3, name, fn) {
1240
- super(type3);
1241
- this.name = String(name);
1242
- this.fn = fn;
1243
- }
1244
- };
1245
- __name(_PluginEvent, "PluginEvent");
1246
- var PluginEvent = _PluginEvent;
1247
- function isProxyEnabled() {
1248
- return config.useProxy && typeof Proxy !== "undefined" && typeof Reflect !== "undefined";
1249
- }
1250
- __name(isProxyEnabled, "isProxyEnabled");
1251
- function addProperty(ctx, name, getter) {
1252
- getter = getter === void 0 ? function() {} : getter;
1253
- Object.defineProperty(ctx, name, {
1254
- get: /* @__PURE__ */ __name(function propertyGetter() {
1255
- if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", propertyGetter);
1256
- let result = getter.call(this);
1257
- if (result !== void 0) return result;
1258
- let newAssertion = new Assertion();
1259
- transferFlags(this, newAssertion);
1260
- return newAssertion;
1261
- }, "propertyGetter"),
1262
- configurable: true
1263
- });
1264
- events.dispatchEvent(new PluginEvent("addProperty", name, getter));
1265
- }
1266
- __name(addProperty, "addProperty");
1267
- var fnLengthDesc = Object.getOwnPropertyDescriptor(function() {}, "length");
1268
- function addLengthGuard(fn, assertionName, isChainable) {
1269
- if (!fnLengthDesc.configurable) return fn;
1270
- Object.defineProperty(fn, "length", { get: /* @__PURE__ */ __name(function() {
1271
- if (isChainable) throw Error("Invalid Chai property: " + assertionName + ".length. Due to a compatibility issue, \"length\" cannot directly follow \"" + assertionName + "\". Use \"" + assertionName + ".lengthOf\" instead.");
1272
- throw Error("Invalid Chai property: " + assertionName + ".length. See docs for proper usage of \"" + assertionName + "\".");
1273
- }, "get") });
1274
- return fn;
1275
- }
1276
- __name(addLengthGuard, "addLengthGuard");
1277
- function getProperties(object) {
1278
- let result = Object.getOwnPropertyNames(object);
1279
- function addProperty2(property) {
1280
- if (result.indexOf(property) === -1) result.push(property);
1281
- }
1282
- __name(addProperty2, "addProperty");
1283
- let proto = Object.getPrototypeOf(object);
1284
- while (proto !== null) {
1285
- Object.getOwnPropertyNames(proto).forEach(addProperty2);
1286
- proto = Object.getPrototypeOf(proto);
1287
- }
1288
- return result;
1289
- }
1290
- __name(getProperties, "getProperties");
1291
- var builtins = [
1292
- "__flags",
1293
- "__methods",
1294
- "_obj",
1295
- "assert"
1296
- ];
1297
- function proxify(obj, nonChainableMethodName) {
1298
- if (!isProxyEnabled()) return obj;
1299
- return new Proxy(obj, { get: /* @__PURE__ */ __name(function proxyGetter(target, property) {
1300
- if (typeof property === "string" && config.proxyExcludedKeys.indexOf(property) === -1 && !Reflect.has(target, property)) {
1301
- if (nonChainableMethodName) throw Error("Invalid Chai property: " + nonChainableMethodName + "." + property + ". See docs for proper usage of \"" + nonChainableMethodName + "\".");
1302
- let suggestion = null;
1303
- let suggestionDistance = 4;
1304
- getProperties(target).forEach(function(prop) {
1305
- if (!Object.prototype.hasOwnProperty(prop) && builtins.indexOf(prop) === -1) {
1306
- let dist = stringDistanceCapped(property, prop, suggestionDistance);
1307
- if (dist < suggestionDistance) {
1308
- suggestion = prop;
1309
- suggestionDistance = dist;
1310
- }
1311
- }
1312
- });
1313
- if (suggestion !== null) throw Error("Invalid Chai property: " + property + ". Did you mean \"" + suggestion + "\"?");
1314
- else throw Error("Invalid Chai property: " + property);
1315
- }
1316
- if (builtins.indexOf(property) === -1 && !flag(target, "lockSsfi")) flag(target, "ssfi", proxyGetter);
1317
- return Reflect.get(target, property);
1318
- }, "proxyGetter") });
1319
- }
1320
- __name(proxify, "proxify");
1321
- function stringDistanceCapped(strA, strB, cap) {
1322
- if (Math.abs(strA.length - strB.length) >= cap) return cap;
1323
- let memo = [];
1324
- for (let i = 0; i <= strA.length; i++) {
1325
- memo[i] = Array(strB.length + 1).fill(0);
1326
- memo[i][0] = i;
1327
- }
1328
- for (let j = 0; j < strB.length; j++) memo[0][j] = j;
1329
- for (let i = 1; i <= strA.length; i++) {
1330
- let ch = strA.charCodeAt(i - 1);
1331
- for (let j = 1; j <= strB.length; j++) {
1332
- if (Math.abs(i - j) >= cap) {
1333
- memo[i][j] = cap;
1334
- continue;
1335
- }
1336
- memo[i][j] = Math.min(memo[i - 1][j] + 1, memo[i][j - 1] + 1, memo[i - 1][j - 1] + (ch === strB.charCodeAt(j - 1) ? 0 : 1));
1337
- }
1338
- }
1339
- return memo[strA.length][strB.length];
1340
- }
1341
- __name(stringDistanceCapped, "stringDistanceCapped");
1342
- function addMethod(ctx, name, method) {
1343
- let methodWrapper = /* @__PURE__ */ __name(function() {
1344
- if (!flag(this, "lockSsfi")) flag(this, "ssfi", methodWrapper);
1345
- let result = method.apply(this, arguments);
1346
- if (result !== void 0) return result;
1347
- let newAssertion = new Assertion();
1348
- transferFlags(this, newAssertion);
1349
- return newAssertion;
1350
- }, "methodWrapper");
1351
- addLengthGuard(methodWrapper, name, false);
1352
- ctx[name] = proxify(methodWrapper, name);
1353
- events.dispatchEvent(new PluginEvent("addMethod", name, method));
1354
- }
1355
- __name(addMethod, "addMethod");
1356
- function overwriteProperty(ctx, name, getter) {
1357
- let _get = Object.getOwnPropertyDescriptor(ctx, name), _super = /* @__PURE__ */ __name(function() {}, "_super");
1358
- if (_get && "function" === typeof _get.get) _super = _get.get;
1359
- Object.defineProperty(ctx, name, {
1360
- get: /* @__PURE__ */ __name(function overwritingPropertyGetter() {
1361
- if (!isProxyEnabled() && !flag(this, "lockSsfi")) flag(this, "ssfi", overwritingPropertyGetter);
1362
- let origLockSsfi = flag(this, "lockSsfi");
1363
- flag(this, "lockSsfi", true);
1364
- let result = getter(_super).call(this);
1365
- flag(this, "lockSsfi", origLockSsfi);
1366
- if (result !== void 0) return result;
1367
- let newAssertion = new Assertion();
1368
- transferFlags(this, newAssertion);
1369
- return newAssertion;
1370
- }, "overwritingPropertyGetter"),
1371
- configurable: true
1372
- });
1373
- }
1374
- __name(overwriteProperty, "overwriteProperty");
1375
- function overwriteMethod(ctx, name, method) {
1376
- let _method = ctx[name], _super = /* @__PURE__ */ __name(function() {
1377
- throw new Error(name + " is not a function");
1378
- }, "_super");
1379
- if (_method && "function" === typeof _method) _super = _method;
1380
- let overwritingMethodWrapper = /* @__PURE__ */ __name(function() {
1381
- if (!flag(this, "lockSsfi")) flag(this, "ssfi", overwritingMethodWrapper);
1382
- let origLockSsfi = flag(this, "lockSsfi");
1383
- flag(this, "lockSsfi", true);
1384
- let result = method(_super).apply(this, arguments);
1385
- flag(this, "lockSsfi", origLockSsfi);
1386
- if (result !== void 0) return result;
1387
- let newAssertion = new Assertion();
1388
- transferFlags(this, newAssertion);
1389
- return newAssertion;
1390
- }, "overwritingMethodWrapper");
1391
- addLengthGuard(overwritingMethodWrapper, name, false);
1392
- ctx[name] = proxify(overwritingMethodWrapper, name);
1393
- }
1394
- __name(overwriteMethod, "overwriteMethod");
1395
- var canSetPrototype = typeof Object.setPrototypeOf === "function";
1396
- var testFn = /* @__PURE__ */ __name(function() {}, "testFn");
1397
- var excludeNames = Object.getOwnPropertyNames(testFn).filter(function(name) {
1398
- let propDesc = Object.getOwnPropertyDescriptor(testFn, name);
1399
- if (typeof propDesc !== "object") return true;
1400
- return !propDesc.configurable;
1401
- });
1402
- var call = Function.prototype.call;
1403
- var apply = Function.prototype.apply;
1404
- var _PluginAddChainableMethodEvent = class _PluginAddChainableMethodEvent extends PluginEvent {
1405
- constructor(type3, name, fn, chainingBehavior) {
1406
- super(type3, name, fn);
1407
- this.chainingBehavior = chainingBehavior;
1408
- }
1409
- };
1410
- __name(_PluginAddChainableMethodEvent, "PluginAddChainableMethodEvent");
1411
- var PluginAddChainableMethodEvent = _PluginAddChainableMethodEvent;
1412
- function addChainableMethod(ctx, name, method, chainingBehavior) {
1413
- if (typeof chainingBehavior !== "function") chainingBehavior = /* @__PURE__ */ __name(function() {}, "chainingBehavior");
1414
- let chainableBehavior = {
1415
- method,
1416
- chainingBehavior
1417
- };
1418
- if (!ctx.__methods) ctx.__methods = {};
1419
- ctx.__methods[name] = chainableBehavior;
1420
- Object.defineProperty(ctx, name, {
1421
- get: /* @__PURE__ */ __name(function chainableMethodGetter() {
1422
- chainableBehavior.chainingBehavior.call(this);
1423
- let chainableMethodWrapper = /* @__PURE__ */ __name(function() {
1424
- if (!flag(this, "lockSsfi")) flag(this, "ssfi", chainableMethodWrapper);
1425
- let result = chainableBehavior.method.apply(this, arguments);
1426
- if (result !== void 0) return result;
1427
- let newAssertion = new Assertion();
1428
- transferFlags(this, newAssertion);
1429
- return newAssertion;
1430
- }, "chainableMethodWrapper");
1431
- addLengthGuard(chainableMethodWrapper, name, true);
1432
- if (canSetPrototype) {
1433
- let prototype = Object.create(this);
1434
- prototype.call = call;
1435
- prototype.apply = apply;
1436
- Object.setPrototypeOf(chainableMethodWrapper, prototype);
1437
- } else Object.getOwnPropertyNames(ctx).forEach(function(asserterName) {
1438
- if (excludeNames.indexOf(asserterName) !== -1) return;
1439
- let pd = Object.getOwnPropertyDescriptor(ctx, asserterName);
1440
- Object.defineProperty(chainableMethodWrapper, asserterName, pd);
1441
- });
1442
- transferFlags(this, chainableMethodWrapper);
1443
- return proxify(chainableMethodWrapper);
1444
- }, "chainableMethodGetter"),
1445
- configurable: true
1446
- });
1447
- events.dispatchEvent(new PluginAddChainableMethodEvent("addChainableMethod", name, method, chainingBehavior));
1448
- }
1449
- __name(addChainableMethod, "addChainableMethod");
1450
- function overwriteChainableMethod(ctx, name, method, chainingBehavior) {
1451
- let chainableBehavior = ctx.__methods[name];
1452
- let _chainingBehavior = chainableBehavior.chainingBehavior;
1453
- chainableBehavior.chainingBehavior = /* @__PURE__ */ __name(function overwritingChainableMethodGetter() {
1454
- let result = chainingBehavior(_chainingBehavior).call(this);
1455
- if (result !== void 0) return result;
1456
- let newAssertion = new Assertion();
1457
- transferFlags(this, newAssertion);
1458
- return newAssertion;
1459
- }, "overwritingChainableMethodGetter");
1460
- let _method = chainableBehavior.method;
1461
- chainableBehavior.method = /* @__PURE__ */ __name(function overwritingChainableMethodWrapper() {
1462
- let result = method(_method).apply(this, arguments);
1463
- if (result !== void 0) return result;
1464
- let newAssertion = new Assertion();
1465
- transferFlags(this, newAssertion);
1466
- return newAssertion;
1467
- }, "overwritingChainableMethodWrapper");
1468
- }
1469
- __name(overwriteChainableMethod, "overwriteChainableMethod");
1470
- function compareByInspect(a, b) {
1471
- return inspect2(a) < inspect2(b) ? -1 : 1;
1472
- }
1473
- __name(compareByInspect, "compareByInspect");
1474
- function getOwnEnumerablePropertySymbols(obj) {
1475
- if (typeof Object.getOwnPropertySymbols !== "function") return [];
1476
- return Object.getOwnPropertySymbols(obj).filter(function(sym) {
1477
- return Object.getOwnPropertyDescriptor(obj, sym).enumerable;
1478
- });
1479
- }
1480
- __name(getOwnEnumerablePropertySymbols, "getOwnEnumerablePropertySymbols");
1481
- function getOwnEnumerableProperties(obj) {
1482
- return Object.keys(obj).concat(getOwnEnumerablePropertySymbols(obj));
1483
- }
1484
- __name(getOwnEnumerableProperties, "getOwnEnumerableProperties");
1485
- var isNaN2 = Number.isNaN;
1486
- function isObjectType(obj) {
1487
- let objectType = type(obj);
1488
- return [
1489
- "Array",
1490
- "Object",
1491
- "Function"
1492
- ].indexOf(objectType) !== -1;
1493
- }
1494
- __name(isObjectType, "isObjectType");
1495
- function getOperator(obj, args) {
1496
- let operator = flag(obj, "operator");
1497
- let negate = flag(obj, "negate");
1498
- let expected = args[3];
1499
- let msg = negate ? args[2] : args[1];
1500
- if (operator) return operator;
1501
- if (typeof msg === "function") msg = msg();
1502
- msg = msg || "";
1503
- if (!msg) return;
1504
- if (/\shave\s/.test(msg)) return;
1505
- let isObject = isObjectType(expected);
1506
- if (/\snot\s/.test(msg)) return isObject ? "notDeepStrictEqual" : "notStrictEqual";
1507
- return isObject ? "deepStrictEqual" : "strictEqual";
1508
- }
1509
- __name(getOperator, "getOperator");
1510
- function getName(fn) {
1511
- return fn.name;
1512
- }
1513
- __name(getName, "getName");
1514
- function isRegExp2(obj) {
1515
- return Object.prototype.toString.call(obj) === "[object RegExp]";
1516
- }
1517
- __name(isRegExp2, "isRegExp");
1518
- function isNumeric(obj) {
1519
- return ["Number", "BigInt"].includes(type(obj));
1520
- }
1521
- __name(isNumeric, "isNumeric");
1522
- var { flag: flag2 } = utils_exports;
1523
- [
1524
- "to",
1525
- "be",
1526
- "been",
1527
- "is",
1528
- "and",
1529
- "has",
1530
- "have",
1531
- "with",
1532
- "that",
1533
- "which",
1534
- "at",
1535
- "of",
1536
- "same",
1537
- "but",
1538
- "does",
1539
- "still",
1540
- "also"
1541
- ].forEach(function(chain) {
1542
- Assertion.addProperty(chain);
1543
- });
1544
- Assertion.addProperty("not", function() {
1545
- flag2(this, "negate", true);
1546
- });
1547
- Assertion.addProperty("deep", function() {
1548
- flag2(this, "deep", true);
1549
- });
1550
- Assertion.addProperty("nested", function() {
1551
- flag2(this, "nested", true);
1552
- });
1553
- Assertion.addProperty("own", function() {
1554
- flag2(this, "own", true);
1555
- });
1556
- Assertion.addProperty("ordered", function() {
1557
- flag2(this, "ordered", true);
1558
- });
1559
- Assertion.addProperty("any", function() {
1560
- flag2(this, "any", true);
1561
- flag2(this, "all", false);
1562
- });
1563
- Assertion.addProperty("all", function() {
1564
- flag2(this, "all", true);
1565
- flag2(this, "any", false);
1566
- });
1567
- var functionTypes = {
1568
- function: [
1569
- "function",
1570
- "asyncfunction",
1571
- "generatorfunction",
1572
- "asyncgeneratorfunction"
1573
- ],
1574
- asyncfunction: ["asyncfunction", "asyncgeneratorfunction"],
1575
- generatorfunction: ["generatorfunction", "asyncgeneratorfunction"],
1576
- asyncgeneratorfunction: ["asyncgeneratorfunction"]
1577
- };
1578
- function an(type3, msg) {
1579
- if (msg) flag2(this, "message", msg);
1580
- type3 = type3.toLowerCase();
1581
- let obj = flag2(this, "object"), article = ~[
1582
- "a",
1583
- "e",
1584
- "i",
1585
- "o",
1586
- "u"
1587
- ].indexOf(type3.charAt(0)) ? "an " : "a ";
1588
- const detectedType = type(obj).toLowerCase();
1589
- if (functionTypes["function"].includes(type3)) this.assert(functionTypes[type3].includes(detectedType), "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
1590
- else this.assert(type3 === detectedType, "expected #{this} to be " + article + type3, "expected #{this} not to be " + article + type3);
1591
- }
1592
- __name(an, "an");
1593
- Assertion.addChainableMethod("an", an);
1594
- Assertion.addChainableMethod("a", an);
1595
- function SameValueZero(a, b) {
1596
- return isNaN2(a) && isNaN2(b) || a === b;
1597
- }
1598
- __name(SameValueZero, "SameValueZero");
1599
- function includeChainingBehavior() {
1600
- flag2(this, "contains", true);
1601
- }
1602
- __name(includeChainingBehavior, "includeChainingBehavior");
1603
- function include(val, msg) {
1604
- if (msg) flag2(this, "message", msg);
1605
- let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), negate = flag2(this, "negate"), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), descriptor = isDeep ? "deep " : "", isEql = isDeep ? flag2(this, "eql") : SameValueZero;
1606
- flagMsg = flagMsg ? flagMsg + ": " : "";
1607
- let included = false;
1608
- switch (objType) {
1609
- case "string":
1610
- included = obj.indexOf(val) !== -1;
1611
- break;
1612
- case "weakset":
1613
- if (isDeep) throw new AssertionError(flagMsg + "unable to use .deep.include with WeakSet", void 0, ssfi);
1614
- included = obj.has(val);
1615
- break;
1616
- case "map":
1617
- obj.forEach(function(item) {
1618
- included = included || isEql(item, val);
1619
- });
1620
- break;
1621
- case "set":
1622
- if (isDeep) obj.forEach(function(item) {
1623
- included = included || isEql(item, val);
1624
- });
1625
- else included = obj.has(val);
1626
- break;
1627
- case "array":
1628
- if (isDeep) included = obj.some(function(item) {
1629
- return isEql(item, val);
1630
- });
1631
- else included = obj.indexOf(val) !== -1;
1632
- break;
1633
- default: {
1634
- if (val !== Object(val)) throw new AssertionError(flagMsg + "the given combination of arguments (" + objType + " and " + type(val).toLowerCase() + ") is invalid for this assertion. You can use an array, a map, an object, a set, a string, or a weakset instead of a " + type(val).toLowerCase(), void 0, ssfi);
1635
- let props = Object.keys(val);
1636
- let firstErr = null;
1637
- let numErrs = 0;
1638
- props.forEach(function(prop) {
1639
- let propAssertion = new Assertion(obj);
1640
- transferFlags(this, propAssertion, true);
1641
- flag2(propAssertion, "lockSsfi", true);
1642
- if (!negate || props.length === 1) {
1643
- propAssertion.property(prop, val[prop]);
1644
- return;
1645
- }
1646
- try {
1647
- propAssertion.property(prop, val[prop]);
1648
- } catch (err) {
1649
- if (!check_error_exports.compatibleConstructor(err, AssertionError)) throw err;
1650
- if (firstErr === null) firstErr = err;
1651
- numErrs++;
1652
- }
1653
- }, this);
1654
- if (negate && props.length > 1 && numErrs === props.length) throw firstErr;
1655
- return;
1656
- }
1657
- }
1658
- this.assert(included, "expected #{this} to " + descriptor + "include " + inspect2(val), "expected #{this} to not " + descriptor + "include " + inspect2(val));
1659
- }
1660
- __name(include, "include");
1661
- Assertion.addChainableMethod("include", include, includeChainingBehavior);
1662
- Assertion.addChainableMethod("contain", include, includeChainingBehavior);
1663
- Assertion.addChainableMethod("contains", include, includeChainingBehavior);
1664
- Assertion.addChainableMethod("includes", include, includeChainingBehavior);
1665
- Assertion.addProperty("ok", function() {
1666
- this.assert(flag2(this, "object"), "expected #{this} to be truthy", "expected #{this} to be falsy");
1667
- });
1668
- Assertion.addProperty("true", function() {
1669
- this.assert(true === flag2(this, "object"), "expected #{this} to be true", "expected #{this} to be false", flag2(this, "negate") ? false : true);
1670
- });
1671
- Assertion.addProperty("numeric", function() {
1672
- const object = flag2(this, "object");
1673
- this.assert(["Number", "BigInt"].includes(type(object)), "expected #{this} to be numeric", "expected #{this} to not be numeric", flag2(this, "negate") ? false : true);
1674
- });
1675
- Assertion.addProperty("callable", function() {
1676
- const val = flag2(this, "object");
1677
- const ssfi = flag2(this, "ssfi");
1678
- const message = flag2(this, "message");
1679
- const msg = message ? `${message}: ` : "";
1680
- const negate = flag2(this, "negate");
1681
- const assertionMessage = negate ? `${msg}expected ${inspect2(val)} not to be a callable function` : `${msg}expected ${inspect2(val)} to be a callable function`;
1682
- const isCallable = [
1683
- "Function",
1684
- "AsyncFunction",
1685
- "GeneratorFunction",
1686
- "AsyncGeneratorFunction"
1687
- ].includes(type(val));
1688
- if (isCallable && negate || !isCallable && !negate) throw new AssertionError(assertionMessage, void 0, ssfi);
1689
- });
1690
- Assertion.addProperty("false", function() {
1691
- this.assert(false === flag2(this, "object"), "expected #{this} to be false", "expected #{this} to be true", flag2(this, "negate") ? true : false);
1692
- });
1693
- Assertion.addProperty("null", function() {
1694
- this.assert(null === flag2(this, "object"), "expected #{this} to be null", "expected #{this} not to be null");
1695
- });
1696
- Assertion.addProperty("undefined", function() {
1697
- this.assert(void 0 === flag2(this, "object"), "expected #{this} to be undefined", "expected #{this} not to be undefined");
1698
- });
1699
- Assertion.addProperty("NaN", function() {
1700
- this.assert(isNaN2(flag2(this, "object")), "expected #{this} to be NaN", "expected #{this} not to be NaN");
1701
- });
1702
- function assertExist() {
1703
- let val = flag2(this, "object");
1704
- this.assert(val !== null && val !== void 0, "expected #{this} to exist", "expected #{this} to not exist");
1705
- }
1706
- __name(assertExist, "assertExist");
1707
- Assertion.addProperty("exist", assertExist);
1708
- Assertion.addProperty("exists", assertExist);
1709
- Assertion.addProperty("empty", function() {
1710
- let val = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), itemsCount;
1711
- flagMsg = flagMsg ? flagMsg + ": " : "";
1712
- switch (type(val).toLowerCase()) {
1713
- case "array":
1714
- case "string":
1715
- itemsCount = val.length;
1716
- break;
1717
- case "map":
1718
- case "set":
1719
- itemsCount = val.size;
1720
- break;
1721
- case "weakmap":
1722
- case "weakset": throw new AssertionError(flagMsg + ".empty was passed a weak collection", void 0, ssfi);
1723
- case "function": throw new AssertionError((flagMsg + ".empty was passed a function " + getName(val)).trim(), void 0, ssfi);
1724
- default:
1725
- if (val !== Object(val)) throw new AssertionError(flagMsg + ".empty was passed non-string primitive " + inspect2(val), void 0, ssfi);
1726
- itemsCount = Object.keys(val).length;
1727
- }
1728
- this.assert(0 === itemsCount, "expected #{this} to be empty", "expected #{this} not to be empty");
1729
- });
1730
- function checkArguments() {
1731
- let type3 = type(flag2(this, "object"));
1732
- this.assert("Arguments" === type3, "expected #{this} to be arguments but got " + type3, "expected #{this} to not be arguments");
1733
- }
1734
- __name(checkArguments, "checkArguments");
1735
- Assertion.addProperty("arguments", checkArguments);
1736
- Assertion.addProperty("Arguments", checkArguments);
1737
- function assertEqual(val, msg) {
1738
- if (msg) flag2(this, "message", msg);
1739
- let obj = flag2(this, "object");
1740
- if (flag2(this, "deep")) {
1741
- let prevLockSsfi = flag2(this, "lockSsfi");
1742
- flag2(this, "lockSsfi", true);
1743
- this.eql(val);
1744
- flag2(this, "lockSsfi", prevLockSsfi);
1745
- } else this.assert(val === obj, "expected #{this} to equal #{exp}", "expected #{this} to not equal #{exp}", val, this._obj, true);
1746
- }
1747
- __name(assertEqual, "assertEqual");
1748
- Assertion.addMethod("equal", assertEqual);
1749
- Assertion.addMethod("equals", assertEqual);
1750
- Assertion.addMethod("eq", assertEqual);
1751
- function assertEql(obj, msg) {
1752
- if (msg) flag2(this, "message", msg);
1753
- let eql = flag2(this, "eql");
1754
- this.assert(eql(obj, flag2(this, "object")), "expected #{this} to deeply equal #{exp}", "expected #{this} to not deeply equal #{exp}", obj, this._obj, true);
1755
- }
1756
- __name(assertEql, "assertEql");
1757
- Assertion.addMethod("eql", assertEql);
1758
- Assertion.addMethod("eqls", assertEql);
1759
- function assertAbove(n, msg) {
1760
- if (msg) flag2(this, "message", msg);
1761
- let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase();
1762
- if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1763
- if (!doLength && objType === "date" && nType !== "date") throw new AssertionError(msgPrefix + "the argument to above must be a date", void 0, ssfi);
1764
- else if (!isNumeric(n) && (doLength || isNumeric(obj))) throw new AssertionError(msgPrefix + "the argument to above must be a number", void 0, ssfi);
1765
- else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1766
- let printObj = objType === "string" ? "'" + obj + "'" : obj;
1767
- throw new AssertionError(msgPrefix + "expected " + printObj + " to be a number or a date", void 0, ssfi);
1768
- }
1769
- if (doLength) {
1770
- let descriptor = "length", itemsCount;
1771
- if (objType === "map" || objType === "set") {
1772
- descriptor = "size";
1773
- itemsCount = obj.size;
1774
- } else itemsCount = obj.length;
1775
- this.assert(itemsCount > n, "expected #{this} to have a " + descriptor + " above #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " above #{exp}", n, itemsCount);
1776
- } else this.assert(obj > n, "expected #{this} to be above #{exp}", "expected #{this} to be at most #{exp}", n);
1777
- }
1778
- __name(assertAbove, "assertAbove");
1779
- Assertion.addMethod("above", assertAbove);
1780
- Assertion.addMethod("gt", assertAbove);
1781
- Assertion.addMethod("greaterThan", assertAbove);
1782
- function assertLeast(n, msg) {
1783
- if (msg) flag2(this, "message", msg);
1784
- let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
1785
- if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1786
- if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to least must be a date";
1787
- else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to least must be a number";
1788
- else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1789
- let printObj = objType === "string" ? "'" + obj + "'" : obj;
1790
- errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1791
- } else shouldThrow = false;
1792
- if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1793
- if (doLength) {
1794
- let descriptor = "length", itemsCount;
1795
- if (objType === "map" || objType === "set") {
1796
- descriptor = "size";
1797
- itemsCount = obj.size;
1798
- } else itemsCount = obj.length;
1799
- this.assert(itemsCount >= n, "expected #{this} to have a " + descriptor + " at least #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " below #{exp}", n, itemsCount);
1800
- } else this.assert(obj >= n, "expected #{this} to be at least #{exp}", "expected #{this} to be below #{exp}", n);
1801
- }
1802
- __name(assertLeast, "assertLeast");
1803
- Assertion.addMethod("least", assertLeast);
1804
- Assertion.addMethod("gte", assertLeast);
1805
- Assertion.addMethod("greaterThanOrEqual", assertLeast);
1806
- function assertBelow(n, msg) {
1807
- if (msg) flag2(this, "message", msg);
1808
- let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
1809
- if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1810
- if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to below must be a date";
1811
- else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to below must be a number";
1812
- else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1813
- let printObj = objType === "string" ? "'" + obj + "'" : obj;
1814
- errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1815
- } else shouldThrow = false;
1816
- if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1817
- if (doLength) {
1818
- let descriptor = "length", itemsCount;
1819
- if (objType === "map" || objType === "set") {
1820
- descriptor = "size";
1821
- itemsCount = obj.size;
1822
- } else itemsCount = obj.length;
1823
- this.assert(itemsCount < n, "expected #{this} to have a " + descriptor + " below #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " below #{exp}", n, itemsCount);
1824
- } else this.assert(obj < n, "expected #{this} to be below #{exp}", "expected #{this} to be at least #{exp}", n);
1825
- }
1826
- __name(assertBelow, "assertBelow");
1827
- Assertion.addMethod("below", assertBelow);
1828
- Assertion.addMethod("lt", assertBelow);
1829
- Assertion.addMethod("lessThan", assertBelow);
1830
- function assertMost(n, msg) {
1831
- if (msg) flag2(this, "message", msg);
1832
- let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), nType = type(n).toLowerCase(), errorMessage, shouldThrow = true;
1833
- if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1834
- if (!doLength && objType === "date" && nType !== "date") errorMessage = msgPrefix + "the argument to most must be a date";
1835
- else if (!isNumeric(n) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the argument to most must be a number";
1836
- else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1837
- let printObj = objType === "string" ? "'" + obj + "'" : obj;
1838
- errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1839
- } else shouldThrow = false;
1840
- if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1841
- if (doLength) {
1842
- let descriptor = "length", itemsCount;
1843
- if (objType === "map" || objType === "set") {
1844
- descriptor = "size";
1845
- itemsCount = obj.size;
1846
- } else itemsCount = obj.length;
1847
- this.assert(itemsCount <= n, "expected #{this} to have a " + descriptor + " at most #{exp} but got #{act}", "expected #{this} to have a " + descriptor + " above #{exp}", n, itemsCount);
1848
- } else this.assert(obj <= n, "expected #{this} to be at most #{exp}", "expected #{this} to be above #{exp}", n);
1849
- }
1850
- __name(assertMost, "assertMost");
1851
- Assertion.addMethod("most", assertMost);
1852
- Assertion.addMethod("lte", assertMost);
1853
- Assertion.addMethod("lessThanOrEqual", assertMost);
1854
- Assertion.addMethod("within", function(start, finish, msg) {
1855
- if (msg) flag2(this, "message", msg);
1856
- let obj = flag2(this, "object"), doLength = flag2(this, "doLength"), flagMsg = flag2(this, "message"), msgPrefix = flagMsg ? flagMsg + ": " : "", ssfi = flag2(this, "ssfi"), objType = type(obj).toLowerCase(), startType = type(start).toLowerCase(), finishType = type(finish).toLowerCase(), errorMessage, shouldThrow = true, range = startType === "date" && finishType === "date" ? start.toISOString() + ".." + finish.toISOString() : start + ".." + finish;
1857
- if (doLength && objType !== "map" && objType !== "set") new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1858
- if (!doLength && objType === "date" && (startType !== "date" || finishType !== "date")) errorMessage = msgPrefix + "the arguments to within must be dates";
1859
- else if ((!isNumeric(start) || !isNumeric(finish)) && (doLength || isNumeric(obj))) errorMessage = msgPrefix + "the arguments to within must be numbers";
1860
- else if (!doLength && objType !== "date" && !isNumeric(obj)) {
1861
- let printObj = objType === "string" ? "'" + obj + "'" : obj;
1862
- errorMessage = msgPrefix + "expected " + printObj + " to be a number or a date";
1863
- } else shouldThrow = false;
1864
- if (shouldThrow) throw new AssertionError(errorMessage, void 0, ssfi);
1865
- if (doLength) {
1866
- let descriptor = "length", itemsCount;
1867
- if (objType === "map" || objType === "set") {
1868
- descriptor = "size";
1869
- itemsCount = obj.size;
1870
- } else itemsCount = obj.length;
1871
- this.assert(itemsCount >= start && itemsCount <= finish, "expected #{this} to have a " + descriptor + " within " + range, "expected #{this} to not have a " + descriptor + " within " + range);
1872
- } else this.assert(obj >= start && obj <= finish, "expected #{this} to be within " + range, "expected #{this} to not be within " + range);
1873
- });
1874
- function assertInstanceOf(constructor, msg) {
1875
- if (msg) flag2(this, "message", msg);
1876
- let target = flag2(this, "object");
1877
- let ssfi = flag2(this, "ssfi");
1878
- let flagMsg = flag2(this, "message");
1879
- let isInstanceOf;
1880
- try {
1881
- isInstanceOf = target instanceof constructor;
1882
- } catch (err) {
1883
- if (err instanceof TypeError) {
1884
- flagMsg = flagMsg ? flagMsg + ": " : "";
1885
- throw new AssertionError(flagMsg + "The instanceof assertion needs a constructor but " + type(constructor) + " was given.", void 0, ssfi);
1886
- }
1887
- throw err;
1888
- }
1889
- let name = getName(constructor);
1890
- if (name == null) name = "an unnamed constructor";
1891
- this.assert(isInstanceOf, "expected #{this} to be an instance of " + name, "expected #{this} to not be an instance of " + name);
1892
- }
1893
- __name(assertInstanceOf, "assertInstanceOf");
1894
- Assertion.addMethod("instanceof", assertInstanceOf);
1895
- Assertion.addMethod("instanceOf", assertInstanceOf);
1896
- function assertProperty(name, val, msg) {
1897
- if (msg) flag2(this, "message", msg);
1898
- let isNested = flag2(this, "nested"), isOwn = flag2(this, "own"), flagMsg = flag2(this, "message"), obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), nameType = typeof name;
1899
- flagMsg = flagMsg ? flagMsg + ": " : "";
1900
- if (isNested) {
1901
- if (nameType !== "string") throw new AssertionError(flagMsg + "the argument to property must be a string when using nested syntax", void 0, ssfi);
1902
- } else if (nameType !== "string" && nameType !== "number" && nameType !== "symbol") throw new AssertionError(flagMsg + "the argument to property must be a string, number, or symbol", void 0, ssfi);
1903
- if (isNested && isOwn) throw new AssertionError(flagMsg + "The \"nested\" and \"own\" flags cannot be combined.", void 0, ssfi);
1904
- if (obj === null || obj === void 0) throw new AssertionError(flagMsg + "Target cannot be null or undefined.", void 0, ssfi);
1905
- let isDeep = flag2(this, "deep"), negate = flag2(this, "negate"), pathInfo = isNested ? getPathInfo(obj, name) : null, value = isNested ? pathInfo.value : obj[name], isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
1906
- let descriptor = "";
1907
- if (isDeep) descriptor += "deep ";
1908
- if (isOwn) descriptor += "own ";
1909
- if (isNested) descriptor += "nested ";
1910
- descriptor += "property ";
1911
- let hasProperty2;
1912
- if (isOwn) hasProperty2 = Object.prototype.hasOwnProperty.call(obj, name);
1913
- else if (isNested) hasProperty2 = pathInfo.exists;
1914
- else hasProperty2 = hasProperty(obj, name);
1915
- if (!negate || arguments.length === 1) this.assert(hasProperty2, "expected #{this} to have " + descriptor + inspect2(name), "expected #{this} to not have " + descriptor + inspect2(name));
1916
- if (arguments.length > 1) this.assert(hasProperty2 && isEql(val, value), "expected #{this} to have " + descriptor + inspect2(name) + " of #{exp}, but got #{act}", "expected #{this} to not have " + descriptor + inspect2(name) + " of #{act}", val, value);
1917
- flag2(this, "object", value);
1918
- }
1919
- __name(assertProperty, "assertProperty");
1920
- Assertion.addMethod("property", assertProperty);
1921
- function assertOwnProperty(_name, _value, _msg) {
1922
- flag2(this, "own", true);
1923
- assertProperty.apply(this, arguments);
1924
- }
1925
- __name(assertOwnProperty, "assertOwnProperty");
1926
- Assertion.addMethod("ownProperty", assertOwnProperty);
1927
- Assertion.addMethod("haveOwnProperty", assertOwnProperty);
1928
- function assertOwnPropertyDescriptor(name, descriptor, msg) {
1929
- if (typeof descriptor === "string") {
1930
- msg = descriptor;
1931
- descriptor = null;
1932
- }
1933
- if (msg) flag2(this, "message", msg);
1934
- let obj = flag2(this, "object");
1935
- let actualDescriptor = Object.getOwnPropertyDescriptor(Object(obj), name);
1936
- let eql = flag2(this, "eql");
1937
- if (actualDescriptor && descriptor) this.assert(eql(descriptor, actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to match " + inspect2(descriptor) + ", got " + inspect2(actualDescriptor), "expected the own property descriptor for " + inspect2(name) + " on #{this} to not match " + inspect2(descriptor), descriptor, actualDescriptor, true);
1938
- else this.assert(actualDescriptor, "expected #{this} to have an own property descriptor for " + inspect2(name), "expected #{this} to not have an own property descriptor for " + inspect2(name));
1939
- flag2(this, "object", actualDescriptor);
1940
- }
1941
- __name(assertOwnPropertyDescriptor, "assertOwnPropertyDescriptor");
1942
- Assertion.addMethod("ownPropertyDescriptor", assertOwnPropertyDescriptor);
1943
- Assertion.addMethod("haveOwnPropertyDescriptor", assertOwnPropertyDescriptor);
1944
- function assertLengthChain() {
1945
- flag2(this, "doLength", true);
1946
- }
1947
- __name(assertLengthChain, "assertLengthChain");
1948
- function assertLength(n, msg) {
1949
- if (msg) flag2(this, "message", msg);
1950
- let obj = flag2(this, "object"), objType = type(obj).toLowerCase(), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), descriptor = "length", itemsCount;
1951
- switch (objType) {
1952
- case "map":
1953
- case "set":
1954
- descriptor = "size";
1955
- itemsCount = obj.size;
1956
- break;
1957
- default:
1958
- new Assertion(obj, flagMsg, ssfi, true).to.have.property("length");
1959
- itemsCount = obj.length;
1960
- }
1961
- this.assert(itemsCount == n, "expected #{this} to have a " + descriptor + " of #{exp} but got #{act}", "expected #{this} to not have a " + descriptor + " of #{act}", n, itemsCount);
1962
- }
1963
- __name(assertLength, "assertLength");
1964
- Assertion.addChainableMethod("length", assertLength, assertLengthChain);
1965
- Assertion.addChainableMethod("lengthOf", assertLength, assertLengthChain);
1966
- function assertMatch(re, msg) {
1967
- if (msg) flag2(this, "message", msg);
1968
- let obj = flag2(this, "object");
1969
- this.assert(re.exec(obj), "expected #{this} to match " + re, "expected #{this} not to match " + re);
1970
- }
1971
- __name(assertMatch, "assertMatch");
1972
- Assertion.addMethod("match", assertMatch);
1973
- Assertion.addMethod("matches", assertMatch);
1974
- Assertion.addMethod("string", function(str, msg) {
1975
- if (msg) flag2(this, "message", msg);
1976
- let obj = flag2(this, "object");
1977
- new Assertion(obj, flag2(this, "message"), flag2(this, "ssfi"), true).is.a("string");
1978
- this.assert(~obj.indexOf(str), "expected #{this} to contain " + inspect2(str), "expected #{this} to not contain " + inspect2(str));
1979
- });
1980
- function assertKeys(keys) {
1981
- let obj = flag2(this, "object"), objType = type(obj), keysType = type(keys), ssfi = flag2(this, "ssfi"), isDeep = flag2(this, "deep"), str, deepStr = "", actual, ok = true, flagMsg = flag2(this, "message");
1982
- flagMsg = flagMsg ? flagMsg + ": " : "";
1983
- let mixedArgsMsg = flagMsg + "when testing keys against an object or an array you must give a single Array|Object|String argument or multiple String arguments";
1984
- if (objType === "Map" || objType === "Set") {
1985
- deepStr = isDeep ? "deeply " : "";
1986
- actual = [];
1987
- obj.forEach(function(val, key) {
1988
- actual.push(key);
1989
- });
1990
- if (keysType !== "Array") keys = Array.prototype.slice.call(arguments);
1991
- } else {
1992
- actual = getOwnEnumerableProperties(obj);
1993
- switch (keysType) {
1994
- case "Array":
1995
- if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
1996
- break;
1997
- case "Object":
1998
- if (arguments.length > 1) throw new AssertionError(mixedArgsMsg, void 0, ssfi);
1999
- keys = Object.keys(keys);
2000
- break;
2001
- default: keys = Array.prototype.slice.call(arguments);
2002
- }
2003
- keys = keys.map(function(val) {
2004
- return typeof val === "symbol" ? val : String(val);
2005
- });
2006
- }
2007
- if (!keys.length) throw new AssertionError(flagMsg + "keys required", void 0, ssfi);
2008
- let len = keys.length, any = flag2(this, "any"), all = flag2(this, "all"), expected = keys, isEql = isDeep ? flag2(this, "eql") : (val1, val2) => val1 === val2;
2009
- if (!any && !all) all = true;
2010
- if (any) ok = expected.some(function(expectedKey) {
2011
- return actual.some(function(actualKey) {
2012
- return isEql(expectedKey, actualKey);
2013
- });
2014
- });
2015
- if (all) {
2016
- ok = expected.every(function(expectedKey) {
2017
- return actual.some(function(actualKey) {
2018
- return isEql(expectedKey, actualKey);
2019
- });
2020
- });
2021
- if (!flag2(this, "contains")) ok = ok && keys.length == actual.length;
2022
- }
2023
- if (len > 1) {
2024
- keys = keys.map(function(key) {
2025
- return inspect2(key);
2026
- });
2027
- let last = keys.pop();
2028
- if (all) str = keys.join(", ") + ", and " + last;
2029
- if (any) str = keys.join(", ") + ", or " + last;
2030
- } else str = inspect2(keys[0]);
2031
- str = (len > 1 ? "keys " : "key ") + str;
2032
- str = (flag2(this, "contains") ? "contain " : "have ") + str;
2033
- this.assert(ok, "expected #{this} to " + deepStr + str, "expected #{this} to not " + deepStr + str, expected.slice(0).sort(compareByInspect), actual.sort(compareByInspect), true);
2034
- }
2035
- __name(assertKeys, "assertKeys");
2036
- Assertion.addMethod("keys", assertKeys);
2037
- Assertion.addMethod("key", assertKeys);
2038
- function assertThrows(errorLike, errMsgMatcher, msg) {
2039
- if (msg) flag2(this, "message", msg);
2040
- let obj = flag2(this, "object"), ssfi = flag2(this, "ssfi"), flagMsg = flag2(this, "message"), negate = flag2(this, "negate") || false;
2041
- new Assertion(obj, flagMsg, ssfi, true).is.a("function");
2042
- if (isRegExp2(errorLike) || typeof errorLike === "string") {
2043
- errMsgMatcher = errorLike;
2044
- errorLike = null;
2045
- }
2046
- let caughtErr;
2047
- let errorWasThrown = false;
2048
- try {
2049
- obj();
2050
- } catch (err) {
2051
- errorWasThrown = true;
2052
- caughtErr = err;
2053
- }
2054
- let everyArgIsUndefined = errorLike === void 0 && errMsgMatcher === void 0;
2055
- let everyArgIsDefined = Boolean(errorLike && errMsgMatcher);
2056
- let errorLikeFail = false;
2057
- let errMsgMatcherFail = false;
2058
- if (everyArgIsUndefined || !everyArgIsUndefined && !negate) {
2059
- let errorLikeString = "an error";
2060
- if (errorLike instanceof Error) errorLikeString = "#{exp}";
2061
- else if (errorLike) errorLikeString = check_error_exports.getConstructorName(errorLike);
2062
- let actual = caughtErr;
2063
- if (caughtErr instanceof Error) actual = caughtErr.toString();
2064
- else if (typeof caughtErr === "string") actual = caughtErr;
2065
- else if (caughtErr && (typeof caughtErr === "object" || typeof caughtErr === "function")) try {
2066
- actual = check_error_exports.getConstructorName(caughtErr);
2067
- } catch (_err) {}
2068
- this.assert(errorWasThrown, "expected #{this} to throw " + errorLikeString, "expected #{this} to not throw an error but #{act} was thrown", errorLike && errorLike.toString(), actual);
2069
- }
2070
- if (errorLike && caughtErr) {
2071
- if (errorLike instanceof Error) {
2072
- if (check_error_exports.compatibleInstance(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
2073
- else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr && !negate ? " but #{act} was thrown" : ""), errorLike.toString(), caughtErr.toString());
2074
- }
2075
- if (check_error_exports.compatibleConstructor(caughtErr, errorLike) === negate) if (everyArgIsDefined && negate) errorLikeFail = true;
2076
- else this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
2077
- }
2078
- if (caughtErr && errMsgMatcher !== void 0 && errMsgMatcher !== null) {
2079
- let placeholder = "including";
2080
- if (isRegExp2(errMsgMatcher)) placeholder = "matching";
2081
- if (check_error_exports.compatibleMessage(caughtErr, errMsgMatcher) === negate) if (everyArgIsDefined && negate) errMsgMatcherFail = true;
2082
- else this.assert(negate, "expected #{this} to throw error " + placeholder + " #{exp} but got #{act}", "expected #{this} to throw error not " + placeholder + " #{exp}", errMsgMatcher, check_error_exports.getMessage(caughtErr));
2083
- }
2084
- if (errorLikeFail && errMsgMatcherFail) this.assert(negate, "expected #{this} to throw #{exp} but #{act} was thrown", "expected #{this} to not throw #{exp}" + (caughtErr ? " but #{act} was thrown" : ""), errorLike instanceof Error ? errorLike.toString() : errorLike && check_error_exports.getConstructorName(errorLike), caughtErr instanceof Error ? caughtErr.toString() : caughtErr && check_error_exports.getConstructorName(caughtErr));
2085
- flag2(this, "object", caughtErr);
2086
- }
2087
- __name(assertThrows, "assertThrows");
2088
- Assertion.addMethod("throw", assertThrows);
2089
- Assertion.addMethod("throws", assertThrows);
2090
- Assertion.addMethod("Throw", assertThrows);
2091
- function respondTo(method, msg) {
2092
- if (msg) flag2(this, "message", msg);
2093
- let obj = flag2(this, "object"), itself = flag2(this, "itself"), context = "function" === typeof obj && !itself ? obj.prototype[method] : obj[method];
2094
- this.assert("function" === typeof context, "expected #{this} to respond to " + inspect2(method), "expected #{this} to not respond to " + inspect2(method));
2095
- }
2096
- __name(respondTo, "respondTo");
2097
- Assertion.addMethod("respondTo", respondTo);
2098
- Assertion.addMethod("respondsTo", respondTo);
2099
- Assertion.addProperty("itself", function() {
2100
- flag2(this, "itself", true);
2101
- });
2102
- function satisfy(matcher, msg) {
2103
- if (msg) flag2(this, "message", msg);
2104
- let result = matcher(flag2(this, "object"));
2105
- this.assert(result, "expected #{this} to satisfy " + objDisplay(matcher), "expected #{this} to not satisfy" + objDisplay(matcher), flag2(this, "negate") ? false : true, result);
2106
- }
2107
- __name(satisfy, "satisfy");
2108
- Assertion.addMethod("satisfy", satisfy);
2109
- Assertion.addMethod("satisfies", satisfy);
2110
- function closeTo(expected, delta, msg) {
2111
- if (msg) flag2(this, "message", msg);
2112
- let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2113
- new Assertion(obj, flagMsg, ssfi, true).is.numeric;
2114
- let message = "A `delta` value is required for `closeTo`";
2115
- if (delta == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
2116
- new Assertion(delta, flagMsg, ssfi, true).is.numeric;
2117
- message = "A `expected` value is required for `closeTo`";
2118
- if (expected == void 0) throw new AssertionError(flagMsg ? `${flagMsg}: ${message}` : message, void 0, ssfi);
2119
- new Assertion(expected, flagMsg, ssfi, true).is.numeric;
2120
- const abs = /* @__PURE__ */ __name((x) => x < 0 ? -x : x, "abs");
2121
- const strip = /* @__PURE__ */ __name((number) => parseFloat(parseFloat(number).toPrecision(12)), "strip");
2122
- this.assert(strip(abs(obj - expected)) <= delta, "expected #{this} to be close to " + expected + " +/- " + delta, "expected #{this} not to be close to " + expected + " +/- " + delta);
2123
- }
2124
- __name(closeTo, "closeTo");
2125
- Assertion.addMethod("closeTo", closeTo);
2126
- Assertion.addMethod("approximately", closeTo);
2127
- function isSubsetOf(_subset, _superset, cmp, contains, ordered) {
2128
- let superset = Array.from(_superset);
2129
- let subset = Array.from(_subset);
2130
- if (!contains) {
2131
- if (subset.length !== superset.length) return false;
2132
- superset = superset.slice();
2133
- }
2134
- return subset.every(function(elem, idx) {
2135
- if (ordered) return cmp ? cmp(elem, superset[idx]) : elem === superset[idx];
2136
- if (!cmp) {
2137
- let matchIdx = superset.indexOf(elem);
2138
- if (matchIdx === -1) return false;
2139
- if (!contains) superset.splice(matchIdx, 1);
2140
- return true;
2141
- }
2142
- return superset.some(function(elem2, matchIdx) {
2143
- if (!cmp(elem, elem2)) return false;
2144
- if (!contains) superset.splice(matchIdx, 1);
2145
- return true;
2146
- });
2147
- });
2148
- }
2149
- __name(isSubsetOf, "isSubsetOf");
2150
- Assertion.addMethod("members", function(subset, msg) {
2151
- if (msg) flag2(this, "message", msg);
2152
- let obj = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2153
- new Assertion(obj, flagMsg, ssfi, true).to.be.iterable;
2154
- new Assertion(subset, flagMsg, ssfi, true).to.be.iterable;
2155
- let contains = flag2(this, "contains");
2156
- let ordered = flag2(this, "ordered");
2157
- let subject, failMsg, failNegateMsg;
2158
- if (contains) {
2159
- subject = ordered ? "an ordered superset" : "a superset";
2160
- failMsg = "expected #{this} to be " + subject + " of #{exp}";
2161
- failNegateMsg = "expected #{this} to not be " + subject + " of #{exp}";
2162
- } else {
2163
- subject = ordered ? "ordered members" : "members";
2164
- failMsg = "expected #{this} to have the same " + subject + " as #{exp}";
2165
- failNegateMsg = "expected #{this} to not have the same " + subject + " as #{exp}";
2166
- }
2167
- let cmp = flag2(this, "deep") ? flag2(this, "eql") : void 0;
2168
- this.assert(isSubsetOf(subset, obj, cmp, contains, ordered), failMsg, failNegateMsg, subset, obj, true);
2169
- });
2170
- Assertion.addProperty("iterable", function(msg) {
2171
- if (msg) flag2(this, "message", msg);
2172
- let obj = flag2(this, "object");
2173
- this.assert(obj != void 0 && obj[Symbol.iterator], "expected #{this} to be an iterable", "expected #{this} to not be an iterable", obj);
2174
- });
2175
- function oneOf(list, msg) {
2176
- if (msg) flag2(this, "message", msg);
2177
- let expected = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi"), contains = flag2(this, "contains"), isDeep = flag2(this, "deep"), eql = flag2(this, "eql");
2178
- new Assertion(list, flagMsg, ssfi, true).to.be.an("array");
2179
- if (contains) this.assert(list.some(function(possibility) {
2180
- return expected.indexOf(possibility) > -1;
2181
- }), "expected #{this} to contain one of #{exp}", "expected #{this} to not contain one of #{exp}", list, expected);
2182
- else if (isDeep) this.assert(list.some(function(possibility) {
2183
- return eql(expected, possibility);
2184
- }), "expected #{this} to deeply equal one of #{exp}", "expected #{this} to deeply equal one of #{exp}", list, expected);
2185
- else this.assert(list.indexOf(expected) > -1, "expected #{this} to be one of #{exp}", "expected #{this} to not be one of #{exp}", list, expected);
2186
- }
2187
- __name(oneOf, "oneOf");
2188
- Assertion.addMethod("oneOf", oneOf);
2189
- function assertChanges(subject, prop, msg) {
2190
- if (msg) flag2(this, "message", msg);
2191
- let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2192
- new Assertion(fn, flagMsg, ssfi, true).is.a("function");
2193
- let initial;
2194
- if (!prop) {
2195
- new Assertion(subject, flagMsg, ssfi, true).is.a("function");
2196
- initial = subject();
2197
- } else {
2198
- new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
2199
- initial = subject[prop];
2200
- }
2201
- fn();
2202
- let final = prop === void 0 || prop === null ? subject() : subject[prop];
2203
- let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
2204
- flag2(this, "deltaMsgObj", msgObj);
2205
- flag2(this, "initialDeltaValue", initial);
2206
- flag2(this, "finalDeltaValue", final);
2207
- flag2(this, "deltaBehavior", "change");
2208
- flag2(this, "realDelta", final !== initial);
2209
- this.assert(initial !== final, "expected " + msgObj + " to change", "expected " + msgObj + " to not change");
2210
- }
2211
- __name(assertChanges, "assertChanges");
2212
- Assertion.addMethod("change", assertChanges);
2213
- Assertion.addMethod("changes", assertChanges);
2214
- function assertIncreases(subject, prop, msg) {
2215
- if (msg) flag2(this, "message", msg);
2216
- let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2217
- new Assertion(fn, flagMsg, ssfi, true).is.a("function");
2218
- let initial;
2219
- if (!prop) {
2220
- new Assertion(subject, flagMsg, ssfi, true).is.a("function");
2221
- initial = subject();
2222
- } else {
2223
- new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
2224
- initial = subject[prop];
2225
- }
2226
- new Assertion(initial, flagMsg, ssfi, true).is.a("number");
2227
- fn();
2228
- let final = prop === void 0 || prop === null ? subject() : subject[prop];
2229
- let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
2230
- flag2(this, "deltaMsgObj", msgObj);
2231
- flag2(this, "initialDeltaValue", initial);
2232
- flag2(this, "finalDeltaValue", final);
2233
- flag2(this, "deltaBehavior", "increase");
2234
- flag2(this, "realDelta", final - initial);
2235
- this.assert(final - initial > 0, "expected " + msgObj + " to increase", "expected " + msgObj + " to not increase");
2236
- }
2237
- __name(assertIncreases, "assertIncreases");
2238
- Assertion.addMethod("increase", assertIncreases);
2239
- Assertion.addMethod("increases", assertIncreases);
2240
- function assertDecreases(subject, prop, msg) {
2241
- if (msg) flag2(this, "message", msg);
2242
- let fn = flag2(this, "object"), flagMsg = flag2(this, "message"), ssfi = flag2(this, "ssfi");
2243
- new Assertion(fn, flagMsg, ssfi, true).is.a("function");
2244
- let initial;
2245
- if (!prop) {
2246
- new Assertion(subject, flagMsg, ssfi, true).is.a("function");
2247
- initial = subject();
2248
- } else {
2249
- new Assertion(subject, flagMsg, ssfi, true).to.have.property(prop);
2250
- initial = subject[prop];
2251
- }
2252
- new Assertion(initial, flagMsg, ssfi, true).is.a("number");
2253
- fn();
2254
- let final = prop === void 0 || prop === null ? subject() : subject[prop];
2255
- let msgObj = prop === void 0 || prop === null ? initial : "." + prop;
2256
- flag2(this, "deltaMsgObj", msgObj);
2257
- flag2(this, "initialDeltaValue", initial);
2258
- flag2(this, "finalDeltaValue", final);
2259
- flag2(this, "deltaBehavior", "decrease");
2260
- flag2(this, "realDelta", initial - final);
2261
- this.assert(final - initial < 0, "expected " + msgObj + " to decrease", "expected " + msgObj + " to not decrease");
2262
- }
2263
- __name(assertDecreases, "assertDecreases");
2264
- Assertion.addMethod("decrease", assertDecreases);
2265
- Assertion.addMethod("decreases", assertDecreases);
2266
- function assertDelta(delta, msg) {
2267
- if (msg) flag2(this, "message", msg);
2268
- let msgObj = flag2(this, "deltaMsgObj");
2269
- let initial = flag2(this, "initialDeltaValue");
2270
- let final = flag2(this, "finalDeltaValue");
2271
- let behavior = flag2(this, "deltaBehavior");
2272
- let realDelta = flag2(this, "realDelta");
2273
- let expression;
2274
- if (behavior === "change") expression = Math.abs(final - initial) === Math.abs(delta);
2275
- else expression = realDelta === Math.abs(delta);
2276
- this.assert(expression, "expected " + msgObj + " to " + behavior + " by " + delta, "expected " + msgObj + " to not " + behavior + " by " + delta);
2277
- }
2278
- __name(assertDelta, "assertDelta");
2279
- Assertion.addMethod("by", assertDelta);
2280
- Assertion.addProperty("extensible", function() {
2281
- let obj = flag2(this, "object");
2282
- let isExtensible = obj === Object(obj) && Object.isExtensible(obj);
2283
- this.assert(isExtensible, "expected #{this} to be extensible", "expected #{this} to not be extensible");
2284
- });
2285
- Assertion.addProperty("sealed", function() {
2286
- let obj = flag2(this, "object");
2287
- let isSealed = obj === Object(obj) ? Object.isSealed(obj) : true;
2288
- this.assert(isSealed, "expected #{this} to be sealed", "expected #{this} to not be sealed");
2289
- });
2290
- Assertion.addProperty("frozen", function() {
2291
- let obj = flag2(this, "object");
2292
- let isFrozen = obj === Object(obj) ? Object.isFrozen(obj) : true;
2293
- this.assert(isFrozen, "expected #{this} to be frozen", "expected #{this} to not be frozen");
2294
- });
2295
- Assertion.addProperty("finite", function(_msg) {
2296
- let obj = flag2(this, "object");
2297
- this.assert(typeof obj === "number" && isFinite(obj), "expected #{this} to be a finite number", "expected #{this} to not be a finite number");
2298
- });
2299
- function compareSubset(expected, actual) {
2300
- if (expected === actual) return true;
2301
- if (typeof actual !== typeof expected) return false;
2302
- if (typeof expected !== "object" || expected === null) return expected === actual;
2303
- if (!actual) return false;
2304
- if (Array.isArray(expected)) {
2305
- if (!Array.isArray(actual)) return false;
2306
- return expected.every(function(exp) {
2307
- return actual.some(function(act) {
2308
- return compareSubset(exp, act);
2309
- });
2310
- });
2311
- }
2312
- if (expected instanceof Date) if (actual instanceof Date) return expected.getTime() === actual.getTime();
2313
- else return false;
2314
- return Object.keys(expected).every(function(key) {
2315
- let expectedValue = expected[key];
2316
- let actualValue = actual[key];
2317
- if (typeof expectedValue === "object" && expectedValue !== null && actualValue !== null) return compareSubset(expectedValue, actualValue);
2318
- if (typeof expectedValue === "function") return expectedValue(actualValue);
2319
- return actualValue === expectedValue;
2320
- });
2321
- }
2322
- __name(compareSubset, "compareSubset");
2323
- Assertion.addMethod("containSubset", function(expected) {
2324
- const actual = flag(this, "object");
2325
- const showDiff = config.showDiff;
2326
- this.assert(compareSubset(expected, actual), "expected #{act} to contain subset #{exp}", "expected #{act} to not contain subset #{exp}", expected, actual, showDiff);
2327
- });
2328
- function expect(val, message) {
2329
- return new Assertion(val, message);
2330
- }
2331
- __name(expect, "expect");
2332
- expect.fail = function(actual, expected, message, operator) {
2333
- if (arguments.length < 2) {
2334
- message = actual;
2335
- actual = void 0;
2336
- }
2337
- message = message || "expect.fail()";
2338
- throw new AssertionError(message, {
2339
- actual,
2340
- expected,
2341
- operator
2342
- }, expect.fail);
2343
- };
2344
- var should_exports = {};
2345
- __export(should_exports, {
2346
- Should: () => Should,
2347
- should: () => should
2348
- });
2349
- function loadShould() {
2350
- function shouldGetter() {
2351
- if (this instanceof String || this instanceof Number || this instanceof Boolean || typeof Symbol === "function" && this instanceof Symbol || typeof BigInt === "function" && this instanceof BigInt) return new Assertion(this.valueOf(), null, shouldGetter);
2352
- return new Assertion(this, null, shouldGetter);
2353
- }
2354
- __name(shouldGetter, "shouldGetter");
2355
- function shouldSetter(value) {
2356
- Object.defineProperty(this, "should", {
2357
- value,
2358
- enumerable: true,
2359
- configurable: true,
2360
- writable: true
2361
- });
2362
- }
2363
- __name(shouldSetter, "shouldSetter");
2364
- Object.defineProperty(Object.prototype, "should", {
2365
- set: shouldSetter,
2366
- get: shouldGetter,
2367
- configurable: true
2368
- });
2369
- let should2 = {};
2370
- should2.fail = function(actual, expected, message, operator) {
2371
- if (arguments.length < 2) {
2372
- message = actual;
2373
- actual = void 0;
2374
- }
2375
- message = message || "should.fail()";
2376
- throw new AssertionError(message, {
2377
- actual,
2378
- expected,
2379
- operator
2380
- }, should2.fail);
2381
- };
2382
- should2.equal = function(actual, expected, message) {
2383
- new Assertion(actual, message).to.equal(expected);
2384
- };
2385
- should2.Throw = function(fn, errt, errs, msg) {
2386
- new Assertion(fn, msg).to.Throw(errt, errs);
2387
- };
2388
- should2.exist = function(val, msg) {
2389
- new Assertion(val, msg).to.exist;
2390
- };
2391
- should2.not = {};
2392
- should2.not.equal = function(actual, expected, msg) {
2393
- new Assertion(actual, msg).to.not.equal(expected);
2394
- };
2395
- should2.not.Throw = function(fn, errt, errs, msg) {
2396
- new Assertion(fn, msg).to.not.Throw(errt, errs);
2397
- };
2398
- should2.not.exist = function(val, msg) {
2399
- new Assertion(val, msg).to.not.exist;
2400
- };
2401
- should2["throw"] = should2["Throw"];
2402
- should2.not["throw"] = should2.not["Throw"];
2403
- return should2;
2404
- }
2405
- __name(loadShould, "loadShould");
2406
- var should = loadShould;
2407
- var Should = loadShould;
2408
- function assert(express, errmsg) {
2409
- new Assertion(null, null, assert, true).assert(express, errmsg, "[ negation message unavailable ]");
2410
- }
2411
- __name(assert, "assert");
2412
- assert.fail = function(actual, expected, message, operator) {
2413
- if (arguments.length < 2) {
2414
- message = actual;
2415
- actual = void 0;
2416
- }
2417
- message = message || "assert.fail()";
2418
- throw new AssertionError(message, {
2419
- actual,
2420
- expected,
2421
- operator
2422
- }, assert.fail);
2423
- };
2424
- assert.isOk = function(val, msg) {
2425
- new Assertion(val, msg, assert.isOk, true).is.ok;
2426
- };
2427
- assert.isNotOk = function(val, msg) {
2428
- new Assertion(val, msg, assert.isNotOk, true).is.not.ok;
2429
- };
2430
- assert.equal = function(act, exp, msg) {
2431
- let test2 = new Assertion(act, msg, assert.equal, true);
2432
- test2.assert(exp == flag(test2, "object"), "expected #{this} to equal #{exp}", "expected #{this} to not equal #{act}", exp, act, true);
2433
- };
2434
- assert.notEqual = function(act, exp, msg) {
2435
- let test2 = new Assertion(act, msg, assert.notEqual, true);
2436
- test2.assert(exp != flag(test2, "object"), "expected #{this} to not equal #{exp}", "expected #{this} to equal #{act}", exp, act, true);
2437
- };
2438
- assert.strictEqual = function(act, exp, msg) {
2439
- new Assertion(act, msg, assert.strictEqual, true).to.equal(exp);
2440
- };
2441
- assert.notStrictEqual = function(act, exp, msg) {
2442
- new Assertion(act, msg, assert.notStrictEqual, true).to.not.equal(exp);
2443
- };
2444
- assert.deepEqual = assert.deepStrictEqual = function(act, exp, msg) {
2445
- new Assertion(act, msg, assert.deepEqual, true).to.eql(exp);
2446
- };
2447
- assert.notDeepEqual = function(act, exp, msg) {
2448
- new Assertion(act, msg, assert.notDeepEqual, true).to.not.eql(exp);
2449
- };
2450
- assert.isAbove = function(val, abv, msg) {
2451
- new Assertion(val, msg, assert.isAbove, true).to.be.above(abv);
2452
- };
2453
- assert.isAtLeast = function(val, atlst, msg) {
2454
- new Assertion(val, msg, assert.isAtLeast, true).to.be.least(atlst);
2455
- };
2456
- assert.isBelow = function(val, blw, msg) {
2457
- new Assertion(val, msg, assert.isBelow, true).to.be.below(blw);
2458
- };
2459
- assert.isAtMost = function(val, atmst, msg) {
2460
- new Assertion(val, msg, assert.isAtMost, true).to.be.most(atmst);
2461
- };
2462
- assert.isTrue = function(val, msg) {
2463
- new Assertion(val, msg, assert.isTrue, true).is["true"];
2464
- };
2465
- assert.isNotTrue = function(val, msg) {
2466
- new Assertion(val, msg, assert.isNotTrue, true).to.not.equal(true);
2467
- };
2468
- assert.isFalse = function(val, msg) {
2469
- new Assertion(val, msg, assert.isFalse, true).is["false"];
2470
- };
2471
- assert.isNotFalse = function(val, msg) {
2472
- new Assertion(val, msg, assert.isNotFalse, true).to.not.equal(false);
2473
- };
2474
- assert.isNull = function(val, msg) {
2475
- new Assertion(val, msg, assert.isNull, true).to.equal(null);
2476
- };
2477
- assert.isNotNull = function(val, msg) {
2478
- new Assertion(val, msg, assert.isNotNull, true).to.not.equal(null);
2479
- };
2480
- assert.isNaN = function(val, msg) {
2481
- new Assertion(val, msg, assert.isNaN, true).to.be.NaN;
2482
- };
2483
- assert.isNotNaN = function(value, message) {
2484
- new Assertion(value, message, assert.isNotNaN, true).not.to.be.NaN;
2485
- };
2486
- assert.exists = function(val, msg) {
2487
- new Assertion(val, msg, assert.exists, true).to.exist;
2488
- };
2489
- assert.notExists = function(val, msg) {
2490
- new Assertion(val, msg, assert.notExists, true).to.not.exist;
2491
- };
2492
- assert.isUndefined = function(val, msg) {
2493
- new Assertion(val, msg, assert.isUndefined, true).to.equal(void 0);
2494
- };
2495
- assert.isDefined = function(val, msg) {
2496
- new Assertion(val, msg, assert.isDefined, true).to.not.equal(void 0);
2497
- };
2498
- assert.isCallable = function(value, message) {
2499
- new Assertion(value, message, assert.isCallable, true).is.callable;
2500
- };
2501
- assert.isNotCallable = function(value, message) {
2502
- new Assertion(value, message, assert.isNotCallable, true).is.not.callable;
2503
- };
2504
- assert.isObject = function(val, msg) {
2505
- new Assertion(val, msg, assert.isObject, true).to.be.a("object");
2506
- };
2507
- assert.isNotObject = function(val, msg) {
2508
- new Assertion(val, msg, assert.isNotObject, true).to.not.be.a("object");
2509
- };
2510
- assert.isArray = function(val, msg) {
2511
- new Assertion(val, msg, assert.isArray, true).to.be.an("array");
2512
- };
2513
- assert.isNotArray = function(val, msg) {
2514
- new Assertion(val, msg, assert.isNotArray, true).to.not.be.an("array");
2515
- };
2516
- assert.isString = function(val, msg) {
2517
- new Assertion(val, msg, assert.isString, true).to.be.a("string");
2518
- };
2519
- assert.isNotString = function(val, msg) {
2520
- new Assertion(val, msg, assert.isNotString, true).to.not.be.a("string");
2521
- };
2522
- assert.isNumber = function(val, msg) {
2523
- new Assertion(val, msg, assert.isNumber, true).to.be.a("number");
2524
- };
2525
- assert.isNotNumber = function(val, msg) {
2526
- new Assertion(val, msg, assert.isNotNumber, true).to.not.be.a("number");
2527
- };
2528
- assert.isNumeric = function(val, msg) {
2529
- new Assertion(val, msg, assert.isNumeric, true).is.numeric;
2530
- };
2531
- assert.isNotNumeric = function(val, msg) {
2532
- new Assertion(val, msg, assert.isNotNumeric, true).is.not.numeric;
2533
- };
2534
- assert.isFinite = function(val, msg) {
2535
- new Assertion(val, msg, assert.isFinite, true).to.be.finite;
2536
- };
2537
- assert.isBoolean = function(val, msg) {
2538
- new Assertion(val, msg, assert.isBoolean, true).to.be.a("boolean");
2539
- };
2540
- assert.isNotBoolean = function(val, msg) {
2541
- new Assertion(val, msg, assert.isNotBoolean, true).to.not.be.a("boolean");
2542
- };
2543
- assert.typeOf = function(val, type3, msg) {
2544
- new Assertion(val, msg, assert.typeOf, true).to.be.a(type3);
2545
- };
2546
- assert.notTypeOf = function(value, type3, message) {
2547
- new Assertion(value, message, assert.notTypeOf, true).to.not.be.a(type3);
2548
- };
2549
- assert.instanceOf = function(val, type3, msg) {
2550
- new Assertion(val, msg, assert.instanceOf, true).to.be.instanceOf(type3);
2551
- };
2552
- assert.notInstanceOf = function(val, type3, msg) {
2553
- new Assertion(val, msg, assert.notInstanceOf, true).to.not.be.instanceOf(type3);
2554
- };
2555
- assert.include = function(exp, inc, msg) {
2556
- new Assertion(exp, msg, assert.include, true).include(inc);
2557
- };
2558
- assert.notInclude = function(exp, inc, msg) {
2559
- new Assertion(exp, msg, assert.notInclude, true).not.include(inc);
2560
- };
2561
- assert.deepInclude = function(exp, inc, msg) {
2562
- new Assertion(exp, msg, assert.deepInclude, true).deep.include(inc);
2563
- };
2564
- assert.notDeepInclude = function(exp, inc, msg) {
2565
- new Assertion(exp, msg, assert.notDeepInclude, true).not.deep.include(inc);
2566
- };
2567
- assert.nestedInclude = function(exp, inc, msg) {
2568
- new Assertion(exp, msg, assert.nestedInclude, true).nested.include(inc);
2569
- };
2570
- assert.notNestedInclude = function(exp, inc, msg) {
2571
- new Assertion(exp, msg, assert.notNestedInclude, true).not.nested.include(inc);
2572
- };
2573
- assert.deepNestedInclude = function(exp, inc, msg) {
2574
- new Assertion(exp, msg, assert.deepNestedInclude, true).deep.nested.include(inc);
2575
- };
2576
- assert.notDeepNestedInclude = function(exp, inc, msg) {
2577
- new Assertion(exp, msg, assert.notDeepNestedInclude, true).not.deep.nested.include(inc);
2578
- };
2579
- assert.ownInclude = function(exp, inc, msg) {
2580
- new Assertion(exp, msg, assert.ownInclude, true).own.include(inc);
2581
- };
2582
- assert.notOwnInclude = function(exp, inc, msg) {
2583
- new Assertion(exp, msg, assert.notOwnInclude, true).not.own.include(inc);
2584
- };
2585
- assert.deepOwnInclude = function(exp, inc, msg) {
2586
- new Assertion(exp, msg, assert.deepOwnInclude, true).deep.own.include(inc);
2587
- };
2588
- assert.notDeepOwnInclude = function(exp, inc, msg) {
2589
- new Assertion(exp, msg, assert.notDeepOwnInclude, true).not.deep.own.include(inc);
2590
- };
2591
- assert.match = function(exp, re, msg) {
2592
- new Assertion(exp, msg, assert.match, true).to.match(re);
2593
- };
2594
- assert.notMatch = function(exp, re, msg) {
2595
- new Assertion(exp, msg, assert.notMatch, true).to.not.match(re);
2596
- };
2597
- assert.property = function(obj, prop, msg) {
2598
- new Assertion(obj, msg, assert.property, true).to.have.property(prop);
2599
- };
2600
- assert.notProperty = function(obj, prop, msg) {
2601
- new Assertion(obj, msg, assert.notProperty, true).to.not.have.property(prop);
2602
- };
2603
- assert.propertyVal = function(obj, prop, val, msg) {
2604
- new Assertion(obj, msg, assert.propertyVal, true).to.have.property(prop, val);
2605
- };
2606
- assert.notPropertyVal = function(obj, prop, val, msg) {
2607
- new Assertion(obj, msg, assert.notPropertyVal, true).to.not.have.property(prop, val);
2608
- };
2609
- assert.deepPropertyVal = function(obj, prop, val, msg) {
2610
- new Assertion(obj, msg, assert.deepPropertyVal, true).to.have.deep.property(prop, val);
2611
- };
2612
- assert.notDeepPropertyVal = function(obj, prop, val, msg) {
2613
- new Assertion(obj, msg, assert.notDeepPropertyVal, true).to.not.have.deep.property(prop, val);
2614
- };
2615
- assert.ownProperty = function(obj, prop, msg) {
2616
- new Assertion(obj, msg, assert.ownProperty, true).to.have.own.property(prop);
2617
- };
2618
- assert.notOwnProperty = function(obj, prop, msg) {
2619
- new Assertion(obj, msg, assert.notOwnProperty, true).to.not.have.own.property(prop);
2620
- };
2621
- assert.ownPropertyVal = function(obj, prop, value, msg) {
2622
- new Assertion(obj, msg, assert.ownPropertyVal, true).to.have.own.property(prop, value);
2623
- };
2624
- assert.notOwnPropertyVal = function(obj, prop, value, msg) {
2625
- new Assertion(obj, msg, assert.notOwnPropertyVal, true).to.not.have.own.property(prop, value);
2626
- };
2627
- assert.deepOwnPropertyVal = function(obj, prop, value, msg) {
2628
- new Assertion(obj, msg, assert.deepOwnPropertyVal, true).to.have.deep.own.property(prop, value);
2629
- };
2630
- assert.notDeepOwnPropertyVal = function(obj, prop, value, msg) {
2631
- new Assertion(obj, msg, assert.notDeepOwnPropertyVal, true).to.not.have.deep.own.property(prop, value);
2632
- };
2633
- assert.nestedProperty = function(obj, prop, msg) {
2634
- new Assertion(obj, msg, assert.nestedProperty, true).to.have.nested.property(prop);
2635
- };
2636
- assert.notNestedProperty = function(obj, prop, msg) {
2637
- new Assertion(obj, msg, assert.notNestedProperty, true).to.not.have.nested.property(prop);
2638
- };
2639
- assert.nestedPropertyVal = function(obj, prop, val, msg) {
2640
- new Assertion(obj, msg, assert.nestedPropertyVal, true).to.have.nested.property(prop, val);
2641
- };
2642
- assert.notNestedPropertyVal = function(obj, prop, val, msg) {
2643
- new Assertion(obj, msg, assert.notNestedPropertyVal, true).to.not.have.nested.property(prop, val);
2644
- };
2645
- assert.deepNestedPropertyVal = function(obj, prop, val, msg) {
2646
- new Assertion(obj, msg, assert.deepNestedPropertyVal, true).to.have.deep.nested.property(prop, val);
2647
- };
2648
- assert.notDeepNestedPropertyVal = function(obj, prop, val, msg) {
2649
- new Assertion(obj, msg, assert.notDeepNestedPropertyVal, true).to.not.have.deep.nested.property(prop, val);
2650
- };
2651
- assert.lengthOf = function(exp, len, msg) {
2652
- new Assertion(exp, msg, assert.lengthOf, true).to.have.lengthOf(len);
2653
- };
2654
- assert.hasAnyKeys = function(obj, keys, msg) {
2655
- new Assertion(obj, msg, assert.hasAnyKeys, true).to.have.any.keys(keys);
2656
- };
2657
- assert.hasAllKeys = function(obj, keys, msg) {
2658
- new Assertion(obj, msg, assert.hasAllKeys, true).to.have.all.keys(keys);
2659
- };
2660
- assert.containsAllKeys = function(obj, keys, msg) {
2661
- new Assertion(obj, msg, assert.containsAllKeys, true).to.contain.all.keys(keys);
2662
- };
2663
- assert.doesNotHaveAnyKeys = function(obj, keys, msg) {
2664
- new Assertion(obj, msg, assert.doesNotHaveAnyKeys, true).to.not.have.any.keys(keys);
2665
- };
2666
- assert.doesNotHaveAllKeys = function(obj, keys, msg) {
2667
- new Assertion(obj, msg, assert.doesNotHaveAllKeys, true).to.not.have.all.keys(keys);
2668
- };
2669
- assert.hasAnyDeepKeys = function(obj, keys, msg) {
2670
- new Assertion(obj, msg, assert.hasAnyDeepKeys, true).to.have.any.deep.keys(keys);
2671
- };
2672
- assert.hasAllDeepKeys = function(obj, keys, msg) {
2673
- new Assertion(obj, msg, assert.hasAllDeepKeys, true).to.have.all.deep.keys(keys);
2674
- };
2675
- assert.containsAllDeepKeys = function(obj, keys, msg) {
2676
- new Assertion(obj, msg, assert.containsAllDeepKeys, true).to.contain.all.deep.keys(keys);
2677
- };
2678
- assert.doesNotHaveAnyDeepKeys = function(obj, keys, msg) {
2679
- new Assertion(obj, msg, assert.doesNotHaveAnyDeepKeys, true).to.not.have.any.deep.keys(keys);
2680
- };
2681
- assert.doesNotHaveAllDeepKeys = function(obj, keys, msg) {
2682
- new Assertion(obj, msg, assert.doesNotHaveAllDeepKeys, true).to.not.have.all.deep.keys(keys);
2683
- };
2684
- assert.throws = function(fn, errorLike, errMsgMatcher, msg) {
2685
- if ("string" === typeof errorLike || errorLike instanceof RegExp) {
2686
- errMsgMatcher = errorLike;
2687
- errorLike = null;
2688
- }
2689
- return flag(new Assertion(fn, msg, assert.throws, true).to.throw(errorLike, errMsgMatcher), "object");
2690
- };
2691
- assert.doesNotThrow = function(fn, errorLike, errMsgMatcher, message) {
2692
- if ("string" === typeof errorLike || errorLike instanceof RegExp) {
2693
- errMsgMatcher = errorLike;
2694
- errorLike = null;
2695
- }
2696
- new Assertion(fn, message, assert.doesNotThrow, true).to.not.throw(errorLike, errMsgMatcher);
2697
- };
2698
- assert.operator = function(val, operator, val2, msg) {
2699
- let ok;
2700
- switch (operator) {
2701
- case "==":
2702
- ok = val == val2;
2703
- break;
2704
- case "===":
2705
- ok = val === val2;
2706
- break;
2707
- case ">":
2708
- ok = val > val2;
2709
- break;
2710
- case ">=":
2711
- ok = val >= val2;
2712
- break;
2713
- case "<":
2714
- ok = val < val2;
2715
- break;
2716
- case "<=":
2717
- ok = val <= val2;
2718
- break;
2719
- case "!=":
2720
- ok = val != val2;
2721
- break;
2722
- case "!==":
2723
- ok = val !== val2;
2724
- break;
2725
- default:
2726
- msg = msg ? msg + ": " : msg;
2727
- throw new AssertionError(msg + "Invalid operator \"" + operator + "\"", void 0, assert.operator);
2728
- }
2729
- let test2 = new Assertion(ok, msg, assert.operator, true);
2730
- test2.assert(true === flag(test2, "object"), "expected " + inspect2(val) + " to be " + operator + " " + inspect2(val2), "expected " + inspect2(val) + " to not be " + operator + " " + inspect2(val2));
2731
- };
2732
- assert.closeTo = function(act, exp, delta, msg) {
2733
- new Assertion(act, msg, assert.closeTo, true).to.be.closeTo(exp, delta);
2734
- };
2735
- assert.approximately = function(act, exp, delta, msg) {
2736
- new Assertion(act, msg, assert.approximately, true).to.be.approximately(exp, delta);
2737
- };
2738
- assert.sameMembers = function(set1, set2, msg) {
2739
- new Assertion(set1, msg, assert.sameMembers, true).to.have.same.members(set2);
2740
- };
2741
- assert.notSameMembers = function(set1, set2, msg) {
2742
- new Assertion(set1, msg, assert.notSameMembers, true).to.not.have.same.members(set2);
2743
- };
2744
- assert.sameDeepMembers = function(set1, set2, msg) {
2745
- new Assertion(set1, msg, assert.sameDeepMembers, true).to.have.same.deep.members(set2);
2746
- };
2747
- assert.notSameDeepMembers = function(set1, set2, msg) {
2748
- new Assertion(set1, msg, assert.notSameDeepMembers, true).to.not.have.same.deep.members(set2);
2749
- };
2750
- assert.sameOrderedMembers = function(set1, set2, msg) {
2751
- new Assertion(set1, msg, assert.sameOrderedMembers, true).to.have.same.ordered.members(set2);
2752
- };
2753
- assert.notSameOrderedMembers = function(set1, set2, msg) {
2754
- new Assertion(set1, msg, assert.notSameOrderedMembers, true).to.not.have.same.ordered.members(set2);
2755
- };
2756
- assert.sameDeepOrderedMembers = function(set1, set2, msg) {
2757
- new Assertion(set1, msg, assert.sameDeepOrderedMembers, true).to.have.same.deep.ordered.members(set2);
2758
- };
2759
- assert.notSameDeepOrderedMembers = function(set1, set2, msg) {
2760
- new Assertion(set1, msg, assert.notSameDeepOrderedMembers, true).to.not.have.same.deep.ordered.members(set2);
2761
- };
2762
- assert.includeMembers = function(superset, subset, msg) {
2763
- new Assertion(superset, msg, assert.includeMembers, true).to.include.members(subset);
2764
- };
2765
- assert.notIncludeMembers = function(superset, subset, msg) {
2766
- new Assertion(superset, msg, assert.notIncludeMembers, true).to.not.include.members(subset);
2767
- };
2768
- assert.includeDeepMembers = function(superset, subset, msg) {
2769
- new Assertion(superset, msg, assert.includeDeepMembers, true).to.include.deep.members(subset);
2770
- };
2771
- assert.notIncludeDeepMembers = function(superset, subset, msg) {
2772
- new Assertion(superset, msg, assert.notIncludeDeepMembers, true).to.not.include.deep.members(subset);
2773
- };
2774
- assert.includeOrderedMembers = function(superset, subset, msg) {
2775
- new Assertion(superset, msg, assert.includeOrderedMembers, true).to.include.ordered.members(subset);
2776
- };
2777
- assert.notIncludeOrderedMembers = function(superset, subset, msg) {
2778
- new Assertion(superset, msg, assert.notIncludeOrderedMembers, true).to.not.include.ordered.members(subset);
2779
- };
2780
- assert.includeDeepOrderedMembers = function(superset, subset, msg) {
2781
- new Assertion(superset, msg, assert.includeDeepOrderedMembers, true).to.include.deep.ordered.members(subset);
2782
- };
2783
- assert.notIncludeDeepOrderedMembers = function(superset, subset, msg) {
2784
- new Assertion(superset, msg, assert.notIncludeDeepOrderedMembers, true).to.not.include.deep.ordered.members(subset);
2785
- };
2786
- assert.oneOf = function(inList, list, msg) {
2787
- new Assertion(inList, msg, assert.oneOf, true).to.be.oneOf(list);
2788
- };
2789
- assert.isIterable = function(obj, msg) {
2790
- if (obj == void 0 || !obj[Symbol.iterator]) {
2791
- msg = msg ? `${msg} expected ${inspect2(obj)} to be an iterable` : `expected ${inspect2(obj)} to be an iterable`;
2792
- throw new AssertionError(msg, void 0, assert.isIterable);
2793
- }
2794
- };
2795
- assert.changes = function(fn, obj, prop, msg) {
2796
- if (arguments.length === 3 && typeof obj === "function") {
2797
- msg = prop;
2798
- prop = null;
2799
- }
2800
- new Assertion(fn, msg, assert.changes, true).to.change(obj, prop);
2801
- };
2802
- assert.changesBy = function(fn, obj, prop, delta, msg) {
2803
- if (arguments.length === 4 && typeof obj === "function") {
2804
- let tmpMsg = delta;
2805
- delta = prop;
2806
- msg = tmpMsg;
2807
- } else if (arguments.length === 3) {
2808
- delta = prop;
2809
- prop = null;
2810
- }
2811
- new Assertion(fn, msg, assert.changesBy, true).to.change(obj, prop).by(delta);
2812
- };
2813
- assert.doesNotChange = function(fn, obj, prop, msg) {
2814
- if (arguments.length === 3 && typeof obj === "function") {
2815
- msg = prop;
2816
- prop = null;
2817
- }
2818
- return new Assertion(fn, msg, assert.doesNotChange, true).to.not.change(obj, prop);
2819
- };
2820
- assert.changesButNotBy = function(fn, obj, prop, delta, msg) {
2821
- if (arguments.length === 4 && typeof obj === "function") {
2822
- let tmpMsg = delta;
2823
- delta = prop;
2824
- msg = tmpMsg;
2825
- } else if (arguments.length === 3) {
2826
- delta = prop;
2827
- prop = null;
2828
- }
2829
- new Assertion(fn, msg, assert.changesButNotBy, true).to.change(obj, prop).but.not.by(delta);
2830
- };
2831
- assert.increases = function(fn, obj, prop, msg) {
2832
- if (arguments.length === 3 && typeof obj === "function") {
2833
- msg = prop;
2834
- prop = null;
2835
- }
2836
- return new Assertion(fn, msg, assert.increases, true).to.increase(obj, prop);
2837
- };
2838
- assert.increasesBy = function(fn, obj, prop, delta, msg) {
2839
- if (arguments.length === 4 && typeof obj === "function") {
2840
- let tmpMsg = delta;
2841
- delta = prop;
2842
- msg = tmpMsg;
2843
- } else if (arguments.length === 3) {
2844
- delta = prop;
2845
- prop = null;
2846
- }
2847
- new Assertion(fn, msg, assert.increasesBy, true).to.increase(obj, prop).by(delta);
2848
- };
2849
- assert.doesNotIncrease = function(fn, obj, prop, msg) {
2850
- if (arguments.length === 3 && typeof obj === "function") {
2851
- msg = prop;
2852
- prop = null;
2853
- }
2854
- return new Assertion(fn, msg, assert.doesNotIncrease, true).to.not.increase(obj, prop);
2855
- };
2856
- assert.increasesButNotBy = function(fn, obj, prop, delta, msg) {
2857
- if (arguments.length === 4 && typeof obj === "function") {
2858
- let tmpMsg = delta;
2859
- delta = prop;
2860
- msg = tmpMsg;
2861
- } else if (arguments.length === 3) {
2862
- delta = prop;
2863
- prop = null;
2864
- }
2865
- new Assertion(fn, msg, assert.increasesButNotBy, true).to.increase(obj, prop).but.not.by(delta);
2866
- };
2867
- assert.decreases = function(fn, obj, prop, msg) {
2868
- if (arguments.length === 3 && typeof obj === "function") {
2869
- msg = prop;
2870
- prop = null;
2871
- }
2872
- return new Assertion(fn, msg, assert.decreases, true).to.decrease(obj, prop);
2873
- };
2874
- assert.decreasesBy = function(fn, obj, prop, delta, msg) {
2875
- if (arguments.length === 4 && typeof obj === "function") {
2876
- let tmpMsg = delta;
2877
- delta = prop;
2878
- msg = tmpMsg;
2879
- } else if (arguments.length === 3) {
2880
- delta = prop;
2881
- prop = null;
2882
- }
2883
- new Assertion(fn, msg, assert.decreasesBy, true).to.decrease(obj, prop).by(delta);
2884
- };
2885
- assert.doesNotDecrease = function(fn, obj, prop, msg) {
2886
- if (arguments.length === 3 && typeof obj === "function") {
2887
- msg = prop;
2888
- prop = null;
2889
- }
2890
- return new Assertion(fn, msg, assert.doesNotDecrease, true).to.not.decrease(obj, prop);
2891
- };
2892
- assert.doesNotDecreaseBy = function(fn, obj, prop, delta, msg) {
2893
- if (arguments.length === 4 && typeof obj === "function") {
2894
- let tmpMsg = delta;
2895
- delta = prop;
2896
- msg = tmpMsg;
2897
- } else if (arguments.length === 3) {
2898
- delta = prop;
2899
- prop = null;
2900
- }
2901
- return new Assertion(fn, msg, assert.doesNotDecreaseBy, true).to.not.decrease(obj, prop).by(delta);
2902
- };
2903
- assert.decreasesButNotBy = function(fn, obj, prop, delta, msg) {
2904
- if (arguments.length === 4 && typeof obj === "function") {
2905
- let tmpMsg = delta;
2906
- delta = prop;
2907
- msg = tmpMsg;
2908
- } else if (arguments.length === 3) {
2909
- delta = prop;
2910
- prop = null;
2911
- }
2912
- new Assertion(fn, msg, assert.decreasesButNotBy, true).to.decrease(obj, prop).but.not.by(delta);
2913
- };
2914
- assert.ifError = function(val) {
2915
- if (val) throw val;
2916
- };
2917
- assert.isExtensible = function(obj, msg) {
2918
- new Assertion(obj, msg, assert.isExtensible, true).to.be.extensible;
2919
- };
2920
- assert.isNotExtensible = function(obj, msg) {
2921
- new Assertion(obj, msg, assert.isNotExtensible, true).to.not.be.extensible;
2922
- };
2923
- assert.isSealed = function(obj, msg) {
2924
- new Assertion(obj, msg, assert.isSealed, true).to.be.sealed;
2925
- };
2926
- assert.isNotSealed = function(obj, msg) {
2927
- new Assertion(obj, msg, assert.isNotSealed, true).to.not.be.sealed;
2928
- };
2929
- assert.isFrozen = function(obj, msg) {
2930
- new Assertion(obj, msg, assert.isFrozen, true).to.be.frozen;
2931
- };
2932
- assert.isNotFrozen = function(obj, msg) {
2933
- new Assertion(obj, msg, assert.isNotFrozen, true).to.not.be.frozen;
2934
- };
2935
- assert.isEmpty = function(val, msg) {
2936
- new Assertion(val, msg, assert.isEmpty, true).to.be.empty;
2937
- };
2938
- assert.isNotEmpty = function(val, msg) {
2939
- new Assertion(val, msg, assert.isNotEmpty, true).to.not.be.empty;
2940
- };
2941
- assert.containsSubset = function(val, exp, msg) {
2942
- new Assertion(val, msg).to.containSubset(exp);
2943
- };
2944
- assert.doesNotContainSubset = function(val, exp, msg) {
2945
- new Assertion(val, msg).to.not.containSubset(exp);
2946
- };
2947
- for (const [name, as] of [
2948
- ["isOk", "ok"],
2949
- ["isNotOk", "notOk"],
2950
- ["throws", "throw"],
2951
- ["throws", "Throw"],
2952
- ["isExtensible", "extensible"],
2953
- ["isNotExtensible", "notExtensible"],
2954
- ["isSealed", "sealed"],
2955
- ["isNotSealed", "notSealed"],
2956
- ["isFrozen", "frozen"],
2957
- ["isNotFrozen", "notFrozen"],
2958
- ["isEmpty", "empty"],
2959
- ["isNotEmpty", "notEmpty"],
2960
- ["isCallable", "isFunction"],
2961
- ["isNotCallable", "isNotFunction"],
2962
- ["containsSubset", "containSubset"]
2963
- ]) assert[as] = assert[name];
2964
- var used = [];
2965
- function use(fn) {
2966
- const exports = {
2967
- use,
2968
- AssertionError,
2969
- util: utils_exports,
2970
- config,
2971
- expect,
2972
- assert,
2973
- Assertion,
2974
- ...should_exports
2975
- };
2976
- if (!~used.indexOf(fn)) {
2977
- fn(exports, utils_exports);
2978
- used.push(fn);
2979
- }
2980
- return exports;
2981
- }
2982
- __name(use, "use");
2983
- //#endregion
2984
- export { Assertion, AssertionError, Should, assert, chai_exports, config, expect, should, use, utils_exports as util };
2985
-
2986
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbm9kZV9tb2R1bGVzLy5wbnBtL2NoYWlANi4yLjIvbm9kZV9tb2R1bGVzL2NoYWkvaW5kZXguanMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZGVmUHJvcCA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcbnZhciBfX2RlZk5vcm1hbFByb3AgPSAob2JqLCBrZXksIHZhbHVlKSA9PiBrZXkgaW4gb2JqID8gX19kZWZQcm9wKG9iaiwga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgd3JpdGFibGU6IHRydWUsIHZhbHVlIH0pIDogb2JqW2tleV0gPSB2YWx1ZTtcbnZhciBfX25hbWUgPSAodGFyZ2V0LCB2YWx1ZSkgPT4gX19kZWZQcm9wKHRhcmdldCwgXCJuYW1lXCIsIHsgdmFsdWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSB9KTtcbnZhciBfX2V4cG9ydCA9ICh0YXJnZXQsIGFsbCkgPT4ge1xuICBmb3IgKHZhciBuYW1lIGluIGFsbClcbiAgICBfX2RlZlByb3AodGFyZ2V0LCBuYW1lLCB7IGdldDogYWxsW25hbWVdLCBlbnVtZXJhYmxlOiB0cnVlIH0pO1xufTtcbnZhciBfX3B1YmxpY0ZpZWxkID0gKG9iaiwga2V5LCB2YWx1ZSkgPT4gX19kZWZOb3JtYWxQcm9wKG9iaiwgdHlwZW9mIGtleSAhPT0gXCJzeW1ib2xcIiA/IGtleSArIFwiXCIgOiBrZXksIHZhbHVlKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaW5kZXguanNcbnZhciB1dGlsc19leHBvcnRzID0ge307XG5fX2V4cG9ydCh1dGlsc19leHBvcnRzLCB7XG4gIGFkZENoYWluYWJsZU1ldGhvZDogKCkgPT4gYWRkQ2hhaW5hYmxlTWV0aG9kLFxuICBhZGRMZW5ndGhHdWFyZDogKCkgPT4gYWRkTGVuZ3RoR3VhcmQsXG4gIGFkZE1ldGhvZDogKCkgPT4gYWRkTWV0aG9kLFxuICBhZGRQcm9wZXJ0eTogKCkgPT4gYWRkUHJvcGVydHksXG4gIGNoZWNrRXJyb3I6ICgpID0+IGNoZWNrX2Vycm9yX2V4cG9ydHMsXG4gIGNvbXBhcmVCeUluc3BlY3Q6ICgpID0+IGNvbXBhcmVCeUluc3BlY3QsXG4gIGVxbDogKCkgPT4gZGVlcF9lcWxfZGVmYXVsdCxcbiAgZXZlbnRzOiAoKSA9PiBldmVudHMsXG4gIGV4cGVjdFR5cGVzOiAoKSA9PiBleHBlY3RUeXBlcyxcbiAgZmxhZzogKCkgPT4gZmxhZyxcbiAgZ2V0QWN0dWFsOiAoKSA9PiBnZXRBY3R1YWwsXG4gIGdldE1lc3NhZ2U6ICgpID0+IGdldE1lc3NhZ2UyLFxuICBnZXROYW1lOiAoKSA9PiBnZXROYW1lLFxuICBnZXRPcGVyYXRvcjogKCkgPT4gZ2V0T3BlcmF0b3IsXG4gIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzOiAoKSA9PiBnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcyxcbiAgZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sczogKCkgPT4gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyxcbiAgZ2V0UGF0aEluZm86ICgpID0+IGdldFBhdGhJbmZvLFxuICBoYXNQcm9wZXJ0eTogKCkgPT4gaGFzUHJvcGVydHksXG4gIGluc3BlY3Q6ICgpID0+IGluc3BlY3QyLFxuICBpc05hTjogKCkgPT4gaXNOYU4yLFxuICBpc051bWVyaWM6ICgpID0+IGlzTnVtZXJpYyxcbiAgaXNQcm94eUVuYWJsZWQ6ICgpID0+IGlzUHJveHlFbmFibGVkLFxuICBpc1JlZ0V4cDogKCkgPT4gaXNSZWdFeHAyLFxuICBvYmpEaXNwbGF5OiAoKSA9PiBvYmpEaXNwbGF5LFxuICBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2Q6ICgpID0+IG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCxcbiAgb3ZlcndyaXRlTWV0aG9kOiAoKSA9PiBvdmVyd3JpdGVNZXRob2QsXG4gIG92ZXJ3cml0ZVByb3BlcnR5OiAoKSA9PiBvdmVyd3JpdGVQcm9wZXJ0eSxcbiAgcHJveGlmeTogKCkgPT4gcHJveGlmeSxcbiAgdGVzdDogKCkgPT4gdGVzdCxcbiAgdHJhbnNmZXJGbGFnczogKCkgPT4gdHJhbnNmZXJGbGFncyxcbiAgdHlwZTogKCkgPT4gdHlwZVxufSk7XG5cbi8vIG5vZGVfbW9kdWxlcy9jaGVjay1lcnJvci9pbmRleC5qc1xudmFyIGNoZWNrX2Vycm9yX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KGNoZWNrX2Vycm9yX2V4cG9ydHMsIHtcbiAgY29tcGF0aWJsZUNvbnN0cnVjdG9yOiAoKSA9PiBjb21wYXRpYmxlQ29uc3RydWN0b3IsXG4gIGNvbXBhdGlibGVJbnN0YW5jZTogKCkgPT4gY29tcGF0aWJsZUluc3RhbmNlLFxuICBjb21wYXRpYmxlTWVzc2FnZTogKCkgPT4gY29tcGF0aWJsZU1lc3NhZ2UsXG4gIGdldENvbnN0cnVjdG9yTmFtZTogKCkgPT4gZ2V0Q29uc3RydWN0b3JOYW1lLFxuICBnZXRNZXNzYWdlOiAoKSA9PiBnZXRNZXNzYWdlXG59KTtcbmZ1bmN0aW9uIGlzRXJyb3JJbnN0YW5jZShvYmopIHtcbiAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIEVycm9yIHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgRXJyb3JdXCI7XG59XG5fX25hbWUoaXNFcnJvckluc3RhbmNlLCBcImlzRXJyb3JJbnN0YW5jZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwKG9iaikge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBSZWdFeHBdXCI7XG59XG5fX25hbWUoaXNSZWdFeHAsIFwiaXNSZWdFeHBcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlSW5zdGFuY2UodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgcmV0dXJuIGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpICYmIHRocm93biA9PT0gZXJyb3JMaWtlO1xufVxuX19uYW1lKGNvbXBhdGlibGVJbnN0YW5jZSwgXCJjb21wYXRpYmxlSW5zdGFuY2VcIik7XG5mdW5jdGlvbiBjb21wYXRpYmxlQ29uc3RydWN0b3IodGhyb3duLCBlcnJvckxpa2UpIHtcbiAgaWYgKGlzRXJyb3JJbnN0YW5jZShlcnJvckxpa2UpKSB7XG4gICAgcmV0dXJuIHRocm93bi5jb25zdHJ1Y3RvciA9PT0gZXJyb3JMaWtlLmNvbnN0cnVjdG9yIHx8IHRocm93biBpbnN0YW5jZW9mIGVycm9yTGlrZS5jb25zdHJ1Y3RvcjtcbiAgfSBlbHNlIGlmICgodHlwZW9mIGVycm9yTGlrZSA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2YgZXJyb3JMaWtlID09PSBcImZ1bmN0aW9uXCIpICYmIGVycm9yTGlrZS5wcm90b3R5cGUpIHtcbiAgICByZXR1cm4gdGhyb3duLmNvbnN0cnVjdG9yID09PSBlcnJvckxpa2UgfHwgdGhyb3duIGluc3RhbmNlb2YgZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShjb21wYXRpYmxlQ29uc3RydWN0b3IsIFwiY29tcGF0aWJsZUNvbnN0cnVjdG9yXCIpO1xuZnVuY3Rpb24gY29tcGF0aWJsZU1lc3NhZ2UodGhyb3duLCBlcnJNYXRjaGVyKSB7XG4gIGNvbnN0IGNvbXBhcmlzb25TdHJpbmcgPSB0eXBlb2YgdGhyb3duID09PSBcInN0cmluZ1wiID8gdGhyb3duIDogdGhyb3duLm1lc3NhZ2U7XG4gIGlmIChpc1JlZ0V4cChlcnJNYXRjaGVyKSkge1xuICAgIHJldHVybiBlcnJNYXRjaGVyLnRlc3QoY29tcGFyaXNvblN0cmluZyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVyck1hdGNoZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gY29tcGFyaXNvblN0cmluZy5pbmRleE9mKGVyck1hdGNoZXIpICE9PSAtMTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5fX25hbWUoY29tcGF0aWJsZU1lc3NhZ2UsIFwiY29tcGF0aWJsZU1lc3NhZ2VcIik7XG5mdW5jdGlvbiBnZXRDb25zdHJ1Y3Rvck5hbWUoZXJyb3JMaWtlKSB7XG4gIGxldCBjb25zdHJ1Y3Rvck5hbWUgPSBlcnJvckxpa2U7XG4gIGlmIChpc0Vycm9ySW5zdGFuY2UoZXJyb3JMaWtlKSkge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5jb25zdHJ1Y3Rvci5uYW1lO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBlcnJvckxpa2UgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGNvbnN0cnVjdG9yTmFtZSA9IGVycm9yTGlrZS5uYW1lO1xuICAgIGlmIChjb25zdHJ1Y3Rvck5hbWUgPT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IG5ld0NvbnN0cnVjdG9yTmFtZSA9IG5ldyBlcnJvckxpa2UoKS5uYW1lO1xuICAgICAgY29uc3RydWN0b3JOYW1lID0gbmV3Q29uc3RydWN0b3JOYW1lIHx8IGNvbnN0cnVjdG9yTmFtZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnN0cnVjdG9yTmFtZTtcbn1cbl9fbmFtZShnZXRDb25zdHJ1Y3Rvck5hbWUsIFwiZ2V0Q29uc3RydWN0b3JOYW1lXCIpO1xuZnVuY3Rpb24gZ2V0TWVzc2FnZShlcnJvckxpa2UpIHtcbiAgbGV0IG1zZyA9IFwiXCI7XG4gIGlmIChlcnJvckxpa2UgJiYgZXJyb3JMaWtlLm1lc3NhZ2UpIHtcbiAgICBtc2cgPSBlcnJvckxpa2UubWVzc2FnZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXJyb3JMaWtlID09PSBcInN0cmluZ1wiKSB7XG4gICAgbXNnID0gZXJyb3JMaWtlO1xuICB9XG4gIHJldHVybiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZSwgXCJnZXRNZXNzYWdlXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9mbGFnLmpzXG5mdW5jdGlvbiBmbGFnKG9iaiwga2V5LCB2YWx1ZSkge1xuICBsZXQgZmxhZ3MgPSBvYmouX19mbGFncyB8fCAob2JqLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZmxhZ3Nba2V5XSA9IHZhbHVlO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmbGFnc1trZXldO1xuICB9XG59XG5fX25hbWUoZmxhZywgXCJmbGFnXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy90ZXN0LmpzXG5mdW5jdGlvbiB0ZXN0KG9iaiwgYXJncykge1xuICBsZXQgbmVnYXRlID0gZmxhZyhvYmosIFwibmVnYXRlXCIpLCBleHByID0gYXJnc1swXTtcbiAgcmV0dXJuIG5lZ2F0ZSA/ICFleHByIDogZXhwcjtcbn1cbl9fbmFtZSh0ZXN0LCBcInRlc3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL3R5cGUtZGV0ZWN0LmpzXG5mdW5jdGlvbiB0eXBlKG9iaikge1xuICBpZiAodHlwZW9mIG9iaiA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIHJldHVybiBcInVuZGVmaW5lZFwiO1xuICB9XG4gIGlmIChvYmogPT09IG51bGwpIHtcbiAgICByZXR1cm4gXCJudWxsXCI7XG4gIH1cbiAgY29uc3Qgc3RyaW5nVGFnID0gb2JqW1N5bWJvbC50b1N0cmluZ1RhZ107XG4gIGlmICh0eXBlb2Ygc3RyaW5nVGFnID09PSBcInN0cmluZ1wiKSB7XG4gICAgcmV0dXJuIHN0cmluZ1RhZztcbiAgfVxuICBjb25zdCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopLnNsaWNlKDgsIC0xKTtcbiAgcmV0dXJuIHR5cGUzO1xufVxuX19uYW1lKHR5cGUsIFwidHlwZVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2Fzc2VydGlvbi1lcnJvci9pbmRleC5qc1xudmFyIGNhbkVsaWRlRnJhbWVzID0gXCJjYXB0dXJlU3RhY2tUcmFjZVwiIGluIEVycm9yO1xudmFyIF9Bc3NlcnRpb25FcnJvciA9IGNsYXNzIF9Bc3NlcnRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZSA9IFwiVW5zcGVjaWZpZWQgQXNzZXJ0aW9uRXJyb3JcIiwgcHJvcHMsIHNzZikge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIF9fcHVibGljRmllbGQodGhpcywgXCJtZXNzYWdlXCIpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgaWYgKGNhbkVsaWRlRnJhbWVzKSB7XG4gICAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBzc2YgfHwgX0Fzc2VydGlvbkVycm9yKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgaW4gcHJvcHMpIHtcbiAgICAgIGlmICghKGtleSBpbiB0aGlzKSkge1xuICAgICAgICB0aGlzW2tleV0gPSBwcm9wc1trZXldO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBnZXQgbmFtZSgpIHtcbiAgICByZXR1cm4gXCJBc3NlcnRpb25FcnJvclwiO1xuICB9XG4gIGdldCBvaygpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgdG9KU09OKHN0YWNrKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMsXG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBvazogZmFsc2UsXG4gICAgICBzdGFjazogc3RhY2sgIT09IGZhbHNlID8gdGhpcy5zdGFjayA6IHZvaWQgMFxuICAgIH07XG4gIH1cbn07XG5fX25hbWUoX0Fzc2VydGlvbkVycm9yLCBcIkFzc2VydGlvbkVycm9yXCIpO1xudmFyIEFzc2VydGlvbkVycm9yID0gX0Fzc2VydGlvbkVycm9yO1xuXG4vLyBsaWIvY2hhaS91dGlscy9leHBlY3RUeXBlcy5qc1xuZnVuY3Rpb24gZXhwZWN0VHlwZXMob2JqLCB0eXBlcykge1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGxldCBzc2ZpID0gZmxhZyhvYmosIFwic3NmaVwiKTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgb2JqID0gZmxhZyhvYmosIFwib2JqZWN0XCIpO1xuICB0eXBlcyA9IHR5cGVzLm1hcChmdW5jdGlvbih0KSB7XG4gICAgcmV0dXJuIHQudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG4gIHR5cGVzLnNvcnQoKTtcbiAgbGV0IHN0ciA9IHR5cGVzLm1hcChmdW5jdGlvbih0LCBpbmRleCkge1xuICAgIGxldCBhcnQgPSB+W1wiYVwiLCBcImVcIiwgXCJpXCIsIFwib1wiLCBcInVcIl0uaW5kZXhPZih0LmNoYXJBdCgwKSkgPyBcImFuXCIgOiBcImFcIjtcbiAgICBsZXQgb3IgPSB0eXBlcy5sZW5ndGggPiAxICYmIGluZGV4ID09PSB0eXBlcy5sZW5ndGggLSAxID8gXCJvciBcIiA6IFwiXCI7XG4gICAgcmV0dXJuIG9yICsgYXJ0ICsgXCIgXCIgKyB0O1xuICB9KS5qb2luKFwiLCBcIik7XG4gIGxldCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCk7XG4gIGlmICghdHlwZXMuc29tZShmdW5jdGlvbihleHBlY3RlZCkge1xuICAgIHJldHVybiBvYmpUeXBlID09PSBleHBlY3RlZDtcbiAgfSkpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgXCJvYmplY3QgdGVzdGVkIG11c3QgYmUgXCIgKyBzdHIgKyBcIiwgYnV0IFwiICsgb2JqVHlwZSArIFwiIGdpdmVuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGV4cGVjdFR5cGVzLCBcImV4cGVjdFR5cGVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRBY3R1YWwuanNcbmZ1bmN0aW9uIGdldEFjdHVhbChvYmosIGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID4gNCA/IGFyZ3NbNF0gOiBvYmouX29iajtcbn1cbl9fbmFtZShnZXRBY3R1YWwsIFwiZ2V0QWN0dWFsXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2hlbHBlcnMuanNcbnZhciBhbnNpQ29sb3JzID0ge1xuICBib2xkOiBbXCIxXCIsIFwiMjJcIl0sXG4gIGRpbTogW1wiMlwiLCBcIjIyXCJdLFxuICBpdGFsaWM6IFtcIjNcIiwgXCIyM1wiXSxcbiAgdW5kZXJsaW5lOiBbXCI0XCIsIFwiMjRcIl0sXG4gIC8vIDUgJiA2IGFyZSBibGlua2luZ1xuICBpbnZlcnNlOiBbXCI3XCIsIFwiMjdcIl0sXG4gIGhpZGRlbjogW1wiOFwiLCBcIjI4XCJdLFxuICBzdHJpa2U6IFtcIjlcIiwgXCIyOVwiXSxcbiAgLy8gMTAtMjAgYXJlIGZvbnRzXG4gIC8vIDIxLTI5IGFyZSByZXNldHMgZm9yIDEtOVxuICBibGFjazogW1wiMzBcIiwgXCIzOVwiXSxcbiAgcmVkOiBbXCIzMVwiLCBcIjM5XCJdLFxuICBncmVlbjogW1wiMzJcIiwgXCIzOVwiXSxcbiAgeWVsbG93OiBbXCIzM1wiLCBcIjM5XCJdLFxuICBibHVlOiBbXCIzNFwiLCBcIjM5XCJdLFxuICBtYWdlbnRhOiBbXCIzNVwiLCBcIjM5XCJdLFxuICBjeWFuOiBbXCIzNlwiLCBcIjM5XCJdLFxuICB3aGl0ZTogW1wiMzdcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0YmxhY2s6IFtcIjMwOzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0cmVkOiBbXCIzMTsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodGdyZWVuOiBbXCIzMjsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodHllbGxvdzogW1wiMzM7MVwiLCBcIjM5XCJdLFxuICBicmlnaHRibHVlOiBbXCIzNDsxXCIsIFwiMzlcIl0sXG4gIGJyaWdodG1hZ2VudGE6IFtcIjM1OzFcIiwgXCIzOVwiXSxcbiAgYnJpZ2h0Y3lhbjogW1wiMzY7MVwiLCBcIjM5XCJdLFxuICBicmlnaHR3aGl0ZTogW1wiMzc7MVwiLCBcIjM5XCJdLFxuICBncmV5OiBbXCI5MFwiLCBcIjM5XCJdXG59O1xudmFyIHN0eWxlcyA9IHtcbiAgc3BlY2lhbDogXCJjeWFuXCIsXG4gIG51bWJlcjogXCJ5ZWxsb3dcIixcbiAgYmlnaW50OiBcInllbGxvd1wiLFxuICBib29sZWFuOiBcInllbGxvd1wiLFxuICB1bmRlZmluZWQ6IFwiZ3JleVwiLFxuICBudWxsOiBcImJvbGRcIixcbiAgc3RyaW5nOiBcImdyZWVuXCIsXG4gIHN5bWJvbDogXCJncmVlblwiLFxuICBkYXRlOiBcIm1hZ2VudGFcIixcbiAgcmVnZXhwOiBcInJlZFwiXG59O1xudmFyIHRydW5jYXRvciA9IFwiXFx1MjAyNlwiO1xuZnVuY3Rpb24gY29sb3Jpc2UodmFsdWUsIHN0eWxlVHlwZSkge1xuICBjb25zdCBjb2xvciA9IGFuc2lDb2xvcnNbc3R5bGVzW3N0eWxlVHlwZV1dIHx8IGFuc2lDb2xvcnNbc3R5bGVUeXBlXSB8fCBcIlwiO1xuICBpZiAoIWNvbG9yKSB7XG4gICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGBcXHgxQlske2NvbG9yWzBdfW0ke1N0cmluZyh2YWx1ZSl9XFx4MUJbJHtjb2xvclsxXX1tYDtcbn1cbl9fbmFtZShjb2xvcmlzZSwgXCJjb2xvcmlzZVwiKTtcbmZ1bmN0aW9uIG5vcm1hbGlzZU9wdGlvbnMoe1xuICBzaG93SGlkZGVuID0gZmFsc2UsXG4gIGRlcHRoID0gMixcbiAgY29sb3JzID0gZmFsc2UsXG4gIGN1c3RvbUluc3BlY3QgPSB0cnVlLFxuICBzaG93UHJveHkgPSBmYWxzZSxcbiAgbWF4QXJyYXlMZW5ndGggPSBJbmZpbml0eSxcbiAgYnJlYWtMZW5ndGggPSBJbmZpbml0eSxcbiAgc2VlbiA9IFtdLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG4gIHRydW5jYXRlOiB0cnVuY2F0ZTIgPSBJbmZpbml0eSxcbiAgc3R5bGl6ZSA9IFN0cmluZ1xufSA9IHt9LCBpbnNwZWN0Mykge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHNob3dIaWRkZW46IEJvb2xlYW4oc2hvd0hpZGRlbiksXG4gICAgZGVwdGg6IE51bWJlcihkZXB0aCksXG4gICAgY29sb3JzOiBCb29sZWFuKGNvbG9ycyksXG4gICAgY3VzdG9tSW5zcGVjdDogQm9vbGVhbihjdXN0b21JbnNwZWN0KSxcbiAgICBzaG93UHJveHk6IEJvb2xlYW4oc2hvd1Byb3h5KSxcbiAgICBtYXhBcnJheUxlbmd0aDogTnVtYmVyKG1heEFycmF5TGVuZ3RoKSxcbiAgICBicmVha0xlbmd0aDogTnVtYmVyKGJyZWFrTGVuZ3RoKSxcbiAgICB0cnVuY2F0ZTogTnVtYmVyKHRydW5jYXRlMiksXG4gICAgc2VlbixcbiAgICBpbnNwZWN0OiBpbnNwZWN0MyxcbiAgICBzdHlsaXplXG4gIH07XG4gIGlmIChvcHRpb25zLmNvbG9ycykge1xuICAgIG9wdGlvbnMuc3R5bGl6ZSA9IGNvbG9yaXNlO1xuICB9XG4gIHJldHVybiBvcHRpb25zO1xufVxuX19uYW1lKG5vcm1hbGlzZU9wdGlvbnMsIFwibm9ybWFsaXNlT3B0aW9uc1wiKTtcbmZ1bmN0aW9uIGlzSGlnaFN1cnJvZ2F0ZShjaGFyKSB7XG4gIHJldHVybiBjaGFyID49IFwiXFx1RDgwMFwiICYmIGNoYXIgPD0gXCJcXHVEQkZGXCI7XG59XG5fX25hbWUoaXNIaWdoU3Vycm9nYXRlLCBcImlzSGlnaFN1cnJvZ2F0ZVwiKTtcbmZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgbGVuZ3RoLCB0YWlsID0gdHJ1bmNhdG9yKSB7XG4gIHN0cmluZyA9IFN0cmluZyhzdHJpbmcpO1xuICBjb25zdCB0YWlsTGVuZ3RoID0gdGFpbC5sZW5ndGg7XG4gIGNvbnN0IHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGg7XG4gIGlmICh0YWlsTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICByZXR1cm4gdGFpbDtcbiAgfVxuICBpZiAoc3RyaW5nTGVuZ3RoID4gbGVuZ3RoICYmIHN0cmluZ0xlbmd0aCA+IHRhaWxMZW5ndGgpIHtcbiAgICBsZXQgZW5kID0gbGVuZ3RoIC0gdGFpbExlbmd0aDtcbiAgICBpZiAoZW5kID4gMCAmJiBpc0hpZ2hTdXJyb2dhdGUoc3RyaW5nW2VuZCAtIDFdKSkge1xuICAgICAgZW5kID0gZW5kIC0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGAke3N0cmluZy5zbGljZSgwLCBlbmQpfSR7dGFpbH1gO1xuICB9XG4gIHJldHVybiBzdHJpbmc7XG59XG5fX25hbWUodHJ1bmNhdGUsIFwidHJ1bmNhdGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0TGlzdChsaXN0LCBvcHRpb25zLCBpbnNwZWN0SXRlbSwgc2VwYXJhdG9yID0gXCIsIFwiKSB7XG4gIGluc3BlY3RJdGVtID0gaW5zcGVjdEl0ZW0gfHwgb3B0aW9ucy5pbnNwZWN0O1xuICBjb25zdCBzaXplID0gbGlzdC5sZW5ndGg7XG4gIGlmIChzaXplID09PSAwKVxuICAgIHJldHVybiBcIlwiO1xuICBjb25zdCBvcmlnaW5hbExlbmd0aCA9IG9wdGlvbnMudHJ1bmNhdGU7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBsZXQgcGVlayA9IFwiXCI7XG4gIGxldCB0cnVuY2F0ZWQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkgKz0gMSkge1xuICAgIGNvbnN0IGxhc3QgPSBpICsgMSA9PT0gbGlzdC5sZW5ndGg7XG4gICAgY29uc3Qgc2Vjb25kVG9MYXN0ID0gaSArIDIgPT09IGxpc3QubGVuZ3RoO1xuICAgIHRydW5jYXRlZCA9IGAke3RydW5jYXRvcn0oJHtsaXN0Lmxlbmd0aCAtIGl9KWA7XG4gICAgY29uc3QgdmFsdWUgPSBsaXN0W2ldO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgPSBvcmlnaW5hbExlbmd0aCAtIG91dHB1dC5sZW5ndGggLSAobGFzdCA/IDAgOiBzZXBhcmF0b3IubGVuZ3RoKTtcbiAgICBjb25zdCBzdHJpbmcgPSBwZWVrIHx8IGluc3BlY3RJdGVtKHZhbHVlLCBvcHRpb25zKSArIChsYXN0ID8gXCJcIiA6IHNlcGFyYXRvcik7XG4gICAgY29uc3QgbmV4dExlbmd0aCA9IG91dHB1dC5sZW5ndGggKyBzdHJpbmcubGVuZ3RoO1xuICAgIGNvbnN0IHRydW5jYXRlZExlbmd0aCA9IG5leHRMZW5ndGggKyB0cnVuY2F0ZWQubGVuZ3RoO1xuICAgIGlmIChsYXN0ICYmIG5leHRMZW5ndGggPiBvcmlnaW5hbExlbmd0aCAmJiBvdXRwdXQubGVuZ3RoICsgdHJ1bmNhdGVkLmxlbmd0aCA8PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIHRydW5jYXRlZExlbmd0aCA+IG9yaWdpbmFsTGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgcGVlayA9IGxhc3QgPyBcIlwiIDogaW5zcGVjdEl0ZW0obGlzdFtpICsgMV0sIG9wdGlvbnMpICsgKHNlY29uZFRvTGFzdCA/IFwiXCIgOiBzZXBhcmF0b3IpO1xuICAgIGlmICghbGFzdCAmJiBzZWNvbmRUb0xhc3QgJiYgdHJ1bmNhdGVkTGVuZ3RoID4gb3JpZ2luYWxMZW5ndGggJiYgbmV4dExlbmd0aCArIHBlZWsubGVuZ3RoID4gb3JpZ2luYWxMZW5ndGgpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBvdXRwdXQgKz0gc3RyaW5nO1xuICAgIGlmICghbGFzdCAmJiAhc2Vjb25kVG9MYXN0ICYmIG5leHRMZW5ndGggKyBwZWVrLmxlbmd0aCA+PSBvcmlnaW5hbExlbmd0aCkge1xuICAgICAgdHJ1bmNhdGVkID0gYCR7dHJ1bmNhdG9yfSgke2xpc3QubGVuZ3RoIC0gaSAtIDF9KWA7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgdHJ1bmNhdGVkID0gXCJcIjtcbiAgfVxuICByZXR1cm4gYCR7b3V0cHV0fSR7dHJ1bmNhdGVkfWA7XG59XG5fX25hbWUoaW5zcGVjdExpc3QsIFwiaW5zcGVjdExpc3RcIik7XG5mdW5jdGlvbiBxdW90ZUNvbXBsZXhLZXkoa2V5KSB7XG4gIGlmIChrZXkubWF0Y2goL15bYS16QS1aX11bYS16QS1aXzAtOV0qJC8pKSB7XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoa2V5KS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIikucmVwbGFjZSgvXFxcXFwiL2csICdcIicpLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG59XG5fX25hbWUocXVvdGVDb21wbGV4S2V5LCBcInF1b3RlQ29tcGxleEtleVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RQcm9wZXJ0eShba2V5LCB2YWx1ZV0sIG9wdGlvbnMpIHtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSAyO1xuICBpZiAodHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIikge1xuICAgIGtleSA9IHF1b3RlQ29tcGxleEtleShrZXkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBrZXkgIT09IFwibnVtYmVyXCIpIHtcbiAgICBrZXkgPSBgWyR7b3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyl9XWA7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBrZXkubGVuZ3RoO1xuICB2YWx1ZSA9IG9wdGlvbnMuaW5zcGVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIHJldHVybiBgJHtrZXl9OiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdFByb3BlcnR5LCBcImluc3BlY3RQcm9wZXJ0eVwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9hcnJheS5qc1xuZnVuY3Rpb24gaW5zcGVjdEFycmF5KGFycmF5LCBvcHRpb25zKSB7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gXCJbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDQ7XG4gIGNvbnN0IGxpc3RDb250ZW50cyA9IGluc3BlY3RMaXN0KGFycmF5LCBvcHRpb25zKTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBsaXN0Q29udGVudHMubGVuZ3RoO1xuICBsZXQgcHJvcGVydHlDb250ZW50cyA9IFwiXCI7XG4gIGlmIChub25JbmRleFByb3BlcnRpZXMubGVuZ3RoKSB7XG4gICAgcHJvcGVydHlDb250ZW50cyA9IGluc3BlY3RMaXN0KG5vbkluZGV4UHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgYXJyYXlba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICB9XG4gIHJldHVybiBgWyAke2xpc3RDb250ZW50c30ke3Byb3BlcnR5Q29udGVudHMgPyBgLCAke3Byb3BlcnR5Q29udGVudHN9YCA6IFwiXCJ9IF1gO1xufVxuX19uYW1lKGluc3BlY3RBcnJheSwgXCJpbnNwZWN0QXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvdHlwZWRhcnJheS5qc1xudmFyIGdldEFycmF5TmFtZSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKGFycmF5KSA9PiB7XG4gIGlmICh0eXBlb2YgQnVmZmVyID09PSBcImZ1bmN0aW9uXCIgJiYgYXJyYXkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcbiAgICByZXR1cm4gXCJCdWZmZXJcIjtcbiAgfVxuICBpZiAoYXJyYXlbU3ltYm9sLnRvU3RyaW5nVGFnXSkge1xuICAgIHJldHVybiBhcnJheVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBhcnJheS5jb25zdHJ1Y3Rvci5uYW1lO1xufSwgXCJnZXRBcnJheU5hbWVcIik7XG5mdW5jdGlvbiBpbnNwZWN0VHlwZWRBcnJheShhcnJheSwgb3B0aW9ucykge1xuICBjb25zdCBuYW1lID0gZ2V0QXJyYXlOYW1lKGFycmF5KTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aCArIDQ7XG4gIGNvbnN0IG5vbkluZGV4UHJvcGVydGllcyA9IE9iamVjdC5rZXlzKGFycmF5KS5zbGljZShhcnJheS5sZW5ndGgpO1xuICBpZiAoIWFycmF5Lmxlbmd0aCAmJiAhbm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aClcbiAgICByZXR1cm4gYCR7bmFtZX1bXWA7XG4gIGxldCBvdXRwdXQgPSBcIlwiO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgc3RyaW5nID0gYCR7b3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKGFycmF5W2ldLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIil9JHtpID09PSBhcnJheS5sZW5ndGggLSAxID8gXCJcIiA6IFwiLCBcIn1gO1xuICAgIG9wdGlvbnMudHJ1bmNhdGUgLT0gc3RyaW5nLmxlbmd0aDtcbiAgICBpZiAoYXJyYXlbaV0gIT09IGFycmF5Lmxlbmd0aCAmJiBvcHRpb25zLnRydW5jYXRlIDw9IDMpIHtcbiAgICAgIG91dHB1dCArPSBgJHt0cnVuY2F0b3J9KCR7YXJyYXkubGVuZ3RoIC0gYXJyYXlbaV0gKyAxfSlgO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG91dHB1dCArPSBzdHJpbmc7XG4gIH1cbiAgbGV0IHByb3BlcnR5Q29udGVudHMgPSBcIlwiO1xuICBpZiAobm9uSW5kZXhQcm9wZXJ0aWVzLmxlbmd0aCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgPSBpbnNwZWN0TGlzdChub25JbmRleFByb3BlcnRpZXMubWFwKChrZXkpID0+IFtrZXksIGFycmF5W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgfVxuICByZXR1cm4gYCR7bmFtZX1bICR7b3V0cHV0fSR7cHJvcGVydHlDb250ZW50cyA/IGAsICR7cHJvcGVydHlDb250ZW50c31gIDogXCJcIn0gXWA7XG59XG5fX25hbWUoaW5zcGVjdFR5cGVkQXJyYXksIFwiaW5zcGVjdFR5cGVkQXJyYXlcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvZGF0ZS5qc1xuZnVuY3Rpb24gaW5zcGVjdERhdGUoZGF0ZU9iamVjdCwgb3B0aW9ucykge1xuICBjb25zdCBzdHJpbmdSZXByZXNlbnRhdGlvbiA9IGRhdGVPYmplY3QudG9KU09OKCk7XG4gIGlmIChzdHJpbmdSZXByZXNlbnRhdGlvbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIkludmFsaWQgRGF0ZVwiO1xuICB9XG4gIGNvbnN0IHNwbGl0ID0gc3RyaW5nUmVwcmVzZW50YXRpb24uc3BsaXQoXCJUXCIpO1xuICBjb25zdCBkYXRlID0gc3BsaXRbMF07XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYCR7ZGF0ZX1UJHt0cnVuY2F0ZShzcGxpdFsxXSwgb3B0aW9ucy50cnVuY2F0ZSAtIGRhdGUubGVuZ3RoIC0gMSl9YCwgXCJkYXRlXCIpO1xufVxuX19uYW1lKGluc3BlY3REYXRlLCBcImluc3BlY3REYXRlXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Z1bmN0aW9uLmpzXG5mdW5jdGlvbiBpbnNwZWN0RnVuY3Rpb24oZnVuYywgb3B0aW9ucykge1xuICBjb25zdCBmdW5jdGlvblR5cGUgPSBmdW5jW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgXCJGdW5jdGlvblwiO1xuICBjb25zdCBuYW1lID0gZnVuYy5uYW1lO1xuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9XWAsIFwic3BlY2lhbFwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKGBbJHtmdW5jdGlvblR5cGV9ICR7dHJ1bmNhdGUobmFtZSwgb3B0aW9ucy50cnVuY2F0ZSAtIDExKX1dYCwgXCJzcGVjaWFsXCIpO1xufVxuX19uYW1lKGluc3BlY3RGdW5jdGlvbiwgXCJpbnNwZWN0RnVuY3Rpb25cIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbWFwLmpzXG5mdW5jdGlvbiBpbnNwZWN0TWFwRW50cnkoW2tleSwgdmFsdWVdLCBvcHRpb25zKSB7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNDtcbiAga2V5ID0gb3B0aW9ucy5pbnNwZWN0KGtleSwgb3B0aW9ucyk7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0ga2V5Lmxlbmd0aDtcbiAgdmFsdWUgPSBvcHRpb25zLmluc3BlY3QodmFsdWUsIG9wdGlvbnMpO1xuICByZXR1cm4gYCR7a2V5fSA9PiAke3ZhbHVlfWA7XG59XG5fX25hbWUoaW5zcGVjdE1hcEVudHJ5LCBcImluc3BlY3RNYXBFbnRyeVwiKTtcbmZ1bmN0aW9uIG1hcFRvRW50cmllcyhtYXApIHtcbiAgY29uc3QgZW50cmllcyA9IFtdO1xuICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgIGVudHJpZXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9KTtcbiAgcmV0dXJuIGVudHJpZXM7XG59XG5fX25hbWUobWFwVG9FbnRyaWVzLCBcIm1hcFRvRW50cmllc1wiKTtcbmZ1bmN0aW9uIGluc3BlY3RNYXAobWFwLCBvcHRpb25zKSB7XG4gIGlmIChtYXAuc2l6ZSA9PT0gMClcbiAgICByZXR1cm4gXCJNYXB7fVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDc7XG4gIHJldHVybiBgTWFweyAke2luc3BlY3RMaXN0KG1hcFRvRW50cmllcyhtYXApLCBvcHRpb25zLCBpbnNwZWN0TWFwRW50cnkpfSB9YDtcbn1cbl9fbmFtZShpbnNwZWN0TWFwLCBcImluc3BlY3RNYXBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvbnVtYmVyLmpzXG52YXIgaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgKChpKSA9PiBpICE9PSBpKTtcbmZ1bmN0aW9uIGluc3BlY3ROdW1iZXIobnVtYmVyLCBvcHRpb25zKSB7XG4gIGlmIChpc05hTihudW1iZXIpKSB7XG4gICAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShcIk5hTlwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSBJbmZpbml0eSkge1xuICAgIHJldHVybiBvcHRpb25zLnN0eWxpemUoXCJJbmZpbml0eVwiLCBcIm51bWJlclwiKTtcbiAgfVxuICBpZiAobnVtYmVyID09PSAtSW5maW5pdHkpIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKFwiLUluZmluaXR5XCIsIFwibnVtYmVyXCIpO1xuICB9XG4gIGlmIChudW1iZXIgPT09IDApIHtcbiAgICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKDEgLyBudW1iZXIgPT09IEluZmluaXR5ID8gXCIrMFwiIDogXCItMFwiLCBcIm51bWJlclwiKTtcbiAgfVxuICByZXR1cm4gb3B0aW9ucy5zdHlsaXplKHRydW5jYXRlKFN0cmluZyhudW1iZXIpLCBvcHRpb25zLnRydW5jYXRlKSwgXCJudW1iZXJcIik7XG59XG5fX25hbWUoaW5zcGVjdE51bWJlciwgXCJpbnNwZWN0TnVtYmVyXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2JpZ2ludC5qc1xuZnVuY3Rpb24gaW5zcGVjdEJpZ0ludChudW1iZXIsIG9wdGlvbnMpIHtcbiAgbGV0IG51bXMgPSB0cnVuY2F0ZShudW1iZXIudG9TdHJpbmcoKSwgb3B0aW9ucy50cnVuY2F0ZSAtIDEpO1xuICBpZiAobnVtcyAhPT0gdHJ1bmNhdG9yKVxuICAgIG51bXMgKz0gXCJuXCI7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUobnVtcywgXCJiaWdpbnRcIik7XG59XG5fX25hbWUoaW5zcGVjdEJpZ0ludCwgXCJpbnNwZWN0QmlnSW50XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3JlZ2V4cC5qc1xuZnVuY3Rpb24gaW5zcGVjdFJlZ0V4cCh2YWx1ZSwgb3B0aW9ucykge1xuICBjb25zdCBmbGFncyA9IHZhbHVlLnRvU3RyaW5nKCkuc3BsaXQoXCIvXCIpWzJdO1xuICBjb25zdCBzb3VyY2VMZW5ndGggPSBvcHRpb25zLnRydW5jYXRlIC0gKDIgKyBmbGFncy5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZS5zb3VyY2U7XG4gIHJldHVybiBvcHRpb25zLnN0eWxpemUoYC8ke3RydW5jYXRlKHNvdXJjZSwgc291cmNlTGVuZ3RoKX0vJHtmbGFnc31gLCBcInJlZ2V4cFwiKTtcbn1cbl9fbmFtZShpbnNwZWN0UmVnRXhwLCBcImluc3BlY3RSZWdFeHBcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9sb3VwZS9saWIvc2V0LmpzXG5mdW5jdGlvbiBhcnJheUZyb21TZXQoc2V0Mikge1xuICBjb25zdCB2YWx1ZXMgPSBbXTtcbiAgc2V0Mi5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgIHZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgfSk7XG4gIHJldHVybiB2YWx1ZXM7XG59XG5fX25hbWUoYXJyYXlGcm9tU2V0LCBcImFycmF5RnJvbVNldFwiKTtcbmZ1bmN0aW9uIGluc3BlY3RTZXQoc2V0Miwgb3B0aW9ucykge1xuICBpZiAoc2V0Mi5zaXplID09PSAwKVxuICAgIHJldHVybiBcIlNldHt9XCI7XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gNztcbiAgcmV0dXJuIGBTZXR7ICR7aW5zcGVjdExpc3QoYXJyYXlGcm9tU2V0KHNldDIpLCBvcHRpb25zKX0gfWA7XG59XG5fX25hbWUoaW5zcGVjdFNldCwgXCJpbnNwZWN0U2V0XCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL3N0cmluZy5qc1xudmFyIHN0cmluZ0VzY2FwZUNoYXJzID0gbmV3IFJlZ0V4cChcIlsnXFxcXHUwMDAwLVxcXFx1MDAxZlxcXFx1MDA3Zi1cXFxcdTAwOWZcXFxcdTAwYWRcXFxcdTA2MDAtXFxcXHUwNjA0XFxcXHUwNzBmXFxcXHUxN2I0XFxcXHUxN2I1XFxcXHUyMDBjLVxcXFx1MjAwZlxcXFx1MjAyOC1cXFxcdTIwMmZcXFxcdTIwNjAtXFxcXHUyMDZmXFxcXHVmZWZmXFxcXHVmZmYwLVxcXFx1ZmZmZl1cIiwgXCJnXCIpO1xudmFyIGVzY2FwZUNoYXJhY3RlcnMgPSB7XG4gIFwiXFxiXCI6IFwiXFxcXGJcIixcbiAgXCJcdFwiOiBcIlxcXFx0XCIsXG4gIFwiXFxuXCI6IFwiXFxcXG5cIixcbiAgXCJcXGZcIjogXCJcXFxcZlwiLFxuICBcIlxcclwiOiBcIlxcXFxyXCIsXG4gIFwiJ1wiOiBcIlxcXFwnXCIsXG4gIFwiXFxcXFwiOiBcIlxcXFxcXFxcXCJcbn07XG52YXIgaGV4ID0gMTY7XG52YXIgdW5pY29kZUxlbmd0aCA9IDQ7XG5mdW5jdGlvbiBlc2NhcGUoY2hhcikge1xuICByZXR1cm4gZXNjYXBlQ2hhcmFjdGVyc1tjaGFyXSB8fCBgXFxcXHUke2AwMDAwJHtjaGFyLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoaGV4KX1gLnNsaWNlKC11bmljb2RlTGVuZ3RoKX1gO1xufVxuX19uYW1lKGVzY2FwZSwgXCJlc2NhcGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0U3RyaW5nKHN0cmluZywgb3B0aW9ucykge1xuICBpZiAoc3RyaW5nRXNjYXBlQ2hhcnMudGVzdChzdHJpbmcpKSB7XG4gICAgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2Uoc3RyaW5nRXNjYXBlQ2hhcnMsIGVzY2FwZSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShgJyR7dHJ1bmNhdGUoc3RyaW5nLCBvcHRpb25zLnRydW5jYXRlIC0gMil9J2AsIFwic3RyaW5nXCIpO1xufVxuX19uYW1lKGluc3BlY3RTdHJpbmcsIFwiaW5zcGVjdFN0cmluZ1wiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9zeW1ib2wuanNcbmZ1bmN0aW9uIGluc3BlY3RTeW1ib2wodmFsdWUpIHtcbiAgaWYgKFwiZGVzY3JpcHRpb25cIiBpbiBTeW1ib2wucHJvdG90eXBlKSB7XG4gICAgcmV0dXJuIHZhbHVlLmRlc2NyaXB0aW9uID8gYFN5bWJvbCgke3ZhbHVlLmRlc2NyaXB0aW9ufSlgIDogXCJTeW1ib2woKVwiO1xuICB9XG4gIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xufVxuX19uYW1lKGluc3BlY3RTeW1ib2wsIFwiaW5zcGVjdFN5bWJvbFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9wcm9taXNlLmpzXG52YXIgZ2V0UHJvbWlzZVZhbHVlID0gLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlByb21pc2V7XFx1MjAyNn1cIiwgXCJnZXRQcm9taXNlVmFsdWVcIik7XG52YXIgcHJvbWlzZV9kZWZhdWx0ID0gZ2V0UHJvbWlzZVZhbHVlO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL29iamVjdC5qc1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdChvYmplY3QsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iamVjdCk7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpIDogW107XG4gIGlmIChwcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCAmJiBzeW1ib2xzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBcInt9XCI7XG4gIH1cbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSA0O1xuICBvcHRpb25zLnNlZW4gPSBvcHRpb25zLnNlZW4gfHwgW107XG4gIGlmIChvcHRpb25zLnNlZW4uaW5jbHVkZXMob2JqZWN0KSkge1xuICAgIHJldHVybiBcIltDaXJjdWxhcl1cIjtcbiAgfVxuICBvcHRpb25zLnNlZW4ucHVzaChvYmplY3QpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgb2JqZWN0W2tleV1dKSwgb3B0aW9ucywgaW5zcGVjdFByb3BlcnR5KTtcbiAgY29uc3Qgc3ltYm9sQ29udGVudHMgPSBpbnNwZWN0TGlzdChzeW1ib2xzLm1hcCgoa2V5KSA9PiBba2V5LCBvYmplY3Rba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICBvcHRpb25zLnNlZW4ucG9wKCk7XG4gIGxldCBzZXAgPSBcIlwiO1xuICBpZiAocHJvcGVydHlDb250ZW50cyAmJiBzeW1ib2xDb250ZW50cykge1xuICAgIHNlcCA9IFwiLCBcIjtcbiAgfVxuICByZXR1cm4gYHsgJHtwcm9wZXJ0eUNvbnRlbnRzfSR7c2VwfSR7c3ltYm9sQ29udGVudHN9IH1gO1xufVxuX19uYW1lKGluc3BlY3RPYmplY3QsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9jbGFzcy5qc1xudmFyIHRvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBTeW1ib2wudG9TdHJpbmdUYWcgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiBmYWxzZTtcbmZ1bmN0aW9uIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucykge1xuICBsZXQgbmFtZSA9IFwiXCI7XG4gIGlmICh0b1N0cmluZ1RhZyAmJiB0b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIG5hbWUgPSB2YWx1ZVt0b1N0cmluZ1RhZ107XG4gIH1cbiAgbmFtZSA9IG5hbWUgfHwgdmFsdWUuY29uc3RydWN0b3IubmFtZTtcbiAgaWYgKCFuYW1lIHx8IG5hbWUgPT09IFwiX2NsYXNzXCIpIHtcbiAgICBuYW1lID0gXCI8QW5vbnltb3VzIENsYXNzPlwiO1xuICB9XG4gIG9wdGlvbnMudHJ1bmNhdGUgLT0gbmFtZS5sZW5ndGg7XG4gIHJldHVybiBgJHtuYW1lfSR7aW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyl9YDtcbn1cbl9fbmFtZShpbnNwZWN0Q2xhc3MsIFwiaW5zcGVjdENsYXNzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2FyZ3VtZW50cy5qc1xuZnVuY3Rpb24gaW5zcGVjdEFyZ3VtZW50cyhhcmdzLCBvcHRpb25zKSB7XG4gIGlmIChhcmdzLmxlbmd0aCA9PT0gMClcbiAgICByZXR1cm4gXCJBcmd1bWVudHNbXVwiO1xuICBvcHRpb25zLnRydW5jYXRlIC09IDEzO1xuICByZXR1cm4gYEFyZ3VtZW50c1sgJHtpbnNwZWN0TGlzdChhcmdzLCBvcHRpb25zKX0gXWA7XG59XG5fX25hbWUoaW5zcGVjdEFyZ3VtZW50cywgXCJpbnNwZWN0QXJndW1lbnRzXCIpO1xuXG4vLyBub2RlX21vZHVsZXMvbG91cGUvbGliL2Vycm9yLmpzXG52YXIgZXJyb3JLZXlzID0gW1xuICBcInN0YWNrXCIsXG4gIFwibGluZVwiLFxuICBcImNvbHVtblwiLFxuICBcIm5hbWVcIixcbiAgXCJtZXNzYWdlXCIsXG4gIFwiZmlsZU5hbWVcIixcbiAgXCJsaW5lTnVtYmVyXCIsXG4gIFwiY29sdW1uTnVtYmVyXCIsXG4gIFwibnVtYmVyXCIsXG4gIFwiZGVzY3JpcHRpb25cIixcbiAgXCJjYXVzZVwiXG5dO1xuZnVuY3Rpb24gaW5zcGVjdE9iamVjdDIoZXJyb3IsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGVycm9yKS5maWx0ZXIoKGtleSkgPT4gZXJyb3JLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTEpO1xuICBjb25zdCBuYW1lID0gZXJyb3IubmFtZTtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBuYW1lLmxlbmd0aDtcbiAgbGV0IG1lc3NhZ2UgPSBcIlwiO1xuICBpZiAodHlwZW9mIGVycm9yLm1lc3NhZ2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtZXNzYWdlID0gdHJ1bmNhdGUoZXJyb3IubWVzc2FnZSwgb3B0aW9ucy50cnVuY2F0ZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvcGVydGllcy51bnNoaWZ0KFwibWVzc2FnZVwiKTtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSA/IGA6ICR7bWVzc2FnZX1gIDogXCJcIjtcbiAgb3B0aW9ucy50cnVuY2F0ZSAtPSBtZXNzYWdlLmxlbmd0aCArIDU7XG4gIG9wdGlvbnMuc2VlbiA9IG9wdGlvbnMuc2VlbiB8fCBbXTtcbiAgaWYgKG9wdGlvbnMuc2Vlbi5pbmNsdWRlcyhlcnJvcikpIHtcbiAgICByZXR1cm4gXCJbQ2lyY3VsYXJdXCI7XG4gIH1cbiAgb3B0aW9ucy5zZWVuLnB1c2goZXJyb3IpO1xuICBjb25zdCBwcm9wZXJ0eUNvbnRlbnRzID0gaW5zcGVjdExpc3QocHJvcGVydGllcy5tYXAoKGtleSkgPT4gW2tleSwgZXJyb3Jba2V5XV0pLCBvcHRpb25zLCBpbnNwZWN0UHJvcGVydHkpO1xuICByZXR1cm4gYCR7bmFtZX0ke21lc3NhZ2V9JHtwcm9wZXJ0eUNvbnRlbnRzID8gYCB7ICR7cHJvcGVydHlDb250ZW50c30gfWAgOiBcIlwifWA7XG59XG5fX25hbWUoaW5zcGVjdE9iamVjdDIsIFwiaW5zcGVjdE9iamVjdFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9odG1sLmpzXG5mdW5jdGlvbiBpbnNwZWN0QXR0cmlidXRlKFtrZXksIHZhbHVlXSwgb3B0aW9ucykge1xuICBvcHRpb25zLnRydW5jYXRlIC09IDM7XG4gIGlmICghdmFsdWUpIHtcbiAgICByZXR1cm4gYCR7b3B0aW9ucy5zdHlsaXplKFN0cmluZyhrZXkpLCBcInllbGxvd1wiKX1gO1xuICB9XG4gIHJldHVybiBgJHtvcHRpb25zLnN0eWxpemUoU3RyaW5nKGtleSksIFwieWVsbG93XCIpfT0ke29wdGlvbnMuc3R5bGl6ZShgXCIke3ZhbHVlfVwiYCwgXCJzdHJpbmdcIil9YDtcbn1cbl9fbmFtZShpbnNwZWN0QXR0cmlidXRlLCBcImluc3BlY3RBdHRyaWJ1dGVcIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oY29sbGVjdGlvbiwgb3B0aW9ucykge1xuICByZXR1cm4gaW5zcGVjdExpc3QoY29sbGVjdGlvbiwgb3B0aW9ucywgaW5zcGVjdE5vZGUsIFwiXFxuXCIpO1xufVxuX19uYW1lKGluc3BlY3ROb2RlQ29sbGVjdGlvbiwgXCJpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cIik7XG5mdW5jdGlvbiBpbnNwZWN0Tm9kZShub2RlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobm9kZS5ub2RlVHlwZSkge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiBpbnNwZWN0SFRNTChub2RlLCBvcHRpb25zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gb3B0aW9ucy5pbnNwZWN0KG5vZGUuZGF0YSwgb3B0aW9ucyk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBvcHRpb25zLmluc3BlY3Qobm9kZSwgb3B0aW9ucyk7XG4gIH1cbn1cbl9fbmFtZShpbnNwZWN0Tm9kZSwgXCJpbnNwZWN0Tm9kZVwiKTtcbmZ1bmN0aW9uIGluc3BlY3RIVE1MKGVsZW1lbnQsIG9wdGlvbnMpIHtcbiAgY29uc3QgcHJvcGVydGllcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKTtcbiAgY29uc3QgbmFtZSA9IGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBoZWFkID0gb3B0aW9ucy5zdHlsaXplKGA8JHtuYW1lfWAsIFwic3BlY2lhbFwiKTtcbiAgY29uc3QgaGVhZENsb3NlID0gb3B0aW9ucy5zdHlsaXplKGA+YCwgXCJzcGVjaWFsXCIpO1xuICBjb25zdCB0YWlsID0gb3B0aW9ucy5zdHlsaXplKGA8LyR7bmFtZX0+YCwgXCJzcGVjaWFsXCIpO1xuICBvcHRpb25zLnRydW5jYXRlIC09IG5hbWUubGVuZ3RoICogMiArIDU7XG4gIGxldCBwcm9wZXJ0eUNvbnRlbnRzID0gXCJcIjtcbiAgaWYgKHByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgIHByb3BlcnR5Q29udGVudHMgKz0gXCIgXCI7XG4gICAgcHJvcGVydHlDb250ZW50cyArPSBpbnNwZWN0TGlzdChwcm9wZXJ0aWVzLm1hcCgoa2V5KSA9PiBba2V5LCBlbGVtZW50LmdldEF0dHJpYnV0ZShrZXkpXSksIG9wdGlvbnMsIGluc3BlY3RBdHRyaWJ1dGUsIFwiIFwiKTtcbiAgfVxuICBvcHRpb25zLnRydW5jYXRlIC09IHByb3BlcnR5Q29udGVudHMubGVuZ3RoO1xuICBjb25zdCB0cnVuY2F0ZTIgPSBvcHRpb25zLnRydW5jYXRlO1xuICBsZXQgY2hpbGRyZW4gPSBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24oZWxlbWVudC5jaGlsZHJlbiwgb3B0aW9ucyk7XG4gIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGggPiB0cnVuY2F0ZTIpIHtcbiAgICBjaGlsZHJlbiA9IGAke3RydW5jYXRvcn0oJHtlbGVtZW50LmNoaWxkcmVuLmxlbmd0aH0pYDtcbiAgfVxuICByZXR1cm4gYCR7aGVhZH0ke3Byb3BlcnR5Q29udGVudHN9JHtoZWFkQ2xvc2V9JHtjaGlsZHJlbn0ke3RhaWx9YDtcbn1cbl9fbmFtZShpbnNwZWN0SFRNTCwgXCJpbnNwZWN0SFRNTFwiKTtcblxuLy8gbm9kZV9tb2R1bGVzL2xvdXBlL2xpYi9pbmRleC5qc1xudmFyIHN5bWJvbHNTdXBwb3J0ZWQgPSB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIFN5bWJvbC5mb3IgPT09IFwiZnVuY3Rpb25cIjtcbnZhciBjaGFpSW5zcGVjdCA9IHN5bWJvbHNTdXBwb3J0ZWQgPyAvKiBAX19QVVJFX18gKi8gU3ltYm9sLmZvcihcImNoYWkvaW5zcGVjdFwiKSA6IFwiQEBjaGFpL2luc3BlY3RcIjtcbnZhciBub2RlSW5zcGVjdCA9IC8qIEBfX1BVUkVfXyAqLyBTeW1ib2wuZm9yKFwibm9kZWpzLnV0aWwuaW5zcGVjdC5jdXN0b21cIik7XG52YXIgY29uc3RydWN0b3JNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbnZhciBzdHJpbmdUYWdNYXAgPSB7fTtcbnZhciBiYXNlVHlwZXNNYXAgPSB7XG4gIHVuZGVmaW5lZDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcInVuZGVmaW5lZFwiLCBcInVuZGVmaW5lZFwiKSwgXCJ1bmRlZmluZWRcIiksXG4gIG51bGw6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zKSA9PiBvcHRpb25zLnN0eWxpemUoXCJudWxsXCIsIFwibnVsbFwiKSwgXCJudWxsXCIpLFxuICBib29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJib29sZWFuXCIpLFxuICBCb29sZWFuOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFN0cmluZyh2YWx1ZSksIFwiYm9vbGVhblwiKSwgXCJCb29sZWFuXCIpLFxuICBudW1iZXI6IGluc3BlY3ROdW1iZXIsXG4gIE51bWJlcjogaW5zcGVjdE51bWJlcixcbiAgYmlnaW50OiBpbnNwZWN0QmlnSW50LFxuICBCaWdJbnQ6IGluc3BlY3RCaWdJbnQsXG4gIHN0cmluZzogaW5zcGVjdFN0cmluZyxcbiAgU3RyaW5nOiBpbnNwZWN0U3RyaW5nLFxuICBmdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBGdW5jdGlvbjogaW5zcGVjdEZ1bmN0aW9uLFxuICBzeW1ib2w6IGluc3BlY3RTeW1ib2wsXG4gIC8vIEEgU3ltYm9sIHBvbHlmaWxsIHdpbGwgcmV0dXJuIGBTeW1ib2xgIG5vdCBgc3ltYm9sYCBmcm9tIHR5cGVkZXRlY3RcbiAgU3ltYm9sOiBpbnNwZWN0U3ltYm9sLFxuICBBcnJheTogaW5zcGVjdEFycmF5LFxuICBEYXRlOiBpbnNwZWN0RGF0ZSxcbiAgTWFwOiBpbnNwZWN0TWFwLFxuICBTZXQ6IGluc3BlY3RTZXQsXG4gIFJlZ0V4cDogaW5zcGVjdFJlZ0V4cCxcbiAgUHJvbWlzZTogcHJvbWlzZV9kZWZhdWx0LFxuICAvLyBXZWFrU2V0LCBXZWFrTWFwIGFyZSB0b3RhbGx5IG9wYXF1ZSB0byB1c1xuICBXZWFrU2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCh2YWx1ZSwgb3B0aW9ucykgPT4gb3B0aW9ucy5zdHlsaXplKFwiV2Vha1NldHtcXHUyMDI2fVwiLCBcInNwZWNpYWxcIiksIFwiV2Vha1NldFwiKSxcbiAgV2Vha01hcDogLyogQF9fUFVSRV9fICovIF9fbmFtZSgodmFsdWUsIG9wdGlvbnMpID0+IG9wdGlvbnMuc3R5bGl6ZShcIldlYWtNYXB7XFx1MjAyNn1cIiwgXCJzcGVjaWFsXCIpLCBcIldlYWtNYXBcIiksXG4gIEFyZ3VtZW50czogaW5zcGVjdEFyZ3VtZW50cyxcbiAgSW50OEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgVWludDhBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQ4Q2xhbXBlZEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MTZBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQxNkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgSW50MzJBcnJheTogaW5zcGVjdFR5cGVkQXJyYXksXG4gIFVpbnQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQzMkFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgRmxvYXQ2NEFycmF5OiBpbnNwZWN0VHlwZWRBcnJheSxcbiAgR2VuZXJhdG9yOiAvKiBAX19QVVJFX18gKi8gX19uYW1lKCgpID0+IFwiXCIsIFwiR2VuZXJhdG9yXCIpLFxuICBEYXRhVmlldzogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkRhdGFWaWV3XCIpLFxuICBBcnJheUJ1ZmZlcjogLyogQF9fUFVSRV9fICovIF9fbmFtZSgoKSA9PiBcIlwiLCBcIkFycmF5QnVmZmVyXCIpLFxuICBFcnJvcjogaW5zcGVjdE9iamVjdDIsXG4gIEhUTUxDb2xsZWN0aW9uOiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb24sXG4gIE5vZGVMaXN0OiBpbnNwZWN0Tm9kZUNvbGxlY3Rpb25cbn07XG52YXIgaW5zcGVjdEN1c3RvbSA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdEZuKSA9PiB7XG4gIGlmIChjaGFpSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbY2hhaUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbY2hhaUluc3BlY3RdKG9wdGlvbnMpO1xuICB9XG4gIGlmIChub2RlSW5zcGVjdCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbbm9kZUluc3BlY3RdID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWVbbm9kZUluc3BlY3RdKG9wdGlvbnMuZGVwdGgsIG9wdGlvbnMsIGluc3BlY3RGbik7XG4gIH1cbiAgaWYgKFwiaW5zcGVjdFwiIGluIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5pbnNwZWN0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXR1cm4gdmFsdWUuaW5zcGVjdChvcHRpb25zLmRlcHRoLCBvcHRpb25zKTtcbiAgfVxuICBpZiAoXCJjb25zdHJ1Y3RvclwiIGluIHZhbHVlICYmIGNvbnN0cnVjdG9yTWFwLmhhcyh2YWx1ZS5jb25zdHJ1Y3RvcikpIHtcbiAgICByZXR1cm4gY29uc3RydWN0b3JNYXAuZ2V0KHZhbHVlLmNvbnN0cnVjdG9yKSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHN0cmluZ1RhZ01hcFt0eXBlM10pIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59LCBcImluc3BlY3RDdXN0b21cIik7XG52YXIgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuZnVuY3Rpb24gaW5zcGVjdCh2YWx1ZSwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpc2VPcHRpb25zKG9wdHMsIGluc3BlY3QpO1xuICBjb25zdCB7IGN1c3RvbUluc3BlY3QgfSA9IG9wdGlvbnM7XG4gIGxldCB0eXBlMyA9IHZhbHVlID09PSBudWxsID8gXCJudWxsXCIgOiB0eXBlb2YgdmFsdWU7XG4gIGlmICh0eXBlMyA9PT0gXCJvYmplY3RcIikge1xuICAgIHR5cGUzID0gdG9TdHJpbmcuY2FsbCh2YWx1ZSkuc2xpY2UoOCwgLTEpO1xuICB9XG4gIGlmICh0eXBlMyBpbiBiYXNlVHlwZXNNYXApIHtcbiAgICByZXR1cm4gYmFzZVR5cGVzTWFwW3R5cGUzXSh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGN1c3RvbUluc3BlY3QgJiYgdmFsdWUpIHtcbiAgICBjb25zdCBvdXRwdXQgPSBpbnNwZWN0Q3VzdG9tKHZhbHVlLCBvcHRpb25zLCB0eXBlMywgaW5zcGVjdCk7XG4gICAgaWYgKG91dHB1dCkge1xuICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICByZXR1cm4gaW5zcGVjdChvdXRwdXQsIG9wdGlvbnMpO1xuICAgIH1cbiAgfVxuICBjb25zdCBwcm90byA9IHZhbHVlID8gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKSA6IGZhbHNlO1xuICBpZiAocHJvdG8gPT09IE9iamVjdC5wcm90b3R5cGUgfHwgcHJvdG8gPT09IG51bGwpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKHZhbHVlICYmIHR5cGVvZiBIVE1MRWxlbWVudCA9PT0gXCJmdW5jdGlvblwiICYmIHZhbHVlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gaW5zcGVjdEhUTUwodmFsdWUsIG9wdGlvbnMpO1xuICB9XG4gIGlmIChcImNvbnN0cnVjdG9yXCIgaW4gdmFsdWUpIHtcbiAgICBpZiAodmFsdWUuY29uc3RydWN0b3IgIT09IE9iamVjdCkge1xuICAgICAgcmV0dXJuIGluc3BlY3RDbGFzcyh2YWx1ZSwgb3B0aW9ucyk7XG4gICAgfVxuICAgIHJldHVybiBpbnNwZWN0T2JqZWN0KHZhbHVlLCBvcHRpb25zKTtcbiAgfVxuICBpZiAodmFsdWUgPT09IE9iamVjdCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gaW5zcGVjdE9iamVjdCh2YWx1ZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnMuc3R5bGl6ZShTdHJpbmcodmFsdWUpLCB0eXBlMyk7XG59XG5fX25hbWUoaW5zcGVjdCwgXCJpbnNwZWN0XCIpO1xuXG4vLyBsaWIvY2hhaS9jb25maWcuanNcbnZhciBjb25maWcgPSB7XG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmluY2x1ZGVTdGFja1xuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgaW5mbHVlbmNlcyB3aGV0aGVyIHN0YWNrIHRyYWNlXG4gICAqIGlzIGluY2x1ZGVkIGluIEFzc2VydGlvbiBlcnJvciBtZXNzYWdlLiBEZWZhdWx0IG9mIGZhbHNlXG4gICAqIHN1cHByZXNzZXMgc3RhY2sgdHJhY2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgPSB0cnVlOyAgLy8gZW5hYmxlIHN0YWNrIG9uIGVycm9yXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgaW5jbHVkZVN0YWNrOiBmYWxzZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcuc2hvd0RpZmZcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGluZmx1ZW5jZXMgd2hldGhlciBvciBub3RcbiAgICogdGhlIGBzaG93RGlmZmAgZmxhZyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHRocm93blxuICAgKiBBc3NlcnRpb25FcnJvcnMuIGBmYWxzZWAgd2lsbCBhbHdheXMgYmUgYGZhbHNlYDsgYHRydWVgXG4gICAqIHdpbGwgYmUgdHJ1ZSB3aGVuIHRoZSBhc3NlcnRpb24gaGFzIHJlcXVlc3RlZCBhIGRpZmZcbiAgICogYmUgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgc2hvd0RpZmY6IHRydWUsXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLnRydW5jYXRlVGhyZXNob2xkXG4gICAqXG4gICAqIFVzZXIgY29uZmlndXJhYmxlIHByb3BlcnR5LCBzZXRzIGxlbmd0aCB0aHJlc2hvbGQgZm9yIGFjdHVhbCBhbmRcbiAgICogZXhwZWN0ZWQgdmFsdWVzIGluIGFzc2VydGlvbiBlcnJvcnMuIElmIHRoaXMgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLCBmb3JcbiAgICogZXhhbXBsZSBmb3IgbGFyZ2UgZGF0YSBzdHJ1Y3R1cmVzLCB0aGUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBzb21ldGhpbmdcbiAgICogbGlrZSBgWyBBcnJheSgzKSBdYCBvciBgeyBPYmplY3QgKHByb3AxLCBwcm9wMikgfWAuXG4gICAqXG4gICAqIFNldCBpdCB0byB6ZXJvIGlmIHlvdSB3YW50IHRvIGRpc2FibGUgdHJ1bmNhdGluZyBhbHRvZ2V0aGVyLlxuICAgKlxuICAgKiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlcmZ1bCB3aGVuIGRvaW5nIGFzc2VydGlvbnMgb24gYXJyYXlzOiBoYXZpbmcgdGhpc1xuICAgKiBzZXQgdG8gYSByZWFzb25hYmxlIGxhcmdlIHZhbHVlIG1ha2VzIHRoZSBmYWlsdXJlIG1lc3NhZ2VzIHJlYWRpbHlcbiAgICogaW5zcGVjdGFibGUuXG4gICAqXG4gICAqICAgICBjaGFpLmNvbmZpZy50cnVuY2F0ZVRocmVzaG9sZCA9IDA7ICAvLyBkaXNhYmxlIHRydW5jYXRpbmdcbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ9XG4gICAqIEBwdWJsaWNcbiAgICovXG4gIHRydW5jYXRlVGhyZXNob2xkOiA0MCxcbiAgLyoqXG4gICAqICMjIyBjb25maWcudXNlUHJveHlcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgaWYgY2hhaSB3aWxsIHVzZSBhIFByb3h5IHRvIHRocm93XG4gICAqIGFuIGVycm9yIHdoZW4gYSBub24tZXhpc3RlbnQgcHJvcGVydHkgaXMgcmVhZCwgd2hpY2ggcHJvdGVjdHMgdXNlcnNcbiAgICogZnJvbSB0eXBvcyB3aGVuIHVzaW5nIHByb3BlcnR5LWJhc2VkIGFzc2VydGlvbnMuXG4gICAqXG4gICAqIFNldCBpdCB0byBmYWxzZSBpZiB5b3Ugd2FudCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS5cbiAgICpcbiAgICogICAgIGNoYWkuY29uZmlnLnVzZVByb3h5ID0gZmFsc2U7ICAvLyBkaXNhYmxlIHVzZSBvZiBQcm94eVxuICAgKlxuICAgKiBUaGlzIGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSBkaXNhYmxlZCByZWdhcmRsZXNzIG9mIHRoaXMgY29uZmlnIHZhbHVlXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IGRvbid0IHN1cHBvcnQgcHJveGllcy5cbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufVxuICAgKiBAcHVibGljXG4gICAqL1xuICB1c2VQcm94eTogdHJ1ZSxcbiAgLyoqXG4gICAqICMjIyBjb25maWcucHJveHlFeGNsdWRlZEtleXNcbiAgICpcbiAgICogVXNlciBjb25maWd1cmFibGUgcHJvcGVydHksIGRlZmluZXMgd2hpY2ggcHJvcGVydGllcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBpbnN0ZWFkIG9mIHRocm93aW5nIGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZSBhc3NlcnRpb24uXG4gICAqIFRoaXMgaXMgb25seSBhcHBsaWVkIGlmIHRoZSBlbnZpcm9ubWVudCBDaGFpIGlzIHJ1bm5pbmcgaW4gc3VwcG9ydHMgcHJveGllcyBhbmRcbiAgICogaWYgdGhlIGB1c2VQcm94eWAgY29uZmlndXJhdGlvbiBzZXR0aW5nIGlzIGVuYWJsZWQuXG4gICAqIEJ5IGRlZmF1bHQsIGB0aGVuYCBhbmQgYGluc3BlY3RgIHdpbGwgbm90IHRocm93IGFuIGVycm9yIGlmIHRoZXkgZG8gbm90IGV4aXN0IG9uIHRoZVxuICAgKiBhc3NlcnRpb24gb2JqZWN0IGJlY2F1c2UgdGhlIGAuaW5zcGVjdGAgcHJvcGVydHkgaXMgcmVhZCBieSBgdXRpbC5pbnNwZWN0YCAoZm9yIGV4YW1wbGUsIHdoZW5cbiAgICogdXNpbmcgYGNvbnNvbGUubG9nYCBvbiB0aGUgYXNzZXJ0aW9uIG9iamVjdCkgYW5kIGAudGhlbmAgaXMgbmVjZXNzYXJ5IGZvciBwcm9taXNlIHR5cGUtY2hlY2tpbmcuXG4gICAqXG4gICAqICAgICAvLyBCeSBkZWZhdWx0IHRoZXNlIGtleXMgd2lsbCBub3QgdGhyb3cgYW4gZXJyb3IgaWYgdGhleSBkbyBub3QgZXhpc3Qgb24gdGhlIGFzc2VydGlvbiBvYmplY3RcbiAgICogICAgIGNoYWkuY29uZmlnLnByb3h5RXhjbHVkZWRLZXlzID0gWyd0aGVuJywgJ2luc3BlY3QnXTtcbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX1cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgcHJveHlFeGNsdWRlZEtleXM6IFtcInRoZW5cIiwgXCJjYXRjaFwiLCBcImluc3BlY3RcIiwgXCJ0b0pTT05cIl0sXG4gIC8qKlxuICAgKiAjIyMgY29uZmlnLmRlZXBFcXVhbFxuICAgKlxuICAgKiBVc2VyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSwgZGVmaW5lcyB3aGljaCBhIGN1c3RvbSBmdW5jdGlvbiB0byB1c2UgZm9yIGRlZXBFcXVhbFxuICAgKiBjb21wYXJpc29ucy5cbiAgICogQnkgZGVmYXVsdCwgdGhlIGZ1bmN0aW9uIHVzZWQgaXMgdGhlIG9uZSBmcm9tIHRoZSBgZGVlcC1lcWxgIHBhY2thZ2Ugd2l0aG91dCBjdXN0b20gY29tcGFyYXRvci5cbiAgICpcbiAgICogICAgIC8vIHVzZSBhIGN1c3RvbSBjb21wYXJhdG9yXG4gICAqICAgICBjaGFpLmNvbmZpZy5kZWVwRXF1YWwgPSAoZXhwZWN0ZWQsIGFjdHVhbCkgPT4ge1xuICAgKiAgICAgICAgIHJldHVybiBjaGFpLnV0aWwuZXFsKGV4cGVjdGVkLCBhY3R1YWwsIHtcbiAgICogICAgICAgICAgICAgY29tcGFyYXRvcjogKGV4cGVjdGVkLCBhY3R1YWwpID0+IHtcbiAgICogICAgICAgICAgICAgICAgIC8vIGZvciBub24gbnVtYmVyIGNvbXBhcmlzb24sIHVzZSB0aGUgZGVmYXVsdCBiZWhhdmlvclxuICAgKiAgICAgICAgICAgICAgICAgaWYodHlwZW9mIGV4cGVjdGVkICE9PSAnbnVtYmVyJykgcmV0dXJuIG51bGw7XG4gICAqICAgICAgICAgICAgICAgICAvLyBhbGxvdyBhIGRpZmZlcmVuY2Ugb2YgMTAgYmV0d2VlbiBjb21wYXJlZCBudW1iZXJzXG4gICAqICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGFjdHVhbCA9PT0gJ251bWJlcicgJiYgTWF0aC5hYnMoYWN0dWFsIC0gZXhwZWN0ZWQpIDwgMTBcbiAgICogICAgICAgICAgICAgfVxuICAgKiAgICAgICAgIH0pXG4gICAqICAgICB9O1xuICAgKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufVxuICAgKiBAcHVibGljXG4gICAqL1xuICBkZWVwRXF1YWw6IG51bGxcbn07XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luc3BlY3QuanNcbmZ1bmN0aW9uIGluc3BlY3QyKG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycykge1xuICBsZXQgb3B0aW9ucyA9IHtcbiAgICBjb2xvcnMsXG4gICAgZGVwdGg6IHR5cGVvZiBkZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IDIgOiBkZXB0aCxcbiAgICBzaG93SGlkZGVuLFxuICAgIHRydW5jYXRlOiBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgPyBjb25maWcudHJ1bmNhdGVUaHJlc2hvbGQgOiBJbmZpbml0eVxuICB9O1xuICByZXR1cm4gaW5zcGVjdChvYmosIG9wdGlvbnMpO1xufVxuX19uYW1lKGluc3BlY3QyLCBcImluc3BlY3RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL29iakRpc3BsYXkuanNcbmZ1bmN0aW9uIG9iakRpc3BsYXkob2JqKSB7XG4gIGxldCBzdHIgPSBpbnNwZWN0MihvYmopLCB0eXBlMyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xuICBpZiAoY29uZmlnLnRydW5jYXRlVGhyZXNob2xkICYmIHN0ci5sZW5ndGggPj0gY29uZmlnLnRydW5jYXRlVGhyZXNob2xkKSB7XG4gICAgaWYgKHR5cGUzID09PSBcIltvYmplY3QgRnVuY3Rpb25dXCIpIHtcbiAgICAgIHJldHVybiAhb2JqLm5hbWUgfHwgb2JqLm5hbWUgPT09IFwiXCIgPyBcIltGdW5jdGlvbl1cIiA6IFwiW0Z1bmN0aW9uOiBcIiArIG9iai5uYW1lICsgXCJdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IEFycmF5XVwiKSB7XG4gICAgICByZXR1cm4gXCJbIEFycmF5KFwiICsgb2JqLmxlbmd0aCArIFwiKSBdXCI7XG4gICAgfSBlbHNlIGlmICh0eXBlMyA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyhvYmopLCBrc3RyID0ga2V5cy5sZW5ndGggPiAyID8ga2V5cy5zcGxpY2UoMCwgMikuam9pbihcIiwgXCIpICsgXCIsIC4uLlwiIDoga2V5cy5qb2luKFwiLCBcIik7XG4gICAgICByZXR1cm4gXCJ7IE9iamVjdCAoXCIgKyBrc3RyICsgXCIpIH1cIjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuX19uYW1lKG9iakRpc3BsYXksIFwib2JqRGlzcGxheVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0TWVzc2FnZS5qc1xuZnVuY3Rpb24gZ2V0TWVzc2FnZTIob2JqLCBhcmdzKSB7XG4gIGxldCBuZWdhdGUgPSBmbGFnKG9iaiwgXCJuZWdhdGVcIik7XG4gIGxldCB2YWwgPSBmbGFnKG9iaiwgXCJvYmplY3RcIik7XG4gIGxldCBleHBlY3RlZCA9IGFyZ3NbM107XG4gIGxldCBhY3R1YWwgPSBnZXRBY3R1YWwob2JqLCBhcmdzKTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcob2JqLCBcIm1lc3NhZ2VcIik7XG4gIGlmICh0eXBlb2YgbXNnID09PSBcImZ1bmN0aW9uXCIpIG1zZyA9IG1zZygpO1xuICBtc2cgPSBtc2cgfHwgXCJcIjtcbiAgbXNnID0gbXNnLnJlcGxhY2UoLyNcXHt0aGlzXFx9L2csIGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBvYmpEaXNwbGF5KHZhbCk7XG4gIH0pLnJlcGxhY2UoLyNcXHthY3RcXH0vZywgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG9iakRpc3BsYXkoYWN0dWFsKTtcbiAgfSkucmVwbGFjZSgvI1xce2V4cFxcfS9nLCBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gb2JqRGlzcGxheShleHBlY3RlZCk7XG4gIH0pO1xuICByZXR1cm4gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgKyBtc2cgOiBtc2c7XG59XG5fX25hbWUoZ2V0TWVzc2FnZTIsIFwiZ2V0TWVzc2FnZVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvdHJhbnNmZXJGbGFncy5qc1xuZnVuY3Rpb24gdHJhbnNmZXJGbGFncyhhc3NlcnRpb24sIG9iamVjdCwgaW5jbHVkZUFsbCkge1xuICBsZXQgZmxhZ3MgPSBhc3NlcnRpb24uX19mbGFncyB8fCAoYXNzZXJ0aW9uLl9fZmxhZ3MgPSAvKiBAX19QVVJFX18gKi8gT2JqZWN0LmNyZWF0ZShudWxsKSk7XG4gIGlmICghb2JqZWN0Ll9fZmxhZ3MpIHtcbiAgICBvYmplY3QuX19mbGFncyA9IC8qIEBfX1BVUkVfXyAqLyBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB9XG4gIGluY2x1ZGVBbGwgPSBhcmd1bWVudHMubGVuZ3RoID09PSAzID8gaW5jbHVkZUFsbCA6IHRydWU7XG4gIGZvciAobGV0IGZsYWczIGluIGZsYWdzKSB7XG4gICAgaWYgKGluY2x1ZGVBbGwgfHwgZmxhZzMgIT09IFwib2JqZWN0XCIgJiYgZmxhZzMgIT09IFwic3NmaVwiICYmIGZsYWczICE9PSBcImxvY2tTc2ZpXCIgJiYgZmxhZzMgIT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgIG9iamVjdC5fX2ZsYWdzW2ZsYWczXSA9IGZsYWdzW2ZsYWczXTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZSh0cmFuc2ZlckZsYWdzLCBcInRyYW5zZmVyRmxhZ3NcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9kZWVwLWVxbC9pbmRleC5qc1xuZnVuY3Rpb24gdHlwZTIob2JqKSB7XG4gIGlmICh0eXBlb2Ygb2JqID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIFwidW5kZWZpbmVkXCI7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIHJldHVybiBcIm51bGxcIjtcbiAgfVxuICBjb25zdCBzdHJpbmdUYWcgPSBvYmpbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiAgaWYgKHR5cGVvZiBzdHJpbmdUYWcgPT09IFwic3RyaW5nXCIpIHtcbiAgICByZXR1cm4gc3RyaW5nVGFnO1xuICB9XG4gIGNvbnN0IHNsaWNlU3RhcnQgPSA4O1xuICBjb25zdCBzbGljZUVuZCA9IC0xO1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikuc2xpY2Uoc2xpY2VTdGFydCwgc2xpY2VFbmQpO1xufVxuX19uYW1lKHR5cGUyLCBcInR5cGVcIik7XG5mdW5jdGlvbiBGYWtlTWFwKCkge1xuICB0aGlzLl9rZXkgPSBcImNoYWkvZGVlcC1lcWxfX1wiICsgTWF0aC5yYW5kb20oKSArIERhdGUubm93KCk7XG59XG5fX25hbWUoRmFrZU1hcCwgXCJGYWtlTWFwXCIpO1xuRmFrZU1hcC5wcm90b3R5cGUgPSB7XG4gIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnZXQoa2V5KSB7XG4gICAgcmV0dXJuIGtleVt0aGlzLl9rZXldO1xuICB9LCBcImdldFwiKSxcbiAgc2V0OiAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgaWYgKE9iamVjdC5pc0V4dGVuc2libGUoa2V5KSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGtleSwgdGhpcy5fa2V5LCB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwgXCJzZXRcIilcbn07XG52YXIgTWVtb2l6ZU1hcCA9IHR5cGVvZiBXZWFrTWFwID09PSBcImZ1bmN0aW9uXCIgPyBXZWFrTWFwIDogRmFrZU1hcDtcbmZ1bmN0aW9uIG1lbW9pemVDb21wYXJlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbWVtb2l6ZU1hcCkge1xuICBpZiAoIW1lbW9pemVNYXAgfHwgaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZhciBsZWZ0SGFuZE1hcCA9IG1lbW9pemVNYXAuZ2V0KGxlZnRIYW5kT3BlcmFuZCk7XG4gIGlmIChsZWZ0SGFuZE1hcCkge1xuICAgIHZhciByZXN1bHQgPSBsZWZ0SGFuZE1hcC5nZXQocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShtZW1vaXplQ29tcGFyZSwgXCJtZW1vaXplQ29tcGFyZVwiKTtcbmZ1bmN0aW9uIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBtZW1vaXplTWFwLCByZXN1bHQpIHtcbiAgaWYgKCFtZW1vaXplTWFwIHx8IGlzUHJpbWl0aXZlKGxlZnRIYW5kT3BlcmFuZCkgfHwgaXNQcmltaXRpdmUocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIGxlZnRIYW5kTWFwID0gbWVtb2l6ZU1hcC5nZXQobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kTWFwKSB7XG4gICAgbGVmdEhhbmRNYXAuc2V0KHJpZ2h0SGFuZE9wZXJhbmQsIHJlc3VsdCk7XG4gIH0gZWxzZSB7XG4gICAgbGVmdEhhbmRNYXAgPSBuZXcgTWVtb2l6ZU1hcCgpO1xuICAgIGxlZnRIYW5kTWFwLnNldChyaWdodEhhbmRPcGVyYW5kLCByZXN1bHQpO1xuICAgIG1lbW9pemVNYXAuc2V0KGxlZnRIYW5kT3BlcmFuZCwgbGVmdEhhbmRNYXApO1xuICB9XG59XG5fX25hbWUobWVtb2l6ZVNldCwgXCJtZW1vaXplU2V0XCIpO1xudmFyIGRlZXBfZXFsX2RlZmF1bHQgPSBkZWVwRXF1YWw7XG5mdW5jdGlvbiBkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY29tcGFyYXRvcikge1xuICAgIHJldHVybiBleHRlbnNpdmVEZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxuICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKHNpbXBsZVJlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBzaW1wbGVSZXN1bHQ7XG4gIH1cbiAgcmV0dXJuIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpO1xufVxuX19uYW1lKGRlZXBFcXVhbCwgXCJkZWVwRXF1YWxcIik7XG5mdW5jdGlvbiBzaW1wbGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCA9PT0gcmlnaHRIYW5kT3BlcmFuZCkge1xuICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQgIT09IDAgfHwgMSAvIGxlZnRIYW5kT3BlcmFuZCA9PT0gMSAvIHJpZ2h0SGFuZE9wZXJhbmQ7XG4gIH1cbiAgaWYgKGxlZnRIYW5kT3BlcmFuZCAhPT0gbGVmdEhhbmRPcGVyYW5kICYmIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJpZ2h0SGFuZE9wZXJhbmQgIT09IHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoaXNQcmltaXRpdmUobGVmdEhhbmRPcGVyYW5kKSB8fCBpc1ByaW1pdGl2ZShyaWdodEhhbmRPcGVyYW5kKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cbl9fbmFtZShzaW1wbGVFcXVhbCwgXCJzaW1wbGVFcXVhbFwiKTtcbmZ1bmN0aW9uIGV4dGVuc2l2ZURlZXBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMubWVtb2l6ZSA9IG9wdGlvbnMubWVtb2l6ZSA9PT0gZmFsc2UgPyBmYWxzZSA6IG9wdGlvbnMubWVtb2l6ZSB8fCBuZXcgTWVtb2l6ZU1hcCgpO1xuICB2YXIgY29tcGFyYXRvciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb21wYXJhdG9yO1xuICB2YXIgbWVtb2l6ZVJlc3VsdExlZnQgPSBtZW1vaXplQ29tcGFyZShsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSk7XG4gIGlmIChtZW1vaXplUmVzdWx0TGVmdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiBtZW1vaXplUmVzdWx0TGVmdDtcbiAgfVxuICB2YXIgbWVtb2l6ZVJlc3VsdFJpZ2h0ID0gbWVtb2l6ZUNvbXBhcmUocmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUpO1xuICBpZiAobWVtb2l6ZVJlc3VsdFJpZ2h0ICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIG1lbW9pemVSZXN1bHRSaWdodDtcbiAgfVxuICBpZiAoY29tcGFyYXRvcikge1xuICAgIHZhciBjb21wYXJhdG9yUmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpO1xuICAgIGlmIChjb21wYXJhdG9yUmVzdWx0ID09PSBmYWxzZSB8fCBjb21wYXJhdG9yUmVzdWx0ID09PSB0cnVlKSB7XG4gICAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBjb21wYXJhdG9yUmVzdWx0KTtcbiAgICAgIHJldHVybiBjb21wYXJhdG9yUmVzdWx0O1xuICAgIH1cbiAgICB2YXIgc2ltcGxlUmVzdWx0ID0gc2ltcGxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBpZiAoc2ltcGxlUmVzdWx0ICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4gc2ltcGxlUmVzdWx0O1xuICAgIH1cbiAgfVxuICB2YXIgbGVmdEhhbmRUeXBlID0gdHlwZTIobGVmdEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kVHlwZSAhPT0gdHlwZTIocmlnaHRIYW5kT3BlcmFuZCkpIHtcbiAgICBtZW1vaXplU2V0KGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucy5tZW1vaXplLCBmYWxzZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIG1lbW9pemVTZXQobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zLm1lbW9pemUsIHRydWUpO1xuICB2YXIgcmVzdWx0ID0gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKTtcbiAgbWVtb2l6ZVNldChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMubWVtb2l6ZSwgcmVzdWx0KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cbl9fbmFtZShleHRlbnNpdmVEZWVwRXF1YWwsIFwiZXh0ZW5zaXZlRGVlcEVxdWFsXCIpO1xuZnVuY3Rpb24gZXh0ZW5zaXZlRGVlcEVxdWFsQnlUeXBlKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgbGVmdEhhbmRUeXBlLCBvcHRpb25zKSB7XG4gIHN3aXRjaCAobGVmdEhhbmRUeXBlKSB7XG4gICAgY2FzZSBcIlN0cmluZ1wiOlxuICAgIGNhc2UgXCJOdW1iZXJcIjpcbiAgICBjYXNlIFwiQm9vbGVhblwiOlxuICAgIGNhc2UgXCJEYXRlXCI6XG4gICAgICByZXR1cm4gZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZC52YWx1ZU9mKCksIHJpZ2h0SGFuZE9wZXJhbmQudmFsdWVPZigpKTtcbiAgICBjYXNlIFwiUHJvbWlzZVwiOlxuICAgIGNhc2UgXCJTeW1ib2xcIjpcbiAgICBjYXNlIFwiZnVuY3Rpb25cIjpcbiAgICBjYXNlIFwiV2Vha01hcFwiOlxuICAgIGNhc2UgXCJXZWFrU2V0XCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kID09PSByaWdodEhhbmRPcGVyYW5kO1xuICAgIGNhc2UgXCJFcnJvclwiOlxuICAgICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIFtcIm5hbWVcIiwgXCJtZXNzYWdlXCIsIFwiY29kZVwiXSwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIkFyZ3VtZW50c1wiOlxuICAgIGNhc2UgXCJJbnQ4QXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDhBcnJheVwiOlxuICAgIGNhc2UgXCJVaW50OENsYW1wZWRBcnJheVwiOlxuICAgIGNhc2UgXCJJbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIlVpbnQxNkFycmF5XCI6XG4gICAgY2FzZSBcIkludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiVWludDMyQXJyYXlcIjpcbiAgICBjYXNlIFwiRmxvYXQzMkFycmF5XCI6XG4gICAgY2FzZSBcIkZsb2F0NjRBcnJheVwiOlxuICAgIGNhc2UgXCJBcnJheVwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiUmVnRXhwXCI6XG4gICAgICByZXR1cm4gcmVnZXhwRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kKTtcbiAgICBjYXNlIFwiR2VuZXJhdG9yXCI6XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiRGF0YVZpZXdcIjpcbiAgICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKG5ldyBVaW50OEFycmF5KGxlZnRIYW5kT3BlcmFuZC5idWZmZXIpLCBuZXcgVWludDhBcnJheShyaWdodEhhbmRPcGVyYW5kLmJ1ZmZlciksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJBcnJheUJ1ZmZlclwiOlxuICAgICAgcmV0dXJuIGl0ZXJhYmxlRXF1YWwobmV3IFVpbnQ4QXJyYXkobGVmdEhhbmRPcGVyYW5kKSwgbmV3IFVpbnQ4QXJyYXkocmlnaHRIYW5kT3BlcmFuZCksIG9wdGlvbnMpO1xuICAgIGNhc2UgXCJTZXRcIjpcbiAgICAgIHJldHVybiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgICBjYXNlIFwiTWFwXCI6XG4gICAgICByZXR1cm4gZW50cmllc0VxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucyk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLlBsYWluRGF0ZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5QbGFpblRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5EYXRlVGltZVwiOlxuICAgIGNhc2UgXCJUZW1wb3JhbC5JbnN0YW50XCI6XG4gICAgY2FzZSBcIlRlbXBvcmFsLlpvbmVkRGF0ZVRpbWVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5ZZWFyTW9udGhcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuUGxhaW5Nb250aERheVwiOlxuICAgICAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC5lcXVhbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gICAgY2FzZSBcIlRlbXBvcmFsLkR1cmF0aW9uXCI6XG4gICAgICByZXR1cm4gbGVmdEhhbmRPcGVyYW5kLnRvdGFsKFwibmFub3NlY29uZHNcIikgPT09IHJpZ2h0SGFuZE9wZXJhbmQudG90YWwoXCJuYW5vc2Vjb25kc1wiKTtcbiAgICBjYXNlIFwiVGVtcG9yYWwuVGltZVpvbmVcIjpcbiAgICBjYXNlIFwiVGVtcG9yYWwuQ2FsZW5kYXJcIjpcbiAgICAgIHJldHVybiBsZWZ0SGFuZE9wZXJhbmQudG9TdHJpbmcoKSA9PT0gcmlnaHRIYW5kT3BlcmFuZC50b1N0cmluZygpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gb2JqZWN0RXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKTtcbiAgfVxufVxuX19uYW1lKGV4dGVuc2l2ZURlZXBFcXVhbEJ5VHlwZSwgXCJleHRlbnNpdmVEZWVwRXF1YWxCeVR5cGVcIik7XG5mdW5jdGlvbiByZWdleHBFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQpIHtcbiAgcmV0dXJuIGxlZnRIYW5kT3BlcmFuZC50b1N0cmluZygpID09PSByaWdodEhhbmRPcGVyYW5kLnRvU3RyaW5nKCk7XG59XG5fX25hbWUocmVnZXhwRXF1YWwsIFwicmVnZXhwRXF1YWxcIik7XG5mdW5jdGlvbiBlbnRyaWVzRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplICE9PSByaWdodEhhbmRPcGVyYW5kLnNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKGxlZnRIYW5kT3BlcmFuZC5zaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0gY2F0Y2ggKHNpemVFcnJvcikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgbGVmdEhhbmRJdGVtcyA9IFtdO1xuICB2YXIgcmlnaHRIYW5kSXRlbXMgPSBbXTtcbiAgbGVmdEhhbmRPcGVyYW5kLmZvckVhY2goLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBnYXRoZXJFbnRyaWVzKGtleSwgdmFsdWUpIHtcbiAgICBsZWZ0SGFuZEl0ZW1zLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgfSwgXCJnYXRoZXJFbnRyaWVzXCIpKTtcbiAgcmlnaHRIYW5kT3BlcmFuZC5mb3JFYWNoKC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gZ2F0aGVyRW50cmllcyhrZXksIHZhbHVlKSB7XG4gICAgcmlnaHRIYW5kSXRlbXMucHVzaChba2V5LCB2YWx1ZV0pO1xuICB9LCBcImdhdGhlckVudHJpZXNcIikpO1xuICByZXR1cm4gaXRlcmFibGVFcXVhbChsZWZ0SGFuZEl0ZW1zLnNvcnQoKSwgcmlnaHRIYW5kSXRlbXMuc29ydCgpLCBvcHRpb25zKTtcbn1cbl9fbmFtZShlbnRyaWVzRXF1YWwsIFwiZW50cmllc0VxdWFsXCIpO1xuZnVuY3Rpb24gaXRlcmFibGVFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGxlZnRIYW5kT3BlcmFuZC5sZW5ndGg7XG4gIGlmIChsZW5ndGggIT09IHJpZ2h0SGFuZE9wZXJhbmQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB2YXIgaW5kZXggPSAtMTtcbiAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcbiAgICBpZiAoZGVlcEVxdWFsKGxlZnRIYW5kT3BlcmFuZFtpbmRleF0sIHJpZ2h0SGFuZE9wZXJhbmRbaW5kZXhdLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoaXRlcmFibGVFcXVhbCwgXCJpdGVyYWJsZUVxdWFsXCIpO1xuZnVuY3Rpb24gZ2VuZXJhdG9yRXF1YWwobGVmdEhhbmRPcGVyYW5kLCByaWdodEhhbmRPcGVyYW5kLCBvcHRpb25zKSB7XG4gIHJldHVybiBpdGVyYWJsZUVxdWFsKGdldEdlbmVyYXRvckVudHJpZXMobGVmdEhhbmRPcGVyYW5kKSwgZ2V0R2VuZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKSwgb3B0aW9ucyk7XG59XG5fX25hbWUoZ2VuZXJhdG9yRXF1YWwsIFwiZ2VuZXJhdG9yRXF1YWxcIik7XG5mdW5jdGlvbiBoYXNJdGVyYXRvckZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gdHlwZW9mIFN5bWJvbCAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgdGFyZ2V0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBTeW1ib2wuaXRlcmF0b3IgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdID09PSBcImZ1bmN0aW9uXCI7XG59XG5fX25hbWUoaGFzSXRlcmF0b3JGdW5jdGlvbiwgXCJoYXNJdGVyYXRvckZ1bmN0aW9uXCIpO1xuZnVuY3Rpb24gZ2V0SXRlcmF0b3JFbnRyaWVzKHRhcmdldCkge1xuICBpZiAoaGFzSXRlcmF0b3JGdW5jdGlvbih0YXJnZXQpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBnZXRHZW5lcmF0b3JFbnRyaWVzKHRhcmdldFtTeW1ib2wuaXRlcmF0b3JdKCkpO1xuICAgIH0gY2F0Y2ggKGl0ZXJhdG9yRXJyb3IpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuX19uYW1lKGdldEl0ZXJhdG9yRW50cmllcywgXCJnZXRJdGVyYXRvckVudHJpZXNcIik7XG5mdW5jdGlvbiBnZXRHZW5lcmF0b3JFbnRyaWVzKGdlbmVyYXRvcikge1xuICB2YXIgZ2VuZXJhdG9yUmVzdWx0ID0gZ2VuZXJhdG9yLm5leHQoKTtcbiAgdmFyIGFjY3VtdWxhdG9yID0gW2dlbmVyYXRvclJlc3VsdC52YWx1ZV07XG4gIHdoaWxlIChnZW5lcmF0b3JSZXN1bHQuZG9uZSA9PT0gZmFsc2UpIHtcbiAgICBnZW5lcmF0b3JSZXN1bHQgPSBnZW5lcmF0b3IubmV4dCgpO1xuICAgIGFjY3VtdWxhdG9yLnB1c2goZ2VuZXJhdG9yUmVzdWx0LnZhbHVlKTtcbiAgfVxuICByZXR1cm4gYWNjdW11bGF0b3I7XG59XG5fX25hbWUoZ2V0R2VuZXJhdG9yRW50cmllcywgXCJnZXRHZW5lcmF0b3JFbnRyaWVzXCIpO1xuZnVuY3Rpb24gZ2V0RW51bWVyYWJsZUtleXModGFyZ2V0KSB7XG4gIHZhciBrZXlzID0gW107XG4gIGZvciAodmFyIGtleSBpbiB0YXJnZXQpIHtcbiAgICBrZXlzLnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlS2V5cywgXCJnZXRFbnVtZXJhYmxlS2V5c1wiKTtcbmZ1bmN0aW9uIGdldEVudW1lcmFibGVTeW1ib2xzKHRhcmdldCkge1xuICB2YXIga2V5cyA9IFtdO1xuICB2YXIgYWxsS2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModGFyZ2V0KTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGxLZXlzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGtleSA9IGFsbEtleXNbaV07XG4gICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpLmVudW1lcmFibGUpIHtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5cztcbn1cbl9fbmFtZShnZXRFbnVtZXJhYmxlU3ltYm9scywgXCJnZXRFbnVtZXJhYmxlU3ltYm9sc1wiKTtcbmZ1bmN0aW9uIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGtleXMsIG9wdGlvbnMpIHtcbiAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChkZWVwRXF1YWwobGVmdEhhbmRPcGVyYW5kW2tleXNbaV1dLCByaWdodEhhbmRPcGVyYW5kW2tleXNbaV1dLCBvcHRpb25zKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5fX25hbWUoa2V5c0VxdWFsLCBcImtleXNFcXVhbFwiKTtcbmZ1bmN0aW9uIG9iamVjdEVxdWFsKGxlZnRIYW5kT3BlcmFuZCwgcmlnaHRIYW5kT3BlcmFuZCwgb3B0aW9ucykge1xuICB2YXIgbGVmdEhhbmRLZXlzID0gZ2V0RW51bWVyYWJsZUtleXMobGVmdEhhbmRPcGVyYW5kKTtcbiAgdmFyIHJpZ2h0SGFuZEtleXMgPSBnZXRFbnVtZXJhYmxlS2V5cyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgdmFyIGxlZnRIYW5kU3ltYm9scyA9IGdldEVudW1lcmFibGVTeW1ib2xzKGxlZnRIYW5kT3BlcmFuZCk7XG4gIHZhciByaWdodEhhbmRTeW1ib2xzID0gZ2V0RW51bWVyYWJsZVN5bWJvbHMocmlnaHRIYW5kT3BlcmFuZCk7XG4gIGxlZnRIYW5kS2V5cyA9IGxlZnRIYW5kS2V5cy5jb25jYXQobGVmdEhhbmRTeW1ib2xzKTtcbiAgcmlnaHRIYW5kS2V5cyA9IHJpZ2h0SGFuZEtleXMuY29uY2F0KHJpZ2h0SGFuZFN5bWJvbHMpO1xuICBpZiAobGVmdEhhbmRLZXlzLmxlbmd0aCAmJiBsZWZ0SGFuZEtleXMubGVuZ3RoID09PSByaWdodEhhbmRLZXlzLmxlbmd0aCkge1xuICAgIGlmIChpdGVyYWJsZUVxdWFsKG1hcFN5bWJvbHMobGVmdEhhbmRLZXlzKS5zb3J0KCksIG1hcFN5bWJvbHMocmlnaHRIYW5kS2V5cykuc29ydCgpKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGtleXNFcXVhbChsZWZ0SGFuZE9wZXJhbmQsIHJpZ2h0SGFuZE9wZXJhbmQsIGxlZnRIYW5kS2V5cywgb3B0aW9ucyk7XG4gIH1cbiAgdmFyIGxlZnRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhsZWZ0SGFuZE9wZXJhbmQpO1xuICB2YXIgcmlnaHRIYW5kRW50cmllcyA9IGdldEl0ZXJhdG9yRW50cmllcyhyaWdodEhhbmRPcGVyYW5kKTtcbiAgaWYgKGxlZnRIYW5kRW50cmllcy5sZW5ndGggJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gcmlnaHRIYW5kRW50cmllcy5sZW5ndGgpIHtcbiAgICBsZWZ0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJpZ2h0SGFuZEVudHJpZXMuc29ydCgpO1xuICAgIHJldHVybiBpdGVyYWJsZUVxdWFsKGxlZnRIYW5kRW50cmllcywgcmlnaHRIYW5kRW50cmllcywgb3B0aW9ucyk7XG4gIH1cbiAgaWYgKGxlZnRIYW5kS2V5cy5sZW5ndGggPT09IDAgJiYgbGVmdEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRLZXlzLmxlbmd0aCA9PT0gMCAmJiByaWdodEhhbmRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbl9fbmFtZShvYmplY3RFcXVhbCwgXCJvYmplY3RFcXVhbFwiKTtcbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCI7XG59XG5fX25hbWUoaXNQcmltaXRpdmUsIFwiaXNQcmltaXRpdmVcIik7XG5mdW5jdGlvbiBtYXBTeW1ib2xzKGFycikge1xuICByZXR1cm4gYXJyLm1hcCgvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uIG1hcFN5bWJvbChlbnRyeSkge1xuICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgIHJldHVybiBlbnRyeS50b1N0cmluZygpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH0sIFwibWFwU3ltYm9sXCIpKTtcbn1cbl9fbmFtZShtYXBTeW1ib2xzLCBcIm1hcFN5bWJvbHNcIik7XG5cbi8vIG5vZGVfbW9kdWxlcy9wYXRodmFsL2luZGV4LmpzXG5mdW5jdGlvbiBoYXNQcm9wZXJ0eShvYmosIG5hbWUpIHtcbiAgaWYgKHR5cGVvZiBvYmogPT09IFwidW5kZWZpbmVkXCIgfHwgb2JqID09PSBudWxsKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBuYW1lIGluIE9iamVjdChvYmopO1xufVxuX19uYW1lKGhhc1Byb3BlcnR5LCBcImhhc1Byb3BlcnR5XCIpO1xuZnVuY3Rpb24gcGFyc2VQYXRoKHBhdGgpIHtcbiAgY29uc3Qgc3RyID0gcGF0aC5yZXBsYWNlKC8oW15cXFxcXSlcXFsvZywgXCIkMS5bXCIpO1xuICBjb25zdCBwYXJ0cyA9IHN0ci5tYXRjaCgvKFxcXFxcXC58W14uXSs/KSsvZyk7XG4gIHJldHVybiBwYXJ0cy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgaWYgKHZhbHVlID09PSBcImNvbnN0cnVjdG9yXCIgfHwgdmFsdWUgPT09IFwiX19wcm90b19fXCIgfHwgdmFsdWUgPT09IFwicHJvdG90eXBlXCIpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcmVnZXhwID0gL15cXFsoXFxkKylcXF0kLztcbiAgICBjb25zdCBtQXJyID0gcmVnZXhwLmV4ZWModmFsdWUpO1xuICAgIGxldCBwYXJzZWQgPSBudWxsO1xuICAgIGlmIChtQXJyKSB7XG4gICAgICBwYXJzZWQgPSB7IGk6IHBhcnNlRmxvYXQobUFyclsxXSkgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyc2VkID0geyBwOiB2YWx1ZS5yZXBsYWNlKC9cXFxcKFsuW1xcXV0pL2csIFwiJDFcIikgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZDtcbiAgfSk7XG59XG5fX25hbWUocGFyc2VQYXRoLCBcInBhcnNlUGF0aFwiKTtcbmZ1bmN0aW9uIGludGVybmFsR2V0UGF0aFZhbHVlKG9iaiwgcGFyc2VkLCBwYXRoRGVwdGgpIHtcbiAgbGV0IHRlbXBvcmFyeVZhbHVlID0gb2JqO1xuICBsZXQgcmVzID0gbnVsbDtcbiAgcGF0aERlcHRoID0gdHlwZW9mIHBhdGhEZXB0aCA9PT0gXCJ1bmRlZmluZWRcIiA/IHBhcnNlZC5sZW5ndGggOiBwYXRoRGVwdGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aERlcHRoOyBpKyspIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFyc2VkW2ldO1xuICAgIGlmICh0ZW1wb3JhcnlWYWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiBwYXJ0LnAgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LmldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGVtcG9yYXJ5VmFsdWUgPSB0ZW1wb3JhcnlWYWx1ZVtwYXJ0LnBdO1xuICAgICAgfVxuICAgICAgaWYgKGkgPT09IHBhdGhEZXB0aCAtIDEpIHtcbiAgICAgICAgcmVzID0gdGVtcG9yYXJ5VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5fX25hbWUoaW50ZXJuYWxHZXRQYXRoVmFsdWUsIFwiaW50ZXJuYWxHZXRQYXRoVmFsdWVcIik7XG5mdW5jdGlvbiBnZXRQYXRoSW5mbyhvYmosIHBhdGgpIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VQYXRoKHBhdGgpO1xuICBjb25zdCBsYXN0ID0gcGFyc2VkW3BhcnNlZC5sZW5ndGggLSAxXTtcbiAgY29uc3QgaW5mbyA9IHtcbiAgICBwYXJlbnQ6IHBhcnNlZC5sZW5ndGggPiAxID8gaW50ZXJuYWxHZXRQYXRoVmFsdWUob2JqLCBwYXJzZWQsIHBhcnNlZC5sZW5ndGggLSAxKSA6IG9iaixcbiAgICBuYW1lOiBsYXN0LnAgfHwgbGFzdC5pLFxuICAgIHZhbHVlOiBpbnRlcm5hbEdldFBhdGhWYWx1ZShvYmosIHBhcnNlZClcbiAgfTtcbiAgaW5mby5leGlzdHMgPSBoYXNQcm9wZXJ0eShpbmZvLnBhcmVudCwgaW5mby5uYW1lKTtcbiAgcmV0dXJuIGluZm87XG59XG5fX25hbWUoZ2V0UGF0aEluZm8sIFwiZ2V0UGF0aEluZm9cIik7XG5cbi8vIGxpYi9jaGFpL2Fzc2VydGlvbi5qc1xudmFyIF9Bc3NlcnRpb24gPSBjbGFzcyBfQXNzZXJ0aW9uIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgb2JqZWN0IGZvciBjaGFpbmluZy5cbiAgICogYEFzc2VydGlvbmAgb2JqZWN0cyBjb250YWluIG1ldGFkYXRhIGluIHRoZSBmb3JtIG9mIGZsYWdzLiBUaHJlZSBmbGFncyBjYW5cbiAgICogYmUgYXNzaWduZWQgZHVyaW5nIGluc3RhbnRpYXRpb24gYnkgcGFzc2luZyBhcmd1bWVudHMgdG8gdGhpcyBjb25zdHJ1Y3RvcjpcbiAgICpcbiAgICogLSBgb2JqZWN0YDogVGhpcyBmbGFnIGNvbnRhaW5zIHRoZSB0YXJnZXQgb2YgdGhlIGFzc2VydGlvbi4gRm9yIGV4YW1wbGUsIGluXG4gICAqIHRoZSBhc3NlcnRpb24gYGV4cGVjdChudW1LaXR0ZW5zKS50by5lcXVhbCg3KTtgLCB0aGUgYG9iamVjdGAgZmxhZyB3aWxsXG4gICAqIGNvbnRhaW4gYG51bUtpdHRlbnNgIHNvIHRoYXQgdGhlIGBlcXVhbGAgYXNzZXJ0aW9uIGNhbiByZWZlcmVuY2UgaXQgd2hlblxuICAgKiBuZWVkZWQuXG4gICAqXG4gICAqIC0gYG1lc3NhZ2VgOiBUaGlzIGZsYWcgY29udGFpbnMgYW4gb3B0aW9uYWwgY3VzdG9tIGVycm9yIG1lc3NhZ2UgdG8gYmVcbiAgICogcHJlcGVuZGVkIHRvIHRoZSBlcnJvciBtZXNzYWdlIHRoYXQncyBnZW5lcmF0ZWQgYnkgdGhlIGFzc2VydGlvbiB3aGVuIGl0XG4gICAqIGZhaWxzLlxuICAgKlxuICAgKiAtIGBzc2ZpYDogVGhpcyBmbGFnIHN0YW5kcyBmb3IgXCJzdGFydCBzdGFjayBmdW5jdGlvbiBpbmRpY2F0b3JcIi4gSXRcbiAgICogY29udGFpbnMgYSBmdW5jdGlvbiByZWZlcmVuY2UgdGhhdCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvclxuICAgKiByZW1vdmluZyBmcmFtZXMgZnJvbSB0aGUgc3RhY2sgdHJhY2Ugb2YgdGhlIGVycm9yIHRoYXQncyBjcmVhdGVkIGJ5IHRoZVxuICAgKiBhc3NlcnRpb24gd2hlbiBpdCBmYWlscy4gVGhlIGdvYWwgaXMgdG8gcHJvdmlkZSBhIGNsZWFuZXIgc3RhY2sgdHJhY2UgdG9cbiAgICogZW5kIHVzZXJzIGJ5IHJlbW92aW5nIENoYWkncyBpbnRlcm5hbCBmdW5jdGlvbnMuIE5vdGUgdGhhdCBpdCBvbmx5IHdvcmtzXG4gICAqIGluIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgYEVycm9yLmNhcHR1cmVTdGFja1RyYWNlYCwgYW5kIG9ubHkgd2hlblxuICAgKiBgQ2hhaS5jb25maWcuaW5jbHVkZVN0YWNrYCBoYXNuJ3QgYmVlbiBzZXQgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogLSBgbG9ja1NzZmlgOiBUaGlzIGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGBzc2ZpYCBmbGFnXG4gICAqIHNob3VsZCByZXRhaW4gaXRzIGN1cnJlbnQgdmFsdWUsIGV2ZW4gYXMgYXNzZXJ0aW9ucyBhcmUgY2hhaW5lZCBvZmYgb2ZcbiAgICogdGhpcyBvYmplY3QuIFRoaXMgaXMgdXN1YWxseSBzZXQgdG8gYHRydWVgIHdoZW4gY3JlYXRpbmcgYSBuZXcgYXNzZXJ0aW9uXG4gICAqIGZyb20gd2l0aGluIGFub3RoZXIgYXNzZXJ0aW9uLiBJdCdzIGFsc28gdGVtcG9yYXJpbHkgc2V0IHRvIGB0cnVlYCBiZWZvcmVcbiAgICogYW4gb3ZlcndyaXR0ZW4gYXNzZXJ0aW9uIGdldHMgY2FsbGVkIGJ5IHRoZSBvdmVyd3JpdGluZyBhc3NlcnRpb24uXG4gICAqXG4gICAqIC0gYGVxbGA6IFRoaXMgZmxhZyBjb250YWlucyB0aGUgZGVlcEVxdWFsIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgdGhlIGFzc2VydGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSBvYmogdGFyZ2V0IG9mIHRoZSBhc3NlcnRpb25cbiAgICogQHBhcmFtIHtzdHJpbmd9IFttc2ddIChvcHRpb25hbCkgY3VzdG9tIGVycm9yIG1lc3NhZ2VcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3NzZmldIChvcHRpb25hbCkgc3RhcnRpbmcgcG9pbnQgZm9yIHJlbW92aW5nIHN0YWNrIGZyYW1lc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtsb2NrU3NmaV0gKG9wdGlvbmFsKSB3aGV0aGVyIG9yIG5vdCB0aGUgc3NmaSBmbGFnIGlzIGxvY2tlZFxuICAgKi9cbiAgY29uc3RydWN0b3Iob2JqLCBtc2csIHNzZmksIGxvY2tTc2ZpKSB7XG4gICAgLyoqIEB0eXBlIHt7fX0gKi9cbiAgICBfX3B1YmxpY0ZpZWxkKHRoaXMsIFwiX19mbGFnc1wiLCB7fSk7XG4gICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgc3NmaSB8fCBfQXNzZXJ0aW9uKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgbG9ja1NzZmkpO1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgb2JqKTtcbiAgICBmbGFnKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICAgIGZsYWcodGhpcywgXCJlcWxcIiwgY29uZmlnLmRlZXBFcXVhbCB8fCBkZWVwX2VxbF9kZWZhdWx0KTtcbiAgICByZXR1cm4gcHJveGlmeSh0aGlzKTtcbiAgfVxuICAvKiogQHJldHVybnMge2Jvb2xlYW59ICovXG4gIHN0YXRpYyBnZXQgaW5jbHVkZVN0YWNrKCkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQXNzZXJ0aW9uLmluY2x1ZGVTdGFjayBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuaW5jbHVkZVN0YWNrIGluc3RlYWQuXCJcbiAgICApO1xuICAgIHJldHVybiBjb25maWcuaW5jbHVkZVN0YWNrO1xuICB9XG4gIC8qKiBAcGFyYW0ge2Jvb2xlYW59IHZhbHVlICovXG4gIHN0YXRpYyBzZXQgaW5jbHVkZVN0YWNrKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uaW5jbHVkZVN0YWNrIGlzIGRlcHJlY2F0ZWQsIHVzZSBjaGFpLmNvbmZpZy5pbmNsdWRlU3RhY2sgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgY29uZmlnLmluY2x1ZGVTdGFjayA9IHZhbHVlO1xuICB9XG4gIC8qKiBAcmV0dXJucyB7Ym9vbGVhbn0gKi9cbiAgc3RhdGljIGdldCBzaG93RGlmZigpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIkFzc2VydGlvbi5zaG93RGlmZiBpcyBkZXByZWNhdGVkLCB1c2UgY2hhaS5jb25maWcuc2hvd0RpZmYgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgcmV0dXJuIGNvbmZpZy5zaG93RGlmZjtcbiAgfVxuICAvKiogQHBhcmFtIHtib29sZWFufSB2YWx1ZSAqL1xuICBzdGF0aWMgc2V0IHNob3dEaWZmKHZhbHVlKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJBc3NlcnRpb24uc2hvd0RpZmYgaXMgZGVwcmVjYXRlZCwgdXNlIGNoYWkuY29uZmlnLnNob3dEaWZmIGluc3RlYWQuXCJcbiAgICApO1xuICAgIGNvbmZpZy5zaG93RGlmZiA9IHZhbHVlO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIGFkZFByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgYWRkUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBhZGRNZXRob2QobmFtZSwgZm4pIHtcbiAgICBhZGRNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIGFkZENoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIGFkZENoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZVByb3BlcnR5KG5hbWUsIGZuKSB7XG4gICAgb3ZlcndyaXRlUHJvcGVydHkodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICovXG4gIHN0YXRpYyBvdmVyd3JpdGVNZXRob2QobmFtZSwgZm4pIHtcbiAgICBvdmVyd3JpdGVNZXRob2QodGhpcy5wcm90b3R5cGUsIG5hbWUsIGZuKTtcbiAgfVxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2hhaW5pbmdCZWhhdmlvclxuICAgKi9cbiAgc3RhdGljIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZChuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIG92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZCh0aGlzLnByb3RvdHlwZSwgbmFtZSwgZm4sIGNoYWluaW5nQmVoYXZpb3IpO1xuICB9XG4gIC8qKlxuICAgKiAjIyMgLmFzc2VydChleHByZXNzaW9uLCBtZXNzYWdlLCBuZWdhdGVNZXNzYWdlLCBleHBlY3RlZCwgYWN0dWFsLCBzaG93RGlmZilcbiAgICpcbiAgICogRXhlY3V0ZXMgYW4gZXhwcmVzc2lvbiBhbmQgY2hlY2sgZXhwZWN0YXRpb25zLiBUaHJvd3MgQXNzZXJ0aW9uRXJyb3IgZm9yIHJlcG9ydGluZyBpZiB0ZXN0IGRvZXNuJ3QgcGFzcy5cbiAgICpcbiAgICogQG5hbWUgYXNzZXJ0XG4gICAqIEBwYXJhbSB7dW5rbm93bn0gX2V4cHIgdG8gYmUgdGVzdGVkXG4gICAqIEBwYXJhbSB7c3RyaW5nIHwgRnVuY3Rpb259IG1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbWVzc2FnZSB0byBkaXNwbGF5IGlmIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHtzdHJpbmcgfCBGdW5jdGlvbn0gX25lZ2F0ZU1zZyBvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgbmVnYXRlZE1lc3NhZ2UgdG8gZGlzcGxheSBpZiBuZWdhdGVkIGV4cHJlc3Npb24gZmFpbHNcbiAgICogQHBhcmFtIHt1bmtub3dufSBleHBlY3RlZCB2YWx1ZSAocmVtZW1iZXIgdG8gY2hlY2sgZm9yIG5lZ2F0aW9uKVxuICAgKiBAcGFyYW0ge3Vua25vd259IF9hY3R1YWwgKG9wdGlvbmFsKSB3aWxsIGRlZmF1bHQgdG8gYHRoaXMub2JqYFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHNob3dEaWZmIChvcHRpb25hbCkgd2hlbiBzZXQgdG8gYHRydWVgLCBhc3NlcnQgd2lsbCBkaXNwbGF5IGEgZGlmZiBpbiBhZGRpdGlvbiB0byB0aGUgbWVzc2FnZSBpZiBleHByZXNzaW9uIGZhaWxzXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgYXNzZXJ0KF9leHByLCBtc2csIF9uZWdhdGVNc2csIGV4cGVjdGVkLCBfYWN0dWFsLCBzaG93RGlmZikge1xuICAgIGNvbnN0IG9rID0gdGVzdCh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChmYWxzZSAhPT0gc2hvd0RpZmYpIHNob3dEaWZmID0gdHJ1ZTtcbiAgICBpZiAodm9pZCAwID09PSBleHBlY3RlZCAmJiB2b2lkIDAgPT09IF9hY3R1YWwpIHNob3dEaWZmID0gZmFsc2U7XG4gICAgaWYgKHRydWUgIT09IGNvbmZpZy5zaG93RGlmZikgc2hvd0RpZmYgPSBmYWxzZTtcbiAgICBpZiAoIW9rKSB7XG4gICAgICBtc2cgPSBnZXRNZXNzYWdlMih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgY29uc3QgYWN0dWFsID0gZ2V0QWN0dWFsKHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICBjb25zdCBhc3NlcnRpb25FcnJvck9iamVjdFByb3BlcnRpZXMgPSB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIHNob3dEaWZmXG4gICAgICB9O1xuICAgICAgY29uc3Qgb3BlcmF0b3IgPSBnZXRPcGVyYXRvcih0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgaWYgKG9wZXJhdG9yKSB7XG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcy5vcGVyYXRvciA9IG9wZXJhdG9yO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2csXG4gICAgICAgIGFzc2VydGlvbkVycm9yT2JqZWN0UHJvcGVydGllcyxcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBOb3Qgc3VyZSB3aGF0IHRvIGRvIGFib3V0IHRoZXNlIHR5cGVzIHlldFxuICAgICAgICBjb25maWcuaW5jbHVkZVN0YWNrID8gdGhpcy5hc3NlcnQgOiBmbGFnKHRoaXMsIFwic3NmaVwiKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLyoqXG4gICAqIFF1aWNrIHJlZmVyZW5jZSB0byBzdG9yZWQgYGFjdHVhbGAgdmFsdWUgZm9yIHBsdWdpbiBkZXZlbG9wZXJzLlxuICAgKlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn1cbiAgICovXG4gIGdldCBfb2JqKCkge1xuICAgIHJldHVybiBmbGFnKHRoaXMsIFwib2JqZWN0XCIpO1xuICB9XG4gIC8qKlxuICAgKiBRdWljayByZWZlcmVuY2UgdG8gc3RvcmVkIGBhY3R1YWxgIHZhbHVlIGZvciBwbHVnaW4gZGV2ZWxvcGVycy5cbiAgICpcbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWxcbiAgICovXG4gIHNldCBfb2JqKHZhbCkge1xuICAgIGZsYWcodGhpcywgXCJvYmplY3RcIiwgdmFsKTtcbiAgfVxufTtcbl9fbmFtZShfQXNzZXJ0aW9uLCBcIkFzc2VydGlvblwiKTtcbnZhciBBc3NlcnRpb24gPSBfQXNzZXJ0aW9uO1xuXG4vLyBsaWIvY2hhaS91dGlscy9ldmVudHMuanNcbnZhciBldmVudHMgPSBuZXcgRXZlbnRUYXJnZXQoKTtcbnZhciBfUGx1Z2luRXZlbnQgPSBjbGFzcyBfUGx1Z2luRXZlbnQgZXh0ZW5kcyBFdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbikge1xuICAgIHN1cGVyKHR5cGUzKTtcbiAgICB0aGlzLm5hbWUgPSBTdHJpbmcobmFtZSk7XG4gICAgdGhpcy5mbiA9IGZuO1xuICB9XG59O1xuX19uYW1lKF9QbHVnaW5FdmVudCwgXCJQbHVnaW5FdmVudFwiKTtcbnZhciBQbHVnaW5FdmVudCA9IF9QbHVnaW5FdmVudDtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNQcm94eUVuYWJsZWQuanNcbmZ1bmN0aW9uIGlzUHJveHlFbmFibGVkKCkge1xuICByZXR1cm4gY29uZmlnLnVzZVByb3h5ICYmIHR5cGVvZiBQcm94eSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgUmVmbGVjdCAhPT0gXCJ1bmRlZmluZWRcIjtcbn1cbl9fbmFtZShpc1Byb3h5RW5hYmxlZCwgXCJpc1Byb3h5RW5hYmxlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkUHJvcGVydHkuanNcbmZ1bmN0aW9uIGFkZFByb3BlcnR5KGN0eCwgbmFtZSwgZ2V0dGVyKSB7XG4gIGdldHRlciA9IGdldHRlciA9PT0gdm9pZCAwID8gZnVuY3Rpb24oKSB7XG4gIH0gOiBnZXR0ZXI7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJvcGVydHlHZXR0ZXIoKSB7XG4gICAgICBpZiAoIWlzUHJveHlFbmFibGVkKCkgJiYgIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBwcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgcmVzdWx0ID0gZ2V0dGVyLmNhbGwodGhpcyk7XG4gICAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHJldHVybiByZXN1bHQ7XG4gICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgICB9LCBcInByb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkUHJvcGVydHlcIiwgbmFtZSwgZ2V0dGVyKSk7XG59XG5fX25hbWUoYWRkUHJvcGVydHksIFwiYWRkUHJvcGVydHlcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZExlbmd0aEd1YXJkLmpzXG52YXIgZm5MZW5ndGhEZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihmdW5jdGlvbigpIHtcbn0sIFwibGVuZ3RoXCIpO1xuZnVuY3Rpb24gYWRkTGVuZ3RoR3VhcmQoZm4sIGFzc2VydGlvbk5hbWUsIGlzQ2hhaW5hYmxlKSB7XG4gIGlmICghZm5MZW5ndGhEZXNjLmNvbmZpZ3VyYWJsZSkgcmV0dXJuIGZuO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZm4sIFwibGVuZ3RoXCIsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoaXNDaGFpbmFibGUpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBEdWUgdG8gYSBjb21wYXRpYmlsaXR5IGlzc3VlLCBcImxlbmd0aFwiIGNhbm5vdCBkaXJlY3RseSBmb2xsb3cgXCInICsgYXNzZXJ0aW9uTmFtZSArICdcIi4gVXNlIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnLmxlbmd0aE9mXCIgaW5zdGVhZC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgYXNzZXJ0aW9uTmFtZSArICcubGVuZ3RoLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIGFzc2VydGlvbk5hbWUgKyAnXCIuJ1xuICAgICAgKTtcbiAgICB9LCBcImdldFwiKVxuICB9KTtcbiAgcmV0dXJuIGZuO1xufVxuX19uYW1lKGFkZExlbmd0aEd1YXJkLCBcImFkZExlbmd0aEd1YXJkXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9nZXRQcm9wZXJ0aWVzLmpzXG5mdW5jdGlvbiBnZXRQcm9wZXJ0aWVzKG9iamVjdCkge1xuICBsZXQgcmVzdWx0ID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMob2JqZWN0KTtcbiAgZnVuY3Rpb24gYWRkUHJvcGVydHkyKHByb3BlcnR5KSB7XG4gICAgaWYgKHJlc3VsdC5pbmRleE9mKHByb3BlcnR5KSA9PT0gLTEpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHByb3BlcnR5KTtcbiAgICB9XG4gIH1cbiAgX19uYW1lKGFkZFByb3BlcnR5MiwgXCJhZGRQcm9wZXJ0eVwiKTtcbiAgbGV0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKG9iamVjdCk7XG4gIHdoaWxlIChwcm90byAhPT0gbnVsbCkge1xuICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKS5mb3JFYWNoKGFkZFByb3BlcnR5Mik7XG4gICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5fX25hbWUoZ2V0UHJvcGVydGllcywgXCJnZXRQcm9wZXJ0aWVzXCIpO1xuXG4vLyBsaWIvY2hhaS91dGlscy9wcm94aWZ5LmpzXG52YXIgYnVpbHRpbnMgPSBbXCJfX2ZsYWdzXCIsIFwiX19tZXRob2RzXCIsIFwiX29ialwiLCBcImFzc2VydFwiXTtcbmZ1bmN0aW9uIHByb3hpZnkob2JqLCBub25DaGFpbmFibGVNZXRob2ROYW1lKSB7XG4gIGlmICghaXNQcm94eUVuYWJsZWQoKSkgcmV0dXJuIG9iajtcbiAgcmV0dXJuIG5ldyBQcm94eShvYmosIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gcHJveHlHZXR0ZXIodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eSA9PT0gXCJzdHJpbmdcIiAmJiBjb25maWcucHJveHlFeGNsdWRlZEtleXMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFSZWZsZWN0Lmhhcyh0YXJnZXQsIHByb3BlcnR5KSkge1xuICAgICAgICBpZiAobm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgbm9uQ2hhaW5hYmxlTWV0aG9kTmFtZSArIFwiLlwiICsgcHJvcGVydHkgKyAnLiBTZWUgZG9jcyBmb3IgcHJvcGVyIHVzYWdlIG9mIFwiJyArIG5vbkNoYWluYWJsZU1ldGhvZE5hbWUgKyAnXCIuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHN1Z2dlc3Rpb24gPSBudWxsO1xuICAgICAgICBsZXQgc3VnZ2VzdGlvbkRpc3RhbmNlID0gNDtcbiAgICAgICAgZ2V0UHJvcGVydGllcyh0YXJnZXQpLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIC8vIHdlIGFjdHVhbGx5IG1lYW4gdG8gY2hlY2sgYE9iamVjdC5wcm90b3R5cGVgIGhlcmVcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnNcbiAgICAgICAgICAgICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGJ1aWx0aW5zLmluZGV4T2YocHJvcCkgPT09IC0xXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgZGlzdCA9IHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHByb3BlcnR5LCBwcm9wLCBzdWdnZXN0aW9uRGlzdGFuY2UpO1xuICAgICAgICAgICAgaWYgKGRpc3QgPCBzdWdnZXN0aW9uRGlzdGFuY2UpIHtcbiAgICAgICAgICAgICAgc3VnZ2VzdGlvbiA9IHByb3A7XG4gICAgICAgICAgICAgIHN1Z2dlc3Rpb25EaXN0YW5jZSA9IGRpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN1Z2dlc3Rpb24gIT09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIFwiSW52YWxpZCBDaGFpIHByb3BlcnR5OiBcIiArIHByb3BlcnR5ICsgJy4gRGlkIHlvdSBtZWFuIFwiJyArIHN1Z2dlc3Rpb24gKyAnXCI/J1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXCJJbnZhbGlkIENoYWkgcHJvcGVydHk6IFwiICsgcHJvcGVydHkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYnVpbHRpbnMuaW5kZXhPZihwcm9wZXJ0eSkgPT09IC0xICYmICFmbGFnKHRhcmdldCwgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICBmbGFnKHRhcmdldCwgXCJzc2ZpXCIsIHByb3h5R2V0dGVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5KTtcbiAgICB9LCBcInByb3h5R2V0dGVyXCIpXG4gIH0pO1xufVxuX19uYW1lKHByb3hpZnksIFwicHJveGlmeVwiKTtcbmZ1bmN0aW9uIHN0cmluZ0Rpc3RhbmNlQ2FwcGVkKHN0ckEsIHN0ckIsIGNhcCkge1xuICBpZiAoTWF0aC5hYnMoc3RyQS5sZW5ndGggLSBzdHJCLmxlbmd0aCkgPj0gY2FwKSB7XG4gICAgcmV0dXJuIGNhcDtcbiAgfVxuICBsZXQgbWVtbyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbWVtb1tpXSA9IEFycmF5KHN0ckIubGVuZ3RoICsgMSkuZmlsbCgwKTtcbiAgICBtZW1vW2ldWzBdID0gaTtcbiAgfVxuICBmb3IgKGxldCBqID0gMDsgaiA8IHN0ckIubGVuZ3RoOyBqKyspIHtcbiAgICBtZW1vWzBdW2pdID0gajtcbiAgfVxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBzdHJBLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IGNoID0gc3RyQS5jaGFyQ29kZUF0KGkgLSAxKTtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBzdHJCLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoTWF0aC5hYnMoaSAtIGopID49IGNhcCkge1xuICAgICAgICBtZW1vW2ldW2pdID0gY2FwO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1pbihcbiAgICAgICAgbWVtb1tpIC0gMV1bal0gKyAxLFxuICAgICAgICBtZW1vW2ldW2ogLSAxXSArIDEsXG4gICAgICAgIG1lbW9baSAtIDFdW2ogLSAxXSArIChjaCA9PT0gc3RyQi5jaGFyQ29kZUF0KGogLSAxKSA/IDAgOiAxKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lbW9bc3RyQS5sZW5ndGhdW3N0ckIubGVuZ3RoXTtcbn1cbl9fbmFtZShzdHJpbmdEaXN0YW5jZUNhcHBlZCwgXCJzdHJpbmdEaXN0YW5jZUNhcHBlZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvYWRkTWV0aG9kLmpzXG5mdW5jdGlvbiBhZGRNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IG1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBtZXRob2RXcmFwcGVyKTtcbiAgICB9XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkgcmV0dXJuIHJlc3VsdDtcbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm1ldGhvZFdyYXBwZXJcIik7XG4gIGFkZExlbmd0aEd1YXJkKG1ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShtZXRob2RXcmFwcGVyLCBuYW1lKTtcbiAgZXZlbnRzLmRpc3BhdGNoRXZlbnQobmV3IFBsdWdpbkV2ZW50KFwiYWRkTWV0aG9kXCIsIG5hbWUsIG1ldGhvZCkpO1xufVxuX19uYW1lKGFkZE1ldGhvZCwgXCJhZGRNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL292ZXJ3cml0ZVByb3BlcnR5LmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVQcm9wZXJ0eShjdHgsIG5hbWUsIGdldHRlcikge1xuICBsZXQgX2dldCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBuYW1lKSwgX3N1cGVyID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfZ2V0ICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9nZXQuZ2V0KSBfc3VwZXIgPSBfZ2V0LmdldDtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGN0eCwgbmFtZSwge1xuICAgIGdldDogLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyKCkge1xuICAgICAgaWYgKCFpc1Byb3h5RW5hYmxlZCgpICYmICFmbGFnKHRoaXMsIFwibG9ja1NzZmlcIikpIHtcbiAgICAgICAgZmxhZyh0aGlzLCBcInNzZmlcIiwgb3ZlcndyaXRpbmdQcm9wZXJ0eUdldHRlcik7XG4gICAgICB9XG4gICAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgICAgZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIsIHRydWUpO1xuICAgICAgbGV0IHJlc3VsdCA9IGdldHRlcihfc3VwZXIpLmNhbGwodGhpcyk7XG4gICAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgfSwgXCJvdmVyd3JpdGluZ1Byb3BlcnR5R2V0dGVyXCIpLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbn1cbl9fbmFtZShvdmVyd3JpdGVQcm9wZXJ0eSwgXCJvdmVyd3JpdGVQcm9wZXJ0eVwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QpIHtcbiAgbGV0IF9tZXRob2QgPSBjdHhbbmFtZV0sIF9zdXBlciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG5hbWUgKyBcIiBpcyBub3QgYSBmdW5jdGlvblwiKTtcbiAgfSwgXCJfc3VwZXJcIik7XG4gIGlmIChfbWV0aG9kICYmIFwiZnVuY3Rpb25cIiA9PT0gdHlwZW9mIF9tZXRob2QpIF9zdXBlciA9IF9tZXRob2Q7XG4gIGxldCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgIGlmICghZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpKSB7XG4gICAgICBmbGFnKHRoaXMsIFwic3NmaVwiLCBvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIpO1xuICAgIH1cbiAgICBsZXQgb3JpZ0xvY2tTc2ZpID0gZmxhZyh0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcodGhpcywgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICBsZXQgcmVzdWx0ID0gbWV0aG9kKF9zdXBlcikuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICBmbGFnKHRoaXMsIFwibG9ja1NzZmlcIiwgb3JpZ0xvY2tTc2ZpKTtcbiAgICBpZiAocmVzdWx0ICE9PSB2b2lkIDApIHtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGxldCBuZXdBc3NlcnRpb24gPSBuZXcgQXNzZXJ0aW9uKCk7XG4gICAgdHJhbnNmZXJGbGFncyh0aGlzLCBuZXdBc3NlcnRpb24pO1xuICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gIH0sIFwib3ZlcndyaXRpbmdNZXRob2RXcmFwcGVyXCIpO1xuICBhZGRMZW5ndGhHdWFyZChvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUsIGZhbHNlKTtcbiAgY3R4W25hbWVdID0gcHJveGlmeShvdmVyd3JpdGluZ01ldGhvZFdyYXBwZXIsIG5hbWUpO1xufVxuX19uYW1lKG92ZXJ3cml0ZU1ldGhvZCwgXCJvdmVyd3JpdGVNZXRob2RcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2FkZENoYWluYWJsZU1ldGhvZC5qc1xudmFyIGNhblNldFByb3RvdHlwZSA9IHR5cGVvZiBPYmplY3Quc2V0UHJvdG90eXBlT2YgPT09IFwiZnVuY3Rpb25cIjtcbnZhciB0ZXN0Rm4gPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xufSwgXCJ0ZXN0Rm5cIik7XG52YXIgZXhjbHVkZU5hbWVzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdEZuKS5maWx0ZXIoZnVuY3Rpb24obmFtZSkge1xuICBsZXQgcHJvcERlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRlc3RGbiwgbmFtZSk7XG4gIGlmICh0eXBlb2YgcHJvcERlc2MgIT09IFwib2JqZWN0XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIXByb3BEZXNjLmNvbmZpZ3VyYWJsZTtcbn0pO1xudmFyIGNhbGwgPSBGdW5jdGlvbi5wcm90b3R5cGUuY2FsbDtcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBjbGFzcyBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgZXh0ZW5kcyBQbHVnaW5FdmVudCB7XG4gIGNvbnN0cnVjdG9yKHR5cGUzLCBuYW1lLCBmbiwgY2hhaW5pbmdCZWhhdmlvcikge1xuICAgIHN1cGVyKHR5cGUzLCBuYW1lLCBmbik7XG4gICAgdGhpcy5jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5pbmdCZWhhdmlvcjtcbiAgfVxufTtcbl9fbmFtZShfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQsIFwiUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnRcIik7XG52YXIgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQgPSBfUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQ7XG5mdW5jdGlvbiBhZGRDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgaWYgKHR5cGVvZiBjaGFpbmluZ0JlaGF2aW9yICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBjaGFpbmluZ0JlaGF2aW9yID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbigpIHtcbiAgICB9LCBcImNoYWluaW5nQmVoYXZpb3JcIik7XG4gIH1cbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0ge1xuICAgIG1ldGhvZCxcbiAgICBjaGFpbmluZ0JlaGF2aW9yXG4gIH07XG4gIGlmICghY3R4Ll9fbWV0aG9kcykge1xuICAgIGN0eC5fX21ldGhvZHMgPSB7fTtcbiAgfVxuICBjdHguX19tZXRob2RzW25hbWVdID0gY2hhaW5hYmxlQmVoYXZpb3I7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjdHgsIG5hbWUsIHtcbiAgICBnZXQ6IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gY2hhaW5hYmxlTWV0aG9kR2V0dGVyKCkge1xuICAgICAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvci5jYWxsKHRoaXMpO1xuICAgICAgbGV0IGNoYWluYWJsZU1ldGhvZFdyYXBwZXIgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAoIWZsYWcodGhpcywgXCJsb2NrU3NmaVwiKSkge1xuICAgICAgICAgIGZsYWcodGhpcywgXCJzc2ZpXCIsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXN1bHQgPSBjaGFpbmFibGVCZWhhdmlvci5tZXRob2QuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgICAgIHJldHVybiBuZXdBc3NlcnRpb247XG4gICAgICB9LCBcImNoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG4gICAgICBhZGRMZW5ndGhHdWFyZChjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBuYW1lLCB0cnVlKTtcbiAgICAgIGlmIChjYW5TZXRQcm90b3R5cGUpIHtcbiAgICAgICAgbGV0IHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUodGhpcyk7XG4gICAgICAgIHByb3RvdHlwZS5jYWxsID0gY2FsbDtcbiAgICAgICAgcHJvdG90eXBlLmFwcGx5ID0gYXBwbHk7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZihjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBwcm90b3R5cGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGFzc2VydGVyTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdHgpO1xuICAgICAgICBhc3NlcnRlck5hbWVzLmZvckVhY2goZnVuY3Rpb24oYXNzZXJ0ZXJOYW1lKSB7XG4gICAgICAgICAgaWYgKGV4Y2x1ZGVOYW1lcy5pbmRleE9mKGFzc2VydGVyTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY3R4LCBhc3NlcnRlck5hbWUpO1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjaGFpbmFibGVNZXRob2RXcmFwcGVyLCBhc3NlcnRlck5hbWUsIHBkKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIGNoYWluYWJsZU1ldGhvZFdyYXBwZXIpO1xuICAgICAgcmV0dXJuIHByb3hpZnkoY2hhaW5hYmxlTWV0aG9kV3JhcHBlcik7XG4gICAgfSwgXCJjaGFpbmFibGVNZXRob2RHZXR0ZXJcIiksXG4gICAgY29uZmlndXJhYmxlOiB0cnVlXG4gIH0pO1xuICBldmVudHMuZGlzcGF0Y2hFdmVudChcbiAgICBuZXcgUGx1Z2luQWRkQ2hhaW5hYmxlTWV0aG9kRXZlbnQoXG4gICAgICBcImFkZENoYWluYWJsZU1ldGhvZFwiLFxuICAgICAgbmFtZSxcbiAgICAgIG1ldGhvZCxcbiAgICAgIGNoYWluaW5nQmVoYXZpb3JcbiAgICApXG4gICk7XG59XG5fX25hbWUoYWRkQ2hhaW5hYmxlTWV0aG9kLCBcImFkZENoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvb3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLmpzXG5mdW5jdGlvbiBvdmVyd3JpdGVDaGFpbmFibGVNZXRob2QoY3R4LCBuYW1lLCBtZXRob2QsIGNoYWluaW5nQmVoYXZpb3IpIHtcbiAgbGV0IGNoYWluYWJsZUJlaGF2aW9yID0gY3R4Ll9fbWV0aG9kc1tuYW1lXTtcbiAgbGV0IF9jaGFpbmluZ0JlaGF2aW9yID0gY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvcjtcbiAgY2hhaW5hYmxlQmVoYXZpb3IuY2hhaW5pbmdCZWhhdmlvciA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoZnVuY3Rpb24gb3ZlcndyaXRpbmdDaGFpbmFibGVNZXRob2RHZXR0ZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNoYWluaW5nQmVoYXZpb3IoX2NoYWluaW5nQmVoYXZpb3IpLmNhbGwodGhpcyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdm9pZCAwKSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBsZXQgbmV3QXNzZXJ0aW9uID0gbmV3IEFzc2VydGlvbigpO1xuICAgIHRyYW5zZmVyRmxhZ3ModGhpcywgbmV3QXNzZXJ0aW9uKTtcbiAgICByZXR1cm4gbmV3QXNzZXJ0aW9uO1xuICB9LCBcIm92ZXJ3cml0aW5nQ2hhaW5hYmxlTWV0aG9kR2V0dGVyXCIpO1xuICBsZXQgX21ldGhvZCA9IGNoYWluYWJsZUJlaGF2aW9yLm1ldGhvZDtcbiAgY2hhaW5hYmxlQmVoYXZpb3IubWV0aG9kID0gLyogQF9fUFVSRV9fICovIF9fbmFtZShmdW5jdGlvbiBvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXIoKSB7XG4gICAgbGV0IHJlc3VsdCA9IG1ldGhvZChfbWV0aG9kKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIGlmIChyZXN1bHQgIT09IHZvaWQgMCkge1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgbGV0IG5ld0Fzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24oKTtcbiAgICB0cmFuc2ZlckZsYWdzKHRoaXMsIG5ld0Fzc2VydGlvbik7XG4gICAgcmV0dXJuIG5ld0Fzc2VydGlvbjtcbiAgfSwgXCJvdmVyd3JpdGluZ0NoYWluYWJsZU1ldGhvZFdyYXBwZXJcIik7XG59XG5fX25hbWUob3ZlcndyaXRlQ2hhaW5hYmxlTWV0aG9kLCBcIm92ZXJ3cml0ZUNoYWluYWJsZU1ldGhvZFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvY29tcGFyZUJ5SW5zcGVjdC5qc1xuZnVuY3Rpb24gY29tcGFyZUJ5SW5zcGVjdChhLCBiKSB7XG4gIHJldHVybiBpbnNwZWN0MihhKSA8IGluc3BlY3QyKGIpID8gLTEgOiAxO1xufVxuX19uYW1lKGNvbXBhcmVCeUluc3BlY3QsIFwiY29tcGFyZUJ5SW5zcGVjdFwiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scy5qc1xuZnVuY3Rpb24gZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopIHtcbiAgaWYgKHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzICE9PSBcImZ1bmN0aW9uXCIpIHJldHVybiBbXTtcbiAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqKS5maWx0ZXIoZnVuY3Rpb24oc3ltKSB7XG4gICAgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqLCBzeW0pLmVudW1lcmFibGU7XG4gIH0pO1xufVxuX19uYW1lKGdldE93bkVudW1lcmFibGVQcm9wZXJ0eVN5bWJvbHMsIFwiZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9sc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvZ2V0T3duRW51bWVyYWJsZVByb3BlcnRpZXMuanNcbmZ1bmN0aW9uIGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaikge1xuICByZXR1cm4gT2JqZWN0LmtleXMob2JqKS5jb25jYXQoZ2V0T3duRW51bWVyYWJsZVByb3BlcnR5U3ltYm9scyhvYmopKTtcbn1cbl9fbmFtZShnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllcywgXCJnZXRPd25FbnVtZXJhYmxlUHJvcGVydGllc1wiKTtcblxuLy8gbGliL2NoYWkvdXRpbHMvaXNOYU4uanNcbnZhciBpc05hTjIgPSBOdW1iZXIuaXNOYU47XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2dldE9wZXJhdG9yLmpzXG5mdW5jdGlvbiBpc09iamVjdFR5cGUob2JqKSB7XG4gIGxldCBvYmplY3RUeXBlID0gdHlwZShvYmopO1xuICBsZXQgb2JqZWN0VHlwZXMgPSBbXCJBcnJheVwiLCBcIk9iamVjdFwiLCBcIkZ1bmN0aW9uXCJdO1xuICByZXR1cm4gb2JqZWN0VHlwZXMuaW5kZXhPZihvYmplY3RUeXBlKSAhPT0gLTE7XG59XG5fX25hbWUoaXNPYmplY3RUeXBlLCBcImlzT2JqZWN0VHlwZVwiKTtcbmZ1bmN0aW9uIGdldE9wZXJhdG9yKG9iaiwgYXJncykge1xuICBsZXQgb3BlcmF0b3IgPSBmbGFnKG9iaiwgXCJvcGVyYXRvclwiKTtcbiAgbGV0IG5lZ2F0ZSA9IGZsYWcob2JqLCBcIm5lZ2F0ZVwiKTtcbiAgbGV0IGV4cGVjdGVkID0gYXJnc1szXTtcbiAgbGV0IG1zZyA9IG5lZ2F0ZSA/IGFyZ3NbMl0gOiBhcmdzWzFdO1xuICBpZiAob3BlcmF0b3IpIHtcbiAgICByZXR1cm4gb3BlcmF0b3I7XG4gIH1cbiAgaWYgKHR5cGVvZiBtc2cgPT09IFwiZnVuY3Rpb25cIikgbXNnID0gbXNnKCk7XG4gIG1zZyA9IG1zZyB8fCBcIlwiO1xuICBpZiAoIW1zZykge1xuICAgIHJldHVybiB2b2lkIDA7XG4gIH1cbiAgaWYgKC9cXHNoYXZlXFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gdm9pZCAwO1xuICB9XG4gIGxldCBpc09iamVjdCA9IGlzT2JqZWN0VHlwZShleHBlY3RlZCk7XG4gIGlmICgvXFxzbm90XFxzLy50ZXN0KG1zZykpIHtcbiAgICByZXR1cm4gaXNPYmplY3QgPyBcIm5vdERlZXBTdHJpY3RFcXVhbFwiIDogXCJub3RTdHJpY3RFcXVhbFwiO1xuICB9XG4gIHJldHVybiBpc09iamVjdCA/IFwiZGVlcFN0cmljdEVxdWFsXCIgOiBcInN0cmljdEVxdWFsXCI7XG59XG5fX25hbWUoZ2V0T3BlcmF0b3IsIFwiZ2V0T3BlcmF0b3JcIik7XG5cbi8vIGxpYi9jaGFpL3V0aWxzL2luZGV4LmpzXG5mdW5jdGlvbiBnZXROYW1lKGZuKSB7XG4gIHJldHVybiBmbi5uYW1lO1xufVxuX19uYW1lKGdldE5hbWUsIFwiZ2V0TmFtZVwiKTtcbmZ1bmN0aW9uIGlzUmVnRXhwMihvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuX19uYW1lKGlzUmVnRXhwMiwgXCJpc1JlZ0V4cFwiKTtcbmZ1bmN0aW9uIGlzTnVtZXJpYyhvYmopIHtcbiAgcmV0dXJuIFtcIk51bWJlclwiLCBcIkJpZ0ludFwiXS5pbmNsdWRlcyh0eXBlKG9iaikpO1xufVxuX19uYW1lKGlzTnVtZXJpYywgXCJpc051bWVyaWNcIik7XG5cbi8vIGxpYi9jaGFpL2NvcmUvYXNzZXJ0aW9ucy5qc1xudmFyIHsgZmxhZzogZmxhZzIgfSA9IHV0aWxzX2V4cG9ydHM7XG5bXG4gIFwidG9cIixcbiAgXCJiZVwiLFxuICBcImJlZW5cIixcbiAgXCJpc1wiLFxuICBcImFuZFwiLFxuICBcImhhc1wiLFxuICBcImhhdmVcIixcbiAgXCJ3aXRoXCIsXG4gIFwidGhhdFwiLFxuICBcIndoaWNoXCIsXG4gIFwiYXRcIixcbiAgXCJvZlwiLFxuICBcInNhbWVcIixcbiAgXCJidXRcIixcbiAgXCJkb2VzXCIsXG4gIFwic3RpbGxcIixcbiAgXCJhbHNvXCJcbl0uZm9yRWFjaChmdW5jdGlvbihjaGFpbikge1xuICBBc3NlcnRpb24uYWRkUHJvcGVydHkoY2hhaW4pO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJub3RcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIsIHRydWUpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJkZWVwXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImRlZXBcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm5lc3RlZFwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJuZXN0ZWRcIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm93blwiLCBmdW5jdGlvbigpIHtcbiAgZmxhZzIodGhpcywgXCJvd25cIiwgdHJ1ZSk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9yZGVyZWRcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiLCB0cnVlKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiYW55XCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcImFueVwiLCB0cnVlKTtcbiAgZmxhZzIodGhpcywgXCJhbGxcIiwgZmFsc2UpO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJhbGxcIiwgZnVuY3Rpb24oKSB7XG4gIGZsYWcyKHRoaXMsIFwiYWxsXCIsIHRydWUpO1xuICBmbGFnMih0aGlzLCBcImFueVwiLCBmYWxzZSk7XG59KTtcbnZhciBmdW5jdGlvblR5cGVzID0ge1xuICBmdW5jdGlvbjogW1xuICAgIFwiZnVuY3Rpb25cIixcbiAgICBcImFzeW5jZnVuY3Rpb25cIixcbiAgICBcImdlbmVyYXRvcmZ1bmN0aW9uXCIsXG4gICAgXCJhc3luY2dlbmVyYXRvcmZ1bmN0aW9uXCJcbiAgXSxcbiAgYXN5bmNmdW5jdGlvbjogW1wiYXN5bmNmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGdlbmVyYXRvcmZ1bmN0aW9uOiBbXCJnZW5lcmF0b3JmdW5jdGlvblwiLCBcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl0sXG4gIGFzeW5jZ2VuZXJhdG9yZnVuY3Rpb246IFtcImFzeW5jZ2VuZXJhdG9yZnVuY3Rpb25cIl1cbn07XG5mdW5jdGlvbiBhbih0eXBlMywgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICB0eXBlMyA9IHR5cGUzLnRvTG93ZXJDYXNlKCk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgYXJ0aWNsZSA9IH5bXCJhXCIsIFwiZVwiLCBcImlcIiwgXCJvXCIsIFwidVwiXS5pbmRleE9mKHR5cGUzLmNoYXJBdCgwKSkgPyBcImFuIFwiIDogXCJhIFwiO1xuICBjb25zdCBkZXRlY3RlZFR5cGUgPSB0eXBlKG9iaikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGZ1bmN0aW9uVHlwZXNbXCJmdW5jdGlvblwiXS5pbmNsdWRlcyh0eXBlMykpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGZ1bmN0aW9uVHlwZXNbdHlwZTNdLmluY2x1ZGVzKGRldGVjdGVkVHlwZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIHR5cGUzID09PSBkZXRlY3RlZFR5cGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgXCIgKyBhcnRpY2xlICsgdHlwZTMsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIFwiICsgYXJ0aWNsZSArIHR5cGUzXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFuLCBcImFuXCIpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImFuXCIsIGFuKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJhXCIsIGFuKTtcbmZ1bmN0aW9uIFNhbWVWYWx1ZVplcm8oYSwgYikge1xuICByZXR1cm4gaXNOYU4yKGEpICYmIGlzTmFOMihiKSB8fCBhID09PSBiO1xufVxuX19uYW1lKFNhbWVWYWx1ZVplcm8sIFwiU2FtZVZhbHVlWmVyb1wiKTtcbmZ1bmN0aW9uIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKCkge1xuICBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIsIHRydWUpO1xufVxuX19uYW1lKGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yLCBcImluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yXCIpO1xuZnVuY3Rpb24gaW5jbHVkZSh2YWwsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBpc0RlZXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIiksIGRlc2NyaXB0b3IgPSBpc0RlZXAgPyBcImRlZXAgXCIgOiBcIlwiLCBpc0VxbCA9IGlzRGVlcCA/IGZsYWcyKHRoaXMsIFwiZXFsXCIpIDogU2FtZVZhbHVlWmVybztcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgbGV0IGluY2x1ZGVkID0gZmFsc2U7XG4gIHN3aXRjaCAob2JqVHlwZSkge1xuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGluY2x1ZGVkID0gb2JqLmluZGV4T2YodmFsKSAhPT0gLTE7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwid2Vha3NldFwiOlxuICAgICAgaWYgKGlzRGVlcCkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwidW5hYmxlIHRvIHVzZSAuZGVlcC5pbmNsdWRlIHdpdGggV2Vha1NldFwiLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpbmNsdWRlZCA9IG9iai5oYXModmFsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJtYXBcIjpcbiAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgaW5jbHVkZWQgPSBpbmNsdWRlZCB8fCBpc0VxbChpdGVtLCB2YWwpO1xuICAgICAgfSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwic2V0XCI6XG4gICAgICBpZiAoaXNEZWVwKSB7XG4gICAgICAgIG9iai5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICBpbmNsdWRlZCA9IGluY2x1ZGVkIHx8IGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaGFzKHZhbCk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgIGlmIChpc0RlZXApIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgICAgcmV0dXJuIGlzRXFsKGl0ZW0sIHZhbCk7XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5jbHVkZWQgPSBvYmouaW5kZXhPZih2YWwpICE9PSAtMTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGlmICh2YWwgIT09IE9iamVjdCh2YWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgICBmbGFnTXNnICsgXCJ0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2YgYXJndW1lbnRzIChcIiArIG9ialR5cGUgKyBcIiBhbmQgXCIgKyB0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSArIFwiKSBpcyBpbnZhbGlkIGZvciB0aGlzIGFzc2VydGlvbi4gWW91IGNhbiB1c2UgYW4gYXJyYXksIGEgbWFwLCBhbiBvYmplY3QsIGEgc2V0LCBhIHN0cmluZywgb3IgYSB3ZWFrc2V0IGluc3RlYWQgb2YgYSBcIiArIHR5cGUodmFsKS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBsZXQgcHJvcHMgPSBPYmplY3Qua2V5cyh2YWwpO1xuICAgICAgbGV0IGZpcnN0RXJyID0gbnVsbDtcbiAgICAgIGxldCBudW1FcnJzID0gMDtcbiAgICAgIHByb3BzLmZvckVhY2goZnVuY3Rpb24ocHJvcCkge1xuICAgICAgICBsZXQgcHJvcEFzc2VydGlvbiA9IG5ldyBBc3NlcnRpb24ob2JqKTtcbiAgICAgICAgdHJhbnNmZXJGbGFncyh0aGlzLCBwcm9wQXNzZXJ0aW9uLCB0cnVlKTtcbiAgICAgICAgZmxhZzIocHJvcEFzc2VydGlvbiwgXCJsb2NrU3NmaVwiLCB0cnVlKTtcbiAgICAgICAgaWYgKCFuZWdhdGUgfHwgcHJvcHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcHJvcEFzc2VydGlvbi5wcm9wZXJ0eShwcm9wLCB2YWxbcHJvcF0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgIHByb3BBc3NlcnRpb24ucHJvcGVydHkocHJvcCwgdmFsW3Byb3BdKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKCFjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihlcnIsIEFzc2VydGlvbkVycm9yKSkge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZmlyc3RFcnIgPT09IG51bGwpIGZpcnN0RXJyID0gZXJyO1xuICAgICAgICAgIG51bUVycnMrKztcbiAgICAgICAgfVxuICAgICAgfSwgdGhpcyk7XG4gICAgICBpZiAobmVnYXRlICYmIHByb3BzLmxlbmd0aCA+IDEgJiYgbnVtRXJycyA9PT0gcHJvcHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IGZpcnN0RXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICB0aGlzLmFzc2VydChcbiAgICBpbmNsdWRlZCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZXNjcmlwdG9yICsgXCJpbmNsdWRlIFwiICsgaW5zcGVjdDIodmFsKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IFwiICsgZGVzY3JpcHRvciArIFwiaW5jbHVkZSBcIiArIGluc3BlY3QyKHZhbClcbiAgKTtcbn1cbl9fbmFtZShpbmNsdWRlLCBcImluY2x1ZGVcIik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiaW5jbHVkZVwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpblwiLCBpbmNsdWRlLCBpbmNsdWRlQ2hhaW5pbmdCZWhhdmlvcik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwiY29udGFpbnNcIiwgaW5jbHVkZSwgaW5jbHVkZUNoYWluaW5nQmVoYXZpb3IpO1xuQXNzZXJ0aW9uLmFkZENoYWluYWJsZU1ldGhvZChcImluY2x1ZGVzXCIsIGluY2x1ZGUsIGluY2x1ZGVDaGFpbmluZ0JlaGF2aW9yKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm9rXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1dGh5XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGZhbHN5XCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidHJ1ZVwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgdHJ1ZSA9PT0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHRydWVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJudW1lcmljXCIsIGZ1bmN0aW9uKCkge1xuICBjb25zdCBvYmplY3QgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgW1wiTnVtYmVyXCIsIFwiQmlnSW50XCJdLmluY2x1ZGVzKHR5cGUob2JqZWN0KSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIG51bWVyaWNcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIG51bWVyaWNcIixcbiAgICBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSA/IGZhbHNlIDogdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJjYWxsYWJsZVwiLCBmdW5jdGlvbigpIHtcbiAgY29uc3QgdmFsID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIGNvbnN0IG1lc3NhZ2UgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGNvbnN0IG1zZyA9IG1lc3NhZ2UgPyBgJHttZXNzYWdlfTogYCA6IFwiXCI7XG4gIGNvbnN0IG5lZ2F0ZSA9IGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpO1xuICBjb25zdCBhc3NlcnRpb25NZXNzYWdlID0gbmVnYXRlID8gYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gbm90IHRvIGJlIGEgY2FsbGFibGUgZnVuY3Rpb25gIDogYCR7bXNnfWV4cGVjdGVkICR7aW5zcGVjdDIodmFsKX0gdG8gYmUgYSBjYWxsYWJsZSBmdW5jdGlvbmA7XG4gIGNvbnN0IGlzQ2FsbGFibGUgPSBbXG4gICAgXCJGdW5jdGlvblwiLFxuICAgIFwiQXN5bmNGdW5jdGlvblwiLFxuICAgIFwiR2VuZXJhdG9yRnVuY3Rpb25cIixcbiAgICBcIkFzeW5jR2VuZXJhdG9yRnVuY3Rpb25cIlxuICBdLmluY2x1ZGVzKHR5cGUodmFsKSk7XG4gIGlmIChpc0NhbGxhYmxlICYmIG5lZ2F0ZSB8fCAhaXNDYWxsYWJsZSAmJiAhbmVnYXRlKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGFzc2VydGlvbk1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZmFsc2VcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGZhbHNlID09PSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZmFsc2VcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgdHJ1ZVwiLFxuICAgIGZsYWcyKHRoaXMsIFwibmVnYXRlXCIpID8gdHJ1ZSA6IGZhbHNlXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIm51bGxcIiwgZnVuY3Rpb24oKSB7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIG51bGwgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBudWxsXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBudWxsXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwidW5kZWZpbmVkXCIsIGZ1bmN0aW9uKCkge1xuICB0aGlzLmFzc2VydChcbiAgICB2b2lkIDAgPT09IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSB1bmRlZmluZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIHVuZGVmaW5lZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcIk5hTlwiLCBmdW5jdGlvbigpIHtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNOYU4yKGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgTmFOXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBOYU5cIlxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRFeGlzdCgpIHtcbiAgbGV0IHZhbCA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB2YWwgIT09IG51bGwgJiYgdmFsICE9PSB2b2lkIDAsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGV4aXN0XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBleGlzdFwiXG4gICk7XG59XG5fX25hbWUoYXNzZXJ0RXhpc3QsIFwiYXNzZXJ0RXhpc3RcIik7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdFwiLCBhc3NlcnRFeGlzdCk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleGlzdHNcIiwgYXNzZXJ0RXhpc3QpO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiZW1wdHlcIiwgZnVuY3Rpb24oKSB7XG4gIGxldCB2YWwgPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgaXRlbXNDb3VudDtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgc3dpdGNoICh0eXBlKHZhbCkudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgXCJhcnJheVwiOlxuICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwubGVuZ3RoO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIm1hcFwiOlxuICAgIGNhc2UgXCJzZXRcIjpcbiAgICAgIGl0ZW1zQ291bnQgPSB2YWwuc2l6ZTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJ3ZWFrbWFwXCI6XG4gICAgY2FzZSBcIndlYWtzZXRcIjpcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgYSB3ZWFrIGNvbGxlY3Rpb25cIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIGNhc2UgXCJmdW5jdGlvblwiOiB7XG4gICAgICBjb25zdCBtc2cgPSBmbGFnTXNnICsgXCIuZW1wdHkgd2FzIHBhc3NlZCBhIGZ1bmN0aW9uIFwiICsgZ2V0TmFtZSh2YWwpO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZy50cmltKCksIHZvaWQgMCwgc3NmaSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICBpZiAodmFsICE9PSBPYmplY3QodmFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgICAgZmxhZ01zZyArIFwiLmVtcHR5IHdhcyBwYXNzZWQgbm9uLXN0cmluZyBwcmltaXRpdmUgXCIgKyBpbnNwZWN0Mih2YWwpLFxuICAgICAgICAgIHZvaWQgMCxcbiAgICAgICAgICBzc2ZpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpdGVtc0NvdW50ID0gT2JqZWN0LmtleXModmFsKS5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgMCA9PT0gaXRlbXNDb3VudCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZW1wdHlcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIGJlIGVtcHR5XCJcbiAgKTtcbn0pO1xuZnVuY3Rpb24gY2hlY2tBcmd1bWVudHMoKSB7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgdHlwZTMgPSB0eXBlKG9iaik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIFwiQXJndW1lbnRzXCIgPT09IHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhcmd1bWVudHMgYnV0IGdvdCBcIiArIHR5cGUzLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgYXJndW1lbnRzXCJcbiAgKTtcbn1cbl9fbmFtZShjaGVja0FyZ3VtZW50cywgXCJjaGVja0FyZ3VtZW50c1wiKTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImFyZ3VtZW50c1wiLCBjaGVja0FyZ3VtZW50cyk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJBcmd1bWVudHNcIiwgY2hlY2tBcmd1bWVudHMpO1xuZnVuY3Rpb24gYXNzZXJ0RXF1YWwodmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgaWYgKGZsYWcyKHRoaXMsIFwiZGVlcFwiKSkge1xuICAgIGxldCBwcmV2TG9ja1NzZmkgPSBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIpO1xuICAgIGZsYWcyKHRoaXMsIFwibG9ja1NzZmlcIiwgdHJ1ZSk7XG4gICAgdGhpcy5lcWwodmFsKTtcbiAgICBmbGFnMih0aGlzLCBcImxvY2tTc2ZpXCIsIHByZXZMb2NrU3NmaSk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICB2YWwgPT09IG9iaixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgZXF1YWwgI3tleHB9XCIsXG4gICAgICB2YWwsXG4gICAgICB0aGlzLl9vYmosXG4gICAgICB0cnVlXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydEVxdWFsLCBcImFzc2VydEVxdWFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxdWFsXCIsIGFzc2VydEVxdWFsKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJlcXVhbHNcIiwgYXNzZXJ0RXF1YWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxXCIsIGFzc2VydEVxdWFsKTtcbmZ1bmN0aW9uIGFzc2VydEVxbChvYmosIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGVxbCA9IGZsYWcyKHRoaXMsIFwiZXFsXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICBlcWwob2JqLCBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGRlZXBseSBlcXVhbCAje2V4cH1cIixcbiAgICBvYmosXG4gICAgdGhpcy5fb2JqLFxuICAgIHRydWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRFcWwsIFwiYXNzZXJ0RXFsXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbFwiLCBhc3NlcnRFcWwpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImVxbHNcIiwgYXNzZXJ0RXFsKTtcbmZ1bmN0aW9uIGFzc2VydEFib3ZlKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYWJvdmUgbXVzdCBiZSBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGFib3ZlIG11c3QgYmUgYSBudW1iZXJcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIixcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIGlmIChkb0xlbmd0aCkge1xuICAgIGxldCBkZXNjcmlwdG9yID0gXCJsZW5ndGhcIiwgaXRlbXNDb3VudDtcbiAgICBpZiAob2JqVHlwZSA9PT0gXCJtYXBcIiB8fCBvYmpUeXBlID09PSBcInNldFwiKSB7XG4gICAgICBkZXNjcmlwdG9yID0gXCJzaXplXCI7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLnNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmoubGVuZ3RoO1xuICAgIH1cbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGl0ZW1zQ291bnQgPiBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGFib3ZlICN7ZXhwfVwiLFxuICAgICAgbixcbiAgICAgIGl0ZW1zQ291bnRcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgb2JqID4gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhYm92ZSAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBtb3N0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRBYm92ZSwgXCJhc3NlcnRBYm92ZVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhYm92ZVwiLCBhc3NlcnRBYm92ZSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3RcIiwgYXNzZXJ0QWJvdmUpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImdyZWF0ZXJUaGFuXCIsIGFzc2VydEFib3ZlKTtcbmZ1bmN0aW9uIGFzc2VydExlYXN0KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGxlYXN0IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbGVhc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA+PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBsZWFzdCAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPj0gbixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhdCBsZWFzdCAje2V4cH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBiZWxvdyAje2V4cH1cIixcbiAgICAgIG5cbiAgICApO1xuICB9XG59XG5fX25hbWUoYXNzZXJ0TGVhc3QsIFwiYXNzZXJ0TGVhc3RcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibGVhc3RcIiwgYXNzZXJ0TGVhc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImd0ZVwiLCBhc3NlcnRMZWFzdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZ3JlYXRlclRoYW5PckVxdWFsXCIsIGFzc2VydExlYXN0KTtcbmZ1bmN0aW9uIGFzc2VydEJlbG93KG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBuVHlwZSA9IHR5cGUobikudG9Mb3dlckNhc2UoKSwgZXJyb3JNZXNzYWdlLCBzaG91bGRUaHJvdyA9IHRydWU7XG4gIGlmIChkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcIm1hcFwiICYmIG9ialR5cGUgIT09IFwic2V0XCIpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShcImxlbmd0aFwiKTtcbiAgfVxuICBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgPT09IFwiZGF0ZVwiICYmIG5UeXBlICE9PSBcImRhdGVcIikge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIGJlbG93IG11c3QgYmUgYSBkYXRlXCI7XG4gIH0gZWxzZSBpZiAoIWlzTnVtZXJpYyhuKSAmJiAoZG9MZW5ndGggfHwgaXNOdW1lcmljKG9iaikpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gYmVsb3cgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8IG4sXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIGJlbG93ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgYmVsb3cgI3tleHB9XCIsXG4gICAgICBuLFxuICAgICAgaXRlbXNDb3VudFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBvYmogPCBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGJlbG93ICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IGxlYXN0ICN7ZXhwfVwiLFxuICAgICAgblxuICAgICk7XG4gIH1cbn1cbl9fbmFtZShhc3NlcnRCZWxvdywgXCJhc3NlcnRCZWxvd1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJiZWxvd1wiLCBhc3NlcnRCZWxvdyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibHRcIiwgYXNzZXJ0QmVsb3cpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImxlc3NUaGFuXCIsIGFzc2VydEJlbG93KTtcbmZ1bmN0aW9uIGFzc2VydE1vc3QobiwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGRvTGVuZ3RoID0gZmxhZzIodGhpcywgXCJkb0xlbmd0aFwiKSwgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKSwgbXNnUHJlZml4ID0gZmxhZ01zZyA/IGZsYWdNc2cgKyBcIjogXCIgOiBcIlwiLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIG5UeXBlID0gdHlwZShuKS50b0xvd2VyQ2FzZSgpLCBlcnJvck1lc3NhZ2UsIHNob3VsZFRocm93ID0gdHJ1ZTtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgblR5cGUgIT09IFwiZGF0ZVwiKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnQgdG8gbW9zdCBtdXN0IGJlIGEgZGF0ZVwiO1xuICB9IGVsc2UgaWYgKCFpc051bWVyaWMobikgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50IHRvIG1vc3QgbXVzdCBiZSBhIG51bWJlclwiO1xuICB9IGVsc2UgaWYgKCFkb0xlbmd0aCAmJiBvYmpUeXBlICE9PSBcImRhdGVcIiAmJiAhaXNOdW1lcmljKG9iaikpIHtcbiAgICBsZXQgcHJpbnRPYmogPSBvYmpUeXBlID09PSBcInN0cmluZ1wiID8gXCInXCIgKyBvYmogKyBcIidcIiA6IG9iajtcbiAgICBlcnJvck1lc3NhZ2UgPSBtc2dQcmVmaXggKyBcImV4cGVjdGVkIFwiICsgcHJpbnRPYmogKyBcIiB0byBiZSBhIG51bWJlciBvciBhIGRhdGVcIjtcbiAgfSBlbHNlIHtcbiAgICBzaG91bGRUaHJvdyA9IGZhbHNlO1xuICB9XG4gIGlmIChzaG91bGRUaHJvdykge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlcnJvck1lc3NhZ2UsIHZvaWQgMCwgc3NmaSk7XG4gIH1cbiAgaWYgKGRvTGVuZ3RoKSB7XG4gICAgbGV0IGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICAgIGlmIChvYmpUeXBlID09PSBcIm1hcFwiIHx8IG9ialR5cGUgPT09IFwic2V0XCIpIHtcbiAgICAgIGRlc2NyaXB0b3IgPSBcInNpemVcIjtcbiAgICAgIGl0ZW1zQ291bnQgPSBvYmouc2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gICAgfVxuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgaXRlbXNDb3VudCA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhdCBtb3N0ICN7ZXhwfSBidXQgZ290ICN7YWN0fVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiBhYm92ZSAje2V4cH1cIixcbiAgICAgIG4sXG4gICAgICBpdGVtc0NvdW50XG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA8PSBuLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIGF0IG1vc3QgI3tleHB9XCIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYWJvdmUgI3tleHB9XCIsXG4gICAgICBuXG4gICAgKTtcbiAgfVxufVxuX19uYW1lKGFzc2VydE1vc3QsIFwiYXNzZXJ0TW9zdFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtb3N0XCIsIGFzc2VydE1vc3QpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImx0ZVwiLCBhc3NlcnRNb3N0KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJsZXNzVGhhbk9yRXF1YWxcIiwgYXNzZXJ0TW9zdCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwid2l0aGluXCIsIGZ1bmN0aW9uKHN0YXJ0LCBmaW5pc2gsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBkb0xlbmd0aCA9IGZsYWcyKHRoaXMsIFwiZG9MZW5ndGhcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIG1zZ1ByZWZpeCA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIiwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgb2JqVHlwZSA9IHR5cGUob2JqKS50b0xvd2VyQ2FzZSgpLCBzdGFydFR5cGUgPSB0eXBlKHN0YXJ0KS50b0xvd2VyQ2FzZSgpLCBmaW5pc2hUeXBlID0gdHlwZShmaW5pc2gpLnRvTG93ZXJDYXNlKCksIGVycm9yTWVzc2FnZSwgc2hvdWxkVGhyb3cgPSB0cnVlLCByYW5nZSA9IHN0YXJ0VHlwZSA9PT0gXCJkYXRlXCIgJiYgZmluaXNoVHlwZSA9PT0gXCJkYXRlXCIgPyBzdGFydC50b0lTT1N0cmluZygpICsgXCIuLlwiICsgZmluaXNoLnRvSVNPU3RyaW5nKCkgOiBzdGFydCArIFwiLi5cIiArIGZpbmlzaDtcbiAgaWYgKGRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwibWFwXCIgJiYgb2JqVHlwZSAhPT0gXCJzZXRcIikge1xuICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICB9XG4gIGlmICghZG9MZW5ndGggJiYgb2JqVHlwZSA9PT0gXCJkYXRlXCIgJiYgKHN0YXJ0VHlwZSAhPT0gXCJkYXRlXCIgfHwgZmluaXNoVHlwZSAhPT0gXCJkYXRlXCIpKSB7XG4gICAgZXJyb3JNZXNzYWdlID0gbXNnUHJlZml4ICsgXCJ0aGUgYXJndW1lbnRzIHRvIHdpdGhpbiBtdXN0IGJlIGRhdGVzXCI7XG4gIH0gZWxzZSBpZiAoKCFpc051bWVyaWMoc3RhcnQpIHx8ICFpc051bWVyaWMoZmluaXNoKSkgJiYgKGRvTGVuZ3RoIHx8IGlzTnVtZXJpYyhvYmopKSkge1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwidGhlIGFyZ3VtZW50cyB0byB3aXRoaW4gbXVzdCBiZSBudW1iZXJzXCI7XG4gIH0gZWxzZSBpZiAoIWRvTGVuZ3RoICYmIG9ialR5cGUgIT09IFwiZGF0ZVwiICYmICFpc051bWVyaWMob2JqKSkge1xuICAgIGxldCBwcmludE9iaiA9IG9ialR5cGUgPT09IFwic3RyaW5nXCIgPyBcIidcIiArIG9iaiArIFwiJ1wiIDogb2JqO1xuICAgIGVycm9yTWVzc2FnZSA9IG1zZ1ByZWZpeCArIFwiZXhwZWN0ZWQgXCIgKyBwcmludE9iaiArIFwiIHRvIGJlIGEgbnVtYmVyIG9yIGEgZGF0ZVwiO1xuICB9IGVsc2Uge1xuICAgIHNob3VsZFRocm93ID0gZmFsc2U7XG4gIH1cbiAgaWYgKHNob3VsZFRocm93KSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGVycm9yTWVzc2FnZSwgdm9pZCAwLCBzc2ZpKTtcbiAgfVxuICBpZiAoZG9MZW5ndGgpIHtcbiAgICBsZXQgZGVzY3JpcHRvciA9IFwibGVuZ3RoXCIsIGl0ZW1zQ291bnQ7XG4gICAgaWYgKG9ialR5cGUgPT09IFwibWFwXCIgfHwgb2JqVHlwZSA9PT0gXCJzZXRcIikge1xuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgIH0gZWxzZSB7XG4gICAgICBpdGVtc0NvdW50ID0gb2JqLmxlbmd0aDtcbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBpdGVtc0NvdW50ID49IHN0YXJ0ICYmIGl0ZW1zQ291bnQgPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGhhdmUgYSBcIiArIGRlc2NyaXB0b3IgKyBcIiB3aXRoaW4gXCIgKyByYW5nZSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBhIFwiICsgZGVzY3JpcHRvciArIFwiIHdpdGhpbiBcIiArIHJhbmdlXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIG9iaiA+PSBzdGFydCAmJiBvYmogPD0gZmluaXNoLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIHdpdGhpbiBcIiArIHJhbmdlLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSB3aXRoaW4gXCIgKyByYW5nZVxuICAgICk7XG4gIH1cbn0pO1xuZnVuY3Rpb24gYXNzZXJ0SW5zdGFuY2VPZihjb25zdHJ1Y3RvciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgdGFyZ2V0ID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBsZXQgZmxhZ01zZyA9IGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiKTtcbiAgbGV0IGlzSW5zdGFuY2VPZjtcbiAgdHJ5IHtcbiAgICBpc0luc3RhbmNlT2YgPSB0YXJnZXQgaW5zdGFuY2VvZiBjb25zdHJ1Y3RvcjtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFR5cGVFcnJvcikge1xuICAgICAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgICAgZmxhZ01zZyArIFwiVGhlIGluc3RhbmNlb2YgYXNzZXJ0aW9uIG5lZWRzIGEgY29uc3RydWN0b3IgYnV0IFwiICsgdHlwZShjb25zdHJ1Y3RvcikgKyBcIiB3YXMgZ2l2ZW4uXCIsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgc3NmaVxuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGxldCBuYW1lID0gZ2V0TmFtZShjb25zdHJ1Y3Rvcik7XG4gIGlmIChuYW1lID09IG51bGwpIHtcbiAgICBuYW1lID0gXCJhbiB1bm5hbWVkIGNvbnN0cnVjdG9yXCI7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNJbnN0YW5jZU9mLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWUsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhbiBpbnN0YW5jZSBvZiBcIiArIG5hbWVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRJbnN0YW5jZU9mLCBcImFzc2VydEluc3RhbmNlT2ZcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5zdGFuY2VvZlwiLCBhc3NlcnRJbnN0YW5jZU9mKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbnN0YW5jZU9mXCIsIGFzc2VydEluc3RhbmNlT2YpO1xuZnVuY3Rpb24gYXNzZXJ0UHJvcGVydHkobmFtZSwgdmFsLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBpc05lc3RlZCA9IGZsYWcyKHRoaXMsIFwibmVzdGVkXCIpLCBpc093biA9IGZsYWcyKHRoaXMsIFwib3duXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKSwgc3NmaSA9IGZsYWcyKHRoaXMsIFwic3NmaVwiKSwgbmFtZVR5cGUgPSB0eXBlb2YgbmFtZTtcbiAgZmxhZ01zZyA9IGZsYWdNc2cgPyBmbGFnTXNnICsgXCI6IFwiIDogXCJcIjtcbiAgaWYgKGlzTmVzdGVkKSB7XG4gICAgaWYgKG5hbWVUeXBlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICAgIGZsYWdNc2cgKyBcInRoZSBhcmd1bWVudCB0byBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nIHdoZW4gdXNpbmcgbmVzdGVkIHN5bnRheFwiLFxuICAgICAgICB2b2lkIDAsXG4gICAgICAgIHNzZmlcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChuYW1lVHlwZSAhPT0gXCJzdHJpbmdcIiAmJiBuYW1lVHlwZSAhPT0gXCJudW1iZXJcIiAmJiBuYW1lVHlwZSAhPT0gXCJzeW1ib2xcIikge1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBmbGFnTXNnICsgXCJ0aGUgYXJndW1lbnQgdG8gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZywgbnVtYmVyLCBvciBzeW1ib2xcIixcbiAgICAgICAgdm9pZCAwLFxuICAgICAgICBzc2ZpXG4gICAgICApO1xuICAgIH1cbiAgfVxuICBpZiAoaXNOZXN0ZWQgJiYgaXNPd24pIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnICsgJ1RoZSBcIm5lc3RlZFwiIGFuZCBcIm93blwiIGZsYWdzIGNhbm5vdCBiZSBjb21iaW5lZC4nLFxuICAgICAgdm9pZCAwLFxuICAgICAgc3NmaVxuICAgICk7XG4gIH1cbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHZvaWQgMCkge1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIGZsYWdNc2cgKyBcIlRhcmdldCBjYW5ub3QgYmUgbnVsbCBvciB1bmRlZmluZWQuXCIsXG4gICAgICB2b2lkIDAsXG4gICAgICBzc2ZpXG4gICAgKTtcbiAgfVxuICBsZXQgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSwgcGF0aEluZm8gPSBpc05lc3RlZCA/IGdldFBhdGhJbmZvKG9iaiwgbmFtZSkgOiBudWxsLCB2YWx1ZSA9IGlzTmVzdGVkID8gcGF0aEluZm8udmFsdWUgOiBvYmpbbmFtZV0sIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgbGV0IGRlc2NyaXB0b3IgPSBcIlwiO1xuICBpZiAoaXNEZWVwKSBkZXNjcmlwdG9yICs9IFwiZGVlcCBcIjtcbiAgaWYgKGlzT3duKSBkZXNjcmlwdG9yICs9IFwib3duIFwiO1xuICBpZiAoaXNOZXN0ZWQpIGRlc2NyaXB0b3IgKz0gXCJuZXN0ZWQgXCI7XG4gIGRlc2NyaXB0b3IgKz0gXCJwcm9wZXJ0eSBcIjtcbiAgbGV0IGhhc1Byb3BlcnR5MjtcbiAgaWYgKGlzT3duKSBoYXNQcm9wZXJ0eTIgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBuYW1lKTtcbiAgZWxzZSBpZiAoaXNOZXN0ZWQpIGhhc1Byb3BlcnR5MiA9IHBhdGhJbmZvLmV4aXN0cztcbiAgZWxzZSBoYXNQcm9wZXJ0eTIgPSBoYXNQcm9wZXJ0eShvYmosIG5hbWUpO1xuICBpZiAoIW5lZ2F0ZSB8fCBhcmd1bWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKVxuICAgICk7XG4gIH1cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBoYXNQcm9wZXJ0eTIgJiYgaXNFcWwodmFsLCB2YWx1ZSksXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7ZXhwfSwgYnV0IGdvdCAje2FjdH1cIixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgaGF2ZSBcIiArIGRlc2NyaXB0b3IgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9mICN7YWN0fVwiLFxuICAgICAgdmFsLFxuICAgICAgdmFsdWVcbiAgICApO1xuICB9XG4gIGZsYWcyKHRoaXMsIFwib2JqZWN0XCIsIHZhbHVlKTtcbn1cbl9fbmFtZShhc3NlcnRQcm9wZXJ0eSwgXCJhc3NlcnRQcm9wZXJ0eVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJwcm9wZXJ0eVwiLCBhc3NlcnRQcm9wZXJ0eSk7XG5mdW5jdGlvbiBhc3NlcnRPd25Qcm9wZXJ0eShfbmFtZSwgX3ZhbHVlLCBfbXNnKSB7XG4gIGZsYWcyKHRoaXMsIFwib3duXCIsIHRydWUpO1xuICBhc3NlcnRQcm9wZXJ0eS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuX19uYW1lKGFzc2VydE93blByb3BlcnR5LCBcImFzc2VydE93blByb3BlcnR5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5XCIsIGFzc2VydE93blByb3BlcnR5KTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJoYXZlT3duUHJvcGVydHlcIiwgYXNzZXJ0T3duUHJvcGVydHkpO1xuZnVuY3Rpb24gYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGRlc2NyaXB0b3IsIG1zZykge1xuICBpZiAodHlwZW9mIGRlc2NyaXB0b3IgPT09IFwic3RyaW5nXCIpIHtcbiAgICBtc2cgPSBkZXNjcmlwdG9yO1xuICAgIGRlc2NyaXB0b3IgPSBudWxsO1xuICB9XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBhY3R1YWxEZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3Qob2JqKSwgbmFtZSk7XG4gIGxldCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgaWYgKGFjdHVhbERlc2NyaXB0b3IgJiYgZGVzY3JpcHRvcikge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgZXFsKGRlc2NyaXB0b3IsIGFjdHVhbERlc2NyaXB0b3IpLFxuICAgICAgXCJleHBlY3RlZCB0aGUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIFwiICsgaW5zcGVjdDIobmFtZSkgKyBcIiBvbiAje3RoaXN9IHRvIG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvcikgKyBcIiwgZ290IFwiICsgaW5zcGVjdDIoYWN0dWFsRGVzY3JpcHRvciksXG4gICAgICBcImV4cGVjdGVkIHRoZSBvd24gcHJvcGVydHkgZGVzY3JpcHRvciBmb3IgXCIgKyBpbnNwZWN0MihuYW1lKSArIFwiIG9uICN7dGhpc30gdG8gbm90IG1hdGNoIFwiICsgaW5zcGVjdDIoZGVzY3JpcHRvciksXG4gICAgICBkZXNjcmlwdG9yLFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIHRydWVcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgYWN0dWFsRGVzY3JpcHRvcixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGFuIG93biBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBcIiArIGluc3BlY3QyKG5hbWUpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBhY3R1YWxEZXNjcmlwdG9yKTtcbn1cbl9fbmFtZShhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIFwiYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yXCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcIm93blByb3BlcnR5RGVzY3JpcHRvclwiLCBhc3NlcnRPd25Qcm9wZXJ0eURlc2NyaXB0b3IpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImhhdmVPd25Qcm9wZXJ0eURlc2NyaXB0b3JcIiwgYXNzZXJ0T3duUHJvcGVydHlEZXNjcmlwdG9yKTtcbmZ1bmN0aW9uIGFzc2VydExlbmd0aENoYWluKCkge1xuICBmbGFnMih0aGlzLCBcImRvTGVuZ3RoXCIsIHRydWUpO1xufVxuX19uYW1lKGFzc2VydExlbmd0aENoYWluLCBcImFzc2VydExlbmd0aENoYWluXCIpO1xuZnVuY3Rpb24gYXNzZXJ0TGVuZ3RoKG4sIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLnRvTG93ZXJDYXNlKCksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGRlc2NyaXB0b3IgPSBcImxlbmd0aFwiLCBpdGVtc0NvdW50O1xuICBzd2l0Y2ggKG9ialR5cGUpIHtcbiAgICBjYXNlIFwibWFwXCI6XG4gICAgY2FzZSBcInNldFwiOlxuICAgICAgZGVzY3JpcHRvciA9IFwic2l6ZVwiO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5zaXplO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KFwibGVuZ3RoXCIpO1xuICAgICAgaXRlbXNDb3VudCA9IG9iai5sZW5ndGg7XG4gIH1cbiAgdGhpcy5hc3NlcnQoXG4gICAgaXRlbXNDb3VudCA9PSBuLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3tleHB9IGJ1dCBnb3QgI3thY3R9XCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIGEgXCIgKyBkZXNjcmlwdG9yICsgXCIgb2YgI3thY3R9XCIsXG4gICAgbixcbiAgICBpdGVtc0NvdW50XG4gICk7XG59XG5fX25hbWUoYXNzZXJ0TGVuZ3RoLCBcImFzc2VydExlbmd0aFwiKTtcbkFzc2VydGlvbi5hZGRDaGFpbmFibGVNZXRob2QoXCJsZW5ndGhcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5Bc3NlcnRpb24uYWRkQ2hhaW5hYmxlTWV0aG9kKFwibGVuZ3RoT2ZcIiwgYXNzZXJ0TGVuZ3RoLCBhc3NlcnRMZW5ndGhDaGFpbik7XG5mdW5jdGlvbiBhc3NlcnRNYXRjaChyZSwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHJlLmV4ZWMob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbWF0Y2ggXCIgKyByZSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gbm90IHRvIG1hdGNoIFwiICsgcmVcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnRNYXRjaCwgXCJhc3NlcnRNYXRjaFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtYXRjaFwiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwibWF0Y2hlc1wiLCBhc3NlcnRNYXRjaCk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic3RyaW5nXCIsIGZ1bmN0aW9uKHN0ciwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwic3RyaW5nXCIpO1xuICB0aGlzLmFzc2VydChcbiAgICB+b2JqLmluZGV4T2Yoc3RyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gY29udGFpbiBcIiArIGluc3BlY3QyKHN0ciksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIFwiICsgaW5zcGVjdDIoc3RyKVxuICApO1xufSk7XG5mdW5jdGlvbiBhc3NlcnRLZXlzKGtleXMpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBvYmpUeXBlID0gdHlwZShvYmopLCBrZXlzVHlwZSA9IHR5cGUoa2V5cyksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGlzRGVlcCA9IGZsYWcyKHRoaXMsIFwiZGVlcFwiKSwgc3RyLCBkZWVwU3RyID0gXCJcIiwgYWN0dWFsLCBvayA9IHRydWUsIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIik7XG4gIGZsYWdNc2cgPSBmbGFnTXNnID8gZmxhZ01zZyArIFwiOiBcIiA6IFwiXCI7XG4gIGxldCBtaXhlZEFyZ3NNc2cgPSBmbGFnTXNnICsgXCJ3aGVuIHRlc3Rpbmcga2V5cyBhZ2FpbnN0IGFuIG9iamVjdCBvciBhbiBhcnJheSB5b3UgbXVzdCBnaXZlIGEgc2luZ2xlIEFycmF5fE9iamVjdHxTdHJpbmcgYXJndW1lbnQgb3IgbXVsdGlwbGUgU3RyaW5nIGFyZ3VtZW50c1wiO1xuICBpZiAob2JqVHlwZSA9PT0gXCJNYXBcIiB8fCBvYmpUeXBlID09PSBcIlNldFwiKSB7XG4gICAgZGVlcFN0ciA9IGlzRGVlcCA/IFwiZGVlcGx5IFwiIDogXCJcIjtcbiAgICBhY3R1YWwgPSBbXTtcbiAgICBvYmouZm9yRWFjaChmdW5jdGlvbih2YWwsIGtleSkge1xuICAgICAgYWN0dWFsLnB1c2goa2V5KTtcbiAgICB9KTtcbiAgICBpZiAoa2V5c1R5cGUgIT09IFwiQXJyYXlcIikge1xuICAgICAga2V5cyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGFjdHVhbCA9IGdldE93bkVudW1lcmFibGVQcm9wZXJ0aWVzKG9iaik7XG4gICAgc3dpdGNoIChrZXlzVHlwZSkge1xuICAgICAgY2FzZSBcIkFycmF5XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwiT2JqZWN0XCI6XG4gICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihtaXhlZEFyZ3NNc2csIHZvaWQgMCwgc3NmaSk7XG4gICAgICAgIH1cbiAgICAgICAga2V5cyA9IE9iamVjdC5rZXlzKGtleXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGtleXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuICAgIH1cbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24odmFsKSB7XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gXCJzeW1ib2xcIiA/IHZhbCA6IFN0cmluZyh2YWwpO1xuICAgIH0pO1xuICB9XG4gIGlmICgha2V5cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoZmxhZ01zZyArIFwia2V5cyByZXF1aXJlZFwiLCB2b2lkIDAsIHNzZmkpO1xuICB9XG4gIGxldCBsZW4gPSBrZXlzLmxlbmd0aCwgYW55ID0gZmxhZzIodGhpcywgXCJhbnlcIiksIGFsbCA9IGZsYWcyKHRoaXMsIFwiYWxsXCIpLCBleHBlY3RlZCA9IGtleXMsIGlzRXFsID0gaXNEZWVwID8gZmxhZzIodGhpcywgXCJlcWxcIikgOiAodmFsMSwgdmFsMikgPT4gdmFsMSA9PT0gdmFsMjtcbiAgaWYgKCFhbnkgJiYgIWFsbCkge1xuICAgIGFsbCA9IHRydWU7XG4gIH1cbiAgaWYgKGFueSkge1xuICAgIG9rID0gZXhwZWN0ZWQuc29tZShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuICBpZiAoYWxsKSB7XG4gICAgb2sgPSBleHBlY3RlZC5ldmVyeShmdW5jdGlvbihleHBlY3RlZEtleSkge1xuICAgICAgcmV0dXJuIGFjdHVhbC5zb21lKGZ1bmN0aW9uKGFjdHVhbEtleSkge1xuICAgICAgICByZXR1cm4gaXNFcWwoZXhwZWN0ZWRLZXksIGFjdHVhbEtleSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAoIWZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikpIHtcbiAgICAgIG9rID0gb2sgJiYga2V5cy5sZW5ndGggPT0gYWN0dWFsLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgaWYgKGxlbiA+IDEpIHtcbiAgICBrZXlzID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gaW5zcGVjdDIoa2V5KTtcbiAgICB9KTtcbiAgICBsZXQgbGFzdCA9IGtleXMucG9wKCk7XG4gICAgaWYgKGFsbCkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgYW5kIFwiICsgbGFzdDtcbiAgICB9XG4gICAgaWYgKGFueSkge1xuICAgICAgc3RyID0ga2V5cy5qb2luKFwiLCBcIikgKyBcIiwgb3IgXCIgKyBsYXN0O1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBzdHIgPSBpbnNwZWN0MihrZXlzWzBdKTtcbiAgfVxuICBzdHIgPSAobGVuID4gMSA/IFwia2V5cyBcIiA6IFwia2V5IFwiKSArIHN0cjtcbiAgc3RyID0gKGZsYWcyKHRoaXMsIFwiY29udGFpbnNcIikgPyBcImNvbnRhaW4gXCIgOiBcImhhdmUgXCIpICsgc3RyO1xuICB0aGlzLmFzc2VydChcbiAgICBvayxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgXCIgKyBkZWVwU3RyICsgc3RyLFxuICAgIGV4cGVjdGVkLnNsaWNlKDApLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgYWN0dWFsLnNvcnQoY29tcGFyZUJ5SW5zcGVjdCksXG4gICAgdHJ1ZVxuICApO1xufVxuX19uYW1lKGFzc2VydEtleXMsIFwiYXNzZXJ0S2V5c1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJrZXlzXCIsIGFzc2VydEtleXMpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcImtleVwiLCBhc3NlcnRLZXlzKTtcbmZ1bmN0aW9uIGFzc2VydFRocm93cyhlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBuZWdhdGUgPSBmbGFnMih0aGlzLCBcIm5lZ2F0ZVwiKSB8fCBmYWxzZTtcbiAgbmV3IEFzc2VydGlvbihvYmosIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgaWYgKGlzUmVnRXhwMihlcnJvckxpa2UpIHx8IHR5cGVvZiBlcnJvckxpa2UgPT09IFwic3RyaW5nXCIpIHtcbiAgICBlcnJNc2dNYXRjaGVyID0gZXJyb3JMaWtlO1xuICAgIGVycm9yTGlrZSA9IG51bGw7XG4gIH1cbiAgbGV0IGNhdWdodEVycjtcbiAgbGV0IGVycm9yV2FzVGhyb3duID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgb2JqKCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGVycm9yV2FzVGhyb3duID0gdHJ1ZTtcbiAgICBjYXVnaHRFcnIgPSBlcnI7XG4gIH1cbiAgbGV0IGV2ZXJ5QXJnSXNVbmRlZmluZWQgPSBlcnJvckxpa2UgPT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyID09PSB2b2lkIDA7XG4gIGxldCBldmVyeUFyZ0lzRGVmaW5lZCA9IEJvb2xlYW4oZXJyb3JMaWtlICYmIGVyck1zZ01hdGNoZXIpO1xuICBsZXQgZXJyb3JMaWtlRmFpbCA9IGZhbHNlO1xuICBsZXQgZXJyTXNnTWF0Y2hlckZhaWwgPSBmYWxzZTtcbiAgaWYgKGV2ZXJ5QXJnSXNVbmRlZmluZWQgfHwgIWV2ZXJ5QXJnSXNVbmRlZmluZWQgJiYgIW5lZ2F0ZSkge1xuICAgIGxldCBlcnJvckxpa2VTdHJpbmcgPSBcImFuIGVycm9yXCI7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBcIiN7ZXhwfVwiO1xuICAgIH0gZWxzZSBpZiAoZXJyb3JMaWtlKSB7XG4gICAgICBlcnJvckxpa2VTdHJpbmcgPSBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpO1xuICAgIH1cbiAgICBsZXQgYWN0dWFsID0gY2F1Z2h0RXJyO1xuICAgIGlmIChjYXVnaHRFcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgYWN0dWFsID0gY2F1Z2h0RXJyLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2F1Z2h0RXJyID09PSBcInN0cmluZ1wiKSB7XG4gICAgICBhY3R1YWwgPSBjYXVnaHRFcnI7XG4gICAgfSBlbHNlIGlmIChjYXVnaHRFcnIgJiYgKHR5cGVvZiBjYXVnaHRFcnIgPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIGNhdWdodEVyciA9PT0gXCJmdW5jdGlvblwiKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYWN0dWFsID0gY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKTtcbiAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBlcnJvcldhc1Rocm93bixcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byB0aHJvdyBcIiArIGVycm9yTGlrZVN0cmluZyxcbiAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgdGhyb3cgYW4gZXJyb3IgYnV0ICN7YWN0fSB3YXMgdGhyb3duXCIsXG4gICAgICBlcnJvckxpa2UgJiYgZXJyb3JMaWtlLnRvU3RyaW5nKCksXG4gICAgICBhY3R1YWxcbiAgICApO1xuICB9XG4gIGlmIChlcnJvckxpa2UgJiYgY2F1Z2h0RXJyKSB7XG4gICAgaWYgKGVycm9yTGlrZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICBsZXQgaXNDb21wYXRpYmxlSW5zdGFuY2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVJbnN0YW5jZShcbiAgICAgICAgY2F1Z2h0RXJyLFxuICAgICAgICBlcnJvckxpa2VcbiAgICAgICk7XG4gICAgICBpZiAoaXNDb21wYXRpYmxlSW5zdGFuY2UgPT09IG5lZ2F0ZSkge1xuICAgICAgICBpZiAoZXZlcnlBcmdJc0RlZmluZWQgJiYgbmVnYXRlKSB7XG4gICAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgJiYgIW5lZ2F0ZSA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgICBlcnJvckxpa2UudG9TdHJpbmcoKSxcbiAgICAgICAgICAgIGNhdWdodEVyci50b1N0cmluZygpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBsZXQgaXNDb21wYXRpYmxlQ29uc3RydWN0b3IgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVDb25zdHJ1Y3RvcihcbiAgICAgIGNhdWdodEVycixcbiAgICAgIGVycm9yTGlrZVxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZUNvbnN0cnVjdG9yID09PSBuZWdhdGUpIHtcbiAgICAgIGlmIChldmVyeUFyZ0lzRGVmaW5lZCAmJiBuZWdhdGUpIHtcbiAgICAgICAgZXJyb3JMaWtlRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93ICN7ZXhwfSBidXQgI3thY3R9IHdhcyB0aHJvd25cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHRocm93ICN7ZXhwfVwiICsgKGNhdWdodEVyciA/IFwiIGJ1dCAje2FjdH0gd2FzIHRocm93blwiIDogXCJcIiksXG4gICAgICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgICAgIGNhdWdodEVyciBpbnN0YW5jZW9mIEVycm9yID8gY2F1Z2h0RXJyLnRvU3RyaW5nKCkgOiBjYXVnaHRFcnIgJiYgY2hlY2tfZXJyb3JfZXhwb3J0cy5nZXRDb25zdHJ1Y3Rvck5hbWUoY2F1Z2h0RXJyKVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAoY2F1Z2h0RXJyICYmIGVyck1zZ01hdGNoZXIgIT09IHZvaWQgMCAmJiBlcnJNc2dNYXRjaGVyICE9PSBudWxsKSB7XG4gICAgbGV0IHBsYWNlaG9sZGVyID0gXCJpbmNsdWRpbmdcIjtcbiAgICBpZiAoaXNSZWdFeHAyKGVyck1zZ01hdGNoZXIpKSB7XG4gICAgICBwbGFjZWhvbGRlciA9IFwibWF0Y2hpbmdcIjtcbiAgICB9XG4gICAgbGV0IGlzQ29tcGF0aWJsZU1lc3NhZ2UgPSBjaGVja19lcnJvcl9leHBvcnRzLmNvbXBhdGlibGVNZXNzYWdlKFxuICAgICAgY2F1Z2h0RXJyLFxuICAgICAgZXJyTXNnTWF0Y2hlclxuICAgICk7XG4gICAgaWYgKGlzQ29tcGF0aWJsZU1lc3NhZ2UgPT09IG5lZ2F0ZSkge1xuICAgICAgaWYgKGV2ZXJ5QXJnSXNEZWZpbmVkICYmIG5lZ2F0ZSkge1xuICAgICAgICBlcnJNc2dNYXRjaGVyRmFpbCA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFzc2VydChcbiAgICAgICAgICBuZWdhdGUsXG4gICAgICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIHRocm93IGVycm9yIFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH0gYnV0IGdvdCAje2FjdH1cIixcbiAgICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgZXJyb3Igbm90IFwiICsgcGxhY2Vob2xkZXIgKyBcIiAje2V4cH1cIixcbiAgICAgICAgICBlcnJNc2dNYXRjaGVyLFxuICAgICAgICAgIGNoZWNrX2Vycm9yX2V4cG9ydHMuZ2V0TWVzc2FnZShjYXVnaHRFcnIpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChlcnJvckxpa2VGYWlsICYmIGVyck1zZ01hdGNoZXJGYWlsKSB7XG4gICAgdGhpcy5hc3NlcnQoXG4gICAgICBuZWdhdGUsXG4gICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gdGhyb3cgI3tleHB9IGJ1dCAje2FjdH0gd2FzIHRocm93blwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCB0aHJvdyAje2V4cH1cIiArIChjYXVnaHRFcnIgPyBcIiBidXQgI3thY3R9IHdhcyB0aHJvd25cIiA6IFwiXCIpLFxuICAgICAgZXJyb3JMaWtlIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvckxpa2UudG9TdHJpbmcoKSA6IGVycm9yTGlrZSAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShlcnJvckxpa2UpLFxuICAgICAgY2F1Z2h0RXJyIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVnaHRFcnIudG9TdHJpbmcoKSA6IGNhdWdodEVyciAmJiBjaGVja19lcnJvcl9leHBvcnRzLmdldENvbnN0cnVjdG9yTmFtZShjYXVnaHRFcnIpXG4gICAgKTtcbiAgfVxuICBmbGFnMih0aGlzLCBcIm9iamVjdFwiLCBjYXVnaHRFcnIpO1xufVxuX19uYW1lKGFzc2VydFRocm93cywgXCJhc3NlcnRUaHJvd3NcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwidGhyb3dcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJ0aHJvd3NcIiwgYXNzZXJ0VGhyb3dzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJUaHJvd1wiLCBhc3NlcnRUaHJvd3MpO1xuZnVuY3Rpb24gcmVzcG9uZFRvKG1ldGhvZCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGl0c2VsZiA9IGZsYWcyKHRoaXMsIFwiaXRzZWxmXCIpLCBjb250ZXh0ID0gXCJmdW5jdGlvblwiID09PSB0eXBlb2Ygb2JqICYmICFpdHNlbGYgPyBvYmoucHJvdG90eXBlW21ldGhvZF0gOiBvYmpbbWV0aG9kXTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgXCJmdW5jdGlvblwiID09PSB0eXBlb2YgY29udGV4dCxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gcmVzcG9uZCB0byBcIiArIGluc3BlY3QyKG1ldGhvZCksXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCByZXNwb25kIHRvIFwiICsgaW5zcGVjdDIobWV0aG9kKVxuICApO1xufVxuX19uYW1lKHJlc3BvbmRUbywgXCJyZXNwb25kVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZFRvXCIsIHJlc3BvbmRUbyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwicmVzcG9uZHNUb1wiLCByZXNwb25kVG8pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwiaXRzZWxmXCIsIGZ1bmN0aW9uKCkge1xuICBmbGFnMih0aGlzLCBcIml0c2VsZlwiLCB0cnVlKTtcbn0pO1xuZnVuY3Rpb24gc2F0aXNmeShtYXRjaGVyLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgbGV0IHJlc3VsdCA9IG1hdGNoZXIob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgcmVzdWx0LFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBzYXRpc2Z5IFwiICsgb2JqRGlzcGxheShtYXRjaGVyKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IHNhdGlzZnlcIiArIG9iakRpc3BsYXkobWF0Y2hlciksXG4gICAgZmxhZzIodGhpcywgXCJuZWdhdGVcIikgPyBmYWxzZSA6IHRydWUsXG4gICAgcmVzdWx0XG4gICk7XG59XG5fX25hbWUoc2F0aXNmeSwgXCJzYXRpc2Z5XCIpO1xuQXNzZXJ0aW9uLmFkZE1ldGhvZChcInNhdGlzZnlcIiwgc2F0aXNmeSk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwic2F0aXNmaWVzXCIsIHNhdGlzZnkpO1xuZnVuY3Rpb24gY2xvc2VUbyhleHBlY3RlZCwgZGVsdGEsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMubnVtZXJpYztcbiAgbGV0IG1lc3NhZ2UgPSBcIkEgYGRlbHRhYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChkZWx0YSA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZGVsdGEsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIG1lc3NhZ2UgPSBcIkEgYGV4cGVjdGVkYCB2YWx1ZSBpcyByZXF1aXJlZCBmb3IgYGNsb3NlVG9gXCI7XG4gIGlmIChleHBlY3RlZCA9PSB2b2lkIDApIHtcbiAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoXG4gICAgICBmbGFnTXNnID8gYCR7ZmxhZ01zZ306ICR7bWVzc2FnZX1gIDogbWVzc2FnZSxcbiAgICAgIHZvaWQgMCxcbiAgICAgIHNzZmlcbiAgICApO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZXhwZWN0ZWQsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLm51bWVyaWM7XG4gIGNvbnN0IGFicyA9IC8qIEBfX1BVUkVfXyAqLyBfX25hbWUoKHgpID0+IHggPCAwID8gLXggOiB4LCBcImFic1wiKTtcbiAgY29uc3Qgc3RyaXAgPSAvKiBAX19QVVJFX18gKi8gX19uYW1lKChudW1iZXIpID0+IHBhcnNlRmxvYXQocGFyc2VGbG9hdChudW1iZXIpLnRvUHJlY2lzaW9uKDEyKSksIFwic3RyaXBcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHN0cmlwKGFicyhvYmogLSBleHBlY3RlZCkpIDw9IGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGEsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IG5vdCB0byBiZSBjbG9zZSB0byBcIiArIGV4cGVjdGVkICsgXCIgKy8tIFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShjbG9zZVRvLCBcImNsb3NlVG9cIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2xvc2VUb1wiLCBjbG9zZVRvKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJhcHByb3hpbWF0ZWx5XCIsIGNsb3NlVG8pO1xuZnVuY3Rpb24gaXNTdWJzZXRPZihfc3Vic2V0LCBfc3VwZXJzZXQsIGNtcCwgY29udGFpbnMsIG9yZGVyZWQpIHtcbiAgbGV0IHN1cGVyc2V0ID0gQXJyYXkuZnJvbShfc3VwZXJzZXQpO1xuICBsZXQgc3Vic2V0ID0gQXJyYXkuZnJvbShfc3Vic2V0KTtcbiAgaWYgKCFjb250YWlucykge1xuICAgIGlmIChzdWJzZXQubGVuZ3RoICE9PSBzdXBlcnNldC5sZW5ndGgpIHJldHVybiBmYWxzZTtcbiAgICBzdXBlcnNldCA9IHN1cGVyc2V0LnNsaWNlKCk7XG4gIH1cbiAgcmV0dXJuIHN1YnNldC5ldmVyeShmdW5jdGlvbihlbGVtLCBpZHgpIHtcbiAgICBpZiAob3JkZXJlZCkgcmV0dXJuIGNtcCA/IGNtcChlbGVtLCBzdXBlcnNldFtpZHhdKSA6IGVsZW0gPT09IHN1cGVyc2V0W2lkeF07XG4gICAgaWYgKCFjbXApIHtcbiAgICAgIGxldCBtYXRjaElkeCA9IHN1cGVyc2V0LmluZGV4T2YoZWxlbSk7XG4gICAgICBpZiAobWF0Y2hJZHggPT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBzdXBlcnNldC5zb21lKGZ1bmN0aW9uKGVsZW0yLCBtYXRjaElkeCkge1xuICAgICAgaWYgKCFjbXAoZWxlbSwgZWxlbTIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBpZiAoIWNvbnRhaW5zKSBzdXBlcnNldC5zcGxpY2UobWF0Y2hJZHgsIDEpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG4gIH0pO1xufVxuX19uYW1lKGlzU3Vic2V0T2YsIFwiaXNTdWJzZXRPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJtZW1iZXJzXCIsIGZ1bmN0aW9uKHN1YnNldCwgbXNnKSB7XG4gIGlmIChtc2cpIGZsYWcyKHRoaXMsIFwibWVzc2FnZVwiLCBtc2cpO1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5pdGVyYWJsZTtcbiAgbmV3IEFzc2VydGlvbihzdWJzZXQsIGZsYWdNc2csIHNzZmksIHRydWUpLnRvLmJlLml0ZXJhYmxlO1xuICBsZXQgY29udGFpbnMgPSBmbGFnMih0aGlzLCBcImNvbnRhaW5zXCIpO1xuICBsZXQgb3JkZXJlZCA9IGZsYWcyKHRoaXMsIFwib3JkZXJlZFwiKTtcbiAgbGV0IHN1YmplY3QsIGZhaWxNc2csIGZhaWxOZWdhdGVNc2c7XG4gIGlmIChjb250YWlucykge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJhbiBvcmRlcmVkIHN1cGVyc2V0XCIgOiBcImEgc3VwZXJzZXRcIjtcbiAgICBmYWlsTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICAgIGZhaWxOZWdhdGVNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIFwiICsgc3ViamVjdCArIFwiIG9mICN7ZXhwfVwiO1xuICB9IGVsc2Uge1xuICAgIHN1YmplY3QgPSBvcmRlcmVkID8gXCJvcmRlcmVkIG1lbWJlcnNcIiA6IFwibWVtYmVyc1wiO1xuICAgIGZhaWxNc2cgPSBcImV4cGVjdGVkICN7dGhpc30gdG8gaGF2ZSB0aGUgc2FtZSBcIiArIHN1YmplY3QgKyBcIiBhcyAje2V4cH1cIjtcbiAgICBmYWlsTmVnYXRlTXNnID0gXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBoYXZlIHRoZSBzYW1lIFwiICsgc3ViamVjdCArIFwiIGFzICN7ZXhwfVwiO1xuICB9XG4gIGxldCBjbXAgPSBmbGFnMih0aGlzLCBcImRlZXBcIikgPyBmbGFnMih0aGlzLCBcImVxbFwiKSA6IHZvaWQgMDtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNTdWJzZXRPZihzdWJzZXQsIG9iaiwgY21wLCBjb250YWlucywgb3JkZXJlZCksXG4gICAgZmFpbE1zZyxcbiAgICBmYWlsTmVnYXRlTXNnLFxuICAgIHN1YnNldCxcbiAgICBvYmosXG4gICAgdHJ1ZVxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJpdGVyYWJsZVwiLCBmdW5jdGlvbihtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBvYmogPSBmbGFnMih0aGlzLCBcIm9iamVjdFwiKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgb2JqICE9IHZvaWQgMCAmJiBvYmpbU3ltYm9sLml0ZXJhdG9yXSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYW4gaXRlcmFibGVcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIGFuIGl0ZXJhYmxlXCIsXG4gICAgb2JqXG4gICk7XG59KTtcbmZ1bmN0aW9uIG9uZU9mKGxpc3QsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGV4cGVjdGVkID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIiksIGNvbnRhaW5zID0gZmxhZzIodGhpcywgXCJjb250YWluc1wiKSwgaXNEZWVwID0gZmxhZzIodGhpcywgXCJkZWVwXCIpLCBlcWwgPSBmbGFnMih0aGlzLCBcImVxbFwiKTtcbiAgbmV3IEFzc2VydGlvbihsaXN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5iZS5hbihcImFycmF5XCIpO1xuICBpZiAoY29udGFpbnMpIHtcbiAgICB0aGlzLmFzc2VydChcbiAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICByZXR1cm4gZXhwZWN0ZWQuaW5kZXhPZihwb3NzaWJpbGl0eSkgPiAtMTtcbiAgICAgIH0pLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIGNvbnRhaW4gb25lIG9mICN7ZXhwfVwiLFxuICAgICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBjb250YWluIG9uZSBvZiAje2V4cH1cIixcbiAgICAgIGxpc3QsXG4gICAgICBleHBlY3RlZFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgaWYgKGlzRGVlcCkge1xuICAgICAgdGhpcy5hc3NlcnQoXG4gICAgICAgIGxpc3Quc29tZShmdW5jdGlvbihwb3NzaWJpbGl0eSkge1xuICAgICAgICAgIHJldHVybiBlcWwoZXhwZWN0ZWQsIHBvc3NpYmlsaXR5KTtcbiAgICAgICAgfSksXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBkZWVwbHkgZXF1YWwgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gZGVlcGx5IGVxdWFsIG9uZSBvZiAje2V4cH1cIixcbiAgICAgICAgbGlzdCxcbiAgICAgICAgZXhwZWN0ZWRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXNzZXJ0KFxuICAgICAgICBsaXN0LmluZGV4T2YoZXhwZWN0ZWQpID4gLTEsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBvbmUgb2YgI3tleHB9XCIsXG4gICAgICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBub3QgYmUgb25lIG9mICN7ZXhwfVwiLFxuICAgICAgICBsaXN0LFxuICAgICAgICBleHBlY3RlZFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbl9fbmFtZShvbmVPZiwgXCJvbmVPZlwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJvbmVPZlwiLCBvbmVPZik7XG5mdW5jdGlvbiBhc3NlcnRDaGFuZ2VzKHN1YmplY3QsIHByb3AsIG1zZykge1xuICBpZiAobXNnKSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiwgbXNnKTtcbiAgbGV0IGZuID0gZmxhZzIodGhpcywgXCJvYmplY3RcIiksIGZsYWdNc2cgPSBmbGFnMih0aGlzLCBcIm1lc3NhZ2VcIiksIHNzZmkgPSBmbGFnMih0aGlzLCBcInNzZmlcIik7XG4gIG5ldyBBc3NlcnRpb24oZm4sIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgbGV0IGluaXRpYWw7XG4gIGlmICghcHJvcCkge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkuaXMuYShcImZ1bmN0aW9uXCIpO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0KCk7XG4gIH0gZWxzZSB7XG4gICAgbmV3IEFzc2VydGlvbihzdWJqZWN0LCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3ApO1xuICAgIGluaXRpYWwgPSBzdWJqZWN0W3Byb3BdO1xuICB9XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImNoYW5nZVwiKTtcbiAgZmxhZzIodGhpcywgXCJyZWFsRGVsdGFcIiwgZmluYWwgIT09IGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBpbml0aWFsICE9PSBmaW5hbCxcbiAgICBcImV4cGVjdGVkIFwiICsgbXNnT2JqICsgXCIgdG8gY2hhbmdlXCIsXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIG5vdCBjaGFuZ2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydENoYW5nZXMsIFwiYXNzZXJ0Q2hhbmdlc1wiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjaGFuZ2VcIiwgYXNzZXJ0Q2hhbmdlcyk7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiY2hhbmdlc1wiLCBhc3NlcnRDaGFuZ2VzKTtcbmZ1bmN0aW9uIGFzc2VydEluY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImluY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBmaW5hbCAtIGluaXRpYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPiAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBpbmNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgaW5jcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydEluY3JlYXNlcywgXCJhc3NlcnRJbmNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiaW5jcmVhc2VcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJpbmNyZWFzZXNcIiwgYXNzZXJ0SW5jcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlY3JlYXNlcyhzdWJqZWN0LCBwcm9wLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBmbiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpLCBmbGFnTXNnID0gZmxhZzIodGhpcywgXCJtZXNzYWdlXCIpLCBzc2ZpID0gZmxhZzIodGhpcywgXCJzc2ZpXCIpO1xuICBuZXcgQXNzZXJ0aW9uKGZuLCBmbGFnTXNnLCBzc2ZpLCB0cnVlKS5pcy5hKFwiZnVuY3Rpb25cIik7XG4gIGxldCBpbml0aWFsO1xuICBpZiAoIXByb3ApIHtcbiAgICBuZXcgQXNzZXJ0aW9uKHN1YmplY3QsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJmdW5jdGlvblwiKTtcbiAgICBpbml0aWFsID0gc3ViamVjdCgpO1xuICB9IGVsc2Uge1xuICAgIG5ldyBBc3NlcnRpb24oc3ViamVjdCwgZmxhZ01zZywgc3NmaSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbiAgICBpbml0aWFsID0gc3ViamVjdFtwcm9wXTtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGluaXRpYWwsIGZsYWdNc2csIHNzZmksIHRydWUpLmlzLmEoXCJudW1iZXJcIik7XG4gIGZuKCk7XG4gIGxldCBmaW5hbCA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gc3ViamVjdCgpIDogc3ViamVjdFtwcm9wXTtcbiAgbGV0IG1zZ09iaiA9IHByb3AgPT09IHZvaWQgMCB8fCBwcm9wID09PSBudWxsID8gaW5pdGlhbCA6IFwiLlwiICsgcHJvcDtcbiAgZmxhZzIodGhpcywgXCJkZWx0YU1zZ09ialwiLCBtc2dPYmopO1xuICBmbGFnMih0aGlzLCBcImluaXRpYWxEZWx0YVZhbHVlXCIsIGluaXRpYWwpO1xuICBmbGFnMih0aGlzLCBcImZpbmFsRGVsdGFWYWx1ZVwiLCBmaW5hbCk7XG4gIGZsYWcyKHRoaXMsIFwiZGVsdGFCZWhhdmlvclwiLCBcImRlY3JlYXNlXCIpO1xuICBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiLCBpbml0aWFsIC0gZmluYWwpO1xuICB0aGlzLmFzc2VydChcbiAgICBmaW5hbCAtIGluaXRpYWwgPCAwLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBkZWNyZWFzZVwiLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgZGVjcmVhc2VcIlxuICApO1xufVxuX19uYW1lKGFzc2VydERlY3JlYXNlcywgXCJhc3NlcnREZWNyZWFzZXNcIik7XG5Bc3NlcnRpb24uYWRkTWV0aG9kKFwiZGVjcmVhc2VcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJkZWNyZWFzZXNcIiwgYXNzZXJ0RGVjcmVhc2VzKTtcbmZ1bmN0aW9uIGFzc2VydERlbHRhKGRlbHRhLCBtc2cpIHtcbiAgaWYgKG1zZykgZmxhZzIodGhpcywgXCJtZXNzYWdlXCIsIG1zZyk7XG4gIGxldCBtc2dPYmogPSBmbGFnMih0aGlzLCBcImRlbHRhTXNnT2JqXCIpO1xuICBsZXQgaW5pdGlhbCA9IGZsYWcyKHRoaXMsIFwiaW5pdGlhbERlbHRhVmFsdWVcIik7XG4gIGxldCBmaW5hbCA9IGZsYWcyKHRoaXMsIFwiZmluYWxEZWx0YVZhbHVlXCIpO1xuICBsZXQgYmVoYXZpb3IgPSBmbGFnMih0aGlzLCBcImRlbHRhQmVoYXZpb3JcIik7XG4gIGxldCByZWFsRGVsdGEgPSBmbGFnMih0aGlzLCBcInJlYWxEZWx0YVwiKTtcbiAgbGV0IGV4cHJlc3Npb247XG4gIGlmIChiZWhhdmlvciA9PT0gXCJjaGFuZ2VcIikge1xuICAgIGV4cHJlc3Npb24gPSBNYXRoLmFicyhmaW5hbCAtIGluaXRpYWwpID09PSBNYXRoLmFicyhkZWx0YSk7XG4gIH0gZWxzZSB7XG4gICAgZXhwcmVzc2lvbiA9IHJlYWxEZWx0YSA9PT0gTWF0aC5hYnMoZGVsdGEpO1xuICB9XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGV4cHJlc3Npb24sXG4gICAgXCJleHBlY3RlZCBcIiArIG1zZ09iaiArIFwiIHRvIFwiICsgYmVoYXZpb3IgKyBcIiBieSBcIiArIGRlbHRhLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBtc2dPYmogKyBcIiB0byBub3QgXCIgKyBiZWhhdmlvciArIFwiIGJ5IFwiICsgZGVsdGFcbiAgKTtcbn1cbl9fbmFtZShhc3NlcnREZWx0YSwgXCJhc3NlcnREZWx0YVwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJieVwiLCBhc3NlcnREZWx0YSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJleHRlbnNpYmxlXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc0V4dGVuc2libGUgPSBvYmogPT09IE9iamVjdChvYmopICYmIE9iamVjdC5pc0V4dGVuc2libGUob2JqKTtcbiAgdGhpcy5hc3NlcnQoXG4gICAgaXNFeHRlbnNpYmxlLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBleHRlbnNpYmxlXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBleHRlbnNpYmxlXCJcbiAgKTtcbn0pO1xuQXNzZXJ0aW9uLmFkZFByb3BlcnR5KFwic2VhbGVkXCIsIGZ1bmN0aW9uKCkge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIGxldCBpc1NlYWxlZCA9IG9iaiA9PT0gT2JqZWN0KG9iaikgPyBPYmplY3QuaXNTZWFsZWQob2JqKSA6IHRydWU7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIGlzU2VhbGVkLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBiZSBzZWFsZWRcIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGJlIHNlYWxlZFwiXG4gICk7XG59KTtcbkFzc2VydGlvbi5hZGRQcm9wZXJ0eShcImZyb3plblwiLCBmdW5jdGlvbigpIHtcbiAgbGV0IG9iaiA9IGZsYWcyKHRoaXMsIFwib2JqZWN0XCIpO1xuICBsZXQgaXNGcm96ZW4gPSBvYmogPT09IE9iamVjdChvYmopID8gT2JqZWN0LmlzRnJvemVuKG9iaikgOiB0cnVlO1xuICB0aGlzLmFzc2VydChcbiAgICBpc0Zyb3plbixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgZnJvemVuXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBmcm96ZW5cIlxuICApO1xufSk7XG5Bc3NlcnRpb24uYWRkUHJvcGVydHkoXCJmaW5pdGVcIiwgZnVuY3Rpb24oX21zZykge1xuICBsZXQgb2JqID0gZmxhZzIodGhpcywgXCJvYmplY3RcIik7XG4gIHRoaXMuYXNzZXJ0KFxuICAgIHR5cGVvZiBvYmogPT09IFwibnVtYmVyXCIgJiYgaXNGaW5pdGUob2JqKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gYmUgYSBmaW5pdGUgbnVtYmVyXCIsXG4gICAgXCJleHBlY3RlZCAje3RoaXN9IHRvIG5vdCBiZSBhIGZpbml0ZSBudW1iZXJcIlxuICApO1xufSk7XG5mdW5jdGlvbiBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpIHtcbiAgaWYgKGV4cGVjdGVkID09PSBhY3R1YWwpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAodHlwZW9mIGFjdHVhbCAhPT0gdHlwZW9mIGV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmICh0eXBlb2YgZXhwZWN0ZWQgIT09IFwib2JqZWN0XCIgfHwgZXhwZWN0ZWQgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQgPT09IGFjdHVhbDtcbiAgfVxuICBpZiAoIWFjdHVhbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShleHBlY3RlZCkpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYWN0dWFsKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZXhwZWN0ZWQuZXZlcnkoZnVuY3Rpb24oZXhwKSB7XG4gICAgICByZXR1cm4gYWN0dWFsLnNvbWUoZnVuY3Rpb24oYWN0KSB7XG4gICAgICAgIHJldHVybiBjb21wYXJlU3Vic2V0KGV4cCwgYWN0KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGlmIChleHBlY3RlZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkLmdldFRpbWUoKSA9PT0gYWN0dWFsLmdldFRpbWUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoZXhwZWN0ZWQpLmV2ZXJ5KGZ1bmN0aW9uKGtleSkge1xuICAgIGxldCBleHBlY3RlZFZhbHVlID0gZXhwZWN0ZWRba2V5XTtcbiAgICBsZXQgYWN0dWFsVmFsdWUgPSBhY3R1YWxba2V5XTtcbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwib2JqZWN0XCIgJiYgZXhwZWN0ZWRWYWx1ZSAhPT0gbnVsbCAmJiBhY3R1YWxWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVTdWJzZXQoZXhwZWN0ZWRWYWx1ZSwgYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGV4cGVjdGVkVmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGV4cGVjdGVkVmFsdWUoYWN0dWFsVmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gYWN0dWFsVmFsdWUgPT09IGV4cGVjdGVkVmFsdWU7XG4gIH0pO1xufVxuX19uYW1lKGNvbXBhcmVTdWJzZXQsIFwiY29tcGFyZVN1YnNldFwiKTtcbkFzc2VydGlvbi5hZGRNZXRob2QoXCJjb250YWluU3Vic2V0XCIsIGZ1bmN0aW9uKGV4cGVjdGVkKSB7XG4gIGNvbnN0IGFjdHVhbCA9IGZsYWcodGhpcywgXCJvYmplY3RcIik7XG4gIGNvbnN0IHNob3dEaWZmID0gY29uZmlnLnNob3dEaWZmO1xuICB0aGlzLmFzc2VydChcbiAgICBjb21wYXJlU3Vic2V0KGV4cGVjdGVkLCBhY3R1YWwpLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIGNvbnRhaW4gc3Vic2V0ICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3thY3R9IHRvIG5vdCBjb250YWluIHN1YnNldCAje2V4cH1cIixcbiAgICBleHBlY3RlZCxcbiAgICBhY3R1YWwsXG4gICAgc2hvd0RpZmZcbiAgKTtcbn0pO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvZXhwZWN0LmpzXG5mdW5jdGlvbiBleHBlY3QodmFsLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKHZhbCwgbWVzc2FnZSk7XG59XG5fX25hbWUoZXhwZWN0LCBcImV4cGVjdFwiKTtcbmV4cGVjdC5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7XG4gICAgbWVzc2FnZSA9IGFjdHVhbDtcbiAgICBhY3R1YWwgPSB2b2lkIDA7XG4gIH1cbiAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgXCJleHBlY3QuZmFpbCgpXCI7XG4gIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICBtZXNzYWdlLFxuICAgIHtcbiAgICAgIGFjdHVhbCxcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgb3BlcmF0b3JcbiAgICB9LFxuICAgIGV4cGVjdC5mYWlsXG4gICk7XG59O1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2Uvc2hvdWxkLmpzXG52YXIgc2hvdWxkX2V4cG9ydHMgPSB7fTtcbl9fZXhwb3J0KHNob3VsZF9leHBvcnRzLCB7XG4gIFNob3VsZDogKCkgPT4gU2hvdWxkLFxuICBzaG91bGQ6ICgpID0+IHNob3VsZFxufSk7XG5mdW5jdGlvbiBsb2FkU2hvdWxkKCkge1xuICBmdW5jdGlvbiBzaG91bGRHZXR0ZXIoKSB7XG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBTdHJpbmcgfHwgdGhpcyBpbnN0YW5jZW9mIE51bWJlciB8fCB0aGlzIGluc3RhbmNlb2YgQm9vbGVhbiB8fCB0eXBlb2YgU3ltYm9sID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIFN5bWJvbCB8fCB0eXBlb2YgQmlnSW50ID09PSBcImZ1bmN0aW9uXCIgJiYgdGhpcyBpbnN0YW5jZW9mIEJpZ0ludCkge1xuICAgICAgcmV0dXJuIG5ldyBBc3NlcnRpb24odGhpcy52YWx1ZU9mKCksIG51bGwsIHNob3VsZEdldHRlcik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXNzZXJ0aW9uKHRoaXMsIG51bGwsIHNob3VsZEdldHRlcik7XG4gIH1cbiAgX19uYW1lKHNob3VsZEdldHRlciwgXCJzaG91bGRHZXR0ZXJcIik7XG4gIGZ1bmN0aW9uIHNob3VsZFNldHRlcih2YWx1ZSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBcInNob3VsZFwiLCB7XG4gICAgICB2YWx1ZSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICB3cml0YWJsZTogdHJ1ZVxuICAgIH0pO1xuICB9XG4gIF9fbmFtZShzaG91bGRTZXR0ZXIsIFwic2hvdWxkU2V0dGVyXCIpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoT2JqZWN0LnByb3RvdHlwZSwgXCJzaG91bGRcIiwge1xuICAgIHNldDogc2hvdWxkU2V0dGVyLFxuICAgIGdldDogc2hvdWxkR2V0dGVyLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICB9KTtcbiAgbGV0IHNob3VsZDIgPSB7fTtcbiAgc2hvdWxkMi5mYWlsID0gZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgb3BlcmF0b3IpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICAgIG1lc3NhZ2UgPSBhY3R1YWw7XG4gICAgICBhY3R1YWwgPSB2b2lkIDA7XG4gICAgfVxuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IFwic2hvdWxkLmZhaWwoKVwiO1xuICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihcbiAgICAgIG1lc3NhZ2UsXG4gICAgICB7XG4gICAgICAgIGFjdHVhbCxcbiAgICAgICAgZXhwZWN0ZWQsXG4gICAgICAgIG9wZXJhdG9yXG4gICAgICB9LFxuICAgICAgc2hvdWxkMi5mYWlsXG4gICAgKTtcbiAgfTtcbiAgc2hvdWxkMi5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgICBuZXcgQXNzZXJ0aW9uKGFjdHVhbCwgbWVzc2FnZSkudG8uZXF1YWwoZXhwZWN0ZWQpO1xuICB9O1xuICBzaG91bGQyLlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8uVGhyb3coZXJydCwgZXJycyk7XG4gIH07XG4gIHNob3VsZDIuZXhpc3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24odmFsLCBtc2cpLnRvLmV4aXN0O1xuICB9O1xuICBzaG91bGQyLm5vdCA9IHt9O1xuICBzaG91bGQyLm5vdC5lcXVhbCA9IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oYWN0dWFsLCBtc2cpLnRvLm5vdC5lcXVhbChleHBlY3RlZCk7XG4gIH07XG4gIHNob3VsZDIubm90LlRocm93ID0gZnVuY3Rpb24oZm4sIGVycnQsIGVycnMsIG1zZykge1xuICAgIG5ldyBBc3NlcnRpb24oZm4sIG1zZykudG8ubm90LlRocm93KGVycnQsIGVycnMpO1xuICB9O1xuICBzaG91bGQyLm5vdC5leGlzdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gICAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmV4aXN0O1xuICB9O1xuICBzaG91bGQyW1widGhyb3dcIl0gPSBzaG91bGQyW1wiVGhyb3dcIl07XG4gIHNob3VsZDIubm90W1widGhyb3dcIl0gPSBzaG91bGQyLm5vdFtcIlRocm93XCJdO1xuICByZXR1cm4gc2hvdWxkMjtcbn1cbl9fbmFtZShsb2FkU2hvdWxkLCBcImxvYWRTaG91bGRcIik7XG52YXIgc2hvdWxkID0gbG9hZFNob3VsZDtcbnZhciBTaG91bGQgPSBsb2FkU2hvdWxkO1xuXG4vLyBsaWIvY2hhaS9pbnRlcmZhY2UvYXNzZXJ0LmpzXG5mdW5jdGlvbiBhc3NlcnQoZXhwcmVzcywgZXJybXNnKSB7XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24obnVsbCwgbnVsbCwgYXNzZXJ0LCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KGV4cHJlc3MsIGVycm1zZywgXCJbIG5lZ2F0aW9uIG1lc3NhZ2UgdW5hdmFpbGFibGUgXVwiKTtcbn1cbl9fbmFtZShhc3NlcnQsIFwiYXNzZXJ0XCIpO1xuYXNzZXJ0LmZhaWwgPSBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvcikge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHtcbiAgICBtZXNzYWdlID0gYWN0dWFsO1xuICAgIGFjdHVhbCA9IHZvaWQgMDtcbiAgfVxuICBtZXNzYWdlID0gbWVzc2FnZSB8fCBcImFzc2VydC5mYWlsKClcIjtcbiAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgIG1lc3NhZ2UsXG4gICAge1xuICAgICAgYWN0dWFsLFxuICAgICAgZXhwZWN0ZWQsXG4gICAgICBvcGVyYXRvclxuICAgIH0sXG4gICAgYXNzZXJ0LmZhaWxcbiAgKTtcbn07XG5hc3NlcnQuaXNPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09rLCB0cnVlKS5pcy5vaztcbn07XG5hc3NlcnQuaXNOb3RPayA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE9rLCB0cnVlKS5pcy5ub3Qub2s7XG59O1xuYXNzZXJ0LmVxdWFsID0gZnVuY3Rpb24oYWN0LCBleHAsIG1zZykge1xuICBsZXQgdGVzdDIgPSBuZXcgQXNzZXJ0aW9uKGFjdCwgbXNnLCBhc3NlcnQuZXF1YWwsIHRydWUpO1xuICB0ZXN0Mi5hc3NlcnQoXG4gICAgZXhwID09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2V4cH1cIixcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7YWN0fVwiLFxuICAgIGV4cCxcbiAgICBhY3QsXG4gICAgdHJ1ZVxuICApO1xufTtcbmFzc2VydC5ub3RFcXVhbCA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBtc2cpIHtcbiAgbGV0IHRlc3QyID0gbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0Lm5vdEVxdWFsLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIGV4cCAhPSBmbGFnKHRlc3QyLCBcIm9iamVjdFwiKSxcbiAgICBcImV4cGVjdGVkICN7dGhpc30gdG8gbm90IGVxdWFsICN7ZXhwfVwiLFxuICAgIFwiZXhwZWN0ZWQgI3t0aGlzfSB0byBlcXVhbCAje2FjdH1cIixcbiAgICBleHAsXG4gICAgYWN0LFxuICAgIHRydWVcbiAgKTtcbn07XG5hc3NlcnQuc3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5zdHJpY3RFcXVhbCwgdHJ1ZSkudG8uZXF1YWwoZXhwKTtcbn07XG5hc3NlcnQubm90U3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3RTdHJpY3RFcXVhbCwgdHJ1ZSkudG8ubm90LmVxdWFsKGV4cCk7XG59O1xuYXNzZXJ0LmRlZXBFcXVhbCA9IGFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5kZWVwRXF1YWwsIHRydWUpLnRvLmVxbChleHApO1xufTtcbmFzc2VydC5ub3REZWVwRXF1YWwgPSBmdW5jdGlvbihhY3QsIGV4cCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5ub3REZWVwRXF1YWwsIHRydWUpLnRvLm5vdC5lcWwoZXhwKTtcbn07XG5hc3NlcnQuaXNBYm92ZSA9IGZ1bmN0aW9uKHZhbCwgYWJ2LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQWJvdmUsIHRydWUpLnRvLmJlLmFib3ZlKGFidik7XG59O1xuYXNzZXJ0LmlzQXRMZWFzdCA9IGZ1bmN0aW9uKHZhbCwgYXRsc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdExlYXN0LCB0cnVlKS50by5iZS5sZWFzdChhdGxzdCk7XG59O1xuYXNzZXJ0LmlzQmVsb3cgPSBmdW5jdGlvbih2YWwsIGJsdywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0JlbG93LCB0cnVlKS50by5iZS5iZWxvdyhibHcpO1xufTtcbmFzc2VydC5pc0F0TW9zdCA9IGZ1bmN0aW9uKHZhbCwgYXRtc3QsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNBdE1vc3QsIHRydWUpLnRvLmJlLm1vc3QoYXRtc3QpO1xufTtcbmFzc2VydC5pc1RydWUgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNUcnVlLCB0cnVlKS5pc1tcInRydWVcIl07XG59O1xuYXNzZXJ0LmlzTm90VHJ1ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFRydWUsIHRydWUpLnRvLm5vdC5lcXVhbCh0cnVlKTtcbn07XG5hc3NlcnQuaXNGYWxzZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0ZhbHNlLCB0cnVlKS5pc1tcImZhbHNlXCJdO1xufTtcbmFzc2VydC5pc05vdEZhbHNlID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90RmFsc2UsIHRydWUpLnRvLm5vdC5lcXVhbChmYWxzZSk7XG59O1xuYXNzZXJ0LmlzTnVsbCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bGwsIHRydWUpLnRvLmVxdWFsKG51bGwpO1xufTtcbmFzc2VydC5pc05vdE51bGwgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3ROdWxsLCB0cnVlKS50by5ub3QuZXF1YWwobnVsbCk7XG59O1xuYXNzZXJ0LmlzTmFOID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTmFOLCB0cnVlKS50by5iZS5OYU47XG59O1xuYXNzZXJ0LmlzTm90TmFOID0gZnVuY3Rpb24odmFsdWUsIG1lc3NhZ2UpIHtcbiAgbmV3IEFzc2VydGlvbih2YWx1ZSwgbWVzc2FnZSwgYXNzZXJ0LmlzTm90TmFOLCB0cnVlKS5ub3QudG8uYmUuTmFOO1xufTtcbmFzc2VydC5leGlzdHMgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuZXhpc3RzLCB0cnVlKS50by5leGlzdDtcbn07XG5hc3NlcnQubm90RXhpc3RzID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lm5vdEV4aXN0cywgdHJ1ZSkudG8ubm90LmV4aXN0O1xufTtcbmFzc2VydC5pc1VuZGVmaW5lZCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc1VuZGVmaW5lZCwgdHJ1ZSkudG8uZXF1YWwodm9pZCAwKTtcbn07XG5hc3NlcnQuaXNEZWZpbmVkID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzRGVmaW5lZCwgdHJ1ZSkudG8ubm90LmVxdWFsKHZvaWQgMCk7XG59O1xuYXNzZXJ0LmlzQ2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNDYWxsYWJsZSwgdHJ1ZSkuaXMuY2FsbGFibGU7XG59O1xuYXNzZXJ0LmlzTm90Q2FsbGFibGUgPSBmdW5jdGlvbih2YWx1ZSwgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQuaXNOb3RDYWxsYWJsZSwgdHJ1ZSkuaXMubm90LmNhbGxhYmxlO1xufTtcbmFzc2VydC5pc09iamVjdCA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc09iamVjdCwgdHJ1ZSkudG8uYmUuYShcIm9iamVjdFwiKTtcbn07XG5hc3NlcnQuaXNOb3RPYmplY3QgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RPYmplY3QsIHRydWUpLnRvLm5vdC5iZS5hKFwib2JqZWN0XCIpO1xufTtcbmFzc2VydC5pc0FycmF5ID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzQXJyYXksIHRydWUpLnRvLmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzTm90QXJyYXkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RBcnJheSwgdHJ1ZSkudG8ubm90LmJlLmFuKFwiYXJyYXlcIik7XG59O1xuYXNzZXJ0LmlzU3RyaW5nID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzU3RyaW5nLCB0cnVlKS50by5iZS5hKFwic3RyaW5nXCIpO1xufTtcbmFzc2VydC5pc05vdFN0cmluZyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdFN0cmluZywgdHJ1ZSkudG8ubm90LmJlLmEoXCJzdHJpbmdcIik7XG59O1xuYXNzZXJ0LmlzTnVtYmVyID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTnVtYmVyLCB0cnVlKS50by5iZS5hKFwibnVtYmVyXCIpO1xufTtcbmFzc2VydC5pc05vdE51bWJlciA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWJlciwgdHJ1ZSkudG8ubm90LmJlLmEoXCJudW1iZXJcIik7XG59O1xuYXNzZXJ0LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc051bWVyaWMsIHRydWUpLmlzLm51bWVyaWM7XG59O1xuYXNzZXJ0LmlzTm90TnVtZXJpYyA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc05vdE51bWVyaWMsIHRydWUpLmlzLm5vdC5udW1lcmljO1xufTtcbmFzc2VydC5pc0Zpbml0ZSA9IGZ1bmN0aW9uKHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5pc0Zpbml0ZSwgdHJ1ZSkudG8uYmUuZmluaXRlO1xufTtcbmFzc2VydC5pc0Jvb2xlYW4gPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNCb29sZWFuLCB0cnVlKS50by5iZS5hKFwiYm9vbGVhblwiKTtcbn07XG5hc3NlcnQuaXNOb3RCb29sZWFuID0gZnVuY3Rpb24odmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LmlzTm90Qm9vbGVhbiwgdHJ1ZSkudG8ubm90LmJlLmEoXCJib29sZWFuXCIpO1xufTtcbmFzc2VydC50eXBlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0LnR5cGVPZiwgdHJ1ZSkudG8uYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lm5vdFR5cGVPZiA9IGZ1bmN0aW9uKHZhbHVlLCB0eXBlMywgbWVzc2FnZSkge1xuICBuZXcgQXNzZXJ0aW9uKHZhbHVlLCBtZXNzYWdlLCBhc3NlcnQubm90VHlwZU9mLCB0cnVlKS50by5ub3QuYmUuYSh0eXBlMyk7XG59O1xuYXNzZXJ0Lmluc3RhbmNlT2YgPSBmdW5jdGlvbih2YWwsIHR5cGUzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZywgYXNzZXJ0Lmluc3RhbmNlT2YsIHRydWUpLnRvLmJlLmluc3RhbmNlT2YodHlwZTMpO1xufTtcbmFzc2VydC5ub3RJbnN0YW5jZU9mID0gZnVuY3Rpb24odmFsLCB0eXBlMywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24odmFsLCBtc2csIGFzc2VydC5ub3RJbnN0YW5jZU9mLCB0cnVlKS50by5ub3QuYmUuaW5zdGFuY2VPZihcbiAgICB0eXBlM1xuICApO1xufTtcbmFzc2VydC5pbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuaW5jbHVkZSwgdHJ1ZSkuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5ub3RJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90SW5jbHVkZSwgdHJ1ZSkubm90LmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQuZGVlcEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5kZWVwSW5jbHVkZSwgdHJ1ZSkuZGVlcC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcEluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubmVzdGVkSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5lc3RlZEluY2x1ZGUsIHRydWUpLm5lc3RlZC5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZEluY2x1ZGUgPSBmdW5jdGlvbihleHAsIGluYywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oZXhwLCBtc2csIGFzc2VydC5ub3ROZXN0ZWRJbmNsdWRlLCB0cnVlKS5ub3QubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQuZGVlcE5lc3RlZEluY2x1ZGUsIHRydWUpLmRlZXAubmVzdGVkLmluY2x1ZGUoXG4gICAgaW5jXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIGV4cCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBOZXN0ZWRJbmNsdWRlLFxuICAgIHRydWVcbiAgKS5ub3QuZGVlcC5uZXN0ZWQuaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5vd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQub3duSW5jbHVkZSwgdHJ1ZSkub3duLmluY2x1ZGUoaW5jKTtcbn07XG5hc3NlcnQubm90T3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE93bkluY2x1ZGUsIHRydWUpLm5vdC5vd24uaW5jbHVkZShpbmMpO1xufTtcbmFzc2VydC5kZWVwT3duSW5jbHVkZSA9IGZ1bmN0aW9uKGV4cCwgaW5jLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0LmRlZXBPd25JbmNsdWRlLCB0cnVlKS5kZWVwLm93bi5pbmNsdWRlKGluYyk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25JbmNsdWRlID0gZnVuY3Rpb24oZXhwLCBpbmMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubm90RGVlcE93bkluY2x1ZGUsIHRydWUpLm5vdC5kZWVwLm93bi5pbmNsdWRlKFxuICAgIGluY1xuICApO1xufTtcbmFzc2VydC5tYXRjaCA9IGZ1bmN0aW9uKGV4cCwgcmUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKGV4cCwgbXNnLCBhc3NlcnQubWF0Y2gsIHRydWUpLnRvLm1hdGNoKHJlKTtcbn07XG5hc3NlcnQubm90TWF0Y2ggPSBmdW5jdGlvbihleHAsIHJlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lm5vdE1hdGNoLCB0cnVlKS50by5ub3QubWF0Y2gocmUpO1xufTtcbmFzc2VydC5wcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5wcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubm90UHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHksIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5wcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LnByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQubm90UHJvcGVydHlWYWwsIHRydWUpLnRvLm5vdC5oYXZlLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRlZXBQcm9wZXJ0eVZhbCwgdHJ1ZSkudG8uaGF2ZS5kZWVwLnByb3BlcnR5KFxuICAgIHByb3AsXG4gICAgdmFsXG4gICk7XG59O1xuYXNzZXJ0Lm5vdERlZXBQcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3REZWVwUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLmRlZXAucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHkgPSBmdW5jdGlvbihvYmosIHByb3AsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQub3duUHJvcGVydHksIHRydWUpLnRvLmhhdmUub3duLnByb3BlcnR5KHByb3ApO1xufTtcbmFzc2VydC5ub3RPd25Qcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5ub3RPd25Qcm9wZXJ0eSwgdHJ1ZSkudG8ubm90LmhhdmUub3duLnByb3BlcnR5KFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQub3duUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbHVlLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lm93blByb3BlcnR5VmFsLCB0cnVlKS50by5oYXZlLm93bi5wcm9wZXJ0eShcbiAgICBwcm9wLFxuICAgIHZhbHVlXG4gICk7XG59O1xuYXNzZXJ0Lm5vdE93blByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWx1ZSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90T3duUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm93bi5wcm9wZXJ0eShwcm9wLCB2YWx1ZSk7XG59O1xuYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgdmFsdWUsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdERlZXBPd25Qcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuZGVlcC5vd24ucHJvcGVydHkocHJvcCwgdmFsdWUpO1xufTtcbmFzc2VydC5uZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5uZXN0ZWRQcm9wZXJ0eSwgdHJ1ZSkudG8uaGF2ZS5uZXN0ZWQucHJvcGVydHkoXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5ub3ROZXN0ZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKG9iaiwgcHJvcCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90TmVzdGVkUHJvcGVydHksXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLm5lc3RlZC5wcm9wZXJ0eShwcm9wKTtcbn07XG5hc3NlcnQubmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubmVzdGVkUHJvcGVydHlWYWwsXG4gICAgdHJ1ZVxuICApLnRvLmhhdmUubmVzdGVkLnByb3BlcnR5KHByb3AsIHZhbCk7XG59O1xuYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5uZXN0ZWQucHJvcGVydHkocHJvcCwgdmFsKTtcbn07XG5hc3NlcnQuZGVlcE5lc3RlZFByb3BlcnR5VmFsID0gZnVuY3Rpb24ob2JqLCBwcm9wLCB2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIG9iaixcbiAgICBtc2csXG4gICAgYXNzZXJ0LmRlZXBOZXN0ZWRQcm9wZXJ0eVZhbCxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5ub3REZWVwTmVzdGVkUHJvcGVydHlWYWwgPSBmdW5jdGlvbihvYmosIHByb3AsIHZhbCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90RGVlcE5lc3RlZFByb3BlcnR5VmFsLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5kZWVwLm5lc3RlZC5wcm9wZXJ0eShwcm9wLCB2YWwpO1xufTtcbmFzc2VydC5sZW5ndGhPZiA9IGZ1bmN0aW9uKGV4cCwgbGVuLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihleHAsIG1zZywgYXNzZXJ0Lmxlbmd0aE9mLCB0cnVlKS50by5oYXZlLmxlbmd0aE9mKGxlbik7XG59O1xuYXNzZXJ0Lmhhc0FueUtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaGFzQW55S2V5cywgdHJ1ZSkudG8uaGF2ZS5hbnkua2V5cyhrZXlzKTtcbn07XG5hc3NlcnQuaGFzQWxsS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxLZXlzLCB0cnVlKS50by5oYXZlLmFsbC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5jb250YWluc0FsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuY29udGFpbnNBbGxLZXlzLCB0cnVlKS50by5jb250YWluLmFsbC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuZG9lc05vdEhhdmVBbnlLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0LmRvZXNOb3RIYXZlQW55S2V5cywgdHJ1ZSkudG8ubm90LmhhdmUuYW55LmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbEtleXMgPSBmdW5jdGlvbihvYmosIGtleXMsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuZG9lc05vdEhhdmVBbGxLZXlzLCB0cnVlKS50by5ub3QuaGF2ZS5hbGwua2V5cyhcbiAgICBrZXlzXG4gICk7XG59O1xuYXNzZXJ0Lmhhc0FueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihvYmosIG1zZywgYXNzZXJ0Lmhhc0FueURlZXBLZXlzLCB0cnVlKS50by5oYXZlLmFueS5kZWVwLmtleXMoXG4gICAga2V5c1xuICApO1xufTtcbmFzc2VydC5oYXNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5oYXNBbGxEZWVwS2V5cywgdHJ1ZSkudG8uaGF2ZS5hbGwuZGVlcC5rZXlzKFxuICAgIGtleXNcbiAgKTtcbn07XG5hc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyA9IGZ1bmN0aW9uKG9iaiwga2V5cywgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgb2JqLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuY29udGFpbnNBbGxEZWVwS2V5cyxcbiAgICB0cnVlXG4gICkudG8uY29udGFpbi5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFueURlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbnkuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzID0gZnVuY3Rpb24ob2JqLCBrZXlzLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBvYmosXG4gICAgbXNnLFxuICAgIGFzc2VydC5kb2VzTm90SGF2ZUFsbERlZXBLZXlzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5hbGwuZGVlcC5rZXlzKGtleXMpO1xufTtcbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihmbiwgZXJyb3JMaWtlLCBlcnJNc2dNYXRjaGVyLCBtc2cpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIGxldCBhc3NlcnRFcnIgPSBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC50aHJvd3MsIHRydWUpLnRvLnRocm93KFxuICAgIGVycm9yTGlrZSxcbiAgICBlcnJNc2dNYXRjaGVyXG4gICk7XG4gIHJldHVybiBmbGFnKGFzc2VydEVyciwgXCJvYmplY3RcIik7XG59O1xuYXNzZXJ0LmRvZXNOb3RUaHJvdyA9IGZ1bmN0aW9uKGZuLCBlcnJvckxpa2UsIGVyck1zZ01hdGNoZXIsIG1lc3NhZ2UpIHtcbiAgaWYgKFwic3RyaW5nXCIgPT09IHR5cGVvZiBlcnJvckxpa2UgfHwgZXJyb3JMaWtlIGluc3RhbmNlb2YgUmVnRXhwKSB7XG4gICAgZXJyTXNnTWF0Y2hlciA9IGVycm9yTGlrZTtcbiAgICBlcnJvckxpa2UgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1lc3NhZ2UsIGFzc2VydC5kb2VzTm90VGhyb3csIHRydWUpLnRvLm5vdC50aHJvdyhcbiAgICBlcnJvckxpa2UsXG4gICAgZXJyTXNnTWF0Y2hlclxuICApO1xufTtcbmFzc2VydC5vcGVyYXRvciA9IGZ1bmN0aW9uKHZhbCwgb3BlcmF0b3IsIHZhbDIsIG1zZykge1xuICBsZXQgb2s7XG4gIHN3aXRjaCAob3BlcmF0b3IpIHtcbiAgICBjYXNlIFwiPT1cIjpcbiAgICAgIG9rID0gdmFsID09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPT09XCI6XG4gICAgICBvayA9IHZhbCA9PT0gdmFsMjtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCI+XCI6XG4gICAgICBvayA9IHZhbCA+IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPj1cIjpcbiAgICAgIG9rID0gdmFsID49IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiPFwiOlxuICAgICAgb2sgPSB2YWwgPCB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIjw9XCI6XG4gICAgICBvayA9IHZhbCA8PSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9XCI6XG4gICAgICBvayA9IHZhbCAhPSB2YWwyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIiE9PVwiOlxuICAgICAgb2sgPSB2YWwgIT09IHZhbDI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgbXNnID0gbXNnID8gbXNnICsgXCI6IFwiIDogbXNnO1xuICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKFxuICAgICAgICBtc2cgKyAnSW52YWxpZCBvcGVyYXRvciBcIicgKyBvcGVyYXRvciArICdcIicsXG4gICAgICAgIHZvaWQgMCxcbiAgICAgICAgYXNzZXJ0Lm9wZXJhdG9yXG4gICAgICApO1xuICB9XG4gIGxldCB0ZXN0MiA9IG5ldyBBc3NlcnRpb24ob2ssIG1zZywgYXNzZXJ0Lm9wZXJhdG9yLCB0cnVlKTtcbiAgdGVzdDIuYXNzZXJ0KFxuICAgIHRydWUgPT09IGZsYWcodGVzdDIsIFwib2JqZWN0XCIpLFxuICAgIFwiZXhwZWN0ZWQgXCIgKyBpbnNwZWN0Mih2YWwpICsgXCIgdG8gYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMiksXG4gICAgXCJleHBlY3RlZCBcIiArIGluc3BlY3QyKHZhbCkgKyBcIiB0byBub3QgYmUgXCIgKyBvcGVyYXRvciArIFwiIFwiICsgaW5zcGVjdDIodmFsMilcbiAgKTtcbn07XG5hc3NlcnQuY2xvc2VUbyA9IGZ1bmN0aW9uKGFjdCwgZXhwLCBkZWx0YSwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oYWN0LCBtc2csIGFzc2VydC5jbG9zZVRvLCB0cnVlKS50by5iZS5jbG9zZVRvKGV4cCwgZGVsdGEpO1xufTtcbmFzc2VydC5hcHByb3hpbWF0ZWx5ID0gZnVuY3Rpb24oYWN0LCBleHAsIGRlbHRhLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihhY3QsIG1zZywgYXNzZXJ0LmFwcHJveGltYXRlbHksIHRydWUpLnRvLmJlLmFwcHJveGltYXRlbHkoXG4gICAgZXhwLFxuICAgIGRlbHRhXG4gICk7XG59O1xuYXNzZXJ0LnNhbWVNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc2V0MSwgbXNnLCBhc3NlcnQuc2FtZU1lbWJlcnMsIHRydWUpLnRvLmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lTWVtYmVycyA9IGZ1bmN0aW9uKHNldDEsIHNldDIsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKFxuICAgIHNldDEsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RTYW1lTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5zYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5oYXZlLnNhbWUuZGVlcC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQubm90U2FtZURlZXBNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5ub3QuaGF2ZS5zYW1lLmRlZXAubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQuc2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0LnNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLm9yZGVyZWQubWVtYmVycyhzZXQyKTtcbn07XG5hc3NlcnQubm90U2FtZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmhhdmUuc2FtZS5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LnNhbWVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzZXQxLCBzZXQyLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzZXQxLFxuICAgIG1zZyxcbiAgICBhc3NlcnQuc2FtZURlZXBPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaGF2ZS5zYW1lLmRlZXAub3JkZXJlZC5tZW1iZXJzKHNldDIpO1xufTtcbmFzc2VydC5ub3RTYW1lRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc2V0MSwgc2V0MiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc2V0MSxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdFNhbWVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5oYXZlLnNhbWUuZGVlcC5vcmRlcmVkLm1lbWJlcnMoc2V0Mik7XG59O1xuYXNzZXJ0LmluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oc3VwZXJzZXQsIG1zZywgYXNzZXJ0LmluY2x1ZGVNZW1iZXJzLCB0cnVlKS50by5pbmNsdWRlLm1lbWJlcnMoXG4gICAgc3Vic2V0XG4gICk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8ubm90LmluY2x1ZGUubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVEZWVwTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5kZWVwLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZURlZXBNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlRGVlcE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0LmluY2x1ZGVPcmRlcmVkTWVtYmVycyxcbiAgICB0cnVlXG4gICkudG8uaW5jbHVkZS5vcmRlcmVkLm1lbWJlcnMoc3Vic2V0KTtcbn07XG5hc3NlcnQubm90SW5jbHVkZU9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5ub3RJbmNsdWRlT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLm9yZGVyZWQubWVtYmVycyhzdWJzZXQpO1xufTtcbmFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzID0gZnVuY3Rpb24oc3VwZXJzZXQsIHN1YnNldCwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24oXG4gICAgc3VwZXJzZXQsXG4gICAgbXNnLFxuICAgIGFzc2VydC5pbmNsdWRlRGVlcE9yZGVyZWRNZW1iZXJzLFxuICAgIHRydWVcbiAgKS50by5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMgPSBmdW5jdGlvbihzdXBlcnNldCwgc3Vic2V0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihcbiAgICBzdXBlcnNldCxcbiAgICBtc2csXG4gICAgYXNzZXJ0Lm5vdEluY2x1ZGVEZWVwT3JkZXJlZE1lbWJlcnMsXG4gICAgdHJ1ZVxuICApLnRvLm5vdC5pbmNsdWRlLmRlZXAub3JkZXJlZC5tZW1iZXJzKHN1YnNldCk7XG59O1xuYXNzZXJ0Lm9uZU9mID0gZnVuY3Rpb24oaW5MaXN0LCBsaXN0LCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbihpbkxpc3QsIG1zZywgYXNzZXJ0Lm9uZU9mLCB0cnVlKS50by5iZS5vbmVPZihsaXN0KTtcbn07XG5hc3NlcnQuaXNJdGVyYWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIGlmIChvYmogPT0gdm9pZCAwIHx8ICFvYmpbU3ltYm9sLml0ZXJhdG9yXSkge1xuICAgIG1zZyA9IG1zZyA/IGAke21zZ30gZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWAgOiBgZXhwZWN0ZWQgJHtpbnNwZWN0MihvYmopfSB0byBiZSBhbiBpdGVyYWJsZWA7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1zZywgdm9pZCAwLCBhc3NlcnQuaXNJdGVyYWJsZSk7XG4gIH1cbn07XG5hc3NlcnQuY2hhbmdlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmNoYW5nZXMsIHRydWUpLnRvLmNoYW5nZShvYmosIHByb3ApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRvZXNOb3RDaGFuZ2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdENoYW5nZSwgdHJ1ZSkudG8ubm90LmNoYW5nZShcbiAgICBvYmosXG4gICAgcHJvcFxuICApO1xufTtcbmFzc2VydC5jaGFuZ2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuY2hhbmdlc0J1dE5vdEJ5LCB0cnVlKS50by5jaGFuZ2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmluY3JlYXNlcywgdHJ1ZSkudG8uaW5jcmVhc2Uob2JqLCBwcm9wKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kb2VzTm90SW5jcmVhc2UgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbXNnID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICByZXR1cm4gbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuZG9lc05vdEluY3JlYXNlLCB0cnVlKS50by5ub3QuaW5jcmVhc2UoXG4gICAgb2JqLFxuICAgIHByb3BcbiAgKTtcbn07XG5hc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnkgPSBmdW5jdGlvbihmbiwgb2JqLCBwcm9wLCBkZWx0YSwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSA0ICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIGxldCB0bXBNc2cgPSBkZWx0YTtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgbXNnID0gdG1wTXNnO1xuICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHtcbiAgICBkZWx0YSA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgbmV3IEFzc2VydGlvbihmbiwgbXNnLCBhc3NlcnQuaW5jcmVhc2VzQnV0Tm90QnksIHRydWUpLnRvLmluY3JlYXNlKG9iaiwgcHJvcCkuYnV0Lm5vdC5ieShkZWx0YSk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlcyA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMyAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBtc2cgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXMsIHRydWUpLnRvLmRlY3JlYXNlKG9iaiwgcHJvcCk7XG59O1xuYXNzZXJ0LmRlY3JlYXNlc0J5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRlY3JlYXNlc0J5LCB0cnVlKS50by5kZWNyZWFzZShvYmosIHByb3ApLmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuZG9lc05vdERlY3JlYXNlID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgbXNnKSB7XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIikge1xuICAgIG1zZyA9IHByb3A7XG4gICAgcHJvcCA9IG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBBc3NlcnRpb24oZm4sIG1zZywgYXNzZXJ0LmRvZXNOb3REZWNyZWFzZSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKFxuICAgIG9iaixcbiAgICBwcm9wXG4gICk7XG59O1xuYXNzZXJ0LmRvZXNOb3REZWNyZWFzZUJ5ID0gZnVuY3Rpb24oZm4sIG9iaiwgcHJvcCwgZGVsdGEsIG1zZykge1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gNCAmJiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBsZXQgdG1wTXNnID0gZGVsdGE7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIG1zZyA9IHRtcE1zZztcbiAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzKSB7XG4gICAgZGVsdGEgPSBwcm9wO1xuICAgIHByb3AgPSBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kb2VzTm90RGVjcmVhc2VCeSwgdHJ1ZSkudG8ubm90LmRlY3JlYXNlKG9iaiwgcHJvcCkuYnkoZGVsdGEpO1xufTtcbmFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSA9IGZ1bmN0aW9uKGZuLCBvYmosIHByb3AsIGRlbHRhLCBtc2cpIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDQgJiYgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgbGV0IHRtcE1zZyA9IGRlbHRhO1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBtc2cgPSB0bXBNc2c7XG4gIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMykge1xuICAgIGRlbHRhID0gcHJvcDtcbiAgICBwcm9wID0gbnVsbDtcbiAgfVxuICBuZXcgQXNzZXJ0aW9uKGZuLCBtc2csIGFzc2VydC5kZWNyZWFzZXNCdXROb3RCeSwgdHJ1ZSkudG8uZGVjcmVhc2Uob2JqLCBwcm9wKS5idXQubm90LmJ5KGRlbHRhKTtcbn07XG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKHZhbCkge1xuICBpZiAodmFsKSB7XG4gICAgdGhyb3cgdmFsO1xuICB9XG59O1xuYXNzZXJ0LmlzRXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc0V4dGVuc2libGUsIHRydWUpLnRvLmJlLmV4dGVuc2libGU7XG59O1xuYXNzZXJ0LmlzTm90RXh0ZW5zaWJsZSA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdEV4dGVuc2libGUsIHRydWUpLnRvLm5vdC5iZS5leHRlbnNpYmxlO1xufTtcbmFzc2VydC5pc1NlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc1NlYWxlZCwgdHJ1ZSkudG8uYmUuc2VhbGVkO1xufTtcbmFzc2VydC5pc05vdFNlYWxlZCA9IGZ1bmN0aW9uKG9iaiwgbXNnKSB7XG4gIG5ldyBBc3NlcnRpb24ob2JqLCBtc2csIGFzc2VydC5pc05vdFNlYWxlZCwgdHJ1ZSkudG8ubm90LmJlLnNlYWxlZDtcbn07XG5hc3NlcnQuaXNGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNGcm96ZW4sIHRydWUpLnRvLmJlLmZyb3plbjtcbn07XG5hc3NlcnQuaXNOb3RGcm96ZW4gPSBmdW5jdGlvbihvYmosIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKG9iaiwgbXNnLCBhc3NlcnQuaXNOb3RGcm96ZW4sIHRydWUpLnRvLm5vdC5iZS5mcm96ZW47XG59O1xuYXNzZXJ0LmlzRW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNFbXB0eSwgdHJ1ZSkudG8uYmUuZW1wdHk7XG59O1xuYXNzZXJ0LmlzTm90RW1wdHkgPSBmdW5jdGlvbih2YWwsIG1zZykge1xuICBuZXcgQXNzZXJ0aW9uKHZhbCwgbXNnLCBhc3NlcnQuaXNOb3RFbXB0eSwgdHJ1ZSkudG8ubm90LmJlLmVtcHR5O1xufTtcbmFzc2VydC5jb250YWluc1N1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8uY29udGFpblN1YnNldChleHApO1xufTtcbmFzc2VydC5kb2VzTm90Q29udGFpblN1YnNldCA9IGZ1bmN0aW9uKHZhbCwgZXhwLCBtc2cpIHtcbiAgbmV3IEFzc2VydGlvbih2YWwsIG1zZykudG8ubm90LmNvbnRhaW5TdWJzZXQoZXhwKTtcbn07XG52YXIgYWxpYXNlcyA9IFtcbiAgW1wiaXNPa1wiLCBcIm9rXCJdLFxuICBbXCJpc05vdE9rXCIsIFwibm90T2tcIl0sXG4gIFtcInRocm93c1wiLCBcInRocm93XCJdLFxuICBbXCJ0aHJvd3NcIiwgXCJUaHJvd1wiXSxcbiAgW1wiaXNFeHRlbnNpYmxlXCIsIFwiZXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNOb3RFeHRlbnNpYmxlXCIsIFwibm90RXh0ZW5zaWJsZVwiXSxcbiAgW1wiaXNTZWFsZWRcIiwgXCJzZWFsZWRcIl0sXG4gIFtcImlzTm90U2VhbGVkXCIsIFwibm90U2VhbGVkXCJdLFxuICBbXCJpc0Zyb3plblwiLCBcImZyb3plblwiXSxcbiAgW1wiaXNOb3RGcm96ZW5cIiwgXCJub3RGcm96ZW5cIl0sXG4gIFtcImlzRW1wdHlcIiwgXCJlbXB0eVwiXSxcbiAgW1wiaXNOb3RFbXB0eVwiLCBcIm5vdEVtcHR5XCJdLFxuICBbXCJpc0NhbGxhYmxlXCIsIFwiaXNGdW5jdGlvblwiXSxcbiAgW1wiaXNOb3RDYWxsYWJsZVwiLCBcImlzTm90RnVuY3Rpb25cIl0sXG4gIFtcImNvbnRhaW5zU3Vic2V0XCIsIFwiY29udGFpblN1YnNldFwiXVxuXTtcbmZvciAoY29uc3QgW25hbWUsIGFzXSBvZiBhbGlhc2VzKSB7XG4gIGFzc2VydFthc10gPSBhc3NlcnRbbmFtZV07XG59XG5cbi8vIGxpYi9jaGFpLmpzXG52YXIgdXNlZCA9IFtdO1xuZnVuY3Rpb24gdXNlKGZuKSB7XG4gIGNvbnN0IGV4cG9ydHMgPSB7XG4gICAgdXNlLFxuICAgIEFzc2VydGlvbkVycm9yLFxuICAgIHV0aWw6IHV0aWxzX2V4cG9ydHMsXG4gICAgY29uZmlnLFxuICAgIGV4cGVjdCxcbiAgICBhc3NlcnQsXG4gICAgQXNzZXJ0aW9uLFxuICAgIC4uLnNob3VsZF9leHBvcnRzXG4gIH07XG4gIGlmICghfnVzZWQuaW5kZXhPZihmbikpIHtcbiAgICBmbihleHBvcnRzLCB1dGlsc19leHBvcnRzKTtcbiAgICB1c2VkLnB1c2goZm4pO1xuICB9XG4gIHJldHVybiBleHBvcnRzO1xufVxuX19uYW1lKHVzZSwgXCJ1c2VcIik7XG5leHBvcnQge1xuICBBc3NlcnRpb24sXG4gIEFzc2VydGlvbkVycm9yLFxuICBTaG91bGQsXG4gIGFzc2VydCxcbiAgY29uZmlnLFxuICBleHBlY3QsXG4gIHNob3VsZCxcbiAgdXNlLFxuICB1dGlsc19leHBvcnRzIGFzIHV0aWxcbn07XG4iXSwieF9nb29nbGVfaWdub3JlTGlzdCI6WzBdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFBLElBQUksWUFBWSxPQUFPO0FBQ3ZCLElBQUksbUJBQW1CLEtBQUssS0FBSyxVQUFVLE9BQU8sTUFBTSxVQUFVLEtBQUssS0FBSztDQUFFLFlBQVk7Q0FBTSxjQUFjO0NBQU0sVUFBVTtDQUFNO0FBQU0sQ0FBQyxJQUFJLElBQUksT0FBTztBQUMxSixJQUFJLFVBQVUsUUFBUSxVQUFVLFVBQVUsUUFBUSxRQUFRO0NBQUU7Q0FBTyxjQUFjO0FBQUssQ0FBQztBQUN2RixJQUFJLFlBQVksUUFBUSxRQUFRO0NBQzlCLEtBQUssSUFBSSxRQUFRLEtBQ2YsVUFBVSxRQUFRLE1BQU07RUFBRSxLQUFLLElBQUk7RUFBTyxZQUFZO0NBQUssQ0FBQztBQUNoRTtBQUNBLElBQUksaUJBQWlCLEtBQUssS0FBSyxVQUFVLGdCQUFnQixLQUFLLE9BQU8sUUFBUSxXQUFXLE1BQU0sS0FBSyxLQUFLLEtBQUs7QUFHN0csSUFBSSxnQkFBZ0IsQ0FBQztBQUNyQixTQUFTLGVBQWU7Q0FDdEIsMEJBQTBCO0NBQzFCLHNCQUFzQjtDQUN0QixpQkFBaUI7Q0FDakIsbUJBQW1CO0NBQ25CLGtCQUFrQjtDQUNsQix3QkFBd0I7Q0FDeEIsV0FBVztDQUNYLGNBQWM7Q0FDZCxtQkFBbUI7Q0FDbkIsWUFBWTtDQUNaLGlCQUFpQjtDQUNqQixrQkFBa0I7Q0FDbEIsZUFBZTtDQUNmLG1CQUFtQjtDQUNuQixrQ0FBa0M7Q0FDbEMsdUNBQXVDO0NBQ3ZDLG1CQUFtQjtDQUNuQixtQkFBbUI7Q0FDbkIsZUFBZTtDQUNmLGFBQWE7Q0FDYixpQkFB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LEtBQUssS0FBSztDQUNuQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRO0FBQ2pFO0FBQ0EsT0FBTyxjQUFjLFNBQVMsS0FBSyxLQUFLO0NBQ3RDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUN4RTtBQUNBLE9BQU8sVUFBVSxTQUFTLEtBQUssS0FBSztDQUNsQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sU0FBUyxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxPQUFPO0FBQ2hFO0FBQ0EsT0FBTyxhQUFhLFNBQVMsS0FBSyxLQUFLO0NBQ3JDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxZQUFZLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEdBQUcsT0FBTztBQUN2RTtBQUNBLE9BQU8sV0FBVyxTQUFTLEtBQUssS0FBSztDQUNuQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRO0FBQ2pFO0FBQ0EsT0FBTyxjQUFjLFNBQVMsS0FBSyxLQUFLO0NBQ3RDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUN4RTtBQUNBLE9BQU8sV0FBVyxTQUFTLEtBQUssS0FBSztDQUNuQyxJQUFJLFVBQVUsS0FBSyxLQUFLLE9BQU8sVUFBVSxJQUFJLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxRQUFRO0FBQ2pFO0FBQ0EsT0FBTyxjQUFjLFNBQVMsS0FBSyxLQUFLO0NBQ3RDLElBQUksVUFBVSxLQUFLLEtBQUssT0FBTyxhQUFhLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsUUFBUTtBQUN4RTtBQUNBLE9BQU8sWUFBWSxTQUFTLEtBQUssS0FBSztDQUNwQyxJQUFJLFVB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