@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,11 +1,23 @@
1
+ import { GROK_USD_PER_TICK } from "../grok/grok-constants.js";
1
2
  //#region src/utils/providers/common/model-cost.ts
3
+ /**
4
+ * 모델별 토큰 가격 테이블 + cost 계산.
5
+ *
6
+ * claude code 와 동일 패턴: 클라이언트에서 가격 테이블로 직접 계산.
7
+ * 가격 단위: USD per 1M tokens.
8
+ *
9
+ * OpenAI 모델 목록은 OpenAI 모델 문서와 현재 지원 목록을 기준으로 관리한다.
10
+ *
11
+ * @see https://platform.openai.com/docs/pricing
12
+ * @see https://platform.claude.com/docs/en/about-claude/pricing
13
+ */
2
14
  const LONG_CONTEXT_272K = {
3
15
  threshold: 272e3,
4
16
  inputMultiplier: 2,
5
17
  cachedInputMultiplier: 2,
6
18
  outputMultiplier: 1.5
7
19
  };
8
- const OPENAI_COSTS = {
20
+ const OPENAI_COSTS = new Map(Object.entries({
9
21
  "gpt-6-astra": {
10
22
  maxEffort: "ultra",
11
23
  inputTokens: 10,
@@ -89,19 +101,20 @@ const OPENAI_COSTS = {
89
101
  outputTokens: 14,
90
102
  cachedInputTokens: .175
91
103
  }
92
- };
104
+ }));
93
105
  function anthropicCosts(inputTokens, outputTokens, overrides = {}) {
94
- return {
106
+ const costs = {
95
107
  inputTokens,
96
108
  outputTokens,
97
109
  cachedInputTokens: overrides.cachedInputTokens ?? inputTokens / 10,
98
110
  cacheCreationInputTokens: inputTokens * 2,
99
111
  cacheCreationInputTokens5m: inputTokens * 1.25,
100
- cacheCreationInputTokens1h: inputTokens * 2,
101
- ...overrides.longContext ? { longContext: overrides.longContext } : {}
112
+ cacheCreationInputTokens1h: inputTokens * 2
102
113
  };
114
+ if (overrides.longContext) costs.longContext = overrides.longContext;
115
+ return costs;
103
116
  }
104
- const ANTHROPIC_COSTS = {
117
+ const ANTHROPIC_COSTS = new Map(Object.entries({
105
118
  "claude-fable-5-1": anthropicCosts(10, 50, { cachedInputTokens: .25 }),
106
119
  "claude-fable-5": anthropicCosts(10, 50),
107
120
  sonnet: anthropicCosts(3, 15),
@@ -129,21 +142,63 @@ const ANTHROPIC_COSTS = {
129
142
  cachedInputMultiplier: 5,
130
143
  outputMultiplier: 5
131
144
  } })
132
- };
145
+ }));
133
146
  const DEFAULT_COSTS = {
134
147
  inputTokens: 3,
135
148
  outputTokens: 15,
136
149
  cachedInputTokens: .3
137
150
  };
151
+ const GROK_TICKS_PER_USD = Math.round(1 / GROK_USD_PER_TICK);
152
+ /** USD for a provider-reported `cost_in_usd_ticks` amount. */
153
+ function usdFromGrokTicks(ticks) {
154
+ return ticks / GROK_TICKS_PER_USD;
155
+ }
156
+ function grokTokenCosts(input, cached, output) {
157
+ const perMillion = (ticks) => ticks * 1e6 / GROK_TICKS_PER_USD;
158
+ return {
159
+ inputTokens: perMillion(input),
160
+ cachedInputTokens: perMillion(cached),
161
+ outputTokens: perMillion(output)
162
+ };
163
+ }
164
+ const GROK_COSTS = new Map(Object.entries({
165
+ "grok-4.7": grokTokenCosts(2e4, 5e3, 6e4),
166
+ "grok-4.6": grokTokenCosts(2e4, 5e3, 6e4),
167
+ "grok-4.5": grokTokenCosts(2e4, 5e3, 6e4)
168
+ }));
169
+ const GROK_IMAGE_PRICE_TICKS = new Map(Object.entries({ "grok-imagine-image-quality": 5e8 }));
170
+ /**
171
+ * Image cost: the reported ticks when present, otherwise the per-image catalog price times the
172
+ * image count. Undefined when neither is known, so callers store an unknown cost, not a guess.
173
+ */
174
+ function grokImageCost(model, imageCount, reportedTicks) {
175
+ if (reportedTicks !== void 0) return grokReportedCost(reportedTicks);
176
+ const perImage = GROK_IMAGE_PRICE_TICKS.get(model.split("/").pop() ?? model);
177
+ if (perImage === void 0) return void 0;
178
+ const ticks = perImage * imageCount;
179
+ return {
180
+ costUsd: usdFromGrokTicks(ticks),
181
+ costSource: "pricing_table",
182
+ ticks
183
+ };
184
+ }
185
+ /** Video/voice cost: only a provider-reported amount; there is no catalog estimate. */
186
+ function grokReportedCost(reportedTicks) {
187
+ return reportedTicks === void 0 ? void 0 : {
188
+ costUsd: usdFromGrokTicks(reportedTicks),
189
+ costSource: "provider",
190
+ ticks: reportedTicks
191
+ };
192
+ }
138
193
  /** Codex 백엔드가 이 모델에 허용하는 최대 effort. 카탈로그에 없는 모델은 xhigh 까지다. */
139
194
  function openaiModelMaxEffort(model) {
140
- return OPENAI_COSTS[model]?.maxEffort ?? "xhigh";
195
+ return OPENAI_COSTS.get(model)?.maxEffort ?? "xhigh";
141
196
  }
142
197
  function getModelCosts(model) {
143
198
  const normalizedModel = (model.split("/").pop() ?? model).replace(/\[1m\]$/i, "");
144
- return OPENAI_COSTS[normalizedModel] ?? ANTHROPIC_COSTS[normalizedModel] ?? DEFAULT_COSTS;
199
+ return OPENAI_COSTS.get(normalizedModel) ?? ANTHROPIC_COSTS.get(normalizedModel) ?? GROK_COSTS.get(normalizedModel) ?? DEFAULT_COSTS;
145
200
  }
146
- const OPENAI_FAST_MULTIPLIERS = {
201
+ const OPENAI_FAST_MULTIPLIERS = new Map(Object.entries({
147
202
  "gpt-6-astra": 2,
148
203
  "gpt-6.1-sol": 2,
149
204
  "gpt-6-sol": 2,
@@ -151,7 +206,7 @@ const OPENAI_FAST_MULTIPLIERS = {
151
206
  "gpt-5.6-sol": 2,
152
207
  "gpt-5.6-terra": 2,
153
208
  "gpt-5.6-luna": 2
154
- };
209
+ }));
155
210
  function calculateCostUsd(model, usage, serviceTier) {
156
211
  const costs = getModelCosts(model);
157
212
  const cachedInput = usage.cachedInputTokens ?? 0;
@@ -172,9 +227,9 @@ function calculateCostUsd(model, usage, serviceTier) {
172
227
  const outputRate = costs.outputTokens * (isLongContext ? lc.outputMultiplier : 1);
173
228
  const standardCost = nonCachedInput / 1e6 * inputRate + usage.outputTokens / 1e6 * outputRate + cachedInput / 1e6 * cachedRate + unclassifiedCacheCreationInput / 1e6 * cacheCreationFallbackRate + classifiedCacheCreationInput5m / 1e6 * cacheCreation5mRate + classifiedCacheCreationInput1h / 1e6 * cacheCreation1hRate;
174
229
  const normalizedModel = model.split("/").pop() ?? model;
175
- return standardCost * (serviceTier === "fast" ? OPENAI_FAST_MULTIPLIERS[normalizedModel] ?? 1 : 1);
230
+ return standardCost * (serviceTier === "fast" ? OPENAI_FAST_MULTIPLIERS.get(normalizedModel) ?? 1 : 1);
176
231
  }
177
232
  //#endregion
178
- export { calculateCostUsd, getModelCosts, openaiModelMaxEffort };
233
+ export { calculateCostUsd, getModelCosts, grokImageCost, grokReportedCost, openaiModelMaxEffort, usdFromGrokTicks };
179
234
 
180
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhneydgCBPcGVuQUkg66qo6424IOusuOyEnOyZgCDtmITsnqwg7KeA7JuQIOuqqeuhneydhCDquLDspIDsnLzroZwg6rSA66as7ZWc64ukLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4vZWZmb3J0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICAvKiogVFRMIGJyZWFrZG93biDsnbQg7JeG64qUIHVzYWdlIOyXkCDsoIHsmqntlaAgY2FjaGUgd3JpdGUgZmFsbGJhY2sg64uo6rCALiAqL1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbiAgLyoqXG4gICAqIGxvbmctY29udGV4dCDtlaDspp0uIOyghOyytCDsnoXroKUg7Yag7YGwKGlucHV0X3Rva2VucywgY2FjaGVfcmVhZCDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucXG4gICAqIOy0iOqzvOu2hOunjOydtCDslYTri4jrnbwg7JqU7LKtIOyghOyytChmdWxsIHNlc3Npb24p7JeQIOuwsOycqCDsoIHsmqkuXG4gICAqL1xuICBsb25nQ29udGV4dD86IHtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBpbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBvdXRwdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gIH07XG59XG5cbi8vIOKUgOKUgCBPcGVuQUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gU3RhbmRhcmQgcHJpY2luZyB2ZXJpZmllZCAyMDI2LTA5LTIzICjquLDsobQg66qo6424IOuLqOqwgCDrs4Drj5kg7JeG7J2MKTogaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvcHJpY2luZ1xuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG4vLyBPcGVuQUkg66qo6424IOy5tO2DiOuhnOq3uC4g64uo6rCA7JmAIO2VqOq7mCBDb2RleCDrsLHsl5Trk5zqsIAg66qo642467OE66GcIOuwm+uKlCDstZzrjIAgcmVhc29uaW5nIGVmZm9ydCDrpbwg7ZWcIOqzs+yXkCDrkZTri6QuXG4vLyBtYXhFZmZvcnQg7Lac7LKYOiB+Ly5jb2RleC9tb2RlbHNfY2FjaGUuanNvbiDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMgKDIwMjYtMDktMDcg7ZmV7J24KS5cbi8vIOuvuOq4sOyerCDrqqjrjbjsnYAgeGhpZ2gg6rmM7KeA66eMIOuwm+uKlOuLpC5cbnR5cGUgT3BlbkFJTW9kZWxTcGVjID0gTW9kZWxDb3N0cyAmIHsgbWF4RWZmb3J0PzogT3BlbkFJRWZmb3J0IH07XG5cbmNvbnN0IE9QRU5BSV9DT1NUUzogUmVjb3JkPHN0cmluZywgT3BlbkFJTW9kZWxTcGVjPiA9IHtcbiAgLy8gR1BULTYgQXN0cmE6IFN0YW5kYXJkIEFQSS1lcXVpdmFsZW50IHByaWNpbmcsIHZlcmlmaWVkIDIwMjYtMDktMDcuXG4gIC8vIENvZGV4IHN1YnNjcmlwdGlvbiBjYXRhbG9nIHN1cHBvcnRzIHVsdHJhOyB0aGUgcHVibGljIEFQSSBsaXN0cyBvbmx5IHRocm91Z2ggbWF4LlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNi1hc3RyYVxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL3ByaWNpbmdcbiAgXCJncHQtNi1hc3RyYVwiOiB7XG4gICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgaW5wdXRUb2tlbnM6IDEwLFxuICAgIG91dHB1dFRva2VuczogNTAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxMi41LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgLy8gR1BULTYuMSBTb2wgKDIwMjYtMDktMjkgRGV2RGF5IOy2nOyLnCk6IFN0YW5kYXJkIEFQSSBwcmljaW5nIHZlcmlmaWVkIDIwMjYtMDktMzAuIEdQVC02IFNvbCDqs7wg6rCZ6rOgIGNhY2hlZCBpbnB1dCDrp4wg7KCI67CYLlxuICAvLyBDb2RleCDsubTtg4jroZzqt7goMjAyNi0wOS0zMCnripQgdWx0cmEg6rmM7KeAIO2XiOyaqe2VmOqzoCDquLDrs7ggZWZmb3J0IOuKlCBsb3cg64ukKEdQVC02IFNvbCDsnYAgbWVkaXVtKS5cbiAgLy8gcWdyaWQg7J2YIOyalOyyrSDtmJXtg5wgKyBjb2RleF9jbGlfcnMvMC4xNDcuMCDtl6TrjZTroZwgMjAyNi0wOS0zMCDqtazrj4Ug6rK966GcIOudvOydtOu4jCDsg53shLEg7ISx6rO1LlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNi4xLXNvbFxuICBcImdwdC02LjEtc29sXCI6IHtcbiAgICBtYXhFZmZvcnQ6IFwidWx0cmFcIixcbiAgICBpbnB1dFRva2VuczogMixcbiAgICBvdXRwdXRUb2tlbnM6IDEwLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAyLjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICAvLyBHUFQtNiBTb2wsIEx1bmEgKDIwMjYtMDktMjIg7Lac7IucKTogU3RhbmRhcmQgQVBJIHByaWNpbmcgdmVyaWZpZWQgMjAyNi0wOS0yMy4gR1BULTUuNiBTb2wvTHVuYSDsnZgg7KCI67CYIOuLqOqwgC5cbiAgLy8gQ29kZXgg7Lm07YOI66Gc6re4KDIwMjYtMDktMjMp64qUIFNvbCDsl5AgdWx0cmEsIEx1bmEg7JeQIG1heCDquYzsp4Ag7ZeI7Jqp7ZWY6rOgIOq4sOuzuCBlZmZvcnQg64qUIOuRmCDri6QgbWVkaXVtIOydtOuLpC5cbiAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTYtc29sXG4gIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC02LWx1bmFcbiAgXCJncHQtNi1zb2xcIjoge1xuICAgIG1heEVmZm9ydDogXCJ1bHRyYVwiLFxuICAgIGlucHV0VG9rZW5zOiAyLFxuICAgIG91dHB1dFRva2VuczogMTAsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMixcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDIuNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTYtbHVuYVwiOiB7XG4gICAgbWF4RWZmb3J0OiBcIm1heFwiLFxuICAgIGlucHV0VG9rZW5zOiAwLjEsXG4gICAgb3V0cHV0VG9rZW5zOiAwLjUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMDEsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAwLjEyNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIEdQVC01LjYgU29sLCBUZXJyYSwgTHVuYS4gY2FjaGUgd3JpdGUg64uo6rCA64qUIOyZuOu2gCBsb2dnZXIvbWFudWFsIHVzYWdlIOyeheugpeydhCDsnITtlbRcbiAgLy8g7Jyg7KeA7ZWc64ukLiDtmITsnqwgT3BlbkFJIOydkeuLtSB1c2FnZSDsl5AgY2FjaGUgd3JpdGUg7Yag7YGwIO2VhOuTnOqwgCDsl4bsnLzrqbQg67mE7Jqp7J2AIDDsnLzroZwg6rOE7IKw65Cc64ukLlxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LXNvbFxuICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS42LXRlcnJhXG4gIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtbHVuYVxuICAvLyBTb2wgcHJvbW90aW9uYWwgcmF0ZXMgYXJlIGF2YWlsYWJsZSBhdCBsZWFzdCB0aHJvdWdoIDIwMjYtMTEtMjEuXG4gIC8vIE5vIGNvbmZpcm1lZCBlbmQgZGF0ZS9yZXBsYWNlbWVudCByYXRlOiByZWNoZWNrIG9mZmljaWFsIHByaWNpbmcgaW5zdGVhZCBvZiBhdXRvLXJldmVydGluZy5cbiAgXCJncHQtNS42LXNvbFwiOiB7XG4gICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgaW5wdXRUb2tlbnM6IDQsXG4gICAgb3V0cHV0VG9rZW5zOiAyMCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC40LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIFwiZ3B0LTUuNi10ZXJyYVwiOiB7XG4gICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgaW5wdXRUb2tlbnM6IDIsXG4gICAgb3V0cHV0VG9rZW5zOiAxMixcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC4yLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMi41LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgXCJncHQtNS42LWx1bmFcIjoge1xuICAgIG1heEVmZm9ydDogXCJtYXhcIixcbiAgICBpbnB1dFRva2VuczogMC4yLFxuICAgIG91dHB1dFRva2VuczogMS4yLFxuICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjAyLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMC4yNSxcbiAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gIH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS01LyAoMjAyNi0wNCDstpzsi5wpXG4gIFwiZ3B0LTUuNVwiOiB7XG4gICAgaW5wdXRUb2tlbnM6IDUsXG4gICAgb3V0cHV0VG9rZW5zOiAzMCxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogMC41LFxuICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgfSxcbiAgLy8g7JWE656YIGdwdC01LjQgLyBncHQtNS40LW1pbmkgLyBncHQtNS4zLWNvZGV4IC8gZ3B0LTUuMiDripQgcWdyaWQg6rCAIOyTsOuKlCBDaGF0R1BUIOq1rOuPhSBDb2RleCDqsr3roZzsl5DshJxcbiAgLy8g642UIOydtOyDgSDsoJzqs7XrkJjsp4Ag7JWK64qU64ukKDUuNCDqs4Tsl7TsnYAgMjAyNi0wOC0zMSByZXRpcmVkLCDrjIDssrQgZ3B0LTUuNi10ZXJyYSAvIGdwdC01LjYtbHVuYSkuXG4gIC8vIOqzvOqxsCByZXF1ZXN0IGxvZyDsnqzsgrDsoJUoY29zdF9zb3VyY2Ug7JeG64qUIGxlZ2FjeSDtlokp7JeQIO2VhOyalO2VmOuvgOuhnCDri6jqsIAg7ZaJ7J2AIOycoOyngO2VnOuLpC5cbiAgLy8gaHR0cHM6Ly9vcGVuYWkuY29tL2luZGV4L2ludHJvZHVjaW5nLWdwdC01LTQvICgyMDI2LTAzIOy2nOyLnClcbiAgXCJncHQtNS40XCI6IHtcbiAgICBpbnB1dFRva2VuczogMi41LFxuICAgIG91dHB1dFRva2VuczogMTUsXG4gICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMjUsXG4gICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICB9LFxuICBcImdwdC01LjQtbWluaVwiOiB7IGlucHV0VG9rZW5zOiAwLjc1LCBvdXRwdXRUb2tlbnM6IDQuNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMDc1IH0sXG4gIC8vIGdwdC01LjLsmYAg64+Z7J28IOuLqOqwgCAoY2FjaGVkID0gaW5wdXTsnZggMTAlKVxuICBcImdwdC01LjMtY29kZXhcIjogeyBpbnB1dFRva2VuczogMS43NSwgb3V0cHV0VG9rZW5zOiAxNCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMTc1IH0sXG4gIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS0yLyAoY2FjaGVkIGlucHV0IDkwJSDtlaDsnbgg66qF7IucKVxuICBcImdwdC01LjJcIjogeyBpbnB1dFRva2VuczogMS43NSwgb3V0cHV0VG9rZW5zOiAxNCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMTc1IH0sXG59O1xuXG4vLyDilIDilIAgQW50aHJvcGljIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBhbnRocm9waWNDb3N0cyhcbiAgaW5wdXRUb2tlbnM6IG51bWJlcixcbiAgb3V0cHV0VG9rZW5zOiBudW1iZXIsXG4gIG92ZXJyaWRlczogUGljazxQYXJ0aWFsPE1vZGVsQ29zdHM+LCBcImNhY2hlZElucHV0VG9rZW5zXCIgfCBcImxvbmdDb250ZXh0XCI+ID0ge30sXG4pOiBNb2RlbENvc3RzIHtcbiAgcmV0dXJuIHtcbiAgICBpbnB1dFRva2VucyxcbiAgICBvdXRwdXRUb2tlbnMsXG4gICAgLy8g7ZGc7KSAIGNhY2hlIHJlYWQg64qUIGJhc2UgaW5wdXQg7J2YIDAuMXguIEZhYmxlIDUuMSDsspjrn7wg6rO17IudIO2KueuhgCDri6jqsIDqsIAg7J6I7Jy866m0IG92ZXJyaWRlIO2VnOuLpC5cbiAgICBjYWNoZWRJbnB1dFRva2Vuczogb3ZlcnJpZGVzLmNhY2hlZElucHV0VG9rZW5zID8/IGlucHV0VG9rZW5zIC8gMTAsXG4gICAgLy8gQ2xhdWRlIENvZGUgc3Vic2NyaXB0aW9uIE9BdXRoIOuKlCAxaCBUVEwg7J2EIOyekOuPmSDshKDtg53tlZzri6QuIOq1rOuyhOyghOyymOufvCDsnZHri7Xsl5BcbiAgICAvLyBUVEwgYnJlYWtkb3duIOydtCDsl4bsnYQg65WM66eMIOydtCAxaCDri6jqsIDrpbwgZmFsbGJhY2sg7Jy866GcIOyCrOyaqe2VnOuLpC5cbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IGlucHV0VG9rZW5zICogMixcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bTogaW5wdXRUb2tlbnMgKiAxLjI1LFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoOiBpbnB1dFRva2VucyAqIDIsXG4gICAgLy8gSGFpa3UgNS41IOyymOufvCDtlITroaztlITtirgg6ri47J20IO2LsOyWtOqwgCDsnojripQg66qo642466eMIGxvbmctY29udGV4dCDrsLDsnKjsnYQg6rCA7KeE64ukLlxuICAgIC4uLihvdmVycmlkZXMubG9uZ0NvbnRleHQgPyB7IGxvbmdDb250ZXh0OiBvdmVycmlkZXMubG9uZ0NvbnRleHQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLy8g6rCA6rKpIOy2nOyymDogaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vYWJvdXQtY2xhdWRlL3ByaWNpbmcgKDIwMjYtMTAtMDgg7ZmV7J24LiAyMDI2LTEwLTA3IOyXkCBTb25uZXQgNS41XG4vLyBjYWNoZSByZWFkIOqwgCAkMC4yMOKGkiQwLjEwKDAuMDV4KeycvOuhnCDsnbjtlZjrkJDqs6AsIOq3uCDsmbgg6riw7KG0IOuqqOuNuCDri6jqsIDripQg67OA64+ZIOyXhuydjClcbmNvbnN0IEFOVEhST1BJQ19DT1NUUzogUmVjb3JkPHN0cmluZywgTW9kZWxDb3N0cz4gPSB7XG4gIC8vIEZhYmxlIDUuMSAoMjAyNi0wOS0wMSDstpzsi5wpOiBpbnB1dC9vdXRwdXQg7J2AIEZhYmxlIDUg7JmAIOqwmeqzoCBjYWNoZSByZWFkIOunjCAwLjAyNXgoJDAuMjUpIO2KueuhgC5cbiAgLy8gQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9tb2RlbHMvZmFibGUtNS0xL292ZXJ2aWV3XG4gIFwiY2xhdWRlLWZhYmxlLTUtMVwiOiBhbnRocm9waWNDb3N0cygxMCwgNTAsIHsgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMjUgfSksXG4gIFwiY2xhdWRlLWZhYmxlLTVcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwKSxcbiAgc29ubmV0OiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gIFwiY2xhdWRlLTMtNS1oYWlrdVwiOiBhbnRocm9waWNDb3N0cygwLjgsIDQpLFxuICBcImNsYXVkZS1oYWlrdS00LTVcIjogYW50aHJvcGljQ29zdHMoMSwgNSksXG4gIFwiY2xhdWRlLTMtNS1zb25uZXRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS0zLTctc29ubmV0XCI6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgXCJjbGF1ZGUtc29ubmV0LTRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS1zb25uZXQtNC01XCI6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgXCJjbGF1ZGUtc29ubmV0LTQtNlwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gIFwiY2xhdWRlLXNvbm5ldC00LTdcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICBcImNsYXVkZS1vcHVzLTRcIjogYW50aHJvcGljQ29zdHMoMTUsIDc1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LTFcIjogYW50aHJvcGljQ29zdHMoMTUsIDc1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICBcImNsYXVkZS1vcHVzLTQtNlwiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gIFwiY2xhdWRlLW9wdXMtNC03XCI6IGFudGhyb3BpY0Nvc3RzKDUsIDI1KSxcbiAgXCJjbGF1ZGUtb3B1cy00LThcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICBcImNsYXVkZS1vcHVzLTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICAvLyBPcHVzIDUuNSAoMjAyNi0wOS0yMiDstpzsi5wpOiAkNC8kMjAuIGNhY2hlIHJlYWQg64qUIDAuMDV4KCQwLjIwKSDtirnroYAsIGNhY2hlIHdyaXRlIOuKlCDtkZzspIAg67Cw7JyoKCQ1LyQ4KS5cbiAgLy8gQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9tb2RlbHMvb3B1cy01LTUvb3ZlcnZpZXdcbiAgXCJjbGF1ZGUtb3B1cy01LTVcIjogYW50aHJvcGljQ29zdHMoNCwgMjAsIHsgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMiB9KSxcbiAgLy8gU29ubmV0IDUg7J2YIGludHJvZHVjdG9yeSAkMi8kMTAg7J20IOygleyLnSDri6jqsIDroZwg7ZmV7KCV65CQ64ukLiAyMDI2LTA5LTAxIOyXkCDsmIjsoJXrkJDrjZggJDMvJDE1IOyduOyDgeydgFxuICAvLyDst6jshozrkJDsnLzrr4DroZwg64Kg7KecIOu2hOq4sCDsl4bsnbQg6rOg7KCVIOuLqOqwgOuhnCDqs4TsgrDtlZzri6QuXG4gIFwiY2xhdWRlLXNvbm5ldC01XCI6IGFudGhyb3BpY0Nvc3RzKDIsIDEwKSxcbiAgLy8gU29ubmV0IDUuNSAoMjAyNi0wOS0yOCDstpzsi5wpOiBTb25uZXQgNSDsmYAg6rCZ7J2AICQyLyQxMC4gY2FjaGUgcmVhZCDripQg7Lac7IucIOyLnCDtkZzspIAgMC4xeCgkMC4yMCnsmIDri6TqsIBcbiAgLy8gMjAyNi0xMC0wNyBIYWlrdSA1LjUg7Lac7Iuc7JmAIO2VqOq7mCBPcHVzIDUuNSDsmYAg6rCZ7J2AIDAuMDV4KCQwLjEwKeuhnCDsnbjtlZjrkJDri6QoQVBJIOumtOumrOyKpCDrhbjtirgpLiDruYTsmqnsnYAg7JqU7LKtIOyLnOygkFxuICAvLyDri6jqsIDroZwg6riw66Gd65CY66+A66GcIOuCoOynnCDrtoTquLAg7JeG7J20IO2YhO2WiSDri6jqsIDrp4wg65GU64ukLiBjYWNoZSB3cml0ZSDripQg7ZGc7KSAIOuwsOycqCgkMi41MC8kNCkuXG4gIC8vIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vcmVsZWFzZS1ub3Rlcy9vdmVydmlldyAoMjAyNi0xMC0wNylcbiAgXCJjbGF1ZGUtc29ubmV0LTUtNVwiOiBhbnRocm9waWNDb3N0cygyLCAxMCwgeyBjYWNoZWRJbnB1dFRva2VuczogMC4xIH0pLFxuICAvLyBIYWlrdSA1LjUgKDIwMjYtMTAtMDcg7Lac7IucKTog7ZSE66Gs7ZSE7Yq4IOq4uOydtCDti7DslrQg64uo6rCALiAxMDBLIOydtO2VmCAkMC4xMC8kMC41MCwgY2FjaGUgcmVhZCAwLjF4KCQwLjAxKSxcbiAgLy8gY2FjaGUgd3JpdGUgNW0gJDAuMTI1IC8gMWggJDAuMjAuIOyeheugpeydtCAxMDBLIOulvCDrhJjsnLzrqbQgaW5wdXQvY2FjaGUgcmVhZC9jYWNoZSB3cml0ZS9vdXRwdXQg66qo65GQIDV4XG4gIC8vICgkMC41MC8kMC4wNS8kMC42MjXCtyQxLyQyLjUwKeqwgCDsmpTssq0g7KCE7LK07JeQIOyggeyaqeuQnOuLpC4gMU0g7Luo7YWN7Iqk7Yq4IOuqqOuNuCDspJEg7Jyg7J287ZWY6rKMIOq4uOydtOuzhCDri6jqsIDrpbwg7JO064ukLlxuICAvLyBAc2VlIGh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS9kb2NzL2VuL21vZGVscy9oYWlrdS01LTUvb3ZlcnZpZXdcbiAgXCJjbGF1ZGUtaGFpa3UtNS01XCI6IGFudGhyb3BpY0Nvc3RzKDAuMSwgMC41LCB7XG4gICAgbG9uZ0NvbnRleHQ6IHtcbiAgICAgIHRocmVzaG9sZDogMTAwXzAwMCxcbiAgICAgIGlucHV0TXVsdGlwbGllcjogNSxcbiAgICAgIGNhY2hlZElucHV0TXVsdGlwbGllcjogNSxcbiAgICAgIG91dHB1dE11bHRpcGxpZXI6IDUsXG4gICAgfSxcbiAgfSksXG59O1xuXG4vLyBncHQtNS4zLWNvZGV4LXNwYXJrIOuKlCByZXNlYXJjaCBwcmV2aWV3IOuhnCDqs7Xsi50gdG9rZW4g64uo6rCA6rCAIOyVhOyngSBmaW5hbCDsnbQg7JWE64uI64ukLlxuLy8g7KeA7JuQIO2DgOyeheydgCDsnKDsp4DtlZjrkJgsIOqzteyLnSDri6jqsIDqsIAg6rO16rCc65CgIOuVjOq5jOyngCDslYTrnpggZ2VuZXJpYyBlc3RpbWF0ZSDroZwg6rOE7IKw7ZWc64ukLlxuLy8gQHNlZSBodHRwczovL2hlbHAub3BlbmFpLmNvbS9lbi9hcnRpY2xlcy8yMDAwMTEwNi1jb2RleC1yYXRlLWNhcmRcbmNvbnN0IERFRkFVTFRfQ09TVFM6IE1vZGVsQ29zdHMgPSB7IGlucHV0VG9rZW5zOiAzLCBvdXRwdXRUb2tlbnM6IDE1LCBjYWNoZWRJbnB1dFRva2VuczogMC4zIH07XG5cbi8qKiBDb2RleCDrsLHsl5Trk5zqsIAg7J20IOuqqOuNuOyXkCDtl4jsmqntlZjripQg7LWc64yAIGVmZm9ydC4g7Lm07YOI66Gc6re47JeQIOyXhuuKlCDrqqjrjbjsnYAgeGhpZ2gg6rmM7KeA64ukLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wZW5haU1vZGVsTWF4RWZmb3J0KG1vZGVsOiBzdHJpbmcpOiBPcGVuQUlFZmZvcnQge1xuICByZXR1cm4gT1BFTkFJX0NPU1RTW21vZGVsXT8ubWF4RWZmb3J0ID8/IFwieGhpZ2hcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQ29zdHMobW9kZWw6IHN0cmluZyk6IE1vZGVsQ29zdHMge1xuICBjb25zdCBub3JtYWxpemVkTW9kZWwgPSAobW9kZWwuc3BsaXQoXCIvXCIpLnBvcCgpID8/IG1vZGVsKS5yZXBsYWNlKC9cXFsxbVxcXSQvaSwgXCJcIik7XG4gIHJldHVybiBPUEVOQUlfQ09TVFNbbm9ybWFsaXplZE1vZGVsXSA/PyBBTlRIUk9QSUNfQ09TVFNbbm9ybWFsaXplZE1vZGVsXSA/PyBERUZBVUxUX0NPU1RTO1xufVxuXG4vLyBWZXJpZmllZCBGYXN0IEFQSSByYXRlcyBmb3IgdGhlIGN1cnJlbnRseSBzZXJ2ZWQgQ29kZXggbW9kZWxzICgyMDI2LTEwLTE2KS5cbi8vIEFwcGxpZXMgdG8gYWxsIHRva2VuIGNhdGVnb3JpZXMgYW5kIGxvbmcgY29udGV4dDsgbm90IHRoZSAyLjV4IHN1YnNjcmlwdGlvbiBxdW90YSBtdWx0aXBsaWVyLlxuLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvcHJpY2luZ1xuY29uc3QgT1BFTkFJX0ZBU1RfTVVMVElQTElFUlM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7XG4gIFwiZ3B0LTYtYXN0cmFcIjogMixcbiAgXCJncHQtNi4xLXNvbFwiOiAyLFxuICBcImdwdC02LXNvbFwiOiAyLFxuICBcImdwdC02LWx1bmFcIjogMixcbiAgXCJncHQtNS42LXNvbFwiOiAyLFxuICBcImdwdC01LjYtdGVycmFcIjogMixcbiAgXCJncHQtNS42LWx1bmFcIjogMixcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb3N0VXNkKFxuICBtb2RlbDogc3RyaW5nLFxuICB1c2FnZToge1xuICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoPzogbnVtYmVyO1xuICB9LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNvc3RzID0gZ2V0TW9kZWxDb3N0cyhtb2RlbCk7XG4gIGNvbnN0IGNhY2hlZElucHV0ID0gdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0NW0gPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyAwLCAwKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0MWggPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCA/PyAwLCAwKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0ID0gTWF0aC5tYXgoXG4gICAgdXNhZ2UuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IDAsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0NW0gKyBjYWNoZUNyZWF0aW9uSW5wdXQxaCxcbiAgKTtcbiAgY29uc3QgY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDVtID0gTWF0aC5taW4oY2FjaGVDcmVhdGlvbklucHV0NW0sIGNhY2hlQ3JlYXRpb25JbnB1dCk7XG4gIGNvbnN0IGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaCA9IE1hdGgubWluKFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSxcbiAgKTtcbiAgY29uc3QgdW5jbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0ID1cbiAgICBjYWNoZUNyZWF0aW9uSW5wdXQgLSBjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0NW0gLSBjbGFzc2lmaWVkQ2FjaGVDcmVhdGlvbklucHV0MWg7XG4gIGNvbnN0IG5vbkNhY2hlZElucHV0ID0gTWF0aC5tYXgodXNhZ2UuaW5wdXRUb2tlbnMgLSBjYWNoZWRJbnB1dCAtIGNhY2hlQ3JlYXRpb25JbnB1dCwgMCk7XG5cbiAgLy8gbG9uZy1jb250ZXh0IO2VoOymnTog7KCE7LK0IOyeheugpShpbnB1dF90b2tlbnMsIGNhY2hlIO2PrO2VqCnsnbQgdGhyZXNob2xkIOy0iOqzvCDsi5wg7JqU7LKtIOyghOyytOyXkCDrsLDsnKgg7KCB7JqpXG4gIGNvbnN0IGxjID0gY29zdHMubG9uZ0NvbnRleHQ7XG4gIGNvbnN0IGlzTG9uZ0NvbnRleHQgPSBsYyAhPT0gdW5kZWZpbmVkICYmIHVzYWdlLmlucHV0VG9rZW5zID4gbGMudGhyZXNob2xkO1xuICBjb25zdCBpbnB1dFJhdGUgPSBjb3N0cy5pbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlZFJhdGUgPSBjb3N0cy5jYWNoZWRJbnB1dFRva2VucyAqIChpc0xvbmdDb250ZXh0ID8gbGMuY2FjaGVkSW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IGNhY2hlQ3JlYXRpb25GYWxsYmFja1JhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZUNyZWF0aW9uNW1SYXRlID1cbiAgICAoY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zNW0gPz8gY29zdHMuY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zID8/IGNvc3RzLmlucHV0VG9rZW5zKSAqXG4gICAgKGlzTG9uZ0NvbnRleHQgPyBsYy5pbnB1dE11bHRpcGxpZXIgOiAxKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbjFoUmF0ZSA9XG4gICAgKGNvc3RzLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoID8/IGNvc3RzLmNhY2hlQ3JlYXRpb25JbnB1dFRva2VucyA/PyBjb3N0cy5pbnB1dFRva2VucykgKlxuICAgIChpc0xvbmdDb250ZXh0ID8gbGMuaW5wdXRNdWx0aXBsaWVyIDogMSk7XG4gIGNvbnN0IG91dHB1dFJhdGUgPSBjb3N0cy5vdXRwdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICBjb25zdCBzdGFuZGFyZENvc3QgPVxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlZFJhdGUgK1xuICAgICh1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvbkZhbGxiYWNrUmF0ZSArXG4gICAgKGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uNW1SYXRlICtcbiAgICAoY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDFoIC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb24xaFJhdGU7XG4gIGNvbnN0IG5vcm1hbGl6ZWRNb2RlbCA9IG1vZGVsLnNwbGl0KFwiL1wiKS5wb3AoKSA/PyBtb2RlbDtcbiAgcmV0dXJuIChcbiAgICBzdGFuZGFyZENvc3QgKiAoc2VydmljZVRpZXIgPT09IFwiZmFzdFwiID8gKE9QRU5BSV9GQVNUX01VTFRJUExJRVJTW25vcm1hbGl6ZWRNb2RlbF0gPz8gMSkgOiAxKVxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBMENBLE1BQU0sb0JBQTREO0NBQ2hFLFdBQVc7Q0FDWCxpQkFBaUI7Q0FDakIsdUJB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
235
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwtY29zdC5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdXRpbHMvcHJvdmlkZXJzL2NvbW1vbi9tb2RlbC1jb3N0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICog66qo642467OEIO2GoO2BsCDqsIDqsqkg7YWM7J2067iUICsgY29zdCDqs4TsgrAuXG4gKlxuICogY2xhdWRlIGNvZGUg7JmAIOuPmeydvCDtjKjthLQ6IO2BtOudvOydtOyWuO2KuOyXkOyEnCDqsIDqsqkg7YWM7J2067iU66GcIOyngeygkSDqs4TsgrAuXG4gKiDqsIDqsqkg64uo7JyEOiBVU0QgcGVyIDFNIHRva2Vucy5cbiAqXG4gKiBPcGVuQUkg66qo6424IOuqqeuhneydgCBPcGVuQUkg66qo6424IOusuOyEnOyZgCDtmITsnqwg7KeA7JuQIOuqqeuhneydhCDquLDspIDsnLzroZwg6rSA66as7ZWc64ukLlxuICpcbiAqIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5vcGVuYWkuY29tL2RvY3MvcHJpY2luZ1xuICogQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9hYm91dC1jbGF1ZGUvcHJpY2luZ1xuICovXG5cbmltcG9ydCB7IEdST0tfVVNEX1BFUl9USUNLIH0gZnJvbSBcIi4uL2dyb2svZ3Jvay1jb25zdGFudHNcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4vZWZmb3J0XCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxDb3N0cyB7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICBjYWNoZWRJbnB1dFRva2VuczogbnVtYmVyO1xuICAvKiogVFRMIGJyZWFrZG93biDsnbQg7JeG64qUIHVzYWdlIOyXkCDsoIHsmqntlaAgY2FjaGUgd3JpdGUgZmFsbGJhY2sg64uo6rCALiAqL1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaD86IG51bWJlcjtcbiAgLyoqXG4gICAqIGxvbmctY29udGV4dCDtlaDspp0uIOyghOyytCDsnoXroKUg7Yag7YGwKGlucHV0X3Rva2VucywgY2FjaGVfcmVhZCDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucXG4gICAqIOy0iOqzvOu2hOunjOydtCDslYTri4jrnbwg7JqU7LKtIOyghOyytChmdWxsIHNlc3Npb24p7JeQIOuwsOycqCDsoIHsmqkuXG4gICAqL1xuICBsb25nQ29udGV4dD86IHtcbiAgICB0aHJlc2hvbGQ6IG51bWJlcjtcbiAgICBpbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBjYWNoZWRJbnB1dE11bHRpcGxpZXI6IG51bWJlcjtcbiAgICBvdXRwdXRNdWx0aXBsaWVyOiBudW1iZXI7XG4gIH07XG59XG5cbi8vIOKUgOKUgCBPcGVuQUkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gU3RhbmRhcmQgcHJpY2luZyB2ZXJpZmllZCAyMDI2LTA5LTIzICjquLDsobQg66qo6424IOuLqOqwgCDrs4Drj5kg7JeG7J2MKTogaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvcHJpY2luZ1xuLy8g7Iug66qo6424IOy2nOyLnOuniOuLpCDri6jqsIDqsIAg67CU64CM66+A66GcKDUuMuKGkjUuNOKGkjUuNSkg66qo6424IOy2lOqwgCDsi5wg67CY65Oc7IucIOqzteyLnSDtjpjsnbTsp4Ag7J6s7ZmV7J247ZW07JW87ZWoXG5cbi8vIEdQVC01LjTsl5DshJwg7LKY7J2MIOuPhOyeheuQnCBsb25nLWNvbnRleHQg7ZWg7KadICg1LjIvNS4zLWNvZGV464qUIO2VtOuLuSDsl4bsnYwsIDUuNC1taW5pL25hbm/ripQg6rO17IudIO2RnOyXkOyEnCBsb25nLWNvbnRleHQg64uo6rCAIOyXhuydjClcbi8vIDI3Mksg7LSI6rO8IOyLnCBpbnB1dCAyeCAvIGNhY2hlZCAyeCAvIG91dHB1dCAxLjV4IOKAlCDstIjqs7zrtoTrp4zsnbQg7JWE64uMIOyEuOyFmCDsoITssrTsl5Ag7KCB7Jqp65CoXG4vLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNS41IChcInByb21wdHMgd2l0aCA+MjcySyBpbnB1dCB0b2tlbnNcIilcbmNvbnN0IExPTkdfQ09OVEVYVF8yNzJLOiBOb25OdWxsYWJsZTxNb2RlbENvc3RzW1wibG9uZ0NvbnRleHRcIl0+ID0ge1xuICB0aHJlc2hvbGQ6IDI3Ml8wMDAsXG4gIGlucHV0TXVsdGlwbGllcjogMixcbiAgY2FjaGVkSW5wdXRNdWx0aXBsaWVyOiAyLFxuICBvdXRwdXRNdWx0aXBsaWVyOiAxLjUsXG59O1xuXG4vLyBPcGVuQUkg66qo6424IOy5tO2DiOuhnOq3uC4g64uo6rCA7JmAIO2VqOq7mCBDb2RleCDrsLHsl5Trk5zqsIAg66qo642467OE66GcIOuwm+uKlCDstZzrjIAgcmVhc29uaW5nIGVmZm9ydCDrpbwg7ZWcIOqzs+yXkCDrkZTri6QuXG4vLyBtYXhFZmZvcnQg7Lac7LKYOiB+Ly5jb2RleC9tb2RlbHNfY2FjaGUuanNvbiDsnZggc3VwcG9ydGVkX3JlYXNvbmluZ19sZXZlbHMgKDIwMjYtMDktMDcg7ZmV7J24KS5cbi8vIOuvuOq4sOyerCDrqqjrjbjsnYAgeGhpZ2gg6rmM7KeA66eMIOuwm+uKlOuLpC5cbnR5cGUgT3BlbkFJTW9kZWxTcGVjID0gTW9kZWxDb3N0cyAmIHsgbWF4RWZmb3J0PzogT3BlbkFJRWZmb3J0IH07XG5cbmNvbnN0IE9QRU5BSV9DT1NUUyA9IG5ldyBNYXA8c3RyaW5nLCBPcGVuQUlNb2RlbFNwZWM+KFxuICBPYmplY3QuZW50cmllcyh7XG4gICAgLy8gR1BULTYgQXN0cmE6IFN0YW5kYXJkIEFQSS1lcXVpdmFsZW50IHByaWNpbmcsIHZlcmlmaWVkIDIwMjYtMDktMDcuXG4gICAgLy8gQ29kZXggc3Vic2NyaXB0aW9uIGNhdGFsb2cgc3VwcG9ydHMgdWx0cmE7IHRoZSBwdWJsaWMgQVBJIGxpc3RzIG9ubHkgdGhyb3VnaCBtYXguXG4gICAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTYtYXN0cmFcbiAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL3ByaWNpbmdcbiAgICBcImdwdC02LWFzdHJhXCI6IHtcbiAgICAgIG1heEVmZm9ydDogXCJ1bHRyYVwiLFxuICAgICAgaW5wdXRUb2tlbnM6IDEwLFxuICAgICAgb3V0cHV0VG9rZW5zOiA1MCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAxLFxuICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAxMi41LFxuICAgICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICAgIH0sXG4gICAgLy8gR1BULTYuMSBTb2wgKDIwMjYtMDktMjkgRGV2RGF5IOy2nOyLnCk6IFN0YW5kYXJkIEFQSSBwcmljaW5nIHZlcmlmaWVkIDIwMjYtMDktMzAuIEdQVC02IFNvbCDqs7wg6rCZ6rOgIGNhY2hlZCBpbnB1dCDrp4wg7KCI67CYLlxuICAgIC8vIENvZGV4IOy5tO2DiOuhnOq3uCgyMDI2LTA5LTMwKeuKlCB1bHRyYSDquYzsp4Ag7ZeI7Jqp7ZWY6rOgIOq4sOuzuCBlZmZvcnQg64qUIGxvdyDri6QoR1BULTYgU29sIOydgCBtZWRpdW0pLlxuICAgIC8vIHFncmlkIOydmCDsmpTssq0g7ZiV7YOcICsgY29kZXhfY2xpX3JzLzAuMTQ3LjAg7Zek642U66GcIDIwMjYtMDktMzAg6rWs64+FIOqyveuhnCDrnbzsnbTruIwg7IOd7ISxIOyEseqztS5cbiAgICAvLyBAc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5vcGVuYWkuY29tL2FwaS9kb2NzL21vZGVscy9ncHQtNi4xLXNvbFxuICAgIFwiZ3B0LTYuMS1zb2xcIjoge1xuICAgICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgICBpbnB1dFRva2VuczogMixcbiAgICAgIG91dHB1dFRva2VuczogMTAsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4xLFxuICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAyLjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICAvLyBHUFQtNiBTb2wsIEx1bmEgKDIwMjYtMDktMjIg7Lac7IucKTogU3RhbmRhcmQgQVBJIHByaWNpbmcgdmVyaWZpZWQgMjAyNi0wOS0yMy4gR1BULTUuNiBTb2wvTHVuYSDsnZgg7KCI67CYIOuLqOqwgC5cbiAgICAvLyBDb2RleCDsubTtg4jroZzqt7goMjAyNi0wOS0yMynripQgU29sIOyXkCB1bHRyYSwgTHVuYSDsl5AgbWF4IOq5jOyngCDtl4jsmqntlZjqs6Ag6riw67O4IGVmZm9ydCDripQg65GYIOuLpCBtZWRpdW0g7J2064ukLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC02LXNvbFxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC02LWx1bmFcbiAgICBcImdwdC02LXNvbFwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwidWx0cmFcIixcbiAgICAgIGlucHV0VG9rZW5zOiAyLFxuICAgICAgb3V0cHV0VG9rZW5zOiAxMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjIsXG4gICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDIuNSxcbiAgICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgICB9LFxuICAgIFwiZ3B0LTYtbHVuYVwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwibWF4XCIsXG4gICAgICBpbnB1dFRva2VuczogMC4xLFxuICAgICAgb3V0cHV0VG9rZW5zOiAwLjUsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4wMSxcbiAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMC4xMjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICAvLyBHUFQtNS42IFNvbCwgVGVycmEsIEx1bmEuIGNhY2hlIHdyaXRlIOuLqOqwgOuKlCDsmbjrtoAgbG9nZ2VyL21hbnVhbCB1c2FnZSDsnoXroKXsnYQg7JyE7ZW0XG4gICAgLy8g7Jyg7KeA7ZWc64ukLiDtmITsnqwgT3BlbkFJIOydkeuLtSB1c2FnZSDsl5AgY2FjaGUgd3JpdGUg7Yag7YGwIO2VhOuTnOqwgCDsl4bsnLzrqbQg67mE7Jqp7J2AIDDsnLzroZwg6rOE7IKw65Cc64ukLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtc29sXG4gICAgLy8gQHNlZSBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9tb2RlbHMvZ3B0LTUuNi10ZXJyYVxuICAgIC8vIEBzZWUgaHR0cHM6Ly9kZXZlbG9wZXJzLm9wZW5haS5jb20vYXBpL2RvY3MvbW9kZWxzL2dwdC01LjYtbHVuYVxuICAgIC8vIFNvbCBwcm9tb3Rpb25hbCByYXRlcyBhcmUgYXZhaWxhYmxlIGF0IGxlYXN0IHRocm91Z2ggMjAyNi0xMS0yMS5cbiAgICAvLyBObyBjb25maXJtZWQgZW5kIGRhdGUvcmVwbGFjZW1lbnQgcmF0ZTogcmVjaGVjayBvZmZpY2lhbCBwcmljaW5nIGluc3RlYWQgb2YgYXV0by1yZXZlcnRpbmcuXG4gICAgXCJncHQtNS42LXNvbFwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwidWx0cmFcIixcbiAgICAgIGlucHV0VG9rZW5zOiA0LFxuICAgICAgb3V0cHV0VG9rZW5zOiAyMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjQsXG4gICAgICBjYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM6IDUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICBcImdwdC01LjYtdGVycmFcIjoge1xuICAgICAgbWF4RWZmb3J0OiBcInVsdHJhXCIsXG4gICAgICBpbnB1dFRva2VuczogMixcbiAgICAgIG91dHB1dFRva2VuczogMTIsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4yLFxuICAgICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zOiAyLjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICBcImdwdC01LjYtbHVuYVwiOiB7XG4gICAgICBtYXhFZmZvcnQ6IFwibWF4XCIsXG4gICAgICBpbnB1dFRva2VuczogMC4yLFxuICAgICAgb3V0cHV0VG9rZW5zOiAxLjIsXG4gICAgICBjYWNoZWRJbnB1dFRva2VuczogMC4wMixcbiAgICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogMC4yNSxcbiAgICAgIGxvbmdDb250ZXh0OiBMT05HX0NPTlRFWFRfMjcySyxcbiAgICB9LFxuICAgIC8vIGh0dHBzOi8vb3BlbmFpLmNvbS9pbmRleC9pbnRyb2R1Y2luZy1ncHQtNS01LyAoMjAyNi0wNCDstpzsi5wpXG4gICAgXCJncHQtNS41XCI6IHtcbiAgICAgIGlucHV0VG9rZW5zOiA1LFxuICAgICAgb3V0cHV0VG9rZW5zOiAzMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjUsXG4gICAgICBsb25nQ29udGV4dDogTE9OR19DT05URVhUXzI3MkssXG4gICAgfSxcbiAgICAvLyDslYTrnpggZ3B0LTUuNCAvIGdwdC01LjQtbWluaSAvIGdwdC01LjMtY29kZXggLyBncHQtNS4yIOuKlCBxZ3JpZCDqsIAg7JOw64qUIENoYXRHUFQg6rWs64+FIENvZGV4IOqyveuhnOyXkOyEnFxuICAgIC8vIOuNlCDsnbTsg4Eg7KCc6rO165CY7KeAIOyViuuKlOuLpCg1LjQg6rOE7Je07J2AIDIwMjYtMDgtMzEgcmV0aXJlZCwg64yA7LK0IGdwdC01LjYtdGVycmEgLyBncHQtNS42LWx1bmEpLlxuICAgIC8vIOqzvOqxsCByZXF1ZXN0IGxvZyDsnqzsgrDsoJUoY29zdF9zb3VyY2Ug7JeG64qUIGxlZ2FjeSDtlokp7JeQIO2VhOyalO2VmOuvgOuhnCDri6jqsIAg7ZaJ7J2AIOycoOyngO2VnOuLpC5cbiAgICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtNC8gKDIwMjYtMDMg7Lac7IucKVxuICAgIFwiZ3B0LTUuNFwiOiB7XG4gICAgICBpbnB1dFRva2VuczogMi41LFxuICAgICAgb3V0cHV0VG9rZW5zOiAxNSxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLjI1LFxuICAgICAgbG9uZ0NvbnRleHQ6IExPTkdfQ09OVEVYVF8yNzJLLFxuICAgIH0sXG4gICAgXCJncHQtNS40LW1pbmlcIjogeyBpbnB1dFRva2VuczogMC43NSwgb3V0cHV0VG9rZW5zOiA0LjUsIGNhY2hlZElucHV0VG9rZW5zOiAwLjA3NSB9LFxuICAgIC8vIGdwdC01LjLsmYAg64+Z7J28IOuLqOqwgCAoY2FjaGVkID0gaW5wdXTsnZggMTAlKVxuICAgIFwiZ3B0LTUuMy1jb2RleFwiOiB7IGlucHV0VG9rZW5zOiAxLjc1LCBvdXRwdXRUb2tlbnM6IDE0LCBjYWNoZWRJbnB1dFRva2VuczogMC4xNzUgfSxcbiAgICAvLyBodHRwczovL29wZW5haS5jb20vaW5kZXgvaW50cm9kdWNpbmctZ3B0LTUtMi8gKGNhY2hlZCBpbnB1dCA5MCUg7ZWg7J24IOuqheyLnClcbiAgICBcImdwdC01LjJcIjogeyBpbnB1dFRva2VuczogMS43NSwgb3V0cHV0VG9rZW5zOiAxNCwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMTc1IH0sXG4gIH0pLFxuKTtcblxuLy8g4pSA4pSAIEFudGhyb3BpYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZnVuY3Rpb24gYW50aHJvcGljQ29zdHMoXG4gIGlucHV0VG9rZW5zOiBudW1iZXIsXG4gIG91dHB1dFRva2VuczogbnVtYmVyLFxuICBvdmVycmlkZXM6IFBpY2s8UGFydGlhbDxNb2RlbENvc3RzPiwgXCJjYWNoZWRJbnB1dFRva2Vuc1wiIHwgXCJsb25nQ29udGV4dFwiPiA9IHt9LFxuKTogTW9kZWxDb3N0cyB7XG4gIGNvbnN0IGNvc3RzOiBNb2RlbENvc3RzID0ge1xuICAgIGlucHV0VG9rZW5zLFxuICAgIG91dHB1dFRva2VucyxcbiAgICAvLyDtkZzspIAgY2FjaGUgcmVhZCDripQgYmFzZSBpbnB1dCDsnZggMC4xeC4gRmFibGUgNS4xIOyymOufvCDqs7Xsi50g7Yq566GAIOuLqOqwgOqwgCDsnojsnLzrqbQgb3ZlcnJpZGUg7ZWc64ukLlxuICAgIGNhY2hlZElucHV0VG9rZW5zOiBvdmVycmlkZXMuY2FjaGVkSW5wdXRUb2tlbnMgPz8gaW5wdXRUb2tlbnMgLyAxMCxcbiAgICAvLyBDbGF1ZGUgQ29kZSBzdWJzY3JpcHRpb24gT0F1dGgg64qUIDFoIFRUTCDsnYQg7J6Q64+ZIOyEoO2Dne2VnOuLpC4g6rWs67KE7KCE7LKY65+8IOydkeuLteyXkFxuICAgIC8vIFRUTCBicmVha2Rvd24g7J20IOyXhuydhCDrlYzrp4wg7J20IDFoIOuLqOqwgOulvCBmYWxsYmFjayDsnLzroZwg7IKs7Jqp7ZWc64ukLlxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczogaW5wdXRUb2tlbnMgKiAyLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtOiBpbnB1dFRva2VucyAqIDEuMjUsXG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zMWg6IGlucHV0VG9rZW5zICogMixcbiAgfTtcblxuICAvLyBIYWlrdSA1LjUg7LKY65+8IO2UhOuhrO2UhO2KuCDquLjsnbQg7Yuw7Ja06rCAIOyeiOuKlCDrqqjrjbjrp4wgbG9uZy1jb250ZXh0IOuwsOycqOydhCDqsIDsp4Tri6QuXG4gIGlmIChvdmVycmlkZXMubG9uZ0NvbnRleHQpIGNvc3RzLmxvbmdDb250ZXh0ID0gb3ZlcnJpZGVzLmxvbmdDb250ZXh0O1xuXG4gIHJldHVybiBjb3N0cztcbn1cblxuLy8g6rCA6rKpIOy2nOyymDogaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vYWJvdXQtY2xhdWRlL3ByaWNpbmcgKDIwMjYtMTAtMDgg7ZmV7J24LiAyMDI2LTEwLTA3IOyXkCBTb25uZXQgNS41XG4vLyBjYWNoZSByZWFkIOqwgCAkMC4yMOKGkiQwLjEwKDAuMDV4KeycvOuhnCDsnbjtlZjrkJDqs6AsIOq3uCDsmbgg6riw7KG0IOuqqOuNuCDri6jqsIDripQg67OA64+ZIOyXhuydjClcbmNvbnN0IEFOVEhST1BJQ19DT1NUUyA9IG5ldyBNYXA8c3RyaW5nLCBNb2RlbENvc3RzPihcbiAgT2JqZWN0LmVudHJpZXMoe1xuICAgIC8vIEZhYmxlIDUuMSAoMjAyNi0wOS0wMSDstpzsi5wpOiBpbnB1dC9vdXRwdXQg7J2AIEZhYmxlIDUg7JmAIOqwmeqzoCBjYWNoZSByZWFkIOunjCAwLjAyNXgoJDAuMjUpIO2KueuhgC5cbiAgICAvLyBAc2VlIGh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS9kb2NzL2VuL21vZGVscy9mYWJsZS01LTEvb3ZlcnZpZXdcbiAgICBcImNsYXVkZS1mYWJsZS01LTFcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwLCB7IGNhY2hlZElucHV0VG9rZW5zOiAwLjI1IH0pLFxuICAgIFwiY2xhdWRlLWZhYmxlLTVcIjogYW50aHJvcGljQ29zdHMoMTAsIDUwKSxcbiAgICBzb25uZXQ6IGFudGhyb3BpY0Nvc3RzKDMsIDE1KSxcbiAgICBcImNsYXVkZS0zLTUtaGFpa3VcIjogYW50aHJvcGljQ29zdHMoMC44LCA0KSxcbiAgICBcImNsYXVkZS1oYWlrdS00LTVcIjogYW50aHJvcGljQ29zdHMoMSwgNSksXG4gICAgXCJjbGF1ZGUtMy01LXNvbm5ldFwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gICAgXCJjbGF1ZGUtMy03LXNvbm5ldFwiOiBhbnRocm9waWNDb3N0cygzLCAxNSksXG4gICAgXCJjbGF1ZGUtc29ubmV0LTRcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLXNvbm5ldC00LTVcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLXNvbm5ldC00LTZcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLXNvbm5ldC00LTdcIjogYW50aHJvcGljQ29zdHMoMywgMTUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNFwiOiBhbnRocm9waWNDb3N0cygxNSwgNzUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNC0xXCI6IGFudGhyb3BpY0Nvc3RzKDE1LCA3NSksXG4gICAgXCJjbGF1ZGUtb3B1cy00LTVcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNC02XCI6IGFudGhyb3BpY0Nvc3RzKDUsIDI1KSxcbiAgICBcImNsYXVkZS1vcHVzLTQtN1wiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gICAgXCJjbGF1ZGUtb3B1cy00LThcIjogYW50aHJvcGljQ29zdHMoNSwgMjUpLFxuICAgIFwiY2xhdWRlLW9wdXMtNVwiOiBhbnRocm9waWNDb3N0cyg1LCAyNSksXG4gICAgLy8gT3B1cyA1LjUgKDIwMjYtMDktMjIg7Lac7IucKTogJDQvJDIwLiBjYWNoZSByZWFkIOuKlCAwLjA1eCgkMC4yMCkg7Yq566GALCBjYWNoZSB3cml0ZSDripQg7ZGc7KSAIOuwsOycqCgkNS8kOCkuXG4gICAgLy8gQHNlZSBodHRwczovL3BsYXRmb3JtLmNsYXVkZS5jb20vZG9jcy9lbi9tb2RlbHMvb3B1cy01LTUvb3ZlcnZpZXdcbiAgICBcImNsYXVkZS1vcHVzLTUtNVwiOiBhbnRocm9waWNDb3N0cyg0LCAyMCwgeyBjYWNoZWRJbnB1dFRva2VuczogMC4yIH0pLFxuICAgIC8vIFNvbm5ldCA1IOydmCBpbnRyb2R1Y3RvcnkgJDIvJDEwIOydtCDsoJXsi50g64uo6rCA66GcIO2ZleygleuQkOuLpC4gMjAyNi0wOS0wMSDsl5Ag7JiI7KCV65CQ642YICQzLyQxNSDsnbjsg4HsnYBcbiAgICAvLyDst6jshozrkJDsnLzrr4DroZwg64Kg7KecIOu2hOq4sCDsl4bsnbQg6rOg7KCVIOuLqOqwgOuhnCDqs4TsgrDtlZzri6QuXG4gICAgXCJjbGF1ZGUtc29ubmV0LTVcIjogYW50aHJvcGljQ29zdHMoMiwgMTApLFxuICAgIC8vIFNvbm5ldCA1LjUgKDIwMjYtMDktMjgg7Lac7IucKTogU29ubmV0IDUg7JmAIOqwmeydgCAkMi8kMTAuIGNhY2hlIHJlYWQg64qUIOy2nOyLnCDsi5wg7ZGc7KSAIDAuMXgoJDAuMjAp7JiA64uk6rCAXG4gICAgLy8gMjAyNi0xMC0wNyBIYWlrdSA1LjUg7Lac7Iuc7JmAIO2VqOq7mCBPcHVzIDUuNSDsmYAg6rCZ7J2AIDAuMDV4KCQwLjEwKeuhnCDsnbjtlZjrkJDri6QoQVBJIOumtOumrOyKpCDrhbjtirgpLiDruYTsmqnsnYAg7JqU7LKtIOyLnOygkFxuICAgIC8vIOuLqOqwgOuhnCDquLDroZ3rkJjrr4DroZwg64Kg7KecIOu2hOq4sCDsl4bsnbQg7ZiE7ZaJIOuLqOqwgOunjCDrkZTri6QuIGNhY2hlIHdyaXRlIOuKlCDtkZzspIAg67Cw7JyoKCQyLjUwLyQ0KS5cbiAgICAvLyBAc2VlIGh0dHBzOi8vcGxhdGZvcm0uY2xhdWRlLmNvbS9kb2NzL2VuL3JlbGVhc2Utbm90ZXMvb3ZlcnZpZXcgKDIwMjYtMTAtMDcpXG4gICAgXCJjbGF1ZGUtc29ubmV0LTUtNVwiOiBhbnRocm9waWNDb3N0cygyLCAxMCwgeyBjYWNoZWRJbnB1dFRva2VuczogMC4xIH0pLFxuICAgIC8vIEhhaWt1IDUuNSAoMjAyNi0xMC0wNyDstpzsi5wpOiDtlITroaztlITtirgg6ri47J20IO2LsOyWtCDri6jqsIAuIDEwMEsg7J207ZWYICQwLjEwLyQwLjUwLCBjYWNoZSByZWFkIDAuMXgoJDAuMDEpLFxuICAgIC8vIGNhY2hlIHdyaXRlIDVtICQwLjEyNSAvIDFoICQwLjIwLiDsnoXroKXsnbQgMTAwSyDrpbwg64SY7Jy866m0IGlucHV0L2NhY2hlIHJlYWQvY2FjaGUgd3JpdGUvb3V0cHV0IOuqqOuRkCA1eFxuICAgIC8vICgkMC41MC8kMC4wNS8kMC42MjXCtyQxLyQyLjUwKeqwgCDsmpTssq0g7KCE7LK07JeQIOyggeyaqeuQnOuLpC4gMU0g7Luo7YWN7Iqk7Yq4IOuqqOuNuCDspJEg7Jyg7J287ZWY6rKMIOq4uOydtOuzhCDri6jqsIDrpbwg7JO064ukLlxuICAgIC8vIEBzZWUgaHR0cHM6Ly9wbGF0Zm9ybS5jbGF1ZGUuY29tL2RvY3MvZW4vbW9kZWxzL2hhaWt1LTUtNS9vdmVydmlld1xuICAgIFwiY2xhdWRlLWhhaWt1LTUtNVwiOiBhbnRocm9waWNDb3N0cygwLjEsIDAuNSwge1xuICAgICAgbG9uZ0NvbnRleHQ6IHtcbiAgICAgICAgdGhyZXNob2xkOiAxMDBfMDAwLFxuICAgICAgICBpbnB1dE11bHRpcGxpZXI6IDUsXG4gICAgICAgIGNhY2hlZElucHV0TXVsdGlwbGllcjogNSxcbiAgICAgICAgb3V0cHV0TXVsdGlwbGllcjogNSxcbiAgICAgIH0sXG4gICAgfSksXG4gIH0pLFxuKTtcblxuLy8gZ3B0LTUuMy1jb2RleC1zcGFyayDripQgcmVzZWFyY2ggcHJldmlldyDroZwg6rO17IudIHRva2VuIOuLqOqwgOqwgCDslYTsp4EgZmluYWwg7J20IOyVhOuLiOuLpC5cbi8vIOyngOybkCDtg4DsnoXsnYAg7Jyg7KeA7ZWY65CYLCDqs7Xsi50g64uo6rCA6rCAIOqzteqwnOuQoCDrlYzquYzsp4Ag7JWE656YIGdlbmVyaWMgZXN0aW1hdGUg66GcIOqzhOyCsO2VnOuLpC5cbi8vIEBzZWUgaHR0cHM6Ly9oZWxwLm9wZW5haS5jb20vZW4vYXJ0aWNsZXMvMjAwMDExMDYtY29kZXgtcmF0ZS1jYXJkXG5jb25zdCBERUZBVUxUX0NPU1RTOiBNb2RlbENvc3RzID0geyBpbnB1dFRva2VuczogMywgb3V0cHV0VG9rZW5zOiAxNSwgY2FjaGVkSW5wdXRUb2tlbnM6IDAuMyB9O1xuXG4vLyAtLSBHcm9rICh4QUkpIC0tXG4vL1xuLy8gRmFsbGJhY2sgb25seS4gR3JvayBjaGF0LCBpbWFnZSBhbmQgdmlkZW8gcmVzcG9uc2VzIHJlcG9ydCBgdXNhZ2UuY29zdF9pbl91c2RfdGlja3NgLCB3aGljaCBpc1xuLy8gYXV0aG9yaXRhdGl2ZSAoY29zdFNvdXJjZSBcInByb3ZpZGVyXCIpOyB0aGVzZSByb3dzIHByaWNlIGEgcmVzcG9uc2UgdGhhdCBvbWl0dGVkIGl0LlxuLy8gU291cmNlOiBhcGkueC5haS92MS9sYW5ndWFnZS1tb2RlbHMgYW5kIC9pbWFnZS1nZW5lcmF0aW9uLW1vZGVscyByZWFkIHdpdGggdGhlIHN1YnNjcmlwdGlvbiBKV1Rcbi8vIGluIHRoZSAyMDI2LTEwLTE2IGxpdmUgcHJvYmUuIE9uZSB0aWNrIGlzIDFlLTEwIFVTRCAoZ3Jvay00LjcgbGlzdHMgMjAwMDAvNTAwMC82MDAwMCB0aWNrcyBwZXJcbi8vIGlucHV0L2NhY2hlZC9vdXRwdXQgdG9rZW4gYWdhaW5zdCB0aGUgcHVibGljICQyLyQwLjUwLyQ2IHBlciBtaWxsaW9uKS5cbmNvbnN0IEdST0tfVElDS1NfUEVSX1VTRCA9IE1hdGgucm91bmQoMSAvIEdST0tfVVNEX1BFUl9USUNLKTtcblxuLyoqIFVTRCBmb3IgYSBwcm92aWRlci1yZXBvcnRlZCBgY29zdF9pbl91c2RfdGlja3NgIGFtb3VudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2RGcm9tR3Jva1RpY2tzKHRpY2tzOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdGlja3MgLyBHUk9LX1RJQ0tTX1BFUl9VU0Q7XG59XG5cbmZ1bmN0aW9uIGdyb2tUb2tlbkNvc3RzKGlucHV0OiBudW1iZXIsIGNhY2hlZDogbnVtYmVyLCBvdXRwdXQ6IG51bWJlcik6IE1vZGVsQ29zdHMge1xuICAvLyB0aWNrcyBwZXIgdG9rZW4gLT4gVVNEIHBlciAxTSB0b2tlbnMuXG4gIGNvbnN0IHBlck1pbGxpb24gPSAodGlja3M6IG51bWJlcikgPT4gKHRpY2tzICogMV8wMDBfMDAwKSAvIEdST0tfVElDS1NfUEVSX1VTRDtcblxuICByZXR1cm4ge1xuICAgIGlucHV0VG9rZW5zOiBwZXJNaWxsaW9uKGlucHV0KSxcbiAgICBjYWNoZWRJbnB1dFRva2VuczogcGVyTWlsbGlvbihjYWNoZWQpLFxuICAgIG91dHB1dFRva2VuczogcGVyTWlsbGlvbihvdXRwdXQpLFxuICB9O1xufVxuXG5jb25zdCBHUk9LX0NPU1RTID0gbmV3IE1hcDxzdHJpbmcsIE1vZGVsQ29zdHM+KFxuICBPYmplY3QuZW50cmllcyh7XG4gICAgXCJncm9rLTQuN1wiOiBncm9rVG9rZW5Db3N0cygyMF8wMDAsIDVfMDAwLCA2MF8wMDApLFxuICAgIFwiZ3Jvay00LjZcIjogZ3Jva1Rva2VuQ29zdHMoMjBfMDAwLCA1XzAwMCwgNjBfMDAwKSxcbiAgICBcImdyb2stNC41XCI6IGdyb2tUb2tlbkNvc3RzKDIwXzAwMCwgNV8wMDAsIDYwXzAwMCksXG4gIH0pLFxuKTtcblxuLy8gVGlja3MgcGVyIGdlbmVyYXRlZCBpbWFnZSBhdCB0aGUgZGVmYXVsdCAxayByZXNvbHV0aW9uICh0aGUgcHJvYmUncyBxdWFsaXR5IDFrIGltYWdlIGNvc3QgZXhhY3RseVxuLy8gdGhpcyBhbW91bnQpLiBVbmxpc3RlZCBpbWFnZSBtb2RlbHMgaGF2ZSBubyBlc3RpbWF0ZS5cbmNvbnN0IEdST0tfSU1BR0VfUFJJQ0VfVElDS1MgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPihcbiAgT2JqZWN0LmVudHJpZXMoe1xuICAgIFwiZ3Jvay1pbWFnaW5lLWltYWdlLXF1YWxpdHlcIjogNTAwXzAwMF8wMDAsXG4gIH0pLFxuKTtcblxuZXhwb3J0IGludGVyZmFjZSBHcm9rTWVkaWFDb3N0IHtcbiAgY29zdFVzZDogbnVtYmVyO1xuICBjb3N0U291cmNlOiBcInByb3ZpZGVyXCIgfCBcInByaWNpbmdfdGFibGVcIjtcbiAgLyoqIFRpY2tzIHJlcG9ydGVkIGJ5IHhBSSwgb3IgdGhlIGNhdGFsb2ctcHJpY2UgZXN0aW1hdGUgaW4gdGlja3MuICovXG4gIHRpY2tzOiBudW1iZXI7XG59XG5cbi8qKlxuICogSW1hZ2UgY29zdDogdGhlIHJlcG9ydGVkIHRpY2tzIHdoZW4gcHJlc2VudCwgb3RoZXJ3aXNlIHRoZSBwZXItaW1hZ2UgY2F0YWxvZyBwcmljZSB0aW1lcyB0aGVcbiAqIGltYWdlIGNvdW50LiBVbmRlZmluZWQgd2hlbiBuZWl0aGVyIGlzIGtub3duLCBzbyBjYWxsZXJzIHN0b3JlIGFuIHVua25vd24gY29zdCwgbm90IGEgZ3Vlc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm9rSW1hZ2VDb3N0KFxuICBtb2RlbDogc3RyaW5nLFxuICBpbWFnZUNvdW50OiBudW1iZXIsXG4gIHJlcG9ydGVkVGlja3M/OiBudW1iZXIsXG4pOiBHcm9rTWVkaWFDb3N0IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlcG9ydGVkVGlja3MgIT09IHVuZGVmaW5lZCkgcmV0dXJuIGdyb2tSZXBvcnRlZENvc3QocmVwb3J0ZWRUaWNrcyk7XG4gIGNvbnN0IHBlckltYWdlID0gR1JPS19JTUFHRV9QUklDRV9USUNLUy5nZXQobW9kZWwuc3BsaXQoXCIvXCIpLnBvcCgpID8/IG1vZGVsKTtcblxuICBpZiAocGVySW1hZ2UgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdGlja3MgPSBwZXJJbWFnZSAqIGltYWdlQ291bnQ7XG5cbiAgcmV0dXJuIHsgY29zdFVzZDogdXNkRnJvbUdyb2tUaWNrcyh0aWNrcyksIGNvc3RTb3VyY2U6IFwicHJpY2luZ190YWJsZVwiLCB0aWNrcyB9O1xufVxuXG4vKiogVmlkZW8vdm9pY2UgY29zdDogb25seSBhIHByb3ZpZGVyLXJlcG9ydGVkIGFtb3VudDsgdGhlcmUgaXMgbm8gY2F0YWxvZyBlc3RpbWF0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncm9rUmVwb3J0ZWRDb3N0KHJlcG9ydGVkVGlja3M6IG51bWJlciB8IHVuZGVmaW5lZCk6IEdyb2tNZWRpYUNvc3QgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcmVwb3J0ZWRUaWNrcyA9PT0gdW5kZWZpbmVkXG4gICAgPyB1bmRlZmluZWRcbiAgICA6IHsgY29zdFVzZDogdXNkRnJvbUdyb2tUaWNrcyhyZXBvcnRlZFRpY2tzKSwgY29zdFNvdXJjZTogXCJwcm92aWRlclwiLCB0aWNrczogcmVwb3J0ZWRUaWNrcyB9O1xufVxuXG4vKiogQ29kZXgg67Cx7JeU65Oc6rCAIOydtCDrqqjrjbjsl5Ag7ZeI7Jqp7ZWY64qUIOy1nOuMgCBlZmZvcnQuIOy5tO2DiOuhnOq3uOyXkCDsl4bripQg66qo64247J2AIHhoaWdoIOq5jOyngOuLpC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvcGVuYWlNb2RlbE1heEVmZm9ydChtb2RlbDogc3RyaW5nKTogT3BlbkFJRWZmb3J0IHtcbiAgcmV0dXJuIE9QRU5BSV9DT1NUUy5nZXQobW9kZWwpPy5tYXhFZmZvcnQgPz8gXCJ4aGlnaFwiO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TW9kZWxDb3N0cyhtb2RlbDogc3RyaW5nKTogTW9kZWxDb3N0cyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRNb2RlbCA9IChtb2RlbC5zcGxpdChcIi9cIikucG9wKCkgPz8gbW9kZWwpLnJlcGxhY2UoL1xcWzFtXFxdJC9pLCBcIlwiKTtcblxuICByZXR1cm4gKFxuICAgIE9QRU5BSV9DT1NUUy5nZXQobm9ybWFsaXplZE1vZGVsKSA/P1xuICAgIEFOVEhST1BJQ19DT1NUUy5nZXQobm9ybWFsaXplZE1vZGVsKSA/P1xuICAgIEdST0tfQ09TVFMuZ2V0KG5vcm1hbGl6ZWRNb2RlbCkgPz9cbiAgICBERUZBVUxUX0NPU1RTXG4gICk7XG59XG5cbi8vIFZlcmlmaWVkIEZhc3QgQVBJIHJhdGVzIGZvciB0aGUgY3VycmVudGx5IHNlcnZlZCBDb2RleCBtb2RlbHMgKDIwMjYtMTAtMTYpLlxuLy8gQXBwbGllcyB0byBhbGwgdG9rZW4gY2F0ZWdvcmllcyBhbmQgbG9uZyBjb250ZXh0OyBub3QgdGhlIDIuNXggc3Vic2NyaXB0aW9uIHF1b3RhIG11bHRpcGxpZXIuXG4vLyBodHRwczovL2RldmVsb3BlcnMub3BlbmFpLmNvbS9hcGkvZG9jcy9wcmljaW5nXG5jb25zdCBPUEVOQUlfRkFTVF9NVUxUSVBMSUVSUyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KFxuICBPYmplY3QuZW50cmllcyh7XG4gICAgXCJncHQtNi1hc3RyYVwiOiAyLFxuICAgIFwiZ3B0LTYuMS1zb2xcIjogMixcbiAgICBcImdwdC02LXNvbFwiOiAyLFxuICAgIFwiZ3B0LTYtbHVuYVwiOiAyLFxuICAgIFwiZ3B0LTUuNi1zb2xcIjogMixcbiAgICBcImdwdC01LjYtdGVycmFcIjogMixcbiAgICBcImdwdC01LjYtbHVuYVwiOiAyLFxuICB9KSxcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVDb3N0VXNkKFxuICBtb2RlbDogc3RyaW5nLFxuICB1c2FnZToge1xuICAgIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gICAgb3V0cHV0VG9rZW5zOiBudW1iZXI7XG4gICAgY2FjaGVkSW5wdXRUb2tlbnM/OiBudW1iZXI7XG4gICAgY2FjaGVDcmVhdGlvbklucHV0VG9rZW5zPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczVtPzogbnVtYmVyO1xuICAgIGNhY2hlQ3JlYXRpb25JbnB1dFRva2VuczFoPzogbnVtYmVyO1xuICB9LFxuICBzZXJ2aWNlVGllcj86IHN0cmluZyxcbik6IG51bWJlciB7XG4gIGNvbnN0IGNvc3RzID0gZ2V0TW9kZWxDb3N0cyhtb2RlbCk7XG4gIGNvbnN0IGNhY2hlZElucHV0ID0gdXNhZ2UuY2FjaGVkSW5wdXRUb2tlbnMgPz8gMDtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0NW0gPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyAwLCAwKTtcbiAgY29uc3QgY2FjaGVDcmVhdGlvbklucHV0MWggPSBNYXRoLm1heCh1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCA/PyAwLCAwKTtcblxuICBjb25zdCBjYWNoZUNyZWF0aW9uSW5wdXQgPSBNYXRoLm1heChcbiAgICB1c2FnZS5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gMCxcbiAgICBjYWNoZUNyZWF0aW9uSW5wdXQ1bSArIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICApO1xuXG4gIGNvbnN0IGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSA9IE1hdGgubWluKGNhY2hlQ3JlYXRpb25JbnB1dDVtLCBjYWNoZUNyZWF0aW9uSW5wdXQpO1xuXG4gIGNvbnN0IGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaCA9IE1hdGgubWluKFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dDFoLFxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSxcbiAgKTtcblxuICBjb25zdCB1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgPVxuICAgIGNhY2hlQ3JlYXRpb25JbnB1dCAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAtIGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQxaDtcblxuICBjb25zdCBub25DYWNoZWRJbnB1dCA9IE1hdGgubWF4KHVzYWdlLmlucHV0VG9rZW5zIC0gY2FjaGVkSW5wdXQgLSBjYWNoZUNyZWF0aW9uSW5wdXQsIDApO1xuXG4gIC8vIGxvbmctY29udGV4dCDtlaDspp06IOyghOyytCDsnoXroKUoaW5wdXRfdG9rZW5zLCBjYWNoZSDtj6ztlagp7J20IHRocmVzaG9sZCDstIjqs7wg7IucIOyalOyyrSDsoITssrTsl5Ag67Cw7JyoIOyggeyaqVxuICBjb25zdCBsYyA9IGNvc3RzLmxvbmdDb250ZXh0O1xuICBjb25zdCBpc0xvbmdDb250ZXh0ID0gbGMgIT09IHVuZGVmaW5lZCAmJiB1c2FnZS5pbnB1dFRva2VucyA+IGxjLnRocmVzaG9sZDtcbiAgY29uc3QgaW5wdXRSYXRlID0gY29zdHMuaW5wdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuICBjb25zdCBjYWNoZWRSYXRlID0gY29zdHMuY2FjaGVkSW5wdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLmNhY2hlZElucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IGNhY2hlQ3JlYXRpb25GYWxsYmFja1JhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IGNhY2hlQ3JlYXRpb241bVJhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnM1bSA/PyBjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IGNhY2hlQ3JlYXRpb24xaFJhdGUgPVxuICAgIChjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMxaCA/PyBjb3N0cy5jYWNoZUNyZWF0aW9uSW5wdXRUb2tlbnMgPz8gY29zdHMuaW5wdXRUb2tlbnMpICpcbiAgICAoaXNMb25nQ29udGV4dCA/IGxjLmlucHV0TXVsdGlwbGllciA6IDEpO1xuXG4gIGNvbnN0IG91dHB1dFJhdGUgPSBjb3N0cy5vdXRwdXRUb2tlbnMgKiAoaXNMb25nQ29udGV4dCA/IGxjLm91dHB1dE11bHRpcGxpZXIgOiAxKTtcblxuICBjb25zdCBzdGFuZGFyZENvc3QgPVxuICAgIChub25DYWNoZWRJbnB1dCAvIDFfMDAwXzAwMCkgKiBpbnB1dFJhdGUgK1xuICAgICh1c2FnZS5vdXRwdXRUb2tlbnMgLyAxXzAwMF8wMDApICogb3V0cHV0UmF0ZSArXG4gICAgKGNhY2hlZElucHV0IC8gMV8wMDBfMDAwKSAqIGNhY2hlZFJhdGUgK1xuICAgICh1bmNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQgLyAxXzAwMF8wMDApICogY2FjaGVDcmVhdGlvbkZhbGxiYWNrUmF0ZSArXG4gICAgKGNsYXNzaWZpZWRDYWNoZUNyZWF0aW9uSW5wdXQ1bSAvIDFfMDAwXzAwMCkgKiBjYWNoZUNyZWF0aW9uNW1SYXRlICtcbiAgICAoY2xhc3NpZmllZENhY2hlQ3JlYXRpb25JbnB1dDFoIC8gMV8wMDBfMDAwKSAqIGNhY2hlQ3JlYXRpb24xaFJhdGU7XG5cbiAgY29uc3Qgbm9ybWFsaXplZE1vZGVsID0gbW9kZWwuc3BsaXQoXCIvXCIpLnBvcCgpID8/IG1vZGVsO1xuXG4gIHJldHVybiAoXG4gICAgc3RhbmRhcmRDb3N0ICpcbiAgICAoc2VydmljZVRpZXIgPT09IFwiZmFzdFwiID8gKE9QRU5BSV9GQVNUX01VTFRJUExJRVJTLmdldChub3JtYWxpemVkTW9kZWwpID8/IDEpIDogMSlcbiAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQTJDQSxNQUFNLG9CQUE0RDtDQUNoRSxXQUFXO0NBQ1gsaUJBQWlCO0NBQ2pCLHVCQUF1QjtDQUN2QixrQkFBa0I7QUFDcEI7QUFPQSxNQUFNLGVBQWUsSUFBSSxJQUN2QixPQUFPLFFBQVE7Q0FLYixlQUFlO0VBQ2IsV0FBVztFQUNYLGFBQWE7RUFDYixjQUFjO0VBQ2QsbUJBQW1CO0VBQ25CLDBCQUEwQjtFQUMxQixhQUFhO0NBQ2Y7Q0FLQSxlQUFlO0VBQ2Is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
@@ -1 +1,29 @@
1
- export {};
1
+ import { z } from "zod";
2
+ //#region src/utils/providers/common/provider-types.ts
3
+ const PROVIDER_IDS = [
4
+ "openai",
5
+ "anthropic",
6
+ "grok"
7
+ ];
8
+ function isProviderId(value) {
9
+ return PROVIDER_IDS.some((id) => id === value);
10
+ }
11
+ /** Decodes parsed JSON text (for example `JSON.parse` output) into `JsonValue`. */
12
+ const jsonValueSchema = z.json();
13
+ const anyJsonObject = z.looseObject({});
14
+ /** Narrows an already-decoded JSON value to its object member. */
15
+ function isJsonObject(value) {
16
+ return anyJsonObject.safeParse(value).success;
17
+ }
18
+ /** The string member of a decoded JSON value, or undefined for any other member. */
19
+ function jsonString(value) {
20
+ return z.string().safeParse(value).data;
21
+ }
22
+ /** The number member of a decoded JSON value, or undefined for any other member. */
23
+ function jsonNumber(value) {
24
+ return z.number().safeParse(value).data;
25
+ }
26
+ //#endregion
27
+ export { PROVIDER_IDS, isJsonObject, isProviderId, jsonNumber, jsonString, jsonValueSchema };
28
+
29
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlkZXItdHlwZXMuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vcHJvdmlkZXItdHlwZXMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuLy8gcWdyaWQgcHJvdmlkZXIgcm91dGUgcHJlZml4IChgPHByb3ZpZGVyPi88bW9kZWw+YCkuIOyDiCBwcm92aWRlciDripQg7Jes6riw7JeQ66eMIOy2lOqwgO2VnOuLpC5cbmV4cG9ydCBjb25zdCBQUk9WSURFUl9JRFMgPSBbXCJvcGVuYWlcIiwgXCJhbnRocm9waWNcIiwgXCJncm9rXCJdIGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBQcm92aWRlcklkID0gKHR5cGVvZiBQUk9WSURFUl9JRFMpW251bWJlcl07XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1Byb3ZpZGVySWQodmFsdWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIFByb3ZpZGVySWQge1xuICByZXR1cm4gUFJPVklERVJfSURTLnNvbWUoKGlkKSA9PiBpZCA9PT0gdmFsdWUpO1xufVxuXG5leHBvcnQgdHlwZSBKc29uVmFsdWUgPSBudW1iZXIgfCBzdHJpbmcgfCBib29sZWFuIHwgSnNvblZhbHVlW10gfCBKc29uT2JqZWN0IHwgbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBKc29uT2JqZWN0IHtcbiAgW2tleTogc3RyaW5nXTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogSnNvblZhbHVlIGFjY2VwdGVkIHJlYWQtb25seSwgZm9yIGNhbGxlcnMgdGhhdCBwYXNzIGBhcyBjb25zdGAgb3IgZnJvemVuIEpTT04uICovXG5leHBvcnQgdHlwZSBSZWFkb25seUpzb25WYWx1ZSA9XG4gIHwgbnVtYmVyXG4gIHwgc3RyaW5nXG4gIHwgYm9vbGVhblxuICB8IHJlYWRvbmx5IFJlYWRvbmx5SnNvblZhbHVlW11cbiAgfCBSZWFkb25seUpzb25PYmplY3RcbiAgfCBudWxsO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlYWRvbmx5SnNvbk9iamVjdCB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFJlYWRvbmx5SnNvblZhbHVlIHwgdW5kZWZpbmVkO1xufVxuXG4vKiogRGVjb2RlcyBwYXJzZWQgSlNPTiB0ZXh0IChmb3IgZXhhbXBsZSBgSlNPTi5wYXJzZWAgb3V0cHV0KSBpbnRvIGBKc29uVmFsdWVgLiAqL1xuZXhwb3J0IGNvbnN0IGpzb25WYWx1ZVNjaGVtYTogei5ab2RUeXBlPEpzb25WYWx1ZT4gPSB6Lmpzb24oKTtcblxuLy8gU2hhbGxvdzogYWNjZXB0cyBhbnkgbm9uLW51bGwsIG5vbi1hcnJheSBvYmplY3QsIGluY2x1ZGluZyBudWxsLXByb3RvdHlwZSBvYmplY3RzLlxuY29uc3QgYW55SnNvbk9iamVjdCA9IHoubG9vc2VPYmplY3Qoe30pO1xuXG4vKiogTmFycm93cyBhbiBhbHJlYWR5LWRlY29kZWQgSlNPTiB2YWx1ZSB0byBpdHMgb2JqZWN0IG1lbWJlci4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0pzb25PYmplY3QodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHZhbHVlIGlzIEpzb25PYmplY3Qge1xuICByZXR1cm4gYW55SnNvbk9iamVjdC5zYWZlUGFyc2UodmFsdWUpLnN1Y2Nlc3M7XG59XG5cbi8qKiBUaGUgc3RyaW5nIG1lbWJlciBvZiBhIGRlY29kZWQgSlNPTiB2YWx1ZSwgb3IgdW5kZWZpbmVkIGZvciBhbnkgb3RoZXIgbWVtYmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGpzb25TdHJpbmcodmFsdWU6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiB6LnN0cmluZygpLnNhZmVQYXJzZSh2YWx1ZSkuZGF0YTtcbn1cblxuLyoqIFRoZSBudW1iZXIgbWVtYmVyIG9mIGEgZGVjb2RlZCBKU09OIHZhbHVlLCBvciB1bmRlZmluZWQgZm9yIGFueSBvdGhlciBtZW1iZXIuICovXG5leHBvcnQgZnVuY3Rpb24ganNvbk51bWJlcih2YWx1ZTogSnNvblZhbHVlIHwgdW5kZWZpbmVkKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHoubnVtYmVyKCkuc2FmZVBhcnNlKHZhbHVlKS5kYXRhO1xufVxuXG5leHBvcnQgdHlwZSBVc2VySW5wdXQgPVxuICB8IHsgdHlwZTogXCJ0ZXh0XCI7IHRleHQ6IHN0cmluZzsgdGV4dF9lbGVtZW50czogVGV4dEVsZW1lbnRbXSB9XG4gIHwgeyB0eXBlOiBcImltYWdlXCI7IHVybDogc3RyaW5nIH1cbiAgfCB7IHR5cGU6IFwibG9jYWxJbWFnZVwiOyBwYXRoOiBzdHJpbmcgfVxuICB8IHsgdHlwZTogXCJza2lsbFwiOyBuYW1lOiBzdHJpbmc7IHBhdGg6IHN0cmluZyB9XG4gIHwgeyB0eXBlOiBcIm1lbnRpb25cIjsgbmFtZTogc3RyaW5nOyBwYXRoOiBzdHJpbmcgfTtcblxuZXhwb3J0IHR5cGUgVGV4dEVsZW1lbnQgPSB7XG4gIGJ5dGVSYW5nZTogeyBzdGFydDogbnVtYmVyOyBlbmQ6IG51bWJlciB9O1xuICBwbGFjZWhvbGRlcjogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFRva2VuVXNhZ2VCcmVha2Rvd24gPSB7XG4gIHRvdGFsVG9rZW5zOiBudW1iZXI7XG4gIGlucHV0VG9rZW5zOiBudW1iZXI7XG4gIGNhY2hlZElucHV0VG9rZW5zOiBudW1iZXI7XG4gIG91dHB1dFRva2VuczogbnVtYmVyO1xuICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIFF1b3RhUmF0ZUxpbWl0V2luZG93ID0ge1xuICB1c2VkUGVyY2VudDogbnVtYmVyO1xuICB3aW5kb3dEdXJhdGlvbk1pbnM6IG51bWJlciB8IG51bGw7XG4gIHJlc2V0c0F0OiBudW1iZXIgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgUXVvdGFSYXRlTGltaXRTbmFwc2hvdCA9IHtcbiAgbGltaXRJZDogc3RyaW5nIHwgbnVsbDtcbiAgbGltaXROYW1lOiBzdHJpbmcgfCBudWxsO1xuICBwcmltYXJ5OiBRdW90YVJhdGVMaW1pdFdpbmRvdyB8IG51bGw7XG4gIHNlY29uZGFyeTogUXVvdGFSYXRlTGltaXRXaW5kb3cgfCBudWxsO1xuICBjcmVkaXRzOiBKc29uVmFsdWU7XG4gIHBsYW5UeXBlOiBzdHJpbmcgfCBudWxsO1xuICByYXRlTGltaXRSZWFjaGVkVHlwZTogc3RyaW5nIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIFF1b3RhUmF0ZUxpbWl0cyA9IHtcbiAgcmF0ZUxpbWl0czogUXVvdGFSYXRlTGltaXRTbmFwc2hvdDtcbiAgcmF0ZUxpbWl0c0J5TGltaXRJZDogeyBba2V5OiBzdHJpbmddOiBRdW90YVJhdGVMaW1pdFNuYXBzaG90IHwgdW5kZWZpbmVkIH0gfCBudWxsO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7QUFHQSxNQUFhLGVBQWU7Q0FBQztDQUFVO0NBQWE7QUFBTTtBQUkxRCxTQUFnQixhQUFhLE9BQWdEO0NBQzNFLE9BQU8sYUFBYSxNQUFNLE9BQU8sT0FBTyxLQUFLO0FBQy9DOztBQXNCQSxNQUFhLGtCQUF3QyxFQUFFLEtBQUs7QUFHNUQsTUFBTSxnQkFBZ0IsRUFBRSxZQUFZLENBQUMsQ0FBQzs7QUFHdEMsU0FBZ0IsYUFBYSxPQUFtRDtDQUM5RSxPQUFPLGNBQWMsVUFBVSxLQUFLLENBQUMsQ0FBQztBQUN4Qzs7QUFHQSxTQUFnQixXQUFXLE9BQWtEO0NBQzNFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssQ0FBQyxDQUFDO0FBQ3JDOztBQUdBLFNBQWdCLFdBQVcsT0FBa0Q7Q0FDM0UsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFVBQVUsS0FBSyxDQUFDLENBQUM7QUFDckMifQ==
@@ -1,3 +1,5 @@
1
+ import { isJsonObject } from "./provider-types.js";
2
+ import { z } from "zod";
1
3
  import { Buffer } from "node:buffer";
2
4
  //#region src/utils/providers/common/schema-validation.ts
3
5
  /**
@@ -33,16 +35,18 @@ function parseAndValidateCallerSchemas(input) {
33
35
  } catch {
34
36
  throw new CallerSchemaValidationError("jsonSchema must contain valid JSON");
35
37
  }
36
- if (!isRecord(parsed) || parsed.type !== "object") throw new CallerSchemaValidationError("jsonSchema top-level type must be \"object\"");
37
- addComplexity(parsed, "jsonSchema", state);
38
+ if (!isJsonObject(parsed) || parsed.type !== "object") throw new CallerSchemaValidationError("jsonSchema top-level type must be \"object\"");
39
+ complexityWalk("jsonSchema", state, false).parse(parsed);
38
40
  state.schemas += 1;
39
41
  outputSchema = parsed;
40
42
  }
41
43
  for (const [index, tool] of (input.tools ?? []).entries()) {
42
44
  addToolMetadataUtf8Bytes(tool, index, state);
43
45
  const path = `tools[${index}].inputSchema`;
44
- addComplexity(tool.inputSchema, path, state, true);
45
- addUtf8Bytes(jsonStringContentUtf8ByteUpperBound(stringifyJsonOrThrow(tool.inputSchema, path)), path, state);
46
+ complexityWalk(path, state, true).parse(tool.inputSchema);
47
+ const serialized = callerJsonText.safeParse(tool.inputSchema);
48
+ if (!serialized.success) throw new CallerSchemaValidationError(`${path} must be JSON-serializable`);
49
+ addUtf8Bytes(jsonStringContentUtf8ByteUpperBound(serialized.data), path, state);
46
50
  state.schemas += 1;
47
51
  }
48
52
  return outputSchema;
@@ -57,6 +61,26 @@ function serializeAndValidateDispatchSchema(schema, provider) {
57
61
  function assertAnthropicSchemaArgvSize(jsonSchema) {
58
62
  if (Buffer.byteLength(jsonSchema, "utf8") > 65536) throw new CallerSchemaValidationError(`Anthropic dispatch schema exceeds argv UTF-8 byte limit of ${ANTHROPIC_SCHEMA_ARGV_MAX_UTF8_BYTES}`);
59
63
  }
64
+ /**
65
+ * Decodes an opaque caller value (QgridTool.inputSchema is z.unknown() at the API boundary) into
66
+ * its JSON text. Cycles, BigInt, and values with no JSON form (bare undefined, functions) fail.
67
+ */
68
+ const callerJsonText = z.unknown().transform((value, context) => {
69
+ let serialized;
70
+ try {
71
+ serialized = JSON.stringify(value);
72
+ } catch {
73
+ serialized = void 0;
74
+ }
75
+ if (serialized === void 0) {
76
+ context.addIssue({
77
+ code: "custom",
78
+ message: "value is not JSON-serializable"
79
+ });
80
+ return z.NEVER;
81
+ }
82
+ return serialized;
83
+ });
60
84
  function stringifyJsonOrThrow(value, subject) {
61
85
  let serialized;
62
86
  try {
@@ -115,45 +139,62 @@ function jsonStringContentUtf8ByteUpperBound(value) {
115
139
  }
116
140
  return bytes;
117
141
  }
118
- function addComplexity(root, path, state, precheckUtf8Bytes = false) {
119
- const rawUtf8Bytes = { value: 0 };
120
- if (precheckUtf8Bytes && typeof root === "string") addRawUtf8LowerBound(root, path, state, rawUtf8Bytes);
121
- addNode(path, state);
122
- if (root === null || typeof root !== "object") return;
123
- const stack = [{
124
- value: root,
125
- depth: 0
126
- }];
127
- while (stack.length > 0) {
128
- const current = stack.pop();
129
- if (Array.isArray(current.value)) {
130
- for (let index = 0; index < current.value.length; index += 1) {
142
+ /**
143
+ * Bounded, iterative walk over a caller schema, run before anything materializes its
144
+ * serialization. Values are read one at a time, in key order, so a limit stops the walk before
145
+ * later values (including getters) are touched. That rules out decoding each value with a schema
146
+ * first; nodes are classified by identity instead: Object(value) === value holds exactly for
147
+ * objects, arrays, and functions.
148
+ */
149
+ function complexityWalk(path, state, precheckUtf8Bytes) {
150
+ return z.unknown().transform((root) => {
151
+ const rawUtf8Bytes = { value: 0 };
152
+ if (precheckUtf8Bytes && isPrimitiveText(root)) addRawUtf8LowerBound(root, path, state, rawUtf8Bytes);
153
+ addNode(path, state);
154
+ if (root === null || root === void 0 || Object(root) !== root) return;
155
+ const stack = [{
156
+ value: Object(root),
157
+ depth: 0
158
+ }];
159
+ while (stack.length > 0) {
160
+ const current = stack.pop();
161
+ if (Array.isArray(current.value)) {
162
+ for (let index = 0; index < current.value.length; index += 1) {
163
+ const depth = current.depth + 1;
164
+ assertDepthWithinLimit(depth, path);
165
+ addNode(path, state);
166
+ const child = current.value[index];
167
+ if (precheckUtf8Bytes && isPrimitiveText(child)) addRawUtf8LowerBound(child, path, state, rawUtf8Bytes);
168
+ if (child !== null && child !== void 0 && Object(child) === child) stack.push({
169
+ value: Object(child),
170
+ depth
171
+ });
172
+ }
173
+ continue;
174
+ }
175
+ for (const key in current.value) {
176
+ if (!Object.hasOwn(current.value, key)) continue;
177
+ if (precheckUtf8Bytes) addRawUtf8LowerBound(key, path, state, rawUtf8Bytes);
131
178
  const depth = current.depth + 1;
132
179
  assertDepthWithinLimit(depth, path);
133
180
  addNode(path, state);
134
- const child = current.value[index];
135
- if (precheckUtf8Bytes && typeof child === "string") addRawUtf8LowerBound(child, path, state, rawUtf8Bytes);
136
- if (child !== null && typeof child === "object") stack.push({
137
- value: child,
181
+ const descriptor = Object.getOwnPropertyDescriptor(current.value, key);
182
+ const child = descriptor?.get ? descriptor.get.call(current.value) : descriptor?.value;
183
+ if (precheckUtf8Bytes && isPrimitiveText(child)) addRawUtf8LowerBound(child, path, state, rawUtf8Bytes);
184
+ if (child !== null && child !== void 0 && Object(child) === child) stack.push({
185
+ value: Object(child),
138
186
  depth
139
187
  });
140
188
  }
141
- continue;
142
189
  }
143
- for (const key in current.value) {
144
- if (!Object.hasOwn(current.value, key)) continue;
145
- if (precheckUtf8Bytes) addRawUtf8LowerBound(key, path, state, rawUtf8Bytes);
146
- const depth = current.depth + 1;
147
- assertDepthWithinLimit(depth, path);
148
- addNode(path, state);
149
- const child = current.value[key];
150
- if (precheckUtf8Bytes && typeof child === "string") addRawUtf8LowerBound(child, path, state, rawUtf8Bytes);
151
- if (child !== null && typeof child === "object") stack.push({
152
- value: child,
153
- depth
154
- });
155
- }
156
- }
190
+ });
191
+ }
192
+ /**
193
+ * String test for the bounded walk. A failed zod parse builds a ZodError (which serializes the
194
+ * input), so the walk uses identity: a primitive whose String() form is itself is a string.
195
+ */
196
+ function isPrimitiveText(value) {
197
+ return Object(value) !== value && String(value) === value;
157
198
  }
158
199
  function addRawUtf8LowerBound(value, path, state, rawUtf8Bytes) {
159
200
  rawUtf8Bytes.value += Buffer.byteLength(value, "utf8");
@@ -169,10 +210,7 @@ function addNode(path, state) {
169
210
  function throwLimitError(path, kind, limit, state) {
170
211
  throw new CallerSchemaValidationError(state.schemas === 0 ? `${path} exceeds ${kind} limit of ${limit}` : `caller schemas exceed aggregate ${kind} limit of ${limit}`);
171
212
  }
172
- function isRecord(value) {
173
- return value !== null && typeof value === "object" && !Array.isArray(value);
174
- }
175
213
  //#endregion
176
214
  export { ANTHROPIC_SCHEMA_ARGV_MAX_UTF8_BYTES, ARGV_SAFE_MAX_UTF8_BYTES, CALLER_SCHEMA_LIMITS, CallerSchemaValidationError, assertAnthropicSchemaArgvSize, parseAndValidateCallerSchemas, serializeAndValidateDispatchSchema };
177
215
 
178
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXZhbGlkYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcIm5vZGU6YnVmZmVyXCI7XG5cbmltcG9ydCB7IHR5cGUgSnNvblZhbHVlIH0gZnJvbSBcIi4vcHJvdmlkZXItdHlwZXNcIjtcblxuLyoqXG4gKiBDYWxsZXItcHJvdmlkZWQgc2NoZW1hcyBhcmUgc2VyaWFsaXplZCwgY29waWVkLCBhbmQgcmVjdXJzaXZlbHkgbm9ybWFsaXplZCBiZWZvcmUgZGlzcGF0Y2guXG4gKiBLZWVwIHRoZXNlIGxpbWl0cyBjb21mb3J0YWJseSBhYm92ZSBub3JtYWwgZ2VuZXJhdGVkIHNjaGVtYXMgd2hpbGUgYm91bmRpbmcgdGhhdCBwcmVwcm9jZXNzaW5nXG4gKiB3ZWxsIGJlbG93IHRoZSBBUEkncyAxMCBNaUIgcmVxdWVzdC1ib2R5IGNlaWxpbmcuXG4gKi9cbmV4cG9ydCBjb25zdCBDQUxMRVJfU0NIRU1BX0xJTUlUUyA9IHtcbiAgbWF4VXRmOEJ5dGVzOiA1MTIgKiAxMDI0LFxuICBtYXhOb2RlczogMjBfMDAwLFxuICBtYXhEZXB0aDogMTI4LFxufSBhcyBjb25zdDtcblxuLy8gTGludXggcGVybWl0cyBhdCBtb3N0IDEyOCBLaUIgKE1BWF9BUkdfU1RSTEVOKSBmb3Igb25lIGFyZ3YgdmFsdWUuIHFncmlkIHVzZXMgYSA1MCUgc2FmZXR5XG4vLyBtYXJnaW4gZm9yIGV2ZXJ5IGFyZ3YtZGVsaXZlcmVkIHBheWxvYWQg4oCUIENsYXVkZSBDb2RlIC0tanNvbi1zY2hlbWEgaGVyZSBhbmQgdGhlIHN5c3RlbS1wcm9tcHRcbi8vIHRyYW5zcG9ydCAoY2xhdWRlLXNlc3Npb24pIGJvdGggZGVyaXZlIGZyb20gdGhpcyBzaW5nbGUgY29uc3RhbnQuXG5leHBvcnQgY29uc3QgQVJHVl9TQUZFX01BWF9VVEY4X0JZVEVTID0gNjQgKiAxMDI0O1xuZXhwb3J0IGNvbnN0IEFOVEhST1BJQ19TQ0hFTUFfQVJHVl9NQVhfVVRGOF9CWVRFUyA9IEFSR1ZfU0FGRV9NQVhfVVRGOF9CWVRFUztcblxuZXhwb3J0IGNsYXNzIENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgc3VwZXIoYHFncmlkOiAke21lc3NhZ2V9YCk7XG4gICAgdGhpcy5uYW1lID0gXCJDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhbGxlclNjaGVtYXNJbnB1dCB7XG4gIGpzb25TY2hlbWE/OiBzdHJpbmc7XG4gIHRvb2xzPzogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IGRlc2NyaXB0aW9uPzogc3RyaW5nOyBpbnB1dFNjaGVtYTogdW5rbm93biB9Pjtcbn1cblxuaW50ZXJmYWNlIENvbXBsZXhpdHlTdGF0ZSB7XG4gIHV0ZjhCeXRlczogbnVtYmVyO1xuICBub2RlczogbnVtYmVyO1xuICBzY2hlbWFzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFuZFZhbGlkYXRlQ2FsbGVyU2NoZW1hcyhpbnB1dDogQ2FsbGVyU2NoZW1hc0lucHV0KTogSnNvblZhbHVlIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc3RhdGU6IENvbXBsZXhpdHlTdGF0ZSA9IHtcbiAgICB1dGY4Qnl0ZXM6IDAsXG4gICAgbm9kZXM6IDAsXG4gICAgc2NoZW1hczogMCxcbiAgfTtcbiAgbGV0IG91dHB1dFNjaGVtYTogSnNvblZhbHVlIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChpbnB1dC5qc29uU2NoZW1hICE9PSB1bmRlZmluZWQpIHtcbiAgICBhZGRVdGY4Qnl0ZXMoQnVmZmVyLmJ5dGVMZW5ndGgoaW5wdXQuanNvblNjaGVtYSwgXCJ1dGY4XCIpLCBcImpzb25TY2hlbWFcIiwgc3RhdGUpO1xuXG4gICAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgICB0cnkge1xuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXCJqc29uU2NoZW1hIG11c3QgY29udGFpbiB2YWxpZCBKU09OXCIpO1xuICAgIH1cblxuICAgIGlmICghaXNSZWNvcmQocGFyc2VkKSB8fCBwYXJzZWQudHlwZSAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvcignanNvblNjaGVtYSB0b3AtbGV2ZWwgdHlwZSBtdXN0IGJlIFwib2JqZWN0XCInKTtcbiAgICB9XG5cbiAgICBhZGRDb21wbGV4aXR5KHBhcnNlZCwgXCJqc29uU2NoZW1hXCIsIHN0YXRlKTtcbiAgICBzdGF0ZS5zY2hlbWFzICs9IDE7XG4gICAgb3V0cHV0U2NoZW1hID0gcGFyc2VkIGFzIEpzb25WYWx1ZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgW2luZGV4LCB0b29sXSBvZiAoaW5wdXQudG9vbHMgPz8gW10pLmVudHJpZXMoKSkge1xuICAgIGFkZFRvb2xNZXRhZGF0YVV0ZjhCeXRlcyh0b29sLCBpbmRleCwgc3RhdGUpO1xuXG4gICAgY29uc3QgcGF0aCA9IGB0b29sc1ske2luZGV4fV0uaW5wdXRTY2hlbWFgO1xuICAgIGFkZENvbXBsZXhpdHkodG9vbC5pbnB1dFNjaGVtYSwgcGF0aCwgc3RhdGUsIHRydWUpO1xuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHN0cmluZ2lmeUpzb25PclRocm93KHRvb2wuaW5wdXRTY2hlbWEsIHBhdGgpO1xuXG4gICAgLy8gYnVpbGRUb29sQ2FsbFNjaGVtYSBlbWJlZHMgdGhpcyBzZXJpYWxpemF0aW9uIGluc2lkZSBhbm90aGVyIEpTT04gc3RyaW5nLiBDaGFyZ2UgdGhlXG4gICAgLy8gZXNjYXBlZCBvdXRlci1zdHJpbmcgcmVwcmVzZW50YXRpb24gYmVmb3JlIHRoYXQgY29tcG9zZWQgZGVzY3JpcHRpb24gaXMgbWF0ZXJpYWxpemVkLlxuICAgIGFkZFV0ZjhCeXRlcyhqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChzZXJpYWxpemVkKSwgcGF0aCwgc3RhdGUpO1xuICAgIHN0YXRlLnNjaGVtYXMgKz0gMTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXRTY2hlbWE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVBbmRWYWxpZGF0ZURpc3BhdGNoU2NoZW1hKFxuICBzY2hlbWE6IHVua25vd24sXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnlKc29uT3JUaHJvdyhzY2hlbWEsIFwiZGlzcGF0Y2ggc2NoZW1hXCIpO1xuXG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCBcInV0ZjhcIik7XG4gIGlmIChieXRlTGVuZ3RoID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3cgbmV3IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBkaXNwYXRjaCBzY2hlbWEgZXhjZWVkcyBVVEYtOCBieXRlIGxpbWl0IG9mICR7Q0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAocHJvdmlkZXIgPT09IFwiYW50aHJvcGljXCIpIHtcbiAgICBhc3NlcnRBbnRocm9waWNTY2hlbWFBcmd2U2l6ZShzZXJpYWxpemVkKTtcbiAgfVxuXG4gIHJldHVybiBzZXJpYWxpemVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QW50aHJvcGljU2NoZW1hQXJndlNpemUoanNvblNjaGVtYTogc3RyaW5nKTogdm9pZCB7XG4gIGlmIChCdWZmZXIuYnl0ZUxlbmd0aChqc29uU2NoZW1hLCBcInV0ZjhcIikgPiBBTlRIUk9QSUNfU0NIRU1BX0FSR1ZfTUFYX1VURjhfQllURVMpIHtcbiAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYEFudGhyb3BpYyBkaXNwYXRjaCBzY2hlbWEgZXhjZWVkcyBhcmd2IFVURi04IGJ5dGUgbGltaXQgb2YgJHtBTlRIUk9QSUNfU0NIRU1BX0FSR1ZfTUFYX1VURjhfQllURVN9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ2lmeUpzb25PclRocm93KHZhbHVlOiB1bmtub3duLCBzdWJqZWN0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBsZXQgc2VyaWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoYCR7c3ViamVjdH0gbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZWApO1xuICB9XG4gIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKGAke3N1YmplY3R9IG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGVgKTtcbiAgfVxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cblxuZnVuY3Rpb24gYWRkVXRmOEJ5dGVzKGJ5dGVMZW5ndGg6IG51bWJlciwgcGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlKTogdm9pZCB7XG4gIHN0YXRlLnV0ZjhCeXRlcyArPSBieXRlTGVuZ3RoO1xuICBpZiAoc3RhdGUudXRmOEJ5dGVzID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCA9IFwiLSBcIjtcbmNvbnN0IFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IgPSBcIjogXCI7XG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVggPSBcIlxcbiAgaW5wdXRTY2hlbWE6IFwiO1xuY29uc3QgVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IgPSBcIlxcblwiO1xuXG5mdW5jdGlvbiBhZGRUb29sTWV0YWRhdGFVdGY4Qnl0ZXMoXG4gIHRvb2w6IE5vbk51bGxhYmxlPENhbGxlclNjaGVtYXNJbnB1dFtcInRvb2xzXCJdPltudW1iZXJdLFxuICBpbmRleDogbnVtYmVyLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRvb2xQYXRoID0gYHRvb2xzWyR7aW5kZXh9XWA7XG5cbiAgLy8gYnVpbGRUb29sQ2FsbFNjaGVtYSBwbGFjZXMgZXZlcnkgdG9vbCBuYW1lIGluIGJvdGggdGhlIGVudW0gYW5kIHRoZSBodW1hbi1yZWFkYWJsZSB0b29sXG4gIC8vIGRlc2NyaXB0aW9uLiBDb3VudCBib3RoIGVzY2FwZWQgb2NjdXJyZW5jZXMsIHBsdXMgdGhlIGVudW0ncyBKU09OIHN0cmluZyBkZWxpbWl0ZXJzLlxuICBjb25zdCBlbmNvZGVkTmFtZUJ5dGVzID0ganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQodG9vbC5uYW1lKTtcbiAgYWRkVXRmOEJ5dGVzKGVuY29kZWROYW1lQnl0ZXMgKiAyICsgMiwgYCR7dG9vbFBhdGh9Lm5hbWVgLCBzdGF0ZSk7XG5cbiAgaWYgKHRvb2wuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGFkZFV0ZjhCeXRlcyhcbiAgICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHRvb2wuZGVzY3JpcHRpb24pLFxuICAgICAgYCR7dG9vbFBhdGh9LmRlc2NyaXB0aW9uYCxcbiAgICAgIHN0YXRlLFxuICAgICk7XG4gIH1cblxuICAvLyBQZXItdG9vbCBmcmFtaW5nIGFsc28gZ3Jvd3Mgd2l0aCB0aGUgbnVtYmVyIG9mIHRvb2xzIGV2ZW4gd2hlbiBhbGwgY2FsbGVyIHN0cmluZ3MgYXJlIGVtcHR5LlxuICAvLyBJbmNsdWRlIGJvdGggdGhlIHRvb2xEZXNjcmlwdGlvbnMgam9pbiBzZXBhcmF0b3IgYW5kIHRoZSBlbnVtIGNvbW1hIGFmdGVyIHRoZSBmaXJzdCBlbnRyeS5cbiAgY29uc3QgZnJhbWluZ0J5dGVzID1cbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCkgK1xuICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IpICtcbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVgpICtcbiAgICAoaW5kZXggPT09IDAgPyAwIDoganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQoVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IpICsgMSk7XG4gIGFkZFV0ZjhCeXRlcyhmcmFtaW5nQnl0ZXMsIHRvb2xQYXRoLCBzdGF0ZSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNvbnNlcnZhdGl2ZSBVVEYtOCBieXRlIGNvdW50IGZvciBhIHN0cmluZyB3aGVuIGl0IGJlY29tZXMgSlNPTiBzdHJpbmcgY29udGVudCxcbiAqIHdpdGhvdXQgYWxsb2NhdGluZyB0aGUgZXNjYXBlZCByZXByZXNlbnRhdGlvbi4gSlNPTi5zdHJpbmdpZnkgdXNlcyBzaG9ydCB0d28tYnl0ZSBlc2NhcGVzIGZvclxuICogZml2ZSBjb250cm9sIGNoYXJhY3RlcnM7IGNvdW50aW5nIGV2ZXJ5IGNvbnRyb2wgY2hhcmFjdGVyIGFzIGEgc2l4LWJ5dGUgYFxcdTAwWFhgIGVzY2FwZSBrZWVwc1xuICogdGhpcyBhbiB1cHBlciBib3VuZCB3aGlsZSBhdm9pZGluZyBhIHNlY29uZCBsYXJnZSB0ZW1wb3Jhcnkgc3RyaW5nLlxuICovXG5mdW5jdGlvbiBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZCh2YWx1ZTogc3RyaW5nKTogbnVtYmVyIHtcbiAgbGV0IGJ5dGVzID0gMDtcblxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgY29kZVVuaXQgPSB2YWx1ZS5jaGFyQ29kZUF0KGluZGV4KTtcblxuICAgIGlmIChjb2RlVW5pdCA9PT0gMHgyMiB8fCBjb2RlVW5pdCA9PT0gMHg1Yykge1xuICAgICAgYnl0ZXMgKz0gMjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY29kZVVuaXQgPD0gMHgxZikge1xuICAgICAgYnl0ZXMgKz0gNjtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY29kZVVuaXQgPj0gMHhkODAwICYmIGNvZGVVbml0IDw9IDB4ZGJmZikge1xuICAgICAgY29uc3QgbmV4dENvZGVVbml0ID0gdmFsdWUuY2hhckNvZGVBdChpbmRleCArIDEpO1xuICAgICAgaWYgKG5leHRDb2RlVW5pdCA+PSAweGRjMDAgJiYgbmV4dENvZGVVbml0IDw9IDB4ZGZmZikge1xuICAgICAgICBieXRlcyArPSA0O1xuICAgICAgICBpbmRleCArPSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2VsbC1mb3JtZWQgSlNPTi5zdHJpbmdpZnkgZXNjYXBlcyBsb25lIHN1cnJvZ2F0ZXMgYXMgYFxcdVhYWFhgLlxuICAgICAgICBieXRlcyArPSA2O1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChjb2RlVW5pdCA+PSAweGRjMDAgJiYgY29kZVVuaXQgPD0gMHhkZmZmKSB7XG4gICAgICBieXRlcyArPSA2O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYnl0ZXMgKz0gY29kZVVuaXQgPD0gMHg3ZiA/IDEgOiBjb2RlVW5pdCA8PSAweDdmZiA/IDIgOiAzO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5mdW5jdGlvbiBhZGRDb21wbGV4aXR5KFxuICByb290OiB1bmtub3duLFxuICBwYXRoOiBzdHJpbmcsXG4gIHN0YXRlOiBDb21wbGV4aXR5U3RhdGUsXG4gIHByZWNoZWNrVXRmOEJ5dGVzID0gZmFsc2UsXG4pOiB2b2lkIHtcbiAgY29uc3QgcmF3VXRmOEJ5dGVzID0geyB2YWx1ZTogMCB9O1xuICBpZiAocHJlY2hlY2tVdGY4Qnl0ZXMgJiYgdHlwZW9mIHJvb3QgPT09IFwic3RyaW5nXCIpIHtcbiAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChyb290LCBwYXRoLCBzdGF0ZSwgcmF3VXRmOEJ5dGVzKTtcbiAgfVxuICBhZGROb2RlKHBhdGgsIHN0YXRlKTtcbiAgaWYgKHJvb3QgPT09IG51bGwgfHwgdHlwZW9mIHJvb3QgIT09IFwib2JqZWN0XCIpIHJldHVybjtcblxuICBjb25zdCBzdGFjazogQXJyYXk8eyB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duW107IGRlcHRoOiBudW1iZXIgfT4gPSBbXG4gICAgeyB2YWx1ZTogcm9vdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd25bXSwgZGVwdGg6IDAgfSxcbiAgXTtcblxuICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBzdGFjay5wb3AoKSE7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoY3VycmVudC52YWx1ZSkpIHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjdXJyZW50LnZhbHVlLmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAgICBjb25zdCBkZXB0aCA9IGN1cnJlbnQuZGVwdGggKyAxO1xuICAgICAgICBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoLCBwYXRoKTtcbiAgICAgICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICAgICAgY29uc3QgY2hpbGQgPSBjdXJyZW50LnZhbHVlW2luZGV4XTtcbiAgICAgICAgaWYgKHByZWNoZWNrVXRmOEJ5dGVzICYmIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgIGFkZFJhd1V0ZjhMb3dlckJvdW5kKGNoaWxkLCBwYXRoLCBzdGF0ZSwgcmF3VXRmOEJ5dGVzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7IHZhbHVlOiBjaGlsZCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd25bXSwgZGVwdGggfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnQudmFsdWUpIHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihjdXJyZW50LnZhbHVlLCBrZXkpKSBjb250aW51ZTtcbiAgICAgIGlmIChwcmVjaGVja1V0ZjhCeXRlcykge1xuICAgICAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChrZXksIHBhdGgsIHN0YXRlLCByYXdVdGY4Qnl0ZXMpO1xuICAgICAgfVxuICAgICAgY29uc3QgZGVwdGggPSBjdXJyZW50LmRlcHRoICsgMTtcbiAgICAgIGFzc2VydERlcHRoV2l0aGluTGltaXQoZGVwdGgsIHBhdGgpO1xuICAgICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICAgIGNvbnN0IGNoaWxkID0gY3VycmVudC52YWx1ZVtrZXldO1xuICAgICAgaWYgKHByZWNoZWNrVXRmOEJ5dGVzICYmIHR5cGVvZiBjaGlsZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChjaGlsZCwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgICB9XG4gICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSBcIm9iamVjdFwiKSB7XG4gICAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZTogY2hpbGQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmtub3duW10sIGRlcHRoIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRSYXdVdGY4TG93ZXJCb3VuZChcbiAgdmFsdWU6IHN0cmluZyxcbiAgcGF0aDogc3RyaW5nLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuICByYXdVdGY4Qnl0ZXM6IHsgdmFsdWU6IG51bWJlciB9LFxuKTogdm9pZCB7XG4gIHJhd1V0ZjhCeXRlcy52YWx1ZSArPSBCdWZmZXIuYnl0ZUxlbmd0aCh2YWx1ZSwgXCJ1dGY4XCIpO1xuICBpZiAoc3RhdGUudXRmOEJ5dGVzICsgcmF3VXRmOEJ5dGVzLnZhbHVlID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoOiBudW1iZXIsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZGVwdGggPiBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhEZXB0aCkge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgJHtwYXRofSBleGNlZWRzIGRlcHRoIGxpbWl0IG9mICR7Q0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4RGVwdGh9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE5vZGUocGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlKTogdm9pZCB7XG4gIHN0YXRlLm5vZGVzICs9IDE7XG4gIGlmIChzdGF0ZS5ub2RlcyA+IENBTExFUl9TQ0hFTUFfTElNSVRTLm1heE5vZGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwibm9kZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhOb2Rlcywgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93TGltaXRFcnJvcihcbiAgcGF0aDogc3RyaW5nLFxuICBraW5kOiBcIlVURi04IGJ5dGVcIiB8IFwibm9kZVwiLFxuICBsaW1pdDogbnVtYmVyLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKFxuICAgIHN0YXRlLnNjaGVtYXMgPT09IDBcbiAgICAgID8gYCR7cGF0aH0gZXhjZWVkcyAke2tpbmR9IGxpbWl0IG9mICR7bGltaXR9YFxuICAgICAgOiBgY2FsbGVyIHNjaGVtYXMgZXhjZWVkIGFnZ3JlZ2F0ZSAke2tpbmR9IGxpbWl0IG9mICR7bGltaXR9YCxcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNSZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBU0EsTUFBYSx1QkFBdUI7Q0FDbEMsY0FBYyxNQUFNO0NBQ3BCLFVBQVU7Q0FDVixVQUFVO0FBQ1o7QUFLQSxNQUFhLDJCQUEyQixLQUFLO0FBQzdDLE1BQWEsdUNBQXVDO0FBRXBELElBQWEsOEJBQWIs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
216
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLXZhbGlkYXRpb24uanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9jb21tb24vc2NoZW1hLXZhbGlkYXRpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQnVmZmVyIH0gZnJvbSBcIm5vZGU6YnVmZmVyXCI7XG5cbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB7IGlzSnNvbk9iamVjdCwgdHlwZSBKc29uVmFsdWUgfSBmcm9tIFwiLi9wcm92aWRlci10eXBlc1wiO1xuXG4vKipcbiAqIENhbGxlci1wcm92aWRlZCBzY2hlbWFzIGFyZSBzZXJpYWxpemVkLCBjb3BpZWQsIGFuZCByZWN1cnNpdmVseSBub3JtYWxpemVkIGJlZm9yZSBkaXNwYXRjaC5cbiAqIEtlZXAgdGhlc2UgbGltaXRzIGNvbWZvcnRhYmx5IGFib3ZlIG5vcm1hbCBnZW5lcmF0ZWQgc2NoZW1hcyB3aGlsZSBib3VuZGluZyB0aGF0IHByZXByb2Nlc3NpbmdcbiAqIHdlbGwgYmVsb3cgdGhlIEFQSSdzIDEwIE1pQiByZXF1ZXN0LWJvZHkgY2VpbGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IENBTExFUl9TQ0hFTUFfTElNSVRTID0ge1xuICBtYXhVdGY4Qnl0ZXM6IDUxMiAqIDEwMjQsXG4gIG1heE5vZGVzOiAyMF8wMDAsXG4gIG1heERlcHRoOiAxMjgsXG59IGFzIGNvbnN0O1xuXG4vLyBMaW51eCBwZXJtaXRzIGF0IG1vc3QgMTI4IEtpQiAoTUFYX0FSR19TVFJMRU4pIGZvciBvbmUgYXJndiB2YWx1ZS4gcWdyaWQgdXNlcyBhIDUwJSBzYWZldHlcbi8vIG1hcmdpbiBmb3IgZXZlcnkgYXJndi1kZWxpdmVyZWQgcGF5bG9hZCDigJQgQ2xhdWRlIENvZGUgLS1qc29uLXNjaGVtYSBoZXJlIGFuZCB0aGUgc3lzdGVtLXByb21wdFxuLy8gdHJhbnNwb3J0IChjbGF1ZGUtc2Vzc2lvbikgYm90aCBkZXJpdmUgZnJvbSB0aGlzIHNpbmdsZSBjb25zdGFudC5cbmV4cG9ydCBjb25zdCBBUkdWX1NBRkVfTUFYX1VURjhfQllURVMgPSA2NCAqIDEwMjQ7XG5leHBvcnQgY29uc3QgQU5USFJPUElDX1NDSEVNQV9BUkdWX01BWF9VVEY4X0JZVEVTID0gQVJHVl9TQUZFX01BWF9VVEY4X0JZVEVTO1xuXG5leHBvcnQgY2xhc3MgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgcWdyaWQ6ICR7bWVzc2FnZX1gKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvclwiO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGVyU2NoZW1hc0lucHV0IHtcbiAganNvblNjaGVtYT86IHN0cmluZztcbiAgdG9vbHM/OiBBcnJheTx7IG5hbWU6IHN0cmluZzsgZGVzY3JpcHRpb24/OiBzdHJpbmc7IGlucHV0U2NoZW1hOiB1bmtub3duIH0+O1xufVxuXG5pbnRlcmZhY2UgQ29tcGxleGl0eVN0YXRlIHtcbiAgdXRmOEJ5dGVzOiBudW1iZXI7XG4gIG5vZGVzOiBudW1iZXI7XG4gIHNjaGVtYXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlQW5kVmFsaWRhdGVDYWxsZXJTY2hlbWFzKGlucHV0OiBDYWxsZXJTY2hlbWFzSW5wdXQpOiBKc29uVmFsdWUgfCB1bmRlZmluZWQge1xuICBjb25zdCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlID0ge1xuICAgIHV0ZjhCeXRlczogMCxcbiAgICBub2RlczogMCxcbiAgICBzY2hlbWFzOiAwLFxuICB9O1xuXG4gIGxldCBvdXRwdXRTY2hlbWE6IEpzb25WYWx1ZSB8IHVuZGVmaW5lZDtcblxuICBpZiAoaW5wdXQuanNvblNjaGVtYSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWRkVXRmOEJ5dGVzKEJ1ZmZlci5ieXRlTGVuZ3RoKGlucHV0Lmpzb25TY2hlbWEsIFwidXRmOFwiKSwgXCJqc29uU2NoZW1hXCIsIHN0YXRlKTtcblxuICAgIGxldCBwYXJzZWQ6IEpzb25WYWx1ZTtcblxuICAgIHRyeSB7XG4gICAgICAvLyBKU09OLnBhcnNlIHdpdGhvdXQgYSByZXZpdmVyIHlpZWxkcyBvbmx5IEpTT04gdmFsdWVzLlxuICAgICAgcGFyc2VkID0gSlNPTi5wYXJzZShpbnB1dC5qc29uU2NoZW1hKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXCJqc29uU2NoZW1hIG11c3QgY29udGFpbiB2YWxpZCBKU09OXCIpO1xuICAgIH1cblxuICAgIGlmICghaXNKc29uT2JqZWN0KHBhcnNlZCkgfHwgcGFyc2VkLnR5cGUgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoJ2pzb25TY2hlbWEgdG9wLWxldmVsIHR5cGUgbXVzdCBiZSBcIm9iamVjdFwiJyk7XG4gICAgfVxuXG4gICAgY29tcGxleGl0eVdhbGsoXCJqc29uU2NoZW1hXCIsIHN0YXRlLCBmYWxzZSkucGFyc2UocGFyc2VkKTtcbiAgICBzdGF0ZS5zY2hlbWFzICs9IDE7XG4gICAgb3V0cHV0U2NoZW1hID0gcGFyc2VkO1xuICB9XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHRvb2xdIG9mIChpbnB1dC50b29scyA/PyBbXSkuZW50cmllcygpKSB7XG4gICAgYWRkVG9vbE1ldGFkYXRhVXRmOEJ5dGVzKHRvb2wsIGluZGV4LCBzdGF0ZSk7XG5cbiAgICBjb25zdCBwYXRoID0gYHRvb2xzWyR7aW5kZXh9XS5pbnB1dFNjaGVtYWA7XG4gICAgY29tcGxleGl0eVdhbGsocGF0aCwgc3RhdGUsIHRydWUpLnBhcnNlKHRvb2wuaW5wdXRTY2hlbWEpO1xuXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IGNhbGxlckpzb25UZXh0LnNhZmVQYXJzZSh0b29sLmlucHV0U2NoZW1hKTtcblxuICAgIGlmICghc2VyaWFsaXplZC5zdWNjZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKGAke3BhdGh9IG11c3QgYmUgSlNPTi1zZXJpYWxpemFibGVgKTtcbiAgICB9XG5cbiAgICAvLyBidWlsZFRvb2xDYWxsU2NoZW1hIGVtYmVkcyB0aGlzIHNlcmlhbGl6YXRpb24gaW5zaWRlIGFub3RoZXIgSlNPTiBzdHJpbmcuIENoYXJnZSB0aGVcbiAgICAvLyBlc2NhcGVkIG91dGVyLXN0cmluZyByZXByZXNlbnRhdGlvbiBiZWZvcmUgdGhhdCBjb21wb3NlZCBkZXNjcmlwdGlvbiBpcyBtYXRlcmlhbGl6ZWQuXG4gICAgYWRkVXRmOEJ5dGVzKGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHNlcmlhbGl6ZWQuZGF0YSksIHBhdGgsIHN0YXRlKTtcbiAgICBzdGF0ZS5zY2hlbWFzICs9IDE7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0U2NoZW1hO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplQW5kVmFsaWRhdGVEaXNwYXRjaFNjaGVtYShcbiAgc2NoZW1hOiBKc29uVmFsdWUgfCB1bmRlZmluZWQsXG4gIHByb3ZpZGVyPzogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHNjaGVtYSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBzdHJpbmdpZnlKc29uT3JUaHJvdyhzY2hlbWEsIFwiZGlzcGF0Y2ggc2NoZW1hXCIpO1xuXG4gIGNvbnN0IGJ5dGVMZW5ndGggPSBCdWZmZXIuYnl0ZUxlbmd0aChzZXJpYWxpemVkLCBcInV0ZjhcIik7XG5cbiAgaWYgKGJ5dGVMZW5ndGggPiBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgQ2FsbGVyU2NoZW1hVmFsaWRhdGlvbkVycm9yKFxuICAgICAgYGRpc3BhdGNoIHNjaGVtYSBleGNlZWRzIFVURi04IGJ5dGUgbGltaXQgb2YgJHtDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXN9YCxcbiAgICApO1xuICB9XG5cbiAgaWYgKHByb3ZpZGVyID09PSBcImFudGhyb3BpY1wiKSB7XG4gICAgYXNzZXJ0QW50aHJvcGljU2NoZW1hQXJndlNpemUoc2VyaWFsaXplZCk7XG4gIH1cblxuICByZXR1cm4gc2VyaWFsaXplZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFudGhyb3BpY1NjaGVtYUFyZ3ZTaXplKGpzb25TY2hlbWE6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoQnVmZmVyLmJ5dGVMZW5ndGgoanNvblNjaGVtYSwgXCJ1dGY4XCIpID4gQU5USFJPUElDX1NDSEVNQV9BUkdWX01BWF9VVEY4X0JZVEVTKSB7XG4gICAgdGhyb3cgbmV3IENhbGxlclNjaGVtYVZhbGlkYXRpb25FcnJvcihcbiAgICAgIGBBbnRocm9waWMgZGlzcGF0Y2ggc2NoZW1hIGV4Y2VlZHMgYXJndiBVVEYtOCBieXRlIGxpbWl0IG9mICR7QU5USFJPUElDX1NDSEVNQV9BUkdWX01BWF9VVEY4X0JZVEVTfWAsXG4gICAgKTtcbiAgfVxufVxuXG4vKipcbiAqIERlY29kZXMgYW4gb3BhcXVlIGNhbGxlciB2YWx1ZSAoUWdyaWRUb29sLmlucHV0U2NoZW1hIGlzIHoudW5rbm93bigpIGF0IHRoZSBBUEkgYm91bmRhcnkpIGludG9cbiAqIGl0cyBKU09OIHRleHQuIEN5Y2xlcywgQmlnSW50LCBhbmQgdmFsdWVzIHdpdGggbm8gSlNPTiBmb3JtIChiYXJlIHVuZGVmaW5lZCwgZnVuY3Rpb25zKSBmYWlsLlxuICovXG5jb25zdCBjYWxsZXJKc29uVGV4dCA9IHoudW5rbm93bigpLnRyYW5zZm9ybSgodmFsdWUsIGNvbnRleHQpOiBzdHJpbmcgPT4ge1xuICBsZXQgc2VyaWFsaXplZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcbiAgfSBjYXRjaCB7XG4gICAgc2VyaWFsaXplZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChzZXJpYWxpemVkID09PSB1bmRlZmluZWQpIHtcbiAgICBjb250ZXh0LmFkZElzc3VlKHsgY29kZTogXCJjdXN0b21cIiwgbWVzc2FnZTogXCJ2YWx1ZSBpcyBub3QgSlNPTi1zZXJpYWxpemFibGVcIiB9KTtcblxuICAgIHJldHVybiB6Lk5FVkVSO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59KTtcblxuZnVuY3Rpb24gc3RyaW5naWZ5SnNvbk9yVGhyb3codmFsdWU6IEpzb25WYWx1ZSwgc3ViamVjdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IHNlcmlhbGl6ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICB0cnkge1xuICAgIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoYCR7c3ViamVjdH0gbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZWApO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoYCR7c3ViamVjdH0gbXVzdCBiZSBKU09OLXNlcmlhbGl6YWJsZWApO1xuICB9XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZWQ7XG59XG5cbmZ1bmN0aW9uIGFkZFV0ZjhCeXRlcyhieXRlTGVuZ3RoOiBudW1iZXIsIHBhdGg6IHN0cmluZywgc3RhdGU6IENvbXBsZXhpdHlTdGF0ZSk6IHZvaWQge1xuICBzdGF0ZS51dGY4Qnl0ZXMgKz0gYnl0ZUxlbmd0aDtcblxuICBpZiAoc3RhdGUudXRmOEJ5dGVzID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCA9IFwiLSBcIjtcbmNvbnN0IFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IgPSBcIjogXCI7XG5jb25zdCBUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVggPSBcIlxcbiAgaW5wdXRTY2hlbWE6IFwiO1xuY29uc3QgVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IgPSBcIlxcblwiO1xuXG5mdW5jdGlvbiBhZGRUb29sTWV0YWRhdGFVdGY4Qnl0ZXMoXG4gIHRvb2w6IE5vbk51bGxhYmxlPENhbGxlclNjaGVtYXNJbnB1dFtcInRvb2xzXCJdPltudW1iZXJdLFxuICBpbmRleDogbnVtYmVyLFxuICBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLFxuKTogdm9pZCB7XG4gIGNvbnN0IHRvb2xQYXRoID0gYHRvb2xzWyR7aW5kZXh9XWA7XG5cbiAgLy8gYnVpbGRUb29sQ2FsbFNjaGVtYSBwbGFjZXMgZXZlcnkgdG9vbCBuYW1lIGluIGJvdGggdGhlIGVudW0gYW5kIHRoZSBodW1hbi1yZWFkYWJsZSB0b29sXG4gIC8vIGRlc2NyaXB0aW9uLiBDb3VudCBib3RoIGVzY2FwZWQgb2NjdXJyZW5jZXMsIHBsdXMgdGhlIGVudW0ncyBKU09OIHN0cmluZyBkZWxpbWl0ZXJzLlxuICBjb25zdCBlbmNvZGVkTmFtZUJ5dGVzID0ganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQodG9vbC5uYW1lKTtcbiAgYWRkVXRmOEJ5dGVzKGVuY29kZWROYW1lQnl0ZXMgKiAyICsgMiwgYCR7dG9vbFBhdGh9Lm5hbWVgLCBzdGF0ZSk7XG5cbiAgaWYgKHRvb2wuZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGFkZFV0ZjhCeXRlcyhcbiAgICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHRvb2wuZGVzY3JpcHRpb24pLFxuICAgICAgYCR7dG9vbFBhdGh9LmRlc2NyaXB0aW9uYCxcbiAgICAgIHN0YXRlLFxuICAgICk7XG4gIH1cblxuICAvLyBQZXItdG9vbCBmcmFtaW5nIGFsc28gZ3Jvd3Mgd2l0aCB0aGUgbnVtYmVyIG9mIHRvb2xzIGV2ZW4gd2hlbiBhbGwgY2FsbGVyIHN0cmluZ3MgYXJlIGVtcHR5LlxuICAvLyBJbmNsdWRlIGJvdGggdGhlIHRvb2xEZXNjcmlwdGlvbnMgam9pbiBzZXBhcmF0b3IgYW5kIHRoZSBlbnVtIGNvbW1hIGFmdGVyIHRoZSBmaXJzdCBlbnRyeS5cbiAgY29uc3QgZnJhbWluZ0J5dGVzID1cbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0VOVFJZX1BSRUZJWCkgK1xuICAgIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKFRPT0xfREVTQ1JJUFRJT05fTkFNRV9TRVBBUkFUT1IpICtcbiAgICBqc29uU3RyaW5nQ29udGVudFV0ZjhCeXRlVXBwZXJCb3VuZChUT09MX0RFU0NSSVBUSU9OX0lOUFVUX1NDSEVNQV9QUkVGSVgpICtcbiAgICAoaW5kZXggPT09IDAgPyAwIDoganNvblN0cmluZ0NvbnRlbnRVdGY4Qnl0ZVVwcGVyQm91bmQoVE9PTF9ERVNDUklQVElPTl9FTlRSWV9TRVBBUkFUT1IpICsgMSk7XG5cbiAgYWRkVXRmOEJ5dGVzKGZyYW1pbmdCeXRlcywgdG9vbFBhdGgsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY29uc2VydmF0aXZlIFVURi04IGJ5dGUgY291bnQgZm9yIGEgc3RyaW5nIHdoZW4gaXQgYmVjb21lcyBKU09OIHN0cmluZyBjb250ZW50LFxuICogd2l0aG91dCBhbGxvY2F0aW5nIHRoZSBlc2NhcGVkIHJlcHJlc2VudGF0aW9uLiBKU09OLnN0cmluZ2lmeSB1c2VzIHNob3J0IHR3by1ieXRlIGVzY2FwZXMgZm9yXG4gKiBmaXZlIGNvbnRyb2wgY2hhcmFjdGVyczsgY291bnRpbmcgZXZlcnkgY29udHJvbCBjaGFyYWN0ZXIgYXMgYSBzaXgtYnl0ZSBgXFx1MDBYWGAgZXNjYXBlIGtlZXBzXG4gKiB0aGlzIGFuIHVwcGVyIGJvdW5kIHdoaWxlIGF2b2lkaW5nIGEgc2Vjb25kIGxhcmdlIHRlbXBvcmFyeSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGpzb25TdHJpbmdDb250ZW50VXRmOEJ5dGVVcHBlckJvdW5kKHZhbHVlOiBzdHJpbmcpOiBudW1iZXIge1xuICBsZXQgYnl0ZXMgPSAwO1xuXG4gIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB2YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBjb25zdCBjb2RlVW5pdCA9IHZhbHVlLmNoYXJDb2RlQXQoaW5kZXgpO1xuXG4gICAgaWYgKGNvZGVVbml0ID09PSAweDIyIHx8IGNvZGVVbml0ID09PSAweDVjKSB7XG4gICAgICBieXRlcyArPSAyO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNvZGVVbml0IDw9IDB4MWYpIHtcbiAgICAgIGJ5dGVzICs9IDY7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY29kZVVuaXQgPj0gMHhkODAwICYmIGNvZGVVbml0IDw9IDB4ZGJmZikge1xuICAgICAgY29uc3QgbmV4dENvZGVVbml0ID0gdmFsdWUuY2hhckNvZGVBdChpbmRleCArIDEpO1xuXG4gICAgICBpZiAobmV4dENvZGVVbml0ID49IDB4ZGMwMCAmJiBuZXh0Q29kZVVuaXQgPD0gMHhkZmZmKSB7XG4gICAgICAgIGJ5dGVzICs9IDQ7XG4gICAgICAgIGluZGV4ICs9IDE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBXZWxsLWZvcm1lZCBKU09OLnN0cmluZ2lmeSBlc2NhcGVzIGxvbmUgc3Vycm9nYXRlcyBhcyBgXFx1WFhYWGAuXG4gICAgICAgIGJ5dGVzICs9IDY7XG4gICAgICB9XG5cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjb2RlVW5pdCA+PSAweGRjMDAgJiYgY29kZVVuaXQgPD0gMHhkZmZmKSB7XG4gICAgICBieXRlcyArPSA2O1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgYnl0ZXMgKz0gY29kZVVuaXQgPD0gMHg3ZiA/IDEgOiBjb2RlVW5pdCA8PSAweDdmZiA/IDIgOiAzO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG4vKipcbiAqIEJvdW5kZWQsIGl0ZXJhdGl2ZSB3YWxrIG92ZXIgYSBjYWxsZXIgc2NoZW1hLCBydW4gYmVmb3JlIGFueXRoaW5nIG1hdGVyaWFsaXplcyBpdHNcbiAqIHNlcmlhbGl6YXRpb24uIFZhbHVlcyBhcmUgcmVhZCBvbmUgYXQgYSB0aW1lLCBpbiBrZXkgb3JkZXIsIHNvIGEgbGltaXQgc3RvcHMgdGhlIHdhbGsgYmVmb3JlXG4gKiBsYXRlciB2YWx1ZXMgKGluY2x1ZGluZyBnZXR0ZXJzKSBhcmUgdG91Y2hlZC4gVGhhdCBydWxlcyBvdXQgZGVjb2RpbmcgZWFjaCB2YWx1ZSB3aXRoIGEgc2NoZW1hXG4gKiBmaXJzdDsgbm9kZXMgYXJlIGNsYXNzaWZpZWQgYnkgaWRlbnRpdHkgaW5zdGVhZDogT2JqZWN0KHZhbHVlKSA9PT0gdmFsdWUgaG9sZHMgZXhhY3RseSBmb3JcbiAqIG9iamVjdHMsIGFycmF5cywgYW5kIGZ1bmN0aW9ucy5cbiAqL1xuZnVuY3Rpb24gY29tcGxleGl0eVdhbGsocGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlLCBwcmVjaGVja1V0ZjhCeXRlczogYm9vbGVhbikge1xuICByZXR1cm4gei51bmtub3duKCkudHJhbnNmb3JtKChyb290KTogdm9pZCA9PiB7XG4gICAgY29uc3QgcmF3VXRmOEJ5dGVzID0geyB2YWx1ZTogMCB9O1xuXG4gICAgaWYgKHByZWNoZWNrVXRmOEJ5dGVzICYmIGlzUHJpbWl0aXZlVGV4dChyb290KSkge1xuICAgICAgYWRkUmF3VXRmOExvd2VyQm91bmQocm9vdCwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgfVxuXG4gICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICBpZiAocm9vdCA9PT0gbnVsbCB8fCByb290ID09PSB1bmRlZmluZWQgfHwgT2JqZWN0KHJvb3QpICE9PSByb290KSByZXR1cm47XG5cbiAgICBjb25zdCByb290T2JqZWN0OiBvYmplY3QgPSBPYmplY3Qocm9vdCk7XG4gICAgY29uc3Qgc3RhY2s6IEFycmF5PHsgdmFsdWU6IG9iamVjdDsgZGVwdGg6IG51bWJlciB9PiA9IFt7IHZhbHVlOiByb290T2JqZWN0LCBkZXB0aDogMCB9XTtcblxuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gc3RhY2sucG9wKCkhO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50LnZhbHVlKSkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY3VycmVudC52YWx1ZS5sZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBkZXB0aCA9IGN1cnJlbnQuZGVwdGggKyAxO1xuICAgICAgICAgIGFzc2VydERlcHRoV2l0aGluTGltaXQoZGVwdGgsIHBhdGgpO1xuICAgICAgICAgIGFkZE5vZGUocGF0aCwgc3RhdGUpO1xuXG4gICAgICAgICAgY29uc3QgY2hpbGQ6IHVua25vd24gPSBjdXJyZW50LnZhbHVlW2luZGV4XTtcblxuICAgICAgICAgIGlmIChwcmVjaGVja1V0ZjhCeXRlcyAmJiBpc1ByaW1pdGl2ZVRleHQoY2hpbGQpKSB7XG4gICAgICAgICAgICBhZGRSYXdVdGY4TG93ZXJCb3VuZChjaGlsZCwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIGNoaWxkICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0KGNoaWxkKSA9PT0gY2hpbGQpIHtcbiAgICAgICAgICAgIHN0YWNrLnB1c2goeyB2YWx1ZTogT2JqZWN0KGNoaWxkKSwgZGVwdGggfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IGluIGN1cnJlbnQudmFsdWUpIHtcbiAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKGN1cnJlbnQudmFsdWUsIGtleSkpIGNvbnRpbnVlO1xuXG4gICAgICAgIGlmIChwcmVjaGVja1V0ZjhCeXRlcykge1xuICAgICAgICAgIGFkZFJhd1V0ZjhMb3dlckJvdW5kKGtleSwgcGF0aCwgc3RhdGUsIHJhd1V0ZjhCeXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXB0aCA9IGN1cnJlbnQuZGVwdGggKyAxO1xuICAgICAgICBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoLCBwYXRoKTtcbiAgICAgICAgYWRkTm9kZShwYXRoLCBzdGF0ZSk7XG5cbiAgICAgICAgLy8gU2FtZSByZWFkIGFzIGN1cnJlbnQudmFsdWVba2V5XSBmb3IgYW4gb3duIHByb3BlcnR5OiBkYXRhIHZhbHVlLCBvciB0aGUgZ2V0dGVyJ3MgcmVzdWx0LlxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjdXJyZW50LnZhbHVlLCBrZXkpO1xuXG4gICAgICAgIGNvbnN0IGNoaWxkOiB1bmtub3duID0gZGVzY3JpcHRvcj8uZ2V0XG4gICAgICAgICAgPyBkZXNjcmlwdG9yLmdldC5jYWxsKGN1cnJlbnQudmFsdWUpXG4gICAgICAgICAgOiBkZXNjcmlwdG9yPy52YWx1ZTtcblxuICAgICAgICBpZiAocHJlY2hlY2tVdGY4Qnl0ZXMgJiYgaXNQcmltaXRpdmVUZXh0KGNoaWxkKSkge1xuICAgICAgICAgIGFkZFJhd1V0ZjhMb3dlckJvdW5kKGNoaWxkLCBwYXRoLCBzdGF0ZSwgcmF3VXRmOEJ5dGVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiBjaGlsZCAhPT0gdW5kZWZpbmVkICYmIE9iamVjdChjaGlsZCkgPT09IGNoaWxkKSB7XG4gICAgICAgICAgc3RhY2sucHVzaCh7IHZhbHVlOiBPYmplY3QoY2hpbGQpLCBkZXB0aCB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogU3RyaW5nIHRlc3QgZm9yIHRoZSBib3VuZGVkIHdhbGsuIEEgZmFpbGVkIHpvZCBwYXJzZSBidWlsZHMgYSBab2RFcnJvciAod2hpY2ggc2VyaWFsaXplcyB0aGVcbiAqIGlucHV0KSwgc28gdGhlIHdhbGsgdXNlcyBpZGVudGl0eTogYSBwcmltaXRpdmUgd2hvc2UgU3RyaW5nKCkgZm9ybSBpcyBpdHNlbGYgaXMgYSBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlVGV4dCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiBPYmplY3QodmFsdWUpICE9PSB2YWx1ZSAmJiBTdHJpbmcodmFsdWUpID09PSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYWRkUmF3VXRmOExvd2VyQm91bmQoXG4gIHZhbHVlOiBzdHJpbmcsXG4gIHBhdGg6IHN0cmluZyxcbiAgc3RhdGU6IENvbXBsZXhpdHlTdGF0ZSxcbiAgcmF3VXRmOEJ5dGVzOiB7IHZhbHVlOiBudW1iZXIgfSxcbik6IHZvaWQge1xuICByYXdVdGY4Qnl0ZXMudmFsdWUgKz0gQnVmZmVyLmJ5dGVMZW5ndGgodmFsdWUsIFwidXRmOFwiKTtcblxuICBpZiAoc3RhdGUudXRmOEJ5dGVzICsgcmF3VXRmOEJ5dGVzLnZhbHVlID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4VXRmOEJ5dGVzKSB7XG4gICAgdGhyb3dMaW1pdEVycm9yKHBhdGgsIFwiVVRGLTggYnl0ZVwiLCBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhVdGY4Qnl0ZXMsIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhc3NlcnREZXB0aFdpdGhpbkxpbWl0KGRlcHRoOiBudW1iZXIsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZGVwdGggPiBDQUxMRVJfU0NIRU1BX0xJTUlUUy5tYXhEZXB0aCkge1xuICAgIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXG4gICAgICBgJHtwYXRofSBleGNlZWRzIGRlcHRoIGxpbWl0IG9mICR7Q0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4RGVwdGh9YCxcbiAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkZE5vZGUocGF0aDogc3RyaW5nLCBzdGF0ZTogQ29tcGxleGl0eVN0YXRlKTogdm9pZCB7XG4gIHN0YXRlLm5vZGVzICs9IDE7XG5cbiAgaWYgKHN0YXRlLm5vZGVzID4gQ0FMTEVSX1NDSEVNQV9MSU1JVFMubWF4Tm9kZXMpIHtcbiAgICB0aHJvd0xpbWl0RXJyb3IocGF0aCwgXCJub2RlXCIsIENBTExFUl9TQ0hFTUFfTElNSVRTLm1heE5vZGVzLCBzdGF0ZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGhyb3dMaW1pdEVycm9yKFxuICBwYXRoOiBzdHJpbmcsXG4gIGtpbmQ6IFwiVVRGLTggYnl0ZVwiIHwgXCJub2RlXCIsXG4gIGxpbWl0OiBudW1iZXIsXG4gIHN0YXRlOiBDb21wbGV4aXR5U3RhdGUsXG4pOiBuZXZlciB7XG4gIHRocm93IG5ldyBDYWxsZXJTY2hlbWFWYWxpZGF0aW9uRXJyb3IoXG4gICAgc3RhdGUuc2NoZW1hcyA9PT0gMFxuICAgICAgPyBgJHtwYXRofSBleGNlZWRzICR7a2luZH0gbGltaXQgb2YgJHtsaW1pdH1gXG4gICAgICA6IGBjYWxsZXIgc2NoZW1hcyBleGNlZWQgYWdncmVnYXRlICR7a2luZH0gbGltaXQgb2YgJHtsaW1pdH1gLFxuICApO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFXQSxNQUFhLHVCQUF1QjtDQUNsQyxjQUFjLE1BQU07Q0FDcEIsVUFBVTtDQUNWLFVBQVU7QUFDWjtB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
@@ -39,4 +39,4 @@ var SmoothWeightedRoundRobin = class {
39
39
  //#endregion
40
40
  export { SmoothWeightedRoundRobin };
41
41
 
42
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2Jpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIHtcbiAgcmVhZG9ubHkgd2VpZ2h0cyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTY29yZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gIHNldFRva2VuKHRva2VuSWQ6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ3ZWlnaHQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwXCIpO1xuICAgIH1cbiAgICBpZiAodGhpcy53ZWlnaHRzLmdldCh0b2tlbklkKSA9PT0gd2VpZ2h0KSByZXR1cm47XG4gICAgdGhpcy53ZWlnaHRzLnNldCh0b2tlbklkLCB3ZWlnaHQpO1xuICAgIHRoaXMucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIHJlbW92ZVRva2VuKHRva2VuSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICghdGhpcy53ZWlnaHRzLmRlbGV0ZSh0b2tlbklkKSkgcmV0dXJuO1xuICAgIHRoaXMuY3VycmVudFNjb3Jlcy5kZWxldGUodG9rZW5JZCk7XG4gICAgdGhpcy5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgcmVzZXRTY29yZXMoKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50U2NvcmVzLmNsZWFyKCk7XG4gIH1cblxuICBzZWxlY3QoZWxpZ2libGVUb2tlbklkczogUmVhZG9ubHlTZXQ8bnVtYmVyPik6IG51bWJlciB8IG51bGwge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBbLi4uZWxpZ2libGVUb2tlbklkc11cbiAgICAgIC5maWx0ZXIoKHRva2VuSWQpID0+IHRoaXMud2VpZ2h0cy5oYXModG9rZW5JZCkpXG4gICAgICAudG9Tb3J0ZWQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgbGV0IHNlbGVjdGVkID0gY2FuZGlkYXRlc1swXSE7XG4gICAgbGV0IHNlbGVjdGVkU2NvcmUgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk7XG4gICAgbGV0IHRvdGFsV2VpZ2h0ID0gMDtcblxuICAgIGNhbmRpZGF0ZXMuZm9yRWFjaCgodG9rZW5JZCkgPT4ge1xuICAgICAgY29uc3Qgd2VpZ2h0ID0gdGhpcy53ZWlnaHRzLmdldCh0b2tlbklkKSE7XG4gICAgICB0b3RhbFdlaWdodCArPSB3ZWlnaHQ7XG4gICAgICBjb25zdCBzY29yZSA9ICh0aGlzLmN1cnJlbnRTY29yZXMuZ2V0KHRva2VuSWQpID8/IDApICsgd2VpZ2h0O1xuICAgICAgdGhpcy5jdXJyZW50U2NvcmVzLnNldCh0b2tlbklkLCBzY29yZSk7XG4gICAgICBpZiAoc2NvcmUgPiBzZWxlY3RlZFNjb3JlKSB7XG4gICAgICAgIHNlbGVjdGVkID0gdG9rZW5JZDtcbiAgICAgICAgc2VsZWN0ZWRTY29yZSA9IHNjb3JlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50U2NvcmVzLnNldChzZWxlY3RlZCwgc2VsZWN0ZWRTY29yZSAtIHRvdGFsV2VpZ2h0KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBLElBQWEsMkJBQWIsTUFBc0M7Q0FDcEMsMEJBQW1CLElBQUksSUFBb0I7Q0FDM0MsZ0NBQXlCLElBQUksSUFBb0I7Q0FFakQsU0FBUyxTQUFpQixRQUFzQjtFQUM5QyxJQUFJLENBQUMsT0FBTyxVQUFVLE1BQU0sS0FBSyxTQUFTLEtBQUssU0FBUyxLQUN0RCxNQUFNLElBQUksV0FBVyw2Q0FBNkM7RUFFcEUsSUFBSSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sUUFBUTtFQUMxQyxLQUFLLFFBQVEsSUFBSSxTQUFTLE1BQU07RUFDaEMsS0FBSyxZQUFZO0NBQ25CO0NBRUEsWUFBWSxTQUF1QjtFQUNqQyxJQUFJLENBQUMsS0FBSyxRQUFRLE9BQU8sT0FBTyxHQUFHO0VBQ25DLEtBQUssY0FBYyxPQUFPLE9BQU87RUFDakMsS0FBSyxZQUFZO0NBQ25CO0NBRUEsY0FBb0I7RUFDbEIsS0FBSyxjQUFjLE1BQU07Q0FDM0I7Q0FFQSxPQUFPLGtCQUFzRDtFQUMzRCxNQUFNLGFBQWEsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQ3JDLFFBQVEsWUFBWSxLQUFLLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUM5QyxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUM7RUFDM0IsSUFBSSxXQUFXLFdBQVcsR0FBRyxPQUFPO0VBRXBDLElBQUksV0FBVyxXQUFXO0VBQzFCLElBQUksZ0JBQWdCLE9BQU87RUFDM0IsSUFBSSxjQUFjO0VBRWxCLFdBQVcsU0FBUyxZQUFZO0dBQzlCLE1BQU0sU0FBUyxLQUFLLFFBQVEsSUFBSSxPQUFPO0dBQ3ZDLGVBQWU7R0FDZixNQUFNLFNBQVMsS0FBSyxjQUFjLElBQUksT0FBTyxLQUFLLEtBQUs7R0FDdkQsS0FBSyxjQUFjLElBQUksU0FBUyxLQUFLO0dBQ3JDLElBQUksUUFBUSxlQUFlO0lBQ3pCLFdBQVc7SUFDWCxnQkFBZ0I7R0FDbEI7RUFDRixDQUFDO0VBRUQsS0FBSyxjQUFjLElBQUksVUFBVSxnQkFBZ0IsV0FBVztFQUM1RCxPQUFPO0NBQ1Q7QUFDRiJ9
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21vb3RoLXdlaWdodGVkLXJvdW5kLXJvYmluLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2Jpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU21vb3RoV2VpZ2h0ZWRSb3VuZFJvYmluIHtcbiAgcmVhZG9ubHkgd2VpZ2h0cyA9IG5ldyBNYXA8bnVtYmVyLCBudW1iZXI+KCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRTY29yZXMgPSBuZXcgTWFwPG51bWJlciwgbnVtYmVyPigpO1xuXG4gIHNldFRva2VuKHRva2VuSWQ6IG51bWJlciwgd2VpZ2h0OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIU51bWJlci5pc0ludGVnZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAxIHx8IHdlaWdodCA+IDEwMCkge1xuICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoXCJ3ZWlnaHQgbXVzdCBiZSBhbiBpbnRlZ2VyIGJldHdlZW4gMSBhbmQgMTAwXCIpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLndlaWdodHMuZ2V0KHRva2VuSWQpID09PSB3ZWlnaHQpIHJldHVybjtcbiAgICB0aGlzLndlaWdodHMuc2V0KHRva2VuSWQsIHdlaWdodCk7XG4gICAgdGhpcy5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgcmVtb3ZlVG9rZW4odG9rZW5JZDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLndlaWdodHMuZGVsZXRlKHRva2VuSWQpKSByZXR1cm47XG4gICAgdGhpcy5jdXJyZW50U2NvcmVzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICB0aGlzLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICByZXNldFNjb3JlcygpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRTY29yZXMuY2xlYXIoKTtcbiAgfVxuXG4gIHNlbGVjdChlbGlnaWJsZVRva2VuSWRzOiBSZWFkb25seVNldDxudW1iZXI+KTogbnVtYmVyIHwgbnVsbCB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsuLi5lbGlnaWJsZVRva2VuSWRzXVxuICAgICAgLmZpbHRlcigodG9rZW5JZCkgPT4gdGhpcy53ZWlnaHRzLmhhcyh0b2tlbklkKSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYSAtIGIpO1xuXG4gICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIGxldCBzZWxlY3RlZCA9IGNhbmRpZGF0ZXNbMF0hO1xuICAgIGxldCBzZWxlY3RlZFNjb3JlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgIGxldCB0b3RhbFdlaWdodCA9IDA7XG5cbiAgICBjYW5kaWRhdGVzLmZvckVhY2goKHRva2VuSWQpID0+IHtcbiAgICAgIGNvbnN0IHdlaWdodCA9IHRoaXMud2VpZ2h0cy5nZXQodG9rZW5JZCkhO1xuICAgICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0O1xuICAgICAgY29uc3Qgc2NvcmUgPSAodGhpcy5jdXJyZW50U2NvcmVzLmdldCh0b2tlbklkKSA/PyAwKSArIHdlaWdodDtcbiAgICAgIHRoaXMuY3VycmVudFNjb3Jlcy5zZXQodG9rZW5JZCwgc2NvcmUpO1xuXG4gICAgICBpZiAoc2NvcmUgPiBzZWxlY3RlZFNjb3JlKSB7XG4gICAgICAgIHNlbGVjdGVkID0gdG9rZW5JZDtcbiAgICAgICAgc2VsZWN0ZWRTY29yZSA9IHNjb3JlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5jdXJyZW50U2NvcmVzLnNldChzZWxlY3RlZCwgc2VsZWN0ZWRTY29yZSAtIHRvdGFsV2VpZ2h0KTtcblxuICAgIHJldHVybiBzZWxlY3RlZDtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUEsSUFBYSwyQkFBYixNQUFzQztDQUNwQywwQkFBbUIsSUFBSSxJQUFvQjtDQUMzQyxnQ0FBeUIsSUFBSSxJQUFvQjtDQUVqRCxTQUFTLFNBQWlCLFFBQXNCO0VBQzlDLElBQUksQ0FBQyxPQUFPLFVBQVUsTUFBTSxLQUFLLFNBQVMsS0FBSyxTQUFTLEtBQ3RELE1BQU0sSUFBSSxXQUFXLDZDQUE2QztFQUdwRSxJQUFJLEtBQUssUUFBUSxJQUFJLE9BQU8sTUFBTSxRQUFRO0VBQzFDLEtBQUssUUFBUSxJQUFJLFNBQVMsTUFBTTtFQUNoQyxLQUFLLFlBQVk7Q0FDbkI7Q0FFQSxZQUFZLFNBQXVCO0VBQ2pDLElBQUksQ0FBQyxLQUFLLFFBQVEsT0FBTyxPQUFPLEdBQUc7RUFDbkMsS0FBSyxjQUFjLE9BQU8sT0FBTztFQUNqQyxLQUFLLFlBQVk7Q0FDbkI7Q0FFQSxjQUFvQjtFQUNsQixLQUFLLGNBQWMsTUFBTTtDQUMzQjtDQUVBLE9BQU8sa0JBQXNEO0VBQzNELE1BQU0sYUFBYSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FDckMsUUFBUSxZQUFZLEtBQUssUUFBUSxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQzlDLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQztFQUUzQixJQUFJLFdBQVcsV0FBVyxHQUFHLE9BQU87RUFFcEMsSUFBSSxXQUFXLFdBQVc7RUFDMUIsSUFBSSxnQkFBZ0IsT0FBTztFQUMzQixJQUFJLGNBQWM7RUFFbEIsV0FBVyxTQUFTLFlBQVk7R0FDOUIsTUFBTSxTQUFTLEtBQUssUUFBUSxJQUFJLE9BQU87R0FDdkMsZUFBZTtHQUNmLE1BQU0sU0FBUyxLQUFLLGNBQWMsSUFBSSxPQUFPLEtBQUssS0FBSztHQUN2RCxLQUFLLGNBQWMsSUFBSSxTQUFTLEtBQUs7R0FFckMsSUFBSSxRQUFRLGVBQWU7SUFDekIsV0FBVztJQUNYLGdCQUFnQjtHQUNsQjtFQUNGLENBQUM7RUFFRCxLQUFLLGNBQWMsSUFBSSxVQUFVLGdCQUFnQixXQUFXO0VBRTVELE9BQU87Q0FDVDtBQUNGIn0=