@cartanova/qgrid-cli 2.7.6 → 2.7.9

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 (86) hide show
  1. package/bundle/dist/application/qgrid/qgrid.frame.js +67 -30
  2. package/bundle/dist/application/qgrid/qgrid.types.js +6 -3
  3. package/bundle/dist/application/qgrid/token-trigger-setup.js +3 -2
  4. package/bundle/dist/application/qgrid/token-window-keepalive.js +10 -4
  5. package/bundle/dist/application/request-log/request-log.model.js +2 -2
  6. package/bundle/dist/application/setting/setting.constant.js +8 -4
  7. package/bundle/dist/application/setting/setting.model.js +4 -3
  8. package/bundle/dist/application/setting/setting.store.js +2 -2
  9. package/bundle/dist/application/setting/setting.types.js +4 -2
  10. package/bundle/dist/application/sonamu.generated.js +5 -3
  11. package/bundle/dist/application/sonamu.generated.sso.js +3 -2
  12. package/bundle/dist/application/token/token.model.js +7 -2
  13. package/bundle/dist/application/token/token.types.js +3 -2
  14. package/bundle/dist/i18n/sd.generated.js +2 -1
  15. package/bundle/dist/migrations/20260820153531_alter_tokens_add1_alter1.js +15 -0
  16. package/bundle/dist/sonamu.config.js +3 -1
  17. package/bundle/dist/utils/providers/openai/openai-callback-relay.js +86 -0
  18. package/bundle/dist/utils/providers/openai/openai-quota.js +4 -3
  19. package/bundle/src/application/qgrid/qgrid-oauth-redirect.test.ts +71 -8
  20. package/bundle/src/application/qgrid/qgrid.frame.test.ts +52 -0
  21. package/bundle/src/application/qgrid/qgrid.frame.ts +74 -26
  22. package/bundle/src/application/qgrid/qgrid.types.ts +4 -1
  23. package/bundle/src/application/qgrid/token-trigger-setup.test.ts +6 -0
  24. package/bundle/src/application/qgrid/token-trigger-setup.ts +2 -1
  25. package/bundle/src/application/qgrid/token-window-keepalive.test.ts +23 -2
  26. package/bundle/src/application/qgrid/token-window-keepalive.ts +13 -3
  27. package/bundle/src/application/request-log/request-log.model.test.ts +25 -0
  28. package/bundle/src/application/request-log/request-log.model.ts +3 -1
  29. package/bundle/src/application/setting/setting.constant.test.ts +2 -2
  30. package/bundle/src/application/setting/setting.constant.ts +8 -3
  31. package/bundle/src/application/setting/setting.model.ts +13 -2
  32. package/bundle/src/application/setting/setting.store.ts +2 -2
  33. package/bundle/src/application/setting/setting.types.ts +2 -0
  34. package/bundle/src/application/sonamu.generated.http +9 -4
  35. package/bundle/src/application/sonamu.generated.sso.ts +1 -0
  36. package/bundle/src/application/sonamu.generated.ts +3 -0
  37. package/bundle/src/application/token/token.entity.json +8 -1
  38. package/bundle/src/application/token/token.model.test.ts +29 -0
  39. package/bundle/src/application/token/token.model.ts +10 -1
  40. package/bundle/src/application/token/token.types.test.ts +10 -0
  41. package/bundle/src/application/token/token.types.ts +1 -0
  42. package/bundle/src/i18n/sd.generated.ts +1 -0
  43. package/bundle/src/migrations/20260820153531_alter_tokens_add1_alter1.ts +15 -0
  44. package/bundle/src/sonamu.config.ts +2 -0
  45. package/bundle/src/utils/providers/openai/openai-callback-relay.test.ts +109 -0
  46. package/bundle/src/utils/providers/openai/openai-callback-relay.ts +105 -0
  47. package/bundle/src/utils/providers/openai/openai-quota.test.ts +31 -0
  48. package/bundle/src/utils/providers/openai/openai-quota.ts +8 -2
  49. package/bundle/web-dist/client/assets/index-BshX4Gd8.css +1 -0
  50. package/bundle/web-dist/client/assets/{index-BbOyk01G.js → index-D59Q_9Z4.js} +4 -4
  51. package/bundle/web-dist/client/assets/{logs-B7Pc88bf.js → logs-BHVfI8ut.js} +1 -1
  52. package/bundle/web-dist/client/assets/{monit-CzMV4lZf.js → monit-EkLxH1oN.js} +1 -1
  53. package/bundle/web-dist/client/assets/{routes-COWTRxZo.js → routes-Kbvuclip.js} +2 -2
  54. package/bundle/web-dist/client/assets/{services.generated-CA7oRRYY.js → services.generated-Da1Eq5_R.js} +1 -1
  55. package/bundle/web-dist/client/assets/settings-B4uTFP3J.js +1 -0
  56. package/bundle/web-dist/client/assets/{show-YvdybkKd.js → show-BjIdSPTd.js} +1 -1
  57. package/bundle/web-dist/client/assets/tokens-BbCSxbFu.js +1 -0
  58. package/bundle/web-dist/client/assets/use-oauth-login-flow-4OltfVAd.js +1 -0
  59. package/bundle/web-dist/client/assets/use-update-token-mutation-CZ57EKA1.js +1 -0
  60. package/bundle/web-dist/client/index.html +3 -3
  61. package/bundle/web-dist/server/assets/{lazyRouteComponent-tS-rTksX.js → lazyRouteComponent-V1S8gqMS.js} +2 -2
  62. package/bundle/web-dist/server/assets/{logs-ttf79emP.js → logs-2Tkqcncq.js} +2 -2
  63. package/bundle/web-dist/server/assets/{monit-CJBUH0l6.js → monit-DrJ15xJL.js} +2 -2
  64. package/bundle/web-dist/server/assets/{plus-BuSuoeon.js → plus-DCai02Na.js} +1 -1
  65. package/bundle/web-dist/server/assets/{react-dom-7_SqhNWR.js → react-dom-BFiG5Daf.js} +1 -1
  66. package/bundle/web-dist/server/assets/{routes-z79f1sOM.js → routes-Ct3I9263.js} +7 -5
  67. package/bundle/web-dist/server/assets/{services.generated-B5UkNmgc.js → services.generated-y7xVOTCo.js} +4 -2
  68. package/bundle/web-dist/server/assets/{settings-CIYR7h3G.js → settings-JznSjwGQ.js} +79 -5
  69. package/bundle/web-dist/server/assets/{show-CLrA4ZQ-.js → show-D8kuAFbc.js} +2 -2
  70. package/bundle/web-dist/server/assets/{tokens-BwlkZELV.js → tokens-PR42jF1J.js} +6 -4
  71. package/bundle/web-dist/server/assets/{use-oauth-login-flow-B2QllVMi.js → use-oauth-login-flow-C-33Z5HA.js} +18 -17
  72. package/bundle/web-dist/server/assets/use-update-token-mutation-BNaRPVaX.js +7 -0
  73. package/bundle/web-dist/server/entry-server.generated.js +10 -10
  74. package/dist/cli.js +10 -11
  75. package/package.json +1 -1
  76. package/skills/qgrid/references/ai-sdk-provider-contract.md +2 -0
  77. package/skills/qgrid/references/cli-env-and-server-boot.md +2 -1
  78. package/skills/qgrid/references/openai-codex-runtime.md +12 -5
  79. package/skills/qgrid/references/request-log-run-lifecycle.md +2 -0
  80. package/skills/qgrid/references/sonamu-api-web-flow.md +2 -0
  81. package/skills/qgrid/references/token-auth-quota-lifecycle.md +27 -1
  82. package/bundle/web-dist/client/assets/index-D9xE_tO7.css +0 -1
  83. package/bundle/web-dist/client/assets/settings-Dpaosy-o.js +0 -1
  84. package/bundle/web-dist/client/assets/tokens-DynVDx0c.js +0 -1
  85. package/bundle/web-dist/client/assets/use-oauth-login-flow-OzmHElsE.js +0 -1
  86. /package/bundle/web-dist/client/assets/{plus-DqBd6gHk.js → plus-p4vtg6LN.js} +0 -0
@@ -265,6 +265,7 @@ const entityLabels = {
265
265
  "entity.Token.ord": "정렬 순서",
266
266
  "entity.Token.quota_threshold": "quota 사용률 임계치(%). null이면 미설정",
267
267
  "entity.Token.weight": "가중 라운드로빈 라우팅 가중치 (1..100)",
268
+ "entity.Token.keepalive_enabled": "Anthropic 5시간 토큰 윈도우 keepalive 사용 여부",
268
269
  "enum.TokenOrderBy.id-desc": "ID최신순",
269
270
  "enum.TokenOrderBy.ord-asc": "순서순",
270
271
  "enum.TokenSearchField.id": "ID",
@@ -388,4 +389,4 @@ SD.enumLabels = (enumName) => {
388
389
  //#endregion
389
390
  export { SD, defineLocale, localizedColumn };
390
391
 
391
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QuZ2VuZXJhdGVkLmpzIiwibmFtZXMiOlsia28iLCJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pMThuL3NkLmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImtvXCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9IFtcImtvXCIsIFwiZW5cIl0gYXMgY29uc3Q7XG5mdW5jdGlvbiBnZXRDdXJyZW50TG9jYWxlKCk6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0ge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmV0dXJuIChjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cblxuaW1wb3J0IGVuIGZyb20gXCIuL2VuXCI7XG5pbXBvcnQga28gZnJvbSBcIi4va29cIjtcblxuLy8gcmVhY3QtY29tcG9uZW50cyBpMThuIGtleXNcbmNvbnN0IHJjS2V5c0tvID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwi66Gc65SpIOykkS4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIuyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLmFzeW5jU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gQ29tYm9ib3ggQ29tcG9uZW50XG4gIFwicmMuY29tYm9ib3gubm9SZXN1bHRzXCI6IFwi6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5jb21ib2JveC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIuyEoO2Dne2VmOyEuOyalC4uLlwiLFxuXG4gIC8vIERhdGVQaWNrZXIgQ29tcG9uZW50XG4gIFwicmMuZGF0ZVBpY2tlci5waWNrRGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwi64Kg7KecIOy2lOqwgFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIuq4sOqwhFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcblxuICAvLyBGaWxlSW5wdXQgQ29tcG9uZW50XG4gIFwicmMuZmlsZUlucHV0LmJyb3dzZUZpbGVzXCI6IFwi7YyM7J28IOywvuq4sFwiLFxuICBcInJjLmZpbGVJbnB1dC5kcm9wWm9uZVwiOiBcIu2MjOydvOydhCDrk5zrnpjqt7jtlZjqsbDrgpgg7YG066at7ZWY7JesIOyXheuhnOuTnFwiLFxuICBcInJjLmZpbGVJbnB1dC5maWxlUGxhY2Vob2xkZXJcIjogXCLtjIzsnbxcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIuydtOuvuOyngFwiLFxuICBcInJjLmZpbGVJbnB1dC5tYXhGaWxlc0V4Y2VlZGVkXCI6IChtYXhGaWxlczogbnVtYmVyKSA9PlxuICAgIGDstZzrjIAgJHttYXhGaWxlc33qsJwg7YyM7J2866eMIOyXheuhnOuTnCDqsIDriqXtlanri4jri6RgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwi64yA6riwIOykkVwiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCLsoJzqsbBcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwi7JeF66Gc65OcIOyLpO2MqFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCLsl4XroZzrk5wg7KSRLi4uXCIsXG5cbiAgLy8gTW9udGhQaWNrZXJNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmFkZE1vbnRoXCI6IFwi7JuUIOy2lOqwgFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuZGF0ZVJhbmdlXCI6IFwi6riw6rCEXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwi7KKF66OM7J28XCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5wbGFjZWhvbGRlclwiOiBcIuyblCDshKDtg51cIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnN0YXJ0RGF0ZVwiOiBcIuyLnOyekeydvFwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwi7KCE7LK0IO2VtOygnFwiLFxuICBcInJjLm11bHRpU2VsZWN0LmNsb3NlXCI6IFwi64ur6riwXCIsXG4gIFwicmMubXVsdGlTZWxlY3QubW9yZUl0ZW1zXCI6IChjb3VudDogbnVtYmVyKSA9PiBgKyR7Y291bnR96rCcIOuNlOuztOq4sGAsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zXCI6IFwi7Ji17IWY7J20IOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm5vT3B0aW9uc1NlbGVjdGVkXCI6IFwi7ISg7YOd65CcIOyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR96rCcIOyYteyFmGAsXG4gIFwicmMubXVsdGlTZWxlY3Quc2VsZWN0QWxsXCI6IFwi7KCE7LK0IOyEoO2DnVwiLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gUGFnaW5hdGlvbiBDb21wb25lbnRcbiAgXCJyYy5wYWdpbmF0aW9uLm5leHRcIjogXCLri6TsnYxcIixcbiAgXCJyYy5wYWdpbmF0aW9uLnByZXZpb3VzXCI6IFwi7J207KCEXCIsXG4gIFwicmMucGFnaW5hdGlvbi5zaG93aW5nXCI6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT5cbiAgICBgJHt0b3RhbH3qsJwg7KSRICR7c3RhcnR9LSR7ZW5kfWAsXG5cbiAgLy8gQ2FsZW5kYXIgQ29tcG9uZW50XG4gIFwicmMuY2FsZW5kYXIubW9udGguMFwiOiBcIjHsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xXCI6IFwiMuyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCIz7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguM1wiOiBcIjTsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC40XCI6IFwiNeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjVcIjogXCI27JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguNlwiOiBcIjfsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC43XCI6IFwiOOyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCI57JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguOVwiOiBcIjEw7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguMTBcIjogXCIxMeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjExXCI6IFwiMTLsm5RcIixcblxuICAvLyBTb25hbXUgRmlsdGVyIENvbXBvbmVudFxuICBcInJjLnNvbmFtdUZpbHRlci50aXRsZVwiOiBcIuyGjOuCmOustCDtlYTthLBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbHlcIjogXCLsoIHsmqlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCLstIjquLDtmZRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYWRkUnVsZVwiOiBcIuq3nOy5mSDstpTqsIBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAn7JWE7KeBIOq3nOy5meydtCDsl4bsirXri4jri6QuIFwiKyDqt5zsuZkg7LaU6rCAXCLrpbwg7YG066at7ZWY7JesIOyLnOyeke2VmOyEuOyalC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIu2VhOuTnCDshKDtg51cIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc2VsZWN0T3BlcmF0b3JcIjogXCLsl7DsgrDsnpAg7ISg7YOdXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCLrqLzsoIAg7Jew7IKw7J6Q66W8IOyEoO2Dne2VmOyEuOyalFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlclZhbHVlXCI6IFwi6rCSIOyeheugpVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlck51bWJlclwiOiBcIuyIq+yekCDsnoXroKVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm90U3VwcG9ydGVkXCI6IFwi7KeA7JuQ7ZWY7KeAIOyViuydjFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zdGFydERhdGVcIjogXCLsi5zsnpHsnbxcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW5kRGF0ZVwiOiBcIuyiheujjOydvFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hcHBsaWVkRmlsdGVyc1wiOiBcIvCfjLIg7KCB7Jqp65CcIOyGjOuCmOustCDtlYTthLBcIixcblxuICAvLyBDb21tb25cbiAgXCJyYy5jb21tb24uY2FuY2VsXCI6IFwi7Leo7IaMXCIsXG4gIFwicmMuY29tbW9uLnNhdmVcIjogXCLsoIDsnqVcIixcbn07XG5cbmNvbnN0IHJjS2V5c0VuID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwiTG9hZGluZy4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIk5vIG9wdGlvbnNcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuYXN5bmNTZWxlY3Quc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBDb21ib2JveCBDb21wb25lbnRcbiAgXCJyYy5jb21ib2JveC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuY29tYm9ib3guc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBEYXRlUGlja2VyIENvbXBvbmVudFxuICBcInJjLmRhdGVQaWNrZXIucGlja0RhdGVcIjogXCJQaWNrIGRhdGVcIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVBpY2tlci5zZWxlY3REYXRlXCI6IFwiU2VsZWN0IGRhdGVcIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwiQWRkIGRhdGVcIixcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5kYXRlUmFuZ2VcIjogXCJSYW5nZVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVNlbGVjdG9yTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuXG4gIC8vIEZpbGVJbnB1dCBDb21wb25lbnRcbiAgXCJyYy5maWxlSW5wdXQuYnJvd3NlRmlsZXNcIjogXCJCcm93c2UgZmlsZXNcIixcbiAgXCJyYy5maWxlSW5wdXQuZHJvcFpvbmVcIjogXCJEcmFnIGZpbGVzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkXCIsXG4gIFwicmMuZmlsZUlucHV0LmZpbGVQbGFjZWhvbGRlclwiOiBcIkZpbGVcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIkltYWdlXCIsXG4gIFwicmMuZmlsZUlucHV0Lm1heEZpbGVzRXhjZWVkZWRcIjogKG1heEZpbGVzOiBudW1iZXIpID0+IGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwiUGVuZGluZ1wiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCJSZW1vdmVcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwiVXBsb2FkIGZhaWxlZFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCJVcGxvYWRpbmcuLi5cIixcblxuICAvLyBNb250aFBpY2tlck11bHRpcGxlIENvbXBvbmVudFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuYWRkTW9udGhcIjogXCJBZGQgbW9udGhcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIlJhbmdlXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBtb250aFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwiQ2xlYXIgYWxsXCIsXG4gIFwicmMubXVsdGlTZWxlY3QuY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm1vcmVJdGVtc1wiOiAoY291bnQ6IG51bWJlcikgPT4gYCske2NvdW50fSBtb3JlYCxcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub09wdGlvbnNcIjogXCJObyBvcHRpb25zXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zU2VsZWN0ZWRcIjogXCJObyBvcHRpb25zIHNlbGVjdGVkXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9SZXN1bHRzXCI6IFwiTm8gcmVzdWx0c1wiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR9IG9wdGlvbnNgLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdEFsbFwiOiBcIlNlbGVjdCBhbGxcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIlNlbGVjdC4uLlwiLFxuXG4gIC8vIFBhZ2luYXRpb24gQ29tcG9uZW50XG4gIFwicmMucGFnaW5hdGlvbi5uZXh0XCI6IFwiTmV4dFwiLFxuICBcInJjLnBhZ2luYXRpb24ucHJldmlvdXNcIjogXCJQcmV2aW91c1wiLFxuICBcInJjLnBhZ2luYXRpb24uc2hvd2luZ1wiOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgYFNob3dpbmcgJHtzdGFydH0tJHtlbmR9IG9mICR7dG90YWx9YCxcblxuICAvLyBDYWxlbmRhciBDb21wb25lbnRcbiAgXCJyYy5jYWxlbmRhci5tb250aC4wXCI6IFwiSmFudWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjFcIjogXCJGZWJydWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCJNYXJjaFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjNcIjogXCJBcHJpbFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjRcIjogXCJNYXlcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC41XCI6IFwiSnVuZVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjZcIjogXCJKdWx5XCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguN1wiOiBcIkF1Z3VzdFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCJTZXB0ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC45XCI6IFwiT2N0b2JlclwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjEwXCI6IFwiTm92ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xMVwiOiBcIkRlY2VtYmVyXCIsXG5cbiAgLy8gU29uYW11IEZpbHRlciBDb21wb25lbnRcbiAgXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIjogXCJTb25hbXUgRmlsdGVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmFwcGx5XCI6IFwiQXBwbHlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hZGRSdWxlXCI6IFwiQWRkIFJ1bGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAnTm8gcnVsZXMgeWV0LiBDbGljayBcIisgQWRkIFJ1bGVcIiB0byBzdGFydC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIlNlbGVjdCBmaWVsZFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RPcGVyYXRvclwiOiBcIk9wZXJhdG9yXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCJTZWxlY3Qgb3BlcmF0b3IgZmlyc3RcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW50ZXJWYWx1ZVwiOiBcIkVudGVyIHZhbHVlXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmVudGVyTnVtYmVyXCI6IFwiRW50ZXIgbnVtYmVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLm5vdFN1cHBvcnRlZFwiOiBcIk5vdCBzdXBwb3J0ZWRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbGllZEZpbHRlcnNcIjogXCLwn4yyIEFwcGxpZWQgU29uYW11RmlsdGVyc1wiLFxuXG4gIC8vIENvbW1vblxuICBcInJjLmNvbW1vbi5jYW5jZWxcIjogXCJDYW5jZWxcIixcbiAgXCJyYy5jb21tb24uc2F2ZVwiOiBcIlNhdmVcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGVudGl0eS5qc29u7JeQ7IScIOy2lOy2nO2VnCBlbnRpdHkgbGFiZWxzIChkZWZhdWx0TG9jYWxlIOyghOyaqSlcbmNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1wiOiBcIlJlcXVlc3RMb2dcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRva2VuX25hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucHJvamVjdF9uYW1lXCI6IFwi7ZSE66Gc7KCd7Yq4IOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLm1vZGVsX25hbWVcIjogXCLrqqjrjbgg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IOydtOumhCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN5c3RlbV9wcm9tcHRcIjogXCLsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVzcG9uc2VcIjogXCJsbG0g7J2R64u1IOyghOusuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5kdXJhdGlvbl9tc1wiOiBcIuydkeuLtSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudHRmdF9tc1wiOiBcImZpcnN0IGdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3RfdXNkXCI6IFwiQVBJIOu5hOyaqVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlL21peGVkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmltYWdlX2Nvc3RfdXNkXCI6IFwi7J2066+47KeAIOyDneyEsSDstpTsoJUg67mE7JqpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaW1hZ2VfY29zdF9tZXRob2RcIjogXCLsnbTrr7jsp4Ag67mE7JqpIOy2lOyglSDrsKnsi51cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lZmZvcnRcIjogXCJlZmZvcnQgbGV2ZWxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5oaXN0b3J5XCI6IFwiaW5qZWN0X2l0ZW1zIO2eiOyKpO2GoOumrFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRvb2xzXCI6IFwi7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOygleydmCDrqqnroZ1cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5qc29uX3NjaGVtYVwiOlxuICAgIFwic3RydWN0dXJlZCBvdXRwdXQg7JqU7LKt7J2YIEpTT04gU2NoZW1hIOybkOusuCAoZGV0YWlsIOydmCByZXNwb25zZSDtg4DsnoUg7ZGc7Iuc7JqpKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN0YXR1c1wiOiBcIuyLpO2WiSDsg4Htg5xcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lcnJvcl9tZXNzYWdlXCI6IFwi7JeQ65+sIOuplOyLnOyngFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnJlc3BvbnNlX2pzb25fb2tcIjpcbiAgICBcInN0cnVjdHVyZWQoanNvblNjaGVtYSkg7JqU7LKt7J2YIOydkeuLtSBKU09OIO2MjOyLsSDshLHqs7Ug7Jes67aALiDruYRzdHJ1Y3R1cmVkIOyalOyyreydgCBudWxsXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudG9vbF9jYWxsX2NvdW50XCI6IFwidG9vbCBjYWxsIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlzX2ltYWdlX2dlbmVyYXRpb25cIjogXCLsnbTrr7jsp4Ag7IOd7ISxIHR1cm4g7Jes67aAIChxdW90YSDqt4Dsho3smqkpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaXNfc3RydWN0dXJlZFwiOiBcInN0cnVjdHVyZWQgb3V0cHV0KGpzb25TY2hlbWEpIOyalOyyrSDsl6zrtoAgKOuqqeuhnSDqtazrtoQg7ZGc7Iuc7JqpKVwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pZC1hc2NcIjogXCJJROyYpOuemOuQnOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY3JlYXRlZF9hdC1kZXNjXCI6IFwi65Ox66Gd7J287Iuc7LWc7Iug7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jcmVhdGVkX2F0LWFzY1wiOiBcIuuTseuhneydvOyLnOyYpOuemOuQnOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkudHRmdF9tcy1kZXNjXCI6IFwiVFRGVOq4tOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkudHRmdF9tcy1hc2NcIjogXCJUVEZU7Ken7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5kdXJhdGlvbl9tcy1kZXNjXCI6IFwi7IaM7JqU7Iuc6rCE6ri07IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5kdXJhdGlvbl9tcy1hc2NcIjogXCLshozsmpTsi5zqsITsp6fsnYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmlucHV0X3Rva2Vucy1kZXNjXCI6IFwi7J6F66Cl7Yag7YGw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pbnB1dF90b2tlbnMtYXNjXCI6IFwi7J6F66Cl7Yag7YGw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5vdXRwdXRfdG9rZW5zLWRlc2NcIjogXCLstpzroKXthqDtgbDrp47snYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5Lm91dHB1dF90b2tlbnMtYXNjXCI6IFwi7Lac66Cl7Yag7YGw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9yZWFkX3Rva2Vucy1kZXNjXCI6IFwi7LqQ7Iuc7J296riw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9yZWFkX3Rva2Vucy1hc2NcIjogXCLsupDsi5zsnb3quLDsoIHsnYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmNhY2hlX2NyZWF0aW9uX3Rva2Vucy1kZXNjXCI6IFwi7LqQ7Iuc7IOd7ISx66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9jcmVhdGlvbl90b2tlbnMtYXNjXCI6IFwi7LqQ7Iuc7IOd7ISx7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jb3N0X3VzZC1kZXNjXCI6IFwi67mE7Jqp64aS7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jb3N0X3VzZC1hc2NcIjogXCLruYTsmqnrgq7snYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU2VhcmNoRmllbGQudG9rZW5fbmFtZVwiOiBcIu2GoO2BsOydtOumhFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1NlYXJjaEZpZWxkLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0YXR1cy5ydW5uaW5nXCI6IFwi7Iuk7ZaJIOykkVwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0YXR1cy5zdWNjZWVkZWRcIjogXCLshLHqs7VcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuZXJyb3JcIjogXCLsl5Drn6xcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuYWJvcnRlZFwiOiBcIuykkeuLqFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcFwiOiBcIlJlcXVlc3RMb2dTdGVwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZXF1ZXN0X2xvZ1wiOiBcIuu2gOuqqCByZXF1ZXN0IGxvZyBJRFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5zdGVwX2luZGV4XCI6IFwiYWktc2RrIHN0ZXAgbnVtYmVyICgwLWJhc2VkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50eXBlXCI6IFwic3RlcCDtg4DsnoVcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAubW9kZWxfbmFtZVwiOiBcIuyLpOygnCBzZXJ2aW5nIOuqqOuNuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiOiBcIuyalOyyrSDrqqjrjbggKGZhbGxiYWNrIOyghClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZmFsbGJhY2tfY291bnRcIjogXCLrqqjrjbggZmFsbGJhY2sg7Zqf7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbAgKGdlbmVyYXRlKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsCAoZ2VuZXJhdGUpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCI6IFwi7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCI6IFwiNeu2hCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY29zdF91c2RcIjogXCJzdGVwIOu5hOyaqSAobWljcm8tVVNEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jb3N0X3NvdXJjZVwiOiBcIuu5hOyaqSDstpzsspgocHJvdmlkZXIvcHJpY2luZ190YWJsZSlcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZHVyYXRpb25fbXNcIjogXCLshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnR0ZnRfbXNcIjogXCJHZW4gVFRGVChtcylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZmluaXNoX3JlYXNvblwiOiBcIuyZhOujjCDsgqzsnKBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVhc29uaW5nX3RleHRcIjogXCJyZWFzb25pbmcg7YWN7Iqk7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlYXNvbmluZ190b2tlbnNcIjogXCJyZWFzb25pbmcg7Yag7YGwIOyImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX2NhbGxfaW5kZXhcIjogXCLqsJnsnYAgc3RlcCDrgrQgdG9vbCBjYWxsIOyInOyEnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX2NhbGxfaWRcIjogXCJ0b29sIGNhbGwgSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9uYW1lXCI6IFwidG9vbCDsnbTrpoRcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9hcmdzXCI6IFwidG9vbCDsnbjsnpAgKEpTT04gc3RyaW5nKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX3Jlc3VsdFwiOiBcInRvb2wg6rKw6rO8IChKU09OIHN0cmluZylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9kdXJhdGlvbl9tc1wiOiBcInRvb2wg7Iuk7ZaJIOyGjOyalOyLnOqwhChtcylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZXJyb3JcIjogXCJzdGVwIOyXkOufrCDrqZTsi5zsp4BcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwVHlwZS5nZW5lcmF0ZVwiOiBcIkxMTSDsg53shLFcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwVHlwZS50b29sX2NhbGxcIjogXCJUb29sIO2YuOy2nFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBPcmRlckJ5LmlkLWFzY1wiOiBcIklE7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuU2V0dGluZ1wiOiBcIlNldHRpbmdcIixcbiAgXCJlbnRpdHkuU2V0dGluZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlNldHRpbmcuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5TZXR0aW5nLmtleVwiOiBcIuyEpOyglSDtgqQgKOyYiDogc2xhY2suZW5hYmxlZClcIixcbiAgXCJlbnRpdHkuU2V0dGluZy52YWx1ZVwiOiBcIuyEpOyglSDqsJIgKOusuOyekOyXtCDsoIDsnqUsIOyVseyXkOyEnCDtjIzsi7HCt+qygOymnSlcIixcbiAgXCJlbnRpdHkuU2V0dGluZy51cGRhdGVkX2F0XCI6IFwi7LWc7KKFIOyImOygleydvOyLnFwiLFxuICBcImVudW0uU2V0dGluZ09yZGVyQnkua2V5LWFzY1wiOiBcIu2CpOyInFwiLFxuICBcImVudW0uU2V0dGluZ1NlYXJjaEZpZWxkLmtleVwiOiBcIu2CpFwiLFxuICBcImVudGl0eS5Ub2tlblwiOiBcIlRva2VuXCIsXG4gIFwiZW50aXR5LlRva2VuLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuVG9rZW4uY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5Ub2tlbi5wcm92aWRlclwiOiBcIu2UhOuhnOuwlOydtOuNlFwiLFxuICBcImVudGl0eS5Ub2tlbi5jcmVkZW50aWFsc1wiOiBcIuyduOymnSDsoJXrs7QgKEpTT05CKVwiLFxuICBcImVudGl0eS5Ub2tlbi5uYW1lXCI6IFwi7Yag7YGwIOydtOumhFwiLFxuICBcImVudGl0eS5Ub2tlbi5hY3RpdmVcIjogXCLtmZzshLEg7Jes67aAXCIsXG4gIFwiZW50aXR5LlRva2VuLm9yZFwiOiBcIuygleugrCDsiJzshJxcIixcbiAgXCJlbnRpdHkuVG9rZW4ucXVvdGFfdGhyZXNob2xkXCI6IFwicXVvdGEg7IKs7Jqp66WgIOyehOqzhOy5mCglKS4gbnVsbOydtOuptCDrr7jshKTsoJVcIixcbiAgXCJlbnRpdHkuVG9rZW4ud2VpZ2h0XCI6IFwi6rCA7KSRIOudvOyatOuTnOuhnOu5iCDrnbzsmrDtjIUg6rCA7KSR7LmYICgxLi4xMDApXCIsXG4gIFwiZW51bS5Ub2tlbk9yZGVyQnkuaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIsXG4gIFwiZW51bS5Ub2tlbk9yZGVyQnkub3JkLWFzY1wiOiBcIuyInOyEnOyInFwiLFxuICBcImVudW0uVG9rZW5TZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW51bS5Ub2tlblNlYXJjaEZpZWxkLm5hbWVcIjogXCLsnbTrpoRcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGRlZmF1bHRMb2NhbGXsnZggZGljdGlvbmFyeeulvCDquLDspIDsnLzroZwg7YKkIOy2lOy2nFxudHlwZSBSQ0tleXMgPSB0eXBlb2YgcmNLZXlzS287XG50eXBlIFByb2plY3REaWN0aW9uYXJ5ID0gdHlwZW9mIGtvO1xudHlwZSBFbnRpdHlMYWJlbHMgPSB0eXBlb2YgZW50aXR5TGFiZWxzO1xudHlwZSBSYXdNZXJnZWREaWN0aW9uYXJ5ID0gUkNLZXlzICZcbiAgT21pdDxFbnRpdHlMYWJlbHMsIGtleW9mIChSQ0tleXMgJiBQcm9qZWN0RGljdGlvbmFyeSk+ICZcbiAgUHJvamVjdERpY3Rpb25hcnk7XG5cbi8vIO2CpOuKlCDsnKDsp4DtlZjrkJgsIOqwkiDtg4DsnoXsnYAgc3RyaW5nIOuYkOuKlCDtlajsiJjroZwg7J2867CY7ZmUICjri6TrpbggbG9jYWxl7J2YIOumrO2EsOuftCDtg4DsnoUg7Lap64+MIOuwqeyngClcbmV4cG9ydCB0eXBlIE1lcmdlZERpY3Rpb25hcnkgPSB7XG4gIFtLIGluIGtleW9mIFJhd01lcmdlZERpY3Rpb25hcnldOiBSYXdNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICAgID8gKC4uLmFyZ3M6IFApID0+IHN0cmluZ1xuICAgIDogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIERpY3RLZXkgPSBrZXlvZiBNZXJnZWREaWN0aW9uYXJ5O1xuZXhwb3J0IHR5cGUgTG9jYWxpemVkU3RyaW5nID0gc3RyaW5nICYgeyBfX2JyYW5kOiBcIkxvY2FsaXplZFN0cmluZ1wiIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVMb2NhbGUoZGljdDogUGFydGlhbDxNZXJnZWREaWN0aW9uYXJ5Pikge1xuICByZXR1cm4gZGljdDtcbn1cblxuLy8g6rCBIGxvY2FsZeuzhOuhnCByYy1rZXlzICsgZW50aXR5IGxhYmVscyArIO2UhOuhnOygne2KuCBkaWN0IO2Vqey5qFxuY29uc3QgZGljdGlvbmFyaWVzOiBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsPE1lcmdlZERpY3Rpb25hcnk+PiA9IHtcbiAga286IHsgLi4ucmNLZXlzS28sIC4uLmVudGl0eUxhYmVscywgLi4ua28gfSxcbiAgZW46IHsgLi4ucmNLZXlzRW4sIC4uLmVuIH0sXG59O1xuXG50eXBlIFNEUmV0dXJuVHlwZTxLIGV4dGVuZHMgRGljdEtleT4gPSBNZXJnZWREaWN0aW9uYXJ5W0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIFApID0+IHN0cmluZ1xuICA/ICguLi5hcmdzOiBQKSA9PiBMb2NhbGl6ZWRTdHJpbmdcbiAgOiBMb2NhbGl6ZWRTdHJpbmc7XG5cbmZ1bmN0aW9uIGdldERpY3RWYWx1ZTxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLLCBsb2NhbGU6IHN0cmluZyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIC8vIDEuIOyngOygleuQnCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGNvbnN0IGRpY3QgPSBkaWN0aW9uYXJpZXNbbG9jYWxlXTtcbiAgaWYgKGRpY3Q/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdFtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMi4gZGVmYXVsdCBsb2NhbGXsl5DshJwg7KGw7ZqMXG4gIGlmIChsb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFICYmIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gZGljdGlvbmFyaWVzW0RFRkFVTFRfTE9DQUxFXVtrZXldIGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xuICB9XG5cbiAgLy8gMy4gc3VwcG9ydGVkIGxvY2FsZXMg7Iic7ZqMXG4gIGZvciAoY29uc3Qgc3VwcG9ydGVkTG9jYWxlIG9mIFNVUFBPUlRFRF9MT0NBTEVTKSB7XG4gICAgaWYgKHN1cHBvcnRlZExvY2FsZSAhPT0gbG9jYWxlICYmIHN1cHBvcnRlZExvY2FsZSAhPT0gREVGQVVMVF9MT0NBTEUpIHtcbiAgICAgIGlmIChkaWN0aW9uYXJpZXNbc3VwcG9ydGVkTG9jYWxlXT8uW2tleV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyA0LiDrqqjrkZAg7Iuk7YyoIOyLnCBrZXkg67CY7ZmYXG4gIHJldHVybiBrZXkgYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG59XG5cbi8qKlxuICogU29uYW11IERpY3Rpb25hcnkg7ZWo7IiYXG4gKiBsb2NhbGXsl5Ag66ee64qUIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRChcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCLsoIDsnqVcIiAoTG9jYWxpemVkU3RyaW5nKVxuICogU0QoXCJ1c2VyLm5vdEZvdW5kXCIpKDEpICAvLyDihpIgXCLsobTsnqztlZjsp4Ag7JWK64qUIFVzZXIgSUQgMVwiIChMb2NhbGl6ZWRTdHJpbmcpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBTRDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+IHtcbiAgY29uc3QgbG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbn1cblxuLyoqXG4gKiDtirnsoJUgbG9jYWxl7J2YIOuyiOyXrSDthY3siqTtirjrpbwg67CY7ZmY7ZWY64qUIO2VqOyImOulvCDsg53shLHtlanri4jri6QuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IEVOID0gU0QubG9jYWxlKFwiZW5cIik7XG4gKiBFTihcImNvbW1vbi5zYXZlXCIpICAvLyDihpIgXCJTYXZlXCJcbiAqL1xuU0QubG9jYWxlID1cbiAgKGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT5cbiAgPEsgZXh0ZW5kcyBEaWN0S2V5PihrZXk6IEspOiBTRFJldHVyblR5cGU8Sz4gPT4ge1xuICAgIHJldHVybiBnZXREaWN0VmFsdWUoa2V5LCBsb2NhbGUpO1xuICB9O1xuXG4vLyBMb2NhbGl6ZWQg6rCA64ql7ZWcIENvbHVtbiDtg4DsnoUg6rOE7IKwXG50eXBlIExvY2FsaXplZEJhc2VDb2x1bW48VD4gPSB7XG4gIFtLIGluIGtleW9mIFQgJiBzdHJpbmddOiBLIGV4dGVuZHMgYCR7aW5mZXIgQmFzZX1fJHsodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdfWBcbiAgICA/IEJhc2VcbiAgICA6IEs7XG59W2tleW9mIFQgJiBzdHJpbmddO1xuXG4vKipcbiAqIGxvY2FsZeyXkCDrlLDrnbwg7KCB7KCI7ZWcIOy7rOufvCDqsJLsnYQg67CY7ZmY7ZWp64uI64ukLlxuICogRELsl5AgbmFtZSwgbmFtZV9rbywgbmFtZV9lbuyymOufvCBsb2NhbGl6ZWQgY29sdW1u7J20IOyeiOydhCDrlYwg7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIOyasOyEoOyInOychCAo7KeA7JuQIOuhnOy8gOydvOydgCBrby9qcC9lbuydtOqzoCwg7ISc67mE7Iqk7J2YIOq4sOuzuCDroZzsvIDsnbzsnYAga28sIOyCrOyaqeyekOydmCDroZzsvIDsnbzsnYAganDsnbwg65WMKTogY29sdW1uX2pwIOKGkiBjb2x1bW4g4oaSIGNvbHVtbl9rbyDihpIgY29sdW1uX2VuXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGVuLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGtv7J28IOuVjCk6IGNvbHVtbl9rbyDihpIgY29sdW1uIOKGkiBjb2x1bW5fZW4g4oaSIGNvbHVtbl9qcFxuICpcbiAqIEBleGFtcGxlXG4gKiBsb2NhbGl6ZWRDb2x1bW4odGFnLCBcIm5hbWVcIilcbiAqL1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBiaWdpbnQ7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlID0gc3RyaW5nIHwgc3RyaW5nW107XG50eXBlIE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPFY+ID0gViBleHRlbmRzIHN0cmluZ1xuICA/IHN0cmluZ1xuICA6IFYgZXh0ZW5kcyByZWFkb25seSBzdHJpbmdbXVxuICAgID8gc3RyaW5nW11cbiAgICA6IFYgZXh0ZW5kcyBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50XG4gICAgICA/IHN0cmluZ1xuICAgICAgOiBWIGV4dGVuZHMgUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgaW5mZXIgTFY+PlxuICAgICAgICA/IE5lc3RlZExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxMVj5cbiAgICAgICAgOiBuZXZlcjtcbnR5cGUgTG9jYWxpemVkQ29sdW1uQ2FuZGlkYXRlPFQsIEsgZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCAoSyBleHRlbmRzIGtleW9mIFQgPyBUW0tdIDogbmV2ZXIpXG4gIHwge1xuICAgICAgW0wgaW4gKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV06IGAke0t9XyR7TH1gIGV4dGVuZHMga2V5b2YgVFxuICAgICAgICA/IFRbYCR7S31fJHtMfWBdXG4gICAgICAgIDogbmV2ZXI7XG4gICAgfVsodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdXTtcbnR5cGUgTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEsgZXh0ZW5kcyBzdHJpbmc+ID1cbiAgfCBMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208TG9jYWxpemVkQ29sdW1uQ2FuZGlkYXRlPFQsIEs+PlxuICB8IHVuZGVmaW5lZDtcbnR5cGUgTG9jYWxlVmFsdWVNYXAgPSBQYXJ0aWFsPFJlY29yZDwodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLCB1bmtub3duPj47XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5WYWx1ZSB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiIHx8XG4gICAgKEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KChpdGVtKSA9PiB0eXBlb2YgaXRlbSA9PT0gXCJzdHJpbmdcIikpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSB7XG4gIHJldHVybiBbXCJzdHJpbmdcIiwgXCJudW1iZXJcIiwgXCJib29sZWFuXCIsIFwiYmlnaW50XCJdLmluY2x1ZGVzKHR5cGVvZiB2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQgfCBcIlwiIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGdldE5lc3RlZExvY2FsZVZhbHVlPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4+KFxuICByb3c6IFQsXG4gIGNvbHVtbjogSyxcbiAgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdLFxuKTogdW5rbm93biB7XG4gIGNvbnN0IGNvbHVtblZhbHVlID0gcm93W2NvbHVtbl07XG4gIGlmIChjb2x1bW5WYWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgY29sdW1uVmFsdWUgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShjb2x1bW5WYWx1ZSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIChjb2x1bW5WYWx1ZSBhcyBMb2NhbGVWYWx1ZU1hcClbbG9jYWxlXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2FsaXplZENvbHVtbjxcbiAgVCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBLIGV4dGVuZHMgTG9jYWxpemVkQmFzZUNvbHVtbjxUPixcbj4ocm93OiBULCBjb2x1bW46IEspOiBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz4ge1xuICBjb25zdCBjdXJyZW50TG9jYWxlID0gZ2V0Q3VycmVudExvY2FsZSgpO1xuICBjb25zdCBsb2NhbGUgPSBTVVBQT1JURURfTE9DQUxFUy5pbmNsdWRlcyhjdXJyZW50TG9jYWxlKSA/IGN1cnJlbnRMb2NhbGUgOiBERUZBVUxUX0xPQ0FMRTtcbiAgY29uc3Qgb3RoZXJMb2NhbGVzID0gU1VQUE9SVEVEX0xPQ0FMRVMuZmlsdGVyKFxuICAgIChsOiBzdHJpbmcpID0+IGwgIT09IGxvY2FsZSAmJiBsICE9PSBERUZBVUxUX0xPQ0FMRSxcbiAgKTtcbiAgY29uc3QgbG9jYWxpemVkS2V5ID0gKGNvbHVtbjogSywgbG9jYWxlOiAodHlwZW9mIFNVUFBPUlRFRF9MT0NBTEVTKVtudW1iZXJdKSA9PlxuICAgIGAke2NvbHVtbn1fJHtsb2NhbGV9YDtcbiAgY29uc3QgdmFsdWVzID0gW1xuICAgIHsgdmFsdWU6IHJvd1tsb2NhbGl6ZWRLZXkoY29sdW1uLCBsb2NhbGUpXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGxvY2FsZSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIHsgdmFsdWU6IHJvd1tjb2x1bW5dLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgREVGQVVMVF9MT0NBTEUpXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIERFRkFVTFRfTE9DQUxFKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgLi4ub3RoZXJMb2NhbGVzLmZsYXRNYXAoKGwpID0+IFtcbiAgICAgIHsgdmFsdWU6IHJvd1tsb2NhbGl6ZWRLZXkoY29sdW1uLCBsKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgICAgeyB2YWx1ZTogZ2V0TmVzdGVkTG9jYWxlVmFsdWUocm93LCBjb2x1bW4sIGwpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICBdKSxcbiAgXTtcblxuICBmb3IgKGNvbnN0IHsgdmFsdWUsIHNvdXJjZSB9IG9mIHZhbHVlcykge1xuICAgIGlmICghaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSAmJiBpc0xvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgc291cmNlID09PSBcImRpcmVjdFwiICYmXG4gICAgICAhaXNFbXB0eUxvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlKSAmJlxuICAgICAgaXNMb2NhbGl6ZWRDb2x1bW5TY2FsYXJWYWx1ZSh2YWx1ZSlcbiAgICApIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpIGFzIExvY2FsaXplZENvbHVtblJldHVybjxULCBLPjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEVudW3snZggbG9jYWxpemVkIGxhYmVsc+ulvCBQcm94eeuhnCDrsJjtmZjtlanri4jri6QuXG4gKiBTZWxlY3Qg7Lu07Y+s64SM7Yq4IOuTseyXkOyEnCBFbnVtTGFiZWxba2V5XSDrjIDsi6Ag7IKs7Jqp7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBTRC5lbnVtTGFiZWxzKFwiVGFnT3JkZXJCeVwiKVtrZXldICAvLyDihpIg7ZiE7J6sIGxvY2FsZeydmCDrnbzrsqhcbiAqL1xuU0QuZW51bUxhYmVscyA9IChlbnVtTmFtZTogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiA9PiB7XG4gIHJldHVybiBuZXcgUHJveHkoe30gYXMgUmVjb3JkPHN0cmluZywgTG9jYWxpemVkU3RyaW5nPiwge1xuICAgIGdldChfLCBrZXk6IHN0cmluZyB8IHN5bWJvbCkge1xuICAgICAgaWYgKHR5cGVvZiBrZXkgPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGljdEtleSA9IGBlbnVtLiR7ZW51bU5hbWV9LiR7a2V5fWAgYXMgRGljdEtleTtcbiAgICAgIHJldHVybiBnZXREaWN0VmFsdWUoZGljdEtleSwgZ2V0Q3VycmVudExvY2FsZSgpKTtcbiAgICB9LFxuICB9KTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBT0EsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxvQkFBb0IsQ0FBQyxNQUFNLElBQUk7QUFDckMsU0FBUyxtQkFBdUQ7Q0FDOUQsSUFBSTtFQUVGLE9BRFksT0FBTyxXQUNYLENBQUEsQ0FBSSxVQUFpRDtDQUMvRCxRQUFRO0VBQ04sT0FBTztDQUNUO0FBQ0Y7QUFNQSxNQUFNLFdBQVc7Q0FFZiwwQkFBMEI7Q0FDMUIsNEJBQTRCO0NBQzVCLDRCQUE0QjtDQUM1QixvQ0FBb0M7Q0FHcEMseUJBQXlCO0NBQ3pCLGlD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
392
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2QuZ2VuZXJhdGVkLmpzIiwibmFtZXMiOlsia28iLCJlbiJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pMThuL3NkLmdlbmVyYXRlZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBnZW5lcmF0ZWRcbiAqIOyngeygkSDsiJjsoJXtlZjsp4Ag66eI7IS47JqULlxuICovXG5cbmltcG9ydCB7IFNvbmFtdSB9IGZyb20gXCJzb25hbXVcIjtcblxuY29uc3QgREVGQVVMVF9MT0NBTEUgPSBcImtvXCIgYXMgY29uc3Q7XG5jb25zdCBTVVBQT1JURURfTE9DQUxFUyA9IFtcImtvXCIsIFwiZW5cIl0gYXMgY29uc3Q7XG5mdW5jdGlvbiBnZXRDdXJyZW50TG9jYWxlKCk6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0ge1xuICB0cnkge1xuICAgIGNvbnN0IGN0eCA9IFNvbmFtdS5nZXRDb250ZXh0KCk7XG4gICAgcmV0dXJuIChjdHgubG9jYWxlIGFzICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID8/IERFRkFVTFRfTE9DQUxFO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gREVGQVVMVF9MT0NBTEU7XG4gIH1cbn1cblxuaW1wb3J0IGVuIGZyb20gXCIuL2VuXCI7XG5pbXBvcnQga28gZnJvbSBcIi4va29cIjtcblxuLy8gcmVhY3QtY29tcG9uZW50cyBpMThuIGtleXNcbmNvbnN0IHJjS2V5c0tvID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwi66Gc65SpIOykkS4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIuyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLmFzeW5jU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gQ29tYm9ib3ggQ29tcG9uZW50XG4gIFwicmMuY29tYm9ib3gubm9SZXN1bHRzXCI6IFwi6rKA7IOJIOqysOqzvOqwgCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5jb21ib2JveC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIuyEoO2Dne2VmOyEuOyalC4uLlwiLFxuXG4gIC8vIERhdGVQaWNrZXIgQ29tcG9uZW50XG4gIFwicmMuZGF0ZVBpY2tlci5waWNrRGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVQaWNrZXIuc2VsZWN0RGF0ZVwiOiBcIuuCoOynnCDshKDtg51cIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwi64Kg7KecIOy2lOqwgFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIuq4sOqwhFwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwi64Kg7KecIOyEoO2DnVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcblxuICAvLyBGaWxlSW5wdXQgQ29tcG9uZW50XG4gIFwicmMuZmlsZUlucHV0LmJyb3dzZUZpbGVzXCI6IFwi7YyM7J28IOywvuq4sFwiLFxuICBcInJjLmZpbGVJbnB1dC5kcm9wWm9uZVwiOiBcIu2MjOydvOydhCDrk5zrnpjqt7jtlZjqsbDrgpgg7YG066at7ZWY7JesIOyXheuhnOuTnFwiLFxuICBcInJjLmZpbGVJbnB1dC5maWxlUGxhY2Vob2xkZXJcIjogXCLtjIzsnbxcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIuydtOuvuOyngFwiLFxuICBcInJjLmZpbGVJbnB1dC5tYXhGaWxlc0V4Y2VlZGVkXCI6IChtYXhGaWxlczogbnVtYmVyKSA9PlxuICAgIGDstZzrjIAgJHttYXhGaWxlc33qsJwg7YyM7J2866eMIOyXheuhnOuTnCDqsIDriqXtlanri4jri6RgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwi64yA6riwIOykkVwiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCLsoJzqsbBcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwi7JeF66Gc65OcIOyLpO2MqFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCLsl4XroZzrk5wg7KSRLi4uXCIsXG5cbiAgLy8gTW9udGhQaWNrZXJNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmFkZE1vbnRoXCI6IFwi7JuUIOy2lOqwgFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuZGF0ZVJhbmdlXCI6IFwi6riw6rCEXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwi7KKF66OM7J28XCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5wbGFjZWhvbGRlclwiOiBcIuyblCDshKDtg51cIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnNpbmdsZURhdGVcIjogXCLri6jsnbxcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnN0YXJ0RGF0ZVwiOiBcIuyLnOyekeydvFwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwi7KCE7LK0IO2VtOygnFwiLFxuICBcInJjLm11bHRpU2VsZWN0LmNsb3NlXCI6IFwi64ur6riwXCIsXG4gIFwicmMubXVsdGlTZWxlY3QubW9yZUl0ZW1zXCI6IChjb3VudDogbnVtYmVyKSA9PiBgKyR7Y291bnR96rCcIOuNlOuztOq4sGAsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zXCI6IFwi7Ji17IWY7J20IOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm5vT3B0aW9uc1NlbGVjdGVkXCI6IFwi7ISg7YOd65CcIOyYteyFmOydtCDsl4bsirXri4jri6RcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub1Jlc3VsdHNcIjogXCLqsoDsg4kg6rKw6rO86rCAIOyXhuyKteuLiOuLpFwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR96rCcIOyYteyFmGAsXG4gIFwicmMubXVsdGlTZWxlY3Quc2VsZWN0QWxsXCI6IFwi7KCE7LK0IOyEoO2DnVwiLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdFBsYWNlaG9sZGVyXCI6IFwi7ISg7YOd7ZWY7IS47JqULi4uXCIsXG5cbiAgLy8gUGFnaW5hdGlvbiBDb21wb25lbnRcbiAgXCJyYy5wYWdpbmF0aW9uLm5leHRcIjogXCLri6TsnYxcIixcbiAgXCJyYy5wYWdpbmF0aW9uLnByZXZpb3VzXCI6IFwi7J207KCEXCIsXG4gIFwicmMucGFnaW5hdGlvbi5zaG93aW5nXCI6IChzdGFydDogbnVtYmVyLCBlbmQ6IG51bWJlciwgdG90YWw6IG51bWJlcikgPT5cbiAgICBgJHt0b3RhbH3qsJwg7KSRICR7c3RhcnR9LSR7ZW5kfWAsXG5cbiAgLy8gQ2FsZW5kYXIgQ29tcG9uZW50XG4gIFwicmMuY2FsZW5kYXIubW9udGguMFwiOiBcIjHsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xXCI6IFwiMuyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCIz7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguM1wiOiBcIjTsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC40XCI6IFwiNeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjVcIjogXCI27JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguNlwiOiBcIjfsm5RcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC43XCI6IFwiOOyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCI57JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguOVwiOiBcIjEw7JuUXCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguMTBcIjogXCIxMeyblFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjExXCI6IFwiMTLsm5RcIixcblxuICAvLyBTb25hbXUgRmlsdGVyIENvbXBvbmVudFxuICBcInJjLnNvbmFtdUZpbHRlci50aXRsZVwiOiBcIuyGjOuCmOustCDtlYTthLBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbHlcIjogXCLsoIHsmqlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCLstIjquLDtmZRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYWRkUnVsZVwiOiBcIuq3nOy5mSDstpTqsIBcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAn7JWE7KeBIOq3nOy5meydtCDsl4bsirXri4jri6QuIFwiKyDqt5zsuZkg7LaU6rCAXCLrpbwg7YG066at7ZWY7JesIOyLnOyeke2VmOyEuOyalC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIu2VhOuTnCDshKDtg51cIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc2VsZWN0T3BlcmF0b3JcIjogXCLsl7DsgrDsnpAg7ISg7YOdXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCLrqLzsoIAg7Jew7IKw7J6Q66W8IOyEoO2Dne2VmOyEuOyalFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlclZhbHVlXCI6IFwi6rCSIOyeheugpVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbnRlck51bWJlclwiOiBcIuyIq+yekCDsnoXroKVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm90U3VwcG9ydGVkXCI6IFwi7KeA7JuQ7ZWY7KeAIOyViuydjFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zdGFydERhdGVcIjogXCLsi5zsnpHsnbxcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW5kRGF0ZVwiOiBcIuyiheujjOydvFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hcHBsaWVkRmlsdGVyc1wiOiBcIvCfjLIg7KCB7Jqp65CcIOyGjOuCmOustCDtlYTthLBcIixcblxuICAvLyBDb21tb25cbiAgXCJyYy5jb21tb24uY2FuY2VsXCI6IFwi7Leo7IaMXCIsXG4gIFwicmMuY29tbW9uLnNhdmVcIjogXCLsoIDsnqVcIixcbn07XG5cbmNvbnN0IHJjS2V5c0VuID0ge1xuICAvLyBBc3luY1NlbGVjdCBDb21wb25lbnRcbiAgXCJyYy5hc3luY1NlbGVjdC5sb2FkaW5nXCI6IFwiTG9hZGluZy4uLlwiLFxuICBcInJjLmFzeW5jU2VsZWN0Lm5vT3B0aW9uc1wiOiBcIk5vIG9wdGlvbnNcIixcbiAgXCJyYy5hc3luY1NlbGVjdC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuYXN5bmNTZWxlY3Quc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBDb21ib2JveCBDb21wb25lbnRcbiAgXCJyYy5jb21ib2JveC5ub1Jlc3VsdHNcIjogXCJObyByZXN1bHRzXCIsXG4gIFwicmMuY29tYm9ib3guc2VsZWN0UGxhY2Vob2xkZXJcIjogXCJTZWxlY3QuLi5cIixcblxuICAvLyBEYXRlUGlja2VyIENvbXBvbmVudFxuICBcInJjLmRhdGVQaWNrZXIucGlja0RhdGVcIjogXCJQaWNrIGRhdGVcIixcbiAgXCJyYy5kYXRlUGlja2VyLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVBpY2tlci5zZWxlY3REYXRlXCI6IFwiU2VsZWN0IGRhdGVcIixcblxuICAvLyBEYXRlU2VsZWN0b3JNdWx0aXBsZSBDb21wb25lbnRcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5hZGREYXRlXCI6IFwiQWRkIGRhdGVcIixcbiAgXCJyYy5kYXRlU2VsZWN0b3JNdWx0aXBsZS5kYXRlUmFuZ2VcIjogXCJSYW5nZVwiLFxuICBcInJjLmRhdGVTZWxlY3Rvck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBkYXRlXCIsXG4gIFwicmMuZGF0ZVNlbGVjdG9yTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuXG4gIC8vIEZpbGVJbnB1dCBDb21wb25lbnRcbiAgXCJyYy5maWxlSW5wdXQuYnJvd3NlRmlsZXNcIjogXCJCcm93c2UgZmlsZXNcIixcbiAgXCJyYy5maWxlSW5wdXQuZHJvcFpvbmVcIjogXCJEcmFnIGZpbGVzIGhlcmUgb3IgY2xpY2sgdG8gdXBsb2FkXCIsXG4gIFwicmMuZmlsZUlucHV0LmZpbGVQbGFjZWhvbGRlclwiOiBcIkZpbGVcIixcbiAgXCJyYy5maWxlSW5wdXQuaW1hZ2VQbGFjZWhvbGRlclwiOiBcIkltYWdlXCIsXG4gIFwicmMuZmlsZUlucHV0Lm1heEZpbGVzRXhjZWVkZWRcIjogKG1heEZpbGVzOiBudW1iZXIpID0+IGBNYXhpbXVtICR7bWF4RmlsZXN9IGZpbGVzIGFsbG93ZWRgLFxuICBcInJjLmZpbGVJbnB1dC5wZW5kaW5nXCI6IFwiUGVuZGluZ1wiLFxuICBcInJjLmZpbGVJbnB1dC5yZW1vdmVcIjogXCJSZW1vdmVcIixcbiAgXCJyYy5maWxlSW5wdXQudXBsb2FkRmFpbGVkXCI6IFwiVXBsb2FkIGZhaWxlZFwiLFxuICBcInJjLmZpbGVJbnB1dC51cGxvYWRpbmdcIjogXCJVcGxvYWRpbmcuLi5cIixcblxuICAvLyBNb250aFBpY2tlck11bHRpcGxlIENvbXBvbmVudFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuYWRkTW9udGhcIjogXCJBZGQgbW9udGhcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLmRhdGVSYW5nZVwiOiBcIlJhbmdlXCIsXG4gIFwicmMubW9udGhQaWNrZXJNdWx0aXBsZS5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5tb250aFBpY2tlck11bHRpcGxlLnBsYWNlaG9sZGVyXCI6IFwiUGljayBtb250aFwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc2luZ2xlRGF0ZVwiOiBcIlNpbmdsZVwiLFxuICBcInJjLm1vbnRoUGlja2VyTXVsdGlwbGUuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuXG4gIC8vIE11bHRpU2VsZWN0IENvbXBvbmVudFxuICBcInJjLm11bHRpU2VsZWN0LmNsZWFyXCI6IFwiQ2xlYXIgYWxsXCIsXG4gIFwicmMubXVsdGlTZWxlY3QuY2xvc2VcIjogXCJDbG9zZVwiLFxuICBcInJjLm11bHRpU2VsZWN0Lm1vcmVJdGVtc1wiOiAoY291bnQ6IG51bWJlcikgPT4gYCske2NvdW50fSBtb3JlYCxcbiAgXCJyYy5tdWx0aVNlbGVjdC5ub09wdGlvbnNcIjogXCJObyBvcHRpb25zXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9PcHRpb25zU2VsZWN0ZWRcIjogXCJObyBvcHRpb25zIHNlbGVjdGVkXCIsXG4gIFwicmMubXVsdGlTZWxlY3Qubm9SZXN1bHRzXCI6IFwiTm8gcmVzdWx0c1wiLFxuICBcInJjLm11bHRpU2VsZWN0Lm9wdGlvbnNDb3VudFwiOiAoY291bnQ6IG51bWJlcikgPT4gYCR7Y291bnR9IG9wdGlvbnNgLFxuICBcInJjLm11bHRpU2VsZWN0LnNlbGVjdEFsbFwiOiBcIlNlbGVjdCBhbGxcIixcbiAgXCJyYy5tdWx0aVNlbGVjdC5zZWxlY3RQbGFjZWhvbGRlclwiOiBcIlNlbGVjdC4uLlwiLFxuXG4gIC8vIFBhZ2luYXRpb24gQ29tcG9uZW50XG4gIFwicmMucGFnaW5hdGlvbi5uZXh0XCI6IFwiTmV4dFwiLFxuICBcInJjLnBhZ2luYXRpb24ucHJldmlvdXNcIjogXCJQcmV2aW91c1wiLFxuICBcInJjLnBhZ2luYXRpb24uc2hvd2luZ1wiOiAoc3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXIsIHRvdGFsOiBudW1iZXIpID0+XG4gICAgYFNob3dpbmcgJHtzdGFydH0tJHtlbmR9IG9mICR7dG90YWx9YCxcblxuICAvLyBDYWxlbmRhciBDb21wb25lbnRcbiAgXCJyYy5jYWxlbmRhci5tb250aC4wXCI6IFwiSmFudWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjFcIjogXCJGZWJydWFyeVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjJcIjogXCJNYXJjaFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjNcIjogXCJBcHJpbFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjRcIjogXCJNYXlcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC41XCI6IFwiSnVuZVwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjZcIjogXCJKdWx5XCIsXG4gIFwicmMuY2FsZW5kYXIubW9udGguN1wiOiBcIkF1Z3VzdFwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjhcIjogXCJTZXB0ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC45XCI6IFwiT2N0b2JlclwiLFxuICBcInJjLmNhbGVuZGFyLm1vbnRoLjEwXCI6IFwiTm92ZW1iZXJcIixcbiAgXCJyYy5jYWxlbmRhci5tb250aC4xMVwiOiBcIkRlY2VtYmVyXCIsXG5cbiAgLy8gU29uYW11IEZpbHRlciBDb21wb25lbnRcbiAgXCJyYy5zb25hbXVGaWx0ZXIudGl0bGVcIjogXCJTb25hbXUgRmlsdGVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmFwcGx5XCI6IFwiQXBwbHlcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIucmVzZXRcIjogXCJSZXNldFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5hZGRSdWxlXCI6IFwiQWRkIFJ1bGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIubm9SdWxlc1lldFwiOiAnTm8gcnVsZXMgeWV0LiBDbGljayBcIisgQWRkIFJ1bGVcIiB0byBzdGFydC4nLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RGaWVsZFwiOiBcIlNlbGVjdCBmaWVsZFwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5zZWxlY3RPcGVyYXRvclwiOiBcIk9wZXJhdG9yXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLnNlbGVjdE9wZXJhdG9yRmlyc3RcIjogXCJTZWxlY3Qgb3BlcmF0b3IgZmlyc3RcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuZW50ZXJWYWx1ZVwiOiBcIkVudGVyIHZhbHVlXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLmVudGVyTnVtYmVyXCI6IFwiRW50ZXIgbnVtYmVyXCIsXG4gIFwicmMuc29uYW11RmlsdGVyLm5vdFN1cHBvcnRlZFwiOiBcIk5vdCBzdXBwb3J0ZWRcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuc3RhcnREYXRlXCI6IFwiU3RhcnQgZGF0ZVwiLFxuICBcInJjLnNvbmFtdUZpbHRlci5lbmREYXRlXCI6IFwiRW5kIGRhdGVcIixcbiAgXCJyYy5zb25hbXVGaWx0ZXIuYXBwbGllZEZpbHRlcnNcIjogXCLwn4yyIEFwcGxpZWQgU29uYW11RmlsdGVyc1wiLFxuXG4gIC8vIENvbW1vblxuICBcInJjLmNvbW1vbi5jYW5jZWxcIjogXCJDYW5jZWxcIixcbiAgXCJyYy5jb21tb24uc2F2ZVwiOiBcIlNhdmVcIixcbn0gYXMgY29uc3Q7XG5cbi8vIGVudGl0eS5qc29u7JeQ7IScIOy2lOy2nO2VnCBlbnRpdHkgbGFiZWxzIChkZWZhdWx0TG9jYWxlIOyghOyaqSlcbmNvbnN0IGVudGl0eUxhYmVscyA9IHtcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1wiOiBcIlJlcXVlc3RMb2dcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRva2VuX25hbWVcIjogXCLthqDtgbAg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucHJvamVjdF9uYW1lXCI6IFwi7ZSE66Gc7KCd7Yq4IOydtOumhFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLm1vZGVsX25hbWVcIjogXCLrqqjrjbgg7J2066aEXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVxdWVzdGVkX21vZGVsX25hbWVcIjogXCLsmpTssq0g66qo6424IOydtOumhCAoZmFsbGJhY2sg7KCEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmZhbGxiYWNrX2NvdW50XCI6IFwi66qo6424IGZhbGxiYWNrIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN5c3RlbV9wcm9tcHRcIjogXCLsi5zsiqTthZwg7ZSE66Gs7ZSE7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cucmVzcG9uc2VcIjogXCJsbG0g7J2R64u1IOyghOusuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5jYWNoZV9jcmVhdGlvbl90b2tlbnNcIjogXCLsupDsi5wg7IOd7ISxIO2GoO2BsFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNhY2hlX2NyZWF0aW9uXzVtX3Rva2Vuc1wiOiBcIjXrtoQgVFRMIOy6kOyLnCDsg53shLEg7Yag7YGwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5kdXJhdGlvbl9tc1wiOiBcIuydkeuLtSDshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudHRmdF9tc1wiOiBcImZpcnN0IGdlbiBUVEZUKG1zKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3RfdXNkXCI6IFwiQVBJIOu5hOyaqVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmNvc3Rfc291cmNlXCI6IFwi67mE7JqpIOy2nOyymChwcm92aWRlci9wcmljaW5nX3RhYmxlL21peGVkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmltYWdlX2Nvc3RfdXNkXCI6IFwi7J2066+47KeAIOyDneyEsSDstpTsoJUg67mE7JqpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaW1hZ2VfY29zdF9tZXRob2RcIjogXCLsnbTrr7jsp4Ag67mE7JqpIOy2lOyglSDrsKnsi51cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lZmZvcnRcIjogXCJlZmZvcnQgbGV2ZWxcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5oaXN0b3J5XCI6IFwiaW5qZWN0X2l0ZW1zIO2eiOyKpO2GoOumrFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnRvb2xzXCI6IFwi7JqU7LKt7JeQIOyepeywqeuQnCB0b29sIOygleydmCDrqqnroZ1cIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5qc29uX3NjaGVtYVwiOlxuICAgIFwic3RydWN0dXJlZCBvdXRwdXQg7JqU7LKt7J2YIEpTT04gU2NoZW1hIOybkOusuCAoZGV0YWlsIOydmCByZXNwb25zZSDtg4DsnoUg7ZGc7Iuc7JqpKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnN0YXR1c1wiOiBcIuyLpO2WiSDsg4Htg5xcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZy5lcnJvcl9tZXNzYWdlXCI6IFwi7JeQ65+sIOuplOyLnOyngFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLnJlc3BvbnNlX2pzb25fb2tcIjpcbiAgICBcInN0cnVjdHVyZWQoanNvblNjaGVtYSkg7JqU7LKt7J2YIOydkeuLtSBKU09OIO2MjOyLsSDshLHqs7Ug7Jes67aALiDruYRzdHJ1Y3R1cmVkIOyalOyyreydgCBudWxsXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cudG9vbF9jYWxsX2NvdW50XCI6IFwidG9vbCBjYWxsIO2an+yImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nLmlzX2ltYWdlX2dlbmVyYXRpb25cIjogXCLsnbTrr7jsp4Ag7IOd7ISxIHR1cm4g7Jes67aAIChxdW90YSDqt4Dsho3smqkpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2cuaXNfc3RydWN0dXJlZFwiOiBcInN0cnVjdHVyZWQgb3V0cHV0KGpzb25TY2hlbWEpIOyalOyyrSDsl6zrtoAgKOuqqeuhnSDqtazrtoQg7ZGc7Iuc7JqpKVwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuaWQtZGVzY1wiOiBcIklE7LWc7Iug7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pZC1hc2NcIjogXCJJROyYpOuemOuQnOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkuY3JlYXRlZF9hdC1kZXNjXCI6IFwi65Ox66Gd7J287Iuc7LWc7Iug7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jcmVhdGVkX2F0LWFzY1wiOiBcIuuTseuhneydvOyLnOyYpOuemOuQnOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkudHRmdF9tcy1kZXNjXCI6IFwiVFRGVOq4tOyInFwiLFxuICBcImVudW0uUmVxdWVzdExvZ09yZGVyQnkudHRmdF9tcy1hc2NcIjogXCJUVEZU7Ken7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5kdXJhdGlvbl9tcy1kZXNjXCI6IFwi7IaM7JqU7Iuc6rCE6ri07IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5kdXJhdGlvbl9tcy1hc2NcIjogXCLshozsmpTsi5zqsITsp6fsnYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmlucHV0X3Rva2Vucy1kZXNjXCI6IFwi7J6F66Cl7Yag7YGw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5pbnB1dF90b2tlbnMtYXNjXCI6IFwi7J6F66Cl7Yag7YGw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5vdXRwdXRfdG9rZW5zLWRlc2NcIjogXCLstpzroKXthqDtgbDrp47snYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5Lm91dHB1dF90b2tlbnMtYXNjXCI6IFwi7Lac66Cl7Yag7YGw7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9yZWFkX3Rva2Vucy1kZXNjXCI6IFwi7LqQ7Iuc7J296riw66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9yZWFkX3Rva2Vucy1hc2NcIjogXCLsupDsi5zsnb3quLDsoIHsnYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dPcmRlckJ5LmNhY2hlX2NyZWF0aW9uX3Rva2Vucy1kZXNjXCI6IFwi7LqQ7Iuc7IOd7ISx66eO7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jYWNoZV9jcmVhdGlvbl90b2tlbnMtYXNjXCI6IFwi7LqQ7Iuc7IOd7ISx7KCB7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jb3N0X3VzZC1kZXNjXCI6IFwi67mE7Jqp64aS7J2A7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nT3JkZXJCeS5jb3N0X3VzZC1hc2NcIjogXCLruYTsmqnrgq7snYDsiJxcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTZWFyY2hGaWVsZC5pZFwiOiBcIklEXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU2VhcmNoRmllbGQudG9rZW5fbmFtZVwiOiBcIu2GoO2BsOydtOumhFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1NlYXJjaEZpZWxkLnVzZXJfcHJvbXB0XCI6IFwi7IKs7Jqp7J6QIO2UhOuhrO2UhO2KuFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0YXR1cy5ydW5uaW5nXCI6IFwi7Iuk7ZaJIOykkVwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0YXR1cy5zdWNjZWVkZWRcIjogXCLshLHqs7VcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuZXJyb3JcIjogXCLsl5Drn6xcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGF0dXMuYWJvcnRlZFwiOiBcIuykkeuLqFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcFwiOiBcIlJlcXVlc3RMb2dTdGVwXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZXF1ZXN0X2xvZ1wiOiBcIuu2gOuqqCByZXF1ZXN0IGxvZyBJRFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5zdGVwX2luZGV4XCI6IFwiYWktc2RrIHN0ZXAgbnVtYmVyICgwLWJhc2VkKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50eXBlXCI6IFwic3RlcCDtg4DsnoVcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAubW9kZWxfbmFtZVwiOiBcIuyLpOygnCBzZXJ2aW5nIOuqqOuNuFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5yZXF1ZXN0ZWRfbW9kZWxfbmFtZVwiOiBcIuyalOyyrSDrqqjrjbggKGZhbGxiYWNrIOyghClcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZmFsbGJhY2tfY291bnRcIjogXCLrqqjrjbggZmFsbGJhY2sg7Zqf7IiYXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmlucHV0X3Rva2Vuc1wiOiBcIuyeheugpSDthqDtgbAgKGdlbmVyYXRlKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5vdXRwdXRfdG9rZW5zXCI6IFwi7Lac66ClIO2GoO2BsCAoZ2VuZXJhdGUpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLmNhY2hlX3JlYWRfdG9rZW5zXCI6IFwi7LqQ7IucIOydveq4sCDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfY3JlYXRpb25fdG9rZW5zXCI6IFwi7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfY3JlYXRpb25fNW1fdG9rZW5zXCI6IFwiNeu2hCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY2FjaGVfY3JlYXRpb25fMWhfdG9rZW5zXCI6IFwiMeyLnOqwhCBUVEwg7LqQ7IucIOyDneyEsSDthqDtgbBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuY29zdF91c2RcIjogXCJzdGVwIOu5hOyaqSAobWljcm8tVVNEKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC5jb3N0X3NvdXJjZVwiOiBcIuu5hOyaqSDstpzsspgocHJvdmlkZXIvcHJpY2luZ190YWJsZSlcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZHVyYXRpb25fbXNcIjogXCLshozsmpTsi5zqsIQobXMpXCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnR0ZnRfbXNcIjogXCJHZW4gVFRGVChtcylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZmluaXNoX3JlYXNvblwiOiBcIuyZhOujjCDsgqzsnKBcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAucmVhc29uaW5nX3RleHRcIjogXCJyZWFzb25pbmcg7YWN7Iqk7Yq4XCIsXG4gIFwiZW50aXR5LlJlcXVlc3RMb2dTdGVwLnJlYXNvbmluZ190b2tlbnNcIjogXCJyZWFzb25pbmcg7Yag7YGwIOyImFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX2NhbGxfaW5kZXhcIjogXCLqsJnsnYAgc3RlcCDrgrQgdG9vbCBjYWxsIOyInOyEnFwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX2NhbGxfaWRcIjogXCJ0b29sIGNhbGwgSURcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9uYW1lXCI6IFwidG9vbCDsnbTrpoRcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9hcmdzXCI6IFwidG9vbCDsnbjsnpAgKEpTT04gc3RyaW5nKVwiLFxuICBcImVudGl0eS5SZXF1ZXN0TG9nU3RlcC50b29sX3Jlc3VsdFwiOiBcInRvb2wg6rKw6rO8IChKU09OIHN0cmluZylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAudG9vbF9kdXJhdGlvbl9tc1wiOiBcInRvb2wg7Iuk7ZaJIOyGjOyalOyLnOqwhChtcylcIixcbiAgXCJlbnRpdHkuUmVxdWVzdExvZ1N0ZXAuZXJyb3JcIjogXCJzdGVwIOyXkOufrCDrqZTsi5zsp4BcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwVHlwZS5nZW5lcmF0ZVwiOiBcIkxMTSDsg53shLFcIixcbiAgXCJlbnVtLlJlcXVlc3RMb2dTdGVwVHlwZS50b29sX2NhbGxcIjogXCJUb29sIO2YuOy2nFwiLFxuICBcImVudW0uUmVxdWVzdExvZ1N0ZXBPcmRlckJ5LmlkLWFzY1wiOiBcIklE7IicXCIsXG4gIFwiZW51bS5SZXF1ZXN0TG9nU3RlcFNlYXJjaEZpZWxkLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuU2V0dGluZ1wiOiBcIlNldHRpbmdcIixcbiAgXCJlbnRpdHkuU2V0dGluZy5pZFwiOiBcIklEXCIsXG4gIFwiZW50aXR5LlNldHRpbmcuY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5TZXR0aW5nLmtleVwiOiBcIuyEpOyglSDtgqQgKOyYiDogc2xhY2suZW5hYmxlZClcIixcbiAgXCJlbnRpdHkuU2V0dGluZy52YWx1ZVwiOiBcIuyEpOyglSDqsJIgKOusuOyekOyXtCDsoIDsnqUsIOyVseyXkOyEnCDtjIzsi7HCt+qygOymnSlcIixcbiAgXCJlbnRpdHkuU2V0dGluZy51cGRhdGVkX2F0XCI6IFwi7LWc7KKFIOyImOygleydvOyLnFwiLFxuICBcImVudW0uU2V0dGluZ09yZGVyQnkua2V5LWFzY1wiOiBcIu2CpOyInFwiLFxuICBcImVudW0uU2V0dGluZ1NlYXJjaEZpZWxkLmtleVwiOiBcIu2CpFwiLFxuICBcImVudGl0eS5Ub2tlblwiOiBcIlRva2VuXCIsXG4gIFwiZW50aXR5LlRva2VuLmlkXCI6IFwiSURcIixcbiAgXCJlbnRpdHkuVG9rZW4uY3JlYXRlZF9hdFwiOiBcIuuTseuhneydvOyLnFwiLFxuICBcImVudGl0eS5Ub2tlbi5wcm92aWRlclwiOiBcIu2UhOuhnOuwlOydtOuNlFwiLFxuICBcImVudGl0eS5Ub2tlbi5jcmVkZW50aWFsc1wiOiBcIuyduOymnSDsoJXrs7QgKEpTT05CKVwiLFxuICBcImVudGl0eS5Ub2tlbi5uYW1lXCI6IFwi7Yag7YGwIOydtOumhFwiLFxuICBcImVudGl0eS5Ub2tlbi5hY3RpdmVcIjogXCLtmZzshLEg7Jes67aAXCIsXG4gIFwiZW50aXR5LlRva2VuLm9yZFwiOiBcIuygleugrCDsiJzshJxcIixcbiAgXCJlbnRpdHkuVG9rZW4ucXVvdGFfdGhyZXNob2xkXCI6IFwicXVvdGEg7IKs7Jqp66WgIOyehOqzhOy5mCglKS4gbnVsbOydtOuptCDrr7jshKTsoJVcIixcbiAgXCJlbnRpdHkuVG9rZW4ud2VpZ2h0XCI6IFwi6rCA7KSRIOudvOyatOuTnOuhnOu5iCDrnbzsmrDtjIUg6rCA7KSR7LmYICgxLi4xMDApXCIsXG4gIFwiZW50aXR5LlRva2VuLmtlZXBhbGl2ZV9lbmFibGVkXCI6IFwiQW50aHJvcGljIDXsi5zqsIQg7Yag7YGwIOyciOuPhOyasCBrZWVwYWxpdmUg7IKs7JqpIOyXrOu2gFwiLFxuICBcImVudW0uVG9rZW5PcmRlckJ5LmlkLWRlc2NcIjogXCJJROy1nOyLoOyInFwiLFxuICBcImVudW0uVG9rZW5PcmRlckJ5Lm9yZC1hc2NcIjogXCLsiJzshJzsiJxcIixcbiAgXCJlbnVtLlRva2VuU2VhcmNoRmllbGQuaWRcIjogXCJJRFwiLFxuICBcImVudW0uVG9rZW5TZWFyY2hGaWVsZC5uYW1lXCI6IFwi7J2066aEXCIsXG59IGFzIGNvbnN0O1xuXG4vLyBkZWZhdWx0TG9jYWxl7J2YIGRpY3Rpb25hcnnrpbwg6riw7KSA7Jy866GcIO2CpCDstpTstpxcbnR5cGUgUkNLZXlzID0gdHlwZW9mIHJjS2V5c0tvO1xudHlwZSBQcm9qZWN0RGljdGlvbmFyeSA9IHR5cGVvZiBrbztcbnR5cGUgRW50aXR5TGFiZWxzID0gdHlwZW9mIGVudGl0eUxhYmVscztcbnR5cGUgUmF3TWVyZ2VkRGljdGlvbmFyeSA9IFJDS2V5cyAmXG4gIE9taXQ8RW50aXR5TGFiZWxzLCBrZXlvZiAoUkNLZXlzICYgUHJvamVjdERpY3Rpb25hcnkpPiAmXG4gIFByb2plY3REaWN0aW9uYXJ5O1xuXG4vLyDtgqTripQg7Jyg7KeA7ZWY65CYLCDqsJIg7YOA7J6F7J2AIHN0cmluZyDrmJDripQg7ZWo7IiY66GcIOydvOuwmO2ZlCAo64uk66W4IGxvY2FsZeydmCDrpqzthLDrn7Qg7YOA7J6FIOy2qeuPjCDrsKnsp4ApXG5leHBvcnQgdHlwZSBNZXJnZWREaWN0aW9uYXJ5ID0ge1xuICBbSyBpbiBrZXlvZiBSYXdNZXJnZWREaWN0aW9uYXJ5XTogUmF3TWVyZ2VkRGljdGlvbmFyeVtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBQKSA9PiBzdHJpbmdcbiAgICA/ICguLi5hcmdzOiBQKSA9PiBzdHJpbmdcbiAgICA6IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBEaWN0S2V5ID0ga2V5b2YgTWVyZ2VkRGljdGlvbmFyeTtcbmV4cG9ydCB0eXBlIExvY2FsaXplZFN0cmluZyA9IHN0cmluZyAmIHsgX19icmFuZDogXCJMb2NhbGl6ZWRTdHJpbmdcIiB9O1xuXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lTG9jYWxlKGRpY3Q6IFBhcnRpYWw8TWVyZ2VkRGljdGlvbmFyeT4pIHtcbiAgcmV0dXJuIGRpY3Q7XG59XG5cbi8vIOqwgSBsb2NhbGXrs4TroZwgcmMta2V5cyArIGVudGl0eSBsYWJlbHMgKyDtlITroZzsoJ3tirggZGljdCDtlansuahcbmNvbnN0IGRpY3Rpb25hcmllczogUmVjb3JkPHN0cmluZywgUGFydGlhbDxNZXJnZWREaWN0aW9uYXJ5Pj4gPSB7XG4gIGtvOiB7IC4uLnJjS2V5c0tvLCAuLi5lbnRpdHlMYWJlbHMsIC4uLmtvIH0sXG4gIGVuOiB7IC4uLnJjS2V5c0VuLCAuLi5lbiB9LFxufTtcblxudHlwZSBTRFJldHVyblR5cGU8SyBleHRlbmRzIERpY3RLZXk+ID0gTWVyZ2VkRGljdGlvbmFyeVtLXSBleHRlbmRzICguLi5hcmdzOiBpbmZlciBQKSA9PiBzdHJpbmdcbiAgPyAoLi4uYXJnczogUCkgPT4gTG9jYWxpemVkU3RyaW5nXG4gIDogTG9jYWxpemVkU3RyaW5nO1xuXG5mdW5jdGlvbiBnZXREaWN0VmFsdWU8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSywgbG9jYWxlOiBzdHJpbmcpOiBTRFJldHVyblR5cGU8Sz4ge1xuICAvLyAxLiDsp4DsoJXrkJwgbG9jYWxl7JeQ7IScIOyhsO2ajFxuICBjb25zdCBkaWN0ID0gZGljdGlvbmFyaWVzW2xvY2FsZV07XG4gIGlmIChkaWN0Py5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRpY3Rba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgfVxuXG4gIC8vIDIuIGRlZmF1bHQgbG9jYWxl7JeQ7IScIOyhsO2ajFxuICBpZiAobG9jYWxlICE9PSBERUZBVUxUX0xPQ0FMRSAmJiBkaWN0aW9uYXJpZXNbREVGQVVMVF9MT0NBTEVdPy5ba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGRpY3Rpb25hcmllc1tERUZBVUxUX0xPQ0FMRV1ba2V5XSBhcyB1bmtub3duIGFzIFNEUmV0dXJuVHlwZTxLPjtcbiAgfVxuXG4gIC8vIDMuIHN1cHBvcnRlZCBsb2NhbGVzIOyInO2ajFxuICBmb3IgKGNvbnN0IHN1cHBvcnRlZExvY2FsZSBvZiBTVVBQT1JURURfTE9DQUxFUykge1xuICAgIGlmIChzdXBwb3J0ZWRMb2NhbGUgIT09IGxvY2FsZSAmJiBzdXBwb3J0ZWRMb2NhbGUgIT09IERFRkFVTFRfTE9DQUxFKSB7XG4gICAgICBpZiAoZGljdGlvbmFyaWVzW3N1cHBvcnRlZExvY2FsZV0/LltrZXldICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGRpY3Rpb25hcmllc1tzdXBwb3J0ZWRMb2NhbGVdW2tleV0gYXMgdW5rbm93biBhcyBTRFJldHVyblR5cGU8Sz47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gNC4g66qo65GQIOyLpO2MqCDsi5wga2V5IOuwmO2ZmFxuICByZXR1cm4ga2V5IGFzIHVua25vd24gYXMgU0RSZXR1cm5UeXBlPEs+O1xufVxuXG4vKipcbiAqIFNvbmFtdSBEaWN0aW9uYXJ5IO2VqOyImFxuICogbG9jYWxl7JeQIOunnuuKlCDrsojsl60g7YWN7Iqk7Yq466W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogU0QoXCJjb21tb24uc2F2ZVwiKSAgLy8g4oaSIFwi7KCA7J6lXCIgKExvY2FsaXplZFN0cmluZylcbiAqIFNEKFwidXNlci5ub3RGb3VuZFwiKSgxKSAgLy8g4oaSIFwi7KG07J6s7ZWY7KeAIOyViuuKlCBVc2VyIElEIDFcIiAoTG9jYWxpemVkU3RyaW5nKVxuICovXG5leHBvcnQgZnVuY3Rpb24gU0Q8SyBleHRlbmRzIERpY3RLZXk+KGtleTogSyk6IFNEUmV0dXJuVHlwZTxLPiB7XG4gIGNvbnN0IGxvY2FsZSA9IGdldEN1cnJlbnRMb2NhbGUoKTtcbiAgcmV0dXJuIGdldERpY3RWYWx1ZShrZXksIGxvY2FsZSk7XG59XG5cbi8qKlxuICog7Yq57KCVIGxvY2FsZeydmCDrsojsl60g7YWN7Iqk7Yq466W8IOuwmO2ZmO2VmOuKlCDtlajsiJjrpbwg7IOd7ISx7ZWp64uI64ukLlxuICpcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBFTiA9IFNELmxvY2FsZShcImVuXCIpO1xuICogRU4oXCJjb21tb24uc2F2ZVwiKSAgLy8g4oaSIFwiU2F2ZVwiXG4gKi9cblNELmxvY2FsZSA9XG4gIChsb2NhbGU6ICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0pID0+XG4gIDxLIGV4dGVuZHMgRGljdEtleT4oa2V5OiBLKTogU0RSZXR1cm5UeXBlPEs+ID0+IHtcbiAgICByZXR1cm4gZ2V0RGljdFZhbHVlKGtleSwgbG9jYWxlKTtcbiAgfTtcblxuLy8gTG9jYWxpemVkIOqwgOuKpe2VnCBDb2x1bW4g7YOA7J6FIOqzhOyCsFxudHlwZSBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+ID0ge1xuICBbSyBpbiBrZXlvZiBUICYgc3RyaW5nXTogSyBleHRlbmRzIGAke2luZmVyIEJhc2V9XyR7KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXX1gXG4gICAgPyBCYXNlXG4gICAgOiBLO1xufVtrZXlvZiBUICYgc3RyaW5nXTtcblxuLyoqXG4gKiBsb2NhbGXsl5Ag65Sw6528IOyggeygiO2VnCDsu6zrn7wg6rCS7J2EIOuwmO2ZmO2VqeuLiOuLpC5cbiAqIERC7JeQIG5hbWUsIG5hbWVfa28sIG5hbWVfZW7sspjrn7wgbG9jYWxpemVkIGNvbHVtbuydtCDsnojsnYQg65WMIOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiDsmrDshKDsiJzsnIQgKOyngOybkCDroZzsvIDsnbzsnYAga28vanAvZW7snbTqs6AsIOyEnOu5hOyKpOydmCDquLDrs7gg66Gc7LyA7J287J2AIGtvLCDsgqzsmqnsnpDsnZgg66Gc7LyA7J287J2AIGpw7J28IOuVjCk6IGNvbHVtbl9qcCDihpIgY29sdW1uIOKGkiBjb2x1bW5fa28g4oaSIGNvbHVtbl9lblxuICog7Jqw7ISg7Iic7JyEICjsp4Dsm5Ag66Gc7LyA7J287J2AIGtvL2pwL2Vu7J206rOgLCDshJzruYTsiqTsnZgg6riw67O4IOuhnOy8gOydvOydgCBlbiwg7IKs7Jqp7J6Q7J2YIOuhnOy8gOydvOydgCBrb+ydvCDrlYwpOiBjb2x1bW5fa28g4oaSIGNvbHVtbiDihpIgY29sdW1uX2VuIOKGkiBjb2x1bW5fanBcbiAqXG4gKiBAZXhhbXBsZVxuICogbG9jYWxpemVkQ29sdW1uKHRhZywgXCJuYW1lXCIpXG4gKi9cbnR5cGUgTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUgPSBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgYmlnaW50O1xudHlwZSBMb2NhbGl6ZWRDb2x1bW5WYWx1ZSA9IHN0cmluZyB8IHN0cmluZ1tdO1xudHlwZSBOZXN0ZWRMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208Vj4gPSBWIGV4dGVuZHMgc3RyaW5nXG4gID8gc3RyaW5nXG4gIDogViBleHRlbmRzIHJlYWRvbmx5IHN0cmluZ1tdXG4gICAgPyBzdHJpbmdbXVxuICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtblZhbHVlRnJvbTxWPiA9IFYgZXh0ZW5kcyBzdHJpbmdcbiAgPyBzdHJpbmdcbiAgOiBWIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW11cbiAgICA/IHN0cmluZ1tdXG4gICAgOiBWIGV4dGVuZHMgbnVtYmVyIHwgYm9vbGVhbiB8IGJpZ2ludFxuICAgICAgPyBzdHJpbmdcbiAgICAgIDogViBleHRlbmRzIFBhcnRpYWw8UmVjb3JkPCh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl0sIGluZmVyIExWPj5cbiAgICAgICAgPyBOZXN0ZWRMb2NhbGl6ZWRDb2x1bW5WYWx1ZUZyb208TFY+XG4gICAgICAgIDogbmV2ZXI7XG50eXBlIExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgKEsgZXh0ZW5kcyBrZXlvZiBUID8gVFtLXSA6IG5ldmVyKVxuICB8IHtcbiAgICAgIFtMIGluICh0eXBlb2YgU1VQUE9SVEVEX0xPQ0FMRVMpW251bWJlcl1dOiBgJHtLfV8ke0x9YCBleHRlbmRzIGtleW9mIFRcbiAgICAgICAgPyBUW2Ake0t9XyR7TH1gXVxuICAgICAgICA6IG5ldmVyO1xuICAgIH1bKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXV07XG50eXBlIExvY2FsaXplZENvbHVtblJldHVybjxULCBLIGV4dGVuZHMgc3RyaW5nPiA9XG4gIHwgTG9jYWxpemVkQ29sdW1uVmFsdWVGcm9tPExvY2FsaXplZENvbHVtbkNhbmRpZGF0ZTxULCBLPj5cbiAgfCB1bmRlZmluZWQ7XG50eXBlIExvY2FsZVZhbHVlTWFwID0gUGFydGlhbDxSZWNvcmQ8KHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSwgdW5rbm93bj4+O1xuXG5mdW5jdGlvbiBpc0xvY2FsaXplZENvbHVtblZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTG9jYWxpemVkQ29sdW1uVmFsdWUge1xuICByZXR1cm4gKFxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fFxuICAgIChBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeSgoaXRlbSkgPT4gdHlwZW9mIGl0ZW0gPT09IFwic3RyaW5nXCIpKVxuICApO1xufVxuXG5mdW5jdGlvbiBpc0xvY2FsaXplZENvbHVtblNjYWxhclZhbHVlKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUge1xuICByZXR1cm4gW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiLCBcImJpZ2ludFwiXS5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc0VtcHR5TG9jYWxpemVkQ29sdW1uVmFsdWUodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkIHwgXCJcIiB7XG4gIHJldHVybiB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBcIlwiO1xufVxuXG5mdW5jdGlvbiBnZXROZXN0ZWRMb2NhbGVWYWx1ZTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBMb2NhbGl6ZWRCYXNlQ29sdW1uPFQ+PihcbiAgcm93OiBULFxuICBjb2x1bW46IEssXG4gIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSxcbik6IHVua25vd24ge1xuICBjb25zdCBjb2x1bW5WYWx1ZSA9IHJvd1tjb2x1bW5dO1xuICBpZiAoY29sdW1uVmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIGNvbHVtblZhbHVlICE9PSBcIm9iamVjdFwiIHx8IEFycmF5LmlzQXJyYXkoY29sdW1uVmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiAoY29sdW1uVmFsdWUgYXMgTG9jYWxlVmFsdWVNYXApW2xvY2FsZV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsb2NhbGl6ZWRDb2x1bW48XG4gIFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgSyBleHRlbmRzIExvY2FsaXplZEJhc2VDb2x1bW48VD4sXG4+KHJvdzogVCwgY29sdW1uOiBLKTogTG9jYWxpemVkQ29sdW1uUmV0dXJuPFQsIEs+IHtcbiAgY29uc3QgY3VycmVudExvY2FsZSA9IGdldEN1cnJlbnRMb2NhbGUoKTtcbiAgY29uc3QgbG9jYWxlID0gU1VQUE9SVEVEX0xPQ0FMRVMuaW5jbHVkZXMoY3VycmVudExvY2FsZSkgPyBjdXJyZW50TG9jYWxlIDogREVGQVVMVF9MT0NBTEU7XG4gIGNvbnN0IG90aGVyTG9jYWxlcyA9IFNVUFBPUlRFRF9MT0NBTEVTLmZpbHRlcihcbiAgICAobDogc3RyaW5nKSA9PiBsICE9PSBsb2NhbGUgJiYgbCAhPT0gREVGQVVMVF9MT0NBTEUsXG4gICk7XG4gIGNvbnN0IGxvY2FsaXplZEtleSA9IChjb2x1bW46IEssIGxvY2FsZTogKHR5cGVvZiBTVVBQT1JURURfTE9DQUxFUylbbnVtYmVyXSkgPT5cbiAgICBgJHtjb2x1bW59XyR7bG9jYWxlfWA7XG4gIGNvbnN0IHZhbHVlcyA9IFtcbiAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbG9jYWxlKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsb2NhbGUpLCBzb3VyY2U6IFwibmVzdGVkXCIgfSxcbiAgICB7IHZhbHVlOiByb3dbY29sdW1uXSwgc291cmNlOiBcImRpcmVjdFwiIH0sXG4gICAgeyB2YWx1ZTogcm93W2xvY2FsaXplZEtleShjb2x1bW4sIERFRkFVTFRfTE9DQUxFKV0sIHNvdXJjZTogXCJkaXJlY3RcIiB9LFxuICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBERUZBVUxUX0xPQ0FMRSksIHNvdXJjZTogXCJuZXN0ZWRcIiB9LFxuICAgIC4uLm90aGVyTG9jYWxlcy5mbGF0TWFwKChsKSA9PiBbXG4gICAgICB7IHZhbHVlOiByb3dbbG9jYWxpemVkS2V5KGNvbHVtbiwgbCldLCBzb3VyY2U6IFwiZGlyZWN0XCIgfSxcbiAgICAgIHsgdmFsdWU6IGdldE5lc3RlZExvY2FsZVZhbHVlKHJvdywgY29sdW1uLCBsKSwgc291cmNlOiBcIm5lc3RlZFwiIH0sXG4gICAgXSksXG4gIF07XG5cbiAgZm9yIChjb25zdCB7IHZhbHVlLCBzb3VyY2UgfSBvZiB2YWx1ZXMpIHtcbiAgICBpZiAoIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiYgaXNMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB2YWx1ZSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHNvdXJjZSA9PT0gXCJkaXJlY3RcIiAmJlxuICAgICAgIWlzRW1wdHlMb2NhbGl6ZWRDb2x1bW5WYWx1ZSh2YWx1ZSkgJiZcbiAgICAgIGlzTG9jYWxpemVkQ29sdW1uU2NhbGFyVmFsdWUodmFsdWUpXG4gICAgKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKSBhcyBMb2NhbGl6ZWRDb2x1bW5SZXR1cm48VCwgSz47XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBFbnVt7J2YIGxvY2FsaXplZCBsYWJlbHPrpbwgUHJveHnroZwg67CY7ZmY7ZWp64uI64ukLlxuICogU2VsZWN0IOy7tO2PrOuEjO2KuCDrk7Hsl5DshJwgRW51bUxhYmVsW2tleV0g64yA7IugIOyCrOyaqe2VqeuLiOuLpC5cbiAqXG4gKiBAZXhhbXBsZVxuICogU0QuZW51bUxhYmVscyhcIlRhZ09yZGVyQnlcIilba2V5XSAgLy8g4oaSIO2YhOyerCBsb2NhbGXsnZgg652867KoXG4gKi9cblNELmVudW1MYWJlbHMgPSAoZW51bU5hbWU6IHN0cmluZyk6IFJlY29yZDxzdHJpbmcsIExvY2FsaXplZFN0cmluZz4gPT4ge1xuICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFJlY29yZDxzdHJpbmcsIExvY2FsaXplZFN0cmluZz4sIHtcbiAgICBnZXQoXywga2V5OiBzdHJpbmcgfCBzeW1ib2wpIHtcbiAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN5bWJvbFwiKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpY3RLZXkgPSBgZW51bS4ke2VudW1OYW1lfS4ke2tleX1gIGFzIERpY3RLZXk7XG4gICAgICByZXR1cm4gZ2V0RGljdFZhbHVlKGRpY3RLZXksIGdldEN1cnJlbnRMb2NhbGUoKSk7XG4gICAgfSxcbiAgfSk7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQU9BLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sb0JBQW9CLENBQUMsTUFBTSxJQUFJO0FBQ3JDLFNBQVMsbUJBQXVEO0NBQzlELElBQUk7RUFFRixPQURZLE9BQU8sV0FDWCxDQUFBLENBQUksVUFBaUQ7Q0FDL0QsUUFBUTtFQUNOLE9BQU87Q0FDVDtBQUNGO0FBTUEsTUFBTSxXQUFXO0NBRWYsMEJBQTBCO0NBQzFCLDRCQUE0QjtDQUM1Qiw0QkFBNEI7Q0FDNUIsb0NBQW9DO0NBR3BDLHlCQUF5QjtDQUN6QixpQ0FBaUM7Q0FHakMsMEJBQTBCO0NBQzFCLDZCQUE2QjtDQUM3Qiw0QkFBNEI7Q0FHNUIsbUNBQW1DO0NBQ25DLHFDQUFxQztDQUNyQyx1Q0FBdUM7Q0FDdkMsc0NBQXNDO0NBR3RDLDRCQUE0QjtDQUM1Qix5QkFBeUI7Q0FDekIsZ0NBQWdDO0NBQ2hDLGlDQUFpQztDQUNqQyxrQ0FBa0MsYUFDaEMsTUFBTSxTQUFTO0NBQ2pCLHdCQUF3QjtDQUN4Qix1QkFBdUI7Q0FDdkIsNkJBQTZCO0NBQzdCLDBCQUEwQjtDQUcxQixtQ0FBbUM7Q0FDbkMsb0NBQW9DO0NBQ3BDLGtDQUFrQztDQUNsQyxzQ0FBc0M7Q0FDdEMscUNBQXFDO0NBQ3JDLG9DQUFvQztDQUdwQyx3QkFBd0I7Q0FDeEIsd0JBQXdCO0NBQ3hCLDZCQUE2QixVQUFrQixJQUFJLE1BQU07Q0FDekQsNEJBQTRCO0NBQzVCLG9DQUFvQztDQUNwQyw0QkFBNEI7Q0FDNUIsZ0NBQWdDLFVBQWtCLEdBQUcsTUFBTTtDQUMzRCw0QkFBNEI7Q0FDNUIsb0NBQW9DO0NBR3BDLHNCQUFzQjtDQUN0QiwwQkFBMEI7Q0FDMUIsMEJBQTBCLE9BQWUsS0FBYSxVQUNwRCxHQUFHLE1BQU0sTUFBTSxNQUFNLEdBQUc7Q0FHMUIsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLHdCQUF3QjtDQUN4Qix3QkFBd0I7Q0FHeEIseUJBQXlCO0NBQ3pCLHlCQUF5QjtDQUN6Qix5QkFBeUI7Q0FDekIsMkJBQTJCO0NBQzNCLDhCQUE4QjtDQUM5QiwrQkFBK0I7Q0FDL0Isa0NBQWtDO0NBQ2xDLHVDQUF1QztDQUN2Qyw4QkFBOEI7Q0FDOUIsK0JBQStCO0NBQy9CLGdDQUFnQztDQUNoQyw2QkFBNkI7Q0FDN0IsMkJBQTJCO0NBQzNCLGtDQUFrQztDQUdsQyxvQkFBb0I7Q0FDcEIsa0JBQWtCO0FBQ3BCO0FBRUEsTUFBTSxXQUFXO0NBRWYsMEJBQTBCO0NBQzFCLDRCQUE0QjtDQUM1Qiw0QkFBNEI7Q0FDNUIsb0NBQW9DO0NBR3BDLHlCQUF5QjtDQUN6QixpQ0FBaUM7Q0FHakMsMEJBQTBCO0NBQzFCLDZCQUE2QjtDQUM3Qiw0QkFBNEI7Q0FHNUIsbUNBQW1DO0NBQ25DLHFDQUFxQztDQUNyQyx1Q0FBdUM7Q0FDdkMsc0NBQXNDO0NBR3RDLDRCQUE0QjtDQUM1Qix5QkFBeUI7Q0FDekIsZ0NBQWdDO0NBQ2hDLGlDQUFpQztDQUNqQyxrQ0FBa0MsYUFBcUIsV0FBVyxTQUFTO0NBQzNFLHdCQUF3QjtDQUN4Qix1QkFBdUI7Q0FDdkIsNkJBQTZCO0NBQzdCLDBCQUEwQjtDQUcxQixtQ0FBbUM7Q0FDbkMsb0NBQW9DO0NBQ3BDLGtDQUFrQztDQUNsQyxzQ0FBc0M7Q0FDdEMscUNBQXFDO0NBQ3JDLG9DQUFvQztDQUdwQyx3QkFBd0I7Q0FDeEIsd0JBQXdCO0NBQ3hCLDZCQUE2QixVQUFrQixJQUFJLE1BQU07Q0FDekQsNEJBQTRCO0NBQzVCLG9DQUFvQztDQUNwQyw0QkFBNEI7Q0FDNUIsZ0NBQWdDLFVBQWtCLEdBQUcsTUFBTTtDQUMzRCw0QkFBNEI7Q0FDNUIsb0NBQW9DO0NBR3BDLHNCQUFzQjtDQUN0QiwwQkFBMEI7Q0FDMUIsMEJBQTBCLE9BQWUsS0FBYSxVQUNwRCxXQUFXLE1BQU0sR0FBRyxJQUFJLE1BQU07Q0FHaEMsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLHVCQUF1QjtDQUN2Qix1QkFBdUI7Q0FDdkIsdUJBQXVCO0NBQ3ZCLHdCQUF3QjtDQUN4Qix3QkFBd0I7Q0FHeEIseUJBQXlCO0NBQ3pCLHlCQUF5QjtDQUN6Qix5QkFBeUI7Q0FDekIsMkJBQTJCO0NBQzNCLDhCQUE4QjtDQUM5QiwrQkFBK0I7Q0FDL0Isa0NBQWtDO0NBQ2xDLHVDQUF1QztDQUN2Qyw4QkFBOEI7Q0FDOUIsK0JBQStCO0NBQy9CLGdDQUFnQztDQUNoQyw2QkFBNkI7Q0FDN0IsMkJBQTJCO0NBQzNCLGtDQUFrQztDQUdsQyxvQkFBb0I7Q0FDcEIsa0JBQWtCO0FBQ3BCO0FBR0EsTUFBTSxlQUFlO0NBQ25CLHFCQUFxQjtDQUNyQix3QkFBd0I7Q0FDeEIsZ0NBQWdDO0NBQ2hDLGdDQUFnQztDQUNoQyxrQ0FBa0M7Q0FDbEMsZ0NBQWdDO0NBQ2hDLDBDQUEwQztDQUMxQyxvQ0FBb0M7Q0FDcEMsaUNBQWlDO0NBQ2pDLG1DQUFtQztDQUNuQyw4QkFBOEI7Q0FDOUIsa0NBQWtDO0NBQ2xDLG1DQUFtQztDQUNuQyx1Q0FBdUM7Q0FDdkMsMkNBQTJDO0NBQzNDLDhDQUE4QztDQUM5Qyw4Q0FBOEM7Q0FDOUMsaUNBQWlDO0NBQ2pDLDZCQUE2QjtDQUM3Qiw4QkFBOEI7Q0FDOUIsaUNBQWlDO0NBQ2pDLG9DQUFvQztDQUNwQyx1Q0FBdUM7Q0FDdkMsNEJBQTRCO0NBQzVCLDZCQUE2QjtDQUM3QiwyQkFBMkI7Q0FDM0IsaUNBQ0U7Q0FDRiw0QkFBNEI7Q0FDNUIsbUNBQW1DO0NBQ25DLHNDQUNFO0NBQ0YscUNBQXFDO0NBQ3JDLHlDQUF5QztDQUN6QyxtQ0FBbUM7Q0FDbkMsa0NBQWtDO0NBQ2xDLGlDQUFpQztDQUNqQywwQ0FBMEM7Q0FDMUMseUNBQXlDO0NBQ3pDLHVDQUF1QztDQUN2QyxzQ0FBc0M7Q0FDdEMsMkNBQTJDO0NBQzNDLDBDQUEwQztDQUMxQyw0Q0FBNEM7Q0FDNUMsMkNBQTJDO0NBQzNDLDZDQUE2QztDQUM3Qyw0Q0FBNEM7Q0FDNUMsaURBQWlEO0NBQ2pELGdEQUFnRDtDQUNoRCxxREFBcUQ7Q0FDckQsb0RBQW9EO0NBQ3BELHdDQUF3QztDQUN4Qyx1Q0FBdUM7Q0FDdkMsaUNBQWlDO0NBQ2pDLHlDQUF5QztDQUN6QywwQ0FBMEM7Q0FDMUMsaUNBQWlDO0NBQ2pDLG1DQUFtQztDQUNuQywrQkFBK0I7Q0FDL0IsaUNBQWlDO0NBQ2pDLHlCQUF5QjtDQUN6Qiw0QkFBNEI7Q0FDNUIsb0NBQW9DO0NBQ3BDLHFDQUFxQztDQUNyQyxvQ0FBb0M7Q0FDcEMsOEJBQThCO0NBQzlCLG9DQUFvQztDQUNwQyw4Q0FBOEM7Q0FDOUMsd0NBQXdDO0NBQ3hDLHNDQUFzQztDQUN0Qyx1Q0FBdUM7Q0FDdkMsMkNBQTJDO0NBQzNDLCtDQUErQztDQUMvQyxrREFBa0Q7Q0FDbEQsa0RBQWtEO0NBQ2xELGtDQUFrQztDQUNsQyxxQ0FBcUM7Q0FDckMscUNBQXFDO0NBQ3JDLGlDQUFpQztDQUNqQyx1Q0FBdUM7Q0FDdkMsd0NBQXdDO0NBQ3hDLDBDQUEwQztDQUMxQyx5Q0FBeUM7Q0FDekMsc0NBQXNDO0NBQ3RDLG1DQUFtQztDQUNuQyxtQ0FBbUM7Q0FDbkMscUNBQXFDO0NBQ3JDLDBDQUEwQztDQUMxQywrQkFBK0I7Q0FDL0Isb0NBQW9DO0NBQ3BDLHFDQUFxQztDQUNyQyxxQ0FBcUM7Q0FDckMscUNBQXFDO0NBQ3JDLGtCQUFrQjtDQUNsQixxQkFBcUI7Q0FDckIsNkJBQTZCO0NBQzdCLHNCQUFzQjtDQUN0Qix3QkFBd0I7Q0FDeEIsNkJBQTZCO0NBQzdCLCtCQUErQjtDQUMvQiwrQkFBK0I7Q0FDL0IsZ0JBQWdCO0NBQ2hCLG1CQUFtQjtDQUNuQiwyQkFBMkI7Q0FDM0IseUJBQXlCO0NBQ3pCLDRCQUE0QjtDQUM1QixxQkFBcUI7Q0FDckIsdUJBQXVCO0NBQ3ZCLG9CQUFvQjtDQUNwQixnQ0FBZ0M7Q0FDaEMsdUJBQXVCO0NBQ3ZCLGtDQUFrQztDQUNsQyw2QkFBNkI7Q0FDN0IsNkJBQTZCO0NBQzdCLDRCQUE0QjtDQUM1Qiw4QkFBOEI7QUFDaEM7QUFtQkEsU0FBZ0IsYUFBYSxNQUFpQztDQUM1RCxPQUFPO0FBQ1Q7QUFHQSxNQUFNLGVBQTBEO0NBQzlELElBQUk7RUFBRSxHQUFHO0VBQVUsR0FBRztFQUFjLEdBQUdBO0NBQUc7Q0FDMUMsSUFBSTtFQUFFLEdBQUc7RUFBVSxHQUFHQztDQUFHO0FBQzNCO0FBTUEsU0FBUyxhQUFnQyxLQUFRLFFBQWlDO0NBRWhGLE1BQU0sT0FBTyxhQUFhO0NBQzFCLElBQUksT0FBTyxTQUFTLFFBQ2xCLE9BQU8sS0FBSztDQUlkLElBQUksV0FBVyxrQkFBa0IsYUFBYSxlQUFlLEdBQUcsU0FBUyxRQUN2RSxPQUFPLGFBQWEsZUFBZSxDQUFDO0NBSXRDLEtBQUssTUFBTSxtQkFBbUIsbUJBQzVCLElBQUksb0JBQW9CLFVBQVUsb0JBQW9CLGdCQUNwRDtNQUFJLGFBQWEsZ0JBQWdCLEdBQUcsU0FBUyxRQUMzQyxPQUFPLGFBQWEsZ0JBQWdCLENBQUM7Q0FDdkM7Q0FLSixPQUFPO0FBQ1Q7Ozs7Ozs7OztBQVVBLFNBQWdCLEdBQXNCLEtBQXlCO0NBRTdELE9BQU8sYUFBYSxLQURMLGlCQUNVLENBQU07QUFDakM7Ozs7Ozs7O0FBU0EsR0FBRyxVQUNBLFlBQ21CLFFBQTRCO0NBQzlDLE9BQU8sYUFBYSxLQUFLLE1BQU07QUFDakM7QUErQ0YsU0FBUyx1QkFBdUIsT0FBK0M7Q0FDN0UsT0FDRSxPQUFPLFVBQVUsWUFDaEIsTUFBTSxRQUFRLEtBQUssS0FBSyxNQUFNLE9BQU8sU0FBUyxPQUFPLFNBQVMsUUFBUTtBQUUzRTtBQUVBLFNBQVMsNkJBQTZCLE9BQXFEO0NBQ3pGLE9BQU87RUFBQztFQUFVO0VBQVU7RUFBVztDQUFRLENBQUMsQ0FBQyxTQUFTLE9BQU8sS0FBSztBQUN4RTtBQUVBLFNBQVMsNEJBQTRCLE9BQWdEO0NBQ25GLE9BQU8sVUFBVSxRQUFRLFVBQVUsVUFBYSxVQUFVO0FBQzVEO0FBRUEsU0FBUyxxQkFDUCxLQUNBLFFBQ0EsUUFDUztDQUNULE1BQU0sY0FBYyxJQUFJO0NBQ3hCLElBQUksZ0JBQWdCLFFBQVEsT0FBTyxnQkFBZ0IsWUFBWSxNQUFNLFFBQVEsV0FBVyxHQUN0RjtDQUdGLE9BQVEsWUFBK0I7QUFDekM7QUFFQSxTQUFnQixnQkFHZCxLQUFRLFFBQXdDO0NBQ2hELE1BQU0sZ0JBQWdCLGlCQUFpQjtDQUN2QyxNQUFNLFNBQVMsa0JBQWtCLFNBQVMsYUFBYSxJQUFJLGdCQUFnQjtDQUMzRSxNQUFNLGVBQWUsa0JBQWtCLFFBQ3BDLE1BQWMsTUFBTSxVQUFVLE1BQU0sY0FDdkM7Q0FDQSxNQUFNLGdCQUFnQixRQUFXLFdBQy9CLEdBQUcsT0FBTyxHQUFHO0NBQ2YsTUFBTSxTQUFTO0VBQ2I7R0FBRSxPQUFPLElBQUksYUFBYSxRQUFRLE1BQU07R0FBSSxRQUFRO0VBQVM7RUFDN0Q7R0FBRSxPQUFPLHFCQUFxQixLQUFLLFFBQVEsTUFBTTtHQUFHLFFBQVE7RUFBUztFQUNyRTtHQUFFLE9BQU8sSUFBSTtHQUFTLFFBQVE7RUFBUztFQUN2QztHQUFFLE9BQU8sSUFBSSxhQUFhLFFBQVEsY0FBYztHQUFJLFFBQVE7RUFBUztFQUNyRTtHQUFFLE9BQU8scUJBQXFCLEtBQUssUUFBUSxjQUFjO0dBQUcsUUFBUTtFQUFTO0VBQzdFLEdBQUcsYUFBYSxTQUFTLE1BQU0sQ0FDN0I7R0FBRSxPQUFPLElBQUksYUFBYSxRQUFRLENBQUM7R0FBSSxRQUFRO0VBQVMsR0FDeEQ7R0FBRSxPQUFPLHFCQUFxQixLQUFLLFFBQVEsQ0FBQztHQUFHLFFBQVE7RUFBUyxDQUNsRSxDQUFDO0NBQ0g7Q0FFQSxLQUFLLE1BQU0sRUFBRSxPQUFPLFlBQVksUUFBUTtFQUN0QyxJQUFJLENBQUMsNEJBQTRCLEtBQUssS0FBSyx1QkFBdUIsS0FBSyxHQUNyRSxPQUFPO0VBRVQsSUFDRSxXQUFXLFlBQ1gsQ0FBQyw0QkFBNEIsS0FBSyxLQUNsQyw2QkFBNkIsS0FBSyxHQUVsQyxPQUFPLE9BQU8sS0FBSztDQUV2QjtBQUdGOzs7Ozs7OztBQVNBLEdBQUcsY0FBYyxhQUFzRDtDQUNyRSxPQUFPLElBQUksTUFBTSxDQUFDLEdBQXNDLEVBQ3RELElBQUksR0FBRyxLQUFzQjtFQUMzQixJQUFJLE9BQU8sUUFBUSxVQUNqQjtFQUlGLE9BQU8sYUFBYSxRQURJLFNBQVMsR0FBRyxPQUNQLGlCQUFpQixDQUFDO0NBQ2pELEVBQ0YsQ0FBQztBQUNIIn0=
@@ -0,0 +1,15 @@
1
+ //#region src/migrations/20260820153531_alter_tokens_add1_alter1.ts
2
+ async function up(knex) {
3
+ await knex.schema.alterTable("tokens", (table) => {
4
+ table.boolean("keepalive_enabled").notNullable().defaultTo(knex.raw("false"));
5
+ });
6
+ }
7
+ async function down(knex) {
8
+ await knex.schema.alterTable("tokens", (table) => {
9
+ table.dropColumns("keepalive_enabled");
10
+ });
11
+ }
12
+ //#endregion
13
+ export { down, up };
14
+
15
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjAyNjA4MjAxNTM1MzFfYWx0ZXJfdG9rZW5zX2FkZDFfYWx0ZXIxLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRpb25zLzIwMjYwODIwMTUzNTMxX2FsdGVyX3Rva2Vuc19hZGQxX2FsdGVyMS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIEtuZXggfSBmcm9tIFwia25leFwiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdXAoa25leDogS25leCk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBrbmV4LnNjaGVtYS5hbHRlclRhYmxlKFwidG9rZW5zXCIsICh0YWJsZSkgPT4ge1xuICAgIC8vIGFkZFxuICAgIHRhYmxlLmJvb2xlYW4oXCJrZWVwYWxpdmVfZW5hYmxlZFwiKS5ub3ROdWxsYWJsZSgpLmRlZmF1bHRUbyhrbmV4LnJhdyhcImZhbHNlXCIpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb3duKGtuZXg6IEtuZXgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQga25leC5zY2hlbWEuYWx0ZXJUYWJsZShcInRva2Vuc1wiLCAodGFibGUpID0+IHtcbiAgICAvLyByb2xsYmFjayAtIGFkZFxuICAgIHRhYmxlLmRyb3BDb2x1bW5zKFwia2VlcGFsaXZlX2VuYWJsZWRcIik7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBRUEsZUFBc0IsR0FBRyxNQUEyQjtDQUNsRCxNQUFNLEtBQUssT0FBTyxXQUFXLFdBQVcsVUFBVTtFQUVoRCxNQUFNLFFBQVEsbUJBQW1CLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxVQUFVLEtBQUssSUFBSSxPQUFPLENBQUM7Q0FDOUUsQ0FBQztBQUNIO0FBRUEsZUFBc0IsS0FBSyxNQUEyQjtDQUNwRCxNQUFNLEtBQUssT0FBTyxXQUFXLFdBQVcsVUFBVTtFQUVoRCxNQUFNLFlBQVksbUJBQW1CO0NBQ3ZDLENBQUM7QUFDSCJ9
@@ -2,6 +2,7 @@ import { monitLogSink } from "./application/monit/log-buffer.js";
2
2
  import { QgridDispatcher } from "./application/qgrid/qgrid.dispatcher.js";
3
3
  import { loadSettings, setSettingChangeHandler } from "./application/setting/setting.store.js";
4
4
  import { rescheduleExpiredTokenReminder, startExpiredTokenReminder, stopExpiredTokenReminder } from "./application/qgrid/expired-token-reminder.js";
5
+ import { stopOpenAICallbackRelay } from "./utils/providers/openai/openai-callback-relay.js";
5
6
  import { QgridFrame } from "./application/qgrid/qgrid.frame.js";
6
7
  import { TokenSubscriber } from "./application/qgrid/token-subscriber.js";
7
8
  import { ensureTokensTrigger } from "./application/qgrid/token-trigger-setup.js";
@@ -186,6 +187,7 @@ var sonamu_config_default = defineConfig({
186
187
  const log = getLogger(["qgrid", "startup"]);
187
188
  stopExpiredTokenReminder();
188
189
  stopTokenWindowKeepalive();
190
+ stopOpenAICallbackRelay();
189
191
  setSettingChangeHandler(null);
190
192
  QgridDispatcher.subscriber?.setTokenChangeHandler(null);
191
193
  if (QgridDispatcher.openaiDispatcher) await QgridDispatcher.openaiDispatcher.stop();
@@ -202,4 +204,4 @@ var sonamu_config_default = defineConfig({
202
204
  //#endregion
203
205
  export { sonamu_config_default as default };
204
206
 
205
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7XG4gIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RvcFRva2VuV2luZG93S2VlcGFsaXZlLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5pbXBvcnQgeyBsb2FkU2V0dGluZ3MsIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBvYXV0aENhbGxiYWNrID0gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1jYWxsYmFja19mYWlsZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIG9hdXRoQ2FsbGJhY2spO1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2F1dGgvY2FsbGJhY2tcIiwgb2F1dGhDYWxsYmFjayk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsg53shLHsnpDsl5DshJwg7JuM7LukIOyEpOygleydhCDsnb3snLzrr4DroZwg6re4IOyghOyXkCDsmKzroKTslbwg7ZWc64ukLlxuICAgICAgICBhd2FpdCBsb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgLy8g65+w7YOA7J6EIOyEpOyglSDshozruYTsnpDrpbwg7IOB7JyEIOqzhOy4teyXkOyEnCDsl7DqsrDtlbQgc2V0dGluZyDrqqjrk4jsnbQgcWdyaWQg66W8IOyXreywuOyhsO2VmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcigoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIiB8fCBrZXkgPT09IFwic2xhY2sucmVtaW5kZXJzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXNjaGVkdWxlRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIikge1xuICAgICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0cmlnZ2VyUmVhZHkgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVRva2Vuc1RyaWdnZXIoY29ubkNvbmZpZyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICBsb2cud2FybihgdHJpZ2dlciBzZXR1cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gbmV3IFRva2VuU3Vic2NyaWJlcihjb25uQ29uZmlnLCBRZ3JpZERpc3BhdGNoZXIpO1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN1YnNjcmliZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyDquLDrj5kg7IOB7YOc66W8IOuCqOq4tOuLpCDigJQgSFRUUCDripQg7J2066+4IOyXtOugpCDsnojslrTshJwsIOykgOu5hCDsoIQg7JqU7LKt7J20IFwi7J6g7IucIO2bhCDrkJjripTsp4BcIlxuICAgICAgICAvLyBcIuyerOyLnOuPhO2VtOuPhCDslYgg65CY64qU7KeAXCLrpbwg6rWs67aE7ZW0IOydkeuLte2VtOyVvCDtlZzri6QoNTAzIHZzIDUwMCkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2Fybihgb3BlbmFpIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbnRocm9waWNEaXNwYXRjaGVyID0gbmV3IEFudGhyb3BpY0Rpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBhbnRocm9waWNEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIgPSBhbnRocm9waWNEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJzY3JpYmVyLnNldFRva2VuQ2hhbmdlSGFuZGxlcigoKSA9PiB7XG4gICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgdm9pZCBzdGFydFRva2VuV2luZG93S2VlcGFsaXZlKCk7XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haUNvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyKCk7XG4gICAgICAgIHN0b3BUb2tlbldpbmRvd0tlZXBhbGl2ZSgpO1xuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnNldFRva2VuQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvciwgcmVwbHkpO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBNkJBLE1BQU0sT0FBTyxRQUFRLElBQUksUUFBUTtBQUNqQyxNQUFNLE9BQU8sT0FBTyxRQUFRLElBQUksUUFBUSxLQUFLO0FBRTdDLE1BQU0sYUFBYTtDQUNqQixNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsTUFBTSxPQUFPLFFBQVEsSUFBSSxrQkFBa0IsSUFBSTtDQUMvQyxNQUFNLFFBQVEsSUFBSSxrQkFBa0I7Q0FDcEMsVUFBVSxRQUFRLElBQUksc0JBQXNCO0NBQzVDLFVBQVUsUUFBUSxJQUFJLGtCQUFrQjtBQUMxQztBQUVBLElBQUEsd0JBQWUsYUFBYTtDQUMxQixhQUFhLFFBQVEsSUFBSSxn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
207
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29uYW11LmNvbmZpZy5qcyIsIm5hbWVzIjpbImNhY2hlRHJpdmVycyJdLCJzb3VyY2VzIjpbIi4uL3NyYy9zb25hbXUuY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmltcG9ydCB7IGdldENvbnNvbGVTaW5rIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5pbXBvcnQgeyBnZXRQcmV0dHlGb3JtYXR0ZXIgfSBmcm9tIFwiQGxvZ3RhcGUvcHJldHR5XCI7XG5pbXBvcnQgeyB0eXBlIEZhc3RpZnlSZXBseSwgdHlwZSBGYXN0aWZ5UmVxdWVzdCB9IGZyb20gXCJmYXN0aWZ5XCI7XG5pbXBvcnQgeyBDYWNoZVByZXNldHMsIGRlZmluZUNvbmZpZyB9IGZyb20gXCJzb25hbXVcIjtcbmltcG9ydCB7IGRyaXZlcnMgYXMgY2FjaGVEcml2ZXJzLCBzdG9yZSB9IGZyb20gXCJzb25hbXUvY2FjaGVcIjtcblxuaW1wb3J0IHsgbW9uaXRMb2dTaW5rIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vbW9uaXQvbG9nLWJ1ZmZlclwiO1xuaW1wb3J0IHtcbiAgcmVzY2hlZHVsZUV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdGFydEV4cGlyZWRUb2tlblJlbWluZGVyLFxuICBzdG9wRXhwaXJlZFRva2VuUmVtaW5kZXIsXG59IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL2V4cGlyZWQtdG9rZW4tcmVtaW5kZXJcIjtcbmltcG9ydCB7IFFncmlkRGlzcGF0Y2hlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLmRpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFFncmlkRnJhbWUgfSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC9xZ3JpZC5mcmFtZVwiO1xuaW1wb3J0IHsgVG9rZW5TdWJzY3JpYmVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vcWdyaWQvdG9rZW4tc3Vic2NyaWJlclwiO1xuaW1wb3J0IHsgZW5zdXJlVG9rZW5zVHJpZ2dlciB9IGZyb20gXCIuL2FwcGxpY2F0aW9uL3FncmlkL3Rva2VuLXRyaWdnZXItc2V0dXBcIjtcbmltcG9ydCB7XG4gIHJlc2NoZWR1bGVUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RhcnRUb2tlbldpbmRvd0tlZXBhbGl2ZSxcbiAgc3RvcFRva2VuV2luZG93S2VlcGFsaXZlLFxufSBmcm9tIFwiLi9hcHBsaWNhdGlvbi9xZ3JpZC90b2tlbi13aW5kb3cta2VlcGFsaXZlXCI7XG5pbXBvcnQgeyBsb2FkU2V0dGluZ3MsIHNldFNldHRpbmdDaGFuZ2VIYW5kbGVyIH0gZnJvbSBcIi4vYXBwbGljYXRpb24vc2V0dGluZy9zZXR0aW5nLnN0b3JlXCI7XG5pbXBvcnQgeyBoYW5kbGVTZXJ2ZXJFcnJvciB9IGZyb20gXCIuL3NlcnZlci1lcnJvci1oYW5kbGVyXCI7XG5pbXBvcnQgeyBBbnRocm9waWNEaXNwYXRjaGVyIH0gZnJvbSBcIi4vdXRpbHMvcHJvdmlkZXJzL2FudGhyb3BpYy9hbnRocm9waWMtZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgc3RvcE9wZW5BSUNhbGxiYWNrUmVsYXkgfSBmcm9tIFwiLi91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1jYWxsYmFjay1yZWxheVwiO1xuaW1wb3J0IHsgT3BlbkFJRGlzcGF0Y2hlciB9IGZyb20gXCIuL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXJcIjtcblxuY29uc3QgaG9zdCA9IHByb2Nlc3MuZW52LkhPU1QgPz8gXCJsb2NhbGhvc3RcIjtcbmNvbnN0IHBvcnQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCA/PyA0NDkwMCk7XG5cbmNvbnN0IGNvbm5Db25maWcgPSB7XG4gIGhvc3Q6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9IT1NUID8/IFwibG9jYWxob3N0XCIsXG4gIHBvcnQ6IE51bWJlcihwcm9jZXNzLmVudi5TT05BTVVfREJfUE9SVCA/PyA1NDMyKSxcbiAgdXNlcjogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1VTRVIgPz8gXCJwb3N0Z3Jlc1wiLFxuICBwYXNzd29yZDogcHJvY2Vzcy5lbnYuU09OQU1VX0RCX1BBU1NXT1JEID8/IFwicG9zdGdyZXNcIixcbiAgZGF0YWJhc2U6IHByb2Nlc3MuZW52LlNPTkFNVV9EQl9OQU1FID8/IFwicWdyaWRcIixcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7XG4gIHByb2plY3ROYW1lOiBwcm9jZXNzLmVudi5QUk9KRUNUX05BTUUgPz8gXCJRZ3JpZFwiLFxuICBkYXRhYmFzZToge1xuICAgIGRlZmF1bHRPcHRpb25zOiB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIC4uLmNvbm5Db25maWcsXG4gICAgICAgIGtlZXBBbGl2ZTogdHJ1ZSxcbiAgICAgICAga2VlcEFsaXZlSW5pdGlhbERlbGF5TWlsbGlzOiAxMDAwMCxcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbiAgYXBpOiB7XG4gICAgZGlyOiBcImFwaVwiLFxuICAgIHRpbWV6b25lOiBcIkFzaWEvU2VvdWxcIixcbiAgICByb3V0ZToge1xuICAgICAgcHJlZml4OiBcIi9hcGlcIixcbiAgICB9LFxuICB9LFxuICBpMThuOiB7XG4gICAgZGVmYXVsdExvY2FsZTogXCJrb1wiLFxuICAgIHN1cHBvcnRlZExvY2FsZXM6IFtcImtvXCIsIFwiZW5cIl0sXG4gIH0sXG4gIHN5bmM6IHtcbiAgICB0YXJnZXRzOiBbXCJ3ZWJcIl0sXG4gIH0sXG4gIHRlc3Q6IHtcbiAgICBwYXJhbGxlbDogdHJ1ZSxcbiAgICBtYXhXb3JrZXJzOiA0LFxuICAgIGRldlJ1bm5lcjogeyBlbmFibGVkOiB0cnVlIH0sXG4gIH0sXG4gIGxvZ2dpbmc6IHtcbiAgICBzaW5rczoge1xuICAgICAgY29uc29sZTogZ2V0Q29uc29sZVNpbmsoe1xuICAgICAgICBmb3JtYXR0ZXI6IGdldFByZXR0eUZvcm1hdHRlcih7XG4gICAgICAgICAgdGltZXN0YW1wOiBcInRpbWVcIixcbiAgICAgICAgICBjYXRlZ29yeVdpZHRoOiAyMCxcbiAgICAgICAgICBjYXRlZ29yeVRydW5jYXRlOiBcIm1pZGRsZVwiLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICAgLy8gTW9uaXQg7YOt7JqpIGluLW1lbW9yeSByaW5nIGJ1ZmZlci4g7Y+s66e37J2AIHNpbmsg67OEIOKAlCDsvZjshpQg7Lac66Cl7J2AIOq3uOuMgOuhnOuLpC5cbiAgICAgIG1vbml0OiBtb25pdExvZ1NpbmssXG4gICAgfSxcbiAgICBsb2dnZXJzOiBbXG4gICAgICAvLyBxZ3JpZCDroZzqt7ggKOyalOyyrSDrtoTrsLAsIG9hdXRoL3VzYWdlIEFQSSlcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInFncmlkXCJdLCBzaW5rczogW1wiY29uc29sZVwiLCBcIm1vbml0XCJdLCBsb3dlc3RMZXZlbDogXCJpbmZvXCIgfSxcbiAgICAgIC8vIHNvbmFtdSDroZzqt7jripQgd2FybmluZyDsnbTsg4Hrp4xcbiAgICAgIHsgY2F0ZWdvcnk6IFtcInNvbmFtdVwiXSwgc2lua3M6IFtcImNvbnNvbGVcIiwgXCJtb25pdFwiXSwgbG93ZXN0TGV2ZWw6IFwid2FybmluZ1wiIH0sXG4gICAgICAvLyBmYXN0aWZ5IOuhnOq3uCDssKjri6hcbiAgICAgIHsgY2F0ZWdvcnk6IFtcImZhc3RpZnlcIl0sIHNpbmtzOiBbXSwgbG93ZXN0TGV2ZWw6IFwiZmF0YWxcIiB9LFxuICAgIF0sXG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIGxpc3RlbjogeyBwb3J0LCBob3N0IH0sXG4gICAgZmFzdGlmeToge1xuICAgICAgYm9keUxpbWl0OiAxMCAqIDEwMjQgKiAxMDI0LFxuICAgIH0sXG4gICAgcGx1Z2luczoge1xuICAgICAgZm9ybWJvZHk6IHRydWUsXG4gICAgICBxczogdHJ1ZSxcbiAgICAgIHNzZTogdHJ1ZSxcbiAgICAgIG11bHRpcGFydDogeyBsaW1pdHM6IHsgZmlsZVNpemU6IDEwMjQgKiAxMDI0ICogMzAgfSB9LFxuICAgICAgc3RhdGljOiB7XG4gICAgICAgIHJvb3Q6IHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCBcIi8uLi9cIiwgXCJwdWJsaWNcIiksXG4gICAgICAgIHByZWZpeDogXCIvYXBpL3B1YmxpY1wiLFxuICAgICAgfSxcbiAgICAgIGN1c3RvbTogKHNlcnZlcikgPT4ge1xuICAgICAgICBjb25zdCBvYXV0aENhbGxiYWNrID0gYXN5bmMgKHJlcXVlc3Q6IEZhc3RpZnlSZXF1ZXN0LCByZXBseTogRmFzdGlmeVJlcGx5KSA9PiB7XG4gICAgICAgICAgY29uc3QgeyBjb2RlLCBzdGF0ZSB9ID0gcmVxdWVzdC5xdWVyeSBhcyB7IGNvZGU/OiBzdHJpbmc7IHN0YXRlPzogc3RyaW5nIH07XG4gICAgICAgICAgaWYgKCFjb2RlIHx8ICFzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlZGlyZWN0KFwiLz9vYXV0aD1lcnJvciZyZWFzb249bWlzc2luZ19wYXJhbXNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gUWdyaWRGcmFtZS5oYW5kbGVPQXV0aENhbGxiYWNrKGNvZGUsIHN0YXRlLCByZXBseSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbHkucmVkaXJlY3QoXCIvP29hdXRoPWVycm9yJnJlYXNvbj1jYWxsYmFja19mYWlsZWRcIik7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2NhbGxiYWNrXCIsIG9hdXRoQ2FsbGJhY2spO1xuICAgICAgICBzZXJ2ZXIuZ2V0KFwiL2F1dGgvY2FsbGJhY2tcIiwgb2F1dGhDYWxsYmFjayk7XG4gICAgICB9LFxuICAgIH0sXG4gICAgYXBpQ29uZmlnOiB7XG4gICAgICBjb250ZXh0UHJvdmlkZXI6IChkZWZhdWx0Q29udGV4dCwgcmVxdWVzdCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmRlZmF1bHRDb250ZXh0LFxuICAgICAgICAgIGlwOiByZXF1ZXN0LmlwLFxuICAgICAgICAgIGJvZHk6IHJlcXVlc3QuYm9keSxcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBndWFyZEhhbmRsZXI6ICgpID0+IHt9LFxuICAgICAgY2FjaGVDb250cm9sSGFuZGxlcjogKHJlcSkgPT4ge1xuICAgICAgICBzd2l0Y2ggKHJlcS50eXBlKSB7XG4gICAgICAgICAgY2FzZSBcImFzc2V0c1wiOlxuICAgICAgICAgICAgLy8gSGFzaCDtj6ztlajrkJwg7YyM7J28OiDsmIHqtawg7LqQ7IucXG4gICAgICAgICAgICBpZiAocmVxLnBhdGgubWF0Y2goLy1bYS1mMC05XStcXC4vKSkge1xuICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLmltbXV0YWJsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubG9uZ0xpdmVkO1xuXG4gICAgICAgICAgY2FzZSBcImFwaVwiOlxuICAgICAgICAgICAgLy8gR0VUIOyalOyyreunjCDsupDsi7Eg6rOg66CkXG4gICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gXCJHRVRcIikge1xuICAgICAgICAgICAgICAvLyDtirnsoJUg6rK966Gc64qUIOynp+ydgCDsupDsi5xcbiAgICAgICAgICAgICAgaWYgKHJlcS5wYXRoLnN0YXJ0c1dpdGgoXCIvYXBpL3N0YXRpYy1kYXRhXCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5zaG9ydExpdmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChyZXEucGF0aC5zdGFydHNXaXRoKFwiL2FwaS90ZXJtc1wiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVByZXNldHMubWVkaXVtTGl2ZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIOq4sOuzuDog7LqQ7IucIOyXhuydjFxuICAgICAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuXG4gICAgICAgICAgY2FzZSBcInNzclwiOlxuICAgICAgICAgICAgLy8gU1NSIO2OmOydtOyngDogMTDstIgg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNzcjtcblxuICAgICAgICAgIGNhc2UgXCJjc3JcIjpcbiAgICAgICAgICAgIC8vIENTUiBmYWxsYmFjayAoaW5kZXguaHRtbCk6IDHrtoQg7LqQ7IucXG4gICAgICAgICAgICByZXR1cm4gQ2FjaGVQcmVzZXRzLnNob3J0TGl2ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENhY2hlUHJlc2V0cy5ub0NhY2hlO1xuICAgICAgfSxcbiAgICB9LFxuICAgIGNhY2hlOiB7XG4gICAgICBkZWZhdWx0OiBcIm1haW5cIixcbiAgICAgIHN0b3Jlczoge1xuICAgICAgICBtYWluOiBzdG9yZSgpLnVzZUwxTGF5ZXIoY2FjaGVEcml2ZXJzLm1lbW9yeSh7IG1heFNpemU6IFwiNTBtYlwiIH0pKSxcbiAgICAgIH0sXG4gICAgICB0dGw6IFwiNW1cIixcbiAgICAgIHByZWZpeDogXCJcIixcbiAgICB9LFxuICAgIGxpZmVjeWNsZToge1xuICAgICAgb25TdGFydDogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcblxuICAgICAgICAvLyBkaXNwYXRjaGVyIOqwgCDsg53shLHsnpDsl5DshJwg7JuM7LukIOyEpOygleydhCDsnb3snLzrr4DroZwg6re4IOyghOyXkCDsmKzroKTslbwg7ZWc64ukLlxuICAgICAgICBhd2FpdCBsb2FkU2V0dGluZ3MoKTtcbiAgICAgICAgLy8g65+w7YOA7J6EIOyEpOyglSDshozruYTsnpDrpbwg7IOB7JyEIOqzhOy4teyXkOyEnCDsl7DqsrDtlbQgc2V0dGluZyDrqqjrk4jsnbQgcWdyaWQg66W8IOyXreywuOyhsO2VmOyngCDslYrqsowg7ZWc64ukLlxuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcigoa2V5KSA9PiB7XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJzbGFjay5leHBpcnlSZW1pbmRlck1pbnV0ZXNcIiB8fCBrZXkgPT09IFwic2xhY2sucmVtaW5kZXJzRW5hYmxlZFwiKSB7XG4gICAgICAgICAgICByZXNjaGVkdWxlRXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGtleSA9PT0gXCJxZ3JpZC50b2tlbldpbmRvd0tlZXBhbGl2ZUVuYWJsZWRcIikge1xuICAgICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGxldCB0cmlnZ2VyUmVhZHkgPSB0cnVlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGVuc3VyZVRva2Vuc1RyaWdnZXIoY29ubkNvbmZpZyk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICB0cmlnZ2VyUmVhZHkgPSBmYWxzZTtcbiAgICAgICAgICBsb2cud2FybihgdHJpZ2dlciBzZXR1cCBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpYmVyID0gbmV3IFRva2VuU3Vic2NyaWJlcihjb25uQ29uZmlnLCBRZ3JpZERpc3BhdGNoZXIpO1xuICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7XG5cbiAgICAgICAgY29uc3Qgc3RhcnRlZCA9IGF3YWl0IHN1YnNjcmliZXIuc3RhcnQoKTtcblxuICAgICAgICAvLyDquLDrj5kg7IOB7YOc66W8IOuCqOq4tOuLpCDigJQgSFRUUCDripQg7J2066+4IOyXtOugpCDsnojslrTshJwsIOykgOu5hCDsoIQg7JqU7LKt7J20IFwi7J6g7IucIO2bhCDrkJjripTsp4BcIlxuICAgICAgICAvLyBcIuyerOyLnOuPhO2VtOuPhCDslYgg65CY64qU7KeAXCLrpbwg6rWs67aE7ZW0IOydkeuLte2VtOyVvCDtlZzri6QoNTAzIHZzIDUwMCkuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3Qgb3BlbmFpRGlzcGF0Y2hlciA9IG5ldyBPcGVuQUlEaXNwYXRjaGVyKCk7XG4gICAgICAgICAgYXdhaXQgb3BlbmFpRGlzcGF0Y2hlci5zdGFydCgpO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyID0gb3BlbmFpRGlzcGF0Y2hlcjtcbiAgICAgICAgICBRZ3JpZERpc3BhdGNoZXIuc3RhcnR1cFN0YXRlLm9wZW5haSA9IFwicmVhZHlcIjtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUub3BlbmFpID0gXCJmYWlsZWRcIjtcbiAgICAgICAgICBsb2cud2Fybihgb3BlbmFpIGRpc3BhdGNoZXIgZmFpbGVkOiAkeyhlIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBhbnRocm9waWNEaXNwYXRjaGVyID0gbmV3IEFudGhyb3BpY0Rpc3BhdGNoZXIoKTtcbiAgICAgICAgICBhd2FpdCBhbnRocm9waWNEaXNwYXRjaGVyLnN0YXJ0KCk7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLmFudGhyb3BpY0Rpc3BhdGNoZXIgPSBhbnRocm9waWNEaXNwYXRjaGVyO1xuICAgICAgICAgIFFncmlkRGlzcGF0Y2hlci5zdGFydHVwU3RhdGUuYW50aHJvcGljID0gXCJyZWFkeVwiO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN0YXJ0dXBTdGF0ZS5hbnRocm9waWMgPSBcImZhaWxlZFwiO1xuICAgICAgICAgIGxvZy53YXJuKGBhbnRocm9waWMgZGlzcGF0Y2hlciBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBzdWJzY3JpYmVyLnNldFRva2VuQ2hhbmdlSGFuZGxlcigoKSA9PiB7XG4gICAgICAgICAgdm9pZCByZXNjaGVkdWxlVG9rZW5XaW5kb3dLZWVwYWxpdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YXJ0RXhwaXJlZFRva2VuUmVtaW5kZXIoKTtcbiAgICAgICAgdm9pZCBzdGFydFRva2VuV2luZG93S2VlcGFsaXZlKCk7XG5cbiAgICAgICAgY29uc3QgYW50aHJvcGljQ291bnQgPSBRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcj8udG9rZW5Db3VudCA/PyAwO1xuICAgICAgICBjb25zdCBvcGVuYWlDb3VudCA9IFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyPy50b2tlbkNvdW50ID8/IDA7XG5cbiAgICAgICAgbG9nLmluZm8oYGxpc3RlbmluZyBvbiBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgIGxvZy5pbmZvKGBhbnRocm9waWM6ICR7YW50aHJvcGljQ291bnR9IHRva2VucyByZWFkeWApO1xuICAgICAgICBsb2cuaW5mbyhgb3BlbmFpOiAke29wZW5haUNvdW50fSB0b2tlbnMgcmVhZHlgKTtcbiAgICAgICAgbG9nLmluZm8oXG4gICAgICAgICAgYHN1YnNjcmliZXI6ICR7c3RhcnRlZCA/IFwiTElTVEVOIGFjdGl2ZVwiIDogXCJkZWdyYWRlZFwifSR7dHJpZ2dlclJlYWR5ID8gXCJcIiA6IFwiLCB0cmlnZ2VyIGZhaWxlZFwifWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgb25TaHV0ZG93bjogYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBsb2cgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJzdGFydHVwXCJdKTtcbiAgICAgICAgc3RvcEV4cGlyZWRUb2tlblJlbWluZGVyKCk7XG4gICAgICAgIHN0b3BUb2tlbldpbmRvd0tlZXBhbGl2ZSgpO1xuICAgICAgICBzdG9wT3BlbkFJQ2FsbGJhY2tSZWxheSgpO1xuICAgICAgICBzZXRTZXR0aW5nQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXI/LnNldFRva2VuQ2hhbmdlSGFuZGxlcihudWxsKTtcbiAgICAgICAgaWYgKFFncmlkRGlzcGF0Y2hlci5vcGVuYWlEaXNwYXRjaGVyKSB7XG4gICAgICAgICAgYXdhaXQgUWdyaWREaXNwYXRjaGVyLm9wZW5haURpc3BhdGNoZXIuc3RvcCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChRZ3JpZERpc3BhdGNoZXIuYW50aHJvcGljRGlzcGF0Y2hlcikge1xuICAgICAgICAgIGF3YWl0IFFncmlkRGlzcGF0Y2hlci5hbnRocm9waWNEaXNwYXRjaGVyLnN0b3AoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoUWdyaWREaXNwYXRjaGVyLnN1YnNjcmliZXIpIHtcbiAgICAgICAgICBhd2FpdCBRZ3JpZERpc3BhdGNoZXIuc3Vic2NyaWJlci5zdG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nLmluZm8oXCJncmFjZWZ1bCBzaHV0ZG93blwiKTtcbiAgICAgIH0sXG4gICAgICBvbkVycm9yOiAoZXJyb3IsIF9yZXF1ZXN0LCByZXBseSkgPT4ge1xuICAgICAgICBoYW5kbGVTZXJ2ZXJFcnJvcihlcnJvciwgcmVwbHkpO1xuICAgICAgfSxcbiAgICB9LFxuICB9LFxufSk7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQThCQSxNQUFNLE9BQU8sUUFBUSxJQUFJLFFBQVE7QUFDakMsTUFBTSxPQUFPLE9BQU8sUUFBUSxJQUFJLFFBQVEsS0FBSztBQUU3QyxNQUFNLGFBQWE7Q0FDakIsTUFBTSxRQUFRLElBQUksa0JBQWtCO0NBQ3BDLE1BQU0sT0FBTyxRQUFRLElBQUksa0JBQWtCLElBQUk7Q0FD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
@@ -0,0 +1,86 @@
1
+ import { getLogger } from "@logtape/logtape";
2
+ import http from "node:http";
3
+ //#region src/utils/providers/openai/openai-callback-relay.ts
4
+ const logger = getLogger(["qgrid", "oauth"]);
5
+ /**
6
+ * OpenAI matches the Codex CLI client's redirect URIs by exact string, and only these two loopback
7
+ * callbacks are registered. Any other host, port, or path makes /oauth/authorize fail with
8
+ * `invalid_authorize_request` before the login screen renders, so qgrid cannot point the callback
9
+ * at its own configurable server port. Keep in sync with the Codex CLI allow-list (default 1455,
10
+ * fallback 1457).
11
+ */
12
+ const OPENAI_CALLBACK_PORTS = [1455, 1457];
13
+ const OPENAI_CALLBACK_PATH = "/auth/callback";
14
+ function openAICallbackRedirectUri(port) {
15
+ return `http://localhost:${port}${OPENAI_CALLBACK_PATH}`;
16
+ }
17
+ let relay = null;
18
+ function forward(request, response) {
19
+ const current = relay;
20
+ const incoming = new URL(request.url ?? "/", "http://localhost");
21
+ if (!current || incoming.pathname !== "/auth/callback") {
22
+ response.writeHead(404, { "Content-Type": "text/plain; charset=utf-8" });
23
+ response.end("not found");
24
+ return;
25
+ }
26
+ const target = new URL(OPENAI_CALLBACK_PATH, current.dashboardBase);
27
+ for (const field of ["code", "state"]) {
28
+ const value = incoming.searchParams.get(field);
29
+ if (value) target.searchParams.set(field, value);
30
+ }
31
+ response.writeHead(302, {
32
+ Location: target.toString(),
33
+ "Cache-Control": "no-store"
34
+ });
35
+ response.end();
36
+ }
37
+ function listenOn(port) {
38
+ return new Promise((resolve, reject) => {
39
+ const server = http.createServer(forward);
40
+ server.once("error", (error) => {
41
+ server.close();
42
+ if (error.code === "EADDRINUSE" || error.code === "EACCES") resolve(null);
43
+ else reject(error);
44
+ });
45
+ server.listen(port, "127.0.0.1", () => resolve(server));
46
+ });
47
+ }
48
+ /**
49
+ * Opens a short-lived loopback listener on a registered Codex callback port and forwards the
50
+ * authorization code to qgrid own callback route. Returns the redirect URI to put in the authorize
51
+ * request. Repeated logins reuse the running listener and refresh its lifetime.
52
+ */
53
+ async function startOpenAICallbackRelay(dashboardBase, ttlMs, ports = OPENAI_CALLBACK_PORTS) {
54
+ if (relay) {
55
+ relay.dashboardBase = dashboardBase;
56
+ relay.expiryTimer.refresh();
57
+ return relay.redirectUri;
58
+ }
59
+ for (const port of ports) {
60
+ const server = await listenOn(port);
61
+ if (!server) continue;
62
+ const expiryTimer = setTimeout(() => stopOpenAICallbackRelay(), ttlMs);
63
+ expiryTimer.unref();
64
+ const address = server.address();
65
+ const boundPort = typeof address === "object" && address ? address.port : port;
66
+ relay = {
67
+ server,
68
+ redirectUri: openAICallbackRedirectUri(boundPort),
69
+ dashboardBase,
70
+ expiryTimer
71
+ };
72
+ logger.info(`openai oauth callback relay listening on 127.0.0.1:${boundPort}`);
73
+ return relay.redirectUri;
74
+ }
75
+ throw new Error(`OPENAI_CALLBACK_PORTS_UNAVAILABLE_${ports.join("_")}`);
76
+ }
77
+ function stopOpenAICallbackRelay() {
78
+ if (!relay) return;
79
+ clearTimeout(relay.expiryTimer);
80
+ relay.server.close();
81
+ relay = null;
82
+ }
83
+ //#endregion
84
+ export { OPENAI_CALLBACK_PATH, OPENAI_CALLBACK_PORTS, openAICallbackRedirectUri, startOpenAICallbackRelay, stopOpenAICallbackRelay };
85
+
86
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWNhbGxiYWNrLXJlbGF5LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1jYWxsYmFjay1yZWxheS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgaHR0cCBmcm9tIFwibm9kZTpodHRwXCI7XG5cbmltcG9ydCB7IGdldExvZ2dlciB9IGZyb20gXCJAbG9ndGFwZS9sb2d0YXBlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGdldExvZ2dlcihbXCJxZ3JpZFwiLCBcIm9hdXRoXCJdKTtcblxuLyoqXG4gKiBPcGVuQUkgbWF0Y2hlcyB0aGUgQ29kZXggQ0xJIGNsaWVudCdzIHJlZGlyZWN0IFVSSXMgYnkgZXhhY3Qgc3RyaW5nLCBhbmQgb25seSB0aGVzZSB0d28gbG9vcGJhY2tcbiAqIGNhbGxiYWNrcyBhcmUgcmVnaXN0ZXJlZC4gQW55IG90aGVyIGhvc3QsIHBvcnQsIG9yIHBhdGggbWFrZXMgL29hdXRoL2F1dGhvcml6ZSBmYWlsIHdpdGhcbiAqIGBpbnZhbGlkX2F1dGhvcml6ZV9yZXF1ZXN0YCBiZWZvcmUgdGhlIGxvZ2luIHNjcmVlbiByZW5kZXJzLCBzbyBxZ3JpZCBjYW5ub3QgcG9pbnQgdGhlIGNhbGxiYWNrXG4gKiBhdCBpdHMgb3duIGNvbmZpZ3VyYWJsZSBzZXJ2ZXIgcG9ydC4gS2VlcCBpbiBzeW5jIHdpdGggdGhlIENvZGV4IENMSSBhbGxvdy1saXN0IChkZWZhdWx0IDE0NTUsXG4gKiBmYWxsYmFjayAxNDU3KS5cbiAqL1xuZXhwb3J0IGNvbnN0IE9QRU5BSV9DQUxMQkFDS19QT1JUUyA9IFsxNDU1LCAxNDU3XSBhcyBjb25zdDtcbmV4cG9ydCBjb25zdCBPUEVOQUlfQ0FMTEJBQ0tfUEFUSCA9IFwiL2F1dGgvY2FsbGJhY2tcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmkocG9ydDogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0ke09QRU5BSV9DQUxMQkFDS19QQVRIfWA7XG59XG5cbnR5cGUgUmVsYXkgPSB7XG4gIHNlcnZlcjogaHR0cC5TZXJ2ZXI7XG4gIHJlZGlyZWN0VXJpOiBzdHJpbmc7XG4gIGRhc2hib2FyZEJhc2U6IHN0cmluZztcbiAgZXhwaXJ5VGltZXI6IE5vZGVKUy5UaW1lb3V0O1xufTtcblxubGV0IHJlbGF5OiBSZWxheSB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBmb3J3YXJkKHJlcXVlc3Q6IGh0dHAuSW5jb21pbmdNZXNzYWdlLCByZXNwb25zZTogaHR0cC5TZXJ2ZXJSZXNwb25zZSk6IHZvaWQge1xuICBjb25zdCBjdXJyZW50ID0gcmVsYXk7XG4gIGNvbnN0IGluY29taW5nID0gbmV3IFVSTChyZXF1ZXN0LnVybCA/PyBcIi9cIiwgXCJodHRwOi8vbG9jYWxob3N0XCIpO1xuICBpZiAoIWN1cnJlbnQgfHwgaW5jb21pbmcucGF0aG5hbWUgIT09IE9QRU5BSV9DQUxMQkFDS19QQVRIKSB7XG4gICAgcmVzcG9uc2Uud3JpdGVIZWFkKDQwNCwgeyBcIkNvbnRlbnQtVHlwZVwiOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9dXRmLThcIiB9KTtcbiAgICByZXNwb25zZS5lbmQoXCJub3QgZm91bmRcIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gT25seSB0aGUgdHdvIE9BdXRoIHJlc3VsdCBmaWVsZHMgY3Jvc3Mgb3Zlciwgb250byBhIGZpeGVkIGxvb3BiYWNrIGJhc2UuIFRoZSByZXF1ZXN0IG5ldmVyXG4gIC8vIGNvbnRyaWJ1dGVzIHNjaGVtZSwgYXV0aG9yaXR5LCBvciBwYXRoIGJ5dGVzIHRvIHRoZSByZWRpcmVjdCB0YXJnZXQuXG4gIGNvbnN0IHRhcmdldCA9IG5ldyBVUkwoT1BFTkFJX0NBTExCQUNLX1BBVEgsIGN1cnJlbnQuZGFzaGJvYXJkQmFzZSk7XG4gIGZvciAoY29uc3QgZmllbGQgb2YgW1wiY29kZVwiLCBcInN0YXRlXCJdIGFzIGNvbnN0KSB7XG4gICAgY29uc3QgdmFsdWUgPSBpbmNvbWluZy5zZWFyY2hQYXJhbXMuZ2V0KGZpZWxkKTtcbiAgICBpZiAodmFsdWUpIHRhcmdldC5zZWFyY2hQYXJhbXMuc2V0KGZpZWxkLCB2YWx1ZSk7XG4gIH1cbiAgcmVzcG9uc2Uud3JpdGVIZWFkKDMwMiwgeyBMb2NhdGlvbjogdGFyZ2V0LnRvU3RyaW5nKCksIFwiQ2FjaGUtQ29udHJvbFwiOiBcIm5vLXN0b3JlXCIgfSk7XG4gIHJlc3BvbnNlLmVuZCgpO1xufVxuXG5mdW5jdGlvbiBsaXN0ZW5Pbihwb3J0OiBudW1iZXIpOiBQcm9taXNlPGh0dHAuU2VydmVyIHwgbnVsbD4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHNlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKGZvcndhcmQpO1xuICAgIHNlcnZlci5vbmNlKFwiZXJyb3JcIiwgKGVycm9yOiBOb2RlSlMuRXJybm9FeGNlcHRpb24pID0+IHtcbiAgICAgIHNlcnZlci5jbG9zZSgpO1xuICAgICAgaWYgKGVycm9yLmNvZGUgPT09IFwiRUFERFJJTlVTRVwiIHx8IGVycm9yLmNvZGUgPT09IFwiRUFDQ0VTXCIpIHJlc29sdmUobnVsbCk7XG4gICAgICBlbHNlIHJlamVjdChlcnJvcik7XG4gICAgfSk7XG4gICAgLy8gQmluZCBsb29wYmFjayBvbmx5LCBsaWtlIHRoZSBDb2RleCBDTEk6IHRoZSByZWxheSBtdXN0IG5vdCBiZSByZWFjaGFibGUgb2ZmLWhvc3QuXG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCBcIjEyNy4wLjAuMVwiLCAoKSA9PiByZXNvbHZlKHNlcnZlcikpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBPcGVucyBhIHNob3J0LWxpdmVkIGxvb3BiYWNrIGxpc3RlbmVyIG9uIGEgcmVnaXN0ZXJlZCBDb2RleCBjYWxsYmFjayBwb3J0IGFuZCBmb3J3YXJkcyB0aGVcbiAqIGF1dGhvcml6YXRpb24gY29kZSB0byBxZ3JpZCBvd24gY2FsbGJhY2sgcm91dGUuIFJldHVybnMgdGhlIHJlZGlyZWN0IFVSSSB0byBwdXQgaW4gdGhlIGF1dGhvcml6ZVxuICogcmVxdWVzdC4gUmVwZWF0ZWQgbG9naW5zIHJldXNlIHRoZSBydW5uaW5nIGxpc3RlbmVyIGFuZCByZWZyZXNoIGl0cyBsaWZldGltZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0T3BlbkFJQ2FsbGJhY2tSZWxheShcbiAgZGFzaGJvYXJkQmFzZTogc3RyaW5nLFxuICB0dGxNczogbnVtYmVyLFxuICBwb3J0czogcmVhZG9ubHkgbnVtYmVyW10gPSBPUEVOQUlfQ0FMTEJBQ0tfUE9SVFMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAocmVsYXkpIHtcbiAgICByZWxheS5kYXNoYm9hcmRCYXNlID0gZGFzaGJvYXJkQmFzZTtcbiAgICByZWxheS5leHBpcnlUaW1lci5yZWZyZXNoKCk7XG4gICAgcmV0dXJuIHJlbGF5LnJlZGlyZWN0VXJpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwb3J0IG9mIHBvcnRzKSB7XG4gICAgY29uc3Qgc2VydmVyID0gYXdhaXQgbGlzdGVuT24ocG9ydCk7XG4gICAgaWYgKCFzZXJ2ZXIpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZXhwaXJ5VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHN0b3BPcGVuQUlDYWxsYmFja1JlbGF5KCksIHR0bE1zKTtcbiAgICBleHBpcnlUaW1lci51bnJlZigpO1xuICAgIGNvbnN0IGFkZHJlc3MgPSBzZXJ2ZXIuYWRkcmVzcygpO1xuICAgIGNvbnN0IGJvdW5kUG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSBcIm9iamVjdFwiICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiBwb3J0O1xuICAgIHJlbGF5ID0ge1xuICAgICAgc2VydmVyLFxuICAgICAgcmVkaXJlY3RVcmk6IG9wZW5BSUNhbGxiYWNrUmVkaXJlY3RVcmkoYm91bmRQb3J0KSxcbiAgICAgIGRhc2hib2FyZEJhc2UsXG4gICAgICBleHBpcnlUaW1lcixcbiAgICB9O1xuICAgIGxvZ2dlci5pbmZvKGBvcGVuYWkgb2F1dGggY2FsbGJhY2sgcmVsYXkgbGlzdGVuaW5nIG9uIDEyNy4wLjAuMToke2JvdW5kUG9ydH1gKTtcbiAgICByZXR1cm4gcmVsYXkucmVkaXJlY3RVcmk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYE9QRU5BSV9DQUxMQkFDS19QT1JUU19VTkFWQUlMQUJMRV8ke3BvcnRzLmpvaW4oXCJfXCIpfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RvcE9wZW5BSUNhbGxiYWNrUmVsYXkoKTogdm9pZCB7XG4gIGlmICghcmVsYXkpIHJldHVybjtcbiAgY2xlYXJUaW1lb3V0KHJlbGF5LmV4cGlyeVRpbWVyKTtcbiAgcmVsYXkuc2VydmVyLmNsb3NlKCk7XG4gIHJlbGF5ID0gbnVsbDtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7O0FBSUEsTUFBTSxTQUFTLFVBQVUsQ0FBQyxTQUFTLE9BQU8sQ0FBQzs7Ozs7Ozs7QUFTM0MsTUFBYSx3QkFBd0IsQ0FBQyxNQUFNLElBQUk7QUFDaEQsTUFBYSx1QkFBdUI7QUFFcEMsU0FBZ0IsMEJBQTBCLE1BQXNCO0NBQzlELE9BQU8sb0JBQW9CLE9BQU87QUFDcEM7QUFTQSxJQUFJLFFBQXNCO0FBRTFCLFNBQVMsUUFBUSxTQUErQixVQUFxQztDQUNuRixNQUFNLFVBQVU7Q0FDaEIsTUFBTSxXQUFXLElBQUksSUFBSSxRQUFRLE9BQU8sS0FBSyxrQkFBa0I7Q0FDL0QsSUFBSSxDQUFDLFdBQVcsU0FBUyxhQUFBLGtCQUFtQztFQUMxRCxTQUFTLFVBQVUsS0FBSyxFQUFFLGdCQUFnQiw0QkFBNEIsQ0FBQztFQUN2RSxTQUFTLElBQUksV0FBVztFQUN4QjtDQUNGO0NBSUEsTUFBTSxTQUFTLElBQUksSUFBSSxzQkFBc0IsUUFBUSxhQUFhO0NBQ2xFLEtBQUssTUFBTSxTQUFTLENBQUMsUUFBUSxPQUFPLEdBQVk7RUFDOUMsTUFBTSxRQUFRLFNBQVMsYUFBYSxJQUFJLEtBQUs7RUFDN0MsSUFBSSxPQUFPLE9BQU8sYUFBYSxJQUFJLE9BQU8sS0FBSztDQUNqRDtDQUNBLFNBQVMsVUFBVSxLQUFLO0VBQUUsVUFBVSxPQUFPLFNBQVM7RUFBRyxpQkFBaUI7Q0FBVyxDQUFDO0NBQ3BGLFNBQVMsSUFBSTtBQUNmO0FBRUEsU0FBUyxTQUFTLE1BQTJDO0NBQzNELE9BQU8sSUFBSSxTQUFTLFNBQVMsV0FBVztFQUN0QyxNQUFNLFNBQVMsS0FBSyxhQUFhLE9BQU87RUFDeEMsT0FBTyxLQUFLLFVBQVUsVUFBaUM7R0FDckQsT0FBTyxNQUFNO0dBQ2IsSUFBSSxNQUFNLFNBQVMsZ0JBQWdCLE1BQU0sU0FBUyxVQUFVLFFBQVEsSUFBSTtRQUNuRSxPQUFPLEtBQUs7RUFDbkIsQ0FBQztFQUVELE9BQU8sT0FBTyxNQUFNLG1CQUFtQixRQUFRLE1BQU0sQ0FBQztDQUN4RCxDQUFDO0FBQ0g7Ozs7OztBQU9BLGVBQXNCLHlCQUNwQixlQUNBLE9BQ0EsUUFBMkIsdUJBQ1Y7Q0FDakIsSUFBSSxPQUFPO0VBQ1QsTUFBTSxnQkFBZ0I7RUFDdEIsTUFBTSxZQUFZLFFBQVE7RUFDMUIsT0FBTyxNQUFNO0NBQ2Y7Q0FFQSxLQUFLLE1BQU0sUUFBUSxPQUFPO0VBQ3hCLE1BQU0sU0FBUyxNQUFNLFNBQVMsSUFBSTtFQUNsQyxJQUFJLENBQUMsUUFBUTtFQUViLE1BQU0sY0FBYyxpQkFBaUIsd0JBQXdCLEdBQUcsS0FBSztFQUNyRSxZQUFZLE1BQU07RUFDbEIsTUFBTSxVQUFVLE9BQU8sUUFBUTtFQUMvQixNQUFNLFlBQVksT0FBTyxZQUFZLFlBQVksVUFBVSxRQUFRLE9BQU87RUFDMUUsUUFBUTtHQUNOO0dBQ0EsYUFBYSwwQkFBMEIsU0FBUztHQUNoRDtHQUNBO0VBQ0Y7RUFDQSxPQUFPLEtBQUssc0RBQXNELFdBQVc7RUFDN0UsT0FBTyxNQUFNO0NBQ2Y7Q0FFQSxNQUFNLElBQUksTUFBTSxxQ0FBcUMsTUFBTSxLQUFLLEdBQUcsR0FBRztBQUN4RTtBQUVBLFNBQWdCLDBCQUFnQztDQUM5QyxJQUFJLENBQUMsT0FBTztDQUNaLGFBQWEsTUFBTSxXQUFXO0NBQzlCLE1BQU0sT0FBTyxNQUFNO0NBQ25CLFFBQVE7QUFDViJ9
@@ -18,11 +18,12 @@ function windowFrom(value) {
18
18
  const source = value;
19
19
  const usedPercent = Number(source.usedPercent ?? source.used_percent);
20
20
  if (!Number.isFinite(usedPercent)) return null;
21
- const duration = source.windowDurationMins ?? source.window_minutes;
21
+ const durationMins = source.windowDurationMins ?? source.window_minutes;
22
+ const durationSeconds = source.limitWindowSeconds ?? source.limit_window_seconds;
22
23
  const resets = source.resetsAt ?? source.reset_at;
23
24
  return {
24
25
  usedPercent,
25
- windowDurationMins: duration === null || duration === void 0 ? null : Number(duration),
26
+ windowDurationMins: durationMins !== null && durationMins !== void 0 ? Number(durationMins) : durationSeconds !== null && durationSeconds !== void 0 ? Number(durationSeconds) / 60 : null,
26
27
  resetsAt: resets === null || resets === void 0 ? null : Number(resets)
27
28
  };
28
29
  }
@@ -97,4 +98,4 @@ async function readOpenAIQuotaUsage(source) {
97
98
  //#endregion
98
99
  export { CHATGPT_WHAM_USAGE_URL, readOpenAIQuotaUsage };
99
100
 
100
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXF1b3RhLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1xdW90YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFF1b3RhUmF0ZUxpbWl0cywgdHlwZSBRdW90YVJhdGVMaW1pdFNuYXBzaG90IH0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHsgYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyB9IGZyb20gXCIuL29wZW5haS1iYWNrZW5kLXByb3RvY29sXCI7XG5cbmV4cG9ydCBjb25zdCBDSEFUR1BUX1dIQU1fVVNBR0VfVVJMID0gXCJodHRwczovL2NoYXRncHQuY29tL2JhY2tlbmQtYXBpL3doYW0vdXNhZ2VcIiBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhID0ge1xuICBkYXRhOiBRdW90YVJhdGVMaW1pdHM7XG4gIGNhY2hlZEF0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0ID1cbiAgfCB7XG4gICAgICBraW5kOiBcIm9rXCI7XG4gICAgICB1dGlsaXphdGlvblBjdDogbnVtYmVyO1xuICAgICAgY2FjaGVBZ2VNczogbnVtYmVyO1xuICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBudW1iZXIgfCBudWxsO1xuICAgICAgcmVzZXRzQXQ6IG51bWJlciB8IG51bGw7XG4gICAgICBsaW1pdElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmF3PzogUXVvdGFSYXRlTGltaXRzO1xuICAgIH1cbiAgfCB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiOyByZWFzb246IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVF1b3RhSHR0cE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogUGljazxPcGVuQUlDcmVkZW50aWFscywgXCJhY2Nlc3NUb2tlblwiIHwgXCJhY2NvdW50SWRcIj47XG4gIGZldGNoPzogdHlwZW9mIGZldGNoO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZERpcmVjdChvcHRpb25zOiBPcGVuQUlRdW90YUh0dHBPcHRpb25zKTogUHJvbWlzZTxPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGE+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAob3B0aW9ucy5mZXRjaCA/PyBmZXRjaCkoQ0hBVEdQVF9XSEFNX1VTQUdFX1VSTCwge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzOiBidWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKFxuICAgICAgb3B0aW9ucy5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIG9wdGlvbnMuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICksXG4gICAgLi4uKG9wdGlvbnMuc2lnbmFsID8geyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYE9wZW5BSSBxdW90YSBsb29rdXAgZmFpbGVkOiBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGRhdGEgPSBub3JtYWxpemVXaGFtVXNhZ2UoYm9keSk7XG4gIHJldHVybiB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH07XG59XG5cbmZ1bmN0aW9uIHdpbmRvd0Zyb20odmFsdWU6IHVua25vd24pIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdXNlZFBlcmNlbnQgPSBOdW1iZXIoc291cmNlLnVzZWRQZXJjZW50ID8/IHNvdXJjZS51c2VkX3BlcmNlbnQpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh1c2VkUGVyY2VudCkpIHJldHVybiBudWxsO1xuICBjb25zdCBkdXJhdGlvbiA9IHNvdXJjZS53aW5kb3dEdXJhdGlvbk1pbnMgPz8gc291cmNlLndpbmRvd19taW51dGVzO1xuICBjb25zdCByZXNldHMgPSBzb3VyY2UucmVzZXRzQXQgPz8gc291cmNlLnJlc2V0X2F0O1xuICByZXR1cm4ge1xuICAgIHVzZWRQZXJjZW50LFxuICAgIHdpbmRvd0R1cmF0aW9uTWluczogZHVyYXRpb24gPT09IG51bGwgfHwgZHVyYXRpb24gPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIoZHVyYXRpb24pLFxuICAgIHJlc2V0c0F0OiByZXNldHMgPT09IG51bGwgfHwgcmVzZXRzID09PSB1bmRlZmluZWQgPyBudWxsIDogTnVtYmVyKHJlc2V0cyksXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNuYXBzaG90RnJvbSh2YWx1ZTogdW5rbm93bik6IFF1b3RhUmF0ZUxpbWl0U25hcHNob3Qge1xuICBjb25zdCBzb3VyY2UgPSAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiID8gdmFsdWUgOiB7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGxpbWl0SWQgPSBzb3VyY2UubGltaXRJZCA/PyBzb3VyY2UubGltaXRfaWQ7XG4gIGNvbnN0IGxpbWl0TmFtZSA9IHNvdXJjZS5saW1pdE5hbWUgPz8gc291cmNlLmxpbWl0X25hbWU7XG4gIHJldHVybiB7XG4gICAgbGltaXRJZDogdHlwZW9mIGxpbWl0SWQgPT09IFwic3RyaW5nXCIgPyBsaW1pdElkIDogbnVsbCxcbiAgICBsaW1pdE5hbWU6IHR5cGVvZiBsaW1pdE5hbWUgPT09IFwic3RyaW5nXCIgPyBsaW1pdE5hbWUgOiBudWxsLFxuICAgIHByaW1hcnk6IHdpbmRvd0Zyb20oc291cmNlLnByaW1hcnkgPz8gc291cmNlLnByaW1hcnlfd2luZG93KSxcbiAgICBzZWNvbmRhcnk6IHdpbmRvd0Zyb20oc291cmNlLnNlY29uZGFyeSA/PyBzb3VyY2Uuc2Vjb25kYXJ5X3dpbmRvdyksXG4gICAgY3JlZGl0czogKHNvdXJjZS5jcmVkaXRzID8/IG51bGwpIGFzIFF1b3RhUmF0ZUxpbWl0U25hcHNob3RbXCJjcmVkaXRzXCJdLFxuICAgIHBsYW5UeXBlOlxuICAgICAgdHlwZW9mIChzb3VyY2UucGxhblR5cGUgPz8gc291cmNlLnBsYW5fdHlwZSkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBTdHJpbmcoc291cmNlLnBsYW5UeXBlID8/IHNvdXJjZS5wbGFuX3R5cGUpXG4gICAgICAgIDogbnVsbCxcbiAgICByYXRlTGltaXRSZWFjaGVkVHlwZTpcbiAgICAgIHR5cGVvZiAoc291cmNlLnJhdGVMaW1pdFJlYWNoZWRUeXBlID8/IHNvdXJjZS5yYXRlX2xpbWl0X3JlYWNoZWQpID09PSBcInN0cmluZ1wiXG4gICAgICAgID8gU3RyaW5nKHNvdXJjZS5yYXRlTGltaXRSZWFjaGVkVHlwZSA/PyBzb3VyY2UucmF0ZV9saW1pdF9yZWFjaGVkKVxuICAgICAgICA6IG51bGwsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVdoYW1Vc2FnZShib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFF1b3RhUmF0ZUxpbWl0cyB7XG4gIGlmIChib2R5LnJhdGVMaW1pdHMgJiYgdHlwZW9mIGJvZHkucmF0ZUxpbWl0cyA9PT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiBib2R5IGFzIFF1b3RhUmF0ZUxpbWl0cztcbiAgfVxuICBjb25zdCBjb250YWluZXIgPVxuICAgIGJvZHkucmF0ZV9saW1pdHMgJiYgdHlwZW9mIGJvZHkucmF0ZV9saW1pdHMgPT09IFwib2JqZWN0XCJcbiAgICAgID8gKGJvZHkucmF0ZV9saW1pdHMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pXG4gICAgICA6IGJvZHk7XG4gIGNvbnN0IHNoYXJlZCA9IHtcbiAgICBwbGFuX3R5cGU6IGJvZHkucGxhbl90eXBlID8/IGNvbnRhaW5lci5wbGFuX3R5cGUsXG4gICAgY3JlZGl0czogYm9keS5jcmVkaXRzID8/IGNvbnRhaW5lci5jcmVkaXRzLFxuICAgIHJhdGVfbGltaXRfcmVhY2hlZDogYm9keS5yYXRlX2xpbWl0X3JlYWNoZWQgPz8gY29udGFpbmVyLnJhdGVfbGltaXRfcmVhY2hlZCxcbiAgfTtcbiAgY29uc3QgcHJpbWFyeSA9IHNuYXBzaG90RnJvbSh7XG4gICAgLi4uc2hhcmVkLFxuICAgIC4uLigoY29udGFpbmVyLnJhdGVfbGltaXQgPz8gY29udGFpbmVyKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiksXG4gIH0pO1xuICBjb25zdCBhZGRpdGlvbmFsID0gQXJyYXkuaXNBcnJheShjb250YWluZXIuYWRkaXRpb25hbF9yYXRlX2xpbWl0cylcbiAgICA/IGNvbnRhaW5lci5hZGRpdGlvbmFsX3JhdGVfbGltaXRzXG4gICAgOiBBcnJheS5pc0FycmF5KGJvZHkuYWRkaXRpb25hbF9yYXRlX2xpbWl0cylcbiAgICAgID8gYm9keS5hZGRpdGlvbmFsX3JhdGVfbGltaXRzXG4gICAgICA6IFtdO1xuICBjb25zdCBieUlkOiBSZWNvcmQ8c3RyaW5nLCBRdW90YVJhdGVMaW1pdFNuYXBzaG90PiA9IHt9O1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFkZGl0aW9uYWwpIHtcbiAgICBpZiAoIWVudHJ5IHx8IHR5cGVvZiBlbnRyeSAhPT0gXCJvYmplY3RcIikgY29udGludWU7XG4gICAgY29uc3Qgd3JhcHBlciA9IGVudHJ5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGNvbnN0IHNuYXBzaG90ID0gc25hcHNob3RGcm9tKHtcbiAgICAgIC4uLnNoYXJlZCxcbiAgICAgIC4uLigod3JhcHBlci5yYXRlX2xpbWl0ID8/IHdyYXBwZXIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgICB9KTtcbiAgICBpZiAoc25hcHNob3QubGltaXRJZCkgYnlJZFtzbmFwc2hvdC5saW1pdElkXSA9IHNuYXBzaG90O1xuICB9XG4gIHJldHVybiB7XG4gICAgcmF0ZUxpbWl0czogcHJpbWFyeSxcbiAgICByYXRlTGltaXRzQnlMaW1pdElkOiBPYmplY3Qua2V5cyhieUlkKS5sZW5ndGggPyBieUlkIDogbnVsbCxcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRPcGVuQUlRdW90YVVzYWdlKFxuICBzb3VyY2U6ICgoKSA9PiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4pIHwgT3BlbkFJUXVvdGFIdHRwT3B0aW9ucyxcbik6IFByb21pc2U8T3BlbkFJUXVvdGFVc2FnZVJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGRpcmVjdCA9IHR5cGVvZiBzb3VyY2UgIT09IFwiZnVuY3Rpb25cIjtcbiAgICBjb25zdCB7IGRhdGEsIGNhY2hlZEF0IH0gPSBhd2FpdCAodHlwZW9mIHNvdXJjZSA9PT0gXCJmdW5jdGlvblwiID8gc291cmNlKCkgOiByZWFkRGlyZWN0KHNvdXJjZSkpO1xuICAgIGNvbnN0IHJhdGVMaW1pdHMgPSBkYXRhLnJhdGVMaW1pdHM7XG4gICAgY29uc3QgcHJpbWFyeSA9IHJhdGVMaW1pdHM/LnByaW1hcnk7XG5cbiAgICBpZiAoXG4gICAgICAhcHJpbWFyeSB8fFxuICAgICAgdHlwZW9mIHByaW1hcnkudXNlZFBlcmNlbnQgIT09IFwibnVtYmVyXCIgfHxcbiAgICAgICFOdW1iZXIuaXNGaW5pdGUocHJpbWFyeS51c2VkUGVyY2VudClcbiAgICApIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiLCByZWFzb246IFwicHJpbWFyeSB1c2VkUGVyY2VudCB1bmF2YWlsYWJsZVwiIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGtpbmQ6IFwib2tcIixcbiAgICAgIHV0aWxpemF0aW9uUGN0OiBwcmltYXJ5LnVzZWRQZXJjZW50LFxuICAgICAgY2FjaGVBZ2VNczogTWF0aC5tYXgoRGF0ZS5ub3coKSAtIGNhY2hlZEF0LCAwKSxcbiAgICAgIHdpbmRvd0R1cmF0aW9uTWluczogcHJpbWFyeS53aW5kb3dEdXJhdGlvbk1pbnMsXG4gICAgICByZXNldHNBdDogcHJpbWFyeS5yZXNldHNBdCxcbiAgICAgIGxpbWl0SWQ6IHJhdGVMaW1pdHMubGltaXRJZCxcbiAgICAgIC4uLihkaXJlY3QgPyB7IHJhdzogZGF0YSB9IDoge30pLFxuICAgIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBraW5kOiBcImxvb2t1cF9mYWlsZWRcIiwgcmVhc29uOiAoZSBhcyBFcnJvcikubWVzc2FnZSB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBSUEsTUFBYSx5QkFBeUI7QUF5QnRDLGVBQWUsV0FBVyxTQUFvRTtDQUM1RixNQUFNLFdBQVcsT0FBTyxRQUFRLFNBQVMsTUFBQSxDQUFPLHdCQUF3QjtFQUN0RSxRQUFRO0VBQ1IsU0FBUywwQkFDUCxRQUFRLFlBQVksYUFDcEIsUUFBUSxZQUFZLFNBQ3RCO0VBQ0EsR0FBSSxRQUFRLFNBQVMsRUFBRSxRQUFRLFFBQVEsT0FBTyxJQUFJLENBQUM7Q0FDckQsQ0FBQztDQUNELElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxJQUFJLE1BQU0sb0NBQW9DLFNBQVMsUUFBUTtDQUd2RixPQUFPO0VBQUUsTUFESSxtQkFBbUIsTUFEWixTQUFTLEtBQUssQ0FFekI7RUFBTSxVQUFVLEtBQUssSUFBSTtDQUFFO0FBQ3RDO0FBRUEsU0FBUyxXQUFXLE9BQWdCO0NBQ2xDLElBQUksQ0FBQyxTQUFTLE9BQU8sVUFBVSxVQUFVLE9BQU87Q0FDaEQsTUFBTSxTQUFTO0NBQ2YsTUFBTSxjQUFjLE9BQU8sT0FBTyxlQUFlLE9BQU8sWUFBWTtD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
101
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLXF1b3RhLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlscy9wcm92aWRlcnMvb3BlbmFpL29wZW5haS1xdW90YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyB0eXBlIFF1b3RhUmF0ZUxpbWl0cywgdHlwZSBRdW90YVJhdGVMaW1pdFNuYXBzaG90IH0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci10eXBlc1wiO1xuaW1wb3J0IHsgYnVpbGRDb2RleElkZW50aXR5SGVhZGVycyB9IGZyb20gXCIuL29wZW5haS1iYWNrZW5kLXByb3RvY29sXCI7XG5cbmV4cG9ydCBjb25zdCBDSEFUR1BUX1dIQU1fVVNBR0VfVVJMID0gXCJodHRwczovL2NoYXRncHQuY29tL2JhY2tlbmQtYXBpL3doYW0vdXNhZ2VcIiBhcyBjb25zdDtcblxuZXhwb3J0IHR5cGUgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhID0ge1xuICBkYXRhOiBRdW90YVJhdGVMaW1pdHM7XG4gIGNhY2hlZEF0OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcGVuQUlRdW90YVVzYWdlUmVzdWx0ID1cbiAgfCB7XG4gICAgICBraW5kOiBcIm9rXCI7XG4gICAgICB1dGlsaXphdGlvblBjdDogbnVtYmVyO1xuICAgICAgY2FjaGVBZ2VNczogbnVtYmVyO1xuICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBudW1iZXIgfCBudWxsO1xuICAgICAgcmVzZXRzQXQ6IG51bWJlciB8IG51bGw7XG4gICAgICBsaW1pdElkOiBzdHJpbmcgfCBudWxsO1xuICAgICAgcmF3PzogUXVvdGFSYXRlTGltaXRzO1xuICAgIH1cbiAgfCB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiOyByZWFzb246IHN0cmluZyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSVF1b3RhSHR0cE9wdGlvbnMge1xuICBjcmVkZW50aWFsczogUGljazxPcGVuQUlDcmVkZW50aWFscywgXCJhY2Nlc3NUb2tlblwiIHwgXCJhY2NvdW50SWRcIj47XG4gIGZldGNoPzogdHlwZW9mIGZldGNoO1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZERpcmVjdChvcHRpb25zOiBPcGVuQUlRdW90YUh0dHBPcHRpb25zKTogUHJvbWlzZTxPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGE+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCAob3B0aW9ucy5mZXRjaCA/PyBmZXRjaCkoQ0hBVEdQVF9XSEFNX1VTQUdFX1VSTCwge1xuICAgIG1ldGhvZDogXCJHRVRcIixcbiAgICBoZWFkZXJzOiBidWlsZENvZGV4SWRlbnRpdHlIZWFkZXJzKFxuICAgICAgb3B0aW9ucy5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgIG9wdGlvbnMuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICksXG4gICAgLi4uKG9wdGlvbnMuc2lnbmFsID8geyBzaWduYWw6IG9wdGlvbnMuc2lnbmFsIH0gOiB7fSksXG4gIH0pO1xuICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IoYE9wZW5BSSBxdW90YSBsb29rdXAgZmFpbGVkOiBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWApO1xuICBjb25zdCBib2R5ID0gKGF3YWl0IHJlc3BvbnNlLmpzb24oKSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIGNvbnN0IGRhdGEgPSBub3JtYWxpemVXaGFtVXNhZ2UoYm9keSk7XG4gIHJldHVybiB7IGRhdGEsIGNhY2hlZEF0OiBEYXRlLm5vdygpIH07XG59XG5cbmZ1bmN0aW9uIHdpbmRvd0Zyb20odmFsdWU6IHVua25vd24pIHtcbiAgaWYgKCF2YWx1ZSB8fCB0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIpIHJldHVybiBudWxsO1xuICBjb25zdCBzb3VyY2UgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgdXNlZFBlcmNlbnQgPSBOdW1iZXIoc291cmNlLnVzZWRQZXJjZW50ID8/IHNvdXJjZS51c2VkX3BlcmNlbnQpO1xuICBpZiAoIU51bWJlci5pc0Zpbml0ZSh1c2VkUGVyY2VudCkpIHJldHVybiBudWxsO1xuICBjb25zdCBkdXJhdGlvbk1pbnMgPSBzb3VyY2Uud2luZG93RHVyYXRpb25NaW5zID8/IHNvdXJjZS53aW5kb3dfbWludXRlcztcbiAgY29uc3QgZHVyYXRpb25TZWNvbmRzID0gc291cmNlLmxpbWl0V2luZG93U2Vjb25kcyA/PyBzb3VyY2UubGltaXRfd2luZG93X3NlY29uZHM7XG4gIGNvbnN0IHJlc2V0cyA9IHNvdXJjZS5yZXNldHNBdCA/PyBzb3VyY2UucmVzZXRfYXQ7XG4gIHJldHVybiB7XG4gICAgdXNlZFBlcmNlbnQsXG4gICAgd2luZG93RHVyYXRpb25NaW5zOlxuICAgICAgZHVyYXRpb25NaW5zICE9PSBudWxsICYmIGR1cmF0aW9uTWlucyAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gTnVtYmVyKGR1cmF0aW9uTWlucylcbiAgICAgICAgOiBkdXJhdGlvblNlY29uZHMgIT09IG51bGwgJiYgZHVyYXRpb25TZWNvbmRzICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IE51bWJlcihkdXJhdGlvblNlY29uZHMpIC8gNjBcbiAgICAgICAgICA6IG51bGwsXG4gICAgcmVzZXRzQXQ6IHJlc2V0cyA9PT0gbnVsbCB8fCByZXNldHMgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBOdW1iZXIocmVzZXRzKSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gc25hcHNob3RGcm9tKHZhbHVlOiB1bmtub3duKTogUXVvdGFSYXRlTGltaXRTbmFwc2hvdCB7XG4gIGNvbnN0IHNvdXJjZSA9ICh2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgPyB2YWx1ZSA6IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgbGltaXRJZCA9IHNvdXJjZS5saW1pdElkID8/IHNvdXJjZS5saW1pdF9pZDtcbiAgY29uc3QgbGltaXROYW1lID0gc291cmNlLmxpbWl0TmFtZSA/PyBzb3VyY2UubGltaXRfbmFtZTtcbiAgcmV0dXJuIHtcbiAgICBsaW1pdElkOiB0eXBlb2YgbGltaXRJZCA9PT0gXCJzdHJpbmdcIiA/IGxpbWl0SWQgOiBudWxsLFxuICAgIGxpbWl0TmFtZTogdHlwZW9mIGxpbWl0TmFtZSA9PT0gXCJzdHJpbmdcIiA/IGxpbWl0TmFtZSA6IG51bGwsXG4gICAgcHJpbWFyeTogd2luZG93RnJvbShzb3VyY2UucHJpbWFyeSA/PyBzb3VyY2UucHJpbWFyeV93aW5kb3cpLFxuICAgIHNlY29uZGFyeTogd2luZG93RnJvbShzb3VyY2Uuc2Vjb25kYXJ5ID8/IHNvdXJjZS5zZWNvbmRhcnlfd2luZG93KSxcbiAgICBjcmVkaXRzOiAoc291cmNlLmNyZWRpdHMgPz8gbnVsbCkgYXMgUXVvdGFSYXRlTGltaXRTbmFwc2hvdFtcImNyZWRpdHNcIl0sXG4gICAgcGxhblR5cGU6XG4gICAgICB0eXBlb2YgKHNvdXJjZS5wbGFuVHlwZSA/PyBzb3VyY2UucGxhbl90eXBlKSA9PT0gXCJzdHJpbmdcIlxuICAgICAgICA/IFN0cmluZyhzb3VyY2UucGxhblR5cGUgPz8gc291cmNlLnBsYW5fdHlwZSlcbiAgICAgICAgOiBudWxsLFxuICAgIHJhdGVMaW1pdFJlYWNoZWRUeXBlOlxuICAgICAgdHlwZW9mIChzb3VyY2UucmF0ZUxpbWl0UmVhY2hlZFR5cGUgPz8gc291cmNlLnJhdGVfbGltaXRfcmVhY2hlZCkgPT09IFwic3RyaW5nXCJcbiAgICAgICAgPyBTdHJpbmcoc291cmNlLnJhdGVMaW1pdFJlYWNoZWRUeXBlID8/IHNvdXJjZS5yYXRlX2xpbWl0X3JlYWNoZWQpXG4gICAgICAgIDogbnVsbCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplV2hhbVVzYWdlKGJvZHk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUXVvdGFSYXRlTGltaXRzIHtcbiAgaWYgKGJvZHkucmF0ZUxpbWl0cyAmJiB0eXBlb2YgYm9keS5yYXRlTGltaXRzID09PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIGJvZHkgYXMgUXVvdGFSYXRlTGltaXRzO1xuICB9XG4gIGNvbnN0IGNvbnRhaW5lciA9XG4gICAgYm9keS5yYXRlX2xpbWl0cyAmJiB0eXBlb2YgYm9keS5yYXRlX2xpbWl0cyA9PT0gXCJvYmplY3RcIlxuICAgICAgPyAoYm9keS5yYXRlX2xpbWl0cyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilcbiAgICAgIDogYm9keTtcbiAgY29uc3Qgc2hhcmVkID0ge1xuICAgIHBsYW5fdHlwZTogYm9keS5wbGFuX3R5cGUgPz8gY29udGFpbmVyLnBsYW5fdHlwZSxcbiAgICBjcmVkaXRzOiBib2R5LmNyZWRpdHMgPz8gY29udGFpbmVyLmNyZWRpdHMsXG4gICAgcmF0ZV9saW1pdF9yZWFjaGVkOiBib2R5LnJhdGVfbGltaXRfcmVhY2hlZCA/PyBjb250YWluZXIucmF0ZV9saW1pdF9yZWFjaGVkLFxuICB9O1xuICBjb25zdCBwcmltYXJ5ID0gc25hcHNob3RGcm9tKHtcbiAgICAuLi5zaGFyZWQsXG4gICAgLi4uKChjb250YWluZXIucmF0ZV9saW1pdCA/PyBjb250YWluZXIpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSxcbiAgfSk7XG4gIGNvbnN0IGFkZGl0aW9uYWwgPSBBcnJheS5pc0FycmF5KGNvbnRhaW5lci5hZGRpdGlvbmFsX3JhdGVfbGltaXRzKVxuICAgID8gY29udGFpbmVyLmFkZGl0aW9uYWxfcmF0ZV9saW1pdHNcbiAgICA6IEFycmF5LmlzQXJyYXkoYm9keS5hZGRpdGlvbmFsX3JhdGVfbGltaXRzKVxuICAgICAgPyBib2R5LmFkZGl0aW9uYWxfcmF0ZV9saW1pdHNcbiAgICAgIDogW107XG4gIGNvbnN0IGJ5SWQ6IFJlY29yZDxzdHJpbmcsIFF1b3RhUmF0ZUxpbWl0U25hcHNob3Q+ID0ge307XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYWRkaXRpb25hbCkge1xuICAgIGlmICghZW50cnkgfHwgdHlwZW9mIGVudHJ5ICE9PSBcIm9iamVjdFwiKSBjb250aW51ZTtcbiAgICBjb25zdCB3cmFwcGVyID0gZW50cnkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3Qgc25hcHNob3QgPSBzbmFwc2hvdEZyb20oe1xuICAgICAgLi4uc2hhcmVkLFxuICAgICAgLi4uKCh3cmFwcGVyLnJhdGVfbGltaXQgPz8gd3JhcHBlcikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLFxuICAgIH0pO1xuICAgIGlmIChzbmFwc2hvdC5saW1pdElkKSBieUlkW3NuYXBzaG90LmxpbWl0SWRdID0gc25hcHNob3Q7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICByYXRlTGltaXRzOiBwcmltYXJ5LFxuICAgIHJhdGVMaW1pdHNCeUxpbWl0SWQ6IE9iamVjdC5rZXlzKGJ5SWQpLmxlbmd0aCA/IGJ5SWQgOiBudWxsLFxuICB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZE9wZW5BSVF1b3RhVXNhZ2UoXG4gIHNvdXJjZTogKCgpID0+IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPikgfCBPcGVuQUlRdW90YUh0dHBPcHRpb25zLFxuKTogUHJvbWlzZTxPcGVuQUlRdW90YVVzYWdlUmVzdWx0PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZGlyZWN0ID0gdHlwZW9mIHNvdXJjZSAhPT0gXCJmdW5jdGlvblwiO1xuICAgIGNvbnN0IHsgZGF0YSwgY2FjaGVkQXQgfSA9IGF3YWl0ICh0eXBlb2Ygc291cmNlID09PSBcImZ1bmN0aW9uXCIgPyBzb3VyY2UoKSA6IHJlYWREaXJlY3Qoc291cmNlKSk7XG4gICAgY29uc3QgcmF0ZUxpbWl0cyA9IGRhdGEucmF0ZUxpbWl0cztcbiAgICBjb25zdCBwcmltYXJ5ID0gcmF0ZUxpbWl0cz8ucHJpbWFyeTtcblxuICAgIGlmIChcbiAgICAgICFwcmltYXJ5IHx8XG4gICAgICB0eXBlb2YgcHJpbWFyeS51c2VkUGVyY2VudCAhPT0gXCJudW1iZXJcIiB8fFxuICAgICAgIU51bWJlci5pc0Zpbml0ZShwcmltYXJ5LnVzZWRQZXJjZW50KVxuICAgICkge1xuICAgICAgcmV0dXJuIHsga2luZDogXCJsb29rdXBfZmFpbGVkXCIsIHJlYXNvbjogXCJwcmltYXJ5IHVzZWRQZXJjZW50IHVuYXZhaWxhYmxlXCIgfTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAga2luZDogXCJva1wiLFxuICAgICAgdXRpbGl6YXRpb25QY3Q6IHByaW1hcnkudXNlZFBlcmNlbnQsXG4gICAgICBjYWNoZUFnZU1zOiBNYXRoLm1heChEYXRlLm5vdygpIC0gY2FjaGVkQXQsIDApLFxuICAgICAgd2luZG93RHVyYXRpb25NaW5zOiBwcmltYXJ5LndpbmRvd0R1cmF0aW9uTWlucyxcbiAgICAgIHJlc2V0c0F0OiBwcmltYXJ5LnJlc2V0c0F0LFxuICAgICAgbGltaXRJZDogcmF0ZUxpbWl0cy5saW1pdElkLFxuICAgICAgLi4uKGRpcmVjdCA/IHsgcmF3OiBkYXRhIH0gOiB7fSksXG4gICAgfTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB7IGtpbmQ6IFwibG9va3VwX2ZhaWxlZFwiLCByZWFzb246IChlIGFzIEVycm9yKS5tZXNzYWdlIH07XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7QUFJQSxNQUFhLHlCQUF5QjtBQXlCdEMsZUFBZSxXQUFXLFNBQW9FO0NBQzVGLE1BQU0sV0FBVyxPQUFPLFFBQVEsU0FBUyxNQUFBLENBQU8sd0JBQXdCO0VBQ3RFLFFBQVE7RUFDUixTQUFTLDBCQUNQLFFBQVEsWUFBWSxhQUNwQixRQUFRLFlBQVksU0FDdEI7RUFDQSxHQUFJLFFBQVEsU0FBUyxFQUFFLFFBQVEsUUFBUSxPQUFPLElBQUksQ0FBQztDQUNyRCxDQUFDO0NBQ0QsSUFBSSxDQUFDLFNBQVMsSUFBSSxNQUFNLElBQUksTUFBTSxvQ0FBb0MsU0FBUyxRQUFRO0NBR3ZGLE9BQU87RUFBRSxNQURJLG1CQUFtQixNQURaLFNBQVMsS0FBSyxDQUV6QjtFQUFNLFVBQVUsS0FBSyxJQUFJO0NBQUU7QUFDdEM7QUFFQSxTQUFTLFdBQVcsT0FBZ0I7Q0FDbEMsSUFBSSxDQUFDLFNBQVMsT0FBTyxVQUFVLFVBQVUsT0FBTztDQUNoRCxNQUFNLFNBQVM7Q0FDZixNQUFNLGNBQWMsT0FBTyxPQUFPLGVBQWUsT0FBTyxZQUFZO0NBQ3BFLElBQUksQ0FBQyxPQUFPLFNBQVMsV0FBVyxHQUFHLE9BQU87Q0FDMUMsTUFBTSxlQUFlLE9BQU8sc0JBQXNCLE9BQU87Q0FDekQsTUFBTSxrQkFBa0IsT0FBTyxzQkFBc0IsT0FBTztDQUM1RCxNQUFNLFNBQVMsT0FBTyxZQUFZLE9BQU87Q0FDekMsT0FBTztFQUNMO0VBQ0Esb0JBQ0UsaUJBQWlCLFFBQVEsaUJBQWlCLFNBQ3RDLE9BQU8sWUFBWSxJQUNuQixvQkFBb0IsUUFBUSxvQkFBb0IsU0FDOUMsT0FBTyxlQUFlLElBQUksS0FDMUI7RUFDUixVQUFVLFdBQVcsUUFBUSxXQUFXLFNBQVksT0FBTyxPQUFPLE1BQU07Q0FDMUU7QUFDRjtBQUVBLFNBQVMsYUFBYSxPQUF3QztDQUM1RCxNQUFNLFNBQVUsU0FBUyxPQUFPLFVBQVUsV0FBVyxRQUFRLENBQUM7Q0FDOUQsTUFBTSxVQUFVLE9BQU8sV0FBVyxPQUFPO0NBQ3pDLE1BQU0sWUFBWSxPQUFPLGFBQWEsT0FBTztDQUM3QyxPQUFPO0VBQ0wsU0FBUyxPQUFPLFlBQVksV0FBVyxVQUFVO0VBQ2pELFdBQVcsT0FBTyxjQUFjLFdBQVcsWUFBWTtFQUN2RCxTQUFTLFdBQVcsT0FBTyxXQUFXLE9BQU8sY0FBYztFQUMzRCxXQUFXLFdBQVcsT0FBTyxhQUFhLE9BQU8sZ0JBQWdCO0VBQ2pFLFNBQVUsT0FBTyxXQUFXO0VBQzVCLFVBQ0UsUUFBUSxPQUFPLFlBQVksT0FBTyxlQUFlLFdBQzdDLE9BQU8sT0FBTyxZQUFZLE9BQU8sU0FBUyxJQUMxQztFQUNOLHNCQUNFLFFBQVEsT0FBTyx3QkFBd0IsT0FBTyx3QkFBd0IsV0FDbEUsT0FBTyxPQUFPLHdCQUF3QixPQUFPLGtCQUFrQixJQUMvRDtDQUNSO0FBQ0Y7QUFFQSxTQUFTLG1CQUFtQixNQUFnRDtDQUMxRSxJQUFJLEtBQUssY0FBYyxPQUFPLEtBQUssZUFBZSxVQUNoRCxPQUFPO0NBRVQsTUFBTSxZQUNKLEtBQUssZUFBZSxPQUFPLEtBQUssZ0JBQWdCLFdBQzNDLEtBQUssY0FDTjtDQUNOLE1BQU0sU0FBUztFQUNiLFdBQVcsS0FBSyxhQUFhLFVBQVU7RUFDdkMsU0FBUyxLQUFLLFdBQVcsVUFBVTtFQUNuQyxvQkFBb0IsS0FBSyxzQkFBc0IsVUFBVTtDQUMzRDtDQUNBLE1BQU0sVUFBVSxhQUFhO0VBQzNCLEdBQUc7RUFDSCxHQUFLLFVBQVUsY0FBYztDQUMvQixDQUFDO0NBQ0QsTUFBTSxhQUFhLE1BQU0sUUFBUSxVQUFVLHNCQUFzQixJQUM3RCxVQUFVLHlCQUNWLE1BQU0sUUFBUSxLQUFLLHNCQUFzQixJQUN2QyxLQUFLLHlCQUNMLENBQUM7Q0FDUCxNQUFNLE9BQStDLENBQUM7Q0FDdEQsS0FBSyxNQUFNLFNBQVMsWUFBWTtFQUM5QixJQUFJLENBQUMsU0FBUyxPQUFPLFVBQVUsVUFBVTtFQUN6QyxNQUFNLFVBQVU7RUFDaEIsTUFBTSxXQUFXLGFBQWE7R0FDNUIsR0FBRztHQUNILEdBQUssUUFBUSxjQUFjO0VBQzdCLENBQUM7RUFDRCxJQUFJLFNBQVMsU0FBUyxLQUFLLFNBQVMsV0FBVztDQUNqRDtDQUNBLE9BQU87RUFDTCxZQUFZO0VBQ1oscUJBQXFCLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxTQUFTLE9BQU87Q0FDekQ7QUFDRjtBQUVBLGVBQXNCLHFCQUNwQixRQUNpQztDQUNqQyxJQUFJO0VBQ0YsTUFBTSxTQUFTLE9BQU8sV0FBVztFQUNqQyxNQUFNLEVBQUUsTUFBTSxhQUFhLE9BQU8sT0FBTyxXQUFXLGFBQWEsT0FBTyxJQUFJLFdBQVcsTUFBTTtFQUM3RixNQUFNLGFBQWEsS0FBSztFQUN4QixNQUFNLFVBQVUsWUFBWTtFQUU1QixJQUNFLENBQUMsV0FDRCxPQUFPLFFBQVEsZ0JBQWdCLFlBQy9CLENBQUMsT0FBTyxTQUFTLFFBQVEsV0FBVyxHQUVwQyxPQUFPO0dBQUUsTUFBTTtHQUFpQixRQUFRO0VBQWtDO0VBRzVFLE9BQU87R0FDTCxNQUFNO0dBQ04sZ0JBQWdCLFFBQVE7R0FDeEIsWUFBWSxLQUFLLElBQUksS0FBSyxJQUFJLElBQUksVUFBVSxDQUFDO0dBQzdDLG9CQUFvQixRQUFRO0dBQzVCLFVBQVUsUUFBUTtHQUNsQixTQUFTLFdBQVc7R0FDcEIsR0FBSSxTQUFTLEVBQUUsS0FBSyxLQUFLLElBQUksQ0FBQztFQUNoQztDQUNGLFNBQVMsR0FBRztFQUNWLE9BQU87R0FBRSxNQUFNO0dBQWlCLFFBQVMsRUFBWTtFQUFRO0NBQy9EO0FBQ0YifQ==
@@ -4,10 +4,18 @@ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
4
  import { CONSOLE_CALLBACK_URL } from "./oauth";
5
5
  import { QgridFrame } from "./qgrid.frame";
6
6
 
7
- const { exchangeMock, openAIExchangeMock, tokenSaveMock, tokenDelMock, findByAccountMock, notifyMock } =
8
- vi.hoisted(() => ({
7
+ const {
8
+ exchangeMock,
9
+ openAIExchangeMock,
10
+ relayStartMock,
11
+ tokenSaveMock,
12
+ tokenDelMock,
13
+ findByAccountMock,
14
+ notifyMock,
15
+ } = vi.hoisted(() => ({
9
16
  exchangeMock: vi.fn(),
10
17
  openAIExchangeMock: vi.fn(),
18
+ relayStartMock: vi.fn(async () => "http://localhost:1455/auth/callback"),
11
19
  tokenSaveMock: vi.fn(async () => [1]),
12
20
  tokenDelMock: vi.fn(async () => 1),
13
21
  findByAccountMock: vi.fn(async () => []),
@@ -40,6 +48,12 @@ vi.mock("../../utils/providers/openai/openai-oauth", async (importOriginal) => (
40
48
  exchangeOpenAICode: openAIExchangeMock,
41
49
  }));
42
50
 
51
+ // The relay binds a real loopback port; these tests only assert which redirect URI is signed in.
52
+ vi.mock("../../utils/providers/openai/openai-callback-relay", async (importOriginal) => ({
53
+ ...(await importOriginal<typeof import("../../utils/providers/openai/openai-callback-relay")>()),
54
+ startOpenAICallbackRelay: relayStartMock,
55
+ }));
56
+
43
57
  vi.mock("../token/token.model", () => ({
44
58
  TokenModel: {
45
59
  save: tokenSaveMock,
@@ -193,22 +207,36 @@ describe("QgridFrame direct OpenAI OAuth", () => {
193
207
  tokenDelMock.mockClear();
194
208
  findByAccountMock.mockClear().mockResolvedValue([]);
195
209
  notifyMock.mockClear();
210
+ relayStartMock.mockClear();
196
211
  });
197
212
 
198
- it("uses the pinned loopback callback despite hostile forwarding headers", async () => {
213
+ it("uses manual code completion without opening a server relay on remote origins", async () => {
199
214
  mockHttpContext({ origin: "https://qgrid.example.com" });
200
215
 
201
216
  const result = await QgridFrame.oauthStartOpenAI("openai-token");
202
217
  const url = new URL(result.authUrl);
203
- expect(result.mode).toBe("redirect");
218
+ expect(result.mode).toBe("code");
204
219
  expect(url.origin + url.pathname).toBe("https://auth.openai.com/oauth/authorize");
205
- expect(url.searchParams.get("redirect_uri")).toBe("http://localhost:44900/auth/callback");
220
+ expect(url.searchParams.get("redirect_uri")).toBe("http://localhost:1455/auth/callback");
206
221
  expect(url.searchParams.get("state")).toBeTruthy();
207
222
  expect(url.searchParams.get("code_challenge_method")).toBe("S256");
223
+ expect(relayStartMock).not.toHaveBeenCalled();
224
+ });
225
+
226
+ it("keeps the automatic callback relay for loopback origins", async () => {
227
+ mockHttpContext({ origin: "http://localhost:44900" });
228
+
229
+ const result = await QgridFrame.oauthStartOpenAI("openai-token");
230
+
231
+ expect(result.mode).toBe("redirect");
232
+ expect(authUrlParam(result.authUrl, "redirect_uri")).toBe(
233
+ "http://localhost:1455/auth/callback",
234
+ );
235
+ expect(relayStartMock).toHaveBeenCalledWith("http://localhost:44900", 5 * 60_000);
208
236
  });
209
237
 
210
238
  it("exchanges an OpenAI callback, replaces the duplicate account, and notifies", async () => {
211
- mockHttpContext({ origin: "https://qgrid.example.com" });
239
+ mockHttpContext({ origin: "http://localhost:44900" });
212
240
  const { authUrl } = await QgridFrame.oauthStartOpenAI("openai-token");
213
241
  const state = authUrlParam(authUrl, "state")!;
214
242
  findByAccountMock.mockResolvedValueOnce([{ id: 9, active: true }] as never);
@@ -228,7 +256,7 @@ describe("QgridFrame direct OpenAI OAuth", () => {
228
256
  expect(openAIExchangeMock).toHaveBeenCalledWith(
229
257
  "the-code",
230
258
  expect.any(String),
231
- "http://localhost:44900/auth/callback",
259
+ "http://localhost:1455/auth/callback",
232
260
  );
233
261
  expect(tokenDelMock).toHaveBeenCalledOnce();
234
262
  expect(tokenSaveMock).toHaveBeenCalledWith([
@@ -242,8 +270,43 @@ describe("QgridFrame direct OpenAI OAuth", () => {
242
270
  expect(reply.redirect).toHaveBeenCalledWith("/?oauth=success&name=openai-token");
243
271
  });
244
272
 
245
- it("consumes OpenAI state before a failed exchange", async () => {
273
+ it("exchanges a pasted OpenAI callback URL for remote login", async () => {
246
274
  mockHttpContext({ origin: "https://qgrid.example.com" });
275
+ const { authUrl } = await QgridFrame.oauthStartOpenAI("remote-openai-token");
276
+ const state = authUrlParam(authUrl, "state")!;
277
+ openAIExchangeMock.mockResolvedValueOnce({
278
+ accessToken: "access",
279
+ refreshToken: "refresh",
280
+ idToken: "id",
281
+ accessTokenExpiresAt: 123,
282
+ idTokenExpiresAt: 456,
283
+ accountId: "account-1",
284
+ planType: "pro",
285
+ });
286
+
287
+ await expect(
288
+ QgridFrame.oauthComplete(
289
+ `http://localhost:1455/auth/callback?code=the-code&state=${state}`,
290
+ ),
291
+ ).resolves.toEqual({ added: true, name: "remote-openai-token" });
292
+
293
+ expect(openAIExchangeMock).toHaveBeenCalledWith(
294
+ "the-code",
295
+ expect.any(String),
296
+ "http://localhost:1455/auth/callback",
297
+ );
298
+ expect(tokenSaveMock).toHaveBeenCalledWith([
299
+ expect.objectContaining({
300
+ provider: "openai",
301
+ name: "remote-openai-token",
302
+ credentials: expect.objectContaining({ accountId: "account-1" }),
303
+ }),
304
+ ]);
305
+ expect(notifyMock).toHaveBeenCalledWith("remote-openai-token", "openai");
306
+ });
307
+
308
+ it("consumes OpenAI state before a failed exchange", async () => {
309
+ mockHttpContext({ origin: "http://localhost:44900" });
247
310
  const { authUrl } = await QgridFrame.oauthStartOpenAI("openai-token");
248
311
  const state = authUrlParam(authUrl, "state")!;
249
312
  openAIExchangeMock.mockRejectedValueOnce(new Error("exchange rejected"));