@excalidraw/excalidraw 0.17.2 → 0.17.3

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 (119) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/dist/excalidraw-assets-dev/{vendor-24fff00bcf5a7372c15c.js → vendor-1e45dd9aba63a718dcee.js} +1013 -1013
  3. package/dist/excalidraw-with-preact.development.js +16 -16
  4. package/dist/excalidraw-with-preact.production.min.js +1 -1
  5. package/dist/excalidraw.development.js +157 -146
  6. package/dist/excalidraw.production.min.js +1 -1
  7. package/dist/excalidraw.production.min.js.LICENSE.txt +10 -0
  8. package/package.json +1 -1
  9. package/types/element/newElement.d.ts +1 -1
  10. package/types/packages/excalidraw/dist/excalidraw.development.d.ts +2 -2
  11. package/types/packages/excalidraw/webpack.preact.config.d.ts +127 -23
  12. package/types/actions/actionToggleLock.d.ts +0 -119
  13. package/types/components/ColorPicker.d.ts +0 -14
  14. package/types/components/LibraryButton.d.ts +0 -8
  15. package/types/components/context/tunnels.d.ts +0 -16
  16. package/types/components/hoc/withUpstreamOverride.d.ts +0 -10
  17. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ar-SA-json-06d4bd2f3a164162f2b8.d.ts +0 -0
  18. package/types/packages/excalidraw/dist/excalidraw-assets/locales/bg-BG-json-72ac7b7548d7fefdcd2a.d.ts +0 -0
  19. package/types/packages/excalidraw/dist/excalidraw-assets/locales/bn-BD-json-759924ef13bd9e602cb3.d.ts +0 -0
  20. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ca-ES-json-6108f4ae0be3d1e369a6.d.ts +0 -0
  21. package/types/packages/excalidraw/dist/excalidraw-assets/locales/cs-CZ-json-1ae99f296c9febb99f72.d.ts +0 -0
  22. package/types/packages/excalidraw/dist/excalidraw-assets/locales/da-DK-json-ed85a6f48e1df51b1b46.d.ts +0 -0
  23. package/types/packages/excalidraw/dist/excalidraw-assets/locales/de-DE-json-f70dfb7201a16dc3f9fc.d.ts +0 -0
  24. package/types/packages/excalidraw/dist/excalidraw-assets/locales/el-GR-json-79f7d66730b39df84f8e.d.ts +0 -0
  25. package/types/packages/excalidraw/dist/excalidraw-assets/locales/es-ES-json-682b92427b8b27bb0aa8.d.ts +0 -0
  26. package/types/packages/excalidraw/dist/excalidraw-assets/locales/eu-ES-json-1cc77079b354b962615f.d.ts +0 -0
  27. package/types/packages/excalidraw/dist/excalidraw-assets/locales/fa-IR-json-586a1324f942d89620b6.d.ts +0 -0
  28. package/types/packages/excalidraw/dist/excalidraw-assets/locales/fi-FI-json-d43636fb51002f55e2a4.d.ts +0 -0
  29. package/types/packages/excalidraw/dist/excalidraw-assets/locales/fr-FR-json-b5ea877625968f748b7f.d.ts +0 -0
  30. package/types/packages/excalidraw/dist/excalidraw-assets/locales/gl-ES-json-2117445509ba7c479ee0.d.ts +0 -0
  31. package/types/packages/excalidraw/dist/excalidraw-assets/locales/he-IL-json-3280be0edae615c7685f.d.ts +0 -0
  32. package/types/packages/excalidraw/dist/excalidraw-assets/locales/hi-IN-json-dad8ce15f9b7a435a926.d.ts +0 -0
  33. package/types/packages/excalidraw/dist/excalidraw-assets/locales/hu-HU-json-6ccf0d8a164ecec52187.d.ts +0 -0
  34. package/types/packages/excalidraw/dist/excalidraw-assets/locales/id-ID-json-6031eb8be253b20c28e9.d.ts +0 -0
  35. package/types/packages/excalidraw/dist/excalidraw-assets/locales/it-IT-json-446b14f993000d0f572f.d.ts +0 -0
  36. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ja-JP-json-ef6ec5abb0c3c53c7a51.d.ts +0 -0
  37. package/types/packages/excalidraw/dist/excalidraw-assets/locales/kab-KAB-json-69853849c71eff277ba0.d.ts +0 -0
  38. package/types/packages/excalidraw/dist/excalidraw-assets/locales/kk-KZ-json-1f9df2b51e34996bad30.d.ts +0 -0
  39. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ko-KR-json-cf33ecf52ab95055544b.d.ts +0 -0
  40. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ku-TR-json-d10a4bb9ede3c08a08e1.d.ts +0 -0
  41. package/types/packages/excalidraw/dist/excalidraw-assets/locales/lt-LT-json-08c7fc343ef2f533ec5f.d.ts +0 -0
  42. package/types/packages/excalidraw/dist/excalidraw-assets/locales/lv-LV-json-1e3a5e87e39d2d90274c.d.ts +0 -0
  43. package/types/packages/excalidraw/dist/excalidraw-assets/locales/mr-IN-json-c922a007bb00d3e4f3b1.d.ts +0 -0
  44. package/types/packages/excalidraw/dist/excalidraw-assets/locales/my-MM-json-1a05d5c242c822079dca.d.ts +0 -0
  45. package/types/packages/excalidraw/dist/excalidraw-assets/locales/nb-NO-json-7ea7ab2356e76889af8d.d.ts +0 -0
  46. package/types/packages/excalidraw/dist/excalidraw-assets/locales/nl-NL-json-5805f36f33a3f8e53adc.d.ts +0 -0
  47. package/types/packages/excalidraw/dist/excalidraw-assets/locales/nn-NO-json-8209f0f674435b52293d.d.ts +0 -0
  48. package/types/packages/excalidraw/dist/excalidraw-assets/locales/oc-FR-json-e90ca79174b6e1eccb72.d.ts +0 -0
  49. package/types/packages/excalidraw/dist/excalidraw-assets/locales/pa-IN-json-1854ecccf3c6f8ea9c46.d.ts +0 -0
  50. package/types/packages/excalidraw/dist/excalidraw-assets/locales/pl-PL-json-b4be83b26070e4cf70ca.d.ts +0 -0
  51. package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-BR-json-2e7a1690edc8d46e8842.d.ts +0 -0
  52. package/types/packages/excalidraw/dist/excalidraw-assets/locales/pt-PT-json-aba1622a80e32e465a3d.d.ts +0 -0
  53. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ro-RO-json-3397acad1a98b5093c8b.d.ts +0 -0
  54. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ru-RU-json-8ab49e8d0473e92a8ab9.d.ts +0 -0
  55. package/types/packages/excalidraw/dist/excalidraw-assets/locales/si-LK-json-db1222db995d9425e281.d.ts +0 -0
  56. package/types/packages/excalidraw/dist/excalidraw-assets/locales/sk-SK-json-50dcb09552f93c2de3a4.d.ts +0 -0
  57. package/types/packages/excalidraw/dist/excalidraw-assets/locales/sl-SI-json-68eba9ac00ae57bae3f4.d.ts +0 -0
  58. package/types/packages/excalidraw/dist/excalidraw-assets/locales/sv-SE-json-36b97455521e61312a47.d.ts +0 -0
  59. package/types/packages/excalidraw/dist/excalidraw-assets/locales/ta-IN-json-4063d11b19f24794564a.d.ts +0 -0
  60. package/types/packages/excalidraw/dist/excalidraw-assets/locales/th-TH-json-3a152569bbebfec7c6c0.d.ts +0 -0
  61. package/types/packages/excalidraw/dist/excalidraw-assets/locales/tr-TR-json-9002b1505b0931924d42.d.ts +0 -0
  62. package/types/packages/excalidraw/dist/excalidraw-assets/locales/uk-UA-json-4e345c790342b7672248.d.ts +0 -0
  63. package/types/packages/excalidraw/dist/excalidraw-assets/locales/vi-VN-json-2f5b95c0011820e16f4b.d.ts +0 -0
  64. package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-CN-json-2cb13b38b6615ada3097.d.ts +0 -0
  65. package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-HK-json-4bcbf71743fda1544a84.d.ts +0 -0
  66. package/types/packages/excalidraw/dist/excalidraw-assets/locales/zh-TW-json-c39caba2da3f001066a8.d.ts +0 -0
  67. package/types/packages/excalidraw/dist/excalidraw-assets/vendor-53d1c69ef585b6dd219b.d.ts +0 -0
  68. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ar-SA-json-8df64942a3f6232064a4.d.ts +0 -2
  69. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/bg-BG-json-f0939048738ceeacefae.d.ts +0 -2
  70. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/bn-BD-json-4b92eb02a90d83c47173.d.ts +0 -2
  71. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ca-ES-json-e85ce0d6447d42432c66.d.ts +0 -2
  72. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/cs-CZ-json-2a885b79b3be836df283.d.ts +0 -2
  73. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/da-DK-json-dfdaec93be64dc2704d9.d.ts +0 -2
  74. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/de-DE-json-72757b9d842748bf832e.d.ts +0 -2
  75. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/el-GR-json-c18382659d1c0307b73b.d.ts +0 -2
  76. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/es-ES-json-aacc6f2fd98f0f967c32.d.ts +0 -2
  77. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/eu-ES-json-63e15be6c04e80959411.d.ts +0 -2
  78. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fa-IR-json-7b9d274d5accc82982e9.d.ts +0 -2
  79. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fi-FI-json-b466031cdd8ef6f8c32b.d.ts +0 -2
  80. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/fr-FR-json-0d4f6fdfa9be76a941d7.d.ts +0 -2
  81. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/gl-ES-json-46863175bb629a5bb37e.d.ts +0 -2
  82. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/he-IL-json-e0bd304682986695208c.d.ts +0 -2
  83. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hi-IN-json-0e1dae2ff14e81ba2dd4.d.ts +0 -2
  84. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/hu-HU-json-230434a2a2eb764d410c.d.ts +0 -2
  85. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/id-ID-json-c163c21859b707d96c6d.d.ts +0 -2
  86. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/it-IT-json-f3776c336b416375460b.d.ts +0 -2
  87. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ja-JP-json-452835b81621e5ae6cb6.d.ts +0 -2
  88. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kab-KAB-json-61a7d382c88b96fe1f38.d.ts +0 -2
  89. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/kk-KZ-json-0f99b0b0e9aeb250f10d.d.ts +0 -2
  90. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ko-KR-json-3de3dc5cb1dac5b79f94.d.ts +0 -2
  91. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ku-TR-json-22a3fdac3947f747cd75.d.ts +0 -2
  92. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lt-LT-json-535e00475a2d73aa8927.d.ts +0 -2
  93. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/lv-LV-json-6e981883d91c29060dd4.d.ts +0 -2
  94. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/mr-IN-json-6ad409707531c84de376.d.ts +0 -2
  95. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/my-MM-json-cb25da0149000113fd3f.d.ts +0 -2
  96. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nb-NO-json-bd11ba266e4e2c0fa619.d.ts +0 -2
  97. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nl-NL-json-8e66a88c43a7eeed44f8.d.ts +0 -2
  98. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/nn-NO-json-608fd6a88621d6d18035.d.ts +0 -2
  99. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/oc-FR-json-dc16297d69033e71846a.d.ts +0 -2
  100. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pa-IN-json-03bbe592bfa55fe214a9.d.ts +0 -2
  101. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pl-PL-json-3e483c75de431520dfa3.d.ts +0 -2
  102. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-BR-json-a9f4548703a436582ea1.d.ts +0 -2
  103. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/pt-PT-json-722910761860dbd3fb87.d.ts +0 -2
  104. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ro-RO-json-fe65a70419c866a6ce94.d.ts +0 -2
  105. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ru-RU-json-2c39ffbb623db8024be0.d.ts +0 -2
  106. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/si-LK-json-a867646cf3fa3a22cafb.d.ts +0 -2
  107. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sk-SK-json-bb5ffb40cd779a63565f.d.ts +0 -2
  108. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sl-SI-json-d1036f8f3d1f6b1a70f4.d.ts +0 -2
  109. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/sv-SE-json-53791d0a923a4de6a2e2.d.ts +0 -2
  110. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/ta-IN-json-30fffc9f1cedf1d559d8.d.ts +0 -2
  111. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/th-TH-json-523e92f9f3b6924c3f66.d.ts +0 -2
  112. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/tr-TR-json-e43e35aa81edeb9058ee.d.ts +0 -2
  113. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/uk-UA-json-2cd06c30d512defd8a0b.d.ts +0 -2
  114. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/vi-VN-json-fe2d25d75865c608e798.d.ts +0 -2
  115. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-CN-json-e5e59a1cd383192a1792.d.ts +0 -2
  116. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-HK-json-2e545ed460deb9818584.d.ts +0 -2
  117. package/types/packages/excalidraw/dist/excalidraw-assets-dev/locales/zh-TW-json-5c0415fa2e3076904544.d.ts +0 -2
  118. package/types/packages/excalidraw/dist/excalidraw-assets-dev/vendor-e6df8519da951026ff69.d.ts +0 -0
  119. /package/types/packages/excalidraw/dist/excalidraw-assets-dev/{vendor-24fff00bcf5a7372c15c.d.ts → vendor-1e45dd9aba63a718dcee.d.ts} +0 -0
@@ -2419,7 +2419,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2419
2419
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2420
2420
 
2421
2421
  "use strict";
2422
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // place here categories that you want to track as events\n // KEEP IN MIND THE PRICING\n const ALLOWED_CATEGORIES_TO_TRACK = []; // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.0\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).VITE_WORKER_ID) {\n return;\n }\n\n if (!ALLOWED_CATEGORIES_TO_TRACK.includes(category)) {\n return;\n }\n\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value\n });\n }\n } catch (error) {\n console.error(\"error during analytics\", error);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QyxvQ0FBb0MsZ0NBQWdDOztBQUVwRSx5Q0FBeUMsc3FDQUFXO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81NDIxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0cmFja0V2ZW50ID0gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkgPT4ge1xuICB0cnkge1xuICAgIC8vIHBsYWNlIGhlcmUgY2F0ZWdvcmllcyB0aGF0IHlvdSB3YW50IHRvIHRyYWNrIGFzIGV2ZW50c1xuICAgIC8vIEtFRVAgSU4gTUlORCBUSEUgUFJJQ0lOR1xuICAgIGNvbnN0IEFMTE9XRURfQ0FURUdPUklFU19UT19UUkFDSyA9IFtdOyAvLyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byB0cmFjayBsb2NhbGx5XG4gICAgLy8gY29uc29sZS5sb2coXCJUcmFjayBFdmVudFwiLCB7IGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8IHByb2Nlc3MuZW52LlZJVEVfV09SS0VSX0lEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFBTExPV0VEX0NBVEVHT1JJRVNfVE9fVFJBQ0suaW5jbHVkZXMoY2F0ZWdvcnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yIGR1cmluZyBhbmFseXRpY3NcIiwgZXJyb3IpO1xuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2422
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // place here categories that you want to track as events\n // KEEP IN MIND THE PRICING\n const ALLOWED_CATEGORIES_TO_TRACK = []; // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.3\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).VITE_WORKER_ID) {\n return;\n }\n\n if (!ALLOWED_CATEGORIES_TO_TRACK.includes(category)) {\n return;\n }\n\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value\n });\n }\n } catch (error) {\n console.error(\"error during analytics\", error);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTztBQUNQO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QyxvQ0FBb0MsZ0NBQWdDOztBQUVwRSx5Q0FBeUMsc3FDQUFXO0FBQ3BEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81NDIxIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0cmFja0V2ZW50ID0gKGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSkgPT4ge1xuICB0cnkge1xuICAgIC8vIHBsYWNlIGhlcmUgY2F0ZWdvcmllcyB0aGF0IHlvdSB3YW50IHRvIHRyYWNrIGFzIGV2ZW50c1xuICAgIC8vIEtFRVAgSU4gTUlORCBUSEUgUFJJQ0lOR1xuICAgIGNvbnN0IEFMTE9XRURfQ0FURUdPUklFU19UT19UUkFDSyA9IFtdOyAvLyBVbmNvbW1lbnQgdGhlIG5leHQgbGluZSB0byB0cmFjayBsb2NhbGx5XG4gICAgLy8gY29uc29sZS5sb2coXCJUcmFjayBFdmVudFwiLCB7IGNhdGVnb3J5LCBhY3Rpb24sIGxhYmVsLCB2YWx1ZSB9KTtcblxuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiIHx8IHByb2Nlc3MuZW52LlZJVEVfV09SS0VSX0lEKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFBTExPV0VEX0NBVEVHT1JJRVNfVE9fVFJBQ0suaW5jbHVkZXMoY2F0ZWdvcnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yIGR1cmluZyBhbmFseXRpY3NcIiwgZXJyb3IpO1xuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2423
2423
 
2424
2424
  /***/ }),
2425
2425
 
@@ -3959,7 +3959,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3959
3959
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3960
3960
 
3961
3961
  "use strict";
3962
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"duplicateElements\": () => (/* binding */ duplicateElements),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newEmbeddableElement\": () => (/* binding */ newEmbeddableElement),\n/* harmony export */ \"newFrameElement\": () => (/* binding */ newFrameElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"regenerateId\": () => (/* binding */ regenerateId),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\n\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n\n var {\n x,\n y,\n strokeColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeColor,\n backgroundColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.backgroundColor,\n fillStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.fillStyle,\n strokeWidth = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeWidth,\n strokeStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeStyle,\n roughness = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.roughness,\n opacity = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.opacity,\n width = 0,\n height = 0,\n angle = 0,\n groupIds = [],\n frameId = null,\n roundness = null,\n boundElements = null,\n link = null,\n locked = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.locked\n } = _a,\n rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"frameId\", \"roundness\", \"boundElements\", \"link\", \"locked\"]); // assign type to guard against excess properties\n\n\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n frameId,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked\n };\n return element;\n};\n\nconst newElement = opts => _newElementBase(opts.type, opts);\nconst newEmbeddableElement = opts => {\n return Object.assign(Object.assign({}, _newElementBase(\"embeddable\", opts)), {\n validated: opts.validated\n });\n};\nconst newFrameElement = opts => {\n const frameElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"frame\", opts)), {\n type: \"frame\",\n name: (opts === null || opts === void 0 ? void 0 : opts.name) || null\n }), {});\n return frameElement;\n};\n/** computes element x/y offset based on textAlign/verticalAlign */\n\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\" ? metrics.width / 2 : opts.textAlign === \"right\" ? metrics.width : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0\n };\n};\n\nconst newTextElement = opts => {\n const fontFamily = opts.fontFamily || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_FAMILY;\n const fontSize = opts.fontSize || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_SIZE;\n const lineHeight = opts.lineHeight || (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getDefaultLineHeight)(fontFamily);\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontFamily,\n fontSize\n }), lineHeight);\n const textAlign = opts.textAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_TEXT_ALIGN;\n const verticalAlign = opts.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_VERTICAL_ALIGN;\n const offsets = getTextElementPositionOffsets({\n textAlign,\n verticalAlign\n }, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), {\n text,\n fontSize,\n fontFamily,\n textAlign,\n verticalAlign,\n x: opts.x - offsets.x,\n y: opts.y - offsets.y,\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n containerId: opts.containerId || null,\n originalText: text,\n lineHeight\n }), {});\n return textElement;\n};\n\nconst getAdjustedDimensions = (element, nextText) => {\n const {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline\n } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const {\n textAlign,\n verticalAlign\n } = element;\n let x;\n let y;\n\n if (textAlign === \"center\" && verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE && !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n } else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\"\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n\n return {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y\n };\n};\n\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n if (textElement.isDeleted) {\n return;\n }\n\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextMaxWidth)(container));\n }\n\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({\n text\n }, dimensions);\n};\nconst updateTextElement = (textElement, {\n text,\n isDeleted,\n originalText\n}) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({\n originalText,\n isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted\n }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = opts => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), {\n points: opts.points || [],\n pressures: [],\n simulatePressure: opts.simulatePressure,\n lastCommittedPoint: null\n });\n};\nconst newLinearElement = opts => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), {\n points: opts.points || [],\n lastCommittedPoint: null,\n startBinding: null,\n endBinding: null,\n startArrowhead: opts.startArrowhead || null,\n endArrowhead: opts.endArrowhead || null\n });\n};\nconst newImageElement = opts => {\n var _a, _b, _c;\n\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), {\n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\",\n status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\",\n fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null,\n scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1]\n });\n}; // Simplified deep clone for the purpose of cloning ExcalidrawElement.\n//\n// Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n// Typed arrays and other non-null objects.\n//\n// Adapted from https://github.com/lukeed/klona\n//\n// The reason for `deepCopyElement()` wrapper is type safety (only allow\n// passing ExcalidrawElement as the top-level argument).\n\nconst _deepCopyElement = (val, depth = 0) => {\n // only clone non-primitives\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n\n const objectType = Object.prototype.toString.call(val);\n\n if (objectType === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\" ? Object.create(Object.getPrototypeOf(val)) : {};\n\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n\n tmp[key] = _deepCopyElement(val[key], depth + 1);\n }\n }\n\n return tmp;\n }\n\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n\n while (k--) {\n arr[k] = _deepCopyElement(val[k], depth + 1);\n }\n\n return arr;\n } // we're not cloning non-array & non-plain-object objects because we\n // don't support them on excalidraw elements yet. If we do, we need to make\n // sure we start cloning them, so let's warn about it.\n\n\n if (true) {\n if (objectType !== \"[object Object]\" && objectType !== \"[object Array]\" && objectType.startsWith(\"[object \")) {\n console.warn(`_deepCloneElement: unexpected object type ${objectType}. This value will not be cloned!`);\n }\n }\n\n return val;\n};\n/**\n * Clones ExcalidrawElement data structure. Does not regenerate id, nonce, or\n * any value. The purpose is to to break object references for immutability\n * reasons, whenever we want to keep the original element, but ensure it's not\n * mutated.\n *\n * Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n * Typed arrays and other non-null objects.\n */\n\n\nconst deepCopyElement = val => {\n return _deepCopyElement(val);\n};\n/**\n * utility wrapper to generate new id. In test env it reuses the old + postfix\n * for test assertions.\n */\n\nconst regenerateId = (\n/** supply null if no previous id exists */\npreviousId) => {\n var _a, _b;\n\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)() && previousId) {\n let nextId = `${previousId}_copy`; // `window.h` may not be defined in some unit tests\n\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find(el => el.id === nextId)) {\n nextId += \"_copy\";\n }\n\n return nextId;\n }\n\n return (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\n\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n let copy = deepCopyElement(element);\n copy.id = regenerateId(copy.id);\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, groupId => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, regenerateId(groupId));\n }\n\n return groupIdMapForOperation.get(groupId);\n });\n\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n\n return copy;\n};\n/**\n * Clones elements, regenerating their ids (including bindings) and group ids.\n *\n * If bindings don't exist in the elements array, they are removed. Therefore,\n * it's advised to supply the whole elements array, or sets of elements that\n * are encapsulated (such as library items), if the purpose is to retain\n * bindings to the cloned elements intact.\n *\n * NOTE by default does not randomize or regenerate anything except the id.\n */\n\nconst duplicateElements = (elements, opts) => {\n const clonedElements = [];\n const origElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(elements); // used for for migrating old ids to new ids\n\n const elementNewIdsMap = new Map();\n\n const maybeGetNewId = id => {\n // if we've already migrated the element id, return the new one directly\n if (elementNewIdsMap.has(id)) {\n return elementNewIdsMap.get(id);\n } // if we haven't migrated the element id, but an old element with the same\n // id exists, generate a new id for it and return it\n\n\n if (origElementsMap.has(id)) {\n const newId = regenerateId(id);\n elementNewIdsMap.set(id, newId);\n return newId;\n } // if old element doesn't exist, return null to mark it for removal\n\n\n return null;\n };\n\n const groupNewIdsMap = new Map();\n\n for (const element of elements) {\n const clonedElement = _deepCopyElement(element);\n\n clonedElement.id = maybeGetNewId(element.id);\n\n if (opts === null || opts === void 0 ? void 0 : opts.randomizeSeed) {\n clonedElement.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.bumpVersion)(clonedElement);\n }\n\n if (clonedElement.groupIds) {\n clonedElement.groupIds = clonedElement.groupIds.map(groupId => {\n if (!groupNewIdsMap.has(groupId)) {\n groupNewIdsMap.set(groupId, regenerateId(groupId));\n }\n\n return groupNewIdsMap.get(groupId);\n });\n }\n\n if (\"containerId\" in clonedElement && clonedElement.containerId) {\n const newContainerId = maybeGetNewId(clonedElement.containerId);\n clonedElement.containerId = newContainerId;\n }\n\n if (\"boundElements\" in clonedElement && clonedElement.boundElements) {\n clonedElement.boundElements = clonedElement.boundElements.reduce((acc, binding) => {\n const newBindingId = maybeGetNewId(binding.id);\n\n if (newBindingId) {\n acc.push(Object.assign(Object.assign({}, binding), {\n id: newBindingId\n }));\n }\n\n return acc;\n }, []);\n }\n\n if (\"endBinding\" in clonedElement && clonedElement.endBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.endBinding.elementId);\n clonedElement.endBinding = newEndBindingId ? Object.assign(Object.assign({}, clonedElement.endBinding), {\n elementId: newEndBindingId\n }) : null;\n }\n\n if (\"startBinding\" in clonedElement && clonedElement.startBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.startBinding.elementId);\n clonedElement.startBinding = newEndBindingId ? Object.assign(Object.assign({}, clonedElement.startBinding), {\n elementId: newEndBindingId\n }) : null;\n }\n\n if (clonedElement.frameId) {\n clonedElement.frameId = maybeGetNewId(clonedElement.frameId);\n }\n\n clonedElements.push(clonedElement);\n }\n\n return clonedElements;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxhQUFhLFNBQUksSUFBSSxTQUFJO0FBQ3pCOztBQUVBOztBQUVBLDRIQUE0SCxjQUFjO0FBQzFJO0FBQ0E7QUFDQTtBQUNBOztBQUVxRjtBQUNqQztBQUNVO0FBQ0w7QUFDWjtBQUNFO0FBQ1k7QUFDMkU7QUFDbUI7O0FBRXpKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUFpQztBQUNuRCxzQkFBc0IsNkVBQXFDO0FBQzNELGdCQUFnQix1RUFBK0I7QUFDL0Msa0JBQWtCLHlFQUFpQztBQUNuRCxrQkFBa0IseUVBQWlDO0FBQ25ELGdCQUFnQix1RUFBK0I7QUFDL0MsY0FBYyxxRUFBNkI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0VBQTRCO0FBQ3pDLElBQUk7QUFDSiw2T0FBNk87OztBQUc3TztBQUNBLG1CQUFtQixpREFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxzREFBYTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMkRBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDQTtBQUNQLHVDQUF1QztBQUN2QztBQUNBLEdBQUc7QUFDSDtBQUNPO0FBQ1AsdUJBQXVCLDhEQUFjLCtCQUErQjtBQUNwRTtBQUNBO0FBQ0EsR0FBRyxLQUFLO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLHdDQUF3QywyREFBbUI7QUFDM0Qsb0NBQW9DLHlEQUFpQjtBQUNyRCx3Q0FBd0Msa0VBQW9CO0FBQzVELGVBQWUsMkRBQWE7QUFDNUIsa0JBQWtCLHlEQUFXLE9BQU8scURBQWE7QUFDakQ7QUFDQTtBQUNBLEdBQUc7QUFDSCxzQ0FBc0MsMERBQWtCO0FBQ3hELDhDQUE4Qyw4REFBc0I7QUFDcEU7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILHNCQUFzQiw4REFBYywrQkFBK0I7QUFDbkU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHLEtBQUs7QUFDUjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJLEVBQUUseURBQVcsV0FBVyxxREFBYTtBQUN6QztBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQSxrREFBa0QsNkRBQXFCO0FBQ3ZFLHdCQUF3Qix5REFBVyxlQUFlLHFEQUFhO0FBQy9EO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0EsSUFBSTtBQUNKLDZCQUE2QiwyREFBd0I7QUFDckQsNkNBQTZDLHdFQUErQjtBQUM1RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMkRBQW9CO0FBQ2pDO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBLG9CQUFvQixpRUFBbUI7O0FBRXZDO0FBQ0EsV0FBVyxzREFBUSxPQUFPLHFEQUFhLGVBQWUsa0VBQW9CO0FBQzFFOztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNELFNBQVMsOERBQWM7QUFDdkI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNPO0FBQ1AsdUNBQXVDO0FBQ3ZDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUDs7QUFFQSx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7OztBQUdBLE1BQU0sSUFBcUM7QUFDM0M7QUFDQSxnRUFBZ0UsV0FBVztBQUMzRTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUdPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBOztBQUVBLE1BQU0saURBQVM7QUFDZixvQkFBb0IsV0FBVyxRQUFROztBQUV2QztBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxTQUFTLGlEQUFRO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBLGlCQUFpQiwyREFBbUI7QUFDcEMsY0FBYyxzREFBYTtBQUMzQixrQkFBa0IscUVBQTRCO0FBQzlDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0EsMEJBQTBCLGtEQUFVLFlBQVk7O0FBRWhEOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOOzs7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07OztBQUdOO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLDJCQUEyQixzREFBYTtBQUN4QyxNQUFNLDJEQUFXO0FBQ2pCOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0EsaURBQWlEO0FBQ2pEO0FBQ0EsV0FBVztBQUNYOztBQUVBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQSxpRkFBaUY7QUFDakY7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLG1GQUFtRjtBQUNuRjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbmV3RWxlbWVudC50cz80ZDdiIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX3Jlc3QgPSB0aGlzICYmIHRoaXMuX19yZXN0IHx8IGZ1bmN0aW9uIChzLCBlKSB7XG4gIHZhciB0ID0ge307XG5cbiAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApIHRbcF0gPSBzW3BdO1xuXG4gIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09IFwiZnVuY3Rpb25cIikgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xuICAgIGlmIChlLmluZGV4T2YocFtpXSkgPCAwICYmIE9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUuY2FsbChzLCBwW2ldKSkgdFtwW2ldXSA9IHNbcFtpXV07XG4gIH1cbiAgcmV0dXJuIHQ7XG59O1xuXG5pbXBvcnQgeyBhcnJheVRvTWFwLCBnZXRGb250U3RyaW5nLCBnZXRVcGRhdGVkVGltZXN0YW1wLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJhbmRvbUludGVnZXIsIHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgYnVtcFZlcnNpb24sIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbiB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBhZGp1c3RYWVdpdGhSb3RhdGlvbiB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4vYm91bmRzXCI7XG5pbXBvcnQgeyBnZXRDb250YWluZXJFbGVtZW50LCBtZWFzdXJlVGV4dCwgbm9ybWFsaXplVGV4dCwgd3JhcFRleHQsIGdldEJvdW5kVGV4dE1heFdpZHRoLCBnZXREZWZhdWx0TGluZUhlaWdodCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBERUZBVUxUX0VMRU1FTlRfUFJPUFMsIERFRkFVTFRfRk9OVF9GQU1JTFksIERFRkFVTFRfRk9OVF9TSVpFLCBERUZBVUxUX1RFWFRfQUxJR04sIERFRkFVTFRfVkVSVElDQUxfQUxJR04sIFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBfbmV3RWxlbWVudEJhc2UgPSAodHlwZSwgX2EpID0+IHtcbiAgdmFyIF9iLCBfYztcblxuICB2YXIge1xuICAgIHgsXG4gICAgeSxcbiAgICBzdHJva2VDb2xvciA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5zdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5maWxsU3R5bGUsXG4gICAgc3Ryb2tlV2lkdGggPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlU3R5bGUgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMuc3Ryb2tlU3R5bGUsXG4gICAgcm91Z2huZXNzID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLnJvdWdobmVzcyxcbiAgICBvcGFjaXR5ID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLm9wYWNpdHksXG4gICAgd2lkdGggPSAwLFxuICAgIGhlaWdodCA9IDAsXG4gICAgYW5nbGUgPSAwLFxuICAgIGdyb3VwSWRzID0gW10sXG4gICAgZnJhbWVJZCA9IG51bGwsXG4gICAgcm91bmRuZXNzID0gbnVsbCxcbiAgICBib3VuZEVsZW1lbnRzID0gbnVsbCxcbiAgICBsaW5rID0gbnVsbCxcbiAgICBsb2NrZWQgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMubG9ja2VkXG4gIH0gPSBfYSxcbiAgICAgIHJlc3QgPSBfX3Jlc3QoX2EsIFtcInhcIiwgXCJ5XCIsIFwic3Ryb2tlQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCJmaWxsU3R5bGVcIiwgXCJzdHJva2VXaWR0aFwiLCBcInN0cm9rZVN0eWxlXCIsIFwicm91Z2huZXNzXCIsIFwib3BhY2l0eVwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwiYW5nbGVcIiwgXCJncm91cElkc1wiLCBcImZyYW1lSWRcIiwgXCJyb3VuZG5lc3NcIiwgXCJib3VuZEVsZW1lbnRzXCIsIFwibGlua1wiLCBcImxvY2tlZFwiXSk7IC8vIGFzc2lnbiB0eXBlIHRvIGd1YXJkIGFnYWluc3QgZXhjZXNzIHByb3BlcnRpZXNcblxuXG4gIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgaWQ6IHJlc3QuaWQgfHwgcmFuZG9tSWQoKSxcbiAgICB0eXBlLFxuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYW5nbGUsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MsXG4gICAgb3BhY2l0eSxcbiAgICBncm91cElkcyxcbiAgICBmcmFtZUlkLFxuICAgIHJvdW5kbmVzcyxcbiAgICBzZWVkOiAoX2IgPSByZXN0LnNlZWQpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IHJhbmRvbUludGVnZXIoKSxcbiAgICB2ZXJzaW9uOiByZXN0LnZlcnNpb24gfHwgMSxcbiAgICB2ZXJzaW9uTm9uY2U6IChfYyA9IHJlc3QudmVyc2lvbk5vbmNlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiAwLFxuICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgYm91bmRFbGVtZW50cyxcbiAgICB1cGRhdGVkOiBnZXRVcGRhdGVkVGltZXN0YW1wKCksXG4gICAgbGluayxcbiAgICBsb2NrZWRcbiAgfTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IG9wdHMgPT4gX25ld0VsZW1lbnRCYXNlKG9wdHMudHlwZSwgb3B0cyk7XG5leHBvcnQgY29uc3QgbmV3RW1iZWRkYWJsZUVsZW1lbnQgPSBvcHRzID0+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgX25ld0VsZW1lbnRCYXNlKFwiZW1iZWRkYWJsZVwiLCBvcHRzKSksIHtcbiAgICB2YWxpZGF0ZWQ6IG9wdHMudmFsaWRhdGVkXG4gIH0pO1xufTtcbmV4cG9ydCBjb25zdCBuZXdGcmFtZUVsZW1lbnQgPSBvcHRzID0+IHtcbiAgY29uc3QgZnJhbWVFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2UoXCJmcmFtZVwiLCBvcHRzKSksIHtcbiAgICB0eXBlOiBcImZyYW1lXCIsXG4gICAgbmFtZTogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5uYW1lKSB8fCBudWxsXG4gIH0pLCB7fSk7XG4gIHJldHVybiBmcmFtZUVsZW1lbnQ7XG59O1xuLyoqIGNvbXB1dGVzIGVsZW1lbnQgeC95IG9mZnNldCBiYXNlZCBvbiB0ZXh0QWxpZ24vdmVydGljYWxBbGlnbiAqL1xuXG5jb25zdCBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyA9IChvcHRzLCBtZXRyaWNzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgeDogb3B0cy50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgPyBtZXRyaWNzLndpZHRoIC8gMiA6IG9wdHMudGV4dEFsaWduID09PSBcInJpZ2h0XCIgPyBtZXRyaWNzLndpZHRoIDogMCxcbiAgICB5OiBvcHRzLnZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIgPyBtZXRyaWNzLmhlaWdodCAvIDIgOiAwXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3VGV4dEVsZW1lbnQgPSBvcHRzID0+IHtcbiAgY29uc3QgZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCBERUZBVUxUX0ZPTlRfRkFNSUxZO1xuICBjb25zdCBmb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgREVGQVVMVF9GT05UX1NJWkU7XG4gIGNvbnN0IGxpbmVIZWlnaHQgPSBvcHRzLmxpbmVIZWlnaHQgfHwgZ2V0RGVmYXVsdExpbmVIZWlnaHQoZm9udEZhbWlseSk7XG4gIGNvbnN0IHRleHQgPSBub3JtYWxpemVUZXh0KG9wdHMudGV4dCk7XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKHtcbiAgICBmb250RmFtaWx5LFxuICAgIGZvbnRTaXplXG4gIH0pLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3QgdGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgREVGQVVMVF9URVhUX0FMSUdOO1xuICBjb25zdCB2ZXJ0aWNhbEFsaWduID0gb3B0cy52ZXJ0aWNhbEFsaWduIHx8IERFRkFVTFRfVkVSVElDQUxfQUxJR047XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyh7XG4gICAgdGV4dEFsaWduLFxuICAgIHZlcnRpY2FsQWxpZ25cbiAgfSwgbWV0cmljcyk7XG4gIGNvbnN0IHRleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2UoXCJ0ZXh0XCIsIG9wdHMpKSwge1xuICAgIHRleHQsXG4gICAgZm9udFNpemUsXG4gICAgZm9udEZhbWlseSxcbiAgICB0ZXh0QWxpZ24sXG4gICAgdmVydGljYWxBbGlnbixcbiAgICB4OiBvcHRzLnggLSBvZmZzZXRzLngsXG4gICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgIGhlaWdodDogbWV0cmljcy5oZWlnaHQsXG4gICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUsXG4gICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICBvcmlnaW5hbFRleHQ6IHRleHQsXG4gICAgbGluZUhlaWdodFxuICB9KSwge30pO1xuICByZXR1cm4gdGV4dEVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBZGp1c3RlZERpbWVuc2lvbnMgPSAoZWxlbWVudCwgbmV4dFRleHQpID0+IHtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBuZXh0QmFzZWxpbmVcbiAgfSA9IG1lYXN1cmVUZXh0KG5leHRUZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBlbGVtZW50LmxpbmVIZWlnaHQpO1xuICBjb25zdCB7XG4gICAgdGV4dEFsaWduLFxuICAgIHZlcnRpY2FsQWxpZ25cbiAgfSA9IGVsZW1lbnQ7XG4gIGxldCB4O1xuICBsZXQgeTtcblxuICBpZiAodGV4dEFsaWduID09PSBcImNlbnRlclwiICYmIHZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSAmJiAhZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIGNvbnN0IHByZXZNZXRyaWNzID0gbWVhc3VyZVRleHQoZWxlbWVudC50ZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBlbGVtZW50LmxpbmVIZWlnaHQpO1xuICAgIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbmV4dFdpZHRoIC0gcHJldk1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQgLSBwcmV2TWV0cmljcy5oZWlnaHRcbiAgICB9KTtcbiAgICB4ID0gZWxlbWVudC54IC0gb2Zmc2V0cy54O1xuICAgIHkgPSBlbGVtZW50LnkgLSBvZmZzZXRzLnk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCwgbmV4dFdpZHRoLCBuZXh0SGVpZ2h0LCBmYWxzZSk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuICAgIFt4LCB5XSA9IGFkanVzdFhZV2l0aFJvdGF0aW9uKHtcbiAgICAgIHM6IHRydWUsXG4gICAgICBlOiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcImxlZnRcIixcbiAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgIH0sIGVsZW1lbnQueCwgZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlLCBkZWx0YVgxLCBkZWx0YVkxLCBkZWx0YVgyLCBkZWx0YVkyKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgYmFzZWxpbmU6IG5leHRCYXNlbGluZSxcbiAgICB4OiBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogZWxlbWVudC54LFxuICAgIHk6IE51bWJlci5pc0Zpbml0ZSh5KSA/IHkgOiBlbGVtZW50LnlcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoVGV4dERpbWVuc2lvbnMgPSAodGV4dEVsZW1lbnQsIHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KSA9PiB7XG4gIGlmICh0ZXh0RWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHRleHRFbGVtZW50KTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgdGV4dCA9IHdyYXBUZXh0KHRleHQsIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLCBnZXRCb3VuZFRleHRNYXhXaWR0aChjb250YWluZXIpKTtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvbnMgPSBnZXRBZGp1c3RlZERpbWVuc2lvbnModGV4dEVsZW1lbnQsIHRleHQpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgdGV4dFxuICB9LCBkaW1lbnNpb25zKTtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlVGV4dEVsZW1lbnQgPSAodGV4dEVsZW1lbnQsIHtcbiAgdGV4dCxcbiAgaXNEZWxldGVkLFxuICBvcmlnaW5hbFRleHRcbn0pID0+IHtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKHRleHRFbGVtZW50LCBPYmplY3QuYXNzaWduKHtcbiAgICBvcmlnaW5hbFRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgIT09IG51bGwgJiYgaXNEZWxldGVkICE9PSB2b2lkIDAgPyBpc0RlbGV0ZWQgOiB0ZXh0RWxlbWVudC5pc0RlbGV0ZWRcbiAgfSwgcmVmcmVzaFRleHREaW1lbnNpb25zKHRleHRFbGVtZW50LCBvcmlnaW5hbFRleHQpKSk7XG59O1xuZXhwb3J0IGNvbnN0IG5ld0ZyZWVEcmF3RWxlbWVudCA9IG9wdHMgPT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKSksIHtcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbFxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgbmV3TGluZWFyRWxlbWVudCA9IG9wdHMgPT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKSksIHtcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICBzdGFydEJpbmRpbmc6IG51bGwsXG4gICAgZW5kQmluZGluZzogbnVsbCxcbiAgICBzdGFydEFycm93aGVhZDogb3B0cy5zdGFydEFycm93aGVhZCB8fCBudWxsLFxuICAgIGVuZEFycm93aGVhZDogb3B0cy5lbmRBcnJvd2hlYWQgfHwgbnVsbFxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgbmV3SW1hZ2VFbGVtZW50ID0gb3B0cyA9PiB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9uZXdFbGVtZW50QmFzZShcImltYWdlXCIsIG9wdHMpKSwge1xuICAgIC8vIGluIHRoZSBmdXR1cmUgd2UnbGwgc3VwcG9ydCBjaGFuZ2luZyBzdHJva2UgY29sb3IgZm9yIHNvbWUgU1ZHIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBgdHJhbnNwYXJlbnRgIHdpbGwgbGlrZWx5IG1lYW4gXCJ1c2Ugb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBpbWFnZVwiXG4gICAgc3Ryb2tlQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICBzdGF0dXM6IChfYSA9IG9wdHMuc3RhdHVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcInBlbmRpbmdcIixcbiAgICBmaWxlSWQ6IChfYiA9IG9wdHMuZmlsZUlkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBudWxsLFxuICAgIHNjYWxlOiAoX2MgPSBvcHRzLnNjYWxlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBbMSwgMV1cbiAgfSk7XG59OyAvLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQuXG4vL1xuLy8gT25seSBjbG9uZXMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLiBEb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsXG4vLyBUeXBlZCBhcnJheXMgYW5kIG90aGVyIG5vbi1udWxsIG9iamVjdHMuXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcbi8vXG4vLyBUaGUgcmVhc29uIGZvciBgZGVlcENvcHlFbGVtZW50KClgIHdyYXBwZXIgaXMgdHlwZSBzYWZldHkgKG9ubHkgYWxsb3dcbi8vIHBhc3NpbmcgRXhjYWxpZHJhd0VsZW1lbnQgYXMgdGhlIHRvcC1sZXZlbCBhcmd1bWVudCkuXG5cbmNvbnN0IF9kZWVwQ29weUVsZW1lbnQgPSAodmFsLCBkZXB0aCA9IDApID0+IHtcbiAgLy8gb25seSBjbG9uZSBub24tcHJpbWl0aXZlc1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBjb25zdCBvYmplY3RUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCk7XG5cbiAgaWYgKG9iamVjdFR5cGUgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICBjb25zdCB0bXAgPSB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKSA6IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gZG9uJ3QgY29weSBub24tc2VyaWFsaXphYmxlIG9iamVjdHMgbGlrZSB0aGVzZSBjYWNoZXMuIFRoZXknbGwgYmVcbiAgICAgICAgLy8gcG9wdWxhdGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWQuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiAoa2V5ID09PSBcInNoYXBlXCIgfHwga2V5ID09PSBcImNhbnZhc1wiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG1wW2tleV0gPSBfZGVlcENvcHlFbGVtZW50KHZhbFtrZXldLCBkZXB0aCArIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcblxuICAgIHdoaWxlIChrLS0pIHtcbiAgICAgIGFycltrXSA9IF9kZWVwQ29weUVsZW1lbnQodmFsW2tdLCBkZXB0aCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH0gLy8gd2UncmUgbm90IGNsb25pbmcgbm9uLWFycmF5ICYgbm9uLXBsYWluLW9iamVjdCBvYmplY3RzIGJlY2F1c2Ugd2VcbiAgLy8gZG9uJ3Qgc3VwcG9ydCB0aGVtIG9uIGV4Y2FsaWRyYXcgZWxlbWVudHMgeWV0LiBJZiB3ZSBkbywgd2UgbmVlZCB0byBtYWtlXG4gIC8vIHN1cmUgd2Ugc3RhcnQgY2xvbmluZyB0aGVtLCBzbyBsZXQncyB3YXJuIGFib3V0IGl0LlxuXG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChvYmplY3RUeXBlICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICYmIG9iamVjdFR5cGUgIT09IFwiW29iamVjdCBBcnJheV1cIiAmJiBvYmplY3RUeXBlLnN0YXJ0c1dpdGgoXCJbb2JqZWN0IFwiKSkge1xuICAgICAgY29uc29sZS53YXJuKGBfZGVlcENsb25lRWxlbWVudDogdW5leHBlY3RlZCBvYmplY3QgdHlwZSAke29iamVjdFR5cGV9LiBUaGlzIHZhbHVlIHdpbGwgbm90IGJlIGNsb25lZCFgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcbi8qKlxuICogQ2xvbmVzIEV4Y2FsaWRyYXdFbGVtZW50IGRhdGEgc3RydWN0dXJlLiBEb2VzIG5vdCByZWdlbmVyYXRlIGlkLCBub25jZSwgb3JcbiAqIGFueSB2YWx1ZS4gVGhlIHB1cnBvc2UgaXMgdG8gdG8gYnJlYWsgb2JqZWN0IHJlZmVyZW5jZXMgZm9yIGltbXV0YWJpbGl0eVxuICogcmVhc29ucywgd2hlbmV2ZXIgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBlbGVtZW50LCBidXQgZW5zdXJlIGl0J3Mgbm90XG4gKiBtdXRhdGVkLlxuICpcbiAqIE9ubHkgY2xvbmVzIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cy4gRG9lc24ndCBjbG9uZSBEYXRlLCBSZWdFeHAsIE1hcCwgU2V0LFxuICogVHlwZWQgYXJyYXlzIGFuZCBvdGhlciBub24tbnVsbCBvYmplY3RzLlxuICovXG5cblxuZXhwb3J0IGNvbnN0IGRlZXBDb3B5RWxlbWVudCA9IHZhbCA9PiB7XG4gIHJldHVybiBfZGVlcENvcHlFbGVtZW50KHZhbCk7XG59O1xuLyoqXG4gKiB1dGlsaXR5IHdyYXBwZXIgdG8gZ2VuZXJhdGUgbmV3IGlkLiBJbiB0ZXN0IGVudiBpdCByZXVzZXMgdGhlIG9sZCArIHBvc3RmaXhcbiAqIGZvciB0ZXN0IGFzc2VydGlvbnMuXG4gKi9cblxuZXhwb3J0IGNvbnN0IHJlZ2VuZXJhdGVJZCA9IChcbi8qKiBzdXBwbHkgbnVsbCBpZiBubyBwcmV2aW91cyBpZCBleGlzdHMgKi9cbnByZXZpb3VzSWQpID0+IHtcbiAgdmFyIF9hLCBfYjtcblxuICBpZiAoaXNUZXN0RW52KCkgJiYgcHJldmlvdXNJZCkge1xuICAgIGxldCBuZXh0SWQgPSBgJHtwcmV2aW91c0lkfV9jb3B5YDsgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG5cbiAgICBpZiAoKF9iID0gKF9hID0gd2luZG93LmgpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcHApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbmQoZWwgPT4gZWwuaWQgPT09IG5leHRJZCkpIHtcbiAgICAgIG5leHRJZCArPSBcIl9jb3B5XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHJldHVybiByYW5kb21JZCgpO1xufTtcbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cblxuZXhwb3J0IGNvbnN0IGR1cGxpY2F0ZUVsZW1lbnQgPSAoZWRpdGluZ0dyb3VwSWQsIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24sIGVsZW1lbnQsIG92ZXJyaWRlcykgPT4ge1xuICBsZXQgY29weSA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcbiAgY29weS5pZCA9IHJlZ2VuZXJhdGVJZChjb3B5LmlkKTtcbiAgY29weS5ib3VuZEVsZW1lbnRzID0gbnVsbDtcbiAgY29weS51cGRhdGVkID0gZ2V0VXBkYXRlZFRpbWVzdGFtcCgpO1xuICBjb3B5LnNlZWQgPSByYW5kb21JbnRlZ2VyKCk7XG4gIGNvcHkuZ3JvdXBJZHMgPSBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uKGNvcHkuZ3JvdXBJZHMsIGVkaXRpbmdHcm91cElkLCBncm91cElkID0+IHtcbiAgICBpZiAoIWdyb3VwSWRNYXBGb3JPcGVyYXRpb24uaGFzKGdyb3VwSWQpKSB7XG4gICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByZWdlbmVyYXRlSWQoZ3JvdXBJZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cElkTWFwRm9yT3BlcmF0aW9uLmdldChncm91cElkKTtcbiAgfSk7XG5cbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvcHkgPSBPYmplY3QuYXNzaWduKGNvcHksIG92ZXJyaWRlcyk7XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG4vKipcbiAqIENsb25lcyBlbGVtZW50cywgcmVnZW5lcmF0aW5nIHRoZWlyIGlkcyAoaW5jbHVkaW5nIGJpbmRpbmdzKSBhbmQgZ3JvdXAgaWRzLlxuICpcbiAqIElmIGJpbmRpbmdzIGRvbid0IGV4aXN0IGluIHRoZSBlbGVtZW50cyBhcnJheSwgdGhleSBhcmUgcmVtb3ZlZC4gVGhlcmVmb3JlLFxuICogaXQncyBhZHZpc2VkIHRvIHN1cHBseSB0aGUgd2hvbGUgZWxlbWVudHMgYXJyYXksIG9yIHNldHMgb2YgZWxlbWVudHMgdGhhdFxuICogYXJlIGVuY2Fwc3VsYXRlZCAoc3VjaCBhcyBsaWJyYXJ5IGl0ZW1zKSwgaWYgdGhlIHB1cnBvc2UgaXMgdG8gcmV0YWluXG4gKiBiaW5kaW5ncyB0byB0aGUgY2xvbmVkIGVsZW1lbnRzIGludGFjdC5cbiAqXG4gKiBOT1RFIGJ5IGRlZmF1bHQgZG9lcyBub3QgcmFuZG9taXplIG9yIHJlZ2VuZXJhdGUgYW55dGhpbmcgZXhjZXB0IHRoZSBpZC5cbiAqL1xuXG5leHBvcnQgY29uc3QgZHVwbGljYXRlRWxlbWVudHMgPSAoZWxlbWVudHMsIG9wdHMpID0+IHtcbiAgY29uc3QgY2xvbmVkRWxlbWVudHMgPSBbXTtcbiAgY29uc3Qgb3JpZ0VsZW1lbnRzTWFwID0gYXJyYXlUb01hcChlbGVtZW50cyk7IC8vIHVzZWQgZm9yIGZvciBtaWdyYXRpbmcgb2xkIGlkcyB0byBuZXcgaWRzXG5cbiAgY29uc3QgZWxlbWVudE5ld0lkc01hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBtYXliZUdldE5ld0lkID0gaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgbWlncmF0ZWQgdGhlIGVsZW1lbnQgaWQsIHJldHVybiB0aGUgbmV3IG9uZSBkaXJlY3RseVxuICAgIGlmIChlbGVtZW50TmV3SWRzTWFwLmhhcyhpZCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50TmV3SWRzTWFwLmdldChpZCk7XG4gICAgfSAvLyBpZiB3ZSBoYXZlbid0IG1pZ3JhdGVkIHRoZSBlbGVtZW50IGlkLCBidXQgYW4gb2xkIGVsZW1lbnQgd2l0aCB0aGUgc2FtZVxuICAgIC8vIGlkIGV4aXN0cywgZ2VuZXJhdGUgYSBuZXcgaWQgZm9yIGl0IGFuZCByZXR1cm4gaXRcblxuXG4gICAgaWYgKG9yaWdFbGVtZW50c01hcC5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBuZXdJZCA9IHJlZ2VuZXJhdGVJZChpZCk7XG4gICAgICBlbGVtZW50TmV3SWRzTWFwLnNldChpZCwgbmV3SWQpO1xuICAgICAgcmV0dXJuIG5ld0lkO1xuICAgIH0gLy8gaWYgb2xkIGVsZW1lbnQgZG9lc24ndCBleGlzdCwgcmV0dXJuIG51bGwgdG8gbWFyayBpdCBmb3IgcmVtb3ZhbFxuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBjb25zdCBncm91cE5ld0lkc01hcCA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBjbG9uZWRFbGVtZW50ID0gX2RlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICAgIGNsb25lZEVsZW1lbnQuaWQgPSBtYXliZUdldE5ld0lkKGVsZW1lbnQuaWQpO1xuXG4gICAgaWYgKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5yYW5kb21pemVTZWVkKSB7XG4gICAgICBjbG9uZWRFbGVtZW50LnNlZWQgPSByYW5kb21JbnRlZ2VyKCk7XG4gICAgICBidW1wVmVyc2lvbihjbG9uZWRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmVkRWxlbWVudC5ncm91cElkcykge1xuICAgICAgY2xvbmVkRWxlbWVudC5ncm91cElkcyA9IGNsb25lZEVsZW1lbnQuZ3JvdXBJZHMubWFwKGdyb3VwSWQgPT4ge1xuICAgICAgICBpZiAoIWdyb3VwTmV3SWRzTWFwLmhhcyhncm91cElkKSkge1xuICAgICAgICAgIGdyb3VwTmV3SWRzTWFwLnNldChncm91cElkLCByZWdlbmVyYXRlSWQoZ3JvdXBJZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwTmV3SWRzTWFwLmdldChncm91cElkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcImNvbnRhaW5lcklkXCIgaW4gY2xvbmVkRWxlbWVudCAmJiBjbG9uZWRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXJJZCA9IG1heWJlR2V0TmV3SWQoY2xvbmVkRWxlbWVudC5jb250YWluZXJJZCk7XG4gICAgICBjbG9uZWRFbGVtZW50LmNvbnRhaW5lcklkID0gbmV3Q29udGFpbmVySWQ7XG4gICAgfVxuXG4gICAgaWYgKFwiYm91bmRFbGVtZW50c1wiIGluIGNsb25lZEVsZW1lbnQgJiYgY2xvbmVkRWxlbWVudC5ib3VuZEVsZW1lbnRzKSB7XG4gICAgICBjbG9uZWRFbGVtZW50LmJvdW5kRWxlbWVudHMgPSBjbG9uZWRFbGVtZW50LmJvdW5kRWxlbWVudHMucmVkdWNlKChhY2MsIGJpbmRpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmluZGluZ0lkID0gbWF5YmVHZXROZXdJZChiaW5kaW5nLmlkKTtcblxuICAgICAgICBpZiAobmV3QmluZGluZ0lkKSB7XG4gICAgICAgICAgYWNjLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiaW5kaW5nKSwge1xuICAgICAgICAgICAgaWQ6IG5ld0JpbmRpbmdJZFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgaWYgKFwiZW5kQmluZGluZ1wiIGluIGNsb25lZEVsZW1lbnQgJiYgY2xvbmVkRWxlbWVudC5lbmRCaW5kaW5nKSB7XG4gICAgICBjb25zdCBuZXdFbmRCaW5kaW5nSWQgPSBtYXliZUdldE5ld0lkKGNsb25lZEVsZW1lbnQuZW5kQmluZGluZy5lbGVtZW50SWQpO1xuICAgICAgY2xvbmVkRWxlbWVudC5lbmRCaW5kaW5nID0gbmV3RW5kQmluZGluZ0lkID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbG9uZWRFbGVtZW50LmVuZEJpbmRpbmcpLCB7XG4gICAgICAgIGVsZW1lbnRJZDogbmV3RW5kQmluZGluZ0lkXG4gICAgICB9KSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKFwic3RhcnRCaW5kaW5nXCIgaW4gY2xvbmVkRWxlbWVudCAmJiBjbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZykge1xuICAgICAgY29uc3QgbmV3RW5kQmluZGluZ0lkID0gbWF5YmVHZXROZXdJZChjbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZy5lbGVtZW50SWQpO1xuICAgICAgY2xvbmVkRWxlbWVudC5zdGFydEJpbmRpbmcgPSBuZXdFbmRCaW5kaW5nSWQgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsb25lZEVsZW1lbnQuc3RhcnRCaW5kaW5nKSwge1xuICAgICAgICBlbGVtZW50SWQ6IG5ld0VuZEJpbmRpbmdJZFxuICAgICAgfSkgOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjbG9uZWRFbGVtZW50LmZyYW1lSWQpIHtcbiAgICAgIGNsb25lZEVsZW1lbnQuZnJhbWVJZCA9IG1heWJlR2V0TmV3SWQoY2xvbmVkRWxlbWVudC5mcmFtZUlkKTtcbiAgICB9XG5cbiAgICBjbG9uZWRFbGVtZW50cy5wdXNoKGNsb25lZEVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lZEVsZW1lbnRzO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
3962
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"duplicateElements\": () => (/* binding */ duplicateElements),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newEmbeddableElement\": () => (/* binding */ newEmbeddableElement),\n/* harmony export */ \"newFrameElement\": () => (/* binding */ newFrameElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"regenerateId\": () => (/* binding */ regenerateId),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\nvar __rest = undefined && undefined.__rest || function (s, e) {\n var t = {};\n\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\n\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n\n var {\n x,\n y,\n strokeColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeColor,\n backgroundColor = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.backgroundColor,\n fillStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.fillStyle,\n strokeWidth = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeWidth,\n strokeStyle = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.strokeStyle,\n roughness = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.roughness,\n opacity = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.opacity,\n width = 0,\n height = 0,\n angle = 0,\n groupIds = [],\n frameId = null,\n roundness = null,\n boundElements = null,\n link = null,\n locked = _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_ELEMENT_PROPS.locked\n } = _a,\n rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"frameId\", \"roundness\", \"boundElements\", \"link\", \"locked\"]); // assign type to guard against excess properties\n\n\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n frameId,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n customData: rest.customData\n };\n return element;\n};\n\nconst newElement = opts => _newElementBase(opts.type, opts);\nconst newEmbeddableElement = opts => {\n return Object.assign(Object.assign({}, _newElementBase(\"embeddable\", opts)), {\n validated: opts.validated\n });\n};\nconst newFrameElement = opts => {\n const frameElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"frame\", opts)), {\n type: \"frame\",\n name: (opts === null || opts === void 0 ? void 0 : opts.name) || null\n }), {});\n return frameElement;\n};\n/** computes element x/y offset based on textAlign/verticalAlign */\n\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\" ? metrics.width / 2 : opts.textAlign === \"right\" ? metrics.width : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0\n };\n};\n\nconst newTextElement = opts => {\n const fontFamily = opts.fontFamily || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_FAMILY;\n const fontSize = opts.fontSize || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_FONT_SIZE;\n const lineHeight = opts.lineHeight || (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getDefaultLineHeight)(fontFamily);\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontFamily,\n fontSize\n }), lineHeight);\n const textAlign = opts.textAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_TEXT_ALIGN;\n const verticalAlign = opts.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_8__.DEFAULT_VERTICAL_ALIGN;\n const offsets = getTextElementPositionOffsets({\n textAlign,\n verticalAlign\n }, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), {\n text,\n fontSize,\n fontFamily,\n textAlign,\n verticalAlign,\n x: opts.x - offsets.x,\n y: opts.y - offsets.y,\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n containerId: opts.containerId || null,\n originalText: text,\n lineHeight\n }), {});\n return textElement;\n};\n\nconst getAdjustedDimensions = (element, nextText) => {\n const {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline\n } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const {\n textAlign,\n verticalAlign\n } = element;\n let x;\n let y;\n\n if (textAlign === \"center\" && verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE && !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element), element.lineHeight);\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n } else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\"\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n\n return {\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseline,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y\n };\n};\n\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n if (textElement.isDeleted) {\n return;\n }\n\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextMaxWidth)(container));\n }\n\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({\n text\n }, dimensions);\n};\nconst updateTextElement = (textElement, {\n text,\n isDeleted,\n originalText\n}) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({\n originalText,\n isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted\n }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = opts => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), {\n points: opts.points || [],\n pressures: [],\n simulatePressure: opts.simulatePressure,\n lastCommittedPoint: null\n });\n};\nconst newLinearElement = opts => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), {\n points: opts.points || [],\n lastCommittedPoint: null,\n startBinding: null,\n endBinding: null,\n startArrowhead: opts.startArrowhead || null,\n endArrowhead: opts.endArrowhead || null\n });\n};\nconst newImageElement = opts => {\n var _a, _b, _c;\n\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), {\n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\",\n status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\",\n fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null,\n scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1]\n });\n}; // Simplified deep clone for the purpose of cloning ExcalidrawElement.\n//\n// Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n// Typed arrays and other non-null objects.\n//\n// Adapted from https://github.com/lukeed/klona\n//\n// The reason for `deepCopyElement()` wrapper is type safety (only allow\n// passing ExcalidrawElement as the top-level argument).\n\nconst _deepCopyElement = (val, depth = 0) => {\n // only clone non-primitives\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n\n const objectType = Object.prototype.toString.call(val);\n\n if (objectType === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\" ? Object.create(Object.getPrototypeOf(val)) : {};\n\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n\n tmp[key] = _deepCopyElement(val[key], depth + 1);\n }\n }\n\n return tmp;\n }\n\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n\n while (k--) {\n arr[k] = _deepCopyElement(val[k], depth + 1);\n }\n\n return arr;\n } // we're not cloning non-array & non-plain-object objects because we\n // don't support them on excalidraw elements yet. If we do, we need to make\n // sure we start cloning them, so let's warn about it.\n\n\n if (true) {\n if (objectType !== \"[object Object]\" && objectType !== \"[object Array]\" && objectType.startsWith(\"[object \")) {\n console.warn(`_deepCloneElement: unexpected object type ${objectType}. This value will not be cloned!`);\n }\n }\n\n return val;\n};\n/**\n * Clones ExcalidrawElement data structure. Does not regenerate id, nonce, or\n * any value. The purpose is to to break object references for immutability\n * reasons, whenever we want to keep the original element, but ensure it's not\n * mutated.\n *\n * Only clones plain objects and arrays. Doesn't clone Date, RegExp, Map, Set,\n * Typed arrays and other non-null objects.\n */\n\n\nconst deepCopyElement = val => {\n return _deepCopyElement(val);\n};\n/**\n * utility wrapper to generate new id. In test env it reuses the old + postfix\n * for test assertions.\n */\n\nconst regenerateId = (\n/** supply null if no previous id exists */\npreviousId) => {\n var _a, _b;\n\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)() && previousId) {\n let nextId = `${previousId}_copy`; // `window.h` may not be defined in some unit tests\n\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find(el => el.id === nextId)) {\n nextId += \"_copy\";\n }\n\n return nextId;\n }\n\n return (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\n\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n let copy = deepCopyElement(element);\n copy.id = regenerateId(copy.id);\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, groupId => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, regenerateId(groupId));\n }\n\n return groupIdMapForOperation.get(groupId);\n });\n\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n\n return copy;\n};\n/**\n * Clones elements, regenerating their ids (including bindings) and group ids.\n *\n * If bindings don't exist in the elements array, they are removed. Therefore,\n * it's advised to supply the whole elements array, or sets of elements that\n * are encapsulated (such as library items), if the purpose is to retain\n * bindings to the cloned elements intact.\n *\n * NOTE by default does not randomize or regenerate anything except the id.\n */\n\nconst duplicateElements = (elements, opts) => {\n const clonedElements = [];\n const origElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(elements); // used for for migrating old ids to new ids\n\n const elementNewIdsMap = new Map();\n\n const maybeGetNewId = id => {\n // if we've already migrated the element id, return the new one directly\n if (elementNewIdsMap.has(id)) {\n return elementNewIdsMap.get(id);\n } // if we haven't migrated the element id, but an old element with the same\n // id exists, generate a new id for it and return it\n\n\n if (origElementsMap.has(id)) {\n const newId = regenerateId(id);\n elementNewIdsMap.set(id, newId);\n return newId;\n } // if old element doesn't exist, return null to mark it for removal\n\n\n return null;\n };\n\n const groupNewIdsMap = new Map();\n\n for (const element of elements) {\n const clonedElement = _deepCopyElement(element);\n\n clonedElement.id = maybeGetNewId(element.id);\n\n if (opts === null || opts === void 0 ? void 0 : opts.randomizeSeed) {\n clonedElement.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.bumpVersion)(clonedElement);\n }\n\n if (clonedElement.groupIds) {\n clonedElement.groupIds = clonedElement.groupIds.map(groupId => {\n if (!groupNewIdsMap.has(groupId)) {\n groupNewIdsMap.set(groupId, regenerateId(groupId));\n }\n\n return groupNewIdsMap.get(groupId);\n });\n }\n\n if (\"containerId\" in clonedElement && clonedElement.containerId) {\n const newContainerId = maybeGetNewId(clonedElement.containerId);\n clonedElement.containerId = newContainerId;\n }\n\n if (\"boundElements\" in clonedElement && clonedElement.boundElements) {\n clonedElement.boundElements = clonedElement.boundElements.reduce((acc, binding) => {\n const newBindingId = maybeGetNewId(binding.id);\n\n if (newBindingId) {\n acc.push(Object.assign(Object.assign({}, binding), {\n id: newBindingId\n }));\n }\n\n return acc;\n }, []);\n }\n\n if (\"endBinding\" in clonedElement && clonedElement.endBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.endBinding.elementId);\n clonedElement.endBinding = newEndBindingId ? Object.assign(Object.assign({}, clonedElement.endBinding), {\n elementId: newEndBindingId\n }) : null;\n }\n\n if (\"startBinding\" in clonedElement && clonedElement.startBinding) {\n const newEndBindingId = maybeGetNewId(clonedElement.startBinding.elementId);\n clonedElement.startBinding = newEndBindingId ? Object.assign(Object.assign({}, clonedElement.startBinding), {\n elementId: newEndBindingId\n }) : null;\n }\n\n if (clonedElement.frameId) {\n clonedElement.frameId = maybeGetNewId(clonedElement.frameId);\n }\n\n clonedElements.push(clonedElement);\n }\n\n return clonedElements;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxhQUFhLFNBQUksSUFBSSxTQUFJO0FBQ3pCOztBQUVBOztBQUVBLDRIQUE0SCxjQUFjO0FBQzFJO0FBQ0E7QUFDQTtBQUNBOztBQUVxRjtBQUNqQztBQUNVO0FBQ0w7QUFDWjtBQUNFO0FBQ1k7QUFDMkU7QUFDbUI7O0FBRXpKO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHlFQUFpQztBQUNuRCxzQkFBc0IsNkVBQXFDO0FBQzNELGdCQUFnQix1RUFBK0I7QUFDL0Msa0JBQWtCLHlFQUFpQztBQUNuRCxrQkFBa0IseUVBQWlDO0FBQ25ELGdCQUFnQix1RUFBK0I7QUFDL0MsY0FBYyxxRUFBNkI7QUFDM0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsb0VBQTRCO0FBQ3pDLElBQUk7QUFDSiw2T0FBNk87OztBQUc3TztBQUNBLG1CQUFtQixpREFBUTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDREQUE0RCxzREFBYTtBQUN6RTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWEsMkRBQW1CO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNBO0FBQ1AsdUNBQXVDO0FBQ3ZDO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUCx1QkFBdUIsOERBQWMsK0JBQStCO0FBQ3BFO0FBQ0E7QUFDQSxHQUFHLEtBQUs7QUFDUjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1Asd0NBQXdDLDJEQUFtQjtBQUMzRCxvQ0FBb0MseURBQWlCO0FBQ3JELHdDQUF3QyxrRUFBb0I7QUFDNUQsZUFBZSwyREFBYTtBQUM1QixrQkFBa0IseURBQVcsT0FBTyxxREFBYTtBQUNqRDtBQUNBO0FBQ0EsR0FBRztBQUNILHNDQUFzQywwREFBa0I7QUFDeEQsOENBQThDLDhEQUFzQjtBQUNwRTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsc0JBQXNCLDhEQUFjLCtCQUErQjtBQUNuRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUcsS0FBSztBQUNSO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksRUFBRSx5REFBVyxXQUFXLHFEQUFhO0FBQ3pDO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBOztBQUVBLGtEQUFrRCw2REFBcUI7QUFDdkUsd0JBQXdCLHlEQUFXLGVBQWUscURBQWE7QUFDL0Q7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxJQUFJO0FBQ0osNkJBQTZCLDJEQUF3QjtBQUNyRCw2Q0FBNkMsd0VBQStCO0FBQzVFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYSwyREFBb0I7QUFDakM7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUEsb0JBQW9CLGlFQUFtQjs7QUFFdkM7QUFDQSxXQUFXLHNEQUFRLE9BQU8scURBQWEsZUFBZSxrRUFBb0I7QUFDMUU7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsU0FBUyw4REFBYztBQUN2QjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ087QUFDUCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNQLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDTztBQUNQOztBQUVBLHVDQUF1QztBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7O0FBR0EsTUFBTSxJQUFxQztBQUMzQztBQUNBLGdFQUFnRSxXQUFXO0FBQzNFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7O0FBRUEsTUFBTSxpREFBUztBQUNmLG9CQUFvQixXQUFXLFFBQVE7O0FBRXZDO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBLFNBQVMsaURBQVE7QUFDakI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCLDJEQUFtQjtBQUNwQyxjQUFjLHNEQUFhO0FBQzNCLGtCQUFrQixxRUFBNEI7QUFDOUM7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1A7QUFDQSwwQkFBMEIsa0RBQVUsWUFBWTs7QUFFaEQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047OztBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7O0FBR047QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0EsMkJBQTJCLHNEQUFhO0FBQ3hDLE1BQU0sMkRBQVc7QUFDakI7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQ7QUFDakQ7QUFDQSxXQUFXO0FBQ1g7O0FBRUE7QUFDQSxPQUFPO0FBQ1A7O0FBRUE7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0EsbUZBQW1GO0FBQ25GO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzPzRkN2IiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fcmVzdCA9IHRoaXMgJiYgdGhpcy5fX3Jlc3QgfHwgZnVuY3Rpb24gKHMsIGUpIHtcbiAgdmFyIHQgPSB7fTtcblxuICBmb3IgKHZhciBwIGluIHMpIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocywgcCkgJiYgZS5pbmRleE9mKHApIDwgMCkgdFtwXSA9IHNbcF07XG5cbiAgaWYgKHMgIT0gbnVsbCAmJiB0eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyA9PT0gXCJmdW5jdGlvblwiKSBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKSB0W3BbaV1dID0gc1twW2ldXTtcbiAgfVxuICByZXR1cm4gdDtcbn07XG5cbmltcG9ydCB7IGFycmF5VG9NYXAsIGdldEZvbnRTdHJpbmcsIGdldFVwZGF0ZWRUaW1lc3RhbXAsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmFuZG9tSW50ZWdlciwgcmFuZG9tSWQgfSBmcm9tIFwiLi4vcmFuZG9tXCI7XG5pbXBvcnQgeyBidW1wVmVyc2lvbiwgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGFkanVzdFhZV2l0aFJvdGF0aW9uIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7IGdldENvbnRhaW5lckVsZW1lbnQsIG1lYXN1cmVUZXh0LCBub3JtYWxpemVUZXh0LCB3cmFwVGV4dCwgZ2V0Qm91bmRUZXh0TWF4V2lkdGgsIGdldERlZmF1bHRMaW5lSGVpZ2h0IH0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IERFRkFVTFRfRUxFTUVOVF9QUk9QUywgREVGQVVMVF9GT05UX0ZBTUlMWSwgREVGQVVMVF9GT05UX1NJWkUsIERFRkFVTFRfVEVYVF9BTElHTiwgREVGQVVMVF9WRVJUSUNBTF9BTElHTiwgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmNvbnN0IF9uZXdFbGVtZW50QmFzZSA9ICh0eXBlLCBfYSkgPT4ge1xuICB2YXIgX2IsIF9jO1xuXG4gIHZhciB7XG4gICAgeCxcbiAgICB5LFxuICAgIHN0cm9rZUNvbG9yID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLnN0cm9rZUNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvciA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5iYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlID0gREVGQVVMVF9FTEVNRU5UX1BST1BTLmZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5zdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5zdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMucm91Z2huZXNzLFxuICAgIG9wYWNpdHkgPSBERUZBVUxUX0VMRU1FTlRfUFJPUFMub3BhY2l0eSxcbiAgICB3aWR0aCA9IDAsXG4gICAgaGVpZ2h0ID0gMCxcbiAgICBhbmdsZSA9IDAsXG4gICAgZ3JvdXBJZHMgPSBbXSxcbiAgICBmcmFtZUlkID0gbnVsbCxcbiAgICByb3VuZG5lc3MgPSBudWxsLFxuICAgIGJvdW5kRWxlbWVudHMgPSBudWxsLFxuICAgIGxpbmsgPSBudWxsLFxuICAgIGxvY2tlZCA9IERFRkFVTFRfRUxFTUVOVF9QUk9QUy5sb2NrZWRcbiAgfSA9IF9hLFxuICAgICAgcmVzdCA9IF9fcmVzdChfYSwgW1wieFwiLCBcInlcIiwgXCJzdHJva2VDb2xvclwiLCBcImJhY2tncm91bmRDb2xvclwiLCBcImZpbGxTdHlsZVwiLCBcInN0cm9rZVdpZHRoXCIsIFwic3Ryb2tlU3R5bGVcIiwgXCJyb3VnaG5lc3NcIiwgXCJvcGFjaXR5XCIsIFwid2lkdGhcIiwgXCJoZWlnaHRcIiwgXCJhbmdsZVwiLCBcImdyb3VwSWRzXCIsIFwiZnJhbWVJZFwiLCBcInJvdW5kbmVzc1wiLCBcImJvdW5kRWxlbWVudHNcIiwgXCJsaW5rXCIsIFwibG9ja2VkXCJdKTsgLy8gYXNzaWduIHR5cGUgdG8gZ3VhcmQgYWdhaW5zdCBleGNlc3MgcHJvcGVydGllc1xuXG5cbiAgY29uc3QgZWxlbWVudCA9IHtcbiAgICBpZDogcmVzdC5pZCB8fCByYW5kb21JZCgpLFxuICAgIHR5cGUsXG4gICAgeCxcbiAgICB5LFxuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBhbmdsZSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIGdyb3VwSWRzLFxuICAgIGZyYW1lSWQsXG4gICAgcm91bmRuZXNzLFxuICAgIHNlZWQ6IChfYiA9IHJlc3Quc2VlZCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogcmFuZG9tSW50ZWdlcigpLFxuICAgIHZlcnNpb246IHJlc3QudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogKF9jID0gcmVzdC52ZXJzaW9uTm9uY2UpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDAsXG4gICAgaXNEZWxldGVkOiBmYWxzZSxcbiAgICBib3VuZEVsZW1lbnRzLFxuICAgIHVwZGF0ZWQ6IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rLFxuICAgIGxvY2tlZCxcbiAgICBjdXN0b21EYXRhOiByZXN0LmN1c3RvbURhdGFcbiAgfTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IG9wdHMgPT4gX25ld0VsZW1lbnRCYXNlKG9wdHMudHlwZSwgb3B0cyk7XG5leHBvcnQgY29uc3QgbmV3RW1iZWRkYWJsZUVsZW1lbnQgPSBvcHRzID0+IHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgX25ld0VsZW1lbnRCYXNlKFwiZW1iZWRkYWJsZVwiLCBvcHRzKSksIHtcbiAgICB2YWxpZGF0ZWQ6IG9wdHMudmFsaWRhdGVkXG4gIH0pO1xufTtcbmV4cG9ydCBjb25zdCBuZXdGcmFtZUVsZW1lbnQgPSBvcHRzID0+IHtcbiAgY29uc3QgZnJhbWVFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2UoXCJmcmFtZVwiLCBvcHRzKSksIHtcbiAgICB0eXBlOiBcImZyYW1lXCIsXG4gICAgbmFtZTogKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5uYW1lKSB8fCBudWxsXG4gIH0pLCB7fSk7XG4gIHJldHVybiBmcmFtZUVsZW1lbnQ7XG59O1xuLyoqIGNvbXB1dGVzIGVsZW1lbnQgeC95IG9mZnNldCBiYXNlZCBvbiB0ZXh0QWxpZ24vdmVydGljYWxBbGlnbiAqL1xuXG5jb25zdCBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyA9IChvcHRzLCBtZXRyaWNzKSA9PiB7XG4gIHJldHVybiB7XG4gICAgeDogb3B0cy50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgPyBtZXRyaWNzLndpZHRoIC8gMiA6IG9wdHMudGV4dEFsaWduID09PSBcInJpZ2h0XCIgPyBtZXRyaWNzLndpZHRoIDogMCxcbiAgICB5OiBvcHRzLnZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIgPyBtZXRyaWNzLmhlaWdodCAvIDIgOiAwXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3VGV4dEVsZW1lbnQgPSBvcHRzID0+IHtcbiAgY29uc3QgZm9udEZhbWlseSA9IG9wdHMuZm9udEZhbWlseSB8fCBERUZBVUxUX0ZPTlRfRkFNSUxZO1xuICBjb25zdCBmb250U2l6ZSA9IG9wdHMuZm9udFNpemUgfHwgREVGQVVMVF9GT05UX1NJWkU7XG4gIGNvbnN0IGxpbmVIZWlnaHQgPSBvcHRzLmxpbmVIZWlnaHQgfHwgZ2V0RGVmYXVsdExpbmVIZWlnaHQoZm9udEZhbWlseSk7XG4gIGNvbnN0IHRleHQgPSBub3JtYWxpemVUZXh0KG9wdHMudGV4dCk7XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKHtcbiAgICBmb250RmFtaWx5LFxuICAgIGZvbnRTaXplXG4gIH0pLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3QgdGV4dEFsaWduID0gb3B0cy50ZXh0QWxpZ24gfHwgREVGQVVMVF9URVhUX0FMSUdOO1xuICBjb25zdCB2ZXJ0aWNhbEFsaWduID0gb3B0cy52ZXJ0aWNhbEFsaWduIHx8IERFRkFVTFRfVkVSVElDQUxfQUxJR047XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyh7XG4gICAgdGV4dEFsaWduLFxuICAgIHZlcnRpY2FsQWxpZ25cbiAgfSwgbWV0cmljcyk7XG4gIGNvbnN0IHRleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2UoXCJ0ZXh0XCIsIG9wdHMpKSwge1xuICAgIHRleHQsXG4gICAgZm9udFNpemUsXG4gICAgZm9udEZhbWlseSxcbiAgICB0ZXh0QWxpZ24sXG4gICAgdmVydGljYWxBbGlnbixcbiAgICB4OiBvcHRzLnggLSBvZmZzZXRzLngsXG4gICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgIGhlaWdodDogbWV0cmljcy5oZWlnaHQsXG4gICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUsXG4gICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICBvcmlnaW5hbFRleHQ6IHRleHQsXG4gICAgbGluZUhlaWdodFxuICB9KSwge30pO1xuICByZXR1cm4gdGV4dEVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBZGp1c3RlZERpbWVuc2lvbnMgPSAoZWxlbWVudCwgbmV4dFRleHQpID0+IHtcbiAgY29uc3Qge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBuZXh0QmFzZWxpbmVcbiAgfSA9IG1lYXN1cmVUZXh0KG5leHRUZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBlbGVtZW50LmxpbmVIZWlnaHQpO1xuICBjb25zdCB7XG4gICAgdGV4dEFsaWduLFxuICAgIHZlcnRpY2FsQWxpZ25cbiAgfSA9IGVsZW1lbnQ7XG4gIGxldCB4O1xuICBsZXQgeTtcblxuICBpZiAodGV4dEFsaWduID09PSBcImNlbnRlclwiICYmIHZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSAmJiAhZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIGNvbnN0IHByZXZNZXRyaWNzID0gbWVhc3VyZVRleHQoZWxlbWVudC50ZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBlbGVtZW50LmxpbmVIZWlnaHQpO1xuICAgIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbmV4dFdpZHRoIC0gcHJldk1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQgLSBwcmV2TWV0cmljcy5oZWlnaHRcbiAgICB9KTtcbiAgICB4ID0gZWxlbWVudC54IC0gb2Zmc2V0cy54O1xuICAgIHkgPSBlbGVtZW50LnkgLSBvZmZzZXRzLnk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBbbmV4dFgxLCBuZXh0WTEsIG5leHRYMiwgbmV4dFkyXSA9IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCwgbmV4dFdpZHRoLCBuZXh0SGVpZ2h0LCBmYWxzZSk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuICAgIFt4LCB5XSA9IGFkanVzdFhZV2l0aFJvdGF0aW9uKHtcbiAgICAgIHM6IHRydWUsXG4gICAgICBlOiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcImxlZnRcIixcbiAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgIH0sIGVsZW1lbnQueCwgZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlLCBkZWx0YVgxLCBkZWx0YVkxLCBkZWx0YVgyLCBkZWx0YVkyKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgYmFzZWxpbmU6IG5leHRCYXNlbGluZSxcbiAgICB4OiBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogZWxlbWVudC54LFxuICAgIHk6IE51bWJlci5pc0Zpbml0ZSh5KSA/IHkgOiBlbGVtZW50LnlcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWZyZXNoVGV4dERpbWVuc2lvbnMgPSAodGV4dEVsZW1lbnQsIHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0KSA9PiB7XG4gIGlmICh0ZXh0RWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHRleHRFbGVtZW50KTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgdGV4dCA9IHdyYXBUZXh0KHRleHQsIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLCBnZXRCb3VuZFRleHRNYXhXaWR0aChjb250YWluZXIpKTtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvbnMgPSBnZXRBZGp1c3RlZERpbWVuc2lvbnModGV4dEVsZW1lbnQsIHRleHQpO1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbih7XG4gICAgdGV4dFxuICB9LCBkaW1lbnNpb25zKTtcbn07XG5leHBvcnQgY29uc3QgdXBkYXRlVGV4dEVsZW1lbnQgPSAodGV4dEVsZW1lbnQsIHtcbiAgdGV4dCxcbiAgaXNEZWxldGVkLFxuICBvcmlnaW5hbFRleHRcbn0pID0+IHtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKHRleHRFbGVtZW50LCBPYmplY3QuYXNzaWduKHtcbiAgICBvcmlnaW5hbFRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgIT09IG51bGwgJiYgaXNEZWxldGVkICE9PSB2b2lkIDAgPyBpc0RlbGV0ZWQgOiB0ZXh0RWxlbWVudC5pc0RlbGV0ZWRcbiAgfSwgcmVmcmVzaFRleHREaW1lbnNpb25zKHRleHRFbGVtZW50LCBvcmlnaW5hbFRleHQpKSk7XG59O1xuZXhwb3J0IGNvbnN0IG5ld0ZyZWVEcmF3RWxlbWVudCA9IG9wdHMgPT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKSksIHtcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbFxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgbmV3TGluZWFyRWxlbWVudCA9IG9wdHMgPT4ge1xuICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKSksIHtcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICBzdGFydEJpbmRpbmc6IG51bGwsXG4gICAgZW5kQmluZGluZzogbnVsbCxcbiAgICBzdGFydEFycm93aGVhZDogb3B0cy5zdGFydEFycm93aGVhZCB8fCBudWxsLFxuICAgIGVuZEFycm93aGVhZDogb3B0cy5lbmRBcnJvd2hlYWQgfHwgbnVsbFxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgbmV3SW1hZ2VFbGVtZW50ID0gb3B0cyA9PiB7XG4gIHZhciBfYSwgX2IsIF9jO1xuXG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIF9uZXdFbGVtZW50QmFzZShcImltYWdlXCIsIG9wdHMpKSwge1xuICAgIC8vIGluIHRoZSBmdXR1cmUgd2UnbGwgc3VwcG9ydCBjaGFuZ2luZyBzdHJva2UgY29sb3IgZm9yIHNvbWUgU1ZHIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBgdHJhbnNwYXJlbnRgIHdpbGwgbGlrZWx5IG1lYW4gXCJ1c2Ugb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBpbWFnZVwiXG4gICAgc3Ryb2tlQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICBzdGF0dXM6IChfYSA9IG9wdHMuc3RhdHVzKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBcInBlbmRpbmdcIixcbiAgICBmaWxlSWQ6IChfYiA9IG9wdHMuZmlsZUlkKSAhPT0gbnVsbCAmJiBfYiAhPT0gdm9pZCAwID8gX2IgOiBudWxsLFxuICAgIHNjYWxlOiAoX2MgPSBvcHRzLnNjYWxlKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBbMSwgMV1cbiAgfSk7XG59OyAvLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQuXG4vL1xuLy8gT25seSBjbG9uZXMgcGxhaW4gb2JqZWN0cyBhbmQgYXJyYXlzLiBEb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsXG4vLyBUeXBlZCBhcnJheXMgYW5kIG90aGVyIG5vbi1udWxsIG9iamVjdHMuXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcbi8vXG4vLyBUaGUgcmVhc29uIGZvciBgZGVlcENvcHlFbGVtZW50KClgIHdyYXBwZXIgaXMgdHlwZSBzYWZldHkgKG9ubHkgYWxsb3dcbi8vIHBhc3NpbmcgRXhjYWxpZHJhd0VsZW1lbnQgYXMgdGhlIHRvcC1sZXZlbCBhcmd1bWVudCkuXG5cbmNvbnN0IF9kZWVwQ29weUVsZW1lbnQgPSAodmFsLCBkZXB0aCA9IDApID0+IHtcbiAgLy8gb25seSBjbG9uZSBub24tcHJpbWl0aXZlc1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBjb25zdCBvYmplY3RUeXBlID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCk7XG5cbiAgaWYgKG9iamVjdFR5cGUgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICBjb25zdCB0bXAgPSB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKSA6IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gZG9uJ3QgY29weSBub24tc2VyaWFsaXphYmxlIG9iamVjdHMgbGlrZSB0aGVzZSBjYWNoZXMuIFRoZXknbGwgYmVcbiAgICAgICAgLy8gcG9wdWxhdGVkIHdoZW4gdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWQuXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiAoa2V5ID09PSBcInNoYXBlXCIgfHwga2V5ID09PSBcImNhbnZhc1wiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG1wW2tleV0gPSBfZGVlcENvcHlFbGVtZW50KHZhbFtrZXldLCBkZXB0aCArIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcblxuICAgIHdoaWxlIChrLS0pIHtcbiAgICAgIGFycltrXSA9IF9kZWVwQ29weUVsZW1lbnQodmFsW2tdLCBkZXB0aCArIDEpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnI7XG4gIH0gLy8gd2UncmUgbm90IGNsb25pbmcgbm9uLWFycmF5ICYgbm9uLXBsYWluLW9iamVjdCBvYmplY3RzIGJlY2F1c2Ugd2VcbiAgLy8gZG9uJ3Qgc3VwcG9ydCB0aGVtIG9uIGV4Y2FsaWRyYXcgZWxlbWVudHMgeWV0LiBJZiB3ZSBkbywgd2UgbmVlZCB0byBtYWtlXG4gIC8vIHN1cmUgd2Ugc3RhcnQgY2xvbmluZyB0aGVtLCBzbyBsZXQncyB3YXJuIGFib3V0IGl0LlxuXG5cbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGlmIChvYmplY3RUeXBlICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICYmIG9iamVjdFR5cGUgIT09IFwiW29iamVjdCBBcnJheV1cIiAmJiBvYmplY3RUeXBlLnN0YXJ0c1dpdGgoXCJbb2JqZWN0IFwiKSkge1xuICAgICAgY29uc29sZS53YXJuKGBfZGVlcENsb25lRWxlbWVudDogdW5leHBlY3RlZCBvYmplY3QgdHlwZSAke29iamVjdFR5cGV9LiBUaGlzIHZhbHVlIHdpbGwgbm90IGJlIGNsb25lZCFgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdmFsO1xufTtcbi8qKlxuICogQ2xvbmVzIEV4Y2FsaWRyYXdFbGVtZW50IGRhdGEgc3RydWN0dXJlLiBEb2VzIG5vdCByZWdlbmVyYXRlIGlkLCBub25jZSwgb3JcbiAqIGFueSB2YWx1ZS4gVGhlIHB1cnBvc2UgaXMgdG8gdG8gYnJlYWsgb2JqZWN0IHJlZmVyZW5jZXMgZm9yIGltbXV0YWJpbGl0eVxuICogcmVhc29ucywgd2hlbmV2ZXIgd2Ugd2FudCB0byBrZWVwIHRoZSBvcmlnaW5hbCBlbGVtZW50LCBidXQgZW5zdXJlIGl0J3Mgbm90XG4gKiBtdXRhdGVkLlxuICpcbiAqIE9ubHkgY2xvbmVzIHBsYWluIG9iamVjdHMgYW5kIGFycmF5cy4gRG9lc24ndCBjbG9uZSBEYXRlLCBSZWdFeHAsIE1hcCwgU2V0LFxuICogVHlwZWQgYXJyYXlzIGFuZCBvdGhlciBub24tbnVsbCBvYmplY3RzLlxuICovXG5cblxuZXhwb3J0IGNvbnN0IGRlZXBDb3B5RWxlbWVudCA9IHZhbCA9PiB7XG4gIHJldHVybiBfZGVlcENvcHlFbGVtZW50KHZhbCk7XG59O1xuLyoqXG4gKiB1dGlsaXR5IHdyYXBwZXIgdG8gZ2VuZXJhdGUgbmV3IGlkLiBJbiB0ZXN0IGVudiBpdCByZXVzZXMgdGhlIG9sZCArIHBvc3RmaXhcbiAqIGZvciB0ZXN0IGFzc2VydGlvbnMuXG4gKi9cblxuZXhwb3J0IGNvbnN0IHJlZ2VuZXJhdGVJZCA9IChcbi8qKiBzdXBwbHkgbnVsbCBpZiBubyBwcmV2aW91cyBpZCBleGlzdHMgKi9cbnByZXZpb3VzSWQpID0+IHtcbiAgdmFyIF9hLCBfYjtcblxuICBpZiAoaXNUZXN0RW52KCkgJiYgcHJldmlvdXNJZCkge1xuICAgIGxldCBuZXh0SWQgPSBgJHtwcmV2aW91c0lkfV9jb3B5YDsgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG5cbiAgICBpZiAoKF9iID0gKF9hID0gd2luZG93LmgpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hcHApID09PSBudWxsIHx8IF9iID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYi5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbmQoZWwgPT4gZWwuaWQgPT09IG5leHRJZCkpIHtcbiAgICAgIG5leHRJZCArPSBcIl9jb3B5XCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRJZDtcbiAgfVxuXG4gIHJldHVybiByYW5kb21JZCgpO1xufTtcbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cblxuZXhwb3J0IGNvbnN0IGR1cGxpY2F0ZUVsZW1lbnQgPSAoZWRpdGluZ0dyb3VwSWQsIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24sIGVsZW1lbnQsIG92ZXJyaWRlcykgPT4ge1xuICBsZXQgY29weSA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcbiAgY29weS5pZCA9IHJlZ2VuZXJhdGVJZChjb3B5LmlkKTtcbiAgY29weS5ib3VuZEVsZW1lbnRzID0gbnVsbDtcbiAgY29weS51cGRhdGVkID0gZ2V0VXBkYXRlZFRpbWVzdGFtcCgpO1xuICBjb3B5LnNlZWQgPSByYW5kb21JbnRlZ2VyKCk7XG4gIGNvcHkuZ3JvdXBJZHMgPSBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uKGNvcHkuZ3JvdXBJZHMsIGVkaXRpbmdHcm91cElkLCBncm91cElkID0+IHtcbiAgICBpZiAoIWdyb3VwSWRNYXBGb3JPcGVyYXRpb24uaGFzKGdyb3VwSWQpKSB7XG4gICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByZWdlbmVyYXRlSWQoZ3JvdXBJZCkpO1xuICAgIH1cblxuICAgIHJldHVybiBncm91cElkTWFwRm9yT3BlcmF0aW9uLmdldChncm91cElkKTtcbiAgfSk7XG5cbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvcHkgPSBPYmplY3QuYXNzaWduKGNvcHksIG92ZXJyaWRlcyk7XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG4vKipcbiAqIENsb25lcyBlbGVtZW50cywgcmVnZW5lcmF0aW5nIHRoZWlyIGlkcyAoaW5jbHVkaW5nIGJpbmRpbmdzKSBhbmQgZ3JvdXAgaWRzLlxuICpcbiAqIElmIGJpbmRpbmdzIGRvbid0IGV4aXN0IGluIHRoZSBlbGVtZW50cyBhcnJheSwgdGhleSBhcmUgcmVtb3ZlZC4gVGhlcmVmb3JlLFxuICogaXQncyBhZHZpc2VkIHRvIHN1cHBseSB0aGUgd2hvbGUgZWxlbWVudHMgYXJyYXksIG9yIHNldHMgb2YgZWxlbWVudHMgdGhhdFxuICogYXJlIGVuY2Fwc3VsYXRlZCAoc3VjaCBhcyBsaWJyYXJ5IGl0ZW1zKSwgaWYgdGhlIHB1cnBvc2UgaXMgdG8gcmV0YWluXG4gKiBiaW5kaW5ncyB0byB0aGUgY2xvbmVkIGVsZW1lbnRzIGludGFjdC5cbiAqXG4gKiBOT1RFIGJ5IGRlZmF1bHQgZG9lcyBub3QgcmFuZG9taXplIG9yIHJlZ2VuZXJhdGUgYW55dGhpbmcgZXhjZXB0IHRoZSBpZC5cbiAqL1xuXG5leHBvcnQgY29uc3QgZHVwbGljYXRlRWxlbWVudHMgPSAoZWxlbWVudHMsIG9wdHMpID0+IHtcbiAgY29uc3QgY2xvbmVkRWxlbWVudHMgPSBbXTtcbiAgY29uc3Qgb3JpZ0VsZW1lbnRzTWFwID0gYXJyYXlUb01hcChlbGVtZW50cyk7IC8vIHVzZWQgZm9yIGZvciBtaWdyYXRpbmcgb2xkIGlkcyB0byBuZXcgaWRzXG5cbiAgY29uc3QgZWxlbWVudE5ld0lkc01hcCA9IG5ldyBNYXAoKTtcblxuICBjb25zdCBtYXliZUdldE5ld0lkID0gaWQgPT4ge1xuICAgIC8vIGlmIHdlJ3ZlIGFscmVhZHkgbWlncmF0ZWQgdGhlIGVsZW1lbnQgaWQsIHJldHVybiB0aGUgbmV3IG9uZSBkaXJlY3RseVxuICAgIGlmIChlbGVtZW50TmV3SWRzTWFwLmhhcyhpZCkpIHtcbiAgICAgIHJldHVybiBlbGVtZW50TmV3SWRzTWFwLmdldChpZCk7XG4gICAgfSAvLyBpZiB3ZSBoYXZlbid0IG1pZ3JhdGVkIHRoZSBlbGVtZW50IGlkLCBidXQgYW4gb2xkIGVsZW1lbnQgd2l0aCB0aGUgc2FtZVxuICAgIC8vIGlkIGV4aXN0cywgZ2VuZXJhdGUgYSBuZXcgaWQgZm9yIGl0IGFuZCByZXR1cm4gaXRcblxuXG4gICAgaWYgKG9yaWdFbGVtZW50c01hcC5oYXMoaWQpKSB7XG4gICAgICBjb25zdCBuZXdJZCA9IHJlZ2VuZXJhdGVJZChpZCk7XG4gICAgICBlbGVtZW50TmV3SWRzTWFwLnNldChpZCwgbmV3SWQpO1xuICAgICAgcmV0dXJuIG5ld0lkO1xuICAgIH0gLy8gaWYgb2xkIGVsZW1lbnQgZG9lc24ndCBleGlzdCwgcmV0dXJuIG51bGwgdG8gbWFyayBpdCBmb3IgcmVtb3ZhbFxuXG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcblxuICBjb25zdCBncm91cE5ld0lkc01hcCA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICBjb25zdCBjbG9uZWRFbGVtZW50ID0gX2RlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICAgIGNsb25lZEVsZW1lbnQuaWQgPSBtYXliZUdldE5ld0lkKGVsZW1lbnQuaWQpO1xuXG4gICAgaWYgKG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5yYW5kb21pemVTZWVkKSB7XG4gICAgICBjbG9uZWRFbGVtZW50LnNlZWQgPSByYW5kb21JbnRlZ2VyKCk7XG4gICAgICBidW1wVmVyc2lvbihjbG9uZWRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoY2xvbmVkRWxlbWVudC5ncm91cElkcykge1xuICAgICAgY2xvbmVkRWxlbWVudC5ncm91cElkcyA9IGNsb25lZEVsZW1lbnQuZ3JvdXBJZHMubWFwKGdyb3VwSWQgPT4ge1xuICAgICAgICBpZiAoIWdyb3VwTmV3SWRzTWFwLmhhcyhncm91cElkKSkge1xuICAgICAgICAgIGdyb3VwTmV3SWRzTWFwLnNldChncm91cElkLCByZWdlbmVyYXRlSWQoZ3JvdXBJZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdyb3VwTmV3SWRzTWFwLmdldChncm91cElkKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChcImNvbnRhaW5lcklkXCIgaW4gY2xvbmVkRWxlbWVudCAmJiBjbG9uZWRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICBjb25zdCBuZXdDb250YWluZXJJZCA9IG1heWJlR2V0TmV3SWQoY2xvbmVkRWxlbWVudC5jb250YWluZXJJZCk7XG4gICAgICBjbG9uZWRFbGVtZW50LmNvbnRhaW5lcklkID0gbmV3Q29udGFpbmVySWQ7XG4gICAgfVxuXG4gICAgaWYgKFwiYm91bmRFbGVtZW50c1wiIGluIGNsb25lZEVsZW1lbnQgJiYgY2xvbmVkRWxlbWVudC5ib3VuZEVsZW1lbnRzKSB7XG4gICAgICBjbG9uZWRFbGVtZW50LmJvdW5kRWxlbWVudHMgPSBjbG9uZWRFbGVtZW50LmJvdW5kRWxlbWVudHMucmVkdWNlKChhY2MsIGJpbmRpbmcpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QmluZGluZ0lkID0gbWF5YmVHZXROZXdJZChiaW5kaW5nLmlkKTtcblxuICAgICAgICBpZiAobmV3QmluZGluZ0lkKSB7XG4gICAgICAgICAgYWNjLnB1c2goT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBiaW5kaW5nKSwge1xuICAgICAgICAgICAgaWQ6IG5ld0JpbmRpbmdJZFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LCBbXSk7XG4gICAgfVxuXG4gICAgaWYgKFwiZW5kQmluZGluZ1wiIGluIGNsb25lZEVsZW1lbnQgJiYgY2xvbmVkRWxlbWVudC5lbmRCaW5kaW5nKSB7XG4gICAgICBjb25zdCBuZXdFbmRCaW5kaW5nSWQgPSBtYXliZUdldE5ld0lkKGNsb25lZEVsZW1lbnQuZW5kQmluZGluZy5lbGVtZW50SWQpO1xuICAgICAgY2xvbmVkRWxlbWVudC5lbmRCaW5kaW5nID0gbmV3RW5kQmluZGluZ0lkID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjbG9uZWRFbGVtZW50LmVuZEJpbmRpbmcpLCB7XG4gICAgICAgIGVsZW1lbnRJZDogbmV3RW5kQmluZGluZ0lkXG4gICAgICB9KSA6IG51bGw7XG4gICAgfVxuXG4gICAgaWYgKFwic3RhcnRCaW5kaW5nXCIgaW4gY2xvbmVkRWxlbWVudCAmJiBjbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZykge1xuICAgICAgY29uc3QgbmV3RW5kQmluZGluZ0lkID0gbWF5YmVHZXROZXdJZChjbG9uZWRFbGVtZW50LnN0YXJ0QmluZGluZy5lbGVtZW50SWQpO1xuICAgICAgY2xvbmVkRWxlbWVudC5zdGFydEJpbmRpbmcgPSBuZXdFbmRCaW5kaW5nSWQgPyBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNsb25lZEVsZW1lbnQuc3RhcnRCaW5kaW5nKSwge1xuICAgICAgICBlbGVtZW50SWQ6IG5ld0VuZEJpbmRpbmdJZFxuICAgICAgfSkgOiBudWxsO1xuICAgIH1cblxuICAgIGlmIChjbG9uZWRFbGVtZW50LmZyYW1lSWQpIHtcbiAgICAgIGNsb25lZEVsZW1lbnQuZnJhbWVJZCA9IG1heWJlR2V0TmV3SWQoY2xvbmVkRWxlbWVudC5mcmFtZUlkKTtcbiAgICB9XG5cbiAgICBjbG9uZWRFbGVtZW50cy5wdXNoKGNsb25lZEVsZW1lbnQpO1xuICB9XG5cbiAgcmV0dXJuIGNsb25lZEVsZW1lbnRzO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
3963
3963
 
3964
3964
  /***/ }),
3965
3965
 
@@ -4344,7 +4344,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4344
4344
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4345
4345
 
4346
4346
  "use strict";
4347
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.17.0\"}/dist/`;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDOztBQUV0QyxJQUFJLGFBQW9CLEtBQUssZ0RBQVE7QUFDckM7O0FBRUE7QUFDQSxFQUFFLHFCQUF1Qix3REFBd0Qsd0JBQXlCLENBQUMsR0FBRyxRQUE0QixDQUFDO0FBQzNJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcHVibGljUGF0aC5qcz82N2Y5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOViB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9IHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHwgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuVklURV9QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5WSVRFX1BLR19WRVJTSU9OfS9kaXN0L2A7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
4347
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.17.3\"}/dist/`;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDOztBQUV0QyxJQUFJLGFBQW9CLEtBQUssZ0RBQVE7QUFDckM7O0FBRUE7QUFDQSxFQUFFLHFCQUF1Qix3REFBd0Qsd0JBQXlCLENBQUMsR0FBRyxRQUE0QixDQUFDO0FBQzNJIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vcHVibGljUGF0aC5qcz82N2Y5Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVOViB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9IHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHwgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuVklURV9QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5WSVRFX1BLR19WRVJTSU9OfS9kaXN0L2A7XG59Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
4348
4348
 
4349
4349
  /***/ }),
4350
4350
 
@@ -4520,7 +4520,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4520
4520
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4521
4521
 
4522
4522
  "use strict";
4523
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../packages/withinBounds */ \"../withinBounds.ts\");\n/* harmony import */ var _frame__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../frame */ \"../../frame.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Scene */ \"../../scene/Scene.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`; // getContainerElement and getBoundTextElement and potentially other helpers\n// depend on `Scene` which will not be available when these pure utils are\n// called outside initialized Excalidraw editor instance or even if called\n// from inside Excalidraw if the elements were never cached by Scene (e.g.\n// for library elements).\n//\n// As such, before passing the elements down, we need to initialize a custom\n// Scene instance and assign them to it.\n//\n// FIXME This is a super hacky workaround and we'll need to rewrite this soon.\n\nconst __createSceneForElementsHack__ = elements => {\n const scene = new _Scene__WEBPACK_IMPORTED_MODULE_12__[\"default\"](); // we can't duplicate elements to regenerate ids because we need the\n // orig ids when embedding. So we do another hack of not mapping element\n // ids to Scene instances so that we don't override the editor elements\n // mapping.\n // We still need to clone the objects themselves to regen references.\n\n scene.replaceAllElements((0,_utils__WEBPACK_IMPORTED_MODULE_3__.cloneJSON)(elements), false);\n return scene;\n};\n\nconst truncateText = (element, maxWidth) => {\n if (element.width <= maxWidth) {\n return element;\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n ctx.font = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getFontString)({\n fontFamily: element.fontFamily,\n fontSize: element.fontSize\n });\n let text = element.text;\n const metrics = ctx.measureText(text);\n\n if (metrics.width > maxWidth) {\n // we iterate from the right, removing characters one by one instead\n // of bulding the string up. This assumes that it's more likely\n // your frame names will overflow by not that many characters\n // (if ever), so it sohuld be faster this way.\n for (let i = text.length; i > 0; i--) {\n const newText = `${text.slice(0, i)}...`;\n\n if (ctx.measureText(newText).width <= maxWidth) {\n text = newText;\n break;\n }\n }\n }\n\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_11__.newElementWith)(element, {\n text,\n width: maxWidth\n });\n};\n/**\n * When exporting frames, we need to render frame labels which are currently\n * being rendered in DOM when editing. Adding the labels as regular text\n * elements seems like a simple hack. In the future we'll want to move to\n * proper canvas rendering, even within editor (instead of DOM).\n */\n\n\nconst addFrameLabelsAsTextElements = (elements, opts) => {\n const nextElements = [];\n let frameIdx = 0;\n\n for (const element of elements) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_10__.isFrameElement)(element)) {\n frameIdx++;\n let textElement = (0,_element__WEBPACK_IMPORTED_MODULE_10__.newTextElement)({\n x: element.x,\n y: element.y - _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameOffsetY,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_4__.FONT_FAMILY.Assistant,\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameFontSize,\n lineHeight: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameLineHeight,\n strokeColor: opts.exportWithDarkMode ? _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorDarkTheme : _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorLightTheme,\n text: element.name || `Frame ${frameIdx}`\n });\n textElement.y -= textElement.height;\n textElement = truncateText(textElement, element.width);\n nextElements.push(textElement);\n }\n\n nextElements.push(element);\n }\n\n return nextElements;\n};\n\nconst getFrameRenderingConfig = (exportingFrame, frameRendering) => {\n frameRendering = frameRendering || (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)().frameRendering;\n return {\n enabled: exportingFrame ? true : frameRendering.enabled,\n outline: exportingFrame ? false : frameRendering.outline,\n name: exportingFrame ? false : frameRendering.name,\n clip: exportingFrame ? true : frameRendering.clip\n };\n};\n\nconst prepareElementsForRender = ({\n elements,\n exportingFrame,\n frameRendering,\n exportWithDarkMode\n}) => {\n let nextElements;\n\n if (exportingFrame) {\n nextElements = (0,_packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__.elementsOverlappingBBox)({\n elements,\n bounds: exportingFrame,\n type: \"overlap\"\n });\n } else if (frameRendering.enabled && frameRendering.name) {\n nextElements = addFrameLabelsAsTextElements(elements, {\n exportWithDarkMode\n });\n } else {\n nextElements = elements;\n }\n\n return nextElements;\n};\n\nconst exportToCanvas = (elements, appState, files, {\n exportBackground,\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportingFrame\n}, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return {\n canvas,\n scale: appState.exportScale\n };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig(exportingFrame !== null && exportingFrame !== void 0 ? exportingFrame : null, (_a = appState.frameRendering) !== null && _a !== void 0 ? _a : null);\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode: appState.exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding);\n const {\n canvas,\n scale = 1\n } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const {\n imageCache\n } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elementsForRender).map(element => element.fileId),\n files\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderStaticScene)({\n canvas,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n elements: elementsForRender,\n visibleElements: elementsForRender,\n scale,\n appState: Object.assign(Object.assign({}, appState), {\n frameRendering,\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\"\n }),\n renderConfig: {\n imageCache,\n renderGrid: false,\n isExporting: true\n }\n });\n tempScene.destroy();\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _b, _c, _d;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig((_b = opts === null || opts === void 0 ? void 0 : opts.exportingFrame) !== null && _b !== void 0 ? _b : null, (_c = appState.frameRendering) !== null && _c !== void 0 ? _c : null);\n let {\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n exportWithDarkMode = false,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene\n } = appState;\n const {\n exportingFrame = null\n } = opts || {};\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n let metadata = \"\"; // we need to serialize the \"original\" elements before we put them through\n // the tempScene hack which duplicates and regenerates ids\n\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n // when embedding scene, we want to embed the origionally supplied\n // elements which don't contain the temp frame labels.\n // But it also requires that the exportToSvg is being supplied with\n // only the elements that we're exporting, and no extra.\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\")\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding); // initialize SVG root\n\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n\n if (exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\"; // Asset path needs to be determined only when using package\n\n if (true) {\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.0\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}`;\n\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n\n const offsetX = -minX + exportPadding;\n const offsetY = -minY + exportPadding;\n const frameElements = (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getFrameElements)(elements);\n let exportingFrameClipPath = \"\";\n\n for (const frame of frameElements) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(frame);\n const cx = (x2 - x1) / 2 - (frame.x - x1);\n const cy = (y2 - y1) / 2 - (frame.y - y1);\n exportingFrameClipPath += `<clipPath id=${frame.id}>\n <rect transform=\"translate(${frame.x + offsetX} ${frame.y + offsetY}) rotate(${frame.angle} ${cx} ${cy})\"\n width=\"${frame.width}\"\n height=\"${frame.height}\"\n >\n </rect>\n </clipPath>`;\n }\n\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n @font-face {\n font-family: \"Assistant\";\n src: url(\"${assetPath}Assistant-Regular.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `; // render background rect\n\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elementsForRender, rsvg, svgRoot, files || {}, {\n offsetX,\n offsetY,\n exportWithDarkMode,\n renderEmbeddables: (_d = opts === null || opts === void 0 ? void 0 : opts.renderEmbeddables) !== null && _d !== void 0 ? _d : false,\n frameRendering\n });\n tempScene.destroy();\n return svgRoot;\n}); // calculate smallest area to fit the contents in\n\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding * 2;\n return [minX, minY, width, height];\n};\n\nconst getExportSize = (elements, exportPadding, scale) => {\n const [,, width, height] = getCanvasSize(elements, exportPadding).map(dimension => Math.trunc(dimension * scale));\n return [width, height];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vc2NlbmUvZXhwb3J0LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFc0M7QUFDd0M7QUFDQTtBQUNoQjtBQUN3QztBQUNyRDtBQUNGO0FBQ2tDO0FBQ2Q7QUFDTjtBQUNEO0FBQ0Y7QUFDOUI7QUFDNUIseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQiwrQ0FBSyxJQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixpREFBUztBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLHFEQUFhO0FBQzFCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLE9BQU87QUFDckMseUJBQXlCLGlCQUFpQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsdUVBQWM7QUFDdkI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSx5REFBYztBQUN0QjtBQUNBLHdCQUF3Qix5REFBYztBQUN0QztBQUNBLHVCQUF1QiwrREFBdUI7QUFDOUMsb0JBQW9CLDZEQUFxQjtBQUN6QyxrQkFBa0IsZ0VBQXdCO0FBQzFDLG9CQUFvQixrRUFBMEI7QUFDOUMsK0NBQStDLHNFQUE4QixHQUFHLHVFQUErQjtBQUMvRyx1Q0FBdUMsU0FBUztBQUNoRCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDLDZEQUFrQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0EsbUJBQW1CLCtFQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQO0FBQ0Esa0JBQWtCLDhEQUFzQjtBQUN4QztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUEsd0ZBQXdGLHVEQUFlO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSiwwQkFBMEIsNkRBQWtCO0FBQzVDO0FBQ0E7QUFDQSxJQUFJLFFBQVEsZ0VBQWdCO0FBQzVCO0FBQ0EsYUFBYSwyRUFBMkI7QUFDeEM7QUFDQSxHQUFHO0FBQ0gsRUFBRSx3RUFBaUI7QUFDbkI7QUFDQSxRQUFRLGdFQUFZO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ007QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsOERBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLHVJQUVEO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYywyREFBZSxnQ0FBZ0M7QUFDN0QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUEsd0ZBQXdGLHVEQUFlLHFDQUFxQzs7QUFFNUksMkNBQTJDLDhDQUFNO0FBQ2pEO0FBQ0EsZ0NBQWdDLDhDQUFNO0FBQ3RDLHlDQUF5QyxPQUFPLEVBQUUsT0FBTztBQUN6RCxtQ0FBbUMsb0JBQW9CO0FBQ3ZELG9DQUFvQyxxQkFBcUI7O0FBRXpEO0FBQ0EsbUNBQW1DLG9EQUFZO0FBQy9DOztBQUVBLDZDQUE2Qzs7QUFFN0MsTUFBTSxJQUEwQztBQUNoRCxxRUFBcUUsd0JBQXlCLENBQUMsR0FBRyxzcUNBQVcsYUFBYTs7QUFFMUg7QUFDQSw0Q0FBNEMsdUJBQXVCO0FBQ25FOztBQUVBLG1CQUFtQixVQUFVO0FBQzdCOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0Isd0RBQWdCO0FBQ3hDOztBQUVBO0FBQ0EsNkJBQTZCLHlFQUF3QjtBQUNyRDtBQUNBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQseUNBQXlDLG1CQUFtQixFQUFFLGtCQUFrQixXQUFXLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUNuSCxtQkFBbUIsWUFBWTtBQUMvQixvQkFBb0IsYUFBYTtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLHVEQUF1RCw4Q0FBTTtBQUM3RDtBQUNBO0FBQ0Esa0NBQWtDLE1BQU07QUFDeEMsbUNBQW1DLE9BQU87QUFDMUM7QUFDQTtBQUNBOztBQUVBLGVBQWUsNkRBQVM7QUFDeEIsRUFBRSx1RUFBZ0IsOENBQThDO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBLG1DQUFtQyxnRUFBZTtBQUNsRCxnQkFBZ0IsZ0RBQVE7QUFDeEIsaUJBQWlCLGdEQUFRO0FBQ3pCO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzP2MzNzMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcblxuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uQm91bmRzLCBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lVG9TdmcsIHJlbmRlclN0YXRpY1NjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBjbG9uZUpTT04sIGRpc3RhbmNlLCBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBGT05UX0ZBTUlMWSwgRlJBTUVfU1RZTEUsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsIHVwZGF0ZUltYWdlQ2FjaGUgfSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuaW1wb3J0IHsgZWxlbWVudHNPdmVybGFwcGluZ0JCb3ggfSBmcm9tIFwiLi4vcGFja2FnZXMvd2l0aGluQm91bmRzXCI7XG5pbXBvcnQgeyBnZXRGcmFtZUVsZW1lbnRzLCBnZXRSb290RWxlbWVudHMgfSBmcm9tIFwiLi4vZnJhbWVcIjtcbmltcG9ydCB7IGlzRnJhbWVFbGVtZW50LCBuZXdUZXh0RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi9TY2VuZVwiO1xuY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDsgLy8gZ2V0Q29udGFpbmVyRWxlbWVudCBhbmQgZ2V0Qm91bmRUZXh0RWxlbWVudCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgaGVscGVyc1xuLy8gZGVwZW5kIG9uIGBTY2VuZWAgd2hpY2ggd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlc2UgcHVyZSB1dGlscyBhcmVcbi8vIGNhbGxlZCBvdXRzaWRlIGluaXRpYWxpemVkIEV4Y2FsaWRyYXcgZWRpdG9yIGluc3RhbmNlIG9yIGV2ZW4gaWYgY2FsbGVkXG4vLyBmcm9tIGluc2lkZSBFeGNhbGlkcmF3IGlmIHRoZSBlbGVtZW50cyB3ZXJlIG5ldmVyIGNhY2hlZCBieSBTY2VuZSAoZS5nLlxuLy8gZm9yIGxpYnJhcnkgZWxlbWVudHMpLlxuLy9cbi8vIEFzIHN1Y2gsIGJlZm9yZSBwYXNzaW5nIHRoZSBlbGVtZW50cyBkb3duLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUgYSBjdXN0b21cbi8vIFNjZW5lIGluc3RhbmNlIGFuZCBhc3NpZ24gdGhlbSB0byBpdC5cbi8vXG4vLyBGSVhNRSBUaGlzIGlzIGEgc3VwZXIgaGFja3kgd29ya2Fyb3VuZCBhbmQgd2UnbGwgbmVlZCB0byByZXdyaXRlIHRoaXMgc29vbi5cblxuY29uc3QgX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fID0gZWxlbWVudHMgPT4ge1xuICBjb25zdCBzY2VuZSA9IG5ldyBTY2VuZSgpOyAvLyB3ZSBjYW4ndCBkdXBsaWNhdGUgZWxlbWVudHMgdG8gcmVnZW5lcmF0ZSBpZHMgYmVjYXVzZSB3ZSBuZWVkIHRoZVxuICAvLyBvcmlnIGlkcyB3aGVuIGVtYmVkZGluZy4gU28gd2UgZG8gYW5vdGhlciBoYWNrIG9mIG5vdCBtYXBwaW5nIGVsZW1lbnRcbiAgLy8gaWRzIHRvIFNjZW5lIGluc3RhbmNlcyBzbyB0aGF0IHdlIGRvbid0IG92ZXJyaWRlIHRoZSBlZGl0b3IgZWxlbWVudHNcbiAgLy8gbWFwcGluZy5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBjbG9uZSB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzIHRvIHJlZ2VuIHJlZmVyZW5jZXMuXG5cbiAgc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGNsb25lSlNPTihlbGVtZW50cyksIGZhbHNlKTtcbiAgcmV0dXJuIHNjZW5lO1xufTtcblxuY29uc3QgdHJ1bmNhdGVUZXh0ID0gKGVsZW1lbnQsIG1heFdpZHRoKSA9PiB7XG4gIGlmIChlbGVtZW50LndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBjdHguZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgIGZvbnRGYW1pbHk6IGVsZW1lbnQuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogZWxlbWVudC5mb250U2l6ZVxuICB9KTtcbiAgbGV0IHRleHQgPSBlbGVtZW50LnRleHQ7XG4gIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQodGV4dCk7XG5cbiAgaWYgKG1ldHJpY3Mud2lkdGggPiBtYXhXaWR0aCkge1xuICAgIC8vIHdlIGl0ZXJhdGUgZnJvbSB0aGUgcmlnaHQsIHJlbW92aW5nIGNoYXJhY3RlcnMgb25lIGJ5IG9uZSBpbnN0ZWFkXG4gICAgLy8gb2YgYnVsZGluZyB0aGUgc3RyaW5nIHVwLiBUaGlzIGFzc3VtZXMgdGhhdCBpdCdzIG1vcmUgbGlrZWx5XG4gICAgLy8geW91ciBmcmFtZSBuYW1lcyB3aWxsIG92ZXJmbG93IGJ5IG5vdCB0aGF0IG1hbnkgY2hhcmFjdGVyc1xuICAgIC8vIChpZiBldmVyKSwgc28gaXQgc29odWxkIGJlIGZhc3RlciB0aGlzIHdheS5cbiAgICBmb3IgKGxldCBpID0gdGV4dC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5ld1RleHQgPSBgJHt0ZXh0LnNsaWNlKDAsIGkpfS4uLmA7XG5cbiAgICAgIGlmIChjdHgubWVhc3VyZVRleHQobmV3VGV4dCkud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgdGV4dCA9IG5ld1RleHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgdGV4dCxcbiAgICB3aWR0aDogbWF4V2lkdGhcbiAgfSk7XG59O1xuLyoqXG4gKiBXaGVuIGV4cG9ydGluZyBmcmFtZXMsIHdlIG5lZWQgdG8gcmVuZGVyIGZyYW1lIGxhYmVscyB3aGljaCBhcmUgY3VycmVudGx5XG4gKiBiZWluZyByZW5kZXJlZCBpbiBET00gd2hlbiBlZGl0aW5nLiBBZGRpbmcgdGhlIGxhYmVscyBhcyByZWd1bGFyIHRleHRcbiAqIGVsZW1lbnRzIHNlZW1zIGxpa2UgYSBzaW1wbGUgaGFjay4gSW4gdGhlIGZ1dHVyZSB3ZSdsbCB3YW50IHRvIG1vdmUgdG9cbiAqIHByb3BlciBjYW52YXMgcmVuZGVyaW5nLCBldmVuIHdpdGhpbiBlZGl0b3IgKGluc3RlYWQgb2YgRE9NKS5cbiAqL1xuXG5cbmNvbnN0IGFkZEZyYW1lTGFiZWxzQXNUZXh0RWxlbWVudHMgPSAoZWxlbWVudHMsIG9wdHMpID0+IHtcbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gIGxldCBmcmFtZUlkeCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKGlzRnJhbWVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBmcmFtZUlkeCsrO1xuICAgICAgbGV0IHRleHRFbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgICB4OiBlbGVtZW50LngsXG4gICAgICAgIHk6IGVsZW1lbnQueSAtIEZSQU1FX1NUWUxFLm5hbWVPZmZzZXRZLFxuICAgICAgICBmb250RmFtaWx5OiBGT05UX0ZBTUlMWS5Bc3Npc3RhbnQsXG4gICAgICAgIGZvbnRTaXplOiBGUkFNRV9TVFlMRS5uYW1lRm9udFNpemUsXG4gICAgICAgIGxpbmVIZWlnaHQ6IEZSQU1FX1NUWUxFLm5hbWVMaW5lSGVpZ2h0LFxuICAgICAgICBzdHJva2VDb2xvcjogb3B0cy5leHBvcnRXaXRoRGFya01vZGUgPyBGUkFNRV9TVFlMRS5uYW1lQ29sb3JEYXJrVGhlbWUgOiBGUkFNRV9TVFlMRS5uYW1lQ29sb3JMaWdodFRoZW1lLFxuICAgICAgICB0ZXh0OiBlbGVtZW50Lm5hbWUgfHwgYEZyYW1lICR7ZnJhbWVJZHh9YFxuICAgICAgfSk7XG4gICAgICB0ZXh0RWxlbWVudC55IC09IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIHRleHRFbGVtZW50ID0gdHJ1bmNhdGVUZXh0KHRleHRFbGVtZW50LCBlbGVtZW50LndpZHRoKTtcbiAgICAgIG5leHRFbGVtZW50cy5wdXNoKHRleHRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBuZXh0RWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0RWxlbWVudHM7XG59O1xuXG5jb25zdCBnZXRGcmFtZVJlbmRlcmluZ0NvbmZpZyA9IChleHBvcnRpbmdGcmFtZSwgZnJhbWVSZW5kZXJpbmcpID0+IHtcbiAgZnJhbWVSZW5kZXJpbmcgPSBmcmFtZVJlbmRlcmluZyB8fCBnZXREZWZhdWx0QXBwU3RhdGUoKS5mcmFtZVJlbmRlcmluZztcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiBleHBvcnRpbmdGcmFtZSA/IHRydWUgOiBmcmFtZVJlbmRlcmluZy5lbmFibGVkLFxuICAgIG91dGxpbmU6IGV4cG9ydGluZ0ZyYW1lID8gZmFsc2UgOiBmcmFtZVJlbmRlcmluZy5vdXRsaW5lLFxuICAgIG5hbWU6IGV4cG9ydGluZ0ZyYW1lID8gZmFsc2UgOiBmcmFtZVJlbmRlcmluZy5uYW1lLFxuICAgIGNsaXA6IGV4cG9ydGluZ0ZyYW1lID8gdHJ1ZSA6IGZyYW1lUmVuZGVyaW5nLmNsaXBcbiAgfTtcbn07XG5cbmNvbnN0IHByZXBhcmVFbGVtZW50c0ZvclJlbmRlciA9ICh7XG4gIGVsZW1lbnRzLFxuICBleHBvcnRpbmdGcmFtZSxcbiAgZnJhbWVSZW5kZXJpbmcsXG4gIGV4cG9ydFdpdGhEYXJrTW9kZVxufSkgPT4ge1xuICBsZXQgbmV4dEVsZW1lbnRzO1xuXG4gIGlmIChleHBvcnRpbmdGcmFtZSkge1xuICAgIG5leHRFbGVtZW50cyA9IGVsZW1lbnRzT3ZlcmxhcHBpbmdCQm94KHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgYm91bmRzOiBleHBvcnRpbmdGcmFtZSxcbiAgICAgIHR5cGU6IFwib3ZlcmxhcFwiXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoZnJhbWVSZW5kZXJpbmcuZW5hYmxlZCAmJiBmcmFtZVJlbmRlcmluZy5uYW1lKSB7XG4gICAgbmV4dEVsZW1lbnRzID0gYWRkRnJhbWVMYWJlbHNBc1RleHRFbGVtZW50cyhlbGVtZW50cywge1xuICAgICAgZXhwb3J0V2l0aERhcmtNb2RlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEVsZW1lbnRzID0gZWxlbWVudHM7XG4gIH1cblxuICByZXR1cm4gbmV4dEVsZW1lbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMsIHtcbiAgZXhwb3J0QmFja2dyb3VuZCxcbiAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIGV4cG9ydGluZ0ZyYW1lXG59LCBjcmVhdGVDYW52YXMgPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gIHJldHVybiB7XG4gICAgY2FudmFzLFxuICAgIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZVxuICB9O1xufSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gIHZhciBfYTtcblxuICBjb25zdCB0ZW1wU2NlbmUgPSBfX2NyZWF0ZVNjZW5lRm9yRWxlbWVudHNIYWNrX18oZWxlbWVudHMpO1xuXG4gIGVsZW1lbnRzID0gdGVtcFNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuICBjb25zdCBmcmFtZVJlbmRlcmluZyA9IGdldEZyYW1lUmVuZGVyaW5nQ29uZmlnKGV4cG9ydGluZ0ZyYW1lICE9PSBudWxsICYmIGV4cG9ydGluZ0ZyYW1lICE9PSB2b2lkIDAgPyBleHBvcnRpbmdGcmFtZSA6IG51bGwsIChfYSA9IGFwcFN0YXRlLmZyYW1lUmVuZGVyaW5nKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsKTtcbiAgY29uc3QgZWxlbWVudHNGb3JSZW5kZXIgPSBwcmVwYXJlRWxlbWVudHNGb3JSZW5kZXIoe1xuICAgIGVsZW1lbnRzLFxuICAgIGV4cG9ydGluZ0ZyYW1lLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIGZyYW1lUmVuZGVyaW5nXG4gIH0pO1xuXG4gIGlmIChleHBvcnRpbmdGcmFtZSkge1xuICAgIGV4cG9ydFBhZGRpbmcgPSAwO1xuICB9XG5cbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShleHBvcnRpbmdGcmFtZSA/IFtleHBvcnRpbmdGcmFtZV0gOiBnZXRSb290RWxlbWVudHMoZWxlbWVudHNGb3JSZW5kZXIpLCBleHBvcnRQYWRkaW5nKTtcbiAgY29uc3Qge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZSA9IDFcbiAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gIGNvbnN0IHtcbiAgICBpbWFnZUNhY2hlXG4gIH0gPSB5aWVsZCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzRm9yUmVuZGVyKS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgZmlsZXNcbiAgfSk7XG4gIHJlbmRlclN0YXRpY1NjZW5lKHtcbiAgICBjYW52YXMsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGVsZW1lbnRzOiBlbGVtZW50c0ZvclJlbmRlcixcbiAgICB2aXNpYmxlRWxlbWVudHM6IGVsZW1lbnRzRm9yUmVuZGVyLFxuICAgIHNjYWxlLFxuICAgIGFwcFN0YXRlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFwcFN0YXRlKSwge1xuICAgICAgZnJhbWVSZW5kZXJpbmcsXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yOiBleHBvcnRCYWNrZ3JvdW5kID8gdmlld0JhY2tncm91bmRDb2xvciA6IG51bGwsXG4gICAgICBzY3JvbGxYOiAtbWluWCArIGV4cG9ydFBhZGRpbmcsXG4gICAgICBzY3JvbGxZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgICB6b29tOiBkZWZhdWx0QXBwU3RhdGUuem9vbSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCJcbiAgICB9KSxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgdGVtcFNjZW5lLmRlc3Ryb3koKTtcbiAgcmV0dXJuIGNhbnZhcztcbn0pO1xuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMsIG9wdHMpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICB2YXIgX2IsIF9jLCBfZDtcblxuICBjb25zdCB0ZW1wU2NlbmUgPSBfX2NyZWF0ZVNjZW5lRm9yRWxlbWVudHNIYWNrX18oZWxlbWVudHMpO1xuXG4gIGVsZW1lbnRzID0gdGVtcFNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuICBjb25zdCBmcmFtZVJlbmRlcmluZyA9IGdldEZyYW1lUmVuZGVyaW5nQ29uZmlnKChfYiA9IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5leHBvcnRpbmdGcmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbCwgKF9jID0gYXBwU3RhdGUuZnJhbWVSZW5kZXJpbmcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG51bGwpO1xuICBsZXQge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSA9IGZhbHNlLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmVcbiAgfSA9IGFwcFN0YXRlO1xuICBjb25zdCB7XG4gICAgZXhwb3J0aW5nRnJhbWUgPSBudWxsXG4gIH0gPSBvcHRzIHx8IHt9O1xuICBjb25zdCBlbGVtZW50c0ZvclJlbmRlciA9IHByZXBhcmVFbGVtZW50c0ZvclJlbmRlcih7XG4gICAgZWxlbWVudHMsXG4gICAgZXhwb3J0aW5nRnJhbWUsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIGZyYW1lUmVuZGVyaW5nXG4gIH0pO1xuXG4gIGlmIChleHBvcnRpbmdGcmFtZSkge1xuICAgIGV4cG9ydFBhZGRpbmcgPSAwO1xuICB9XG5cbiAgbGV0IG1ldGFkYXRhID0gXCJcIjsgLy8gd2UgbmVlZCB0byBzZXJpYWxpemUgdGhlIFwib3JpZ2luYWxcIiBlbGVtZW50cyBiZWZvcmUgd2UgcHV0IHRoZW0gdGhyb3VnaFxuICAvLyB0aGUgdGVtcFNjZW5lIGhhY2sgd2hpY2ggZHVwbGljYXRlcyBhbmQgcmVnZW5lcmF0ZXMgaWRzXG5cbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSB5aWVsZCAoeWllbGQgaW1wb3J0KFxuICAgICAgLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovXG4gICAgICBcIi4uLy4uL3NyYy9kYXRhL2ltYWdlXCIpKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIC8vIHdoZW4gZW1iZWRkaW5nIHNjZW5lLCB3ZSB3YW50IHRvIGVtYmVkIHRoZSBvcmlnaW9uYWxseSBzdXBwbGllZFxuICAgICAgICAvLyBlbGVtZW50cyB3aGljaCBkb24ndCBjb250YWluIHRoZSB0ZW1wIGZyYW1lIGxhYmVscy5cbiAgICAgICAgLy8gQnV0IGl0IGFsc28gcmVxdWlyZXMgdGhhdCB0aGUgZXhwb3J0VG9TdmcgaXMgYmVpbmcgc3VwcGxpZWQgd2l0aFxuICAgICAgICAvLyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGV4cG9ydGluZywgYW5kIG5vIGV4dHJhLlxuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZXhwb3J0aW5nRnJhbWUgPyBbZXhwb3J0aW5nRnJhbWVdIDogZ2V0Um9vdEVsZW1lbnRzKGVsZW1lbnRzRm9yUmVuZGVyKSwgZXhwb3J0UGFkZGluZyk7IC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcblxuICBjb25zdCBzdmdSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmdcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aCAqIGV4cG9ydFNjYWxlfWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcblxuICBpZiAoZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7IC8vIEFzc2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBvbmx5IHdoZW4gdXNpbmcgcGFja2FnZVxuXG4gIGlmIChwcm9jZXNzLmVudi5WSVRFX0lTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPSB3aW5kb3cuRVhDQUxJRFJBV19BU1NFVF9QQVRIIHx8IGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlZJVEVfUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGggPT09IG51bGwgfHwgYXNzZXRQYXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhc3NldFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIGFzc2V0UGF0aCA9IGFzc2V0UGF0aC5yZXBsYWNlKFwiL1wiLCBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS9gKTtcbiAgICB9XG5cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuXG4gIGNvbnN0IG9mZnNldFggPSAtbWluWCArIGV4cG9ydFBhZGRpbmc7XG4gIGNvbnN0IG9mZnNldFkgPSAtbWluWSArIGV4cG9ydFBhZGRpbmc7XG4gIGNvbnN0IGZyYW1lRWxlbWVudHMgPSBnZXRGcmFtZUVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgbGV0IGV4cG9ydGluZ0ZyYW1lQ2xpcFBhdGggPSBcIlwiO1xuXG4gIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVFbGVtZW50cykge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZnJhbWUpO1xuICAgIGNvbnN0IGN4ID0gKHgyIC0geDEpIC8gMiAtIChmcmFtZS54IC0geDEpO1xuICAgIGNvbnN0IGN5ID0gKHkyIC0geTEpIC8gMiAtIChmcmFtZS55IC0geTEpO1xuICAgIGV4cG9ydGluZ0ZyYW1lQ2xpcFBhdGggKz0gYDxjbGlwUGF0aCBpZD0ke2ZyYW1lLmlkfT5cbiAgICAgICAgICAgIDxyZWN0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgke2ZyYW1lLnggKyBvZmZzZXRYfSAke2ZyYW1lLnkgKyBvZmZzZXRZfSkgcm90YXRlKCR7ZnJhbWUuYW5nbGV9ICR7Y3h9ICR7Y3l9KVwiXG4gICAgICAgICAgd2lkdGg9XCIke2ZyYW1lLndpZHRofVwiXG4gICAgICAgICAgaGVpZ2h0PVwiJHtmcmFtZS5oZWlnaHR9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9yZWN0PlxuICAgICAgICA8L2NsaXBQYXRoPmA7XG4gIH1cblxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJBc3Npc3RhbnRcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1Bc3Npc3RhbnQtUmVndWxhci53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgICR7ZXhwb3J0aW5nRnJhbWVDbGlwUGF0aH1cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHNGb3JSZW5kZXIsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICByZW5kZXJFbWJlZGRhYmxlczogKF9kID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLnJlbmRlckVtYmVkZGFibGVzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZSxcbiAgICBmcmFtZVJlbmRlcmluZ1xuICB9KTtcbiAgdGVtcFNjZW5lLmRlc3Ryb3koKTtcbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59KTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkgPT4ge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZGltZW5zaW9uID0+IE1hdGgudHJ1bmMoZGltZW5zaW9uICogc2NhbGUpKTtcbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
4523
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../packages/withinBounds */ \"../withinBounds.ts\");\n/* harmony import */ var _frame__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../frame */ \"../../frame.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Scene */ \"../../scene/Scene.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`; // getContainerElement and getBoundTextElement and potentially other helpers\n// depend on `Scene` which will not be available when these pure utils are\n// called outside initialized Excalidraw editor instance or even if called\n// from inside Excalidraw if the elements were never cached by Scene (e.g.\n// for library elements).\n//\n// As such, before passing the elements down, we need to initialize a custom\n// Scene instance and assign them to it.\n//\n// FIXME This is a super hacky workaround and we'll need to rewrite this soon.\n\nconst __createSceneForElementsHack__ = elements => {\n const scene = new _Scene__WEBPACK_IMPORTED_MODULE_12__[\"default\"](); // we can't duplicate elements to regenerate ids because we need the\n // orig ids when embedding. So we do another hack of not mapping element\n // ids to Scene instances so that we don't override the editor elements\n // mapping.\n // We still need to clone the objects themselves to regen references.\n\n scene.replaceAllElements((0,_utils__WEBPACK_IMPORTED_MODULE_3__.cloneJSON)(elements), false);\n return scene;\n};\n\nconst truncateText = (element, maxWidth) => {\n if (element.width <= maxWidth) {\n return element;\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n ctx.font = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getFontString)({\n fontFamily: element.fontFamily,\n fontSize: element.fontSize\n });\n let text = element.text;\n const metrics = ctx.measureText(text);\n\n if (metrics.width > maxWidth) {\n // we iterate from the right, removing characters one by one instead\n // of bulding the string up. This assumes that it's more likely\n // your frame names will overflow by not that many characters\n // (if ever), so it sohuld be faster this way.\n for (let i = text.length; i > 0; i--) {\n const newText = `${text.slice(0, i)}...`;\n\n if (ctx.measureText(newText).width <= maxWidth) {\n text = newText;\n break;\n }\n }\n }\n\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_11__.newElementWith)(element, {\n text,\n width: maxWidth\n });\n};\n/**\n * When exporting frames, we need to render frame labels which are currently\n * being rendered in DOM when editing. Adding the labels as regular text\n * elements seems like a simple hack. In the future we'll want to move to\n * proper canvas rendering, even within editor (instead of DOM).\n */\n\n\nconst addFrameLabelsAsTextElements = (elements, opts) => {\n const nextElements = [];\n let frameIdx = 0;\n\n for (const element of elements) {\n if ((0,_element__WEBPACK_IMPORTED_MODULE_10__.isFrameElement)(element)) {\n frameIdx++;\n let textElement = (0,_element__WEBPACK_IMPORTED_MODULE_10__.newTextElement)({\n x: element.x,\n y: element.y - _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameOffsetY,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_4__.FONT_FAMILY.Assistant,\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameFontSize,\n lineHeight: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameLineHeight,\n strokeColor: opts.exportWithDarkMode ? _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorDarkTheme : _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorLightTheme,\n text: element.name || `Frame ${frameIdx}`\n });\n textElement.y -= textElement.height;\n textElement = truncateText(textElement, element.width);\n nextElements.push(textElement);\n }\n\n nextElements.push(element);\n }\n\n return nextElements;\n};\n\nconst getFrameRenderingConfig = (exportingFrame, frameRendering) => {\n frameRendering = frameRendering || (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)().frameRendering;\n return {\n enabled: exportingFrame ? true : frameRendering.enabled,\n outline: exportingFrame ? false : frameRendering.outline,\n name: exportingFrame ? false : frameRendering.name,\n clip: exportingFrame ? true : frameRendering.clip\n };\n};\n\nconst prepareElementsForRender = ({\n elements,\n exportingFrame,\n frameRendering,\n exportWithDarkMode\n}) => {\n let nextElements;\n\n if (exportingFrame) {\n nextElements = (0,_packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__.elementsOverlappingBBox)({\n elements,\n bounds: exportingFrame,\n type: \"overlap\"\n });\n } else if (frameRendering.enabled && frameRendering.name) {\n nextElements = addFrameLabelsAsTextElements(elements, {\n exportWithDarkMode\n });\n } else {\n nextElements = elements;\n }\n\n return nextElements;\n};\n\nconst exportToCanvas = (elements, appState, files, {\n exportBackground,\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportingFrame\n}, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return {\n canvas,\n scale: appState.exportScale\n };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig(exportingFrame !== null && exportingFrame !== void 0 ? exportingFrame : null, (_a = appState.frameRendering) !== null && _a !== void 0 ? _a : null);\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode: appState.exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding);\n const {\n canvas,\n scale = 1\n } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const {\n imageCache\n } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elementsForRender).map(element => element.fileId),\n files\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderStaticScene)({\n canvas,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n elements: elementsForRender,\n visibleElements: elementsForRender,\n scale,\n appState: Object.assign(Object.assign({}, appState), {\n frameRendering,\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\"\n }),\n renderConfig: {\n imageCache,\n renderGrid: false,\n isExporting: true\n }\n });\n tempScene.destroy();\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _b, _c, _d;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig((_b = opts === null || opts === void 0 ? void 0 : opts.exportingFrame) !== null && _b !== void 0 ? _b : null, (_c = appState.frameRendering) !== null && _c !== void 0 ? _c : null);\n let {\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n exportWithDarkMode = false,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene\n } = appState;\n const {\n exportingFrame = null\n } = opts || {};\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n let metadata = \"\"; // we need to serialize the \"original\" elements before we put them through\n // the tempScene hack which duplicates and regenerates ids\n\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n // when embedding scene, we want to embed the origionally supplied\n // elements which don't contain the temp frame labels.\n // But it also requires that the exportToSvg is being supplied with\n // only the elements that we're exporting, and no extra.\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\")\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding); // initialize SVG root\n\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n\n if (exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\"; // Asset path needs to be determined only when using package\n\n if (true) {\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.3\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}`;\n\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n\n const offsetX = -minX + exportPadding;\n const offsetY = -minY + exportPadding;\n const frameElements = (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getFrameElements)(elements);\n let exportingFrameClipPath = \"\";\n\n for (const frame of frameElements) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(frame);\n const cx = (x2 - x1) / 2 - (frame.x - x1);\n const cy = (y2 - y1) / 2 - (frame.y - y1);\n exportingFrameClipPath += `<clipPath id=${frame.id}>\n <rect transform=\"translate(${frame.x + offsetX} ${frame.y + offsetY}) rotate(${frame.angle} ${cx} ${cy})\"\n width=\"${frame.width}\"\n height=\"${frame.height}\"\n >\n </rect>\n </clipPath>`;\n }\n\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n @font-face {\n font-family: \"Assistant\";\n src: url(\"${assetPath}Assistant-Regular.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `; // render background rect\n\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elementsForRender, rsvg, svgRoot, files || {}, {\n offsetX,\n offsetY,\n exportWithDarkMode,\n renderEmbeddables: (_d = opts === null || opts === void 0 ? void 0 : opts.renderEmbeddables) !== null && _d !== void 0 ? _d : false,\n frameRendering\n });\n tempScene.destroy();\n return svgRoot;\n}); // calculate smallest area to fit the contents in\n\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding * 2;\n return [minX, minY, width, height];\n};\n\nconst getExportSize = (elements, exportPadding, scale) => {\n const [,, width, height] = getCanvasSize(elements, exportPadding).map(dimension => Math.trunc(dimension * scale));\n return [width, height];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vc2NlbmUvZXhwb3J0LnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFc0M7QUFDd0M7QUFDQTtBQUNoQjtBQUN3QztBQUNyRDtBQUNGO0FBQ2tDO0FBQ2Q7QUFDTjtBQUNEO0FBQ0Y7QUFDOUI7QUFDNUIseURBQXlEO0FBQ3pEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQiwrQ0FBSyxJQUFJO0FBQzdCO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDJCQUEyQixpREFBUztBQUNwQztBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxhQUFhLHFEQUFhO0FBQzFCO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsOEJBQThCLE9BQU87QUFDckMseUJBQXlCLGlCQUFpQjs7QUFFMUM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFNBQVMsdUVBQWM7QUFDdkI7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBR0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsUUFBUSx5REFBYztBQUN0QjtBQUNBLHdCQUF3Qix5REFBYztBQUN0QztBQUNBLHVCQUF1QiwrREFBdUI7QUFDOUMsb0JBQW9CLDZEQUFxQjtBQUN6QyxrQkFBa0IsZ0VBQXdCO0FBQzFDLG9CQUFvQixrRUFBMEI7QUFDOUMsK0NBQStDLHNFQUE4QixHQUFHLHVFQUErQjtBQUMvRyx1Q0FBdUMsU0FBUztBQUNoRCxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0EscUNBQXFDLDZEQUFrQjtBQUN2RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBO0FBQ0EsbUJBQW1CLCtFQUF1QjtBQUMxQztBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7QUFDQSxLQUFLO0FBQ0wsSUFBSTtBQUNKO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQO0FBQ0Esa0JBQWtCLDhEQUFzQjtBQUN4QztBQUNBO0FBQ0EsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNEOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUEsd0ZBQXdGLHVEQUFlO0FBQ3ZHO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSiwwQkFBMEIsNkRBQWtCO0FBQzVDO0FBQ0E7QUFDQSxJQUFJLFFBQVEsZ0VBQWdCO0FBQzVCO0FBQ0EsYUFBYSwyRUFBMkI7QUFDeEM7QUFDQSxHQUFHO0FBQ0gsRUFBRSx3RUFBaUI7QUFDbkI7QUFDQSxRQUFRLGdFQUFZO0FBQ3BCO0FBQ0E7QUFDQTtBQUNBLDRDQUE0QztBQUM1QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDO0FBQ007QUFDUDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsOERBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBLHFCQUFxQjtBQUNyQjs7QUFFQTtBQUNBO0FBQ0EsOEJBQThCLHVJQUVEO0FBQzdCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYywyREFBZSxnQ0FBZ0M7QUFDN0QsT0FBTztBQUNQLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUEsd0ZBQXdGLHVEQUFlLHFDQUFxQzs7QUFFNUksMkNBQTJDLDhDQUFNO0FBQ2pEO0FBQ0EsZ0NBQWdDLDhDQUFNO0FBQ3RDLHlDQUF5QyxPQUFPLEVBQUUsT0FBTztBQUN6RCxtQ0FBbUMsb0JBQW9CO0FBQ3ZELG9DQUFvQyxxQkFBcUI7O0FBRXpEO0FBQ0EsbUNBQW1DLG9EQUFZO0FBQy9DOztBQUVBLDZDQUE2Qzs7QUFFN0MsTUFBTSxJQUEwQztBQUNoRCxxRUFBcUUsd0JBQXlCLENBQUMsR0FBRyxzcUNBQVcsYUFBYTs7QUFFMUg7QUFDQSw0Q0FBNEMsdUJBQXVCO0FBQ25FOztBQUVBLG1CQUFtQixVQUFVO0FBQzdCOztBQUVBO0FBQ0E7QUFDQSx3QkFBd0Isd0RBQWdCO0FBQ3hDOztBQUVBO0FBQ0EsNkJBQTZCLHlFQUF3QjtBQUNyRDtBQUNBO0FBQ0EsOENBQThDLFNBQVM7QUFDdkQseUNBQXlDLG1CQUFtQixFQUFFLGtCQUFrQixXQUFXLGFBQWEsRUFBRSxJQUFJLEVBQUUsR0FBRztBQUNuSCxtQkFBbUIsWUFBWTtBQUMvQixvQkFBb0IsYUFBYTtBQUNqQztBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLElBQUk7QUFDSixJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsVUFBVTtBQUM5QjtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLHVEQUF1RCw4Q0FBTTtBQUM3RDtBQUNBO0FBQ0Esa0NBQWtDLE1BQU07QUFDeEMsbUNBQW1DLE9BQU87QUFDMUM7QUFDQTtBQUNBOztBQUVBLGVBQWUsNkRBQVM7QUFDeEIsRUFBRSx1RUFBZ0IsOENBQThDO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBLENBQUMsR0FBRzs7QUFFSjtBQUNBLG1DQUFtQyxnRUFBZTtBQUNsRCxnQkFBZ0IsZ0RBQVE7QUFDeEIsaUJBQWlCLGdEQUFRO0FBQ3pCO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzP2MzNzMiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fYXdhaXRlciA9IHRoaXMgJiYgdGhpcy5fX2F3YWl0ZXIgfHwgZnVuY3Rpb24gKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikge1xuICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7XG4gICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7XG4gICAgICByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTtcbiAgICB9XG5cbiAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7XG4gIH0pO1xufTtcblxuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgZ2V0Q29tbW9uQm91bmRzLCBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lVG9TdmcsIHJlbmRlclN0YXRpY1NjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBjbG9uZUpTT04sIGRpc3RhbmNlLCBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBGT05UX0ZBTUlMWSwgRlJBTUVfU1RZTEUsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsIHVwZGF0ZUltYWdlQ2FjaGUgfSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuaW1wb3J0IHsgZWxlbWVudHNPdmVybGFwcGluZ0JCb3ggfSBmcm9tIFwiLi4vcGFja2FnZXMvd2l0aGluQm91bmRzXCI7XG5pbXBvcnQgeyBnZXRGcmFtZUVsZW1lbnRzLCBnZXRSb290RWxlbWVudHMgfSBmcm9tIFwiLi4vZnJhbWVcIjtcbmltcG9ydCB7IGlzRnJhbWVFbGVtZW50LCBuZXdUZXh0RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50XCI7XG5pbXBvcnQgeyBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi9TY2VuZVwiO1xuY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDsgLy8gZ2V0Q29udGFpbmVyRWxlbWVudCBhbmQgZ2V0Qm91bmRUZXh0RWxlbWVudCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgaGVscGVyc1xuLy8gZGVwZW5kIG9uIGBTY2VuZWAgd2hpY2ggd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlc2UgcHVyZSB1dGlscyBhcmVcbi8vIGNhbGxlZCBvdXRzaWRlIGluaXRpYWxpemVkIEV4Y2FsaWRyYXcgZWRpdG9yIGluc3RhbmNlIG9yIGV2ZW4gaWYgY2FsbGVkXG4vLyBmcm9tIGluc2lkZSBFeGNhbGlkcmF3IGlmIHRoZSBlbGVtZW50cyB3ZXJlIG5ldmVyIGNhY2hlZCBieSBTY2VuZSAoZS5nLlxuLy8gZm9yIGxpYnJhcnkgZWxlbWVudHMpLlxuLy9cbi8vIEFzIHN1Y2gsIGJlZm9yZSBwYXNzaW5nIHRoZSBlbGVtZW50cyBkb3duLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUgYSBjdXN0b21cbi8vIFNjZW5lIGluc3RhbmNlIGFuZCBhc3NpZ24gdGhlbSB0byBpdC5cbi8vXG4vLyBGSVhNRSBUaGlzIGlzIGEgc3VwZXIgaGFja3kgd29ya2Fyb3VuZCBhbmQgd2UnbGwgbmVlZCB0byByZXdyaXRlIHRoaXMgc29vbi5cblxuY29uc3QgX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fID0gZWxlbWVudHMgPT4ge1xuICBjb25zdCBzY2VuZSA9IG5ldyBTY2VuZSgpOyAvLyB3ZSBjYW4ndCBkdXBsaWNhdGUgZWxlbWVudHMgdG8gcmVnZW5lcmF0ZSBpZHMgYmVjYXVzZSB3ZSBuZWVkIHRoZVxuICAvLyBvcmlnIGlkcyB3aGVuIGVtYmVkZGluZy4gU28gd2UgZG8gYW5vdGhlciBoYWNrIG9mIG5vdCBtYXBwaW5nIGVsZW1lbnRcbiAgLy8gaWRzIHRvIFNjZW5lIGluc3RhbmNlcyBzbyB0aGF0IHdlIGRvbid0IG92ZXJyaWRlIHRoZSBlZGl0b3IgZWxlbWVudHNcbiAgLy8gbWFwcGluZy5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBjbG9uZSB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzIHRvIHJlZ2VuIHJlZmVyZW5jZXMuXG5cbiAgc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGNsb25lSlNPTihlbGVtZW50cyksIGZhbHNlKTtcbiAgcmV0dXJuIHNjZW5lO1xufTtcblxuY29uc3QgdHJ1bmNhdGVUZXh0ID0gKGVsZW1lbnQsIG1heFdpZHRoKSA9PiB7XG4gIGlmIChlbGVtZW50LndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBjdHguZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgIGZvbnRGYW1pbHk6IGVsZW1lbnQuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogZWxlbWVudC5mb250U2l6ZVxuICB9KTtcbiAgbGV0IHRleHQgPSBlbGVtZW50LnRleHQ7XG4gIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQodGV4dCk7XG5cbiAgaWYgKG1ldHJpY3Mud2lkdGggPiBtYXhXaWR0aCkge1xuICAgIC8vIHdlIGl0ZXJhdGUgZnJvbSB0aGUgcmlnaHQsIHJlbW92aW5nIGNoYXJhY3RlcnMgb25lIGJ5IG9uZSBpbnN0ZWFkXG4gICAgLy8gb2YgYnVsZGluZyB0aGUgc3RyaW5nIHVwLiBUaGlzIGFzc3VtZXMgdGhhdCBpdCdzIG1vcmUgbGlrZWx5XG4gICAgLy8geW91ciBmcmFtZSBuYW1lcyB3aWxsIG92ZXJmbG93IGJ5IG5vdCB0aGF0IG1hbnkgY2hhcmFjdGVyc1xuICAgIC8vIChpZiBldmVyKSwgc28gaXQgc29odWxkIGJlIGZhc3RlciB0aGlzIHdheS5cbiAgICBmb3IgKGxldCBpID0gdGV4dC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5ld1RleHQgPSBgJHt0ZXh0LnNsaWNlKDAsIGkpfS4uLmA7XG5cbiAgICAgIGlmIChjdHgubWVhc3VyZVRleHQobmV3VGV4dCkud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgdGV4dCA9IG5ld1RleHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgdGV4dCxcbiAgICB3aWR0aDogbWF4V2lkdGhcbiAgfSk7XG59O1xuLyoqXG4gKiBXaGVuIGV4cG9ydGluZyBmcmFtZXMsIHdlIG5lZWQgdG8gcmVuZGVyIGZyYW1lIGxhYmVscyB3aGljaCBhcmUgY3VycmVudGx5XG4gKiBiZWluZyByZW5kZXJlZCBpbiBET00gd2hlbiBlZGl0aW5nLiBBZGRpbmcgdGhlIGxhYmVscyBhcyByZWd1bGFyIHRleHRcbiAqIGVsZW1lbnRzIHNlZW1zIGxpa2UgYSBzaW1wbGUgaGFjay4gSW4gdGhlIGZ1dHVyZSB3ZSdsbCB3YW50IHRvIG1vdmUgdG9cbiAqIHByb3BlciBjYW52YXMgcmVuZGVyaW5nLCBldmVuIHdpdGhpbiBlZGl0b3IgKGluc3RlYWQgb2YgRE9NKS5cbiAqL1xuXG5cbmNvbnN0IGFkZEZyYW1lTGFiZWxzQXNUZXh0RWxlbWVudHMgPSAoZWxlbWVudHMsIG9wdHMpID0+IHtcbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gIGxldCBmcmFtZUlkeCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKGlzRnJhbWVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBmcmFtZUlkeCsrO1xuICAgICAgbGV0IHRleHRFbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgICAgICB4OiBlbGVtZW50LngsXG4gICAgICAgIHk6IGVsZW1lbnQueSAtIEZSQU1FX1NUWUxFLm5hbWVPZmZzZXRZLFxuICAgICAgICBmb250RmFtaWx5OiBGT05UX0ZBTUlMWS5Bc3Npc3RhbnQsXG4gICAgICAgIGZvbnRTaXplOiBGUkFNRV9TVFlMRS5uYW1lRm9udFNpemUsXG4gICAgICAgIGxpbmVIZWlnaHQ6IEZSQU1FX1NUWUxFLm5hbWVMaW5lSGVpZ2h0LFxuICAgICAgICBzdHJva2VDb2xvcjogb3B0cy5leHBvcnRXaXRoRGFya01vZGUgPyBGUkFNRV9TVFlMRS5uYW1lQ29sb3JEYXJrVGhlbWUgOiBGUkFNRV9TVFlMRS5uYW1lQ29sb3JMaWdodFRoZW1lLFxuICAgICAgICB0ZXh0OiBlbGVtZW50Lm5hbWUgfHwgYEZyYW1lICR7ZnJhbWVJZHh9YFxuICAgICAgfSk7XG4gICAgICB0ZXh0RWxlbWVudC55IC09IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIHRleHRFbGVtZW50ID0gdHJ1bmNhdGVUZXh0KHRleHRFbGVtZW50LCBlbGVtZW50LndpZHRoKTtcbiAgICAgIG5leHRFbGVtZW50cy5wdXNoKHRleHRFbGVtZW50KTtcbiAgICB9XG5cbiAgICBuZXh0RWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgfVxuXG4gIHJldHVybiBuZXh0RWxlbWVudHM7XG59O1xuXG5jb25zdCBnZXRGcmFtZVJlbmRlcmluZ0NvbmZpZyA9IChleHBvcnRpbmdGcmFtZSwgZnJhbWVSZW5kZXJpbmcpID0+IHtcbiAgZnJhbWVSZW5kZXJpbmcgPSBmcmFtZVJlbmRlcmluZyB8fCBnZXREZWZhdWx0QXBwU3RhdGUoKS5mcmFtZVJlbmRlcmluZztcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiBleHBvcnRpbmdGcmFtZSA/IHRydWUgOiBmcmFtZVJlbmRlcmluZy5lbmFibGVkLFxuICAgIG91dGxpbmU6IGV4cG9ydGluZ0ZyYW1lID8gZmFsc2UgOiBmcmFtZVJlbmRlcmluZy5vdXRsaW5lLFxuICAgIG5hbWU6IGV4cG9ydGluZ0ZyYW1lID8gZmFsc2UgOiBmcmFtZVJlbmRlcmluZy5uYW1lLFxuICAgIGNsaXA6IGV4cG9ydGluZ0ZyYW1lID8gdHJ1ZSA6IGZyYW1lUmVuZGVyaW5nLmNsaXBcbiAgfTtcbn07XG5cbmNvbnN0IHByZXBhcmVFbGVtZW50c0ZvclJlbmRlciA9ICh7XG4gIGVsZW1lbnRzLFxuICBleHBvcnRpbmdGcmFtZSxcbiAgZnJhbWVSZW5kZXJpbmcsXG4gIGV4cG9ydFdpdGhEYXJrTW9kZVxufSkgPT4ge1xuICBsZXQgbmV4dEVsZW1lbnRzO1xuXG4gIGlmIChleHBvcnRpbmdGcmFtZSkge1xuICAgIG5leHRFbGVtZW50cyA9IGVsZW1lbnRzT3ZlcmxhcHBpbmdCQm94KHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgYm91bmRzOiBleHBvcnRpbmdGcmFtZSxcbiAgICAgIHR5cGU6IFwib3ZlcmxhcFwiXG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoZnJhbWVSZW5kZXJpbmcuZW5hYmxlZCAmJiBmcmFtZVJlbmRlcmluZy5uYW1lKSB7XG4gICAgbmV4dEVsZW1lbnRzID0gYWRkRnJhbWVMYWJlbHNBc1RleHRFbGVtZW50cyhlbGVtZW50cywge1xuICAgICAgZXhwb3J0V2l0aERhcmtNb2RlXG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEVsZW1lbnRzID0gZWxlbWVudHM7XG4gIH1cblxuICByZXR1cm4gbmV4dEVsZW1lbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMsIHtcbiAgZXhwb3J0QmFja2dyb3VuZCxcbiAgZXhwb3J0UGFkZGluZyA9IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsXG4gIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIGV4cG9ydGluZ0ZyYW1lXG59LCBjcmVhdGVDYW52YXMgPSAod2lkdGgsIGhlaWdodCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0ICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gIHJldHVybiB7XG4gICAgY2FudmFzLFxuICAgIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZVxuICB9O1xufSkgPT4gX19hd2FpdGVyKHZvaWQgMCwgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gIHZhciBfYTtcblxuICBjb25zdCB0ZW1wU2NlbmUgPSBfX2NyZWF0ZVNjZW5lRm9yRWxlbWVudHNIYWNrX18oZWxlbWVudHMpO1xuXG4gIGVsZW1lbnRzID0gdGVtcFNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuICBjb25zdCBmcmFtZVJlbmRlcmluZyA9IGdldEZyYW1lUmVuZGVyaW5nQ29uZmlnKGV4cG9ydGluZ0ZyYW1lICE9PSBudWxsICYmIGV4cG9ydGluZ0ZyYW1lICE9PSB2b2lkIDAgPyBleHBvcnRpbmdGcmFtZSA6IG51bGwsIChfYSA9IGFwcFN0YXRlLmZyYW1lUmVuZGVyaW5nKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsKTtcbiAgY29uc3QgZWxlbWVudHNGb3JSZW5kZXIgPSBwcmVwYXJlRWxlbWVudHNGb3JSZW5kZXIoe1xuICAgIGVsZW1lbnRzLFxuICAgIGV4cG9ydGluZ0ZyYW1lLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIGZyYW1lUmVuZGVyaW5nXG4gIH0pO1xuXG4gIGlmIChleHBvcnRpbmdGcmFtZSkge1xuICAgIGV4cG9ydFBhZGRpbmcgPSAwO1xuICB9XG5cbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShleHBvcnRpbmdGcmFtZSA/IFtleHBvcnRpbmdGcmFtZV0gOiBnZXRSb290RWxlbWVudHMoZWxlbWVudHNGb3JSZW5kZXIpLCBleHBvcnRQYWRkaW5nKTtcbiAgY29uc3Qge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZSA9IDFcbiAgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgZGVmYXVsdEFwcFN0YXRlID0gZ2V0RGVmYXVsdEFwcFN0YXRlKCk7XG4gIGNvbnN0IHtcbiAgICBpbWFnZUNhY2hlXG4gIH0gPSB5aWVsZCB1cGRhdGVJbWFnZUNhY2hlKHtcbiAgICBpbWFnZUNhY2hlOiBuZXcgTWFwKCksXG4gICAgZmlsZUlkczogZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzKGVsZW1lbnRzRm9yUmVuZGVyKS5tYXAoZWxlbWVudCA9PiBlbGVtZW50LmZpbGVJZCksXG4gICAgZmlsZXNcbiAgfSk7XG4gIHJlbmRlclN0YXRpY1NjZW5lKHtcbiAgICBjYW52YXMsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGVsZW1lbnRzOiBlbGVtZW50c0ZvclJlbmRlcixcbiAgICB2aXNpYmxlRWxlbWVudHM6IGVsZW1lbnRzRm9yUmVuZGVyLFxuICAgIHNjYWxlLFxuICAgIGFwcFN0YXRlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGFwcFN0YXRlKSwge1xuICAgICAgZnJhbWVSZW5kZXJpbmcsXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yOiBleHBvcnRCYWNrZ3JvdW5kID8gdmlld0JhY2tncm91bmRDb2xvciA6IG51bGwsXG4gICAgICBzY3JvbGxYOiAtbWluWCArIGV4cG9ydFBhZGRpbmcsXG4gICAgICBzY3JvbGxZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgICB6b29tOiBkZWZhdWx0QXBwU3RhdGUuem9vbSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCJcbiAgICB9KSxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlXG4gICAgfVxuICB9KTtcbiAgdGVtcFNjZW5lLmRlc3Ryb3koKTtcbiAgcmV0dXJuIGNhbnZhcztcbn0pO1xuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMsIG9wdHMpID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICB2YXIgX2IsIF9jLCBfZDtcblxuICBjb25zdCB0ZW1wU2NlbmUgPSBfX2NyZWF0ZVNjZW5lRm9yRWxlbWVudHNIYWNrX18oZWxlbWVudHMpO1xuXG4gIGVsZW1lbnRzID0gdGVtcFNjZW5lLmdldE5vbkRlbGV0ZWRFbGVtZW50cygpO1xuICBjb25zdCBmcmFtZVJlbmRlcmluZyA9IGdldEZyYW1lUmVuZGVyaW5nQ29uZmlnKChfYiA9IG9wdHMgPT09IG51bGwgfHwgb3B0cyA9PT0gdm9pZCAwID8gdm9pZCAwIDogb3B0cy5leHBvcnRpbmdGcmFtZSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogbnVsbCwgKF9jID0gYXBwU3RhdGUuZnJhbWVSZW5kZXJpbmcpICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IG51bGwpO1xuICBsZXQge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSA9IGZhbHNlLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmVcbiAgfSA9IGFwcFN0YXRlO1xuICBjb25zdCB7XG4gICAgZXhwb3J0aW5nRnJhbWUgPSBudWxsXG4gIH0gPSBvcHRzIHx8IHt9O1xuICBjb25zdCBlbGVtZW50c0ZvclJlbmRlciA9IHByZXBhcmVFbGVtZW50c0ZvclJlbmRlcih7XG4gICAgZWxlbWVudHMsXG4gICAgZXhwb3J0aW5nRnJhbWUsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIGZyYW1lUmVuZGVyaW5nXG4gIH0pO1xuXG4gIGlmIChleHBvcnRpbmdGcmFtZSkge1xuICAgIGV4cG9ydFBhZGRpbmcgPSAwO1xuICB9XG5cbiAgbGV0IG1ldGFkYXRhID0gXCJcIjsgLy8gd2UgbmVlZCB0byBzZXJpYWxpemUgdGhlIFwib3JpZ2luYWxcIiBlbGVtZW50cyBiZWZvcmUgd2UgcHV0IHRoZW0gdGhyb3VnaFxuICAvLyB0aGUgdGVtcFNjZW5lIGhhY2sgd2hpY2ggZHVwbGljYXRlcyBhbmQgcmVnZW5lcmF0ZXMgaWRzXG5cbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSB5aWVsZCAoeWllbGQgaW1wb3J0KFxuICAgICAgLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovXG4gICAgICBcIi4uLy4uL3NyYy9kYXRhL2ltYWdlXCIpKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIC8vIHdoZW4gZW1iZWRkaW5nIHNjZW5lLCB3ZSB3YW50IHRvIGVtYmVkIHRoZSBvcmlnaW9uYWxseSBzdXBwbGllZFxuICAgICAgICAvLyBlbGVtZW50cyB3aGljaCBkb24ndCBjb250YWluIHRoZSB0ZW1wIGZyYW1lIGxhYmVscy5cbiAgICAgICAgLy8gQnV0IGl0IGFsc28gcmVxdWlyZXMgdGhhdCB0aGUgZXhwb3J0VG9TdmcgaXMgYmVpbmcgc3VwcGxpZWQgd2l0aFxuICAgICAgICAvLyBvbmx5IHRoZSBlbGVtZW50cyB0aGF0IHdlJ3JlIGV4cG9ydGluZywgYW5kIG5vIGV4dHJhLlxuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZXhwb3J0aW5nRnJhbWUgPyBbZXhwb3J0aW5nRnJhbWVdIDogZ2V0Um9vdEVsZW1lbnRzKGVsZW1lbnRzRm9yUmVuZGVyKSwgZXhwb3J0UGFkZGluZyk7IC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcblxuICBjb25zdCBzdmdSb290ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJzdmdcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmVyc2lvblwiLCBcIjEuMVwiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ4bWxuc1wiLCBTVkdfTlMpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZpZXdCb3hcIiwgYDAgMCAke3dpZHRofSAke2hlaWdodH1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aCAqIGV4cG9ydFNjYWxlfWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHQgKiBleHBvcnRTY2FsZX1gKTtcblxuICBpZiAoZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7IC8vIEFzc2V0IHBhdGggbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBvbmx5IHdoZW4gdXNpbmcgcGFja2FnZVxuXG4gIGlmIChwcm9jZXNzLmVudi5WSVRFX0lTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPSB3aW5kb3cuRVhDQUxJRFJBV19BU1NFVF9QQVRIIHx8IGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlZJVEVfUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGggPT09IG51bGwgfHwgYXNzZXRQYXRoID09PSB2b2lkIDAgPyB2b2lkIDAgOiBhc3NldFBhdGguc3RhcnRzV2l0aChcIi9cIikpIHtcbiAgICAgIGFzc2V0UGF0aCA9IGFzc2V0UGF0aC5yZXBsYWNlKFwiL1wiLCBgJHt3aW5kb3cubG9jYXRpb24ub3JpZ2lufS9gKTtcbiAgICB9XG5cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuXG4gIGNvbnN0IG9mZnNldFggPSAtbWluWCArIGV4cG9ydFBhZGRpbmc7XG4gIGNvbnN0IG9mZnNldFkgPSAtbWluWSArIGV4cG9ydFBhZGRpbmc7XG4gIGNvbnN0IGZyYW1lRWxlbWVudHMgPSBnZXRGcmFtZUVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgbGV0IGV4cG9ydGluZ0ZyYW1lQ2xpcFBhdGggPSBcIlwiO1xuXG4gIGZvciAoY29uc3QgZnJhbWUgb2YgZnJhbWVFbGVtZW50cykge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZnJhbWUpO1xuICAgIGNvbnN0IGN4ID0gKHgyIC0geDEpIC8gMiAtIChmcmFtZS54IC0geDEpO1xuICAgIGNvbnN0IGN5ID0gKHkyIC0geTEpIC8gMiAtIChmcmFtZS55IC0geTEpO1xuICAgIGV4cG9ydGluZ0ZyYW1lQ2xpcFBhdGggKz0gYDxjbGlwUGF0aCBpZD0ke2ZyYW1lLmlkfT5cbiAgICAgICAgICAgIDxyZWN0IHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgke2ZyYW1lLnggKyBvZmZzZXRYfSAke2ZyYW1lLnkgKyBvZmZzZXRZfSkgcm90YXRlKCR7ZnJhbWUuYW5nbGV9ICR7Y3h9ICR7Y3l9KVwiXG4gICAgICAgICAgd2lkdGg9XCIke2ZyYW1lLndpZHRofVwiXG4gICAgICAgICAgaGVpZ2h0PVwiJHtmcmFtZS5oZWlnaHR9XCJcbiAgICAgICAgICA+XG4gICAgICAgICAgPC9yZWN0PlxuICAgICAgICA8L2NsaXBQYXRoPmA7XG4gIH1cblxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJBc3Npc3RhbnRcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1Bc3Npc3RhbnQtUmVndWxhci53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgICR7ZXhwb3J0aW5nRnJhbWVDbGlwUGF0aH1cbiAgPC9kZWZzPlxuICBgOyAvLyByZW5kZXIgYmFja2dyb3VuZCByZWN0XG5cbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHNGb3JSZW5kZXIsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WCxcbiAgICBvZmZzZXRZLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICByZW5kZXJFbWJlZGRhYmxlczogKF9kID0gb3B0cyA9PT0gbnVsbCB8fCBvcHRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRzLnJlbmRlckVtYmVkZGFibGVzKSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiBmYWxzZSxcbiAgICBmcmFtZVJlbmRlcmluZ1xuICB9KTtcbiAgdGVtcFNjZW5lLmRlc3Ryb3koKTtcbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59KTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkgPT4ge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZGltZW5zaW9uID0+IE1hdGgudHJ1bmMoZGltZW5zaW9uICogc2NhbGUpKTtcbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
4524
4524
 
4525
4525
  /***/ }),
4526
4526
 
@@ -5444,7 +5444,7 @@ module.exports = __WEBPACK_EXTERNAL_MODULE_react_jsx_runtime__;
5444
5444
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5445
5445
 
5446
5446
  "use strict";
5447
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _extends)\n/* harmony export */ });\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlO0FBQ2Y7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/MDYyYiJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/@babel/runtime/helpers/esm/extends.js\n");
5447
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (/* binding */ _extends)\n/* harmony export */ });\nfunction _extends() {\n _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n };\n return _extends.apply(this, arguments);\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFlO0FBQ2Y7QUFDQSxvQkFBb0Isc0JBQXNCO0FBQzFDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BiYWJlbC9ydW50aW1lL2hlbHBlcnMvZXNtL2V4dGVuZHMuanM/YzNmNCJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBfZXh0ZW5kcygpIHtcbiAgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduID8gT2JqZWN0LmFzc2lnbi5iaW5kKCkgOiBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07XG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0O1xuICB9O1xuICByZXR1cm4gX2V4dGVuZHMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn0iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/@babel/runtime/helpers/esm/extends.js\n");
5448
5448
 
5449
5449
  /***/ }),
5450
5450
 
@@ -5455,7 +5455,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5455
5455
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5456
5456
 
5457
5457
  "use strict";
5458
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"arrow\": () => (/* binding */ arrow),\n/* harmony export */ \"autoPlacement\": () => (/* binding */ autoPlacement),\n/* harmony export */ \"computePosition\": () => (/* binding */ computePosition),\n/* harmony export */ \"detectOverflow\": () => (/* binding */ detectOverflow),\n/* harmony export */ \"flip\": () => (/* binding */ flip),\n/* harmony export */ \"hide\": () => (/* binding */ hide),\n/* harmony export */ \"inline\": () => (/* binding */ inline),\n/* harmony export */ \"limitShift\": () => (/* binding */ limitShift),\n/* harmony export */ \"offset\": () => (/* binding */ offset),\n/* harmony export */ \"rectToClientRect\": () => (/* binding */ rectToClientRect),\n/* harmony export */ \"shift\": () => (/* binding */ shift),\n/* harmony export */ \"size\": () => (/* binding */ size)\n/* harmony export */ });\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\n\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'x' : 'y';\n}\n\nfunction getLengthFromAxis(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n const commonAlign = reference[length] / 2 - floating[length] / 2;\n const side = getSide(placement);\n const isVertical = mainAxis === 'x';\n let coords;\n\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n\n switch (getAlignment(placement)) {\n case 'start':\n coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n\n case 'end':\n coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain positioning strategy.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\n\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n\n {\n if (platform == null) {\n console.error(['Floating UI: `platform` property was not passed to config. If you', 'want to use Floating UI on the web, install @floating-ui/dom', 'instead of the /core package. Otherwise, you can create your own', '`platform`: https://floating-ui.com/docs/platform'].join(' '));\n }\n\n if (middleware.filter(_ref => {\n let {\n name\n } = _ref;\n return name === 'autoPlacement' || name === 'flip';\n }).length > 1) {\n throw new Error(['Floating UI: duplicate `flip` and/or `autoPlacement`', 'middleware detected. This will lead to an infinite loop. Ensure only', 'one of either has been passed to the `middleware` array.'].join(' '));\n }\n }\n\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n\n for (let i = 0; i < middleware.length; i++) {\n const {\n name,\n fn\n } = middleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = { ...middlewareData,\n [name]: { ...middlewareData[name],\n ...data\n }\n };\n\n {\n if (resetCount > 50) {\n console.warn(['Floating UI: The middleware lifecycle appears to be running in an', 'infinite loop. This is usually caused by a `reset` continually', 'being returned without a break condition.'].join(' '));\n }\n }\n\n if (reset && resetCount <= 50) {\n resetCount++;\n\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n\n i = -1;\n continue;\n }\n }\n\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\n\nfunction getSideObjectFromPadding(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\n\nfunction rectToClientRect(rect) {\n return { ...rect,\n top: rect.y,\n left: rect.x,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(middlewareArguments, options) {\n var _await$platform$isEle;\n\n if (options === void 0) {\n options = {};\n }\n\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = middlewareArguments;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = options;\n const paddingObject = getSideObjectFromPadding(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: elementContext === 'floating' ? { ...rects.floating,\n x,\n y\n } : rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects[elementContext]);\n return {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n}\n\nconst min = Math.min;\nconst max = Math.max;\n\nfunction within(min$1, value, max$1) {\n return max(min$1, min(value, max$1));\n}\n\n/**\n * Positions an inner element of the floating element such that it is centered\n * to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n\n async fn(middlewareArguments) {\n // Since `element` is required, we don't Partial<> the type\n const {\n element,\n padding = 0\n } = options != null ? options : {};\n const {\n x,\n y,\n placement,\n rects,\n platform\n } = middlewareArguments;\n\n if (element == null) {\n {\n console.warn('Floating UI: No `element` was passed to the `arrow` middleware.');\n }\n\n return {};\n }\n\n const paddingObject = getSideObjectFromPadding(padding);\n const coords = {\n x,\n y\n };\n const axis = getMainAxisFromPlacement(placement);\n const alignment = getAlignment(placement);\n const length = getLengthFromAxis(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const minProp = axis === 'y' ? 'top' : 'left';\n const maxProp = axis === 'y' ? 'bottom' : 'right';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n\n if (clientSize === 0) {\n clientSize = rects.floating[length];\n }\n\n const centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds\n\n const min = paddingObject[minProp];\n const max = clientSize - arrowDimensions[length] - paddingObject[maxProp];\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = within(min, center, max); // Make sure that arrow points at the reference\n\n const alignmentPadding = alignment === 'start' ? paddingObject[minProp] : paddingObject[maxProp];\n const shouldAddOffset = alignmentPadding > 0 && center !== offset && rects.reference[length] <= rects.floating[length];\n const alignmentOffset = shouldAddOffset ? center < min ? min - center : max - center : 0;\n return {\n [axis]: coords[axis] - alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset\n }\n };\n }\n\n});\n\nconst hash$1 = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, matched => hash$1[matched]);\n}\n\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n\n const alignment = getAlignment(placement);\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n let mainAlignmentSide = mainAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n\n return {\n main: mainAlignmentSide,\n cross: getOppositePlacement(mainAlignmentSide)\n };\n}\n\nconst hash = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, matched => hash[matched]);\n}\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst allPlacements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-start\", side + \"-end\"), []);\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n\n return true;\n });\n}\n\n/**\n * Automatically chooses the `placement` which has the most space available.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'autoPlacement',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$autoP, _middlewareData$autoP2, _middlewareData$autoP3, _middlewareData$autoP4, _placementsSortedByLe;\n\n const {\n x,\n y,\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = middlewareArguments;\n const {\n alignment = null,\n allowedPlacements = allPlacements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = options;\n const placements = getPlacementList(alignment, autoAlignment, allowedPlacements);\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const currentIndex = (_middlewareData$autoP = (_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.index) != null ? _middlewareData$autoP : 0;\n const currentPlacement = placements[currentIndex];\n\n if (currentPlacement == null) {\n return {};\n }\n\n const {\n main,\n cross\n } = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))); // Make `computeCoords` start from the right place\n\n if (placement !== currentPlacement) {\n return {\n x,\n y,\n reset: {\n placement: placements[0]\n }\n };\n }\n\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[main], overflow[cross]];\n const allOverflows = [...((_middlewareData$autoP3 = (_middlewareData$autoP4 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP4.overflows) != null ? _middlewareData$autoP3 : []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements[currentIndex + 1]; // There are more placements to check\n\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n const placementsSortedByLeastOverflow = allOverflows.slice().sort((a, b) => a.overflows[0] - b.overflows[0]);\n const placementThatFitsOnAllSides = (_placementsSortedByLe = placementsSortedByLeastOverflow.find(_ref => {\n let {\n overflows\n } = _ref;\n return overflows.every(overflow => overflow <= 0);\n })) == null ? void 0 : _placementsSortedByLe.placement;\n const resetPlacement = placementThatFitsOnAllSides != null ? placementThatFitsOnAllSides : placementsSortedByLeastOverflow[0].placement;\n\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\n\n/**\n * Changes the placement of the floating element to one that will fit if the\n * initially specified `placement` does not.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'flip',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$flip;\n\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n flipAlignment = true,\n ...detectOverflowOptions\n } = options;\n const side = getSide(placement);\n const isBasePlacement = side === initialPlacement;\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n\n if (checkCrossAxis) {\n const {\n main,\n cross\n } = getAlignmentSides(placement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n overflows.push(overflow[main], overflow[cross]);\n }\n\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }]; // One or more sides is overflowing\n\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip$, _middlewareData$flip2;\n\n const nextIndex = ((_middlewareData$flip$ = (_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) != null ? _middlewareData$flip$ : 0) + 1;\n const nextPlacement = placements[nextIndex];\n\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n let resetPlacement = 'bottom';\n\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$map$so;\n\n const placement = (_overflowsData$map$so = overflowsData.map(d => [d, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$map$so[0].placement;\n\n if (placement) {\n resetPlacement = placement;\n }\n\n break;\n }\n\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n\n return {};\n }\n\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (_temp) {\n let {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = _temp === void 0 ? {} : _temp;\n return {\n name: 'hide',\n\n async fn(middlewareArguments) {\n const {\n rects\n } = middlewareArguments;\n\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n case 'escaped':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n default:\n {\n return {};\n }\n }\n }\n\n };\n};\n\nasync function convertValueToCoords(middlewareArguments, value) {\n const {\n placement,\n platform,\n elements\n } = middlewareArguments;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getMainAxisFromPlacement(placement) === 'x';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = typeof value === 'function' ? value(middlewareArguments) : value; // eslint-disable-next-line prefer-const\n\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n/**\n * Displaces the floating element from its reference element.\n * @see https://floating-ui.com/docs/offset\n */\n\nconst offset = function (value) {\n if (value === void 0) {\n value = 0;\n }\n\n return {\n name: 'offset',\n options: value,\n\n async fn(middlewareArguments) {\n const {\n x,\n y\n } = middlewareArguments;\n const diffCoords = await convertValueToCoords(middlewareArguments, value);\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: diffCoords\n };\n }\n\n };\n};\n\nfunction getCrossAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\n/**\n * Shifts the floating element in order to keep it in view when it will overflow\n * a clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'shift',\n options,\n\n async fn(middlewareArguments) {\n const {\n x,\n y,\n placement\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = options;\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const mainAxis = getMainAxisFromPlacement(getSide(placement));\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = within(min, mainAxisCoord, max);\n }\n\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = within(min, crossAxisCoord, max);\n }\n\n const limitedCoords = limiter.fn({ ...middlewareArguments,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return { ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n\n };\n};\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n options,\n\n fn(middlewareArguments) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = middlewareArguments;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = options;\n const coords = {\n x,\n y\n };\n const mainAxis = getMainAxisFromPlacement(placement);\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = typeof offset === 'function' ? offset({ ...rects,\n placement\n }) : offset;\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2, _middlewareData$offse3, _middlewareData$offse4;\n\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? (_middlewareData$offse = (_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) != null ? _middlewareData$offse : 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : (_middlewareData$offse3 = (_middlewareData$offse4 = middlewareData.offset) == null ? void 0 : _middlewareData$offse4[crossAxis]) != null ? _middlewareData$offse3 : 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n\n };\n};\n\n/**\n * Provides data to change the size of the floating element. For instance,\n * prevent it from overflowing its clipping boundary or match the width of the\n * reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'size',\n options,\n\n async fn(middlewareArguments) {\n const {\n placement,\n rects,\n platform,\n elements\n } = middlewareArguments;\n const {\n apply,\n ...detectOverflowOptions\n } = options;\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n let heightSide;\n let widthSide;\n\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n const dimensions = {\n availableHeight: rects.floating.height - (['left', 'right'].includes(placement) ? 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)) : overflow[heightSide]),\n availableWidth: rects.floating.width - (['top', 'bottom'].includes(placement) ? 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)) : overflow[widthSide])\n };\n const prevDimensions = await platform.getDimensions(elements.floating);\n apply == null ? void 0 : apply({ ...middlewareArguments,\n ...dimensions\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n\n if (prevDimensions.width !== nextDimensions.width || prevDimensions.height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'inline',\n options,\n\n async fn(middlewareArguments) {\n var _await$platform$getCl;\n\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = middlewareArguments; // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n\n const {\n padding = 2,\n x,\n y\n } = options;\n const fallback = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects.reference);\n const clientRects = (_await$platform$getCl = await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) != null ? _await$platform$getCl : [];\n const paddingObject = getSideObjectFromPadding(padding);\n\n function getBoundingClientRect() {\n // There are two rects and they are disjoined\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n var _clientRects$find;\n\n // Find the first rect in which the point is fully inside\n return (_clientRects$find = clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom)) != null ? _clientRects$find : fallback;\n } // There are 2 or more connected rects\n\n\n if (clientRects.length >= 2) {\n if (getMainAxisFromPlacement(placement) === 'x') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n return fallback;\n }\n\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9jb3JlL2Rpc3QvZmxvYXRpbmctdWkuY29yZS5icm93c2VyLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSwySEFBMkg7O0FBRW5JO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCwwREFBMEQ7O0FBRTFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEdBQUc7O0FBRVY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksd0JBQXdCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUY7O0FBRXJGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUJBQXVCLHlCQUF5QixLQUFLO0FBQzdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFd0kiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9jb3JlL2Rpc3QvZmxvYXRpbmctdWkuY29yZS5icm93c2VyLm1qcz85ZTg0Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGdldFNpZGUocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59XG5cbmZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluY2x1ZGVzKGdldFNpZGUocGxhY2VtZW50KSkgPyAneCcgOiAneSc7XG59XG5cbmZ1bmN0aW9uIGdldExlbmd0aEZyb21BeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUNvb3Jkc0Zyb21QbGFjZW1lbnQoX3JlZiwgcGxhY2VtZW50LCBydGwpIHtcbiAgbGV0IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBmbG9hdGluZy53aWR0aCAvIDI7XG4gIGNvbnN0IGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZmxvYXRpbmcuaGVpZ2h0IC8gMjtcbiAgY29uc3QgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgY29uc3QgbGVuZ3RoID0gZ2V0TGVuZ3RoRnJvbUF4aXMobWFpbkF4aXMpO1xuICBjb25zdCBjb21tb25BbGlnbiA9IHJlZmVyZW5jZVtsZW5ndGhdIC8gMiAtIGZsb2F0aW5nW2xlbmd0aF0gLyAyO1xuICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gbWFpbkF4aXMgPT09ICd4JztcbiAgbGV0IGNvb3JkcztcblxuICBzd2l0Y2ggKHNpZGUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGZsb2F0aW5nLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyaWdodCc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBmbG9hdGluZy53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgc3dpdGNoIChnZXRBbGlnbm1lbnQocGxhY2VtZW50KSkge1xuICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIGNvb3Jkc1ttYWluQXhpc10gLT0gY29tbW9uQWxpZ24gKiAocnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdlbmQnOlxuICAgICAgY29vcmRzW21haW5BeGlzXSArPSBjb21tb25BbGlnbiAqIChydGwgJiYgaXNWZXJ0aWNhbCA/IC0xIDogMSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBjb29yZHM7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHRoYXQgd2lsbCBwbGFjZSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICogbmV4dCB0byBhIHJlZmVyZW5jZSBlbGVtZW50IHdoZW4gaXQgaXMgZ2l2ZW4gYSBjZXJ0YWluIHBvc2l0aW9uaW5nIHN0cmF0ZWd5LlxuICpcbiAqIFRoaXMgZXhwb3J0IGRvZXMgbm90IGhhdmUgYW55IGBwbGF0Zm9ybWAgaW50ZXJmYWNlIGxvZ2ljLiBZb3Ugd2lsbCBuZWVkIHRvXG4gKiB3cml0ZSBvbmUgZm9yIHRoZSBwbGF0Zm9ybSB5b3UgYXJlIHVzaW5nIEZsb2F0aW5nIFVJIHdpdGguXG4gKi9cblxuY29uc3QgY29tcHV0ZVBvc2l0aW9uID0gYXN5bmMgKHJlZmVyZW5jZSwgZmxvYXRpbmcsIGNvbmZpZykgPT4ge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1pZGRsZXdhcmUgPSBbXSxcbiAgICBwbGF0Zm9ybVxuICB9ID0gY29uZmlnO1xuICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGZsb2F0aW5nKSk7XG5cbiAge1xuICAgIGlmIChwbGF0Zm9ybSA9PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnRmxvYXRpbmcgVUk6IGBwbGF0Zm9ybWAgcHJvcGVydHkgd2FzIG5vdCBwYXNzZWQgdG8gY29uZmlnLiBJZiB5b3UnLCAnd2FudCB0byB1c2UgRmxvYXRpbmcgVUkgb24gdGhlIHdlYiwgaW5zdGFsbCBAZmxvYXRpbmctdWkvZG9tJywgJ2luc3RlYWQgb2YgdGhlIC9jb3JlIHBhY2thZ2UuIE90aGVyd2lzZSwgeW91IGNhbiBjcmVhdGUgeW91ciBvd24nLCAnYHBsYXRmb3JtYDogaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9wbGF0Zm9ybSddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgaWYgKG1pZGRsZXdhcmUuZmlsdGVyKF9yZWYgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgbmFtZVxuICAgICAgfSA9IF9yZWY7XG4gICAgICByZXR1cm4gbmFtZSA9PT0gJ2F1dG9QbGFjZW1lbnQnIHx8IG5hbWUgPT09ICdmbGlwJztcbiAgICB9KS5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoWydGbG9hdGluZyBVSTogZHVwbGljYXRlIGBmbGlwYCBhbmQvb3IgYGF1dG9QbGFjZW1lbnRgJywgJ21pZGRsZXdhcmUgZGV0ZWN0ZWQuIFRoaXMgd2lsbCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuIEVuc3VyZSBvbmx5JywgJ29uZSBvZiBlaXRoZXIgaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBgbWlkZGxld2FyZWAgYXJyYXkuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcmVjdHMgPSBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZyxcbiAgICBzdHJhdGVneVxuICB9KTtcbiAgbGV0IHtcbiAgICB4LFxuICAgIHlcbiAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBwbGFjZW1lbnQsIHJ0bCk7XG4gIGxldCBzdGF0ZWZ1bFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgbGV0IG1pZGRsZXdhcmVEYXRhID0ge307XG4gIGxldCByZXNldENvdW50ID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1pZGRsZXdhcmUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgZm5cbiAgICB9ID0gbWlkZGxld2FyZVtpXTtcbiAgICBjb25zdCB7XG4gICAgICB4OiBuZXh0WCxcbiAgICAgIHk6IG5leHRZLFxuICAgICAgZGF0YSxcbiAgICAgIHJlc2V0XG4gICAgfSA9IGF3YWl0IGZuKHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgaW5pdGlhbFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50OiBzdGF0ZWZ1bFBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICByZWN0cyxcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICBmbG9hdGluZ1xuICAgICAgfVxuICAgIH0pO1xuICAgIHggPSBuZXh0WCAhPSBudWxsID8gbmV4dFggOiB4O1xuICAgIHkgPSBuZXh0WSAhPSBudWxsID8gbmV4dFkgOiB5O1xuICAgIG1pZGRsZXdhcmVEYXRhID0geyAuLi5taWRkbGV3YXJlRGF0YSxcbiAgICAgIFtuYW1lXTogeyAuLi5taWRkbGV3YXJlRGF0YVtuYW1lXSxcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfVxuICAgIH07XG5cbiAgICB7XG4gICAgICBpZiAocmVzZXRDb3VudCA+IDUwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihbJ0Zsb2F0aW5nIFVJOiBUaGUgbWlkZGxld2FyZSBsaWZlY3ljbGUgYXBwZWFycyB0byBiZSBydW5uaW5nIGluIGFuJywgJ2luZmluaXRlIGxvb3AuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBgcmVzZXRgIGNvbnRpbnVhbGx5JywgJ2JlaW5nIHJldHVybmVkIHdpdGhvdXQgYSBicmVhayBjb25kaXRpb24uJ10uam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzZXQgJiYgcmVzZXRDb3VudCA8PSA1MCkge1xuICAgICAgcmVzZXRDb3VudCsrO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAocmVzZXQucGxhY2VtZW50KSB7XG4gICAgICAgICAgc3RhdGVmdWxQbGFjZW1lbnQgPSByZXNldC5wbGFjZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzZXQucmVjdHMpIHtcbiAgICAgICAgICByZWN0cyA9IHJlc2V0LnJlY3RzID09PSB0cnVlID8gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgICAgIGZsb2F0aW5nLFxuICAgICAgICAgICAgc3RyYXRlZ3lcbiAgICAgICAgICB9KSA6IHJlc2V0LnJlY3RzO1xuICAgICAgICB9XG5cbiAgICAgICAgKHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBzdGF0ZWZ1bFBsYWNlbWVudCwgcnRsKSk7XG4gICAgICB9XG5cbiAgICAgIGkgPSAtMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHBsYWNlbWVudDogc3RhdGVmdWxQbGFjZW1lbnQsXG4gICAgc3RyYXRlZ3ksXG4gICAgbWlkZGxld2FyZURhdGFcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGV4cGFuZFBhZGRpbmdPYmplY3QocGFkZGluZykge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICAuLi5wYWRkaW5nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNpZGVPYmplY3RGcm9tUGFkZGluZyhwYWRkaW5nKSB7XG4gIHJldHVybiB0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBleHBhbmRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpIDoge1xuICAgIHRvcDogcGFkZGluZyxcbiAgICByaWdodDogcGFkZGluZyxcbiAgICBib3R0b206IHBhZGRpbmcsXG4gICAgbGVmdDogcGFkZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIHsgLi4ucmVjdCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggYW4gb2JqZWN0IG9mIG92ZXJmbG93IHNpZGUgb2Zmc2V0cyB0aGF0IGRldGVybWluZSBob3cgbXVjaCB0aGVcbiAqIGVsZW1lbnQgaXMgb3ZlcmZsb3dpbmcgYSBnaXZlbiBjbGlwcGluZyBib3VuZGFyeS5cbiAqIC0gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgYm91bmRhcnkgYnkgdGhhdCBudW1iZXIgb2YgcGl4ZWxzXG4gKiAtIG5lZ2F0aXZlID0gaG93IG1hbnkgcGl4ZWxzIGxlZnQgYmVmb3JlIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIC0gMCA9IGxpZXMgZmx1c2ggd2l0aCB0aGUgYm91bmRhcnlcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9kZXRlY3RPdmVyZmxvd1xuICovXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBvcHRpb25zKSB7XG4gIHZhciBfYXdhaXQkcGxhdGZvcm0kaXNFbGU7XG5cbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgcGxhdGZvcm0sXG4gICAgcmVjdHMsXG4gICAgZWxlbWVudHMsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gIGNvbnN0IHtcbiAgICBib3VuZGFyeSA9ICdjbGlwcGluZ0FuY2VzdG9ycycsXG4gICAgcm9vdEJvdW5kYXJ5ID0gJ3ZpZXdwb3J0JyxcbiAgICBlbGVtZW50Q29udGV4dCA9ICdmbG9hdGluZycsXG4gICAgYWx0Qm91bmRhcnkgPSBmYWxzZSxcbiAgICBwYWRkaW5nID0gMFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFNpZGVPYmplY3RGcm9tUGFkZGluZyhwYWRkaW5nKTtcbiAgY29uc3QgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSAnZmxvYXRpbmcnID8gJ3JlZmVyZW5jZScgOiAnZmxvYXRpbmcnO1xuICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICBjb25zdCBjbGlwcGluZ0NsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KGF3YWl0IHBsYXRmb3JtLmdldENsaXBwaW5nUmVjdCh7XG4gICAgZWxlbWVudDogKChfYXdhaXQkcGxhdGZvcm0kaXNFbGUgPSBhd2FpdCAocGxhdGZvcm0uaXNFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc0VsZW1lbnQoZWxlbWVudCkpKSAhPSBudWxsID8gX2F3YWl0JHBsYXRmb3JtJGlzRWxlIDogdHJ1ZSkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCAoYXdhaXQgKHBsYXRmb3JtLmdldERvY3VtZW50RWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnRzLmZsb2F0aW5nKSkpLFxuICAgIGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeSxcbiAgICBzdHJhdGVneVxuICB9KSk7XG4gIGNvbnN0IGVsZW1lbnRDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChwbGF0Zm9ybS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCA/IGF3YWl0IHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtcbiAgICByZWN0OiBlbGVtZW50Q29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/IHsgLi4ucmVjdHMuZmxvYXRpbmcsXG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gOiByZWN0cy5yZWZlcmVuY2UsXG4gICAgb2Zmc2V0UGFyZW50OiBhd2FpdCAocGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQoZWxlbWVudHMuZmxvYXRpbmcpKSxcbiAgICBzdHJhdGVneVxuICB9KSA6IHJlY3RzW2VsZW1lbnRDb250ZXh0XSk7XG4gIHJldHVybiB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbn1cblxuY29uc3QgbWluID0gTWF0aC5taW47XG5jb25zdCBtYXggPSBNYXRoLm1heDtcblxuZnVuY3Rpb24gd2l0aGluKG1pbiQxLCB2YWx1ZSwgbWF4JDEpIHtcbiAgcmV0dXJuIG1heChtaW4kMSwgbWluKHZhbHVlLCBtYXgkMSkpO1xufVxuXG4vKipcbiAqIFBvc2l0aW9ucyBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHN1Y2ggdGhhdCBpdCBpcyBjZW50ZXJlZFxuICogdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gb3B0aW9ucyA9PiAoe1xuICBuYW1lOiAnYXJyb3cnLFxuICBvcHRpb25zLFxuXG4gIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAvLyBTaW5jZSBgZWxlbWVudGAgaXMgcmVxdWlyZWQsIHdlIGRvbid0IFBhcnRpYWw8PiB0aGUgdHlwZVxuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnQsXG4gICAgICBwYWRkaW5nID0gMFxuICAgIH0gPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICByZWN0cyxcbiAgICAgIHBsYXRmb3JtXG4gICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmxvYXRpbmcgVUk6IE5vIGBlbGVtZW50YCB3YXMgcGFzc2VkIHRvIHRoZSBgYXJyb3dgIG1pZGRsZXdhcmUuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0U2lkZU9iamVjdEZyb21QYWRkaW5nKHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgICBjb25zdCBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3QgbGVuZ3RoID0gZ2V0TGVuZ3RoRnJvbUF4aXMoYXhpcyk7XG4gICAgY29uc3QgYXJyb3dEaW1lbnNpb25zID0gYXdhaXQgcGxhdGZvcm0uZ2V0RGltZW5zaW9ucyhlbGVtZW50KTtcbiAgICBjb25zdCBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgY29uc3QgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICBjb25zdCBlbmREaWZmID0gcmVjdHMucmVmZXJlbmNlW2xlbmd0aF0gKyByZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBjb29yZHNbYXhpc10gLSByZWN0cy5mbG9hdGluZ1tsZW5ndGhdO1xuICAgIGNvbnN0IHN0YXJ0RGlmZiA9IGNvb3Jkc1theGlzXSAtIHJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgICBjb25zdCBhcnJvd09mZnNldFBhcmVudCA9IGF3YWl0IChwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldE9mZnNldFBhcmVudChlbGVtZW50KSk7XG4gICAgbGV0IGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG5cbiAgICBpZiAoY2xpZW50U2l6ZSA9PT0gMCkge1xuICAgICAgY2xpZW50U2l6ZSA9IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgZmxvYXRpbmcgZWxlbWVudCBpZiB0aGUgY2VudGVyXG4gICAgLy8gcG9pbnQgaXMgb3V0c2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCdzIGJvdW5kc1xuXG4gICAgY29uc3QgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgICBjb25zdCBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICAgIGNvbnN0IGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gICAgY29uc3Qgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBNYWtlIHN1cmUgdGhhdCBhcnJvdyBwb2ludHMgYXQgdGhlIHJlZmVyZW5jZVxuXG4gICAgY29uc3QgYWxpZ25tZW50UGFkZGluZyA9IGFsaWdubWVudCA9PT0gJ3N0YXJ0JyA/IHBhZGRpbmdPYmplY3RbbWluUHJvcF0gOiBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICAgIGNvbnN0IHNob3VsZEFkZE9mZnNldCA9IGFsaWdubWVudFBhZGRpbmcgPiAwICYmIGNlbnRlciAhPT0gb2Zmc2V0ICYmIHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdIDw9IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgY29uc3QgYWxpZ25tZW50T2Zmc2V0ID0gc2hvdWxkQWRkT2Zmc2V0ID8gY2VudGVyIDwgbWluID8gbWluIC0gY2VudGVyIDogbWF4IC0gY2VudGVyIDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgW2F4aXNdOiBjb29yZHNbYXhpc10gLSBhbGlnbm1lbnRPZmZzZXQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFtheGlzXTogb2Zmc2V0LFxuICAgICAgICBjZW50ZXJPZmZzZXQ6IGNlbnRlciAtIG9mZnNldFxuICAgICAgfVxuICAgIH07XG4gIH1cblxufSk7XG5cbmNvbnN0IGhhc2gkMSA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBtYXRjaGVkID0+IGhhc2gkMVttYXRjaGVkXSk7XG59XG5cbmZ1bmN0aW9uIGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIHJ0bCkge1xuICBpZiAocnRsID09PSB2b2lkIDApIHtcbiAgICBydGwgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBsZW5ndGggPSBnZXRMZW5ndGhGcm9tQXhpcyhtYWluQXhpcyk7XG4gIGxldCBtYWluQWxpZ25tZW50U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBhbGlnbm1lbnQgPT09IChydGwgPyAnZW5kJyA6ICdzdGFydCcpID8gJ3JpZ2h0JyA6ICdsZWZ0JyA6IGFsaWdubWVudCA9PT0gJ3N0YXJ0JyA/ICdib3R0b20nIDogJ3RvcCc7XG5cbiAgaWYgKHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdID4gcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXSkge1xuICAgIG1haW5BbGlnbm1lbnRTaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYWluOiBtYWluQWxpZ25tZW50U2lkZSxcbiAgICBjcm9zczogZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpXG4gIH07XG59XG5cbmNvbnN0IGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIG1hdGNoZWQgPT4gaGFzaFttYXRjaGVkXSk7XG59XG5cbmNvbnN0IHNpZGVzID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcbmNvbnN0IGFsbFBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovc2lkZXMucmVkdWNlKChhY2MsIHNpZGUpID0+IGFjYy5jb25jYXQoc2lkZSwgc2lkZSArIFwiLXN0YXJ0XCIsIHNpZGUgKyBcIi1lbmRcIiksIFtdKTtcblxuZnVuY3Rpb24gZ2V0UGxhY2VtZW50TGlzdChhbGlnbm1lbnQsIGF1dG9BbGlnbm1lbnQsIGFsbG93ZWRQbGFjZW1lbnRzKSB7XG4gIGNvbnN0IGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQgPSBhbGlnbm1lbnQgPyBbLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSA9PT0gYWxpZ25tZW50KSwgLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSAhPT0gYWxpZ25tZW50KV0gOiBhbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldFNpZGUocGxhY2VtZW50KSA9PT0gcGxhY2VtZW50KTtcbiAgcmV0dXJuIGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQuZmlsdGVyKHBsYWNlbWVudCA9PiB7XG4gICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIGdldEFsaWdubWVudChwbGFjZW1lbnQpID09PSBhbGlnbm1lbnQgfHwgKGF1dG9BbGlnbm1lbnQgPyBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpICE9PSBwbGFjZW1lbnQgOiBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEF1dG9tYXRpY2FsbHkgY2hvb3NlcyB0aGUgYHBsYWNlbWVudGAgd2hpY2ggaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvUGxhY2VtZW50XG4gKi9cbmNvbnN0IGF1dG9QbGFjZW1lbnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYXV0b1BsYWNlbWVudCcsXG4gICAgb3B0aW9ucyxcblxuICAgIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkYXV0b1AsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDIsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDMsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDQsIF9wbGFjZW1lbnRzU29ydGVkQnlMZTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICByZWN0cyxcbiAgICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50cztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxpZ25tZW50ID0gbnVsbCxcbiAgICAgICAgYWxsb3dlZFBsYWNlbWVudHMgPSBhbGxQbGFjZW1lbnRzLFxuICAgICAgICBhdXRvQWxpZ25tZW50ID0gdHJ1ZSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gb3B0aW9ucztcbiAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBnZXRQbGFjZW1lbnRMaXN0KGFsaWdubWVudCwgYXV0b0FsaWdubWVudCwgYWxsb3dlZFBsYWNlbWVudHMpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gKF9taWRkbGV3YXJlRGF0YSRhdXRvUCA9IChfbWlkZGxld2FyZURhdGEkYXV0b1AyID0gbWlkZGxld2FyZURhdGEuYXV0b1BsYWNlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRhdXRvUDIuaW5kZXgpICE9IG51bGwgPyBfbWlkZGxld2FyZURhdGEkYXV0b1AgOiAwO1xuICAgICAgY29uc3QgY3VycmVudFBsYWNlbWVudCA9IHBsYWNlbWVudHNbY3VycmVudEluZGV4XTtcblxuICAgICAgaWYgKGN1cnJlbnRQbGFjZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbixcbiAgICAgICAgY3Jvc3NcbiAgICAgIH0gPSBnZXRBbGlnbm1lbnRTaWRlcyhjdXJyZW50UGxhY2VtZW50LCByZWN0cywgYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpKTsgLy8gTWFrZSBgY29tcHV0ZUNvb3Jkc2Agc3RhcnQgZnJvbSB0aGUgcmlnaHQgcGxhY2VcblxuICAgICAgaWYgKHBsYWNlbWVudCAhPT0gY3VycmVudFBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnRzWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50T3ZlcmZsb3dzID0gW292ZXJmbG93W2dldFNpZGUoY3VycmVudFBsYWNlbWVudCldLCBvdmVyZmxvd1ttYWluXSwgb3ZlcmZsb3dbY3Jvc3NdXTtcbiAgICAgIGNvbnN0IGFsbE92ZXJmbG93cyA9IFsuLi4oKF9taWRkbGV3YXJlRGF0YSRhdXRvUDMgPSAoX21pZGRsZXdhcmVEYXRhJGF1dG9QNCA9IG1pZGRsZXdhcmVEYXRhLmF1dG9QbGFjZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkYXV0b1A0Lm92ZXJmbG93cykgIT0gbnVsbCA/IF9taWRkbGV3YXJlRGF0YSRhdXRvUDMgOiBbXSksIHtcbiAgICAgICAgcGxhY2VtZW50OiBjdXJyZW50UGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3M6IGN1cnJlbnRPdmVyZmxvd3NcbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmV4dFBsYWNlbWVudCA9IHBsYWNlbWVudHNbY3VycmVudEluZGV4ICsgMV07IC8vIFRoZXJlIGFyZSBtb3JlIHBsYWNlbWVudHMgdG8gY2hlY2tcblxuICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwbGFjZW1lbnRzU29ydGVkQnlMZWFzdE92ZXJmbG93ID0gYWxsT3ZlcmZsb3dzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5vdmVyZmxvd3NbMF0gLSBiLm92ZXJmbG93c1swXSk7XG4gICAgICBjb25zdCBwbGFjZW1lbnRUaGF0Rml0c09uQWxsU2lkZXMgPSAoX3BsYWNlbWVudHNTb3J0ZWRCeUxlID0gcGxhY2VtZW50c1NvcnRlZEJ5TGVhc3RPdmVyZmxvdy5maW5kKF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIG92ZXJmbG93c1xuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgcmV0dXJuIG92ZXJmbG93cy5ldmVyeShvdmVyZmxvdyA9PiBvdmVyZmxvdyA8PSAwKTtcbiAgICAgIH0pKSA9PSBudWxsID8gdm9pZCAwIDogX3BsYWNlbWVudHNTb3J0ZWRCeUxlLnBsYWNlbWVudDtcbiAgICAgIGNvbnN0IHJlc2V0UGxhY2VtZW50ID0gcGxhY2VtZW50VGhhdEZpdHNPbkFsbFNpZGVzICE9IG51bGwgPyBwbGFjZW1lbnRUaGF0Rml0c09uQWxsU2lkZXMgOiBwbGFjZW1lbnRzU29ydGVkQnlMZWFzdE92ZXJmbG93WzBdLnBsYWNlbWVudDtcblxuICAgICAgaWYgKHJlc2V0UGxhY2VtZW50ICE9PSBwbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBjb25zdCBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHRvIG9uZSB0aGF0IHdpbGwgZml0IGlmIHRoZVxuICogaW5pdGlhbGx5IHNwZWNpZmllZCBgcGxhY2VtZW50YCBkb2VzIG5vdC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9mbGlwXG4gKi9cbmNvbnN0IGZsaXAgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnZmxpcCcsXG4gICAgb3B0aW9ucyxcblxuICAgIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkZmxpcDtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgaW5pdGlhbFBsYWNlbWVudCxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50cztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZSxcbiAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICAgIGZhbGxiYWNrU3RyYXRlZ3kgPSAnYmVzdEZpdCcsXG4gICAgICAgIGZsaXBBbGlnbm1lbnQgPSB0cnVlLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGlzQmFzZVBsYWNlbWVudCA9IHNpZGUgPT09IGluaXRpYWxQbGFjZW1lbnQ7XG4gICAgICBjb25zdCBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcEFsaWdubWVudCA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChpbml0aWFsUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZFBsYWNlbWVudHMoaW5pdGlhbFBsYWNlbWVudCkpO1xuICAgICAgY29uc3QgcGxhY2VtZW50cyA9IFtpbml0aWFsUGxhY2VtZW50LCAuLi5mYWxsYmFja1BsYWNlbWVudHNdO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzID0gW107XG4gICAgICBsZXQgb3ZlcmZsb3dzRGF0YSA9ICgoX21pZGRsZXdhcmVEYXRhJGZsaXAgPSBtaWRkbGV3YXJlRGF0YS5mbGlwKSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGZsaXAub3ZlcmZsb3dzKSB8fCBbXTtcblxuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgb3ZlcmZsb3dzLnB1c2gob3ZlcmZsb3dbc2lkZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1haW4sXG4gICAgICAgICAgY3Jvc3NcbiAgICAgICAgfSA9IGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKSk7XG4gICAgICAgIG92ZXJmbG93cy5wdXNoKG92ZXJmbG93W21haW5dLCBvdmVyZmxvd1tjcm9zc10pO1xuICAgICAgfVxuXG4gICAgICBvdmVyZmxvd3NEYXRhID0gWy4uLm92ZXJmbG93c0RhdGEsIHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3NcbiAgICAgIH1dOyAvLyBPbmUgb3IgbW9yZSBzaWRlcyBpcyBvdmVyZmxvd2luZ1xuXG4gICAgICBpZiAoIW92ZXJmbG93cy5ldmVyeShzaWRlID0+IHNpZGUgPD0gMCkpIHtcbiAgICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRmbGlwJCwgX21pZGRsZXdhcmVEYXRhJGZsaXAyO1xuXG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9ICgoX21pZGRsZXdhcmVEYXRhJGZsaXAkID0gKF9taWRkbGV3YXJlRGF0YSRmbGlwMiA9IG1pZGRsZXdhcmVEYXRhLmZsaXApID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkZmxpcDIuaW5kZXgpICE9IG51bGwgPyBfbWlkZGxld2FyZURhdGEkZmxpcCQgOiAwKSArIDE7XG4gICAgICAgIGNvbnN0IG5leHRQbGFjZW1lbnQgPSBwbGFjZW1lbnRzW25leHRJbmRleF07XG5cbiAgICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgICAvLyBUcnkgbmV4dCBwbGFjZW1lbnQgYW5kIHJlLXJ1biB0aGUgbGlmZWN5Y2xlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgaW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgICAgICAgb3ZlcmZsb3dzOiBvdmVyZmxvd3NEYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNldFBsYWNlbWVudCA9ICdib3R0b20nO1xuXG4gICAgICAgIHN3aXRjaCAoZmFsbGJhY2tTdHJhdGVneSkge1xuICAgICAgICAgIGNhc2UgJ2Jlc3RGaXQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgX292ZXJmbG93c0RhdGEkbWFwJHNvO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IChfb3ZlcmZsb3dzRGF0YSRtYXAkc28gPSBvdmVyZmxvd3NEYXRhLm1hcChkID0+IFtkLCBkLm92ZXJmbG93cy5maWx0ZXIob3ZlcmZsb3cgPT4gb3ZlcmZsb3cgPiAwKS5yZWR1Y2UoKGFjYywgb3ZlcmZsb3cpID0+IGFjYyArIG92ZXJmbG93LCAwKV0pLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vdmVyZmxvd3NEYXRhJG1hcCRzb1swXS5wbGFjZW1lbnQ7XG5cbiAgICAgICAgICAgICAgaWYgKHBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdpbml0aWFsUGxhY2VtZW50JzpcbiAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gaW5pdGlhbFBsYWNlbWVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudCAhPT0gcmVzZXRQbGFjZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIHNpZGVzLnNvbWUoc2lkZSA9PiBvdmVyZmxvd1tzaWRlXSA+PSAwKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSBmdW5jdGlvbiAoX3RlbXApIHtcbiAgbGV0IHtcbiAgICBzdHJhdGVneSA9ICdyZWZlcmVuY2VIaWRkZW4nLFxuICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2hpZGUnLFxuXG4gICAgYXN5bmMgZm4obWlkZGxld2FyZUFyZ3VtZW50cykge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZWN0c1xuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG5cbiAgICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHtcbiAgICAgICAgY2FzZSAncmVmZXJlbmNlSGlkZGVuJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KG1pZGRsZXdhcmVBcmd1bWVudHMsIHsgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgICAgICAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUhpZGRlbk9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlSGlkZGVuOiBpc0FueVNpZGVGdWxseUNsaXBwZWQob2Zmc2V0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXNjYXBlZCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCB7IC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICAgICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5mbG9hdGluZyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXNjYXBlZE9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgZXNjYXBlZDogaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG9mZnNldHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZVRvQ29vcmRzKG1pZGRsZXdhcmVBcmd1bWVudHMsIHZhbHVlKSB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgcGxhdGZvcm0sXG4gICAgZWxlbWVudHNcbiAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGNvbnN0IGlzVmVydGljYWwgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gJ3gnO1xuICBjb25zdCBtYWluQXhpc011bHRpID0gWydsZWZ0JywgJ3RvcCddLmluY2x1ZGVzKHNpZGUpID8gLTEgOiAxO1xuICBjb25zdCBjcm9zc0F4aXNNdWx0aSA9IHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxO1xuICBjb25zdCByYXdWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlKG1pZGRsZXdhcmVBcmd1bWVudHMpIDogdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcblxuICBsZXQge1xuICAgIG1haW5BeGlzLFxuICAgIGNyb3NzQXhpcyxcbiAgICBhbGlnbm1lbnRBeGlzXG4gIH0gPSB0eXBlb2YgcmF3VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiByYXdWYWx1ZSxcbiAgICBjcm9zc0F4aXM6IDAsXG4gICAgYWxpZ25tZW50QXhpczogbnVsbFxuICB9IDoge1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGNyb3NzQXhpczogMCxcbiAgICBhbGlnbm1lbnRBeGlzOiBudWxsLFxuICAgIC4uLnJhd1ZhbHVlXG4gIH07XG5cbiAgaWYgKGFsaWdubWVudCAmJiB0eXBlb2YgYWxpZ25tZW50QXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICBjcm9zc0F4aXMgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gYWxpZ25tZW50QXhpcyAqIC0xIDogYWxpZ25tZW50QXhpcztcbiAgfVxuXG4gIHJldHVybiBpc1ZlcnRpY2FsID8ge1xuICAgIHg6IGNyb3NzQXhpcyAqIGNyb3NzQXhpc011bHRpLFxuICAgIHk6IG1haW5BeGlzICogbWFpbkF4aXNNdWx0aVxuICB9IDoge1xuICAgIHg6IG1haW5BeGlzICogbWFpbkF4aXNNdWx0aSxcbiAgICB5OiBjcm9zc0F4aXMgKiBjcm9zc0F4aXNNdWx0aVxuICB9O1xufVxuLyoqXG4gKiBEaXNwbGFjZXMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgZnJvbSBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cblxuY29uc3Qgb2Zmc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgdmFsdWUgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICBvcHRpb25zOiB2YWx1ZSxcblxuICAgIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gICAgICBjb25zdCBkaWZmQ29vcmRzID0gYXdhaXQgY29udmVydFZhbHVlVG9Db29yZHMobWlkZGxld2FyZUFyZ3VtZW50cywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIGRpZmZDb29yZHMueCxcbiAgICAgICAgeTogeSArIGRpZmZDb29yZHMueSxcbiAgICAgICAgZGF0YTogZGlmZkNvb3Jkc1xuICAgICAgfTtcbiAgICB9XG5cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGdldENyb3NzQXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG5cbi8qKlxuICogU2hpZnRzIHRoZSBmbG9hdGluZyBlbGVtZW50IGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIGEgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnc2hpZnQnLFxuICAgIG9wdGlvbnMsXG5cbiAgICBhc3luYyBmbihtaWRkbGV3YXJlQXJndW1lbnRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudFxuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1haW5BeGlzOiBjaGVja01haW5BeGlzID0gdHJ1ZSxcbiAgICAgICAgY3Jvc3NBeGlzOiBjaGVja0Nyb3NzQXhpcyA9IGZhbHNlLFxuICAgICAgICBsaW1pdGVyID0ge1xuICAgICAgICAgIGZuOiBfcmVmID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH0gPSBfcmVmO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KG1pZGRsZXdhcmVBcmd1bWVudHMsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChnZXRTaWRlKHBsYWNlbWVudCkpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0Q3Jvc3NBeGlzKG1haW5BeGlzKTtcbiAgICAgIGxldCBtYWluQXhpc0Nvb3JkID0gY29vcmRzW21haW5BeGlzXTtcbiAgICAgIGxldCBjcm9zc0F4aXNDb29yZCA9IGNvb3Jkc1tjcm9zc0F4aXNdO1xuXG4gICAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgICBjb25zdCBtaW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/ICd0b3AnIDogJ2xlZnQnO1xuICAgICAgICBjb25zdCBtYXhTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICAgICAgY29uc3QgbWluID0gbWFpbkF4aXNDb29yZCArIG92ZXJmbG93W21pblNpZGVdO1xuICAgICAgICBjb25zdCBtYXggPSBtYWluQXhpc0Nvb3JkIC0gb3ZlcmZsb3dbbWF4U2lkZV07XG4gICAgICAgIG1haW5BeGlzQ29vcmQgPSB3aXRoaW4obWluLCBtYWluQXhpc0Nvb3JkLCBtYXgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3QgbWluU2lkZSA9IGNyb3NzQXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIGNvbnN0IG1heFNpZGUgPSBjcm9zc0F4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICAgICAgY29uc3QgbWluID0gY3Jvc3NBeGlzQ29vcmQgKyBvdmVyZmxvd1ttaW5TaWRlXTtcbiAgICAgICAgY29uc3QgbWF4ID0gY3Jvc3NBeGlzQ29vcmQgLSBvdmVyZmxvd1ttYXhTaWRlXTtcbiAgICAgICAgY3Jvc3NBeGlzQ29vcmQgPSB3aXRoaW4obWluLCBjcm9zc0F4aXNDb29yZCwgbWF4KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGltaXRlZENvb3JkcyA9IGxpbWl0ZXIuZm4oeyAuLi5taWRkbGV3YXJlQXJndW1lbnRzLFxuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgLi4ubGltaXRlZENvb3JkcyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHg6IGxpbWl0ZWRDb29yZHMueCAtIHgsXG4gICAgICAgICAgeTogbGltaXRlZENvb3Jkcy55IC0geVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICB9O1xufTtcblxuLyoqXG4gKiBCdWlsdC1pbiBgbGltaXRlcmAgdGhhdCB3aWxsIHN0b3AgYHNoaWZ0KClgIGF0IGEgY2VydGFpbiBwb2ludC5cbiAqL1xuY29uc3QgbGltaXRTaGlmdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnMsXG5cbiAgICBmbihtaWRkbGV3YXJlQXJndW1lbnRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50cztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb2Zmc2V0ID0gMCxcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZVxuICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0Q3Jvc3NBeGlzKG1haW5BeGlzKTtcbiAgICAgIGxldCBtYWluQXhpc0Nvb3JkID0gY29vcmRzW21haW5BeGlzXTtcbiAgICAgIGxldCBjcm9zc0F4aXNDb29yZCA9IGNvb3Jkc1tjcm9zc0F4aXNdO1xuICAgICAgY29uc3QgcmF3T2Zmc2V0ID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldCh7IC4uLnJlY3RzLFxuICAgICAgICBwbGFjZW1lbnRcbiAgICAgIH0pIDogb2Zmc2V0O1xuICAgICAgY29uc3QgY29tcHV0ZWRPZmZzZXQgPSB0eXBlb2YgcmF3T2Zmc2V0ID09PSAnbnVtYmVyJyA/IHtcbiAgICAgICAgbWFpbkF4aXM6IHJhd09mZnNldCxcbiAgICAgICAgY3Jvc3NBeGlzOiAwXG4gICAgICB9IDoge1xuICAgICAgICBtYWluQXhpczogMCxcbiAgICAgICAgY3Jvc3NBeGlzOiAwLFxuICAgICAgICAuLi5yYXdPZmZzZXRcbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgICAgIGNvbnN0IGxpbWl0TWluID0gcmVjdHMucmVmZXJlbmNlW21haW5BeGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbl0gKyBjb21wdXRlZE9mZnNldC5tYWluQXhpcztcbiAgICAgICAgY29uc3QgbGltaXRNYXggPSByZWN0cy5yZWZlcmVuY2VbbWFpbkF4aXNdICsgcmVjdHMucmVmZXJlbmNlW2xlbl0gLSBjb21wdXRlZE9mZnNldC5tYWluQXhpcztcblxuICAgICAgICBpZiAobWFpbkF4aXNDb29yZCA8IGxpbWl0TWluKSB7XG4gICAgICAgICAgbWFpbkF4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKG1haW5BeGlzQ29vcmQgPiBsaW1pdE1heCkge1xuICAgICAgICAgIG1haW5BeGlzQ29vcmQgPSBsaW1pdE1heDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRvZmZzZSwgX21pZGRsZXdhcmVEYXRhJG9mZnNlMiwgX21pZGRsZXdhcmVEYXRhJG9mZnNlMywgX21pZGRsZXdhcmVEYXRhJG9mZnNlNDtcblxuICAgICAgICBjb25zdCBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBjb25zdCBpc09yaWdpblNpZGUgPSBbJ3RvcCcsICdsZWZ0J10uaW5jbHVkZXMoZ2V0U2lkZShwbGFjZW1lbnQpKTtcbiAgICAgICAgY29uc3QgbGltaXRNaW4gPSByZWN0cy5yZWZlcmVuY2VbY3Jvc3NBeGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbl0gKyAoaXNPcmlnaW5TaWRlID8gKF9taWRkbGV3YXJlRGF0YSRvZmZzZSA9IChfbWlkZGxld2FyZURhdGEkb2Zmc2UyID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlMltjcm9zc0F4aXNdKSAhPSBudWxsID8gX21pZGRsZXdhcmVEYXRhJG9mZnNlIDogMCA6IDApICsgKGlzT3JpZ2luU2lkZSA/IDAgOiBjb21wdXRlZE9mZnNldC5jcm9zc0F4aXMpO1xuICAgICAgICBjb25zdCBsaW1pdE1heCA9IHJlY3RzLnJlZmVyZW5jZVtjcm9zc0F4aXNdICsgcmVjdHMucmVmZXJlbmNlW2xlbl0gKyAoaXNPcmlnaW5TaWRlID8gMCA6IChfbWlkZGxld2FyZURhdGEkb2Zmc2UzID0gKF9taWRkbGV3YXJlRGF0YSRvZmZzZTQgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2U0W2Nyb3NzQXhpc10pICE9IG51bGwgPyBfbWlkZGxld2FyZURhdGEkb2Zmc2UzIDogMCkgLSAoaXNPcmlnaW5TaWRlID8gY29tcHV0ZWRPZmZzZXQuY3Jvc3NBeGlzIDogMCk7XG5cbiAgICAgICAgaWYgKGNyb3NzQXhpc0Nvb3JkIDwgbGltaXRNaW4pIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQXhpc0Nvb3JkID4gbGltaXRNYXgpIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWF4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFttYWluQXhpc106IG1haW5BeGlzQ29vcmQsXG4gICAgICAgIFtjcm9zc0F4aXNdOiBjcm9zc0F4aXNDb29yZFxuICAgICAgfTtcbiAgICB9XG5cbiAgfTtcbn07XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQuIEZvciBpbnN0YW5jZSxcbiAqIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyBpdHMgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZVxuICogcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIG9wdGlvbnMsXG5cbiAgICBhc3luYyBmbihtaWRkbGV3YXJlQXJndW1lbnRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFwcGx5LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICAgICAgbGV0IGhlaWdodFNpZGU7XG4gICAgICBsZXQgd2lkdGhTaWRlO1xuXG4gICAgICBpZiAoc2lkZSA9PT0gJ3RvcCcgfHwgc2lkZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgaGVpZ2h0U2lkZSA9IHNpZGU7XG4gICAgICAgIHdpZHRoU2lkZSA9IGFsaWdubWVudCA9PT0gKChhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSkpID8gJ3N0YXJ0JyA6ICdlbmQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWR0aFNpZGUgPSBzaWRlO1xuICAgICAgICBoZWlnaHRTaWRlID0gYWxpZ25tZW50ID09PSAnZW5kJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHhNaW4gPSBtYXgob3ZlcmZsb3cubGVmdCwgMCk7XG4gICAgICBjb25zdCB4TWF4ID0gbWF4KG92ZXJmbG93LnJpZ2h0LCAwKTtcbiAgICAgIGNvbnN0IHlNaW4gPSBtYXgob3ZlcmZsb3cudG9wLCAwKTtcbiAgICAgIGNvbnN0IHlNYXggPSBtYXgob3ZlcmZsb3cuYm90dG9tLCAwKTtcbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB7XG4gICAgICAgIGF2YWlsYWJsZUhlaWdodDogcmVjdHMuZmxvYXRpbmcuaGVpZ2h0IC0gKFsnbGVmdCcsICdyaWdodCddLmluY2x1ZGVzKHBsYWNlbWVudCkgPyAyICogKHlNaW4gIT09IDAgfHwgeU1heCAhPT0gMCA/IHlNaW4gKyB5TWF4IDogbWF4KG92ZXJmbG93LnRvcCwgb3ZlcmZsb3cuYm90dG9tKSkgOiBvdmVyZmxvd1toZWlnaHRTaWRlXSksXG4gICAgICAgIGF2YWlsYWJsZVdpZHRoOiByZWN0cy5mbG9hdGluZy53aWR0aCAtIChbJ3RvcCcsICdib3R0b20nXS5pbmNsdWRlcyhwbGFjZW1lbnQpID8gMiAqICh4TWluICE9PSAwIHx8IHhNYXggIT09IDAgPyB4TWluICsgeE1heCA6IG1heChvdmVyZmxvdy5sZWZ0LCBvdmVyZmxvdy5yaWdodCkpIDogb3ZlcmZsb3dbd2lkdGhTaWRlXSlcbiAgICAgIH07XG4gICAgICBjb25zdCBwcmV2RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgICAgYXBwbHkgPT0gbnVsbCA/IHZvaWQgMCA6IGFwcGx5KHsgLi4ubWlkZGxld2FyZUFyZ3VtZW50cyxcbiAgICAgICAgLi4uZGltZW5zaW9uc1xuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudHMuZmxvYXRpbmcpO1xuXG4gICAgICBpZiAocHJldkRpbWVuc2lvbnMud2lkdGggIT09IG5leHREaW1lbnNpb25zLndpZHRoIHx8IHByZXZEaW1lbnNpb25zLmhlaWdodCAhPT0gbmV4dERpbWVuc2lvbnMuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gIH07XG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnaW5saW5lJyxcbiAgICBvcHRpb25zLFxuXG4gICAgYXN5bmMgZm4obWlkZGxld2FyZUFyZ3VtZW50cykge1xuICAgICAgdmFyIF9hd2FpdCRwbGF0Zm9ybSRnZXRDbDtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50czsgLy8gQSBNb3VzZUV2ZW50J3MgY2xpZW50e1gsWX0gY29vcmRzIGNhbiBiZSB1cCB0byAyIHBpeGVscyBvZmYgYVxuICAgICAgLy8gQ2xpZW50UmVjdCdzIGJvdW5kcywgZGVzcGl0ZSB0aGUgZXZlbnQgbGlzdGVuZXIgYmVpbmcgdHJpZ2dlcmVkLiBBXG4gICAgICAvLyBwYWRkaW5nIG9mIDIgc2VlbXMgdG8gaGFuZGxlIHRoaXMgaXNzdWUuXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGFkZGluZyA9IDIsXG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSByZWN0VG9DbGllbnRSZWN0KHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0ID8gYXdhaXQgcGxhdGZvcm0uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Qoe1xuICAgICAgICByZWN0OiByZWN0cy5yZWZlcmVuY2UsXG4gICAgICAgIG9mZnNldFBhcmVudDogYXdhaXQgKHBsYXRmb3JtLmdldE9mZnNldFBhcmVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnRzLmZsb2F0aW5nKSksXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9KSA6IHJlY3RzLnJlZmVyZW5jZSk7XG4gICAgICBjb25zdCBjbGllbnRSZWN0cyA9IChfYXdhaXQkcGxhdGZvcm0kZ2V0Q2wgPSBhd2FpdCAocGxhdGZvcm0uZ2V0Q2xpZW50UmVjdHMgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldENsaWVudFJlY3RzKGVsZW1lbnRzLnJlZmVyZW5jZSkpKSAhPSBudWxsID8gX2F3YWl0JHBsYXRmb3JtJGdldENsIDogW107XG4gICAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0U2lkZU9iamVjdEZyb21QYWRkaW5nKHBhZGRpbmcpO1xuXG4gICAgICBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcmVjdHMgYW5kIHRoZXkgYXJlIGRpc2pvaW5lZFxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID09PSAyICYmIGNsaWVudFJlY3RzWzBdLmxlZnQgPiBjbGllbnRSZWN0c1sxXS5yaWdodCAmJiB4ICE9IG51bGwgJiYgeSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbGllbnRSZWN0cyRmaW5kO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgcmVjdCBpbiB3aGljaCB0aGUgcG9pbnQgaXMgZnVsbHkgaW5zaWRlXG4gICAgICAgICAgcmV0dXJuIChfY2xpZW50UmVjdHMkZmluZCA9IGNsaWVudFJlY3RzLmZpbmQocmVjdCA9PiB4ID4gcmVjdC5sZWZ0IC0gcGFkZGluZ09iamVjdC5sZWZ0ICYmIHggPCByZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodCAmJiB5ID4gcmVjdC50b3AgLSBwYWRkaW5nT2JqZWN0LnRvcCAmJiB5IDwgcmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSkpICE9IG51bGwgPyBfY2xpZW50UmVjdHMkZmluZCA6IGZhbGxiYWNrO1xuICAgICAgICB9IC8vIFRoZXJlIGFyZSAyIG9yIG1vcmUgY29ubmVjdGVkIHJlY3RzXG5cblxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICBpZiAoZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkgPT09ICd4Jykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gY2xpZW50UmVjdHNbMF07XG4gICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGNsaWVudFJlY3RzW2NsaWVudFJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgaXNUb3AgPSBnZXRTaWRlKHBsYWNlbWVudCkgPT09ICd0b3AnO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gZmlyc3RSZWN0LnRvcDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGxhc3RSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBpc1RvcCA/IGZpcnN0UmVjdC5sZWZ0IDogbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gaXNUb3AgPyBmaXJzdFJlY3QucmlnaHQgOiBsYXN0UmVjdC5yaWdodDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgICB5OiB0b3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNMZWZ0U2lkZSA9IGdldFNpZGUocGxhY2VtZW50KSA9PT0gJ2xlZnQnO1xuICAgICAgICAgIGNvbnN0IG1heFJpZ2h0ID0gbWF4KC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QucmlnaHQpKTtcbiAgICAgICAgICBjb25zdCBtaW5MZWZ0ID0gbWluKC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QubGVmdCkpO1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcihyZWN0ID0+IGlzTGVmdFNpZGUgPyByZWN0LmxlZnQgPT09IG1pbkxlZnQgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodCk7XG4gICAgICAgICAgY29uc3QgdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgICAgICBjb25zdCBib3R0b20gPSBtZWFzdXJlUmVjdHNbbWVhc3VyZVJlY3RzLmxlbmd0aCAtIDFdLmJvdHRvbTtcbiAgICAgICAgICBjb25zdCBsZWZ0ID0gbWluTGVmdDtcbiAgICAgICAgICBjb25zdCByaWdodCA9IG1heFJpZ2h0O1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYm90dG9tLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgeTogdG9wXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzZXRSZWN0cyA9IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgICB9LFxuICAgICAgICBmbG9hdGluZzogZWxlbWVudHMuZmxvYXRpbmcsXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlY3RzLnJlZmVyZW5jZS54ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS54IHx8IHJlY3RzLnJlZmVyZW5jZS55ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS55IHx8IHJlY3RzLnJlZmVyZW5jZS53aWR0aCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2Uud2lkdGggfHwgcmVjdHMucmVmZXJlbmNlLmhlaWdodCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiByZXNldFJlY3RzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gIH07XG59O1xuXG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZmxpcCwgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHJlY3RUb0NsaWVudFJlY3QsIHNoaWZ0LCBzaXplIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/@floating-ui/core/dist/floating-ui.core.browser.mjs\n");
5458
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"arrow\": () => (/* binding */ arrow),\n/* harmony export */ \"autoPlacement\": () => (/* binding */ autoPlacement),\n/* harmony export */ \"computePosition\": () => (/* binding */ computePosition),\n/* harmony export */ \"detectOverflow\": () => (/* binding */ detectOverflow),\n/* harmony export */ \"flip\": () => (/* binding */ flip),\n/* harmony export */ \"hide\": () => (/* binding */ hide),\n/* harmony export */ \"inline\": () => (/* binding */ inline),\n/* harmony export */ \"limitShift\": () => (/* binding */ limitShift),\n/* harmony export */ \"offset\": () => (/* binding */ offset),\n/* harmony export */ \"rectToClientRect\": () => (/* binding */ rectToClientRect),\n/* harmony export */ \"shift\": () => (/* binding */ shift),\n/* harmony export */ \"size\": () => (/* binding */ size)\n/* harmony export */ });\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\n\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].includes(getSide(placement)) ? 'x' : 'y';\n}\n\nfunction getLengthFromAxis(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\n\nfunction computeCoordsFromPlacement(_ref, placement, rtl) {\n let {\n reference,\n floating\n } = _ref;\n const commonX = reference.x + reference.width / 2 - floating.width / 2;\n const commonY = reference.y + reference.height / 2 - floating.height / 2;\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n const commonAlign = reference[length] / 2 - floating[length] / 2;\n const side = getSide(placement);\n const isVertical = mainAxis === 'x';\n let coords;\n\n switch (side) {\n case 'top':\n coords = {\n x: commonX,\n y: reference.y - floating.height\n };\n break;\n\n case 'bottom':\n coords = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case 'right':\n coords = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case 'left':\n coords = {\n x: reference.x - floating.width,\n y: commonY\n };\n break;\n\n default:\n coords = {\n x: reference.x,\n y: reference.y\n };\n }\n\n switch (getAlignment(placement)) {\n case 'start':\n coords[mainAxis] -= commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n\n case 'end':\n coords[mainAxis] += commonAlign * (rtl && isVertical ? -1 : 1);\n break;\n }\n\n return coords;\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain positioning strategy.\n *\n * This export does not have any `platform` interface logic. You will need to\n * write one for the platform you are using Floating UI with.\n */\n\nconst computePosition = async (reference, floating, config) => {\n const {\n placement = 'bottom',\n strategy = 'absolute',\n middleware = [],\n platform\n } = config;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(floating));\n\n {\n if (platform == null) {\n console.error(['Floating UI: `platform` property was not passed to config. If you', 'want to use Floating UI on the web, install @floating-ui/dom', 'instead of the /core package. Otherwise, you can create your own', '`platform`: https://floating-ui.com/docs/platform'].join(' '));\n }\n\n if (middleware.filter(_ref => {\n let {\n name\n } = _ref;\n return name === 'autoPlacement' || name === 'flip';\n }).length > 1) {\n throw new Error(['Floating UI: duplicate `flip` and/or `autoPlacement`', 'middleware detected. This will lead to an infinite loop. Ensure only', 'one of either has been passed to the `middleware` array.'].join(' '));\n }\n }\n\n let rects = await platform.getElementRects({\n reference,\n floating,\n strategy\n });\n let {\n x,\n y\n } = computeCoordsFromPlacement(rects, placement, rtl);\n let statefulPlacement = placement;\n let middlewareData = {};\n let resetCount = 0;\n\n for (let i = 0; i < middleware.length; i++) {\n const {\n name,\n fn\n } = middleware[i];\n const {\n x: nextX,\n y: nextY,\n data,\n reset\n } = await fn({\n x,\n y,\n initialPlacement: placement,\n placement: statefulPlacement,\n strategy,\n middlewareData,\n rects,\n platform,\n elements: {\n reference,\n floating\n }\n });\n x = nextX != null ? nextX : x;\n y = nextY != null ? nextY : y;\n middlewareData = { ...middlewareData,\n [name]: { ...middlewareData[name],\n ...data\n }\n };\n\n {\n if (resetCount > 50) {\n console.warn(['Floating UI: The middleware lifecycle appears to be running in an', 'infinite loop. This is usually caused by a `reset` continually', 'being returned without a break condition.'].join(' '));\n }\n }\n\n if (reset && resetCount <= 50) {\n resetCount++;\n\n if (typeof reset === 'object') {\n if (reset.placement) {\n statefulPlacement = reset.placement;\n }\n\n if (reset.rects) {\n rects = reset.rects === true ? await platform.getElementRects({\n reference,\n floating,\n strategy\n }) : reset.rects;\n }\n\n ({\n x,\n y\n } = computeCoordsFromPlacement(rects, statefulPlacement, rtl));\n }\n\n i = -1;\n continue;\n }\n }\n\n return {\n x,\n y,\n placement: statefulPlacement,\n strategy,\n middlewareData\n };\n};\n\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\n\nfunction getSideObjectFromPadding(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\n\nfunction rectToClientRect(rect) {\n return { ...rect,\n top: rect.y,\n left: rect.x,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n };\n}\n\n/**\n * Resolves with an object of overflow side offsets that determine how much the\n * element is overflowing a given clipping boundary.\n * - positive = overflowing the boundary by that number of pixels\n * - negative = how many pixels left before it will overflow\n * - 0 = lies flush with the boundary\n * @see https://floating-ui.com/docs/detectOverflow\n */\nasync function detectOverflow(middlewareArguments, options) {\n var _await$platform$isEle;\n\n if (options === void 0) {\n options = {};\n }\n\n const {\n x,\n y,\n platform,\n rects,\n elements,\n strategy\n } = middlewareArguments;\n const {\n boundary = 'clippingAncestors',\n rootBoundary = 'viewport',\n elementContext = 'floating',\n altBoundary = false,\n padding = 0\n } = options;\n const paddingObject = getSideObjectFromPadding(padding);\n const altContext = elementContext === 'floating' ? 'reference' : 'floating';\n const element = elements[altBoundary ? altContext : elementContext];\n const clippingClientRect = rectToClientRect(await platform.getClippingRect({\n element: ((_await$platform$isEle = await (platform.isElement == null ? void 0 : platform.isElement(element))) != null ? _await$platform$isEle : true) ? element : element.contextElement || (await (platform.getDocumentElement == null ? void 0 : platform.getDocumentElement(elements.floating))),\n boundary,\n rootBoundary,\n strategy\n }));\n const elementClientRect = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: elementContext === 'floating' ? { ...rects.floating,\n x,\n y\n } : rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects[elementContext]);\n return {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n}\n\nconst min = Math.min;\nconst max = Math.max;\n\nfunction within(min$1, value, max$1) {\n return max(min$1, min(value, max$1));\n}\n\n/**\n * Positions an inner element of the floating element such that it is centered\n * to the reference element.\n * @see https://floating-ui.com/docs/arrow\n */\nconst arrow = options => ({\n name: 'arrow',\n options,\n\n async fn(middlewareArguments) {\n // Since `element` is required, we don't Partial<> the type\n const {\n element,\n padding = 0\n } = options != null ? options : {};\n const {\n x,\n y,\n placement,\n rects,\n platform\n } = middlewareArguments;\n\n if (element == null) {\n {\n console.warn('Floating UI: No `element` was passed to the `arrow` middleware.');\n }\n\n return {};\n }\n\n const paddingObject = getSideObjectFromPadding(padding);\n const coords = {\n x,\n y\n };\n const axis = getMainAxisFromPlacement(placement);\n const alignment = getAlignment(placement);\n const length = getLengthFromAxis(axis);\n const arrowDimensions = await platform.getDimensions(element);\n const minProp = axis === 'y' ? 'top' : 'left';\n const maxProp = axis === 'y' ? 'bottom' : 'right';\n const endDiff = rects.reference[length] + rects.reference[axis] - coords[axis] - rects.floating[length];\n const startDiff = coords[axis] - rects.reference[axis];\n const arrowOffsetParent = await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(element));\n let clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n\n if (clientSize === 0) {\n clientSize = rects.floating[length];\n }\n\n const centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the floating element if the center\n // point is outside the floating element's bounds\n\n const min = paddingObject[minProp];\n const max = clientSize - arrowDimensions[length] - paddingObject[maxProp];\n const center = clientSize / 2 - arrowDimensions[length] / 2 + centerToReference;\n const offset = within(min, center, max); // Make sure that arrow points at the reference\n\n const alignmentPadding = alignment === 'start' ? paddingObject[minProp] : paddingObject[maxProp];\n const shouldAddOffset = alignmentPadding > 0 && center !== offset && rects.reference[length] <= rects.floating[length];\n const alignmentOffset = shouldAddOffset ? center < min ? min - center : max - center : 0;\n return {\n [axis]: coords[axis] - alignmentOffset,\n data: {\n [axis]: offset,\n centerOffset: center - offset\n }\n };\n }\n\n});\n\nconst hash$1 = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, matched => hash$1[matched]);\n}\n\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n\n const alignment = getAlignment(placement);\n const mainAxis = getMainAxisFromPlacement(placement);\n const length = getLengthFromAxis(mainAxis);\n let mainAlignmentSide = mainAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n\n return {\n main: mainAlignmentSide,\n cross: getOppositePlacement(mainAlignmentSide)\n };\n}\n\nconst hash = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, matched => hash[matched]);\n}\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst allPlacements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-start\", side + \"-end\"), []);\n\nfunction getPlacementList(alignment, autoAlignment, allowedPlacements) {\n const allowedPlacementsSortedByAlignment = alignment ? [...allowedPlacements.filter(placement => getAlignment(placement) === alignment), ...allowedPlacements.filter(placement => getAlignment(placement) !== alignment)] : allowedPlacements.filter(placement => getSide(placement) === placement);\n return allowedPlacementsSortedByAlignment.filter(placement => {\n if (alignment) {\n return getAlignment(placement) === alignment || (autoAlignment ? getOppositeAlignmentPlacement(placement) !== placement : false);\n }\n\n return true;\n });\n}\n\n/**\n * Automatically chooses the `placement` which has the most space available.\n * @see https://floating-ui.com/docs/autoPlacement\n */\nconst autoPlacement = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'autoPlacement',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$autoP, _middlewareData$autoP2, _middlewareData$autoP3, _middlewareData$autoP4, _placementsSortedByLe;\n\n const {\n x,\n y,\n rects,\n middlewareData,\n placement,\n platform,\n elements\n } = middlewareArguments;\n const {\n alignment = null,\n allowedPlacements = allPlacements,\n autoAlignment = true,\n ...detectOverflowOptions\n } = options;\n const placements = getPlacementList(alignment, autoAlignment, allowedPlacements);\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const currentIndex = (_middlewareData$autoP = (_middlewareData$autoP2 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP2.index) != null ? _middlewareData$autoP : 0;\n const currentPlacement = placements[currentIndex];\n\n if (currentPlacement == null) {\n return {};\n }\n\n const {\n main,\n cross\n } = getAlignmentSides(currentPlacement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))); // Make `computeCoords` start from the right place\n\n if (placement !== currentPlacement) {\n return {\n x,\n y,\n reset: {\n placement: placements[0]\n }\n };\n }\n\n const currentOverflows = [overflow[getSide(currentPlacement)], overflow[main], overflow[cross]];\n const allOverflows = [...((_middlewareData$autoP3 = (_middlewareData$autoP4 = middlewareData.autoPlacement) == null ? void 0 : _middlewareData$autoP4.overflows) != null ? _middlewareData$autoP3 : []), {\n placement: currentPlacement,\n overflows: currentOverflows\n }];\n const nextPlacement = placements[currentIndex + 1]; // There are more placements to check\n\n if (nextPlacement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n const placementsSortedByLeastOverflow = allOverflows.slice().sort((a, b) => a.overflows[0] - b.overflows[0]);\n const placementThatFitsOnAllSides = (_placementsSortedByLe = placementsSortedByLeastOverflow.find(_ref => {\n let {\n overflows\n } = _ref;\n return overflows.every(overflow => overflow <= 0);\n })) == null ? void 0 : _placementsSortedByLe.placement;\n const resetPlacement = placementThatFitsOnAllSides != null ? placementThatFitsOnAllSides : placementsSortedByLeastOverflow[0].placement;\n\n if (resetPlacement !== placement) {\n return {\n data: {\n index: currentIndex + 1,\n overflows: allOverflows\n },\n reset: {\n placement: resetPlacement\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\n\n/**\n * Changes the placement of the floating element to one that will fit if the\n * initially specified `placement` does not.\n * @see https://floating-ui.com/docs/flip\n */\nconst flip = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'flip',\n options,\n\n async fn(middlewareArguments) {\n var _middlewareData$flip;\n\n const {\n placement,\n middlewareData,\n rects,\n initialPlacement,\n platform,\n elements\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true,\n fallbackPlacements: specifiedFallbackPlacements,\n fallbackStrategy = 'bestFit',\n flipAlignment = true,\n ...detectOverflowOptions\n } = options;\n const side = getSide(placement);\n const isBasePlacement = side === initialPlacement;\n const fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipAlignment ? [getOppositePlacement(initialPlacement)] : getExpandedPlacements(initialPlacement));\n const placements = [initialPlacement, ...fallbackPlacements];\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const overflows = [];\n let overflowsData = ((_middlewareData$flip = middlewareData.flip) == null ? void 0 : _middlewareData$flip.overflows) || [];\n\n if (checkMainAxis) {\n overflows.push(overflow[side]);\n }\n\n if (checkCrossAxis) {\n const {\n main,\n cross\n } = getAlignmentSides(placement, rects, await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating)));\n overflows.push(overflow[main], overflow[cross]);\n }\n\n overflowsData = [...overflowsData, {\n placement,\n overflows\n }]; // One or more sides is overflowing\n\n if (!overflows.every(side => side <= 0)) {\n var _middlewareData$flip$, _middlewareData$flip2;\n\n const nextIndex = ((_middlewareData$flip$ = (_middlewareData$flip2 = middlewareData.flip) == null ? void 0 : _middlewareData$flip2.index) != null ? _middlewareData$flip$ : 0) + 1;\n const nextPlacement = placements[nextIndex];\n\n if (nextPlacement) {\n // Try next placement and re-run the lifecycle\n return {\n data: {\n index: nextIndex,\n overflows: overflowsData\n },\n reset: {\n placement: nextPlacement\n }\n };\n }\n\n let resetPlacement = 'bottom';\n\n switch (fallbackStrategy) {\n case 'bestFit':\n {\n var _overflowsData$map$so;\n\n const placement = (_overflowsData$map$so = overflowsData.map(d => [d, d.overflows.filter(overflow => overflow > 0).reduce((acc, overflow) => acc + overflow, 0)]).sort((a, b) => a[1] - b[1])[0]) == null ? void 0 : _overflowsData$map$so[0].placement;\n\n if (placement) {\n resetPlacement = placement;\n }\n\n break;\n }\n\n case 'initialPlacement':\n resetPlacement = initialPlacement;\n break;\n }\n\n if (placement !== resetPlacement) {\n return {\n reset: {\n placement: resetPlacement\n }\n };\n }\n }\n\n return {};\n }\n\n };\n};\n\nfunction getSideOffsets(overflow, rect) {\n return {\n top: overflow.top - rect.height,\n right: overflow.right - rect.width,\n bottom: overflow.bottom - rect.height,\n left: overflow.left - rect.width\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return sides.some(side => overflow[side] >= 0);\n}\n\n/**\n * Provides data to hide the floating element in applicable situations, such as\n * when it is not in the same clipping context as the reference element.\n * @see https://floating-ui.com/docs/hide\n */\nconst hide = function (_temp) {\n let {\n strategy = 'referenceHidden',\n ...detectOverflowOptions\n } = _temp === void 0 ? {} : _temp;\n return {\n name: 'hide',\n\n async fn(middlewareArguments) {\n const {\n rects\n } = middlewareArguments;\n\n switch (strategy) {\n case 'referenceHidden':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n elementContext: 'reference'\n });\n const offsets = getSideOffsets(overflow, rects.reference);\n return {\n data: {\n referenceHiddenOffsets: offsets,\n referenceHidden: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n case 'escaped':\n {\n const overflow = await detectOverflow(middlewareArguments, { ...detectOverflowOptions,\n altBoundary: true\n });\n const offsets = getSideOffsets(overflow, rects.floating);\n return {\n data: {\n escapedOffsets: offsets,\n escaped: isAnySideFullyClipped(offsets)\n }\n };\n }\n\n default:\n {\n return {};\n }\n }\n }\n\n };\n};\n\nasync function convertValueToCoords(middlewareArguments, value) {\n const {\n placement,\n platform,\n elements\n } = middlewareArguments;\n const rtl = await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating));\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n const isVertical = getMainAxisFromPlacement(placement) === 'x';\n const mainAxisMulti = ['left', 'top'].includes(side) ? -1 : 1;\n const crossAxisMulti = rtl && isVertical ? -1 : 1;\n const rawValue = typeof value === 'function' ? value(middlewareArguments) : value; // eslint-disable-next-line prefer-const\n\n let {\n mainAxis,\n crossAxis,\n alignmentAxis\n } = typeof rawValue === 'number' ? {\n mainAxis: rawValue,\n crossAxis: 0,\n alignmentAxis: null\n } : {\n mainAxis: 0,\n crossAxis: 0,\n alignmentAxis: null,\n ...rawValue\n };\n\n if (alignment && typeof alignmentAxis === 'number') {\n crossAxis = alignment === 'end' ? alignmentAxis * -1 : alignmentAxis;\n }\n\n return isVertical ? {\n x: crossAxis * crossAxisMulti,\n y: mainAxis * mainAxisMulti\n } : {\n x: mainAxis * mainAxisMulti,\n y: crossAxis * crossAxisMulti\n };\n}\n/**\n * Displaces the floating element from its reference element.\n * @see https://floating-ui.com/docs/offset\n */\n\nconst offset = function (value) {\n if (value === void 0) {\n value = 0;\n }\n\n return {\n name: 'offset',\n options: value,\n\n async fn(middlewareArguments) {\n const {\n x,\n y\n } = middlewareArguments;\n const diffCoords = await convertValueToCoords(middlewareArguments, value);\n return {\n x: x + diffCoords.x,\n y: y + diffCoords.y,\n data: diffCoords\n };\n }\n\n };\n};\n\nfunction getCrossAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\n/**\n * Shifts the floating element in order to keep it in view when it will overflow\n * a clipping boundary.\n * @see https://floating-ui.com/docs/shift\n */\nconst shift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'shift',\n options,\n\n async fn(middlewareArguments) {\n const {\n x,\n y,\n placement\n } = middlewareArguments;\n const {\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = false,\n limiter = {\n fn: _ref => {\n let {\n x,\n y\n } = _ref;\n return {\n x,\n y\n };\n }\n },\n ...detectOverflowOptions\n } = options;\n const coords = {\n x,\n y\n };\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const mainAxis = getMainAxisFromPlacement(getSide(placement));\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n\n if (checkMainAxis) {\n const minSide = mainAxis === 'y' ? 'top' : 'left';\n const maxSide = mainAxis === 'y' ? 'bottom' : 'right';\n const min = mainAxisCoord + overflow[minSide];\n const max = mainAxisCoord - overflow[maxSide];\n mainAxisCoord = within(min, mainAxisCoord, max);\n }\n\n if (checkCrossAxis) {\n const minSide = crossAxis === 'y' ? 'top' : 'left';\n const maxSide = crossAxis === 'y' ? 'bottom' : 'right';\n const min = crossAxisCoord + overflow[minSide];\n const max = crossAxisCoord - overflow[maxSide];\n crossAxisCoord = within(min, crossAxisCoord, max);\n }\n\n const limitedCoords = limiter.fn({ ...middlewareArguments,\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n });\n return { ...limitedCoords,\n data: {\n x: limitedCoords.x - x,\n y: limitedCoords.y - y\n }\n };\n }\n\n };\n};\n\n/**\n * Built-in `limiter` that will stop `shift()` at a certain point.\n */\nconst limitShift = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n options,\n\n fn(middlewareArguments) {\n const {\n x,\n y,\n placement,\n rects,\n middlewareData\n } = middlewareArguments;\n const {\n offset = 0,\n mainAxis: checkMainAxis = true,\n crossAxis: checkCrossAxis = true\n } = options;\n const coords = {\n x,\n y\n };\n const mainAxis = getMainAxisFromPlacement(placement);\n const crossAxis = getCrossAxis(mainAxis);\n let mainAxisCoord = coords[mainAxis];\n let crossAxisCoord = coords[crossAxis];\n const rawOffset = typeof offset === 'function' ? offset({ ...rects,\n placement\n }) : offset;\n const computedOffset = typeof rawOffset === 'number' ? {\n mainAxis: rawOffset,\n crossAxis: 0\n } : {\n mainAxis: 0,\n crossAxis: 0,\n ...rawOffset\n };\n\n if (checkMainAxis) {\n const len = mainAxis === 'y' ? 'height' : 'width';\n const limitMin = rects.reference[mainAxis] - rects.floating[len] + computedOffset.mainAxis;\n const limitMax = rects.reference[mainAxis] + rects.reference[len] - computedOffset.mainAxis;\n\n if (mainAxisCoord < limitMin) {\n mainAxisCoord = limitMin;\n } else if (mainAxisCoord > limitMax) {\n mainAxisCoord = limitMax;\n }\n }\n\n if (checkCrossAxis) {\n var _middlewareData$offse, _middlewareData$offse2, _middlewareData$offse3, _middlewareData$offse4;\n\n const len = mainAxis === 'y' ? 'width' : 'height';\n const isOriginSide = ['top', 'left'].includes(getSide(placement));\n const limitMin = rects.reference[crossAxis] - rects.floating[len] + (isOriginSide ? (_middlewareData$offse = (_middlewareData$offse2 = middlewareData.offset) == null ? void 0 : _middlewareData$offse2[crossAxis]) != null ? _middlewareData$offse : 0 : 0) + (isOriginSide ? 0 : computedOffset.crossAxis);\n const limitMax = rects.reference[crossAxis] + rects.reference[len] + (isOriginSide ? 0 : (_middlewareData$offse3 = (_middlewareData$offse4 = middlewareData.offset) == null ? void 0 : _middlewareData$offse4[crossAxis]) != null ? _middlewareData$offse3 : 0) - (isOriginSide ? computedOffset.crossAxis : 0);\n\n if (crossAxisCoord < limitMin) {\n crossAxisCoord = limitMin;\n } else if (crossAxisCoord > limitMax) {\n crossAxisCoord = limitMax;\n }\n }\n\n return {\n [mainAxis]: mainAxisCoord,\n [crossAxis]: crossAxisCoord\n };\n }\n\n };\n};\n\n/**\n * Provides data to change the size of the floating element. For instance,\n * prevent it from overflowing its clipping boundary or match the width of the\n * reference element.\n * @see https://floating-ui.com/docs/size\n */\nconst size = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'size',\n options,\n\n async fn(middlewareArguments) {\n const {\n placement,\n rects,\n platform,\n elements\n } = middlewareArguments;\n const {\n apply,\n ...detectOverflowOptions\n } = options;\n const overflow = await detectOverflow(middlewareArguments, detectOverflowOptions);\n const side = getSide(placement);\n const alignment = getAlignment(placement);\n let heightSide;\n let widthSide;\n\n if (side === 'top' || side === 'bottom') {\n heightSide = side;\n widthSide = alignment === ((await (platform.isRTL == null ? void 0 : platform.isRTL(elements.floating))) ? 'start' : 'end') ? 'left' : 'right';\n } else {\n widthSide = side;\n heightSide = alignment === 'end' ? 'top' : 'bottom';\n }\n\n const xMin = max(overflow.left, 0);\n const xMax = max(overflow.right, 0);\n const yMin = max(overflow.top, 0);\n const yMax = max(overflow.bottom, 0);\n const dimensions = {\n availableHeight: rects.floating.height - (['left', 'right'].includes(placement) ? 2 * (yMin !== 0 || yMax !== 0 ? yMin + yMax : max(overflow.top, overflow.bottom)) : overflow[heightSide]),\n availableWidth: rects.floating.width - (['top', 'bottom'].includes(placement) ? 2 * (xMin !== 0 || xMax !== 0 ? xMin + xMax : max(overflow.left, overflow.right)) : overflow[widthSide])\n };\n const prevDimensions = await platform.getDimensions(elements.floating);\n apply == null ? void 0 : apply({ ...middlewareArguments,\n ...dimensions\n });\n const nextDimensions = await platform.getDimensions(elements.floating);\n\n if (prevDimensions.width !== nextDimensions.width || prevDimensions.height !== nextDimensions.height) {\n return {\n reset: {\n rects: true\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\n/**\n * Provides improved positioning for inline reference elements that can span\n * over multiple lines, such as hyperlinks or range selections.\n * @see https://floating-ui.com/docs/inline\n */\nconst inline = function (options) {\n if (options === void 0) {\n options = {};\n }\n\n return {\n name: 'inline',\n options,\n\n async fn(middlewareArguments) {\n var _await$platform$getCl;\n\n const {\n placement,\n elements,\n rects,\n platform,\n strategy\n } = middlewareArguments; // A MouseEvent's client{X,Y} coords can be up to 2 pixels off a\n // ClientRect's bounds, despite the event listener being triggered. A\n // padding of 2 seems to handle this issue.\n\n const {\n padding = 2,\n x,\n y\n } = options;\n const fallback = rectToClientRect(platform.convertOffsetParentRelativeRectToViewportRelativeRect ? await platform.convertOffsetParentRelativeRectToViewportRelativeRect({\n rect: rects.reference,\n offsetParent: await (platform.getOffsetParent == null ? void 0 : platform.getOffsetParent(elements.floating)),\n strategy\n }) : rects.reference);\n const clientRects = (_await$platform$getCl = await (platform.getClientRects == null ? void 0 : platform.getClientRects(elements.reference))) != null ? _await$platform$getCl : [];\n const paddingObject = getSideObjectFromPadding(padding);\n\n function getBoundingClientRect() {\n // There are two rects and they are disjoined\n if (clientRects.length === 2 && clientRects[0].left > clientRects[1].right && x != null && y != null) {\n var _clientRects$find;\n\n // Find the first rect in which the point is fully inside\n return (_clientRects$find = clientRects.find(rect => x > rect.left - paddingObject.left && x < rect.right + paddingObject.right && y > rect.top - paddingObject.top && y < rect.bottom + paddingObject.bottom)) != null ? _clientRects$find : fallback;\n } // There are 2 or more connected rects\n\n\n if (clientRects.length >= 2) {\n if (getMainAxisFromPlacement(placement) === 'x') {\n const firstRect = clientRects[0];\n const lastRect = clientRects[clientRects.length - 1];\n const isTop = getSide(placement) === 'top';\n const top = firstRect.top;\n const bottom = lastRect.bottom;\n const left = isTop ? firstRect.left : lastRect.left;\n const right = isTop ? firstRect.right : lastRect.right;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n const isLeftSide = getSide(placement) === 'left';\n const maxRight = max(...clientRects.map(rect => rect.right));\n const minLeft = min(...clientRects.map(rect => rect.left));\n const measureRects = clientRects.filter(rect => isLeftSide ? rect.left === minLeft : rect.right === maxRight);\n const top = measureRects[0].top;\n const bottom = measureRects[measureRects.length - 1].bottom;\n const left = minLeft;\n const right = maxRight;\n const width = right - left;\n const height = bottom - top;\n return {\n top,\n bottom,\n left,\n right,\n width,\n height,\n x: left,\n y: top\n };\n }\n\n return fallback;\n }\n\n const resetRects = await platform.getElementRects({\n reference: {\n getBoundingClientRect\n },\n floating: elements.floating,\n strategy\n });\n\n if (rects.reference.x !== resetRects.reference.x || rects.reference.y !== resetRects.reference.y || rects.reference.width !== resetRects.reference.width || rects.reference.height !== resetRects.reference.height) {\n return {\n reset: {\n rects: resetRects\n }\n };\n }\n\n return {};\n }\n\n };\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9jb3JlL2Rpc3QvZmxvYXRpbmctdWkuY29yZS5icm93c2VyLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBOztBQUVBLGtCQUFrQix1QkFBdUI7QUFDekM7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSx1QkFBdUI7QUFDdkIsZ0JBQWdCO0FBQ2hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLFdBQVc7QUFDWDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0EsNENBQTRDO0FBQzVDO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTs7QUFFTjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsMkRBQTJEO0FBQzNEOztBQUVBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2Qzs7QUFFN0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSwySEFBMkg7O0FBRW5JO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCwwREFBMEQ7O0FBRTFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxPQUFPLEdBQUc7O0FBRVY7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksd0JBQXdCO0FBQzVCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUTs7QUFFUjtBQUNBO0FBQ0E7QUFDQSx5RUFBeUU7QUFDekU7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EseUVBQXlFO0FBQ3pFO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxRkFBcUY7O0FBRXJGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxjQUFjO0FBQ2Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEseUNBQXlDO0FBQ3pDO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsZUFBZTtBQUNmO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGdFQUFnRTtBQUNoRTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVDQUF1QztBQUN2QztBQUNBLE9BQU87QUFDUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsdUJBQXVCLHlCQUF5QixLQUFLO0FBQzdEO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQSxPQUFPOztBQUVQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFd0kiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9jb3JlL2Rpc3QvZmxvYXRpbmctdWkuY29yZS5icm93c2VyLm1qcz8xNDVhIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIGdldFNpZGUocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMV07XG59XG5cbmZ1bmN0aW9uIGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIFsndG9wJywgJ2JvdHRvbSddLmluY2x1ZGVzKGdldFNpZGUocGxhY2VtZW50KSkgPyAneCcgOiAneSc7XG59XG5cbmZ1bmN0aW9uIGdldExlbmd0aEZyb21BeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUNvb3Jkc0Zyb21QbGFjZW1lbnQoX3JlZiwgcGxhY2VtZW50LCBydGwpIHtcbiAgbGV0IHtcbiAgICByZWZlcmVuY2UsXG4gICAgZmxvYXRpbmdcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBmbG9hdGluZy53aWR0aCAvIDI7XG4gIGNvbnN0IGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZmxvYXRpbmcuaGVpZ2h0IC8gMjtcbiAgY29uc3QgbWFpbkF4aXMgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgY29uc3QgbGVuZ3RoID0gZ2V0TGVuZ3RoRnJvbUF4aXMobWFpbkF4aXMpO1xuICBjb25zdCBjb21tb25BbGlnbiA9IHJlZmVyZW5jZVtsZW5ndGhdIC8gMiAtIGZsb2F0aW5nW2xlbmd0aF0gLyAyO1xuICBjb25zdCBzaWRlID0gZ2V0U2lkZShwbGFjZW1lbnQpO1xuICBjb25zdCBpc1ZlcnRpY2FsID0gbWFpbkF4aXMgPT09ICd4JztcbiAgbGV0IGNvb3JkcztcblxuICBzd2l0Y2ggKHNpZGUpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgICAgY29vcmRzID0ge1xuICAgICAgICB4OiBjb21tb25YLFxuICAgICAgICB5OiByZWZlcmVuY2UueSAtIGZsb2F0aW5nLmhlaWdodFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYm90dG9tJzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdyaWdodCc6XG4gICAgICBjb29yZHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54ICsgcmVmZXJlbmNlLndpZHRoLFxuICAgICAgICB5OiBjb21tb25ZXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdsZWZ0JzpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggLSBmbG9hdGluZy53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIGNvb3JkcyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLngsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55XG4gICAgICB9O1xuICB9XG5cbiAgc3dpdGNoIChnZXRBbGlnbm1lbnQocGxhY2VtZW50KSkge1xuICAgIGNhc2UgJ3N0YXJ0JzpcbiAgICAgIGNvb3Jkc1ttYWluQXhpc10gLT0gY29tbW9uQWxpZ24gKiAocnRsICYmIGlzVmVydGljYWwgPyAtMSA6IDEpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdlbmQnOlxuICAgICAgY29vcmRzW21haW5BeGlzXSArPSBjb21tb25BbGlnbiAqIChydGwgJiYgaXNWZXJ0aWNhbCA/IC0xIDogMSk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBjb29yZHM7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGB4YCBhbmQgYHlgIGNvb3JkaW5hdGVzIHRoYXQgd2lsbCBwbGFjZSB0aGUgZmxvYXRpbmcgZWxlbWVudFxuICogbmV4dCB0byBhIHJlZmVyZW5jZSBlbGVtZW50IHdoZW4gaXQgaXMgZ2l2ZW4gYSBjZXJ0YWluIHBvc2l0aW9uaW5nIHN0cmF0ZWd5LlxuICpcbiAqIFRoaXMgZXhwb3J0IGRvZXMgbm90IGhhdmUgYW55IGBwbGF0Zm9ybWAgaW50ZXJmYWNlIGxvZ2ljLiBZb3Ugd2lsbCBuZWVkIHRvXG4gKiB3cml0ZSBvbmUgZm9yIHRoZSBwbGF0Zm9ybSB5b3UgYXJlIHVzaW5nIEZsb2F0aW5nIFVJIHdpdGguXG4gKi9cblxuY29uc3QgY29tcHV0ZVBvc2l0aW9uID0gYXN5bmMgKHJlZmVyZW5jZSwgZmxvYXRpbmcsIGNvbmZpZykgPT4ge1xuICBjb25zdCB7XG4gICAgcGxhY2VtZW50ID0gJ2JvdHRvbScsXG4gICAgc3RyYXRlZ3kgPSAnYWJzb2x1dGUnLFxuICAgIG1pZGRsZXdhcmUgPSBbXSxcbiAgICBwbGF0Zm9ybVxuICB9ID0gY29uZmlnO1xuICBjb25zdCBydGwgPSBhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGZsb2F0aW5nKSk7XG5cbiAge1xuICAgIGlmIChwbGF0Zm9ybSA9PSBudWxsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFsnRmxvYXRpbmcgVUk6IGBwbGF0Zm9ybWAgcHJvcGVydHkgd2FzIG5vdCBwYXNzZWQgdG8gY29uZmlnLiBJZiB5b3UnLCAnd2FudCB0byB1c2UgRmxvYXRpbmcgVUkgb24gdGhlIHdlYiwgaW5zdGFsbCBAZmxvYXRpbmctdWkvZG9tJywgJ2luc3RlYWQgb2YgdGhlIC9jb3JlIHBhY2thZ2UuIE90aGVyd2lzZSwgeW91IGNhbiBjcmVhdGUgeW91ciBvd24nLCAnYHBsYXRmb3JtYDogaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9wbGF0Zm9ybSddLmpvaW4oJyAnKSk7XG4gICAgfVxuXG4gICAgaWYgKG1pZGRsZXdhcmUuZmlsdGVyKF9yZWYgPT4ge1xuICAgICAgbGV0IHtcbiAgICAgICAgbmFtZVxuICAgICAgfSA9IF9yZWY7XG4gICAgICByZXR1cm4gbmFtZSA9PT0gJ2F1dG9QbGFjZW1lbnQnIHx8IG5hbWUgPT09ICdmbGlwJztcbiAgICB9KS5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoWydGbG9hdGluZyBVSTogZHVwbGljYXRlIGBmbGlwYCBhbmQvb3IgYGF1dG9QbGFjZW1lbnRgJywgJ21pZGRsZXdhcmUgZGV0ZWN0ZWQuIFRoaXMgd2lsbCBsZWFkIHRvIGFuIGluZmluaXRlIGxvb3AuIEVuc3VyZSBvbmx5JywgJ29uZSBvZiBlaXRoZXIgaGFzIGJlZW4gcGFzc2VkIHRvIHRoZSBgbWlkZGxld2FyZWAgYXJyYXkuJ10uam9pbignICcpKTtcbiAgICB9XG4gIH1cblxuICBsZXQgcmVjdHMgPSBhd2FpdCBwbGF0Zm9ybS5nZXRFbGVtZW50UmVjdHMoe1xuICAgIHJlZmVyZW5jZSxcbiAgICBmbG9hdGluZyxcbiAgICBzdHJhdGVneVxuICB9KTtcbiAgbGV0IHtcbiAgICB4LFxuICAgIHlcbiAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBwbGFjZW1lbnQsIHJ0bCk7XG4gIGxldCBzdGF0ZWZ1bFBsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgbGV0IG1pZGRsZXdhcmVEYXRhID0ge307XG4gIGxldCByZXNldENvdW50ID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG1pZGRsZXdhcmUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB7XG4gICAgICBuYW1lLFxuICAgICAgZm5cbiAgICB9ID0gbWlkZGxld2FyZVtpXTtcbiAgICBjb25zdCB7XG4gICAgICB4OiBuZXh0WCxcbiAgICAgIHk6IG5leHRZLFxuICAgICAgZGF0YSxcbiAgICAgIHJlc2V0XG4gICAgfSA9IGF3YWl0IGZuKHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgaW5pdGlhbFBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgcGxhY2VtZW50OiBzdGF0ZWZ1bFBsYWNlbWVudCxcbiAgICAgIHN0cmF0ZWd5LFxuICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICByZWN0cyxcbiAgICAgIHBsYXRmb3JtLFxuICAgICAgZWxlbWVudHM6IHtcbiAgICAgICAgcmVmZXJlbmNlLFxuICAgICAgICBmbG9hdGluZ1xuICAgICAgfVxuICAgIH0pO1xuICAgIHggPSBuZXh0WCAhPSBudWxsID8gbmV4dFggOiB4O1xuICAgIHkgPSBuZXh0WSAhPSBudWxsID8gbmV4dFkgOiB5O1xuICAgIG1pZGRsZXdhcmVEYXRhID0geyAuLi5taWRkbGV3YXJlRGF0YSxcbiAgICAgIFtuYW1lXTogeyAuLi5taWRkbGV3YXJlRGF0YVtuYW1lXSxcbiAgICAgICAgLi4uZGF0YVxuICAgICAgfVxuICAgIH07XG5cbiAgICB7XG4gICAgICBpZiAocmVzZXRDb3VudCA+IDUwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihbJ0Zsb2F0aW5nIFVJOiBUaGUgbWlkZGxld2FyZSBsaWZlY3ljbGUgYXBwZWFycyB0byBiZSBydW5uaW5nIGluIGFuJywgJ2luZmluaXRlIGxvb3AuIFRoaXMgaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBgcmVzZXRgIGNvbnRpbnVhbGx5JywgJ2JlaW5nIHJldHVybmVkIHdpdGhvdXQgYSBicmVhayBjb25kaXRpb24uJ10uam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocmVzZXQgJiYgcmVzZXRDb3VudCA8PSA1MCkge1xuICAgICAgcmVzZXRDb3VudCsrO1xuXG4gICAgICBpZiAodHlwZW9mIHJlc2V0ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBpZiAocmVzZXQucGxhY2VtZW50KSB7XG4gICAgICAgICAgc3RhdGVmdWxQbGFjZW1lbnQgPSByZXNldC5wbGFjZW1lbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzZXQucmVjdHMpIHtcbiAgICAgICAgICByZWN0cyA9IHJlc2V0LnJlY3RzID09PSB0cnVlID8gYXdhaXQgcGxhdGZvcm0uZ2V0RWxlbWVudFJlY3RzKHtcbiAgICAgICAgICAgIHJlZmVyZW5jZSxcbiAgICAgICAgICAgIGZsb2F0aW5nLFxuICAgICAgICAgICAgc3RyYXRlZ3lcbiAgICAgICAgICB9KSA6IHJlc2V0LnJlY3RzO1xuICAgICAgICB9XG5cbiAgICAgICAgKHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IGNvbXB1dGVDb29yZHNGcm9tUGxhY2VtZW50KHJlY3RzLCBzdGF0ZWZ1bFBsYWNlbWVudCwgcnRsKSk7XG4gICAgICB9XG5cbiAgICAgIGkgPSAtMTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeCxcbiAgICB5LFxuICAgIHBsYWNlbWVudDogc3RhdGVmdWxQbGFjZW1lbnQsXG4gICAgc3RyYXRlZ3ksXG4gICAgbWlkZGxld2FyZURhdGFcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGV4cGFuZFBhZGRpbmdPYmplY3QocGFkZGluZykge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICByaWdodDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICAuLi5wYWRkaW5nXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNpZGVPYmplY3RGcm9tUGFkZGluZyhwYWRkaW5nKSB7XG4gIHJldHVybiB0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBleHBhbmRQYWRkaW5nT2JqZWN0KHBhZGRpbmcpIDoge1xuICAgIHRvcDogcGFkZGluZyxcbiAgICByaWdodDogcGFkZGluZyxcbiAgICBib3R0b206IHBhZGRpbmcsXG4gICAgbGVmdDogcGFkZGluZ1xuICB9O1xufVxuXG5mdW5jdGlvbiByZWN0VG9DbGllbnRSZWN0KHJlY3QpIHtcbiAgcmV0dXJuIHsgLi4ucmVjdCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICBsZWZ0OiByZWN0LngsXG4gICAgcmlnaHQ6IHJlY3QueCArIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiByZWN0LnkgKyByZWN0LmhlaWdodFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHdpdGggYW4gb2JqZWN0IG9mIG92ZXJmbG93IHNpZGUgb2Zmc2V0cyB0aGF0IGRldGVybWluZSBob3cgbXVjaCB0aGVcbiAqIGVsZW1lbnQgaXMgb3ZlcmZsb3dpbmcgYSBnaXZlbiBjbGlwcGluZyBib3VuZGFyeS5cbiAqIC0gcG9zaXRpdmUgPSBvdmVyZmxvd2luZyB0aGUgYm91bmRhcnkgYnkgdGhhdCBudW1iZXIgb2YgcGl4ZWxzXG4gKiAtIG5lZ2F0aXZlID0gaG93IG1hbnkgcGl4ZWxzIGxlZnQgYmVmb3JlIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIC0gMCA9IGxpZXMgZmx1c2ggd2l0aCB0aGUgYm91bmRhcnlcbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9kZXRlY3RPdmVyZmxvd1xuICovXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBvcHRpb25zKSB7XG4gIHZhciBfYXdhaXQkcGxhdGZvcm0kaXNFbGU7XG5cbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB4LFxuICAgIHksXG4gICAgcGxhdGZvcm0sXG4gICAgcmVjdHMsXG4gICAgZWxlbWVudHMsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gIGNvbnN0IHtcbiAgICBib3VuZGFyeSA9ICdjbGlwcGluZ0FuY2VzdG9ycycsXG4gICAgcm9vdEJvdW5kYXJ5ID0gJ3ZpZXdwb3J0JyxcbiAgICBlbGVtZW50Q29udGV4dCA9ICdmbG9hdGluZycsXG4gICAgYWx0Qm91bmRhcnkgPSBmYWxzZSxcbiAgICBwYWRkaW5nID0gMFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgcGFkZGluZ09iamVjdCA9IGdldFNpZGVPYmplY3RGcm9tUGFkZGluZyhwYWRkaW5nKTtcbiAgY29uc3QgYWx0Q29udGV4dCA9IGVsZW1lbnRDb250ZXh0ID09PSAnZmxvYXRpbmcnID8gJ3JlZmVyZW5jZScgOiAnZmxvYXRpbmcnO1xuICBjb25zdCBlbGVtZW50ID0gZWxlbWVudHNbYWx0Qm91bmRhcnkgPyBhbHRDb250ZXh0IDogZWxlbWVudENvbnRleHRdO1xuICBjb25zdCBjbGlwcGluZ0NsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KGF3YWl0IHBsYXRmb3JtLmdldENsaXBwaW5nUmVjdCh7XG4gICAgZWxlbWVudDogKChfYXdhaXQkcGxhdGZvcm0kaXNFbGUgPSBhd2FpdCAocGxhdGZvcm0uaXNFbGVtZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc0VsZW1lbnQoZWxlbWVudCkpKSAhPSBudWxsID8gX2F3YWl0JHBsYXRmb3JtJGlzRWxlIDogdHJ1ZSkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCAoYXdhaXQgKHBsYXRmb3JtLmdldERvY3VtZW50RWxlbWVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnRzLmZsb2F0aW5nKSkpLFxuICAgIGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeSxcbiAgICBzdHJhdGVneVxuICB9KSk7XG4gIGNvbnN0IGVsZW1lbnRDbGllbnRSZWN0ID0gcmVjdFRvQ2xpZW50UmVjdChwbGF0Zm9ybS5jb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdCA/IGF3YWl0IHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0KHtcbiAgICByZWN0OiBlbGVtZW50Q29udGV4dCA9PT0gJ2Zsb2F0aW5nJyA/IHsgLi4ucmVjdHMuZmxvYXRpbmcsXG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gOiByZWN0cy5yZWZlcmVuY2UsXG4gICAgb2Zmc2V0UGFyZW50OiBhd2FpdCAocGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50ID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQoZWxlbWVudHMuZmxvYXRpbmcpKSxcbiAgICBzdHJhdGVneVxuICB9KSA6IHJlY3RzW2VsZW1lbnRDb250ZXh0XSk7XG4gIHJldHVybiB7XG4gICAgdG9wOiBjbGlwcGluZ0NsaWVudFJlY3QudG9wIC0gZWxlbWVudENsaWVudFJlY3QudG9wICsgcGFkZGluZ09iamVjdC50b3AsXG4gICAgYm90dG9tOiBlbGVtZW50Q2xpZW50UmVjdC5ib3R0b20gLSBjbGlwcGluZ0NsaWVudFJlY3QuYm90dG9tICsgcGFkZGluZ09iamVjdC5ib3R0b20sXG4gICAgbGVmdDogY2xpcHBpbmdDbGllbnRSZWN0LmxlZnQgLSBlbGVtZW50Q2xpZW50UmVjdC5sZWZ0ICsgcGFkZGluZ09iamVjdC5sZWZ0LFxuICAgIHJpZ2h0OiBlbGVtZW50Q2xpZW50UmVjdC5yaWdodCAtIGNsaXBwaW5nQ2xpZW50UmVjdC5yaWdodCArIHBhZGRpbmdPYmplY3QucmlnaHRcbiAgfTtcbn1cblxuY29uc3QgbWluID0gTWF0aC5taW47XG5jb25zdCBtYXggPSBNYXRoLm1heDtcblxuZnVuY3Rpb24gd2l0aGluKG1pbiQxLCB2YWx1ZSwgbWF4JDEpIHtcbiAgcmV0dXJuIG1heChtaW4kMSwgbWluKHZhbHVlLCBtYXgkMSkpO1xufVxuXG4vKipcbiAqIFBvc2l0aW9ucyBhbiBpbm5lciBlbGVtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHN1Y2ggdGhhdCBpdCBpcyBjZW50ZXJlZFxuICogdG8gdGhlIHJlZmVyZW5jZSBlbGVtZW50LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2Fycm93XG4gKi9cbmNvbnN0IGFycm93ID0gb3B0aW9ucyA9PiAoe1xuICBuYW1lOiAnYXJyb3cnLFxuICBvcHRpb25zLFxuXG4gIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAvLyBTaW5jZSBgZWxlbWVudGAgaXMgcmVxdWlyZWQsIHdlIGRvbid0IFBhcnRpYWw8PiB0aGUgdHlwZVxuICAgIGNvbnN0IHtcbiAgICAgIGVsZW1lbnQsXG4gICAgICBwYWRkaW5nID0gMFxuICAgIH0gPSBvcHRpb25zICE9IG51bGwgPyBvcHRpb25zIDoge307XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICBwbGFjZW1lbnQsXG4gICAgICByZWN0cyxcbiAgICAgIHBsYXRmb3JtXG4gICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG5cbiAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICB7XG4gICAgICAgIGNvbnNvbGUud2FybignRmxvYXRpbmcgVUk6IE5vIGBlbGVtZW50YCB3YXMgcGFzc2VkIHRvIHRoZSBgYXJyb3dgIG1pZGRsZXdhcmUuJyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0U2lkZU9iamVjdEZyb21QYWRkaW5nKHBhZGRpbmcpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfTtcbiAgICBjb25zdCBheGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gICAgY29uc3QgbGVuZ3RoID0gZ2V0TGVuZ3RoRnJvbUF4aXMoYXhpcyk7XG4gICAgY29uc3QgYXJyb3dEaW1lbnNpb25zID0gYXdhaXQgcGxhdGZvcm0uZ2V0RGltZW5zaW9ucyhlbGVtZW50KTtcbiAgICBjb25zdCBtaW5Qcm9wID0gYXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgY29uc3QgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICBjb25zdCBlbmREaWZmID0gcmVjdHMucmVmZXJlbmNlW2xlbmd0aF0gKyByZWN0cy5yZWZlcmVuY2VbYXhpc10gLSBjb29yZHNbYXhpc10gLSByZWN0cy5mbG9hdGluZ1tsZW5ndGhdO1xuICAgIGNvbnN0IHN0YXJ0RGlmZiA9IGNvb3Jkc1theGlzXSAtIHJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgICBjb25zdCBhcnJvd09mZnNldFBhcmVudCA9IGF3YWl0IChwbGF0Zm9ybS5nZXRPZmZzZXRQYXJlbnQgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldE9mZnNldFBhcmVudChlbGVtZW50KSk7XG4gICAgbGV0IGNsaWVudFNpemUgPSBhcnJvd09mZnNldFBhcmVudCA/IGF4aXMgPT09ICd5JyA/IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCB8fCAwIDogYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50V2lkdGggfHwgMCA6IDA7XG5cbiAgICBpZiAoY2xpZW50U2l6ZSA9PT0gMCkge1xuICAgICAgY2xpZW50U2l6ZSA9IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgfVxuXG4gICAgY29uc3QgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgZmxvYXRpbmcgZWxlbWVudCBpZiB0aGUgY2VudGVyXG4gICAgLy8gcG9pbnQgaXMgb3V0c2lkZSB0aGUgZmxvYXRpbmcgZWxlbWVudCdzIGJvdW5kc1xuXG4gICAgY29uc3QgbWluID0gcGFkZGluZ09iamVjdFttaW5Qcm9wXTtcbiAgICBjb25zdCBtYXggPSBjbGllbnRTaXplIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLSBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICAgIGNvbnN0IGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dEaW1lbnNpb25zW2xlbmd0aF0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gICAgY29uc3Qgb2Zmc2V0ID0gd2l0aGluKG1pbiwgY2VudGVyLCBtYXgpOyAvLyBNYWtlIHN1cmUgdGhhdCBhcnJvdyBwb2ludHMgYXQgdGhlIHJlZmVyZW5jZVxuXG4gICAgY29uc3QgYWxpZ25tZW50UGFkZGluZyA9IGFsaWdubWVudCA9PT0gJ3N0YXJ0JyA/IHBhZGRpbmdPYmplY3RbbWluUHJvcF0gOiBwYWRkaW5nT2JqZWN0W21heFByb3BdO1xuICAgIGNvbnN0IHNob3VsZEFkZE9mZnNldCA9IGFsaWdubWVudFBhZGRpbmcgPiAwICYmIGNlbnRlciAhPT0gb2Zmc2V0ICYmIHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdIDw9IHJlY3RzLmZsb2F0aW5nW2xlbmd0aF07XG4gICAgY29uc3QgYWxpZ25tZW50T2Zmc2V0ID0gc2hvdWxkQWRkT2Zmc2V0ID8gY2VudGVyIDwgbWluID8gbWluIC0gY2VudGVyIDogbWF4IC0gY2VudGVyIDogMDtcbiAgICByZXR1cm4ge1xuICAgICAgW2F4aXNdOiBjb29yZHNbYXhpc10gLSBhbGlnbm1lbnRPZmZzZXQsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIFtheGlzXTogb2Zmc2V0LFxuICAgICAgICBjZW50ZXJPZmZzZXQ6IGNlbnRlciAtIG9mZnNldFxuICAgICAgfVxuICAgIH07XG4gIH1cblxufSk7XG5cbmNvbnN0IGhhc2gkMSA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBtYXRjaGVkID0+IGhhc2gkMVttYXRjaGVkXSk7XG59XG5cbmZ1bmN0aW9uIGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIHJ0bCkge1xuICBpZiAocnRsID09PSB2b2lkIDApIHtcbiAgICBydGwgPSBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICBjb25zdCBsZW5ndGggPSBnZXRMZW5ndGhGcm9tQXhpcyhtYWluQXhpcyk7XG4gIGxldCBtYWluQWxpZ25tZW50U2lkZSA9IG1haW5BeGlzID09PSAneCcgPyBhbGlnbm1lbnQgPT09IChydGwgPyAnZW5kJyA6ICdzdGFydCcpID8gJ3JpZ2h0JyA6ICdsZWZ0JyA6IGFsaWdubWVudCA9PT0gJ3N0YXJ0JyA/ICdib3R0b20nIDogJ3RvcCc7XG5cbiAgaWYgKHJlY3RzLnJlZmVyZW5jZVtsZW5ndGhdID4gcmVjdHMuZmxvYXRpbmdbbGVuZ3RoXSkge1xuICAgIG1haW5BbGlnbm1lbnRTaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBtYWluOiBtYWluQWxpZ25tZW50U2lkZSxcbiAgICBjcm9zczogZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpbkFsaWdubWVudFNpZGUpXG4gIH07XG59XG5cbmNvbnN0IGhhc2ggPSB7XG4gIHN0YXJ0OiAnZW5kJyxcbiAgZW5kOiAnc3RhcnQnXG59O1xuZnVuY3Rpb24gZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQucmVwbGFjZSgvc3RhcnR8ZW5kL2csIG1hdGNoZWQgPT4gaGFzaFttYXRjaGVkXSk7XG59XG5cbmNvbnN0IHNpZGVzID0gWyd0b3AnLCAncmlnaHQnLCAnYm90dG9tJywgJ2xlZnQnXTtcbmNvbnN0IGFsbFBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovc2lkZXMucmVkdWNlKChhY2MsIHNpZGUpID0+IGFjYy5jb25jYXQoc2lkZSwgc2lkZSArIFwiLXN0YXJ0XCIsIHNpZGUgKyBcIi1lbmRcIiksIFtdKTtcblxuZnVuY3Rpb24gZ2V0UGxhY2VtZW50TGlzdChhbGlnbm1lbnQsIGF1dG9BbGlnbm1lbnQsIGFsbG93ZWRQbGFjZW1lbnRzKSB7XG4gIGNvbnN0IGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQgPSBhbGlnbm1lbnQgPyBbLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSA9PT0gYWxpZ25tZW50KSwgLi4uYWxsb3dlZFBsYWNlbWVudHMuZmlsdGVyKHBsYWNlbWVudCA9PiBnZXRBbGlnbm1lbnQocGxhY2VtZW50KSAhPT0gYWxpZ25tZW50KV0gOiBhbGxvd2VkUGxhY2VtZW50cy5maWx0ZXIocGxhY2VtZW50ID0+IGdldFNpZGUocGxhY2VtZW50KSA9PT0gcGxhY2VtZW50KTtcbiAgcmV0dXJuIGFsbG93ZWRQbGFjZW1lbnRzU29ydGVkQnlBbGlnbm1lbnQuZmlsdGVyKHBsYWNlbWVudCA9PiB7XG4gICAgaWYgKGFsaWdubWVudCkge1xuICAgICAgcmV0dXJuIGdldEFsaWdubWVudChwbGFjZW1lbnQpID09PSBhbGlnbm1lbnQgfHwgKGF1dG9BbGlnbm1lbnQgPyBnZXRPcHBvc2l0ZUFsaWdubWVudFBsYWNlbWVudChwbGFjZW1lbnQpICE9PSBwbGFjZW1lbnQgOiBmYWxzZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG4vKipcbiAqIEF1dG9tYXRpY2FsbHkgY2hvb3NlcyB0aGUgYHBsYWNlbWVudGAgd2hpY2ggaGFzIHRoZSBtb3N0IHNwYWNlIGF2YWlsYWJsZS5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9hdXRvUGxhY2VtZW50XG4gKi9cbmNvbnN0IGF1dG9QbGFjZW1lbnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnYXV0b1BsYWNlbWVudCcsXG4gICAgb3B0aW9ucyxcblxuICAgIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkYXV0b1AsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDIsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDMsIF9taWRkbGV3YXJlRGF0YSRhdXRvUDQsIF9wbGFjZW1lbnRzU29ydGVkQnlMZTtcblxuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICByZWN0cyxcbiAgICAgICAgbWlkZGxld2FyZURhdGEsXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50cztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYWxpZ25tZW50ID0gbnVsbCxcbiAgICAgICAgYWxsb3dlZFBsYWNlbWVudHMgPSBhbGxQbGFjZW1lbnRzLFxuICAgICAgICBhdXRvQWxpZ25tZW50ID0gdHJ1ZSxcbiAgICAgICAgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zXG4gICAgICB9ID0gb3B0aW9ucztcbiAgICAgIGNvbnN0IHBsYWNlbWVudHMgPSBnZXRQbGFjZW1lbnRMaXN0KGFsaWdubWVudCwgYXV0b0FsaWdubWVudCwgYWxsb3dlZFBsYWNlbWVudHMpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3QgY3VycmVudEluZGV4ID0gKF9taWRkbGV3YXJlRGF0YSRhdXRvUCA9IChfbWlkZGxld2FyZURhdGEkYXV0b1AyID0gbWlkZGxld2FyZURhdGEuYXV0b1BsYWNlbWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9taWRkbGV3YXJlRGF0YSRhdXRvUDIuaW5kZXgpICE9IG51bGwgPyBfbWlkZGxld2FyZURhdGEkYXV0b1AgOiAwO1xuICAgICAgY29uc3QgY3VycmVudFBsYWNlbWVudCA9IHBsYWNlbWVudHNbY3VycmVudEluZGV4XTtcblxuICAgICAgaWYgKGN1cnJlbnRQbGFjZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbixcbiAgICAgICAgY3Jvc3NcbiAgICAgIH0gPSBnZXRBbGlnbm1lbnRTaWRlcyhjdXJyZW50UGxhY2VtZW50LCByZWN0cywgYXdhaXQgKHBsYXRmb3JtLmlzUlRMID09IG51bGwgPyB2b2lkIDAgOiBwbGF0Zm9ybS5pc1JUTChlbGVtZW50cy5mbG9hdGluZykpKTsgLy8gTWFrZSBgY29tcHV0ZUNvb3Jkc2Agc3RhcnQgZnJvbSB0aGUgcmlnaHQgcGxhY2VcblxuICAgICAgaWYgKHBsYWNlbWVudCAhPT0gY3VycmVudFBsYWNlbWVudCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHgsXG4gICAgICAgICAgeSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnRzWzBdXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjdXJyZW50T3ZlcmZsb3dzID0gW292ZXJmbG93W2dldFNpZGUoY3VycmVudFBsYWNlbWVudCldLCBvdmVyZmxvd1ttYWluXSwgb3ZlcmZsb3dbY3Jvc3NdXTtcbiAgICAgIGNvbnN0IGFsbE92ZXJmbG93cyA9IFsuLi4oKF9taWRkbGV3YXJlRGF0YSRhdXRvUDMgPSAoX21pZGRsZXdhcmVEYXRhJGF1dG9QNCA9IG1pZGRsZXdhcmVEYXRhLmF1dG9QbGFjZW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkYXV0b1A0Lm92ZXJmbG93cykgIT0gbnVsbCA/IF9taWRkbGV3YXJlRGF0YSRhdXRvUDMgOiBbXSksIHtcbiAgICAgICAgcGxhY2VtZW50OiBjdXJyZW50UGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3M6IGN1cnJlbnRPdmVyZmxvd3NcbiAgICAgIH1dO1xuICAgICAgY29uc3QgbmV4dFBsYWNlbWVudCA9IHBsYWNlbWVudHNbY3VycmVudEluZGV4ICsgMV07IC8vIFRoZXJlIGFyZSBtb3JlIHBsYWNlbWVudHMgdG8gY2hlY2tcblxuICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwbGFjZW1lbnRzU29ydGVkQnlMZWFzdE92ZXJmbG93ID0gYWxsT3ZlcmZsb3dzLnNsaWNlKCkuc29ydCgoYSwgYikgPT4gYS5vdmVyZmxvd3NbMF0gLSBiLm92ZXJmbG93c1swXSk7XG4gICAgICBjb25zdCBwbGFjZW1lbnRUaGF0Rml0c09uQWxsU2lkZXMgPSAoX3BsYWNlbWVudHNTb3J0ZWRCeUxlID0gcGxhY2VtZW50c1NvcnRlZEJ5TGVhc3RPdmVyZmxvdy5maW5kKF9yZWYgPT4ge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIG92ZXJmbG93c1xuICAgICAgICB9ID0gX3JlZjtcbiAgICAgICAgcmV0dXJuIG92ZXJmbG93cy5ldmVyeShvdmVyZmxvdyA9PiBvdmVyZmxvdyA8PSAwKTtcbiAgICAgIH0pKSA9PSBudWxsID8gdm9pZCAwIDogX3BsYWNlbWVudHNTb3J0ZWRCeUxlLnBsYWNlbWVudDtcbiAgICAgIGNvbnN0IHJlc2V0UGxhY2VtZW50ID0gcGxhY2VtZW50VGhhdEZpdHNPbkFsbFNpZGVzICE9IG51bGwgPyBwbGFjZW1lbnRUaGF0Rml0c09uQWxsU2lkZXMgOiBwbGFjZW1lbnRzU29ydGVkQnlMZWFzdE92ZXJmbG93WzBdLnBsYWNlbWVudDtcblxuICAgICAgaWYgKHJlc2V0UGxhY2VtZW50ICE9PSBwbGFjZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBpbmRleDogY3VycmVudEluZGV4ICsgMSxcbiAgICAgICAgICAgIG92ZXJmbG93czogYWxsT3ZlcmZsb3dzXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNldDoge1xuICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRQbGFjZW1lbnRzKHBsYWNlbWVudCkge1xuICBjb25zdCBvcHBvc2l0ZVBsYWNlbWVudCA9IGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCk7XG4gIHJldHVybiBbZ2V0T3Bwb3NpdGVBbGlnbm1lbnRQbGFjZW1lbnQocGxhY2VtZW50KSwgb3Bwb3NpdGVQbGFjZW1lbnQsIGdldE9wcG9zaXRlQWxpZ25tZW50UGxhY2VtZW50KG9wcG9zaXRlUGxhY2VtZW50KV07XG59XG5cbi8qKlxuICogQ2hhbmdlcyB0aGUgcGxhY2VtZW50IG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHRvIG9uZSB0aGF0IHdpbGwgZml0IGlmIHRoZVxuICogaW5pdGlhbGx5IHNwZWNpZmllZCBgcGxhY2VtZW50YCBkb2VzIG5vdC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9mbGlwXG4gKi9cbmNvbnN0IGZsaXAgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnZmxpcCcsXG4gICAgb3B0aW9ucyxcblxuICAgIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAgIHZhciBfbWlkZGxld2FyZURhdGEkZmxpcDtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgaW5pdGlhbFBsYWNlbWVudCxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIGVsZW1lbnRzXG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50cztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZSxcbiAgICAgICAgZmFsbGJhY2tQbGFjZW1lbnRzOiBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICAgIGZhbGxiYWNrU3RyYXRlZ3kgPSAnYmVzdEZpdCcsXG4gICAgICAgIGZsaXBBbGlnbm1lbnQgPSB0cnVlLFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGlzQmFzZVBsYWNlbWVudCA9IHNpZGUgPT09IGluaXRpYWxQbGFjZW1lbnQ7XG4gICAgICBjb25zdCBmYWxsYmFja1BsYWNlbWVudHMgPSBzcGVjaWZpZWRGYWxsYmFja1BsYWNlbWVudHMgfHwgKGlzQmFzZVBsYWNlbWVudCB8fCAhZmxpcEFsaWdubWVudCA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChpbml0aWFsUGxhY2VtZW50KV0gOiBnZXRFeHBhbmRlZFBsYWNlbWVudHMoaW5pdGlhbFBsYWNlbWVudCkpO1xuICAgICAgY29uc3QgcGxhY2VtZW50cyA9IFtpbml0aWFsUGxhY2VtZW50LCAuLi5mYWxsYmFja1BsYWNlbWVudHNdO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgb3ZlcmZsb3dzID0gW107XG4gICAgICBsZXQgb3ZlcmZsb3dzRGF0YSA9ICgoX21pZGRsZXdhcmVEYXRhJGZsaXAgPSBtaWRkbGV3YXJlRGF0YS5mbGlwKSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJGZsaXAub3ZlcmZsb3dzKSB8fCBbXTtcblxuICAgICAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICAgICAgb3ZlcmZsb3dzLnB1c2gob3ZlcmZsb3dbc2lkZV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIG1haW4sXG4gICAgICAgICAgY3Jvc3NcbiAgICAgICAgfSA9IGdldEFsaWdubWVudFNpZGVzKHBsYWNlbWVudCwgcmVjdHMsIGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKSk7XG4gICAgICAgIG92ZXJmbG93cy5wdXNoKG92ZXJmbG93W21haW5dLCBvdmVyZmxvd1tjcm9zc10pO1xuICAgICAgfVxuXG4gICAgICBvdmVyZmxvd3NEYXRhID0gWy4uLm92ZXJmbG93c0RhdGEsIHtcbiAgICAgICAgcGxhY2VtZW50LFxuICAgICAgICBvdmVyZmxvd3NcbiAgICAgIH1dOyAvLyBPbmUgb3IgbW9yZSBzaWRlcyBpcyBvdmVyZmxvd2luZ1xuXG4gICAgICBpZiAoIW92ZXJmbG93cy5ldmVyeShzaWRlID0+IHNpZGUgPD0gMCkpIHtcbiAgICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRmbGlwJCwgX21pZGRsZXdhcmVEYXRhJGZsaXAyO1xuXG4gICAgICAgIGNvbnN0IG5leHRJbmRleCA9ICgoX21pZGRsZXdhcmVEYXRhJGZsaXAkID0gKF9taWRkbGV3YXJlRGF0YSRmbGlwMiA9IG1pZGRsZXdhcmVEYXRhLmZsaXApID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkZmxpcDIuaW5kZXgpICE9IG51bGwgPyBfbWlkZGxld2FyZURhdGEkZmxpcCQgOiAwKSArIDE7XG4gICAgICAgIGNvbnN0IG5leHRQbGFjZW1lbnQgPSBwbGFjZW1lbnRzW25leHRJbmRleF07XG5cbiAgICAgICAgaWYgKG5leHRQbGFjZW1lbnQpIHtcbiAgICAgICAgICAvLyBUcnkgbmV4dCBwbGFjZW1lbnQgYW5kIHJlLXJ1biB0aGUgbGlmZWN5Y2xlXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgaW5kZXg6IG5leHRJbmRleCxcbiAgICAgICAgICAgICAgb3ZlcmZsb3dzOiBvdmVyZmxvd3NEYXRhXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiBuZXh0UGxhY2VtZW50XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNldFBsYWNlbWVudCA9ICdib3R0b20nO1xuXG4gICAgICAgIHN3aXRjaCAoZmFsbGJhY2tTdHJhdGVneSkge1xuICAgICAgICAgIGNhc2UgJ2Jlc3RGaXQnOlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB2YXIgX292ZXJmbG93c0RhdGEkbWFwJHNvO1xuXG4gICAgICAgICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IChfb3ZlcmZsb3dzRGF0YSRtYXAkc28gPSBvdmVyZmxvd3NEYXRhLm1hcChkID0+IFtkLCBkLm92ZXJmbG93cy5maWx0ZXIob3ZlcmZsb3cgPT4gb3ZlcmZsb3cgPiAwKS5yZWR1Y2UoKGFjYywgb3ZlcmZsb3cpID0+IGFjYyArIG92ZXJmbG93LCAwKV0pLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKVswXSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9vdmVyZmxvd3NEYXRhJG1hcCRzb1swXS5wbGFjZW1lbnQ7XG5cbiAgICAgICAgICAgICAgaWYgKHBsYWNlbWVudCkge1xuICAgICAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICBjYXNlICdpbml0aWFsUGxhY2VtZW50JzpcbiAgICAgICAgICAgIHJlc2V0UGxhY2VtZW50ID0gaW5pdGlhbFBsYWNlbWVudDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBsYWNlbWVudCAhPT0gcmVzZXRQbGFjZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgICAgcGxhY2VtZW50OiByZXNldFBsYWNlbWVudFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICB9O1xufTtcblxuZnVuY3Rpb24gZ2V0U2lkZU9mZnNldHMob3ZlcmZsb3csIHJlY3QpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIHNpZGVzLnNvbWUoc2lkZSA9PiBvdmVyZmxvd1tzaWRlXSA+PSAwKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBkYXRhIHRvIGhpZGUgdGhlIGZsb2F0aW5nIGVsZW1lbnQgaW4gYXBwbGljYWJsZSBzaXR1YXRpb25zLCBzdWNoIGFzXG4gKiB3aGVuIGl0IGlzIG5vdCBpbiB0aGUgc2FtZSBjbGlwcGluZyBjb250ZXh0IGFzIHRoZSByZWZlcmVuY2UgZWxlbWVudC5cbiAqIEBzZWUgaHR0cHM6Ly9mbG9hdGluZy11aS5jb20vZG9jcy9oaWRlXG4gKi9cbmNvbnN0IGhpZGUgPSBmdW5jdGlvbiAoX3RlbXApIHtcbiAgbGV0IHtcbiAgICBzdHJhdGVneSA9ICdyZWZlcmVuY2VIaWRkZW4nLFxuICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICB9ID0gX3RlbXAgPT09IHZvaWQgMCA/IHt9IDogX3RlbXA7XG4gIHJldHVybiB7XG4gICAgbmFtZTogJ2hpZGUnLFxuXG4gICAgYXN5bmMgZm4obWlkZGxld2FyZUFyZ3VtZW50cykge1xuICAgICAgY29uc3Qge1xuICAgICAgICByZWN0c1xuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG5cbiAgICAgIHN3aXRjaCAoc3RyYXRlZ3kpIHtcbiAgICAgICAgY2FzZSAncmVmZXJlbmNlSGlkZGVuJzpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KG1pZGRsZXdhcmVBcmd1bWVudHMsIHsgLi4uZGV0ZWN0T3ZlcmZsb3dPcHRpb25zLFxuICAgICAgICAgICAgICBlbGVtZW50Q29udGV4dDogJ3JlZmVyZW5jZSdcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5yZWZlcmVuY2UpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZUhpZGRlbk9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlSGlkZGVuOiBpc0FueVNpZGVGdWxseUNsaXBwZWQob2Zmc2V0cylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXNjYXBlZCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCB7IC4uLmRldGVjdE92ZXJmbG93T3B0aW9ucyxcbiAgICAgICAgICAgICAgYWx0Qm91bmRhcnk6IHRydWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3Qgb2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0cy5mbG9hdGluZyk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZXNjYXBlZE9mZnNldHM6IG9mZnNldHMsXG4gICAgICAgICAgICAgICAgZXNjYXBlZDogaXNBbnlTaWRlRnVsbHlDbGlwcGVkKG9mZnNldHMpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgfTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnRWYWx1ZVRvQ29vcmRzKG1pZGRsZXdhcmVBcmd1bWVudHMsIHZhbHVlKSB7XG4gIGNvbnN0IHtcbiAgICBwbGFjZW1lbnQsXG4gICAgcGxhdGZvcm0sXG4gICAgZWxlbWVudHNcbiAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gIGNvbnN0IHJ0bCA9IGF3YWl0IChwbGF0Zm9ybS5pc1JUTCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uaXNSVEwoZWxlbWVudHMuZmxvYXRpbmcpKTtcbiAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgY29uc3QgYWxpZ25tZW50ID0gZ2V0QWxpZ25tZW50KHBsYWNlbWVudCk7XG4gIGNvbnN0IGlzVmVydGljYWwgPSBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSA9PT0gJ3gnO1xuICBjb25zdCBtYWluQXhpc011bHRpID0gWydsZWZ0JywgJ3RvcCddLmluY2x1ZGVzKHNpZGUpID8gLTEgOiAxO1xuICBjb25zdCBjcm9zc0F4aXNNdWx0aSA9IHJ0bCAmJiBpc1ZlcnRpY2FsID8gLTEgOiAxO1xuICBjb25zdCByYXdWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IHZhbHVlKG1pZGRsZXdhcmVBcmd1bWVudHMpIDogdmFsdWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3RcblxuICBsZXQge1xuICAgIG1haW5BeGlzLFxuICAgIGNyb3NzQXhpcyxcbiAgICBhbGlnbm1lbnRBeGlzXG4gIH0gPSB0eXBlb2YgcmF3VmFsdWUgPT09ICdudW1iZXInID8ge1xuICAgIG1haW5BeGlzOiByYXdWYWx1ZSxcbiAgICBjcm9zc0F4aXM6IDAsXG4gICAgYWxpZ25tZW50QXhpczogbnVsbFxuICB9IDoge1xuICAgIG1haW5BeGlzOiAwLFxuICAgIGNyb3NzQXhpczogMCxcbiAgICBhbGlnbm1lbnRBeGlzOiBudWxsLFxuICAgIC4uLnJhd1ZhbHVlXG4gIH07XG5cbiAgaWYgKGFsaWdubWVudCAmJiB0eXBlb2YgYWxpZ25tZW50QXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICBjcm9zc0F4aXMgPSBhbGlnbm1lbnQgPT09ICdlbmQnID8gYWxpZ25tZW50QXhpcyAqIC0xIDogYWxpZ25tZW50QXhpcztcbiAgfVxuXG4gIHJldHVybiBpc1ZlcnRpY2FsID8ge1xuICAgIHg6IGNyb3NzQXhpcyAqIGNyb3NzQXhpc011bHRpLFxuICAgIHk6IG1haW5BeGlzICogbWFpbkF4aXNNdWx0aVxuICB9IDoge1xuICAgIHg6IG1haW5BeGlzICogbWFpbkF4aXNNdWx0aSxcbiAgICB5OiBjcm9zc0F4aXMgKiBjcm9zc0F4aXNNdWx0aVxuICB9O1xufVxuLyoqXG4gKiBEaXNwbGFjZXMgdGhlIGZsb2F0aW5nIGVsZW1lbnQgZnJvbSBpdHMgcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvb2Zmc2V0XG4gKi9cblxuY29uc3Qgb2Zmc2V0ID0gZnVuY3Rpb24gKHZhbHVlKSB7XG4gIGlmICh2YWx1ZSA9PT0gdm9pZCAwKSB7XG4gICAgdmFsdWUgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnb2Zmc2V0JyxcbiAgICBvcHRpb25zOiB2YWx1ZSxcblxuICAgIGFzeW5jIGZuKG1pZGRsZXdhcmVBcmd1bWVudHMpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gICAgICBjb25zdCBkaWZmQ29vcmRzID0gYXdhaXQgY29udmVydFZhbHVlVG9Db29yZHMobWlkZGxld2FyZUFyZ3VtZW50cywgdmFsdWUpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeDogeCArIGRpZmZDb29yZHMueCxcbiAgICAgICAgeTogeSArIGRpZmZDb29yZHMueSxcbiAgICAgICAgZGF0YTogZGlmZkNvb3Jkc1xuICAgICAgfTtcbiAgICB9XG5cbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGdldENyb3NzQXhpcyhheGlzKSB7XG4gIHJldHVybiBheGlzID09PSAneCcgPyAneScgOiAneCc7XG59XG5cbi8qKlxuICogU2hpZnRzIHRoZSBmbG9hdGluZyBlbGVtZW50IGluIG9yZGVyIHRvIGtlZXAgaXQgaW4gdmlldyB3aGVuIGl0IHdpbGwgb3ZlcmZsb3dcbiAqIGEgY2xpcHBpbmcgYm91bmRhcnkuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2hpZnRcbiAqL1xuY29uc3Qgc2hpZnQgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnc2hpZnQnLFxuICAgIG9wdGlvbnMsXG5cbiAgICBhc3luYyBmbihtaWRkbGV3YXJlQXJndW1lbnRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudFxuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIG1haW5BeGlzOiBjaGVja01haW5BeGlzID0gdHJ1ZSxcbiAgICAgICAgY3Jvc3NBeGlzOiBjaGVja0Nyb3NzQXhpcyA9IGZhbHNlLFxuICAgICAgICBsaW1pdGVyID0ge1xuICAgICAgICAgIGZuOiBfcmVmID0+IHtcbiAgICAgICAgICAgIGxldCB7XG4gICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgIHlcbiAgICAgICAgICAgIH0gPSBfcmVmO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgeCxcbiAgICAgICAgICAgICAgeVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIC4uLmRldGVjdE92ZXJmbG93T3B0aW9uc1xuICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBvdmVyZmxvdyA9IGF3YWl0IGRldGVjdE92ZXJmbG93KG1pZGRsZXdhcmVBcmd1bWVudHMsIGRldGVjdE92ZXJmbG93T3B0aW9ucyk7XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChnZXRTaWRlKHBsYWNlbWVudCkpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0Q3Jvc3NBeGlzKG1haW5BeGlzKTtcbiAgICAgIGxldCBtYWluQXhpc0Nvb3JkID0gY29vcmRzW21haW5BeGlzXTtcbiAgICAgIGxldCBjcm9zc0F4aXNDb29yZCA9IGNvb3Jkc1tjcm9zc0F4aXNdO1xuXG4gICAgICBpZiAoY2hlY2tNYWluQXhpcykge1xuICAgICAgICBjb25zdCBtaW5TaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/ICd0b3AnIDogJ2xlZnQnO1xuICAgICAgICBjb25zdCBtYXhTaWRlID0gbWFpbkF4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICAgICAgY29uc3QgbWluID0gbWFpbkF4aXNDb29yZCArIG92ZXJmbG93W21pblNpZGVdO1xuICAgICAgICBjb25zdCBtYXggPSBtYWluQXhpc0Nvb3JkIC0gb3ZlcmZsb3dbbWF4U2lkZV07XG4gICAgICAgIG1haW5BeGlzQ29vcmQgPSB3aXRoaW4obWluLCBtYWluQXhpc0Nvb3JkLCBtYXgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgY29uc3QgbWluU2lkZSA9IGNyb3NzQXhpcyA9PT0gJ3knID8gJ3RvcCcgOiAnbGVmdCc7XG4gICAgICAgIGNvbnN0IG1heFNpZGUgPSBjcm9zc0F4aXMgPT09ICd5JyA/ICdib3R0b20nIDogJ3JpZ2h0JztcbiAgICAgICAgY29uc3QgbWluID0gY3Jvc3NBeGlzQ29vcmQgKyBvdmVyZmxvd1ttaW5TaWRlXTtcbiAgICAgICAgY29uc3QgbWF4ID0gY3Jvc3NBeGlzQ29vcmQgLSBvdmVyZmxvd1ttYXhTaWRlXTtcbiAgICAgICAgY3Jvc3NBeGlzQ29vcmQgPSB3aXRoaW4obWluLCBjcm9zc0F4aXNDb29yZCwgbWF4KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGltaXRlZENvb3JkcyA9IGxpbWl0ZXIuZm4oeyAuLi5taWRkbGV3YXJlQXJndW1lbnRzLFxuICAgICAgICBbbWFpbkF4aXNdOiBtYWluQXhpc0Nvb3JkLFxuICAgICAgICBbY3Jvc3NBeGlzXTogY3Jvc3NBeGlzQ29vcmRcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgLi4ubGltaXRlZENvb3JkcyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgIHg6IGxpbWl0ZWRDb29yZHMueCAtIHgsXG4gICAgICAgICAgeTogbGltaXRlZENvb3Jkcy55IC0geVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICB9O1xufTtcblxuLyoqXG4gKiBCdWlsdC1pbiBgbGltaXRlcmAgdGhhdCB3aWxsIHN0b3AgYHNoaWZ0KClgIGF0IGEgY2VydGFpbiBwb2ludC5cbiAqL1xuY29uc3QgbGltaXRTaGlmdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIG9wdGlvbnMsXG5cbiAgICBmbihtaWRkbGV3YXJlQXJndW1lbnRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIG1pZGRsZXdhcmVEYXRhXG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50cztcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgb2Zmc2V0ID0gMCxcbiAgICAgICAgbWFpbkF4aXM6IGNoZWNrTWFpbkF4aXMgPSB0cnVlLFxuICAgICAgICBjcm9zc0F4aXM6IGNoZWNrQ3Jvc3NBeGlzID0gdHJ1ZVxuICAgICAgfSA9IG9wdGlvbnM7XG4gICAgICBjb25zdCBjb29yZHMgPSB7XG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH07XG4gICAgICBjb25zdCBtYWluQXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICAgICAgY29uc3QgY3Jvc3NBeGlzID0gZ2V0Q3Jvc3NBeGlzKG1haW5BeGlzKTtcbiAgICAgIGxldCBtYWluQXhpc0Nvb3JkID0gY29vcmRzW21haW5BeGlzXTtcbiAgICAgIGxldCBjcm9zc0F4aXNDb29yZCA9IGNvb3Jkc1tjcm9zc0F4aXNdO1xuICAgICAgY29uc3QgcmF3T2Zmc2V0ID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldCh7IC4uLnJlY3RzLFxuICAgICAgICBwbGFjZW1lbnRcbiAgICAgIH0pIDogb2Zmc2V0O1xuICAgICAgY29uc3QgY29tcHV0ZWRPZmZzZXQgPSB0eXBlb2YgcmF3T2Zmc2V0ID09PSAnbnVtYmVyJyA/IHtcbiAgICAgICAgbWFpbkF4aXM6IHJhd09mZnNldCxcbiAgICAgICAgY3Jvc3NBeGlzOiAwXG4gICAgICB9IDoge1xuICAgICAgICBtYWluQXhpczogMCxcbiAgICAgICAgY3Jvc3NBeGlzOiAwLFxuICAgICAgICAuLi5yYXdPZmZzZXRcbiAgICAgIH07XG5cbiAgICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICAgIGNvbnN0IGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG4gICAgICAgIGNvbnN0IGxpbWl0TWluID0gcmVjdHMucmVmZXJlbmNlW21haW5BeGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbl0gKyBjb21wdXRlZE9mZnNldC5tYWluQXhpcztcbiAgICAgICAgY29uc3QgbGltaXRNYXggPSByZWN0cy5yZWZlcmVuY2VbbWFpbkF4aXNdICsgcmVjdHMucmVmZXJlbmNlW2xlbl0gLSBjb21wdXRlZE9mZnNldC5tYWluQXhpcztcblxuICAgICAgICBpZiAobWFpbkF4aXNDb29yZCA8IGxpbWl0TWluKSB7XG4gICAgICAgICAgbWFpbkF4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKG1haW5BeGlzQ29vcmQgPiBsaW1pdE1heCkge1xuICAgICAgICAgIG1haW5BeGlzQ29vcmQgPSBsaW1pdE1heDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoY2hlY2tDcm9zc0F4aXMpIHtcbiAgICAgICAgdmFyIF9taWRkbGV3YXJlRGF0YSRvZmZzZSwgX21pZGRsZXdhcmVEYXRhJG9mZnNlMiwgX21pZGRsZXdhcmVEYXRhJG9mZnNlMywgX21pZGRsZXdhcmVEYXRhJG9mZnNlNDtcblxuICAgICAgICBjb25zdCBsZW4gPSBtYWluQXhpcyA9PT0gJ3knID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgICAgICBjb25zdCBpc09yaWdpblNpZGUgPSBbJ3RvcCcsICdsZWZ0J10uaW5jbHVkZXMoZ2V0U2lkZShwbGFjZW1lbnQpKTtcbiAgICAgICAgY29uc3QgbGltaXRNaW4gPSByZWN0cy5yZWZlcmVuY2VbY3Jvc3NBeGlzXSAtIHJlY3RzLmZsb2F0aW5nW2xlbl0gKyAoaXNPcmlnaW5TaWRlID8gKF9taWRkbGV3YXJlRGF0YSRvZmZzZSA9IChfbWlkZGxld2FyZURhdGEkb2Zmc2UyID0gbWlkZGxld2FyZURhdGEub2Zmc2V0KSA9PSBudWxsID8gdm9pZCAwIDogX21pZGRsZXdhcmVEYXRhJG9mZnNlMltjcm9zc0F4aXNdKSAhPSBudWxsID8gX21pZGRsZXdhcmVEYXRhJG9mZnNlIDogMCA6IDApICsgKGlzT3JpZ2luU2lkZSA/IDAgOiBjb21wdXRlZE9mZnNldC5jcm9zc0F4aXMpO1xuICAgICAgICBjb25zdCBsaW1pdE1heCA9IHJlY3RzLnJlZmVyZW5jZVtjcm9zc0F4aXNdICsgcmVjdHMucmVmZXJlbmNlW2xlbl0gKyAoaXNPcmlnaW5TaWRlID8gMCA6IChfbWlkZGxld2FyZURhdGEkb2Zmc2UzID0gKF9taWRkbGV3YXJlRGF0YSRvZmZzZTQgPSBtaWRkbGV3YXJlRGF0YS5vZmZzZXQpID09IG51bGwgPyB2b2lkIDAgOiBfbWlkZGxld2FyZURhdGEkb2Zmc2U0W2Nyb3NzQXhpc10pICE9IG51bGwgPyBfbWlkZGxld2FyZURhdGEkb2Zmc2UzIDogMCkgLSAoaXNPcmlnaW5TaWRlID8gY29tcHV0ZWRPZmZzZXQuY3Jvc3NBeGlzIDogMCk7XG5cbiAgICAgICAgaWYgKGNyb3NzQXhpc0Nvb3JkIDwgbGltaXRNaW4pIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWluO1xuICAgICAgICB9IGVsc2UgaWYgKGNyb3NzQXhpc0Nvb3JkID4gbGltaXRNYXgpIHtcbiAgICAgICAgICBjcm9zc0F4aXNDb29yZCA9IGxpbWl0TWF4O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIFttYWluQXhpc106IG1haW5BeGlzQ29vcmQsXG4gICAgICAgIFtjcm9zc0F4aXNdOiBjcm9zc0F4aXNDb29yZFxuICAgICAgfTtcbiAgICB9XG5cbiAgfTtcbn07XG5cbi8qKlxuICogUHJvdmlkZXMgZGF0YSB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIGVsZW1lbnQuIEZvciBpbnN0YW5jZSxcbiAqIHByZXZlbnQgaXQgZnJvbSBvdmVyZmxvd2luZyBpdHMgY2xpcHBpbmcgYm91bmRhcnkgb3IgbWF0Y2ggdGhlIHdpZHRoIG9mIHRoZVxuICogcmVmZXJlbmNlIGVsZW1lbnQuXG4gKiBAc2VlIGh0dHBzOi8vZmxvYXRpbmctdWkuY29tL2RvY3Mvc2l6ZVxuICovXG5jb25zdCBzaXplID0gZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgbmFtZTogJ3NpemUnLFxuICAgIG9wdGlvbnMsXG5cbiAgICBhc3luYyBmbihtaWRkbGV3YXJlQXJndW1lbnRzKSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBsYWNlbWVudCxcbiAgICAgICAgcmVjdHMsXG4gICAgICAgIHBsYXRmb3JtLFxuICAgICAgICBlbGVtZW50c1xuICAgICAgfSA9IG1pZGRsZXdhcmVBcmd1bWVudHM7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGFwcGx5LFxuICAgICAgICAuLi5kZXRlY3RPdmVyZmxvd09wdGlvbnNcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3Qgb3ZlcmZsb3cgPSBhd2FpdCBkZXRlY3RPdmVyZmxvdyhtaWRkbGV3YXJlQXJndW1lbnRzLCBkZXRlY3RPdmVyZmxvd09wdGlvbnMpO1xuICAgICAgY29uc3Qgc2lkZSA9IGdldFNpZGUocGxhY2VtZW50KTtcbiAgICAgIGNvbnN0IGFsaWdubWVudCA9IGdldEFsaWdubWVudChwbGFjZW1lbnQpO1xuICAgICAgbGV0IGhlaWdodFNpZGU7XG4gICAgICBsZXQgd2lkdGhTaWRlO1xuXG4gICAgICBpZiAoc2lkZSA9PT0gJ3RvcCcgfHwgc2lkZSA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgaGVpZ2h0U2lkZSA9IHNpZGU7XG4gICAgICAgIHdpZHRoU2lkZSA9IGFsaWdubWVudCA9PT0gKChhd2FpdCAocGxhdGZvcm0uaXNSVEwgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmlzUlRMKGVsZW1lbnRzLmZsb2F0aW5nKSkpID8gJ3N0YXJ0JyA6ICdlbmQnKSA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aWR0aFNpZGUgPSBzaWRlO1xuICAgICAgICBoZWlnaHRTaWRlID0gYWxpZ25tZW50ID09PSAnZW5kJyA/ICd0b3AnIDogJ2JvdHRvbSc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHhNaW4gPSBtYXgob3ZlcmZsb3cubGVmdCwgMCk7XG4gICAgICBjb25zdCB4TWF4ID0gbWF4KG92ZXJmbG93LnJpZ2h0LCAwKTtcbiAgICAgIGNvbnN0IHlNaW4gPSBtYXgob3ZlcmZsb3cudG9wLCAwKTtcbiAgICAgIGNvbnN0IHlNYXggPSBtYXgob3ZlcmZsb3cuYm90dG9tLCAwKTtcbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB7XG4gICAgICAgIGF2YWlsYWJsZUhlaWdodDogcmVjdHMuZmxvYXRpbmcuaGVpZ2h0IC0gKFsnbGVmdCcsICdyaWdodCddLmluY2x1ZGVzKHBsYWNlbWVudCkgPyAyICogKHlNaW4gIT09IDAgfHwgeU1heCAhPT0gMCA/IHlNaW4gKyB5TWF4IDogbWF4KG92ZXJmbG93LnRvcCwgb3ZlcmZsb3cuYm90dG9tKSkgOiBvdmVyZmxvd1toZWlnaHRTaWRlXSksXG4gICAgICAgIGF2YWlsYWJsZVdpZHRoOiByZWN0cy5mbG9hdGluZy53aWR0aCAtIChbJ3RvcCcsICdib3R0b20nXS5pbmNsdWRlcyhwbGFjZW1lbnQpID8gMiAqICh4TWluICE9PSAwIHx8IHhNYXggIT09IDAgPyB4TWluICsgeE1heCA6IG1heChvdmVyZmxvdy5sZWZ0LCBvdmVyZmxvdy5yaWdodCkpIDogb3ZlcmZsb3dbd2lkdGhTaWRlXSlcbiAgICAgIH07XG4gICAgICBjb25zdCBwcmV2RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudHMuZmxvYXRpbmcpO1xuICAgICAgYXBwbHkgPT0gbnVsbCA/IHZvaWQgMCA6IGFwcGx5KHsgLi4ubWlkZGxld2FyZUFyZ3VtZW50cyxcbiAgICAgICAgLi4uZGltZW5zaW9uc1xuICAgICAgfSk7XG4gICAgICBjb25zdCBuZXh0RGltZW5zaW9ucyA9IGF3YWl0IHBsYXRmb3JtLmdldERpbWVuc2lvbnMoZWxlbWVudHMuZmxvYXRpbmcpO1xuXG4gICAgICBpZiAocHJldkRpbWVuc2lvbnMud2lkdGggIT09IG5leHREaW1lbnNpb25zLndpZHRoIHx8IHByZXZEaW1lbnNpb25zLmhlaWdodCAhPT0gbmV4dERpbWVuc2lvbnMuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiB0cnVlXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gIH07XG59O1xuXG4vKipcbiAqIFByb3ZpZGVzIGltcHJvdmVkIHBvc2l0aW9uaW5nIGZvciBpbmxpbmUgcmVmZXJlbmNlIGVsZW1lbnRzIHRoYXQgY2FuIHNwYW5cbiAqIG92ZXIgbXVsdGlwbGUgbGluZXMsIHN1Y2ggYXMgaHlwZXJsaW5rcyBvciByYW5nZSBzZWxlY3Rpb25zLlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2lubGluZVxuICovXG5jb25zdCBpbmxpbmUgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAnaW5saW5lJyxcbiAgICBvcHRpb25zLFxuXG4gICAgYXN5bmMgZm4obWlkZGxld2FyZUFyZ3VtZW50cykge1xuICAgICAgdmFyIF9hd2FpdCRwbGF0Zm9ybSRnZXRDbDtcblxuICAgICAgY29uc3Qge1xuICAgICAgICBwbGFjZW1lbnQsXG4gICAgICAgIGVsZW1lbnRzLFxuICAgICAgICByZWN0cyxcbiAgICAgICAgcGxhdGZvcm0sXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9ID0gbWlkZGxld2FyZUFyZ3VtZW50czsgLy8gQSBNb3VzZUV2ZW50J3MgY2xpZW50e1gsWX0gY29vcmRzIGNhbiBiZSB1cCB0byAyIHBpeGVscyBvZmYgYVxuICAgICAgLy8gQ2xpZW50UmVjdCdzIGJvdW5kcywgZGVzcGl0ZSB0aGUgZXZlbnQgbGlzdGVuZXIgYmVpbmcgdHJpZ2dlcmVkLiBBXG4gICAgICAvLyBwYWRkaW5nIG9mIDIgc2VlbXMgdG8gaGFuZGxlIHRoaXMgaXNzdWUuXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgcGFkZGluZyA9IDIsXG4gICAgICAgIHgsXG4gICAgICAgIHlcbiAgICAgIH0gPSBvcHRpb25zO1xuICAgICAgY29uc3QgZmFsbGJhY2sgPSByZWN0VG9DbGllbnRSZWN0KHBsYXRmb3JtLmNvbnZlcnRPZmZzZXRQYXJlbnRSZWxhdGl2ZVJlY3RUb1ZpZXdwb3J0UmVsYXRpdmVSZWN0ID8gYXdhaXQgcGxhdGZvcm0uY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3Qoe1xuICAgICAgICByZWN0OiByZWN0cy5yZWZlcmVuY2UsXG4gICAgICAgIG9mZnNldFBhcmVudDogYXdhaXQgKHBsYXRmb3JtLmdldE9mZnNldFBhcmVudCA9PSBudWxsID8gdm9pZCAwIDogcGxhdGZvcm0uZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnRzLmZsb2F0aW5nKSksXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9KSA6IHJlY3RzLnJlZmVyZW5jZSk7XG4gICAgICBjb25zdCBjbGllbnRSZWN0cyA9IChfYXdhaXQkcGxhdGZvcm0kZ2V0Q2wgPSBhd2FpdCAocGxhdGZvcm0uZ2V0Q2xpZW50UmVjdHMgPT0gbnVsbCA/IHZvaWQgMCA6IHBsYXRmb3JtLmdldENsaWVudFJlY3RzKGVsZW1lbnRzLnJlZmVyZW5jZSkpKSAhPSBudWxsID8gX2F3YWl0JHBsYXRmb3JtJGdldENsIDogW107XG4gICAgICBjb25zdCBwYWRkaW5nT2JqZWN0ID0gZ2V0U2lkZU9iamVjdEZyb21QYWRkaW5nKHBhZGRpbmcpO1xuXG4gICAgICBmdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIGFyZSB0d28gcmVjdHMgYW5kIHRoZXkgYXJlIGRpc2pvaW5lZFxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID09PSAyICYmIGNsaWVudFJlY3RzWzBdLmxlZnQgPiBjbGllbnRSZWN0c1sxXS5yaWdodCAmJiB4ICE9IG51bGwgJiYgeSAhPSBudWxsKSB7XG4gICAgICAgICAgdmFyIF9jbGllbnRSZWN0cyRmaW5kO1xuXG4gICAgICAgICAgLy8gRmluZCB0aGUgZmlyc3QgcmVjdCBpbiB3aGljaCB0aGUgcG9pbnQgaXMgZnVsbHkgaW5zaWRlXG4gICAgICAgICAgcmV0dXJuIChfY2xpZW50UmVjdHMkZmluZCA9IGNsaWVudFJlY3RzLmZpbmQocmVjdCA9PiB4ID4gcmVjdC5sZWZ0IC0gcGFkZGluZ09iamVjdC5sZWZ0ICYmIHggPCByZWN0LnJpZ2h0ICsgcGFkZGluZ09iamVjdC5yaWdodCAmJiB5ID4gcmVjdC50b3AgLSBwYWRkaW5nT2JqZWN0LnRvcCAmJiB5IDwgcmVjdC5ib3R0b20gKyBwYWRkaW5nT2JqZWN0LmJvdHRvbSkpICE9IG51bGwgPyBfY2xpZW50UmVjdHMkZmluZCA6IGZhbGxiYWNrO1xuICAgICAgICB9IC8vIFRoZXJlIGFyZSAyIG9yIG1vcmUgY29ubmVjdGVkIHJlY3RzXG5cblxuICAgICAgICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICBpZiAoZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KHBsYWNlbWVudCkgPT09ICd4Jykge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RSZWN0ID0gY2xpZW50UmVjdHNbMF07XG4gICAgICAgICAgICBjb25zdCBsYXN0UmVjdCA9IGNsaWVudFJlY3RzW2NsaWVudFJlY3RzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgY29uc3QgaXNUb3AgPSBnZXRTaWRlKHBsYWNlbWVudCkgPT09ICd0b3AnO1xuICAgICAgICAgICAgY29uc3QgdG9wID0gZmlyc3RSZWN0LnRvcDtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGxhc3RSZWN0LmJvdHRvbTtcbiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBpc1RvcCA/IGZpcnN0UmVjdC5sZWZ0IDogbGFzdFJlY3QubGVmdDtcbiAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gaXNUb3AgPyBmaXJzdFJlY3QucmlnaHQgOiBsYXN0UmVjdC5yaWdodDtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gYm90dG9tIC0gdG9wO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgICB5OiB0b3BcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaXNMZWZ0U2lkZSA9IGdldFNpZGUocGxhY2VtZW50KSA9PT0gJ2xlZnQnO1xuICAgICAgICAgIGNvbnN0IG1heFJpZ2h0ID0gbWF4KC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QucmlnaHQpKTtcbiAgICAgICAgICBjb25zdCBtaW5MZWZ0ID0gbWluKC4uLmNsaWVudFJlY3RzLm1hcChyZWN0ID0+IHJlY3QubGVmdCkpO1xuICAgICAgICAgIGNvbnN0IG1lYXN1cmVSZWN0cyA9IGNsaWVudFJlY3RzLmZpbHRlcihyZWN0ID0+IGlzTGVmdFNpZGUgPyByZWN0LmxlZnQgPT09IG1pbkxlZnQgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodCk7XG4gICAgICAgICAgY29uc3QgdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgICAgICBjb25zdCBib3R0b20gPSBtZWFzdXJlUmVjdHNbbWVhc3VyZVJlY3RzLmxlbmd0aCAtIDFdLmJvdHRvbTtcbiAgICAgICAgICBjb25zdCBsZWZ0ID0gbWluTGVmdDtcbiAgICAgICAgICBjb25zdCByaWdodCA9IG1heFJpZ2h0O1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gcmlnaHQgLSBsZWZ0O1xuICAgICAgICAgIGNvbnN0IGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgYm90dG9tLFxuICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgIHJpZ2h0LFxuICAgICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgICB4OiBsZWZ0LFxuICAgICAgICAgICAgeTogdG9wXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxsYmFjaztcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVzZXRSZWN0cyA9IGF3YWl0IHBsYXRmb3JtLmdldEVsZW1lbnRSZWN0cyh7XG4gICAgICAgIHJlZmVyZW5jZToge1xuICAgICAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdFxuICAgICAgICB9LFxuICAgICAgICBmbG9hdGluZzogZWxlbWVudHMuZmxvYXRpbmcsXG4gICAgICAgIHN0cmF0ZWd5XG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlY3RzLnJlZmVyZW5jZS54ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS54IHx8IHJlY3RzLnJlZmVyZW5jZS55ICE9PSByZXNldFJlY3RzLnJlZmVyZW5jZS55IHx8IHJlY3RzLnJlZmVyZW5jZS53aWR0aCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2Uud2lkdGggfHwgcmVjdHMucmVmZXJlbmNlLmhlaWdodCAhPT0gcmVzZXRSZWN0cy5yZWZlcmVuY2UuaGVpZ2h0KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgcmVzZXQ6IHtcbiAgICAgICAgICAgIHJlY3RzOiByZXNldFJlY3RzXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gIH07XG59O1xuXG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgY29tcHV0ZVBvc2l0aW9uLCBkZXRlY3RPdmVyZmxvdywgZmxpcCwgaGlkZSwgaW5saW5lLCBsaW1pdFNoaWZ0LCBvZmZzZXQsIHJlY3RUb0NsaWVudFJlY3QsIHNoaWZ0LCBzaXplIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/@floating-ui/core/dist/floating-ui.core.browser.mjs\n");
5459
5459
 
5460
5460
  /***/ }),
5461
5461
 
@@ -5466,7 +5466,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5466
5466
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5467
5467
 
5468
5468
  "use strict";
5469
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"arrow\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.arrow),\n/* harmony export */ \"autoPlacement\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.autoPlacement),\n/* harmony export */ \"autoUpdate\": () => (/* binding */ autoUpdate),\n/* harmony export */ \"computePosition\": () => (/* binding */ computePosition),\n/* harmony export */ \"detectOverflow\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.detectOverflow),\n/* harmony export */ \"flip\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.flip),\n/* harmony export */ \"getOverflowAncestors\": () => (/* binding */ getOverflowAncestors),\n/* harmony export */ \"hide\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.hide),\n/* harmony export */ \"inline\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.inline),\n/* harmony export */ \"limitShift\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.limitShift),\n/* harmony export */ \"offset\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.offset),\n/* harmony export */ \"shift\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.shift),\n/* harmony export */ \"size\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.size)\n/* harmony export */ });\n/* harmony import */ var _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @floating-ui/core */ \"../../../node_modules/@floating-ui/core/dist/floating-ui.core.browser.mjs\");\n\n\n\nfunction isWindow(value) {\n return value && value.document && value.location && value.alert && value.setInterval;\n}\nfunction getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (!isWindow(node)) {\n const ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}\n\nfunction getComputedStyle$1(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction getNodeName(node) {\n return isWindow(node) ? '' : node ? (node.nodeName || '').toLowerCase() : '';\n}\n\nfunction getUAString() {\n const uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands) {\n return uaData.brands.map(item => item.brand + \"/\" + item.version).join(' ');\n }\n\n return navigator.userAgent;\n}\n\nfunction isHTMLElement(value) {\n return value instanceof getWindow(value).HTMLElement;\n}\nfunction isElement(value) {\n return value instanceof getWindow(value).Element;\n}\nfunction isNode(value) {\n return value instanceof getWindow(value).Node;\n}\nfunction isShadowRoot(node) {\n // Browsers without `ShadowRoot` support\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\nfunction isOverflowElement(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle$1(element);\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n // TODO: Try and use feature detection here instead\n const isFirefox = /firefox/i.test(getUAString());\n const css = getComputedStyle$1(element); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n return css.transform !== 'none' || css.perspective !== 'none' || // @ts-ignore (TS 4.1 compat)\n css.contain === 'paint' || ['transform', 'perspective'].includes(css.willChange) || isFirefox && css.willChange === 'filter' || isFirefox && (css.filter ? css.filter !== 'none' : false);\n}\nfunction isLayoutViewport() {\n // Not Safari\n return !/^((?!chrome|android).)*safari/i.test(getUAString()); // Feature detection for this fails in various ways\n // • Always-visible scrollbar or not\n // • Width of <html>, etc.\n // const vV = win.visualViewport;\n // return vV ? Math.abs(win.innerWidth / vV.scale - vV.width) < 0.5 : true;\n}\n\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy) {\n var _win$visualViewport$o, _win$visualViewport, _win$visualViewport$o2, _win$visualViewport2;\n\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n const clientRect = element.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n const win = isElement(element) ? getWindow(element) : window;\n const addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n const x = (clientRect.left + (addVisualOffsets ? (_win$visualViewport$o = (_win$visualViewport = win.visualViewport) == null ? void 0 : _win$visualViewport.offsetLeft) != null ? _win$visualViewport$o : 0 : 0)) / scaleX;\n const y = (clientRect.top + (addVisualOffsets ? (_win$visualViewport$o2 = (_win$visualViewport2 = win.visualViewport) == null ? void 0 : _win$visualViewport2.offsetTop) != null ? _win$visualViewport$o2 : 0 : 0)) / scaleY;\n const width = clientRect.width / scaleX;\n const height = clientRect.height / scaleY;\n return {\n width,\n height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x,\n y\n };\n}\n\nfunction getDocumentElement(node) {\n return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement;\n}\n\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n\n return {\n scrollLeft: element.pageXOffset,\n scrollTop: element.pageYOffset\n };\n}\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\nfunction isScaled(element) {\n const rect = getBoundingClientRect(element);\n return round(rect.width) !== element.offsetWidth || round(rect.height) !== element.offsetHeight;\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const rect = getBoundingClientRect(element, // @ts-ignore - checked above (TS 4.1 compat)\n isOffsetParentAnElement && isScaled(offsetParent), strategy === 'fixed');\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // @ts-ignore\n node.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n node.parentNode || ( // DOM Element detected\n isShadowRoot(node) ? node.host : null) || // ShadowRoot detected\n getDocumentElement(node) // fallback\n\n );\n}\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n}\n\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && !['html', 'body'].includes(getNodeName(currentNode))) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n const window = getWindow(element);\n let offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n\nfunction getDimensions(element) {\n if (isHTMLElement(element)) {\n return {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n }\n\n const rect = getBoundingClientRect(element);\n return {\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n\n if (offsetParent === documentElement) {\n return rect;\n }\n\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } // This doesn't appear to be need to be negated.\n // else if (documentElement) {\n // offsets.x = getWindowScrollBarX(documentElement);\n // }\n\n }\n\n return { ...rect,\n x: rect.x - scroll.scrollLeft + offsets.x,\n y: rect.y - scroll.scrollTop + offsets.y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var _element$ownerDocumen;\n\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n const width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n const height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n\n if (getComputedStyle$1(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n\n if (['html', 'body', '#document'].includes(getNodeName(parentNode))) {\n // @ts-ignore assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode);\n}\n\nfunction getOverflowAncestors(node, list) {\n var _node$ownerDocument;\n\n if (list === void 0) {\n list = [];\n }\n\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body);\n const win = getWindow(scrollableAncestor);\n const target = isBody ? [win].concat(win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []) : scrollableAncestor;\n const updatedList = list.concat(target);\n return isBody ? updatedList : // @ts-ignore: isBody tells us target will be an HTMLElement here\n updatedList.concat(getOverflowAncestors(target));\n}\n\nfunction contains(parent, child) {\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n\n do {\n // use `===` replace node.isSameNode()\n if (next && parent === next) {\n return true;\n } // @ts-ignore: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n }\n\n return false;\n}\n\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, false, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n return {\n top,\n left,\n x: left,\n y: top,\n right: left + element.clientWidth,\n bottom: top + element.clientHeight,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getClientRectFromClippingAncestor(element, clippingParent, strategy) {\n if (clippingParent === 'viewport') {\n return (0,_floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.rectToClientRect)(getViewportRect(element, strategy));\n }\n\n if (isElement(clippingParent)) {\n return getInnerBoundingClientRect(clippingParent, strategy);\n }\n\n return (0,_floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.rectToClientRect)(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping ancestor\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingAncestors(element) {\n const clippingAncestors = getOverflowAncestors(element);\n const canEscapeClipping = ['absolute', 'fixed'].includes(getComputedStyle$1(element).position);\n const clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // @ts-ignore isElement check ensures we return Array<Element>\n\n\n return clippingAncestors.filter(clippingAncestors => isElement(clippingAncestors) && contains(clippingAncestors, clipperElement) && getNodeName(clippingAncestors) !== 'body');\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors\n\n\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const mainClippingAncestors = boundary === 'clippingAncestors' ? getClippingAncestors(element) : [].concat(boundary);\n const clippingAncestors = [...mainClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nconst platform = {\n getClippingRect,\n convertOffsetParentRelativeRectToViewportRelativeRect,\n isElement,\n getDimensions,\n getOffsetParent,\n getDocumentElement,\n getElementRects: _ref => {\n let {\n reference,\n floating,\n strategy\n } = _ref;\n return {\n reference: getRectRelativeToOffsetParent(reference, getOffsetParent(floating), strategy),\n floating: { ...getDimensions(floating),\n x: 0,\n y: 0\n }\n };\n },\n getClientRects: element => Array.from(element.getClientRects()),\n isRTL: element => getComputedStyle$1(element).direction === 'rtl'\n};\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n\n const {\n ancestorScroll: _ancestorScroll = true,\n ancestorResize: _ancestorResize = true,\n elementResize = true,\n animationFrame = false\n } = options;\n const ancestorScroll = _ancestorScroll && !animationFrame;\n const ancestorResize = _ancestorResize && !animationFrame;\n const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n let observer = null;\n\n if (elementResize) {\n let initialUpdate = true;\n observer = new ResizeObserver(() => {\n if (!initialUpdate) {\n update();\n }\n\n initialUpdate = false;\n });\n isElement(reference) && !animationFrame && observer.observe(reference);\n observer.observe(floating);\n }\n\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n\n if (animationFrame) {\n frameLoop();\n }\n\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n\n update();\n return () => {\n var _observer;\n\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n (_observer = observer) == null ? void 0 : _observer.disconnect();\n observer = null;\n\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain CSS positioning\n * strategy.\n */\n\nconst computePosition = (reference, floating, options) => (0,_floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.computePosition)(reference, floating, {\n platform,\n ...options\n});\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9kb20vZGlzdC9mbG9hdGluZy11aS5kb20uYnJvd3Nlci5tanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMkY7QUFDbUM7O0FBRTlIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkU7O0FBRTdFO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLG1FQUFnQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxtRUFBZ0I7QUFDekIsRUFBRTtBQUNGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMERBQTBELGtFQUFpQjtBQUMzRTtBQUNBO0FBQ0EsQ0FBQzs7QUFFNEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9kb20vZGlzdC9mbG9hdGluZy11aS5kb20uYnJvd3Nlci5tanM/MGVkOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWN0VG9DbGllbnRSZWN0LCBjb21wdXRlUG9zaXRpb24gYXMgY29tcHV0ZVBvc2l0aW9uJDEgfSBmcm9tICdAZmxvYXRpbmctdWkvY29yZSc7XG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBzaGlmdCwgc2l6ZSB9IGZyb20gJ0BmbG9hdGluZy11aS9jb3JlJztcblxuZnVuY3Rpb24gaXNXaW5kb3codmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmRvY3VtZW50ICYmIHZhbHVlLmxvY2F0aW9uICYmIHZhbHVlLmFsZXJ0ICYmIHZhbHVlLnNldEludGVydmFsO1xufVxuZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAoIWlzV2luZG93KG5vZGUpKSB7XG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUkMShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobm9kZSkge1xuICByZXR1cm4gaXNXaW5kb3cobm9kZSkgPyAnJyA6IG5vZGUgPyAobm9kZS5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBnZXRVQVN0cmluZygpIHtcbiAgY29uc3QgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMpIHtcbiAgICByZXR1cm4gdWFEYXRhLmJyYW5kcy5tYXAoaXRlbSA9PiBpdGVtLmJyYW5kICsgXCIvXCIgKyBpdGVtLnZlcnNpb24pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuSFRNTEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5FbGVtZW50O1xufVxuZnVuY3Rpb24gaXNOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuTm9kZTtcbn1cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgYFNoYWRvd1Jvb3RgIHN1cHBvcnRcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuZnVuY3Rpb24gaXNPdmVyZmxvd0VsZW1lbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIGNvbnN0IHtcbiAgICBvdmVyZmxvdyxcbiAgICBvdmVyZmxvd1gsXG4gICAgb3ZlcmZsb3dZXG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlJDEoZWxlbWVudCk7XG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufVxuZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKGVsZW1lbnQpKTtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgLy8gVE9ETzogVHJ5IGFuZCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gaGVyZSBpbnN0ZWFkXG4gIGNvbnN0IGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZSQxKGVsZW1lbnQpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICByZXR1cm4gY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IC8vIEB0cy1pZ25vcmUgKFRTIDQuMSBjb21wYXQpXG4gIGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5jbHVkZXMoY3NzLndpbGxDaGFuZ2UpIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIChjc3MuZmlsdGVyID8gY3NzLmZpbHRlciAhPT0gJ25vbmUnIDogZmFsc2UpO1xufVxuZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgLy8gTm90IFNhZmFyaVxuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7IC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciB0aGlzIGZhaWxzIGluIHZhcmlvdXMgd2F5c1xuICAvLyDigKIgQWx3YXlzLXZpc2libGUgc2Nyb2xsYmFyIG9yIG5vdFxuICAvLyDigKIgV2lkdGggb2YgPGh0bWw+LCBldGMuXG4gIC8vIGNvbnN0IHZWID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICAvLyByZXR1cm4gdlYgPyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZWLnNjYWxlIC0gdlYud2lkdGgpIDwgMC41IDogdHJ1ZTtcbn1cblxuY29uc3QgbWluID0gTWF0aC5taW47XG5jb25zdCBtYXggPSBNYXRoLm1heDtcbmNvbnN0IHJvdW5kID0gTWF0aC5yb3VuZDtcblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSwgaXNGaXhlZFN0cmF0ZWd5KSB7XG4gIHZhciBfd2luJHZpc3VhbFZpZXdwb3J0JG8sIF93aW4kdmlzdWFsVmlld3BvcnQsIF93aW4kdmlzdWFsVmlld3BvcnQkbzIsIF93aW4kdmlzdWFsVmlld3BvcnQyO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRml4ZWRTdHJhdGVneSA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZFN0cmF0ZWd5ID0gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgbGV0IHNjYWxlWCA9IDE7XG4gIGxldCBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgY29uc3Qgd2luID0gaXNFbGVtZW50KGVsZW1lbnQpID8gZ2V0V2luZG93KGVsZW1lbnQpIDogd2luZG93O1xuICBjb25zdCBhZGRWaXN1YWxPZmZzZXRzID0gIWlzTGF5b3V0Vmlld3BvcnQoKSAmJiBpc0ZpeGVkU3RyYXRlZ3k7XG4gIGNvbnN0IHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgPyAoX3dpbiR2aXN1YWxWaWV3cG9ydCRvID0gKF93aW4kdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQpID09IG51bGwgPyB2b2lkIDAgOiBfd2luJHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQpICE9IG51bGwgPyBfd2luJHZpc3VhbFZpZXdwb3J0JG8gOiAwIDogMCkpIC8gc2NhbGVYO1xuICBjb25zdCB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgPyAoX3dpbiR2aXN1YWxWaWV3cG9ydCRvMiA9IChfd2luJHZpc3VhbFZpZXdwb3J0MiA9IHdpbi52aXN1YWxWaWV3cG9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF93aW4kdmlzdWFsVmlld3BvcnQyLm9mZnNldFRvcCkgIT0gbnVsbCA/IF93aW4kdmlzdWFsVmlld3BvcnQkbzIgOiAwIDogMCkpIC8gc2NhbGVZO1xuICBjb25zdCB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIGNvbnN0IGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0IC8gc2NhbGVZO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0b3A6IHksXG4gICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgbGVmdDogeCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KG5vZGUpIHtcbiAgcmV0dXJuICgoaXNOb2RlKG5vZGUpID8gbm9kZS5vd25lckRvY3VtZW50IDogbm9kZS5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVTY3JvbGwoZWxlbWVudCkge1xuICBpZiAoaXNFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnBhZ2VYT2Zmc2V0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5wYWdlWU9mZnNldFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2NhbGVkKGVsZW1lbnQpIHtcbiAgY29uc3QgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcbiAgcmV0dXJuIHJvdW5kKHJlY3Qud2lkdGgpICE9PSBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IHJvdW5kKHJlY3QuaGVpZ2h0KSAhPT0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlY3RSZWxhdGl2ZVRvT2Zmc2V0UGFyZW50KGVsZW1lbnQsIG9mZnNldFBhcmVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3QgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIC8vIEB0cy1pZ25vcmUgLSBjaGVja2VkIGFib3ZlIChUUyA0LjEgY29tcGF0KVxuICBpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiBpc1NjYWxlZChvZmZzZXRQYXJlbnQpLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIGxldCBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgY29uc3Qgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmIHN0cmF0ZWd5ICE9PSAnZml4ZWQnKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKG5vZGUpIHtcbiAgaWYgKGdldE5vZGVOYW1lKG5vZGUpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbm9kZS5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBub2RlLnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChub2RlKSA/IG5vZGUuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICBnZXREb2N1bWVudEVsZW1lbnQobm9kZSkgLy8gZmFsbGJhY2tcblxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgbGV0IGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiAhWydodG1sJywgJ2JvZHknXS5pbmNsdWRlcyhnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpKSB7XG4gICAgaWYgKGlzQ29udGFpbmluZ0Jsb2NrKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJyAmJiAhaXNDb250YWluaW5nQmxvY2sob2Zmc2V0UGFyZW50KSkpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgaWYgKGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdChfcmVmKSB7XG4gIGxldCB7XG4gICAgcmVjdCxcbiAgICBvZmZzZXRQYXJlbnQsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcblxuICBpZiAob2Zmc2V0UGFyZW50ID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gcmVjdDtcbiAgfVxuXG4gIGxldCBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgY29uc3Qgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmIHN0cmF0ZWd5ICE9PSAnZml4ZWQnKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gLy8gVGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBuZWVkIHRvIGJlIG5lZ2F0ZWQuXG4gICAgLy8gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgLy8gICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgLy8gfVxuXG4gIH1cblxuICByZXR1cm4geyAuLi5yZWN0LFxuICAgIHg6IHJlY3QueCAtIHNjcm9sbC5zY3JvbGxMZWZ0ICsgb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QueSAtIHNjcm9sbC5zY3JvbGxUb3AgKyBvZmZzZXRzLnlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3QgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIGxldCB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIGxldCBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpO1xuICBjb25zdCBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICBjb25zdCB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIGNvbnN0IGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICBsZXQgeCA9IC1zY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIGNvbnN0IHkgPSAtc2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZSQxKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3Rvcihub2RlKSB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKG5vZGUpO1xuXG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmNsdWRlcyhnZXROb2RlTmFtZShwYXJlbnROb2RlKSkpIHtcbiAgICAvLyBAdHMtaWdub3JlIGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChwYXJlbnROb2RlKSAmJiBpc092ZXJmbG93RWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKHBhcmVudE5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRPdmVyZmxvd0FuY2VzdG9ycyhub2RlLCBsaXN0KSB7XG4gIHZhciBfbm9kZSRvd25lckRvY3VtZW50O1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICBjb25zdCBzY3JvbGxhYmxlQW5jZXN0b3IgPSBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3Rvcihub2RlKTtcbiAgY29uc3QgaXNCb2R5ID0gc2Nyb2xsYWJsZUFuY2VzdG9yID09PSAoKF9ub2RlJG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRvd25lckRvY3VtZW50LmJvZHkpO1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsYWJsZUFuY2VzdG9yKTtcbiAgY29uc3QgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNPdmVyZmxvd0VsZW1lbnQoc2Nyb2xsYWJsZUFuY2VzdG9yKSA/IHNjcm9sbGFibGVBbmNlc3RvciA6IFtdKSA6IHNjcm9sbGFibGVBbmNlc3RvcjtcbiAgY29uc3QgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyBAdHMtaWdub3JlOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQoZ2V0T3ZlcmZsb3dBbmNlc3RvcnModGFyZ2V0KSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgY29uc3Qgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSA9PSBudWxsID8gdm9pZCAwIDogY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgIGxldCBuZXh0ID0gY2hpbGQ7XG5cbiAgICBkbyB7XG4gICAgICAvLyB1c2UgYD09PWAgcmVwbGFjZSBub2RlLmlzU2FtZU5vZGUoKVxuICAgICAgaWYgKG5leHQgJiYgcGFyZW50ID09PSBuZXh0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBAdHMtaWdub3JlOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgIH0gd2hpbGUgKG5leHQpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIGNvbnN0IHRvcCA9IGNsaWVudFJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIGNvbnN0IGxlZnQgPSBjbGllbnRSZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJldHVybiB7XG4gICAgdG9wLFxuICAgIGxlZnQsXG4gICAgeDogbGVmdCxcbiAgICB5OiB0b3AsXG4gICAgcmlnaHQ6IGxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgIGJvdHRvbTogdG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgd2lkdGg6IGVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgaGVpZ2h0OiBlbGVtZW50LmNsaWVudEhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIGlmIChjbGlwcGluZ1BhcmVudCA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIHJldHVybiByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpO1xuICB9XG5cbiAgaWYgKGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkpIHtcbiAgICByZXR1cm4gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KTtcbiAgfVxuXG4gIHJldHVybiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIGFuY2VzdG9yXCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ0FuY2VzdG9ycyhlbGVtZW50KSB7XG4gIGNvbnN0IGNsaXBwaW5nQW5jZXN0b3JzID0gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudCk7XG4gIGNvbnN0IGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluY2x1ZGVzKGdldENvbXB1dGVkU3R5bGUkMShlbGVtZW50KS5wb3NpdGlvbik7XG4gIGNvbnN0IGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vIEB0cy1pZ25vcmUgaXNFbGVtZW50IGNoZWNrIGVuc3VyZXMgd2UgcmV0dXJuIEFycmF5PEVsZW1lbnQ+XG5cblxuICByZXR1cm4gY2xpcHBpbmdBbmNlc3RvcnMuZmlsdGVyKGNsaXBwaW5nQW5jZXN0b3JzID0+IGlzRWxlbWVudChjbGlwcGluZ0FuY2VzdG9ycykgJiYgY29udGFpbnMoY2xpcHBpbmdBbmNlc3RvcnMsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ0FuY2VzdG9ycykgIT09ICdib2R5Jyk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIGFuY2VzdG9yc1xuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChfcmVmKSB7XG4gIGxldCB7XG4gICAgZWxlbWVudCxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgc3RyYXRlZ3lcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG1haW5DbGlwcGluZ0FuY2VzdG9ycyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdBbmNlc3RvcnMnID8gZ2V0Q2xpcHBpbmdBbmNlc3RvcnMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICBjb25zdCBjbGlwcGluZ0FuY2VzdG9ycyA9IFsuLi5tYWluQ2xpcHBpbmdBbmNlc3RvcnMsIHJvb3RCb3VuZGFyeV07XG4gIGNvbnN0IGZpcnN0Q2xpcHBpbmdBbmNlc3RvciA9IGNsaXBwaW5nQW5jZXN0b3JzWzBdO1xuICBjb25zdCBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ0FuY2VzdG9ycy5yZWR1Y2UoKGFjY1JlY3QsIGNsaXBwaW5nQW5jZXN0b3IpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgZmlyc3RDbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSkpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdCxcbiAgICBoZWlnaHQ6IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wLFxuICAgIHg6IGNsaXBwaW5nUmVjdC5sZWZ0LFxuICAgIHk6IGNsaXBwaW5nUmVjdC50b3BcbiAgfTtcbn1cblxuY29uc3QgcGxhdGZvcm0gPSB7XG4gIGdldENsaXBwaW5nUmVjdCxcbiAgY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QsXG4gIGlzRWxlbWVudCxcbiAgZ2V0RGltZW5zaW9ucyxcbiAgZ2V0T2Zmc2V0UGFyZW50LFxuICBnZXREb2N1bWVudEVsZW1lbnQsXG4gIGdldEVsZW1lbnRSZWN0czogX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nLFxuICAgICAgc3RyYXRlZ3lcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmZXJlbmNlOiBnZXRSZWN0UmVsYXRpdmVUb09mZnNldFBhcmVudChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChmbG9hdGluZyksIHN0cmF0ZWd5KSxcbiAgICAgIGZsb2F0aW5nOiB7IC4uLmdldERpbWVuc2lvbnMoZmxvYXRpbmcpLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgZ2V0Q2xpZW50UmVjdHM6IGVsZW1lbnQgPT4gQXJyYXkuZnJvbShlbGVtZW50LmdldENsaWVudFJlY3RzKCkpLFxuICBpc1JUTDogZWxlbWVudCA9PiBnZXRDb21wdXRlZFN0eWxlJDEoZWxlbWVudCkuZGlyZWN0aW9uID09PSAncnRsJ1xufTtcblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9VcGRhdGVcbiAqL1xuZnVuY3Rpb24gYXV0b1VwZGF0ZShyZWZlcmVuY2UsIGZsb2F0aW5nLCB1cGRhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhbmNlc3RvclNjcm9sbDogX2FuY2VzdG9yU2Nyb2xsID0gdHJ1ZSxcbiAgICBhbmNlc3RvclJlc2l6ZTogX2FuY2VzdG9yUmVzaXplID0gdHJ1ZSxcbiAgICBlbGVtZW50UmVzaXplID0gdHJ1ZSxcbiAgICBhbmltYXRpb25GcmFtZSA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhbmNlc3RvclNjcm9sbCA9IF9hbmNlc3RvclNjcm9sbCAmJiAhYW5pbWF0aW9uRnJhbWU7XG4gIGNvbnN0IGFuY2VzdG9yUmVzaXplID0gX2FuY2VzdG9yUmVzaXplICYmICFhbmltYXRpb25GcmFtZTtcbiAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JTY3JvbGwgfHwgYW5jZXN0b3JSZXNpemUgPyBbLi4uKGlzRWxlbWVudChyZWZlcmVuY2UpID8gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMocmVmZXJlbmNlKSA6IFtdKSwgLi4uZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZmxvYXRpbmcpXSA6IFtdO1xuICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgfSk7XG4gIGxldCBvYnNlcnZlciA9IG51bGw7XG5cbiAgaWYgKGVsZW1lbnRSZXNpemUpIHtcbiAgICBsZXQgaW5pdGlhbFVwZGF0ZSA9IHRydWU7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKCFpbml0aWFsVXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBpbml0aWFsVXBkYXRlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaXNFbGVtZW50KHJlZmVyZW5jZSkgJiYgIWFuaW1hdGlvbkZyYW1lICYmIG9ic2VydmVyLm9ic2VydmUocmVmZXJlbmNlKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgfVxuXG4gIGxldCBmcmFtZUlkO1xuICBsZXQgcHJldlJlZlJlY3QgPSBhbmltYXRpb25GcmFtZSA/IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpIDogbnVsbDtcblxuICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICBmcmFtZUxvb3AoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyYW1lTG9vcCgpIHtcbiAgICBjb25zdCBuZXh0UmVmUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpO1xuXG4gICAgaWYgKHByZXZSZWZSZWN0ICYmIChuZXh0UmVmUmVjdC54ICE9PSBwcmV2UmVmUmVjdC54IHx8IG5leHRSZWZSZWN0LnkgIT09IHByZXZSZWZSZWN0LnkgfHwgbmV4dFJlZlJlY3Qud2lkdGggIT09IHByZXZSZWZSZWN0LndpZHRoIHx8IG5leHRSZWZSZWN0LmhlaWdodCAhPT0gcHJldlJlZlJlY3QuaGVpZ2h0KSkge1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcHJldlJlZlJlY3QgPSBuZXh0UmVmUmVjdDtcbiAgICBmcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lTG9vcCk7XG4gIH1cblxuICB1cGRhdGUoKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB2YXIgX29ic2VydmVyO1xuXG4gICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlKTtcbiAgICAgIGFuY2VzdG9yUmVzaXplICYmIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZSk7XG4gICAgfSk7XG4gICAgKF9vYnNlcnZlciA9IG9ic2VydmVyKSA9PSBudWxsID8gdm9pZCAwIDogX29ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICBvYnNlcnZlciA9IG51bGw7XG5cbiAgICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lSWQpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdGhhdCB3aWxsIHBsYWNlIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gKiBuZXh0IHRvIGEgcmVmZXJlbmNlIGVsZW1lbnQgd2hlbiBpdCBpcyBnaXZlbiBhIGNlcnRhaW4gQ1NTIHBvc2l0aW9uaW5nXG4gKiBzdHJhdGVneS5cbiAqL1xuXG5jb25zdCBjb21wdXRlUG9zaXRpb24gPSAocmVmZXJlbmNlLCBmbG9hdGluZywgb3B0aW9ucykgPT4gY29tcHV0ZVBvc2l0aW9uJDEocmVmZXJlbmNlLCBmbG9hdGluZywge1xuICBwbGF0Zm9ybSxcbiAgLi4ub3B0aW9uc1xufSk7XG5cbmV4cG9ydCB7IGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.browser.mjs\n");
5469
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"arrow\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.arrow),\n/* harmony export */ \"autoPlacement\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.autoPlacement),\n/* harmony export */ \"autoUpdate\": () => (/* binding */ autoUpdate),\n/* harmony export */ \"computePosition\": () => (/* binding */ computePosition),\n/* harmony export */ \"detectOverflow\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.detectOverflow),\n/* harmony export */ \"flip\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.flip),\n/* harmony export */ \"getOverflowAncestors\": () => (/* binding */ getOverflowAncestors),\n/* harmony export */ \"hide\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.hide),\n/* harmony export */ \"inline\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.inline),\n/* harmony export */ \"limitShift\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.limitShift),\n/* harmony export */ \"offset\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.offset),\n/* harmony export */ \"shift\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.shift),\n/* harmony export */ \"size\": () => (/* reexport safe */ _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.size)\n/* harmony export */ });\n/* harmony import */ var _floating_ui_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @floating-ui/core */ \"../../../node_modules/@floating-ui/core/dist/floating-ui.core.browser.mjs\");\n\n\n\nfunction isWindow(value) {\n return value && value.document && value.location && value.alert && value.setInterval;\n}\nfunction getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (!isWindow(node)) {\n const ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}\n\nfunction getComputedStyle$1(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction getNodeName(node) {\n return isWindow(node) ? '' : node ? (node.nodeName || '').toLowerCase() : '';\n}\n\nfunction getUAString() {\n const uaData = navigator.userAgentData;\n\n if (uaData != null && uaData.brands) {\n return uaData.brands.map(item => item.brand + \"/\" + item.version).join(' ');\n }\n\n return navigator.userAgent;\n}\n\nfunction isHTMLElement(value) {\n return value instanceof getWindow(value).HTMLElement;\n}\nfunction isElement(value) {\n return value instanceof getWindow(value).Element;\n}\nfunction isNode(value) {\n return value instanceof getWindow(value).Node;\n}\nfunction isShadowRoot(node) {\n // Browsers without `ShadowRoot` support\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n const OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\nfunction isOverflowElement(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n const {\n overflow,\n overflowX,\n overflowY\n } = getComputedStyle$1(element);\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].includes(getNodeName(element));\n}\nfunction isContainingBlock(element) {\n // TODO: Try and use feature detection here instead\n const isFirefox = /firefox/i.test(getUAString());\n const css = getComputedStyle$1(element); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n return css.transform !== 'none' || css.perspective !== 'none' || // @ts-ignore (TS 4.1 compat)\n css.contain === 'paint' || ['transform', 'perspective'].includes(css.willChange) || isFirefox && css.willChange === 'filter' || isFirefox && (css.filter ? css.filter !== 'none' : false);\n}\nfunction isLayoutViewport() {\n // Not Safari\n return !/^((?!chrome|android).)*safari/i.test(getUAString()); // Feature detection for this fails in various ways\n // • Always-visible scrollbar or not\n // • Width of <html>, etc.\n // const vV = win.visualViewport;\n // return vV ? Math.abs(win.innerWidth / vV.scale - vV.width) < 0.5 : true;\n}\n\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy) {\n var _win$visualViewport$o, _win$visualViewport, _win$visualViewport$o2, _win$visualViewport2;\n\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n\n const clientRect = element.getBoundingClientRect();\n let scaleX = 1;\n let scaleY = 1;\n\n if (includeScale && isHTMLElement(element)) {\n scaleX = element.offsetWidth > 0 ? round(clientRect.width) / element.offsetWidth || 1 : 1;\n scaleY = element.offsetHeight > 0 ? round(clientRect.height) / element.offsetHeight || 1 : 1;\n }\n\n const win = isElement(element) ? getWindow(element) : window;\n const addVisualOffsets = !isLayoutViewport() && isFixedStrategy;\n const x = (clientRect.left + (addVisualOffsets ? (_win$visualViewport$o = (_win$visualViewport = win.visualViewport) == null ? void 0 : _win$visualViewport.offsetLeft) != null ? _win$visualViewport$o : 0 : 0)) / scaleX;\n const y = (clientRect.top + (addVisualOffsets ? (_win$visualViewport$o2 = (_win$visualViewport2 = win.visualViewport) == null ? void 0 : _win$visualViewport2.offsetTop) != null ? _win$visualViewport$o2 : 0 : 0)) / scaleY;\n const width = clientRect.width / scaleX;\n const height = clientRect.height / scaleY;\n return {\n width,\n height,\n top: y,\n right: x + width,\n bottom: y + height,\n left: x,\n x,\n y\n };\n}\n\nfunction getDocumentElement(node) {\n return ((isNode(node) ? node.ownerDocument : node.document) || window.document).documentElement;\n}\n\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n\n return {\n scrollLeft: element.pageXOffset,\n scrollTop: element.pageYOffset\n };\n}\n\nfunction getWindowScrollBarX(element) {\n // If <html> has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n return getBoundingClientRect(getDocumentElement(element)).left + getNodeScroll(element).scrollLeft;\n}\n\nfunction isScaled(element) {\n const rect = getBoundingClientRect(element);\n return round(rect.width) !== element.offsetWidth || round(rect.height) !== element.offsetHeight;\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const rect = getBoundingClientRect(element, // @ts-ignore - checked above (TS 4.1 compat)\n isOffsetParentAnElement && isScaled(offsetParent), strategy === 'fixed');\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // @ts-ignore\n node.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n node.parentNode || ( // DOM Element detected\n isShadowRoot(node) ? node.host : null) || // ShadowRoot detected\n getDocumentElement(node) // fallback\n\n );\n}\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n}\n\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && !['html', 'body'].includes(getNodeName(currentNode))) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n const window = getWindow(element);\n let offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && !isContainingBlock(offsetParent))) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n\nfunction getDimensions(element) {\n if (isHTMLElement(element)) {\n return {\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n }\n\n const rect = getBoundingClientRect(element);\n return {\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n\n if (offsetParent === documentElement) {\n return rect;\n }\n\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && strategy !== 'fixed') {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent, true);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } // This doesn't appear to be need to be negated.\n // else if (documentElement) {\n // offsets.x = getWindowScrollBarX(documentElement);\n // }\n\n }\n\n return { ...rect,\n x: rect.x - scroll.scrollLeft + offsets.x,\n y: rect.y - scroll.scrollTop + offsets.y\n };\n}\n\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const layoutViewport = isLayoutViewport();\n\n if (layoutViewport || !layoutViewport && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// of the `<html>` and `<body>` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var _element$ownerDocumen;\n\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n const width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n const height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n\n if (getComputedStyle$1(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width,\n height,\n x,\n y\n };\n}\n\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n\n if (['html', 'body', '#document'].includes(getNodeName(parentNode))) {\n // @ts-ignore assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode);\n}\n\nfunction getOverflowAncestors(node, list) {\n var _node$ownerDocument;\n\n if (list === void 0) {\n list = [];\n }\n\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.body);\n const win = getWindow(scrollableAncestor);\n const target = isBody ? [win].concat(win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : []) : scrollableAncestor;\n const updatedList = list.concat(target);\n return isBody ? updatedList : // @ts-ignore: isBody tells us target will be an HTMLElement here\n updatedList.concat(getOverflowAncestors(target));\n}\n\nfunction contains(parent, child) {\n const rootNode = child.getRootNode == null ? void 0 : child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n let next = child;\n\n do {\n // use `===` replace node.isSameNode()\n if (next && parent === next) {\n return true;\n } // @ts-ignore: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n }\n\n return false;\n}\n\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, false, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n return {\n top,\n left,\n x: left,\n y: top,\n right: left + element.clientWidth,\n bottom: top + element.clientHeight,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getClientRectFromClippingAncestor(element, clippingParent, strategy) {\n if (clippingParent === 'viewport') {\n return (0,_floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.rectToClientRect)(getViewportRect(element, strategy));\n }\n\n if (isElement(clippingParent)) {\n return getInnerBoundingClientRect(clippingParent, strategy);\n }\n\n return (0,_floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.rectToClientRect)(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping ancestor\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingAncestors(element) {\n const clippingAncestors = getOverflowAncestors(element);\n const canEscapeClipping = ['absolute', 'fixed'].includes(getComputedStyle$1(element).position);\n const clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // @ts-ignore isElement check ensures we return Array<Element>\n\n\n return clippingAncestors.filter(clippingAncestors => isElement(clippingAncestors) && contains(clippingAncestors, clipperElement) && getNodeName(clippingAncestors) !== 'body');\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors\n\n\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const mainClippingAncestors = boundary === 'clippingAncestors' ? getClippingAncestors(element) : [].concat(boundary);\n const clippingAncestors = [...mainClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nconst platform = {\n getClippingRect,\n convertOffsetParentRelativeRectToViewportRelativeRect,\n isElement,\n getDimensions,\n getOffsetParent,\n getDocumentElement,\n getElementRects: _ref => {\n let {\n reference,\n floating,\n strategy\n } = _ref;\n return {\n reference: getRectRelativeToOffsetParent(reference, getOffsetParent(floating), strategy),\n floating: { ...getDimensions(floating),\n x: 0,\n y: 0\n }\n };\n },\n getClientRects: element => Array.from(element.getClientRects()),\n isRTL: element => getComputedStyle$1(element).direction === 'rtl'\n};\n\n/**\n * Automatically updates the position of the floating element when necessary.\n * @see https://floating-ui.com/docs/autoUpdate\n */\nfunction autoUpdate(reference, floating, update, options) {\n if (options === void 0) {\n options = {};\n }\n\n const {\n ancestorScroll: _ancestorScroll = true,\n ancestorResize: _ancestorResize = true,\n elementResize = true,\n animationFrame = false\n } = options;\n const ancestorScroll = _ancestorScroll && !animationFrame;\n const ancestorResize = _ancestorResize && !animationFrame;\n const ancestors = ancestorScroll || ancestorResize ? [...(isElement(reference) ? getOverflowAncestors(reference) : []), ...getOverflowAncestors(floating)] : [];\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.addEventListener('scroll', update, {\n passive: true\n });\n ancestorResize && ancestor.addEventListener('resize', update);\n });\n let observer = null;\n\n if (elementResize) {\n let initialUpdate = true;\n observer = new ResizeObserver(() => {\n if (!initialUpdate) {\n update();\n }\n\n initialUpdate = false;\n });\n isElement(reference) && !animationFrame && observer.observe(reference);\n observer.observe(floating);\n }\n\n let frameId;\n let prevRefRect = animationFrame ? getBoundingClientRect(reference) : null;\n\n if (animationFrame) {\n frameLoop();\n }\n\n function frameLoop() {\n const nextRefRect = getBoundingClientRect(reference);\n\n if (prevRefRect && (nextRefRect.x !== prevRefRect.x || nextRefRect.y !== prevRefRect.y || nextRefRect.width !== prevRefRect.width || nextRefRect.height !== prevRefRect.height)) {\n update();\n }\n\n prevRefRect = nextRefRect;\n frameId = requestAnimationFrame(frameLoop);\n }\n\n update();\n return () => {\n var _observer;\n\n ancestors.forEach(ancestor => {\n ancestorScroll && ancestor.removeEventListener('scroll', update);\n ancestorResize && ancestor.removeEventListener('resize', update);\n });\n (_observer = observer) == null ? void 0 : _observer.disconnect();\n observer = null;\n\n if (animationFrame) {\n cancelAnimationFrame(frameId);\n }\n };\n}\n\n/**\n * Computes the `x` and `y` coordinates that will place the floating element\n * next to a reference element when it is given a certain CSS positioning\n * strategy.\n */\n\nconst computePosition = (reference, floating, options) => (0,_floating_ui_core__WEBPACK_IMPORTED_MODULE_0__.computePosition)(reference, floating, {\n platform,\n ...options\n});\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9kb20vZGlzdC9mbG9hdGluZy11aS5kb20uYnJvd3Nlci5tanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBMkY7QUFDbUM7O0FBRTlIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyQ0FBMkM7QUFDM0M7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0VBQWdFO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxFQUFFO0FBQ0Y7OztBQUdBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7O0FBRUE7O0FBRUEsV0FBVztBQUNYO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSw2RUFBNkU7O0FBRTdFO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7OztBQUdSO0FBQ0EsTUFBTTtBQUNOOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXLG1FQUFnQjtBQUMzQjs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsU0FBUyxtRUFBZ0I7QUFDekIsRUFBRTtBQUNGO0FBQ0E7OztBQUdBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxJQUFJOzs7QUFHSjtBQUNBLEVBQUU7QUFDRjs7O0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0Esa0JBQWtCO0FBQ2xCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0EsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsMERBQTBELGtFQUFpQjtBQUMzRTtBQUNBO0FBQ0EsQ0FBQzs7QUFFNEQiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL0BmbG9hdGluZy11aS9kb20vZGlzdC9mbG9hdGluZy11aS5kb20uYnJvd3Nlci5tanM/MjFkOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWN0VG9DbGllbnRSZWN0LCBjb21wdXRlUG9zaXRpb24gYXMgY29tcHV0ZVBvc2l0aW9uJDEgfSBmcm9tICdAZmxvYXRpbmctdWkvY29yZSc7XG5leHBvcnQgeyBhcnJvdywgYXV0b1BsYWNlbWVudCwgZGV0ZWN0T3ZlcmZsb3csIGZsaXAsIGhpZGUsIGlubGluZSwgbGltaXRTaGlmdCwgb2Zmc2V0LCBzaGlmdCwgc2l6ZSB9IGZyb20gJ0BmbG9hdGluZy11aS9jb3JlJztcblxuZnVuY3Rpb24gaXNXaW5kb3codmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlICYmIHZhbHVlLmRvY3VtZW50ICYmIHZhbHVlLmxvY2F0aW9uICYmIHZhbHVlLmFsZXJ0ICYmIHZhbHVlLnNldEludGVydmFsO1xufVxuZnVuY3Rpb24gZ2V0V2luZG93KG5vZGUpIHtcbiAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgIHJldHVybiB3aW5kb3c7XG4gIH1cblxuICBpZiAoIWlzV2luZG93KG5vZGUpKSB7XG4gICAgY29uc3Qgb3duZXJEb2N1bWVudCA9IG5vZGUub3duZXJEb2N1bWVudDtcbiAgICByZXR1cm4gb3duZXJEb2N1bWVudCA/IG93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93IDogd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGdldENvbXB1dGVkU3R5bGUkMShlbGVtZW50KSB7XG4gIHJldHVybiBnZXRXaW5kb3coZWxlbWVudCkuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUobm9kZSkge1xuICByZXR1cm4gaXNXaW5kb3cobm9kZSkgPyAnJyA6IG5vZGUgPyAobm9kZS5ub2RlTmFtZSB8fCAnJykudG9Mb3dlckNhc2UoKSA6ICcnO1xufVxuXG5mdW5jdGlvbiBnZXRVQVN0cmluZygpIHtcbiAgY29uc3QgdWFEYXRhID0gbmF2aWdhdG9yLnVzZXJBZ2VudERhdGE7XG5cbiAgaWYgKHVhRGF0YSAhPSBudWxsICYmIHVhRGF0YS5icmFuZHMpIHtcbiAgICByZXR1cm4gdWFEYXRhLmJyYW5kcy5tYXAoaXRlbSA9PiBpdGVtLmJyYW5kICsgXCIvXCIgKyBpdGVtLnZlcnNpb24pLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHJldHVybiBuYXZpZ2F0b3IudXNlckFnZW50O1xufVxuXG5mdW5jdGlvbiBpc0hUTUxFbGVtZW50KHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuSFRNTEVsZW1lbnQ7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgZ2V0V2luZG93KHZhbHVlKS5FbGVtZW50O1xufVxuZnVuY3Rpb24gaXNOb2RlKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIGdldFdpbmRvdyh2YWx1ZSkuTm9kZTtcbn1cbmZ1bmN0aW9uIGlzU2hhZG93Um9vdChub2RlKSB7XG4gIC8vIEJyb3dzZXJzIHdpdGhvdXQgYFNoYWRvd1Jvb3RgIHN1cHBvcnRcbiAgaWYgKHR5cGVvZiBTaGFkb3dSb290ID09PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IE93bkVsZW1lbnQgPSBnZXRXaW5kb3cobm9kZSkuU2hhZG93Um9vdDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290O1xufVxuZnVuY3Rpb24gaXNPdmVyZmxvd0VsZW1lbnQoZWxlbWVudCkge1xuICAvLyBGaXJlZm94IHdhbnRzIHVzIHRvIGNoZWNrIGAteGAgYW5kIGAteWAgdmFyaWF0aW9ucyBhcyB3ZWxsXG4gIGNvbnN0IHtcbiAgICBvdmVyZmxvdyxcbiAgICBvdmVyZmxvd1gsXG4gICAgb3ZlcmZsb3dZXG4gIH0gPSBnZXRDb21wdXRlZFN0eWxlJDEoZWxlbWVudCk7XG4gIHJldHVybiAvYXV0b3xzY3JvbGx8b3ZlcmxheXxoaWRkZW4vLnRlc3Qob3ZlcmZsb3cgKyBvdmVyZmxvd1kgKyBvdmVyZmxvd1gpO1xufVxuZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluY2x1ZGVzKGdldE5vZGVOYW1lKGVsZW1lbnQpKTtcbn1cbmZ1bmN0aW9uIGlzQ29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgLy8gVE9ETzogVHJ5IGFuZCB1c2UgZmVhdHVyZSBkZXRlY3Rpb24gaGVyZSBpbnN0ZWFkXG4gIGNvbnN0IGlzRmlyZWZveCA9IC9maXJlZm94L2kudGVzdChnZXRVQVN0cmluZygpKTtcbiAgY29uc3QgY3NzID0gZ2V0Q29tcHV0ZWRTdHlsZSQxKGVsZW1lbnQpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgLy8gY3JlYXRlIGEgY29udGFpbmluZyBibG9jay5cbiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NvbnRhaW5pbmdfYmxvY2sjaWRlbnRpZnlpbmdfdGhlX2NvbnRhaW5pbmdfYmxvY2tcblxuICByZXR1cm4gY3NzLnRyYW5zZm9ybSAhPT0gJ25vbmUnIHx8IGNzcy5wZXJzcGVjdGl2ZSAhPT0gJ25vbmUnIHx8IC8vIEB0cy1pZ25vcmUgKFRTIDQuMSBjb21wYXQpXG4gIGNzcy5jb250YWluID09PSAncGFpbnQnIHx8IFsndHJhbnNmb3JtJywgJ3BlcnNwZWN0aXZlJ10uaW5jbHVkZXMoY3NzLndpbGxDaGFuZ2UpIHx8IGlzRmlyZWZveCAmJiBjc3Mud2lsbENoYW5nZSA9PT0gJ2ZpbHRlcicgfHwgaXNGaXJlZm94ICYmIChjc3MuZmlsdGVyID8gY3NzLmZpbHRlciAhPT0gJ25vbmUnIDogZmFsc2UpO1xufVxuZnVuY3Rpb24gaXNMYXlvdXRWaWV3cG9ydCgpIHtcbiAgLy8gTm90IFNhZmFyaVxuICByZXR1cm4gIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QoZ2V0VUFTdHJpbmcoKSk7IC8vIEZlYXR1cmUgZGV0ZWN0aW9uIGZvciB0aGlzIGZhaWxzIGluIHZhcmlvdXMgd2F5c1xuICAvLyDigKIgQWx3YXlzLXZpc2libGUgc2Nyb2xsYmFyIG9yIG5vdFxuICAvLyDigKIgV2lkdGggb2YgPGh0bWw+LCBldGMuXG4gIC8vIGNvbnN0IHZWID0gd2luLnZpc3VhbFZpZXdwb3J0O1xuICAvLyByZXR1cm4gdlYgPyBNYXRoLmFicyh3aW4uaW5uZXJXaWR0aCAvIHZWLnNjYWxlIC0gdlYud2lkdGgpIDwgMC41IDogdHJ1ZTtcbn1cblxuY29uc3QgbWluID0gTWF0aC5taW47XG5jb25zdCBtYXggPSBNYXRoLm1heDtcbmNvbnN0IHJvdW5kID0gTWF0aC5yb3VuZDtcblxuZnVuY3Rpb24gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGluY2x1ZGVTY2FsZSwgaXNGaXhlZFN0cmF0ZWd5KSB7XG4gIHZhciBfd2luJHZpc3VhbFZpZXdwb3J0JG8sIF93aW4kdmlzdWFsVmlld3BvcnQsIF93aW4kdmlzdWFsVmlld3BvcnQkbzIsIF93aW4kdmlzdWFsVmlld3BvcnQyO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgPT09IHZvaWQgMCkge1xuICAgIGluY2x1ZGVTY2FsZSA9IGZhbHNlO1xuICB9XG5cbiAgaWYgKGlzRml4ZWRTdHJhdGVneSA9PT0gdm9pZCAwKSB7XG4gICAgaXNGaXhlZFN0cmF0ZWd5ID0gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjbGllbnRSZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgbGV0IHNjYWxlWCA9IDE7XG4gIGxldCBzY2FsZVkgPSAxO1xuXG4gIGlmIChpbmNsdWRlU2NhbGUgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSkge1xuICAgIHNjYWxlWCA9IGVsZW1lbnQub2Zmc2V0V2lkdGggPiAwID8gcm91bmQoY2xpZW50UmVjdC53aWR0aCkgLyBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDEgOiAxO1xuICAgIHNjYWxlWSA9IGVsZW1lbnQub2Zmc2V0SGVpZ2h0ID4gMCA/IHJvdW5kKGNsaWVudFJlY3QuaGVpZ2h0KSAvIGVsZW1lbnQub2Zmc2V0SGVpZ2h0IHx8IDEgOiAxO1xuICB9XG5cbiAgY29uc3Qgd2luID0gaXNFbGVtZW50KGVsZW1lbnQpID8gZ2V0V2luZG93KGVsZW1lbnQpIDogd2luZG93O1xuICBjb25zdCBhZGRWaXN1YWxPZmZzZXRzID0gIWlzTGF5b3V0Vmlld3BvcnQoKSAmJiBpc0ZpeGVkU3RyYXRlZ3k7XG4gIGNvbnN0IHggPSAoY2xpZW50UmVjdC5sZWZ0ICsgKGFkZFZpc3VhbE9mZnNldHMgPyAoX3dpbiR2aXN1YWxWaWV3cG9ydCRvID0gKF93aW4kdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQpID09IG51bGwgPyB2b2lkIDAgOiBfd2luJHZpc3VhbFZpZXdwb3J0Lm9mZnNldExlZnQpICE9IG51bGwgPyBfd2luJHZpc3VhbFZpZXdwb3J0JG8gOiAwIDogMCkpIC8gc2NhbGVYO1xuICBjb25zdCB5ID0gKGNsaWVudFJlY3QudG9wICsgKGFkZFZpc3VhbE9mZnNldHMgPyAoX3dpbiR2aXN1YWxWaWV3cG9ydCRvMiA9IChfd2luJHZpc3VhbFZpZXdwb3J0MiA9IHdpbi52aXN1YWxWaWV3cG9ydCkgPT0gbnVsbCA/IHZvaWQgMCA6IF93aW4kdmlzdWFsVmlld3BvcnQyLm9mZnNldFRvcCkgIT0gbnVsbCA/IF93aW4kdmlzdWFsVmlld3BvcnQkbzIgOiAwIDogMCkpIC8gc2NhbGVZO1xuICBjb25zdCB3aWR0aCA9IGNsaWVudFJlY3Qud2lkdGggLyBzY2FsZVg7XG4gIGNvbnN0IGhlaWdodCA9IGNsaWVudFJlY3QuaGVpZ2h0IC8gc2NhbGVZO1xuICByZXR1cm4ge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICB0b3A6IHksXG4gICAgcmlnaHQ6IHggKyB3aWR0aCxcbiAgICBib3R0b206IHkgKyBoZWlnaHQsXG4gICAgbGVmdDogeCxcbiAgICB4LFxuICAgIHlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KG5vZGUpIHtcbiAgcmV0dXJuICgoaXNOb2RlKG5vZGUpID8gbm9kZS5vd25lckRvY3VtZW50IDogbm9kZS5kb2N1bWVudCkgfHwgd2luZG93LmRvY3VtZW50KS5kb2N1bWVudEVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVTY3JvbGwoZWxlbWVudCkge1xuICBpZiAoaXNFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICAgIHNjcm9sbFRvcDogZWxlbWVudC5zY3JvbGxUb3BcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBlbGVtZW50LnBhZ2VYT2Zmc2V0LFxuICAgIHNjcm9sbFRvcDogZWxlbWVudC5wYWdlWU9mZnNldFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGxCYXJYKGVsZW1lbnQpIHtcbiAgLy8gSWYgPGh0bWw+IGhhcyBhIENTUyB3aWR0aCBncmVhdGVyIHRoYW4gdGhlIHZpZXdwb3J0LCB0aGVuIHRoaXMgd2lsbCBiZVxuICAvLyBpbmNvcnJlY3QgZm9yIFJUTC5cbiAgcmV0dXJuIGdldEJvdW5kaW5nQ2xpZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpLmxlZnQgKyBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpLnNjcm9sbExlZnQ7XG59XG5cbmZ1bmN0aW9uIGlzU2NhbGVkKGVsZW1lbnQpIHtcbiAgY29uc3QgcmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KTtcbiAgcmV0dXJuIHJvdW5kKHJlY3Qud2lkdGgpICE9PSBlbGVtZW50Lm9mZnNldFdpZHRoIHx8IHJvdW5kKHJlY3QuaGVpZ2h0KSAhPT0gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG59XG5cbmZ1bmN0aW9uIGdldFJlY3RSZWxhdGl2ZVRvT2Zmc2V0UGFyZW50KGVsZW1lbnQsIG9mZnNldFBhcmVudCwgc3RyYXRlZ3kpIHtcbiAgY29uc3QgaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgPSBpc0hUTUxFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIGNvbnN0IGRvY3VtZW50RWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIC8vIEB0cy1pZ25vcmUgLSBjaGVja2VkIGFib3ZlIChUUyA0LjEgY29tcGF0KVxuICBpc09mZnNldFBhcmVudEFuRWxlbWVudCAmJiBpc1NjYWxlZChvZmZzZXRQYXJlbnQpLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIGxldCBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgY29uc3Qgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmIHN0cmF0ZWd5ICE9PSAnZml4ZWQnKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB4OiByZWN0LmxlZnQgKyBzY3JvbGwuc2Nyb2xsTGVmdCAtIG9mZnNldHMueCxcbiAgICB5OiByZWN0LnRvcCArIHNjcm9sbC5zY3JvbGxUb3AgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRQYXJlbnROb2RlKG5vZGUpIHtcbiAgaWYgKGdldE5vZGVOYW1lKG5vZGUpID09PSAnaHRtbCcpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuXG4gIHJldHVybiAoLy8gdGhpcyBpcyBhIHF1aWNrZXIgKGJ1dCBsZXNzIHR5cGUgc2FmZSkgd2F5IHRvIHNhdmUgcXVpdGUgc29tZSBieXRlcyBmcm9tIHRoZSBidW5kbGVcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgbm9kZS5hc3NpZ25lZFNsb3QgfHwgLy8gc3RlcCBpbnRvIHRoZSBzaGFkb3cgRE9NIG9mIHRoZSBwYXJlbnQgb2YgYSBzbG90dGVkIG5vZGVcbiAgICBub2RlLnBhcmVudE5vZGUgfHwgKCAvLyBET00gRWxlbWVudCBkZXRlY3RlZFxuICAgIGlzU2hhZG93Um9vdChub2RlKSA/IG5vZGUuaG9zdCA6IG51bGwpIHx8IC8vIFNoYWRvd1Jvb3QgZGV0ZWN0ZWRcbiAgICBnZXREb2N1bWVudEVsZW1lbnQobm9kZSkgLy8gZmFsbGJhY2tcblxuICApO1xufVxuXG5mdW5jdGlvbiBnZXRUcnVlT2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgaWYgKCFpc0hUTUxFbGVtZW50KGVsZW1lbnQpIHx8IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkucG9zaXRpb24gPT09ICdmaXhlZCcpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBlbGVtZW50Lm9mZnNldFBhcmVudDtcbn1cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgbGV0IGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICBpZiAoaXNTaGFkb3dSb290KGN1cnJlbnROb2RlKSkge1xuICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUuaG9zdDtcbiAgfVxuXG4gIHdoaWxlIChpc0hUTUxFbGVtZW50KGN1cnJlbnROb2RlKSAmJiAhWydodG1sJywgJ2JvZHknXS5pbmNsdWRlcyhnZXROb2RlTmFtZShjdXJyZW50Tm9kZSkpKSB7XG4gICAgaWYgKGlzQ29udGFpbmluZ0Jsb2NrKGN1cnJlbnROb2RlKSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59IC8vIEdldHMgdGhlIGNsb3Nlc3QgYW5jZXN0b3IgcG9zaXRpb25lZCBlbGVtZW50LiBIYW5kbGVzIHNvbWUgZWRnZSBjYXNlcyxcbi8vIHN1Y2ggYXMgdGFibGUgYW5jZXN0b3JzIGFuZCBjcm9zcyBicm93c2VyIGJ1Z3MuXG5cblxuZnVuY3Rpb24gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIHtcbiAgY29uc3Qgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICBsZXQgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdodG1sJyB8fCBnZXROb2RlTmFtZShvZmZzZXRQYXJlbnQpID09PSAnYm9keScgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJyAmJiAhaXNDb250YWluaW5nQmxvY2sob2Zmc2V0UGFyZW50KSkpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufVxuXG5mdW5jdGlvbiBnZXREaW1lbnNpb25zKGVsZW1lbnQpIHtcbiAgaWYgKGlzSFRNTEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsXG4gICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IHJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0T2Zmc2V0UGFyZW50UmVsYXRpdmVSZWN0VG9WaWV3cG9ydFJlbGF0aXZlUmVjdChfcmVmKSB7XG4gIGxldCB7XG4gICAgcmVjdCxcbiAgICBvZmZzZXRQYXJlbnQsXG4gICAgc3RyYXRlZ3lcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICBjb25zdCBkb2N1bWVudEVsZW1lbnQgPSBnZXREb2N1bWVudEVsZW1lbnQob2Zmc2V0UGFyZW50KTtcblxuICBpZiAob2Zmc2V0UGFyZW50ID09PSBkb2N1bWVudEVsZW1lbnQpIHtcbiAgICByZXR1cm4gcmVjdDtcbiAgfVxuXG4gIGxldCBzY3JvbGwgPSB7XG4gICAgc2Nyb2xsTGVmdDogMCxcbiAgICBzY3JvbGxUb3A6IDBcbiAgfTtcbiAgY29uc3Qgb2Zmc2V0cyA9IHtcbiAgICB4OiAwLFxuICAgIHk6IDBcbiAgfTtcblxuICBpZiAoaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgfHwgIWlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ICYmIHN0cmF0ZWd5ICE9PSAnZml4ZWQnKSB7XG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgIT09ICdib2R5JyB8fCBpc092ZXJmbG93RWxlbWVudChkb2N1bWVudEVsZW1lbnQpKSB7XG4gICAgICBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKG9mZnNldFBhcmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGlzSFRNTEVsZW1lbnQob2Zmc2V0UGFyZW50KSkge1xuICAgICAgY29uc3Qgb2Zmc2V0UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChvZmZzZXRQYXJlbnQsIHRydWUpO1xuICAgICAgb2Zmc2V0cy54ID0gb2Zmc2V0UmVjdC54ICsgb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgPSBvZmZzZXRSZWN0LnkgKyBvZmZzZXRQYXJlbnQuY2xpZW50VG9wO1xuICAgIH0gLy8gVGhpcyBkb2Vzbid0IGFwcGVhciB0byBiZSBuZWVkIHRvIGJlIG5lZ2F0ZWQuXG4gICAgLy8gZWxzZSBpZiAoZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgLy8gICBvZmZzZXRzLnggPSBnZXRXaW5kb3dTY3JvbGxCYXJYKGRvY3VtZW50RWxlbWVudCk7XG4gICAgLy8gfVxuXG4gIH1cblxuICByZXR1cm4geyAuLi5yZWN0LFxuICAgIHg6IHJlY3QueCAtIHNjcm9sbC5zY3JvbGxMZWZ0ICsgb2Zmc2V0cy54LFxuICAgIHk6IHJlY3QueSAtIHNjcm9sbC5zY3JvbGxUb3AgKyBvZmZzZXRzLnlcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQsIHN0cmF0ZWd5KSB7XG4gIGNvbnN0IHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgY29uc3QgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KTtcbiAgY29uc3QgdmlzdWFsVmlld3BvcnQgPSB3aW4udmlzdWFsVmlld3BvcnQ7XG4gIGxldCB3aWR0aCA9IGh0bWwuY2xpZW50V2lkdGg7XG4gIGxldCBoZWlnaHQgPSBodG1sLmNsaWVudEhlaWdodDtcbiAgbGV0IHggPSAwO1xuICBsZXQgeSA9IDA7XG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7XG4gICAgY29uc3QgbGF5b3V0Vmlld3BvcnQgPSBpc0xheW91dFZpZXdwb3J0KCk7XG5cbiAgICBpZiAobGF5b3V0Vmlld3BvcnQgfHwgIWxheW91dFZpZXdwb3J0ICYmIHN0cmF0ZWd5ID09PSAnZml4ZWQnKSB7XG4gICAgICB4ID0gdmlzdWFsVmlld3BvcnQub2Zmc2V0TGVmdDtcbiAgICAgIHkgPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRUb3A7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgeCxcbiAgICB5XG4gIH07XG59XG5cbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIF9lbGVtZW50JG93bmVyRG9jdW1lbjtcblxuICBjb25zdCBodG1sID0gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpO1xuICBjb25zdCBzY3JvbGwgPSBnZXROb2RlU2Nyb2xsKGVsZW1lbnQpO1xuICBjb25zdCBib2R5ID0gKF9lbGVtZW50JG93bmVyRG9jdW1lbiA9IGVsZW1lbnQub3duZXJEb2N1bWVudCkgPT0gbnVsbCA/IHZvaWQgMCA6IF9lbGVtZW50JG93bmVyRG9jdW1lbi5ib2R5O1xuICBjb25zdCB3aWR0aCA9IG1heChodG1sLnNjcm9sbFdpZHRoLCBodG1sLmNsaWVudFdpZHRoLCBib2R5ID8gYm9keS5zY3JvbGxXaWR0aCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCk7XG4gIGNvbnN0IGhlaWdodCA9IG1heChodG1sLnNjcm9sbEhlaWdodCwgaHRtbC5jbGllbnRIZWlnaHQsIGJvZHkgPyBib2R5LnNjcm9sbEhlaWdodCA6IDAsIGJvZHkgPyBib2R5LmNsaWVudEhlaWdodCA6IDApO1xuICBsZXQgeCA9IC1zY3JvbGwuc2Nyb2xsTGVmdCArIGdldFdpbmRvd1Njcm9sbEJhclgoZWxlbWVudCk7XG4gIGNvbnN0IHkgPSAtc2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZSQxKGJvZHkgfHwgaHRtbCkuZGlyZWN0aW9uID09PSAncnRsJykge1xuICAgIHggKz0gbWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHgsXG4gICAgeVxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3Rvcihub2RlKSB7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSBnZXRQYXJlbnROb2RlKG5vZGUpO1xuXG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmNsdWRlcyhnZXROb2RlTmFtZShwYXJlbnROb2RlKSkpIHtcbiAgICAvLyBAdHMtaWdub3JlIGFzc3VtZSBib2R5IGlzIGFsd2F5cyBhdmFpbGFibGVcbiAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50LmJvZHk7XG4gIH1cblxuICBpZiAoaXNIVE1MRWxlbWVudChwYXJlbnROb2RlKSAmJiBpc092ZXJmbG93RWxlbWVudChwYXJlbnROb2RlKSkge1xuICAgIHJldHVybiBwYXJlbnROb2RlO1xuICB9XG5cbiAgcmV0dXJuIGdldE5lYXJlc3RPdmVyZmxvd0FuY2VzdG9yKHBhcmVudE5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRPdmVyZmxvd0FuY2VzdG9ycyhub2RlLCBsaXN0KSB7XG4gIHZhciBfbm9kZSRvd25lckRvY3VtZW50O1xuXG4gIGlmIChsaXN0ID09PSB2b2lkIDApIHtcbiAgICBsaXN0ID0gW107XG4gIH1cblxuICBjb25zdCBzY3JvbGxhYmxlQW5jZXN0b3IgPSBnZXROZWFyZXN0T3ZlcmZsb3dBbmNlc3Rvcihub2RlKTtcbiAgY29uc3QgaXNCb2R5ID0gc2Nyb2xsYWJsZUFuY2VzdG9yID09PSAoKF9ub2RlJG93bmVyRG9jdW1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQpID09IG51bGwgPyB2b2lkIDAgOiBfbm9kZSRvd25lckRvY3VtZW50LmJvZHkpO1xuICBjb25zdCB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsYWJsZUFuY2VzdG9yKTtcbiAgY29uc3QgdGFyZ2V0ID0gaXNCb2R5ID8gW3dpbl0uY29uY2F0KHdpbi52aXN1YWxWaWV3cG9ydCB8fCBbXSwgaXNPdmVyZmxvd0VsZW1lbnQoc2Nyb2xsYWJsZUFuY2VzdG9yKSA/IHNjcm9sbGFibGVBbmNlc3RvciA6IFtdKSA6IHNjcm9sbGFibGVBbmNlc3RvcjtcbiAgY29uc3QgdXBkYXRlZExpc3QgPSBsaXN0LmNvbmNhdCh0YXJnZXQpO1xuICByZXR1cm4gaXNCb2R5ID8gdXBkYXRlZExpc3QgOiAvLyBAdHMtaWdub3JlOiBpc0JvZHkgdGVsbHMgdXMgdGFyZ2V0IHdpbGwgYmUgYW4gSFRNTEVsZW1lbnQgaGVyZVxuICB1cGRhdGVkTGlzdC5jb25jYXQoZ2V0T3ZlcmZsb3dBbmNlc3RvcnModGFyZ2V0KSk7XG59XG5cbmZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHtcbiAgY29uc3Qgcm9vdE5vZGUgPSBjaGlsZC5nZXRSb290Tm9kZSA9PSBudWxsID8gdm9pZCAwIDogY2hpbGQuZ2V0Um9vdE5vZGUoKTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAocm9vdE5vZGUgJiYgaXNTaGFkb3dSb290KHJvb3ROb2RlKSkge1xuICAgIGxldCBuZXh0ID0gY2hpbGQ7XG5cbiAgICBkbyB7XG4gICAgICAvLyB1c2UgYD09PWAgcmVwbGFjZSBub2RlLmlzU2FtZU5vZGUoKVxuICAgICAgaWYgKG5leHQgJiYgcGFyZW50ID09PSBuZXh0KSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSAvLyBAdHMtaWdub3JlOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgIG5leHQgPSBuZXh0LnBhcmVudE5vZGUgfHwgbmV4dC5ob3N0O1xuICAgIH0gd2hpbGUgKG5leHQpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50LCBzdHJhdGVneSkge1xuICBjb25zdCBjbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQsIGZhbHNlLCBzdHJhdGVneSA9PT0gJ2ZpeGVkJyk7XG4gIGNvbnN0IHRvcCA9IGNsaWVudFJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIGNvbnN0IGxlZnQgPSBjbGllbnRSZWN0LmxlZnQgKyBlbGVtZW50LmNsaWVudExlZnQ7XG4gIHJldHVybiB7XG4gICAgdG9wLFxuICAgIGxlZnQsXG4gICAgeDogbGVmdCxcbiAgICB5OiB0b3AsXG4gICAgcmlnaHQ6IGxlZnQgKyBlbGVtZW50LmNsaWVudFdpZHRoLFxuICAgIGJvdHRvbTogdG9wICsgZWxlbWVudC5jbGllbnRIZWlnaHQsXG4gICAgd2lkdGg6IGVsZW1lbnQuY2xpZW50V2lkdGgsXG4gICAgaGVpZ2h0OiBlbGVtZW50LmNsaWVudEhlaWdodFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KSB7XG4gIGlmIChjbGlwcGluZ1BhcmVudCA9PT0gJ3ZpZXdwb3J0Jykge1xuICAgIHJldHVybiByZWN0VG9DbGllbnRSZWN0KGdldFZpZXdwb3J0UmVjdChlbGVtZW50LCBzdHJhdGVneSkpO1xuICB9XG5cbiAgaWYgKGlzRWxlbWVudChjbGlwcGluZ1BhcmVudCkpIHtcbiAgICByZXR1cm4gZ2V0SW5uZXJCb3VuZGluZ0NsaWVudFJlY3QoY2xpcHBpbmdQYXJlbnQsIHN0cmF0ZWd5KTtcbiAgfVxuXG4gIHJldHVybiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIGFuY2VzdG9yXCIgaXMgYW4gb3ZlcmZsb3dhYmxlIGNvbnRhaW5lciB3aXRoIHRoZSBjaGFyYWN0ZXJpc3RpYyBvZlxuLy8gY2xpcHBpbmcgKG9yIGhpZGluZykgb3ZlcmZsb3dpbmcgZWxlbWVudHMgd2l0aCBhIHBvc2l0aW9uIGRpZmZlcmVudCBmcm9tXG4vLyBgaW5pdGlhbGBcblxuXG5mdW5jdGlvbiBnZXRDbGlwcGluZ0FuY2VzdG9ycyhlbGVtZW50KSB7XG4gIGNvbnN0IGNsaXBwaW5nQW5jZXN0b3JzID0gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZWxlbWVudCk7XG4gIGNvbnN0IGNhbkVzY2FwZUNsaXBwaW5nID0gWydhYnNvbHV0ZScsICdmaXhlZCddLmluY2x1ZGVzKGdldENvbXB1dGVkU3R5bGUkMShlbGVtZW50KS5wb3NpdGlvbik7XG4gIGNvbnN0IGNsaXBwZXJFbGVtZW50ID0gY2FuRXNjYXBlQ2xpcHBpbmcgJiYgaXNIVE1MRWxlbWVudChlbGVtZW50KSA/IGdldE9mZnNldFBhcmVudChlbGVtZW50KSA6IGVsZW1lbnQ7XG5cbiAgaWYgKCFpc0VsZW1lbnQoY2xpcHBlckVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9IC8vIEB0cy1pZ25vcmUgaXNFbGVtZW50IGNoZWNrIGVuc3VyZXMgd2UgcmV0dXJuIEFycmF5PEVsZW1lbnQ+XG5cblxuICByZXR1cm4gY2xpcHBpbmdBbmNlc3RvcnMuZmlsdGVyKGNsaXBwaW5nQW5jZXN0b3JzID0+IGlzRWxlbWVudChjbGlwcGluZ0FuY2VzdG9ycykgJiYgY29udGFpbnMoY2xpcHBpbmdBbmNlc3RvcnMsIGNsaXBwZXJFbGVtZW50KSAmJiBnZXROb2RlTmFtZShjbGlwcGluZ0FuY2VzdG9ycykgIT09ICdib2R5Jyk7XG59IC8vIEdldHMgdGhlIG1heGltdW0gYXJlYSB0aGF0IHRoZSBlbGVtZW50IGlzIHZpc2libGUgaW4gZHVlIHRvIGFueSBudW1iZXIgb2Zcbi8vIGNsaXBwaW5nIGFuY2VzdG9yc1xuXG5cbmZ1bmN0aW9uIGdldENsaXBwaW5nUmVjdChfcmVmKSB7XG4gIGxldCB7XG4gICAgZWxlbWVudCxcbiAgICBib3VuZGFyeSxcbiAgICByb290Qm91bmRhcnksXG4gICAgc3RyYXRlZ3lcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IG1haW5DbGlwcGluZ0FuY2VzdG9ycyA9IGJvdW5kYXJ5ID09PSAnY2xpcHBpbmdBbmNlc3RvcnMnID8gZ2V0Q2xpcHBpbmdBbmNlc3RvcnMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICBjb25zdCBjbGlwcGluZ0FuY2VzdG9ycyA9IFsuLi5tYWluQ2xpcHBpbmdBbmNlc3RvcnMsIHJvb3RCb3VuZGFyeV07XG4gIGNvbnN0IGZpcnN0Q2xpcHBpbmdBbmNlc3RvciA9IGNsaXBwaW5nQW5jZXN0b3JzWzBdO1xuICBjb25zdCBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ0FuY2VzdG9ycy5yZWR1Y2UoKGFjY1JlY3QsIGNsaXBwaW5nQW5jZXN0b3IpID0+IHtcbiAgICBjb25zdCByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21DbGlwcGluZ0FuY2VzdG9yKGVsZW1lbnQsIGNsaXBwaW5nQW5jZXN0b3IsIHN0cmF0ZWd5KTtcbiAgICBhY2NSZWN0LnRvcCA9IG1heChyZWN0LnRvcCwgYWNjUmVjdC50b3ApO1xuICAgIGFjY1JlY3QucmlnaHQgPSBtaW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBtaW4ocmVjdC5ib3R0b20sIGFjY1JlY3QuYm90dG9tKTtcbiAgICBhY2NSZWN0LmxlZnQgPSBtYXgocmVjdC5sZWZ0LCBhY2NSZWN0LmxlZnQpO1xuICAgIHJldHVybiBhY2NSZWN0O1xuICB9LCBnZXRDbGllbnRSZWN0RnJvbUNsaXBwaW5nQW5jZXN0b3IoZWxlbWVudCwgZmlyc3RDbGlwcGluZ0FuY2VzdG9yLCBzdHJhdGVneSkpO1xuICByZXR1cm4ge1xuICAgIHdpZHRoOiBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdCxcbiAgICBoZWlnaHQ6IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wLFxuICAgIHg6IGNsaXBwaW5nUmVjdC5sZWZ0LFxuICAgIHk6IGNsaXBwaW5nUmVjdC50b3BcbiAgfTtcbn1cblxuY29uc3QgcGxhdGZvcm0gPSB7XG4gIGdldENsaXBwaW5nUmVjdCxcbiAgY29udmVydE9mZnNldFBhcmVudFJlbGF0aXZlUmVjdFRvVmlld3BvcnRSZWxhdGl2ZVJlY3QsXG4gIGlzRWxlbWVudCxcbiAgZ2V0RGltZW5zaW9ucyxcbiAgZ2V0T2Zmc2V0UGFyZW50LFxuICBnZXREb2N1bWVudEVsZW1lbnQsXG4gIGdldEVsZW1lbnRSZWN0czogX3JlZiA9PiB7XG4gICAgbGV0IHtcbiAgICAgIHJlZmVyZW5jZSxcbiAgICAgIGZsb2F0aW5nLFxuICAgICAgc3RyYXRlZ3lcbiAgICB9ID0gX3JlZjtcbiAgICByZXR1cm4ge1xuICAgICAgcmVmZXJlbmNlOiBnZXRSZWN0UmVsYXRpdmVUb09mZnNldFBhcmVudChyZWZlcmVuY2UsIGdldE9mZnNldFBhcmVudChmbG9hdGluZyksIHN0cmF0ZWd5KSxcbiAgICAgIGZsb2F0aW5nOiB7IC4uLmdldERpbWVuc2lvbnMoZmxvYXRpbmcpLFxuICAgICAgICB4OiAwLFxuICAgICAgICB5OiAwXG4gICAgICB9XG4gICAgfTtcbiAgfSxcbiAgZ2V0Q2xpZW50UmVjdHM6IGVsZW1lbnQgPT4gQXJyYXkuZnJvbShlbGVtZW50LmdldENsaWVudFJlY3RzKCkpLFxuICBpc1JUTDogZWxlbWVudCA9PiBnZXRDb21wdXRlZFN0eWxlJDEoZWxlbWVudCkuZGlyZWN0aW9uID09PSAncnRsJ1xufTtcblxuLyoqXG4gKiBBdXRvbWF0aWNhbGx5IHVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmbG9hdGluZyBlbGVtZW50IHdoZW4gbmVjZXNzYXJ5LlxuICogQHNlZSBodHRwczovL2Zsb2F0aW5nLXVpLmNvbS9kb2NzL2F1dG9VcGRhdGVcbiAqL1xuZnVuY3Rpb24gYXV0b1VwZGF0ZShyZWZlcmVuY2UsIGZsb2F0aW5nLCB1cGRhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhbmNlc3RvclNjcm9sbDogX2FuY2VzdG9yU2Nyb2xsID0gdHJ1ZSxcbiAgICBhbmNlc3RvclJlc2l6ZTogX2FuY2VzdG9yUmVzaXplID0gdHJ1ZSxcbiAgICBlbGVtZW50UmVzaXplID0gdHJ1ZSxcbiAgICBhbmltYXRpb25GcmFtZSA9IGZhbHNlXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhbmNlc3RvclNjcm9sbCA9IF9hbmNlc3RvclNjcm9sbCAmJiAhYW5pbWF0aW9uRnJhbWU7XG4gIGNvbnN0IGFuY2VzdG9yUmVzaXplID0gX2FuY2VzdG9yUmVzaXplICYmICFhbmltYXRpb25GcmFtZTtcbiAgY29uc3QgYW5jZXN0b3JzID0gYW5jZXN0b3JTY3JvbGwgfHwgYW5jZXN0b3JSZXNpemUgPyBbLi4uKGlzRWxlbWVudChyZWZlcmVuY2UpID8gZ2V0T3ZlcmZsb3dBbmNlc3RvcnMocmVmZXJlbmNlKSA6IFtdKSwgLi4uZ2V0T3ZlcmZsb3dBbmNlc3RvcnMoZmxvYXRpbmcpXSA6IFtdO1xuICBhbmNlc3RvcnMuZm9yRWFjaChhbmNlc3RvciA9PiB7XG4gICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgYW5jZXN0b3JSZXNpemUgJiYgYW5jZXN0b3IuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdXBkYXRlKTtcbiAgfSk7XG4gIGxldCBvYnNlcnZlciA9IG51bGw7XG5cbiAgaWYgKGVsZW1lbnRSZXNpemUpIHtcbiAgICBsZXQgaW5pdGlhbFVwZGF0ZSA9IHRydWU7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKCFpbml0aWFsVXBkYXRlKSB7XG4gICAgICAgIHVwZGF0ZSgpO1xuICAgICAgfVxuXG4gICAgICBpbml0aWFsVXBkYXRlID0gZmFsc2U7XG4gICAgfSk7XG4gICAgaXNFbGVtZW50KHJlZmVyZW5jZSkgJiYgIWFuaW1hdGlvbkZyYW1lICYmIG9ic2VydmVyLm9ic2VydmUocmVmZXJlbmNlKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGZsb2F0aW5nKTtcbiAgfVxuXG4gIGxldCBmcmFtZUlkO1xuICBsZXQgcHJldlJlZlJlY3QgPSBhbmltYXRpb25GcmFtZSA/IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpIDogbnVsbDtcblxuICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICBmcmFtZUxvb3AoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZyYW1lTG9vcCgpIHtcbiAgICBjb25zdCBuZXh0UmVmUmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdChyZWZlcmVuY2UpO1xuXG4gICAgaWYgKHByZXZSZWZSZWN0ICYmIChuZXh0UmVmUmVjdC54ICE9PSBwcmV2UmVmUmVjdC54IHx8IG5leHRSZWZSZWN0LnkgIT09IHByZXZSZWZSZWN0LnkgfHwgbmV4dFJlZlJlY3Qud2lkdGggIT09IHByZXZSZWZSZWN0LndpZHRoIHx8IG5leHRSZWZSZWN0LmhlaWdodCAhPT0gcHJldlJlZlJlY3QuaGVpZ2h0KSkge1xuICAgICAgdXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcHJldlJlZlJlY3QgPSBuZXh0UmVmUmVjdDtcbiAgICBmcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZyYW1lTG9vcCk7XG4gIH1cblxuICB1cGRhdGUoKTtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB2YXIgX29ic2VydmVyO1xuXG4gICAgYW5jZXN0b3JzLmZvckVhY2goYW5jZXN0b3IgPT4ge1xuICAgICAgYW5jZXN0b3JTY3JvbGwgJiYgYW5jZXN0b3IucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdXBkYXRlKTtcbiAgICAgIGFuY2VzdG9yUmVzaXplICYmIGFuY2VzdG9yLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHVwZGF0ZSk7XG4gICAgfSk7XG4gICAgKF9vYnNlcnZlciA9IG9ic2VydmVyKSA9PSBudWxsID8gdm9pZCAwIDogX29ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICBvYnNlcnZlciA9IG51bGw7XG5cbiAgICBpZiAoYW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGZyYW1lSWQpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYHhgIGFuZCBgeWAgY29vcmRpbmF0ZXMgdGhhdCB3aWxsIHBsYWNlIHRoZSBmbG9hdGluZyBlbGVtZW50XG4gKiBuZXh0IHRvIGEgcmVmZXJlbmNlIGVsZW1lbnQgd2hlbiBpdCBpcyBnaXZlbiBhIGNlcnRhaW4gQ1NTIHBvc2l0aW9uaW5nXG4gKiBzdHJhdGVneS5cbiAqL1xuXG5jb25zdCBjb21wdXRlUG9zaXRpb24gPSAocmVmZXJlbmNlLCBmbG9hdGluZywgb3B0aW9ucykgPT4gY29tcHV0ZVBvc2l0aW9uJDEocmVmZXJlbmNlLCBmbG9hdGluZywge1xuICBwbGF0Zm9ybSxcbiAgLi4ub3B0aW9uc1xufSk7XG5cbmV4cG9ydCB7IGF1dG9VcGRhdGUsIGNvbXB1dGVQb3NpdGlvbiwgZ2V0T3ZlcmZsb3dBbmNlc3RvcnMgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/@floating-ui/dom/dist/floating-ui.dom.browser.mjs\n");
5470
5470
 
5471
5471
  /***/ }),
5472
5472
 
@@ -5477,7 +5477,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5477
5477
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5478
5478
 
5479
5479
  "use strict";
5480
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"hachureLines\": () => (/* binding */ hachureLines)\n/* harmony export */ });\nfunction rotatePoints(points, center, degrees) {\n if (points && points.length) {\n const [cx, cy] = center;\n const angle = (Math.PI / 180) * degrees;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n for (const p of points) {\n const [x, y] = p;\n p[0] = ((x - cx) * cos) - ((y - cy) * sin) + cx;\n p[1] = ((x - cx) * sin) + ((y - cy) * cos) + cy;\n }\n }\n}\nfunction rotateLines(lines, center, degrees) {\n const points = [];\n lines.forEach((line) => points.push(...line));\n rotatePoints(points, center, degrees);\n}\nfunction areSamePoints(p1, p2) {\n return p1[0] === p2[0] && p1[1] === p2[1];\n}\nfunction hachureLines(polygons, hachureGap, hachureAngle, hachureStepOffset = 1) {\n const angle = hachureAngle;\n const gap = Math.max(hachureGap, 0.1);\n const polygonList = (polygons[0] && polygons[0][0] && (typeof polygons[0][0] === 'number')) ? [polygons] : polygons;\n const rotationCenter = [0, 0];\n if (angle) {\n for (const polygon of polygonList) {\n rotatePoints(polygon, rotationCenter, angle);\n }\n }\n const lines = straightHachureLines(polygonList, gap, hachureStepOffset);\n if (angle) {\n for (const polygon of polygonList) {\n rotatePoints(polygon, rotationCenter, -angle);\n }\n rotateLines(lines, rotationCenter, -angle);\n }\n return lines;\n}\nfunction straightHachureLines(polygons, gap, hachureStepOffset) {\n const vertexArray = [];\n for (const polygon of polygons) {\n const vertices = [...polygon];\n if (!areSamePoints(vertices[0], vertices[vertices.length - 1])) {\n vertices.push([vertices[0][0], vertices[0][1]]);\n }\n if (vertices.length > 2) {\n vertexArray.push(vertices);\n }\n }\n const lines = [];\n gap = Math.max(gap, 0.1);\n // Create sorted edges table\n const edges = [];\n for (const vertices of vertexArray) {\n for (let i = 0; i < vertices.length - 1; i++) {\n const p1 = vertices[i];\n const p2 = vertices[i + 1];\n if (p1[1] !== p2[1]) {\n const ymin = Math.min(p1[1], p2[1]);\n edges.push({\n ymin,\n ymax: Math.max(p1[1], p2[1]),\n x: ymin === p1[1] ? p1[0] : p2[0],\n islope: (p2[0] - p1[0]) / (p2[1] - p1[1]),\n });\n }\n }\n }\n edges.sort((e1, e2) => {\n if (e1.ymin < e2.ymin) {\n return -1;\n }\n if (e1.ymin > e2.ymin) {\n return 1;\n }\n if (e1.x < e2.x) {\n return -1;\n }\n if (e1.x > e2.x) {\n return 1;\n }\n if (e1.ymax === e2.ymax) {\n return 0;\n }\n return (e1.ymax - e2.ymax) / Math.abs((e1.ymax - e2.ymax));\n });\n if (!edges.length) {\n return lines;\n }\n // Start scanning\n let activeEdges = [];\n let y = edges[0].ymin;\n let iteration = 0;\n while (activeEdges.length || edges.length) {\n if (edges.length) {\n let ix = -1;\n for (let i = 0; i < edges.length; i++) {\n if (edges[i].ymin > y) {\n break;\n }\n ix = i;\n }\n const removed = edges.splice(0, ix + 1);\n removed.forEach((edge) => {\n activeEdges.push({ s: y, edge });\n });\n }\n activeEdges = activeEdges.filter((ae) => {\n if (ae.edge.ymax <= y) {\n return false;\n }\n return true;\n });\n activeEdges.sort((ae1, ae2) => {\n if (ae1.edge.x === ae2.edge.x) {\n return 0;\n }\n return (ae1.edge.x - ae2.edge.x) / Math.abs((ae1.edge.x - ae2.edge.x));\n });\n // fill between the edges\n if ((hachureStepOffset !== 1) || (iteration % gap === 0)) {\n if (activeEdges.length > 1) {\n for (let i = 0; i < activeEdges.length; i = i + 2) {\n const nexti = i + 1;\n if (nexti >= activeEdges.length) {\n break;\n }\n const ce = activeEdges[i].edge;\n const ne = activeEdges[nexti].edge;\n lines.push([\n [Math.round(ce.x), y],\n [Math.round(ne.x), y],\n ]);\n }\n }\n }\n y += hachureStepOffset;\n activeEdges.forEach((ae) => {\n ae.edge.x = ae.edge.x + (hachureStepOffset * ae.edge.islope);\n });\n iteration++;\n }\n return lines;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hhY2h1cmUtZmlsbC9iaW4vaGFjaHVyZS5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsa0JBQWtCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFlBQVk7QUFDL0MsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3QkFBd0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hhY2h1cmUtZmlsbC9iaW4vaGFjaHVyZS5qcz8yZGM0Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHJvdGF0ZVBvaW50cyhwb2ludHMsIGNlbnRlciwgZGVncmVlcykge1xuICAgIGlmIChwb2ludHMgJiYgcG9pbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBbY3gsIGN5XSA9IGNlbnRlcjtcbiAgICAgICAgY29uc3QgYW5nbGUgPSAoTWF0aC5QSSAvIDE4MCkgKiBkZWdyZWVzO1xuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBvaW50cykge1xuICAgICAgICAgICAgY29uc3QgW3gsIHldID0gcDtcbiAgICAgICAgICAgIHBbMF0gPSAoKHggLSBjeCkgKiBjb3MpIC0gKCh5IC0gY3kpICogc2luKSArIGN4O1xuICAgICAgICAgICAgcFsxXSA9ICgoeCAtIGN4KSAqIHNpbikgKyAoKHkgLSBjeSkgKiBjb3MpICsgY3k7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByb3RhdGVMaW5lcyhsaW5lcywgY2VudGVyLCBkZWdyZWVzKSB7XG4gICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4gcG9pbnRzLnB1c2goLi4ubGluZSkpO1xuICAgIHJvdGF0ZVBvaW50cyhwb2ludHMsIGNlbnRlciwgZGVncmVlcyk7XG59XG5mdW5jdGlvbiBhcmVTYW1lUG9pbnRzKHAxLCBwMikge1xuICAgIHJldHVybiBwMVswXSA9PT0gcDJbMF0gJiYgcDFbMV0gPT09IHAyWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhY2h1cmVMaW5lcyhwb2x5Z29ucywgaGFjaHVyZUdhcCwgaGFjaHVyZUFuZ2xlLCBoYWNodXJlU3RlcE9mZnNldCA9IDEpIHtcbiAgICBjb25zdCBhbmdsZSA9IGhhY2h1cmVBbmdsZTtcbiAgICBjb25zdCBnYXAgPSBNYXRoLm1heChoYWNodXJlR2FwLCAwLjEpO1xuICAgIGNvbnN0IHBvbHlnb25MaXN0ID0gKHBvbHlnb25zWzBdICYmIHBvbHlnb25zWzBdWzBdICYmICh0eXBlb2YgcG9seWdvbnNbMF1bMF0gPT09ICdudW1iZXInKSkgPyBbcG9seWdvbnNdIDogcG9seWdvbnM7XG4gICAgY29uc3Qgcm90YXRpb25DZW50ZXIgPSBbMCwgMF07XG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBwb2x5Z29uTGlzdCkge1xuICAgICAgICAgICAgcm90YXRlUG9pbnRzKHBvbHlnb24sIHJvdGF0aW9uQ2VudGVyLCBhbmdsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBzdHJhaWdodEhhY2h1cmVMaW5lcyhwb2x5Z29uTGlzdCwgZ2FwLCBoYWNodXJlU3RlcE9mZnNldCk7XG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBwb2x5Z29uTGlzdCkge1xuICAgICAgICAgICAgcm90YXRlUG9pbnRzKHBvbHlnb24sIHJvdGF0aW9uQ2VudGVyLCAtYW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJvdGF0ZUxpbmVzKGxpbmVzLCByb3RhdGlvbkNlbnRlciwgLWFuZ2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuZnVuY3Rpb24gc3RyYWlnaHRIYWNodXJlTGluZXMocG9seWdvbnMsIGdhcCwgaGFjaHVyZVN0ZXBPZmZzZXQpIHtcbiAgICBjb25zdCB2ZXJ0ZXhBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBwb2x5Z29ucykge1xuICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IFsuLi5wb2x5Z29uXTtcbiAgICAgICAgaWYgKCFhcmVTYW1lUG9pbnRzKHZlcnRpY2VzWzBdLCB2ZXJ0aWNlc1t2ZXJ0aWNlcy5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goW3ZlcnRpY2VzWzBdWzBdLCB2ZXJ0aWNlc1swXVsxXV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2ZXJ0aWNlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhBcnJheS5wdXNoKHZlcnRpY2VzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGdhcCA9IE1hdGgubWF4KGdhcCwgMC4xKTtcbiAgICAvLyBDcmVhdGUgc29ydGVkIGVkZ2VzIHRhYmxlXG4gICAgY29uc3QgZWRnZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZlcnRpY2VzIG9mIHZlcnRleEFycmF5KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwMSA9IHZlcnRpY2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgcDIgPSB2ZXJ0aWNlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocDFbMV0gIT09IHAyWzFdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeW1pbiA9IE1hdGgubWluKHAxWzFdLCBwMlsxXSk7XG4gICAgICAgICAgICAgICAgZWRnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHltaW4sXG4gICAgICAgICAgICAgICAgICAgIHltYXg6IE1hdGgubWF4KHAxWzFdLCBwMlsxXSksXG4gICAgICAgICAgICAgICAgICAgIHg6IHltaW4gPT09IHAxWzFdID8gcDFbMF0gOiBwMlswXSxcbiAgICAgICAgICAgICAgICAgICAgaXNsb3BlOiAocDJbMF0gLSBwMVswXSkgLyAocDJbMV0gLSBwMVsxXSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWRnZXMuc29ydCgoZTEsIGUyKSA9PiB7XG4gICAgICAgIGlmIChlMS55bWluIDwgZTIueW1pbikge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlMS55bWluID4gZTIueW1pbikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUxLnggPCBlMi54KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUxLnggPiBlMi54KSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZTEueW1heCA9PT0gZTIueW1heCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChlMS55bWF4IC0gZTIueW1heCkgLyBNYXRoLmFicygoZTEueW1heCAtIGUyLnltYXgpKTtcbiAgICB9KTtcbiAgICBpZiAoIWVkZ2VzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuICAgIC8vIFN0YXJ0IHNjYW5uaW5nXG4gICAgbGV0IGFjdGl2ZUVkZ2VzID0gW107XG4gICAgbGV0IHkgPSBlZGdlc1swXS55bWluO1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgIHdoaWxlIChhY3RpdmVFZGdlcy5sZW5ndGggfHwgZWRnZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBpeCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChlZGdlc1tpXS55bWluID4geSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGVkZ2VzLnNwbGljZSgwLCBpeCArIDEpO1xuICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWRnZXMucHVzaCh7IHM6IHksIGVkZ2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVFZGdlcyA9IGFjdGl2ZUVkZ2VzLmZpbHRlcigoYWUpID0+IHtcbiAgICAgICAgICAgIGlmIChhZS5lZGdlLnltYXggPD0geSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlRWRnZXMuc29ydCgoYWUxLCBhZTIpID0+IHtcbiAgICAgICAgICAgIGlmIChhZTEuZWRnZS54ID09PSBhZTIuZWRnZS54KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGFlMS5lZGdlLnggLSBhZTIuZWRnZS54KSAvIE1hdGguYWJzKChhZTEuZWRnZS54IC0gYWUyLmVkZ2UueCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZmlsbCBiZXR3ZWVuIHRoZSBlZGdlc1xuICAgICAgICBpZiAoKGhhY2h1cmVTdGVwT2Zmc2V0ICE9PSAxKSB8fCAoaXRlcmF0aW9uICUgZ2FwID09PSAwKSkge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUVkZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZUVkZ2VzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRpID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0aSA+PSBhY3RpdmVFZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlID0gYWN0aXZlRWRnZXNbaV0uZWRnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmUgPSBhY3RpdmVFZGdlc1tuZXh0aV0uZWRnZTtcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICBbTWF0aC5yb3VuZChjZS54KSwgeV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbTWF0aC5yb3VuZChuZS54KSwgeV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5ICs9IGhhY2h1cmVTdGVwT2Zmc2V0O1xuICAgICAgICBhY3RpdmVFZGdlcy5mb3JFYWNoKChhZSkgPT4ge1xuICAgICAgICAgICAgYWUuZWRnZS54ID0gYWUuZWRnZS54ICsgKGhhY2h1cmVTdGVwT2Zmc2V0ICogYWUuZWRnZS5pc2xvcGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlcmF0aW9uKys7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/hachure-fill/bin/hachure.js\n");
5480
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"hachureLines\": () => (/* binding */ hachureLines)\n/* harmony export */ });\nfunction rotatePoints(points, center, degrees) {\n if (points && points.length) {\n const [cx, cy] = center;\n const angle = (Math.PI / 180) * degrees;\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n for (const p of points) {\n const [x, y] = p;\n p[0] = ((x - cx) * cos) - ((y - cy) * sin) + cx;\n p[1] = ((x - cx) * sin) + ((y - cy) * cos) + cy;\n }\n }\n}\nfunction rotateLines(lines, center, degrees) {\n const points = [];\n lines.forEach((line) => points.push(...line));\n rotatePoints(points, center, degrees);\n}\nfunction areSamePoints(p1, p2) {\n return p1[0] === p2[0] && p1[1] === p2[1];\n}\nfunction hachureLines(polygons, hachureGap, hachureAngle, hachureStepOffset = 1) {\n const angle = hachureAngle;\n const gap = Math.max(hachureGap, 0.1);\n const polygonList = (polygons[0] && polygons[0][0] && (typeof polygons[0][0] === 'number')) ? [polygons] : polygons;\n const rotationCenter = [0, 0];\n if (angle) {\n for (const polygon of polygonList) {\n rotatePoints(polygon, rotationCenter, angle);\n }\n }\n const lines = straightHachureLines(polygonList, gap, hachureStepOffset);\n if (angle) {\n for (const polygon of polygonList) {\n rotatePoints(polygon, rotationCenter, -angle);\n }\n rotateLines(lines, rotationCenter, -angle);\n }\n return lines;\n}\nfunction straightHachureLines(polygons, gap, hachureStepOffset) {\n const vertexArray = [];\n for (const polygon of polygons) {\n const vertices = [...polygon];\n if (!areSamePoints(vertices[0], vertices[vertices.length - 1])) {\n vertices.push([vertices[0][0], vertices[0][1]]);\n }\n if (vertices.length > 2) {\n vertexArray.push(vertices);\n }\n }\n const lines = [];\n gap = Math.max(gap, 0.1);\n // Create sorted edges table\n const edges = [];\n for (const vertices of vertexArray) {\n for (let i = 0; i < vertices.length - 1; i++) {\n const p1 = vertices[i];\n const p2 = vertices[i + 1];\n if (p1[1] !== p2[1]) {\n const ymin = Math.min(p1[1], p2[1]);\n edges.push({\n ymin,\n ymax: Math.max(p1[1], p2[1]),\n x: ymin === p1[1] ? p1[0] : p2[0],\n islope: (p2[0] - p1[0]) / (p2[1] - p1[1]),\n });\n }\n }\n }\n edges.sort((e1, e2) => {\n if (e1.ymin < e2.ymin) {\n return -1;\n }\n if (e1.ymin > e2.ymin) {\n return 1;\n }\n if (e1.x < e2.x) {\n return -1;\n }\n if (e1.x > e2.x) {\n return 1;\n }\n if (e1.ymax === e2.ymax) {\n return 0;\n }\n return (e1.ymax - e2.ymax) / Math.abs((e1.ymax - e2.ymax));\n });\n if (!edges.length) {\n return lines;\n }\n // Start scanning\n let activeEdges = [];\n let y = edges[0].ymin;\n let iteration = 0;\n while (activeEdges.length || edges.length) {\n if (edges.length) {\n let ix = -1;\n for (let i = 0; i < edges.length; i++) {\n if (edges[i].ymin > y) {\n break;\n }\n ix = i;\n }\n const removed = edges.splice(0, ix + 1);\n removed.forEach((edge) => {\n activeEdges.push({ s: y, edge });\n });\n }\n activeEdges = activeEdges.filter((ae) => {\n if (ae.edge.ymax <= y) {\n return false;\n }\n return true;\n });\n activeEdges.sort((ae1, ae2) => {\n if (ae1.edge.x === ae2.edge.x) {\n return 0;\n }\n return (ae1.edge.x - ae2.edge.x) / Math.abs((ae1.edge.x - ae2.edge.x));\n });\n // fill between the edges\n if ((hachureStepOffset !== 1) || (iteration % gap === 0)) {\n if (activeEdges.length > 1) {\n for (let i = 0; i < activeEdges.length; i = i + 2) {\n const nexti = i + 1;\n if (nexti >= activeEdges.length) {\n break;\n }\n const ce = activeEdges[i].edge;\n const ne = activeEdges[nexti].edge;\n lines.push([\n [Math.round(ce.x), y],\n [Math.round(ne.x), y],\n ]);\n }\n }\n }\n y += hachureStepOffset;\n activeEdges.forEach((ae) => {\n ae.edge.x = ae.edge.x + (hachureStepOffset * ae.edge.islope);\n });\n iteration++;\n }\n return lines;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hhY2h1cmUtZmlsbC9iaW4vaGFjaHVyZS5qcy5qcyIsIm1hcHBpbmdzIjoiOzs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5QkFBeUI7QUFDakQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEIsa0JBQWtCO0FBQzlDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUNBQW1DLFlBQVk7QUFDL0MsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLGdDQUFnQyx3QkFBd0I7QUFDeEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2hhY2h1cmUtZmlsbC9iaW4vaGFjaHVyZS5qcz9hNjU5Il0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIHJvdGF0ZVBvaW50cyhwb2ludHMsIGNlbnRlciwgZGVncmVlcykge1xuICAgIGlmIChwb2ludHMgJiYgcG9pbnRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBbY3gsIGN5XSA9IGNlbnRlcjtcbiAgICAgICAgY29uc3QgYW5nbGUgPSAoTWF0aC5QSSAvIDE4MCkgKiBkZWdyZWVzO1xuICAgICAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gICAgICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgICAgICAgZm9yIChjb25zdCBwIG9mIHBvaW50cykge1xuICAgICAgICAgICAgY29uc3QgW3gsIHldID0gcDtcbiAgICAgICAgICAgIHBbMF0gPSAoKHggLSBjeCkgKiBjb3MpIC0gKCh5IC0gY3kpICogc2luKSArIGN4O1xuICAgICAgICAgICAgcFsxXSA9ICgoeCAtIGN4KSAqIHNpbikgKyAoKHkgLSBjeSkgKiBjb3MpICsgY3k7XG4gICAgICAgIH1cbiAgICB9XG59XG5mdW5jdGlvbiByb3RhdGVMaW5lcyhsaW5lcywgY2VudGVyLCBkZWdyZWVzKSB7XG4gICAgY29uc3QgcG9pbnRzID0gW107XG4gICAgbGluZXMuZm9yRWFjaCgobGluZSkgPT4gcG9pbnRzLnB1c2goLi4ubGluZSkpO1xuICAgIHJvdGF0ZVBvaW50cyhwb2ludHMsIGNlbnRlciwgZGVncmVlcyk7XG59XG5mdW5jdGlvbiBhcmVTYW1lUG9pbnRzKHAxLCBwMikge1xuICAgIHJldHVybiBwMVswXSA9PT0gcDJbMF0gJiYgcDFbMV0gPT09IHAyWzFdO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGhhY2h1cmVMaW5lcyhwb2x5Z29ucywgaGFjaHVyZUdhcCwgaGFjaHVyZUFuZ2xlLCBoYWNodXJlU3RlcE9mZnNldCA9IDEpIHtcbiAgICBjb25zdCBhbmdsZSA9IGhhY2h1cmVBbmdsZTtcbiAgICBjb25zdCBnYXAgPSBNYXRoLm1heChoYWNodXJlR2FwLCAwLjEpO1xuICAgIGNvbnN0IHBvbHlnb25MaXN0ID0gKHBvbHlnb25zWzBdICYmIHBvbHlnb25zWzBdWzBdICYmICh0eXBlb2YgcG9seWdvbnNbMF1bMF0gPT09ICdudW1iZXInKSkgPyBbcG9seWdvbnNdIDogcG9seWdvbnM7XG4gICAgY29uc3Qgcm90YXRpb25DZW50ZXIgPSBbMCwgMF07XG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBwb2x5Z29uTGlzdCkge1xuICAgICAgICAgICAgcm90YXRlUG9pbnRzKHBvbHlnb24sIHJvdGF0aW9uQ2VudGVyLCBhbmdsZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbGluZXMgPSBzdHJhaWdodEhhY2h1cmVMaW5lcyhwb2x5Z29uTGlzdCwgZ2FwLCBoYWNodXJlU3RlcE9mZnNldCk7XG4gICAgaWYgKGFuZ2xlKSB7XG4gICAgICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBwb2x5Z29uTGlzdCkge1xuICAgICAgICAgICAgcm90YXRlUG9pbnRzKHBvbHlnb24sIHJvdGF0aW9uQ2VudGVyLCAtYW5nbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJvdGF0ZUxpbmVzKGxpbmVzLCByb3RhdGlvbkNlbnRlciwgLWFuZ2xlKTtcbiAgICB9XG4gICAgcmV0dXJuIGxpbmVzO1xufVxuZnVuY3Rpb24gc3RyYWlnaHRIYWNodXJlTGluZXMocG9seWdvbnMsIGdhcCwgaGFjaHVyZVN0ZXBPZmZzZXQpIHtcbiAgICBjb25zdCB2ZXJ0ZXhBcnJheSA9IFtdO1xuICAgIGZvciAoY29uc3QgcG9seWdvbiBvZiBwb2x5Z29ucykge1xuICAgICAgICBjb25zdCB2ZXJ0aWNlcyA9IFsuLi5wb2x5Z29uXTtcbiAgICAgICAgaWYgKCFhcmVTYW1lUG9pbnRzKHZlcnRpY2VzWzBdLCB2ZXJ0aWNlc1t2ZXJ0aWNlcy5sZW5ndGggLSAxXSkpIHtcbiAgICAgICAgICAgIHZlcnRpY2VzLnB1c2goW3ZlcnRpY2VzWzBdWzBdLCB2ZXJ0aWNlc1swXVsxXV0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2ZXJ0aWNlcy5sZW5ndGggPiAyKSB7XG4gICAgICAgICAgICB2ZXJ0ZXhBcnJheS5wdXNoKHZlcnRpY2VzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBsaW5lcyA9IFtdO1xuICAgIGdhcCA9IE1hdGgubWF4KGdhcCwgMC4xKTtcbiAgICAvLyBDcmVhdGUgc29ydGVkIGVkZ2VzIHRhYmxlXG4gICAgY29uc3QgZWRnZXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZlcnRpY2VzIG9mIHZlcnRleEFycmF5KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBwMSA9IHZlcnRpY2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgcDIgPSB2ZXJ0aWNlc1tpICsgMV07XG4gICAgICAgICAgICBpZiAocDFbMV0gIT09IHAyWzFdKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeW1pbiA9IE1hdGgubWluKHAxWzFdLCBwMlsxXSk7XG4gICAgICAgICAgICAgICAgZWRnZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHltaW4sXG4gICAgICAgICAgICAgICAgICAgIHltYXg6IE1hdGgubWF4KHAxWzFdLCBwMlsxXSksXG4gICAgICAgICAgICAgICAgICAgIHg6IHltaW4gPT09IHAxWzFdID8gcDFbMF0gOiBwMlswXSxcbiAgICAgICAgICAgICAgICAgICAgaXNsb3BlOiAocDJbMF0gLSBwMVswXSkgLyAocDJbMV0gLSBwMVsxXSksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWRnZXMuc29ydCgoZTEsIGUyKSA9PiB7XG4gICAgICAgIGlmIChlMS55bWluIDwgZTIueW1pbikge1xuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlMS55bWluID4gZTIueW1pbikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUxLnggPCBlMi54KSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGUxLnggPiBlMi54KSB7XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZTEueW1heCA9PT0gZTIueW1heCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChlMS55bWF4IC0gZTIueW1heCkgLyBNYXRoLmFicygoZTEueW1heCAtIGUyLnltYXgpKTtcbiAgICB9KTtcbiAgICBpZiAoIWVkZ2VzLmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbGluZXM7XG4gICAgfVxuICAgIC8vIFN0YXJ0IHNjYW5uaW5nXG4gICAgbGV0IGFjdGl2ZUVkZ2VzID0gW107XG4gICAgbGV0IHkgPSBlZGdlc1swXS55bWluO1xuICAgIGxldCBpdGVyYXRpb24gPSAwO1xuICAgIHdoaWxlIChhY3RpdmVFZGdlcy5sZW5ndGggfHwgZWRnZXMubGVuZ3RoKSB7XG4gICAgICAgIGlmIChlZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBpeCA9IC0xO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlZGdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChlZGdlc1tpXS55bWluID4geSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaXggPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVtb3ZlZCA9IGVkZ2VzLnNwbGljZSgwLCBpeCArIDEpO1xuICAgICAgICAgICAgcmVtb3ZlZC5mb3JFYWNoKChlZGdlKSA9PiB7XG4gICAgICAgICAgICAgICAgYWN0aXZlRWRnZXMucHVzaCh7IHM6IHksIGVkZ2UgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBhY3RpdmVFZGdlcyA9IGFjdGl2ZUVkZ2VzLmZpbHRlcigoYWUpID0+IHtcbiAgICAgICAgICAgIGlmIChhZS5lZGdlLnltYXggPD0geSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KTtcbiAgICAgICAgYWN0aXZlRWRnZXMuc29ydCgoYWUxLCBhZTIpID0+IHtcbiAgICAgICAgICAgIGlmIChhZTEuZWRnZS54ID09PSBhZTIuZWRnZS54KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gKGFlMS5lZGdlLnggLSBhZTIuZWRnZS54KSAvIE1hdGguYWJzKChhZTEuZWRnZS54IC0gYWUyLmVkZ2UueCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gZmlsbCBiZXR3ZWVuIHRoZSBlZGdlc1xuICAgICAgICBpZiAoKGhhY2h1cmVTdGVwT2Zmc2V0ICE9PSAxKSB8fCAoaXRlcmF0aW9uICUgZ2FwID09PSAwKSkge1xuICAgICAgICAgICAgaWYgKGFjdGl2ZUVkZ2VzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFjdGl2ZUVkZ2VzLmxlbmd0aDsgaSA9IGkgKyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5leHRpID0gaSArIDE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0aSA+PSBhY3RpdmVFZGdlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlID0gYWN0aXZlRWRnZXNbaV0uZWRnZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmUgPSBhY3RpdmVFZGdlc1tuZXh0aV0uZWRnZTtcbiAgICAgICAgICAgICAgICAgICAgbGluZXMucHVzaChbXG4gICAgICAgICAgICAgICAgICAgICAgICBbTWF0aC5yb3VuZChjZS54KSwgeV0sXG4gICAgICAgICAgICAgICAgICAgICAgICBbTWF0aC5yb3VuZChuZS54KSwgeV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB5ICs9IGhhY2h1cmVTdGVwT2Zmc2V0O1xuICAgICAgICBhY3RpdmVFZGdlcy5mb3JFYWNoKChhZSkgPT4ge1xuICAgICAgICAgICAgYWUuZWRnZS54ID0gYWUuZWRnZS54ICsgKGhhY2h1cmVTdGVwT2Zmc2V0ICogYWUuZWRnZS5pc2xvcGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgaXRlcmF0aW9uKys7XG4gICAgfVxuICAgIHJldHVybiBsaW5lcztcbn1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/hachure-fill/bin/hachure.js\n");
5481
5481
 
5482
5482
  /***/ }),
5483
5483
 
@@ -5488,7 +5488,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5488
5488
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5489
5489
 
5490
5490
  "use strict";
5491
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Provider\": () => (/* binding */ Provider),\n/* harmony export */ \"SECRET_INTERNAL_getScopeContext\": () => (/* binding */ getScopeContext),\n/* harmony export */ \"SECRET_INTERNAL_registerPromiseAbort\": () => (/* binding */ registerPromiseAbort),\n/* harmony export */ \"atom\": () => (/* binding */ atom),\n/* harmony export */ \"unstable_createStore\": () => (/* binding */ createStoreForExport),\n/* harmony export */ \"useAtom\": () => (/* binding */ useAtom),\n/* harmony export */ \"useAtomValue\": () => (/* binding */ useAtomValue),\n/* harmony export */ \"useSetAtom\": () => (/* binding */ useSetAtom)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var jotai_vanilla__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jotai/vanilla */ \"../../../node_modules/jotai/esm/vanilla.mjs\");\n\n\n\nconst SUSPENSE_PROMISE = Symbol();\nconst isSuspensePromise = (promise) => !!promise[SUSPENSE_PROMISE];\nconst isSuspensePromiseAlreadyCancelled = (suspensePromise) => !suspensePromise[SUSPENSE_PROMISE].c;\nconst cancelSuspensePromise = (suspensePromise) => {\n var _a;\n const { b: basePromise, c: cancelPromise } = suspensePromise[SUSPENSE_PROMISE];\n if (cancelPromise) {\n cancelPromise();\n (_a = promiseAbortMap.get(basePromise)) == null ? void 0 : _a();\n }\n};\nconst isEqualSuspensePromise = (oldSuspensePromise, newSuspensePromise) => {\n const oldOriginalPromise = oldSuspensePromise[SUSPENSE_PROMISE].o;\n const newOriginalPromise = newSuspensePromise[SUSPENSE_PROMISE].o;\n return oldOriginalPromise === newOriginalPromise || oldSuspensePromise === newOriginalPromise || isSuspensePromise(oldOriginalPromise) && isEqualSuspensePromise(oldOriginalPromise, newSuspensePromise);\n};\nconst createSuspensePromise = (basePromise, promise) => {\n const suspensePromiseExtra = {\n b: basePromise,\n o: promise,\n c: null\n };\n const suspensePromise = new Promise((resolve) => {\n suspensePromiseExtra.c = () => {\n suspensePromiseExtra.c = null;\n resolve();\n };\n promise.finally(suspensePromiseExtra.c);\n });\n suspensePromise[SUSPENSE_PROMISE] = suspensePromiseExtra;\n return suspensePromise;\n};\nconst copySuspensePromise = (suspensePromise) => createSuspensePromise(\n suspensePromise[SUSPENSE_PROMISE].b,\n suspensePromise[SUSPENSE_PROMISE].o\n);\nconst promiseAbortMap = /* @__PURE__ */ new WeakMap();\nconst registerPromiseAbort = (basePromise, abort) => {\n promiseAbortMap.set(basePromise, abort);\n};\n\nconst hasInitialValue = (atom) => \"init\" in atom;\nconst READ_ATOM = \"r\";\nconst WRITE_ATOM = \"w\";\nconst COMMIT_ATOM = \"c\";\nconst SUBSCRIBE_ATOM = \"s\";\nconst RESTORE_ATOMS = \"h\";\nconst DEV_SUBSCRIBE_STATE = \"n\";\nconst DEV_GET_MOUNTED_ATOMS = \"l\";\nconst DEV_GET_ATOM_STATE = \"a\";\nconst DEV_GET_MOUNTED = \"m\";\nconst createStore = (initialValues) => {\n const committedAtomStateMap = /* @__PURE__ */ new WeakMap();\n const mountedMap = /* @__PURE__ */ new WeakMap();\n const pendingMap = /* @__PURE__ */ new Map();\n let stateListeners;\n let mountedAtoms;\n if (true) {\n stateListeners = /* @__PURE__ */ new Set();\n mountedAtoms = /* @__PURE__ */ new Set();\n }\n if (initialValues) {\n for (const [atom, value] of initialValues) {\n const atomState = {\n v: value,\n r: 0,\n y: true,\n // not invalidated\n d: /* @__PURE__ */ new Map()\n };\n if (true) {\n Object.freeze(atomState);\n if (!hasInitialValue(atom)) {\n console.warn(\n \"Found initial value for derived atom which can cause unexpected behavior\",\n atom\n );\n }\n }\n committedAtomStateMap.set(atom, atomState);\n }\n }\n const suspensePromiseCacheMap = /* @__PURE__ */ new WeakMap();\n const addSuspensePromiseToCache = (version, atom, suspensePromise) => {\n let cache = suspensePromiseCacheMap.get(atom);\n if (!cache) {\n cache = /* @__PURE__ */ new Map();\n suspensePromiseCacheMap.set(atom, cache);\n }\n suspensePromise.then(() => {\n if (cache.get(version) === suspensePromise) {\n cache.delete(version);\n if (!cache.size) {\n suspensePromiseCacheMap.delete(atom);\n }\n }\n });\n cache.set(version, suspensePromise);\n };\n const cancelAllSuspensePromiseInCache = (atom) => {\n const versionSet = /* @__PURE__ */ new Set();\n const cache = suspensePromiseCacheMap.get(atom);\n if (cache) {\n suspensePromiseCacheMap.delete(atom);\n cache.forEach((suspensePromise, version) => {\n cancelSuspensePromise(suspensePromise);\n versionSet.add(version);\n });\n }\n return versionSet;\n };\n const versionedAtomStateMapMap = /* @__PURE__ */ new WeakMap();\n const getVersionedAtomStateMap = (version) => {\n let versionedAtomStateMap = versionedAtomStateMapMap.get(version);\n if (!versionedAtomStateMap) {\n versionedAtomStateMap = /* @__PURE__ */ new Map();\n versionedAtomStateMapMap.set(version, versionedAtomStateMap);\n }\n return versionedAtomStateMap;\n };\n const getAtomState = (version, atom) => {\n if (version) {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n let atomState = versionedAtomStateMap.get(atom);\n if (!atomState) {\n atomState = getAtomState(version.p, atom);\n if (atomState && \"p\" in atomState && isSuspensePromiseAlreadyCancelled(atomState.p)) {\n atomState = void 0;\n }\n if (atomState) {\n versionedAtomStateMap.set(atom, atomState);\n }\n }\n return atomState;\n }\n return committedAtomStateMap.get(atom);\n };\n const setAtomState = (version, atom, atomState) => {\n if (true) {\n Object.freeze(atomState);\n }\n if (version) {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n versionedAtomStateMap.set(atom, atomState);\n } else {\n const prevAtomState = committedAtomStateMap.get(atom);\n committedAtomStateMap.set(atom, atomState);\n if (!pendingMap.has(atom)) {\n pendingMap.set(atom, prevAtomState);\n }\n }\n };\n const createReadDependencies = (version, prevReadDependencies = /* @__PURE__ */ new Map(), dependencies) => {\n if (!dependencies) {\n return prevReadDependencies;\n }\n const readDependencies = /* @__PURE__ */ new Map();\n let changed = false;\n dependencies.forEach((atom) => {\n var _a;\n const revision = ((_a = getAtomState(version, atom)) == null ? void 0 : _a.r) || 0;\n readDependencies.set(atom, revision);\n if (prevReadDependencies.get(atom) !== revision) {\n changed = true;\n }\n });\n if (prevReadDependencies.size === readDependencies.size && !changed) {\n return prevReadDependencies;\n }\n return readDependencies;\n };\n const setAtomValue = (version, atom, value, dependencies, suspensePromise) => {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (suspensePromise && (!(\"p\" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {\n return atomState;\n }\n if (\"p\" in atomState) {\n cancelSuspensePromise(atomState.p);\n }\n }\n const nextAtomState = {\n v: value,\n r: (atomState == null ? void 0 : atomState.r) || 0,\n y: true,\n // not invalidated\n d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n };\n let changed = !(atomState == null ? void 0 : atomState.y);\n if (!atomState || !(\"v\" in atomState) || // new value, or\n !Object.is(atomState.v, value)) {\n changed = true;\n ++nextAtomState.r;\n if (nextAtomState.d.has(atom)) {\n nextAtomState.d = new Map(nextAtomState.d).set(atom, nextAtomState.r);\n }\n } else if (nextAtomState.d !== atomState.d && (nextAtomState.d.size !== atomState.d.size || !Array.from(nextAtomState.d.keys()).every((a) => atomState.d.has(a)))) {\n changed = true;\n Promise.resolve().then(() => {\n flushPending(version);\n });\n }\n if (atomState && !changed) {\n return atomState;\n }\n setAtomState(version, atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomReadError = (version, atom, error, dependencies, suspensePromise) => {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (suspensePromise && (!(\"p\" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {\n return atomState;\n }\n if (\"p\" in atomState) {\n cancelSuspensePromise(atomState.p);\n }\n }\n const nextAtomState = {\n e: error,\n // set read error\n r: ((atomState == null ? void 0 : atomState.r) || 0) + 1,\n y: true,\n // not invalidated\n d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n };\n setAtomState(version, atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomSuspensePromise = (version, atom, suspensePromise, dependencies) => {\n const atomState = getAtomState(version, atom);\n if (atomState && \"p\" in atomState) {\n if (isEqualSuspensePromise(atomState.p, suspensePromise) && !isSuspensePromiseAlreadyCancelled(atomState.p)) {\n if (!atomState.y) {\n return { ...atomState, y: true };\n }\n return atomState;\n }\n cancelSuspensePromise(atomState.p);\n }\n addSuspensePromiseToCache(version, atom, suspensePromise);\n const nextAtomState = {\n p: suspensePromise,\n r: ((atomState == null ? void 0 : atomState.r) || 0) + 1,\n y: true,\n // not invalidated\n d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n };\n setAtomState(version, atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomPromiseOrValue = (version, atom, promiseOrValue, dependencies) => {\n if (promiseOrValue instanceof Promise) {\n const suspensePromise = createSuspensePromise(\n promiseOrValue,\n promiseOrValue.then((value) => {\n setAtomValue(version, atom, value, dependencies, suspensePromise);\n }).catch((e) => {\n if (e instanceof Promise) {\n if (isSuspensePromise(e)) {\n return e.then(() => {\n readAtomState(version, atom, true);\n });\n }\n return e;\n }\n setAtomReadError(version, atom, e, dependencies, suspensePromise);\n })\n );\n return setAtomSuspensePromise(\n version,\n atom,\n suspensePromise,\n dependencies\n );\n }\n return setAtomValue(\n version,\n atom,\n promiseOrValue,\n dependencies\n );\n };\n const setAtomInvalidated = (version, atom) => {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n const nextAtomState = {\n ...atomState,\n // copy everything\n y: false\n // invalidated\n };\n setAtomState(version, atom, nextAtomState);\n } else if (true) {\n console.warn(\"[Bug] could not invalidate non existing atom\", atom);\n }\n };\n const readAtomState = (version, atom, force) => {\n if (!force) {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (atomState.y && // not invalidated\n \"p\" in atomState && !isSuspensePromiseAlreadyCancelled(atomState.p)) {\n return atomState;\n }\n atomState.d.forEach((_, a) => {\n if (a !== atom) {\n if (!mountedMap.has(a)) {\n readAtomState(version, a);\n } else {\n const aState = getAtomState(version, a);\n if (aState && !aState.y) {\n readAtomState(version, a);\n }\n }\n }\n });\n if (Array.from(atomState.d).every(([a, r]) => {\n const aState = getAtomState(version, a);\n return aState && !(\"p\" in aState) && // has no suspense promise\n aState.r === r;\n })) {\n if (!atomState.y) {\n return { ...atomState, y: true };\n }\n return atomState;\n }\n }\n }\n const dependencies = /* @__PURE__ */ new Set();\n try {\n const promiseOrValue = atom.read((a) => {\n dependencies.add(a);\n const aState = a === atom ? getAtomState(version, a) : readAtomState(version, a);\n if (aState) {\n if (\"e\" in aState) {\n throw aState.e;\n }\n if (\"p\" in aState) {\n throw aState.p;\n }\n return aState.v;\n }\n if (hasInitialValue(a)) {\n return a.init;\n }\n throw new Error(\"no atom init\");\n });\n return setAtomPromiseOrValue(version, atom, promiseOrValue, dependencies);\n } catch (errorOrPromise) {\n if (errorOrPromise instanceof Promise) {\n const suspensePromise = isSuspensePromise(errorOrPromise) && isSuspensePromiseAlreadyCancelled(errorOrPromise) ? copySuspensePromise(errorOrPromise) : createSuspensePromise(errorOrPromise, errorOrPromise);\n return setAtomSuspensePromise(\n version,\n atom,\n suspensePromise,\n dependencies\n );\n }\n return setAtomReadError(version, atom, errorOrPromise, dependencies);\n }\n };\n const readAtom = (readingAtom, version) => {\n const atomState = readAtomState(version, readingAtom);\n return atomState;\n };\n const addAtom = (version, addingAtom) => {\n let mounted = mountedMap.get(addingAtom);\n if (!mounted) {\n mounted = mountAtom(version, addingAtom);\n }\n return mounted;\n };\n const canUnmountAtom = (atom, mounted) => !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));\n const delAtom = (version, deletingAtom) => {\n const mounted = mountedMap.get(deletingAtom);\n if (mounted && canUnmountAtom(deletingAtom, mounted)) {\n unmountAtom(version, deletingAtom);\n }\n };\n const invalidateDependents = (version, atom) => {\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.t.forEach((dependent) => {\n if (dependent !== atom) {\n setAtomInvalidated(version, dependent);\n invalidateDependents(version, dependent);\n }\n });\n };\n const writeAtomState = (version, atom, update) => {\n let isSync = true;\n const writeGetter = (a, options) => {\n const aState = readAtomState(version, a);\n if (\"e\" in aState) {\n throw aState.e;\n }\n if (\"p\" in aState) {\n if (options == null ? void 0 : options.unstable_promise) {\n return aState.p.then(() => {\n const s = getAtomState(version, a);\n if (s && \"p\" in s && s.p === aState.p) {\n return new Promise((resolve) => setTimeout(resolve)).then(\n () => writeGetter(a, options)\n );\n }\n return writeGetter(a, options);\n });\n }\n if (true) {\n console.info(\n \"Reading pending atom state in write operation. We throw a promise for now.\",\n a\n );\n }\n throw aState.p;\n }\n if (\"v\" in aState) {\n return aState.v;\n }\n if (true) {\n console.warn(\n \"[Bug] no value found while reading atom in write operation. This is probably a bug.\",\n a\n );\n }\n throw new Error(\"no value found\");\n };\n const setter = (a, v) => {\n let promiseOrVoid2;\n if (a === atom) {\n if (!hasInitialValue(a)) {\n throw new Error(\"atom not writable\");\n }\n const versionSet = cancelAllSuspensePromiseInCache(a);\n versionSet.forEach((cancelledVersion) => {\n if (cancelledVersion !== version) {\n setAtomPromiseOrValue(cancelledVersion, a, v);\n }\n });\n const prevAtomState = getAtomState(version, a);\n const nextAtomState = setAtomPromiseOrValue(version, a, v);\n if (prevAtomState !== nextAtomState) {\n invalidateDependents(version, a);\n }\n } else {\n promiseOrVoid2 = writeAtomState(version, a, v);\n }\n if (!isSync) {\n flushPending(version);\n }\n return promiseOrVoid2;\n };\n const promiseOrVoid = atom.write(writeGetter, setter, update);\n isSync = false;\n return promiseOrVoid;\n };\n const writeAtom = (writingAtom, update, version) => {\n const promiseOrVoid = writeAtomState(version, writingAtom, update);\n flushPending(version);\n return promiseOrVoid;\n };\n const isActuallyWritableAtom = (atom) => !!atom.write;\n const mountAtom = (version, atom, initialDependent) => {\n const mounted = {\n t: new Set(initialDependent && [initialDependent]),\n l: /* @__PURE__ */ new Set()\n };\n mountedMap.set(atom, mounted);\n if (true) {\n mountedAtoms.add(atom);\n }\n const atomState = readAtomState(void 0, atom);\n atomState.d.forEach((_, a) => {\n const aMounted = mountedMap.get(a);\n if (aMounted) {\n aMounted.t.add(atom);\n } else {\n if (a !== atom) {\n mountAtom(version, a, atom);\n }\n }\n });\n if (isActuallyWritableAtom(atom) && atom.onMount) {\n const setAtom = (update) => writeAtom(atom, update, version);\n const onUnmount = atom.onMount(setAtom);\n version = void 0;\n if (onUnmount) {\n mounted.u = onUnmount;\n }\n }\n return mounted;\n };\n const unmountAtom = (version, atom) => {\n var _a;\n const onUnmount = (_a = mountedMap.get(atom)) == null ? void 0 : _a.u;\n if (onUnmount) {\n onUnmount();\n }\n mountedMap.delete(atom);\n if (true) {\n mountedAtoms.delete(atom);\n }\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (\"p\" in atomState) {\n cancelSuspensePromise(atomState.p);\n }\n atomState.d.forEach((_, a) => {\n if (a !== atom) {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(version, a);\n }\n }\n }\n });\n } else if (true) {\n console.warn(\"[Bug] could not find atom state to unmount\", atom);\n }\n };\n const mountDependencies = (version, atom, atomState, prevReadDependencies) => {\n const dependencies = new Set(atomState.d.keys());\n prevReadDependencies == null ? void 0 : prevReadDependencies.forEach((_, a) => {\n if (dependencies.has(a)) {\n dependencies.delete(a);\n return;\n }\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(version, a);\n }\n }\n });\n dependencies.forEach((a) => {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.add(atom);\n } else if (mountedMap.has(atom)) {\n mountAtom(version, a, atom);\n }\n });\n };\n const flushPending = (version) => {\n if (version) {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n versionedAtomStateMap.forEach((atomState, atom) => {\n const committedAtomState = committedAtomStateMap.get(atom);\n if (atomState !== committedAtomState) {\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.l.forEach((listener) => listener(version));\n }\n });\n return;\n }\n while (pendingMap.size) {\n const pending = Array.from(pendingMap);\n pendingMap.clear();\n pending.forEach(([atom, prevAtomState]) => {\n const atomState = getAtomState(void 0, atom);\n if (atomState && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n mountDependencies(void 0, atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n }\n if (prevAtomState && !prevAtomState.y && // invalidated\n (atomState == null ? void 0 : atomState.y)) {\n return;\n }\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.l.forEach((listener) => listener());\n });\n }\n if (true) {\n stateListeners.forEach((l) => l());\n }\n };\n const commitVersionedAtomStateMap = (version) => {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n versionedAtomStateMap.forEach((atomState, atom) => {\n const prevAtomState = committedAtomStateMap.get(atom);\n if (!prevAtomState || atomState.r > prevAtomState.r || atomState.y !== prevAtomState.y || atomState.r === prevAtomState.r && atomState.d !== prevAtomState.d) {\n committedAtomStateMap.set(atom, atomState);\n if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n mountDependencies(version, atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n }\n }\n });\n };\n const commitAtom = (_atom, version) => {\n if (version) {\n commitVersionedAtomStateMap(version);\n }\n flushPending(void 0);\n };\n const subscribeAtom = (atom, callback, version) => {\n const mounted = addAtom(version, atom);\n const listeners = mounted.l;\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n delAtom(version, atom);\n };\n };\n const restoreAtoms = (values, version) => {\n for (const [atom, value] of values) {\n if (hasInitialValue(atom)) {\n setAtomPromiseOrValue(version, atom, value);\n invalidateDependents(version, atom);\n }\n }\n flushPending(version);\n };\n if (true) {\n return {\n [READ_ATOM]: readAtom,\n [WRITE_ATOM]: writeAtom,\n [COMMIT_ATOM]: commitAtom,\n [SUBSCRIBE_ATOM]: subscribeAtom,\n [RESTORE_ATOMS]: restoreAtoms,\n [DEV_SUBSCRIBE_STATE]: (l) => {\n stateListeners.add(l);\n return () => {\n stateListeners.delete(l);\n };\n },\n [DEV_GET_MOUNTED_ATOMS]: () => mountedAtoms.values(),\n [DEV_GET_ATOM_STATE]: (a) => committedAtomStateMap.get(a),\n [DEV_GET_MOUNTED]: (a) => mountedMap.get(a)\n };\n }\n return {\n [READ_ATOM]: readAtom,\n [WRITE_ATOM]: writeAtom,\n [COMMIT_ATOM]: commitAtom,\n [SUBSCRIBE_ATOM]: subscribeAtom,\n [RESTORE_ATOMS]: restoreAtoms\n };\n};\nconst createStoreForExport = (initialValues) => {\n const store = createStore(initialValues);\n const get = (atom) => {\n const atomState = store[READ_ATOM](atom);\n if (\"e\" in atomState) {\n throw atomState.e;\n }\n if (\"p\" in atomState) {\n return void 0;\n }\n return atomState.v;\n };\n const asyncGet = (atom) => new Promise((resolve, reject) => {\n const atomState = store[READ_ATOM](atom);\n if (\"e\" in atomState) {\n reject(atomState.e);\n } else if (\"p\" in atomState) {\n resolve(atomState.p.then(() => asyncGet(atom)));\n } else {\n resolve(atomState.v);\n }\n });\n const set = (atom, update) => store[WRITE_ATOM](atom, update);\n const sub = (atom, callback) => store[SUBSCRIBE_ATOM](atom, callback);\n return {\n get,\n asyncGet,\n set,\n sub,\n SECRET_INTERNAL_store: store\n };\n};\n\nconst createScopeContainer = (initialValues, unstable_createStore) => {\n const store = unstable_createStore ? unstable_createStore(initialValues).SECRET_INTERNAL_store : createStore(initialValues);\n return { s: store };\n};\nconst ScopeContextMap = /* @__PURE__ */ new Map();\nconst getScopeContext = (scope) => {\n if (!ScopeContextMap.has(scope)) {\n ScopeContextMap.set(scope, (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(createScopeContainer()));\n }\n return ScopeContextMap.get(scope);\n};\n\nconst Provider = ({\n children,\n initialValues,\n scope,\n unstable_createStore,\n unstable_enableVersionedWrite\n}) => {\n const [version, setVersion] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const scopeContainer = scopeContainerRef.current;\n if (scopeContainer.w) {\n scopeContainer.s[COMMIT_ATOM](null, version);\n delete version.p;\n scopeContainer.v = version;\n }\n }, [version]);\n const scopeContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n if (!scopeContainerRef.current) {\n const scopeContainer = createScopeContainer(\n initialValues,\n unstable_createStore\n );\n if (unstable_enableVersionedWrite) {\n let retrying = 0;\n scopeContainer.w = (write) => {\n setVersion((parentVersion) => {\n const nextVersion = retrying ? parentVersion : { p: parentVersion };\n write(nextVersion);\n return nextVersion;\n });\n };\n scopeContainer.v = version;\n scopeContainer.r = (fn) => {\n ++retrying;\n fn();\n --retrying;\n };\n }\n scopeContainerRef.current = scopeContainer;\n }\n const ScopeContainerContext = getScopeContext(scope);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(\n ScopeContainerContext.Provider,\n {\n value: scopeContainerRef.current\n },\n children\n );\n};\n\nfunction atom(read, write) {\n return (0,jotai_vanilla__WEBPACK_IMPORTED_MODULE_1__.atom)(read, write);\n}\n\nfunction useAtomValue(atom, scope) {\n const ScopeContext = getScopeContext(scope);\n const scopeContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ScopeContext);\n const { s: store, v: versionFromProvider } = scopeContainer;\n const getAtomValue = (version2) => {\n const atomState = store[READ_ATOM](atom, version2);\n if ( true && !atomState.y) {\n throw new Error(\"should not be invalidated\");\n }\n if (\"e\" in atomState) {\n throw atomState.e;\n }\n if (\"p\" in atomState) {\n throw atomState.p;\n }\n if (\"v\" in atomState) {\n return atomState.v;\n }\n throw new Error(\"no atom value\");\n };\n const [[version, valueFromReducer, atomFromReducer], rerenderIfChanged] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(\n (prev, nextVersion) => {\n const nextValue = getAtomValue(nextVersion);\n if (Object.is(prev[1], nextValue) && prev[2] === atom) {\n return prev;\n }\n return [nextVersion, nextValue, atom];\n },\n versionFromProvider,\n (initialVersion) => {\n const initialValue = getAtomValue(initialVersion);\n return [initialVersion, initialValue, atom];\n }\n );\n let value = valueFromReducer;\n if (atomFromReducer !== atom) {\n rerenderIfChanged(version);\n value = getAtomValue(version);\n }\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const { v: versionFromProvider2 } = scopeContainer;\n if (versionFromProvider2) {\n store[COMMIT_ATOM](atom, versionFromProvider2);\n }\n const unsubscribe = store[SUBSCRIBE_ATOM](\n atom,\n rerenderIfChanged,\n versionFromProvider2\n );\n rerenderIfChanged(versionFromProvider2);\n return unsubscribe;\n }, [store, atom, scopeContainer]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n store[COMMIT_ATOM](atom, version);\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue)(value);\n return value;\n}\n\nfunction useSetAtom(atom, scope) {\n const ScopeContext = getScopeContext(scope);\n const { s: store, w: versionedWrite } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ScopeContext);\n const setAtom = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (update) => {\n if ( true && !(\"write\" in atom)) {\n throw new Error(\"not writable atom\");\n }\n const write = (version) => store[WRITE_ATOM](atom, update, version);\n return versionedWrite ? versionedWrite(write) : write();\n },\n [store, versionedWrite, atom]\n );\n return setAtom;\n}\n\nfunction useAtom(atom, scope) {\n if (\"scope\" in atom) {\n console.warn(\n \"atom.scope is deprecated. Please do useAtom(atom, scope) instead.\"\n );\n scope = atom.scope;\n }\n return [\n useAtomValue(atom, scope),\n // We do wrong type assertion here, which results in throwing an error.\n useSetAtom(atom, scope)\n ];\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pvdGFpL2VzbS9pbmRleC5tanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFzSTtBQUN2Rjs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsbUNBQW1DO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsSUFBMEQ7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFNBQVMsSUFBMEQ7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFlBQVksSUFBMEQ7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQTBEO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQTBEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQTBEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTSxTQUFTLElBQTBEO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVEsSUFBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isb0RBQWE7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQ0FBZ0MsK0NBQVEsR0FBRztBQUMzQyxFQUFFLGdEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILDRCQUE0Qiw2Q0FBTTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxvREFBYTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyxtREFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIsaURBQVU7QUFDbkMsVUFBVSxtQ0FBbUM7QUFDN0M7QUFDQTtBQUNBLFFBQVEsS0FBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsaURBQVU7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdEQUFTO0FBQ1gsWUFBWSwwQkFBMEI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRSxnREFBUztBQUNYO0FBQ0EsR0FBRztBQUNILEVBQUUsb0RBQWE7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLDhCQUE4QixFQUFFLGlEQUFVO0FBQ3BELGtCQUFrQixrREFBVztBQUM3QjtBQUNBLFVBQVUsS0FBMEQ7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTZOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9qb3RhaS9lc20vaW5kZXgubWpzP2IwNzkiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmLCBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0LCB1c2VSZWR1Y2VyLCB1c2VEZWJ1Z1ZhbHVlLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGF0b20gYXMgYXRvbSQxIH0gZnJvbSAnam90YWkvdmFuaWxsYSc7XG5cbmNvbnN0IFNVU1BFTlNFX1BST01JU0UgPSBTeW1ib2woKTtcbmNvbnN0IGlzU3VzcGVuc2VQcm9taXNlID0gKHByb21pc2UpID0+ICEhcHJvbWlzZVtTVVNQRU5TRV9QUk9NSVNFXTtcbmNvbnN0IGlzU3VzcGVuc2VQcm9taXNlQWxyZWFkeUNhbmNlbGxlZCA9IChzdXNwZW5zZVByb21pc2UpID0+ICFzdXNwZW5zZVByb21pc2VbU1VTUEVOU0VfUFJPTUlTRV0uYztcbmNvbnN0IGNhbmNlbFN1c3BlbnNlUHJvbWlzZSA9IChzdXNwZW5zZVByb21pc2UpID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCB7IGI6IGJhc2VQcm9taXNlLCBjOiBjYW5jZWxQcm9taXNlIH0gPSBzdXNwZW5zZVByb21pc2VbU1VTUEVOU0VfUFJPTUlTRV07XG4gIGlmIChjYW5jZWxQcm9taXNlKSB7XG4gICAgY2FuY2VsUHJvbWlzZSgpO1xuICAgIChfYSA9IHByb21pc2VBYm9ydE1hcC5nZXQoYmFzZVByb21pc2UpKSA9PSBudWxsID8gdm9pZCAwIDogX2EoKTtcbiAgfVxufTtcbmNvbnN0IGlzRXF1YWxTdXNwZW5zZVByb21pc2UgPSAob2xkU3VzcGVuc2VQcm9taXNlLCBuZXdTdXNwZW5zZVByb21pc2UpID0+IHtcbiAgY29uc3Qgb2xkT3JpZ2luYWxQcm9taXNlID0gb2xkU3VzcGVuc2VQcm9taXNlW1NVU1BFTlNFX1BST01JU0VdLm87XG4gIGNvbnN0IG5ld09yaWdpbmFsUHJvbWlzZSA9IG5ld1N1c3BlbnNlUHJvbWlzZVtTVVNQRU5TRV9QUk9NSVNFXS5vO1xuICByZXR1cm4gb2xkT3JpZ2luYWxQcm9taXNlID09PSBuZXdPcmlnaW5hbFByb21pc2UgfHwgb2xkU3VzcGVuc2VQcm9taXNlID09PSBuZXdPcmlnaW5hbFByb21pc2UgfHwgaXNTdXNwZW5zZVByb21pc2Uob2xkT3JpZ2luYWxQcm9taXNlKSAmJiBpc0VxdWFsU3VzcGVuc2VQcm9taXNlKG9sZE9yaWdpbmFsUHJvbWlzZSwgbmV3U3VzcGVuc2VQcm9taXNlKTtcbn07XG5jb25zdCBjcmVhdGVTdXNwZW5zZVByb21pc2UgPSAoYmFzZVByb21pc2UsIHByb21pc2UpID0+IHtcbiAgY29uc3Qgc3VzcGVuc2VQcm9taXNlRXh0cmEgPSB7XG4gICAgYjogYmFzZVByb21pc2UsXG4gICAgbzogcHJvbWlzZSxcbiAgICBjOiBudWxsXG4gIH07XG4gIGNvbnN0IHN1c3BlbnNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc3VzcGVuc2VQcm9taXNlRXh0cmEuYyA9ICgpID0+IHtcbiAgICAgIHN1c3BlbnNlUHJvbWlzZUV4dHJhLmMgPSBudWxsO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgcHJvbWlzZS5maW5hbGx5KHN1c3BlbnNlUHJvbWlzZUV4dHJhLmMpO1xuICB9KTtcbiAgc3VzcGVuc2VQcm9taXNlW1NVU1BFTlNFX1BST01JU0VdID0gc3VzcGVuc2VQcm9taXNlRXh0cmE7XG4gIHJldHVybiBzdXNwZW5zZVByb21pc2U7XG59O1xuY29uc3QgY29weVN1c3BlbnNlUHJvbWlzZSA9IChzdXNwZW5zZVByb21pc2UpID0+IGNyZWF0ZVN1c3BlbnNlUHJvbWlzZShcbiAgc3VzcGVuc2VQcm9taXNlW1NVU1BFTlNFX1BST01JU0VdLmIsXG4gIHN1c3BlbnNlUHJvbWlzZVtTVVNQRU5TRV9QUk9NSVNFXS5vXG4pO1xuY29uc3QgcHJvbWlzZUFib3J0TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCByZWdpc3RlclByb21pc2VBYm9ydCA9IChiYXNlUHJvbWlzZSwgYWJvcnQpID0+IHtcbiAgcHJvbWlzZUFib3J0TWFwLnNldChiYXNlUHJvbWlzZSwgYWJvcnQpO1xufTtcblxuY29uc3QgaGFzSW5pdGlhbFZhbHVlID0gKGF0b20pID0+IFwiaW5pdFwiIGluIGF0b207XG5jb25zdCBSRUFEX0FUT00gPSBcInJcIjtcbmNvbnN0IFdSSVRFX0FUT00gPSBcIndcIjtcbmNvbnN0IENPTU1JVF9BVE9NID0gXCJjXCI7XG5jb25zdCBTVUJTQ1JJQkVfQVRPTSA9IFwic1wiO1xuY29uc3QgUkVTVE9SRV9BVE9NUyA9IFwiaFwiO1xuY29uc3QgREVWX1NVQlNDUklCRV9TVEFURSA9IFwiblwiO1xuY29uc3QgREVWX0dFVF9NT1VOVEVEX0FUT01TID0gXCJsXCI7XG5jb25zdCBERVZfR0VUX0FUT01fU1RBVEUgPSBcImFcIjtcbmNvbnN0IERFVl9HRVRfTU9VTlRFRCA9IFwibVwiO1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoaW5pdGlhbFZhbHVlcykgPT4ge1xuICBjb25zdCBjb21taXR0ZWRBdG9tU3RhdGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgbW91bnRlZE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBwZW5kaW5nTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IHN0YXRlTGlzdGVuZXJzO1xuICBsZXQgbW91bnRlZEF0b21zO1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgc3RhdGVMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIG1vdW50ZWRBdG9tcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIH1cbiAgaWYgKGluaXRpYWxWYWx1ZXMpIHtcbiAgICBmb3IgKGNvbnN0IFthdG9tLCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgY29uc3QgYXRvbVN0YXRlID0ge1xuICAgICAgICB2OiB2YWx1ZSxcbiAgICAgICAgcjogMCxcbiAgICAgICAgeTogdHJ1ZSxcbiAgICAgICAgLy8gbm90IGludmFsaWRhdGVkXG4gICAgICAgIGQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbiAgICAgIH07XG4gICAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoYXRvbVN0YXRlKTtcbiAgICAgICAgaWYgKCFoYXNJbml0aWFsVmFsdWUoYXRvbSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIkZvdW5kIGluaXRpYWwgdmFsdWUgZm9yIGRlcml2ZWQgYXRvbSB3aGljaCBjYW4gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvclwiLFxuICAgICAgICAgICAgYXRvbVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbW1pdHRlZEF0b21TdGF0ZU1hcC5zZXQoYXRvbSwgYXRvbVN0YXRlKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYWRkU3VzcGVuc2VQcm9taXNlVG9DYWNoZSA9ICh2ZXJzaW9uLCBhdG9tLCBzdXNwZW5zZVByb21pc2UpID0+IHtcbiAgICBsZXQgY2FjaGUgPSBzdXNwZW5zZVByb21pc2VDYWNoZU1hcC5nZXQoYXRvbSk7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuc2V0KGF0b20sIGNhY2hlKTtcbiAgICB9XG4gICAgc3VzcGVuc2VQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGNhY2hlLmdldCh2ZXJzaW9uKSA9PT0gc3VzcGVuc2VQcm9taXNlKSB7XG4gICAgICAgIGNhY2hlLmRlbGV0ZSh2ZXJzaW9uKTtcbiAgICAgICAgaWYgKCFjYWNoZS5zaXplKSB7XG4gICAgICAgICAgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuZGVsZXRlKGF0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY2FjaGUuc2V0KHZlcnNpb24sIHN1c3BlbnNlUHJvbWlzZSk7XG4gIH07XG4gIGNvbnN0IGNhbmNlbEFsbFN1c3BlbnNlUHJvbWlzZUluQ2FjaGUgPSAoYXRvbSkgPT4ge1xuICAgIGNvbnN0IHZlcnNpb25TZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGNvbnN0IGNhY2hlID0gc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuZ2V0KGF0b20pO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuZGVsZXRlKGF0b20pO1xuICAgICAgY2FjaGUuZm9yRWFjaCgoc3VzcGVuc2VQcm9taXNlLCB2ZXJzaW9uKSA9PiB7XG4gICAgICAgIGNhbmNlbFN1c3BlbnNlUHJvbWlzZShzdXNwZW5zZVByb21pc2UpO1xuICAgICAgICB2ZXJzaW9uU2V0LmFkZCh2ZXJzaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvblNldDtcbiAgfTtcbiAgY29uc3QgdmVyc2lvbmVkQXRvbVN0YXRlTWFwTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGdldFZlcnNpb25lZEF0b21TdGF0ZU1hcCA9ICh2ZXJzaW9uKSA9PiB7XG4gICAgbGV0IHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IHZlcnNpb25lZEF0b21TdGF0ZU1hcE1hcC5nZXQodmVyc2lvbik7XG4gICAgaWYgKCF2ZXJzaW9uZWRBdG9tU3RhdGVNYXApIHtcbiAgICAgIHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXBNYXAuc2V0KHZlcnNpb24sIHZlcnNpb25lZEF0b21TdGF0ZU1hcCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJzaW9uZWRBdG9tU3RhdGVNYXA7XG4gIH07XG4gIGNvbnN0IGdldEF0b21TdGF0ZSA9ICh2ZXJzaW9uLCBhdG9tKSA9PiB7XG4gICAgaWYgKHZlcnNpb24pIHtcbiAgICAgIGNvbnN0IHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IGdldFZlcnNpb25lZEF0b21TdGF0ZU1hcCh2ZXJzaW9uKTtcbiAgICAgIGxldCBhdG9tU3RhdGUgPSB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuZ2V0KGF0b20pO1xuICAgICAgaWYgKCFhdG9tU3RhdGUpIHtcbiAgICAgICAgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24ucCwgYXRvbSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUgJiYgXCJwXCIgaW4gYXRvbVN0YXRlICYmIGlzU3VzcGVuc2VQcm9taXNlQWxyZWFkeUNhbmNlbGxlZChhdG9tU3RhdGUucCkpIHtcbiAgICAgICAgICBhdG9tU3RhdGUgPSB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0b21TdGF0ZSkge1xuICAgICAgICAgIHZlcnNpb25lZEF0b21TdGF0ZU1hcC5zZXQoYXRvbSwgYXRvbVN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHRlZEF0b21TdGF0ZU1hcC5nZXQoYXRvbSk7XG4gIH07XG4gIGNvbnN0IHNldEF0b21TdGF0ZSA9ICh2ZXJzaW9uLCBhdG9tLCBhdG9tU3RhdGUpID0+IHtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGF0b21TdGF0ZSk7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAgPSBnZXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAodmVyc2lvbik7XG4gICAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuc2V0KGF0b20sIGF0b21TdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBjb21taXR0ZWRBdG9tU3RhdGVNYXAuZ2V0KGF0b20pO1xuICAgICAgY29tbWl0dGVkQXRvbVN0YXRlTWFwLnNldChhdG9tLCBhdG9tU3RhdGUpO1xuICAgICAgaWYgKCFwZW5kaW5nTWFwLmhhcyhhdG9tKSkge1xuICAgICAgICBwZW5kaW5nTWFwLnNldChhdG9tLCBwcmV2QXRvbVN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNyZWF0ZVJlYWREZXBlbmRlbmNpZXMgPSAodmVyc2lvbiwgcHJldlJlYWREZXBlbmRlbmNpZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgICAgcmV0dXJuIHByZXZSZWFkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICBjb25zdCByZWFkRGVwZW5kZW5jaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChhdG9tKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCByZXZpc2lvbiA9ICgoX2EgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5yKSB8fCAwO1xuICAgICAgcmVhZERlcGVuZGVuY2llcy5zZXQoYXRvbSwgcmV2aXNpb24pO1xuICAgICAgaWYgKHByZXZSZWFkRGVwZW5kZW5jaWVzLmdldChhdG9tKSAhPT0gcmV2aXNpb24pIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZXZSZWFkRGVwZW5kZW5jaWVzLnNpemUgPT09IHJlYWREZXBlbmRlbmNpZXMuc2l6ZSAmJiAhY2hhbmdlZCkge1xuICAgICAgcmV0dXJuIHByZXZSZWFkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZERlcGVuZGVuY2llcztcbiAgfTtcbiAgY29uc3Qgc2V0QXRvbVZhbHVlID0gKHZlcnNpb24sIGF0b20sIHZhbHVlLCBkZXBlbmRlbmNpZXMsIHN1c3BlbnNlUHJvbWlzZSkgPT4ge1xuICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZSh2ZXJzaW9uLCBhdG9tKTtcbiAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICBpZiAoc3VzcGVuc2VQcm9taXNlICYmICghKFwicFwiIGluIGF0b21TdGF0ZSkgfHwgIWlzRXF1YWxTdXNwZW5zZVByb21pc2UoYXRvbVN0YXRlLnAsIHN1c3BlbnNlUHJvbWlzZSkpKSB7XG4gICAgICAgIHJldHVybiBhdG9tU3RhdGU7XG4gICAgICB9XG4gICAgICBpZiAoXCJwXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgICAgIGNhbmNlbFN1c3BlbnNlUHJvbWlzZShhdG9tU3RhdGUucCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICB2OiB2YWx1ZSxcbiAgICAgIHI6IChhdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGF0b21TdGF0ZS5yKSB8fCAwLFxuICAgICAgeTogdHJ1ZSxcbiAgICAgIC8vIG5vdCBpbnZhbGlkYXRlZFxuICAgICAgZDogY3JlYXRlUmVhZERlcGVuZGVuY2llcyh2ZXJzaW9uLCBhdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGF0b21TdGF0ZS5kLCBkZXBlbmRlbmNpZXMpXG4gICAgfTtcbiAgICBsZXQgY2hhbmdlZCA9ICEoYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUueSk7XG4gICAgaWYgKCFhdG9tU3RhdGUgfHwgIShcInZcIiBpbiBhdG9tU3RhdGUpIHx8IC8vIG5ldyB2YWx1ZSwgb3JcbiAgICAhT2JqZWN0LmlzKGF0b21TdGF0ZS52LCB2YWx1ZSkpIHtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgKytuZXh0QXRvbVN0YXRlLnI7XG4gICAgICBpZiAobmV4dEF0b21TdGF0ZS5kLmhhcyhhdG9tKSkge1xuICAgICAgICBuZXh0QXRvbVN0YXRlLmQgPSBuZXcgTWFwKG5leHRBdG9tU3RhdGUuZCkuc2V0KGF0b20sIG5leHRBdG9tU3RhdGUucik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0QXRvbVN0YXRlLmQgIT09IGF0b21TdGF0ZS5kICYmIChuZXh0QXRvbVN0YXRlLmQuc2l6ZSAhPT0gYXRvbVN0YXRlLmQuc2l6ZSB8fCAhQXJyYXkuZnJvbShuZXh0QXRvbVN0YXRlLmQua2V5cygpKS5ldmVyeSgoYSkgPT4gYXRvbVN0YXRlLmQuaGFzKGEpKSkpIHtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGZsdXNoUGVuZGluZyh2ZXJzaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYXRvbVN0YXRlICYmICFjaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgIH1cbiAgICBzZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSwgbmV4dEF0b21TdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRBdG9tU3RhdGU7XG4gIH07XG4gIGNvbnN0IHNldEF0b21SZWFkRXJyb3IgPSAodmVyc2lvbiwgYXRvbSwgZXJyb3IsIGRlcGVuZGVuY2llcywgc3VzcGVuc2VQcm9taXNlKSA9PiB7XG4gICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20pO1xuICAgIGlmIChhdG9tU3RhdGUpIHtcbiAgICAgIGlmIChzdXNwZW5zZVByb21pc2UgJiYgKCEoXCJwXCIgaW4gYXRvbVN0YXRlKSB8fCAhaXNFcXVhbFN1c3BlbnNlUHJvbWlzZShhdG9tU3RhdGUucCwgc3VzcGVuc2VQcm9taXNlKSkpIHtcbiAgICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgICAgY2FuY2VsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dEF0b21TdGF0ZSA9IHtcbiAgICAgIGU6IGVycm9yLFxuICAgICAgLy8gc2V0IHJlYWQgZXJyb3JcbiAgICAgIHI6ICgoYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUucikgfHwgMCkgKyAxLFxuICAgICAgeTogdHJ1ZSxcbiAgICAgIC8vIG5vdCBpbnZhbGlkYXRlZFxuICAgICAgZDogY3JlYXRlUmVhZERlcGVuZGVuY2llcyh2ZXJzaW9uLCBhdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGF0b21TdGF0ZS5kLCBkZXBlbmRlbmNpZXMpXG4gICAgfTtcbiAgICBzZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSwgbmV4dEF0b21TdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRBdG9tU3RhdGU7XG4gIH07XG4gIGNvbnN0IHNldEF0b21TdXNwZW5zZVByb21pc2UgPSAodmVyc2lvbiwgYXRvbSwgc3VzcGVuc2VQcm9taXNlLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICBjb25zdCBhdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSk7XG4gICAgaWYgKGF0b21TdGF0ZSAmJiBcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIGlmIChpc0VxdWFsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wLCBzdXNwZW5zZVByb21pc2UpICYmICFpc1N1c3BlbnNlUHJvbWlzZUFscmVhZHlDYW5jZWxsZWQoYXRvbVN0YXRlLnApKSB7XG4gICAgICAgIGlmICghYXRvbVN0YXRlLnkpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5hdG9tU3RhdGUsIHk6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgICAgfVxuICAgICAgY2FuY2VsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wKTtcbiAgICB9XG4gICAgYWRkU3VzcGVuc2VQcm9taXNlVG9DYWNoZSh2ZXJzaW9uLCBhdG9tLCBzdXNwZW5zZVByb21pc2UpO1xuICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICBwOiBzdXNwZW5zZVByb21pc2UsXG4gICAgICByOiAoKGF0b21TdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogYXRvbVN0YXRlLnIpIHx8IDApICsgMSxcbiAgICAgIHk6IHRydWUsXG4gICAgICAvLyBub3QgaW52YWxpZGF0ZWRcbiAgICAgIGQ6IGNyZWF0ZVJlYWREZXBlbmRlbmNpZXModmVyc2lvbiwgYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUuZCwgZGVwZW5kZW5jaWVzKVxuICAgIH07XG4gICAgc2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20sIG5leHRBdG9tU3RhdGUpO1xuICAgIHJldHVybiBuZXh0QXRvbVN0YXRlO1xuICB9O1xuICBjb25zdCBzZXRBdG9tUHJvbWlzZU9yVmFsdWUgPSAodmVyc2lvbiwgYXRvbSwgcHJvbWlzZU9yVmFsdWUsIGRlcGVuZGVuY2llcykgPT4ge1xuICAgIGlmIChwcm9taXNlT3JWYWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGNvbnN0IHN1c3BlbnNlUHJvbWlzZSA9IGNyZWF0ZVN1c3BlbnNlUHJvbWlzZShcbiAgICAgICAgcHJvbWlzZU9yVmFsdWUsXG4gICAgICAgIHByb21pc2VPclZhbHVlLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgc2V0QXRvbVZhbHVlKHZlcnNpb24sIGF0b20sIHZhbHVlLCBkZXBlbmRlbmNpZXMsIHN1c3BlbnNlUHJvbWlzZSk7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoaXNTdXNwZW5zZVByb21pc2UoZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCBhdG9tLCB0cnVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0QXRvbVJlYWRFcnJvcih2ZXJzaW9uLCBhdG9tLCBlLCBkZXBlbmRlbmNpZXMsIHN1c3BlbnNlUHJvbWlzZSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNldEF0b21TdXNwZW5zZVByb21pc2UoXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIGF0b20sXG4gICAgICAgIHN1c3BlbnNlUHJvbWlzZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2V0QXRvbVZhbHVlKFxuICAgICAgdmVyc2lvbixcbiAgICAgIGF0b20sXG4gICAgICBwcm9taXNlT3JWYWx1ZSxcbiAgICAgIGRlcGVuZGVuY2llc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IHNldEF0b21JbnZhbGlkYXRlZCA9ICh2ZXJzaW9uLCBhdG9tKSA9PiB7XG4gICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20pO1xuICAgIGlmIChhdG9tU3RhdGUpIHtcbiAgICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICAgIC4uLmF0b21TdGF0ZSxcbiAgICAgICAgLy8gY29weSBldmVyeXRoaW5nXG4gICAgICAgIHk6IGZhbHNlXG4gICAgICAgIC8vIGludmFsaWRhdGVkXG4gICAgICB9O1xuICAgICAgc2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20sIG5leHRBdG9tU3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbQnVnXSBjb3VsZCBub3QgaW52YWxpZGF0ZSBub24gZXhpc3RpbmcgYXRvbVwiLCBhdG9tKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUgPSAodmVyc2lvbiwgYXRvbSwgZm9yY2UpID0+IHtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICBjb25zdCBhdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSk7XG4gICAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICAgIGlmIChhdG9tU3RhdGUueSAmJiAvLyBub3QgaW52YWxpZGF0ZWRcbiAgICAgICAgXCJwXCIgaW4gYXRvbVN0YXRlICYmICFpc1N1c3BlbnNlUHJvbWlzZUFscmVhZHlDYW5jZWxsZWQoYXRvbVN0YXRlLnApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBhdG9tU3RhdGUuZC5mb3JFYWNoKChfLCBhKSA9PiB7XG4gICAgICAgICAgaWYgKGEgIT09IGF0b20pIHtcbiAgICAgICAgICAgIGlmICghbW91bnRlZE1hcC5oYXMoYSkpIHtcbiAgICAgICAgICAgICAgcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCBhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFTdGF0ZSA9IGdldEF0b21TdGF0ZSh2ZXJzaW9uLCBhKTtcbiAgICAgICAgICAgICAgaWYgKGFTdGF0ZSAmJiAhYVN0YXRlLnkpIHtcbiAgICAgICAgICAgICAgICByZWFkQXRvbVN0YXRlKHZlcnNpb24sIGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKEFycmF5LmZyb20oYXRvbVN0YXRlLmQpLmV2ZXJ5KChbYSwgcl0pID0+IHtcbiAgICAgICAgICBjb25zdCBhU3RhdGUgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYSk7XG4gICAgICAgICAgcmV0dXJuIGFTdGF0ZSAmJiAhKFwicFwiIGluIGFTdGF0ZSkgJiYgLy8gaGFzIG5vIHN1c3BlbnNlIHByb21pc2VcbiAgICAgICAgICBhU3RhdGUuciA9PT0gcjtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBpZiAoIWF0b21TdGF0ZS55KSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hdG9tU3RhdGUsIHk6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9taXNlT3JWYWx1ZSA9IGF0b20ucmVhZCgoYSkgPT4ge1xuICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGEpO1xuICAgICAgICBjb25zdCBhU3RhdGUgPSBhID09PSBhdG9tID8gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGEpIDogcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCBhKTtcbiAgICAgICAgaWYgKGFTdGF0ZSkge1xuICAgICAgICAgIGlmIChcImVcIiBpbiBhU3RhdGUpIHtcbiAgICAgICAgICAgIHRocm93IGFTdGF0ZS5lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJwXCIgaW4gYVN0YXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBhU3RhdGUucDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFTdGF0ZS52O1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJbml0aWFsVmFsdWUoYSkpIHtcbiAgICAgICAgICByZXR1cm4gYS5pbml0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGF0b20gaW5pdFwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNldEF0b21Qcm9taXNlT3JWYWx1ZSh2ZXJzaW9uLCBhdG9tLCBwcm9taXNlT3JWYWx1ZSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9IGNhdGNoIChlcnJvck9yUHJvbWlzZSkge1xuICAgICAgaWYgKGVycm9yT3JQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBjb25zdCBzdXNwZW5zZVByb21pc2UgPSBpc1N1c3BlbnNlUHJvbWlzZShlcnJvck9yUHJvbWlzZSkgJiYgaXNTdXNwZW5zZVByb21pc2VBbHJlYWR5Q2FuY2VsbGVkKGVycm9yT3JQcm9taXNlKSA/IGNvcHlTdXNwZW5zZVByb21pc2UoZXJyb3JPclByb21pc2UpIDogY3JlYXRlU3VzcGVuc2VQcm9taXNlKGVycm9yT3JQcm9taXNlLCBlcnJvck9yUHJvbWlzZSk7XG4gICAgICAgIHJldHVybiBzZXRBdG9tU3VzcGVuc2VQcm9taXNlKFxuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgYXRvbSxcbiAgICAgICAgICBzdXNwZW5zZVByb21pc2UsXG4gICAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0QXRvbVJlYWRFcnJvcih2ZXJzaW9uLCBhdG9tLCBlcnJvck9yUHJvbWlzZSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tID0gKHJlYWRpbmdBdG9tLCB2ZXJzaW9uKSA9PiB7XG4gICAgY29uc3QgYXRvbVN0YXRlID0gcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCByZWFkaW5nQXRvbSk7XG4gICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgfTtcbiAgY29uc3QgYWRkQXRvbSA9ICh2ZXJzaW9uLCBhZGRpbmdBdG9tKSA9PiB7XG4gICAgbGV0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhZGRpbmdBdG9tKTtcbiAgICBpZiAoIW1vdW50ZWQpIHtcbiAgICAgIG1vdW50ZWQgPSBtb3VudEF0b20odmVyc2lvbiwgYWRkaW5nQXRvbSk7XG4gICAgfVxuICAgIHJldHVybiBtb3VudGVkO1xuICB9O1xuICBjb25zdCBjYW5Vbm1vdW50QXRvbSA9IChhdG9tLCBtb3VudGVkKSA9PiAhbW91bnRlZC5sLnNpemUgJiYgKCFtb3VudGVkLnQuc2l6ZSB8fCBtb3VudGVkLnQuc2l6ZSA9PT0gMSAmJiBtb3VudGVkLnQuaGFzKGF0b20pKTtcbiAgY29uc3QgZGVsQXRvbSA9ICh2ZXJzaW9uLCBkZWxldGluZ0F0b20pID0+IHtcbiAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoZGVsZXRpbmdBdG9tKTtcbiAgICBpZiAobW91bnRlZCAmJiBjYW5Vbm1vdW50QXRvbShkZWxldGluZ0F0b20sIG1vdW50ZWQpKSB7XG4gICAgICB1bm1vdW50QXRvbSh2ZXJzaW9uLCBkZWxldGluZ0F0b20pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaW52YWxpZGF0ZURlcGVuZGVudHMgPSAodmVyc2lvbiwgYXRvbSkgPT4ge1xuICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLnQuZm9yRWFjaCgoZGVwZW5kZW50KSA9PiB7XG4gICAgICBpZiAoZGVwZW5kZW50ICE9PSBhdG9tKSB7XG4gICAgICAgIHNldEF0b21JbnZhbGlkYXRlZCh2ZXJzaW9uLCBkZXBlbmRlbnQpO1xuICAgICAgICBpbnZhbGlkYXRlRGVwZW5kZW50cyh2ZXJzaW9uLCBkZXBlbmRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCB3cml0ZUF0b21TdGF0ZSA9ICh2ZXJzaW9uLCBhdG9tLCB1cGRhdGUpID0+IHtcbiAgICBsZXQgaXNTeW5jID0gdHJ1ZTtcbiAgICBjb25zdCB3cml0ZUdldHRlciA9IChhLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBhU3RhdGUgPSByZWFkQXRvbVN0YXRlKHZlcnNpb24sIGEpO1xuICAgICAgaWYgKFwiZVwiIGluIGFTdGF0ZSkge1xuICAgICAgICB0aHJvdyBhU3RhdGUuZTtcbiAgICAgIH1cbiAgICAgIGlmIChcInBcIiBpbiBhU3RhdGUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMudW5zdGFibGVfcHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBhU3RhdGUucC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYSk7XG4gICAgICAgICAgICBpZiAocyAmJiBcInBcIiBpbiBzICYmIHMucCA9PT0gYVN0YXRlLnApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHdyaXRlR2V0dGVyKGEsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVHZXR0ZXIoYSwgb3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgIFwiUmVhZGluZyBwZW5kaW5nIGF0b20gc3RhdGUgaW4gd3JpdGUgb3BlcmF0aW9uLiBXZSB0aHJvdyBhIHByb21pc2UgZm9yIG5vdy5cIixcbiAgICAgICAgICAgIGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGFTdGF0ZS5wO1xuICAgICAgfVxuICAgICAgaWYgKFwidlwiIGluIGFTdGF0ZSkge1xuICAgICAgICByZXR1cm4gYVN0YXRlLnY7XG4gICAgICB9XG4gICAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltCdWddIG5vIHZhbHVlIGZvdW5kIHdoaWxlIHJlYWRpbmcgYXRvbSBpbiB3cml0ZSBvcGVyYXRpb24uIFRoaXMgaXMgcHJvYmFibHkgYSBidWcuXCIsXG4gICAgICAgICAgYVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gdmFsdWUgZm91bmRcIik7XG4gICAgfTtcbiAgICBjb25zdCBzZXR0ZXIgPSAoYSwgdikgPT4ge1xuICAgICAgbGV0IHByb21pc2VPclZvaWQyO1xuICAgICAgaWYgKGEgPT09IGF0b20pIHtcbiAgICAgICAgaWYgKCFoYXNJbml0aWFsVmFsdWUoYSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdG9tIG5vdCB3cml0YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ZXJzaW9uU2V0ID0gY2FuY2VsQWxsU3VzcGVuc2VQcm9taXNlSW5DYWNoZShhKTtcbiAgICAgICAgdmVyc2lvblNldC5mb3JFYWNoKChjYW5jZWxsZWRWZXJzaW9uKSA9PiB7XG4gICAgICAgICAgaWYgKGNhbmNlbGxlZFZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgICAgICAgIHNldEF0b21Qcm9taXNlT3JWYWx1ZShjYW5jZWxsZWRWZXJzaW9uLCBhLCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGEpO1xuICAgICAgICBjb25zdCBuZXh0QXRvbVN0YXRlID0gc2V0QXRvbVByb21pc2VPclZhbHVlKHZlcnNpb24sIGEsIHYpO1xuICAgICAgICBpZiAocHJldkF0b21TdGF0ZSAhPT0gbmV4dEF0b21TdGF0ZSkge1xuICAgICAgICAgIGludmFsaWRhdGVEZXBlbmRlbnRzKHZlcnNpb24sIGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlT3JWb2lkMiA9IHdyaXRlQXRvbVN0YXRlKHZlcnNpb24sIGEsIHYpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1N5bmMpIHtcbiAgICAgICAgZmx1c2hQZW5kaW5nKHZlcnNpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb21pc2VPclZvaWQyO1xuICAgIH07XG4gICAgY29uc3QgcHJvbWlzZU9yVm9pZCA9IGF0b20ud3JpdGUod3JpdGVHZXR0ZXIsIHNldHRlciwgdXBkYXRlKTtcbiAgICBpc1N5bmMgPSBmYWxzZTtcbiAgICByZXR1cm4gcHJvbWlzZU9yVm9pZDtcbiAgfTtcbiAgY29uc3Qgd3JpdGVBdG9tID0gKHdyaXRpbmdBdG9tLCB1cGRhdGUsIHZlcnNpb24pID0+IHtcbiAgICBjb25zdCBwcm9taXNlT3JWb2lkID0gd3JpdGVBdG9tU3RhdGUodmVyc2lvbiwgd3JpdGluZ0F0b20sIHVwZGF0ZSk7XG4gICAgZmx1c2hQZW5kaW5nKHZlcnNpb24pO1xuICAgIHJldHVybiBwcm9taXNlT3JWb2lkO1xuICB9O1xuICBjb25zdCBpc0FjdHVhbGx5V3JpdGFibGVBdG9tID0gKGF0b20pID0+ICEhYXRvbS53cml0ZTtcbiAgY29uc3QgbW91bnRBdG9tID0gKHZlcnNpb24sIGF0b20sIGluaXRpYWxEZXBlbmRlbnQpID0+IHtcbiAgICBjb25zdCBtb3VudGVkID0ge1xuICAgICAgdDogbmV3IFNldChpbml0aWFsRGVwZW5kZW50ICYmIFtpbml0aWFsRGVwZW5kZW50XSksXG4gICAgICBsOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gICAgfTtcbiAgICBtb3VudGVkTWFwLnNldChhdG9tLCBtb3VudGVkKTtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBtb3VudGVkQXRvbXMuYWRkKGF0b20pO1xuICAgIH1cbiAgICBjb25zdCBhdG9tU3RhdGUgPSByZWFkQXRvbVN0YXRlKHZvaWQgMCwgYXRvbSk7XG4gICAgYXRvbVN0YXRlLmQuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgY29uc3QgYU1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhKTtcbiAgICAgIGlmIChhTW91bnRlZCkge1xuICAgICAgICBhTW91bnRlZC50LmFkZChhdG9tKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhICE9PSBhdG9tKSB7XG4gICAgICAgICAgbW91bnRBdG9tKHZlcnNpb24sIGEsIGF0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlzQWN0dWFsbHlXcml0YWJsZUF0b20oYXRvbSkgJiYgYXRvbS5vbk1vdW50KSB7XG4gICAgICBjb25zdCBzZXRBdG9tID0gKHVwZGF0ZSkgPT4gd3JpdGVBdG9tKGF0b20sIHVwZGF0ZSwgdmVyc2lvbik7XG4gICAgICBjb25zdCBvblVubW91bnQgPSBhdG9tLm9uTW91bnQoc2V0QXRvbSk7XG4gICAgICB2ZXJzaW9uID0gdm9pZCAwO1xuICAgICAgaWYgKG9uVW5tb3VudCkge1xuICAgICAgICBtb3VudGVkLnUgPSBvblVubW91bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb3VudGVkO1xuICB9O1xuICBjb25zdCB1bm1vdW50QXRvbSA9ICh2ZXJzaW9uLCBhdG9tKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9uVW5tb3VudCA9IChfYSA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pKSA9PSBudWxsID8gdm9pZCAwIDogX2EudTtcbiAgICBpZiAob25Vbm1vdW50KSB7XG4gICAgICBvblVubW91bnQoKTtcbiAgICB9XG4gICAgbW91bnRlZE1hcC5kZWxldGUoYXRvbSk7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgbW91bnRlZEF0b21zLmRlbGV0ZShhdG9tKTtcbiAgICB9XG4gICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20pO1xuICAgIGlmIChhdG9tU3RhdGUpIHtcbiAgICAgIGlmIChcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgICAgY2FuY2VsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wKTtcbiAgICAgIH1cbiAgICAgIGF0b21TdGF0ZS5kLmZvckVhY2goKF8sIGEpID0+IHtcbiAgICAgICAgaWYgKGEgIT09IGF0b20pIHtcbiAgICAgICAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoYSk7XG4gICAgICAgICAgaWYgKG1vdW50ZWQpIHtcbiAgICAgICAgICAgIG1vdW50ZWQudC5kZWxldGUoYXRvbSk7XG4gICAgICAgICAgICBpZiAoY2FuVW5tb3VudEF0b20oYSwgbW91bnRlZCkpIHtcbiAgICAgICAgICAgICAgdW5tb3VudEF0b20odmVyc2lvbiwgYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS53YXJuKFwiW0J1Z10gY291bGQgbm90IGZpbmQgYXRvbSBzdGF0ZSB0byB1bm1vdW50XCIsIGF0b20pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnREZXBlbmRlbmNpZXMgPSAodmVyc2lvbiwgYXRvbSwgYXRvbVN0YXRlLCBwcmV2UmVhZERlcGVuZGVuY2llcykgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBTZXQoYXRvbVN0YXRlLmQua2V5cygpKTtcbiAgICBwcmV2UmVhZERlcGVuZGVuY2llcyA9PSBudWxsID8gdm9pZCAwIDogcHJldlJlYWREZXBlbmRlbmNpZXMuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgaWYgKGRlcGVuZGVuY2llcy5oYXMoYSkpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLmRlbGV0ZShhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGEpO1xuICAgICAgaWYgKG1vdW50ZWQpIHtcbiAgICAgICAgbW91bnRlZC50LmRlbGV0ZShhdG9tKTtcbiAgICAgICAgaWYgKGNhblVubW91bnRBdG9tKGEsIG1vdW50ZWQpKSB7XG4gICAgICAgICAgdW5tb3VudEF0b20odmVyc2lvbiwgYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGEpO1xuICAgICAgaWYgKG1vdW50ZWQpIHtcbiAgICAgICAgbW91bnRlZC50LmFkZChhdG9tKTtcbiAgICAgIH0gZWxzZSBpZiAobW91bnRlZE1hcC5oYXMoYXRvbSkpIHtcbiAgICAgICAgbW91bnRBdG9tKHZlcnNpb24sIGEsIGF0b20pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAodmVyc2lvbikgPT4ge1xuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAgPSBnZXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAodmVyc2lvbik7XG4gICAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuZm9yRWFjaCgoYXRvbVN0YXRlLCBhdG9tKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZEF0b21TdGF0ZSA9IGNvbW1pdHRlZEF0b21TdGF0ZU1hcC5nZXQoYXRvbSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUgIT09IGNvbW1pdHRlZEF0b21TdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICAgICAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLmwuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKHZlcnNpb24pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlIChwZW5kaW5nTWFwLnNpemUpIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHBlbmRpbmdNYXApO1xuICAgICAgcGVuZGluZ01hcC5jbGVhcigpO1xuICAgICAgcGVuZGluZy5mb3JFYWNoKChbYXRvbSwgcHJldkF0b21TdGF0ZV0pID0+IHtcbiAgICAgICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZvaWQgMCwgYXRvbSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUgJiYgYXRvbVN0YXRlLmQgIT09IChwcmV2QXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBwcmV2QXRvbVN0YXRlLmQpKSB7XG4gICAgICAgICAgbW91bnREZXBlbmRlbmNpZXModm9pZCAwLCBhdG9tLCBhdG9tU3RhdGUsIHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZBdG9tU3RhdGUgJiYgIXByZXZBdG9tU3RhdGUueSAmJiAvLyBpbnZhbGlkYXRlZFxuICAgICAgICAoYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUueSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICAgICAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLmwuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHN0YXRlTGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwoKSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBjb21taXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAgPSAodmVyc2lvbikgPT4ge1xuICAgIGNvbnN0IHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IGdldFZlcnNpb25lZEF0b21TdGF0ZU1hcCh2ZXJzaW9uKTtcbiAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuZm9yRWFjaCgoYXRvbVN0YXRlLCBhdG9tKSA9PiB7XG4gICAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gY29tbWl0dGVkQXRvbVN0YXRlTWFwLmdldChhdG9tKTtcbiAgICAgIGlmICghcHJldkF0b21TdGF0ZSB8fCBhdG9tU3RhdGUuciA+IHByZXZBdG9tU3RhdGUuciB8fCBhdG9tU3RhdGUueSAhPT0gcHJldkF0b21TdGF0ZS55IHx8IGF0b21TdGF0ZS5yID09PSBwcmV2QXRvbVN0YXRlLnIgJiYgYXRvbVN0YXRlLmQgIT09IHByZXZBdG9tU3RhdGUuZCkge1xuICAgICAgICBjb21taXR0ZWRBdG9tU3RhdGVNYXAuc2V0KGF0b20sIGF0b21TdGF0ZSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUuZCAhPT0gKHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCkpIHtcbiAgICAgICAgICBtb3VudERlcGVuZGVuY2llcyh2ZXJzaW9uLCBhdG9tLCBhdG9tU3RhdGUsIHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgY29tbWl0QXRvbSA9IChfYXRvbSwgdmVyc2lvbikgPT4ge1xuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICBjb21taXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAodmVyc2lvbik7XG4gICAgfVxuICAgIGZsdXNoUGVuZGluZyh2b2lkIDApO1xuICB9O1xuICBjb25zdCBzdWJzY3JpYmVBdG9tID0gKGF0b20sIGNhbGxiYWNrLCB2ZXJzaW9uKSA9PiB7XG4gICAgY29uc3QgbW91bnRlZCA9IGFkZEF0b20odmVyc2lvbiwgYXRvbSk7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbW91bnRlZC5sO1xuICAgIGxpc3RlbmVycy5hZGQoY2FsbGJhY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgIGRlbEF0b20odmVyc2lvbiwgYXRvbSk7XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgcmVzdG9yZUF0b21zID0gKHZhbHVlcywgdmVyc2lvbikgPT4ge1xuICAgIGZvciAoY29uc3QgW2F0b20sIHZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChoYXNJbml0aWFsVmFsdWUoYXRvbSkpIHtcbiAgICAgICAgc2V0QXRvbVByb21pc2VPclZhbHVlKHZlcnNpb24sIGF0b20sIHZhbHVlKTtcbiAgICAgICAgaW52YWxpZGF0ZURlcGVuZGVudHModmVyc2lvbiwgYXRvbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZsdXNoUGVuZGluZyh2ZXJzaW9uKTtcbiAgfTtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiB7XG4gICAgICBbUkVBRF9BVE9NXTogcmVhZEF0b20sXG4gICAgICBbV1JJVEVfQVRPTV06IHdyaXRlQXRvbSxcbiAgICAgIFtDT01NSVRfQVRPTV06IGNvbW1pdEF0b20sXG4gICAgICBbU1VCU0NSSUJFX0FUT01dOiBzdWJzY3JpYmVBdG9tLFxuICAgICAgW1JFU1RPUkVfQVRPTVNdOiByZXN0b3JlQXRvbXMsXG4gICAgICBbREVWX1NVQlNDUklCRV9TVEFURV06IChsKSA9PiB7XG4gICAgICAgIHN0YXRlTGlzdGVuZXJzLmFkZChsKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdGF0ZUxpc3RlbmVycy5kZWxldGUobCk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgW0RFVl9HRVRfTU9VTlRFRF9BVE9NU106ICgpID0+IG1vdW50ZWRBdG9tcy52YWx1ZXMoKSxcbiAgICAgIFtERVZfR0VUX0FUT01fU1RBVEVdOiAoYSkgPT4gY29tbWl0dGVkQXRvbVN0YXRlTWFwLmdldChhKSxcbiAgICAgIFtERVZfR0VUX01PVU5URURdOiAoYSkgPT4gbW91bnRlZE1hcC5nZXQoYSlcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW1JFQURfQVRPTV06IHJlYWRBdG9tLFxuICAgIFtXUklURV9BVE9NXTogd3JpdGVBdG9tLFxuICAgIFtDT01NSVRfQVRPTV06IGNvbW1pdEF0b20sXG4gICAgW1NVQlNDUklCRV9BVE9NXTogc3Vic2NyaWJlQXRvbSxcbiAgICBbUkVTVE9SRV9BVE9NU106IHJlc3RvcmVBdG9tc1xuICB9O1xufTtcbmNvbnN0IGNyZWF0ZVN0b3JlRm9yRXhwb3J0ID0gKGluaXRpYWxWYWx1ZXMpID0+IHtcbiAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShpbml0aWFsVmFsdWVzKTtcbiAgY29uc3QgZ2V0ID0gKGF0b20pID0+IHtcbiAgICBjb25zdCBhdG9tU3RhdGUgPSBzdG9yZVtSRUFEX0FUT01dKGF0b20pO1xuICAgIGlmIChcImVcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHRocm93IGF0b21TdGF0ZS5lO1xuICAgIH1cbiAgICBpZiAoXCJwXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbVN0YXRlLnY7XG4gIH07XG4gIGNvbnN0IGFzeW5jR2V0ID0gKGF0b20pID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBhdG9tU3RhdGUgPSBzdG9yZVtSRUFEX0FUT01dKGF0b20pO1xuICAgIGlmIChcImVcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHJlamVjdChhdG9tU3RhdGUuZSk7XG4gICAgfSBlbHNlIGlmIChcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHJlc29sdmUoYXRvbVN0YXRlLnAudGhlbigoKSA9PiBhc3luY0dldChhdG9tKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKGF0b21TdGF0ZS52KTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBzZXQgPSAoYXRvbSwgdXBkYXRlKSA9PiBzdG9yZVtXUklURV9BVE9NXShhdG9tLCB1cGRhdGUpO1xuICBjb25zdCBzdWIgPSAoYXRvbSwgY2FsbGJhY2spID0+IHN0b3JlW1NVQlNDUklCRV9BVE9NXShhdG9tLCBjYWxsYmFjayk7XG4gIHJldHVybiB7XG4gICAgZ2V0LFxuICAgIGFzeW5jR2V0LFxuICAgIHNldCxcbiAgICBzdWIsXG4gICAgU0VDUkVUX0lOVEVSTkFMX3N0b3JlOiBzdG9yZVxuICB9O1xufTtcblxuY29uc3QgY3JlYXRlU2NvcGVDb250YWluZXIgPSAoaW5pdGlhbFZhbHVlcywgdW5zdGFibGVfY3JlYXRlU3RvcmUpID0+IHtcbiAgY29uc3Qgc3RvcmUgPSB1bnN0YWJsZV9jcmVhdGVTdG9yZSA/IHVuc3RhYmxlX2NyZWF0ZVN0b3JlKGluaXRpYWxWYWx1ZXMpLlNFQ1JFVF9JTlRFUk5BTF9zdG9yZSA6IGNyZWF0ZVN0b3JlKGluaXRpYWxWYWx1ZXMpO1xuICByZXR1cm4geyBzOiBzdG9yZSB9O1xufTtcbmNvbnN0IFNjb3BlQ29udGV4dE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5jb25zdCBnZXRTY29wZUNvbnRleHQgPSAoc2NvcGUpID0+IHtcbiAgaWYgKCFTY29wZUNvbnRleHRNYXAuaGFzKHNjb3BlKSkge1xuICAgIFNjb3BlQ29udGV4dE1hcC5zZXQoc2NvcGUsIGNyZWF0ZUNvbnRleHQoY3JlYXRlU2NvcGVDb250YWluZXIoKSkpO1xuICB9XG4gIHJldHVybiBTY29wZUNvbnRleHRNYXAuZ2V0KHNjb3BlKTtcbn07XG5cbmNvbnN0IFByb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGluaXRpYWxWYWx1ZXMsXG4gIHNjb3BlLFxuICB1bnN0YWJsZV9jcmVhdGVTdG9yZSxcbiAgdW5zdGFibGVfZW5hYmxlVmVyc2lvbmVkV3JpdGVcbn0pID0+IHtcbiAgY29uc3QgW3ZlcnNpb24sIHNldFZlcnNpb25dID0gdXNlU3RhdGUoe30pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlQ29udGFpbmVyID0gc2NvcGVDb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoc2NvcGVDb250YWluZXIudykge1xuICAgICAgc2NvcGVDb250YWluZXIuc1tDT01NSVRfQVRPTV0obnVsbCwgdmVyc2lvbik7XG4gICAgICBkZWxldGUgdmVyc2lvbi5wO1xuICAgICAgc2NvcGVDb250YWluZXIudiA9IHZlcnNpb247XG4gICAgfVxuICB9LCBbdmVyc2lvbl0pO1xuICBjb25zdCBzY29wZUNvbnRhaW5lclJlZiA9IHVzZVJlZigpO1xuICBpZiAoIXNjb3BlQ29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICBjb25zdCBzY29wZUNvbnRhaW5lciA9IGNyZWF0ZVNjb3BlQ29udGFpbmVyKFxuICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICAgIHVuc3RhYmxlX2NyZWF0ZVN0b3JlXG4gICAgKTtcbiAgICBpZiAodW5zdGFibGVfZW5hYmxlVmVyc2lvbmVkV3JpdGUpIHtcbiAgICAgIGxldCByZXRyeWluZyA9IDA7XG4gICAgICBzY29wZUNvbnRhaW5lci53ID0gKHdyaXRlKSA9PiB7XG4gICAgICAgIHNldFZlcnNpb24oKHBhcmVudFZlcnNpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0VmVyc2lvbiA9IHJldHJ5aW5nID8gcGFyZW50VmVyc2lvbiA6IHsgcDogcGFyZW50VmVyc2lvbiB9O1xuICAgICAgICAgIHdyaXRlKG5leHRWZXJzaW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV4dFZlcnNpb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHNjb3BlQ29udGFpbmVyLnYgPSB2ZXJzaW9uO1xuICAgICAgc2NvcGVDb250YWluZXIuciA9IChmbikgPT4ge1xuICAgICAgICArK3JldHJ5aW5nO1xuICAgICAgICBmbigpO1xuICAgICAgICAtLXJldHJ5aW5nO1xuICAgICAgfTtcbiAgICB9XG4gICAgc2NvcGVDb250YWluZXJSZWYuY3VycmVudCA9IHNjb3BlQ29udGFpbmVyO1xuICB9XG4gIGNvbnN0IFNjb3BlQ29udGFpbmVyQ29udGV4dCA9IGdldFNjb3BlQ29udGV4dChzY29wZSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgIFNjb3BlQ29udGFpbmVyQ29udGV4dC5Qcm92aWRlcixcbiAgICB7XG4gICAgICB2YWx1ZTogc2NvcGVDb250YWluZXJSZWYuY3VycmVudFxuICAgIH0sXG4gICAgY2hpbGRyZW5cbiAgKTtcbn07XG5cbmZ1bmN0aW9uIGF0b20ocmVhZCwgd3JpdGUpIHtcbiAgcmV0dXJuIGF0b20kMShyZWFkLCB3cml0ZSk7XG59XG5cbmZ1bmN0aW9uIHVzZUF0b21WYWx1ZShhdG9tLCBzY29wZSkge1xuICBjb25zdCBTY29wZUNvbnRleHQgPSBnZXRTY29wZUNvbnRleHQoc2NvcGUpO1xuICBjb25zdCBzY29wZUNvbnRhaW5lciA9IHVzZUNvbnRleHQoU2NvcGVDb250ZXh0KTtcbiAgY29uc3QgeyBzOiBzdG9yZSwgdjogdmVyc2lvbkZyb21Qcm92aWRlciB9ID0gc2NvcGVDb250YWluZXI7XG4gIGNvbnN0IGdldEF0b21WYWx1ZSA9ICh2ZXJzaW9uMikgPT4ge1xuICAgIGNvbnN0IGF0b21TdGF0ZSA9IHN0b3JlW1JFQURfQVRPTV0oYXRvbSwgdmVyc2lvbjIpO1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWF0b21TdGF0ZS55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzaG91bGQgbm90IGJlIGludmFsaWRhdGVkXCIpO1xuICAgIH1cbiAgICBpZiAoXCJlXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgICB0aHJvdyBhdG9tU3RhdGUuZTtcbiAgICB9XG4gICAgaWYgKFwicFwiIGluIGF0b21TdGF0ZSkge1xuICAgICAgdGhyb3cgYXRvbVN0YXRlLnA7XG4gICAgfVxuICAgIGlmIChcInZcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHJldHVybiBhdG9tU3RhdGUudjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibm8gYXRvbSB2YWx1ZVwiKTtcbiAgfTtcbiAgY29uc3QgW1t2ZXJzaW9uLCB2YWx1ZUZyb21SZWR1Y2VyLCBhdG9tRnJvbVJlZHVjZXJdLCByZXJlbmRlcklmQ2hhbmdlZF0gPSB1c2VSZWR1Y2VyKFxuICAgIChwcmV2LCBuZXh0VmVyc2lvbikgPT4ge1xuICAgICAgY29uc3QgbmV4dFZhbHVlID0gZ2V0QXRvbVZhbHVlKG5leHRWZXJzaW9uKTtcbiAgICAgIGlmIChPYmplY3QuaXMocHJldlsxXSwgbmV4dFZhbHVlKSAmJiBwcmV2WzJdID09PSBhdG9tKSB7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtuZXh0VmVyc2lvbiwgbmV4dFZhbHVlLCBhdG9tXTtcbiAgICB9LFxuICAgIHZlcnNpb25Gcm9tUHJvdmlkZXIsXG4gICAgKGluaXRpYWxWZXJzaW9uKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXRBdG9tVmFsdWUoaW5pdGlhbFZlcnNpb24pO1xuICAgICAgcmV0dXJuIFtpbml0aWFsVmVyc2lvbiwgaW5pdGlhbFZhbHVlLCBhdG9tXTtcbiAgICB9XG4gICk7XG4gIGxldCB2YWx1ZSA9IHZhbHVlRnJvbVJlZHVjZXI7XG4gIGlmIChhdG9tRnJvbVJlZHVjZXIgIT09IGF0b20pIHtcbiAgICByZXJlbmRlcklmQ2hhbmdlZCh2ZXJzaW9uKTtcbiAgICB2YWx1ZSA9IGdldEF0b21WYWx1ZSh2ZXJzaW9uKTtcbiAgfVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgdjogdmVyc2lvbkZyb21Qcm92aWRlcjIgfSA9IHNjb3BlQ29udGFpbmVyO1xuICAgIGlmICh2ZXJzaW9uRnJvbVByb3ZpZGVyMikge1xuICAgICAgc3RvcmVbQ09NTUlUX0FUT01dKGF0b20sIHZlcnNpb25Gcm9tUHJvdmlkZXIyKTtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZVtTVUJTQ1JJQkVfQVRPTV0oXG4gICAgICBhdG9tLFxuICAgICAgcmVyZW5kZXJJZkNoYW5nZWQsXG4gICAgICB2ZXJzaW9uRnJvbVByb3ZpZGVyMlxuICAgICk7XG4gICAgcmVyZW5kZXJJZkNoYW5nZWQodmVyc2lvbkZyb21Qcm92aWRlcjIpO1xuICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgfSwgW3N0b3JlLCBhdG9tLCBzY29wZUNvbnRhaW5lcl0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHN0b3JlW0NPTU1JVF9BVE9NXShhdG9tLCB2ZXJzaW9uKTtcbiAgfSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVzZVNldEF0b20oYXRvbSwgc2NvcGUpIHtcbiAgY29uc3QgU2NvcGVDb250ZXh0ID0gZ2V0U2NvcGVDb250ZXh0KHNjb3BlKTtcbiAgY29uc3QgeyBzOiBzdG9yZSwgdzogdmVyc2lvbmVkV3JpdGUgfSA9IHVzZUNvbnRleHQoU2NvcGVDb250ZXh0KTtcbiAgY29uc3Qgc2V0QXRvbSA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGUpID0+IHtcbiAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIShcIndyaXRlXCIgaW4gYXRvbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHdyaXRhYmxlIGF0b21cIik7XG4gICAgICB9XG4gICAgICBjb25zdCB3cml0ZSA9ICh2ZXJzaW9uKSA9PiBzdG9yZVtXUklURV9BVE9NXShhdG9tLCB1cGRhdGUsIHZlcnNpb24pO1xuICAgICAgcmV0dXJuIHZlcnNpb25lZFdyaXRlID8gdmVyc2lvbmVkV3JpdGUod3JpdGUpIDogd3JpdGUoKTtcbiAgICB9LFxuICAgIFtzdG9yZSwgdmVyc2lvbmVkV3JpdGUsIGF0b21dXG4gICk7XG4gIHJldHVybiBzZXRBdG9tO1xufVxuXG5mdW5jdGlvbiB1c2VBdG9tKGF0b20sIHNjb3BlKSB7XG4gIGlmIChcInNjb3BlXCIgaW4gYXRvbSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiYXRvbS5zY29wZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgZG8gdXNlQXRvbShhdG9tLCBzY29wZSkgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgc2NvcGUgPSBhdG9tLnNjb3BlO1xuICB9XG4gIHJldHVybiBbXG4gICAgdXNlQXRvbVZhbHVlKGF0b20sIHNjb3BlKSxcbiAgICAvLyBXZSBkbyB3cm9uZyB0eXBlIGFzc2VydGlvbiBoZXJlLCB3aGljaCByZXN1bHRzIGluIHRocm93aW5nIGFuIGVycm9yLlxuICAgIHVzZVNldEF0b20oYXRvbSwgc2NvcGUpXG4gIF07XG59XG5cbmV4cG9ydCB7IFByb3ZpZGVyLCBnZXRTY29wZUNvbnRleHQgYXMgU0VDUkVUX0lOVEVSTkFMX2dldFNjb3BlQ29udGV4dCwgcmVnaXN0ZXJQcm9taXNlQWJvcnQgYXMgU0VDUkVUX0lOVEVSTkFMX3JlZ2lzdGVyUHJvbWlzZUFib3J0LCBhdG9tLCBjcmVhdGVTdG9yZUZvckV4cG9ydCBhcyB1bnN0YWJsZV9jcmVhdGVTdG9yZSwgdXNlQXRvbSwgdXNlQXRvbVZhbHVlLCB1c2VTZXRBdG9tIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/jotai/esm/index.mjs\n");
5491
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Provider\": () => (/* binding */ Provider),\n/* harmony export */ \"SECRET_INTERNAL_getScopeContext\": () => (/* binding */ getScopeContext),\n/* harmony export */ \"SECRET_INTERNAL_registerPromiseAbort\": () => (/* binding */ registerPromiseAbort),\n/* harmony export */ \"atom\": () => (/* binding */ atom),\n/* harmony export */ \"unstable_createStore\": () => (/* binding */ createStoreForExport),\n/* harmony export */ \"useAtom\": () => (/* binding */ useAtom),\n/* harmony export */ \"useAtomValue\": () => (/* binding */ useAtomValue),\n/* harmony export */ \"useSetAtom\": () => (/* binding */ useSetAtom)\n/* harmony export */ });\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var jotai_vanilla__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! jotai/vanilla */ \"../../../node_modules/jotai/esm/vanilla.mjs\");\n\n\n\nconst SUSPENSE_PROMISE = Symbol();\nconst isSuspensePromise = (promise) => !!promise[SUSPENSE_PROMISE];\nconst isSuspensePromiseAlreadyCancelled = (suspensePromise) => !suspensePromise[SUSPENSE_PROMISE].c;\nconst cancelSuspensePromise = (suspensePromise) => {\n var _a;\n const { b: basePromise, c: cancelPromise } = suspensePromise[SUSPENSE_PROMISE];\n if (cancelPromise) {\n cancelPromise();\n (_a = promiseAbortMap.get(basePromise)) == null ? void 0 : _a();\n }\n};\nconst isEqualSuspensePromise = (oldSuspensePromise, newSuspensePromise) => {\n const oldOriginalPromise = oldSuspensePromise[SUSPENSE_PROMISE].o;\n const newOriginalPromise = newSuspensePromise[SUSPENSE_PROMISE].o;\n return oldOriginalPromise === newOriginalPromise || oldSuspensePromise === newOriginalPromise || isSuspensePromise(oldOriginalPromise) && isEqualSuspensePromise(oldOriginalPromise, newSuspensePromise);\n};\nconst createSuspensePromise = (basePromise, promise) => {\n const suspensePromiseExtra = {\n b: basePromise,\n o: promise,\n c: null\n };\n const suspensePromise = new Promise((resolve) => {\n suspensePromiseExtra.c = () => {\n suspensePromiseExtra.c = null;\n resolve();\n };\n promise.finally(suspensePromiseExtra.c);\n });\n suspensePromise[SUSPENSE_PROMISE] = suspensePromiseExtra;\n return suspensePromise;\n};\nconst copySuspensePromise = (suspensePromise) => createSuspensePromise(\n suspensePromise[SUSPENSE_PROMISE].b,\n suspensePromise[SUSPENSE_PROMISE].o\n);\nconst promiseAbortMap = /* @__PURE__ */ new WeakMap();\nconst registerPromiseAbort = (basePromise, abort) => {\n promiseAbortMap.set(basePromise, abort);\n};\n\nconst hasInitialValue = (atom) => \"init\" in atom;\nconst READ_ATOM = \"r\";\nconst WRITE_ATOM = \"w\";\nconst COMMIT_ATOM = \"c\";\nconst SUBSCRIBE_ATOM = \"s\";\nconst RESTORE_ATOMS = \"h\";\nconst DEV_SUBSCRIBE_STATE = \"n\";\nconst DEV_GET_MOUNTED_ATOMS = \"l\";\nconst DEV_GET_ATOM_STATE = \"a\";\nconst DEV_GET_MOUNTED = \"m\";\nconst createStore = (initialValues) => {\n const committedAtomStateMap = /* @__PURE__ */ new WeakMap();\n const mountedMap = /* @__PURE__ */ new WeakMap();\n const pendingMap = /* @__PURE__ */ new Map();\n let stateListeners;\n let mountedAtoms;\n if (true) {\n stateListeners = /* @__PURE__ */ new Set();\n mountedAtoms = /* @__PURE__ */ new Set();\n }\n if (initialValues) {\n for (const [atom, value] of initialValues) {\n const atomState = {\n v: value,\n r: 0,\n y: true,\n // not invalidated\n d: /* @__PURE__ */ new Map()\n };\n if (true) {\n Object.freeze(atomState);\n if (!hasInitialValue(atom)) {\n console.warn(\n \"Found initial value for derived atom which can cause unexpected behavior\",\n atom\n );\n }\n }\n committedAtomStateMap.set(atom, atomState);\n }\n }\n const suspensePromiseCacheMap = /* @__PURE__ */ new WeakMap();\n const addSuspensePromiseToCache = (version, atom, suspensePromise) => {\n let cache = suspensePromiseCacheMap.get(atom);\n if (!cache) {\n cache = /* @__PURE__ */ new Map();\n suspensePromiseCacheMap.set(atom, cache);\n }\n suspensePromise.then(() => {\n if (cache.get(version) === suspensePromise) {\n cache.delete(version);\n if (!cache.size) {\n suspensePromiseCacheMap.delete(atom);\n }\n }\n });\n cache.set(version, suspensePromise);\n };\n const cancelAllSuspensePromiseInCache = (atom) => {\n const versionSet = /* @__PURE__ */ new Set();\n const cache = suspensePromiseCacheMap.get(atom);\n if (cache) {\n suspensePromiseCacheMap.delete(atom);\n cache.forEach((suspensePromise, version) => {\n cancelSuspensePromise(suspensePromise);\n versionSet.add(version);\n });\n }\n return versionSet;\n };\n const versionedAtomStateMapMap = /* @__PURE__ */ new WeakMap();\n const getVersionedAtomStateMap = (version) => {\n let versionedAtomStateMap = versionedAtomStateMapMap.get(version);\n if (!versionedAtomStateMap) {\n versionedAtomStateMap = /* @__PURE__ */ new Map();\n versionedAtomStateMapMap.set(version, versionedAtomStateMap);\n }\n return versionedAtomStateMap;\n };\n const getAtomState = (version, atom) => {\n if (version) {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n let atomState = versionedAtomStateMap.get(atom);\n if (!atomState) {\n atomState = getAtomState(version.p, atom);\n if (atomState && \"p\" in atomState && isSuspensePromiseAlreadyCancelled(atomState.p)) {\n atomState = void 0;\n }\n if (atomState) {\n versionedAtomStateMap.set(atom, atomState);\n }\n }\n return atomState;\n }\n return committedAtomStateMap.get(atom);\n };\n const setAtomState = (version, atom, atomState) => {\n if (true) {\n Object.freeze(atomState);\n }\n if (version) {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n versionedAtomStateMap.set(atom, atomState);\n } else {\n const prevAtomState = committedAtomStateMap.get(atom);\n committedAtomStateMap.set(atom, atomState);\n if (!pendingMap.has(atom)) {\n pendingMap.set(atom, prevAtomState);\n }\n }\n };\n const createReadDependencies = (version, prevReadDependencies = /* @__PURE__ */ new Map(), dependencies) => {\n if (!dependencies) {\n return prevReadDependencies;\n }\n const readDependencies = /* @__PURE__ */ new Map();\n let changed = false;\n dependencies.forEach((atom) => {\n var _a;\n const revision = ((_a = getAtomState(version, atom)) == null ? void 0 : _a.r) || 0;\n readDependencies.set(atom, revision);\n if (prevReadDependencies.get(atom) !== revision) {\n changed = true;\n }\n });\n if (prevReadDependencies.size === readDependencies.size && !changed) {\n return prevReadDependencies;\n }\n return readDependencies;\n };\n const setAtomValue = (version, atom, value, dependencies, suspensePromise) => {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (suspensePromise && (!(\"p\" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {\n return atomState;\n }\n if (\"p\" in atomState) {\n cancelSuspensePromise(atomState.p);\n }\n }\n const nextAtomState = {\n v: value,\n r: (atomState == null ? void 0 : atomState.r) || 0,\n y: true,\n // not invalidated\n d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n };\n let changed = !(atomState == null ? void 0 : atomState.y);\n if (!atomState || !(\"v\" in atomState) || // new value, or\n !Object.is(atomState.v, value)) {\n changed = true;\n ++nextAtomState.r;\n if (nextAtomState.d.has(atom)) {\n nextAtomState.d = new Map(nextAtomState.d).set(atom, nextAtomState.r);\n }\n } else if (nextAtomState.d !== atomState.d && (nextAtomState.d.size !== atomState.d.size || !Array.from(nextAtomState.d.keys()).every((a) => atomState.d.has(a)))) {\n changed = true;\n Promise.resolve().then(() => {\n flushPending(version);\n });\n }\n if (atomState && !changed) {\n return atomState;\n }\n setAtomState(version, atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomReadError = (version, atom, error, dependencies, suspensePromise) => {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (suspensePromise && (!(\"p\" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {\n return atomState;\n }\n if (\"p\" in atomState) {\n cancelSuspensePromise(atomState.p);\n }\n }\n const nextAtomState = {\n e: error,\n // set read error\n r: ((atomState == null ? void 0 : atomState.r) || 0) + 1,\n y: true,\n // not invalidated\n d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n };\n setAtomState(version, atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomSuspensePromise = (version, atom, suspensePromise, dependencies) => {\n const atomState = getAtomState(version, atom);\n if (atomState && \"p\" in atomState) {\n if (isEqualSuspensePromise(atomState.p, suspensePromise) && !isSuspensePromiseAlreadyCancelled(atomState.p)) {\n if (!atomState.y) {\n return { ...atomState, y: true };\n }\n return atomState;\n }\n cancelSuspensePromise(atomState.p);\n }\n addSuspensePromiseToCache(version, atom, suspensePromise);\n const nextAtomState = {\n p: suspensePromise,\n r: ((atomState == null ? void 0 : atomState.r) || 0) + 1,\n y: true,\n // not invalidated\n d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n };\n setAtomState(version, atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomPromiseOrValue = (version, atom, promiseOrValue, dependencies) => {\n if (promiseOrValue instanceof Promise) {\n const suspensePromise = createSuspensePromise(\n promiseOrValue,\n promiseOrValue.then((value) => {\n setAtomValue(version, atom, value, dependencies, suspensePromise);\n }).catch((e) => {\n if (e instanceof Promise) {\n if (isSuspensePromise(e)) {\n return e.then(() => {\n readAtomState(version, atom, true);\n });\n }\n return e;\n }\n setAtomReadError(version, atom, e, dependencies, suspensePromise);\n })\n );\n return setAtomSuspensePromise(\n version,\n atom,\n suspensePromise,\n dependencies\n );\n }\n return setAtomValue(\n version,\n atom,\n promiseOrValue,\n dependencies\n );\n };\n const setAtomInvalidated = (version, atom) => {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n const nextAtomState = {\n ...atomState,\n // copy everything\n y: false\n // invalidated\n };\n setAtomState(version, atom, nextAtomState);\n } else if (true) {\n console.warn(\"[Bug] could not invalidate non existing atom\", atom);\n }\n };\n const readAtomState = (version, atom, force) => {\n if (!force) {\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (atomState.y && // not invalidated\n \"p\" in atomState && !isSuspensePromiseAlreadyCancelled(atomState.p)) {\n return atomState;\n }\n atomState.d.forEach((_, a) => {\n if (a !== atom) {\n if (!mountedMap.has(a)) {\n readAtomState(version, a);\n } else {\n const aState = getAtomState(version, a);\n if (aState && !aState.y) {\n readAtomState(version, a);\n }\n }\n }\n });\n if (Array.from(atomState.d).every(([a, r]) => {\n const aState = getAtomState(version, a);\n return aState && !(\"p\" in aState) && // has no suspense promise\n aState.r === r;\n })) {\n if (!atomState.y) {\n return { ...atomState, y: true };\n }\n return atomState;\n }\n }\n }\n const dependencies = /* @__PURE__ */ new Set();\n try {\n const promiseOrValue = atom.read((a) => {\n dependencies.add(a);\n const aState = a === atom ? getAtomState(version, a) : readAtomState(version, a);\n if (aState) {\n if (\"e\" in aState) {\n throw aState.e;\n }\n if (\"p\" in aState) {\n throw aState.p;\n }\n return aState.v;\n }\n if (hasInitialValue(a)) {\n return a.init;\n }\n throw new Error(\"no atom init\");\n });\n return setAtomPromiseOrValue(version, atom, promiseOrValue, dependencies);\n } catch (errorOrPromise) {\n if (errorOrPromise instanceof Promise) {\n const suspensePromise = isSuspensePromise(errorOrPromise) && isSuspensePromiseAlreadyCancelled(errorOrPromise) ? copySuspensePromise(errorOrPromise) : createSuspensePromise(errorOrPromise, errorOrPromise);\n return setAtomSuspensePromise(\n version,\n atom,\n suspensePromise,\n dependencies\n );\n }\n return setAtomReadError(version, atom, errorOrPromise, dependencies);\n }\n };\n const readAtom = (readingAtom, version) => {\n const atomState = readAtomState(version, readingAtom);\n return atomState;\n };\n const addAtom = (version, addingAtom) => {\n let mounted = mountedMap.get(addingAtom);\n if (!mounted) {\n mounted = mountAtom(version, addingAtom);\n }\n return mounted;\n };\n const canUnmountAtom = (atom, mounted) => !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));\n const delAtom = (version, deletingAtom) => {\n const mounted = mountedMap.get(deletingAtom);\n if (mounted && canUnmountAtom(deletingAtom, mounted)) {\n unmountAtom(version, deletingAtom);\n }\n };\n const invalidateDependents = (version, atom) => {\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.t.forEach((dependent) => {\n if (dependent !== atom) {\n setAtomInvalidated(version, dependent);\n invalidateDependents(version, dependent);\n }\n });\n };\n const writeAtomState = (version, atom, update) => {\n let isSync = true;\n const writeGetter = (a, options) => {\n const aState = readAtomState(version, a);\n if (\"e\" in aState) {\n throw aState.e;\n }\n if (\"p\" in aState) {\n if (options == null ? void 0 : options.unstable_promise) {\n return aState.p.then(() => {\n const s = getAtomState(version, a);\n if (s && \"p\" in s && s.p === aState.p) {\n return new Promise((resolve) => setTimeout(resolve)).then(\n () => writeGetter(a, options)\n );\n }\n return writeGetter(a, options);\n });\n }\n if (true) {\n console.info(\n \"Reading pending atom state in write operation. We throw a promise for now.\",\n a\n );\n }\n throw aState.p;\n }\n if (\"v\" in aState) {\n return aState.v;\n }\n if (true) {\n console.warn(\n \"[Bug] no value found while reading atom in write operation. This is probably a bug.\",\n a\n );\n }\n throw new Error(\"no value found\");\n };\n const setter = (a, v) => {\n let promiseOrVoid2;\n if (a === atom) {\n if (!hasInitialValue(a)) {\n throw new Error(\"atom not writable\");\n }\n const versionSet = cancelAllSuspensePromiseInCache(a);\n versionSet.forEach((cancelledVersion) => {\n if (cancelledVersion !== version) {\n setAtomPromiseOrValue(cancelledVersion, a, v);\n }\n });\n const prevAtomState = getAtomState(version, a);\n const nextAtomState = setAtomPromiseOrValue(version, a, v);\n if (prevAtomState !== nextAtomState) {\n invalidateDependents(version, a);\n }\n } else {\n promiseOrVoid2 = writeAtomState(version, a, v);\n }\n if (!isSync) {\n flushPending(version);\n }\n return promiseOrVoid2;\n };\n const promiseOrVoid = atom.write(writeGetter, setter, update);\n isSync = false;\n return promiseOrVoid;\n };\n const writeAtom = (writingAtom, update, version) => {\n const promiseOrVoid = writeAtomState(version, writingAtom, update);\n flushPending(version);\n return promiseOrVoid;\n };\n const isActuallyWritableAtom = (atom) => !!atom.write;\n const mountAtom = (version, atom, initialDependent) => {\n const mounted = {\n t: new Set(initialDependent && [initialDependent]),\n l: /* @__PURE__ */ new Set()\n };\n mountedMap.set(atom, mounted);\n if (true) {\n mountedAtoms.add(atom);\n }\n const atomState = readAtomState(void 0, atom);\n atomState.d.forEach((_, a) => {\n const aMounted = mountedMap.get(a);\n if (aMounted) {\n aMounted.t.add(atom);\n } else {\n if (a !== atom) {\n mountAtom(version, a, atom);\n }\n }\n });\n if (isActuallyWritableAtom(atom) && atom.onMount) {\n const setAtom = (update) => writeAtom(atom, update, version);\n const onUnmount = atom.onMount(setAtom);\n version = void 0;\n if (onUnmount) {\n mounted.u = onUnmount;\n }\n }\n return mounted;\n };\n const unmountAtom = (version, atom) => {\n var _a;\n const onUnmount = (_a = mountedMap.get(atom)) == null ? void 0 : _a.u;\n if (onUnmount) {\n onUnmount();\n }\n mountedMap.delete(atom);\n if (true) {\n mountedAtoms.delete(atom);\n }\n const atomState = getAtomState(version, atom);\n if (atomState) {\n if (\"p\" in atomState) {\n cancelSuspensePromise(atomState.p);\n }\n atomState.d.forEach((_, a) => {\n if (a !== atom) {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(version, a);\n }\n }\n }\n });\n } else if (true) {\n console.warn(\"[Bug] could not find atom state to unmount\", atom);\n }\n };\n const mountDependencies = (version, atom, atomState, prevReadDependencies) => {\n const dependencies = new Set(atomState.d.keys());\n prevReadDependencies == null ? void 0 : prevReadDependencies.forEach((_, a) => {\n if (dependencies.has(a)) {\n dependencies.delete(a);\n return;\n }\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(version, a);\n }\n }\n });\n dependencies.forEach((a) => {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.add(atom);\n } else if (mountedMap.has(atom)) {\n mountAtom(version, a, atom);\n }\n });\n };\n const flushPending = (version) => {\n if (version) {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n versionedAtomStateMap.forEach((atomState, atom) => {\n const committedAtomState = committedAtomStateMap.get(atom);\n if (atomState !== committedAtomState) {\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.l.forEach((listener) => listener(version));\n }\n });\n return;\n }\n while (pendingMap.size) {\n const pending = Array.from(pendingMap);\n pendingMap.clear();\n pending.forEach(([atom, prevAtomState]) => {\n const atomState = getAtomState(void 0, atom);\n if (atomState && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n mountDependencies(void 0, atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n }\n if (prevAtomState && !prevAtomState.y && // invalidated\n (atomState == null ? void 0 : atomState.y)) {\n return;\n }\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.l.forEach((listener) => listener());\n });\n }\n if (true) {\n stateListeners.forEach((l) => l());\n }\n };\n const commitVersionedAtomStateMap = (version) => {\n const versionedAtomStateMap = getVersionedAtomStateMap(version);\n versionedAtomStateMap.forEach((atomState, atom) => {\n const prevAtomState = committedAtomStateMap.get(atom);\n if (!prevAtomState || atomState.r > prevAtomState.r || atomState.y !== prevAtomState.y || atomState.r === prevAtomState.r && atomState.d !== prevAtomState.d) {\n committedAtomStateMap.set(atom, atomState);\n if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n mountDependencies(version, atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n }\n }\n });\n };\n const commitAtom = (_atom, version) => {\n if (version) {\n commitVersionedAtomStateMap(version);\n }\n flushPending(void 0);\n };\n const subscribeAtom = (atom, callback, version) => {\n const mounted = addAtom(version, atom);\n const listeners = mounted.l;\n listeners.add(callback);\n return () => {\n listeners.delete(callback);\n delAtom(version, atom);\n };\n };\n const restoreAtoms = (values, version) => {\n for (const [atom, value] of values) {\n if (hasInitialValue(atom)) {\n setAtomPromiseOrValue(version, atom, value);\n invalidateDependents(version, atom);\n }\n }\n flushPending(version);\n };\n if (true) {\n return {\n [READ_ATOM]: readAtom,\n [WRITE_ATOM]: writeAtom,\n [COMMIT_ATOM]: commitAtom,\n [SUBSCRIBE_ATOM]: subscribeAtom,\n [RESTORE_ATOMS]: restoreAtoms,\n [DEV_SUBSCRIBE_STATE]: (l) => {\n stateListeners.add(l);\n return () => {\n stateListeners.delete(l);\n };\n },\n [DEV_GET_MOUNTED_ATOMS]: () => mountedAtoms.values(),\n [DEV_GET_ATOM_STATE]: (a) => committedAtomStateMap.get(a),\n [DEV_GET_MOUNTED]: (a) => mountedMap.get(a)\n };\n }\n return {\n [READ_ATOM]: readAtom,\n [WRITE_ATOM]: writeAtom,\n [COMMIT_ATOM]: commitAtom,\n [SUBSCRIBE_ATOM]: subscribeAtom,\n [RESTORE_ATOMS]: restoreAtoms\n };\n};\nconst createStoreForExport = (initialValues) => {\n const store = createStore(initialValues);\n const get = (atom) => {\n const atomState = store[READ_ATOM](atom);\n if (\"e\" in atomState) {\n throw atomState.e;\n }\n if (\"p\" in atomState) {\n return void 0;\n }\n return atomState.v;\n };\n const asyncGet = (atom) => new Promise((resolve, reject) => {\n const atomState = store[READ_ATOM](atom);\n if (\"e\" in atomState) {\n reject(atomState.e);\n } else if (\"p\" in atomState) {\n resolve(atomState.p.then(() => asyncGet(atom)));\n } else {\n resolve(atomState.v);\n }\n });\n const set = (atom, update) => store[WRITE_ATOM](atom, update);\n const sub = (atom, callback) => store[SUBSCRIBE_ATOM](atom, callback);\n return {\n get,\n asyncGet,\n set,\n sub,\n SECRET_INTERNAL_store: store\n };\n};\n\nconst createScopeContainer = (initialValues, unstable_createStore) => {\n const store = unstable_createStore ? unstable_createStore(initialValues).SECRET_INTERNAL_store : createStore(initialValues);\n return { s: store };\n};\nconst ScopeContextMap = /* @__PURE__ */ new Map();\nconst getScopeContext = (scope) => {\n if (!ScopeContextMap.has(scope)) {\n ScopeContextMap.set(scope, (0,react__WEBPACK_IMPORTED_MODULE_0__.createContext)(createScopeContainer()));\n }\n return ScopeContextMap.get(scope);\n};\n\nconst Provider = ({\n children,\n initialValues,\n scope,\n unstable_createStore,\n unstable_enableVersionedWrite\n}) => {\n const [version, setVersion] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)({});\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const scopeContainer = scopeContainerRef.current;\n if (scopeContainer.w) {\n scopeContainer.s[COMMIT_ATOM](null, version);\n delete version.p;\n scopeContainer.v = version;\n }\n }, [version]);\n const scopeContainerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)();\n if (!scopeContainerRef.current) {\n const scopeContainer = createScopeContainer(\n initialValues,\n unstable_createStore\n );\n if (unstable_enableVersionedWrite) {\n let retrying = 0;\n scopeContainer.w = (write) => {\n setVersion((parentVersion) => {\n const nextVersion = retrying ? parentVersion : { p: parentVersion };\n write(nextVersion);\n return nextVersion;\n });\n };\n scopeContainer.v = version;\n scopeContainer.r = (fn) => {\n ++retrying;\n fn();\n --retrying;\n };\n }\n scopeContainerRef.current = scopeContainer;\n }\n const ScopeContainerContext = getScopeContext(scope);\n return (0,react__WEBPACK_IMPORTED_MODULE_0__.createElement)(\n ScopeContainerContext.Provider,\n {\n value: scopeContainerRef.current\n },\n children\n );\n};\n\nfunction atom(read, write) {\n return (0,jotai_vanilla__WEBPACK_IMPORTED_MODULE_1__.atom)(read, write);\n}\n\nfunction useAtomValue(atom, scope) {\n const ScopeContext = getScopeContext(scope);\n const scopeContainer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ScopeContext);\n const { s: store, v: versionFromProvider } = scopeContainer;\n const getAtomValue = (version2) => {\n const atomState = store[READ_ATOM](atom, version2);\n if ( true && !atomState.y) {\n throw new Error(\"should not be invalidated\");\n }\n if (\"e\" in atomState) {\n throw atomState.e;\n }\n if (\"p\" in atomState) {\n throw atomState.p;\n }\n if (\"v\" in atomState) {\n return atomState.v;\n }\n throw new Error(\"no atom value\");\n };\n const [[version, valueFromReducer, atomFromReducer], rerenderIfChanged] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useReducer)(\n (prev, nextVersion) => {\n const nextValue = getAtomValue(nextVersion);\n if (Object.is(prev[1], nextValue) && prev[2] === atom) {\n return prev;\n }\n return [nextVersion, nextValue, atom];\n },\n versionFromProvider,\n (initialVersion) => {\n const initialValue = getAtomValue(initialVersion);\n return [initialVersion, initialValue, atom];\n }\n );\n let value = valueFromReducer;\n if (atomFromReducer !== atom) {\n rerenderIfChanged(version);\n value = getAtomValue(version);\n }\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n const { v: versionFromProvider2 } = scopeContainer;\n if (versionFromProvider2) {\n store[COMMIT_ATOM](atom, versionFromProvider2);\n }\n const unsubscribe = store[SUBSCRIBE_ATOM](\n atom,\n rerenderIfChanged,\n versionFromProvider2\n );\n rerenderIfChanged(versionFromProvider2);\n return unsubscribe;\n }, [store, atom, scopeContainer]);\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => {\n store[COMMIT_ATOM](atom, version);\n });\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useDebugValue)(value);\n return value;\n}\n\nfunction useSetAtom(atom, scope) {\n const ScopeContext = getScopeContext(scope);\n const { s: store, w: versionedWrite } = (0,react__WEBPACK_IMPORTED_MODULE_0__.useContext)(ScopeContext);\n const setAtom = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(\n (update) => {\n if ( true && !(\"write\" in atom)) {\n throw new Error(\"not writable atom\");\n }\n const write = (version) => store[WRITE_ATOM](atom, update, version);\n return versionedWrite ? versionedWrite(write) : write();\n },\n [store, versionedWrite, atom]\n );\n return setAtom;\n}\n\nfunction useAtom(atom, scope) {\n if (\"scope\" in atom) {\n console.warn(\n \"atom.scope is deprecated. Please do useAtom(atom, scope) instead.\"\n );\n scope = atom.scope;\n }\n return [\n useAtomValue(atom, scope),\n // We do wrong type assertion here, which results in throwing an error.\n useSetAtom(atom, scope)\n ];\n}\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pvdGFpL2VzbS9pbmRleC5tanMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7OztBQUFzSTtBQUN2Rjs7QUFFL0M7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsbUNBQW1DO0FBQzdDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVUsSUFBMEQ7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBbUI7QUFDbkI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQSxlQUFlO0FBQ2Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLFNBQVMsSUFBMEQ7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsY0FBYztBQUNkO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFdBQVc7QUFDWDtBQUNBLFlBQVksSUFBMEQ7QUFDdEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLElBQTBEO0FBQ3BFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQTBEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQTBEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1AsTUFBTSxTQUFTLElBQTBEO0FBQ3pFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVEsSUFBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQSwrQkFBK0Isb0RBQWE7QUFDNUM7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxnQ0FBZ0MsK0NBQVEsR0FBRztBQUMzQyxFQUFFLGdEQUFTO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNILDRCQUE0Qiw2Q0FBTTtBQUNsQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSwyREFBMkQ7QUFDM0Q7QUFDQTtBQUNBLFNBQVM7QUFDVDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxvREFBYTtBQUN0QjtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0EsU0FBUyxtREFBTTtBQUNmOztBQUVBO0FBQ0E7QUFDQSx5QkFBeUIsaURBQVU7QUFDbkMsVUFBVSxtQ0FBbUM7QUFDN0M7QUFDQTtBQUNBLFFBQVEsS0FBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0RUFBNEUsaURBQVU7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxFQUFFLGdEQUFTO0FBQ1gsWUFBWSwwQkFBMEI7QUFDdEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0gsRUFBRSxnREFBUztBQUNYO0FBQ0EsR0FBRztBQUNILEVBQUUsb0RBQWE7QUFDZjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxVQUFVLDhCQUE4QixFQUFFLGlEQUFVO0FBQ3BELGtCQUFrQixrREFBVztBQUM3QjtBQUNBLFVBQVUsS0FBMEQ7QUFDcEU7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRTZOIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy9qb3RhaS9lc20vaW5kZXgubWpzPzBhNmEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlU3RhdGUsIHVzZUVmZmVjdCwgdXNlUmVmLCBjcmVhdGVFbGVtZW50LCB1c2VDb250ZXh0LCB1c2VSZWR1Y2VyLCB1c2VEZWJ1Z1ZhbHVlLCB1c2VDYWxsYmFjayB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IGF0b20gYXMgYXRvbSQxIH0gZnJvbSAnam90YWkvdmFuaWxsYSc7XG5cbmNvbnN0IFNVU1BFTlNFX1BST01JU0UgPSBTeW1ib2woKTtcbmNvbnN0IGlzU3VzcGVuc2VQcm9taXNlID0gKHByb21pc2UpID0+ICEhcHJvbWlzZVtTVVNQRU5TRV9QUk9NSVNFXTtcbmNvbnN0IGlzU3VzcGVuc2VQcm9taXNlQWxyZWFkeUNhbmNlbGxlZCA9IChzdXNwZW5zZVByb21pc2UpID0+ICFzdXNwZW5zZVByb21pc2VbU1VTUEVOU0VfUFJPTUlTRV0uYztcbmNvbnN0IGNhbmNlbFN1c3BlbnNlUHJvbWlzZSA9IChzdXNwZW5zZVByb21pc2UpID0+IHtcbiAgdmFyIF9hO1xuICBjb25zdCB7IGI6IGJhc2VQcm9taXNlLCBjOiBjYW5jZWxQcm9taXNlIH0gPSBzdXNwZW5zZVByb21pc2VbU1VTUEVOU0VfUFJPTUlTRV07XG4gIGlmIChjYW5jZWxQcm9taXNlKSB7XG4gICAgY2FuY2VsUHJvbWlzZSgpO1xuICAgIChfYSA9IHByb21pc2VBYm9ydE1hcC5nZXQoYmFzZVByb21pc2UpKSA9PSBudWxsID8gdm9pZCAwIDogX2EoKTtcbiAgfVxufTtcbmNvbnN0IGlzRXF1YWxTdXNwZW5zZVByb21pc2UgPSAob2xkU3VzcGVuc2VQcm9taXNlLCBuZXdTdXNwZW5zZVByb21pc2UpID0+IHtcbiAgY29uc3Qgb2xkT3JpZ2luYWxQcm9taXNlID0gb2xkU3VzcGVuc2VQcm9taXNlW1NVU1BFTlNFX1BST01JU0VdLm87XG4gIGNvbnN0IG5ld09yaWdpbmFsUHJvbWlzZSA9IG5ld1N1c3BlbnNlUHJvbWlzZVtTVVNQRU5TRV9QUk9NSVNFXS5vO1xuICByZXR1cm4gb2xkT3JpZ2luYWxQcm9taXNlID09PSBuZXdPcmlnaW5hbFByb21pc2UgfHwgb2xkU3VzcGVuc2VQcm9taXNlID09PSBuZXdPcmlnaW5hbFByb21pc2UgfHwgaXNTdXNwZW5zZVByb21pc2Uob2xkT3JpZ2luYWxQcm9taXNlKSAmJiBpc0VxdWFsU3VzcGVuc2VQcm9taXNlKG9sZE9yaWdpbmFsUHJvbWlzZSwgbmV3U3VzcGVuc2VQcm9taXNlKTtcbn07XG5jb25zdCBjcmVhdGVTdXNwZW5zZVByb21pc2UgPSAoYmFzZVByb21pc2UsIHByb21pc2UpID0+IHtcbiAgY29uc3Qgc3VzcGVuc2VQcm9taXNlRXh0cmEgPSB7XG4gICAgYjogYmFzZVByb21pc2UsXG4gICAgbzogcHJvbWlzZSxcbiAgICBjOiBudWxsXG4gIH07XG4gIGNvbnN0IHN1c3BlbnNlUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgc3VzcGVuc2VQcm9taXNlRXh0cmEuYyA9ICgpID0+IHtcbiAgICAgIHN1c3BlbnNlUHJvbWlzZUV4dHJhLmMgPSBudWxsO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH07XG4gICAgcHJvbWlzZS5maW5hbGx5KHN1c3BlbnNlUHJvbWlzZUV4dHJhLmMpO1xuICB9KTtcbiAgc3VzcGVuc2VQcm9taXNlW1NVU1BFTlNFX1BST01JU0VdID0gc3VzcGVuc2VQcm9taXNlRXh0cmE7XG4gIHJldHVybiBzdXNwZW5zZVByb21pc2U7XG59O1xuY29uc3QgY29weVN1c3BlbnNlUHJvbWlzZSA9IChzdXNwZW5zZVByb21pc2UpID0+IGNyZWF0ZVN1c3BlbnNlUHJvbWlzZShcbiAgc3VzcGVuc2VQcm9taXNlW1NVU1BFTlNFX1BST01JU0VdLmIsXG4gIHN1c3BlbnNlUHJvbWlzZVtTVVNQRU5TRV9QUk9NSVNFXS5vXG4pO1xuY29uc3QgcHJvbWlzZUFib3J0TWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG5jb25zdCByZWdpc3RlclByb21pc2VBYm9ydCA9IChiYXNlUHJvbWlzZSwgYWJvcnQpID0+IHtcbiAgcHJvbWlzZUFib3J0TWFwLnNldChiYXNlUHJvbWlzZSwgYWJvcnQpO1xufTtcblxuY29uc3QgaGFzSW5pdGlhbFZhbHVlID0gKGF0b20pID0+IFwiaW5pdFwiIGluIGF0b207XG5jb25zdCBSRUFEX0FUT00gPSBcInJcIjtcbmNvbnN0IFdSSVRFX0FUT00gPSBcIndcIjtcbmNvbnN0IENPTU1JVF9BVE9NID0gXCJjXCI7XG5jb25zdCBTVUJTQ1JJQkVfQVRPTSA9IFwic1wiO1xuY29uc3QgUkVTVE9SRV9BVE9NUyA9IFwiaFwiO1xuY29uc3QgREVWX1NVQlNDUklCRV9TVEFURSA9IFwiblwiO1xuY29uc3QgREVWX0dFVF9NT1VOVEVEX0FUT01TID0gXCJsXCI7XG5jb25zdCBERVZfR0VUX0FUT01fU1RBVEUgPSBcImFcIjtcbmNvbnN0IERFVl9HRVRfTU9VTlRFRCA9IFwibVwiO1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoaW5pdGlhbFZhbHVlcykgPT4ge1xuICBjb25zdCBjb21taXR0ZWRBdG9tU3RhdGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgbW91bnRlZE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuICBjb25zdCBwZW5kaW5nTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgbGV0IHN0YXRlTGlzdGVuZXJzO1xuICBsZXQgbW91bnRlZEF0b21zO1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgc3RhdGVMaXN0ZW5lcnMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIG1vdW50ZWRBdG9tcyA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgU2V0KCk7XG4gIH1cbiAgaWYgKGluaXRpYWxWYWx1ZXMpIHtcbiAgICBmb3IgKGNvbnN0IFthdG9tLCB2YWx1ZV0gb2YgaW5pdGlhbFZhbHVlcykge1xuICAgICAgY29uc3QgYXRvbVN0YXRlID0ge1xuICAgICAgICB2OiB2YWx1ZSxcbiAgICAgICAgcjogMCxcbiAgICAgICAgeTogdHJ1ZSxcbiAgICAgICAgLy8gbm90IGludmFsaWRhdGVkXG4gICAgICAgIGQ6IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKClcbiAgICAgIH07XG4gICAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIE9iamVjdC5mcmVlemUoYXRvbVN0YXRlKTtcbiAgICAgICAgaWYgKCFoYXNJbml0aWFsVmFsdWUoYXRvbSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIkZvdW5kIGluaXRpYWwgdmFsdWUgZm9yIGRlcml2ZWQgYXRvbSB3aGljaCBjYW4gY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvclwiLFxuICAgICAgICAgICAgYXRvbVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbW1pdHRlZEF0b21TdGF0ZU1hcC5zZXQoYXRvbSwgYXRvbVN0YXRlKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYWRkU3VzcGVuc2VQcm9taXNlVG9DYWNoZSA9ICh2ZXJzaW9uLCBhdG9tLCBzdXNwZW5zZVByb21pc2UpID0+IHtcbiAgICBsZXQgY2FjaGUgPSBzdXNwZW5zZVByb21pc2VDYWNoZU1hcC5nZXQoYXRvbSk7XG4gICAgaWYgKCFjYWNoZSkge1xuICAgICAgY2FjaGUgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpO1xuICAgICAgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuc2V0KGF0b20sIGNhY2hlKTtcbiAgICB9XG4gICAgc3VzcGVuc2VQcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgaWYgKGNhY2hlLmdldCh2ZXJzaW9uKSA9PT0gc3VzcGVuc2VQcm9taXNlKSB7XG4gICAgICAgIGNhY2hlLmRlbGV0ZSh2ZXJzaW9uKTtcbiAgICAgICAgaWYgKCFjYWNoZS5zaXplKSB7XG4gICAgICAgICAgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuZGVsZXRlKGF0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgY2FjaGUuc2V0KHZlcnNpb24sIHN1c3BlbnNlUHJvbWlzZSk7XG4gIH07XG4gIGNvbnN0IGNhbmNlbEFsbFN1c3BlbnNlUHJvbWlzZUluQ2FjaGUgPSAoYXRvbSkgPT4ge1xuICAgIGNvbnN0IHZlcnNpb25TZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGNvbnN0IGNhY2hlID0gc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuZ2V0KGF0b20pO1xuICAgIGlmIChjYWNoZSkge1xuICAgICAgc3VzcGVuc2VQcm9taXNlQ2FjaGVNYXAuZGVsZXRlKGF0b20pO1xuICAgICAgY2FjaGUuZm9yRWFjaCgoc3VzcGVuc2VQcm9taXNlLCB2ZXJzaW9uKSA9PiB7XG4gICAgICAgIGNhbmNlbFN1c3BlbnNlUHJvbWlzZShzdXNwZW5zZVByb21pc2UpO1xuICAgICAgICB2ZXJzaW9uU2V0LmFkZCh2ZXJzaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdmVyc2lvblNldDtcbiAgfTtcbiAgY29uc3QgdmVyc2lvbmVkQXRvbVN0YXRlTWFwTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGdldFZlcnNpb25lZEF0b21TdGF0ZU1hcCA9ICh2ZXJzaW9uKSA9PiB7XG4gICAgbGV0IHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IHZlcnNpb25lZEF0b21TdGF0ZU1hcE1hcC5nZXQodmVyc2lvbik7XG4gICAgaWYgKCF2ZXJzaW9uZWRBdG9tU3RhdGVNYXApIHtcbiAgICAgIHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gICAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXBNYXAuc2V0KHZlcnNpb24sIHZlcnNpb25lZEF0b21TdGF0ZU1hcCk7XG4gICAgfVxuICAgIHJldHVybiB2ZXJzaW9uZWRBdG9tU3RhdGVNYXA7XG4gIH07XG4gIGNvbnN0IGdldEF0b21TdGF0ZSA9ICh2ZXJzaW9uLCBhdG9tKSA9PiB7XG4gICAgaWYgKHZlcnNpb24pIHtcbiAgICAgIGNvbnN0IHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IGdldFZlcnNpb25lZEF0b21TdGF0ZU1hcCh2ZXJzaW9uKTtcbiAgICAgIGxldCBhdG9tU3RhdGUgPSB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuZ2V0KGF0b20pO1xuICAgICAgaWYgKCFhdG9tU3RhdGUpIHtcbiAgICAgICAgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24ucCwgYXRvbSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUgJiYgXCJwXCIgaW4gYXRvbVN0YXRlICYmIGlzU3VzcGVuc2VQcm9taXNlQWxyZWFkeUNhbmNlbGxlZChhdG9tU3RhdGUucCkpIHtcbiAgICAgICAgICBhdG9tU3RhdGUgPSB2b2lkIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGF0b21TdGF0ZSkge1xuICAgICAgICAgIHZlcnNpb25lZEF0b21TdGF0ZU1hcC5zZXQoYXRvbSwgYXRvbVN0YXRlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1pdHRlZEF0b21TdGF0ZU1hcC5nZXQoYXRvbSk7XG4gIH07XG4gIGNvbnN0IHNldEF0b21TdGF0ZSA9ICh2ZXJzaW9uLCBhdG9tLCBhdG9tU3RhdGUpID0+IHtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBPYmplY3QuZnJlZXplKGF0b21TdGF0ZSk7XG4gICAgfVxuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAgPSBnZXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAodmVyc2lvbik7XG4gICAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuc2V0KGF0b20sIGF0b21TdGF0ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBjb21taXR0ZWRBdG9tU3RhdGVNYXAuZ2V0KGF0b20pO1xuICAgICAgY29tbWl0dGVkQXRvbVN0YXRlTWFwLnNldChhdG9tLCBhdG9tU3RhdGUpO1xuICAgICAgaWYgKCFwZW5kaW5nTWFwLmhhcyhhdG9tKSkge1xuICAgICAgICBwZW5kaW5nTWFwLnNldChhdG9tLCBwcmV2QXRvbVN0YXRlKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGNyZWF0ZVJlYWREZXBlbmRlbmNpZXMgPSAodmVyc2lvbiwgcHJldlJlYWREZXBlbmRlbmNpZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICBpZiAoIWRlcGVuZGVuY2llcykge1xuICAgICAgcmV0dXJuIHByZXZSZWFkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICBjb25zdCByZWFkRGVwZW5kZW5jaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGRlcGVuZGVuY2llcy5mb3JFYWNoKChhdG9tKSA9PiB7XG4gICAgICB2YXIgX2E7XG4gICAgICBjb25zdCByZXZpc2lvbiA9ICgoX2EgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSkpID09IG51bGwgPyB2b2lkIDAgOiBfYS5yKSB8fCAwO1xuICAgICAgcmVhZERlcGVuZGVuY2llcy5zZXQoYXRvbSwgcmV2aXNpb24pO1xuICAgICAgaWYgKHByZXZSZWFkRGVwZW5kZW5jaWVzLmdldChhdG9tKSAhPT0gcmV2aXNpb24pIHtcbiAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKHByZXZSZWFkRGVwZW5kZW5jaWVzLnNpemUgPT09IHJlYWREZXBlbmRlbmNpZXMuc2l6ZSAmJiAhY2hhbmdlZCkge1xuICAgICAgcmV0dXJuIHByZXZSZWFkRGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgICByZXR1cm4gcmVhZERlcGVuZGVuY2llcztcbiAgfTtcbiAgY29uc3Qgc2V0QXRvbVZhbHVlID0gKHZlcnNpb24sIGF0b20sIHZhbHVlLCBkZXBlbmRlbmNpZXMsIHN1c3BlbnNlUHJvbWlzZSkgPT4ge1xuICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZSh2ZXJzaW9uLCBhdG9tKTtcbiAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICBpZiAoc3VzcGVuc2VQcm9taXNlICYmICghKFwicFwiIGluIGF0b21TdGF0ZSkgfHwgIWlzRXF1YWxTdXNwZW5zZVByb21pc2UoYXRvbVN0YXRlLnAsIHN1c3BlbnNlUHJvbWlzZSkpKSB7XG4gICAgICAgIHJldHVybiBhdG9tU3RhdGU7XG4gICAgICB9XG4gICAgICBpZiAoXCJwXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgICAgIGNhbmNlbFN1c3BlbnNlUHJvbWlzZShhdG9tU3RhdGUucCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICB2OiB2YWx1ZSxcbiAgICAgIHI6IChhdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGF0b21TdGF0ZS5yKSB8fCAwLFxuICAgICAgeTogdHJ1ZSxcbiAgICAgIC8vIG5vdCBpbnZhbGlkYXRlZFxuICAgICAgZDogY3JlYXRlUmVhZERlcGVuZGVuY2llcyh2ZXJzaW9uLCBhdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGF0b21TdGF0ZS5kLCBkZXBlbmRlbmNpZXMpXG4gICAgfTtcbiAgICBsZXQgY2hhbmdlZCA9ICEoYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUueSk7XG4gICAgaWYgKCFhdG9tU3RhdGUgfHwgIShcInZcIiBpbiBhdG9tU3RhdGUpIHx8IC8vIG5ldyB2YWx1ZSwgb3JcbiAgICAhT2JqZWN0LmlzKGF0b21TdGF0ZS52LCB2YWx1ZSkpIHtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgKytuZXh0QXRvbVN0YXRlLnI7XG4gICAgICBpZiAobmV4dEF0b21TdGF0ZS5kLmhhcyhhdG9tKSkge1xuICAgICAgICBuZXh0QXRvbVN0YXRlLmQgPSBuZXcgTWFwKG5leHRBdG9tU3RhdGUuZCkuc2V0KGF0b20sIG5leHRBdG9tU3RhdGUucik7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChuZXh0QXRvbVN0YXRlLmQgIT09IGF0b21TdGF0ZS5kICYmIChuZXh0QXRvbVN0YXRlLmQuc2l6ZSAhPT0gYXRvbVN0YXRlLmQuc2l6ZSB8fCAhQXJyYXkuZnJvbShuZXh0QXRvbVN0YXRlLmQua2V5cygpKS5ldmVyeSgoYSkgPT4gYXRvbVN0YXRlLmQuaGFzKGEpKSkpIHtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB7XG4gICAgICAgIGZsdXNoUGVuZGluZyh2ZXJzaW9uKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYXRvbVN0YXRlICYmICFjaGFuZ2VkKSB7XG4gICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgIH1cbiAgICBzZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSwgbmV4dEF0b21TdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRBdG9tU3RhdGU7XG4gIH07XG4gIGNvbnN0IHNldEF0b21SZWFkRXJyb3IgPSAodmVyc2lvbiwgYXRvbSwgZXJyb3IsIGRlcGVuZGVuY2llcywgc3VzcGVuc2VQcm9taXNlKSA9PiB7XG4gICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20pO1xuICAgIGlmIChhdG9tU3RhdGUpIHtcbiAgICAgIGlmIChzdXNwZW5zZVByb21pc2UgJiYgKCEoXCJwXCIgaW4gYXRvbVN0YXRlKSB8fCAhaXNFcXVhbFN1c3BlbnNlUHJvbWlzZShhdG9tU3RhdGUucCwgc3VzcGVuc2VQcm9taXNlKSkpIHtcbiAgICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICAgIH1cbiAgICAgIGlmIChcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgICAgY2FuY2VsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgbmV4dEF0b21TdGF0ZSA9IHtcbiAgICAgIGU6IGVycm9yLFxuICAgICAgLy8gc2V0IHJlYWQgZXJyb3JcbiAgICAgIHI6ICgoYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUucikgfHwgMCkgKyAxLFxuICAgICAgeTogdHJ1ZSxcbiAgICAgIC8vIG5vdCBpbnZhbGlkYXRlZFxuICAgICAgZDogY3JlYXRlUmVhZERlcGVuZGVuY2llcyh2ZXJzaW9uLCBhdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IGF0b21TdGF0ZS5kLCBkZXBlbmRlbmNpZXMpXG4gICAgfTtcbiAgICBzZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSwgbmV4dEF0b21TdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRBdG9tU3RhdGU7XG4gIH07XG4gIGNvbnN0IHNldEF0b21TdXNwZW5zZVByb21pc2UgPSAodmVyc2lvbiwgYXRvbSwgc3VzcGVuc2VQcm9taXNlLCBkZXBlbmRlbmNpZXMpID0+IHtcbiAgICBjb25zdCBhdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSk7XG4gICAgaWYgKGF0b21TdGF0ZSAmJiBcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIGlmIChpc0VxdWFsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wLCBzdXNwZW5zZVByb21pc2UpICYmICFpc1N1c3BlbnNlUHJvbWlzZUFscmVhZHlDYW5jZWxsZWQoYXRvbVN0YXRlLnApKSB7XG4gICAgICAgIGlmICghYXRvbVN0YXRlLnkpIHtcbiAgICAgICAgICByZXR1cm4geyAuLi5hdG9tU3RhdGUsIHk6IHRydWUgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgICAgfVxuICAgICAgY2FuY2VsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wKTtcbiAgICB9XG4gICAgYWRkU3VzcGVuc2VQcm9taXNlVG9DYWNoZSh2ZXJzaW9uLCBhdG9tLCBzdXNwZW5zZVByb21pc2UpO1xuICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICBwOiBzdXNwZW5zZVByb21pc2UsXG4gICAgICByOiAoKGF0b21TdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogYXRvbVN0YXRlLnIpIHx8IDApICsgMSxcbiAgICAgIHk6IHRydWUsXG4gICAgICAvLyBub3QgaW52YWxpZGF0ZWRcbiAgICAgIGQ6IGNyZWF0ZVJlYWREZXBlbmRlbmNpZXModmVyc2lvbiwgYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUuZCwgZGVwZW5kZW5jaWVzKVxuICAgIH07XG4gICAgc2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20sIG5leHRBdG9tU3RhdGUpO1xuICAgIHJldHVybiBuZXh0QXRvbVN0YXRlO1xuICB9O1xuICBjb25zdCBzZXRBdG9tUHJvbWlzZU9yVmFsdWUgPSAodmVyc2lvbiwgYXRvbSwgcHJvbWlzZU9yVmFsdWUsIGRlcGVuZGVuY2llcykgPT4ge1xuICAgIGlmIChwcm9taXNlT3JWYWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGNvbnN0IHN1c3BlbnNlUHJvbWlzZSA9IGNyZWF0ZVN1c3BlbnNlUHJvbWlzZShcbiAgICAgICAgcHJvbWlzZU9yVmFsdWUsXG4gICAgICAgIHByb21pc2VPclZhbHVlLnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgc2V0QXRvbVZhbHVlKHZlcnNpb24sIGF0b20sIHZhbHVlLCBkZXBlbmRlbmNpZXMsIHN1c3BlbnNlUHJvbWlzZSk7XG4gICAgICAgIH0pLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICBpZiAoaXNTdXNwZW5zZVByb21pc2UoZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCBhdG9tLCB0cnVlKTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0QXRvbVJlYWRFcnJvcih2ZXJzaW9uLCBhdG9tLCBlLCBkZXBlbmRlbmNpZXMsIHN1c3BlbnNlUHJvbWlzZSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgICAgcmV0dXJuIHNldEF0b21TdXNwZW5zZVByb21pc2UoXG4gICAgICAgIHZlcnNpb24sXG4gICAgICAgIGF0b20sXG4gICAgICAgIHN1c3BlbnNlUHJvbWlzZSxcbiAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gc2V0QXRvbVZhbHVlKFxuICAgICAgdmVyc2lvbixcbiAgICAgIGF0b20sXG4gICAgICBwcm9taXNlT3JWYWx1ZSxcbiAgICAgIGRlcGVuZGVuY2llc1xuICAgICk7XG4gIH07XG4gIGNvbnN0IHNldEF0b21JbnZhbGlkYXRlZCA9ICh2ZXJzaW9uLCBhdG9tKSA9PiB7XG4gICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20pO1xuICAgIGlmIChhdG9tU3RhdGUpIHtcbiAgICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICAgIC4uLmF0b21TdGF0ZSxcbiAgICAgICAgLy8gY29weSBldmVyeXRoaW5nXG4gICAgICAgIHk6IGZhbHNlXG4gICAgICAgIC8vIGludmFsaWRhdGVkXG4gICAgICB9O1xuICAgICAgc2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20sIG5leHRBdG9tU3RhdGUpO1xuICAgIH0gZWxzZSBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbQnVnXSBjb3VsZCBub3QgaW52YWxpZGF0ZSBub24gZXhpc3RpbmcgYXRvbVwiLCBhdG9tKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUgPSAodmVyc2lvbiwgYXRvbSwgZm9yY2UpID0+IHtcbiAgICBpZiAoIWZvcmNlKSB7XG4gICAgICBjb25zdCBhdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYXRvbSk7XG4gICAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICAgIGlmIChhdG9tU3RhdGUueSAmJiAvLyBub3QgaW52YWxpZGF0ZWRcbiAgICAgICAgXCJwXCIgaW4gYXRvbVN0YXRlICYmICFpc1N1c3BlbnNlUHJvbWlzZUFscmVhZHlDYW5jZWxsZWQoYXRvbVN0YXRlLnApKSB7XG4gICAgICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgICBhdG9tU3RhdGUuZC5mb3JFYWNoKChfLCBhKSA9PiB7XG4gICAgICAgICAgaWYgKGEgIT09IGF0b20pIHtcbiAgICAgICAgICAgIGlmICghbW91bnRlZE1hcC5oYXMoYSkpIHtcbiAgICAgICAgICAgICAgcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCBhKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFTdGF0ZSA9IGdldEF0b21TdGF0ZSh2ZXJzaW9uLCBhKTtcbiAgICAgICAgICAgICAgaWYgKGFTdGF0ZSAmJiAhYVN0YXRlLnkpIHtcbiAgICAgICAgICAgICAgICByZWFkQXRvbVN0YXRlKHZlcnNpb24sIGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKEFycmF5LmZyb20oYXRvbVN0YXRlLmQpLmV2ZXJ5KChbYSwgcl0pID0+IHtcbiAgICAgICAgICBjb25zdCBhU3RhdGUgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYSk7XG4gICAgICAgICAgcmV0dXJuIGFTdGF0ZSAmJiAhKFwicFwiIGluIGFTdGF0ZSkgJiYgLy8gaGFzIG5vIHN1c3BlbnNlIHByb21pc2VcbiAgICAgICAgICBhU3RhdGUuciA9PT0gcjtcbiAgICAgICAgfSkpIHtcbiAgICAgICAgICBpZiAoIWF0b21TdGF0ZS55KSB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5hdG9tU3RhdGUsIHk6IHRydWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZXBlbmRlbmNpZXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwcm9taXNlT3JWYWx1ZSA9IGF0b20ucmVhZCgoYSkgPT4ge1xuICAgICAgICBkZXBlbmRlbmNpZXMuYWRkKGEpO1xuICAgICAgICBjb25zdCBhU3RhdGUgPSBhID09PSBhdG9tID8gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGEpIDogcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCBhKTtcbiAgICAgICAgaWYgKGFTdGF0ZSkge1xuICAgICAgICAgIGlmIChcImVcIiBpbiBhU3RhdGUpIHtcbiAgICAgICAgICAgIHRocm93IGFTdGF0ZS5lO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXCJwXCIgaW4gYVN0YXRlKSB7XG4gICAgICAgICAgICB0aHJvdyBhU3RhdGUucDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGFTdGF0ZS52O1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJbml0aWFsVmFsdWUoYSkpIHtcbiAgICAgICAgICByZXR1cm4gYS5pbml0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGF0b20gaW5pdFwiKTtcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNldEF0b21Qcm9taXNlT3JWYWx1ZSh2ZXJzaW9uLCBhdG9tLCBwcm9taXNlT3JWYWx1ZSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9IGNhdGNoIChlcnJvck9yUHJvbWlzZSkge1xuICAgICAgaWYgKGVycm9yT3JQcm9taXNlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICBjb25zdCBzdXNwZW5zZVByb21pc2UgPSBpc1N1c3BlbnNlUHJvbWlzZShlcnJvck9yUHJvbWlzZSkgJiYgaXNTdXNwZW5zZVByb21pc2VBbHJlYWR5Q2FuY2VsbGVkKGVycm9yT3JQcm9taXNlKSA/IGNvcHlTdXNwZW5zZVByb21pc2UoZXJyb3JPclByb21pc2UpIDogY3JlYXRlU3VzcGVuc2VQcm9taXNlKGVycm9yT3JQcm9taXNlLCBlcnJvck9yUHJvbWlzZSk7XG4gICAgICAgIHJldHVybiBzZXRBdG9tU3VzcGVuc2VQcm9taXNlKFxuICAgICAgICAgIHZlcnNpb24sXG4gICAgICAgICAgYXRvbSxcbiAgICAgICAgICBzdXNwZW5zZVByb21pc2UsXG4gICAgICAgICAgZGVwZW5kZW5jaWVzXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0QXRvbVJlYWRFcnJvcih2ZXJzaW9uLCBhdG9tLCBlcnJvck9yUHJvbWlzZSwgZGVwZW5kZW5jaWVzKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tID0gKHJlYWRpbmdBdG9tLCB2ZXJzaW9uKSA9PiB7XG4gICAgY29uc3QgYXRvbVN0YXRlID0gcmVhZEF0b21TdGF0ZSh2ZXJzaW9uLCByZWFkaW5nQXRvbSk7XG4gICAgcmV0dXJuIGF0b21TdGF0ZTtcbiAgfTtcbiAgY29uc3QgYWRkQXRvbSA9ICh2ZXJzaW9uLCBhZGRpbmdBdG9tKSA9PiB7XG4gICAgbGV0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhZGRpbmdBdG9tKTtcbiAgICBpZiAoIW1vdW50ZWQpIHtcbiAgICAgIG1vdW50ZWQgPSBtb3VudEF0b20odmVyc2lvbiwgYWRkaW5nQXRvbSk7XG4gICAgfVxuICAgIHJldHVybiBtb3VudGVkO1xuICB9O1xuICBjb25zdCBjYW5Vbm1vdW50QXRvbSA9IChhdG9tLCBtb3VudGVkKSA9PiAhbW91bnRlZC5sLnNpemUgJiYgKCFtb3VudGVkLnQuc2l6ZSB8fCBtb3VudGVkLnQuc2l6ZSA9PT0gMSAmJiBtb3VudGVkLnQuaGFzKGF0b20pKTtcbiAgY29uc3QgZGVsQXRvbSA9ICh2ZXJzaW9uLCBkZWxldGluZ0F0b20pID0+IHtcbiAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoZGVsZXRpbmdBdG9tKTtcbiAgICBpZiAobW91bnRlZCAmJiBjYW5Vbm1vdW50QXRvbShkZWxldGluZ0F0b20sIG1vdW50ZWQpKSB7XG4gICAgICB1bm1vdW50QXRvbSh2ZXJzaW9uLCBkZWxldGluZ0F0b20pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgaW52YWxpZGF0ZURlcGVuZGVudHMgPSAodmVyc2lvbiwgYXRvbSkgPT4ge1xuICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLnQuZm9yRWFjaCgoZGVwZW5kZW50KSA9PiB7XG4gICAgICBpZiAoZGVwZW5kZW50ICE9PSBhdG9tKSB7XG4gICAgICAgIHNldEF0b21JbnZhbGlkYXRlZCh2ZXJzaW9uLCBkZXBlbmRlbnQpO1xuICAgICAgICBpbnZhbGlkYXRlRGVwZW5kZW50cyh2ZXJzaW9uLCBkZXBlbmRlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCB3cml0ZUF0b21TdGF0ZSA9ICh2ZXJzaW9uLCBhdG9tLCB1cGRhdGUpID0+IHtcbiAgICBsZXQgaXNTeW5jID0gdHJ1ZTtcbiAgICBjb25zdCB3cml0ZUdldHRlciA9IChhLCBvcHRpb25zKSA9PiB7XG4gICAgICBjb25zdCBhU3RhdGUgPSByZWFkQXRvbVN0YXRlKHZlcnNpb24sIGEpO1xuICAgICAgaWYgKFwiZVwiIGluIGFTdGF0ZSkge1xuICAgICAgICB0aHJvdyBhU3RhdGUuZTtcbiAgICAgIH1cbiAgICAgIGlmIChcInBcIiBpbiBhU3RhdGUpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCA/IHZvaWQgMCA6IG9wdGlvbnMudW5zdGFibGVfcHJvbWlzZSkge1xuICAgICAgICAgIHJldHVybiBhU3RhdGUucC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHMgPSBnZXRBdG9tU3RhdGUodmVyc2lvbiwgYSk7XG4gICAgICAgICAgICBpZiAocyAmJiBcInBcIiBpbiBzICYmIHMucCA9PT0gYVN0YXRlLnApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUpKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHdyaXRlR2V0dGVyKGEsIG9wdGlvbnMpXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd3JpdGVHZXR0ZXIoYSwgb3B0aW9ucyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhcbiAgICAgICAgICAgIFwiUmVhZGluZyBwZW5kaW5nIGF0b20gc3RhdGUgaW4gd3JpdGUgb3BlcmF0aW9uLiBXZSB0aHJvdyBhIHByb21pc2UgZm9yIG5vdy5cIixcbiAgICAgICAgICAgIGFcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGFTdGF0ZS5wO1xuICAgICAgfVxuICAgICAgaWYgKFwidlwiIGluIGFTdGF0ZSkge1xuICAgICAgICByZXR1cm4gYVN0YXRlLnY7XG4gICAgICB9XG4gICAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIltCdWddIG5vIHZhbHVlIGZvdW5kIHdoaWxlIHJlYWRpbmcgYXRvbSBpbiB3cml0ZSBvcGVyYXRpb24uIFRoaXMgaXMgcHJvYmFibHkgYSBidWcuXCIsXG4gICAgICAgICAgYVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm8gdmFsdWUgZm91bmRcIik7XG4gICAgfTtcbiAgICBjb25zdCBzZXR0ZXIgPSAoYSwgdikgPT4ge1xuICAgICAgbGV0IHByb21pc2VPclZvaWQyO1xuICAgICAgaWYgKGEgPT09IGF0b20pIHtcbiAgICAgICAgaWYgKCFoYXNJbml0aWFsVmFsdWUoYSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJhdG9tIG5vdCB3cml0YWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2ZXJzaW9uU2V0ID0gY2FuY2VsQWxsU3VzcGVuc2VQcm9taXNlSW5DYWNoZShhKTtcbiAgICAgICAgdmVyc2lvblNldC5mb3JFYWNoKChjYW5jZWxsZWRWZXJzaW9uKSA9PiB7XG4gICAgICAgICAgaWYgKGNhbmNlbGxlZFZlcnNpb24gIT09IHZlcnNpb24pIHtcbiAgICAgICAgICAgIHNldEF0b21Qcm9taXNlT3JWYWx1ZShjYW5jZWxsZWRWZXJzaW9uLCBhLCB2KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGEpO1xuICAgICAgICBjb25zdCBuZXh0QXRvbVN0YXRlID0gc2V0QXRvbVByb21pc2VPclZhbHVlKHZlcnNpb24sIGEsIHYpO1xuICAgICAgICBpZiAocHJldkF0b21TdGF0ZSAhPT0gbmV4dEF0b21TdGF0ZSkge1xuICAgICAgICAgIGludmFsaWRhdGVEZXBlbmRlbnRzKHZlcnNpb24sIGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9taXNlT3JWb2lkMiA9IHdyaXRlQXRvbVN0YXRlKHZlcnNpb24sIGEsIHYpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1N5bmMpIHtcbiAgICAgICAgZmx1c2hQZW5kaW5nKHZlcnNpb24pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHByb21pc2VPclZvaWQyO1xuICAgIH07XG4gICAgY29uc3QgcHJvbWlzZU9yVm9pZCA9IGF0b20ud3JpdGUod3JpdGVHZXR0ZXIsIHNldHRlciwgdXBkYXRlKTtcbiAgICBpc1N5bmMgPSBmYWxzZTtcbiAgICByZXR1cm4gcHJvbWlzZU9yVm9pZDtcbiAgfTtcbiAgY29uc3Qgd3JpdGVBdG9tID0gKHdyaXRpbmdBdG9tLCB1cGRhdGUsIHZlcnNpb24pID0+IHtcbiAgICBjb25zdCBwcm9taXNlT3JWb2lkID0gd3JpdGVBdG9tU3RhdGUodmVyc2lvbiwgd3JpdGluZ0F0b20sIHVwZGF0ZSk7XG4gICAgZmx1c2hQZW5kaW5nKHZlcnNpb24pO1xuICAgIHJldHVybiBwcm9taXNlT3JWb2lkO1xuICB9O1xuICBjb25zdCBpc0FjdHVhbGx5V3JpdGFibGVBdG9tID0gKGF0b20pID0+ICEhYXRvbS53cml0ZTtcbiAgY29uc3QgbW91bnRBdG9tID0gKHZlcnNpb24sIGF0b20sIGluaXRpYWxEZXBlbmRlbnQpID0+IHtcbiAgICBjb25zdCBtb3VudGVkID0ge1xuICAgICAgdDogbmV3IFNldChpbml0aWFsRGVwZW5kZW50ICYmIFtpbml0aWFsRGVwZW5kZW50XSksXG4gICAgICBsOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gICAgfTtcbiAgICBtb3VudGVkTWFwLnNldChhdG9tLCBtb3VudGVkKTtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBtb3VudGVkQXRvbXMuYWRkKGF0b20pO1xuICAgIH1cbiAgICBjb25zdCBhdG9tU3RhdGUgPSByZWFkQXRvbVN0YXRlKHZvaWQgMCwgYXRvbSk7XG4gICAgYXRvbVN0YXRlLmQuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgY29uc3QgYU1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhKTtcbiAgICAgIGlmIChhTW91bnRlZCkge1xuICAgICAgICBhTW91bnRlZC50LmFkZChhdG9tKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhICE9PSBhdG9tKSB7XG4gICAgICAgICAgbW91bnRBdG9tKHZlcnNpb24sIGEsIGF0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlzQWN0dWFsbHlXcml0YWJsZUF0b20oYXRvbSkgJiYgYXRvbS5vbk1vdW50KSB7XG4gICAgICBjb25zdCBzZXRBdG9tID0gKHVwZGF0ZSkgPT4gd3JpdGVBdG9tKGF0b20sIHVwZGF0ZSwgdmVyc2lvbik7XG4gICAgICBjb25zdCBvblVubW91bnQgPSBhdG9tLm9uTW91bnQoc2V0QXRvbSk7XG4gICAgICB2ZXJzaW9uID0gdm9pZCAwO1xuICAgICAgaWYgKG9uVW5tb3VudCkge1xuICAgICAgICBtb3VudGVkLnUgPSBvblVubW91bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb3VudGVkO1xuICB9O1xuICBjb25zdCB1bm1vdW50QXRvbSA9ICh2ZXJzaW9uLCBhdG9tKSA9PiB7XG4gICAgdmFyIF9hO1xuICAgIGNvbnN0IG9uVW5tb3VudCA9IChfYSA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pKSA9PSBudWxsID8gdm9pZCAwIDogX2EudTtcbiAgICBpZiAob25Vbm1vdW50KSB7XG4gICAgICBvblVubW91bnQoKTtcbiAgICB9XG4gICAgbW91bnRlZE1hcC5kZWxldGUoYXRvbSk7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgbW91bnRlZEF0b21zLmRlbGV0ZShhdG9tKTtcbiAgICB9XG4gICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZlcnNpb24sIGF0b20pO1xuICAgIGlmIChhdG9tU3RhdGUpIHtcbiAgICAgIGlmIChcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgICAgY2FuY2VsU3VzcGVuc2VQcm9taXNlKGF0b21TdGF0ZS5wKTtcbiAgICAgIH1cbiAgICAgIGF0b21TdGF0ZS5kLmZvckVhY2goKF8sIGEpID0+IHtcbiAgICAgICAgaWYgKGEgIT09IGF0b20pIHtcbiAgICAgICAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoYSk7XG4gICAgICAgICAgaWYgKG1vdW50ZWQpIHtcbiAgICAgICAgICAgIG1vdW50ZWQudC5kZWxldGUoYXRvbSk7XG4gICAgICAgICAgICBpZiAoY2FuVW5tb3VudEF0b20oYSwgbW91bnRlZCkpIHtcbiAgICAgICAgICAgICAgdW5tb3VudEF0b20odmVyc2lvbiwgYSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgY29uc29sZS53YXJuKFwiW0J1Z10gY291bGQgbm90IGZpbmQgYXRvbSBzdGF0ZSB0byB1bm1vdW50XCIsIGF0b20pO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbW91bnREZXBlbmRlbmNpZXMgPSAodmVyc2lvbiwgYXRvbSwgYXRvbVN0YXRlLCBwcmV2UmVhZERlcGVuZGVuY2llcykgPT4ge1xuICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IG5ldyBTZXQoYXRvbVN0YXRlLmQua2V5cygpKTtcbiAgICBwcmV2UmVhZERlcGVuZGVuY2llcyA9PSBudWxsID8gdm9pZCAwIDogcHJldlJlYWREZXBlbmRlbmNpZXMuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgaWYgKGRlcGVuZGVuY2llcy5oYXMoYSkpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLmRlbGV0ZShhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGEpO1xuICAgICAgaWYgKG1vdW50ZWQpIHtcbiAgICAgICAgbW91bnRlZC50LmRlbGV0ZShhdG9tKTtcbiAgICAgICAgaWYgKGNhblVubW91bnRBdG9tKGEsIG1vdW50ZWQpKSB7XG4gICAgICAgICAgdW5tb3VudEF0b20odmVyc2lvbiwgYSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBkZXBlbmRlbmNpZXMuZm9yRWFjaCgoYSkgPT4ge1xuICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGEpO1xuICAgICAgaWYgKG1vdW50ZWQpIHtcbiAgICAgICAgbW91bnRlZC50LmFkZChhdG9tKTtcbiAgICAgIH0gZWxzZSBpZiAobW91bnRlZE1hcC5oYXMoYXRvbSkpIHtcbiAgICAgICAgbW91bnRBdG9tKHZlcnNpb24sIGEsIGF0b20pO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBmbHVzaFBlbmRpbmcgPSAodmVyc2lvbikgPT4ge1xuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAgPSBnZXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAodmVyc2lvbik7XG4gICAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuZm9yRWFjaCgoYXRvbVN0YXRlLCBhdG9tKSA9PiB7XG4gICAgICAgIGNvbnN0IGNvbW1pdHRlZEF0b21TdGF0ZSA9IGNvbW1pdHRlZEF0b21TdGF0ZU1hcC5nZXQoYXRvbSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUgIT09IGNvbW1pdHRlZEF0b21TdGF0ZSkge1xuICAgICAgICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICAgICAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLmwuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKHZlcnNpb24pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHdoaWxlIChwZW5kaW5nTWFwLnNpemUpIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBBcnJheS5mcm9tKHBlbmRpbmdNYXApO1xuICAgICAgcGVuZGluZ01hcC5jbGVhcigpO1xuICAgICAgcGVuZGluZy5mb3JFYWNoKChbYXRvbSwgcHJldkF0b21TdGF0ZV0pID0+IHtcbiAgICAgICAgY29uc3QgYXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKHZvaWQgMCwgYXRvbSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUgJiYgYXRvbVN0YXRlLmQgIT09IChwcmV2QXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBwcmV2QXRvbVN0YXRlLmQpKSB7XG4gICAgICAgICAgbW91bnREZXBlbmRlbmNpZXModm9pZCAwLCBhdG9tLCBhdG9tU3RhdGUsIHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByZXZBdG9tU3RhdGUgJiYgIXByZXZBdG9tU3RhdGUueSAmJiAvLyBpbnZhbGlkYXRlZFxuICAgICAgICAoYXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBhdG9tU3RhdGUueSkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICAgICAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLmwuZm9yRWFjaCgobGlzdGVuZXIpID0+IGxpc3RlbmVyKCkpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHN0YXRlTGlzdGVuZXJzLmZvckVhY2goKGwpID0+IGwoKSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBjb21taXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAgPSAodmVyc2lvbikgPT4ge1xuICAgIGNvbnN0IHZlcnNpb25lZEF0b21TdGF0ZU1hcCA9IGdldFZlcnNpb25lZEF0b21TdGF0ZU1hcCh2ZXJzaW9uKTtcbiAgICB2ZXJzaW9uZWRBdG9tU3RhdGVNYXAuZm9yRWFjaCgoYXRvbVN0YXRlLCBhdG9tKSA9PiB7XG4gICAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gY29tbWl0dGVkQXRvbVN0YXRlTWFwLmdldChhdG9tKTtcbiAgICAgIGlmICghcHJldkF0b21TdGF0ZSB8fCBhdG9tU3RhdGUuciA+IHByZXZBdG9tU3RhdGUuciB8fCBhdG9tU3RhdGUueSAhPT0gcHJldkF0b21TdGF0ZS55IHx8IGF0b21TdGF0ZS5yID09PSBwcmV2QXRvbVN0YXRlLnIgJiYgYXRvbVN0YXRlLmQgIT09IHByZXZBdG9tU3RhdGUuZCkge1xuICAgICAgICBjb21taXR0ZWRBdG9tU3RhdGVNYXAuc2V0KGF0b20sIGF0b21TdGF0ZSk7XG4gICAgICAgIGlmIChhdG9tU3RhdGUuZCAhPT0gKHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCkpIHtcbiAgICAgICAgICBtb3VudERlcGVuZGVuY2llcyh2ZXJzaW9uLCBhdG9tLCBhdG9tU3RhdGUsIHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgY29uc3QgY29tbWl0QXRvbSA9IChfYXRvbSwgdmVyc2lvbikgPT4ge1xuICAgIGlmICh2ZXJzaW9uKSB7XG4gICAgICBjb21taXRWZXJzaW9uZWRBdG9tU3RhdGVNYXAodmVyc2lvbik7XG4gICAgfVxuICAgIGZsdXNoUGVuZGluZyh2b2lkIDApO1xuICB9O1xuICBjb25zdCBzdWJzY3JpYmVBdG9tID0gKGF0b20sIGNhbGxiYWNrLCB2ZXJzaW9uKSA9PiB7XG4gICAgY29uc3QgbW91bnRlZCA9IGFkZEF0b20odmVyc2lvbiwgYXRvbSk7XG4gICAgY29uc3QgbGlzdGVuZXJzID0gbW91bnRlZC5sO1xuICAgIGxpc3RlbmVycy5hZGQoY2FsbGJhY2spO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBsaXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgIGRlbEF0b20odmVyc2lvbiwgYXRvbSk7XG4gICAgfTtcbiAgfTtcbiAgY29uc3QgcmVzdG9yZUF0b21zID0gKHZhbHVlcywgdmVyc2lvbikgPT4ge1xuICAgIGZvciAoY29uc3QgW2F0b20sIHZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICAgIGlmIChoYXNJbml0aWFsVmFsdWUoYXRvbSkpIHtcbiAgICAgICAgc2V0QXRvbVByb21pc2VPclZhbHVlKHZlcnNpb24sIGF0b20sIHZhbHVlKTtcbiAgICAgICAgaW52YWxpZGF0ZURlcGVuZGVudHModmVyc2lvbiwgYXRvbSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZsdXNoUGVuZGluZyh2ZXJzaW9uKTtcbiAgfTtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHJldHVybiB7XG4gICAgICBbUkVBRF9BVE9NXTogcmVhZEF0b20sXG4gICAgICBbV1JJVEVfQVRPTV06IHdyaXRlQXRvbSxcbiAgICAgIFtDT01NSVRfQVRPTV06IGNvbW1pdEF0b20sXG4gICAgICBbU1VCU0NSSUJFX0FUT01dOiBzdWJzY3JpYmVBdG9tLFxuICAgICAgW1JFU1RPUkVfQVRPTVNdOiByZXN0b3JlQXRvbXMsXG4gICAgICBbREVWX1NVQlNDUklCRV9TVEFURV06IChsKSA9PiB7XG4gICAgICAgIHN0YXRlTGlzdGVuZXJzLmFkZChsKTtcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzdGF0ZUxpc3RlbmVycy5kZWxldGUobCk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgICAgW0RFVl9HRVRfTU9VTlRFRF9BVE9NU106ICgpID0+IG1vdW50ZWRBdG9tcy52YWx1ZXMoKSxcbiAgICAgIFtERVZfR0VUX0FUT01fU1RBVEVdOiAoYSkgPT4gY29tbWl0dGVkQXRvbVN0YXRlTWFwLmdldChhKSxcbiAgICAgIFtERVZfR0VUX01PVU5URURdOiAoYSkgPT4gbW91bnRlZE1hcC5nZXQoYSlcbiAgICB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgW1JFQURfQVRPTV06IHJlYWRBdG9tLFxuICAgIFtXUklURV9BVE9NXTogd3JpdGVBdG9tLFxuICAgIFtDT01NSVRfQVRPTV06IGNvbW1pdEF0b20sXG4gICAgW1NVQlNDUklCRV9BVE9NXTogc3Vic2NyaWJlQXRvbSxcbiAgICBbUkVTVE9SRV9BVE9NU106IHJlc3RvcmVBdG9tc1xuICB9O1xufTtcbmNvbnN0IGNyZWF0ZVN0b3JlRm9yRXhwb3J0ID0gKGluaXRpYWxWYWx1ZXMpID0+IHtcbiAgY29uc3Qgc3RvcmUgPSBjcmVhdGVTdG9yZShpbml0aWFsVmFsdWVzKTtcbiAgY29uc3QgZ2V0ID0gKGF0b20pID0+IHtcbiAgICBjb25zdCBhdG9tU3RhdGUgPSBzdG9yZVtSRUFEX0FUT01dKGF0b20pO1xuICAgIGlmIChcImVcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHRocm93IGF0b21TdGF0ZS5lO1xuICAgIH1cbiAgICBpZiAoXCJwXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgICByZXR1cm4gdm9pZCAwO1xuICAgIH1cbiAgICByZXR1cm4gYXRvbVN0YXRlLnY7XG4gIH07XG4gIGNvbnN0IGFzeW5jR2V0ID0gKGF0b20pID0+IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBhdG9tU3RhdGUgPSBzdG9yZVtSRUFEX0FUT01dKGF0b20pO1xuICAgIGlmIChcImVcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHJlamVjdChhdG9tU3RhdGUuZSk7XG4gICAgfSBlbHNlIGlmIChcInBcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHJlc29sdmUoYXRvbVN0YXRlLnAudGhlbigoKSA9PiBhc3luY0dldChhdG9tKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlKGF0b21TdGF0ZS52KTtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBzZXQgPSAoYXRvbSwgdXBkYXRlKSA9PiBzdG9yZVtXUklURV9BVE9NXShhdG9tLCB1cGRhdGUpO1xuICBjb25zdCBzdWIgPSAoYXRvbSwgY2FsbGJhY2spID0+IHN0b3JlW1NVQlNDUklCRV9BVE9NXShhdG9tLCBjYWxsYmFjayk7XG4gIHJldHVybiB7XG4gICAgZ2V0LFxuICAgIGFzeW5jR2V0LFxuICAgIHNldCxcbiAgICBzdWIsXG4gICAgU0VDUkVUX0lOVEVSTkFMX3N0b3JlOiBzdG9yZVxuICB9O1xufTtcblxuY29uc3QgY3JlYXRlU2NvcGVDb250YWluZXIgPSAoaW5pdGlhbFZhbHVlcywgdW5zdGFibGVfY3JlYXRlU3RvcmUpID0+IHtcbiAgY29uc3Qgc3RvcmUgPSB1bnN0YWJsZV9jcmVhdGVTdG9yZSA/IHVuc3RhYmxlX2NyZWF0ZVN0b3JlKGluaXRpYWxWYWx1ZXMpLlNFQ1JFVF9JTlRFUk5BTF9zdG9yZSA6IGNyZWF0ZVN0b3JlKGluaXRpYWxWYWx1ZXMpO1xuICByZXR1cm4geyBzOiBzdG9yZSB9O1xufTtcbmNvbnN0IFNjb3BlQ29udGV4dE1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG5jb25zdCBnZXRTY29wZUNvbnRleHQgPSAoc2NvcGUpID0+IHtcbiAgaWYgKCFTY29wZUNvbnRleHRNYXAuaGFzKHNjb3BlKSkge1xuICAgIFNjb3BlQ29udGV4dE1hcC5zZXQoc2NvcGUsIGNyZWF0ZUNvbnRleHQoY3JlYXRlU2NvcGVDb250YWluZXIoKSkpO1xuICB9XG4gIHJldHVybiBTY29wZUNvbnRleHRNYXAuZ2V0KHNjb3BlKTtcbn07XG5cbmNvbnN0IFByb3ZpZGVyID0gKHtcbiAgY2hpbGRyZW4sXG4gIGluaXRpYWxWYWx1ZXMsXG4gIHNjb3BlLFxuICB1bnN0YWJsZV9jcmVhdGVTdG9yZSxcbiAgdW5zdGFibGVfZW5hYmxlVmVyc2lvbmVkV3JpdGVcbn0pID0+IHtcbiAgY29uc3QgW3ZlcnNpb24sIHNldFZlcnNpb25dID0gdXNlU3RhdGUoe30pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHNjb3BlQ29udGFpbmVyID0gc2NvcGVDb250YWluZXJSZWYuY3VycmVudDtcbiAgICBpZiAoc2NvcGVDb250YWluZXIudykge1xuICAgICAgc2NvcGVDb250YWluZXIuc1tDT01NSVRfQVRPTV0obnVsbCwgdmVyc2lvbik7XG4gICAgICBkZWxldGUgdmVyc2lvbi5wO1xuICAgICAgc2NvcGVDb250YWluZXIudiA9IHZlcnNpb247XG4gICAgfVxuICB9LCBbdmVyc2lvbl0pO1xuICBjb25zdCBzY29wZUNvbnRhaW5lclJlZiA9IHVzZVJlZigpO1xuICBpZiAoIXNjb3BlQ29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICBjb25zdCBzY29wZUNvbnRhaW5lciA9IGNyZWF0ZVNjb3BlQ29udGFpbmVyKFxuICAgICAgaW5pdGlhbFZhbHVlcyxcbiAgICAgIHVuc3RhYmxlX2NyZWF0ZVN0b3JlXG4gICAgKTtcbiAgICBpZiAodW5zdGFibGVfZW5hYmxlVmVyc2lvbmVkV3JpdGUpIHtcbiAgICAgIGxldCByZXRyeWluZyA9IDA7XG4gICAgICBzY29wZUNvbnRhaW5lci53ID0gKHdyaXRlKSA9PiB7XG4gICAgICAgIHNldFZlcnNpb24oKHBhcmVudFZlcnNpb24pID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0VmVyc2lvbiA9IHJldHJ5aW5nID8gcGFyZW50VmVyc2lvbiA6IHsgcDogcGFyZW50VmVyc2lvbiB9O1xuICAgICAgICAgIHdyaXRlKG5leHRWZXJzaW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV4dFZlcnNpb247XG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHNjb3BlQ29udGFpbmVyLnYgPSB2ZXJzaW9uO1xuICAgICAgc2NvcGVDb250YWluZXIuciA9IChmbikgPT4ge1xuICAgICAgICArK3JldHJ5aW5nO1xuICAgICAgICBmbigpO1xuICAgICAgICAtLXJldHJ5aW5nO1xuICAgICAgfTtcbiAgICB9XG4gICAgc2NvcGVDb250YWluZXJSZWYuY3VycmVudCA9IHNjb3BlQ29udGFpbmVyO1xuICB9XG4gIGNvbnN0IFNjb3BlQ29udGFpbmVyQ29udGV4dCA9IGdldFNjb3BlQ29udGV4dChzY29wZSk7XG4gIHJldHVybiBjcmVhdGVFbGVtZW50KFxuICAgIFNjb3BlQ29udGFpbmVyQ29udGV4dC5Qcm92aWRlcixcbiAgICB7XG4gICAgICB2YWx1ZTogc2NvcGVDb250YWluZXJSZWYuY3VycmVudFxuICAgIH0sXG4gICAgY2hpbGRyZW5cbiAgKTtcbn07XG5cbmZ1bmN0aW9uIGF0b20ocmVhZCwgd3JpdGUpIHtcbiAgcmV0dXJuIGF0b20kMShyZWFkLCB3cml0ZSk7XG59XG5cbmZ1bmN0aW9uIHVzZUF0b21WYWx1ZShhdG9tLCBzY29wZSkge1xuICBjb25zdCBTY29wZUNvbnRleHQgPSBnZXRTY29wZUNvbnRleHQoc2NvcGUpO1xuICBjb25zdCBzY29wZUNvbnRhaW5lciA9IHVzZUNvbnRleHQoU2NvcGVDb250ZXh0KTtcbiAgY29uc3QgeyBzOiBzdG9yZSwgdjogdmVyc2lvbkZyb21Qcm92aWRlciB9ID0gc2NvcGVDb250YWluZXI7XG4gIGNvbnN0IGdldEF0b21WYWx1ZSA9ICh2ZXJzaW9uMikgPT4ge1xuICAgIGNvbnN0IGF0b21TdGF0ZSA9IHN0b3JlW1JFQURfQVRPTV0oYXRvbSwgdmVyc2lvbjIpO1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWF0b21TdGF0ZS55KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJzaG91bGQgbm90IGJlIGludmFsaWRhdGVkXCIpO1xuICAgIH1cbiAgICBpZiAoXCJlXCIgaW4gYXRvbVN0YXRlKSB7XG4gICAgICB0aHJvdyBhdG9tU3RhdGUuZTtcbiAgICB9XG4gICAgaWYgKFwicFwiIGluIGF0b21TdGF0ZSkge1xuICAgICAgdGhyb3cgYXRvbVN0YXRlLnA7XG4gICAgfVxuICAgIGlmIChcInZcIiBpbiBhdG9tU3RhdGUpIHtcbiAgICAgIHJldHVybiBhdG9tU3RhdGUudjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKFwibm8gYXRvbSB2YWx1ZVwiKTtcbiAgfTtcbiAgY29uc3QgW1t2ZXJzaW9uLCB2YWx1ZUZyb21SZWR1Y2VyLCBhdG9tRnJvbVJlZHVjZXJdLCByZXJlbmRlcklmQ2hhbmdlZF0gPSB1c2VSZWR1Y2VyKFxuICAgIChwcmV2LCBuZXh0VmVyc2lvbikgPT4ge1xuICAgICAgY29uc3QgbmV4dFZhbHVlID0gZ2V0QXRvbVZhbHVlKG5leHRWZXJzaW9uKTtcbiAgICAgIGlmIChPYmplY3QuaXMocHJldlsxXSwgbmV4dFZhbHVlKSAmJiBwcmV2WzJdID09PSBhdG9tKSB7XG4gICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtuZXh0VmVyc2lvbiwgbmV4dFZhbHVlLCBhdG9tXTtcbiAgICB9LFxuICAgIHZlcnNpb25Gcm9tUHJvdmlkZXIsXG4gICAgKGluaXRpYWxWZXJzaW9uKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsVmFsdWUgPSBnZXRBdG9tVmFsdWUoaW5pdGlhbFZlcnNpb24pO1xuICAgICAgcmV0dXJuIFtpbml0aWFsVmVyc2lvbiwgaW5pdGlhbFZhbHVlLCBhdG9tXTtcbiAgICB9XG4gICk7XG4gIGxldCB2YWx1ZSA9IHZhbHVlRnJvbVJlZHVjZXI7XG4gIGlmIChhdG9tRnJvbVJlZHVjZXIgIT09IGF0b20pIHtcbiAgICByZXJlbmRlcklmQ2hhbmdlZCh2ZXJzaW9uKTtcbiAgICB2YWx1ZSA9IGdldEF0b21WYWx1ZSh2ZXJzaW9uKTtcbiAgfVxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGNvbnN0IHsgdjogdmVyc2lvbkZyb21Qcm92aWRlcjIgfSA9IHNjb3BlQ29udGFpbmVyO1xuICAgIGlmICh2ZXJzaW9uRnJvbVByb3ZpZGVyMikge1xuICAgICAgc3RvcmVbQ09NTUlUX0FUT01dKGF0b20sIHZlcnNpb25Gcm9tUHJvdmlkZXIyKTtcbiAgICB9XG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSBzdG9yZVtTVUJTQ1JJQkVfQVRPTV0oXG4gICAgICBhdG9tLFxuICAgICAgcmVyZW5kZXJJZkNoYW5nZWQsXG4gICAgICB2ZXJzaW9uRnJvbVByb3ZpZGVyMlxuICAgICk7XG4gICAgcmVyZW5kZXJJZkNoYW5nZWQodmVyc2lvbkZyb21Qcm92aWRlcjIpO1xuICAgIHJldHVybiB1bnN1YnNjcmliZTtcbiAgfSwgW3N0b3JlLCBhdG9tLCBzY29wZUNvbnRhaW5lcl0pO1xuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHN0b3JlW0NPTU1JVF9BVE9NXShhdG9tLCB2ZXJzaW9uKTtcbiAgfSk7XG4gIHVzZURlYnVnVmFsdWUodmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHVzZVNldEF0b20oYXRvbSwgc2NvcGUpIHtcbiAgY29uc3QgU2NvcGVDb250ZXh0ID0gZ2V0U2NvcGVDb250ZXh0KHNjb3BlKTtcbiAgY29uc3QgeyBzOiBzdG9yZSwgdzogdmVyc2lvbmVkV3JpdGUgfSA9IHVzZUNvbnRleHQoU2NvcGVDb250ZXh0KTtcbiAgY29uc3Qgc2V0QXRvbSA9IHVzZUNhbGxiYWNrKFxuICAgICh1cGRhdGUpID0+IHtcbiAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIShcIndyaXRlXCIgaW4gYXRvbSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwibm90IHdyaXRhYmxlIGF0b21cIik7XG4gICAgICB9XG4gICAgICBjb25zdCB3cml0ZSA9ICh2ZXJzaW9uKSA9PiBzdG9yZVtXUklURV9BVE9NXShhdG9tLCB1cGRhdGUsIHZlcnNpb24pO1xuICAgICAgcmV0dXJuIHZlcnNpb25lZFdyaXRlID8gdmVyc2lvbmVkV3JpdGUod3JpdGUpIDogd3JpdGUoKTtcbiAgICB9LFxuICAgIFtzdG9yZSwgdmVyc2lvbmVkV3JpdGUsIGF0b21dXG4gICk7XG4gIHJldHVybiBzZXRBdG9tO1xufVxuXG5mdW5jdGlvbiB1c2VBdG9tKGF0b20sIHNjb3BlKSB7XG4gIGlmIChcInNjb3BlXCIgaW4gYXRvbSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiYXRvbS5zY29wZSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgZG8gdXNlQXRvbShhdG9tLCBzY29wZSkgaW5zdGVhZC5cIlxuICAgICk7XG4gICAgc2NvcGUgPSBhdG9tLnNjb3BlO1xuICB9XG4gIHJldHVybiBbXG4gICAgdXNlQXRvbVZhbHVlKGF0b20sIHNjb3BlKSxcbiAgICAvLyBXZSBkbyB3cm9uZyB0eXBlIGFzc2VydGlvbiBoZXJlLCB3aGljaCByZXN1bHRzIGluIHRocm93aW5nIGFuIGVycm9yLlxuICAgIHVzZVNldEF0b20oYXRvbSwgc2NvcGUpXG4gIF07XG59XG5cbmV4cG9ydCB7IFByb3ZpZGVyLCBnZXRTY29wZUNvbnRleHQgYXMgU0VDUkVUX0lOVEVSTkFMX2dldFNjb3BlQ29udGV4dCwgcmVnaXN0ZXJQcm9taXNlQWJvcnQgYXMgU0VDUkVUX0lOVEVSTkFMX3JlZ2lzdGVyUHJvbWlzZUFib3J0LCBhdG9tLCBjcmVhdGVTdG9yZUZvckV4cG9ydCBhcyB1bnN0YWJsZV9jcmVhdGVTdG9yZSwgdXNlQXRvbSwgdXNlQXRvbVZhbHVlLCB1c2VTZXRBdG9tIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/jotai/esm/index.mjs\n");
5492
5492
 
5493
5493
  /***/ }),
5494
5494
 
@@ -5499,7 +5499,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5499
5499
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5500
5500
 
5501
5501
  "use strict";
5502
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"atom\": () => (/* binding */ atom),\n/* harmony export */ \"createStore\": () => (/* binding */ createStore),\n/* harmony export */ \"getDefaultStore\": () => (/* binding */ getDefaultStore)\n/* harmony export */ });\nlet keyCount = 0;\nfunction atom(read, write) {\n const key = `atom${++keyCount}`;\n const config = {\n toString: () => key\n };\n if (typeof read === \"function\") {\n config.read = read;\n } else {\n config.init = read;\n config.read = (get) => get(config);\n config.write = (get, set, arg) => set(\n config,\n typeof arg === \"function\" ? arg(get(config)) : arg\n );\n }\n if (write) {\n config.write = write;\n }\n return config;\n}\n\nconst hasInitialValue = (atom) => \"init\" in atom;\nconst isActuallyWritableAtom = (atom) => !!atom.write;\nconst cancelPromiseMap = /* @__PURE__ */ new WeakMap();\nconst registerCancelPromise = (promise, cancel) => {\n cancelPromiseMap.set(promise, cancel);\n promise.catch(() => {\n }).finally(() => cancelPromiseMap.delete(promise));\n};\nconst cancelPromise = (promise, next) => {\n const cancel = cancelPromiseMap.get(promise);\n if (cancel) {\n cancelPromiseMap.delete(promise);\n cancel(next);\n }\n};\nconst resolvePromise = (promise, value) => {\n promise.status = \"fulfilled\";\n promise.value = value;\n};\nconst rejectPromise = (promise, e) => {\n promise.status = \"rejected\";\n promise.reason = e;\n};\nconst isEqualAtomValue = (a, b) => \"v\" in a && \"v\" in b && Object.is(a.v, b.v);\nconst isEqualAtomError = (a, b) => \"e\" in a && \"e\" in b && Object.is(a.e, b.e);\nconst hasPromiseAtomValue = (a) => \"v\" in a && a.v instanceof Promise;\nconst returnAtomValue = (atomState) => {\n if (\"e\" in atomState) {\n throw atomState.e;\n }\n return atomState.v;\n};\nconst createStore = () => {\n const atomStateMap = /* @__PURE__ */ new WeakMap();\n const mountedMap = /* @__PURE__ */ new WeakMap();\n const pendingMap = /* @__PURE__ */ new Map();\n let stateListeners;\n let mountedAtoms;\n if (true) {\n stateListeners = /* @__PURE__ */ new Set();\n mountedAtoms = /* @__PURE__ */ new Set();\n }\n const getAtomState = (atom) => atomStateMap.get(atom);\n const setAtomState = (atom, atomState) => {\n if (true) {\n Object.freeze(atomState);\n }\n const prevAtomState = atomStateMap.get(atom);\n atomStateMap.set(atom, atomState);\n if (!pendingMap.has(atom)) {\n pendingMap.set(atom, prevAtomState);\n }\n if (prevAtomState && hasPromiseAtomValue(prevAtomState)) {\n const next = \"v\" in atomState ? atomState.v instanceof Promise ? atomState.v : Promise.resolve(atomState.v) : Promise.reject(atomState.e);\n cancelPromise(prevAtomState.v, next);\n }\n };\n const updateDependencies = (atom, nextAtomState, depSet) => {\n const dependencies = /* @__PURE__ */ new Map();\n let changed = false;\n depSet.forEach((a) => {\n const aState = a === atom ? nextAtomState : getAtomState(a);\n if (aState) {\n dependencies.set(a, aState);\n if (nextAtomState.d.get(a) !== aState) {\n changed = true;\n }\n } else if (true) {\n console.warn(\"[Bug] atom state not found\");\n }\n });\n if (changed || nextAtomState.d.size !== dependencies.size) {\n nextAtomState.d = dependencies;\n }\n };\n const setAtomValue = (atom, value, depSet) => {\n const prevAtomState = getAtomState(atom);\n const nextAtomState = {\n d: (prevAtomState == null ? void 0 : prevAtomState.d) || /* @__PURE__ */ new Map(),\n v: value\n };\n if (depSet) {\n updateDependencies(atom, nextAtomState, depSet);\n }\n if (prevAtomState && isEqualAtomValue(prevAtomState, nextAtomState) && prevAtomState.d === nextAtomState.d) {\n return prevAtomState;\n }\n setAtomState(atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomError = (atom, error, depSet) => {\n const prevAtomState = getAtomState(atom);\n const nextAtomState = {\n d: (prevAtomState == null ? void 0 : prevAtomState.d) || /* @__PURE__ */ new Map(),\n e: error\n };\n if (depSet) {\n updateDependencies(atom, nextAtomState, depSet);\n }\n if (prevAtomState && isEqualAtomError(prevAtomState, nextAtomState) && prevAtomState.d === nextAtomState.d) {\n return prevAtomState;\n }\n setAtomState(atom, nextAtomState);\n return nextAtomState;\n };\n const readAtomState = (atom) => {\n const atomState = getAtomState(atom);\n if (atomState) {\n atomState.d.forEach((_, a) => {\n if (a !== atom && !mountedMap.has(a)) {\n readAtomState(a);\n }\n });\n if (Array.from(atomState.d).every(\n ([a, s]) => a === atom || getAtomState(a) === s\n )) {\n return atomState;\n }\n }\n const depSet = /* @__PURE__ */ new Set();\n let isSync = true;\n const getter = (a) => {\n depSet.add(a);\n if (a === atom) {\n const aState2 = getAtomState(a);\n if (aState2) {\n return returnAtomValue(aState2);\n }\n if (hasInitialValue(a)) {\n return a.init;\n }\n throw new Error(\"no atom init\");\n }\n const aState = readAtomState(a);\n return returnAtomValue(aState);\n };\n let controller;\n let setSelf;\n const options = {\n get signal() {\n if (!controller) {\n controller = new AbortController();\n }\n return controller.signal;\n },\n get setSelf() {\n if ( true && !isActuallyWritableAtom(atom)) {\n console.warn(\"setSelf function cannot be used with read-only atom\");\n }\n if (!setSelf && isActuallyWritableAtom(atom)) {\n setSelf = (...args) => {\n if ( true && isSync) {\n console.warn(\"setSelf function cannot be called in sync\");\n }\n if (!isSync) {\n return writeAtom(atom, ...args);\n }\n };\n }\n return setSelf;\n }\n };\n try {\n const value = atom.read(getter, options);\n if (value instanceof Promise) {\n let continuePromise;\n const promise = new Promise((resolve, reject) => {\n let settled = false;\n value.then(\n (v) => {\n if (!settled) {\n resolvePromise(promise, v);\n resolve(v);\n }\n },\n (e) => {\n if (!settled) {\n rejectPromise(promise, e);\n reject(e);\n }\n }\n ).finally(() => {\n if (!settled) {\n settled = true;\n setAtomValue(atom, promise, depSet);\n }\n });\n continuePromise = (next) => {\n if (!settled) {\n settled = true;\n next.then(\n (v) => resolvePromise(promise, v),\n (e) => rejectPromise(promise, e)\n );\n resolve(next);\n }\n };\n });\n promise.status = \"pending\";\n registerCancelPromise(promise, (next) => {\n if (next) {\n continuePromise(next);\n }\n controller == null ? void 0 : controller.abort();\n });\n return setAtomValue(atom, promise, depSet);\n }\n return setAtomValue(atom, value, depSet);\n } catch (error) {\n return setAtomError(atom, error, depSet);\n } finally {\n isSync = false;\n }\n };\n const readAtom = (atom) => returnAtomValue(readAtomState(atom));\n const addAtom = (atom) => {\n let mounted = mountedMap.get(atom);\n if (!mounted) {\n mounted = mountAtom(atom);\n }\n return mounted;\n };\n const canUnmountAtom = (atom, mounted) => !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));\n const delAtom = (atom) => {\n const mounted = mountedMap.get(atom);\n if (mounted && canUnmountAtom(atom, mounted)) {\n unmountAtom(atom);\n }\n };\n const recomputeDependents = (atom) => {\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.t.forEach((dependent) => {\n if (dependent !== atom) {\n const prevAtomState = getAtomState(dependent);\n const nextAtomState = readAtomState(dependent);\n if (!prevAtomState || !isEqualAtomValue(prevAtomState, nextAtomState)) {\n recomputeDependents(dependent);\n }\n }\n });\n };\n const writeAtomState = (atom, ...args) => {\n let isSync = true;\n const getter = (a) => returnAtomValue(readAtomState(a));\n const setter = (a, ...args2) => {\n let r;\n if (a === atom) {\n if (!hasInitialValue(a)) {\n throw new Error(\"atom not writable\");\n }\n const prevAtomState = getAtomState(a);\n const nextAtomState = setAtomValue(a, args2[0]);\n if (!prevAtomState || !isEqualAtomValue(prevAtomState, nextAtomState)) {\n recomputeDependents(a);\n }\n } else {\n r = writeAtomState(a, ...args2);\n }\n if (!isSync) {\n flushPending();\n }\n return r;\n };\n const result = atom.write(getter, setter, ...args);\n isSync = false;\n return result;\n };\n const writeAtom = (atom, ...args) => {\n const result = writeAtomState(atom, ...args);\n flushPending();\n return result;\n };\n const mountAtom = (atom, initialDependent) => {\n const mounted = {\n t: new Set(initialDependent && [initialDependent]),\n l: /* @__PURE__ */ new Set()\n };\n mountedMap.set(atom, mounted);\n if (true) {\n mountedAtoms.add(atom);\n }\n readAtomState(atom).d.forEach((_, a) => {\n const aMounted = mountedMap.get(a);\n if (aMounted) {\n aMounted.t.add(atom);\n } else {\n if (a !== atom) {\n mountAtom(a, atom);\n }\n }\n });\n readAtomState(atom);\n if (isActuallyWritableAtom(atom) && atom.onMount) {\n const onUnmount = atom.onMount((...args) => writeAtom(atom, ...args));\n if (onUnmount) {\n mounted.u = onUnmount;\n }\n }\n return mounted;\n };\n const unmountAtom = (atom) => {\n var _a;\n const onUnmount = (_a = mountedMap.get(atom)) == null ? void 0 : _a.u;\n if (onUnmount) {\n onUnmount();\n }\n mountedMap.delete(atom);\n if (true) {\n mountedAtoms.delete(atom);\n }\n const atomState = getAtomState(atom);\n if (atomState) {\n if (hasPromiseAtomValue(atomState)) {\n cancelPromise(atomState.v);\n }\n atomState.d.forEach((_, a) => {\n if (a !== atom) {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(a);\n }\n }\n }\n });\n } else if (true) {\n console.warn(\"[Bug] could not find atom state to unmount\", atom);\n }\n };\n const mountDependencies = (atom, atomState, prevDependencies) => {\n const depSet = new Set(atomState.d.keys());\n prevDependencies == null ? void 0 : prevDependencies.forEach((_, a) => {\n if (depSet.has(a)) {\n depSet.delete(a);\n return;\n }\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(a);\n }\n }\n });\n depSet.forEach((a) => {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.add(atom);\n } else if (mountedMap.has(atom)) {\n mountAtom(a, atom);\n }\n });\n };\n const flushPending = () => {\n while (pendingMap.size) {\n const pending = Array.from(pendingMap);\n pendingMap.clear();\n pending.forEach(([atom, prevAtomState]) => {\n const atomState = getAtomState(atom);\n if (atomState) {\n if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n }\n const mounted = mountedMap.get(atom);\n if (mounted && !// TODO This seems pretty hacky. Hope to fix it.\n // Maybe we could `mountDependencies` in `setAtomState`?\n (prevAtomState && !hasPromiseAtomValue(prevAtomState) && (isEqualAtomValue(prevAtomState, atomState) || isEqualAtomError(prevAtomState, atomState)))) {\n mounted.l.forEach((listener) => listener());\n }\n } else if (true) {\n console.warn(\"[Bug] no atom state to flush\");\n }\n });\n }\n if (true) {\n stateListeners.forEach((l) => l());\n }\n };\n const subscribeAtom = (atom, listener) => {\n const mounted = addAtom(atom);\n flushPending();\n const listeners = mounted.l;\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n delAtom(atom);\n };\n };\n if (true) {\n return {\n get: readAtom,\n set: writeAtom,\n sub: subscribeAtom,\n // store dev methods (these are tentative and subject to change)\n dev_subscribe_state: (l) => {\n stateListeners.add(l);\n return () => {\n stateListeners.delete(l);\n };\n },\n dev_get_mounted_atoms: () => mountedAtoms.values(),\n dev_get_atom_state: (a) => atomStateMap.get(a),\n dev_get_mounted: (a) => mountedMap.get(a),\n dev_restore_atoms: (values) => {\n for (const [atom, value] of values) {\n if (hasInitialValue(atom)) {\n setAtomValue(atom, value);\n recomputeDependents(atom);\n }\n }\n flushPending();\n }\n };\n }\n return {\n get: readAtom,\n set: writeAtom,\n sub: subscribeAtom\n };\n};\nlet defaultStore;\nconst getDefaultStore = () => {\n if (!defaultStore) {\n defaultStore = createStore();\n }\n return defaultStore;\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pvdGFpL2VzbS92YW5pbGxhLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0EscUJBQXFCLFdBQVc7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUEwRDtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUyxJQUEwRDtBQUMzRTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxZQUFZLEtBQTBEO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLEtBQTBEO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQTBEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNLFNBQVMsSUFBMEQ7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsSUFBMEQ7QUFDN0U7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVEsSUFBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFOEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pvdGFpL2VzbS92YW5pbGxhLm1qcz8wNTc5Il0sInNvdXJjZXNDb250ZW50IjpbImxldCBrZXlDb3VudCA9IDA7XG5mdW5jdGlvbiBhdG9tKHJlYWQsIHdyaXRlKSB7XG4gIGNvbnN0IGtleSA9IGBhdG9tJHsrK2tleUNvdW50fWA7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICB0b1N0cmluZzogKCkgPT4ga2V5XG4gIH07XG4gIGlmICh0eXBlb2YgcmVhZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uZmlnLnJlYWQgPSByZWFkO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZy5pbml0ID0gcmVhZDtcbiAgICBjb25maWcucmVhZCA9IChnZXQpID0+IGdldChjb25maWcpO1xuICAgIGNvbmZpZy53cml0ZSA9IChnZXQsIHNldCwgYXJnKSA9PiBzZXQoXG4gICAgICBjb25maWcsXG4gICAgICB0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIgPyBhcmcoZ2V0KGNvbmZpZykpIDogYXJnXG4gICAgKTtcbiAgfVxuICBpZiAod3JpdGUpIHtcbiAgICBjb25maWcud3JpdGUgPSB3cml0ZTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5jb25zdCBoYXNJbml0aWFsVmFsdWUgPSAoYXRvbSkgPT4gXCJpbml0XCIgaW4gYXRvbTtcbmNvbnN0IGlzQWN0dWFsbHlXcml0YWJsZUF0b20gPSAoYXRvbSkgPT4gISFhdG9tLndyaXRlO1xuY29uc3QgY2FuY2VsUHJvbWlzZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVnaXN0ZXJDYW5jZWxQcm9taXNlID0gKHByb21pc2UsIGNhbmNlbCkgPT4ge1xuICBjYW5jZWxQcm9taXNlTWFwLnNldChwcm9taXNlLCBjYW5jZWwpO1xuICBwcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgfSkuZmluYWxseSgoKSA9PiBjYW5jZWxQcm9taXNlTWFwLmRlbGV0ZShwcm9taXNlKSk7XG59O1xuY29uc3QgY2FuY2VsUHJvbWlzZSA9IChwcm9taXNlLCBuZXh0KSA9PiB7XG4gIGNvbnN0IGNhbmNlbCA9IGNhbmNlbFByb21pc2VNYXAuZ2V0KHByb21pc2UpO1xuICBpZiAoY2FuY2VsKSB7XG4gICAgY2FuY2VsUHJvbWlzZU1hcC5kZWxldGUocHJvbWlzZSk7XG4gICAgY2FuY2VsKG5leHQpO1xuICB9XG59O1xuY29uc3QgcmVzb2x2ZVByb21pc2UgPSAocHJvbWlzZSwgdmFsdWUpID0+IHtcbiAgcHJvbWlzZS5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiO1xuICBwcm9taXNlLnZhbHVlID0gdmFsdWU7XG59O1xuY29uc3QgcmVqZWN0UHJvbWlzZSA9IChwcm9taXNlLCBlKSA9PiB7XG4gIHByb21pc2Uuc3RhdHVzID0gXCJyZWplY3RlZFwiO1xuICBwcm9taXNlLnJlYXNvbiA9IGU7XG59O1xuY29uc3QgaXNFcXVhbEF0b21WYWx1ZSA9IChhLCBiKSA9PiBcInZcIiBpbiBhICYmIFwidlwiIGluIGIgJiYgT2JqZWN0LmlzKGEudiwgYi52KTtcbmNvbnN0IGlzRXF1YWxBdG9tRXJyb3IgPSAoYSwgYikgPT4gXCJlXCIgaW4gYSAmJiBcImVcIiBpbiBiICYmIE9iamVjdC5pcyhhLmUsIGIuZSk7XG5jb25zdCBoYXNQcm9taXNlQXRvbVZhbHVlID0gKGEpID0+IFwidlwiIGluIGEgJiYgYS52IGluc3RhbmNlb2YgUHJvbWlzZTtcbmNvbnN0IHJldHVybkF0b21WYWx1ZSA9IChhdG9tU3RhdGUpID0+IHtcbiAgaWYgKFwiZVwiIGluIGF0b21TdGF0ZSkge1xuICAgIHRocm93IGF0b21TdGF0ZS5lO1xuICB9XG4gIHJldHVybiBhdG9tU3RhdGUudjtcbn07XG5jb25zdCBjcmVhdGVTdG9yZSA9ICgpID0+IHtcbiAgY29uc3QgYXRvbVN0YXRlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IG1vdW50ZWRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgcGVuZGluZ01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBzdGF0ZUxpc3RlbmVycztcbiAgbGV0IG1vdW50ZWRBdG9tcztcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHN0YXRlTGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBtb3VudGVkQXRvbXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICB9XG4gIGNvbnN0IGdldEF0b21TdGF0ZSA9IChhdG9tKSA9PiBhdG9tU3RhdGVNYXAuZ2V0KGF0b20pO1xuICBjb25zdCBzZXRBdG9tU3RhdGUgPSAoYXRvbSwgYXRvbVN0YXRlKSA9PiB7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgT2JqZWN0LmZyZWV6ZShhdG9tU3RhdGUpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gYXRvbVN0YXRlTWFwLmdldChhdG9tKTtcbiAgICBhdG9tU3RhdGVNYXAuc2V0KGF0b20sIGF0b21TdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nTWFwLmhhcyhhdG9tKSkge1xuICAgICAgcGVuZGluZ01hcC5zZXQoYXRvbSwgcHJldkF0b21TdGF0ZSk7XG4gICAgfVxuICAgIGlmIChwcmV2QXRvbVN0YXRlICYmIGhhc1Byb21pc2VBdG9tVmFsdWUocHJldkF0b21TdGF0ZSkpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBcInZcIiBpbiBhdG9tU3RhdGUgPyBhdG9tU3RhdGUudiBpbnN0YW5jZW9mIFByb21pc2UgPyBhdG9tU3RhdGUudiA6IFByb21pc2UucmVzb2x2ZShhdG9tU3RhdGUudikgOiBQcm9taXNlLnJlamVjdChhdG9tU3RhdGUuZSk7XG4gICAgICBjYW5jZWxQcm9taXNlKHByZXZBdG9tU3RhdGUudiwgbmV4dCk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1cGRhdGVEZXBlbmRlbmNpZXMgPSAoYXRvbSwgbmV4dEF0b21TdGF0ZSwgZGVwU2V0KSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGRlcFNldC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zdCBhU3RhdGUgPSBhID09PSBhdG9tID8gbmV4dEF0b21TdGF0ZSA6IGdldEF0b21TdGF0ZShhKTtcbiAgICAgIGlmIChhU3RhdGUpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnNldChhLCBhU3RhdGUpO1xuICAgICAgICBpZiAobmV4dEF0b21TdGF0ZS5kLmdldChhKSAhPT0gYVN0YXRlKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltCdWddIGF0b20gc3RhdGUgbm90IGZvdW5kXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkIHx8IG5leHRBdG9tU3RhdGUuZC5zaXplICE9PSBkZXBlbmRlbmNpZXMuc2l6ZSkge1xuICAgICAgbmV4dEF0b21TdGF0ZS5kID0gZGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0QXRvbVZhbHVlID0gKGF0b20sIHZhbHVlLCBkZXBTZXQpID0+IHtcbiAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKGF0b20pO1xuICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICBkOiAocHJldkF0b21TdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogcHJldkF0b21TdGF0ZS5kKSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgdjogdmFsdWVcbiAgICB9O1xuICAgIGlmIChkZXBTZXQpIHtcbiAgICAgIHVwZGF0ZURlcGVuZGVuY2llcyhhdG9tLCBuZXh0QXRvbVN0YXRlLCBkZXBTZXQpO1xuICAgIH1cbiAgICBpZiAocHJldkF0b21TdGF0ZSAmJiBpc0VxdWFsQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUsIG5leHRBdG9tU3RhdGUpICYmIHByZXZBdG9tU3RhdGUuZCA9PT0gbmV4dEF0b21TdGF0ZS5kKSB7XG4gICAgICByZXR1cm4gcHJldkF0b21TdGF0ZTtcbiAgICB9XG4gICAgc2V0QXRvbVN0YXRlKGF0b20sIG5leHRBdG9tU3RhdGUpO1xuICAgIHJldHVybiBuZXh0QXRvbVN0YXRlO1xuICB9O1xuICBjb25zdCBzZXRBdG9tRXJyb3IgPSAoYXRvbSwgZXJyb3IsIGRlcFNldCkgPT4ge1xuICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUoYXRvbSk7XG4gICAgY29uc3QgbmV4dEF0b21TdGF0ZSA9IHtcbiAgICAgIGQ6IChwcmV2QXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBwcmV2QXRvbVN0YXRlLmQpIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICBlOiBlcnJvclxuICAgIH07XG4gICAgaWYgKGRlcFNldCkge1xuICAgICAgdXBkYXRlRGVwZW5kZW5jaWVzKGF0b20sIG5leHRBdG9tU3RhdGUsIGRlcFNldCk7XG4gICAgfVxuICAgIGlmIChwcmV2QXRvbVN0YXRlICYmIGlzRXF1YWxBdG9tRXJyb3IocHJldkF0b21TdGF0ZSwgbmV4dEF0b21TdGF0ZSkgJiYgcHJldkF0b21TdGF0ZS5kID09PSBuZXh0QXRvbVN0YXRlLmQpIHtcbiAgICAgIHJldHVybiBwcmV2QXRvbVN0YXRlO1xuICAgIH1cbiAgICBzZXRBdG9tU3RhdGUoYXRvbSwgbmV4dEF0b21TdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRBdG9tU3RhdGU7XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUgPSAoYXRvbSkgPT4ge1xuICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZShhdG9tKTtcbiAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICBhdG9tU3RhdGUuZC5mb3JFYWNoKChfLCBhKSA9PiB7XG4gICAgICAgIGlmIChhICE9PSBhdG9tICYmICFtb3VudGVkTWFwLmhhcyhhKSkge1xuICAgICAgICAgIHJlYWRBdG9tU3RhdGUoYSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKEFycmF5LmZyb20oYXRvbVN0YXRlLmQpLmV2ZXJ5KFxuICAgICAgICAoW2EsIHNdKSA9PiBhID09PSBhdG9tIHx8IGdldEF0b21TdGF0ZShhKSA9PT0gc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZXBTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBpc1N5bmMgPSB0cnVlO1xuICAgIGNvbnN0IGdldHRlciA9IChhKSA9PiB7XG4gICAgICBkZXBTZXQuYWRkKGEpO1xuICAgICAgaWYgKGEgPT09IGF0b20pIHtcbiAgICAgICAgY29uc3QgYVN0YXRlMiA9IGdldEF0b21TdGF0ZShhKTtcbiAgICAgICAgaWYgKGFTdGF0ZTIpIHtcbiAgICAgICAgICByZXR1cm4gcmV0dXJuQXRvbVZhbHVlKGFTdGF0ZTIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJbml0aWFsVmFsdWUoYSkpIHtcbiAgICAgICAgICByZXR1cm4gYS5pbml0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGF0b20gaW5pdFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFTdGF0ZSA9IHJlYWRBdG9tU3RhdGUoYSk7XG4gICAgICByZXR1cm4gcmV0dXJuQXRvbVZhbHVlKGFTdGF0ZSk7XG4gICAgfTtcbiAgICBsZXQgY29udHJvbGxlcjtcbiAgICBsZXQgc2V0U2VsZjtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB9LFxuICAgICAgZ2V0IHNldFNlbGYoKSB7XG4gICAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWlzQWN0dWFsbHlXcml0YWJsZUF0b20oYXRvbSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJzZXRTZWxmIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIHdpdGggcmVhZC1vbmx5IGF0b21cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZXRTZWxmICYmIGlzQWN0dWFsbHlXcml0YWJsZUF0b20oYXRvbSkpIHtcbiAgICAgICAgICBzZXRTZWxmID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNTeW5jKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNldFNlbGYgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiBzeW5jXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1N5bmMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlQXRvbShhdG9tLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRTZWxmO1xuICAgICAgfVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXRvbS5yZWFkKGdldHRlciwgb3B0aW9ucyk7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGxldCBjb250aW51ZVByb21pc2U7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgICB2YWx1ZS50aGVuKFxuICAgICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgICAgIHJlamVjdFByb21pc2UocHJvbWlzZSwgZSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc2V0QXRvbVZhbHVlKGF0b20sIHByb21pc2UsIGRlcFNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWVQcm9taXNlID0gKG5leHQpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbmV4dC50aGVuKFxuICAgICAgICAgICAgICAgICh2KSA9PiByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2KSxcbiAgICAgICAgICAgICAgICAoZSkgPT4gcmVqZWN0UHJvbWlzZShwcm9taXNlLCBlKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXNvbHZlKG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBwcm9taXNlLnN0YXR1cyA9IFwicGVuZGluZ1wiO1xuICAgICAgICByZWdpc3RlckNhbmNlbFByb21pc2UocHJvbWlzZSwgKG5leHQpID0+IHtcbiAgICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgY29udGludWVQcm9taXNlKG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyID09IG51bGwgPyB2b2lkIDAgOiBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2V0QXRvbVZhbHVlKGF0b20sIHByb21pc2UsIGRlcFNldCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0QXRvbVZhbHVlKGF0b20sIHZhbHVlLCBkZXBTZXQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0QXRvbUVycm9yKGF0b20sIGVycm9yLCBkZXBTZXQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc1N5bmMgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tID0gKGF0b20pID0+IHJldHVybkF0b21WYWx1ZShyZWFkQXRvbVN0YXRlKGF0b20pKTtcbiAgY29uc3QgYWRkQXRvbSA9IChhdG9tKSA9PiB7XG4gICAgbGV0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICBpZiAoIW1vdW50ZWQpIHtcbiAgICAgIG1vdW50ZWQgPSBtb3VudEF0b20oYXRvbSk7XG4gICAgfVxuICAgIHJldHVybiBtb3VudGVkO1xuICB9O1xuICBjb25zdCBjYW5Vbm1vdW50QXRvbSA9IChhdG9tLCBtb3VudGVkKSA9PiAhbW91bnRlZC5sLnNpemUgJiYgKCFtb3VudGVkLnQuc2l6ZSB8fCBtb3VudGVkLnQuc2l6ZSA9PT0gMSAmJiBtb3VudGVkLnQuaGFzKGF0b20pKTtcbiAgY29uc3QgZGVsQXRvbSA9IChhdG9tKSA9PiB7XG4gICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICAgIGlmIChtb3VudGVkICYmIGNhblVubW91bnRBdG9tKGF0b20sIG1vdW50ZWQpKSB7XG4gICAgICB1bm1vdW50QXRvbShhdG9tKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlY29tcHV0ZURlcGVuZGVudHMgPSAoYXRvbSkgPT4ge1xuICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLnQuZm9yRWFjaCgoZGVwZW5kZW50KSA9PiB7XG4gICAgICBpZiAoZGVwZW5kZW50ICE9PSBhdG9tKSB7XG4gICAgICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUoZGVwZW5kZW50KTtcbiAgICAgICAgY29uc3QgbmV4dEF0b21TdGF0ZSA9IHJlYWRBdG9tU3RhdGUoZGVwZW5kZW50KTtcbiAgICAgICAgaWYgKCFwcmV2QXRvbVN0YXRlIHx8ICFpc0VxdWFsQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUsIG5leHRBdG9tU3RhdGUpKSB7XG4gICAgICAgICAgcmVjb21wdXRlRGVwZW5kZW50cyhkZXBlbmRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHdyaXRlQXRvbVN0YXRlID0gKGF0b20sIC4uLmFyZ3MpID0+IHtcbiAgICBsZXQgaXNTeW5jID0gdHJ1ZTtcbiAgICBjb25zdCBnZXR0ZXIgPSAoYSkgPT4gcmV0dXJuQXRvbVZhbHVlKHJlYWRBdG9tU3RhdGUoYSkpO1xuICAgIGNvbnN0IHNldHRlciA9IChhLCAuLi5hcmdzMikgPT4ge1xuICAgICAgbGV0IHI7XG4gICAgICBpZiAoYSA9PT0gYXRvbSkge1xuICAgICAgICBpZiAoIWhhc0luaXRpYWxWYWx1ZShhKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0b20gbm90IHdyaXRhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUoYSk7XG4gICAgICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSBzZXRBdG9tVmFsdWUoYSwgYXJnczJbMF0pO1xuICAgICAgICBpZiAoIXByZXZBdG9tU3RhdGUgfHwgIWlzRXF1YWxBdG9tVmFsdWUocHJldkF0b21TdGF0ZSwgbmV4dEF0b21TdGF0ZSkpIHtcbiAgICAgICAgICByZWNvbXB1dGVEZXBlbmRlbnRzKGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByID0gd3JpdGVBdG9tU3RhdGUoYSwgLi4uYXJnczIpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1N5bmMpIHtcbiAgICAgICAgZmx1c2hQZW5kaW5nKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF0b20ud3JpdGUoZ2V0dGVyLCBzZXR0ZXIsIC4uLmFyZ3MpO1xuICAgIGlzU3luYyA9IGZhbHNlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIGNvbnN0IHdyaXRlQXRvbSA9IChhdG9tLCAuLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gd3JpdGVBdG9tU3RhdGUoYXRvbSwgLi4uYXJncyk7XG4gICAgZmx1c2hQZW5kaW5nKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgY29uc3QgbW91bnRBdG9tID0gKGF0b20sIGluaXRpYWxEZXBlbmRlbnQpID0+IHtcbiAgICBjb25zdCBtb3VudGVkID0ge1xuICAgICAgdDogbmV3IFNldChpbml0aWFsRGVwZW5kZW50ICYmIFtpbml0aWFsRGVwZW5kZW50XSksXG4gICAgICBsOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gICAgfTtcbiAgICBtb3VudGVkTWFwLnNldChhdG9tLCBtb3VudGVkKTtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBtb3VudGVkQXRvbXMuYWRkKGF0b20pO1xuICAgIH1cbiAgICByZWFkQXRvbVN0YXRlKGF0b20pLmQuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgY29uc3QgYU1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhKTtcbiAgICAgIGlmIChhTW91bnRlZCkge1xuICAgICAgICBhTW91bnRlZC50LmFkZChhdG9tKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhICE9PSBhdG9tKSB7XG4gICAgICAgICAgbW91bnRBdG9tKGEsIGF0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVhZEF0b21TdGF0ZShhdG9tKTtcbiAgICBpZiAoaXNBY3R1YWxseVdyaXRhYmxlQXRvbShhdG9tKSAmJiBhdG9tLm9uTW91bnQpIHtcbiAgICAgIGNvbnN0IG9uVW5tb3VudCA9IGF0b20ub25Nb3VudCgoLi4uYXJncykgPT4gd3JpdGVBdG9tKGF0b20sIC4uLmFyZ3MpKTtcbiAgICAgIGlmIChvblVubW91bnQpIHtcbiAgICAgICAgbW91bnRlZC51ID0gb25Vbm1vdW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW91bnRlZDtcbiAgfTtcbiAgY29uc3QgdW5tb3VudEF0b20gPSAoYXRvbSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvblVubW91bnQgPSAoX2EgPSBtb3VudGVkTWFwLmdldChhdG9tKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnU7XG4gICAgaWYgKG9uVW5tb3VudCkge1xuICAgICAgb25Vbm1vdW50KCk7XG4gICAgfVxuICAgIG1vdW50ZWRNYXAuZGVsZXRlKGF0b20pO1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIG1vdW50ZWRBdG9tcy5kZWxldGUoYXRvbSk7XG4gICAgfVxuICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZShhdG9tKTtcbiAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICBpZiAoaGFzUHJvbWlzZUF0b21WYWx1ZShhdG9tU3RhdGUpKSB7XG4gICAgICAgIGNhbmNlbFByb21pc2UoYXRvbVN0YXRlLnYpO1xuICAgICAgfVxuICAgICAgYXRvbVN0YXRlLmQuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgICBpZiAoYSAhPT0gYXRvbSkge1xuICAgICAgICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhKTtcbiAgICAgICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICAgICAgbW91bnRlZC50LmRlbGV0ZShhdG9tKTtcbiAgICAgICAgICAgIGlmIChjYW5Vbm1vdW50QXRvbShhLCBtb3VudGVkKSkge1xuICAgICAgICAgICAgICB1bm1vdW50QXRvbShhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbQnVnXSBjb3VsZCBub3QgZmluZCBhdG9tIHN0YXRlIHRvIHVubW91bnRcIiwgYXRvbSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudERlcGVuZGVuY2llcyA9IChhdG9tLCBhdG9tU3RhdGUsIHByZXZEZXBlbmRlbmNpZXMpID0+IHtcbiAgICBjb25zdCBkZXBTZXQgPSBuZXcgU2V0KGF0b21TdGF0ZS5kLmtleXMoKSk7XG4gICAgcHJldkRlcGVuZGVuY2llcyA9PSBudWxsID8gdm9pZCAwIDogcHJldkRlcGVuZGVuY2llcy5mb3JFYWNoKChfLCBhKSA9PiB7XG4gICAgICBpZiAoZGVwU2V0LmhhcyhhKSkge1xuICAgICAgICBkZXBTZXQuZGVsZXRlKGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoYSk7XG4gICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICBtb3VudGVkLnQuZGVsZXRlKGF0b20pO1xuICAgICAgICBpZiAoY2FuVW5tb3VudEF0b20oYSwgbW91bnRlZCkpIHtcbiAgICAgICAgICB1bm1vdW50QXRvbShhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGRlcFNldC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoYSk7XG4gICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICBtb3VudGVkLnQuYWRkKGF0b20pO1xuICAgICAgfSBlbHNlIGlmIChtb3VudGVkTWFwLmhhcyhhdG9tKSkge1xuICAgICAgICBtb3VudEF0b20oYSwgYXRvbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZsdXNoUGVuZGluZyA9ICgpID0+IHtcbiAgICB3aGlsZSAocGVuZGluZ01hcC5zaXplKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gQXJyYXkuZnJvbShwZW5kaW5nTWFwKTtcbiAgICAgIHBlbmRpbmdNYXAuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmcuZm9yRWFjaCgoW2F0b20sIHByZXZBdG9tU3RhdGVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZShhdG9tKTtcbiAgICAgICAgaWYgKGF0b21TdGF0ZSkge1xuICAgICAgICAgIGlmIChhdG9tU3RhdGUuZCAhPT0gKHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCkpIHtcbiAgICAgICAgICAgIG1vdW50RGVwZW5kZW5jaWVzKGF0b20sIGF0b21TdGF0ZSwgcHJldkF0b21TdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogcHJldkF0b21TdGF0ZS5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICAgICAgICAgIGlmIChtb3VudGVkICYmICEvLyBUT0RPIFRoaXMgc2VlbXMgcHJldHR5IGhhY2t5LiBIb3BlIHRvIGZpeCBpdC5cbiAgICAgICAgICAvLyBNYXliZSB3ZSBjb3VsZCBgbW91bnREZXBlbmRlbmNpZXNgIGluIGBzZXRBdG9tU3RhdGVgP1xuICAgICAgICAgIChwcmV2QXRvbVN0YXRlICYmICFoYXNQcm9taXNlQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUpICYmIChpc0VxdWFsQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUsIGF0b21TdGF0ZSkgfHwgaXNFcXVhbEF0b21FcnJvcihwcmV2QXRvbVN0YXRlLCBhdG9tU3RhdGUpKSkpIHtcbiAgICAgICAgICAgIG1vdW50ZWQubC5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltCdWddIG5vIGF0b20gc3RhdGUgdG8gZmx1c2hcIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBzdGF0ZUxpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKCkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc3Vic2NyaWJlQXRvbSA9IChhdG9tLCBsaXN0ZW5lcikgPT4ge1xuICAgIGNvbnN0IG1vdW50ZWQgPSBhZGRBdG9tKGF0b20pO1xuICAgIGZsdXNoUGVuZGluZygpO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IG1vdW50ZWQubDtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICBkZWxBdG9tKGF0b20pO1xuICAgIH07XG4gIH07XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiByZWFkQXRvbSxcbiAgICAgIHNldDogd3JpdGVBdG9tLFxuICAgICAgc3ViOiBzdWJzY3JpYmVBdG9tLFxuICAgICAgLy8gc3RvcmUgZGV2IG1ldGhvZHMgKHRoZXNlIGFyZSB0ZW50YXRpdmUgYW5kIHN1YmplY3QgdG8gY2hhbmdlKVxuICAgICAgZGV2X3N1YnNjcmliZV9zdGF0ZTogKGwpID0+IHtcbiAgICAgICAgc3RhdGVMaXN0ZW5lcnMuYWRkKGwpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHN0YXRlTGlzdGVuZXJzLmRlbGV0ZShsKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBkZXZfZ2V0X21vdW50ZWRfYXRvbXM6ICgpID0+IG1vdW50ZWRBdG9tcy52YWx1ZXMoKSxcbiAgICAgIGRldl9nZXRfYXRvbV9zdGF0ZTogKGEpID0+IGF0b21TdGF0ZU1hcC5nZXQoYSksXG4gICAgICBkZXZfZ2V0X21vdW50ZWQ6IChhKSA9PiBtb3VudGVkTWFwLmdldChhKSxcbiAgICAgIGRldl9yZXN0b3JlX2F0b21zOiAodmFsdWVzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2F0b20sIHZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICBpZiAoaGFzSW5pdGlhbFZhbHVlKGF0b20pKSB7XG4gICAgICAgICAgICBzZXRBdG9tVmFsdWUoYXRvbSwgdmFsdWUpO1xuICAgICAgICAgICAgcmVjb21wdXRlRGVwZW5kZW50cyhhdG9tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmx1c2hQZW5kaW5nKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldDogcmVhZEF0b20sXG4gICAgc2V0OiB3cml0ZUF0b20sXG4gICAgc3ViOiBzdWJzY3JpYmVBdG9tXG4gIH07XG59O1xubGV0IGRlZmF1bHRTdG9yZTtcbmNvbnN0IGdldERlZmF1bHRTdG9yZSA9ICgpID0+IHtcbiAgaWYgKCFkZWZhdWx0U3RvcmUpIHtcbiAgICBkZWZhdWx0U3RvcmUgPSBjcmVhdGVTdG9yZSgpO1xuICB9XG4gIHJldHVybiBkZWZhdWx0U3RvcmU7XG59O1xuXG5leHBvcnQgeyBhdG9tLCBjcmVhdGVTdG9yZSwgZ2V0RGVmYXVsdFN0b3JlIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/jotai/esm/vanilla.mjs\n");
5502
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"atom\": () => (/* binding */ atom),\n/* harmony export */ \"createStore\": () => (/* binding */ createStore),\n/* harmony export */ \"getDefaultStore\": () => (/* binding */ getDefaultStore)\n/* harmony export */ });\nlet keyCount = 0;\nfunction atom(read, write) {\n const key = `atom${++keyCount}`;\n const config = {\n toString: () => key\n };\n if (typeof read === \"function\") {\n config.read = read;\n } else {\n config.init = read;\n config.read = (get) => get(config);\n config.write = (get, set, arg) => set(\n config,\n typeof arg === \"function\" ? arg(get(config)) : arg\n );\n }\n if (write) {\n config.write = write;\n }\n return config;\n}\n\nconst hasInitialValue = (atom) => \"init\" in atom;\nconst isActuallyWritableAtom = (atom) => !!atom.write;\nconst cancelPromiseMap = /* @__PURE__ */ new WeakMap();\nconst registerCancelPromise = (promise, cancel) => {\n cancelPromiseMap.set(promise, cancel);\n promise.catch(() => {\n }).finally(() => cancelPromiseMap.delete(promise));\n};\nconst cancelPromise = (promise, next) => {\n const cancel = cancelPromiseMap.get(promise);\n if (cancel) {\n cancelPromiseMap.delete(promise);\n cancel(next);\n }\n};\nconst resolvePromise = (promise, value) => {\n promise.status = \"fulfilled\";\n promise.value = value;\n};\nconst rejectPromise = (promise, e) => {\n promise.status = \"rejected\";\n promise.reason = e;\n};\nconst isEqualAtomValue = (a, b) => \"v\" in a && \"v\" in b && Object.is(a.v, b.v);\nconst isEqualAtomError = (a, b) => \"e\" in a && \"e\" in b && Object.is(a.e, b.e);\nconst hasPromiseAtomValue = (a) => \"v\" in a && a.v instanceof Promise;\nconst returnAtomValue = (atomState) => {\n if (\"e\" in atomState) {\n throw atomState.e;\n }\n return atomState.v;\n};\nconst createStore = () => {\n const atomStateMap = /* @__PURE__ */ new WeakMap();\n const mountedMap = /* @__PURE__ */ new WeakMap();\n const pendingMap = /* @__PURE__ */ new Map();\n let stateListeners;\n let mountedAtoms;\n if (true) {\n stateListeners = /* @__PURE__ */ new Set();\n mountedAtoms = /* @__PURE__ */ new Set();\n }\n const getAtomState = (atom) => atomStateMap.get(atom);\n const setAtomState = (atom, atomState) => {\n if (true) {\n Object.freeze(atomState);\n }\n const prevAtomState = atomStateMap.get(atom);\n atomStateMap.set(atom, atomState);\n if (!pendingMap.has(atom)) {\n pendingMap.set(atom, prevAtomState);\n }\n if (prevAtomState && hasPromiseAtomValue(prevAtomState)) {\n const next = \"v\" in atomState ? atomState.v instanceof Promise ? atomState.v : Promise.resolve(atomState.v) : Promise.reject(atomState.e);\n cancelPromise(prevAtomState.v, next);\n }\n };\n const updateDependencies = (atom, nextAtomState, depSet) => {\n const dependencies = /* @__PURE__ */ new Map();\n let changed = false;\n depSet.forEach((a) => {\n const aState = a === atom ? nextAtomState : getAtomState(a);\n if (aState) {\n dependencies.set(a, aState);\n if (nextAtomState.d.get(a) !== aState) {\n changed = true;\n }\n } else if (true) {\n console.warn(\"[Bug] atom state not found\");\n }\n });\n if (changed || nextAtomState.d.size !== dependencies.size) {\n nextAtomState.d = dependencies;\n }\n };\n const setAtomValue = (atom, value, depSet) => {\n const prevAtomState = getAtomState(atom);\n const nextAtomState = {\n d: (prevAtomState == null ? void 0 : prevAtomState.d) || /* @__PURE__ */ new Map(),\n v: value\n };\n if (depSet) {\n updateDependencies(atom, nextAtomState, depSet);\n }\n if (prevAtomState && isEqualAtomValue(prevAtomState, nextAtomState) && prevAtomState.d === nextAtomState.d) {\n return prevAtomState;\n }\n setAtomState(atom, nextAtomState);\n return nextAtomState;\n };\n const setAtomError = (atom, error, depSet) => {\n const prevAtomState = getAtomState(atom);\n const nextAtomState = {\n d: (prevAtomState == null ? void 0 : prevAtomState.d) || /* @__PURE__ */ new Map(),\n e: error\n };\n if (depSet) {\n updateDependencies(atom, nextAtomState, depSet);\n }\n if (prevAtomState && isEqualAtomError(prevAtomState, nextAtomState) && prevAtomState.d === nextAtomState.d) {\n return prevAtomState;\n }\n setAtomState(atom, nextAtomState);\n return nextAtomState;\n };\n const readAtomState = (atom) => {\n const atomState = getAtomState(atom);\n if (atomState) {\n atomState.d.forEach((_, a) => {\n if (a !== atom && !mountedMap.has(a)) {\n readAtomState(a);\n }\n });\n if (Array.from(atomState.d).every(\n ([a, s]) => a === atom || getAtomState(a) === s\n )) {\n return atomState;\n }\n }\n const depSet = /* @__PURE__ */ new Set();\n let isSync = true;\n const getter = (a) => {\n depSet.add(a);\n if (a === atom) {\n const aState2 = getAtomState(a);\n if (aState2) {\n return returnAtomValue(aState2);\n }\n if (hasInitialValue(a)) {\n return a.init;\n }\n throw new Error(\"no atom init\");\n }\n const aState = readAtomState(a);\n return returnAtomValue(aState);\n };\n let controller;\n let setSelf;\n const options = {\n get signal() {\n if (!controller) {\n controller = new AbortController();\n }\n return controller.signal;\n },\n get setSelf() {\n if ( true && !isActuallyWritableAtom(atom)) {\n console.warn(\"setSelf function cannot be used with read-only atom\");\n }\n if (!setSelf && isActuallyWritableAtom(atom)) {\n setSelf = (...args) => {\n if ( true && isSync) {\n console.warn(\"setSelf function cannot be called in sync\");\n }\n if (!isSync) {\n return writeAtom(atom, ...args);\n }\n };\n }\n return setSelf;\n }\n };\n try {\n const value = atom.read(getter, options);\n if (value instanceof Promise) {\n let continuePromise;\n const promise = new Promise((resolve, reject) => {\n let settled = false;\n value.then(\n (v) => {\n if (!settled) {\n resolvePromise(promise, v);\n resolve(v);\n }\n },\n (e) => {\n if (!settled) {\n rejectPromise(promise, e);\n reject(e);\n }\n }\n ).finally(() => {\n if (!settled) {\n settled = true;\n setAtomValue(atom, promise, depSet);\n }\n });\n continuePromise = (next) => {\n if (!settled) {\n settled = true;\n next.then(\n (v) => resolvePromise(promise, v),\n (e) => rejectPromise(promise, e)\n );\n resolve(next);\n }\n };\n });\n promise.status = \"pending\";\n registerCancelPromise(promise, (next) => {\n if (next) {\n continuePromise(next);\n }\n controller == null ? void 0 : controller.abort();\n });\n return setAtomValue(atom, promise, depSet);\n }\n return setAtomValue(atom, value, depSet);\n } catch (error) {\n return setAtomError(atom, error, depSet);\n } finally {\n isSync = false;\n }\n };\n const readAtom = (atom) => returnAtomValue(readAtomState(atom));\n const addAtom = (atom) => {\n let mounted = mountedMap.get(atom);\n if (!mounted) {\n mounted = mountAtom(atom);\n }\n return mounted;\n };\n const canUnmountAtom = (atom, mounted) => !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));\n const delAtom = (atom) => {\n const mounted = mountedMap.get(atom);\n if (mounted && canUnmountAtom(atom, mounted)) {\n unmountAtom(atom);\n }\n };\n const recomputeDependents = (atom) => {\n const mounted = mountedMap.get(atom);\n mounted == null ? void 0 : mounted.t.forEach((dependent) => {\n if (dependent !== atom) {\n const prevAtomState = getAtomState(dependent);\n const nextAtomState = readAtomState(dependent);\n if (!prevAtomState || !isEqualAtomValue(prevAtomState, nextAtomState)) {\n recomputeDependents(dependent);\n }\n }\n });\n };\n const writeAtomState = (atom, ...args) => {\n let isSync = true;\n const getter = (a) => returnAtomValue(readAtomState(a));\n const setter = (a, ...args2) => {\n let r;\n if (a === atom) {\n if (!hasInitialValue(a)) {\n throw new Error(\"atom not writable\");\n }\n const prevAtomState = getAtomState(a);\n const nextAtomState = setAtomValue(a, args2[0]);\n if (!prevAtomState || !isEqualAtomValue(prevAtomState, nextAtomState)) {\n recomputeDependents(a);\n }\n } else {\n r = writeAtomState(a, ...args2);\n }\n if (!isSync) {\n flushPending();\n }\n return r;\n };\n const result = atom.write(getter, setter, ...args);\n isSync = false;\n return result;\n };\n const writeAtom = (atom, ...args) => {\n const result = writeAtomState(atom, ...args);\n flushPending();\n return result;\n };\n const mountAtom = (atom, initialDependent) => {\n const mounted = {\n t: new Set(initialDependent && [initialDependent]),\n l: /* @__PURE__ */ new Set()\n };\n mountedMap.set(atom, mounted);\n if (true) {\n mountedAtoms.add(atom);\n }\n readAtomState(atom).d.forEach((_, a) => {\n const aMounted = mountedMap.get(a);\n if (aMounted) {\n aMounted.t.add(atom);\n } else {\n if (a !== atom) {\n mountAtom(a, atom);\n }\n }\n });\n readAtomState(atom);\n if (isActuallyWritableAtom(atom) && atom.onMount) {\n const onUnmount = atom.onMount((...args) => writeAtom(atom, ...args));\n if (onUnmount) {\n mounted.u = onUnmount;\n }\n }\n return mounted;\n };\n const unmountAtom = (atom) => {\n var _a;\n const onUnmount = (_a = mountedMap.get(atom)) == null ? void 0 : _a.u;\n if (onUnmount) {\n onUnmount();\n }\n mountedMap.delete(atom);\n if (true) {\n mountedAtoms.delete(atom);\n }\n const atomState = getAtomState(atom);\n if (atomState) {\n if (hasPromiseAtomValue(atomState)) {\n cancelPromise(atomState.v);\n }\n atomState.d.forEach((_, a) => {\n if (a !== atom) {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(a);\n }\n }\n }\n });\n } else if (true) {\n console.warn(\"[Bug] could not find atom state to unmount\", atom);\n }\n };\n const mountDependencies = (atom, atomState, prevDependencies) => {\n const depSet = new Set(atomState.d.keys());\n prevDependencies == null ? void 0 : prevDependencies.forEach((_, a) => {\n if (depSet.has(a)) {\n depSet.delete(a);\n return;\n }\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.delete(atom);\n if (canUnmountAtom(a, mounted)) {\n unmountAtom(a);\n }\n }\n });\n depSet.forEach((a) => {\n const mounted = mountedMap.get(a);\n if (mounted) {\n mounted.t.add(atom);\n } else if (mountedMap.has(atom)) {\n mountAtom(a, atom);\n }\n });\n };\n const flushPending = () => {\n while (pendingMap.size) {\n const pending = Array.from(pendingMap);\n pendingMap.clear();\n pending.forEach(([atom, prevAtomState]) => {\n const atomState = getAtomState(atom);\n if (atomState) {\n if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n }\n const mounted = mountedMap.get(atom);\n if (mounted && !// TODO This seems pretty hacky. Hope to fix it.\n // Maybe we could `mountDependencies` in `setAtomState`?\n (prevAtomState && !hasPromiseAtomValue(prevAtomState) && (isEqualAtomValue(prevAtomState, atomState) || isEqualAtomError(prevAtomState, atomState)))) {\n mounted.l.forEach((listener) => listener());\n }\n } else if (true) {\n console.warn(\"[Bug] no atom state to flush\");\n }\n });\n }\n if (true) {\n stateListeners.forEach((l) => l());\n }\n };\n const subscribeAtom = (atom, listener) => {\n const mounted = addAtom(atom);\n flushPending();\n const listeners = mounted.l;\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n delAtom(atom);\n };\n };\n if (true) {\n return {\n get: readAtom,\n set: writeAtom,\n sub: subscribeAtom,\n // store dev methods (these are tentative and subject to change)\n dev_subscribe_state: (l) => {\n stateListeners.add(l);\n return () => {\n stateListeners.delete(l);\n };\n },\n dev_get_mounted_atoms: () => mountedAtoms.values(),\n dev_get_atom_state: (a) => atomStateMap.get(a),\n dev_get_mounted: (a) => mountedMap.get(a),\n dev_restore_atoms: (values) => {\n for (const [atom, value] of values) {\n if (hasInitialValue(atom)) {\n setAtomValue(atom, value);\n recomputeDependents(atom);\n }\n }\n flushPending();\n }\n };\n }\n return {\n get: readAtom,\n set: writeAtom,\n sub: subscribeAtom\n };\n};\nlet defaultStore;\nconst getDefaultStore = () => {\n if (!defaultStore) {\n defaultStore = createStore();\n }\n return defaultStore;\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pvdGFpL2VzbS92YW5pbGxhLm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQ0EscUJBQXFCLFdBQVc7QUFDaEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTSxJQUEwRDtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsU0FBUyxJQUEwRDtBQUMzRTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxZQUFZLEtBQTBEO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0JBQWdCLEtBQTBEO0FBQzFFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxXQUFXO0FBQ1g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBLE1BQU07QUFDTjtBQUNBLE1BQU07QUFDTjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxRQUFRLElBQTBEO0FBQ2xFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsSUFBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU87QUFDUCxNQUFNLFNBQVMsSUFBMEQ7QUFDekU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxVQUFVLFNBQVMsSUFBMEQ7QUFDN0U7QUFDQTtBQUNBLE9BQU87QUFDUDtBQUNBLFFBQVEsSUFBMEQ7QUFDbEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFOEMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2pvdGFpL2VzbS92YW5pbGxhLm1qcz9lZTg0Il0sInNvdXJjZXNDb250ZW50IjpbImxldCBrZXlDb3VudCA9IDA7XG5mdW5jdGlvbiBhdG9tKHJlYWQsIHdyaXRlKSB7XG4gIGNvbnN0IGtleSA9IGBhdG9tJHsrK2tleUNvdW50fWA7XG4gIGNvbnN0IGNvbmZpZyA9IHtcbiAgICB0b1N0cmluZzogKCkgPT4ga2V5XG4gIH07XG4gIGlmICh0eXBlb2YgcmVhZCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uZmlnLnJlYWQgPSByZWFkO1xuICB9IGVsc2Uge1xuICAgIGNvbmZpZy5pbml0ID0gcmVhZDtcbiAgICBjb25maWcucmVhZCA9IChnZXQpID0+IGdldChjb25maWcpO1xuICAgIGNvbmZpZy53cml0ZSA9IChnZXQsIHNldCwgYXJnKSA9PiBzZXQoXG4gICAgICBjb25maWcsXG4gICAgICB0eXBlb2YgYXJnID09PSBcImZ1bmN0aW9uXCIgPyBhcmcoZ2V0KGNvbmZpZykpIDogYXJnXG4gICAgKTtcbiAgfVxuICBpZiAod3JpdGUpIHtcbiAgICBjb25maWcud3JpdGUgPSB3cml0ZTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5jb25zdCBoYXNJbml0aWFsVmFsdWUgPSAoYXRvbSkgPT4gXCJpbml0XCIgaW4gYXRvbTtcbmNvbnN0IGlzQWN0dWFsbHlXcml0YWJsZUF0b20gPSAoYXRvbSkgPT4gISFhdG9tLndyaXRlO1xuY29uc3QgY2FuY2VsUHJvbWlzZU1hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgV2Vha01hcCgpO1xuY29uc3QgcmVnaXN0ZXJDYW5jZWxQcm9taXNlID0gKHByb21pc2UsIGNhbmNlbCkgPT4ge1xuICBjYW5jZWxQcm9taXNlTWFwLnNldChwcm9taXNlLCBjYW5jZWwpO1xuICBwcm9taXNlLmNhdGNoKCgpID0+IHtcbiAgfSkuZmluYWxseSgoKSA9PiBjYW5jZWxQcm9taXNlTWFwLmRlbGV0ZShwcm9taXNlKSk7XG59O1xuY29uc3QgY2FuY2VsUHJvbWlzZSA9IChwcm9taXNlLCBuZXh0KSA9PiB7XG4gIGNvbnN0IGNhbmNlbCA9IGNhbmNlbFByb21pc2VNYXAuZ2V0KHByb21pc2UpO1xuICBpZiAoY2FuY2VsKSB7XG4gICAgY2FuY2VsUHJvbWlzZU1hcC5kZWxldGUocHJvbWlzZSk7XG4gICAgY2FuY2VsKG5leHQpO1xuICB9XG59O1xuY29uc3QgcmVzb2x2ZVByb21pc2UgPSAocHJvbWlzZSwgdmFsdWUpID0+IHtcbiAgcHJvbWlzZS5zdGF0dXMgPSBcImZ1bGZpbGxlZFwiO1xuICBwcm9taXNlLnZhbHVlID0gdmFsdWU7XG59O1xuY29uc3QgcmVqZWN0UHJvbWlzZSA9IChwcm9taXNlLCBlKSA9PiB7XG4gIHByb21pc2Uuc3RhdHVzID0gXCJyZWplY3RlZFwiO1xuICBwcm9taXNlLnJlYXNvbiA9IGU7XG59O1xuY29uc3QgaXNFcXVhbEF0b21WYWx1ZSA9IChhLCBiKSA9PiBcInZcIiBpbiBhICYmIFwidlwiIGluIGIgJiYgT2JqZWN0LmlzKGEudiwgYi52KTtcbmNvbnN0IGlzRXF1YWxBdG9tRXJyb3IgPSAoYSwgYikgPT4gXCJlXCIgaW4gYSAmJiBcImVcIiBpbiBiICYmIE9iamVjdC5pcyhhLmUsIGIuZSk7XG5jb25zdCBoYXNQcm9taXNlQXRvbVZhbHVlID0gKGEpID0+IFwidlwiIGluIGEgJiYgYS52IGluc3RhbmNlb2YgUHJvbWlzZTtcbmNvbnN0IHJldHVybkF0b21WYWx1ZSA9IChhdG9tU3RhdGUpID0+IHtcbiAgaWYgKFwiZVwiIGluIGF0b21TdGF0ZSkge1xuICAgIHRocm93IGF0b21TdGF0ZS5lO1xuICB9XG4gIHJldHVybiBhdG9tU3RhdGUudjtcbn07XG5jb25zdCBjcmVhdGVTdG9yZSA9ICgpID0+IHtcbiAgY29uc3QgYXRvbVN0YXRlTWFwID0gLyogQF9fUFVSRV9fICovIG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IG1vdW50ZWRNYXAgPSAvKiBAX19QVVJFX18gKi8gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgcGVuZGluZ01hcCA9IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCk7XG4gIGxldCBzdGF0ZUxpc3RlbmVycztcbiAgbGV0IG1vdW50ZWRBdG9tcztcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHN0YXRlTGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgICBtb3VudGVkQXRvbXMgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICB9XG4gIGNvbnN0IGdldEF0b21TdGF0ZSA9IChhdG9tKSA9PiBhdG9tU3RhdGVNYXAuZ2V0KGF0b20pO1xuICBjb25zdCBzZXRBdG9tU3RhdGUgPSAoYXRvbSwgYXRvbVN0YXRlKSA9PiB7XG4gICAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgT2JqZWN0LmZyZWV6ZShhdG9tU3RhdGUpO1xuICAgIH1cbiAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gYXRvbVN0YXRlTWFwLmdldChhdG9tKTtcbiAgICBhdG9tU3RhdGVNYXAuc2V0KGF0b20sIGF0b21TdGF0ZSk7XG4gICAgaWYgKCFwZW5kaW5nTWFwLmhhcyhhdG9tKSkge1xuICAgICAgcGVuZGluZ01hcC5zZXQoYXRvbSwgcHJldkF0b21TdGF0ZSk7XG4gICAgfVxuICAgIGlmIChwcmV2QXRvbVN0YXRlICYmIGhhc1Byb21pc2VBdG9tVmFsdWUocHJldkF0b21TdGF0ZSkpIHtcbiAgICAgIGNvbnN0IG5leHQgPSBcInZcIiBpbiBhdG9tU3RhdGUgPyBhdG9tU3RhdGUudiBpbnN0YW5jZW9mIFByb21pc2UgPyBhdG9tU3RhdGUudiA6IFByb21pc2UucmVzb2x2ZShhdG9tU3RhdGUudikgOiBQcm9taXNlLnJlamVjdChhdG9tU3RhdGUuZSk7XG4gICAgICBjYW5jZWxQcm9taXNlKHByZXZBdG9tU3RhdGUudiwgbmV4dCk7XG4gICAgfVxuICB9O1xuICBjb25zdCB1cGRhdGVEZXBlbmRlbmNpZXMgPSAoYXRvbSwgbmV4dEF0b21TdGF0ZSwgZGVwU2V0KSA9PiB7XG4gICAgY29uc3QgZGVwZW5kZW5jaWVzID0gLyogQF9fUFVSRV9fICovIG5ldyBNYXAoKTtcbiAgICBsZXQgY2hhbmdlZCA9IGZhbHNlO1xuICAgIGRlcFNldC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zdCBhU3RhdGUgPSBhID09PSBhdG9tID8gbmV4dEF0b21TdGF0ZSA6IGdldEF0b21TdGF0ZShhKTtcbiAgICAgIGlmIChhU3RhdGUpIHtcbiAgICAgICAgZGVwZW5kZW5jaWVzLnNldChhLCBhU3RhdGUpO1xuICAgICAgICBpZiAobmV4dEF0b21TdGF0ZS5kLmdldChhKSAhPT0gYVN0YXRlKSB7XG4gICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcIltCdWddIGF0b20gc3RhdGUgbm90IGZvdW5kXCIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChjaGFuZ2VkIHx8IG5leHRBdG9tU3RhdGUuZC5zaXplICE9PSBkZXBlbmRlbmNpZXMuc2l6ZSkge1xuICAgICAgbmV4dEF0b21TdGF0ZS5kID0gZGVwZW5kZW5jaWVzO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc2V0QXRvbVZhbHVlID0gKGF0b20sIHZhbHVlLCBkZXBTZXQpID0+IHtcbiAgICBjb25zdCBwcmV2QXRvbVN0YXRlID0gZ2V0QXRvbVN0YXRlKGF0b20pO1xuICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSB7XG4gICAgICBkOiAocHJldkF0b21TdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogcHJldkF0b21TdGF0ZS5kKSB8fCAvKiBAX19QVVJFX18gKi8gbmV3IE1hcCgpLFxuICAgICAgdjogdmFsdWVcbiAgICB9O1xuICAgIGlmIChkZXBTZXQpIHtcbiAgICAgIHVwZGF0ZURlcGVuZGVuY2llcyhhdG9tLCBuZXh0QXRvbVN0YXRlLCBkZXBTZXQpO1xuICAgIH1cbiAgICBpZiAocHJldkF0b21TdGF0ZSAmJiBpc0VxdWFsQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUsIG5leHRBdG9tU3RhdGUpICYmIHByZXZBdG9tU3RhdGUuZCA9PT0gbmV4dEF0b21TdGF0ZS5kKSB7XG4gICAgICByZXR1cm4gcHJldkF0b21TdGF0ZTtcbiAgICB9XG4gICAgc2V0QXRvbVN0YXRlKGF0b20sIG5leHRBdG9tU3RhdGUpO1xuICAgIHJldHVybiBuZXh0QXRvbVN0YXRlO1xuICB9O1xuICBjb25zdCBzZXRBdG9tRXJyb3IgPSAoYXRvbSwgZXJyb3IsIGRlcFNldCkgPT4ge1xuICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUoYXRvbSk7XG4gICAgY29uc3QgbmV4dEF0b21TdGF0ZSA9IHtcbiAgICAgIGQ6IChwcmV2QXRvbVN0YXRlID09IG51bGwgPyB2b2lkIDAgOiBwcmV2QXRvbVN0YXRlLmQpIHx8IC8qIEBfX1BVUkVfXyAqLyBuZXcgTWFwKCksXG4gICAgICBlOiBlcnJvclxuICAgIH07XG4gICAgaWYgKGRlcFNldCkge1xuICAgICAgdXBkYXRlRGVwZW5kZW5jaWVzKGF0b20sIG5leHRBdG9tU3RhdGUsIGRlcFNldCk7XG4gICAgfVxuICAgIGlmIChwcmV2QXRvbVN0YXRlICYmIGlzRXF1YWxBdG9tRXJyb3IocHJldkF0b21TdGF0ZSwgbmV4dEF0b21TdGF0ZSkgJiYgcHJldkF0b21TdGF0ZS5kID09PSBuZXh0QXRvbVN0YXRlLmQpIHtcbiAgICAgIHJldHVybiBwcmV2QXRvbVN0YXRlO1xuICAgIH1cbiAgICBzZXRBdG9tU3RhdGUoYXRvbSwgbmV4dEF0b21TdGF0ZSk7XG4gICAgcmV0dXJuIG5leHRBdG9tU3RhdGU7XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tU3RhdGUgPSAoYXRvbSkgPT4ge1xuICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZShhdG9tKTtcbiAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICBhdG9tU3RhdGUuZC5mb3JFYWNoKChfLCBhKSA9PiB7XG4gICAgICAgIGlmIChhICE9PSBhdG9tICYmICFtb3VudGVkTWFwLmhhcyhhKSkge1xuICAgICAgICAgIHJlYWRBdG9tU3RhdGUoYSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgaWYgKEFycmF5LmZyb20oYXRvbVN0YXRlLmQpLmV2ZXJ5KFxuICAgICAgICAoW2EsIHNdKSA9PiBhID09PSBhdG9tIHx8IGdldEF0b21TdGF0ZShhKSA9PT0gc1xuICAgICAgKSkge1xuICAgICAgICByZXR1cm4gYXRvbVN0YXRlO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkZXBTZXQgPSAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpO1xuICAgIGxldCBpc1N5bmMgPSB0cnVlO1xuICAgIGNvbnN0IGdldHRlciA9IChhKSA9PiB7XG4gICAgICBkZXBTZXQuYWRkKGEpO1xuICAgICAgaWYgKGEgPT09IGF0b20pIHtcbiAgICAgICAgY29uc3QgYVN0YXRlMiA9IGdldEF0b21TdGF0ZShhKTtcbiAgICAgICAgaWYgKGFTdGF0ZTIpIHtcbiAgICAgICAgICByZXR1cm4gcmV0dXJuQXRvbVZhbHVlKGFTdGF0ZTIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNJbml0aWFsVmFsdWUoYSkpIHtcbiAgICAgICAgICByZXR1cm4gYS5pbml0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIm5vIGF0b20gaW5pdFwiKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFTdGF0ZSA9IHJlYWRBdG9tU3RhdGUoYSk7XG4gICAgICByZXR1cm4gcmV0dXJuQXRvbVZhbHVlKGFTdGF0ZSk7XG4gICAgfTtcbiAgICBsZXQgY29udHJvbGxlcjtcbiAgICBsZXQgc2V0U2VsZjtcbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgZ2V0IHNpZ25hbCgpIHtcbiAgICAgICAgaWYgKCFjb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB9LFxuICAgICAgZ2V0IHNldFNlbGYoKSB7XG4gICAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgIWlzQWN0dWFsbHlXcml0YWJsZUF0b20oYXRvbSkpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJzZXRTZWxmIGZ1bmN0aW9uIGNhbm5vdCBiZSB1c2VkIHdpdGggcmVhZC1vbmx5IGF0b21cIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzZXRTZWxmICYmIGlzQWN0dWFsbHlXcml0YWJsZUF0b20oYXRvbSkpIHtcbiAgICAgICAgICBzZXRTZWxmID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIgJiYgaXNTeW5jKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcInNldFNlbGYgZnVuY3Rpb24gY2Fubm90IGJlIGNhbGxlZCBpbiBzeW5jXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1N5bmMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlQXRvbShhdG9tLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzZXRTZWxmO1xuICAgICAgfVxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYXRvbS5yZWFkKGdldHRlciwgb3B0aW9ucyk7XG4gICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgIGxldCBjb250aW51ZVByb21pc2U7XG4gICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgbGV0IHNldHRsZWQgPSBmYWxzZTtcbiAgICAgICAgICB2YWx1ZS50aGVuKFxuICAgICAgICAgICAgKHYpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFzZXR0bGVkKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgdik7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh2KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgICAgIHJlamVjdFByb21pc2UocHJvbWlzZSwgZSk7XG4gICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc2V0QXRvbVZhbHVlKGF0b20sIHByb21pc2UsIGRlcFNldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWVQcm9taXNlID0gKG5leHQpID0+IHtcbiAgICAgICAgICAgIGlmICghc2V0dGxlZCkge1xuICAgICAgICAgICAgICBzZXR0bGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgbmV4dC50aGVuKFxuICAgICAgICAgICAgICAgICh2KSA9PiByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2KSxcbiAgICAgICAgICAgICAgICAoZSkgPT4gcmVqZWN0UHJvbWlzZShwcm9taXNlLCBlKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXNvbHZlKG5leHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0pO1xuICAgICAgICBwcm9taXNlLnN0YXR1cyA9IFwicGVuZGluZ1wiO1xuICAgICAgICByZWdpc3RlckNhbmNlbFByb21pc2UocHJvbWlzZSwgKG5leHQpID0+IHtcbiAgICAgICAgICBpZiAobmV4dCkge1xuICAgICAgICAgICAgY29udGludWVQcm9taXNlKG5leHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250cm9sbGVyID09IG51bGwgPyB2b2lkIDAgOiBjb250cm9sbGVyLmFib3J0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gc2V0QXRvbVZhbHVlKGF0b20sIHByb21pc2UsIGRlcFNldCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2V0QXRvbVZhbHVlKGF0b20sIHZhbHVlLCBkZXBTZXQpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gc2V0QXRvbUVycm9yKGF0b20sIGVycm9yLCBkZXBTZXQpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBpc1N5bmMgPSBmYWxzZTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlYWRBdG9tID0gKGF0b20pID0+IHJldHVybkF0b21WYWx1ZShyZWFkQXRvbVN0YXRlKGF0b20pKTtcbiAgY29uc3QgYWRkQXRvbSA9IChhdG9tKSA9PiB7XG4gICAgbGV0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICBpZiAoIW1vdW50ZWQpIHtcbiAgICAgIG1vdW50ZWQgPSBtb3VudEF0b20oYXRvbSk7XG4gICAgfVxuICAgIHJldHVybiBtb3VudGVkO1xuICB9O1xuICBjb25zdCBjYW5Vbm1vdW50QXRvbSA9IChhdG9tLCBtb3VudGVkKSA9PiAhbW91bnRlZC5sLnNpemUgJiYgKCFtb3VudGVkLnQuc2l6ZSB8fCBtb3VudGVkLnQuc2l6ZSA9PT0gMSAmJiBtb3VudGVkLnQuaGFzKGF0b20pKTtcbiAgY29uc3QgZGVsQXRvbSA9IChhdG9tKSA9PiB7XG4gICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICAgIGlmIChtb3VudGVkICYmIGNhblVubW91bnRBdG9tKGF0b20sIG1vdW50ZWQpKSB7XG4gICAgICB1bm1vdW50QXRvbShhdG9tKTtcbiAgICB9XG4gIH07XG4gIGNvbnN0IHJlY29tcHV0ZURlcGVuZGVudHMgPSAoYXRvbSkgPT4ge1xuICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhdG9tKTtcbiAgICBtb3VudGVkID09IG51bGwgPyB2b2lkIDAgOiBtb3VudGVkLnQuZm9yRWFjaCgoZGVwZW5kZW50KSA9PiB7XG4gICAgICBpZiAoZGVwZW5kZW50ICE9PSBhdG9tKSB7XG4gICAgICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUoZGVwZW5kZW50KTtcbiAgICAgICAgY29uc3QgbmV4dEF0b21TdGF0ZSA9IHJlYWRBdG9tU3RhdGUoZGVwZW5kZW50KTtcbiAgICAgICAgaWYgKCFwcmV2QXRvbVN0YXRlIHx8ICFpc0VxdWFsQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUsIG5leHRBdG9tU3RhdGUpKSB7XG4gICAgICAgICAgcmVjb21wdXRlRGVwZW5kZW50cyhkZXBlbmRlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IHdyaXRlQXRvbVN0YXRlID0gKGF0b20sIC4uLmFyZ3MpID0+IHtcbiAgICBsZXQgaXNTeW5jID0gdHJ1ZTtcbiAgICBjb25zdCBnZXR0ZXIgPSAoYSkgPT4gcmV0dXJuQXRvbVZhbHVlKHJlYWRBdG9tU3RhdGUoYSkpO1xuICAgIGNvbnN0IHNldHRlciA9IChhLCAuLi5hcmdzMikgPT4ge1xuICAgICAgbGV0IHI7XG4gICAgICBpZiAoYSA9PT0gYXRvbSkge1xuICAgICAgICBpZiAoIWhhc0luaXRpYWxWYWx1ZShhKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcImF0b20gbm90IHdyaXRhYmxlXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByZXZBdG9tU3RhdGUgPSBnZXRBdG9tU3RhdGUoYSk7XG4gICAgICAgIGNvbnN0IG5leHRBdG9tU3RhdGUgPSBzZXRBdG9tVmFsdWUoYSwgYXJnczJbMF0pO1xuICAgICAgICBpZiAoIXByZXZBdG9tU3RhdGUgfHwgIWlzRXF1YWxBdG9tVmFsdWUocHJldkF0b21TdGF0ZSwgbmV4dEF0b21TdGF0ZSkpIHtcbiAgICAgICAgICByZWNvbXB1dGVEZXBlbmRlbnRzKGEpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByID0gd3JpdGVBdG9tU3RhdGUoYSwgLi4uYXJnczIpO1xuICAgICAgfVxuICAgICAgaWYgKCFpc1N5bmMpIHtcbiAgICAgICAgZmx1c2hQZW5kaW5nKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcjtcbiAgICB9O1xuICAgIGNvbnN0IHJlc3VsdCA9IGF0b20ud3JpdGUoZ2V0dGVyLCBzZXR0ZXIsIC4uLmFyZ3MpO1xuICAgIGlzU3luYyA9IGZhbHNlO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIGNvbnN0IHdyaXRlQXRvbSA9IChhdG9tLCAuLi5hcmdzKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gd3JpdGVBdG9tU3RhdGUoYXRvbSwgLi4uYXJncyk7XG4gICAgZmx1c2hQZW5kaW5nKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgY29uc3QgbW91bnRBdG9tID0gKGF0b20sIGluaXRpYWxEZXBlbmRlbnQpID0+IHtcbiAgICBjb25zdCBtb3VudGVkID0ge1xuICAgICAgdDogbmV3IFNldChpbml0aWFsRGVwZW5kZW50ICYmIFtpbml0aWFsRGVwZW5kZW50XSksXG4gICAgICBsOiAvKiBAX19QVVJFX18gKi8gbmV3IFNldCgpXG4gICAgfTtcbiAgICBtb3VudGVkTWFwLnNldChhdG9tLCBtb3VudGVkKTtcbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBtb3VudGVkQXRvbXMuYWRkKGF0b20pO1xuICAgIH1cbiAgICByZWFkQXRvbVN0YXRlKGF0b20pLmQuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgY29uc3QgYU1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhKTtcbiAgICAgIGlmIChhTW91bnRlZCkge1xuICAgICAgICBhTW91bnRlZC50LmFkZChhdG9tKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChhICE9PSBhdG9tKSB7XG4gICAgICAgICAgbW91bnRBdG9tKGEsIGF0b20pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVhZEF0b21TdGF0ZShhdG9tKTtcbiAgICBpZiAoaXNBY3R1YWxseVdyaXRhYmxlQXRvbShhdG9tKSAmJiBhdG9tLm9uTW91bnQpIHtcbiAgICAgIGNvbnN0IG9uVW5tb3VudCA9IGF0b20ub25Nb3VudCgoLi4uYXJncykgPT4gd3JpdGVBdG9tKGF0b20sIC4uLmFyZ3MpKTtcbiAgICAgIGlmIChvblVubW91bnQpIHtcbiAgICAgICAgbW91bnRlZC51ID0gb25Vbm1vdW50O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbW91bnRlZDtcbiAgfTtcbiAgY29uc3QgdW5tb3VudEF0b20gPSAoYXRvbSkgPT4ge1xuICAgIHZhciBfYTtcbiAgICBjb25zdCBvblVubW91bnQgPSAoX2EgPSBtb3VudGVkTWFwLmdldChhdG9tKSkgPT0gbnVsbCA/IHZvaWQgMCA6IF9hLnU7XG4gICAgaWYgKG9uVW5tb3VudCkge1xuICAgICAgb25Vbm1vdW50KCk7XG4gICAgfVxuICAgIG1vdW50ZWRNYXAuZGVsZXRlKGF0b20pO1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIG1vdW50ZWRBdG9tcy5kZWxldGUoYXRvbSk7XG4gICAgfVxuICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZShhdG9tKTtcbiAgICBpZiAoYXRvbVN0YXRlKSB7XG4gICAgICBpZiAoaGFzUHJvbWlzZUF0b21WYWx1ZShhdG9tU3RhdGUpKSB7XG4gICAgICAgIGNhbmNlbFByb21pc2UoYXRvbVN0YXRlLnYpO1xuICAgICAgfVxuICAgICAgYXRvbVN0YXRlLmQuZm9yRWFjaCgoXywgYSkgPT4ge1xuICAgICAgICBpZiAoYSAhPT0gYXRvbSkge1xuICAgICAgICAgIGNvbnN0IG1vdW50ZWQgPSBtb3VudGVkTWFwLmdldChhKTtcbiAgICAgICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICAgICAgbW91bnRlZC50LmRlbGV0ZShhdG9tKTtcbiAgICAgICAgICAgIGlmIChjYW5Vbm1vdW50QXRvbShhLCBtb3VudGVkKSkge1xuICAgICAgICAgICAgICB1bm1vdW50QXRvbShhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBjb25zb2xlLndhcm4oXCJbQnVnXSBjb3VsZCBub3QgZmluZCBhdG9tIHN0YXRlIHRvIHVubW91bnRcIiwgYXRvbSk7XG4gICAgfVxuICB9O1xuICBjb25zdCBtb3VudERlcGVuZGVuY2llcyA9IChhdG9tLCBhdG9tU3RhdGUsIHByZXZEZXBlbmRlbmNpZXMpID0+IHtcbiAgICBjb25zdCBkZXBTZXQgPSBuZXcgU2V0KGF0b21TdGF0ZS5kLmtleXMoKSk7XG4gICAgcHJldkRlcGVuZGVuY2llcyA9PSBudWxsID8gdm9pZCAwIDogcHJldkRlcGVuZGVuY2llcy5mb3JFYWNoKChfLCBhKSA9PiB7XG4gICAgICBpZiAoZGVwU2V0LmhhcyhhKSkge1xuICAgICAgICBkZXBTZXQuZGVsZXRlKGEpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoYSk7XG4gICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICBtb3VudGVkLnQuZGVsZXRlKGF0b20pO1xuICAgICAgICBpZiAoY2FuVW5tb3VudEF0b20oYSwgbW91bnRlZCkpIHtcbiAgICAgICAgICB1bm1vdW50QXRvbShhKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGRlcFNldC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICBjb25zdCBtb3VudGVkID0gbW91bnRlZE1hcC5nZXQoYSk7XG4gICAgICBpZiAobW91bnRlZCkge1xuICAgICAgICBtb3VudGVkLnQuYWRkKGF0b20pO1xuICAgICAgfSBlbHNlIGlmIChtb3VudGVkTWFwLmhhcyhhdG9tKSkge1xuICAgICAgICBtb3VudEF0b20oYSwgYXRvbSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIGNvbnN0IGZsdXNoUGVuZGluZyA9ICgpID0+IHtcbiAgICB3aGlsZSAocGVuZGluZ01hcC5zaXplKSB7XG4gICAgICBjb25zdCBwZW5kaW5nID0gQXJyYXkuZnJvbShwZW5kaW5nTWFwKTtcbiAgICAgIHBlbmRpbmdNYXAuY2xlYXIoKTtcbiAgICAgIHBlbmRpbmcuZm9yRWFjaCgoW2F0b20sIHByZXZBdG9tU3RhdGVdKSA9PiB7XG4gICAgICAgIGNvbnN0IGF0b21TdGF0ZSA9IGdldEF0b21TdGF0ZShhdG9tKTtcbiAgICAgICAgaWYgKGF0b21TdGF0ZSkge1xuICAgICAgICAgIGlmIChhdG9tU3RhdGUuZCAhPT0gKHByZXZBdG9tU3RhdGUgPT0gbnVsbCA/IHZvaWQgMCA6IHByZXZBdG9tU3RhdGUuZCkpIHtcbiAgICAgICAgICAgIG1vdW50RGVwZW5kZW5jaWVzKGF0b20sIGF0b21TdGF0ZSwgcHJldkF0b21TdGF0ZSA9PSBudWxsID8gdm9pZCAwIDogcHJldkF0b21TdGF0ZS5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbW91bnRlZCA9IG1vdW50ZWRNYXAuZ2V0KGF0b20pO1xuICAgICAgICAgIGlmIChtb3VudGVkICYmICEvLyBUT0RPIFRoaXMgc2VlbXMgcHJldHR5IGhhY2t5LiBIb3BlIHRvIGZpeCBpdC5cbiAgICAgICAgICAvLyBNYXliZSB3ZSBjb3VsZCBgbW91bnREZXBlbmRlbmNpZXNgIGluIGBzZXRBdG9tU3RhdGVgP1xuICAgICAgICAgIChwcmV2QXRvbVN0YXRlICYmICFoYXNQcm9taXNlQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUpICYmIChpc0VxdWFsQXRvbVZhbHVlKHByZXZBdG9tU3RhdGUsIGF0b21TdGF0ZSkgfHwgaXNFcXVhbEF0b21FcnJvcihwcmV2QXRvbVN0YXRlLCBhdG9tU3RhdGUpKSkpIHtcbiAgICAgICAgICAgIG1vdW50ZWQubC5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcIltCdWddIG5vIGF0b20gc3RhdGUgdG8gZmx1c2hcIik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICBzdGF0ZUxpc3RlbmVycy5mb3JFYWNoKChsKSA9PiBsKCkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3Qgc3Vic2NyaWJlQXRvbSA9IChhdG9tLCBsaXN0ZW5lcikgPT4ge1xuICAgIGNvbnN0IG1vdW50ZWQgPSBhZGRBdG9tKGF0b20pO1xuICAgIGZsdXNoUGVuZGluZygpO1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IG1vdW50ZWQubDtcbiAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTtcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcik7XG4gICAgICBkZWxBdG9tKGF0b20pO1xuICAgIH07XG4gIH07XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZ2V0OiByZWFkQXRvbSxcbiAgICAgIHNldDogd3JpdGVBdG9tLFxuICAgICAgc3ViOiBzdWJzY3JpYmVBdG9tLFxuICAgICAgLy8gc3RvcmUgZGV2IG1ldGhvZHMgKHRoZXNlIGFyZSB0ZW50YXRpdmUgYW5kIHN1YmplY3QgdG8gY2hhbmdlKVxuICAgICAgZGV2X3N1YnNjcmliZV9zdGF0ZTogKGwpID0+IHtcbiAgICAgICAgc3RhdGVMaXN0ZW5lcnMuYWRkKGwpO1xuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgIHN0YXRlTGlzdGVuZXJzLmRlbGV0ZShsKTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgICBkZXZfZ2V0X21vdW50ZWRfYXRvbXM6ICgpID0+IG1vdW50ZWRBdG9tcy52YWx1ZXMoKSxcbiAgICAgIGRldl9nZXRfYXRvbV9zdGF0ZTogKGEpID0+IGF0b21TdGF0ZU1hcC5nZXQoYSksXG4gICAgICBkZXZfZ2V0X21vdW50ZWQ6IChhKSA9PiBtb3VudGVkTWFwLmdldChhKSxcbiAgICAgIGRldl9yZXN0b3JlX2F0b21zOiAodmFsdWVzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW2F0b20sIHZhbHVlXSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgICBpZiAoaGFzSW5pdGlhbFZhbHVlKGF0b20pKSB7XG4gICAgICAgICAgICBzZXRBdG9tVmFsdWUoYXRvbSwgdmFsdWUpO1xuICAgICAgICAgICAgcmVjb21wdXRlRGVwZW5kZW50cyhhdG9tKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmx1c2hQZW5kaW5nKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGdldDogcmVhZEF0b20sXG4gICAgc2V0OiB3cml0ZUF0b20sXG4gICAgc3ViOiBzdWJzY3JpYmVBdG9tXG4gIH07XG59O1xubGV0IGRlZmF1bHRTdG9yZTtcbmNvbnN0IGdldERlZmF1bHRTdG9yZSA9ICgpID0+IHtcbiAgaWYgKCFkZWZhdWx0U3RvcmUpIHtcbiAgICBkZWZhdWx0U3RvcmUgPSBjcmVhdGVTdG9yZSgpO1xuICB9XG4gIHJldHVybiBkZWZhdWx0U3RvcmU7XG59O1xuXG5leHBvcnQgeyBhdG9tLCBjcmVhdGVTdG9yZSwgZ2V0RGVmYXVsdFN0b3JlIH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/jotai/esm/vanilla.mjs\n");
5503
5503
 
5504
5504
  /***/ }),
5505
5505
 
@@ -5510,7 +5510,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5510
5510
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5511
5511
 
5512
5512
  "use strict";
5513
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"customAlphabet\": () => (/* binding */ customAlphabet),\n/* harmony export */ \"customRandom\": () => (/* binding */ customRandom),\n/* harmony export */ \"nanoid\": () => (/* binding */ nanoid),\n/* harmony export */ \"random\": () => (/* binding */ random),\n/* harmony export */ \"urlAlphabet\": () => (/* reexport safe */ _url_alphabet_index_js__WEBPACK_IMPORTED_MODULE_0__.urlAlphabet)\n/* harmony export */ });\n/* harmony import */ var _url_alphabet_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./url-alphabet/index.js */ \"../../../node_modules/nanoid/url-alphabet/index.js\");\n\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDaUUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzPzc0NWMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXJsQWxwaGFiZXQgfSBmcm9tICcuL3VybC1hbHBoYWJldC9pbmRleC5qcydcbmxldCByYW5kb20gPSBieXRlcyA9PiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGJ5dGVzKSlcbmxldCBjdXN0b21SYW5kb20gPSAoYWxwaGFiZXQsIGRlZmF1bHRTaXplLCBnZXRSYW5kb20pID0+IHtcbiAgbGV0IG1hc2sgPSAoMiA8PCAoTWF0aC5sb2coYWxwaGFiZXQubGVuZ3RoIC0gMSkgLyBNYXRoLkxOMikpIC0gMVxuICBsZXQgc3RlcCA9IC1+KCgxLjYgKiBtYXNrICogZGVmYXVsdFNpemUpIC8gYWxwaGFiZXQubGVuZ3RoKVxuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGxldCBieXRlcyA9IGdldFJhbmRvbShzdGVwKVxuICAgICAgbGV0IGogPSBzdGVwXG4gICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgIGlkICs9IGFscGhhYmV0W2J5dGVzW2pdICYgbWFza10gfHwgJydcbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gc2l6ZSkgcmV0dXJuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5sZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIHNpemUgPSAyMSkgPT5cbiAgY3VzdG9tUmFuZG9tKGFscGhhYmV0LCBzaXplLCByYW5kb20pXG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT5cbiAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplKSkucmVkdWNlKChpZCwgYnl0ZSkgPT4ge1xuICAgIGJ5dGUgJj0gNjNcbiAgICBpZiAoYnl0ZSA8IDM2KSB7XG4gICAgICBpZCArPSBieXRlLnRvU3RyaW5nKDM2KVxuICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDYyKSB7XG4gICAgICBpZCArPSAoYnl0ZSAtIDI2KS50b1N0cmluZygzNikudG9VcHBlckNhc2UoKVxuICAgIH0gZWxzZSBpZiAoYnl0ZSA+IDYyKSB7XG4gICAgICBpZCArPSAnLSdcbiAgICB9IGVsc2Uge1xuICAgICAgaWQgKz0gJ18nXG4gICAgfVxuICAgIHJldHVybiBpZFxuICB9LCAnJylcbmV4cG9ydCB7IG5hbm9pZCwgY3VzdG9tQWxwaGFiZXQsIGN1c3RvbVJhbmRvbSwgdXJsQWxwaGFiZXQsIHJhbmRvbSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/nanoid/index.browser.js\n");
5513
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"customAlphabet\": () => (/* binding */ customAlphabet),\n/* harmony export */ \"customRandom\": () => (/* binding */ customRandom),\n/* harmony export */ \"nanoid\": () => (/* binding */ nanoid),\n/* harmony export */ \"random\": () => (/* binding */ random),\n/* harmony export */ \"urlAlphabet\": () => (/* reexport safe */ _url_alphabet_index_js__WEBPACK_IMPORTED_MODULE_0__.urlAlphabet)\n/* harmony export */ });\n/* harmony import */ var _url_alphabet_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./url-alphabet/index.js */ \"../../../node_modules/nanoid/url-alphabet/index.js\");\n\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) return id\n }\n }\n }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n byte &= 63\n if (byte < 36) {\n id += byte.toString(36)\n } else if (byte < 62) {\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFxRDtBQUNyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDaUUiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC9pbmRleC5icm93c2VyLmpzPzE1YzEiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgdXJsQWxwaGFiZXQgfSBmcm9tICcuL3VybC1hbHBoYWJldC9pbmRleC5qcydcbmxldCByYW5kb20gPSBieXRlcyA9PiBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KGJ5dGVzKSlcbmxldCBjdXN0b21SYW5kb20gPSAoYWxwaGFiZXQsIGRlZmF1bHRTaXplLCBnZXRSYW5kb20pID0+IHtcbiAgbGV0IG1hc2sgPSAoMiA8PCAoTWF0aC5sb2coYWxwaGFiZXQubGVuZ3RoIC0gMSkgLyBNYXRoLkxOMikpIC0gMVxuICBsZXQgc3RlcCA9IC1+KCgxLjYgKiBtYXNrICogZGVmYXVsdFNpemUpIC8gYWxwaGFiZXQubGVuZ3RoKVxuICByZXR1cm4gKHNpemUgPSBkZWZhdWx0U2l6ZSkgPT4ge1xuICAgIGxldCBpZCA9ICcnXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGxldCBieXRlcyA9IGdldFJhbmRvbShzdGVwKVxuICAgICAgbGV0IGogPSBzdGVwXG4gICAgICB3aGlsZSAoai0tKSB7XG4gICAgICAgIGlkICs9IGFscGhhYmV0W2J5dGVzW2pdICYgbWFza10gfHwgJydcbiAgICAgICAgaWYgKGlkLmxlbmd0aCA9PT0gc2l6ZSkgcmV0dXJuIGlkXG4gICAgICB9XG4gICAgfVxuICB9XG59XG5sZXQgY3VzdG9tQWxwaGFiZXQgPSAoYWxwaGFiZXQsIHNpemUgPSAyMSkgPT5cbiAgY3VzdG9tUmFuZG9tKGFscGhhYmV0LCBzaXplLCByYW5kb20pXG5sZXQgbmFub2lkID0gKHNpemUgPSAyMSkgPT5cbiAgY3J5cHRvLmdldFJhbmRvbVZhbHVlcyhuZXcgVWludDhBcnJheShzaXplKSkucmVkdWNlKChpZCwgYnl0ZSkgPT4ge1xuICAgIGJ5dGUgJj0gNjNcbiAgICBpZiAoYnl0ZSA8IDM2KSB7XG4gICAgICBpZCArPSBieXRlLnRvU3RyaW5nKDM2KVxuICAgIH0gZWxzZSBpZiAoYnl0ZSA8IDYyKSB7XG4gICAgICBpZCArPSAoYnl0ZSAtIDI2KS50b1N0cmluZygzNikudG9VcHBlckNhc2UoKVxuICAgIH0gZWxzZSBpZiAoYnl0ZSA+IDYyKSB7XG4gICAgICBpZCArPSAnLSdcbiAgICB9IGVsc2Uge1xuICAgICAgaWQgKz0gJ18nXG4gICAgfVxuICAgIHJldHVybiBpZFxuICB9LCAnJylcbmV4cG9ydCB7IG5hbm9pZCwgY3VzdG9tQWxwaGFiZXQsIGN1c3RvbVJhbmRvbSwgdXJsQWxwaGFiZXQsIHJhbmRvbSB9XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/nanoid/index.browser.js\n");
5514
5514
 
5515
5515
  /***/ }),
5516
5516
 
@@ -5521,7 +5521,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5521
5521
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5522
5522
 
5523
5523
  "use strict";
5524
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"urlAlphabet\": () => (/* binding */ urlAlphabet)\n/* harmony export */ });\nlet urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC91cmwtYWxwaGFiZXQvaW5kZXguanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDc0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC91cmwtYWxwaGFiZXQvaW5kZXguanM/ODRkMCJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgdXJsQWxwaGFiZXQgPVxuICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcbmV4cG9ydCB7IHVybEFscGhhYmV0IH1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/nanoid/url-alphabet/index.js\n");
5524
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"urlAlphabet\": () => (/* binding */ urlAlphabet)\n/* harmony export */ });\nlet urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC91cmwtYWxwaGFiZXQvaW5kZXguanMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQUFBO0FBQ0E7QUFDc0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL25hbm9pZC91cmwtYWxwaGFiZXQvaW5kZXguanM/NWRjZCJdLCJzb3VyY2VzQ29udGVudCI6WyJsZXQgdXJsQWxwaGFiZXQgPVxuICAndXNlYW5kb20tMjZUMTk4MzQwUFg3NXB4SkFDS1ZFUllNSU5EQlVTSFdPTEZfR1FaYmZnaGprbHF2d3l6cmljdCdcbmV4cG9ydCB7IHVybEFscGhhYmV0IH1cbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/nanoid/url-alphabet/index.js\n");
5525
5525
 
5526
5526
  /***/ }),
5527
5527
 
@@ -5532,7 +5532,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5532
5532
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5533
5533
 
5534
5534
  "use strict";
5535
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"create\": () => (/* binding */ create),\n/* harmony export */ \"createStore\": () => (/* reexport safe */ zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore),\n/* harmony export */ \"default\": () => (/* binding */ react),\n/* harmony export */ \"useStore\": () => (/* binding */ useStore)\n/* harmony export */ });\n/* harmony import */ var zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zustand/vanilla */ \"../../../node_modules/zustand/esm/vanilla.mjs\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var use_sync_external_store_shim_with_selector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! use-sync-external-store/shim/with-selector.js */ \"../../../node_modules/use-sync-external-store/shim/with-selector.js\");\n\n\n\n\n\nconst { useSyncExternalStoreWithSelector } = use_sync_external_store_shim_with_selector_js__WEBPACK_IMPORTED_MODULE_2__;\nfunction useStore(api, selector = api.getState, equalityFn) {\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn\n );\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useDebugValue)(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ( true && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore)(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if (true) {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL2luZGV4Lm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQThDO0FBQ2Q7QUFDTTtBQUNrRDs7QUFFeEYsUUFBUSxtQ0FBbUMsRUFBRSwwRUFBMkI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsb0RBQWE7QUFDZjtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQTBEO0FBQ2hFO0FBQ0EsMkdBQTJHLFdBQVc7QUFDdEg7QUFDQTtBQUNBLGtEQUFrRCw0REFBVztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0Esd0VBQXdFLFNBQVM7QUFDakY7QUFDQTtBQUNBO0FBQ0E7O0FBRThDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS9pbmRleC5tanM/ZWI3MiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYSc7XG5leHBvcnQgKiBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnO1xuaW1wb3J0IHsgdXNlRGVidWdWYWx1ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VTeW5jRXh0ZXJuYWxTdG9yZUV4cG9ydHMgZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzJztcblxuY29uc3QgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciB9ID0gdXNlU3luY0V4dGVybmFsU3RvcmVFeHBvcnRzO1xuZnVuY3Rpb24gdXNlU3RvcmUoYXBpLCBzZWxlY3RvciA9IGFwaS5nZXRTdGF0ZSwgZXF1YWxpdHlGbikge1xuICBjb25zdCBzbGljZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgYXBpLmdldFN0YXRlLFxuICAgIGFwaS5nZXRTZXJ2ZXJTdGF0ZSB8fCBhcGkuZ2V0U3RhdGUsXG4gICAgc2VsZWN0b3IsXG4gICAgZXF1YWxpdHlGblxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHNsaWNlKTtcbiAgcmV0dXJuIHNsaWNlO1xufVxuY29uc3QgY3JlYXRlSW1wbCA9IChjcmVhdGVTdGF0ZSkgPT4ge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiICYmIHR5cGVvZiBjcmVhdGVTdGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gUGFzc2luZyBhIHZhbmlsbGEgc3RvcmUgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSBgaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IGFwaSA9IHR5cGVvZiBjcmVhdGVTdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RhdGU7XG4gIGNvbnN0IHVzZUJvdW5kU3RvcmUgPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm4pID0+IHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICBPYmplY3QuYXNzaWduKHVzZUJvdW5kU3RvcmUsIGFwaSk7XG4gIHJldHVybiB1c2VCb3VuZFN0b3JlO1xufTtcbmNvbnN0IGNyZWF0ZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZUltcGw7XG52YXIgcmVhY3QgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIERlZmF1bHQgZXhwb3J0IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGBpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGUoY3JlYXRlU3RhdGUpO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlLCByZWFjdCBhcyBkZWZhdWx0LCB1c2VTdG9yZSB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/zustand/esm/index.mjs\n");
5535
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"create\": () => (/* binding */ create),\n/* harmony export */ \"createStore\": () => (/* reexport safe */ zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore),\n/* harmony export */ \"default\": () => (/* binding */ react),\n/* harmony export */ \"useStore\": () => (/* binding */ useStore)\n/* harmony export */ });\n/* harmony import */ var zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! zustand/vanilla */ \"../../../node_modules/zustand/esm/vanilla.mjs\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var use_sync_external_store_shim_with_selector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! use-sync-external-store/shim/with-selector.js */ \"../../../node_modules/use-sync-external-store/shim/with-selector.js\");\n\n\n\n\n\nconst { useSyncExternalStoreWithSelector } = use_sync_external_store_shim_with_selector_js__WEBPACK_IMPORTED_MODULE_2__;\nfunction useStore(api, selector = api.getState, equalityFn) {\n const slice = useSyncExternalStoreWithSelector(\n api.subscribe,\n api.getState,\n api.getServerState || api.getState,\n selector,\n equalityFn\n );\n (0,react__WEBPACK_IMPORTED_MODULE_1__.useDebugValue)(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n if ( true && typeof createState !== \"function\") {\n console.warn(\n \"[DEPRECATED] Passing a vanilla store will be unsupported in a future version. Instead use `import { useStore } from 'zustand'`.\"\n );\n }\n const api = typeof createState === \"function\" ? (0,zustand_vanilla__WEBPACK_IMPORTED_MODULE_0__.createStore)(createState) : createState;\n const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n if (true) {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use `import { create } from 'zustand'`.\"\n );\n }\n return create(createState);\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL2luZGV4Lm1qcy5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQThDO0FBQ2Q7QUFDTTtBQUNrRDs7QUFFeEYsUUFBUSxtQ0FBbUMsRUFBRSwwRUFBMkI7QUFDeEU7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEVBQUUsb0RBQWE7QUFDZjtBQUNBO0FBQ0E7QUFDQSxNQUFNLEtBQTBEO0FBQ2hFO0FBQ0EsMkdBQTJHLFdBQVc7QUFDdEg7QUFDQTtBQUNBLGtEQUFrRCw0REFBVztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNLElBQTBEO0FBQ2hFO0FBQ0Esd0VBQXdFLFNBQVM7QUFDakY7QUFDQTtBQUNBO0FBQ0E7O0FBRThDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uLy4uL25vZGVfbW9kdWxlcy96dXN0YW5kL2VzbS9pbmRleC5tanM/ZGU0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYSc7XG5leHBvcnQgKiBmcm9tICd6dXN0YW5kL3ZhbmlsbGEnO1xuaW1wb3J0IHsgdXNlRGVidWdWYWx1ZSB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB1c2VTeW5jRXh0ZXJuYWxTdG9yZUV4cG9ydHMgZnJvbSAndXNlLXN5bmMtZXh0ZXJuYWwtc3RvcmUvc2hpbS93aXRoLXNlbGVjdG9yLmpzJztcblxuY29uc3QgeyB1c2VTeW5jRXh0ZXJuYWxTdG9yZVdpdGhTZWxlY3RvciB9ID0gdXNlU3luY0V4dGVybmFsU3RvcmVFeHBvcnRzO1xuZnVuY3Rpb24gdXNlU3RvcmUoYXBpLCBzZWxlY3RvciA9IGFwaS5nZXRTdGF0ZSwgZXF1YWxpdHlGbikge1xuICBjb25zdCBzbGljZSA9IHVzZVN5bmNFeHRlcm5hbFN0b3JlV2l0aFNlbGVjdG9yKFxuICAgIGFwaS5zdWJzY3JpYmUsXG4gICAgYXBpLmdldFN0YXRlLFxuICAgIGFwaS5nZXRTZXJ2ZXJTdGF0ZSB8fCBhcGkuZ2V0U3RhdGUsXG4gICAgc2VsZWN0b3IsXG4gICAgZXF1YWxpdHlGblxuICApO1xuICB1c2VEZWJ1Z1ZhbHVlKHNsaWNlKTtcbiAgcmV0dXJuIHNsaWNlO1xufVxuY29uc3QgY3JlYXRlSW1wbCA9IChjcmVhdGVTdGF0ZSkgPT4ge1xuICBpZiAoKGltcG9ydC5tZXRhLmVudiAmJiBpbXBvcnQubWV0YS5lbnYuTU9ERSkgIT09IFwicHJvZHVjdGlvblwiICYmIHR5cGVvZiBjcmVhdGVTdGF0ZSAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbREVQUkVDQVRFRF0gUGFzc2luZyBhIHZhbmlsbGEgc3RvcmUgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSBgaW1wb3J0IHsgdXNlU3RvcmUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIGNvbnN0IGFwaSA9IHR5cGVvZiBjcmVhdGVTdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gY3JlYXRlU3RvcmUoY3JlYXRlU3RhdGUpIDogY3JlYXRlU3RhdGU7XG4gIGNvbnN0IHVzZUJvdW5kU3RvcmUgPSAoc2VsZWN0b3IsIGVxdWFsaXR5Rm4pID0+IHVzZVN0b3JlKGFwaSwgc2VsZWN0b3IsIGVxdWFsaXR5Rm4pO1xuICBPYmplY3QuYXNzaWduKHVzZUJvdW5kU3RvcmUsIGFwaSk7XG4gIHJldHVybiB1c2VCb3VuZFN0b3JlO1xufTtcbmNvbnN0IGNyZWF0ZSA9IChjcmVhdGVTdGF0ZSkgPT4gY3JlYXRlU3RhdGUgPyBjcmVhdGVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZUltcGw7XG52YXIgcmVhY3QgPSAoY3JlYXRlU3RhdGUpID0+IHtcbiAgaWYgKChpbXBvcnQubWV0YS5lbnYgJiYgaW1wb3J0Lm1ldGEuZW52Lk1PREUpICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiW0RFUFJFQ0FURURdIERlZmF1bHQgZXhwb3J0IGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQgdXNlIGBpbXBvcnQgeyBjcmVhdGUgfSBmcm9tICd6dXN0YW5kJ2AuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGUoY3JlYXRlU3RhdGUpO1xufTtcblxuZXhwb3J0IHsgY3JlYXRlLCByZWFjdCBhcyBkZWZhdWx0LCB1c2VTdG9yZSB9O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../../node_modules/zustand/esm/index.mjs\n");
5536
5536
 
5537
5537
  /***/ }),
5538
5538
 
@@ -5543,7 +5543,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5543
5543
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5544
5544
 
5545
5545
  "use strict";
5546
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createStore\": () => (/* binding */ createStore),\n/* harmony export */ \"default\": () => (/* binding */ vanilla)\n/* harmony export */ });\nconst createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\") ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if (true) {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, subscribe, destroy };\n state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if (true) {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3R0FBd0c7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBMEQ7QUFDaEU7QUFDQSx1RUFBdUUsY0FBYztBQUNyRjtBQUNBO0FBQ0E7QUFDQTs7QUFFMkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzP2M1NGYiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY3JlYXRlU3RvcmVJbXBsID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGxldCBzdGF0ZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3Qgc2V0U3RhdGUgPSAocGFydGlhbCwgcmVwbGFjZSkgPT4ge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHR5cGVvZiBwYXJ0aWFsID09PSBcImZ1bmN0aW9uXCIgPyBwYXJ0aWFsKHN0YXRlKSA6IHBhcnRpYWw7XG4gICAgaWYgKCFPYmplY3QuaXMobmV4dFN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZTtcbiAgICAgIHN0YXRlID0gKHJlcGxhY2UgIT0gbnVsbCA/IHJlcGxhY2UgOiB0eXBlb2YgbmV4dFN0YXRlICE9PSBcIm9iamVjdFwiKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyKSA9PiB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbREVQUkVDQVRFRF0gVGhlIGBkZXN0cm95YCBtZXRob2Qgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSB1bnN1YnNjcmliZSBmdW5jdGlvbiByZXR1cm5lZCBieSBzdWJzY3JpYmUuIEV2ZXJ5dGhpbmcgd2lsbCBiZSBnYXJiYWdlLWNvbGxlY3RlZCBpZiBzdG9yZSBpcyBnYXJiYWdlLWNvbGxlY3RlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG4gIGNvbnN0IGFwaSA9IHsgc2V0U3RhdGUsIGdldFN0YXRlLCBzdWJzY3JpYmUsIGRlc3Ryb3kgfTtcbiAgc3RhdGUgPSBjcmVhdGVTdGF0ZShzZXRTdGF0ZSwgZ2V0U3RhdGUsIGFwaSk7XG4gIHJldHVybiBhcGk7XG59O1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoY3JlYXRlU3RhdGUpID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlU3RvcmVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZVN0b3JlSW1wbDtcbnZhciB2YW5pbGxhID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIltERVBSRUNBVEVEXSBEZWZhdWx0IGV4cG9ydCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYScuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVTdG9yZShjcmVhdGVTdGF0ZSk7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgdmFuaWxsYSBhcyBkZWZhdWx0IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/zustand/esm/vanilla.mjs\n");
5546
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"createStore\": () => (/* binding */ createStore),\n/* harmony export */ \"default\": () => (/* binding */ vanilla)\n/* harmony export */ });\nconst createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\") ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const destroy = () => {\n if (true) {\n console.warn(\n \"[DEPRECATED] The `destroy` method will be unsupported in a future version. Instead use unsubscribe function returned by subscribe. Everything will be garbage-collected if store is garbage-collected.\"\n );\n }\n listeners.clear();\n };\n const api = { setState, getState, subscribe, destroy };\n state = createState(setState, getState, api);\n return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n if (true) {\n console.warn(\n \"[DEPRECATED] Default export is deprecated. Instead use import { createStore } from 'zustand/vanilla'.\"\n );\n }\n return createStore(createState);\n};\n\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSx3R0FBd0c7QUFDeEc7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUSxJQUEwRDtBQUNsRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxnQkFBZ0I7QUFDaEI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU0sSUFBMEQ7QUFDaEU7QUFDQSx1RUFBdUUsY0FBYztBQUNyRjtBQUNBO0FBQ0E7QUFDQTs7QUFFMkMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vLi4vbm9kZV9tb2R1bGVzL3p1c3RhbmQvZXNtL3ZhbmlsbGEubWpzPzA0MmQiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY3JlYXRlU3RvcmVJbXBsID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGxldCBzdGF0ZTtcbiAgY29uc3QgbGlzdGVuZXJzID0gLyogQF9fUFVSRV9fICovIG5ldyBTZXQoKTtcbiAgY29uc3Qgc2V0U3RhdGUgPSAocGFydGlhbCwgcmVwbGFjZSkgPT4ge1xuICAgIGNvbnN0IG5leHRTdGF0ZSA9IHR5cGVvZiBwYXJ0aWFsID09PSBcImZ1bmN0aW9uXCIgPyBwYXJ0aWFsKHN0YXRlKSA6IHBhcnRpYWw7XG4gICAgaWYgKCFPYmplY3QuaXMobmV4dFN0YXRlLCBzdGF0ZSkpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZTtcbiAgICAgIHN0YXRlID0gKHJlcGxhY2UgIT0gbnVsbCA/IHJlcGxhY2UgOiB0eXBlb2YgbmV4dFN0YXRlICE9PSBcIm9iamVjdFwiKSA/IG5leHRTdGF0ZSA6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLCBuZXh0U3RhdGUpO1xuICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcihzdGF0ZSwgcHJldmlvdXNTdGF0ZSkpO1xuICAgIH1cbiAgfTtcbiAgY29uc3QgZ2V0U3RhdGUgPSAoKSA9PiBzdGF0ZTtcbiAgY29uc3Qgc3Vic2NyaWJlID0gKGxpc3RlbmVyKSA9PiB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7XG4gICAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpO1xuICB9O1xuICBjb25zdCBkZXN0cm95ID0gKCkgPT4ge1xuICAgIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgXCJbREVQUkVDQVRFRF0gVGhlIGBkZXN0cm95YCBtZXRob2Qgd2lsbCBiZSB1bnN1cHBvcnRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uLiBJbnN0ZWFkIHVzZSB1bnN1YnNjcmliZSBmdW5jdGlvbiByZXR1cm5lZCBieSBzdWJzY3JpYmUuIEV2ZXJ5dGhpbmcgd2lsbCBiZSBnYXJiYWdlLWNvbGxlY3RlZCBpZiBzdG9yZSBpcyBnYXJiYWdlLWNvbGxlY3RlZC5cIlxuICAgICAgKTtcbiAgICB9XG4gICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gIH07XG4gIGNvbnN0IGFwaSA9IHsgc2V0U3RhdGUsIGdldFN0YXRlLCBzdWJzY3JpYmUsIGRlc3Ryb3kgfTtcbiAgc3RhdGUgPSBjcmVhdGVTdGF0ZShzZXRTdGF0ZSwgZ2V0U3RhdGUsIGFwaSk7XG4gIHJldHVybiBhcGk7XG59O1xuY29uc3QgY3JlYXRlU3RvcmUgPSAoY3JlYXRlU3RhdGUpID0+IGNyZWF0ZVN0YXRlID8gY3JlYXRlU3RvcmVJbXBsKGNyZWF0ZVN0YXRlKSA6IGNyZWF0ZVN0b3JlSW1wbDtcbnZhciB2YW5pbGxhID0gKGNyZWF0ZVN0YXRlKSA9PiB7XG4gIGlmICgoaW1wb3J0Lm1ldGEuZW52ICYmIGltcG9ydC5tZXRhLmVudi5NT0RFKSAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBcIltERVBSRUNBVEVEXSBEZWZhdWx0IGV4cG9ydCBpcyBkZXByZWNhdGVkLiBJbnN0ZWFkIHVzZSBpbXBvcnQgeyBjcmVhdGVTdG9yZSB9IGZyb20gJ3p1c3RhbmQvdmFuaWxsYScuXCJcbiAgICApO1xuICB9XG4gIHJldHVybiBjcmVhdGVTdG9yZShjcmVhdGVTdGF0ZSk7XG59O1xuXG5leHBvcnQgeyBjcmVhdGVTdG9yZSwgdmFuaWxsYSBhcyBkZWZhdWx0IH07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../../node_modules/zustand/esm/vanilla.mjs\n");
5547
5547
 
5548
5548
  /***/ }),
5549
5549
 
@@ -5554,7 +5554,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
5554
5554
  /***/ ((__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) => {
5555
5555
 
5556
5556
  "use strict";
5557
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"directoryOpen\": () => (/* binding */ r),\n/* harmony export */ \"fileOpen\": () => (/* binding */ n),\n/* harmony export */ \"fileSave\": () => (/* binding */ s),\n/* harmony export */ \"supported\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nconst e = (() => {\n if (\"undefined\" == typeof self) return !1;\n if (\"top\" in self && self !== top) try {\n top;\n } catch (e) {\n return !1;\n } else if (\"showOpenFilePicker\" in self) return \"showOpenFilePicker\";\n return !1;\n})(),\n t = e ? __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-open-002ab408.js */ \"../../../node_modules/browser-fs-access/dist/file-open-002ab408.js\")) : __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-open-7c801643.js */ \"../../../node_modules/browser-fs-access/dist/file-open-7c801643.js\"));\n\nfunction n(...e) {\n return __awaiter(this, void 0, void 0, function* () {\n return (yield t).default(...e);\n });\n}\n\nconst i = e ? __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./directory-open-4ed118d0.js */ \"../../../node_modules/browser-fs-access/dist/directory-open-4ed118d0.js\")) : __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./directory-open-01563666.js */ \"../../../node_modules/browser-fs-access/dist/directory-open-01563666.js\"));\n\nfunction r(...e) {\n return __awaiter(this, void 0, void 0, function* () {\n return (yield i).default(...e);\n });\n}\n\nconst o = e ? __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-save-745eba88.js */ \"../../../node_modules/browser-fs-access/dist/file-save-745eba88.js\")) : __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-save-3189631c.js */ \"../../../node_modules/browser-fs-access/dist/file-save-3189631c.js\"));\n\nfunction s(...e) {\n return __awaiter(this, void 0, void 0, function* () {\n return (yield o).default(...e);\n });\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvaW5kZXgubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLENBQUM7QUFDRCxjQUFjLHdNQUFpQyxHQUFHLHdNQUFpQzs7QUFFbkY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGNBQWMsa05BQXNDLEdBQUcsa05BQXNDOztBQUU3RjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsY0FBYyx3TUFBaUMsR0FBRyx3TUFBaUM7O0FBRW5GO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9pbmRleC5tanM/ZDJiYSJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59O1xuXG5jb25zdCBlID0gKCgpID0+IHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHNlbGYpIHJldHVybiAhMTtcbiAgaWYgKFwidG9wXCIgaW4gc2VsZiAmJiBzZWxmICE9PSB0b3ApIHRyeSB7XG4gICAgdG9wO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuICExO1xuICB9IGVsc2UgaWYgKFwic2hvd09wZW5GaWxlUGlja2VyXCIgaW4gc2VsZikgcmV0dXJuIFwic2hvd09wZW5GaWxlUGlja2VyXCI7XG4gIHJldHVybiAhMTtcbn0pKCksXG4gICAgICB0ID0gZSA/IGltcG9ydChcIi4vZmlsZS1vcGVuLTAwMmFiNDA4LmpzXCIpIDogaW1wb3J0KFwiLi9maWxlLW9wZW4tN2M4MDE2NDMuanNcIik7XG5cbmZ1bmN0aW9uIG4oLi4uZSkge1xuICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIHJldHVybiAoeWllbGQgdCkuZGVmYXVsdCguLi5lKTtcbiAgfSk7XG59XG5cbmNvbnN0IGkgPSBlID8gaW1wb3J0KFwiLi9kaXJlY3Rvcnktb3Blbi00ZWQxMThkMC5qc1wiKSA6IGltcG9ydChcIi4vZGlyZWN0b3J5LW9wZW4tMDE1NjM2NjYuanNcIik7XG5cbmZ1bmN0aW9uIHIoLi4uZSkge1xuICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIHJldHVybiAoeWllbGQgaSkuZGVmYXVsdCguLi5lKTtcbiAgfSk7XG59XG5cbmNvbnN0IG8gPSBlID8gaW1wb3J0KFwiLi9maWxlLXNhdmUtNzQ1ZWJhODguanNcIikgOiBpbXBvcnQoXCIuL2ZpbGUtc2F2ZS0zMTg5NjMxYy5qc1wiKTtcblxuZnVuY3Rpb24gcyguLi5lKSB7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgcmV0dXJuICh5aWVsZCBvKS5kZWZhdWx0KC4uLmUpO1xuICB9KTtcbn1cblxuZXhwb3J0IHsgciBhcyBkaXJlY3RvcnlPcGVuLCBuIGFzIGZpbGVPcGVuLCBzIGFzIGZpbGVTYXZlLCBlIGFzIHN1cHBvcnRlZCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/index.mjs\n");
5557
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"directoryOpen\": () => (/* binding */ r),\n/* harmony export */ \"fileOpen\": () => (/* binding */ n),\n/* harmony export */ \"fileSave\": () => (/* binding */ s),\n/* harmony export */ \"supported\": () => (/* binding */ e)\n/* harmony export */ });\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\nconst e = (() => {\n if (\"undefined\" == typeof self) return !1;\n if (\"top\" in self && self !== top) try {\n top;\n } catch (e) {\n return !1;\n } else if (\"showOpenFilePicker\" in self) return \"showOpenFilePicker\";\n return !1;\n})(),\n t = e ? __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-open-002ab408.js */ \"../../../node_modules/browser-fs-access/dist/file-open-002ab408.js\")) : __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-open-7c801643.js */ \"../../../node_modules/browser-fs-access/dist/file-open-7c801643.js\"));\n\nfunction n(...e) {\n return __awaiter(this, void 0, void 0, function* () {\n return (yield t).default(...e);\n });\n}\n\nconst i = e ? __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./directory-open-4ed118d0.js */ \"../../../node_modules/browser-fs-access/dist/directory-open-4ed118d0.js\")) : __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./directory-open-01563666.js */ \"../../../node_modules/browser-fs-access/dist/directory-open-01563666.js\"));\n\nfunction r(...e) {\n return __awaiter(this, void 0, void 0, function* () {\n return (yield i).default(...e);\n });\n}\n\nconst o = e ? __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-save-745eba88.js */ \"../../../node_modules/browser-fs-access/dist/file-save-745eba88.js\")) : __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! ./file-save-3189631c.js */ \"../../../node_modules/browser-fs-access/dist/file-save-3189631c.js\"));\n\nfunction s(...e) {\n return __awaiter(this, void 0, void 0, function* () {\n return (yield o).default(...e);\n });\n}\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2Jyb3dzZXItZnMtYWNjZXNzL2Rpc3QvaW5kZXgubWpzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQSxnQkFBZ0IsU0FBSSxJQUFJLFNBQUk7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBUTtBQUNSO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxRQUFRO0FBQ1I7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEdBQUc7QUFDSDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBLElBQUk7QUFDSjtBQUNBLENBQUM7QUFDRCxjQUFjLHdNQUFpQyxHQUFHLHdNQUFpQzs7QUFFbkY7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIOztBQUVBLGNBQWMsa05BQXNDLEdBQUcsa05BQXNDOztBQUU3RjtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUEsY0FBYyx3TUFBaUMsR0FBRyx3TUFBaUM7O0FBRW5GO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSCIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi8uLi9ub2RlX21vZHVsZXMvYnJvd3Nlci1mcy1hY2Nlc3MvZGlzdC9pbmRleC5tanM/Zjc5ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJ2YXIgX19hd2FpdGVyID0gdGhpcyAmJiB0aGlzLl9fYXdhaXRlciB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgIHJlc29sdmUodmFsdWUpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHtcbiAgICAgIHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpO1xuICAgIH1cblxuICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgfSk7XG59O1xuXG5jb25zdCBlID0gKCgpID0+IHtcbiAgaWYgKFwidW5kZWZpbmVkXCIgPT0gdHlwZW9mIHNlbGYpIHJldHVybiAhMTtcbiAgaWYgKFwidG9wXCIgaW4gc2VsZiAmJiBzZWxmICE9PSB0b3ApIHRyeSB7XG4gICAgdG9wO1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuICExO1xuICB9IGVsc2UgaWYgKFwic2hvd09wZW5GaWxlUGlja2VyXCIgaW4gc2VsZikgcmV0dXJuIFwic2hvd09wZW5GaWxlUGlja2VyXCI7XG4gIHJldHVybiAhMTtcbn0pKCksXG4gICAgICB0ID0gZSA/IGltcG9ydChcIi4vZmlsZS1vcGVuLTAwMmFiNDA4LmpzXCIpIDogaW1wb3J0KFwiLi9maWxlLW9wZW4tN2M4MDE2NDMuanNcIik7XG5cbmZ1bmN0aW9uIG4oLi4uZSkge1xuICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIHJldHVybiAoeWllbGQgdCkuZGVmYXVsdCguLi5lKTtcbiAgfSk7XG59XG5cbmNvbnN0IGkgPSBlID8gaW1wb3J0KFwiLi9kaXJlY3Rvcnktb3Blbi00ZWQxMThkMC5qc1wiKSA6IGltcG9ydChcIi4vZGlyZWN0b3J5LW9wZW4tMDE1NjM2NjYuanNcIik7XG5cbmZ1bmN0aW9uIHIoLi4uZSkge1xuICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICAgIHJldHVybiAoeWllbGQgaSkuZGVmYXVsdCguLi5lKTtcbiAgfSk7XG59XG5cbmNvbnN0IG8gPSBlID8gaW1wb3J0KFwiLi9maWxlLXNhdmUtNzQ1ZWJhODguanNcIikgOiBpbXBvcnQoXCIuL2ZpbGUtc2F2ZS0zMTg5NjMxYy5qc1wiKTtcblxuZnVuY3Rpb24gcyguLi5lKSB7XG4gIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7XG4gICAgcmV0dXJuICh5aWVsZCBvKS5kZWZhdWx0KC4uLmUpO1xuICB9KTtcbn1cblxuZXhwb3J0IHsgciBhcyBkaXJlY3RvcnlPcGVuLCBuIGFzIGZpbGVPcGVuLCBzIGFzIGZpbGVTYXZlLCBlIGFzIHN1cHBvcnRlZCB9OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../../node_modules/browser-fs-access/dist/index.mjs\n");
5558
5558
 
5559
5559
  /***/ }),
5560
5560
 
@@ -5693,7 +5693,7 @@ module.exports = JSON.parse('{"ar-SA":99,"az-AZ":18,"bg-BG":75,"bn-BD":55,"ca-ES
5693
5693
  /******/ // This function allow to reference async chunks
5694
5694
  /******/ __webpack_require__.u = (chunkId) => {
5695
5695
  /******/ // return url for filenames based on template
5696
- /******/ return "excalidraw-assets-dev/" + chunkId + "-" + {"locales/ar-SA-json":"f35c4f87e6e2dcf7c20a","locales/az-AZ-json":"5d70eb8bf3f20abc3bac","locales/bg-BG-json":"88cced5fd8a6d8298501","locales/bn-BD-json":"a06588c61947851c8579","locales/ca-ES-json":"9b25933a25836cc0be23","locales/cs-CZ-json":"1d6c97ea271d017058c9","locales/da-DK-json":"34a60c9843cecd71376f","locales/de-DE-json":"d13450595b795867412b","locales/el-GR-json":"c854b199f3ac07d40294","locales/es-ES-json":"6a667bfbf4ff3d0181a7","locales/eu-ES-json":"3ec11367a80491b09056","locales/fa-IR-json":"e459964936177074abe7","locales/fi-FI-json":"f7839bb6f5ad0a3c7e0d","locales/fr-FR-json":"20e8535e2675a6736c81","locales/gl-ES-json":"861f534b46c0db1fa8db","locales/he-IL-json":"504d78736487793ffccd","locales/hi-IN-json":"82d988431011c330242a","locales/hu-HU-json":"d4150250980011726fd9","locales/id-ID-json":"82e300d4fe1e87adba9b","locales/it-IT-json":"6ecc9aec005faab90f41","locales/ja-JP-json":"3c6a065f0f1303b297fa","locales/kaa-json":"983a9ccc652aa01980f3","locales/kab-KAB-json":"cac3cf66f1db5c1a6e19","locales/kk-KZ-json":"e9dd81c22419efd44478","locales/km-KH-json":"be77acee611d96d88dda","locales/ko-KR-json":"ad8e9d31d52b26f3fbc2","locales/ku-TR-json":"ed67af91ae1920f114a8","locales/lt-LT-json":"2c3d35d6fb5dbf95a27e","locales/lv-LV-json":"fa8973c231afb2ddafe9","locales/mr-IN-json":"2949146743072eb11b40","locales/my-MM-json":"4c04ffe415641f69ed75","locales/nb-NO-json":"b8d7a5b70562dacdad45","locales/nl-NL-json":"a65f82a25fe038c45d35","locales/nn-NO-json":"858fbccbc5be386977db","locales/oc-FR-json":"a68ea08272c8da3c0e3f","locales/pa-IN-json":"90a2b3775bd7d8983def","locales/pl-PL-json":"9bb55330d5aaf336646e","locales/pt-BR-json":"3635e753c1b6e5b681fa","locales/pt-PT-json":"0d3694a92e0134549086","locales/ro-RO-json":"e83fda16c860c6d0b383","locales/ru-RU-json":"ddc13261ce5d864d36a9","locales/si-LK-json":"16eb66dbfc6c55fc85b1","locales/sk-SK-json":"782ead8707f2ad0e8e4e","locales/sl-SI-json":"82e55cf7cdbdc7d7f959","locales/sv-SE-json":"2f362899d3ac4089534f","locales/ta-IN-json":"07623a485202da63a84b","locales/th-TH-json":"4e4b97f5f6e905191383","locales/tr-TR-json":"003be1cf6ebf0b787dec","locales/uk-UA-json":"ca6ea1156db2649d3e27","locales/vi-VN-json":"9a5e5fab41a1a120a916","locales/zh-CN-json":"670c28a6ae1e3ddecaa4","locales/zh-HK-json":"93b9b676d4f4b5702797","locales/zh-TW-json":"805d10b0eed9ca51b318","vendor":"24fff00bcf5a7372c15c"}[chunkId] + ".js";
5696
+ /******/ return "excalidraw-assets-dev/" + chunkId + "-" + {"locales/ar-SA-json":"f35c4f87e6e2dcf7c20a","locales/az-AZ-json":"5d70eb8bf3f20abc3bac","locales/bg-BG-json":"88cced5fd8a6d8298501","locales/bn-BD-json":"a06588c61947851c8579","locales/ca-ES-json":"9b25933a25836cc0be23","locales/cs-CZ-json":"1d6c97ea271d017058c9","locales/da-DK-json":"34a60c9843cecd71376f","locales/de-DE-json":"d13450595b795867412b","locales/el-GR-json":"c854b199f3ac07d40294","locales/es-ES-json":"6a667bfbf4ff3d0181a7","locales/eu-ES-json":"3ec11367a80491b09056","locales/fa-IR-json":"e459964936177074abe7","locales/fi-FI-json":"f7839bb6f5ad0a3c7e0d","locales/fr-FR-json":"20e8535e2675a6736c81","locales/gl-ES-json":"861f534b46c0db1fa8db","locales/he-IL-json":"504d78736487793ffccd","locales/hi-IN-json":"82d988431011c330242a","locales/hu-HU-json":"d4150250980011726fd9","locales/id-ID-json":"82e300d4fe1e87adba9b","locales/it-IT-json":"6ecc9aec005faab90f41","locales/ja-JP-json":"3c6a065f0f1303b297fa","locales/kaa-json":"983a9ccc652aa01980f3","locales/kab-KAB-json":"cac3cf66f1db5c1a6e19","locales/kk-KZ-json":"e9dd81c22419efd44478","locales/km-KH-json":"be77acee611d96d88dda","locales/ko-KR-json":"ad8e9d31d52b26f3fbc2","locales/ku-TR-json":"ed67af91ae1920f114a8","locales/lt-LT-json":"2c3d35d6fb5dbf95a27e","locales/lv-LV-json":"fa8973c231afb2ddafe9","locales/mr-IN-json":"2949146743072eb11b40","locales/my-MM-json":"4c04ffe415641f69ed75","locales/nb-NO-json":"b8d7a5b70562dacdad45","locales/nl-NL-json":"a65f82a25fe038c45d35","locales/nn-NO-json":"858fbccbc5be386977db","locales/oc-FR-json":"a68ea08272c8da3c0e3f","locales/pa-IN-json":"90a2b3775bd7d8983def","locales/pl-PL-json":"9bb55330d5aaf336646e","locales/pt-BR-json":"3635e753c1b6e5b681fa","locales/pt-PT-json":"0d3694a92e0134549086","locales/ro-RO-json":"e83fda16c860c6d0b383","locales/ru-RU-json":"ddc13261ce5d864d36a9","locales/si-LK-json":"16eb66dbfc6c55fc85b1","locales/sk-SK-json":"782ead8707f2ad0e8e4e","locales/sl-SI-json":"82e55cf7cdbdc7d7f959","locales/sv-SE-json":"2f362899d3ac4089534f","locales/ta-IN-json":"07623a485202da63a84b","locales/th-TH-json":"4e4b97f5f6e905191383","locales/tr-TR-json":"003be1cf6ebf0b787dec","locales/uk-UA-json":"ca6ea1156db2649d3e27","locales/vi-VN-json":"9a5e5fab41a1a120a916","locales/zh-CN-json":"670c28a6ae1e3ddecaa4","locales/zh-HK-json":"93b9b676d4f4b5702797","locales/zh-TW-json":"805d10b0eed9ca51b318","vendor":"1e45dd9aba63a718dcee"}[chunkId] + ".js";
5697
5697
  /******/ };
5698
5698
  /******/ })();
5699
5699
  /******/