@zsviczian/excalidraw 0.10.0-obsidian-35 → 0.10.0-obsidian-36

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 (97) hide show
  1. package/dist/excalidraw.development.js +7 -7
  2. package/dist/excalidraw.production.min.js +1 -1
  3. package/package.json +3 -3
  4. package/types/components/Popover.d.ts +5 -1
  5. package/types/element/newElement.d.ts +1 -1
  6. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ar-SA-json-bad937b9c5872d8bb08c.d.ts +0 -0
  7. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-bg-BG-json-b75f0626e77ba4b93a1a.d.ts +0 -0
  8. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-bn-BD-json-ba2910bdfa31bf4a3b47.d.ts +0 -0
  9. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ca-ES-json-d4752239985378d6687b.d.ts +0 -0
  10. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-cs-CZ-json-3f0957ec0784a1e70989.d.ts +0 -0
  11. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-da-DK-json-30c4bddb0657ba3ec9f0.d.ts +0 -0
  12. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-de-DE-json-1f36c83788d93a26c574.d.ts +0 -0
  13. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-el-GR-json-c7749e93b5ee2ef46f01.d.ts +0 -0
  14. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-es-ES-json-c58a268683a5a98cb339.d.ts +0 -0
  15. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-eu-ES-json-a3036124af529be40107.d.ts +0 -0
  16. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-fa-IR-json-e49ff1b123f75b3fe6ae.d.ts +0 -0
  17. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-fi-FI-json-25e90ae7a679737c89fa.d.ts +0 -0
  18. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-fr-FR-json-7d9dfefbcbd632631e26.d.ts +0 -0
  19. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-he-IL-json-5f850f9fc31f38e08e11.d.ts +0 -0
  20. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-hi-IN-json-022f6946007c53005bf4.d.ts +0 -0
  21. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-hu-HU-json-29933e37837a1a237a79.d.ts +0 -0
  22. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-id-ID-json-7dc2565e1c0b98d44e81.d.ts +0 -0
  23. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-it-IT-json-30125a866f08cd0c8dce.d.ts +0 -0
  24. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ja-JP-json-045af0024c647d78ff48.d.ts +0 -0
  25. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-kab-KAB-json-dec84820b3b3b8cea91e.d.ts +0 -0
  26. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-kk-KZ-json-a2be2aa000093bb0c4b1.d.ts +0 -0
  27. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ko-KR-json-df4ca911d661a3668791.d.ts +0 -0
  28. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-lt-LT-json-e9bd2413c78d8cd605c1.d.ts +0 -0
  29. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-lv-LV-json-35f7377cd0651c3473cb.d.ts +0 -0
  30. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-my-MM-json-4326db071b2b5ad9ebd2.d.ts +0 -0
  31. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-nb-NO-json-f99ea85b15d9c0fd412f.d.ts +0 -0
  32. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-nl-NL-json-676bbee6b2201018afea.d.ts +0 -0
  33. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-nn-NO-json-1a9f7d30feff1eafa425.d.ts +0 -0
  34. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-oc-FR-json-5ce59f015d4aaae56795.d.ts +0 -0
  35. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-pa-IN-json-5edc5b8da2685495dc6f.d.ts +0 -0
  36. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-pl-PL-json-2a6bca3404366166de44.d.ts +0 -0
  37. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-pt-BR-json-df0e1971ca6c9ab7ba96.d.ts +0 -0
  38. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-pt-PT-json-088903851b38144d92cd.d.ts +0 -0
  39. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ro-RO-json-e9e42a4eea14e9780121.d.ts +0 -0
  40. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ru-RU-json-6619d335c0dc5729f858.d.ts +0 -0
  41. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-si-LK-json-29566ffe4c2aab9bc9d7.d.ts +0 -0
  42. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-sk-SK-json-68881f095026d35935f3.d.ts +0 -0
  43. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-sv-SE-json-11387dba5283047f00f2.d.ts +0 -0
  44. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-ta-IN-json-fadfdd197ff5b857ed62.d.ts +0 -0
  45. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-tr-TR-json-b92a92cca02f833721d4.d.ts +0 -0
  46. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-uk-UA-json-550e1d2467d2c10ba4c5.d.ts +0 -0
  47. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-zh-CN-json-02c2e2cacd9b605b9433.d.ts +0 -0
  48. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-zh-HK-json-24ab7abe8e695f165b3b.d.ts +0 -0
  49. package/types/packages/excalidraw/dist/excalidraw-assets/i18n-zh-TW-json-9a0e7901a1a58502bfa4.d.ts +0 -0
  50. package/types/packages/excalidraw/dist/excalidraw-assets/image-b76d879db8316c30fd0d.d.ts +0 -0
  51. package/types/packages/excalidraw/dist/excalidraw-assets/vendor-41e5c0be76c29ad2aba4.d.ts +0 -0
  52. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ar-SA-json-37ef19edefea75b3680e.d.ts +2 -0
  53. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-bg-BG-json-7d5458f5cc2a84d8f6e2.d.ts +2 -0
  54. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-bn-BD-json-448d07219c41f8dbb55b.d.ts +2 -0
  55. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ca-ES-json-1b5b2fc0229d73e426e2.d.ts +2 -0
  56. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-cs-CZ-json-eb093b2c8ac7708896f3.d.ts +2 -0
  57. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-da-DK-json-d8afa5e01e2078a828c2.d.ts +2 -0
  58. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-de-DE-json-a6cee4c1996e3aafa069.d.ts +2 -0
  59. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-el-GR-json-9db54ad72bc0f1b46368.d.ts +2 -0
  60. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-es-ES-json-6d364eae9cd78b062862.d.ts +2 -0
  61. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-eu-ES-json-a6295f834d0adb4083eb.d.ts +2 -0
  62. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-fa-IR-json-994aead70f24c0e04f88.d.ts +2 -0
  63. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-fi-FI-json-0208c92c12556594091e.d.ts +2 -0
  64. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-fr-FR-json-d12919b5af660f8cd0e2.d.ts +2 -0
  65. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-he-IL-json-ee1c784d61ae761756b4.d.ts +2 -0
  66. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-hi-IN-json-77fcce82aa2ea23ebc57.d.ts +2 -0
  67. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-hu-HU-json-2afc786729254afcc04b.d.ts +2 -0
  68. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-id-ID-json-261de18ed01a905bb8a7.d.ts +2 -0
  69. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-it-IT-json-02005e1fe5f9ef001a3e.d.ts +2 -0
  70. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ja-JP-json-ee12ac450c12bf9abd0a.d.ts +2 -0
  71. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-kab-KAB-json-4b948b48bde7a5aa988b.d.ts +2 -0
  72. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-kk-KZ-json-4902d8f64c4c6345ea0e.d.ts +2 -0
  73. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ko-KR-json-afd4100bf8ede6c92721.d.ts +2 -0
  74. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-lt-LT-json-a611d0fc2fe568829b13.d.ts +2 -0
  75. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-lv-LV-json-f95d6c285bf18cdd5eaa.d.ts +2 -0
  76. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-my-MM-json-84db1bbb92c1dee8e250.d.ts +2 -0
  77. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-nb-NO-json-d80c0c3712700e7aaad3.d.ts +2 -0
  78. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-nl-NL-json-67080c662a350e8983ec.d.ts +2 -0
  79. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-nn-NO-json-5d74e695d9a164368952.d.ts +2 -0
  80. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-oc-FR-json-19acf217a1bd641a3e5f.d.ts +2 -0
  81. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pa-IN-json-6070668134134cdc4cc5.d.ts +2 -0
  82. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pl-PL-json-49b6e8525a0d9ac86381.d.ts +2 -0
  83. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pt-BR-json-194bb19328e2a094db3f.d.ts +2 -0
  84. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-pt-PT-json-8959660f187eb41da2fc.d.ts +2 -0
  85. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ro-RO-json-a61aaf893c100b18bbb8.d.ts +2 -0
  86. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ru-RU-json-8fb78f4f8f1373c5c428.d.ts +2 -0
  87. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-si-LK-json-0a6676ca84d9add83859.d.ts +2 -0
  88. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-sk-SK-json-bc378d74487614e52ac9.d.ts +2 -0
  89. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-sv-SE-json-aadcfeee9542d5b32173.d.ts +2 -0
  90. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-ta-IN-json-4e673cde4ee803280436.d.ts +2 -0
  91. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-tr-TR-json-4bcb79efe0490c66f154.d.ts +2 -0
  92. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-uk-UA-json-1482d7b2e2e8a0232419.d.ts +2 -0
  93. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-zh-CN-json-8c7c0fec6b0765479622.d.ts +2 -0
  94. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-zh-HK-json-70b4a1bb0d8d99abfa2a.d.ts +2 -0
  95. package/types/packages/excalidraw/dist/excalidraw-assets-dev/i18n-zh-TW-json-d4e760d2810c47bf381a.d.ts +2 -0
  96. package/types/packages/excalidraw/dist/excalidraw-assets-dev/image-8825d180ee32659f8996.d.ts +0 -0
  97. package/types/types.d.ts +1 -0
@@ -1885,7 +1885,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
1885
1885
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1886
1886
 
1887
1887
  "use strict";
1888
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"showFourthFont\\\": () => (/* binding */ showFourthFont),\\n/* harmony export */ \\\"useIsMobile\\\": () => (/* binding */ useIsMobile),\\n/* harmony export */ \\\"useExcalidrawContainer\\\": () => (/* binding */ useExcalidrawContainer),\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! nanoid */ \\\"../../../node_modules/nanoid/index.dev.js\\\");\\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \\\"../../actions/index.ts\\\");\\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \\\"../../actions/actionHistory.tsx\\\");\\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \\\"../../actions/manager.tsx\\\");\\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \\\"../../actions/register.ts\\\");\\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \\\"../../analytics.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \\\"../../clipboard.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \\\"../../data/index.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \\\"../../gesture.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \\\"../../history.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer */ \\\"../../renderer/index.ts\\\");\\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \\\"../../scene/index.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \\\"../../scene/zoom.ts\\\");\\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \\\"../../shapes.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \\\"../../components/ContextMenu.tsx\\\");\\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \\\"../../components/LayerUI.tsx\\\");\\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Stats */ \\\"../../components/Stats.tsx\\\");\\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Toast */ \\\"../../components/Toast.tsx\\\");\\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \\\"../../actions/actionToggleViewMode.tsx\\\");\\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../data/blob */ \\\"../../data/blob.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! lodash.throttle */ \\\"../../../node_modules/lodash.throttle/index.js\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_43__);\\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../data/filesystem */ \\\"../../data/filesystem.ts\\\");\\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_resizeElements__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../element/resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nlet showFourthFont = false;\\r\\nconst IsMobileContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext(false);\\r\\nconst useIsMobile = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(IsMobileContext);\\r\\n};\\r\\nconst ExcalidrawContainerContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext({\\r\\n container: null,\\r\\n id: null\\r\\n});\\r\\nconst useExcalidrawContainer = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(ExcalidrawContainerContext);\\r\\n};\\r\\nlet didTapTwice = false;\\r\\nlet tappedTwiceTimer = 0;\\r\\nlet cursorX = 0;\\r\\nlet cursorY = 0;\\r\\nlet isHoldingSpace = false;\\r\\nlet isPanning = false;\\r\\nlet isDraggingScrollBar = false;\\r\\nlet currentScrollBars = {\\r\\n horizontal: null,\\r\\n vertical: null\\r\\n};\\r\\nlet touchTimeout = 0;\\r\\nlet invalidateContextMenu = false;\\r\\nlet lastPointerUp = null;\\r\\nconst gesture = {\\r\\n pointers: new Map(),\\r\\n lastCenter: null,\\r\\n initialDistance: null,\\r\\n initialScale: null\\r\\n};\\r\\nclass App extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {\\r\\n constructor(props) {\\r\\n var _a;\\r\\n var _this;\\r\\n super(props);\\r\\n _this = this;\\r\\n _initialiseProps.call(this);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\\r\\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name } = props;\\r\\n this.state = _objectSpread(_objectSpread(_objectSpread({}, defaultAppState), {}, {\\r\\n theme,\\r\\n isLoading: true\\r\\n }, this.getCanvasOffsets()), {}, {\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\\r\\n name,\\r\\n width: window.innerWidth,\\r\\n height: window.innerHeight\\r\\n });\\r\\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_49__.nanoid)();\\r\\n if (excalidrawRef) {\\r\\n const readyPromise = \\\"current\\\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\\r\\n const api = {\\r\\n ready: true,\\r\\n readyPromise,\\r\\n updateScene: this.updateScene,\\r\\n addFiles: this.addFiles,\\r\\n resetScene: this.resetScene,\\r\\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\\r\\n history: {\\r\\n clear: this.resetHistory\\r\\n },\\r\\n scrollToContent: this.scrollToContent,\\r\\n zoomToFit: this.zoomToFit,\\r\\n getSceneElements: this.getSceneElements,\\r\\n getAppState: function () {\\r\\n return _this.state;\\r\\n },\\r\\n getFiles: function () {\\r\\n return _this.files;\\r\\n },\\r\\n refresh: this.refresh,\\r\\n importLibrary: this.importLibraryFromUrl,\\r\\n setToastMessage: this.setToastMessage,\\r\\n updateContainerSize: this.updateContainerSize,\\r\\n id: this.id,\\r\\n setLocalFont: this.setLocalFont\\r\\n };\\r\\n if (typeof excalidrawRef === \\\"function\\\") {\\r\\n excalidrawRef(api);\\r\\n }\\r\\n else {\\r\\n excalidrawRef.current = api;\\r\\n }\\r\\n readyPromise.resolve(api);\\r\\n }\\r\\n this.excalidrawContainerValue = {\\r\\n container: this.excalidrawContainerRef.current,\\r\\n id: this.id\\r\\n };\\r\\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__[\\\"default\\\"]();\\r\\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__[\\\"default\\\"](this);\\r\\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__[\\\"default\\\"]();\\r\\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, function () {\\r\\n return _this.state;\\r\\n }, function () {\\r\\n return _this.scene.getElementsIncludingDeleted();\\r\\n }, this);\\r\\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\\r\\n }\\r\\n renderCanvas() {\\r\\n const canvasScale = window.devicePixelRatio;\\r\\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled } = this.state;\\r\\n const canvasWidth = canvasDOMWidth * canvasScale;\\r\\n const canvasHeight = canvasDOMHeight * canvasScale;\\r\\n if (viewModeEnabled) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight,\\r\\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n onDoubleClick: this.handleCanvasDoubleClick,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n render() {\\r\\n var _a, _b;\\r\\n var _this2 = this;\\r\\n const { zenModeEnabled, viewModeEnabled } = this.state;\\r\\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats } = this.props;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"])(\\\"excalidraw excalidraw-container\\\", {\\r\\n \\\"excalidraw--view-mode\\\": viewModeEnabled,\\r\\n \\\"excalidraw--mobile\\\": this.isMobile\\r\\n }),\\r\\n ref: this.excalidrawContainerRef,\\r\\n onDrop: this.handleAppOnDrop,\\r\\n tabIndex: 0,\\r\\n onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(ExcalidrawContainerContext.Provider, {\\r\\n value: this.excalidrawContainerValue,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsxs)(IsMobileContext.Provider, {\\r\\n value: this.isMobile,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__[\\\"default\\\"], {\\r\\n canvas: this.canvas,\\r\\n appState: this.state,\\r\\n files: this.files,\\r\\n setAppState: this.setAppState,\\r\\n actionManager: this.actionManager,\\r\\n elements: this.scene.getElements(),\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n onLockToggle: this.toggleLock,\\r\\n onInsertElements: function (elements) {\\r\\n return _this2.addElementsFromPasteOrLibrary({\\r\\n elements,\\r\\n position: \\\"center\\\",\\r\\n files: null\\r\\n });\\r\\n },\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n toggleZenMode: this.toggleZenMode,\\r\\n langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code,\\r\\n isCollaborating: this.props.isCollaborating || false,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderCustomFooter: renderFooter,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \\\"undefined\\\" && zenModeEnabled,\\r\\n showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \\\"undefined\\\" && this.props.UIOptions.canvasActions.theme,\\r\\n libraryReturnUrl: this.props.libraryReturnUrl,\\r\\n UIOptions: this.props.UIOptions,\\r\\n focusContainer: this.focusContainer,\\r\\n library: this.library,\\r\\n id: this.id,\\r\\n onImageAction: this.onImageAction\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-textEditorContainer\\\"\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-contextMenuContainer\\\"\\r\\n }), this.state.showStats && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_38__.Stats, {\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n elements: this.scene.getElements(),\\r\\n onClose: this.toggleStats,\\r\\n renderCustomStats: renderCustomStats\\r\\n }), this.state.toastMessage !== null && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_39__.Toast, {\\r\\n message: this.state.toastMessage,\\r\\n clearToast: this.clearToast\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"main\\\", {\\r\\n children: this.renderCanvas()\\r\\n })]\\r\\n })\\r\\n })\\r\\n });\\r\\n }\\r\\n componentDidMount() {\\r\\n var _this3 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a, _b;\\r\\n _this3.excalidrawContainerValue.container = _this3.excalidrawContainerRef.current;\\r\\n if (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n const setState = _this3.setState.bind(_this3);\\r\\n Object.defineProperties(window.h, {\\r\\n state: {\\r\\n configurable: true,\\r\\n get: function () {\\r\\n return _this3.state;\\r\\n }\\r\\n },\\r\\n setState: {\\r\\n configurable: true,\\r\\n value: function () {\\r\\n return _this3.setState(...arguments);\\r\\n }\\r\\n },\\r\\n app: {\\r\\n configurable: true,\\r\\n value: _this3\\r\\n },\\r\\n history: {\\r\\n configurable: true,\\r\\n value: _this3.history\\r\\n }\\r\\n });\\r\\n }\\r\\n _this3.scene.addCallback(_this3.onSceneUpdated);\\r\\n _this3.addEventListeners();\\r\\n if (_this3.excalidrawContainerRef.current) {\\r\\n _this3.focusContainer();\\r\\n }\\r\\n if (\\\"ResizeObserver\\\" in window && ((_a = _this3.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\\r\\n _this3.resizeObserver = new ResizeObserver(function () {\\r\\n // compute isMobile state\\r\\n // ---------------------------------------------------------------------\\r\\n const { width, height } = _this3.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this3.isMobile = width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE; // refresh offsets\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.updateDOMRect();\\r\\n });\\r\\n (_b = _this3.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n else if (window.matchMedia) {\\r\\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\\r\\n const handler = function () {\\r\\n return _this3.isMobile = mediaQuery.matches;\\r\\n };\\r\\n mediaQuery.addListener(handler);\\r\\n _this3.detachIsMobileMqHandler = function () {\\r\\n return mediaQuery.removeListener(handler);\\r\\n };\\r\\n }\\r\\n const searchParams = new URLSearchParams(window.location.search.slice(1));\\r\\n if (searchParams.has(\\\"web-share-target\\\")) {\\r\\n // Obtain a file that was shared via the Web Share Target API.\\r\\n _this3.restoreFileFromShare();\\r\\n }\\r\\n else {\\r\\n _this3.updateDOMRect(_this3.initializeScene);\\r\\n }\\r\\n })();\\r\\n }\\r\\n componentWillUnmount() {\\r\\n var _a;\\r\\n this.files = {};\\r\\n this.imageCache.clear();\\r\\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\\r\\n this.unmounted = true;\\r\\n this.removeEventListeners();\\r\\n this.scene.destroy();\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n }\\r\\n removeEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n (_d = this.detachIsMobileMqHandler) === null || _d === void 0 ? void 0 : _d.call(this);\\r\\n }\\r\\n addEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n this.removeEventListeners();\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n if (this.props.handleKeyboardGlobally) {\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, {\\r\\n passive: true\\r\\n });\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition); // rerender text elements on font load to fix #637 && #1553\\r\\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \\\"loadingdone\\\", this.onFontLoaded); // Safari-only desktop pinch zoom\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n if (this.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n if (this.props.detectScroll) {\\r\\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\\r\\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n }\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n }\\r\\n componentDidUpdate(prevProps, prevState) {\\r\\n var _a, _b, _c;\\r\\n var _this4 = this;\\r\\n if (prevProps.langCode !== this.props.langCode) {\\r\\n this.updateLanguage();\\r\\n }\\r\\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\\r\\n this.setState({\\r\\n viewModeEnabled: !!this.props.viewModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\\r\\n this.addEventListeners();\\r\\n this.deselectElements();\\r\\n }\\r\\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\\r\\n this.setState({\\r\\n zenModeEnabled: !!this.props.zenModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevProps.theme !== this.props.theme && this.props.theme) {\\r\\n this.setState({\\r\\n theme: this.props.theme\\r\\n });\\r\\n }\\r\\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\\r\\n this.setState({\\r\\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null\\r\\n });\\r\\n }\\r\\n if (this.props.name && prevProps.name !== this.props.name) {\\r\\n this.setState({\\r\\n name: this.props.name\\r\\n });\\r\\n }\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\\\"theme--dark\\\", this.state.theme === \\\"dark\\\");\\r\\n if (this.state.editingLinearElement && !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\\r\\n // defer so that the commitToHistory flag isn't reset via current update\\r\\n setTimeout(function () {\\r\\n _this4.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n const { multiElement } = prevState;\\r\\n if (prevState.elementType !== this.state.elementType && multiElement != null && (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\\r\\n }\\r\\n const cursorButton = {};\\r\\n const pointerViewportCoords = {};\\r\\n const remoteSelectedElementIds = {};\\r\\n const pointerUsernames = {};\\r\\n const pointerUserStates = {};\\r\\n this.state.collaborators.forEach(function (user, socketId) {\\r\\n if (user.selectedElementIds) {\\r\\n for (const id of Object.keys(user.selectedElementIds)) {\\r\\n if (!(id in remoteSelectedElementIds)) {\\r\\n remoteSelectedElementIds[id] = [];\\r\\n }\\r\\n remoteSelectedElementIds[id].push(socketId);\\r\\n }\\r\\n }\\r\\n if (!user.pointer) {\\r\\n return;\\r\\n }\\r\\n if (user.username) {\\r\\n pointerUsernames[socketId] = user.username;\\r\\n }\\r\\n if (user.userState) {\\r\\n pointerUserStates[socketId] = user.userState;\\r\\n }\\r\\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: user.pointer.x,\\r\\n sceneY: user.pointer.y\\r\\n }, _this4.state);\\r\\n cursorButton[socketId] = user.button;\\r\\n });\\r\\n const renderingElements = this.scene.getElements().filter(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(element)) {\\r\\n if ( // not placed on canvas yet (but in elements array)\\r\\n _this4.state.pendingImageElement && element.id === _this4.state.pendingImageElement.id) {\\r\\n return false;\\r\\n }\\r\\n } // don't render text element that's being currently edited (it's\\r\\n // rendered on remote only)\\r\\n return !_this4.state.editingElement || _this4.state.editingElement.type !== \\\"text\\\" || element.id !== _this4.state.editingElement.id;\\r\\n });\\r\\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_29__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\\r\\n scrollX: this.state.scrollX,\\r\\n scrollY: this.state.scrollY,\\r\\n viewBackgroundColor: this.state.viewBackgroundColor,\\r\\n zoom: this.state.zoom,\\r\\n remotePointerViewportCoords: pointerViewportCoords,\\r\\n remotePointerButton: cursorButton,\\r\\n remoteSelectedElementIds,\\r\\n remotePointerUsernames: pointerUsernames,\\r\\n remotePointerUserStates: pointerUserStates,\\r\\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\\r\\n theme: this.state.theme,\\r\\n imageCache: this.imageCache,\\r\\n isExporting: false,\\r\\n renderScrollbars: !this.isMobile\\r\\n });\\r\\n if (scrollBars) {\\r\\n currentScrollBars = scrollBars;\\r\\n }\\r\\n const scrolledOutside = // hide when editing text\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(this.state.editingElement) ? false : !atLeastOneVisibleElement && renderingElements.length > 0;\\r\\n if (this.state.scrolledOutside !== scrolledOutside) {\\r\\n this.setState({\\r\\n scrolledOutside\\r\\n });\\r\\n }\\r\\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\\r\\n this.scheduleImageRefresh(); // Do not notify consumers if we're still loading the scene. Among other\\r\\n // potential issues, this fixes a case where the tab isn't focused during\\r\\n // init, which would trigger onChange with empty elements, which would then\\r\\n // override whatever is in localStorage currently.\\r\\n if (!this.state.isLoading) {\\r\\n (_c = (_b = this.props).onChange) === null || _c === void 0 ? void 0 : _c.call(_b, this.scene.getElementsIncludingDeleted(), this.state, this.files);\\r\\n }\\r\\n }\\r\\n static resetTapTwice() {\\r\\n didTapTwice = false;\\r\\n }\\r\\n addTextFromPaste(text) {\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, this.state);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x,\\r\\n y,\\r\\n strokeColor: this.state.currentItemStrokeColor,\\r\\n backgroundColor: this.state.currentItemBackgroundColor,\\r\\n fillStyle: this.state.currentItemFillStyle,\\r\\n strokeWidth: this.state.currentItemStrokeWidth,\\r\\n strokeStyle: this.state.currentItemStrokeStyle,\\r\\n roughness: this.state.currentItemRoughness,\\r\\n opacity: this.state.currentItemOpacity,\\r\\n strokeSharpness: this.state.currentItemStrokeSharpness,\\r\\n text,\\r\\n rawText: text,\\r\\n fontSize: this.state.currentItemFontSize,\\r\\n fontFamily: this.state.currentItemFontFamily,\\r\\n textAlign: this.state.currentItemTextAlign,\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted(), element]);\\r\\n this.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n });\\r\\n this.history.resumeRecording();\\r\\n } // Collaboration\\r\\n selectShapeTool(elementType) {\\r\\n if (!isHoldingSpace) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, elementType);\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\\r\\n this.focusContainer();\\r\\n }\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(elementType)) {\\r\\n this.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n if (elementType === \\\"image\\\") {\\r\\n this.onImageAction();\\r\\n }\\r\\n if (elementType !== \\\"selection\\\") {\\r\\n this.setState({\\r\\n elementType,\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n else {\\r\\n this.setState({\\r\\n elementType\\r\\n });\\r\\n }\\r\\n }\\r\\n handleTextWysiwyg(element, _ref) {\\r\\n var _this5 = this;\\r\\n let { isExistingElement = false } = _ref;\\r\\n const updateElement = function (text, originalText, isDeleted, isSubmit, rawText) {\\r\\n _this5.scene.replaceAllElements([..._this5.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted,\\r\\n originalText,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText //should this be originalText??\\r\\n }, isSubmit);\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n };\\r\\n if (isExistingElement && this.props.onBeforeTextEdit) {\\r\\n const text = this.props.onBeforeTextEdit(element);\\r\\n if (text) {\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted: false,\\r\\n originalText: text\\r\\n }, true);\\r\\n return element;\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n }\\r\\n }\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\\r\\n id: element.id,\\r\\n appState: this.state,\\r\\n canvas: this.canvas,\\r\\n getViewportCoords: function (x, y) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n }, _this5.state);\\r\\n return [viewportX - _this5.state.offsetLeft, viewportY - _this5.state.offsetTop];\\r\\n },\\r\\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (text) {\\r\\n updateElement(text, text, false, false);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\\r\\n }\\r\\n }),\\r\\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (_ref2) {\\r\\n let { text, viaKeyboard, originalText } = _ref2;\\r\\n const isDeleted = !text.trim();\\r\\n const rawText = originalText; //should this be originalText??\\r\\n if (_this5.props.onBeforeTextSubmit) {\\r\\n const [updatedText, updatedOriginalText] = _this5.props.onBeforeTextSubmit(element, text, originalText, isDeleted);\\r\\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\\r\\n originalText = updatedOriginalText !== null && updatedOriginalText !== void 0 ? updatedOriginalText : originalText;\\r\\n }\\r\\n updateElement(text, originalText, isDeleted, true, rawText); // select the created text element only if submitting via keyboard\\r\\n // (when submitting via click it should act as signal to deselect)\\r\\n if (!isDeleted && viaKeyboard) {\\r\\n const elementIdToSelect = element.containerId ? element.containerId : element.id;\\r\\n _this5.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [elementIdToSelect]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isDeleted) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(_this5.scene.getElements(), [element]);\\r\\n }\\r\\n if (!isDeleted || isExistingElement) {\\r\\n _this5.history.resumeRecording();\\r\\n }\\r\\n _this5.setState({\\r\\n draggingElement: null,\\r\\n editingElement: null\\r\\n });\\r\\n if (_this5.state.elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this5.canvas, _this5.state.elementType);\\r\\n }\\r\\n _this5.focusContainer();\\r\\n }),\\r\\n element,\\r\\n excalidrawContainer: this.excalidrawContainerRef.current,\\r\\n app: this\\r\\n }); // deselect all other elements when inserting text\\r\\n this.deselectElements(); // do an initial update to re-initialize element position since we were\\r\\n // modifying element's x/y for sake of editor (case: syncing to remote)\\r\\n updateElement(element.text, element.originalText, false, false);\\r\\n }\\r\\n deselectElements() {\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n getTextElementAtPosition(x, y) {\\r\\n const element = this.getElementAtPosition(x, y, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\\r\\n return element;\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementAtPosition(x, y, opts) {\\r\\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement);\\r\\n if (allHitElements.length > 1) {\\r\\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\\r\\n for (let index = allHitElements.length - 1; index > -1; index--) {\\r\\n if (this.state.selectedElementIds[allHitElements[index].id]) {\\r\\n return allHitElements[index];\\r\\n }\\r\\n }\\r\\n }\\r\\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1]; // If we're hitting element with highest z-index only on its bounding box\\r\\n // while also hitting other element figure, the latter should be considered.\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y) ? allHitElements[allHitElements.length - 2] : elementWithHighestZIndex;\\r\\n }\\r\\n if (allHitElements.length === 1) {\\r\\n return allHitElements[0];\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementsAtPosition(x, y) {\\r\\n var _this6 = this;\\r\\n let includeBoundTextElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\r\\n const elements = includeBoundTextElement ? this.scene.getElements() : this.scene.getElements().filter(function (element) {\\r\\n return !((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && element.containerId);\\r\\n });\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(elements, function (element) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, _this6.state, x, y);\\r\\n });\\r\\n }\\r\\n maybeCleanupAfterMissingPointerUp(event) {\\r\\n if (lastPointerUp !== null) {\\r\\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\\r\\n // this can happen when a contextual menu or alert is triggered. In order to avoid\\r\\n // being in a weird state, we clean up on the next pointerdown\\r\\n lastPointerUp(event);\\r\\n }\\r\\n } // Returns whether the event is a panning\\r\\n updateGestureOnPointerDown(event) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n if (gesture.pointers.size === 2) {\\r\\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n gesture.initialScale = this.state.zoom.value;\\r\\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n }\\r\\n }\\r\\n initialPointerDownState(event) {\\r\\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return {\\r\\n origin,\\r\\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\\r\\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\\r\\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\\r\\n // we need to duplicate because we'll be updating this state\\r\\n lastCoords: _objectSpread({}, origin),\\r\\n originalElements: this.scene.getElements().reduce(function (acc, element) {\\r\\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\\r\\n return acc;\\r\\n }, new Map()),\\r\\n resize: {\\r\\n handleType: false,\\r\\n isResizing: false,\\r\\n offset: {\\r\\n x: 0,\\r\\n y: 0\\r\\n },\\r\\n arrowDirection: \\\"origin\\\",\\r\\n center: {\\r\\n x: (maxX + minX) / 2,\\r\\n y: (maxY + minY) / 2\\r\\n }\\r\\n },\\r\\n hit: {\\r\\n element: null,\\r\\n allHitElements: [],\\r\\n wasAddedToSelection: false,\\r\\n hasBeenDuplicated: false,\\r\\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\\r\\n hasHitElementInside: false\\r\\n },\\r\\n drag: {\\r\\n hasOccurred: false,\\r\\n offset: null\\r\\n },\\r\\n eventListeners: {\\r\\n onMove: null,\\r\\n onUp: null,\\r\\n onKeyUp: null,\\r\\n onKeyDown: null\\r\\n },\\r\\n boxSelection: {\\r\\n hasOccurred: false\\r\\n }\\r\\n };\\r\\n } // Returns whether the event is a dragging a scrollbar\\r\\n handleDraggingScrollBar(event, pointerDownState) {\\r\\n var _this7 = this;\\r\\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\\r\\n return false;\\r\\n }\\r\\n isDraggingScrollBar = true;\\r\\n pointerDownState.lastCoords.x = event.clientX;\\r\\n pointerDownState.lastCoords.y = event.clientY;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n _this7.handlePointerMoveOverScrollbars(event, pointerDownState);\\r\\n });\\r\\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isDraggingScrollBar = false;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this7.canvas, _this7.state.elementType);\\r\\n lastPointerUp = null;\\r\\n _this7.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this7.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n });\\r\\n lastPointerUp = onPointerUp;\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n return true;\\r\\n }\\r\\n isASelectedElement(hitElement) {\\r\\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\\r\\n }\\r\\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\\r\\n if (selectedElements.length < 2) {\\r\\n return false;\\r\\n } // How many pixels off the shape boundary we still consider a hit\\r\\n const threshold = 10 / this.state.zoom.value;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return point.x > x1 - threshold && point.x < x2 + threshold && point.y > y1 - threshold && point.y < y2 + threshold;\\r\\n }\\r\\n onKeyDownFromPointerDownHandler(pointerDownState) {\\r\\n var _this8 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (_this8.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this8.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onKeyUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this9 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // Prevents focus from escaping excalidraw tab\\r\\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\\r\\n if (_this9.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this9.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onPointerMoveFromPointerDownHandler(pointerDownState) {\\r\\n var _this10 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a, _b;\\r\\n // We need to initialize dragOffsetXY only after we've updated\\r\\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\\r\\n // event handler should hopefully ensure we're already working with\\r\\n // the updated state.\\r\\n if (pointerDownState.drag.offset === null) {\\r\\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state), pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n }\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n if (_this10.handlePointerMoveOverScrollbars(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this10.state);\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this10.state.gridSize); // for arrows/lines, don't start dragging until a given threshold\\r\\n // to ensure we don't create a 2-point arrow by mistake when\\r\\n // user clicks mouse in a way that it moves a tiny bit (thus\\r\\n // triggering pointermove)\\r\\n if (!pointerDownState.drag.hasOccurred && (_this10.state.elementType === \\\"arrow\\\" || _this10.state.elementType === \\\"line\\\")) {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n if (pointerDownState.resize.isResizing) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n if (_this10.maybeHandleResize(pointerDownState, event)) {\\r\\n return true;\\r\\n }\\r\\n }\\r\\n if (_this10.state.editingLinearElement) {\\r\\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(_this10.state, function (appState) {\\r\\n return _this10.setState(appState);\\r\\n }, pointerCoords.x, pointerCoords.y, function (element, pointsSceneCoords) {\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\\r\\n });\\r\\n if (didDrag) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this10.isASelectedElement(element);\\r\\n });\\r\\n if ((hasHitASelectedElement || pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) && ( // this allows for box-selecting points when clicking inside the\\r\\n // line's bounding box\\r\\n !_this10.state.editingLinearElement || !event.shiftKey) && ( // box-selecting without shift when editing line, not clicking on a line\\r\\n !_this10.state.editingLinearElement || ((_a = _this10.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !== ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) || pointerDownState.hit.hasHitElementInside)) {\\r\\n // Marking that click was used for dragging to check\\r\\n // if elements should be deselected on pointerup\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state); // prevent dragging even if we're no longer holding cmd/ctrl otherwise\\r\\n // it would have weird results (stuff jumping all over the screen)\\r\\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\\r\\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n const [dragDistanceX, dragDistanceY] = [Math.abs(pointerCoords.x - pointerDownState.origin.x), Math.abs(pointerCoords.y - pointerDownState.origin.y)]; // We only drag in one direction if shift is pressed\\r\\n const lockDirection = event.shiftKey;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, _this10.state);\\r\\n _this10.maybeSuggestBindingForAll(selectedElements); // We duplicate the selected element if alt is pressed on pointer move\\r\\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\\r\\n // Move the currently selected elements to the top of the z index stack, and\\r\\n // put the duplicates where the selected elements used to be.\\r\\n // (the origin point where the dragging started)\\r\\n pointerDownState.hit.hasBeenDuplicated = true;\\r\\n const nextElements = [];\\r\\n const elementsToAppend = [];\\r\\n const groupIdMap = new Map();\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const elements = _this10.scene.getElementsIncludingDeleted();\\r\\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this10.state, true).map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n for (const element of elements) {\\r\\n if (selectedElementIds.includes(element.id) || // case: the state.selectedElementIds might not have been\\r\\n // updated yet by the time this mousemove event is fired\\r\\n element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) && pointerDownState.hit.wasAddedToSelection) {\\r\\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this10.state.editingGroupId, groupIdMap, element);\\r\\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\\r\\n x: duplicatedElement.x + (originDragX - dragX),\\r\\n y: duplicatedElement.y + (originDragY - dragY)\\r\\n });\\r\\n nextElements.push(duplicatedElement);\\r\\n elementsToAppend.push(element);\\r\\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\\r\\n }\\r\\n else {\\r\\n nextElements.push(element);\\r\\n }\\r\\n }\\r\\n const nextSceneElements = [...nextElements, ...elementsToAppend];\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \\\"duplicatesServeAsOld\\\");\\r\\n _this10.scene.replaceAllElements(nextSceneElements);\\r\\n }\\r\\n return;\\r\\n }\\r\\n } // It is very important to read this.state within each move event,\\r\\n // otherwise we would read a stale one!\\r\\n const draggingElement = _this10.state.draggingElement;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"freedraw\\\") {\\r\\n const points = draggingElement.points;\\r\\n const dx = pointerCoords.x - draggingElement.x;\\r\\n const dy = pointerCoords.y - draggingElement.y;\\r\\n const pressures = draggingElement.simulatePressure ? draggingElement.pressures : [...draggingElement.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const points = draggingElement.points;\\r\\n let dx = gridX - draggingElement.x;\\r\\n let dy = gridY - draggingElement.y;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\\r\\n ({\\r\\n width: dx,\\r\\n height: dy\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(_this10.state.elementType, dx, dy));\\r\\n }\\r\\n if (points.length === 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]]\\r\\n });\\r\\n }\\r\\n else if (points.length > 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points.slice(0, -1), [dx, dy]]\\r\\n });\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n // When creating a linear element by dragging\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], _this10.state.startBoundElement);\\r\\n }\\r\\n }\\r\\n else {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n _this10.maybeDragNewGenericElement(pointerDownState, event);\\r\\n }\\r\\n if (_this10.state.elementType === \\\"selection\\\") {\\r\\n pointerDownState.boxSelection.hasOccurred = true;\\r\\n const elements = _this10.scene.getElements();\\r\\n if (!event.shiftKey && // allows for box-selecting points (without shift)\\r\\n !_this10.state.editingLinearElement && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, _this10.state)) {\\r\\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [pointerDownState.hit.element.id]: true\\r\\n }\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this10.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n } // box-select line editor points\\r\\n if (_this10.state.editingLinearElement) {\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handleBoxSelection(event, _this10.state, _this10.setState.bind(_this10)); // regular box-select\\r\\n }\\r\\n else {\\r\\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread(_objectSpread({}, prevState.selectedElementIds), elementsWithinSelection.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})), pointerDownState.hit.element ? {\\r\\n // if using ctrl/cmd, select the hitElement only if we\\r\\n // haven't box-selected anything else\\r\\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length\\r\\n } : null)\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n } // Returns whether the pointer move happened over either scrollbar\\r\\n handlePointerMoveOverScrollbars(event, pointerDownState) {\\r\\n if (pointerDownState.scrollbars.isOverHorizontal) {\\r\\n const x = event.clientX;\\r\\n const dx = x - pointerDownState.lastCoords.x;\\r\\n this.setState({\\r\\n scrollX: this.state.scrollX - dx / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.x = x;\\r\\n return true;\\r\\n }\\r\\n if (pointerDownState.scrollbars.isOverVertical) {\\r\\n const y = event.clientY;\\r\\n const dy = y - pointerDownState.lastCoords.y;\\r\\n this.setState({\\r\\n scrollY: this.state.scrollY - dy / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.y = y;\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n }\\r\\n onPointerUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this11 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (childEvent) {\\r\\n var _a, _b;\\r\\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating } = _this11.state;\\r\\n _this11.setState({\\r\\n isResizing: false,\\r\\n isRotating: false,\\r\\n resizingElement: null,\\r\\n selectionElement: null,\\r\\n cursorButton: \\\"up\\\",\\r\\n // text elements are reset on finalize, and resetting on pointerup\\r\\n // may cause issues with double taps\\r\\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this11.state.editingElement) ? _this11.state.editingElement : null\\r\\n });\\r\\n _this11.savePointer(childEvent.clientX, childEvent.clientY, \\\"up\\\"); // Handle end of dragging a point of a linear element, might close a loop\\r\\n // and sets binding element\\r\\n if (_this11.state.editingLinearElement) {\\r\\n if (!pointerDownState.boxSelection.hasOccurred && (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !== _this11.state.editingLinearElement.elementId || !pointerDownState.hit.hasHitElementInside)) {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n else {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, _this11.state.editingLinearElement, _this11.state);\\r\\n if (editingLinearElement !== _this11.state.editingLinearElement) {\\r\\n _this11.setState({\\r\\n editingLinearElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n lastPointerUp = null;\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\\r\\n if (_this11.state.pendingImageElement) {\\r\\n _this11.setState({\\r\\n pendingImageElement: null\\r\\n });\\r\\n }\\r\\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \\\"freedraw\\\") {\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n const points = draggingElement.points;\\r\\n let dx = pointerCoords.x - draggingElement.x;\\r\\n let dy = pointerCoords.y - draggingElement.y; // Allows dots to avoid being flagged as infinitely small\\r\\n if (dx === points[0][0] && dy === points[0][1]) {\\r\\n dy += 0.0001;\\r\\n dx += 0.0001;\\r\\n }\\r\\n const pressures = draggingElement.simulatePressure ? [] : [...draggingElement.pressures, childEvent.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures,\\r\\n lastCommittedPoint: [dx, dy]\\r\\n });\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement)) {\\r\\n const imageElement = draggingElement;\\r\\n try {\\r\\n _this11.initializeImageDimensions(imageElement);\\r\\n _this11.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== imageElement.id;\\r\\n }));\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n if (draggingElement.points.length > 1) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n if (!pointerDownState.drag.hasOccurred && draggingElement && !multiElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...draggingElement.points, [pointerCoords.x - draggingElement.x, pointerCoords.y - draggingElement.y]]\\r\\n });\\r\\n _this11.setState({\\r\\n multiElement: draggingElement,\\r\\n editingElement: _this11.state.draggingElement\\r\\n });\\r\\n }\\r\\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, _this11.state, _this11.scene, pointerCoords);\\r\\n }\\r\\n _this11.setState({\\r\\n suggestedBindings: [],\\r\\n startBoundElement: null\\r\\n });\\r\\n if (!elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n elementType: \\\"selection\\\",\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" && draggingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\\r\\n // remove invisible element which was added in onPointerDown\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().slice(0, -1));\\r\\n _this11.setState({\\r\\n draggingElement: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (draggingElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\\r\\n }\\r\\n if (resizingElement) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== resizingElement.id;\\r\\n }));\\r\\n } // Code below handles selection when element(s) weren't\\r\\n // drag or added to selection on pointer down phase.\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n if (hitElement && !pointerDownState.drag.hasOccurred && !pointerDownState.hit.wasAddedToSelection && ( // if we're editing a line, pointerup shouldn't switch selection if\\r\\n // box selected\\r\\n !_this11.state.editingLinearElement || !pointerDownState.boxSelection.hasOccurred)) {\\r\\n // when inside line editor, shift selects points instead\\r\\n if (childEvent.shiftKey && !_this11.state.editingLinearElement) {\\r\\n if (_this11.state.selectedElementIds[hitElement.id]) {\\r\\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(_this11.state, hitElement)) {\\r\\n // We want to unselect all groups hitElement is part of\\r\\n // as well as all elements that are part of the groups\\r\\n // hitElement is part of\\r\\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds.flatMap(function (groupId) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(_this11.scene.getElements(), groupId);\\r\\n }).map(function (element) {\\r\\n return {\\r\\n [element.id]: false\\r\\n };\\r\\n }).reduce(function (prevId, acc) {\\r\\n return _objectSpread(_objectSpread({}, prevId), acc);\\r\\n }, {});\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedGroupIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), hitElement.groupIds.map(function (gId) {\\r\\n return {\\r\\n [gId]: false\\r\\n };\\r\\n }).reduce(function (prev, acc) {\\r\\n return _objectSpread(_objectSpread({}, prev), acc);\\r\\n }, {})),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups)\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n // remove element from selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: false\\r\\n })\\r\\n }), _this11.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n // add element to selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return _objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n }\\r\\n }), _this11.scene.getElements()));\\r\\n });\\r\\n }\\r\\n }\\r\\n if (!_this11.state.editingLinearElement && !pointerDownState.drag.hasOccurred && !_this11.state.isResizing && (hitElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, _this11.state, pointerDownState.origin.x, pointerDownState.origin.y) || !hitElement && pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements)) {\\r\\n // Deselect selected elements\\r\\n _this11.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\" && draggingElement) {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" || (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(_this11.scene.getElements(), _this11.state)) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\\r\\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this11.scene.getElements(), _this11.state));\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: [],\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n }\\r\\n maybeSuggestBindingForAll(selectedElements) {\\r\\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\\r\\n this.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n }\\r\\n clearSelection(hitElement) {\\r\\n this.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n // Continue editing the same group if the user selected a different\\r\\n // element from it\\r\\n editingGroupId: prevState.editingGroupId && hitElement != null && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId) ? prevState.editingGroupId : null\\r\\n };\\r\\n });\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: this.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\\r\\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(this.scene.getElementsIncludingDeleted().filter(function (element) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element);\\r\\n }), x, y);\\r\\n if (elementClickedInside) {\\r\\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\\r\\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\\r\\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\\r\\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\\r\\n if (isSnappedToCenter) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: elementCenterX,\\r\\n sceneY: elementCenterY\\r\\n }, appState);\\r\\n return {\\r\\n viewportX,\\r\\n viewportY,\\r\\n elementCenterX,\\r\\n elementCenterY\\r\\n };\\r\\n }\\r\\n }\\r\\n }\\r\\n getCanvasOffsets() {\\r\\n var _a;\\r\\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = this.excalidrawContainerRef.current;\\r\\n const { left, top } = excalidrawContainer.getBoundingClientRect();\\r\\n return {\\r\\n offsetLeft: left,\\r\\n offsetTop: top\\r\\n };\\r\\n }\\r\\n return {\\r\\n offsetLeft: 0,\\r\\n offsetTop: 0\\r\\n };\\r\\n }\\r\\n updateLanguage() {\\r\\n var _this12 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find(function (lang) {\\r\\n return lang.code === _this12.props.langCode;\\r\\n }) || _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\\r\\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\\r\\n _this12.setAppState({});\\r\\n })();\\r\\n }\\r\\n} // -----------------------------------------------------------------------------\\r\\n// TEST HOOKS\\r\\n// -----------------------------------------------------------------------------\\r\\nApp.defaultProps = {\\r\\n // needed for tests to pass since we directly render App in many tests\\r\\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS\\r\\n};\\r\\nvar _initialiseProps = function () {\\r\\n var _this13 = this;\\r\\n this.canvas = null;\\r\\n this.rc = null;\\r\\n this.unmounted = false;\\r\\n this.isMobile = false;\\r\\n this.excalidrawContainerRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createRef();\\r\\n this.files = {};\\r\\n this.imageCache = new Map();\\r\\n this.focusContainer = function () {\\r\\n var _a;\\r\\n if (_this13.props.autoFocus) {\\r\\n (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\\r\\n }\\r\\n };\\r\\n this.getSceneElementsIncludingDeleted = function () {\\r\\n return _this13.scene.getElementsIncludingDeleted();\\r\\n };\\r\\n this.getSceneElements = function () {\\r\\n return _this13.scene.getElements();\\r\\n };\\r\\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (actionResult) {\\r\\n var _a, _b, _c, _d, _e, _f;\\r\\n if (_this13.unmounted || actionResult === false) {\\r\\n return;\\r\\n }\\r\\n let editingElement = null;\\r\\n if (actionResult.elements) {\\r\\n actionResult.elements.forEach(function (element) {\\r\\n var _a;\\r\\n if (((_a = _this13.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id && _this13.state.editingElement !== element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n editingElement = element;\\r\\n }\\r\\n });\\r\\n _this13.scene.replaceAllElements(actionResult.elements);\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n }\\r\\n if (actionResult.files) {\\r\\n _this13.files = actionResult.replaceFiles ? actionResult.files : _objectSpread(_objectSpread({}, _this13.files), actionResult.files);\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n if (actionResult.appState || editingElement) {\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\\r\\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\\r\\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\\r\\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_12__.THEME.LIGHT;\\r\\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : _this13.state.name;\\r\\n if (typeof _this13.props.viewModeEnabled !== \\\"undefined\\\") {\\r\\n viewModeEnabled = _this13.props.viewModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.zenModeEnabled !== \\\"undefined\\\") {\\r\\n zenModeEnabled = _this13.props.zenModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.gridModeEnabled !== \\\"undefined\\\") {\\r\\n gridSize = _this13.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\\r\\n }\\r\\n if (typeof _this13.props.theme !== \\\"undefined\\\") {\\r\\n theme = _this13.props.theme;\\r\\n }\\r\\n if (typeof _this13.props.name !== \\\"undefined\\\") {\\r\\n name = _this13.props.name;\\r\\n }\\r\\n _this13.setState(function (state) {\\r\\n var _a;\\r\\n // using Object.assign instead of spread to fool TS 4.2.2+ into\\r\\n // regarding the resulting type as not containing undefined\\r\\n // (which the following expression will never contain)\\r\\n return Object.assign(actionResult.appState || {}, {\\r\\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize,\\r\\n theme,\\r\\n name\\r\\n });\\r\\n }, function () {\\r\\n if (actionResult.syncHistory) {\\r\\n _this13.history.setCurrentState(_this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n }\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isHoldingSpace = false;\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n });\\r\\n this.onUnload = function () {\\r\\n _this13.onBlur();\\r\\n };\\r\\n this.disableEvent = function (event) {\\r\\n event.preventDefault();\\r\\n };\\r\\n this.onFontLoaded = function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.onSceneUpdated();\\r\\n };\\r\\n this.importLibraryFromUrl = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (url, token) {\\r\\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary)) {\\r\\n const hash = new URLSearchParams(window.location.hash.slice(1));\\r\\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `#${hash.toString()}`);\\r\\n }\\r\\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary)) {\\r\\n const query = new URLSearchParams(window.location.search);\\r\\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `?${query.toString()}`);\\r\\n }\\r\\n try {\\r\\n const request = yield fetch(decodeURIComponent(url));\\r\\n const blob = yield request.blob();\\r\\n const json = JSON.parse(yield blob.text());\\r\\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_14__.isValidLibrary)(json)) {\\r\\n throw new Error();\\r\\n }\\r\\n if (token === _this13.id || window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.confirmAddLibrary\\\", {\\r\\n numShapes: (json.libraryItems || json.library || []).length\\r\\n }))) {\\r\\n yield _this13.library.importLibrary(blob, \\\"published\\\"); // hack to rerender the library items after import\\r\\n if (_this13.state.isLibraryOpen) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n }\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.errorLoadingLibrary\\\"));\\r\\n console.error(error);\\r\\n }\\r\\n finally {\\r\\n _this13.focusContainer();\\r\\n }\\r\\n });\\r\\n return function (_x, _x2) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.resetHistory = function () {\\r\\n _this13.history.clear();\\r\\n };\\r\\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (opts) {\\r\\n _this13.scene.replaceAllElements([]);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), {}, {\\r\\n isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading,\\r\\n theme: _this13.state.theme\\r\\n });\\r\\n });\\r\\n _this13.resetHistory();\\r\\n });\\r\\n this.initializeScene = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n if (\\\"launchQueue\\\" in window && \\\"LaunchParams\\\" in window) {\\r\\n window.launchQueue.setConsumer(/*#__PURE__*/ function () {\\r\\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (launchParams) {\\r\\n if (!launchParams.files.length) {\\r\\n return;\\r\\n }\\r\\n const fileHandle = launchParams.files[0];\\r\\n const blob = yield fileHandle.getFile();\\r\\n blob.handle = fileHandle;\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(blob, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n });\\r\\n return function (_x3) {\\r\\n return _ref5.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n }\\r\\n if (!_this13.state.isLoading) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n }\\r\\n let initialData = null;\\r\\n try {\\r\\n initialData = (yield _this13.props.initialData) || null;\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\\r\\n _this13.libraryItemsFromStorage = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(initialData.libraryItems, \\\"unpublished\\\");\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n initialData = {\\r\\n appState: {\\r\\n errorMessage: error.message || \\\"Encountered an error during importing or restoring scene data\\\"\\r\\n }\\r\\n };\\r\\n }\\r\\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n elementType: scene.appState.elementType === \\\"image\\\" ? \\\"selection\\\" : scene.appState.elementType,\\r\\n isLoading: false\\r\\n });\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n width: _this13.state.width,\\r\\n height: _this13.state.height,\\r\\n offsetTop: _this13.state.offsetTop,\\r\\n offsetLeft: _this13.state.offsetLeft\\r\\n }), null));\\r\\n }\\r\\n _this13.resetHistory();\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n commitToHistory: true\\r\\n }));\\r\\n const libraryUrl = // current\\r\\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary) || // legacy, kept for compat reasons\\r\\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n if (libraryUrl) {\\r\\n yield _this13.importLibraryFromUrl(libraryUrl);\\r\\n }\\r\\n });\\r\\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n return (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n });\\r\\n _this13.setState({});\\r\\n });\\r\\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n const { offsetTop, offsetLeft } = _this13.getCanvasOffsets();\\r\\n _this13.setState(function (state) {\\r\\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\\r\\n return null;\\r\\n }\\r\\n return {\\r\\n offsetTop,\\r\\n offsetLeft\\r\\n };\\r\\n });\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\\r\\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.cutAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.copyAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.cutAll = function () {\\r\\n _this13.copyAll();\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected);\\r\\n };\\r\\n this.copyAll = function () {\\r\\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.copyToClipboard)(_this13.scene.getElements(), _this13.state, _this13.files);\\r\\n };\\r\\n this.onTapStart = function (event) {\\r\\n if (!didTapTwice) {\\r\\n didTapTwice = true;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\\r\\n return;\\r\\n } // insert text only if we tapped twice with a single finger\\r\\n // event.touches.length === 1 will also prevent inserting text when user's zooming\\r\\n if (didTapTwice && event.touches.length === 1) {\\r\\n const [touch] = event.touches; // @ts-ignore\\r\\n _this13.handleCanvasDoubleClick({\\r\\n clientX: touch.clientX,\\r\\n clientY: touch.clientY\\r\\n });\\r\\n didTapTwice = false;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n }\\r\\n event.preventDefault();\\r\\n if (event.touches.length === 2) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n };\\r\\n this.onTapEnd = function (event) {\\r\\n if (event.touches.length > 0) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n };\\r\\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(/*#__PURE__*/ function () {\\r\\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n // #686\\r\\n const target = document.activeElement;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);\\r\\n if (!isExcalidrawActive) {\\r\\n return;\\r\\n }\\r\\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\\r\\n if ( // if no ClipboardEvent supplied, assume we're pasting via contextMenu\\r\\n // thus these checks don't make sense\\r\\n event && (!(elementUnderCursor instanceof HTMLCanvasElement) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\\r\\n return;\\r\\n } // must be called in the same frame (thus before any awaits) as the paste\\r\\n // event else some browsers (FF...) will clear the clipboardData\\r\\n // (something something security)\\r\\n let file = (_b = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _b === void 0 ? void 0 : _b.files[0];\\r\\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\\r\\n if (!file && data.text) {\\r\\n const string = data.text.trim();\\r\\n if (string.startsWith(\\\"<svg\\\") && string.endsWith(\\\"</svg>\\\")) {\\r\\n // ignore SVG validation/normalization which will be done during image\\r\\n // initialization\\r\\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(string);\\r\\n }\\r\\n } // prefer spreadsheet data over image file (MS Office/Libre Office)\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file) && !data.spreadsheet) {\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (_this13.props.onPaste) {\\r\\n try {\\r\\n if ((yield _this13.props.onPaste(data, event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if (data.errorMessage) {\\r\\n _this13.setState({\\r\\n errorMessage: data.errorMessage\\r\\n });\\r\\n }\\r\\n else if (data.spreadsheet) {\\r\\n _this13.setState({\\r\\n pasteDialog: {\\r\\n data: data.spreadsheet,\\r\\n shown: true\\r\\n }\\r\\n });\\r\\n }\\r\\n else if (data.elements) {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: data.elements,\\r\\n files: data.files || null,\\r\\n position: \\\"cursor\\\"\\r\\n });\\r\\n }\\r\\n else if (data.text) {\\r\\n _this13.addTextFromPaste(data.text);\\r\\n }\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n event === null || event === void 0 ? void 0 : event.preventDefault();\\r\\n });\\r\\n return function (_x4) {\\r\\n return _ref6.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n this.addElementsFromPasteOrLibrary = function (opts) {\\r\\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\\r\\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\\r\\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\\r\\n const clientX = typeof opts.position === \\\"object\\\" ? opts.position.clientX : opts.position === \\\"cursor\\\" ? cursorX : _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = typeof opts.position === \\\"object\\\" ? opts.position.clientY : opts.position === \\\"cursor\\\" ? cursorY : _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const dx = x - elementsCenterX;\\r\\n const dy = y - elementsCenterY;\\r\\n const groupIdMap = new Map();\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, _this13.state.gridSize);\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const newElements = elements.map(function (element) {\\r\\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this13.state.editingGroupId, groupIdMap, element, {\\r\\n x: element.x + gridX - minX,\\r\\n y: element.y + gridY - minY\\r\\n });\\r\\n oldIdToDuplicatedId.set(element.id, newElement.id);\\r\\n return newElement;\\r\\n });\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\\r\\n const nextElements = [..._this13.scene.getElementsIncludingDeleted(), ...newElements];\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\\r\\n if (opts.files) {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), opts.files);\\r\\n }\\r\\n _this13.scene.replaceAllElements(nextElements);\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n isLibraryOpen: false,\\r\\n selectedElementIds: newElements.reduce(function (map, element) {\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(element)) {\\r\\n map[element.id] = true;\\r\\n }\\r\\n return map;\\r\\n }, {}),\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements()), function () {\\r\\n if (opts.files) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n });\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n };\\r\\n this.setAppState = function (obj) {\\r\\n _this13.setState(obj);\\r\\n };\\r\\n this.removePointer = function (event) {\\r\\n // remove touch handler for context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\" && touchTimeout) {\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n invalidateContextMenu = false;\\r\\n }\\r\\n gesture.pointers.delete(event.pointerId);\\r\\n };\\r\\n this.toggleLock = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n elementLocked: !prevState.elementLocked,\\r\\n elementType: prevState.elementLocked ? \\\"selection\\\" : prevState.elementType\\r\\n };\\r\\n });\\r\\n };\\r\\n this.toggleZenMode = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode);\\r\\n };\\r\\n this.toggleStats = function () {\\r\\n if (!_this13.state.showStats) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\\\"dialog\\\", \\\"stats\\\");\\r\\n }\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats);\\r\\n };\\r\\n this.scrollToContent = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n _this13.setState(_objectSpread({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], _this13.state, _this13.canvas)));\\r\\n };\\r\\n this.zoomToFit = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n let maxZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\\r\\n let margin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;\\r\\n if (!target) {\\r\\n target = _this13.scene.getElements();\\r\\n }\\r\\n if (target.length === 0) {\\r\\n maxZoom = 1;\\r\\n }\\r\\n _this13.setState((0,_actions__WEBPACK_IMPORTED_MODULE_5__.zoomToFitElements)(target, _this13.state, false, maxZoom, margin).appState);\\r\\n };\\r\\n this.updateContainerSize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (containers) {\\r\\n containers.forEach(function (el) {\\r\\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.rotate)(el.x + el.width, el.y + el.height, el.x + el.width / 2, el.y + el.height / 2, el.angle);\\r\\n (0,_element_resizeElements__WEBPACK_IMPORTED_MODULE_47__.resizeSingleElement)(el, true, el, \\\"se\\\", true, x, y);\\r\\n });\\r\\n });\\r\\n this.clearToast = function () {\\r\\n _this13.setState({\\r\\n toastMessage: null\\r\\n });\\r\\n };\\r\\n this.setToastMessage = function (toastMessage) {\\r\\n _this13.setState({\\r\\n toastMessage\\r\\n });\\r\\n };\\r\\n this.restoreFileFromShare = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n try {\\r\\n const webShareTargetCache = yield caches.open(\\\"web-share-target\\\");\\r\\n const file = yield webShareTargetCache.match(\\\"shared-file\\\");\\r\\n if (file) {\\r\\n const blob = yield file.blob();\\r\\n _this13.loadFileToCanvas(blob);\\r\\n yield webShareTargetCache.delete(\\\"shared-file\\\");\\r\\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (files) {\\r\\n const filesMap = files.reduce(function (acc, fileData) {\\r\\n acc.set(fileData.id, fileData);\\r\\n return acc;\\r\\n }, new Map());\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), Object.fromEntries(filesMap)); // bump versions for elements that reference added files so that\\r\\n // we/host apps can detect the change, and invalidate the image & shape\\r\\n // cache\\r\\n _this13.scene.getElements().forEach(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && filesMap.has(element.fileId)) {\\r\\n _this13.imageCache.delete(element.fileId);\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.bumpVersion)(element);\\r\\n }\\r\\n });\\r\\n _this13.scene.informMutation();\\r\\n _this13.addNewImagesToImageCache();\\r\\n });\\r\\n this.setLocalFont = function (showOnPanel) {\\r\\n showFourthFont = showOnPanel;\\r\\n };\\r\\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (sceneData) {\\r\\n if (sceneData.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n if (sceneData.appState) {\\r\\n _this13.setState(sceneData.appState);\\r\\n }\\r\\n if (sceneData.elements) {\\r\\n _this13.scene.replaceAllElements(sceneData.elements);\\r\\n }\\r\\n if (sceneData.collaborators) {\\r\\n _this13.setState({\\r\\n collaborators: sceneData.collaborators\\r\\n });\\r\\n }\\r\\n if (sceneData.libraryItems) {\\r\\n _this13.library.saveLibrary((0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(sceneData.libraryItems, \\\"unpublished\\\"));\\r\\n }\\r\\n });\\r\\n this.onSceneUpdated = function () {\\r\\n _this13.setState({});\\r\\n };\\r\\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n cursorX = event.clientX;\\r\\n cursorY = event.clientY;\\r\\n });\\r\\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // normalize `event.key` when CapsLock is pressed #2372\\r\\n if (\\\"Proxy\\\" in window && (!event.shiftKey && /^[A-Z]$/.test(event.key) || event.shiftKey && /^[a-z]$/.test(event.key))) {\\r\\n event = new Proxy(event, {\\r\\n get(ev, prop) {\\r\\n const value = ev[prop];\\r\\n if (typeof value === \\\"function\\\") {\\r\\n // fix for Proxies hijacking `this`\\r\\n return value.bind(ev);\\r\\n }\\r\\n return prop === \\\"key\\\" ? // CapsLock inverts capitalization based on ShiftKey, so invert\\r\\n // it back\\r\\n event.shiftKey ? ev.key.toUpperCase() : ev.key.toLowerCase() : value;\\r\\n }\\r\\n });\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE || // case: using arrows to move between buttons\\r\\n (0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target)) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\\r\\n _this13.setState({\\r\\n showHelpDialog: true\\r\\n });\\r\\n }\\r\\n if (_this13.actionManager.handleKeyDown(event)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && _this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: false\\r\\n });\\r\\n }\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.ZERO) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: !_this13.state.isLibraryOpen\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const step = _this13.state.gridSize && (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT : _this13.state.gridSize) || (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state, true);\\r\\n let offsetX = 0;\\r\\n let offsetY = 0;\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\\r\\n offsetX = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\\r\\n offsetX = step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\\r\\n offsetY = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\\r\\n offsetY = step;\\r\\n }\\r\\n selectedElements.forEach(function (element) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n x: element.x + offsetX,\\r\\n y: element.y + offsetY\\r\\n });\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length === 1 && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n const selectedElement = selectedElements[0];\\r\\n _this13.startTextEditing({\\r\\n sceneX: selectedElement.x + selectedElement.width / 2,\\r\\n sceneY: selectedElement.y + selectedElement.height / 2,\\r\\n shouldBind: true\\r\\n });\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (!event.ctrlKey && !event.altKey && !event.metaKey && _this13.state.draggingElement === null) {\\r\\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\\r\\n if (shape) {\\r\\n _this13.selectShapeTool(shape);\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\\r\\n _this13.toggleLock();\\r\\n }\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\\r\\n isHoldingSpace = true;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n event.preventDefault();\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (_this13.state.elementType === \\\"selection\\\" && !selectedElements.length) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G && ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(_this13.state.elementType) || selectedElements.some(function (element) {\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type);\\r\\n }))) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"backgroundColorPicker\\\"\\r\\n });\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"strokeColorPicker\\\"\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"selection\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n isHoldingSpace = false;\\r\\n }\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this13.state) ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements) : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n gesture.initialScale = _this13.state.zoom.value;\\r\\n });\\r\\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // onGestureChange only has zoom factor but not the center.\\r\\n // If we're on iPad or iPhone, then we recognize multi-touch and will\\r\\n // zoom in at the right location on the touchMove handler already.\\r\\n // On Macbook, we don't have those events so will zoom in at the\\r\\n // current location instead.\\r\\n if (gesture.pointers.size === 2) {\\r\\n return;\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (initialScale) {\\r\\n _this13.setState(function (_ref8) {\\r\\n let { zoom, offsetLeft, offsetTop } = _ref8;\\r\\n return {\\r\\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale), zoom, {\\r\\n left: offsetLeft,\\r\\n top: offsetTop\\r\\n }, {\\r\\n x: cursorX,\\r\\n y: cursorY\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n gesture.initialScale = null;\\r\\n });\\r\\n this.startTextEditing = function (_ref9) {\\r\\n var _a, _b;\\r\\n let { sceneX, sceneY, shouldBind, insertAtParentCenter = true } = _ref9;\\r\\n let parentCenterPosition = insertAtParentCenter && _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio); // bind to container when shouldBind is true or\\r\\n // clicked on center of container\\r\\n const container = shouldBind || parentCenterPosition ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(_this13.scene.getElements().filter(function (ele) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(ele);\\r\\n }), sceneX, sceneY) : null;\\r\\n let existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY); // consider bounded text element if container present\\r\\n if (container) {\\r\\n const boundTextElementId = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getBoundTextElementId)(container);\\r\\n if (boundTextElementId) {\\r\\n existingTextElement = _this13.scene.getElement(boundTextElementId);\\r\\n }\\r\\n }\\r\\n if (!existingTextElement && container) {\\r\\n const fontString = {\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily\\r\\n };\\r\\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const newHeight = Math.max(container.height, minHeight);\\r\\n const newWidth = Math.max(container.width, minWidth);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(container, {\\r\\n height: newHeight,\\r\\n width: newWidth\\r\\n });\\r\\n sceneX = container.x + newWidth / 2;\\r\\n sceneY = container.y + newHeight / 2;\\r\\n if (parentCenterPosition) {\\r\\n parentCenterPosition = _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n }\\r\\n }\\r\\n const element = existingTextElement ? existingTextElement : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x: parentCenterPosition ? parentCenterPosition.elementCenterX : sceneX,\\r\\n y: parentCenterPosition ? parentCenterPosition.elementCenterY : sceneY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n text: \\\"\\\",\\r\\n rawText: \\\"\\\",\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily,\\r\\n textAlign: parentCenterPosition ? \\\"center\\\" : _this13.state.currentItemTextAlign,\\r\\n verticalAlign: parentCenterPosition ? \\\"middle\\\" : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\\r\\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\\r\\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : []\\r\\n });\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n if (existingTextElement) {\\r\\n // if text element is no longer centered to a container, reset\\r\\n // verticalAlign to default because it's currently internal-only\\r\\n if (!parentCenterPosition || element.textAlign !== \\\"center\\\") {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]); // case: creating new text not centered to parent elemenent → offset Y\\r\\n // so that the text is centered to cursor position\\r\\n if (!parentCenterPosition) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n y: element.y - element.baseline / 2\\r\\n });\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n _this13.handleTextWysiwyg(element, {\\r\\n isExistingElement: !!existingTextElement\\r\\n });\\r\\n };\\r\\n this.handleCanvasDoubleClick = function (event) {\\r\\n // case: double-clicking with arrow/line tool selected would both create\\r\\n // text and enter multiElement mode\\r\\n if (_this13.state.multiElement) {\\r\\n return;\\r\\n } // we should only be able to double click when mode is selection\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(_this13.state);\\r\\n if (selectedGroupIds.length > 0) {\\r\\n const hitElement = _this13.getElementAtPosition(sceneX, sceneY);\\r\\n const selectedGroupId = hitElement && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, _this13.state.selectedGroupIds);\\r\\n if (selectedGroupId) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n editingGroupId: selectedGroupId,\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n },\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.viewModeEnabled) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n const selectedElement = selectedElements[0];\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(selectedElement);\\r\\n if (canBindText) {\\r\\n sceneX = selectedElement.x + selectedElement.width / 2;\\r\\n sceneY = selectedElement.y + selectedElement.height / 2;\\r\\n }\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleCanvasPointerMove = function (event) {\\r\\n _this13.savePointer(event.clientX, event.clientY, _this13.state.cursorButton);\\r\\n if (gesture.pointers.has(event.pointerId)) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (gesture.pointers.size === 2 && gesture.lastCenter && initialScale && gesture.initialDistance) {\\r\\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n const deltaX = center.x - gesture.lastCenter.x;\\r\\n const deltaY = center.y - gesture.lastCenter.y;\\r\\n gesture.lastCenter = center;\\r\\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n const scaleFactor = distance / gesture.initialDistance;\\r\\n _this13.setState(function (_ref10) {\\r\\n let { zoom, scrollX, scrollY, offsetLeft, offsetTop } = _ref10;\\r\\n return {\\r\\n scrollX: scrollX + deltaX / zoom.value,\\r\\n scrollY: scrollY + deltaY / zoom.value,\\r\\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor), zoom, {\\r\\n left: offsetLeft,\\r\\n top: offsetTop\\r\\n }, center),\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n }\\r\\n else {\\r\\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\\r\\n }\\r\\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\\r\\n return;\\r\\n }\\r\\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - _this13.state.offsetLeft, event.clientY - _this13.state.offsetTop);\\r\\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\\r\\n if (!_this13.state.draggingElement && !_this13.state.multiElement) {\\r\\n if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\\r\\n if (_this13.state.editingLinearElement && !_this13.state.editingLinearElement.isDragging) {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, _this13.state.editingLinearElement, _this13.state.gridSize);\\r\\n if (editingLinearElement !== _this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n editingLinearElement\\r\\n });\\r\\n }\\r\\n if (editingLinearElement.lastUncommittedPoint != null) {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(_this13.state.elementType)) {\\r\\n // Hovering with a selected tool or creating new linear element via click\\r\\n // and point\\r\\n const { draggingElement } = _this13.state;\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n _this13.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], _this13.state.startBoundElement);\\r\\n }\\r\\n else {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n }\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state;\\r\\n const { x: rx, y: ry } = multiElement;\\r\\n const { points, lastCommittedPoint } = multiElement;\\r\\n const lastPoint = points[points.length - 1];\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n if (lastPoint === lastCommittedPoint) {\\r\\n // if we haven't yet created a temp point and we're beyond commit-zone\\r\\n // threshold, add a point\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points, [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER); // in this branch, we're inside the commit zone, and no uncommitted\\r\\n // point exists. Thus do nothing (don't add/remove points).\\r\\n }\\r\\n }\\r\\n else if (points.length > 2 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: points.slice(0, -1)\\r\\n });\\r\\n }\\r\\n else {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, _this13.state.zoom.value)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n } // update last uncommitted point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points.slice(0, -1), [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n const hasDeselectedButton = Boolean(event.buttons);\\r\\n if (hasDeselectedButton || _this13.state.elementType !== \\\"selection\\\" && _this13.state.elementType !== \\\"text\\\") {\\r\\n return;\\r\\n }\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !isOverScrollBar && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType && elementWithTransformHandleType.transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1 && !isOverScrollBar) {\\r\\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType\\r\\n }));\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n }\\r\\n else if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getElement(_this13.state.editingLinearElement.elementId);\\r\\n if (element && (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(element, _this13.state, [scenePointer.x, scenePointer.y])) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n else if ( // if using cmd/ctrl, we're not dragging\\r\\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (hitElement || _this13.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n };\\r\\n this.handleTouchMove = function (event) {\\r\\n invalidateContextMenu = true;\\r\\n };\\r\\n this.handleCanvasPointerDown = function (event) {\\r\\n // remove any active selection when we start to interact with canvas\\r\\n // (mainly, we care about removing selection outside the component which\\r\\n // would prevent our copy handling otherwise)\\r\\n const selection = document.getSelection();\\r\\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n _this13.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\\r\\n _this13.maybeCleanupAfterMissingPointerUp(event);\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n lastPointerDownWith: event.pointerType,\\r\\n cursorButton: \\\"down\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"down\\\");\\r\\n if (_this13.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\\r\\n return;\\r\\n } // only handle left mouse button or touch\\r\\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\\r\\n return;\\r\\n }\\r\\n _this13.updateGestureOnPointerDown(event); // don't select while panning\\r\\n if (gesture.pointers.size > 1) {\\r\\n return;\\r\\n } // State for the duration of a pointer interaction, which starts with a\\r\\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\\r\\n const pointerDownState = _this13.initialPointerDownState(event);\\r\\n if (_this13.handleDraggingScrollBar(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n _this13.clearSelectionIfNotUsingSelection();\\r\\n _this13.updateBindingEnabledOnPointerMove(event);\\r\\n if (_this13.handleSelectionOnPointerDown(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n _this13.handleTextOnPointerDown(event, pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"arrow\\\" || _this13.state.elementType === \\\"line\\\") {\\r\\n _this13.handleLinearElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"image\\\") {\\r\\n // reset image preview on pointerdown\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n if (!_this13.state.pendingImageElement) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n draggingElement: _this13.state.pendingImageElement,\\r\\n editingElement: _this13.state.pendingImageElement,\\r\\n pendingImageElement: null,\\r\\n multiElement: null\\r\\n });\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_this13.state.pendingImageElement, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"freedraw\\\") {\\r\\n _this13.handleFreeDrawElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else {\\r\\n _this13.createGenericElementOnPointerDown(_this13.state.elementType, pointerDownState);\\r\\n }\\r\\n const onPointerMove = _this13.onPointerMoveFromPointerDownHandler(pointerDownState);\\r\\n const onPointerUp = _this13.onPointerUpFromPointerDownHandler(pointerDownState);\\r\\n const onKeyDown = _this13.onKeyDownFromPointerDownHandler(pointerDownState);\\r\\n const onKeyUp = _this13.onKeyUpFromPointerDownHandler(pointerDownState);\\r\\n lastPointerUp = onPointerUp;\\r\\n if (!_this13.state.viewModeEnabled) {\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\\r\\n pointerDownState.eventListeners.onMove = onPointerMove;\\r\\n pointerDownState.eventListeners.onUp = onPointerUp;\\r\\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\\r\\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\\r\\n }\\r\\n };\\r\\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = function (event) {\\r\\n // deal with opening context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\") {\\r\\n invalidateContextMenu = false;\\r\\n if (touchTimeout) {\\r\\n // If there's already a touchTimeout, this means that there's another\\r\\n // touch down and we are doing another touch, so we shouldn't open the\\r\\n // context menu.\\r\\n invalidateContextMenu = true;\\r\\n }\\r\\n else {\\r\\n // open the context menu with the first touch's clientX and clientY\\r\\n // if the touch is not moving\\r\\n touchTimeout = window.setTimeout(function () {\\r\\n touchTimeout = 0;\\r\\n if (!invalidateContextMenu) {\\r\\n _this13.handleCanvasContextMenu(event);\\r\\n }\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleCanvasPanUsingWheelOrSpaceDrag = function (event) {\\r\\n if (!(gesture.pointers.size === 0 && (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL || event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace || _this13.state.viewModeEnabled)) || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return false;\\r\\n }\\r\\n isPanning = true;\\r\\n event.preventDefault();\\r\\n let nextPastePrevented = false;\\r\\n const isLinux = /Linux/.test(window.navigator.platform);\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n let { clientX: lastX, clientY: lastY } = event;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const deltaX = lastX - event.clientX;\\r\\n const deltaY = lastY - event.clientY;\\r\\n lastX = event.clientX;\\r\\n lastY = event.clientY;\\r\\n /*\\r\\n * Prevent paste event if we move while middle clicking on Linux.\\r\\n * See issue #1383.\\r\\n */\\r\\n if (isLinux && !nextPastePrevented && (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\\r\\n nextPastePrevented = true;\\r\\n /* Prevent the next paste event */\\r\\n const preventNextPaste = function (event) {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n event.stopPropagation();\\r\\n };\\r\\n /*\\r\\n * Reenable next paste in case of disabled middle click paste for\\r\\n * any reason:\\r\\n * - rigth click paste\\r\\n * - empty clipboard\\r\\n */\\r\\n const enableNextPaste = function () {\\r\\n setTimeout(function () {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }, 100);\\r\\n };\\r\\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }\\r\\n _this13.setState({\\r\\n scrollX: _this13.state.scrollX - deltaX / _this13.state.zoom.value,\\r\\n scrollY: _this13.state.scrollY - deltaY / _this13.state.zoom.value\\r\\n });\\r\\n });\\r\\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(lastPointerUp = function () {\\r\\n lastPointerUp = null;\\r\\n isPanning = false;\\r\\n if (!isHoldingSpace) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\\r\\n passive: true\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n return true;\\r\\n };\\r\\n this.clearSelectionIfNotUsingSelection = function () {\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleSelectionOnPointerDown = function (event, pointerDownState) {\\r\\n var _a;\\r\\n if (_this13.state.elementType === \\\"selection\\\") {\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType != null) {\\r\\n _this13.setState({\\r\\n resizingElement: elementWithTransformHandleType.element\\r\\n });\\r\\n pointerDownState.resize.handleType = elementWithTransformHandleType.transformHandleType;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1) {\\r\\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n }\\r\\n if (pointerDownState.resize.handleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType: pointerDownState.resize.handleType\\r\\n }));\\r\\n pointerDownState.resize.isResizing = true;\\r\\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) && selectedElements[0].points.length === 2) {\\r\\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\\r\\n }\\r\\n }\\r\\n else {\\r\\n if (_this13.state.editingLinearElement) {\\r\\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, _this13.state, function (appState) {\\r\\n return _this13.setState(appState);\\r\\n }, _this13.history, pointerDownState.origin);\\r\\n if (ret.hitElement) {\\r\\n pointerDownState.hit.element = ret.hitElement;\\r\\n }\\r\\n if (ret.didAddPoint) {\\r\\n return true;\\r\\n }\\r\\n } // hitElement may already be set above, so check first\\r\\n pointerDownState.hit.element = (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : _this13.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n if (pointerDownState.hit.element) {\\r\\n pointerDownState.hit.hasHitElementInside = (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\\r\\n } // For overlapped elements one position may hit\\r\\n // multiple elements\\r\\n pointerDownState.hit.allHitElements = _this13.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this13.isASelectedElement(element);\\r\\n });\\r\\n if ((hitElement === null || !someHitElementIsSelected) && !event.shiftKey && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.clearSelection(hitElement);\\r\\n }\\r\\n if (_this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [_this13.state.editingLinearElement.elementId]: true\\r\\n }\\r\\n }); // If we click on something\\r\\n }\\r\\n else if (hitElement != null) {\\r\\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return _objectSpread(_objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), {}, {\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }); // mark as not completely handled so as to allow dragging etc.\\r\\n return false;\\r\\n } // deselect if item is selected\\r\\n // if shift is not clicked, this will always return true\\r\\n // otherwise, it will trigger selection based on current\\r\\n // state of the box\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n // if we are currently editing a group, exiting editing mode and deselect the group.\\r\\n if (_this13.state.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, _this13.state.editingGroupId)) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n } // Add hit element to selection. At this point if we're not holding\\r\\n // SHIFT the previously selected element(s) were deselected above\\r\\n // (make sure you use setState updater to use latest state)\\r\\n if (!someHitElementIsSelected && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this.handleTextOnPointerDown = function (event, pointerDownState) {\\r\\n // if we're currently still editing text, clicking outside\\r\\n // should only finalize it, not create another (irrespective\\r\\n // of state.elementLocked)\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return;\\r\\n }\\r\\n let sceneX = pointerDownState.origin.x;\\r\\n let sceneY = pointerDownState.origin.y;\\r\\n const element = _this13.getElementAtPosition(sceneX, sceneY, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n if (canBindText) {\\r\\n sceneX = element.x + element.width / 2;\\r\\n sceneY = element.y + element.height / 2;\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!_this13.state.elementLocked) {\\r\\n _this13.setState({\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleFreeDrawElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n // Begin a mark capture. This does not have to update state yet.\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\\r\\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n simulatePressure: event.pressure === 0.5\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n const pressures = element.simulatePressure ? element.pressures : [...element.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [[0, 0]],\\r\\n pressures\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n };\\r\\n this.createImageElement = function (_ref11) {\\r\\n let { sceneX, sceneY } = _ref11;\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(sceneX, sceneY, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newImageElement)({\\r\\n type: \\\"image\\\",\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness\\r\\n });\\r\\n return element;\\r\\n };\\r\\n this.handleLinearElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state; // finalize if completing a loop\\r\\n if (multiElement.type === \\\"line\\\" && (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, _this13.state.zoom.value)) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n const { x: rx, y: ry, lastCommittedPoint } = multiElement; // clicking inside commit zone → finalize arrow\\r\\n if (multiElement.points.length > 1 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [multiElement.id]: true\\r\\n })\\r\\n };\\r\\n }); // clicking outside commit zone → update reference for last committed\\r\\n // point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\\r\\n If so, we want it to be null for start and \\\"arrow\\\" for end. If the linear item is not\\r\\n an arrow, we want it to be null for both. Otherwise, we want it to use the\\r\\n values from appState. */\\r\\n const { currentItemStartArrowhead, currentItemEndArrowhead } = _this13.state;\\r\\n const [startArrowhead, endArrowhead] = elementType === \\\"arrow\\\" ? [currentItemStartArrowhead, currentItemEndArrowhead] : [null, null];\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n startArrowhead,\\r\\n endArrowhead\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [...element.points, [0, 0]]\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n };\\r\\n this.createGenericElementOnPointerDown = function (elementType, pointerDownState) {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness\\r\\n });\\r\\n if (element.type === \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectionElement: element,\\r\\n draggingElement: element\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n multiElement: null,\\r\\n draggingElement: element,\\r\\n editingElement: element\\r\\n });\\r\\n }\\r\\n };\\r\\n this.initializeImage = /*#__PURE__*/ function () {\\r\\n var _ref12 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (_ref13) {\\r\\n var _a, _b, _c, _d;\\r\\n let { imageFile, imageElement: _imageElement, showCursorImagePreview = false } = _ref13;\\r\\n // at this point this should be guaranteed image file, but we do this check\\r\\n // to satisfy TS down the line\\r\\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(imageFile)) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.unsupportedFileType\\\"));\\r\\n }\\r\\n const mimeType = imageFile.type;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, \\\"wait\\\");\\r\\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.normalizeSVG)(yield imageFile.text()), imageFile.name);\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error);\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.svgImageInsertError\\\"));\\r\\n }\\r\\n } // generate image id (by default the file digest) before any\\r\\n // resizing/compression takes place to keep it more portable\\r\\n const fileId = yield ((_b = (_a = _this13.props).generateIdForFile) === null || _b === void 0 ? void 0 : _b.call(_a, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.generateIdFromFile)(imageFile);\\r\\n if (!fileId) {\\r\\n console.warn(\\\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\\\");\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\"));\\r\\n }\\r\\n const existingFileData = _this13.files[fileId];\\r\\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\\r\\n try {\\r\\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error trying to resing image file on insertion\\\", error);\\r\\n }\\r\\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.fileTooBig\\\", {\\r\\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`\\r\\n }));\\r\\n }\\r\\n }\\r\\n if (showCursorImagePreview) {\\r\\n const dataURL = (_c = _this13.files[fileId]) === null || _c === void 0 ? void 0 : _c.dataURL; // optimization so that we don't unnecessarily resize the original\\r\\n // full-size file for cursor preview\\r\\n // (it's much faster to convert the resized dataURL to File)\\r\\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.dataURLToFile)(dataURL);\\r\\n _this13.setImagePreviewCursor(resizedFile || imageFile);\\r\\n }\\r\\n const dataURL = ((_d = _this13.files[fileId]) === null || _d === void 0 ? void 0 : _d.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imageFile));\\r\\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_imageElement, {\\r\\n fileId\\r\\n }, false);\\r\\n return new Promise(/*#__PURE__*/ function () {\\r\\n var _ref14 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (resolve, reject) {\\r\\n var _a, _b;\\r\\n try {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), {}, {\\r\\n [fileId]: {\\r\\n mimeType,\\r\\n id: fileId,\\r\\n dataURL,\\r\\n created: Date.now()\\r\\n }\\r\\n });\\r\\n const cachedImageData = _this13.imageCache.get(fileId);\\r\\n if (!cachedImageData) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n yield _this13.updateImageCache([imageElement]);\\r\\n }\\r\\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\\r\\n yield cachedImageData.image;\\r\\n }\\r\\n if (((_a = _this13.state.pendingImageElement) === null || _a === void 0 ? void 0 : _a.id) !== imageElement.id && ((_b = _this13.state.draggingElement) === null || _b === void 0 ? void 0 : _b.id) !== imageElement.id) {\\r\\n _this13.initializeImageDimensions(imageElement, true);\\r\\n }\\r\\n resolve(imageElement);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")));\\r\\n }\\r\\n finally {\\r\\n if (!showCursorImagePreview) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n }\\r\\n });\\r\\n return function (_x6, _x7) {\\r\\n return _ref14.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n });\\r\\n return function (_x5) {\\r\\n return _ref12.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.insertImageElement = /*#__PURE__*/ function () {\\r\\n var _ref15 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageElement, imageFile, showCursorImagePreview) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), imageElement]);\\r\\n try {\\r\\n yield _this13.initializeImage({\\r\\n imageFile,\\r\\n imageElement,\\r\\n showCursorImagePreview\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n isDeleted: true\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n _this13.setState({\\r\\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x8, _x9, _x10) {\\r\\n return _ref15.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.setImagePreviewCursor = /*#__PURE__*/ function () {\\r\\n var _ref16 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageFile) {\\r\\n // mustn't be larger than 128 px\\r\\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\\r\\n const cursorImageSizePx = 96;\\r\\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: cursorImageSizePx\\r\\n });\\r\\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imagePreview); // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\\r\\n // a small canvas\\r\\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.loadHTMLImageElement)(previewDataURL);\\r\\n let height = Math.min(img.height, cursorImageSizePx);\\r\\n let width = height * (img.width / img.height);\\r\\n if (width > cursorImageSizePx) {\\r\\n width = cursorImageSizePx;\\r\\n height = width * (img.height / img.width);\\r\\n }\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.height = height;\\r\\n canvas.width = width;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.drawImage(img, 0, 0, width, height);\\r\\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg);\\r\\n }\\r\\n if (_this13.state.pendingImageElement) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, `url(${previewDataURL}) 4 4, auto`);\\r\\n }\\r\\n });\\r\\n return function (_x11) {\\r\\n return _ref16.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.onImageAction = /*#__PURE__*/ function () {\\r\\n var _ref17 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let { insertOnCanvasDirectly } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\\r\\n insertOnCanvasDirectly: false\\r\\n };\\r\\n try {\\r\\n const clientX = _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.fileOpen)({\\r\\n description: \\\"Image\\\",\\r\\n extensions: [\\\"jpg\\\", \\\"png\\\", \\\"svg\\\", \\\"gif\\\"]\\r\\n });\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n });\\r\\n if (insertOnCanvasDirectly) {\\r\\n _this13.insertImageElement(imageElement, imageFile);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n pendingImageElement: imageElement\\r\\n }, function () {\\r\\n _this13.insertImageElement(imageElement, imageFile, \\r\\n /* showCursorImagePreview */\\r\\n true);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"AbortError\\\") {\\r\\n console.error(error);\\r\\n }\\r\\n else {\\r\\n console.warn(error);\\r\\n }\\r\\n _this13.setState({\\r\\n pendingImageElement: null,\\r\\n editingElement: null,\\r\\n elementType: \\\"selection\\\"\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref17.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.initializeImageDimensions = function (imageElement) {\\r\\n var _a;\\r\\n let forceNaturalSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(imageElement) && ((_a = _this13.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n if (!image || image instanceof Promise) {\\r\\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const placeholderSize = 100 / _this13.state.zoom.value;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x: imageElement.x - placeholderSize / 2,\\r\\n y: imageElement.y - placeholderSize / 2,\\r\\n width: placeholderSize,\\r\\n height: placeholderSize\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (forceNaturalSize || // if user-created bounding box is below threshold, assume the\\r\\n // intention was to click instead of drag, and use the image's\\r\\n // intrinsic size\\r\\n imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const minHeight = Math.max(_this13.state.height - 120, 160); // max 65% of canvas height, clamped to <300px, vh - 120px>\\r\\n const maxHeight = Math.min(minHeight, Math.floor(_this13.state.height * 0.5) / _this13.state.zoom.value);\\r\\n const height = Math.min(image.naturalHeight, maxHeight);\\r\\n const width = height * (image.naturalWidth / image.naturalHeight); // add current imageElement width/height to account for previous centering\\r\\n // of the placholder image\\r\\n const x = imageElement.x + imageElement.width / 2 - width / 2;\\r\\n const y = imageElement.y + imageElement.height / 2 - height / 2;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n };\\r\\n this.updateImageCache = /*#__PURE__*/ function () {\\r\\n var _ref18 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements) {\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.updateImageCache)({\\r\\n imageCache: _this13.imageCache,\\r\\n fileIds: elements.map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n if (updatedFiles.size || erroredFiles.size) {\\r\\n for (const element of elements) {\\r\\n if (updatedFiles.has(element.fileId)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (erroredFiles.size) {\\r\\n _this13.scene.replaceAllElements(_this13.scene.getElementsIncludingDeleted().map(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && erroredFiles.has(element.fileId)) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(element, {\\r\\n status: \\\"error\\\"\\r\\n });\\r\\n }\\r\\n return element;\\r\\n }));\\r\\n }\\r\\n return {\\r\\n updatedFiles,\\r\\n erroredFiles\\r\\n };\\r\\n });\\r\\n return function (_x12) {\\r\\n return _ref18.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.addNewImagesToImageCache = /*#__PURE__*/ function () {\\r\\n var _ref19 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let imageElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.getInitializedImageElements)(_this13.scene.getElements());\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const uncachedImageElements = imageElements.filter(function (element) {\\r\\n return !element.isDeleted && !_this13.imageCache.has(element.fileId);\\r\\n });\\r\\n if (uncachedImageElements.length) {\\r\\n const { updatedFiles } = yield _this13.updateImageCache(uncachedImageElements, files);\\r\\n if (updatedFiles.size) {\\r\\n _this13.scene.informMutation();\\r\\n }\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref19.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default()(function () {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.IMAGE_RENDER_TIMEOUT);\\r\\n this.updateBindingEnabledOnPointerMove = function (event) {\\r\\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\\r\\n if (_this13.state.isBindingEnabled !== shouldEnableBinding) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: shouldEnableBinding\\r\\n });\\r\\n }\\r\\n };\\r\\n this.maybeSuggestBindingAtCursor = function (pointerCoords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, _this13.scene);\\r\\n _this13.setState({\\r\\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : []\\r\\n });\\r\\n };\\r\\n this.maybeSuggestBindingsForLinearElementAtCoords = function (linearElement, pointerCoords, oppositeBindingBoundElement) {\\r\\n if (!pointerCoords.length) {\\r\\n return;\\r\\n }\\r\\n const suggestedBindings = pointerCoords.reduce(function (acc, coords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(coords, _this13.scene);\\r\\n if (hoveredBindableElement != null && !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\\r\\n acc.push(hoveredBindableElement);\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n _this13.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n };\\r\\n this.handleCanvasRef = function (canvas) {\\r\\n var _a, _b, _c;\\r\\n // canvas is null when unmounting\\r\\n if (canvas !== null) {\\r\\n _this13.canvas = canvas;\\r\\n _this13.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__[\\\"default\\\"].canvas(_this13.canvas);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel, {\\r\\n passive: false\\r\\n });\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n else {\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel);\\r\\n (_b = _this13.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n (_c = _this13.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n };\\r\\n this.handleAppOnDrop = /*#__PURE__*/ function () {\\r\\n var _ref20 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n try {\\r\\n if (_this13.props.onDrop) {\\r\\n try {\\r\\n if ((yield _this13.props.onDrop(event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (e) {\\r\\n console.error(e);\\r\\n }\\r\\n }\\r\\n const file = event.dataTransfer.files[0];\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file)) {\\r\\n // first attempt to decode scene from the image if it's embedded\\r\\n // ---------------------------------------------------------------------\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n return;\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"EncodingError\\\") {\\r\\n throw error;\\r\\n }\\r\\n }\\r\\n } // if no scene is embedded or we fail for whatever reason, fall back\\r\\n // to importing as regular image\\r\\n // ---------------------------------------------------------------------\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\\r\\n if (libraryShapes !== \\\"\\\") {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: JSON.parse(libraryShapes),\\r\\n position: event,\\r\\n files: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n const file = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files[0];\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib || ((_b = file === null || file === void 0 ? void 0 : file.name) === null || _b === void 0 ? void 0 : _b.endsWith(\\\".excalidrawlib\\\"))) {\\r\\n _this13.library.importLibrary(file).then(function () {\\r\\n // Close and then open to get the libraries updated\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }).catch(function (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }); // default: assume an Excalidraw file regardless of extension/MimeType\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n yield _this13.loadFileToCanvas(file);\\r\\n }\\r\\n });\\r\\n return function (_x13) {\\r\\n return _ref20.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.loadFileToCanvas = function (file) {\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n };\\r\\n this.handleCanvasContextMenu = function (event) {\\r\\n event.preventDefault();\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const element = _this13.getElementAtPosition(x, y, {\\r\\n preferSelected: true\\r\\n });\\r\\n const type = element ? \\\"element\\\" : \\\"canvas\\\";\\r\\n const container = _this13.excalidrawContainerRef.current;\\r\\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\\r\\n const left = event.clientX - offsetLeft;\\r\\n const top = event.clientY - offsetTop;\\r\\n if (element && !_this13.state.selectedElementIds[element.id]) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n }\\r\\n };\\r\\n this.maybeDragNewGenericElement = function (pointerDownState, event) {\\r\\n var _a;\\r\\n const draggingElement = _this13.state.draggingElement;\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"selection\\\") {\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event));\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this13.state.gridSize);\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(draggingElement) && ((_a = _this13.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n const aspectRatio = image && !(image instanceof Promise) ? image.width / image.height : null;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), aspectRatio);\\r\\n _this13.maybeSuggestBindingForAll([draggingElement]);\\r\\n }\\r\\n };\\r\\n this.maybeHandleResize = function (pointerDownState, event) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n const transformHandleType = pointerDownState.resize.handleType;\\r\\n _this13.setState({\\r\\n // TODO: rename this state field to \\\"isScaling\\\" to distinguish\\r\\n // it from the generic \\\"isResizing\\\" which includes scaling and\\r\\n // rotating\\r\\n isResizing: transformHandleType && transformHandleType !== \\\"rotation\\\",\\r\\n isRotating: transformHandleType === \\\"rotation\\\"\\r\\n });\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, _this13.state.gridSize);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(selectedElements[0]) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this._openContextMenu = function (_ref21, type) {\\r\\n let { left, top } = _ref21;\\r\\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const separator = \\\"separator\\\";\\r\\n const elements = _this13.scene.getElements();\\r\\n const options = [];\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\\r\\n }\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\\r\\n }\\r\\n if (type === \\\"canvas\\\") {\\r\\n const viewModeOptions = [...options, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats];\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: viewModeOptions,\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && navigator.clipboard && separator, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg, (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 || _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll, separator, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (type === \\\"element\\\") {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut, _this13.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, _this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && separator, ...options, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles, _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles, separator, maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup, maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup, (maybeGroupAction || maybeUngroupAction) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront, separator, maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal, maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n const { deltaX, deltaY } = event;\\r\\n const { selectedElementIds, previousSelectedElementIds } = _this13.state; // note that event.ctrlKey is necessary to handle pinch zooming\\r\\n if (event.metaKey || event.ctrlKey) {\\r\\n const sign = Math.sign(deltaY);\\r\\n const MAX_STEP = 10;\\r\\n let delta = Math.abs(deltaY);\\r\\n if (delta > MAX_STEP) {\\r\\n delta = MAX_STEP;\\r\\n }\\r\\n delta *= sign;\\r\\n if (Object.keys(previousSelectedElementIds).length !== 0) {\\r\\n setTimeout(function () {\\r\\n _this13.setState({\\r\\n selectedElementIds: previousSelectedElementIds,\\r\\n previousSelectedElementIds: {}\\r\\n });\\r\\n }, 1000);\\r\\n }\\r\\n let newZoom = _this13.state.zoom.value - delta / 100; // increase zoom steps the more zoomed-in we are (applies to >100% only)\\r\\n newZoom += Math.log10(Math.max(1, _this13.state.zoom.value)) * -sign; // round to nearest step\\r\\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100);\\r\\n _this13.setState(function (_ref22) {\\r\\n let { zoom, offsetLeft, offsetTop } = _ref22;\\r\\n return {\\r\\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom), zoom, {\\r\\n left: offsetLeft,\\r\\n top: offsetTop\\r\\n }, {\\r\\n x: cursorX,\\r\\n y: cursorY\\r\\n }),\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0 ? selectedElementIds : previousSelectedElementIds,\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n return;\\r\\n } // scroll horizontally when shift pressed\\r\\n if (event.shiftKey) {\\r\\n _this13.setState(function (_ref23) {\\r\\n let { zoom, scrollX } = _ref23;\\r\\n return {\\r\\n // on Mac, shift+wheel tends to result in deltaX\\r\\n scrollX: scrollX - (deltaY || deltaX) / zoom.value\\r\\n };\\r\\n });\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (_ref24) {\\r\\n let { zoom, scrollX, scrollY } = _ref24;\\r\\n return {\\r\\n scrollX: scrollX - deltaX / zoom.value,\\r\\n scrollY: scrollY - deltaY / zoom.value\\r\\n };\\r\\n });\\r\\n });\\r\\n this.savePointer = function (x, y, button) {\\r\\n var _a, _b;\\r\\n if (!x || !y) {\\r\\n return;\\r\\n }\\r\\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: x,\\r\\n clientY: y\\r\\n }, _this13.state);\\r\\n if (isNaN(pointer.x) || isNaN(pointer.y)) { // sometimes the pointer goes off screen\\r\\n }\\r\\n (_b = (_a = _this13.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\\r\\n pointer,\\r\\n button,\\r\\n pointersMap: gesture.pointers\\r\\n });\\r\\n };\\r\\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n if (!_this13.unmounted) {\\r\\n _this13.setState({\\r\\n shouldCacheIgnoreZoom: false\\r\\n });\\r\\n }\\r\\n }, 300);\\r\\n this.updateDOMRect = function (cb) {\\r\\n var _a;\\r\\n if ((_a = _this13.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = _this13.excalidrawContainerRef.current;\\r\\n const { width, height, left: offsetLeft, top: offsetTop } = excalidrawContainer.getBoundingClientRect();\\r\\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft } = _this13.state;\\r\\n if (width === currentWidth && height === currentHeight && offsetLeft === currentOffsetLeft && offsetTop === currentOffsetTop) {\\r\\n if (cb) {\\r\\n cb();\\r\\n }\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n width,\\r\\n height,\\r\\n offsetLeft,\\r\\n offsetTop\\r\\n }, function () {\\r\\n cb && cb();\\r\\n });\\r\\n }\\r\\n };\\r\\n this.refresh = function () {\\r\\n _this13.setState(_objectSpread({}, _this13.getCanvasOffsets()));\\r\\n };\\r\\n};\\r\\nif (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n window.h = window.h || {};\\r\\n Object.defineProperties(window.h, {\\r\\n elements: {\\r\\n configurable: true,\\r\\n get() {\\r\\n return this.app.scene.getElementsIncludingDeleted();\\r\\n },\\r\\n set(elements) {\\r\\n return this.app.scene.replaceAllElements(elements);\\r\\n }\\r\\n }\\r\\n });\\r\\n}\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LGdCQUFnQixFQUFFO2dCQUM1SCxJQUFJLEVBQUUsRUFBRTtvQkFDTixFQUFFLEVBQUUsQ0FBQztpQkFDTjtnQkFFRCxPQUFPO2FBQ1I7WUFFRCxPQUFPLENBQUMsUUFBUSxDQUFDO2dCQUNmLEtBQUs7Z0JBQ0wsTUFBTTtnQkFDTixVQUFVO2dCQUNWLFNBQVM7YUFDVixFQUFFO2dCQUNELEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsT0FBTyxHQUFHO1FBQ2IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsRSxDQUFDLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixJQUFJLGFBQW9CLEtBQUssaURBQVEsSUFBSSxhQUFvQixLQUFLLHdEQUFlLEVBQUU7SUFDakYsTUFBTSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUNoQyxRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUVsQixHQUFHO2dCQUNELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztZQUN0RCxDQUFDO1lBRUQsR0FBRyxDQUFDLFFBQVE7Z0JBQ1YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyRCxDQUFDO1NBRUY7S0FDRixDQUFDLENBQUM7Q0FDSjtBQUVELGlFQUFlLEdBQUcsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9jb21wb25lbnRzL0FwcC50c3g/MzhlNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2FzeW5jVG9HZW5lcmF0b3IgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvYXN5bmNUb0dlbmVyYXRvclwiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgUmVhY3QsIHsgdXNlQ29udGV4dCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCB7IG5hbm9pZCB9IGZyb20gXCJuYW5vaWRcIjtcbmltcG9ydCB7IGFjdGlvbkFkZFRvTGlicmFyeSwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25CcmluZ1RvRnJvbnQsIGFjdGlvbkNvcHksIGFjdGlvbkNvcHlBc1BuZywgYWN0aW9uQ29weUFzU3ZnLCBhY3Rpb25Db3B5U3R5bGVzLCBhY3Rpb25DdXQsIGFjdGlvbkRlbGV0ZVNlbGVjdGVkLCBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sIGFjdGlvbkZpbmFsaXplLCBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgYWN0aW9uRmxpcFZlcnRpY2FsLCBhY3Rpb25Hcm91cCwgYWN0aW9uUGFzdGVTdHlsZXMsIGFjdGlvblNlbGVjdEFsbCwgYWN0aW9uU2VuZEJhY2t3YXJkLCBhY3Rpb25TZW5kVG9CYWNrLCBhY3Rpb25Ub2dnbGVHcmlkTW9kZSwgYWN0aW9uVG9nZ2xlU3RhdHMsIGFjdGlvblRvZ2dsZVplbk1vZGUsIGFjdGlvblVuZ3JvdXAsIHpvb21Ub0ZpdEVsZW1lbnRzIH0gZnJvbSBcIi4uL2FjdGlvbnNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlZG9BY3Rpb24sIGNyZWF0ZVVuZG9BY3Rpb24gfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25IaXN0b3J5XCI7XG5pbXBvcnQgeyBBY3Rpb25NYW5hZ2VyIH0gZnJvbSBcIi4uL2FjdGlvbnMvbWFuYWdlclwiO1xuaW1wb3J0IHsgYWN0aW9ucyB9IGZyb20gXCIuLi9hY3Rpb25zL3JlZ2lzdGVyXCI7XG5pbXBvcnQgeyB0cmFja0V2ZW50IH0gZnJvbSBcIi4uL2FuYWx5dGljc1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBjb3B5VG9DbGlwYm9hcmQsIHBhcnNlQ2xpcGJvYXJkLCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZFdyaXRlVGV4dCB9IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcbmltcG9ydCB7IEFQUF9OQU1FLCBDVVJTT1JfVFlQRSwgREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hULCBERUZBVUxUX1VJX09QVElPTlMsIERFRkFVTFRfVkVSVElDQUxfQUxJR04sIERSQUdHSU5HX1RIUkVTSE9MRCwgRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5ULCBFTEVNRU5UX1RSQU5TTEFURV9BTU9VTlQsIEVOViwgRVZFTlQsIEdSSURfU0laRSwgSU1BR0VfUkVOREVSX1RJTUVPVVQsIExJTkVfQ09ORklSTV9USFJFU0hPTEQsIE1BWF9BTExPV0VEX0ZJTEVfQllURVMsIE1JTUVfVFlQRVMsIE1RX01BWF9IRUlHSFRfTEFORFNDQVBFLCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFLCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQsIFBPSU5URVJfQlVUVE9OLCBTQ1JPTExfVElNRU9VVCwgVEFQX1RXSUNFX1RJTUVPVVQsIFRFWFRfVE9fQ0VOVEVSX1NOQVBfVEhSRVNIT0xELCBUSEVNRSwgVE9VQ0hfQ1RYX01FTlVfVElNRU9VVCwgVVJMX0hBU0hfS0VZUywgVVJMX1FVRVJZX0tFWVMsIFpPT01fU1RFUCB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGxvYWRGcm9tQmxvYiB9IGZyb20gXCIuLi9kYXRhXCI7XG5pbXBvcnQgeyBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuLi9kYXRhL2pzb25cIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuLi9kYXRhL2xpYnJhcnlcIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVFbGVtZW50cywgcmVzdG9yZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuLi9kYXRhL3Jlc3RvcmVcIjtcbmltcG9ydCB7IGRyYWdOZXdFbGVtZW50LCBkcmFnU2VsZWN0ZWRFbGVtZW50cywgZHVwbGljYXRlRWxlbWVudCwgZ2V0Q29tbW9uQm91bmRzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQsIGdldERyYWdPZmZzZXRYWSwgZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlLCBnZXROb3JtYWxpemVkRGltZW5zaW9ucywgZ2V0UGVyZmVjdEVsZW1lbnRTaXplLCBnZXRSZXNpemVBcnJvd0RpcmVjdGlvbiwgZ2V0UmVzaXplT2Zmc2V0WFksIGdldFRyYW5zZm9ybUhhbmRsZVR5cGVGcm9tQ29vcmRzLCBoaXRUZXN0LCBpc0hpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3hXaXRob3V0SGl0dGluZ0VsZW1lbnQsIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LCBpc05vbkRlbGV0ZWRFbGVtZW50LCBpc1RleHRFbGVtZW50LCBuZXdFbGVtZW50LCBuZXdMaW5lYXJFbGVtZW50LCBuZXdUZXh0RWxlbWVudCwgbmV3SW1hZ2VFbGVtZW50LCB0ZXh0V3lzaXd5ZywgdHJhbnNmb3JtRWxlbWVudHMsIHVwZGF0ZVRleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGJpbmRPclVuYmluZFNlbGVjdGVkRWxlbWVudHMsIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbiwgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uLCBnZXRFbGlnaWJsZUVsZW1lbnRzRm9yQmluZGluZywgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLCBpc0JpbmRpbmdFbmFibGVkLCBpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQsIG1heWJlQmluZExpbmVhckVsZW1lbnQsIHNob3VsZEVuYWJsZUJpbmRpbmdGb3JQb2ludGVyRXZlbnQsIHVuYmluZExpbmVhckVsZW1lbnRzLCB1cGRhdGVCb3VuZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYmluZGluZ1wiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uLCBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGRlZXBDb3B5RWxlbWVudCwgbmV3RnJlZURyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvbmV3RWxlbWVudFwiO1xuaW1wb3J0IHsgaGFzQm91bmRUZXh0RWxlbWVudCwgaXNCaW5kaW5nRWxlbWVudCwgaXNCaW5kaW5nRWxlbWVudFR5cGUsIGlzQm91bmRUb0NvbnRhaW5lciwgaXNJbWFnZUVsZW1lbnQsIGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQsIGlzTGluZWFyRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50VHlwZSB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IGdldENlbnRlciwgZ2V0RGlzdGFuY2UgfSBmcm9tIFwiLi4vZ2VzdHVyZVwiO1xuaW1wb3J0IHsgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50LCBnZXRFbGVtZW50c0luR3JvdXAsIGdldFNlbGVjdGVkR3JvdXBJZEZvckVsZW1lbnQsIGdldFNlbGVjdGVkR3JvdXBJZHMsIGlzRWxlbWVudEluR3JvdXAsIGlzU2VsZWN0ZWRWaWFHcm91cCwgc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCBIaXN0b3J5IGZyb20gXCIuLi9oaXN0b3J5XCI7XG5pbXBvcnQgeyBkZWZhdWx0TGFuZywgZ2V0TGFuZ3VhZ2UsIGxhbmd1YWdlcywgc2V0TGFuZ3VhZ2UsIHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IHsgQ09ERVMsIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIsIHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8sIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlLCBpc0Fycm93S2V5LCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIGdldEdyaWRQb2ludCwgaXNQYXRoQUxvb3AsIHJvdGF0ZSB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlclwiO1xuaW1wb3J0IHsgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudCB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBjYWxjdWxhdGVTY3JvbGxDZW50ZXIsIGdldEVsZW1lbnRDb250YWluaW5nUG9zaXRpb24sIGdldEVsZW1lbnRzQXRQb3NpdGlvbiwgZ2V0RWxlbWVudHNXaXRoaW5TZWxlY3Rpb24sIGdldE5vcm1hbGl6ZWRab29tLCBnZXRTZWxlY3RlZEVsZW1lbnRzLCBoYXNCYWNrZ3JvdW5kLCBpc092ZXJTY3JvbGxCYXJzLCBpc1NvbWVFbGVtZW50U2VsZWN0ZWQgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGdldE5ld1pvb20gfSBmcm9tIFwiLi4vc2NlbmUvem9vbVwiO1xuaW1wb3J0IHsgZmluZFNoYXBlQnlLZXkgfSBmcm9tIFwiLi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZSwgZGlzdGFuY2UsIGdldEZvbnRTdHJpbmcsIGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLCBpc0lucHV0TGlrZSwgaXNUb29sSWNvbiwgaXNXcml0YWJsZUVsZW1lbnQsIHJlc2V0Q3Vyc29yLCByZXNvbHZhYmxlUHJvbWlzZSwgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzLCBzZXRDdXJzb3IsIHNldEN1cnNvckZvclNoYXBlLCB0dXBsZVRvQ29vcnMsIHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcywgd2l0aEJhdGNoZWRVcGRhdGVzIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgQ29udGV4dE1lbnUgZnJvbSBcIi4vQ29udGV4dE1lbnVcIjtcbmltcG9ydCBMYXllclVJIGZyb20gXCIuL0xheWVyVUlcIjtcbmltcG9ydCB7IFN0YXRzIH0gZnJvbSBcIi4vU3RhdHNcIjtcbmltcG9ydCB7IFRvYXN0IH0gZnJvbSBcIi4vVG9hc3RcIjtcbmltcG9ydCB7IGFjdGlvblRvZ2dsZVZpZXdNb2RlIH0gZnJvbSBcIi4uL2FjdGlvbnMvYWN0aW9uVG9nZ2xlVmlld01vZGVcIjtcbmltcG9ydCB7IGRhdGFVUkxUb0ZpbGUsIGdlbmVyYXRlSWRGcm9tRmlsZSwgZ2V0RGF0YVVSTCwgaXNTdXBwb3J0ZWRJbWFnZUZpbGUsIHJlc2l6ZUltYWdlRmlsZSwgU1ZHU3RyaW5nVG9GaWxlIH0gZnJvbSBcIi4uL2RhdGEvYmxvYlwiO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLCBsb2FkSFRNTEltYWdlRWxlbWVudCwgbm9ybWFsaXplU1ZHLCB1cGRhdGVJbWFnZUNhY2hlIGFzIF91cGRhdGVJbWFnZUNhY2hlIH0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB0aHJvdHRsZSBmcm9tIFwibG9kYXNoLnRocm90dGxlXCI7XG5pbXBvcnQgeyBmaWxlT3BlbiwgbmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCB9IGZyb20gXCIuLi9kYXRhL2ZpbGVzeXN0ZW1cIjtcbmltcG9ydCB7IGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24sIGdldEFwcHJveE1pbkxpbmVIZWlnaHQsIGdldEFwcHJveE1pbkxpbmVXaWR0aCwgZ2V0Qm91bmRUZXh0RWxlbWVudElkIH0gZnJvbSBcIi4uL2VsZW1lbnQvdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4uL2VsZW1lbnQvY29sbGlzaW9uXCI7XG5pbXBvcnQgeyByZXNpemVTaW5nbGVFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvcmVzaXplRWxlbWVudHNcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5leHBvcnQgbGV0IHNob3dGb3VydGhGb250ID0gZmFsc2U7XG5jb25zdCBJc01vYmlsZUNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dChmYWxzZSk7XG5leHBvcnQgY29uc3QgdXNlSXNNb2JpbGUgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KElzTW9iaWxlQ29udGV4dCk7XG59O1xuY29uc3QgRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQgPSAvKiNfX1BVUkVfXyovUmVhY3QuY3JlYXRlQ29udGV4dCh7XG4gIGNvbnRhaW5lcjogbnVsbCxcbiAgaWQ6IG51bGxcbn0pO1xuZXhwb3J0IGNvbnN0IHVzZUV4Y2FsaWRyYXdDb250YWluZXIgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB1c2VDb250ZXh0KEV4Y2FsaWRyYXdDb250YWluZXJDb250ZXh0KTtcbn07XG5sZXQgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbmxldCB0YXBwZWRUd2ljZVRpbWVyID0gMDtcbmxldCBjdXJzb3JYID0gMDtcbmxldCBjdXJzb3JZID0gMDtcbmxldCBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xubGV0IGlzUGFubmluZyA9IGZhbHNlO1xubGV0IGlzRHJhZ2dpbmdTY3JvbGxCYXIgPSBmYWxzZTtcbmxldCBjdXJyZW50U2Nyb2xsQmFycyA9IHtcbiAgaG9yaXpvbnRhbDogbnVsbCxcbiAgdmVydGljYWw6IG51bGxcbn07XG5sZXQgdG91Y2hUaW1lb3V0ID0gMDtcbmxldCBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSBmYWxzZTtcbmxldCBsYXN0UG9pbnRlclVwID0gbnVsbDtcbmNvbnN0IGdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBuZXcgTWFwKCksXG4gIGxhc3RDZW50ZXI6IG51bGwsXG4gIGluaXRpYWxEaXN0YW5jZTogbnVsbCxcbiAgaW5pdGlhbFNjYWxlOiBudWxsXG59O1xuXG5jbGFzcyBBcHAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgIHZhciBfdGhpcztcblxuICAgIHN1cGVyKHByb3BzKTtcbiAgICBfdGhpcyA9IHRoaXM7XG5cbiAgICBfaW5pdGlhbGlzZVByb3BzLmNhbGwodGhpcyk7XG5cbiAgICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgICBjb25zdCB7XG4gICAgICBleGNhbGlkcmF3UmVmLFxuICAgICAgdmlld01vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB6ZW5Nb2RlRW5hYmxlZCA9IGZhbHNlLFxuICAgICAgZ3JpZE1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICB0aGVtZSA9IGRlZmF1bHRBcHBTdGF0ZS50aGVtZSxcbiAgICAgIG5hbWUgPSBkZWZhdWx0QXBwU3RhdGUubmFtZVxuICAgIH0gPSBwcm9wcztcbiAgICB0aGlzLnN0YXRlID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGRlZmF1bHRBcHBTdGF0ZSksIHt9LCB7XG4gICAgICB0aGVtZSxcbiAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgIH0sIHRoaXMuZ2V0Q2FudmFzT2Zmc2V0cygpKSwge30sIHtcbiAgICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgZ3JpZFNpemU6IGdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGwsXG4gICAgICBuYW1lLFxuICAgICAgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLFxuICAgICAgaGVpZ2h0OiB3aW5kb3cuaW5uZXJIZWlnaHRcbiAgICB9KTtcbiAgICB0aGlzLmlkID0gbmFub2lkKCk7XG5cbiAgICBpZiAoZXhjYWxpZHJhd1JlZikge1xuICAgICAgY29uc3QgcmVhZHlQcm9taXNlID0gXCJjdXJyZW50XCIgaW4gZXhjYWxpZHJhd1JlZiAmJiBleGNhbGlkcmF3UmVmLmN1cnJlbnQ/LnJlYWR5UHJvbWlzZSB8fCByZXNvbHZhYmxlUHJvbWlzZSgpO1xuICAgICAgY29uc3QgYXBpID0ge1xuICAgICAgICByZWFkeTogdHJ1ZSxcbiAgICAgICAgcmVhZHlQcm9taXNlLFxuICAgICAgICB1cGRhdGVTY2VuZTogdGhpcy51cGRhdGVTY2VuZSxcbiAgICAgICAgYWRkRmlsZXM6IHRoaXMuYWRkRmlsZXMsXG4gICAgICAgIHJlc2V0U2NlbmU6IHRoaXMucmVzZXRTY2VuZSxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQsXG4gICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICBjbGVhcjogdGhpcy5yZXNldEhpc3RvcnlcbiAgICAgICAgfSxcbiAgICAgICAgc2Nyb2xsVG9Db250ZW50OiB0aGlzLnNjcm9sbFRvQ29udGVudCxcbiAgICAgICAgem9vbVRvRml0OiB0aGlzLnpvb21Ub0ZpdCxcbiAgICAgICAgZ2V0U2NlbmVFbGVtZW50czogdGhpcy5nZXRTY2VuZUVsZW1lbnRzLFxuICAgICAgICBnZXRBcHBTdGF0ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5zdGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RmlsZXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMuZmlsZXM7XG4gICAgICAgIH0sXG4gICAgICAgIHJlZnJlc2g6IHRoaXMucmVmcmVzaCxcbiAgICAgICAgaW1wb3J0TGlicmFyeTogdGhpcy5pbXBvcnRMaWJyYXJ5RnJvbVVybCxcbiAgICAgICAgc2V0VG9hc3RNZXNzYWdlOiB0aGlzLnNldFRvYXN0TWVzc2FnZSxcbiAgICAgICAgdXBkYXRlQ29udGFpbmVyU2l6ZTogdGhpcy51cGRhdGVDb250YWluZXJTaXplLFxuICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgc2V0TG9jYWxGb250OiB0aGlzLnNldExvY2FsRm9udFxuICAgICAgfTtcblxuICAgICAgaWYgKHR5cGVvZiBleGNhbGlkcmF3UmVmID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZihhcGkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhjYWxpZHJhd1JlZi5jdXJyZW50ID0gYXBpO1xuICAgICAgfVxuXG4gICAgICByZWFkeVByb21pc2UucmVzb2x2ZShhcGkpO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlID0ge1xuICAgICAgY29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGlkOiB0aGlzLmlkXG4gICAgfTtcbiAgICB0aGlzLnNjZW5lID0gbmV3IFNjZW5lKCk7XG4gICAgdGhpcy5saWJyYXJ5ID0gbmV3IExpYnJhcnkodGhpcyk7XG4gICAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkoKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIgPSBuZXcgQWN0aW9uTWFuYWdlcih0aGlzLnN5bmNBY3Rpb25SZXN1bHQsIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zdGF0ZTtcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gX3RoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgfSwgdGhpcyk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWxsKGFjdGlvbnMpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVVbmRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlci5yZWdpc3RlckFjdGlvbihjcmVhdGVSZWRvQWN0aW9uKHRoaXMuaGlzdG9yeSkpO1xuICB9XG5cbiAgcmVuZGVyQ2FudmFzKCkge1xuICAgIGNvbnN0IGNhbnZhc1NjYWxlID0gd2luZG93LmRldmljZVBpeGVsUmF0aW87XG4gICAgY29uc3Qge1xuICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICB2aWV3TW9kZUVuYWJsZWRcbiAgICB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBjYW52YXNXaWR0aCA9IGNhbnZhc0RPTVdpZHRoICogY2FudmFzU2NhbGU7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gY2FudmFzRE9NSGVpZ2h0ICogY2FudmFzU2NhbGU7XG5cbiAgICBpZiAodmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJjYW52YXNcIiwge1xuICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhd19fY2FudmFzXCIsXG4gICAgICAgIHN0eWxlOiB7XG4gICAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0LFxuICAgICAgICAgIGN1cnNvcjogQ1VSU09SX1RZUEUuR1JBQlxuICAgICAgICB9LFxuICAgICAgICB3aWR0aDogY2FudmFzV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgICByZWY6IHRoaXMuaGFuZGxlQ2FudmFzUmVmLFxuICAgICAgICBvbkNvbnRleHRNZW51OiB0aGlzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51LFxuICAgICAgICBvblBvaW50ZXJNb3ZlOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJNb3ZlLFxuICAgICAgICBvblBvaW50ZXJVcDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgICBvblBvaW50ZXJDYW5jZWw6IHRoaXMucmVtb3ZlUG9pbnRlcixcbiAgICAgICAgb25Ub3VjaE1vdmU6IHRoaXMuaGFuZGxlVG91Y2hNb3ZlLFxuICAgICAgICBvblBvaW50ZXJEb3duOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duLFxuICAgICAgICBjaGlsZHJlbjogdChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJjYW52YXNcIiwge1xuICAgICAgY2xhc3NOYW1lOiBcImV4Y2FsaWRyYXdfX2NhbnZhc1wiLFxuICAgICAgc3R5bGU6IHtcbiAgICAgICAgd2lkdGg6IGNhbnZhc0RPTVdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodFxuICAgICAgfSxcbiAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgIGhlaWdodDogY2FudmFzSGVpZ2h0LFxuICAgICAgcmVmOiB0aGlzLmhhbmRsZUNhbnZhc1JlZixcbiAgICAgIG9uQ29udGV4dE1lbnU6IHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUsXG4gICAgICBvblBvaW50ZXJEb3duOiB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duLFxuICAgICAgb25Eb3VibGVDbGljazogdGhpcy5oYW5kbGVDYW52YXNEb3VibGVDbGljayxcbiAgICAgIG9uUG9pbnRlck1vdmU6IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUsXG4gICAgICBvblBvaW50ZXJVcDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgb25Qb2ludGVyQ2FuY2VsOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICBvblRvdWNoTW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICBjaGlsZHJlbjogdChcImxhYmVscy5kcmF3aW5nQ2FudmFzXCIpXG4gICAgfSk7XG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICBjb25zdCB7XG4gICAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IHtcbiAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgcmVuZGVyRm9vdGVyLFxuICAgICAgcmVuZGVyQ3VzdG9tU3RhdHNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiZXhjYWxpZHJhdyBleGNhbGlkcmF3LWNvbnRhaW5lclwiLCB7XG4gICAgICAgIFwiZXhjYWxpZHJhdy0tdmlldy1tb2RlXCI6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgXCJleGNhbGlkcmF3LS1tb2JpbGVcIjogdGhpcy5pc01vYmlsZVxuICAgICAgfSksXG4gICAgICByZWY6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZixcbiAgICAgIG9uRHJvcDogdGhpcy5oYW5kbGVBcHBPbkRyb3AsXG4gICAgICB0YWJJbmRleDogMCxcbiAgICAgIG9uS2V5RG93bjogdGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5ID8gdW5kZWZpbmVkIDogdGhpcy5vbktleURvd24sXG4gICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQuUHJvdmlkZXIsIHtcbiAgICAgICAgdmFsdWU6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlLFxuICAgICAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3hzKElzTW9iaWxlQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICAgIHZhbHVlOiB0aGlzLmlzTW9iaWxlLFxuICAgICAgICAgIGNoaWxkcmVuOiBbLyojX19QVVJFX18qL19qc3goTGF5ZXJVSSwge1xuICAgICAgICAgICAgY2FudmFzOiB0aGlzLmNhbnZhcyxcbiAgICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgZmlsZXM6IHRoaXMuZmlsZXMsXG4gICAgICAgICAgICBzZXRBcHBTdGF0ZTogdGhpcy5zZXRBcHBTdGF0ZSxcbiAgICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IHRoaXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICAgIGVsZW1lbnRzOiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCksXG4gICAgICAgICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrOiBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgICAgICAgb25Mb2NrVG9nZ2xlOiB0aGlzLnRvZ2dsZUxvY2ssXG4gICAgICAgICAgICBvbkluc2VydEVsZW1lbnRzOiBmdW5jdGlvbiAoZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMi5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSh7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMsXG4gICAgICAgICAgICAgICAgcG9zaXRpb246IFwiY2VudGVyXCIsXG4gICAgICAgICAgICAgICAgZmlsZXM6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgemVuTW9kZUVuYWJsZWQ6IHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgdG9nZ2xlWmVuTW9kZTogdGhpcy50b2dnbGVaZW5Nb2RlLFxuICAgICAgICAgICAgbGFuZ0NvZGU6IGdldExhbmd1YWdlKCkuY29kZSxcbiAgICAgICAgICAgIGlzQ29sbGFib3JhdGluZzogdGhpcy5wcm9wcy5pc0NvbGxhYm9yYXRpbmcgfHwgZmFsc2UsXG4gICAgICAgICAgICByZW5kZXJUb3BSaWdodFVJOiByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgICAgICAgcmVuZGVyQ3VzdG9tRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQ6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgICAgICAgIHNob3dFeGl0WmVuTW9kZUJ0bjogdHlwZW9mIHRoaXMucHJvcHM/Lnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIHplbk1vZGVFbmFibGVkLFxuICAgICAgICAgICAgc2hvd1RoZW1lQnRuOiB0eXBlb2YgdGhpcy5wcm9wcz8udGhlbWUgPT09IFwidW5kZWZpbmVkXCIgJiYgdGhpcy5wcm9wcy5VSU9wdGlvbnMuY2FudmFzQWN0aW9ucy50aGVtZSxcbiAgICAgICAgICAgIGxpYnJhcnlSZXR1cm5Vcmw6IHRoaXMucHJvcHMubGlicmFyeVJldHVyblVybCxcbiAgICAgICAgICAgIFVJT3B0aW9uczogdGhpcy5wcm9wcy5VSU9wdGlvbnMsXG4gICAgICAgICAgICBmb2N1c0NvbnRhaW5lcjogdGhpcy5mb2N1c0NvbnRhaW5lcixcbiAgICAgICAgICAgIGxpYnJhcnk6IHRoaXMubGlicmFyeSxcbiAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgb25JbWFnZUFjdGlvbjogdGhpcy5vbkltYWdlQWN0aW9uXG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIlxuICAgICAgICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiXG4gICAgICAgICAgfSksIHRoaXMuc3RhdGUuc2hvd1N0YXRzICYmIC8qI19fUFVSRV9fKi9fanN4KFN0YXRzLCB7XG4gICAgICAgICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlOiB0aGlzLnNldEFwcFN0YXRlLFxuICAgICAgICAgICAgZWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgIG9uQ2xvc2U6IHRoaXMudG9nZ2xlU3RhdHMsXG4gICAgICAgICAgICByZW5kZXJDdXN0b21TdGF0czogcmVuZGVyQ3VzdG9tU3RhdHNcbiAgICAgICAgICB9KSwgdGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2UgIT09IG51bGwgJiYgLyojX19QVVJFX18qL19qc3goVG9hc3QsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRoaXMuc3RhdGUudG9hc3RNZXNzYWdlLFxuICAgICAgICAgICAgY2xlYXJUb2FzdDogdGhpcy5jbGVhclRvYXN0XG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwibWFpblwiLCB7XG4gICAgICAgICAgICBjaGlsZHJlbjogdGhpcy5yZW5kZXJDYW52YXMoKVxuICAgICAgICAgIH0pXVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgcmV0dXJuIF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoKSB7XG4gICAgICBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclZhbHVlLmNvbnRhaW5lciA9IF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG5cbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLlRFU1QgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IEVOVi5ERVZFTE9QTUVOVCkge1xuICAgICAgICBjb25zdCBzZXRTdGF0ZSA9IF90aGlzMy5zZXRTdGF0ZS5iaW5kKF90aGlzMyk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMod2luZG93LmgsIHtcbiAgICAgICAgICBzdGF0ZToge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBfdGhpczMuc3RhdGU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRTdGF0ZToge1xuICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zZXRTdGF0ZSguLi5hcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXBwOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX3RoaXMzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBoaXN0b3J5OiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogX3RoaXMzLmhpc3RvcnlcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBfdGhpczMuc2NlbmUuYWRkQ2FsbGJhY2soX3RoaXMzLm9uU2NlbmVVcGRhdGVkKTtcblxuICAgICAgX3RoaXMzLmFkZEV2ZW50TGlzdGVuZXJzKCk7XG5cbiAgICAgIGlmIChfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdyAmJiBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZj8uY3VycmVudCkge1xuICAgICAgICBfdGhpczMucmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIC8vIGNvbXB1dGUgaXNNb2JpbGUgc3RhdGVcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICAgIGhlaWdodFxuICAgICAgICAgIH0gPSBfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgICAgX3RoaXMzLmlzTW9iaWxlID0gd2lkdGggPCBNUV9NQVhfV0lEVEhfUE9SVFJBSVQgfHwgaGVpZ2h0IDwgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUgJiYgd2lkdGggPCBNUV9NQVhfV0lEVEhfTEFORFNDQVBFOyAvLyByZWZyZXNoIG9mZnNldHNcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgICAgICAgIF90aGlzMy51cGRhdGVET01SZWN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICBfdGhpczMucmVzaXplT2JzZXJ2ZXI/Lm9ic2VydmUoX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB9IGVsc2UgaWYgKHdpbmRvdy5tYXRjaE1lZGlhKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhUXVlcnkgPSB3aW5kb3cubWF0Y2hNZWRpYShgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfUE9SVFJBSVR9cHgpLCAobWF4LWhlaWdodDogJHtNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRX1weCkgYW5kIChtYXgtd2lkdGg6ICR7TVFfTUFYX1dJRFRIX0xBTkRTQ0FQRX1weClgKTtcblxuICAgICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpczMuaXNNb2JpbGUgPSBtZWRpYVF1ZXJ5Lm1hdGNoZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgbWVkaWFRdWVyeS5hZGRMaXN0ZW5lcihoYW5kbGVyKTtcblxuICAgICAgICBfdGhpczMuZGV0YWNoSXNNb2JpbGVNcUhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIG1lZGlhUXVlcnkucmVtb3ZlTGlzdGVuZXIoaGFuZGxlcik7XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7XG5cbiAgICAgIGlmIChzZWFyY2hQYXJhbXMuaGFzKFwid2ViLXNoYXJlLXRhcmdldFwiKSkge1xuICAgICAgICAvLyBPYnRhaW4gYSBmaWxlIHRoYXQgd2FzIHNoYXJlZCB2aWEgdGhlIFdlYiBTaGFyZSBUYXJnZXQgQVBJLlxuICAgICAgICBfdGhpczMucmVzdG9yZUZpbGVGcm9tU2hhcmUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF90aGlzMy51cGRhdGVET01SZWN0KF90aGlzMy5pbml0aWFsaXplU2NlbmUpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH1cblxuICBjb21wb25lbnRXaWxsVW5tb3VudCgpIHtcbiAgICB0aGlzLmZpbGVzID0ge307XG4gICAgdGhpcy5pbWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5yZXNpemVPYnNlcnZlcj8uZGlzY29ubmVjdCgpO1xuICAgIHRoaXMudW5tb3VudGVkID0gdHJ1ZTtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy5zY2VuZS5kZXN0cm95KCk7XG4gICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgfVxuXG4gIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGhpcy5yZW1vdmVQb2ludGVyKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5DVVQsIHRoaXMub25DdXQpO1xuICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXI/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuU0NST0xMLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5NT1VTRV9NT1ZFLCB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbiwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZVVAsIHRoaXMub25LZXlVcCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUkVTSVpFLCB0aGlzLm9uUmVzaXplLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVU5MT0FELCB0aGlzLm9uVW5sb2FkLCBmYWxzZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQkxVUiwgdGhpcy5vbkJsdXIsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5EUkFHX09WRVIsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuRFJPUCwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfU1RBUlQsIHRoaXMub25HZXN0dXJlU3RhcnQsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfQ0hBTkdFLCB0aGlzLm9uR2VzdHVyZUNoYW5nZSwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9FTkQsIHRoaXMub25HZXN0dXJlRW5kLCBmYWxzZSk7XG4gICAgdGhpcy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlcj8uKCk7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVycygpIHtcbiAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpOyAvLyAjMzU1M1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5DT1BZLCB0aGlzLm9uQ29weSk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5oYW5kbGVLZXlib2FyZEdsb2JhbGx5KSB7XG4gICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWURPV04sIHRoaXMub25LZXlEb3duLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5NT1VTRV9NT1ZFLCB0aGlzLnVwZGF0ZUN1cnJlbnRDdXJzb3JQb3NpdGlvbik7IC8vIHJlcmVuZGVyIHRleHQgZWxlbWVudHMgb24gZm9udCBsb2FkIHRvIGZpeCAjNjM3ICYmICMxNTUzXG5cbiAgICBkb2N1bWVudC5mb250cz8uYWRkRXZlbnRMaXN0ZW5lcj8uKFwibG9hZGluZ2RvbmVcIiwgdGhpcy5vbkZvbnRMb2FkZWQpOyAvLyBTYWZhcmktb25seSBkZXNrdG9wIHBpbmNoIHpvb21cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9TVEFSVCwgdGhpcy5vbkdlc3R1cmVTdGFydCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9DSEFOR0UsIHRoaXMub25HZXN0dXJlQ2hhbmdlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0VORCwgdGhpcy5vbkdlc3R1cmVFbmQsIGZhbHNlKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5kZXRlY3RTY3JvbGwpIHtcbiAgICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSBnZXROZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcih0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCk7XG4gICAgICB0aGlzLm5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuU0NST0xMLCB0aGlzLm9uU2Nyb2xsKTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICB9XG5cbiAgY29tcG9uZW50RGlkVXBkYXRlKHByZXZQcm9wcywgcHJldlN0YXRlKSB7XG4gICAgdmFyIF90aGlzNCA9IHRoaXM7XG5cbiAgICBpZiAocHJldlByb3BzLmxhbmdDb2RlICE9PSB0aGlzLnByb3BzLmxhbmdDb2RlKSB7XG4gICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgdmlld01vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMudmlld01vZGVFbmFibGVkXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlN0YXRlLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMuemVuTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB6ZW5Nb2RlRW5hYmxlZDogISF0aGlzLnByb3BzLnplbk1vZGVFbmFibGVkXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnRoZW1lICE9PSB0aGlzLnByb3BzLnRoZW1lICYmIHRoaXMucHJvcHMudGhlbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB0aGVtZTogdGhpcy5wcm9wcy50aGVtZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZ3JpZFNpemU6IHRoaXMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucHJvcHMubmFtZSAmJiBwcmV2UHJvcHMubmFtZSAhPT0gdGhpcy5wcm9wcy5uYW1lKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgbmFtZTogdGhpcy5wcm9wcy5uYW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8uY2xhc3NMaXN0LnRvZ2dsZShcInRoZW1lLS1kYXJrXCIsIHRoaXMuc3RhdGUudGhlbWUgPT09IFwiZGFya1wiKTtcblxuICAgIGlmICh0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmICF0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1t0aGlzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF0pIHtcbiAgICAgIC8vIGRlZmVyIHNvIHRoYXQgdGhlIGNvbW1pdFRvSGlzdG9yeSBmbGFnIGlzbid0IHJlc2V0IHZpYSBjdXJyZW50IHVwZGF0ZVxuICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzNC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qge1xuICAgICAgbXVsdGlFbGVtZW50XG4gICAgfSA9IHByZXZTdGF0ZTtcblxuICAgIGlmIChwcmV2U3RhdGUuZWxlbWVudFR5cGUgIT09IHRoaXMuc3RhdGUuZWxlbWVudFR5cGUgJiYgbXVsdGlFbGVtZW50ICE9IG51bGwgJiYgaXNCaW5kaW5nRW5hYmxlZCh0aGlzLnN0YXRlKSAmJiBpc0JpbmRpbmdFbGVtZW50KG11bHRpRWxlbWVudCkpIHtcbiAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQobXVsdGlFbGVtZW50LCB0aGlzLnN0YXRlLCB0aGlzLnNjZW5lLCB0dXBsZVRvQ29vcnMoTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhtdWx0aUVsZW1lbnQsIC0xKSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnNvckJ1dHRvbiA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJWaWV3cG9ydENvb3JkcyA9IHt9O1xuICAgIGNvbnN0IHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJVc2VybmFtZXMgPSB7fTtcbiAgICBjb25zdCBwb2ludGVyVXNlclN0YXRlcyA9IHt9O1xuICAgIHRoaXMuc3RhdGUuY29sbGFib3JhdG9ycy5mb3JFYWNoKGZ1bmN0aW9uICh1c2VyLCBzb2NrZXRJZCkge1xuICAgICAgaWYgKHVzZXIuc2VsZWN0ZWRFbGVtZW50SWRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgaWYgKCEoaWQgaW4gcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzKSkge1xuICAgICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXSA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkc1tpZF0ucHVzaChzb2NrZXRJZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCF1c2VyLnBvaW50ZXIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAodXNlci51c2VybmFtZSkge1xuICAgICAgICBwb2ludGVyVXNlcm5hbWVzW3NvY2tldElkXSA9IHVzZXIudXNlcm5hbWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VyLnVzZXJTdGF0ZSkge1xuICAgICAgICBwb2ludGVyVXNlclN0YXRlc1tzb2NrZXRJZF0gPSB1c2VyLnVzZXJTdGF0ZTtcbiAgICAgIH1cblxuICAgICAgcG9pbnRlclZpZXdwb3J0Q29vcmRzW3NvY2tldElkXSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgIHNjZW5lWDogdXNlci5wb2ludGVyLngsXG4gICAgICAgIHNjZW5lWTogdXNlci5wb2ludGVyLnlcbiAgICAgIH0sIF90aGlzNC5zdGF0ZSk7XG4gICAgICBjdXJzb3JCdXR0b25bc29ja2V0SWRdID0gdXNlci5idXR0b247XG4gICAgfSk7XG4gICAgY29uc3QgcmVuZGVyaW5nRWxlbWVudHMgPSB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoaXNJbWFnZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgaWYgKCAvLyBub3QgcGxhY2VkIG9uIGNhbnZhcyB5ZXQgKGJ1dCBpbiBlbGVtZW50cyBhcnJheSlcbiAgICAgICAgX3RoaXM0LnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQgJiYgZWxlbWVudC5pZCA9PT0gX3RoaXM0LnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQuaWQpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZG9uJ3QgcmVuZGVyIHRleHQgZWxlbWVudCB0aGF0J3MgYmVpbmcgY3VycmVudGx5IGVkaXRlZCAoaXQnc1xuICAgICAgLy8gcmVuZGVyZWQgb24gcmVtb3RlIG9ubHkpXG5cblxuICAgICAgcmV0dXJuICFfdGhpczQuc3RhdGUuZWRpdGluZ0VsZW1lbnQgfHwgX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50LnR5cGUgIT09IFwidGV4dFwiIHx8IGVsZW1lbnQuaWQgIT09IF90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudC5pZDtcbiAgICB9KTtcbiAgICBjb25zdCB7XG4gICAgICBhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQsXG4gICAgICBzY3JvbGxCYXJzXG4gICAgfSA9IHJlbmRlclNjZW5lKHJlbmRlcmluZ0VsZW1lbnRzLCB0aGlzLnN0YXRlLCB0aGlzLnN0YXRlLnNlbGVjdGlvbkVsZW1lbnQsIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCB0aGlzLnJjLCB0aGlzLmNhbnZhcywge1xuICAgICAgc2Nyb2xsWDogdGhpcy5zdGF0ZS5zY3JvbGxYLFxuICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZLFxuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yLFxuICAgICAgem9vbTogdGhpcy5zdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiBwb2ludGVyVmlld3BvcnRDb29yZHMsXG4gICAgICByZW1vdGVQb2ludGVyQnV0dG9uOiBjdXJzb3JCdXR0b24sXG4gICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiBwb2ludGVyVXNlcm5hbWVzLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJTdGF0ZXM6IHBvaW50ZXJVc2VyU3RhdGVzLFxuICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0aGlzLnN0YXRlLnNob3VsZENhY2hlSWdub3JlWm9vbSxcbiAgICAgIHRoZW1lOiB0aGlzLnN0YXRlLnRoZW1lLFxuICAgICAgaW1hZ2VDYWNoZTogdGhpcy5pbWFnZUNhY2hlLFxuICAgICAgaXNFeHBvcnRpbmc6IGZhbHNlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogIXRoaXMuaXNNb2JpbGVcbiAgICB9KTtcblxuICAgIGlmIChzY3JvbGxCYXJzKSB7XG4gICAgICBjdXJyZW50U2Nyb2xsQmFycyA9IHNjcm9sbEJhcnM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsZWRPdXRzaWRlID0gLy8gaGlkZSB3aGVuIGVkaXRpbmcgdGV4dFxuICAgIGlzVGV4dEVsZW1lbnQodGhpcy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkgPyBmYWxzZSA6ICFhdExlYXN0T25lVmlzaWJsZUVsZW1lbnQgJiYgcmVuZGVyaW5nRWxlbWVudHMubGVuZ3RoID4gMDtcblxuICAgIGlmICh0aGlzLnN0YXRlLnNjcm9sbGVkT3V0c2lkZSAhPT0gc2Nyb2xsZWRPdXRzaWRlKSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsZWRPdXRzaWRlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmhpc3RvcnkucmVjb3JkKHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkpO1xuICAgIHRoaXMuc2NoZWR1bGVJbWFnZVJlZnJlc2goKTsgLy8gRG8gbm90IG5vdGlmeSBjb25zdW1lcnMgaWYgd2UncmUgc3RpbGwgbG9hZGluZyB0aGUgc2NlbmUuIEFtb25nIG90aGVyXG4gICAgLy8gcG90ZW50aWFsIGlzc3VlcywgdGhpcyBmaXhlcyBhIGNhc2Ugd2hlcmUgdGhlIHRhYiBpc24ndCBmb2N1c2VkIGR1cmluZ1xuICAgIC8vIGluaXQsIHdoaWNoIHdvdWxkIHRyaWdnZXIgb25DaGFuZ2Ugd2l0aCBlbXB0eSBlbGVtZW50cywgd2hpY2ggd291bGQgdGhlblxuICAgIC8vIG92ZXJyaWRlIHdoYXRldmVyIGlzIGluIGxvY2FsU3RvcmFnZSBjdXJyZW50bHkuXG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuaXNMb2FkaW5nKSB7XG4gICAgICB0aGlzLnByb3BzLm9uQ2hhbmdlPy4odGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgdGhpcy5zdGF0ZSwgdGhpcy5maWxlcyk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIHJlc2V0VGFwVHdpY2UoKSB7XG4gICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgfVxuXG4gIGFkZFRleHRGcm9tUGFzdGUodGV4dCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICBjbGllbnRYOiBjdXJzb3JYLFxuICAgICAgY2xpZW50WTogY3Vyc29yWVxuICAgIH0sIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICB4LFxuICAgICAgeSxcbiAgICAgIHN0cm9rZUNvbG9yOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBmaWxsU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1GaWxsU3R5bGUsXG4gICAgICBzdHJva2VXaWR0aDogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgc3Ryb2tlU3R5bGU6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTdHlsZSxcbiAgICAgIHJvdWdobmVzczogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVJvdWdobmVzcyxcbiAgICAgIG9wYWNpdHk6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgc3Ryb2tlU2hhcnBuZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU2hhcnBuZXNzLFxuICAgICAgdGV4dCxcbiAgICAgIHJhd1RleHQ6IHRleHQsXG4gICAgICBmb250U2l6ZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgZm9udEZhbWlseTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1UZXh0QWxpZ24sXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOXG4gICAgfSk7XG4gICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICBbZWxlbWVudC5pZF06IHRydWVcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gIH0gLy8gQ29sbGFib3JhdGlvblxuXG5cbiAgc2VsZWN0U2hhcGVUb29sKGVsZW1lbnRUeXBlKSB7XG4gICAgaWYgKCFpc0hvbGRpbmdTcGFjZSkge1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUodGhpcy5jYW52YXMsIGVsZW1lbnRUeXBlKTtcbiAgICB9XG5cbiAgICBpZiAoaXNUb29sSWNvbihkb2N1bWVudC5hY3RpdmVFbGVtZW50KSkge1xuICAgICAgdGhpcy5mb2N1c0NvbnRhaW5lcigpO1xuICAgIH1cblxuICAgIGlmICghaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50VHlwZSkpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50VHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICB0aGlzLm9uSW1hZ2VBY3Rpb24oKTtcbiAgICB9XG5cbiAgICBpZiAoZWxlbWVudFR5cGUgIT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZSxcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBoYW5kbGVUZXh0V3lzaXd5ZyhlbGVtZW50LCBfcmVmKSB7XG4gICAgdmFyIF90aGlzNSA9IHRoaXM7XG5cbiAgICBsZXQge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQgPSBmYWxzZVxuICAgIH0gPSBfcmVmO1xuXG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IGZ1bmN0aW9uICh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCwgaXNTdWJtaXQsIHJhd1RleHQpIHtcbiAgICAgIF90aGlzNS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzNS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5tYXAoZnVuY3Rpb24gKF9lbGVtZW50KSB7XG4gICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgIHJldHVybiB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgdGV4dCxcbiAgICAgICAgICAgIGlzRGVsZXRlZCxcbiAgICAgICAgICAgIG9yaWdpbmFsVGV4dCxcbiAgICAgICAgICAgIHJhd1RleHQ6IHJhd1RleHQgPz8gb3JpZ2luYWxUZXh0IC8vc2hvdWxkIHRoaXMgYmUgb3JpZ2luYWxUZXh0Pz9cblxuICAgICAgICAgIH0sIGlzU3VibWl0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfZWxlbWVudDtcbiAgICAgIH0pXSk7XG4gICAgfTtcblxuICAgIGlmIChpc0V4aXN0aW5nRWxlbWVudCAmJiB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dEVkaXQpIHtcbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLnByb3BzLm9uQmVmb3JlVGV4dEVkaXQoZWxlbWVudCk7XG5cbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHRoaXMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi50aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoX2VsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSB1cGRhdGVUZXh0RWxlbWVudChfZWxlbWVudCwge1xuICAgICAgICAgICAgICB0ZXh0LFxuICAgICAgICAgICAgICBpc0RlbGV0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICBvcmlnaW5hbFRleHQ6IHRleHRcbiAgICAgICAgICAgIH0sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgICB9KV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRleHRXeXNpd3lnKHtcbiAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgZ2V0Vmlld3BvcnRDb29yZHM6IGZ1bmN0aW9uICh4LCB5KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiB2aWV3cG9ydFgsXG4gICAgICAgICAgeTogdmlld3BvcnRZXG4gICAgICAgIH0gPSBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMoe1xuICAgICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgICBzY2VuZVk6IHlcbiAgICAgICAgfSwgX3RoaXM1LnN0YXRlKTtcbiAgICAgICAgcmV0dXJuIFt2aWV3cG9ydFggLSBfdGhpczUuc3RhdGUub2Zmc2V0TGVmdCwgdmlld3BvcnRZIC0gX3RoaXM1LnN0YXRlLm9mZnNldFRvcF07XG4gICAgICB9LFxuICAgICAgb25DaGFuZ2U6IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAodGV4dCkge1xuICAgICAgICB1cGRhdGVFbGVtZW50KHRleHQsIHRleHQsIGZhbHNlLCBmYWxzZSk7XG5cbiAgICAgICAgaWYgKGlzTm9uRGVsZXRlZEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgICB1cGRhdGVCb3VuZEVsZW1lbnRzKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIG9uU3VibWl0OiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKF9yZWYyKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgdGV4dCxcbiAgICAgICAgICB2aWFLZXlib2FyZCxcbiAgICAgICAgICBvcmlnaW5hbFRleHRcbiAgICAgICAgfSA9IF9yZWYyO1xuICAgICAgICBjb25zdCBpc0RlbGV0ZWQgPSAhdGV4dC50cmltKCk7XG4gICAgICAgIGNvbnN0IHJhd1RleHQgPSBvcmlnaW5hbFRleHQ7IC8vc2hvdWxkIHRoaXMgYmUgb3JpZ2luYWxUZXh0Pz9cblxuICAgICAgICBpZiAoX3RoaXM1LnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdCkge1xuICAgICAgICAgIGNvbnN0IFt1cGRhdGVkVGV4dCwgdXBkYXRlZE9yaWdpbmFsVGV4dF0gPSBfdGhpczUucHJvcHMub25CZWZvcmVUZXh0U3VibWl0KGVsZW1lbnQsIHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkKTtcblxuICAgICAgICAgIHRleHQgPSB1cGRhdGVkVGV4dCA/PyB0ZXh0O1xuICAgICAgICAgIG9yaWdpbmFsVGV4dCA9IHVwZGF0ZWRPcmlnaW5hbFRleHQgPz8gb3JpZ2luYWxUZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgdXBkYXRlRWxlbWVudCh0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCwgdHJ1ZSwgcmF3VGV4dCk7IC8vIHNlbGVjdCB0aGUgY3JlYXRlZCB0ZXh0IGVsZW1lbnQgb25seSBpZiBzdWJtaXR0aW5nIHZpYSBrZXlib2FyZFxuICAgICAgICAvLyAod2hlbiBzdWJtaXR0aW5nIHZpYSBjbGljayBpdCBzaG91bGQgYWN0IGFzIHNpZ25hbCB0byBkZXNlbGVjdClcblxuICAgICAgICBpZiAoIWlzRGVsZXRlZCAmJiB2aWFLZXlib2FyZCkge1xuICAgICAgICAgIGNvbnN0IGVsZW1lbnRJZFRvU2VsZWN0ID0gZWxlbWVudC5jb250YWluZXJJZCA/IGVsZW1lbnQuY29udGFpbmVySWQgOiBlbGVtZW50LmlkO1xuXG4gICAgICAgICAgX3RoaXM1LnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICBbZWxlbWVudElkVG9TZWxlY3RdOiB0cnVlXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzRGVsZXRlZCkge1xuICAgICAgICAgIGZpeEJpbmRpbmdzQWZ0ZXJEZWxldGlvbihfdGhpczUuc2NlbmUuZ2V0RWxlbWVudHMoKSwgW2VsZW1lbnRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNEZWxldGVkIHx8IGlzRXhpc3RpbmdFbGVtZW50KSB7XG4gICAgICAgICAgX3RoaXM1Lmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczUuc2V0U3RhdGUoe1xuICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICBlZGl0aW5nRWxlbWVudDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoX3RoaXM1LnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczUuY2FudmFzLCBfdGhpczUuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM1LmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9KSxcbiAgICAgIGVsZW1lbnQsXG4gICAgICBleGNhbGlkcmF3Q29udGFpbmVyOiB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudCxcbiAgICAgIGFwcDogdGhpc1xuICAgIH0pOyAvLyBkZXNlbGVjdCBhbGwgb3RoZXIgZWxlbWVudHMgd2hlbiBpbnNlcnRpbmcgdGV4dFxuXG4gICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7IC8vIGRvIGFuIGluaXRpYWwgdXBkYXRlIHRvIHJlLWluaXRpYWxpemUgZWxlbWVudCBwb3NpdGlvbiBzaW5jZSB3ZSB3ZXJlXG4gICAgLy8gbW9kaWZ5aW5nIGVsZW1lbnQncyB4L3kgZm9yIHNha2Ugb2YgZWRpdG9yIChjYXNlOiBzeW5jaW5nIHRvIHJlbW90ZSlcblxuICAgIHVwZGF0ZUVsZW1lbnQoZWxlbWVudC50ZXh0LCBlbGVtZW50Lm9yaWdpbmFsVGV4dCwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIGRlc2VsZWN0RWxlbWVudHMoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiAhZWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSwgb3B0cykge1xuICAgIGNvbnN0IGFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oeCwgeSwgb3B0cz8uaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQpO1xuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID0gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07IC8vIElmIHdlJ3JlIGhpdHRpbmcgZWxlbWVudCB3aXRoIGhpZ2hlc3Qgei1pbmRleCBvbmx5IG9uIGl0cyBib3VuZGluZyBib3hcbiAgICAgIC8vIHdoaWxlIGFsc28gaGl0dGluZyBvdGhlciBlbGVtZW50IGZpZ3VyZSwgdGhlIGxhdHRlciBzaG91bGQgYmUgY29uc2lkZXJlZC5cblxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsIHRoaXMuc3RhdGUsIHgsIHkpID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl0gOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIGxldCBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgY29uc3QgZWxlbWVudHMgPSBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA/IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSA6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAhKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbihlbGVtZW50cywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBoaXRUZXN0KGVsZW1lbnQsIF90aGlzNi5zdGF0ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpIHtcbiAgICBpZiAobGFzdFBvaW50ZXJVcCAhPT0gbnVsbCkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHdlIGRvbid0IGdldCBhIHBvaW50ZXJ1cCBhZnRlciBhIHBvaW50ZXJkb3duLFxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb250ZXh0dWFsIG1lbnUgb3IgYWxlcnQgaXMgdHJpZ2dlcmVkLiBJbiBvcmRlciB0byBhdm9pZFxuICAgICAgLy8gYmVpbmcgaW4gYSB3ZWlyZCBzdGF0ZSwgd2UgY2xlYW4gdXAgb24gdGhlIG5leHQgcG9pbnRlcmRvd25cbiAgICAgIGxhc3RQb2ludGVyVXAoZXZlbnQpO1xuICAgIH1cbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgcGFubmluZ1xuXG5cbiAgdXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgfSk7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbFBvaW50ZXJEb3duU3RhdGUoZXZlbnQpIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKGdldEdyaWRQb2ludChvcmlnaW4ueCwgb3JpZ2luLnksIHRoaXMuc3RhdGUuZ3JpZFNpemUpKSxcbiAgICAgIHNjcm9sbGJhcnM6IGlzT3ZlclNjcm9sbEJhcnMoY3VycmVudFNjcm9sbEJhcnMsIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCksXG4gICAgICAvLyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBiZWNhdXNlIHdlJ2xsIGJlIHVwZGF0aW5nIHRoaXMgc3RhdGVcbiAgICAgIGxhc3RDb29yZHM6IF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbiksXG4gICAgICBvcmlnaW5hbEVsZW1lbnRzOiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICAgICAgYWNjLnNldChlbGVtZW50LmlkLCBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcCgpKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LFxuICAgICAgICBhcnJvd0RpcmVjdGlvbjogXCJvcmlnaW5cIixcbiAgICAgICAgY2VudGVyOiB7XG4gICAgICAgICAgeDogKG1heFggKyBtaW5YKSAvIDIsXG4gICAgICAgICAgeTogKG1heFkgKyBtaW5ZKSAvIDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpdDoge1xuICAgICAgICBlbGVtZW50OiBudWxsLFxuICAgICAgICBhbGxIaXRFbGVtZW50czogW10sXG4gICAgICAgIHdhc0FkZGVkVG9TZWxlY3Rpb246IGZhbHNlLFxuICAgICAgICBoYXNCZWVuRHVwbGljYXRlZDogZmFsc2UsXG4gICAgICAgIGhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzOiB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKG9yaWdpbiwgc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgIGhhc0hpdEVsZW1lbnRJbnNpZGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsXG4gICAgICB9LFxuICAgICAgYm94U2VsZWN0aW9uOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG5cblxuICBoYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgaWYgKCEocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlckVpdGhlciAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczcuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXM3LmNhbnZhcywgX3RoaXM3LnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICBfdGhpczcuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzNy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIH0pO1xuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzQVNlbGVjdGVkRWxlbWVudChoaXRFbGVtZW50KSB7XG4gICAgcmV0dXJuIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXTtcbiAgfVxuXG4gIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKHBvaW50LCBzZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gSG93IG1hbnkgcGl4ZWxzIG9mZiB0aGUgc2hhcGUgYm91bmRhcnkgd2Ugc3RpbGwgY29uc2lkZXIgYSBoaXRcblxuXG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4gcG9pbnQueCA+IHgxIC0gdGhyZXNob2xkICYmIHBvaW50LnggPCB4MiArIHRocmVzaG9sZCAmJiBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiYgcG9pbnQueSA8IHkyICsgdGhyZXNob2xkO1xuICB9XG5cbiAgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKF90aGlzOC5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczgubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKF90aGlzOS5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczkubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgZHJhZ09mZnNldFhZIG9ubHkgYWZ0ZXIgd2UndmUgdXBkYXRlZFxuICAgICAgLy8gYHN0YXRlLnNlbGVjdGVkRWxlbWVudElkc2Agb24gcG9pbnRlckRvd24uIERvaW5nIGl0IGhlcmUgaW4gcG9pbnRlck1vdmVcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgc2hvdWxkIGhvcGVmdWxseSBlbnN1cmUgd2UncmUgYWxyZWFkeSB3b3JraW5nIHdpdGhcbiAgICAgIC8vIHRoZSB1cGRhdGVkIHN0YXRlLlxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQgPT09IG51bGwpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9IHR1cGxlVG9Db29ycyhnZXREcmFnT2Zmc2V0WFkoZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTAuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEwLnN0YXRlKTtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTsgLy8gZm9yIGFycm93cy9saW5lcywgZG9uJ3Qgc3RhcnQgZHJhZ2dpbmcgdW50aWwgYSBnaXZlbiB0aHJlc2hvbGRcbiAgICAgIC8vIHRvIGVuc3VyZSB3ZSBkb24ndCBjcmVhdGUgYSAyLXBvaW50IGFycm93IGJ5IG1pc3Rha2Ugd2hlblxuICAgICAgLy8gdXNlciBjbGlja3MgbW91c2UgaW4gYSB3YXkgdGhhdCBpdCBtb3ZlcyBhIHRpbnkgYml0ICh0aHVzXG4gICAgICAvLyB0cmlnZ2VyaW5nIHBvaW50ZXJtb3ZlKVxuXG4gICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8IF90aGlzMTAuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKSkge1xuICAgICAgICBpZiAoZGlzdGFuY2UyZChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkgPCBEUkFHR0lOR19USFJFU0hPTEQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuXG4gICAgICAgIGlmIChfdGhpczEwLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoX3RoaXMxMC5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTAuc2V0U3RhdGUoYXBwU3RhdGUpO1xuICAgICAgICB9LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZnVuY3Rpb24gKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSB7XG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhlbGVtZW50LCBwb2ludHNTY2VuZUNvb3Jkcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaWREcmFnKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczEwLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoKGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgfHwgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpICYmICggLy8gdGhpcyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzIHdoZW4gY2xpY2tpbmcgaW5zaWRlIHRoZVxuICAgICAgLy8gbGluZSdzIGJvdW5kaW5nIGJveFxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgIWV2ZW50LnNoaWZ0S2V5KSAmJiAoIC8vIGJveC1zZWxlY3Rpbmcgd2l0aG91dCBzaGlmdCB3aGVuIGVkaXRpbmcgbGluZSwgbm90IGNsaWNraW5nIG9uIGEgbGluZVxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudD8uZWxlbWVudElkICE9PSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50Py5pZCB8fCBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKSkge1xuICAgICAgICAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpOyAvLyBwcmV2ZW50IGRyYWdnaW5nIGV2ZW4gaWYgd2UncmUgbm8gbG9uZ2VyIGhvbGRpbmcgY21kL2N0cmwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGl0IHdvdWxkIGhhdmUgd2VpcmQgcmVzdWx0cyAoc3R1ZmYganVtcGluZyBhbGwgb3ZlciB0aGUgc2NyZWVuKVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgIXBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCkge1xuICAgICAgICAgIGNvbnN0IFtkcmFnWCwgZHJhZ1ldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCwgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbTWF0aC5hYnMocG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCksIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpXTsgLy8gV2Ugb25seSBkcmFnIGluIG9uZSBkaXJlY3Rpb24gaWYgc2hpZnQgaXMgcHJlc3NlZFxuXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICAgIGRyYWdTZWxlY3RlZEVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUsIHNlbGVjdGVkRWxlbWVudHMsIGRyYWdYLCBkcmFnWSwgbG9ja0RpcmVjdGlvbiwgZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWSwgX3RoaXMxMC5zdGF0ZSk7XG5cbiAgICAgICAgICBfdGhpczEwLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7IC8vIFdlIGR1cGxpY2F0ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpZiBhbHQgaXMgcHJlc3NlZCBvbiBwb2ludGVyIG1vdmVcblxuXG4gICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgdG9wIG9mIHRoZSB6IGluZGV4IHN0YWNrLCBhbmRcbiAgICAgICAgICAgIC8vIHB1dCB0aGUgZHVwbGljYXRlcyB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdXNlZCB0byBiZS5cbiAgICAgICAgICAgIC8vICh0aGUgb3JpZ2luIHBvaW50IHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydGVkKVxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c1RvQXBwZW5kID0gW107XG4gICAgICAgICAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkSWRUb0R1cGxpY2F0ZWRJZCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudElkcyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIF90aGlzMTAuc3RhdGUsIHRydWUpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fCAvLyBjYXNlOiB0aGUgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzIG1pZ2h0IG5vdCBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgLy8gdXBkYXRlZCB5ZXQgYnkgdGhlIHRpbWUgdGhpcyBtb3VzZW1vdmUgZXZlbnQgaXMgZmlyZWRcbiAgICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaGl0RWxlbWVudD8uaWQgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZWRFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEwLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KGR1cGxpY2F0ZWRFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICB4OiBkdXBsaWNhdGVkRWxlbWVudC54ICsgKG9yaWdpbkRyYWdYIC0gZHJhZ1gpLFxuICAgICAgICAgICAgICAgICAgeTogZHVwbGljYXRlZEVsZW1lbnQueSArIChvcmlnaW5EcmFnWSAtIGRyYWdZKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRTY2VuZUVsZW1lbnRzID0gWy4uLm5leHRFbGVtZW50cywgLi4uZWxlbWVudHNUb0FwcGVuZF07XG4gICAgICAgICAgICBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHNUb0FwcGVuZCwgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG4gICAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dFNjZW5lRWxlbWVudHMsIGVsZW1lbnRzVG9BcHBlbmQsIG9sZElkVG9EdXBsaWNhdGVkSWQsIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIik7XG5cbiAgICAgICAgICAgIF90aGlzMTAuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRTY2VuZUVsZW1lbnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gcmVhZCB0aGlzLnN0YXRlIHdpdGhpbiBlYWNoIG1vdmUgZXZlbnQsXG4gICAgICAvLyBvdGhlcndpc2Ugd2Ugd291bGQgcmVhZCBhIHN0YWxlIG9uZSFcblxuXG4gICAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSBfdGhpczEwLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcblxuICAgICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBjb25zdCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBjb25zdCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55O1xuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IGRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlc1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gZ3JpZFggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gZ3JpZFkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpICYmIHBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgd2lkdGg6IGR4LFxuICAgICAgICAgICAgaGVpZ2h0OiBkeVxuICAgICAgICAgIH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSwgZHgsIGR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtkeCwgZHldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIF90aGlzMTAubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZHJhZ2dpbmdFbGVtZW50LCBbcG9pbnRlckNvb3Jkc10sIF90aGlzMTAuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG5cbiAgICAgICAgX3RoaXMxMC5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIC8vIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgKHdpdGhvdXQgc2hpZnQpXG4gICAgICAgICFfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmIGlzU29tZUVsZW1lbnRTZWxlY3RlZChlbGVtZW50cywgX3RoaXMxMC5zdGF0ZSkpIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLCBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBib3gtc2VsZWN0IGxpbmUgZWRpdG9yIHBvaW50c1xuXG5cbiAgICAgICAgaWYgKF90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZUJveFNlbGVjdGlvbihldmVudCwgX3RoaXMxMC5zdGF0ZSwgX3RoaXMxMC5zZXRTdGF0ZS5iaW5kKF90aGlzMTApKTsgLy8gcmVndWxhciBib3gtc2VsZWN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihlbGVtZW50cywgZHJhZ2dpbmdFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgIH0sIHt9KSksIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPyB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTogIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aFxuICAgICAgICAgICAgICB9IDogbnVsbClcbiAgICAgICAgICAgIH0pLCBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG5cblxuICBoYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJIb3Jpem9udGFsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGR4ID0geCAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGR4IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICB9KTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0geDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyVmVydGljYWwpIHtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgY29uc3QgZHkgPSB5IC0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZHkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICB2YXIgX3RoaXMxMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChjaGlsZEV2ZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50LFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBlbGVtZW50TG9ja2VkLFxuICAgICAgICBpc1Jlc2l6aW5nLFxuICAgICAgICBpc1JvdGF0aW5nXG4gICAgICB9ID0gX3RoaXMxMS5zdGF0ZTtcblxuICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBudWxsLFxuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgICAgLy8gdGV4dCBlbGVtZW50cyBhcmUgcmVzZXQgb24gZmluYWxpemUsIGFuZCByZXNldHRpbmcgb24gcG9pbnRlcnVwXG4gICAgICAgIC8vIG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBkb3VibGUgdGFwc1xuICAgICAgICBlZGl0aW5nRWxlbWVudDogbXVsdGlFbGVtZW50IHx8IGlzVGV4dEVsZW1lbnQoX3RoaXMxMS5zdGF0ZS5lZGl0aW5nRWxlbWVudCkgPyBfdGhpczExLnN0YXRlLmVkaXRpbmdFbGVtZW50IDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTEuc2F2ZVBvaW50ZXIoY2hpbGRFdmVudC5jbGllbnRYLCBjaGlsZEV2ZW50LmNsaWVudFksIFwidXBcIik7IC8vIEhhbmRsZSBlbmQgb2YgZHJhZ2dpbmcgYSBwb2ludCBvZiBhIGxpbmVhciBlbGVtZW50LCBtaWdodCBjbG9zZSBhIGxvb3BcbiAgICAgIC8vIGFuZCBzZXRzIGJpbmRpbmcgZWxlbWVudFxuXG5cbiAgICAgIGlmIChfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGlmICghcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQgJiYgKHBvaW50ZXJEb3duU3RhdGUuaGl0Py5lbGVtZW50Py5pZCAhPT0gX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgfHwgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUpKSB7XG4gICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVkaXRpbmdMaW5lYXJFbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyVXAoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCwgX3RoaXMxMS5zdGF0ZSk7XG5cbiAgICAgICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwKTtcblxuICAgICAgaWYgKF90aGlzMTEuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCkge1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50Py50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhjaGlsZEV2ZW50LCBfdGhpczExLnN0YXRlKTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55OyAvLyBBbGxvd3MgZG90cyB0byBhdm9pZCBiZWluZyBmbGFnZ2VkIGFzIGluZmluaXRlbHkgc21hbGxcblxuICAgICAgICBpZiAoZHggPT09IHBvaW50c1swXVswXSAmJiBkeSA9PT0gcG9pbnRzWzBdWzFdKSB7XG4gICAgICAgICAgZHkgKz0gMC4wMDAxO1xuICAgICAgICAgIGR4ICs9IDAuMDAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNzdXJlcyA9IGRyYWdnaW5nRWxlbWVudC5zaW11bGF0ZVByZXNzdXJlID8gW10gOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgY2hpbGRFdmVudC5wcmVzc3VyZV07XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0sXG4gICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogW2R4LCBkeV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gZHJhZ2dpbmdFbGVtZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX3RoaXMxMS5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgIF90aGlzMTEuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLmlkICE9PSBpbWFnZUVsZW1lbnQuaWQ7XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC5wb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZSk7XG5cbiAgICAgICAgaWYgKCFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgZHJhZ2dpbmdFbGVtZW50ICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnBvaW50cywgW3BvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54LCBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueV1dXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG11bHRpRWxlbWVudDogZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IF90aGlzMTEuc3RhdGUuZHJhZ2dpbmdFbGVtZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoaXNCaW5kaW5nRW5hYmxlZChfdGhpczExLnN0YXRlKSAmJiBpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczExLnN0YXRlLCBfdGhpczExLnNjZW5lLCBwb2ludGVyQ29vcmRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIWVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTEuY2FudmFzKTtcblxuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtfdGhpczExLnN0YXRlLmRyYWdnaW5nRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBbX3RoaXMxMS5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmIGRyYWdnaW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIC8vIHJlbW92ZSBpbnZpc2libGUgZWxlbWVudCB3aGljaCB3YXMgYWRkZWQgaW4gb25Qb2ludGVyRG93blxuICAgICAgICBfdGhpczExLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLnNsaWNlKDAsIC0xKSk7XG5cbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoZHJhZ2dpbmdFbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50ICYmIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KHJlc2l6aW5nRWxlbWVudCkpIHtcbiAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmlkICE9PSByZXNpemluZ0VsZW1lbnQuaWQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH0gLy8gQ29kZSBiZWxvdyBoYW5kbGVzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnQocykgd2VyZW4ndFxuICAgICAgLy8gZHJhZyBvciBhZGRlZCB0byBzZWxlY3Rpb24gb24gcG9pbnRlciBkb3duIHBoYXNlLlxuXG5cbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuXG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uICYmICggLy8gaWYgd2UncmUgZWRpdGluZyBhIGxpbmUsIHBvaW50ZXJ1cCBzaG91bGRuJ3Qgc3dpdGNoIHNlbGVjdGlvbiBpZlxuICAgICAgLy8gYm94IHNlbGVjdGVkXG4gICAgICAhX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCAhcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQpKSB7XG4gICAgICAgIC8vIHdoZW4gaW5zaWRlIGxpbmUgZWRpdG9yLCBzaGlmdCBzZWxlY3RzIHBvaW50cyBpbnN0ZWFkXG4gICAgICAgIGlmIChjaGlsZEV2ZW50LnNoaWZ0S2V5ICYmICFfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzMTEuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFZpYUdyb3VwKF90aGlzMTEuc3RhdGUsIGhpdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdW5zZWxlY3QgYWxsIGdyb3VwcyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgZ3JvdXBzXG4gICAgICAgICAgICAgIC8vIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICBjb25zdCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMgPSBoaXRFbGVtZW50Lmdyb3VwSWRzLmZsYXRNYXAoZnVuY3Rpb24gKGdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNJbkdyb3VwKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHMoKSwgZ3JvdXBJZCk7XG4gICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2SWQsIGFjYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZJZCksIGFjYyk7XG4gICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChfcHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBoaXRFbGVtZW50Lmdyb3VwSWRzLm1hcChmdW5jdGlvbiAoZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgW2dJZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGFjYykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2KSwgYWNjKTtcbiAgICAgICAgICAgICAgICAgIH0sIHt9KSksXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pLCBfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKF9wcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCBfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCkpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhX3RoaXMxMS5zdGF0ZS5pc1Jlc2l6aW5nICYmIChoaXRFbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChoaXRFbGVtZW50LCBfdGhpczExLnN0YXRlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSB8fCAhaGl0RWxlbWVudCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykpIHtcbiAgICAgICAgLy8gRGVzZWxlY3Qgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiICYmIGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiIHx8IGlzU29tZUVsZW1lbnRTZWxlY3RlZChfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTEuc3RhdGUpKSB7XG4gICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCB8fCBpc1Jlc2l6aW5nIHx8IGlzUm90YXRpbmcpIHtcbiAgICAgICAgKGlzQmluZGluZ0VuYWJsZWQoX3RoaXMxMS5zdGF0ZSkgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczExLnN0YXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTEuY2FudmFzKTtcblxuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cykge1xuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gZ2V0RWxpZ2libGVFbGVtZW50c0ZvckJpbmRpbmcoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nc1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCkge1xuICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIC8vIENvbnRpbnVlIGVkaXRpbmcgdGhlIHNhbWUgZ3JvdXAgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgJiYgaGl0RWxlbWVudCAhPSBudWxsICYmIGlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkKSA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCA6IG51bGxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgfSk7XG4gIH1cblxuICBnZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHgsIHksIGFwcFN0YXRlLCBjYW52YXMsIHNjYWxlKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSksIHgsIHkpO1xuXG4gICAgaWYgKGVsZW1lbnRDbGlja2VkSW5zaWRlKSB7XG4gICAgICBjb25zdCBlbGVtZW50Q2VudGVyWCA9IGVsZW1lbnRDbGlja2VkSW5zaWRlLnggKyBlbGVtZW50Q2xpY2tlZEluc2lkZS53aWR0aCAvIDI7XG4gICAgICBjb25zdCBlbGVtZW50Q2VudGVyWSA9IGVsZW1lbnRDbGlja2VkSW5zaWRlLnkgKyBlbGVtZW50Q2xpY2tlZEluc2lkZS5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgZGlzdGFuY2VUb0NlbnRlciA9IE1hdGguaHlwb3QoeCAtIGVsZW1lbnRDZW50ZXJYLCB5IC0gZWxlbWVudENlbnRlclkpO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPSBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG5cbiAgICAgIGlmIChpc1NuYXBwZWRUb0NlbnRlcikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogdmlld3BvcnRYLFxuICAgICAgICAgIHk6IHZpZXdwb3J0WVxuICAgICAgICB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKHtcbiAgICAgICAgICBzY2VuZVg6IGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICAgIHNjZW5lWTogZWxlbWVudENlbnRlcllcbiAgICAgICAgfSwgYXBwU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZpZXdwb3J0WCxcbiAgICAgICAgICB2aWV3cG9ydFksXG4gICAgICAgICAgZWxlbWVudENlbnRlclgsXG4gICAgICAgICAgZWxlbWVudENlbnRlcllcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDYW52YXNPZmZzZXRzKCkge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGVmdCxcbiAgICAgICAgdG9wXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXRMZWZ0OiAwLFxuICAgICAgb2Zmc2V0VG9wOiAwXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUxhbmd1YWdlKCkge1xuICAgIHZhciBfdGhpczEyID0gdGhpcztcblxuICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5ndWFnZXMuZmluZChmdW5jdGlvbiAobGFuZykge1xuICAgICAgICByZXR1cm4gbGFuZy5jb2RlID09PSBfdGhpczEyLnByb3BzLmxhbmdDb2RlO1xuICAgICAgfSkgfHwgZGVmYXVsdExhbmc7XG4gICAgICB5aWVsZCBzZXRMYW5ndWFnZShjdXJyZW50TGFuZyk7XG5cbiAgICAgIF90aGlzMTIuc2V0QXBwU3RhdGUoe30pO1xuICAgIH0pKCk7XG4gIH1cblxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5BcHAuZGVmYXVsdFByb3BzID0ge1xuICAvLyBuZWVkZWQgZm9yIHRlc3RzIHRvIHBhc3Mgc2luY2Ugd2UgZGlyZWN0bHkgcmVuZGVyIEFwcCBpbiBtYW55IHRlc3RzXG4gIFVJT3B0aW9uczogREVGQVVMVF9VSV9PUFRJT05TXG59O1xuXG52YXIgX2luaXRpYWxpc2VQcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgdGhpcy5yYyA9IG51bGw7XG4gIHRoaXMudW5tb3VudGVkID0gZmFsc2U7XG4gIHRoaXMuaXNNb2JpbGUgPSBmYWxzZTtcbiAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICB0aGlzLmZpbGVzID0ge307XG4gIHRoaXMuaW1hZ2VDYWNoZSA9IG5ldyBNYXAoKTtcblxuICB0aGlzLmZvY3VzQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdGhpczEzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gIH07XG5cbiAgdGhpcy5nZXRTY2VuZUVsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gIH07XG5cbiAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChhY3Rpb25SZXN1bHQpIHtcbiAgICBpZiAoX3RoaXMxMy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlZGl0aW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKSB7XG4gICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudD8uaWQgPT09IGVsZW1lbnQuaWQgJiYgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCAhPT0gZWxlbWVudCAmJiBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb25SZXN1bHQuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBhY3Rpb25SZXN1bHQucmVwbGFjZUZpbGVzID8gYWN0aW9uUmVzdWx0LmZpbGVzIDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgYWN0aW9uUmVzdWx0LmZpbGVzKTtcblxuICAgICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IGVkaXRpbmdFbGVtZW50KSB7XG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2aWV3TW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy52aWV3TW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICBsZXQgemVuTW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy56ZW5Nb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgIGxldCBncmlkU2l6ZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LmdyaWRTaXplIHx8IG51bGw7XG4gICAgICBsZXQgdGhlbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy50aGVtZSB8fCBUSEVNRS5MSUdIVDtcbiAgICAgIGxldCBuYW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8ubmFtZSA/PyBfdGhpczEzLnN0YXRlLm5hbWU7XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmlld01vZGVFbmFibGVkID0gX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZ3JpZFNpemUgPSBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy50aGVtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGVtZSA9IF90aGlzMTMucHJvcHMudGhlbWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy5uYW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG5hbWUgPSBfdGhpczEzLnByb3BzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAvLyByZWdhcmRpbmcgdGhlIHJlc3VsdGluZyB0eXBlIGFzIG5vdCBjb250YWluaW5nIHVuZGVmaW5lZFxuICAgICAgICAvLyAod2hpY2ggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uIHdpbGwgbmV2ZXIgY29udGFpbilcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5zeW5jSGlzdG9yeSkge1xuICAgICAgICAgIF90aGlzMTMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25CbHVyID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMub25VbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5vbkJsdXIoKTtcbiAgfTtcblxuICB0aGlzLmRpc2FibGVFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdGhpcy5vbkZvbnRMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAodXJsLCB0b2tlbikge1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluY2x1ZGVzKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkpO1xuICAgICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgIyR7aGFzaC50b1N0cmluZygpfWApO1xuICAgICAgfSBlbHNlIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgcXVlcnkuZGVsZXRlKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgPyR7cXVlcnkudG9TdHJpbmcoKX1gKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHlpZWxkIGZldGNoKGRlY29kZVVSSUNvbXBvbmVudCh1cmwpKTtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIHJlcXVlc3QuYmxvYigpO1xuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZSh5aWVsZCBibG9iLnRleHQoKSk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSBfdGhpczEzLmlkIHx8IHdpbmRvdy5jb25maXJtKHQoXCJhbGVydHMuY29uZmlybUFkZExpYnJhcnlcIiwge1xuICAgICAgICAgIG51bVNoYXBlczogKGpzb24ubGlicmFyeUl0ZW1zIHx8IGpzb24ubGlicmFyeSB8fCBbXSkubGVuZ3RoXG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIHlpZWxkIF90aGlzMTMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IsIFwicHVibGlzaGVkXCIpOyAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuXG4gICAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3Blbikge1xuICAgICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgd2luZG93LmFsZXJ0KHQoXCJhbGVydHMuZXJyb3JMb2FkaW5nTGlicmFyeVwiKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX3RoaXMxMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyKSB7XG4gICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5yZXNldEhpc3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERlZmF1bHRBcHBTdGF0ZSgpKSwge30sIHtcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogX3RoaXMxMy5zdGF0ZS50aGVtZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuICB9KTtcbiAgdGhpcy5pbml0aWFsaXplU2NlbmUgPSAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgd2luZG93LmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGxhdW5jaFBhcmFtcykge1xuICAgICAgICAgIGlmICghbGF1bmNoUGFyYW1zLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoYmxvYiwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkudGhlbihmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKSk7XG4gICAgfVxuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGluaXRpYWxEYXRhID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9ICh5aWVsZCBfdGhpczEzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuXG4gICAgICBpZiAoaW5pdGlhbERhdGE/LmxpYnJhcnlJdGVtcykge1xuICAgICAgICBfdGhpczEzLmxpYnJhcnlJdGVtc0Zyb21TdG9yYWdlID0gcmVzdG9yZUxpYnJhcnlJdGVtcyhpbml0aWFsRGF0YS5saWJyYXJ5SXRlbXMsIFwidW5wdWJsaXNoZWRcIik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgaW5pdGlhbERhdGEgPSB7XG4gICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGltcG9ydGluZyBvciByZXN0b3Jpbmcgc2NlbmUgZGF0YVwiXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcbiAgICBzY2VuZS5hcHBTdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCB7fSwge1xuICAgICAgZWxlbWVudFR5cGU6IHNjZW5lLmFwcFN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIgPyBcInNlbGVjdGlvblwiIDogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKHNjZW5lLmVsZW1lbnRzLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwge30sIHtcbiAgICAgICAgd2lkdGg6IF90aGlzMTMuc3RhdGUud2lkdGgsXG4gICAgICAgIGhlaWdodDogX3RoaXMxMy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdFxuICAgICAgfSksIG51bGwpKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuXG4gICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUpLCB7fSwge1xuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgfSkpO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9IC8vIGN1cnJlbnRcbiAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoVVJMX0hBU0hfS0VZUy5hZGRMaWJyYXJ5KSB8fCAvLyBsZWdhY3ksIGtlcHQgZm9yIGNvbXBhdCByZWFzb25zXG4gICAgbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSk7XG5cbiAgICBpZiAobGlicmFyeVVybCkge1xuICAgICAgeWllbGQgX3RoaXMxMy5pbXBvcnRMaWJyYXJ5RnJvbVVybChsaWJyYXJ5VXJsKTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuICB0aGlzLm9uU2Nyb2xsID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFRvcCxcbiAgICAgIG9mZnNldExlZnRcbiAgICB9ID0gX3RoaXMxMy5nZXRDYW52YXNPZmZzZXRzKCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLm9mZnNldExlZnQgPT09IG9mZnNldExlZnQgJiYgc3RhdGUub2Zmc2V0VG9wID09PSBvZmZzZXRUb3ApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgU0NST0xMX1RJTUVPVVQpO1xuICB0aGlzLm9uQ3V0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmN1dEFsbCgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG4gIHRoaXMub25Db3B5ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmNvcHlBbGwoKTtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHRoaXMuY3V0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuY29weUFsbCgpO1xuXG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVsZXRlU2VsZWN0ZWQpO1xuICB9O1xuXG4gIHRoaXMuY29weUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb3B5VG9DbGlwYm9hcmQoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmZpbGVzKTtcbiAgfTtcblxuICB0aGlzLm9uVGFwU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoIWRpZFRhcFR3aWNlKSB7XG4gICAgICBkaWRUYXBUd2ljZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgICB0YXBwZWRUd2ljZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoQXBwLnJlc2V0VGFwVHdpY2UsIFRBUF9UV0lDRV9USU1FT1VUKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGluc2VydCB0ZXh0IG9ubHkgaWYgd2UgdGFwcGVkIHR3aWNlIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgLy8gZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgd2lsbCBhbHNvIHByZXZlbnQgaW5zZXJ0aW5nIHRleHQgd2hlbiB1c2VyJ3Mgem9vbWluZ1xuXG5cbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgIF90aGlzMTMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2soe1xuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZXG4gICAgICB9KTtcblxuICAgICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMub25UYXBFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFVuZGVyQ3Vyc29yID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjdXJzb3JYLCBjdXJzb3JZKTtcblxuICAgICAgaWYgKCAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAvLyB0aHVzIHRoZXNlIGNoZWNrcyBkb24ndCBtYWtlIHNlbnNlXG4gICAgICBldmVudCAmJiAoIShlbGVtZW50VW5kZXJDdXJzb3IgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgfHwgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBmcmFtZSAodGh1cyBiZWZvcmUgYW55IGF3YWl0cykgYXMgdGhlIHBhc3RlXG4gICAgICAvLyBldmVudCBlbHNlIHNvbWUgYnJvd3NlcnMgKEZGLi4uKSB3aWxsIGNsZWFyIHRoZSBjbGlwYm9hcmREYXRhXG4gICAgICAvLyAoc29tZXRoaW5nIHNvbWV0aGluZyBzZWN1cml0eSlcblxuXG4gICAgICBsZXQgZmlsZSA9IGV2ZW50Py5jbGlwYm9hcmREYXRhPy5maWxlc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcblxuICAgICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoXCI8c3ZnXCIpICYmIHN0cmluZy5lbmRzV2l0aChcIjwvc3ZnPlwiKSkge1xuICAgICAgICAgIC8vIGlnbm9yZSBTVkcgdmFsaWRhdGlvbi9ub3JtYWxpemF0aW9uIHdoaWNoIHdpbGwgYmUgZG9uZSBkdXJpbmcgaW1hZ2VcbiAgICAgICAgICAvLyBpbml0aWFsaXphdGlvblxuICAgICAgICAgIGZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBwcmVmZXIgc3ByZWFkc2hlZXQgZGF0YSBvdmVyIGltYWdlIGZpbGUgKE1TIE9mZmljZS9MaWJyZSBPZmZpY2UpXG5cblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpICYmICFkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiBzY2VuZVgsXG4gICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgICAgIGNsaWVudFg6IGN1cnNvclgsXG4gICAgICAgICAgY2xpZW50WTogY3Vyc29yWVxuICAgICAgICB9LCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgIHNjZW5lWVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuXG4gICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoeWllbGQgX3RoaXMxMy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmVycm9yTWVzc2FnZSkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzIHx8IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICBfdGhpczEzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZWxlY3RTaGFwZVRvb2woXCJzZWxlY3Rpb25cIik7XG5cbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQpIHtcbiAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKSk7XG5cbiAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMob3B0cy5lbGVtZW50cywgbnVsbCk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuICAgIGNvbnN0IGNsaWVudFggPSB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIiA/IG9wdHMucG9zaXRpb24uY2xpZW50WCA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCIgPyBjdXJzb3JYIDogX3RoaXMxMy5zdGF0ZS53aWR0aCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9IHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiID8gb3B0cy5wb3NpdGlvbi5jbGllbnRZIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIiA/IGN1cnNvclkgOiBfdGhpczEzLnN0YXRlLmhlaWdodCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldFRvcDtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WCxcbiAgICAgIGNsaWVudFlcbiAgICB9LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBkeCA9IHggLSBlbGVtZW50c0NlbnRlclg7XG4gICAgY29uc3QgZHkgPSB5IC0gZWxlbWVudHNDZW50ZXJZO1xuICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50LCB7XG4gICAgICAgIHg6IGVsZW1lbnQueCArIGdyaWRYIC0gbWluWCxcbiAgICAgICAgeTogZWxlbWVudC55ICsgZ3JpZFkgLSBtaW5ZXG4gICAgICB9KTtcbiAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIG5ld0VsZW1lbnQuaWQpO1xuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgfSk7XG4gICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihuZXdFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCAuLi5uZXdFbGVtZW50c107XG4gICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuXG4gICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBvcHRzLmZpbGVzKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0RWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9XG4gICAgfSksIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgfTtcblxuICB0aGlzLnNldEFwcFN0YXRlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIF90aGlzMTMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICB0aGlzLnJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyByZW1vdmUgdG91Y2ggaGFuZGxlciBmb3IgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiAmJiB0b3VjaFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdlc3R1cmUucG9pbnRlcnMuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVMb2NrID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudExvY2tlZDogIXByZXZTdGF0ZS5lbGVtZW50TG9ja2VkLFxuICAgICAgICBlbGVtZW50VHlwZTogcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQgPyBcInNlbGVjdGlvblwiIDogcHJldlN0YXRlLmVsZW1lbnRUeXBlXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMudG9nZ2xlWmVuTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVaZW5Nb2RlKTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZVN0YXRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zaG93U3RhdHMpIHtcbiAgICAgIHRyYWNrRXZlbnQoXCJkaWFsb2dcIiwgXCJzdGF0c1wiKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVTdGF0cyk7XG4gIH07XG5cbiAgdGhpcy5zY3JvbGxUb0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKHt9LCBjYWxjdWxhdGVTY3JvbGxDZW50ZXIoQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF0sIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzKSkpO1xuICB9O1xuXG4gIHRoaXMuem9vbVRvRml0ID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCB0YXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICBsZXQgbWF4Wm9vbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICBsZXQgbWFyZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwLjAzO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4Wm9vbSA9IDE7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh6b29tVG9GaXRFbGVtZW50cyh0YXJnZXQsIF90aGlzMTMuc3RhdGUsIGZhbHNlLCBtYXhab29tLCBtYXJnaW4pLmFwcFN0YXRlKTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZUNvbnRhaW5lclNpemUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGNvbnRhaW5lcnMpIHtcbiAgICBjb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBjb25zdCBbeCwgeV0gPSByb3RhdGUoZWwueCArIGVsLndpZHRoLCBlbC55ICsgZWwuaGVpZ2h0LCBlbC54ICsgZWwud2lkdGggLyAyLCBlbC55ICsgZWwuaGVpZ2h0IC8gMiwgZWwuYW5nbGUpO1xuICAgICAgcmVzaXplU2luZ2xlRWxlbWVudChlbCwgdHJ1ZSwgZWwsIFwic2VcIiwgdHJ1ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuY2xlYXJUb2FzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHRvYXN0TWVzc2FnZTogbnVsbFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuc2V0VG9hc3RNZXNzYWdlID0gZnVuY3Rpb24gKHRvYXN0TWVzc2FnZSkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgdG9hc3RNZXNzYWdlXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXN0b3JlRmlsZUZyb21TaGFyZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0geWllbGQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuICAgICAgY29uc3QgZmlsZSA9IHlpZWxkIHdlYlNoYXJlVGFyZ2V0Q2FjaGUubWF0Y2goXCJzaGFyZWQtZmlsZVwiKTtcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGUuYmxvYigpO1xuXG4gICAgICAgIF90aGlzMTMubG9hZEZpbGVUb0NhbnZhcyhibG9iKTtcblxuICAgICAgICB5aWVsZCB3ZWJTaGFyZVRhcmdldENhY2hlLmRlbGV0ZShcInNoYXJlZC1maWxlXCIpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgQVBQX05BTUUsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMuYWRkRmlsZXMgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZXNNYXAgPSBmaWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZmlsZURhdGEpIHtcbiAgICAgIGFjYy5zZXQoZmlsZURhdGEuaWQsIGZpbGVEYXRhKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IE1hcCgpKTtcbiAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVzTWFwKSk7IC8vIGJ1bXAgdmVyc2lvbnMgZm9yIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGFkZGVkIGZpbGVzIHNvIHRoYXRcbiAgICAvLyB3ZS9ob3N0IGFwcHMgY2FuIGRldGVjdCB0aGUgY2hhbmdlLCBhbmQgaW52YWxpZGF0ZSB0aGUgaW1hZ2UgJiBzaGFwZVxuICAgIC8vIGNhY2hlXG5cbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNNYXAuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICBfdGhpczEzLmltYWdlQ2FjaGUuZGVsZXRlKGVsZW1lbnQuZmlsZUlkKTtcblxuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBidW1wVmVyc2lvbihlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcblxuICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0pO1xuXG4gIHRoaXMuc2V0TG9jYWxGb250ID0gZnVuY3Rpb24gKHNob3dPblBhbmVsKSB7XG4gICAgc2hvd0ZvdXJ0aEZvbnQgPSBzaG93T25QYW5lbDtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZVNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChzY2VuZURhdGEpIHtcbiAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoc2NlbmVEYXRhLmFwcFN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhzY2VuZURhdGEuZWxlbWVudHMpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbGxhYm9yYXRvcnM6IHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmxpYnJhcnlJdGVtcykge1xuICAgICAgX3RoaXMxMy5saWJyYXJ5LnNhdmVMaWJyYXJ5KHJlc3RvcmVMaWJyYXJ5SXRlbXMoc2NlbmVEYXRhLmxpYnJhcnlJdGVtcywgXCJ1bnB1Ymxpc2hlZFwiKSk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLm9uU2NlbmVVcGRhdGVkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGN1cnNvclggPSBldmVudC5jbGllbnRYO1xuICAgIGN1cnNvclkgPSBldmVudC5jbGllbnRZO1xuICB9KTtcbiAgdGhpcy5vbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuICAgIGlmIChcIlByb3h5XCIgaW4gd2luZG93ICYmICghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSB8fCBldmVudC5zaGlmdEtleSAmJiAvXlthLXpdJC8udGVzdChldmVudC5rZXkpKSkge1xuICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgZ2V0KGV2LCBwcm9wKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gZml4IGZvciBQcm94aWVzIGhpamFja2luZyBgdGhpc2BcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIiA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICBldmVudC5zaGlmdEtleSA/IGV2LmtleS50b1VwcGVyQ2FzZSgpIDogZXYua2V5LnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC5rZXkgIT09IEtFWVMuRVNDQVBFIHx8IC8vIGNhc2U6IHVzaW5nIGFycm93cyB0byBtb3ZlIGJldHdlZW4gYnV0dG9uc1xuICAgIGlzQXJyb3dLZXkoZXZlbnQua2V5KSAmJiBpc0lucHV0TGlrZShldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RVUVTVElPTl9NQVJLKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvd0hlbHBEaWFsb2c6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5aRVJPKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMaWJyYXJ5T3BlbjogIV90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3BlblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc3RlcCA9IF90aGlzMTMuc3RhdGUuZ3JpZFNpemUgJiYgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UIDogX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSkgfHwgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UIDogRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSwgdHJ1ZSk7XG4gICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19SSUdIVCkge1xuICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgIG9mZnNldFkgPSAtc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBvZmZzZXRYLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFlcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkKSB7XG4gICAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3Ioc2VsZWN0ZWRFbGVtZW50c1swXSwgX3RoaXMxMy5zY2VuZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG5cbiAgICAgICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgICBzY2VuZVg6IHNlbGVjdGVkRWxlbWVudC54ICsgc2VsZWN0ZWRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgc2hvdWxkQmluZDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmIF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG5cbiAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChzaGFwZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RKSB7XG4gICAgICAgIF90aGlzMTMudG9nZ2xlTG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UgJiYgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwKSB7XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IHRydWU7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJiAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgJiYgKGhhc0JhY2tncm91bmQoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSkgfHwgc2VsZWN0ZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSk7XG4gICAgICB9KSkpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcInN0cm9rZUNvbG9yUGlja2VyXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbktleVVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UpIHtcbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIV90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKF90aGlzMTMuc3RhdGUpID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKSA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZVN0YXJ0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge31cbiAgICB9KTtcblxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlO1xuICB9KTtcbiAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gb25HZXN0dXJlQ2hhbmdlIG9ubHkgaGFzIHpvb20gZmFjdG9yIGJ1dCBub3QgdGhlIGNlbnRlci5cbiAgICAvLyBJZiB3ZSdyZSBvbiBpUGFkIG9yIGlQaG9uZSwgdGhlbiB3ZSByZWNvZ25pemUgbXVsdGktdG91Y2ggYW5kIHdpbGxcbiAgICAvLyB6b29tIGluIGF0IHRoZSByaWdodCBsb2NhdGlvbiBvbiB0aGUgdG91Y2hNb3ZlIGhhbmRsZXIgYWxyZWFkeS5cbiAgICAvLyBPbiBNYWNib29rLCB3ZSBkb24ndCBoYXZlIHRob3NlIGV2ZW50cyBzbyB3aWxsIHpvb20gaW4gYXQgdGhlXG4gICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbnN0ZWFkLlxuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuXG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjgpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIG9mZnNldExlZnQsXG4gICAgICAgICAgb2Zmc2V0VG9wXG4gICAgICAgIH0gPSBfcmVmODtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB6b29tOiBnZXROZXdab29tKGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIGV2ZW50LnNjYWxlKSwgem9vbSwge1xuICAgICAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgICAgIHRvcDogb2Zmc2V0VG9wXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogY3Vyc29yWCxcbiAgICAgICAgICAgIHk6IGN1cnNvcllcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbkdlc3R1cmVFbmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgfSk7XG5cbiAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IG51bGw7XG4gIH0pO1xuXG4gIHRoaXMuc3RhcnRUZXh0RWRpdGluZyA9IGZ1bmN0aW9uIChfcmVmOSkge1xuICAgIGxldCB7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVksXG4gICAgICBzaG91bGRCaW5kLFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgPSB0cnVlXG4gICAgfSA9IF9yZWY5O1xuXG4gICAgbGV0IHBhcmVudENlbnRlclBvc2l0aW9uID0gaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiYgX3RoaXMxMy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcywgd2luZG93LmRldmljZVBpeGVsUmF0aW8pOyAvLyBiaW5kIHRvIGNvbnRhaW5lciB3aGVuIHNob3VsZEJpbmQgaXMgdHJ1ZSBvclxuICAgIC8vIGNsaWNrZWQgb24gY2VudGVyIG9mIGNvbnRhaW5lclxuXG5cbiAgICBjb25zdCBjb250YWluZXIgPSBzaG91bGRCaW5kIHx8IHBhcmVudENlbnRlclBvc2l0aW9uID8gZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbihfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiAhaXNUZXh0RWxlbWVudChlbGUpO1xuICAgIH0pLCBzY2VuZVgsIHNjZW5lWSkgOiBudWxsO1xuXG4gICAgbGV0IGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBfdGhpczEzLmdldFRleHRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7IC8vIGNvbnNpZGVyIGJvdW5kZWQgdGV4dCBlbGVtZW50IGlmIGNvbnRhaW5lciBwcmVzZW50XG5cblxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuXG4gICAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiYgY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBmb250U3RyaW5nID0ge1xuICAgICAgICBmb250U2l6ZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1pbldpZHRoID0gZ2V0QXBwcm94TWluTGluZVdpZHRoKGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gZ2V0QXBwcm94TWluTGluZUhlaWdodChnZXRGb250U3RyaW5nKGZvbnRTdHJpbmcpKTtcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lci5oZWlnaHQsIG1pbkhlaWdodCk7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lci53aWR0aCwgbWluV2lkdGgpO1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgIHdpZHRoOiBuZXdXaWR0aFxuICAgICAgfSk7XG4gICAgICBzY2VuZVggPSBjb250YWluZXIueCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGNvbnRhaW5lci55ICsgbmV3SGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKHBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIHBhcmVudENlbnRlclBvc2l0aW9uID0gX3RoaXMxMy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcywgd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBleGlzdGluZ1RleHRFbGVtZW50ID8gZXhpc3RpbmdUZXh0RWxlbWVudCA6IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHg6IHBhcmVudENlbnRlclBvc2l0aW9uID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclggOiBzY2VuZVgsXG4gICAgICB5OiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJZIDogc2NlbmVZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0OiBcIlwiLFxuICAgICAgcmF3VGV4dDogXCJcIixcbiAgICAgIGZvbnRTaXplOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBcImNlbnRlclwiIDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uID8gXCJtaWRkbGVcIiA6IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgICBjb250YWluZXJJZDogY29udGFpbmVyPy5pZCA/PyB1bmRlZmluZWQsXG4gICAgICBncm91cElkczogY29udGFpbmVyPy5ncm91cElkcyA/PyBbXVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudFxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0aW5nVGV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIGlmIHRleHQgZWxlbWVudCBpcyBubyBsb25nZXIgY2VudGVyZWQgdG8gYSBjb250YWluZXIsIHJlc2V0XG4gICAgICAvLyB2ZXJ0aWNhbEFsaWduIHRvIGRlZmF1bHQgYmVjYXVzZSBpdCdzIGN1cnJlbnRseSBpbnRlcm5hbC1vbmx5XG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uIHx8IGVsZW1lbnQudGV4dEFsaWduICE9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7IC8vIGNhc2U6IGNyZWF0aW5nIG5ldyB0ZXh0IG5vdCBjZW50ZXJlZCB0byBwYXJlbnQgZWxlbWVuZW50IOKGkiBvZmZzZXQgWVxuICAgICAgLy8gc28gdGhhdCB0aGUgdGV4dCBpcyBjZW50ZXJlZCB0byBjdXJzb3IgcG9zaXRpb25cblxuXG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHk6IGVsZW1lbnQueSAtIGVsZW1lbnQuYmFzZWxpbmUgLyAyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICB9KTtcblxuICAgIF90aGlzMTMuaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQ6ICEhZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBjYXNlOiBkb3VibGUtY2xpY2tpbmcgd2l0aCBhcnJvdy9saW5lIHRvb2wgc2VsZWN0ZWQgd291bGQgYm90aCBjcmVhdGVcbiAgICAvLyB0ZXh0IGFuZCBlbnRlciBtdWx0aUVsZW1lbnQgbW9kZVxuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWJsZSB0byBkb3VibGUgY2xpY2sgd2hlbiBtb2RlIGlzIHNlbGVjdGlvblxuXG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICBpZiAoIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgIT09IHNlbGVjdGVkRWxlbWVudHNbMF0uaWQpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBfdGhpczEzLnNjZW5lKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICBsZXQge1xuICAgICAgeDogc2NlbmVYLFxuICAgICAgeTogc2NlbmVZXG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHMoX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9IGhpdEVsZW1lbnQgJiYgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCBfdGhpczEzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge31cbiAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcblxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIV90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgY29uc3QgY2FuQmluZFRleHQgPSBoYXNCb3VuZFRleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICAgICAgc2NlbmVYID0gc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgICAgIHNjZW5lWSA9IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBfdGhpczEzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIF90aGlzMTMuc3RhdGUuY3Vyc29yQnV0dG9uKTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyICYmIGdlc3R1cmUubGFzdENlbnRlciAmJiBpbml0aWFsU2NhbGUgJiYgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGNlbnRlci54IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLng7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjZW50ZXIueSAtIGdlc3R1cmUubGFzdENlbnRlci55O1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gY2VudGVyO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpKTtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjEwKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICBzY3JvbGxYLFxuICAgICAgICAgIHNjcm9sbFksXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3BcbiAgICAgICAgfSA9IF9yZWYxMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxYOiBzY3JvbGxYICsgZGVsdGFYIC8gem9vbS52YWx1ZSxcbiAgICAgICAgICBzY3JvbGxZOiBzY3JvbGxZICsgZGVsdGFZIC8gem9vbS52YWx1ZSxcbiAgICAgICAgICB6b29tOiBnZXROZXdab29tKGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIHNjYWxlRmFjdG9yKSwgem9vbSwge1xuICAgICAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgICAgIHRvcDogb2Zmc2V0VG9wXG4gICAgICAgICAgfSwgY2VudGVyKSxcbiAgICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0hvbGRpbmdTcGFjZSB8fCBpc1Bhbm5pbmcgfHwgaXNEcmFnZ2luZ1Njcm9sbEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzID0gaXNPdmVyU2Nyb2xsQmFycyhjdXJyZW50U2Nyb2xsQmFycywgZXZlbnQuY2xpZW50WCAtIF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdCwgZXZlbnQuY2xpZW50WSAtIF90aGlzMTMuc3RhdGUub2Zmc2V0VG9wKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCB7XG4gICAgICB4OiBzY2VuZVBvaW50ZXJYLFxuICAgICAgeTogc2NlbmVQb2ludGVyWVxuICAgIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQsIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudC5sYXN0VW5jb21taXR0ZWRQb2ludCAhPSBudWxsKSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQmluZGluZ0VsZW1lbnRUeXBlKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpKSB7XG4gICAgICAvLyBIb3ZlcmluZyB3aXRoIGEgc2VsZWN0ZWQgdG9vbCBvciBjcmVhdGluZyBuZXcgbGluZWFyIGVsZW1lbnQgdmlhIGNsaWNrXG4gICAgICAvLyBhbmQgcG9pbnRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcblxuICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKGRyYWdnaW5nRWxlbWVudCwgW3NjZW5lUG9pbnRlcl0sIF90aGlzMTMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3Ioc2NlbmVQb2ludGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbXVsdGlFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogcngsXG4gICAgICAgIHk6IHJ5XG4gICAgICB9ID0gbXVsdGlFbGVtZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICBwb2ludHMsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFxuICAgICAgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSk7XG5cbiAgICAgIGlmIChsYXN0UG9pbnQgPT09IGxhc3RDb21taXR0ZWRQb2ludCkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IHlldCBjcmVhdGVkIGEgdGVtcCBwb2ludCBhbmQgd2UncmUgYmV5b25kIGNvbW1pdC16b25lXG4gICAgICAgIC8vIHRocmVzaG9sZCwgYWRkIGEgcG9pbnRcbiAgICAgICAgaWYgKGRpc3RhbmNlMmQoc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnksIGxhc3RQb2ludFswXSwgbGFzdFBvaW50WzFdKSA+PSBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpOyAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID4gMiAmJiBsYXN0Q29tbWl0dGVkUG9pbnQgJiYgZGlzdGFuY2UyZChzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeSwgbGFzdENvbW1pdHRlZFBvaW50WzBdLCBsYXN0Q29tbWl0dGVkUG9pbnRbMV0pIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogcG9pbnRzLnNsaWNlKDAsIC0xKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9IC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG5cblxuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRGVzZWxlY3RlZEJ1dHRvbiA9IEJvb2xlYW4oZXZlbnQuYnV0dG9ucyk7XG5cbiAgICBpZiAoaGFzRGVzZWxlY3RlZEJ1dHRvbiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgIWlzT3ZlclNjcm9sbEJhciAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlLCBzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcblxuICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJiBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnkpO1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGlzVGV4dEVsZW1lbnQoaGl0RWxlbWVudCkgPyBDVVJTT1JfVFlQRS5URVhUIDogQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgIH0gZWxzZSBpZiAoaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCk7XG5cbiAgICAgIGlmIChlbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldKSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCAvLyBpZiB1c2luZyBjbWQvY3RybCwgd2UncmUgbm90IGRyYWdnaW5nXG4gICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIChoaXRFbGVtZW50IHx8IF90aGlzMTMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoc2NlbmVQb2ludGVyLCBzZWxlY3RlZEVsZW1lbnRzKSkpIHtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gcmVtb3ZlIGFueSBhY3RpdmUgc2VsZWN0aW9uIHdoZW4gd2Ugc3RhcnQgdG8gaW50ZXJhY3Qgd2l0aCBjYW52YXNcbiAgICAvLyAobWFpbmx5LCB3ZSBjYXJlIGFib3V0IHJlbW92aW5nIHNlbGVjdGlvbiBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2hpY2hcbiAgICAvLyAgd291bGQgcHJldmVudCBvdXIgY29weSBoYW5kbGluZyBvdGhlcndpc2UpXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG5cbiAgICBfdGhpczEzLm1heWJlQ2xlYW51cEFmdGVyTWlzc2luZ1BvaW50ZXJVcChldmVudCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBsYXN0UG9pbnRlckRvd25XaXRoOiBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgIGN1cnNvckJ1dHRvbjogXCJkb3duXCJcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gb25seSBoYW5kbGUgbGVmdCBtb3VzZSBidXR0b24gb3IgdG91Y2hcblxuXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7IC8vIGRvbid0IHNlbGVjdCB3aGlsZSBwYW5uaW5nXG5cblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTdGF0ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgcG9pbnRlciBpbnRlcmFjdGlvbiwgd2hpY2ggc3RhcnRzIHdpdGggYVxuICAgIC8vIHBvaW50ZXJEb3duIGV2ZW50LCBlbmRzIHdpdGggYSBwb2ludGVyVXAgZXZlbnQgKG9yIGFub3RoZXIgcG9pbnRlckRvd24pXG5cblxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSBfdGhpczEzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmIChfdGhpczEzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZShldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVUZXh0T25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIC8vIHJlc2V0IGltYWdlIHByZXZpZXcgb24gcG9pbnRlcmRvd25cbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcblxuICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBtdXRhdGVFbGVtZW50KF90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVGcmVlRHJhd0VsZW1lbnRPblBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5jcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24oX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IF90aGlzMTMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IF90aGlzMTMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gX3RoaXMxMy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlVcCA9IF90aGlzMTMub25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgb25LZXlEb3duKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCBvbktleVVwKTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlID0gb25Qb2ludGVyTW92ZTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCA9IG9uUG9pbnRlclVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwID0gb25LZXlVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duID0gb25LZXlEb3duO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlT3BlbkNvbnRleHRNZW51QWZ0ZXJQb2ludGVyRG93bk9uVG91Y2hEZXZpY2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcblxuICAgICAgICAgIGlmICghaW52YWxpZGF0ZUNvbnRleHRNZW51KSB7XG4gICAgICAgICAgICBfdGhpczEzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51KGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICghKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCAmJiAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5XSEVFTCB8fCBldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgaXNIb2xkaW5nU3BhY2UgfHwgX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpKSB8fCBpc1RleHRFbGVtZW50KF90aGlzMTMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBuZXh0UGFzdGVQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBpc0xpbnV4ID0gL0xpbnV4Ly50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pO1xuICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgIGxldCB7XG4gICAgICBjbGllbnRYOiBsYXN0WCxcbiAgICAgIGNsaWVudFk6IGxhc3RZXG4gICAgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBjb25zdCBkZWx0YVggPSBsYXN0WCAtIGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBsYXN0WSAtIGV2ZW50LmNsaWVudFk7XG4gICAgICBsYXN0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBsYXN0WSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICAvKlxuICAgICAgICogUHJldmVudCBwYXN0ZSBldmVudCBpZiB3ZSBtb3ZlIHdoaWxlIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eC5cbiAgICAgICAqIFNlZSBpc3N1ZSAjMTM4My5cbiAgICAgICAqL1xuXG4gICAgICBpZiAoaXNMaW51eCAmJiAhbmV4dFBhc3RlUHJldmVudGVkICYmIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSkpIHtcbiAgICAgICAgbmV4dFBhc3RlUHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgLyogUHJldmVudCB0aGUgbmV4dCBwYXN0ZSBldmVudCAqL1xuXG4gICAgICAgIGNvbnN0IHByZXZlbnROZXh0UGFzdGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuICAgICAgICAvKlxuICAgICAgICAgKiBSZWVuYWJsZSBuZXh0IHBhc3RlIGluIGNhc2Ugb2YgZGlzYWJsZWQgbWlkZGxlIGNsaWNrIHBhc3RlIGZvclxuICAgICAgICAgKiBhbnkgcmVhc29uOlxuICAgICAgICAgKiAtIHJpZ3RoIGNsaWNrIHBhc3RlXG4gICAgICAgICAqIC0gZW1wdHkgY2xpcGJvYXJkXG4gICAgICAgICAqL1xuXG5cbiAgICAgICAgY29uc3QgZW5hYmxlTmV4dFBhc3RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogX3RoaXMxMy5zdGF0ZS5zY3JvbGxYIC0gZGVsdGFYIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiBfdGhpczEzLnN0YXRlLnNjcm9sbFkgLSBkZWx0YVkgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlYXJkb3duID0gd2l0aEJhdGNoZWRVcGRhdGVzKGxhc3RQb2ludGVyVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGVhcmRvd24pO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICAgIGlmIChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcmVzaXppbmdFbGVtZW50OiBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUuZWxlbWVudFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS50cmFuc2Zvcm1IYW5kbGVUeXBlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlID0gZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMoZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGU6IHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGVcbiAgICAgICAgfSkpO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKGdldFJlc2l6ZU9mZnNldFhZKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHMsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmIHNlbGVjdGVkRWxlbWVudHNbMF0ucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uID0gZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24ocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSwgc2VsZWN0ZWRFbGVtZW50c1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMxMy5zZXRTdGF0ZShhcHBTdGF0ZSk7XG4gICAgICAgICAgfSwgX3RoaXMxMy5oaXN0b3J5LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbik7XG5cbiAgICAgICAgICBpZiAocmV0LmhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSByZXQuaGl0RWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gaGl0RWxlbWVudCBtYXkgYWxyZWFkeSBiZSBzZXQgYWJvdmUsIHNvIGNoZWNrIGZpcnN0XG5cblxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/PyBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpO1xuXG4gICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSA9IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSk7XG4gICAgICAgIH0gLy8gRm9yIG92ZXJsYXBwZWQgZWxlbWVudHMgb25lIHBvc2l0aW9uIG1heSBoaXRcbiAgICAgICAgLy8gbXVsdGlwbGUgZWxlbWVudHNcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gX3RoaXMxMy5nZXRFbGVtZW50c0F0UG9zaXRpb24ocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSk7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoKGhpdEVsZW1lbnQgPT09IG51bGwgfHwgIXNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy8gSWYgd2UgY2xpY2sgb24gc29tZXRoaW5nXG5cbiAgICAgICAgfSBlbHNlIGlmIChoaXRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBvbiBDTUQvQ1RSTCwgZHJpbGwgZG93biB0byBoaXQgZWxlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwcyBldGMuXG4gICAgICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50KHByZXZTdGF0ZSwgaGl0RWxlbWVudCkpLCB7fSwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pOyAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuXG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuXG5cbiAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcgYSBncm91cCwgZXhpdGluZyBlZGl0aW5nIG1vZGUgYW5kIGRlc2VsZWN0IHRoZSBncm91cC5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuXG5cbiAgICAgICAgICAgIGlmICghc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgLy8gaWYgd2UncmUgY3VycmVudGx5IHN0aWxsIGVkaXRpbmcgdGV4dCwgY2xpY2tpbmcgb3V0c2lkZVxuICAgIC8vIHNob3VsZCBvbmx5IGZpbmFsaXplIGl0LCBub3QgY3JlYXRlIGFub3RoZXIgKGlycmVzcGVjdGl2ZVxuICAgIC8vIG9mIHN0YXRlLmVsZW1lbnRMb2NrZWQpXG4gICAgaWYgKGlzVGV4dEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2NlbmVYID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueDtcbiAgICBsZXQgc2NlbmVZID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuQmluZFRleHQgPSBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICBzY2VuZVggPSBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9XG5cbiAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZLFxuICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleVxuICAgIH0pO1xuXG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICAvLyBCZWdpbiBhIG1hcmsgY2FwdHVyZS4gVGhpcyBkb2VzIG5vdCBoYXZlIHRvIHVwZGF0ZSBzdGF0ZSB5ZXQuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgbnVsbCk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjVcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBlbGVtZW50LnByZXNzdXJlcyA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzOiBbWzAsIDBdXSxcbiAgICAgIHByZXNzdXJlc1xuICAgIH0pO1xuICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyRG93blN0YXRlLm9yaWdpbiwgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCA9IGZ1bmN0aW9uIChfcmVmMTEpIHtcbiAgICBsZXQge1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZXG4gICAgfSA9IF9yZWYxMTtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVgsIHNjZW5lWSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ltYWdlRWxlbWVudCh7XG4gICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3NcbiAgICB9KTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtdWx0aUVsZW1lbnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlOyAvLyBmaW5hbGl6ZSBpZiBjb21wbGV0aW5nIGEgbG9vcFxuXG4gICAgICBpZiAobXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IHJ4LFxuICAgICAgICB5OiByeSxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICB9ID0gbXVsdGlFbGVtZW50OyAvLyBjbGlja2luZyBpbnNpZGUgY29tbWl0IHpvbmUg4oaSIGZpbmFsaXplIGFycm93XG5cbiAgICAgIGlmIChtdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEgJiYgbGFzdENvbW1pdHRlZFBvaW50ICYmIGRpc3RhbmNlMmQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCAtIHJ4LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksIGxhc3RDb21taXR0ZWRQb2ludFswXSwgbGFzdENvbW1pdHRlZFBvaW50WzFdKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgW211bHRpRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7IC8vIGNsaWNraW5nIG91dHNpZGUgY29tbWl0IHpvbmUg4oaSIHVwZGF0ZSByZWZlcmVuY2UgZm9yIGxhc3QgY29tbWl0dGVkXG4gICAgICAvLyBwb2ludFxuXG5cbiAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbXVsdGlFbGVtZW50LnBvaW50c1ttdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdXG4gICAgICB9KTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgLyogSWYgYXJyb3cgaXMgcHJlLWFycm93aGVhZHMsIGl0IHdpbGwgaGF2ZSB1bmRlZmluZWQgZm9yIGJvdGggc3RhcnQgYW5kIGVuZCBhcnJvd2hlYWRzLlxuICAgICAgSWYgc28sIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3Igc3RhcnQgYW5kIFwiYXJyb3dcIiBmb3IgZW5kLiBJZiB0aGUgbGluZWFyIGl0ZW0gaXMgbm90XG4gICAgICBhbiBhcnJvdywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBib3RoLiBPdGhlcndpc2UsIHdlIHdhbnQgaXQgdG8gdXNlIHRoZVxuICAgICAgdmFsdWVzIGZyb20gYXBwU3RhdGUuICovXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuICAgICAgY29uc3QgW3N0YXJ0QXJyb3doZWFkLCBlbmRBcnJvd2hlYWRdID0gZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF0gOiBbbnVsbCwgbnVsbF07XG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICB4OiBncmlkWCxcbiAgICAgICAgeTogZ3JpZFksXG4gICAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgICAgIHN0YXJ0QXJyb3doZWFkLFxuICAgICAgICBlbmRBcnJvd2hlYWRcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBbLi4uZWxlbWVudC5wb2ludHMsIFswLCAwXV1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLCBfdGhpczEzLnNjZW5lKTtcblxuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3NcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5pbml0aWFsaXplSW1hZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTIgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKF9yZWYxMykge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQ6IF9pbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZVxuICAgICAgfSA9IF9yZWYxMztcblxuICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGltYWdlIGZpbGUsIGJ1dCB3ZSBkbyB0aGlzIGNoZWNrXG4gICAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICAgIGlmICghaXNTdXBwb3J0ZWRJbWFnZUZpbGUoaW1hZ2VGaWxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWltZVR5cGUgPSBpbWFnZUZpbGUudHlwZTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgXCJ3YWl0XCIpO1xuXG4gICAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHlpZWxkIG5vcm1hbGl6ZVNWRyh5aWVsZCBpbWFnZUZpbGUudGV4dCgpKSwgaW1hZ2VGaWxlLm5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuc3ZnSW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZ2VuZXJhdGUgaW1hZ2UgaWQgKGJ5IGRlZmF1bHQgdGhlIGZpbGUgZGlnZXN0KSBiZWZvcmUgYW55XG4gICAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcblxuXG4gICAgICBjb25zdCBmaWxlSWQgPSB5aWVsZCBfdGhpczEzLnByb3BzLmdlbmVyYXRlSWRGb3JGaWxlPy4oaW1hZ2VGaWxlKSB8fCBnZW5lcmF0ZUlkRnJvbUZpbGUoaW1hZ2VGaWxlKTtcblxuICAgICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZ2VuZXJhdGUgZmlsZSBpZCBvciB0aGUgc3VwcGxpZWQgYGdlbmVyYXRlSWRGb3JGaWxlYCBkaWRuJ3QgcmVzb2x2ZSB0byBvbmUuXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdGaWxlRGF0YSA9IF90aGlzMTMuZmlsZXNbZmlsZUlkXTtcblxuICAgICAgaWYgKCFleGlzdGluZ0ZpbGVEYXRhPy5kYXRhVVJMKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgICAgbWF4V2lkdGhPckhlaWdodDogREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hUXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIHRyeWluZyB0byByZXNpbmcgaW1hZ2UgZmlsZSBvbiBpbnNlcnRpb25cIiwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLmZpbGVUb29CaWdcIiwge1xuICAgICAgICAgICAgbWF4U2l6ZTogYCR7TWF0aC50cnVuYyhNQVhfQUxMT1dFRF9GSUxFX0JZVEVTIC8gMTAyNCAvIDEwMjQpfU1CYFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgICBjb25zdCBkYXRhVVJMID0gX3RoaXMxMy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMOyAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gZnVsbC1zaXplIGZpbGUgZm9yIGN1cnNvciBwcmV2aWV3XG4gICAgICAgIC8vIChpdCdzIG11Y2ggZmFzdGVyIHRvIGNvbnZlcnQgdGhlIHJlc2l6ZWQgZGF0YVVSTCB0byBGaWxlKVxuXG4gICAgICAgIGNvbnN0IHJlc2l6ZWRGaWxlID0gZGF0YVVSTCAmJiBkYXRhVVJMVG9GaWxlKGRhdGFVUkwpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yKHJlc2l6ZWRGaWxlIHx8IGltYWdlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFVUkwgPSBfdGhpczEzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkwgfHwgKHlpZWxkIGdldERhdGFVUkwoaW1hZ2VGaWxlKSk7XG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBtdXRhdGVFbGVtZW50KF9pbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgZmlsZUlkXG4gICAgICB9LCBmYWxzZSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmMTQgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwge30sIHtcbiAgICAgICAgICAgICAgW2ZpbGVJZF06IHtcbiAgICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY2FjaGVkSW1hZ2VEYXRhID0gX3RoaXMxMy5pbWFnZUNhY2hlLmdldChmaWxlSWQpO1xuXG4gICAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuXG4gICAgICAgICAgICAgIHlpZWxkIF90aGlzMTMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB5aWVsZCBjYWNoZWRJbWFnZURhdGEuaW1hZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQgJiYgX3RoaXMxMy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSkpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94Nykge1xuICAgICAgICAgIHJldHVybiBfcmVmMTQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94NSkge1xuICAgICAgcmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmluc2VydEltYWdlRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsIHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBpbWFnZUVsZW1lbnRdKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgeWllbGQgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2Uoe1xuICAgICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgc2hvd0N1cnNvckltYWdlUHJldmlld1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgaXNEZWxldGVkOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDgsIF94OSwgX3gxMCkge1xuICAgICAgcmV0dXJuIF9yZWYxNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLnNldEltYWdlUHJldmlld0N1cnNvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VGaWxlKSB7XG4gICAgICAvLyBtdXN0bid0IGJlIGxhcmdlciB0aGFuIDEyOCBweFxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDk2O1xuICAgICAgY29uc3QgaW1hZ2VQcmV2aWV3ID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICBtYXhXaWR0aE9ySGVpZ2h0OiBjdXJzb3JJbWFnZVNpemVQeFxuICAgICAgfSk7XG4gICAgICBsZXQgcHJldmlld0RhdGFVUkwgPSB5aWVsZCBnZXREYXRhVVJMKGltYWdlUHJldmlldyk7IC8vIFNWRyBjYW5ub3QgYmUgcmVzaXplZCB2aWEgYHJlc2l6ZUltYWdlRmlsZWAgc28gd2UgcmVzaXplIGJ5IHJlbmRlcmluZyB0b1xuICAgICAgLy8gYSBzbWFsbCBjYW52YXNcblxuICAgICAgaWYgKGltYWdlRmlsZS50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICBjb25zdCBpbWcgPSB5aWVsZCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG4gICAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KTtcblxuICAgICAgICBpZiAod2lkdGggPiBjdXJzb3JJbWFnZVNpemVQeCkge1xuICAgICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoaW1nLmhlaWdodCAvIGltZy53aWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHByZXZpZXdEYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2Zyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSA0IDQsIGF1dG9gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gxMSkge1xuICAgICAgcmV0dXJuIF9yZWYxNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLm9uSW1hZ2VBY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTcgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW5zZXJ0T25DYW52YXNEaXJlY3RseVxuICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge1xuICAgICAgICBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5OiBmYWxzZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50WCA9IF90aGlzMTMuc3RhdGUud2lkdGggLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgICAgICBjb25zdCBjbGllbnRZID0gX3RoaXMxMy5zdGF0ZS5oZWlnaHQgLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICAgICAgY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZXG4gICAgICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuICAgICAgICBjb25zdCBpbWFnZUZpbGUgPSB5aWVsZCBmaWxlT3Blbih7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgICBleHRlbnNpb25zOiBbXCJqcGdcIiwgXCJwbmdcIiwgXCJzdmdcIiwgXCJnaWZcIl1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gX3RoaXMxMy5jcmVhdGVJbWFnZUVsZW1lbnQoe1xuICAgICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgICBzY2VuZVk6IHlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGltYWdlRmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogaW1hZ2VFbGVtZW50XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsXG4gICAgICAgICAgICAvKiBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ICovXG4gICAgICAgICAgICB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9yZWYxNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMgPSBmdW5jdGlvbiAoaW1hZ2VFbGVtZW50KSB7XG4gICAgbGV0IGZvcmNlTmF0dXJhbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIGNvbnN0IGltYWdlID0gaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQpICYmIF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoaW1hZ2VFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuXG4gICAgaWYgKCFpbWFnZSB8fCBpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGlmIChpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUgJiYgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclNpemUgPSAxMDAgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgeDogaW1hZ2VFbGVtZW50LnggLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHk6IGltYWdlRWxlbWVudC55IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJTaXplLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJTaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlTmF0dXJhbFNpemUgfHwgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAvLyBpbnRlbnRpb24gd2FzIHRvIGNsaWNrIGluc3RlYWQgb2YgZHJhZywgYW5kIHVzZSB0aGUgaW1hZ2Unc1xuICAgIC8vIGludHJpbnNpYyBzaXplXG4gICAgaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlICYmIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4KF90aGlzMTMuc3RhdGUuaGVpZ2h0IC0gMTIwLCAxNjApOyAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuXG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIE1hdGguZmxvb3IoX3RoaXMxMy5zdGF0ZS5oZWlnaHQgKiAwLjUpIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKGltYWdlLm5hdHVyYWxIZWlnaHQsIG1heEhlaWdodCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGhlaWdodCAqIChpbWFnZS5uYXR1cmFsV2lkdGggLyBpbWFnZS5uYXR1cmFsSGVpZ2h0KTsgLy8gYWRkIGN1cnJlbnQgaW1hZ2VFbGVtZW50IHdpZHRoL2hlaWdodCB0byBhY2NvdW50IGZvciBwcmV2aW91cyBjZW50ZXJpbmdcbiAgICAgIC8vIG9mIHRoZSBwbGFjaG9sZGVyIGltYWdlXG5cbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy51cGRhdGVJbWFnZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE4ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cykge1xuICAgICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgICAgY29uc3Qge1xuICAgICAgICB1cGRhdGVkRmlsZXMsXG4gICAgICAgIGVycm9yZWRGaWxlc1xuICAgICAgfSA9IHlpZWxkIF91cGRhdGVJbWFnZUNhY2hlKHtcbiAgICAgICAgaW1hZ2VDYWNoZTogX3RoaXMxMy5pbWFnZUNhY2hlLFxuICAgICAgICBmaWxlSWRzOiBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5maWxlSWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBmaWxlc1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSB8fCBlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIGlmIChpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmIGVycm9yZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlbWVudCwge1xuICAgICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlZEZpbGVzLFxuICAgICAgICBlcnJvcmVkRmlsZXNcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTIpIHtcbiAgICAgIHJldHVybiBfcmVmMTguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTkgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgbGV0IGltYWdlRWxlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgICAgY29uc3QgdW5jYWNoZWRJbWFnZUVsZW1lbnRzID0gaW1hZ2VFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmlzRGVsZXRlZCAmJiAhX3RoaXMxMy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHVuY2FjaGVkSW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVwZGF0ZWRGaWxlc1xuICAgICAgICB9ID0geWllbGQgX3RoaXMxMy51cGRhdGVJbWFnZUNhY2hlKHVuY2FjaGVkSW1hZ2VFbGVtZW50cywgZmlsZXMpO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSkge1xuICAgICAgICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfcmVmMTkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5zY2hlZHVsZUltYWdlUmVmcmVzaCA9IHRocm90dGxlKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9LCBJTUFHRV9SRU5ERVJfVElNRU9VVCk7XG5cbiAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBzaG91bGRFbmFibGVCaW5kaW5nID0gc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudChldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yID0gZnVuY3Rpb24gKHBvaW50ZXJDb29yZHMpIHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJDb29yZHMsIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsID8gW2hvdmVyZWRCaW5kYWJsZUVsZW1lbnRdIDogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzID0gZnVuY3Rpb24gKGxpbmVhckVsZW1lbnQsIHBvaW50ZXJDb29yZHMsIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudCkge1xuICAgIGlmICghcG9pbnRlckNvb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IHBvaW50ZXJDb29yZHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNvb3Jkcykge1xuICAgICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhjb29yZHMsIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgICBpZiAoaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsICYmICFpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQobGluZWFyRWxlbWVudCwgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCwgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCkpIHtcbiAgICAgICAgYWNjLnB1c2goaG92ZXJlZEJpbmRhYmxlRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nc1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUmVmID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIF90aGlzMTMuY2FudmFzID0gY2FudmFzO1xuICAgICAgX3RoaXMxMy5yYyA9IHJvdWdoLmNhbnZhcyhfdGhpczEzLmNhbnZhcyk7XG5cbiAgICAgIF90aGlzMTMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIF90aGlzMTMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCBfdGhpczEzLm9uVGFwU3RhcnQpO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgX3RoaXMxMy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCBfdGhpczEzLmhhbmRsZVdoZWVsKTtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCBfdGhpczEzLm9uVGFwU3RhcnQpO1xuICAgICAgX3RoaXMxMy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCBfdGhpczEzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVBcHBPbkRyb3AgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMjAgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vbkRyb3ApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCh5aWVsZCBfdGhpczEzLnByb3BzLm9uRHJvcChldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xuXG4gICAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHNjZW5lIGZyb20gdGhlIGltYWdlIGlmIGl0J3MgZW1iZWRkZWRcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5wbmcgfHwgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgICBmaWxlLmhhbmRsZSA9IHlpZWxkIGl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBzY2VuZSA9IHlpZWxkIGxvYWRGcm9tQmxvYihmaWxlLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcblxuICAgICAgICAgICAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiRW5jb2RpbmdFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIGlmIG5vIHNjZW5lIGlzIGVtYmVkZGVkIG9yIHdlIGZhaWwgZm9yIHdoYXRldmVyIHJlYXNvbiwgZmFsbCBiYWNrXG4gICAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeDogc2NlbmVYLFxuICAgICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgICBzY2VuZVlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGlicmFyeVNoYXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG5cbiAgICAgIGlmIChsaWJyYXJ5U2hhcGVzICE9PSBcIlwiKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBKU09OLnBhcnNlKGxpYnJhcnlTaGFwZXMpLFxuICAgICAgICAgIHBvc2l0aW9uOiBldmVudCxcbiAgICAgICAgICBmaWxlczogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzWzBdO1xuXG4gICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliIHx8IGZpbGU/Lm5hbWU/LmVuZHNXaXRoKFwiLmV4Y2FsaWRyYXdsaWJcIikpIHtcbiAgICAgICAgX3RoaXMxMy5saWJyYXJ5LmltcG9ydExpYnJhcnkoZmlsZSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQ2xvc2UgYW5kIHRoZW4gb3BlbiB0byBnZXQgdGhlIGxpYnJhcmllcyB1cGRhdGVkXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xpYnJhcnlPcGVuOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IC8vIGRlZmF1bHQ6IGFzc3VtZSBhbiBFeGNhbGlkcmF3IGZpbGUgcmVnYXJkbGVzcyBvZiBleHRlbnNpb24vTWltZVR5cGVcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgICBmaWxlLmhhbmRsZSA9IHlpZWxkIGl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB5aWVsZCBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTMpIHtcbiAgICAgIHJldHVybiBfcmVmMjAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzID0gZnVuY3Rpb24gKGZpbGUpIHtcbiAgICBsb2FkRnJvbUJsb2IoZmlsZSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkudGhlbihmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICB9KSxcbiAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICAgIH0pKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBwcmVmZXJTZWxlY3RlZDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnQgPyBcImVsZW1lbnRcIiA6IFwiY2FudmFzXCI7XG4gICAgY29uc3QgY29udGFpbmVyID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgY29uc3Qge1xuICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBvZmZzZXRMZWZ0XG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTMuX29wZW5Db250ZXh0TWVudSh7XG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnRcbiAgICAgICAgfSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5fb3BlbkNvbnRleHRNZW51KHtcbiAgICAgICAgdG9wLFxuICAgICAgICBsZWZ0XG4gICAgICB9LCB0eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudCA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlLCBldmVudCkge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG5cbiAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgZHJhZ05ld0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSwgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgY29uc3QgaW1hZ2UgPSBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgJiYgX3RoaXMxMy5pbWFnZUNhY2hlLmdldChkcmFnZ2luZ0VsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlICYmICEoaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0IDogbnVsbDtcbiAgICAgIGRyYWdOZXdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFgsIGdyaWRZLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSwgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSwgYXNwZWN0UmF0aW8pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoW2RyYWdnaW5nRWxlbWVudF0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlSGFuZGxlUmVzaXplID0gZnVuY3Rpb24gKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVUeXBlID0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuICAgIGNvbnN0IFtyZXNpemVYLCByZXNpemVZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueCwgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgaWYgKHRyYW5zZm9ybUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUsIHRyYW5zZm9ybUhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHMsIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uLCBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLCBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0ltYWdlRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCByZXNpemVYLCByZXNpemVZLCBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCwgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnkpKSB7XG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLl9vcGVuQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoX3JlZjIxLCB0eXBlKSB7XG4gICAgbGV0IHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3BcbiAgICB9ID0gX3JlZjIxO1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZVVuZ3JvdXBBY3Rpb24gPSBhY3Rpb25Vbmdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heWJlRmxpcEhvcml6b250YWwgPSBhY3Rpb25GbGlwSG9yaXpvbnRhbC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGFjdGlvbkNvcHlBc1BuZyk7XG4gICAgfVxuXG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGFjdGlvbkNvcHlBc1N2Zyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFsuLi5vcHRpb25zLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsIHR5cGVvZiBfdGhpczEzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVplbk1vZGUsIHR5cGVvZiBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVWaWV3TW9kZSwgYWN0aW9uVG9nZ2xlU3RhdHNdO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogdmlld01vZGVPcHRpb25zLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW190aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICBuYW1lOiBcInBhc3RlXCIsXG4gICAgICAgICAgICBwZXJmb3JtOiBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlcykge1xuICAgICAgICAgICAgICBfdGhpczEzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVwiXG4gICAgICAgICAgfSwgX3RoaXMxMy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNlcGFyYXRvciwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNQbmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNTdmcsIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwIHx8IHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25TZWxlY3RBbGwsIHNlcGFyYXRvciwgdHlwZW9mIF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVaZW5Nb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlVmlld01vZGUsIGFjdGlvblRvZ2dsZVN0YXRzXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW25hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSwgLi4ub3B0aW9uc10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbX3RoaXMxMy5pc01vYmlsZSAmJiBhY3Rpb25DdXQsIF90aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCBfdGhpczEzLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgcGVyZm9ybTogZnVuY3Rpb24gKGVsZW1lbnRzLCBhcHBTdGF0ZXMpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIlxuICAgICAgICAgIH0sIF90aGlzMTMuaXNNb2JpbGUgJiYgc2VwYXJhdG9yLCAuLi5vcHRpb25zLCBzZXBhcmF0b3IsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvblBhc3RlU3R5bGVzLCBzZXBhcmF0b3IsIG1heWJlR3JvdXBBY3Rpb24gJiYgYWN0aW9uR3JvdXAsIG1heWJlVW5ncm91cEFjdGlvbiAmJiBhY3Rpb25Vbmdyb3VwLCAobWF5YmVHcm91cEFjdGlvbiB8fCBtYXliZVVuZ3JvdXBBY3Rpb24pICYmIHNlcGFyYXRvciwgYWN0aW9uQWRkVG9MaWJyYXJ5LCBzZXBhcmF0b3IsIGFjdGlvblNlbmRCYWNrd2FyZCwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25TZW5kVG9CYWNrLCBhY3Rpb25CcmluZ1RvRnJvbnQsIHNlcGFyYXRvciwgbWF5YmVGbGlwSG9yaXpvbnRhbCAmJiBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgbWF5YmVGbGlwVmVydGljYWwgJiYgYWN0aW9uRmxpcFZlcnRpY2FsLCAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sIGFjdGlvbkRlbGV0ZVNlbGVjdGVkXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVXaGVlbCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWVxuICAgIH0gPSBldmVudDtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkc1xuICAgIH0gPSBfdGhpczEzLnN0YXRlOyAvLyBub3RlIHRoYXQgZXZlbnQuY3RybEtleSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHBpbmNoIHpvb21pbmdcblxuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuXG4gICAgICBpZiAoZGVsdGEgPiBNQVhfU1RFUCkge1xuICAgICAgICBkZWx0YSA9IE1BWF9TVEVQO1xuICAgICAgfVxuXG4gICAgICBkZWx0YSAqPSBzaWduO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge31cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdab29tID0gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlIC0gZGVsdGEgLyAxMDA7IC8vIGluY3JlYXNlIHpvb20gc3RlcHMgdGhlIG1vcmUgem9vbWVkLWluIHdlIGFyZSAoYXBwbGllcyB0byA+MTAwJSBvbmx5KVxuXG4gICAgICBuZXdab29tICs9IE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSkgKiAtc2lnbjsgLy8gcm91bmQgdG8gbmVhcmVzdCBzdGVwXG5cbiAgICAgIG5ld1pvb20gPSBNYXRoLnJvdW5kKG5ld1pvb20gKiBaT09NX1NURVAgKiAxMDApIC8gKFpPT01fU1RFUCAqIDEwMCk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyMikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3BcbiAgICAgICAgfSA9IF9yZWYyMjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB6b29tOiBnZXROZXdab29tKGdldE5vcm1hbGl6ZWRab29tKG5ld1pvb20pLCB6b29tLCB7XG4gICAgICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICAgICAgdG9wOiBvZmZzZXRUb3BcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgeTogY3Vyc29yWVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IE9iamVjdC5rZXlzKHNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwID8gc2VsZWN0ZWRFbGVtZW50SWRzIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuXG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyMykge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgc2Nyb2xsWFxuICAgICAgICB9ID0gX3JlZjIzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSAoZGVsdGFZIHx8IGRlbHRhWCkgLyB6b29tLnZhbHVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyNCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgem9vbSxcbiAgICAgICAgc2Nyb2xsWCxcbiAgICAgICAgc2Nyb2xsWVxuICAgICAgfSA9IF9yZWYyNDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiBzY3JvbGxZIC0gZGVsdGFZIC8gem9vbS52YWx1ZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5zYXZlUG9pbnRlciA9IGZ1bmN0aW9uICh4LCB5LCBidXR0b24pIHtcbiAgICBpZiAoIXggfHwgIXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgIGNsaWVudFg6IHgsXG4gICAgICBjbGllbnRZOiB5XG4gICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7Ly8gc29tZXRpbWVzIHRoZSBwb2ludGVyIGdvZXMgb2ZmIHNjcmVlblxuICAgIH1cblxuICAgIF90aGlzMTMucHJvcHMub25Qb2ludGVyVXBkYXRlPy4oe1xuICAgICAgcG9pbnRlcixcbiAgICAgIGJ1dHRvbixcbiAgICAgIHBvaW50ZXJzTWFwOiBnZXN0dXJlLnBvaW50ZXJzXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aGlzMTMudW5tb3VudGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCAzMDApO1xuXG4gIHRoaXMudXBkYXRlRE9NUmVjdCA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3BcbiAgICAgIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGN1cnJlbnRIZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogY3VycmVudE9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogY3VycmVudE9mZnNldExlZnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuXG4gICAgICBpZiAod2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiYgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiYgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBvZmZzZXRMZWZ0LFxuICAgICAgICBvZmZzZXRUb3BcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IgJiYgY2IoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmdldENhbnZhc09mZnNldHMoKSkpO1xuICB9O1xufTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UKSB7XG4gIHdpbmRvdy5oID0gd2luZG93LmggfHwge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHAuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICB9LFxuXG4gICAgICBzZXQoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBcHA7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../components/App.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/App.tsx?");
1888
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"showFourthFont\\\": () => (/* binding */ showFourthFont),\\n/* harmony export */ \\\"useIsMobile\\\": () => (/* binding */ useIsMobile),\\n/* harmony export */ \\\"useExcalidrawContainer\\\": () => (/* binding */ useExcalidrawContainer),\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/asyncToGenerator */ \\\"../../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! roughjs/bin/rough */ \\\"../../../node_modules/roughjs/bin/rough.js\\\");\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(/*! nanoid */ \\\"../../../node_modules/nanoid/index.dev.js\\\");\\n/* harmony import */ var _actions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions */ \\\"../../actions/index.ts\\\");\\n/* harmony import */ var _actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../actions/actionHistory */ \\\"../../actions/actionHistory.tsx\\\");\\n/* harmony import */ var _actions_manager__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/manager */ \\\"../../actions/manager.tsx\\\");\\n/* harmony import */ var _actions_register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/register */ \\\"../../actions/register.ts\\\");\\n/* harmony import */ var _analytics__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../analytics */ \\\"../../analytics.ts\\\");\\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../appState */ \\\"../../appState.ts\\\");\\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../clipboard */ \\\"../../clipboard.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _data__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../data */ \\\"../../data/index.ts\\\");\\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../data/json */ \\\"../../data/json.ts\\\");\\n/* harmony import */ var _data_library__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../data/library */ \\\"../../data/library.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(/*! ../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(/*! ../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _element_binding__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(/*! ../element/binding */ \\\"../../element/binding.ts\\\");\\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(/*! ../element/linearElementEditor */ \\\"../../element/linearElementEditor.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(/*! ../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(/*! ../element/newElement */ \\\"../../element/newElement.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(/*! ../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _gesture__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(/*! ../gesture */ \\\"../../gesture.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var _history__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(/*! ../history */ \\\"../../history.ts\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _renderer__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(/*! ../renderer */ \\\"../../renderer/index.ts\\\");\\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(/*! ../renderer/renderElement */ \\\"../../renderer/renderElement.ts\\\");\\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(/*! ../scene */ \\\"../../scene/index.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _scene_zoom__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(/*! ../scene/zoom */ \\\"../../scene/zoom.ts\\\");\\n/* harmony import */ var _shapes__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(/*! ../shapes */ \\\"../../shapes.tsx\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _ContextMenu__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(/*! ./ContextMenu */ \\\"../../components/ContextMenu.tsx\\\");\\n/* harmony import */ var _LayerUI__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(/*! ./LayerUI */ \\\"../../components/LayerUI.tsx\\\");\\n/* harmony import */ var _Stats__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(/*! ./Stats */ \\\"../../components/Stats.tsx\\\");\\n/* harmony import */ var _Toast__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(/*! ./Toast */ \\\"../../components/Toast.tsx\\\");\\n/* harmony import */ var _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(/*! ../actions/actionToggleViewMode */ \\\"../../actions/actionToggleViewMode.tsx\\\");\\n/* harmony import */ var _data_blob__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(/*! ../data/blob */ \\\"../../data/blob.ts\\\");\\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(/*! ../element/image */ \\\"../../element/image.ts\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(/*! lodash.throttle */ \\\"../../../node_modules/lodash.throttle/index.js\\\");\\n/* harmony import */ var lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default = /*#__PURE__*/__webpack_require__.n(lodash_throttle__WEBPACK_IMPORTED_MODULE_43__);\\n/* harmony import */ var _data_filesystem__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(/*! ../data/filesystem */ \\\"../../data/filesystem.ts\\\");\\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(/*! ../element/textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _element_collision__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(/*! ../element/collision */ \\\"../../element/collision.ts\\\");\\n/* harmony import */ var _element_resizeElements__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(/*! ../element/resizeElements */ \\\"../../element/resizeElements.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nlet showFourthFont = false;\\r\\nconst IsMobileContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext(false);\\r\\nconst useIsMobile = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(IsMobileContext);\\r\\n};\\r\\nconst ExcalidrawContainerContext = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createContext({\\r\\n container: null,\\r\\n id: null\\r\\n});\\r\\nconst useExcalidrawContainer = function () {\\r\\n return (0,react__WEBPACK_IMPORTED_MODULE_2__.useContext)(ExcalidrawContainerContext);\\r\\n};\\r\\nlet didTapTwice = false;\\r\\nlet tappedTwiceTimer = 0;\\r\\nlet cursorX = 0;\\r\\nlet cursorY = 0;\\r\\nlet isHoldingSpace = false;\\r\\nlet isPanning = false;\\r\\nlet isDraggingScrollBar = false;\\r\\nlet currentScrollBars = {\\r\\n horizontal: null,\\r\\n vertical: null\\r\\n};\\r\\nlet touchTimeout = 0;\\r\\nlet invalidateContextMenu = false;\\r\\nlet lastPointerUp = null;\\r\\nconst gesture = {\\r\\n pointers: new Map(),\\r\\n lastCenter: null,\\r\\n initialDistance: null,\\r\\n initialScale: null\\r\\n};\\r\\nclass App extends (react__WEBPACK_IMPORTED_MODULE_2___default().Component) {\\r\\n constructor(props) {\\r\\n var _a;\\r\\n var _this;\\r\\n super(props);\\r\\n _this = this;\\r\\n _initialiseProps.call(this);\\r\\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)();\\r\\n const { excalidrawRef, viewModeEnabled = false, zenModeEnabled = false, gridModeEnabled = false, theme = defaultAppState.theme, name = defaultAppState.name } = props;\\r\\n this.state = _objectSpread(_objectSpread(_objectSpread({}, defaultAppState), {}, {\\r\\n theme,\\r\\n isLoading: true\\r\\n }, this.getCanvasOffsets()), {}, {\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize: gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null,\\r\\n name,\\r\\n width: window.innerWidth,\\r\\n height: window.innerHeight\\r\\n });\\r\\n this.id = (0,nanoid__WEBPACK_IMPORTED_MODULE_49__.nanoid)();\\r\\n if (excalidrawRef) {\\r\\n const readyPromise = \\\"current\\\" in excalidrawRef && ((_a = excalidrawRef.current) === null || _a === void 0 ? void 0 : _a.readyPromise) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resolvablePromise)();\\r\\n const api = {\\r\\n ready: true,\\r\\n readyPromise,\\r\\n updateScene: this.updateScene,\\r\\n addFiles: this.addFiles,\\r\\n resetScene: this.resetScene,\\r\\n getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\\r\\n history: {\\r\\n clear: this.resetHistory\\r\\n },\\r\\n scrollToContent: this.scrollToContent,\\r\\n zoomToFit: this.zoomToFit,\\r\\n getSceneElements: this.getSceneElements,\\r\\n getAppState: function () {\\r\\n return _this.state;\\r\\n },\\r\\n getFiles: function () {\\r\\n return _this.files;\\r\\n },\\r\\n refresh: this.refresh,\\r\\n importLibrary: this.importLibraryFromUrl,\\r\\n setToastMessage: this.setToastMessage,\\r\\n updateContainerSize: this.updateContainerSize,\\r\\n id: this.id,\\r\\n setLocalFont: this.setLocalFont\\r\\n };\\r\\n if (typeof excalidrawRef === \\\"function\\\") {\\r\\n excalidrawRef(api);\\r\\n }\\r\\n else {\\r\\n excalidrawRef.current = api;\\r\\n }\\r\\n readyPromise.resolve(api);\\r\\n }\\r\\n this.excalidrawContainerValue = {\\r\\n container: this.excalidrawContainerRef.current,\\r\\n id: this.id\\r\\n };\\r\\n this.scene = new _scene_Scene__WEBPACK_IMPORTED_MODULE_32__[\\\"default\\\"]();\\r\\n this.library = new _data_library__WEBPACK_IMPORTED_MODULE_15__[\\\"default\\\"](this);\\r\\n this.history = new _history__WEBPACK_IMPORTED_MODULE_25__[\\\"default\\\"]();\\r\\n this.actionManager = new _actions_manager__WEBPACK_IMPORTED_MODULE_7__.ActionManager(this.syncActionResult, function () {\\r\\n return _this.state;\\r\\n }, function () {\\r\\n return _this.scene.getElementsIncludingDeleted();\\r\\n }, this);\\r\\n this.actionManager.registerAll(_actions_register__WEBPACK_IMPORTED_MODULE_8__.actions);\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createUndoAction)(this.history));\\r\\n this.actionManager.registerAction((0,_actions_actionHistory__WEBPACK_IMPORTED_MODULE_6__.createRedoAction)(this.history));\\r\\n }\\r\\n renderCanvas() {\\r\\n const canvasScale = window.devicePixelRatio;\\r\\n const { width: canvasDOMWidth, height: canvasDOMHeight, viewModeEnabled } = this.state;\\r\\n const canvasWidth = canvasDOMWidth * canvasScale;\\r\\n const canvasHeight = canvasDOMHeight * canvasScale;\\r\\n if (viewModeEnabled) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight,\\r\\n cursor: _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"canvas\\\", {\\r\\n className: \\\"excalidraw__canvas\\\",\\r\\n style: {\\r\\n width: canvasDOMWidth,\\r\\n height: canvasDOMHeight\\r\\n },\\r\\n width: canvasWidth,\\r\\n height: canvasHeight,\\r\\n ref: this.handleCanvasRef,\\r\\n onContextMenu: this.handleCanvasContextMenu,\\r\\n onPointerDown: this.handleCanvasPointerDown,\\r\\n onDoubleClick: this.handleCanvasDoubleClick,\\r\\n onPointerMove: this.handleCanvasPointerMove,\\r\\n onPointerUp: this.removePointer,\\r\\n onPointerCancel: this.removePointer,\\r\\n onTouchMove: this.handleTouchMove,\\r\\n children: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"labels.drawingCanvas\\\")\\r\\n });\\r\\n }\\r\\n render() {\\r\\n var _a, _b;\\r\\n var _this2 = this;\\r\\n const { zenModeEnabled, viewModeEnabled } = this.state;\\r\\n const { onCollabButtonClick, renderTopRightUI, renderFooter, renderCustomStats } = this.props;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_4__[\\\"default\\\"])(\\\"excalidraw excalidraw-container\\\", {\\r\\n \\\"excalidraw--view-mode\\\": viewModeEnabled,\\r\\n \\\"excalidraw--mobile\\\": this.isMobile\\r\\n }),\\r\\n ref: this.excalidrawContainerRef,\\r\\n onDrop: this.handleAppOnDrop,\\r\\n tabIndex: 0,\\r\\n onKeyDown: this.props.handleKeyboardGlobally ? undefined : this.onKeyDown,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(ExcalidrawContainerContext.Provider, {\\r\\n value: this.excalidrawContainerValue,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsxs)(IsMobileContext.Provider, {\\r\\n value: this.isMobile,\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_LayerUI__WEBPACK_IMPORTED_MODULE_37__[\\\"default\\\"], {\\r\\n canvas: this.canvas,\\r\\n appState: this.state,\\r\\n files: this.files,\\r\\n setAppState: this.setAppState,\\r\\n actionManager: this.actionManager,\\r\\n elements: this.scene.getElements(),\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n onLockToggle: this.toggleLock,\\r\\n onInsertElements: function (elements) {\\r\\n return _this2.addElementsFromPasteOrLibrary({\\r\\n elements,\\r\\n position: \\\"center\\\",\\r\\n files: null\\r\\n });\\r\\n },\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n toggleZenMode: this.toggleZenMode,\\r\\n langCode: (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.getLanguage)().code,\\r\\n isCollaborating: this.props.isCollaborating,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderCustomFooter: renderFooter,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n showExitZenModeBtn: typeof ((_a = this.props) === null || _a === void 0 ? void 0 : _a.zenModeEnabled) === \\\"undefined\\\" && zenModeEnabled,\\r\\n showThemeBtn: typeof ((_b = this.props) === null || _b === void 0 ? void 0 : _b.theme) === \\\"undefined\\\" && this.props.UIOptions.canvasActions.theme,\\r\\n libraryReturnUrl: this.props.libraryReturnUrl,\\r\\n UIOptions: this.props.UIOptions,\\r\\n focusContainer: this.focusContainer,\\r\\n library: this.library,\\r\\n id: this.id,\\r\\n onImageAction: this.onImageAction\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-textEditorContainer\\\"\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"div\\\", {\\r\\n className: \\\"excalidraw-contextMenuContainer\\\"\\r\\n }), this.state.showStats && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_Stats__WEBPACK_IMPORTED_MODULE_38__.Stats, {\\r\\n appState: this.state,\\r\\n setAppState: this.setAppState,\\r\\n elements: this.scene.getElements(),\\r\\n onClose: this.toggleStats,\\r\\n renderCustomStats: renderCustomStats\\r\\n }), this.state.toastMessage !== null && /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(_Toast__WEBPACK_IMPORTED_MODULE_39__.Toast, {\\r\\n message: this.state.toastMessage,\\r\\n clearToast: this.clearToast\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_48__.jsx)(\\\"main\\\", {\\r\\n children: this.renderCanvas()\\r\\n })]\\r\\n })\\r\\n })\\r\\n });\\r\\n }\\r\\n componentDidMount() {\\r\\n var _this3 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n var _a, _b;\\r\\n _this3.excalidrawContainerValue.container = _this3.excalidrawContainerRef.current;\\r\\n if (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n const setState = _this3.setState.bind(_this3);\\r\\n Object.defineProperties(window.h, {\\r\\n state: {\\r\\n configurable: true,\\r\\n get: function () {\\r\\n return _this3.state;\\r\\n }\\r\\n },\\r\\n setState: {\\r\\n configurable: true,\\r\\n value: function () {\\r\\n return _this3.setState(...arguments);\\r\\n }\\r\\n },\\r\\n app: {\\r\\n configurable: true,\\r\\n value: _this3\\r\\n },\\r\\n history: {\\r\\n configurable: true,\\r\\n value: _this3.history\\r\\n }\\r\\n });\\r\\n }\\r\\n _this3.scene.addCallback(_this3.onSceneUpdated);\\r\\n _this3.addEventListeners();\\r\\n if (_this3.excalidrawContainerRef.current) {\\r\\n _this3.focusContainer();\\r\\n }\\r\\n if (\\\"ResizeObserver\\\" in window && ((_a = _this3.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current)) {\\r\\n _this3.resizeObserver = new ResizeObserver(function () {\\r\\n // compute isMobile state\\r\\n // ---------------------------------------------------------------------\\r\\n const { width, height } = _this3.excalidrawContainerRef.current.getBoundingClientRect();\\r\\n _this3.isMobile = width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT || height < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE && width < _constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE; // refresh offsets\\r\\n // ---------------------------------------------------------------------\\r\\n _this3.updateDOMRect();\\r\\n });\\r\\n (_b = _this3.resizeObserver) === null || _b === void 0 ? void 0 : _b.observe(_this3.excalidrawContainerRef.current);\\r\\n }\\r\\n else if (window.matchMedia) {\\r\\n const mediaQuery = window.matchMedia(`(max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${_constants__WEBPACK_IMPORTED_MODULE_12__.MQ_MAX_WIDTH_LANDSCAPE}px)`);\\r\\n const handler = function () {\\r\\n return _this3.isMobile = mediaQuery.matches;\\r\\n };\\r\\n mediaQuery.addListener(handler);\\r\\n _this3.detachIsMobileMqHandler = function () {\\r\\n return mediaQuery.removeListener(handler);\\r\\n };\\r\\n }\\r\\n const searchParams = new URLSearchParams(window.location.search.slice(1));\\r\\n if (searchParams.has(\\\"web-share-target\\\")) {\\r\\n // Obtain a file that was shared via the Web Share Target API.\\r\\n _this3.restoreFileFromShare();\\r\\n }\\r\\n else {\\r\\n _this3.updateDOMRect(_this3.initializeScene);\\r\\n }\\r\\n })();\\r\\n }\\r\\n componentWillUnmount() {\\r\\n var _a;\\r\\n this.files = {};\\r\\n this.imageCache.clear();\\r\\n (_a = this.resizeObserver) === null || _a === void 0 ? void 0 : _a.disconnect();\\r\\n this.unmounted = true;\\r\\n this.removeEventListeners();\\r\\n this.scene.destroy();\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n }\\r\\n removeEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n (_a = this.nearestScrollableContainer) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_b = this.excalidrawContainerRef.current) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n (_d = this.detachIsMobileMqHandler) === null || _d === void 0 ? void 0 : _d.call(this);\\r\\n }\\r\\n addEventListeners() {\\r\\n var _a, _b, _c, _d;\\r\\n this.removeEventListeners();\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, this.removePointer); // #3553\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.COPY, this.onCopy);\\r\\n if (this.props.handleKeyboardGlobally) {\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, this.onKeyDown, false);\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, this.onKeyUp, {\\r\\n passive: true\\r\\n });\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.MOUSE_MOVE, this.updateCurrentCursorPosition); // rerender text elements on font load to fix #637 && #1553\\r\\n (_b = (_a = document.fonts) === null || _a === void 0 ? void 0 : _a.addEventListener) === null || _b === void 0 ? void 0 : _b.call(_a, \\\"loadingdone\\\", this.onFontLoaded); // Safari-only desktop pinch zoom\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_START, this.onGestureStart, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_CHANGE, this.onGestureChange, false);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.GESTURE_END, this.onGestureEnd, false);\\r\\n if (this.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, this.pasteFromClipboard);\\r\\n document.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.CUT, this.onCut);\\r\\n if (this.props.detectScroll) {\\r\\n this.nearestScrollableContainer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.getNearestScrollableContainer)(this.excalidrawContainerRef.current);\\r\\n this.nearestScrollableContainer.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.SCROLL, this.onScroll);\\r\\n }\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.RESIZE, this.onResize, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.UNLOAD, this.onUnload, false);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, this.onBlur, false);\\r\\n (_c = this.excalidrawContainerRef.current) === null || _c === void 0 ? void 0 : _c.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DRAG_OVER, this.disableEvent, false);\\r\\n (_d = this.excalidrawContainerRef.current) === null || _d === void 0 ? void 0 : _d.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.DROP, this.disableEvent, false);\\r\\n }\\r\\n componentDidUpdate(prevProps, prevState) {\\r\\n var _a, _b, _c;\\r\\n var _this4 = this;\\r\\n if (prevProps.langCode !== this.props.langCode) {\\r\\n this.updateLanguage();\\r\\n }\\r\\n if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\\r\\n this.setState({\\r\\n viewModeEnabled: !!this.props.viewModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\\r\\n this.addEventListeners();\\r\\n this.deselectElements();\\r\\n }\\r\\n if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\\r\\n this.setState({\\r\\n zenModeEnabled: !!this.props.zenModeEnabled\\r\\n });\\r\\n }\\r\\n if (prevProps.theme !== this.props.theme && this.props.theme) {\\r\\n this.setState({\\r\\n theme: this.props.theme\\r\\n });\\r\\n }\\r\\n if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\\r\\n this.setState({\\r\\n gridSize: this.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null\\r\\n });\\r\\n }\\r\\n if (this.props.name && prevProps.name !== this.props.name) {\\r\\n this.setState({\\r\\n name: this.props.name\\r\\n });\\r\\n }\\r\\n (_a = this.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.classList.toggle(\\\"theme--dark\\\", this.state.theme === \\\"dark\\\");\\r\\n if (this.state.editingLinearElement && !this.state.selectedElementIds[this.state.editingLinearElement.elementId]) {\\r\\n // defer so that the commitToHistory flag isn't reset via current update\\r\\n setTimeout(function () {\\r\\n _this4.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n const { multiElement } = prevState;\\r\\n if (prevState.elementType !== this.state.elementType && multiElement != null && (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(this.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(multiElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(multiElement, this.state, this.scene, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)(_element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getPointAtIndexGlobalCoordinates(multiElement, -1)));\\r\\n }\\r\\n const cursorButton = {};\\r\\n const pointerViewportCoords = {};\\r\\n const remoteSelectedElementIds = {};\\r\\n const pointerUsernames = {};\\r\\n const pointerUserStates = {};\\r\\n this.state.collaborators.forEach(function (user, socketId) {\\r\\n if (user.selectedElementIds) {\\r\\n for (const id of Object.keys(user.selectedElementIds)) {\\r\\n if (!(id in remoteSelectedElementIds)) {\\r\\n remoteSelectedElementIds[id] = [];\\r\\n }\\r\\n remoteSelectedElementIds[id].push(socketId);\\r\\n }\\r\\n }\\r\\n if (!user.pointer) {\\r\\n return;\\r\\n }\\r\\n if (user.username) {\\r\\n pointerUsernames[socketId] = user.username;\\r\\n }\\r\\n if (user.userState) {\\r\\n pointerUserStates[socketId] = user.userState;\\r\\n }\\r\\n pointerViewportCoords[socketId] = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: user.pointer.x,\\r\\n sceneY: user.pointer.y\\r\\n }, _this4.state);\\r\\n cursorButton[socketId] = user.button;\\r\\n });\\r\\n const renderingElements = this.scene.getElements().filter(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(element)) {\\r\\n if ( // not placed on canvas yet (but in elements array)\\r\\n _this4.state.pendingImageElement && element.id === _this4.state.pendingImageElement.id) {\\r\\n return false;\\r\\n }\\r\\n } // don't render text element that's being currently edited (it's\\r\\n // rendered on remote only)\\r\\n return !_this4.state.editingElement || _this4.state.editingElement.type !== \\\"text\\\" || element.id !== _this4.state.editingElement.id;\\r\\n });\\r\\n const { atLeastOneVisibleElement, scrollBars } = (0,_renderer__WEBPACK_IMPORTED_MODULE_29__.renderScene)(renderingElements, this.state, this.state.selectionElement, window.devicePixelRatio, this.rc, this.canvas, {\\r\\n scrollX: this.state.scrollX,\\r\\n scrollY: this.state.scrollY,\\r\\n viewBackgroundColor: this.state.viewBackgroundColor,\\r\\n zoom: this.state.zoom,\\r\\n remotePointerViewportCoords: pointerViewportCoords,\\r\\n remotePointerButton: cursorButton,\\r\\n remoteSelectedElementIds,\\r\\n remotePointerUsernames: pointerUsernames,\\r\\n remotePointerUserStates: pointerUserStates,\\r\\n shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\\r\\n theme: this.state.theme,\\r\\n imageCache: this.imageCache,\\r\\n isExporting: false,\\r\\n renderScrollbars: !this.isMobile\\r\\n });\\r\\n if (scrollBars) {\\r\\n currentScrollBars = scrollBars;\\r\\n }\\r\\n const scrolledOutside = // hide when editing text\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(this.state.editingElement) ? false : !atLeastOneVisibleElement && renderingElements.length > 0;\\r\\n if (this.state.scrolledOutside !== scrolledOutside) {\\r\\n this.setState({\\r\\n scrolledOutside\\r\\n });\\r\\n }\\r\\n this.history.record(this.state, this.scene.getElementsIncludingDeleted());\\r\\n this.scheduleImageRefresh(); // Do not notify consumers if we're still loading the scene. Among other\\r\\n // potential issues, this fixes a case where the tab isn't focused during\\r\\n // init, which would trigger onChange with empty elements, which would then\\r\\n // override whatever is in localStorage currently.\\r\\n if (!this.state.isLoading) {\\r\\n (_c = (_b = this.props).onChange) === null || _c === void 0 ? void 0 : _c.call(_b, this.scene.getElementsIncludingDeleted(), this.state, this.files);\\r\\n }\\r\\n }\\r\\n static resetTapTwice() {\\r\\n didTapTwice = false;\\r\\n }\\r\\n addTextFromPaste(text) {\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, this.state);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x,\\r\\n y,\\r\\n strokeColor: this.state.currentItemStrokeColor,\\r\\n backgroundColor: this.state.currentItemBackgroundColor,\\r\\n fillStyle: this.state.currentItemFillStyle,\\r\\n strokeWidth: this.state.currentItemStrokeWidth,\\r\\n strokeStyle: this.state.currentItemStrokeStyle,\\r\\n roughness: this.state.currentItemRoughness,\\r\\n opacity: this.state.currentItemOpacity,\\r\\n strokeSharpness: this.state.currentItemStrokeSharpness,\\r\\n text,\\r\\n rawText: text,\\r\\n fontSize: this.state.currentItemFontSize,\\r\\n fontFamily: this.state.currentItemFontFamily,\\r\\n textAlign: this.state.currentItemTextAlign,\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted(), element]);\\r\\n this.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n });\\r\\n this.history.resumeRecording();\\r\\n } // Collaboration\\r\\n selectShapeTool(elementType) {\\r\\n if (!isHoldingSpace) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(this.canvas, elementType);\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isToolIcon)(document.activeElement)) {\\r\\n this.focusContainer();\\r\\n }\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElementType)(elementType)) {\\r\\n this.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n if (elementType === \\\"image\\\") {\\r\\n this.onImageAction();\\r\\n }\\r\\n if (elementType !== \\\"selection\\\") {\\r\\n this.setState({\\r\\n elementType,\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n else {\\r\\n this.setState({\\r\\n elementType\\r\\n });\\r\\n }\\r\\n }\\r\\n handleTextWysiwyg(element, _ref) {\\r\\n var _this5 = this;\\r\\n let { isExistingElement = false } = _ref;\\r\\n const updateElement = function (text, originalText, isDeleted, rawText) {\\r\\n _this5.scene.replaceAllElements([..._this5.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted,\\r\\n originalText,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText\\r\\n });\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n };\\r\\n if (isExistingElement && this.props.onBeforeTextEdit) {\\r\\n const text = this.props.onBeforeTextEdit(element);\\r\\n if (text) {\\r\\n this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map(function (_element) {\\r\\n if (_element.id === element.id && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_element)) {\\r\\n element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.updateTextElement)(_element, {\\r\\n text,\\r\\n isDeleted: false,\\r\\n originalText: text\\r\\n });\\r\\n return element;\\r\\n }\\r\\n return _element;\\r\\n })]);\\r\\n }\\r\\n }\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.textWysiwyg)({\\r\\n id: element.id,\\r\\n appState: this.state,\\r\\n canvas: this.canvas,\\r\\n getViewportCoords: function (x, y) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n }, _this5.state);\\r\\n return [viewportX - _this5.state.offsetLeft, viewportY - _this5.state.offsetTop];\\r\\n },\\r\\n onChange: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (text) {\\r\\n updateElement(text, text, false);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element);\\r\\n }\\r\\n }),\\r\\n onSubmit: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (_ref2) {\\r\\n let { text, viaKeyboard, originalText } = _ref2;\\r\\n const isDeleted = !text.trim();\\r\\n const rawText = originalText; //should this be originalText??\\r\\n if (_this5.props.onBeforeTextSubmit) {\\r\\n const [updatedText, updatedOriginalText] = _this5.props.onBeforeTextSubmit(element, text, originalText, isDeleted);\\r\\n text = updatedText !== null && updatedText !== void 0 ? updatedText : text;\\r\\n originalText = updatedOriginalText !== null && updatedOriginalText !== void 0 ? updatedOriginalText : originalText;\\r\\n }\\r\\n updateElement(text, originalText, isDeleted, rawText); // select the created text element only if submitting via keyboard\\r\\n // (when submitting via click it should act as signal to deselect)\\r\\n if (!isDeleted && viaKeyboard) {\\r\\n const elementIdToSelect = element.containerId ? element.containerId : element.id;\\r\\n _this5.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [elementIdToSelect]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (isDeleted) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDeletion)(_this5.scene.getElements(), [element]);\\r\\n }\\r\\n if (!isDeleted || isExistingElement) {\\r\\n _this5.history.resumeRecording();\\r\\n }\\r\\n _this5.setState({\\r\\n draggingElement: null,\\r\\n editingElement: null\\r\\n });\\r\\n if (_this5.state.elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this5.canvas, _this5.state.elementType);\\r\\n }\\r\\n _this5.focusContainer();\\r\\n }),\\r\\n element,\\r\\n excalidrawContainer: this.excalidrawContainerRef.current,\\r\\n app: this\\r\\n }); // deselect all other elements when inserting text\\r\\n this.deselectElements(); // do an initial update to re-initialize element position since we were\\r\\n // modifying element's x/y for sake of editor (case: syncing to remote)\\r\\n updateElement(element.text, element.originalText, false);\\r\\n }\\r\\n deselectElements() {\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n getTextElementAtPosition(x, y) {\\r\\n const element = this.getElementAtPosition(x, y, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n if (element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && !element.isDeleted) {\\r\\n return element;\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementAtPosition(x, y, opts) {\\r\\n const allHitElements = this.getElementsAtPosition(x, y, opts === null || opts === void 0 ? void 0 : opts.includeBoundTextElement);\\r\\n if (allHitElements.length > 1) {\\r\\n if (opts === null || opts === void 0 ? void 0 : opts.preferSelected) {\\r\\n for (let index = allHitElements.length - 1; index > -1; index--) {\\r\\n if (this.state.selectedElementIds[allHitElements[index].id]) {\\r\\n return allHitElements[index];\\r\\n }\\r\\n }\\r\\n }\\r\\n const elementWithHighestZIndex = allHitElements[allHitElements.length - 1]; // If we're hitting element with highest z-index only on its bounding box\\r\\n // while also hitting other element figure, the latter should be considered.\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(elementWithHighestZIndex, this.state, x, y) ? allHitElements[allHitElements.length - 2] : elementWithHighestZIndex;\\r\\n }\\r\\n if (allHitElements.length === 1) {\\r\\n return allHitElements[0];\\r\\n }\\r\\n return null;\\r\\n }\\r\\n getElementsAtPosition(x, y) {\\r\\n var _this6 = this;\\r\\n let includeBoundTextElement = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\\r\\n const elements = includeBoundTextElement ? this.scene.getElements() : this.scene.getElements().filter(function (element) {\\r\\n return !((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element) && element.containerId);\\r\\n });\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsAtPosition)(elements, function (element) {\\r\\n return (0,_element__WEBPACK_IMPORTED_MODULE_17__.hitTest)(element, _this6.state, x, y);\\r\\n });\\r\\n }\\r\\n maybeCleanupAfterMissingPointerUp(event) {\\r\\n if (lastPointerUp !== null) {\\r\\n // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\\r\\n // this can happen when a contextual menu or alert is triggered. In order to avoid\\r\\n // being in a weird state, we clean up on the next pointerdown\\r\\n lastPointerUp(event);\\r\\n }\\r\\n } // Returns whether the event is a panning\\r\\n updateGestureOnPointerDown(event) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n if (gesture.pointers.size === 2) {\\r\\n gesture.lastCenter = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n gesture.initialScale = this.state.zoom.value;\\r\\n gesture.initialDistance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n }\\r\\n }\\r\\n initialPointerDownState(event) {\\r\\n const origin = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, this.state);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(this.scene.getElements(), this.state);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return {\\r\\n origin,\\r\\n withCmdOrCtrl: event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD],\\r\\n originInGrid: (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(origin.x, origin.y, this.state.gridSize)),\\r\\n scrollbars: (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - this.state.offsetLeft, event.clientY - this.state.offsetTop),\\r\\n // we need to duplicate because we'll be updating this state\\r\\n lastCoords: _objectSpread({}, origin),\\r\\n originalElements: this.scene.getElements().reduce(function (acc, element) {\\r\\n acc.set(element.id, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.deepCopyElement)(element));\\r\\n return acc;\\r\\n }, new Map()),\\r\\n resize: {\\r\\n handleType: false,\\r\\n isResizing: false,\\r\\n offset: {\\r\\n x: 0,\\r\\n y: 0\\r\\n },\\r\\n arrowDirection: \\\"origin\\\",\\r\\n center: {\\r\\n x: (maxX + minX) / 2,\\r\\n y: (maxY + minY) / 2\\r\\n }\\r\\n },\\r\\n hit: {\\r\\n element: null,\\r\\n allHitElements: [],\\r\\n wasAddedToSelection: false,\\r\\n hasBeenDuplicated: false,\\r\\n hasHitCommonBoundingBoxOfSelectedElements: this.isHittingCommonBoundingBoxOfSelectedElements(origin, selectedElements),\\r\\n hasHitElementInside: false\\r\\n },\\r\\n drag: {\\r\\n hasOccurred: false,\\r\\n offset: null\\r\\n },\\r\\n eventListeners: {\\r\\n onMove: null,\\r\\n onUp: null,\\r\\n onKeyUp: null,\\r\\n onKeyDown: null\\r\\n },\\r\\n boxSelection: {\\r\\n hasOccurred: false\\r\\n }\\r\\n };\\r\\n } // Returns whether the event is a dragging a scrollbar\\r\\n handleDraggingScrollBar(event, pointerDownState) {\\r\\n var _this7 = this;\\r\\n if (!(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)) {\\r\\n return false;\\r\\n }\\r\\n isDraggingScrollBar = true;\\r\\n pointerDownState.lastCoords.x = event.clientX;\\r\\n pointerDownState.lastCoords.y = event.clientY;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n _this7.handlePointerMoveOverScrollbars(event, pointerDownState);\\r\\n });\\r\\n const onPointerUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isDraggingScrollBar = false;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this7.canvas, _this7.state.elementType);\\r\\n lastPointerUp = null;\\r\\n _this7.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this7.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n });\\r\\n lastPointerUp = onPointerUp;\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n return true;\\r\\n }\\r\\n isASelectedElement(hitElement) {\\r\\n return hitElement != null && this.state.selectedElementIds[hitElement.id];\\r\\n }\\r\\n isHittingCommonBoundingBoxOfSelectedElements(point, selectedElements) {\\r\\n if (selectedElements.length < 2) {\\r\\n return false;\\r\\n } // How many pixels off the shape boundary we still consider a hit\\r\\n const threshold = 10 / this.state.zoom.value;\\r\\n const [x1, y1, x2, y2] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements);\\r\\n return point.x > x1 - threshold && point.x < x2 + threshold && point.y > y1 - threshold && point.y < y2 + threshold;\\r\\n }\\r\\n onKeyDownFromPointerDownHandler(pointerDownState) {\\r\\n var _this8 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (_this8.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this8.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onKeyUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this9 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // Prevents focus from escaping excalidraw tab\\r\\n event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ALT && event.preventDefault();\\r\\n if (_this9.maybeHandleResize(pointerDownState, event)) {\\r\\n return;\\r\\n }\\r\\n _this9.maybeDragNewGenericElement(pointerDownState, event);\\r\\n });\\r\\n }\\r\\n onPointerMoveFromPointerDownHandler(pointerDownState) {\\r\\n var _this10 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a, _b;\\r\\n // We need to initialize dragOffsetXY only after we've updated\\r\\n // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\\r\\n // event handler should hopefully ensure we're already working with\\r\\n // the updated state.\\r\\n if (pointerDownState.drag.offset === null) {\\r\\n pointerDownState.drag.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getDragOffsetXY)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state), pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n }\\r\\n const target = event.target;\\r\\n if (!(target instanceof HTMLElement)) {\\r\\n return;\\r\\n }\\r\\n if (_this10.handlePointerMoveOverScrollbars(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this10.state);\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this10.state.gridSize); // for arrows/lines, don't start dragging until a given threshold\\r\\n // to ensure we don't create a 2-point arrow by mistake when\\r\\n // user clicks mouse in a way that it moves a tiny bit (thus\\r\\n // triggering pointermove)\\r\\n if (!pointerDownState.drag.hasOccurred && (_this10.state.elementType === \\\"arrow\\\" || _this10.state.elementType === \\\"line\\\")) {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerCoords.x, pointerCoords.y, pointerDownState.origin.x, pointerDownState.origin.y) < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n if (pointerDownState.resize.isResizing) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n if (_this10.maybeHandleResize(pointerDownState, event)) {\\r\\n return true;\\r\\n }\\r\\n }\\r\\n if (_this10.state.editingLinearElement) {\\r\\n const didDrag = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointDragging(_this10.state, function (appState) {\\r\\n return _this10.setState(appState);\\r\\n }, pointerCoords.x, pointerCoords.y, function (element, pointsSceneCoords) {\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(element, pointsSceneCoords);\\r\\n });\\r\\n if (didDrag) {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this10.isASelectedElement(element);\\r\\n });\\r\\n if ((hasHitASelectedElement || pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) && ( // this allows for box-selecting points when clicking inside the\\r\\n // line's bounding box\\r\\n !_this10.state.editingLinearElement || !event.shiftKey) && ( // box-selecting without shift when editing line, not clicking on a line\\r\\n !_this10.state.editingLinearElement || ((_a = _this10.state.editingLinearElement) === null || _a === void 0 ? void 0 : _a.elementId) !== ((_b = pointerDownState.hit.element) === null || _b === void 0 ? void 0 : _b.id) || pointerDownState.hit.hasHitElementInside)) {\\r\\n // Marking that click was used for dragging to check\\r\\n // if elements should be deselected on pointerup\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this10.scene.getElements(), _this10.state); // prevent dragging even if we're no longer holding cmd/ctrl otherwise\\r\\n // it would have weird results (stuff jumping all over the screen)\\r\\n if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\\r\\n const [dragX, dragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.drag.offset.x, pointerCoords.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n const [dragDistanceX, dragDistanceY] = [Math.abs(pointerCoords.x - pointerDownState.origin.x), Math.abs(pointerCoords.y - pointerDownState.origin.y)]; // We only drag in one direction if shift is pressed\\r\\n const lockDirection = event.shiftKey;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragSelectedElements)(pointerDownState, selectedElements, dragX, dragY, lockDirection, dragDistanceX, dragDistanceY, _this10.state);\\r\\n _this10.maybeSuggestBindingForAll(selectedElements); // We duplicate the selected element if alt is pressed on pointer move\\r\\n if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\\r\\n // Move the currently selected elements to the top of the z index stack, and\\r\\n // put the duplicates where the selected elements used to be.\\r\\n // (the origin point where the dragging started)\\r\\n pointerDownState.hit.hasBeenDuplicated = true;\\r\\n const nextElements = [];\\r\\n const elementsToAppend = [];\\r\\n const groupIdMap = new Map();\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const elements = _this10.scene.getElementsIncludingDeleted();\\r\\n const selectedElementIds = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this10.state, true).map(function (element) {\\r\\n return element.id;\\r\\n });\\r\\n for (const element of elements) {\\r\\n if (selectedElementIds.includes(element.id) || // case: the state.selectedElementIds might not have been\\r\\n // updated yet by the time this mousemove event is fired\\r\\n element.id === (hitElement === null || hitElement === void 0 ? void 0 : hitElement.id) && pointerDownState.hit.wasAddedToSelection) {\\r\\n const duplicatedElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this10.state.editingGroupId, groupIdMap, element);\\r\\n const [originDragX, originDragY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x - pointerDownState.drag.offset.x, pointerDownState.origin.y - pointerDownState.drag.offset.y, _this10.state.gridSize);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(duplicatedElement, {\\r\\n x: duplicatedElement.x + (originDragX - dragX),\\r\\n y: duplicatedElement.y + (originDragY - dragY)\\r\\n });\\r\\n nextElements.push(duplicatedElement);\\r\\n elementsToAppend.push(element);\\r\\n oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\\r\\n }\\r\\n else {\\r\\n nextElements.push(element);\\r\\n }\\r\\n }\\r\\n const nextSceneElements = [...nextElements, ...elementsToAppend];\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(nextElements, elementsToAppend, oldIdToDuplicatedId);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextSceneElements, elementsToAppend, oldIdToDuplicatedId, \\\"duplicatesServeAsOld\\\");\\r\\n _this10.scene.replaceAllElements(nextSceneElements);\\r\\n }\\r\\n return;\\r\\n }\\r\\n } // It is very important to read this.state within each move event,\\r\\n // otherwise we would read a stale one!\\r\\n const draggingElement = _this10.state.draggingElement;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"freedraw\\\") {\\r\\n const points = draggingElement.points;\\r\\n const dx = pointerCoords.x - draggingElement.x;\\r\\n const dy = pointerCoords.y - draggingElement.y;\\r\\n const pressures = draggingElement.simulatePressure ? draggingElement.pressures : [...draggingElement.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures\\r\\n });\\r\\n }\\r\\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n pointerDownState.drag.hasOccurred = true;\\r\\n const points = draggingElement.points;\\r\\n let dx = gridX - draggingElement.x;\\r\\n let dy = gridY - draggingElement.y;\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event) && points.length === 2) {\\r\\n ({\\r\\n width: dx,\\r\\n height: dy\\r\\n } = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getPerfectElementSize)(_this10.state.elementType, dx, dy));\\r\\n }\\r\\n if (points.length === 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]]\\r\\n });\\r\\n }\\r\\n else if (points.length > 1) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points.slice(0, -1), [dx, dy]]\\r\\n });\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n // When creating a linear element by dragging\\r\\n _this10.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [pointerCoords], _this10.state.startBoundElement);\\r\\n }\\r\\n }\\r\\n else {\\r\\n pointerDownState.lastCoords.x = pointerCoords.x;\\r\\n pointerDownState.lastCoords.y = pointerCoords.y;\\r\\n _this10.maybeDragNewGenericElement(pointerDownState, event);\\r\\n }\\r\\n if (_this10.state.elementType === \\\"selection\\\") {\\r\\n pointerDownState.boxSelection.hasOccurred = true;\\r\\n const elements = _this10.scene.getElements();\\r\\n if (!event.shiftKey && // allows for box-selecting points (without shift)\\r\\n !_this10.state.editingLinearElement && (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(elements, _this10.state)) {\\r\\n if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [pointerDownState.hit.element.id]: true\\r\\n }\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this10.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n } // box-select line editor points\\r\\n if (_this10.state.editingLinearElement) {\\r\\n _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handleBoxSelection(event, _this10.state, _this10.setState.bind(_this10)); // regular box-select\\r\\n }\\r\\n else {\\r\\n const elementsWithinSelection = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementsWithinSelection)(elements, draggingElement);\\r\\n _this10.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread(_objectSpread({}, prevState.selectedElementIds), elementsWithinSelection.reduce(function (map, element) {\\r\\n map[element.id] = true;\\r\\n return map;\\r\\n }, {})), pointerDownState.hit.element ? {\\r\\n // if using ctrl/cmd, select the hitElement only if we\\r\\n // haven't box-selected anything else\\r\\n [pointerDownState.hit.element.id]: !elementsWithinSelection.length\\r\\n } : null)\\r\\n }), _this10.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n } // Returns whether the pointer move happened over either scrollbar\\r\\n handlePointerMoveOverScrollbars(event, pointerDownState) {\\r\\n if (pointerDownState.scrollbars.isOverHorizontal) {\\r\\n const x = event.clientX;\\r\\n const dx = x - pointerDownState.lastCoords.x;\\r\\n this.setState({\\r\\n scrollX: this.state.scrollX - dx / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.x = x;\\r\\n return true;\\r\\n }\\r\\n if (pointerDownState.scrollbars.isOverVertical) {\\r\\n const y = event.clientY;\\r\\n const dy = y - pointerDownState.lastCoords.y;\\r\\n this.setState({\\r\\n scrollY: this.state.scrollY - dy / this.state.zoom.value\\r\\n });\\r\\n pointerDownState.lastCoords.y = y;\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n }\\r\\n onPointerUpFromPointerDownHandler(pointerDownState) {\\r\\n var _this11 = this;\\r\\n return (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (childEvent) {\\r\\n var _a, _b;\\r\\n const { draggingElement, resizingElement, multiElement, elementType, elementLocked, isResizing, isRotating } = _this11.state;\\r\\n _this11.setState({\\r\\n isResizing: false,\\r\\n isRotating: false,\\r\\n resizingElement: null,\\r\\n selectionElement: null,\\r\\n cursorButton: \\\"up\\\",\\r\\n // text elements are reset on finalize, and resetting on pointerup\\r\\n // may cause issues with double taps\\r\\n editingElement: multiElement || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this11.state.editingElement) ? _this11.state.editingElement : null\\r\\n });\\r\\n _this11.savePointer(childEvent.clientX, childEvent.clientY, \\\"up\\\"); // Handle end of dragging a point of a linear element, might close a loop\\r\\n // and sets binding element\\r\\n if (_this11.state.editingLinearElement) {\\r\\n if (!pointerDownState.boxSelection.hasOccurred && (((_b = (_a = pointerDownState.hit) === null || _a === void 0 ? void 0 : _a.element) === null || _b === void 0 ? void 0 : _b.id) !== _this11.state.editingLinearElement.elementId || !pointerDownState.hit.hasHitElementInside)) {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n else {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerUp(childEvent, _this11.state.editingLinearElement, _this11.state);\\r\\n if (editingLinearElement !== _this11.state.editingLinearElement) {\\r\\n _this11.setState({\\r\\n editingLinearElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n lastPointerUp = null;\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, pointerDownState.eventListeners.onMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, pointerDownState.eventListeners.onUp);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, pointerDownState.eventListeners.onKeyDown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, pointerDownState.eventListeners.onKeyUp);\\r\\n if (_this11.state.pendingImageElement) {\\r\\n _this11.setState({\\r\\n pendingImageElement: null\\r\\n });\\r\\n }\\r\\n if ((draggingElement === null || draggingElement === void 0 ? void 0 : draggingElement.type) === \\\"freedraw\\\") {\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n const points = draggingElement.points;\\r\\n let dx = pointerCoords.x - draggingElement.x;\\r\\n let dy = pointerCoords.y - draggingElement.y; // Allows dots to avoid being flagged as infinitely small\\r\\n if (dx === points[0][0] && dy === points[0][1]) {\\r\\n dy += 0.0001;\\r\\n dx += 0.0001;\\r\\n }\\r\\n const pressures = draggingElement.simulatePressure ? [] : [...draggingElement.pressures, childEvent.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...points, [dx, dy]],\\r\\n pressures,\\r\\n lastCommittedPoint: [dx, dy]\\r\\n });\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement)) {\\r\\n const imageElement = draggingElement;\\r\\n try {\\r\\n _this11.initializeImageDimensions(imageElement);\\r\\n _this11.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== imageElement.id;\\r\\n }));\\r\\n _this11.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n }\\r\\n return;\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(draggingElement)) {\\r\\n if (draggingElement.points.length > 1) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n const pointerCoords = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(childEvent, _this11.state);\\r\\n if (!pointerDownState.drag.hasOccurred && draggingElement && !multiElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, {\\r\\n points: [...draggingElement.points, [pointerCoords.x - draggingElement.x, pointerCoords.y - draggingElement.y]]\\r\\n });\\r\\n _this11.setState({\\r\\n multiElement: draggingElement,\\r\\n editingElement: _this11.state.draggingElement\\r\\n });\\r\\n }\\r\\n else if (pointerDownState.drag.hasOccurred && !multiElement) {\\r\\n if ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.maybeBindLinearElement)(draggingElement, _this11.state, _this11.scene, pointerCoords);\\r\\n }\\r\\n _this11.setState({\\r\\n suggestedBindings: [],\\r\\n startBoundElement: null\\r\\n });\\r\\n if (!elementLocked) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n elementType: \\\"selection\\\",\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n draggingElement: null,\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [_this11.state.draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" && draggingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(draggingElement)) {\\r\\n // remove invisible element which was added in onPointerDown\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().slice(0, -1));\\r\\n _this11.setState({\\r\\n draggingElement: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (draggingElement) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(draggingElement, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getNormalizedDimensions)(draggingElement));\\r\\n }\\r\\n if (resizingElement) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (resizingElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isInvisiblySmallElement)(resizingElement)) {\\r\\n _this11.scene.replaceAllElements(_this11.scene.getElementsIncludingDeleted().filter(function (el) {\\r\\n return el.id !== resizingElement.id;\\r\\n }));\\r\\n } // Code below handles selection when element(s) weren't\\r\\n // drag or added to selection on pointer down phase.\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n if (hitElement && !pointerDownState.drag.hasOccurred && !pointerDownState.hit.wasAddedToSelection && ( // if we're editing a line, pointerup shouldn't switch selection if\\r\\n // box selected\\r\\n !_this11.state.editingLinearElement || !pointerDownState.boxSelection.hasOccurred)) {\\r\\n // when inside line editor, shift selects points instead\\r\\n if (childEvent.shiftKey && !_this11.state.editingLinearElement) {\\r\\n if (_this11.state.selectedElementIds[hitElement.id]) {\\r\\n if ((0,_groups__WEBPACK_IMPORTED_MODULE_24__.isSelectedViaGroup)(_this11.state, hitElement)) {\\r\\n // We want to unselect all groups hitElement is part of\\r\\n // as well as all elements that are part of the groups\\r\\n // hitElement is part of\\r\\n const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds.flatMap(function (groupId) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getElementsInGroup)(_this11.scene.getElements(), groupId);\\r\\n }).map(function (element) {\\r\\n return {\\r\\n [element.id]: false\\r\\n };\\r\\n }).reduce(function (prevId, acc) {\\r\\n return _objectSpread(_objectSpread({}, prevId), acc);\\r\\n }, {});\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedGroupIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), hitElement.groupIds.map(function (gId) {\\r\\n return {\\r\\n [gId]: false\\r\\n };\\r\\n }).reduce(function (prev, acc) {\\r\\n return _objectSpread(_objectSpread({}, prev), acc);\\r\\n }, {})),\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), idsOfSelectedElementsThatAreInGroups)\\r\\n };\\r\\n });\\r\\n }\\r\\n else {\\r\\n // remove element from selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: false\\r\\n })\\r\\n }), _this11.scene.getElements());\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n // add element to selection while\\r\\n // keeping prev elements selected\\r\\n _this11.setState(function (_prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, _prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this11.setState(function (prevState) {\\r\\n return _objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n }\\r\\n }), _this11.scene.getElements()));\\r\\n });\\r\\n }\\r\\n }\\r\\n if (!_this11.state.editingLinearElement && !pointerDownState.drag.hasOccurred && !_this11.state.isResizing && (hitElement && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isHittingElementBoundingBoxWithoutHittingElement)(hitElement, _this11.state, pointerDownState.origin.x, pointerDownState.origin.y) || !hitElement && pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements)) {\\r\\n // Deselect selected elements\\r\\n _this11.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\" && draggingElement) {\\r\\n _this11.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [draggingElement.id]: true\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n if (elementType !== \\\"selection\\\" || (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isSomeElementSelected)(_this11.scene.getElements(), _this11.state)) {\\r\\n _this11.history.resumeRecording();\\r\\n }\\r\\n if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\\r\\n ((0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this11.state) ? _element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements : _element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this11.scene.getElements(), _this11.state));\\r\\n }\\r\\n if (!elementLocked && elementType !== \\\"freedraw\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this11.canvas);\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: [],\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this11.setState({\\r\\n draggingElement: null,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n }\\r\\n maybeSuggestBindingForAll(selectedElements) {\\r\\n const suggestedBindings = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getEligibleElementsForBinding)(selectedElements);\\r\\n this.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n }\\r\\n clearSelection(hitElement) {\\r\\n this.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n // Continue editing the same group if the user selected a different\\r\\n // element from it\\r\\n editingGroupId: prevState.editingGroupId && hitElement != null && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, prevState.editingGroupId) ? prevState.editingGroupId : null\\r\\n };\\r\\n });\\r\\n this.setState({\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: this.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n getTextWysiwygSnappedToCenterPosition(x, y, appState, canvas, scale) {\\r\\n const elementClickedInside = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(this.scene.getElementsIncludingDeleted().filter(function (element) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element);\\r\\n }), x, y);\\r\\n if (elementClickedInside) {\\r\\n const elementCenterX = elementClickedInside.x + elementClickedInside.width / 2;\\r\\n const elementCenterY = elementClickedInside.y + elementClickedInside.height / 2;\\r\\n const distanceToCenter = Math.hypot(x - elementCenterX, y - elementCenterY);\\r\\n const isSnappedToCenter = distanceToCenter < _constants__WEBPACK_IMPORTED_MODULE_12__.TEXT_TO_CENTER_SNAP_THRESHOLD;\\r\\n if (isSnappedToCenter) {\\r\\n const { x: viewportX, y: viewportY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.sceneCoordsToViewportCoords)({\\r\\n sceneX: elementCenterX,\\r\\n sceneY: elementCenterY\\r\\n }, appState);\\r\\n return {\\r\\n viewportX,\\r\\n viewportY,\\r\\n elementCenterX,\\r\\n elementCenterY\\r\\n };\\r\\n }\\r\\n }\\r\\n }\\r\\n getCanvasOffsets() {\\r\\n var _a;\\r\\n if ((_a = this.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = this.excalidrawContainerRef.current;\\r\\n const { left, top } = excalidrawContainer.getBoundingClientRect();\\r\\n return {\\r\\n offsetLeft: left,\\r\\n offsetTop: top\\r\\n };\\r\\n }\\r\\n return {\\r\\n offsetLeft: 0,\\r\\n offsetTop: 0\\r\\n };\\r\\n }\\r\\n updateLanguage() {\\r\\n var _this12 = this;\\r\\n return (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n const currentLang = _i18n__WEBPACK_IMPORTED_MODULE_26__.languages.find(function (lang) {\\r\\n return lang.code === _this12.props.langCode;\\r\\n }) || _i18n__WEBPACK_IMPORTED_MODULE_26__.defaultLang;\\r\\n yield (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.setLanguage)(currentLang);\\r\\n _this12.setAppState({});\\r\\n })();\\r\\n }\\r\\n} // -----------------------------------------------------------------------------\\r\\n// TEST HOOKS\\r\\n// -----------------------------------------------------------------------------\\r\\nApp.defaultProps = {\\r\\n // needed for tests to pass since we directly render App in many tests\\r\\n UIOptions: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_UI_OPTIONS\\r\\n};\\r\\nvar _initialiseProps = function () {\\r\\n var _this13 = this;\\r\\n this.canvas = null;\\r\\n this.rc = null;\\r\\n this.unmounted = false;\\r\\n this.isMobile = false;\\r\\n this.excalidrawContainerRef = /*#__PURE__*/ react__WEBPACK_IMPORTED_MODULE_2___default().createRef();\\r\\n this.files = {};\\r\\n this.imageCache = new Map();\\r\\n this.focusContainer = function () {\\r\\n var _a;\\r\\n if (_this13.props.autoFocus) {\\r\\n (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.focus();\\r\\n }\\r\\n };\\r\\n this.getSceneElementsIncludingDeleted = function () {\\r\\n return _this13.scene.getElementsIncludingDeleted();\\r\\n };\\r\\n this.getSceneElements = function () {\\r\\n return _this13.scene.getElements();\\r\\n };\\r\\n this.syncActionResult = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (actionResult) {\\r\\n var _a, _b, _c, _d, _e, _f;\\r\\n if (_this13.unmounted || actionResult === false) {\\r\\n return;\\r\\n }\\r\\n let editingElement = null;\\r\\n if (actionResult.elements) {\\r\\n actionResult.elements.forEach(function (element) {\\r\\n var _a;\\r\\n if (((_a = _this13.state.editingElement) === null || _a === void 0 ? void 0 : _a.id) === element.id && _this13.state.editingElement !== element && (0,_element__WEBPACK_IMPORTED_MODULE_17__.isNonDeletedElement)(element)) {\\r\\n editingElement = element;\\r\\n }\\r\\n });\\r\\n _this13.scene.replaceAllElements(actionResult.elements);\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n }\\r\\n if (actionResult.files) {\\r\\n _this13.files = actionResult.replaceFiles ? actionResult.files : _objectSpread(_objectSpread({}, _this13.files), actionResult.files);\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n if (actionResult.appState || editingElement) {\\r\\n if (actionResult.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n let viewModeEnabled = ((_a = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _a === void 0 ? void 0 : _a.viewModeEnabled) || false;\\r\\n let zenModeEnabled = ((_b = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _b === void 0 ? void 0 : _b.zenModeEnabled) || false;\\r\\n let gridSize = ((_c = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _c === void 0 ? void 0 : _c.gridSize) || null;\\r\\n let theme = ((_d = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _d === void 0 ? void 0 : _d.theme) || _constants__WEBPACK_IMPORTED_MODULE_12__.THEME.LIGHT;\\r\\n let name = (_f = (_e = actionResult === null || actionResult === void 0 ? void 0 : actionResult.appState) === null || _e === void 0 ? void 0 : _e.name) !== null && _f !== void 0 ? _f : _this13.state.name;\\r\\n if (typeof _this13.props.viewModeEnabled !== \\\"undefined\\\") {\\r\\n viewModeEnabled = _this13.props.viewModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.zenModeEnabled !== \\\"undefined\\\") {\\r\\n zenModeEnabled = _this13.props.zenModeEnabled;\\r\\n }\\r\\n if (typeof _this13.props.gridModeEnabled !== \\\"undefined\\\") {\\r\\n gridSize = _this13.props.gridModeEnabled ? _constants__WEBPACK_IMPORTED_MODULE_12__.GRID_SIZE : null;\\r\\n }\\r\\n if (typeof _this13.props.theme !== \\\"undefined\\\") {\\r\\n theme = _this13.props.theme;\\r\\n }\\r\\n if (typeof _this13.props.name !== \\\"undefined\\\") {\\r\\n name = _this13.props.name;\\r\\n }\\r\\n _this13.setState(function (state) {\\r\\n var _a;\\r\\n // using Object.assign instead of spread to fool TS 4.2.2+ into\\r\\n // regarding the resulting type as not containing undefined\\r\\n // (which the following expression will never contain)\\r\\n return Object.assign(actionResult.appState || {}, {\\r\\n editingElement: editingElement || ((_a = actionResult.appState) === null || _a === void 0 ? void 0 : _a.editingElement) || null,\\r\\n viewModeEnabled,\\r\\n zenModeEnabled,\\r\\n gridSize,\\r\\n theme,\\r\\n name\\r\\n });\\r\\n }, function () {\\r\\n if (actionResult.syncHistory) {\\r\\n _this13.history.setCurrentState(_this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n }\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onBlur = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n isHoldingSpace = false;\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n });\\r\\n this.onUnload = function () {\\r\\n _this13.onBlur();\\r\\n };\\r\\n this.disableEvent = function (event) {\\r\\n event.preventDefault();\\r\\n };\\r\\n this.onFontLoaded = function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(element)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n });\\r\\n _this13.onSceneUpdated();\\r\\n };\\r\\n this.importLibraryFromUrl = /*#__PURE__*/ function () {\\r\\n var _ref3 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (url, token) {\\r\\n if (window.location.hash.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary)) {\\r\\n const hash = new URLSearchParams(window.location.hash.slice(1));\\r\\n hash.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `#${hash.toString()}`);\\r\\n }\\r\\n else if (window.location.search.includes(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary)) {\\r\\n const query = new URLSearchParams(window.location.search);\\r\\n query.delete(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n window.history.replaceState({}, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, `?${query.toString()}`);\\r\\n }\\r\\n try {\\r\\n const request = yield fetch(decodeURIComponent(url));\\r\\n const blob = yield request.blob();\\r\\n const json = JSON.parse(yield blob.text());\\r\\n if (!(0,_data_json__WEBPACK_IMPORTED_MODULE_14__.isValidLibrary)(json)) {\\r\\n throw new Error();\\r\\n }\\r\\n if (token === _this13.id || window.confirm((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.confirmAddLibrary\\\", {\\r\\n numShapes: (json.libraryItems || json.library || []).length\\r\\n }))) {\\r\\n yield _this13.library.importLibrary(blob, \\\"published\\\"); // hack to rerender the library items after import\\r\\n if (_this13.state.isLibraryOpen) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n }\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n window.alert((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"alerts.errorLoadingLibrary\\\"));\\r\\n console.error(error);\\r\\n }\\r\\n finally {\\r\\n _this13.focusContainer();\\r\\n }\\r\\n });\\r\\n return function (_x, _x2) {\\r\\n return _ref3.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.resetHistory = function () {\\r\\n _this13.history.clear();\\r\\n };\\r\\n this.resetScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (opts) {\\r\\n _this13.scene.replaceAllElements([]);\\r\\n _this13.setState(function (state) {\\r\\n return _objectSpread(_objectSpread({}, (0,_appState__WEBPACK_IMPORTED_MODULE_10__.getDefaultAppState)()), {}, {\\r\\n isLoading: (opts === null || opts === void 0 ? void 0 : opts.resetLoadingState) ? false : state.isLoading,\\r\\n theme: _this13.state.theme\\r\\n });\\r\\n });\\r\\n _this13.resetHistory();\\r\\n });\\r\\n this.initializeScene = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n if (\\\"launchQueue\\\" in window && \\\"LaunchParams\\\" in window) {\\r\\n window.launchQueue.setConsumer(/*#__PURE__*/ function () {\\r\\n var _ref5 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (launchParams) {\\r\\n if (!launchParams.files.length) {\\r\\n return;\\r\\n }\\r\\n const fileHandle = launchParams.files[0];\\r\\n const blob = yield fileHandle.getFile();\\r\\n blob.handle = fileHandle;\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(blob, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n });\\r\\n return function (_x3) {\\r\\n return _ref5.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n }\\r\\n if (!_this13.state.isLoading) {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n }\\r\\n let initialData = null;\\r\\n try {\\r\\n initialData = (yield _this13.props.initialData) || null;\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.libraryItems) {\\r\\n _this13.libraryItemsFromStorage = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(initialData.libraryItems, \\\"unpublished\\\");\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n initialData = {\\r\\n appState: {\\r\\n errorMessage: error.message || \\\"Encountered an error during importing or restoring scene data\\\"\\r\\n }\\r\\n };\\r\\n }\\r\\n const scene = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restore)(initialData, null, null);\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n elementType: scene.appState.elementType === \\\"image\\\" ? \\\"selection\\\" : scene.appState.elementType,\\r\\n isLoading: false\\r\\n });\\r\\n if (initialData === null || initialData === void 0 ? void 0 : initialData.scrollToContent) {\\r\\n scene.appState = _objectSpread(_objectSpread({}, scene.appState), (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(scene.elements, _objectSpread(_objectSpread({}, scene.appState), {}, {\\r\\n width: _this13.state.width,\\r\\n height: _this13.state.height,\\r\\n offsetTop: _this13.state.offsetTop,\\r\\n offsetLeft: _this13.state.offsetLeft\\r\\n }), null));\\r\\n }\\r\\n _this13.resetHistory();\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n commitToHistory: true\\r\\n }));\\r\\n const libraryUrl = // current\\r\\n new URLSearchParams(window.location.hash.slice(1)).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_HASH_KEYS.addLibrary) || // legacy, kept for compat reasons\\r\\n new URLSearchParams(window.location.search).get(_constants__WEBPACK_IMPORTED_MODULE_12__.URL_QUERY_KEYS.addLibrary);\\r\\n if (libraryUrl) {\\r\\n yield _this13.importLibraryFromUrl(libraryUrl);\\r\\n }\\r\\n });\\r\\n this.onResize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function () {\\r\\n _this13.scene.getElementsIncludingDeleted().forEach(function (element) {\\r\\n return (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n });\\r\\n _this13.setState({});\\r\\n });\\r\\n this.onScroll = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n const { offsetTop, offsetLeft } = _this13.getCanvasOffsets();\\r\\n _this13.setState(function (state) {\\r\\n if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\\r\\n return null;\\r\\n }\\r\\n return {\\r\\n offsetTop,\\r\\n offsetLeft\\r\\n };\\r\\n });\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.SCROLL_TIMEOUT);\\r\\n this.onCut = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.cutAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.onCopy = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n var _a;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);\\r\\n if (!isExcalidrawActive || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target)) {\\r\\n return;\\r\\n }\\r\\n _this13.copyAll();\\r\\n event.preventDefault();\\r\\n });\\r\\n this.cutAll = function () {\\r\\n _this13.copyAll();\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected);\\r\\n };\\r\\n this.copyAll = function () {\\r\\n (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.copyToClipboard)(_this13.scene.getElements(), _this13.state, _this13.files);\\r\\n };\\r\\n this.onTapStart = function (event) {\\r\\n if (!didTapTwice) {\\r\\n didTapTwice = true;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n tappedTwiceTimer = window.setTimeout(App.resetTapTwice, _constants__WEBPACK_IMPORTED_MODULE_12__.TAP_TWICE_TIMEOUT);\\r\\n return;\\r\\n } // insert text only if we tapped twice with a single finger\\r\\n // event.touches.length === 1 will also prevent inserting text when user's zooming\\r\\n if (didTapTwice && event.touches.length === 1) {\\r\\n const [touch] = event.touches; // @ts-ignore\\r\\n _this13.handleCanvasDoubleClick({\\r\\n clientX: touch.clientX,\\r\\n clientY: touch.clientY\\r\\n });\\r\\n didTapTwice = false;\\r\\n clearTimeout(tappedTwiceTimer);\\r\\n }\\r\\n event.preventDefault();\\r\\n if (event.touches.length === 2) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n }\\r\\n };\\r\\n this.onTapEnd = function (event) {\\r\\n if (event.touches.length > 0) {\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n }\\r\\n };\\r\\n this.pasteFromClipboard = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(/*#__PURE__*/ function () {\\r\\n var _ref6 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n // #686\\r\\n const target = document.activeElement;\\r\\n const isExcalidrawActive = (_a = _this13.excalidrawContainerRef.current) === null || _a === void 0 ? void 0 : _a.contains(target);\\r\\n if (!isExcalidrawActive) {\\r\\n return;\\r\\n }\\r\\n const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\\r\\n if ( // if no ClipboardEvent supplied, assume we're pasting via contextMenu\\r\\n // thus these checks don't make sense\\r\\n event && (!(elementUnderCursor instanceof HTMLCanvasElement) || (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(target))) {\\r\\n return;\\r\\n } // must be called in the same frame (thus before any awaits) as the paste\\r\\n // event else some browsers (FF...) will clear the clipboardData\\r\\n // (something something security)\\r\\n let file = (_b = event === null || event === void 0 ? void 0 : event.clipboardData) === null || _b === void 0 ? void 0 : _b.files[0];\\r\\n const data = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_11__.parseClipboard)(event);\\r\\n if (!file && data.text) {\\r\\n const string = data.text.trim();\\r\\n if (string.startsWith(\\\"<svg\\\") && string.endsWith(\\\"</svg>\\\")) {\\r\\n // ignore SVG validation/normalization which will be done during image\\r\\n // initialization\\r\\n file = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(string);\\r\\n }\\r\\n } // prefer spreadsheet data over image file (MS Office/Libre Office)\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file) && !data.spreadsheet) {\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: cursorX,\\r\\n clientY: cursorY\\r\\n }, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n if (_this13.props.onPaste) {\\r\\n try {\\r\\n if ((yield _this13.props.onPaste(data, event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n }\\r\\n }\\r\\n if (data.errorMessage) {\\r\\n _this13.setState({\\r\\n errorMessage: data.errorMessage\\r\\n });\\r\\n }\\r\\n else if (data.spreadsheet) {\\r\\n _this13.setState({\\r\\n pasteDialog: {\\r\\n data: data.spreadsheet,\\r\\n shown: true\\r\\n }\\r\\n });\\r\\n }\\r\\n else if (data.elements) {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: data.elements,\\r\\n files: data.files || null,\\r\\n position: \\\"cursor\\\"\\r\\n });\\r\\n }\\r\\n else if (data.text) {\\r\\n _this13.addTextFromPaste(data.text);\\r\\n }\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n event === null || event === void 0 ? void 0 : event.preventDefault();\\r\\n });\\r\\n return function (_x4) {\\r\\n return _ref6.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n this.addElementsFromPasteOrLibrary = function (opts) {\\r\\n const elements = (0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreElements)(opts.elements, null);\\r\\n const [minX, minY, maxX, maxY] = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(elements);\\r\\n const elementsCenterX = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minX, maxX) / 2;\\r\\n const elementsCenterY = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(minY, maxY) / 2;\\r\\n const clientX = typeof opts.position === \\\"object\\\" ? opts.position.clientX : opts.position === \\\"cursor\\\" ? cursorX : _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = typeof opts.position === \\\"object\\\" ? opts.position.clientY : opts.position === \\\"cursor\\\" ? cursorY : _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const dx = x - elementsCenterX;\\r\\n const dy = y - elementsCenterY;\\r\\n const groupIdMap = new Map();\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(dx, dy, _this13.state.gridSize);\\r\\n const oldIdToDuplicatedId = new Map();\\r\\n const newElements = elements.map(function (element) {\\r\\n const newElement = (0,_element__WEBPACK_IMPORTED_MODULE_17__.duplicateElement)(_this13.state.editingGroupId, groupIdMap, element, {\\r\\n x: element.x + gridX - minX,\\r\\n y: element.y + gridY - minY\\r\\n });\\r\\n oldIdToDuplicatedId.set(element.id, newElement.id);\\r\\n return newElement;\\r\\n });\\r\\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.bindTextToShapeAfterDuplication)(newElements, elements, oldIdToDuplicatedId);\\r\\n const nextElements = [..._this13.scene.getElementsIncludingDeleted(), ...newElements];\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.fixBindingsAfterDuplication)(nextElements, elements, oldIdToDuplicatedId);\\r\\n if (opts.files) {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), opts.files);\\r\\n }\\r\\n _this13.scene.replaceAllElements(nextElements);\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState((0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, _this13.state), {}, {\\r\\n isLibraryOpen: false,\\r\\n selectedElementIds: newElements.reduce(function (map, element) {\\r\\n if (!(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBoundToContainer)(element)) {\\r\\n map[element.id] = true;\\r\\n }\\r\\n return map;\\r\\n }, {}),\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements()), function () {\\r\\n if (opts.files) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }\\r\\n });\\r\\n _this13.selectShapeTool(\\\"selection\\\");\\r\\n };\\r\\n this.setAppState = function (obj) {\\r\\n _this13.setState(obj);\\r\\n };\\r\\n this.removePointer = function (event) {\\r\\n // remove touch handler for context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\" && touchTimeout) {\\r\\n clearTimeout(touchTimeout);\\r\\n touchTimeout = 0;\\r\\n invalidateContextMenu = false;\\r\\n }\\r\\n gesture.pointers.delete(event.pointerId);\\r\\n };\\r\\n this.toggleLock = function () {\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n elementLocked: !prevState.elementLocked,\\r\\n elementType: prevState.elementLocked ? \\\"selection\\\" : prevState.elementType\\r\\n };\\r\\n });\\r\\n };\\r\\n this.toggleZenMode = function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode);\\r\\n };\\r\\n this.toggleStats = function () {\\r\\n if (!_this13.state.showStats) {\\r\\n (0,_analytics__WEBPACK_IMPORTED_MODULE_9__.trackEvent)(\\\"dialog\\\", \\\"stats\\\");\\r\\n }\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats);\\r\\n };\\r\\n this.scrollToContent = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n _this13.setState(_objectSpread({}, (0,_scene__WEBPACK_IMPORTED_MODULE_31__.calculateScrollCenter)(Array.isArray(target) ? target : [target], _this13.state, _this13.canvas)));\\r\\n };\\r\\n this.zoomToFit = function () {\\r\\n let target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _this13.scene.getElements();\\r\\n let maxZoom = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\\r\\n let margin = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0.03;\\r\\n if (!target) {\\r\\n target = _this13.scene.getElements();\\r\\n }\\r\\n if (target.length === 0) {\\r\\n maxZoom = 1;\\r\\n }\\r\\n _this13.setState((0,_actions__WEBPACK_IMPORTED_MODULE_5__.zoomToFitElements)(target, _this13.state, false, maxZoom, margin).appState);\\r\\n };\\r\\n this.updateContainerSize = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (containers) {\\r\\n containers.forEach(function (el) {\\r\\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.rotate)(el.x + el.width, el.y + el.height, el.x + el.width / 2, el.y + el.height / 2, el.angle);\\r\\n (0,_element_resizeElements__WEBPACK_IMPORTED_MODULE_47__.resizeSingleElement)(el, true, el, \\\"se\\\", true, x, y);\\r\\n });\\r\\n });\\r\\n this.clearToast = function () {\\r\\n _this13.setState({\\r\\n toastMessage: null\\r\\n });\\r\\n };\\r\\n this.setToastMessage = function (toastMessage) {\\r\\n _this13.setState({\\r\\n toastMessage\\r\\n });\\r\\n };\\r\\n this.restoreFileFromShare = /*#__PURE__*/ (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n try {\\r\\n const webShareTargetCache = yield caches.open(\\\"web-share-target\\\");\\r\\n const file = yield webShareTargetCache.match(\\\"shared-file\\\");\\r\\n if (file) {\\r\\n const blob = yield file.blob();\\r\\n _this13.loadFileToCanvas(blob);\\r\\n yield webShareTargetCache.delete(\\\"shared-file\\\");\\r\\n window.history.replaceState(null, _constants__WEBPACK_IMPORTED_MODULE_12__.APP_NAME, window.location.pathname);\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n _this13.setState({\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n });\\r\\n this.addFiles = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (files) {\\r\\n const filesMap = files.reduce(function (acc, fileData) {\\r\\n acc.set(fileData.id, fileData);\\r\\n return acc;\\r\\n }, new Map());\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), Object.fromEntries(filesMap)); // bump versions for elements that reference added files so that\\r\\n // we/host apps can detect the change, and invalidate the image & shape\\r\\n // cache\\r\\n _this13.scene.getElements().forEach(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && filesMap.has(element.fileId)) {\\r\\n _this13.imageCache.delete(element.fileId);\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.bumpVersion)(element);\\r\\n }\\r\\n });\\r\\n _this13.scene.informMutation();\\r\\n _this13.addNewImagesToImageCache();\\r\\n });\\r\\n this.setLocalFont = function (showOnPanel) {\\r\\n showFourthFont = showOnPanel;\\r\\n };\\r\\n this.updateScene = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (sceneData) {\\r\\n if (sceneData.commitToHistory) {\\r\\n _this13.history.resumeRecording();\\r\\n }\\r\\n if (sceneData.appState) {\\r\\n _this13.setState(sceneData.appState);\\r\\n }\\r\\n if (sceneData.elements) {\\r\\n _this13.scene.replaceAllElements(sceneData.elements);\\r\\n }\\r\\n if (sceneData.collaborators) {\\r\\n _this13.setState({\\r\\n collaborators: sceneData.collaborators\\r\\n });\\r\\n }\\r\\n if (sceneData.libraryItems) {\\r\\n _this13.library.saveLibrary((0,_data_restore__WEBPACK_IMPORTED_MODULE_16__.restoreLibraryItems)(sceneData.libraryItems, \\\"unpublished\\\"));\\r\\n }\\r\\n });\\r\\n this.onSceneUpdated = function () {\\r\\n _this13.setState({});\\r\\n };\\r\\n this.updateCurrentCursorPosition = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n cursorX = event.clientX;\\r\\n cursorY = event.clientY;\\r\\n });\\r\\n this.onKeyDown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n // normalize `event.key` when CapsLock is pressed #2372\\r\\n if (\\\"Proxy\\\" in window && (!event.shiftKey && /^[A-Z]$/.test(event.key) || event.shiftKey && /^[a-z]$/.test(event.key))) {\\r\\n event = new Proxy(event, {\\r\\n get(ev, prop) {\\r\\n const value = ev[prop];\\r\\n if (typeof value === \\\"function\\\") {\\r\\n // fix for Proxies hijacking `this`\\r\\n return value.bind(ev);\\r\\n }\\r\\n return prop === \\\"key\\\" ? // CapsLock inverts capitalization based on ShiftKey, so invert\\r\\n // it back\\r\\n event.shiftKey ? ev.key.toUpperCase() : ev.key.toLowerCase() : value;\\r\\n }\\r\\n });\\r\\n }\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_35__.isWritableElement)(event.target) && event.key !== _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ESCAPE || // case: using arrows to move between buttons\\r\\n (0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key) && (0,_utils__WEBPACK_IMPORTED_MODULE_35__.isInputLike)(event.target)) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.QUESTION_MARK) {\\r\\n _this13.setState({\\r\\n showHelpDialog: true\\r\\n });\\r\\n }\\r\\n if (_this13.actionManager.handleKeyDown(event)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n return;\\r\\n }\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && _this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: false\\r\\n });\\r\\n }\\r\\n if (event.code === _keys__WEBPACK_IMPORTED_MODULE_27__.CODES.ZERO) {\\r\\n _this13.setState({\\r\\n isLibraryOpen: !_this13.state.isLibraryOpen\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const step = _this13.state.gridSize && (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT : _this13.state.gridSize) || (event.shiftKey ? _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_SHIFT_TRANSLATE_AMOUNT : _constants__WEBPACK_IMPORTED_MODULE_12__.ELEMENT_TRANSLATE_AMOUNT);\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state, true);\\r\\n let offsetX = 0;\\r\\n let offsetY = 0;\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_LEFT) {\\r\\n offsetX = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_RIGHT) {\\r\\n offsetX = step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_UP) {\\r\\n offsetY = -step;\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ARROW_DOWN) {\\r\\n offsetY = step;\\r\\n }\\r\\n selectedElements.forEach(function (element) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n x: element.x + offsetX,\\r\\n y: element.y + offsetY\\r\\n });\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.updateBoundElements)(element, {\\r\\n simultaneouslyUpdated: selectedElements\\r\\n });\\r\\n });\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n event.preventDefault();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.ENTER) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length === 1 && !(0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n const selectedElement = selectedElements[0];\\r\\n _this13.startTextEditing({\\r\\n sceneX: selectedElement.x + selectedElement.width / 2,\\r\\n sceneY: selectedElement.y + selectedElement.height / 2,\\r\\n shouldBind: true\\r\\n });\\r\\n event.preventDefault();\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (!event.ctrlKey && !event.altKey && !event.metaKey && _this13.state.draggingElement === null) {\\r\\n const shape = (0,_shapes__WEBPACK_IMPORTED_MODULE_34__.findShapeByKey)(event.key);\\r\\n if (shape) {\\r\\n _this13.selectShapeTool(shape);\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.Q) {\\r\\n _this13.toggleLock();\\r\\n }\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE && gesture.pointers.size === 0) {\\r\\n isHoldingSpace = true;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n event.preventDefault();\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G || event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (_this13.state.elementType === \\\"selection\\\" && !selectedElements.length) {\\r\\n return;\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.G && ((0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(_this13.state.elementType) || selectedElements.some(function (element) {\\r\\n return (0,_scene__WEBPACK_IMPORTED_MODULE_31__.hasBackground)(element.type);\\r\\n }))) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"backgroundColorPicker\\\"\\r\\n });\\r\\n }\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.S) {\\r\\n _this13.setState({\\r\\n openPopup: \\\"strokeColorPicker\\\"\\r\\n });\\r\\n }\\r\\n }\\r\\n });\\r\\n this.onKeyUp = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n if (event.key === _keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.SPACE) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"selection\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n isHoldingSpace = false;\\r\\n }\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.isBindingEnabled) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: true\\r\\n });\\r\\n }\\r\\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_27__.isArrowKey)(event.key)) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isBindingEnabled)(_this13.state) ? (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.bindOrUnbindSelectedElements)(selectedElements) : (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.unbindLinearElements)(selectedElements);\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureStart = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n selectedElementIds: {}\\r\\n });\\r\\n gesture.initialScale = _this13.state.zoom.value;\\r\\n });\\r\\n this.onGestureChange = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault(); // onGestureChange only has zoom factor but not the center.\\r\\n // If we're on iPad or iPhone, then we recognize multi-touch and will\\r\\n // zoom in at the right location on the touchMove handler already.\\r\\n // On Macbook, we don't have those events so will zoom in at the\\r\\n // current location instead.\\r\\n if (gesture.pointers.size === 2) {\\r\\n return;\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (initialScale) {\\r\\n _this13.setState(function (_ref8) {\\r\\n let { zoom, offsetLeft, offsetTop } = _ref8;\\r\\n return {\\r\\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * event.scale), zoom, {\\r\\n left: offsetLeft,\\r\\n top: offsetTop\\r\\n }, {\\r\\n x: cursorX,\\r\\n y: cursorY\\r\\n })\\r\\n };\\r\\n });\\r\\n }\\r\\n });\\r\\n this.onGestureEnd = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: {},\\r\\n selectedElementIds: _this13.state.previousSelectedElementIds\\r\\n });\\r\\n gesture.initialScale = null;\\r\\n });\\r\\n this.startTextEditing = function (_ref9) {\\r\\n var _a, _b;\\r\\n let { sceneX, sceneY, shouldBind, insertAtParentCenter = true } = _ref9;\\r\\n let parentCenterPosition = insertAtParentCenter && _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio); // bind to container when shouldBind is true or\\r\\n // clicked on center of container\\r\\n const container = shouldBind || parentCenterPosition ? (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getElementContainingPosition)(_this13.scene.getElements().filter(function (ele) {\\r\\n return !(0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(ele);\\r\\n }), sceneX, sceneY) : null;\\r\\n let existingTextElement = _this13.getTextElementAtPosition(sceneX, sceneY); // consider bounded text element if container present\\r\\n if (container) {\\r\\n const boundTextElementId = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getBoundTextElementId)(container);\\r\\n if (boundTextElementId) {\\r\\n existingTextElement = _this13.scene.getElement(boundTextElementId);\\r\\n }\\r\\n }\\r\\n if (!existingTextElement && container) {\\r\\n const fontString = {\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily\\r\\n };\\r\\n const minWidth = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineWidth)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const minHeight = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_45__.getApproxMinLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_35__.getFontString)(fontString));\\r\\n const newHeight = Math.max(container.height, minHeight);\\r\\n const newWidth = Math.max(container.width, minWidth);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(container, {\\r\\n height: newHeight,\\r\\n width: newWidth\\r\\n });\\r\\n sceneX = container.x + newWidth / 2;\\r\\n sceneY = container.y + newHeight / 2;\\r\\n if (parentCenterPosition) {\\r\\n parentCenterPosition = _this13.getTextWysiwygSnappedToCenterPosition(sceneX, sceneY, _this13.state, _this13.canvas, window.devicePixelRatio);\\r\\n }\\r\\n }\\r\\n const element = existingTextElement ? existingTextElement : (0,_element__WEBPACK_IMPORTED_MODULE_17__.newTextElement)({\\r\\n x: parentCenterPosition ? parentCenterPosition.elementCenterX : sceneX,\\r\\n y: parentCenterPosition ? parentCenterPosition.elementCenterY : sceneY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness,\\r\\n text: \\\"\\\",\\r\\n rawText: \\\"\\\",\\r\\n fontSize: _this13.state.currentItemFontSize,\\r\\n fontFamily: _this13.state.currentItemFontFamily,\\r\\n textAlign: parentCenterPosition ? \\\"center\\\" : _this13.state.currentItemTextAlign,\\r\\n verticalAlign: parentCenterPosition ? \\\"middle\\\" : _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN,\\r\\n containerId: (_a = container === null || container === void 0 ? void 0 : container.id) !== null && _a !== void 0 ? _a : undefined,\\r\\n groupIds: (_b = container === null || container === void 0 ? void 0 : container.groupIds) !== null && _b !== void 0 ? _b : []\\r\\n });\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n if (existingTextElement) {\\r\\n // if text element is no longer centered to a container, reset\\r\\n // verticalAlign to default because it's currently internal-only\\r\\n if (!parentCenterPosition || element.textAlign !== \\\"center\\\") {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_VERTICAL_ALIGN\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]); // case: creating new text not centered to parent elemenent → offset Y\\r\\n // so that the text is centered to cursor position\\r\\n if (!parentCenterPosition) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n y: element.y - element.baseline / 2\\r\\n });\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n editingElement: element\\r\\n });\\r\\n _this13.handleTextWysiwyg(element, {\\r\\n isExistingElement: !!existingTextElement\\r\\n });\\r\\n };\\r\\n this.handleCanvasDoubleClick = function (event) {\\r\\n // case: double-clicking with arrow/line tool selected would both create\\r\\n // text and enter multiElement mode\\r\\n if (_this13.state.multiElement) {\\r\\n return;\\r\\n } // we should only be able to double click when mode is selection\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n return;\\r\\n }\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0])) {\\r\\n if (!_this13.state.editingLinearElement || _this13.state.editingLinearElement.elementId !== selectedElements[0].id) {\\r\\n _this13.history.resumeRecording();\\r\\n _this13.setState({\\r\\n editingLinearElement: new _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor(selectedElements[0], _this13.scene)\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n let { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const selectedGroupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIds)(_this13.state);\\r\\n if (selectedGroupIds.length > 0) {\\r\\n const hitElement = _this13.getElementAtPosition(sceneX, sceneY);\\r\\n const selectedGroupId = hitElement && (0,_groups__WEBPACK_IMPORTED_MODULE_24__.getSelectedGroupIdForElement)(hitElement, _this13.state.selectedGroupIds);\\r\\n if (selectedGroupId) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n editingGroupId: selectedGroupId,\\r\\n selectedElementIds: {\\r\\n [hitElement.id]: true\\r\\n },\\r\\n selectedGroupIds: {}\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && !_this13.state.viewModeEnabled) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n if (selectedElements.length === 1) {\\r\\n const selectedElement = selectedElements[0];\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(selectedElement);\\r\\n if (canBindText) {\\r\\n sceneX = selectedElement.x + selectedElement.width / 2;\\r\\n sceneY = selectedElement.y + selectedElement.height / 2;\\r\\n }\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleCanvasPointerMove = function (event) {\\r\\n _this13.savePointer(event.clientX, event.clientY, _this13.state.cursorButton);\\r\\n if (gesture.pointers.has(event.pointerId)) {\\r\\n gesture.pointers.set(event.pointerId, {\\r\\n x: event.clientX,\\r\\n y: event.clientY\\r\\n });\\r\\n }\\r\\n const initialScale = gesture.initialScale;\\r\\n if (gesture.pointers.size === 2 && gesture.lastCenter && initialScale && gesture.initialDistance) {\\r\\n const center = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getCenter)(gesture.pointers);\\r\\n const deltaX = center.x - gesture.lastCenter.x;\\r\\n const deltaY = center.y - gesture.lastCenter.y;\\r\\n gesture.lastCenter = center;\\r\\n const distance = (0,_gesture__WEBPACK_IMPORTED_MODULE_23__.getDistance)(Array.from(gesture.pointers.values()));\\r\\n const scaleFactor = distance / gesture.initialDistance;\\r\\n _this13.setState(function (_ref10) {\\r\\n let { zoom, scrollX, scrollY, offsetLeft, offsetTop } = _ref10;\\r\\n return {\\r\\n scrollX: scrollX + deltaX / zoom.value,\\r\\n scrollY: scrollY + deltaY / zoom.value,\\r\\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(initialScale * scaleFactor), zoom, {\\r\\n left: offsetLeft,\\r\\n top: offsetTop\\r\\n }, center),\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n }\\r\\n else {\\r\\n gesture.lastCenter = gesture.initialDistance = gesture.initialScale = null;\\r\\n }\\r\\n if (isHoldingSpace || isPanning || isDraggingScrollBar) {\\r\\n return;\\r\\n }\\r\\n const isPointerOverScrollBars = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.isOverScrollBars)(currentScrollBars, event.clientX - _this13.state.offsetLeft, event.clientY - _this13.state.offsetTop);\\r\\n const isOverScrollBar = isPointerOverScrollBars.isOverEither;\\r\\n if (!_this13.state.draggingElement && !_this13.state.multiElement) {\\r\\n if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n const scenePointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const { x: scenePointerX, y: scenePointerY } = scenePointer;\\r\\n if (_this13.state.editingLinearElement && !_this13.state.editingLinearElement.isDragging) {\\r\\n const editingLinearElement = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerMove(event, scenePointerX, scenePointerY, _this13.state.editingLinearElement, _this13.state.gridSize);\\r\\n if (editingLinearElement !== _this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n editingLinearElement\\r\\n });\\r\\n }\\r\\n if (editingLinearElement.lastUncommittedPoint != null) {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n }\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElementType)(_this13.state.elementType)) {\\r\\n // Hovering with a selected tool or creating new linear element via click\\r\\n // and point\\r\\n const { draggingElement } = _this13.state;\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isBindingElement)(draggingElement)) {\\r\\n _this13.maybeSuggestBindingsForLinearElementAtCoords(draggingElement, [scenePointer], _this13.state.startBoundElement);\\r\\n }\\r\\n else {\\r\\n _this13.maybeSuggestBindingAtCursor(scenePointer);\\r\\n }\\r\\n }\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state;\\r\\n const { x: rx, y: ry } = multiElement;\\r\\n const { points, lastCommittedPoint } = multiElement;\\r\\n const lastPoint = points[points.length - 1];\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n if (lastPoint === lastCommittedPoint) {\\r\\n // if we haven't yet created a temp point and we're beyond commit-zone\\r\\n // threshold, add a point\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastPoint[0], lastPoint[1]) >= _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points, [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER); // in this branch, we're inside the commit zone, and no uncommitted\\r\\n // point exists. Thus do nothing (don't add/remove points).\\r\\n }\\r\\n }\\r\\n else if (points.length > 2 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(scenePointerX - rx, scenePointerY - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: points.slice(0, -1)\\r\\n });\\r\\n }\\r\\n else {\\r\\n if ((0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(points, _this13.state.zoom.value)) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n } // update last uncommitted point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n points: [...points.slice(0, -1), [scenePointerX - rx, scenePointerY - ry]]\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n const hasDeselectedButton = Boolean(event.buttons);\\r\\n if (hasDeselectedButton || _this13.state.elementType !== \\\"selection\\\" && _this13.state.elementType !== \\\"text\\\") {\\r\\n return;\\r\\n }\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !isOverScrollBar && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType && elementWithTransformHandleType.transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)(elementWithTransformHandleType));\\r\\n return;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1 && !isOverScrollBar) {\\r\\n const transformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), scenePointerX, scenePointerY, _this13.state.zoom, event.pointerType);\\r\\n if (transformHandleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType\\r\\n }));\\r\\n return;\\r\\n }\\r\\n }\\r\\n const hitElement = _this13.getElementAtPosition(scenePointer.x, scenePointer.y);\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(hitElement) ? _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.TEXT : _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n }\\r\\n else if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else if (isOverScrollBar) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n else if (_this13.state.editingLinearElement) {\\r\\n const element = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.getElement(_this13.state.editingLinearElement.elementId);\\r\\n if (element && (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(element, _this13.state, [scenePointer.x, scenePointer.y])) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n }\\r\\n else if ( // if using cmd/ctrl, we're not dragging\\r\\n !event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD] && (hitElement || _this13.isHittingCommonBoundingBoxOfSelectedElements(scenePointer, selectedElements))) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.MOVE);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.AUTO);\\r\\n }\\r\\n };\\r\\n this.handleTouchMove = function (event) {\\r\\n invalidateContextMenu = true;\\r\\n };\\r\\n this.handleCanvasPointerDown = function (event) {\\r\\n // remove any active selection when we start to interact with canvas\\r\\n // (mainly, we care about removing selection outside the component which\\r\\n // would prevent our copy handling otherwise)\\r\\n const selection = document.getSelection();\\r\\n if (selection === null || selection === void 0 ? void 0 : selection.anchorNode) {\\r\\n selection.removeAllRanges();\\r\\n }\\r\\n _this13.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\\r\\n _this13.maybeCleanupAfterMissingPointerUp(event);\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n lastPointerDownWith: event.pointerType,\\r\\n cursorButton: \\\"down\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"down\\\");\\r\\n if (_this13.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\\r\\n return;\\r\\n } // only handle left mouse button or touch\\r\\n if (event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && event.button !== _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.TOUCH) {\\r\\n return;\\r\\n }\\r\\n _this13.updateGestureOnPointerDown(event); // don't select while panning\\r\\n if (gesture.pointers.size > 1) {\\r\\n return;\\r\\n } // State for the duration of a pointer interaction, which starts with a\\r\\n // pointerDown event, ends with a pointerUp event (or another pointerDown)\\r\\n const pointerDownState = _this13.initialPointerDownState(event);\\r\\n if (_this13.handleDraggingScrollBar(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n _this13.clearSelectionIfNotUsingSelection();\\r\\n _this13.updateBindingEnabledOnPointerMove(event);\\r\\n if (_this13.handleSelectionOnPointerDown(event, pointerDownState)) {\\r\\n return;\\r\\n }\\r\\n if (_this13.state.elementType === \\\"text\\\") {\\r\\n _this13.handleTextOnPointerDown(event, pointerDownState);\\r\\n return;\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"arrow\\\" || _this13.state.elementType === \\\"line\\\") {\\r\\n _this13.handleLinearElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"image\\\") {\\r\\n // reset image preview on pointerdown\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.CROSSHAIR);\\r\\n if (!_this13.state.pendingImageElement) {\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n draggingElement: _this13.state.pendingImageElement,\\r\\n editingElement: _this13.state.pendingImageElement,\\r\\n pendingImageElement: null,\\r\\n multiElement: null\\r\\n });\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_this13.state.pendingImageElement, {\\r\\n x,\\r\\n y\\r\\n });\\r\\n }\\r\\n else if (_this13.state.elementType === \\\"freedraw\\\") {\\r\\n _this13.handleFreeDrawElementOnPointerDown(event, _this13.state.elementType, pointerDownState);\\r\\n }\\r\\n else {\\r\\n _this13.createGenericElementOnPointerDown(_this13.state.elementType, pointerDownState);\\r\\n }\\r\\n const onPointerMove = _this13.onPointerMoveFromPointerDownHandler(pointerDownState);\\r\\n const onPointerUp = _this13.onPointerUpFromPointerDownHandler(pointerDownState);\\r\\n const onKeyDown = _this13.onKeyDownFromPointerDownHandler(pointerDownState);\\r\\n const onKeyUp = _this13.onKeyUpFromPointerDownHandler(pointerDownState);\\r\\n lastPointerUp = onPointerUp;\\r\\n if (!_this13.state.viewModeEnabled) {\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, onPointerUp);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYDOWN, onKeyDown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.KEYUP, onKeyUp);\\r\\n pointerDownState.eventListeners.onMove = onPointerMove;\\r\\n pointerDownState.eventListeners.onUp = onPointerUp;\\r\\n pointerDownState.eventListeners.onKeyUp = onKeyUp;\\r\\n pointerDownState.eventListeners.onKeyDown = onKeyDown;\\r\\n }\\r\\n };\\r\\n this.maybeOpenContextMenuAfterPointerDownOnTouchDevices = function (event) {\\r\\n // deal with opening context menu on touch devices\\r\\n if (event.pointerType === \\\"touch\\\") {\\r\\n invalidateContextMenu = false;\\r\\n if (touchTimeout) {\\r\\n // If there's already a touchTimeout, this means that there's another\\r\\n // touch down and we are doing another touch, so we shouldn't open the\\r\\n // context menu.\\r\\n invalidateContextMenu = true;\\r\\n }\\r\\n else {\\r\\n // open the context menu with the first touch's clientX and clientY\\r\\n // if the touch is not moving\\r\\n touchTimeout = window.setTimeout(function () {\\r\\n touchTimeout = 0;\\r\\n if (!invalidateContextMenu) {\\r\\n _this13.handleCanvasContextMenu(event);\\r\\n }\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.TOUCH_CTX_MENU_TIMEOUT);\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleCanvasPanUsingWheelOrSpaceDrag = function (event) {\\r\\n if (!(gesture.pointers.size === 0 && (event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.WHEEL || event.button === _constants__WEBPACK_IMPORTED_MODULE_12__.POINTER_BUTTON.MAIN && isHoldingSpace || _this13.state.viewModeEnabled)) || (0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return false;\\r\\n }\\r\\n isPanning = true;\\r\\n event.preventDefault();\\r\\n let nextPastePrevented = false;\\r\\n const isLinux = /Linux/.test(window.navigator.platform);\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRABBING);\\r\\n let { clientX: lastX, clientY: lastY } = event;\\r\\n const onPointerMove = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n const deltaX = lastX - event.clientX;\\r\\n const deltaY = lastY - event.clientY;\\r\\n lastX = event.clientX;\\r\\n lastY = event.clientY;\\r\\n /*\\r\\n * Prevent paste event if we move while middle clicking on Linux.\\r\\n * See issue #1383.\\r\\n */\\r\\n if (isLinux && !nextPastePrevented && (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)) {\\r\\n nextPastePrevented = true;\\r\\n /* Prevent the next paste event */\\r\\n const preventNextPaste = function (event) {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n event.stopPropagation();\\r\\n };\\r\\n /*\\r\\n * Reenable next paste in case of disabled middle click paste for\\r\\n * any reason:\\r\\n * - rigth click paste\\r\\n * - empty clipboard\\r\\n */\\r\\n const enableNextPaste = function () {\\r\\n setTimeout(function () {\\r\\n document.body.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }, 100);\\r\\n };\\r\\n document.body.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.PASTE, preventNextPaste);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, enableNextPaste);\\r\\n }\\r\\n _this13.setState({\\r\\n scrollX: _this13.state.scrollX - deltaX / _this13.state.zoom.value,\\r\\n scrollY: _this13.state.scrollY - deltaY / _this13.state.zoom.value\\r\\n });\\r\\n });\\r\\n const teardown = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(lastPointerUp = function () {\\r\\n lastPointerUp = null;\\r\\n isPanning = false;\\r\\n if (!isHoldingSpace) {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.GRAB);\\r\\n }\\r\\n else {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursorForShape)(_this13.canvas, _this13.state.elementType);\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n cursorButton: \\\"up\\\"\\r\\n });\\r\\n _this13.savePointer(event.clientX, event.clientY, \\\"up\\\");\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n window.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.BLUR, teardown);\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_MOVE, onPointerMove, {\\r\\n passive: true\\r\\n });\\r\\n window.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.POINTER_UP, teardown);\\r\\n return true;\\r\\n };\\r\\n this.clearSelectionIfNotUsingSelection = function () {\\r\\n if (_this13.state.elementType !== \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleSelectionOnPointerDown = function (event, pointerDownState) {\\r\\n var _a;\\r\\n if (_this13.state.elementType === \\\"selection\\\") {\\r\\n const elements = _this13.scene.getElements();\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(elements, _this13.state);\\r\\n if (selectedElements.length === 1 && !_this13.state.editingLinearElement) {\\r\\n const elementWithTransformHandleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getElementWithTransformHandleType)(elements, _this13.state, pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n if (elementWithTransformHandleType != null) {\\r\\n _this13.setState({\\r\\n resizingElement: elementWithTransformHandleType.element\\r\\n });\\r\\n pointerDownState.resize.handleType = elementWithTransformHandleType.transformHandleType;\\r\\n }\\r\\n }\\r\\n else if (selectedElements.length > 1) {\\r\\n pointerDownState.resize.handleType = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getTransformHandleTypeFromCoords)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getCommonBounds)(selectedElements), pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.zoom, event.pointerType);\\r\\n }\\r\\n if (pointerDownState.resize.handleType) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, (0,_element__WEBPACK_IMPORTED_MODULE_17__.getCursorForResizingElement)({\\r\\n transformHandleType: pointerDownState.resize.handleType\\r\\n }));\\r\\n pointerDownState.resize.isResizing = true;\\r\\n pointerDownState.resize.offset = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.tupleToCoors)((0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeOffsetXY)(pointerDownState.resize.handleType, selectedElements, pointerDownState.origin.x, pointerDownState.origin.y));\\r\\n if (selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isLinearElement)(selectedElements[0]) && selectedElements[0].points.length === 2) {\\r\\n pointerDownState.resize.arrowDirection = (0,_element__WEBPACK_IMPORTED_MODULE_17__.getResizeArrowDirection)(pointerDownState.resize.handleType, selectedElements[0]);\\r\\n }\\r\\n }\\r\\n else {\\r\\n if (_this13.state.editingLinearElement) {\\r\\n const ret = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_19__.LinearElementEditor.handlePointerDown(event, _this13.state, function (appState) {\\r\\n return _this13.setState(appState);\\r\\n }, _this13.history, pointerDownState.origin);\\r\\n if (ret.hitElement) {\\r\\n pointerDownState.hit.element = ret.hitElement;\\r\\n }\\r\\n if (ret.didAddPoint) {\\r\\n return true;\\r\\n }\\r\\n } // hitElement may already be set above, so check first\\r\\n pointerDownState.hit.element = (_a = pointerDownState.hit.element) !== null && _a !== void 0 ? _a : _this13.getElementAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n if (pointerDownState.hit.element) {\\r\\n pointerDownState.hit.hasHitElementInside = (0,_element_collision__WEBPACK_IMPORTED_MODULE_46__.isHittingElementNotConsideringBoundingBox)(pointerDownState.hit.element, _this13.state, [pointerDownState.origin.x, pointerDownState.origin.y]);\\r\\n } // For overlapped elements one position may hit\\r\\n // multiple elements\\r\\n pointerDownState.hit.allHitElements = _this13.getElementsAtPosition(pointerDownState.origin.x, pointerDownState.origin.y);\\r\\n const hitElement = pointerDownState.hit.element;\\r\\n const someHitElementIsSelected = pointerDownState.hit.allHitElements.some(function (element) {\\r\\n return _this13.isASelectedElement(element);\\r\\n });\\r\\n if ((hitElement === null || !someHitElementIsSelected) && !event.shiftKey && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.clearSelection(hitElement);\\r\\n }\\r\\n if (_this13.state.editingLinearElement) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [_this13.state.editingLinearElement.elementId]: true\\r\\n }\\r\\n }); // If we click on something\\r\\n }\\r\\n else if (hitElement != null) {\\r\\n // on CMD/CTRL, drill down to hit element regardless of groups etc.\\r\\n if (event[_keys__WEBPACK_IMPORTED_MODULE_27__.KEYS.CTRL_OR_CMD]) {\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return _objectSpread(_objectSpread({}, (0,_groups__WEBPACK_IMPORTED_MODULE_24__.editGroupForSelectedElement)(prevState, hitElement)), {}, {\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }); // mark as not completely handled so as to allow dragging etc.\\r\\n return false;\\r\\n } // deselect if item is selected\\r\\n // if shift is not clicked, this will always return true\\r\\n // otherwise, it will trigger selection based on current\\r\\n // state of the box\\r\\n if (!_this13.state.selectedElementIds[hitElement.id]) {\\r\\n // if we are currently editing a group, exiting editing mode and deselect the group.\\r\\n if (_this13.state.editingGroupId && !(0,_groups__WEBPACK_IMPORTED_MODULE_24__.isElementInGroup)(hitElement, _this13.state.editingGroupId)) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {},\\r\\n selectedGroupIds: {},\\r\\n editingGroupId: null\\r\\n });\\r\\n } // Add hit element to selection. At this point if we're not holding\\r\\n // SHIFT the previously selected element(s) were deselected above\\r\\n // (make sure you use setState updater to use latest state)\\r\\n if (!someHitElementIsSelected && !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) {\\r\\n _this13.setState(function (prevState) {\\r\\n return (0,_groups__WEBPACK_IMPORTED_MODULE_24__.selectGroupsForSelectedElements)(_objectSpread(_objectSpread({}, prevState), {}, {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [hitElement.id]: true\\r\\n })\\r\\n }), _this13.scene.getElements());\\r\\n });\\r\\n pointerDownState.hit.wasAddedToSelection = true;\\r\\n }\\r\\n }\\r\\n }\\r\\n _this13.setState({\\r\\n previousSelectedElementIds: _this13.state.selectedElementIds\\r\\n });\\r\\n }\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this.handleTextOnPointerDown = function (event, pointerDownState) {\\r\\n // if we're currently still editing text, clicking outside\\r\\n // should only finalize it, not create another (irrespective\\r\\n // of state.elementLocked)\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.isTextElement)(_this13.state.editingElement)) {\\r\\n return;\\r\\n }\\r\\n let sceneX = pointerDownState.origin.x;\\r\\n let sceneY = pointerDownState.origin.y;\\r\\n const element = _this13.getElementAtPosition(sceneX, sceneY, {\\r\\n includeBoundTextElement: true\\r\\n });\\r\\n const canBindText = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.hasBoundTextElement)(element);\\r\\n if (canBindText) {\\r\\n sceneX = element.x + element.width / 2;\\r\\n sceneY = element.y + element.height / 2;\\r\\n }\\r\\n _this13.startTextEditing({\\r\\n sceneX,\\r\\n sceneY,\\r\\n shouldBind: false,\\r\\n insertAtParentCenter: !event.altKey\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n if (!_this13.state.elementLocked) {\\r\\n _this13.setState({\\r\\n elementType: \\\"selection\\\"\\r\\n });\\r\\n }\\r\\n };\\r\\n this.handleFreeDrawElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n // Begin a mark capture. This does not have to update state yet.\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, null);\\r\\n const element = (0,_element_newElement__WEBPACK_IMPORTED_MODULE_21__.newFreeDrawElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n simulatePressure: event.pressure === 0.5\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n const pressures = element.simulatePressure ? element.pressures : [...element.pressures, event.pressure];\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [[0, 0]],\\r\\n pressures\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n };\\r\\n this.createImageElement = function (_ref11) {\\r\\n let { sceneX, sceneY } = _ref11;\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(sceneX, sceneY, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newImageElement)({\\r\\n type: \\\"image\\\",\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness\\r\\n });\\r\\n return element;\\r\\n };\\r\\n this.handleLinearElementOnPointerDown = function (event, elementType, pointerDownState) {\\r\\n if (_this13.state.multiElement) {\\r\\n const { multiElement } = _this13.state; // finalize if completing a loop\\r\\n if (multiElement.type === \\\"line\\\" && (0,_math__WEBPACK_IMPORTED_MODULE_28__.isPathALoop)(multiElement.points, _this13.state.zoom.value)) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n const { x: rx, y: ry, lastCommittedPoint } = multiElement; // clicking inside commit zone → finalize arrow\\r\\n if (multiElement.points.length > 1 && lastCommittedPoint && (0,_math__WEBPACK_IMPORTED_MODULE_28__.distance2d)(pointerDownState.origin.x - rx, pointerDownState.origin.y - ry, lastCommittedPoint[0], lastCommittedPoint[1]) < _constants__WEBPACK_IMPORTED_MODULE_12__.LINE_CONFIRM_THRESHOLD) {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [multiElement.id]: true\\r\\n })\\r\\n };\\r\\n }); // clicking outside commit zone → update reference for last committed\\r\\n // point\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(multiElement, {\\r\\n lastCommittedPoint: multiElement.points[multiElement.points.length - 1]\\r\\n });\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, _constants__WEBPACK_IMPORTED_MODULE_12__.CURSOR_TYPE.POINTER);\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\\r\\n If so, we want it to be null for start and \\\"arrow\\\" for end. If the linear item is not\\r\\n an arrow, we want it to be null for both. Otherwise, we want it to use the\\r\\n values from appState. */\\r\\n const { currentItemStartArrowhead, currentItemEndArrowhead } = _this13.state;\\r\\n const [startArrowhead, endArrowhead] = elementType === \\\"arrow\\\" ? [currentItemStartArrowhead, currentItemEndArrowhead] : [null, null];\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newLinearElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemLinearStrokeSharpness,\\r\\n startArrowhead,\\r\\n endArrowhead\\r\\n });\\r\\n _this13.setState(function (prevState) {\\r\\n return {\\r\\n selectedElementIds: _objectSpread(_objectSpread({}, prevState.selectedElementIds), {}, {\\r\\n [element.id]: false\\r\\n })\\r\\n };\\r\\n });\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(element, {\\r\\n points: [...element.points, [0, 0]]\\r\\n });\\r\\n const boundElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerDownState.origin, _this13.scene);\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n draggingElement: element,\\r\\n editingElement: element,\\r\\n startBoundElement: boundElement,\\r\\n suggestedBindings: []\\r\\n });\\r\\n }\\r\\n };\\r\\n this.createGenericElementOnPointerDown = function (elementType, pointerDownState) {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerDownState.origin.x, pointerDownState.origin.y, _this13.state.gridSize);\\r\\n const element = (0,_element__WEBPACK_IMPORTED_MODULE_17__.newElement)({\\r\\n type: elementType,\\r\\n x: gridX,\\r\\n y: gridY,\\r\\n strokeColor: _this13.state.currentItemStrokeColor,\\r\\n backgroundColor: _this13.state.currentItemBackgroundColor,\\r\\n fillStyle: _this13.state.currentItemFillStyle,\\r\\n strokeWidth: _this13.state.currentItemStrokeWidth,\\r\\n strokeStyle: _this13.state.currentItemStrokeStyle,\\r\\n roughness: _this13.state.currentItemRoughness,\\r\\n opacity: _this13.state.currentItemOpacity,\\r\\n strokeSharpness: _this13.state.currentItemStrokeSharpness\\r\\n });\\r\\n if (element.type === \\\"selection\\\") {\\r\\n _this13.setState({\\r\\n selectionElement: element,\\r\\n draggingElement: element\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), element]);\\r\\n _this13.setState({\\r\\n multiElement: null,\\r\\n draggingElement: element,\\r\\n editingElement: element\\r\\n });\\r\\n }\\r\\n };\\r\\n this.initializeImage = /*#__PURE__*/ function () {\\r\\n var _ref12 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (_ref13) {\\r\\n var _a, _b, _c, _d;\\r\\n let { imageFile, imageElement: _imageElement, showCursorImagePreview = false } = _ref13;\\r\\n // at this point this should be guaranteed image file, but we do this check\\r\\n // to satisfy TS down the line\\r\\n if (!(0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(imageFile)) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.unsupportedFileType\\\"));\\r\\n }\\r\\n const mimeType = imageFile.type;\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, \\\"wait\\\");\\r\\n if (mimeType === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n imageFile = (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.SVGStringToFile)(yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.normalizeSVG)(yield imageFile.text()), imageFile.name);\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error);\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.svgImageInsertError\\\"));\\r\\n }\\r\\n } // generate image id (by default the file digest) before any\\r\\n // resizing/compression takes place to keep it more portable\\r\\n const fileId = yield ((_b = (_a = _this13.props).generateIdForFile) === null || _b === void 0 ? void 0 : _b.call(_a, imageFile)) || (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.generateIdFromFile)(imageFile);\\r\\n if (!fileId) {\\r\\n console.warn(\\\"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\\\");\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\"));\\r\\n }\\r\\n const existingFileData = _this13.files[fileId];\\r\\n if (!(existingFileData === null || existingFileData === void 0 ? void 0 : existingFileData.dataURL)) {\\r\\n try {\\r\\n imageFile = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: _constants__WEBPACK_IMPORTED_MODULE_12__.DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n console.error(\\\"error trying to resing image file on insertion\\\", error);\\r\\n }\\r\\n if (imageFile.size > _constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES) {\\r\\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.fileTooBig\\\", {\\r\\n maxSize: `${Math.trunc(_constants__WEBPACK_IMPORTED_MODULE_12__.MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`\\r\\n }));\\r\\n }\\r\\n }\\r\\n if (showCursorImagePreview) {\\r\\n const dataURL = (_c = _this13.files[fileId]) === null || _c === void 0 ? void 0 : _c.dataURL; // optimization so that we don't unnecessarily resize the original\\r\\n // full-size file for cursor preview\\r\\n // (it's much faster to convert the resized dataURL to File)\\r\\n const resizedFile = dataURL && (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.dataURLToFile)(dataURL);\\r\\n _this13.setImagePreviewCursor(resizedFile || imageFile);\\r\\n }\\r\\n const dataURL = ((_d = _this13.files[fileId]) === null || _d === void 0 ? void 0 : _d.dataURL) || (yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imageFile));\\r\\n const imageElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(_imageElement, {\\r\\n fileId\\r\\n }, false);\\r\\n return new Promise(/*#__PURE__*/ function () {\\r\\n var _ref14 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (resolve, reject) {\\r\\n var _a, _b;\\r\\n try {\\r\\n _this13.files = _objectSpread(_objectSpread({}, _this13.files), {}, {\\r\\n [fileId]: {\\r\\n mimeType,\\r\\n id: fileId,\\r\\n dataURL,\\r\\n created: Date.now()\\r\\n }\\r\\n });\\r\\n const cachedImageData = _this13.imageCache.get(fileId);\\r\\n if (!cachedImageData) {\\r\\n _this13.addNewImagesToImageCache();\\r\\n yield _this13.updateImageCache([imageElement]);\\r\\n }\\r\\n if ((cachedImageData === null || cachedImageData === void 0 ? void 0 : cachedImageData.image) instanceof Promise) {\\r\\n yield cachedImageData.image;\\r\\n }\\r\\n if (((_a = _this13.state.pendingImageElement) === null || _a === void 0 ? void 0 : _a.id) !== imageElement.id && ((_b = _this13.state.draggingElement) === null || _b === void 0 ? void 0 : _b.id) !== imageElement.id) {\\r\\n _this13.initializeImageDimensions(imageElement, true);\\r\\n }\\r\\n resolve(imageElement);\\r\\n }\\r\\n catch (error) {\\r\\n console.error(error);\\r\\n reject(new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")));\\r\\n }\\r\\n finally {\\r\\n if (!showCursorImagePreview) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.resetCursor)(_this13.canvas);\\r\\n }\\r\\n }\\r\\n });\\r\\n return function (_x6, _x7) {\\r\\n return _ref14.apply(this, arguments);\\r\\n };\\r\\n }());\\r\\n });\\r\\n return function (_x5) {\\r\\n return _ref12.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.insertImageElement = /*#__PURE__*/ function () {\\r\\n var _ref15 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageElement, imageFile, showCursorImagePreview) {\\r\\n _this13.scene.replaceAllElements([..._this13.scene.getElementsIncludingDeleted(), imageElement]);\\r\\n try {\\r\\n yield _this13.initializeImage({\\r\\n imageFile,\\r\\n imageElement,\\r\\n showCursorImagePreview\\r\\n });\\r\\n }\\r\\n catch (error) {\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n isDeleted: true\\r\\n });\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n _this13.setState({\\r\\n errorMessage: error.message || (0,_i18n__WEBPACK_IMPORTED_MODULE_26__.t)(\\\"errors.imageInsertError\\\")\\r\\n });\\r\\n }\\r\\n });\\r\\n return function (_x8, _x9, _x10) {\\r\\n return _ref15.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.setImagePreviewCursor = /*#__PURE__*/ function () {\\r\\n var _ref16 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (imageFile) {\\r\\n // mustn't be larger than 128 px\\r\\n // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\\r\\n const cursorImageSizePx = 96;\\r\\n const imagePreview = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.resizeImageFile)(imageFile, {\\r\\n maxWidthOrHeight: cursorImageSizePx\\r\\n });\\r\\n let previewDataURL = yield (0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.getDataURL)(imagePreview); // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\\r\\n // a small canvas\\r\\n if (imageFile.type === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n const img = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.loadHTMLImageElement)(previewDataURL);\\r\\n let height = Math.min(img.height, cursorImageSizePx);\\r\\n let width = height * (img.width / img.height);\\r\\n if (width > cursorImageSizePx) {\\r\\n width = cursorImageSizePx;\\r\\n height = width * (img.height / img.width);\\r\\n }\\r\\n const canvas = document.createElement(\\\"canvas\\\");\\r\\n canvas.height = height;\\r\\n canvas.width = width;\\r\\n const context = canvas.getContext(\\\"2d\\\");\\r\\n context.drawImage(img, 0, 0, width, height);\\r\\n previewDataURL = canvas.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg);\\r\\n }\\r\\n if (_this13.state.pendingImageElement) {\\r\\n (0,_utils__WEBPACK_IMPORTED_MODULE_35__.setCursor)(_this13.canvas, `url(${previewDataURL}) 4 4, auto`);\\r\\n }\\r\\n });\\r\\n return function (_x11) {\\r\\n return _ref16.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.onImageAction = /*#__PURE__*/ function () {\\r\\n var _ref17 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let { insertOnCanvasDirectly } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {\\r\\n insertOnCanvasDirectly: false\\r\\n };\\r\\n try {\\r\\n const clientX = _this13.state.width / 2 + _this13.state.offsetLeft;\\r\\n const clientY = _this13.state.height / 2 + _this13.state.offsetTop;\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX,\\r\\n clientY\\r\\n }, _this13.state);\\r\\n const imageFile = yield (0,_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.fileOpen)({\\r\\n description: \\\"Image\\\",\\r\\n extensions: [\\\"jpg\\\", \\\"png\\\", \\\"svg\\\", \\\"gif\\\"]\\r\\n });\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX: x,\\r\\n sceneY: y\\r\\n });\\r\\n if (insertOnCanvasDirectly) {\\r\\n _this13.insertImageElement(imageElement, imageFile);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n pendingImageElement: imageElement\\r\\n }, function () {\\r\\n _this13.insertImageElement(imageElement, imageFile, \\r\\n /* showCursorImagePreview */\\r\\n true);\\r\\n });\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"AbortError\\\") {\\r\\n console.error(error);\\r\\n }\\r\\n else {\\r\\n console.warn(error);\\r\\n }\\r\\n _this13.setState({\\r\\n pendingImageElement: null,\\r\\n editingElement: null,\\r\\n elementType: \\\"selection\\\"\\r\\n }, function () {\\r\\n _this13.actionManager.executeAction(_actions__WEBPACK_IMPORTED_MODULE_5__.actionFinalize);\\r\\n });\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref17.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.initializeImageDimensions = function (imageElement) {\\r\\n var _a;\\r\\n let forceNaturalSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(imageElement) && ((_a = _this13.imageCache.get(imageElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n if (!image || image instanceof Promise) {\\r\\n if (imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const placeholderSize = 100 / _this13.state.zoom.value;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x: imageElement.x - placeholderSize / 2,\\r\\n y: imageElement.y - placeholderSize / 2,\\r\\n width: placeholderSize,\\r\\n height: placeholderSize\\r\\n });\\r\\n }\\r\\n return;\\r\\n }\\r\\n if (forceNaturalSize || // if user-created bounding box is below threshold, assume the\\r\\n // intention was to click instead of drag, and use the image's\\r\\n // intrinsic size\\r\\n imageElement.width < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value && imageElement.height < _constants__WEBPACK_IMPORTED_MODULE_12__.DRAGGING_THRESHOLD / _this13.state.zoom.value) {\\r\\n const minHeight = Math.max(_this13.state.height - 120, 160); // max 65% of canvas height, clamped to <300px, vh - 120px>\\r\\n const maxHeight = Math.min(minHeight, Math.floor(_this13.state.height * 0.5) / _this13.state.zoom.value);\\r\\n const height = Math.min(image.naturalHeight, maxHeight);\\r\\n const width = height * (image.naturalWidth / image.naturalHeight); // add current imageElement width/height to account for previous centering\\r\\n // of the placholder image\\r\\n const x = imageElement.x + imageElement.width / 2 - width / 2;\\r\\n const y = imageElement.y + imageElement.height / 2 - height / 2;\\r\\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.mutateElement)(imageElement, {\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height\\r\\n });\\r\\n }\\r\\n };\\r\\n this.updateImageCache = /*#__PURE__*/ function () {\\r\\n var _ref18 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (elements) {\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const { updatedFiles, erroredFiles } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.updateImageCache)({\\r\\n imageCache: _this13.imageCache,\\r\\n fileIds: elements.map(function (element) {\\r\\n return element.fileId;\\r\\n }),\\r\\n files\\r\\n });\\r\\n if (updatedFiles.size || erroredFiles.size) {\\r\\n for (const element of elements) {\\r\\n if (updatedFiles.has(element.fileId)) {\\r\\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_30__.invalidateShapeForElement)(element);\\r\\n }\\r\\n }\\r\\n }\\r\\n if (erroredFiles.size) {\\r\\n _this13.scene.replaceAllElements(_this13.scene.getElementsIncludingDeleted().map(function (element) {\\r\\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(element) && erroredFiles.has(element.fileId)) {\\r\\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_20__.newElementWith)(element, {\\r\\n status: \\\"error\\\"\\r\\n });\\r\\n }\\r\\n return element;\\r\\n }));\\r\\n }\\r\\n return {\\r\\n updatedFiles,\\r\\n erroredFiles\\r\\n };\\r\\n });\\r\\n return function (_x12) {\\r\\n return _ref18.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.addNewImagesToImageCache = /*#__PURE__*/ function () {\\r\\n var _ref19 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* () {\\r\\n let imageElements = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : (0,_element_image__WEBPACK_IMPORTED_MODULE_42__.getInitializedImageElements)(_this13.scene.getElements());\\r\\n let files = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _this13.files;\\r\\n const uncachedImageElements = imageElements.filter(function (element) {\\r\\n return !element.isDeleted && !_this13.imageCache.has(element.fileId);\\r\\n });\\r\\n if (uncachedImageElements.length) {\\r\\n const { updatedFiles } = yield _this13.updateImageCache(uncachedImageElements, files);\\r\\n if (updatedFiles.size) {\\r\\n _this13.scene.informMutation();\\r\\n }\\r\\n }\\r\\n });\\r\\n return function () {\\r\\n return _ref19.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.scheduleImageRefresh = lodash_throttle__WEBPACK_IMPORTED_MODULE_43___default()(function () {\\r\\n _this13.addNewImagesToImageCache();\\r\\n }, _constants__WEBPACK_IMPORTED_MODULE_12__.IMAGE_RENDER_TIMEOUT);\\r\\n this.updateBindingEnabledOnPointerMove = function (event) {\\r\\n const shouldEnableBinding = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.shouldEnableBindingForPointerEvent)(event);\\r\\n if (_this13.state.isBindingEnabled !== shouldEnableBinding) {\\r\\n _this13.setState({\\r\\n isBindingEnabled: shouldEnableBinding\\r\\n });\\r\\n }\\r\\n };\\r\\n this.maybeSuggestBindingAtCursor = function (pointerCoords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(pointerCoords, _this13.scene);\\r\\n _this13.setState({\\r\\n suggestedBindings: hoveredBindableElement != null ? [hoveredBindableElement] : []\\r\\n });\\r\\n };\\r\\n this.maybeSuggestBindingsForLinearElementAtCoords = function (linearElement, pointerCoords, oppositeBindingBoundElement) {\\r\\n if (!pointerCoords.length) {\\r\\n return;\\r\\n }\\r\\n const suggestedBindings = pointerCoords.reduce(function (acc, coords) {\\r\\n const hoveredBindableElement = (0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.getHoveredElementForBinding)(coords, _this13.scene);\\r\\n if (hoveredBindableElement != null && !(0,_element_binding__WEBPACK_IMPORTED_MODULE_18__.isLinearElementSimpleAndAlreadyBound)(linearElement, oppositeBindingBoundElement === null || oppositeBindingBoundElement === void 0 ? void 0 : oppositeBindingBoundElement.id, hoveredBindableElement)) {\\r\\n acc.push(hoveredBindableElement);\\r\\n }\\r\\n return acc;\\r\\n }, []);\\r\\n _this13.setState({\\r\\n suggestedBindings\\r\\n });\\r\\n };\\r\\n this.handleCanvasRef = function (canvas) {\\r\\n var _a, _b, _c;\\r\\n // canvas is null when unmounting\\r\\n if (canvas !== null) {\\r\\n _this13.canvas = canvas;\\r\\n _this13.rc = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_3__[\\\"default\\\"].canvas(_this13.canvas);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel, {\\r\\n passive: false\\r\\n });\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n _this13.canvas.addEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n else {\\r\\n (_a = _this13.canvas) === null || _a === void 0 ? void 0 : _a.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.WHEEL, _this13.handleWheel);\\r\\n (_b = _this13.canvas) === null || _b === void 0 ? void 0 : _b.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_START, _this13.onTapStart);\\r\\n (_c = _this13.canvas) === null || _c === void 0 ? void 0 : _c.removeEventListener(_constants__WEBPACK_IMPORTED_MODULE_12__.EVENT.TOUCH_END, _this13.onTapEnd);\\r\\n }\\r\\n };\\r\\n this.handleAppOnDrop = /*#__PURE__*/ function () {\\r\\n var _ref20 = (0,_babel_runtime_helpers_asyncToGenerator__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(function* (event) {\\r\\n var _a, _b;\\r\\n try {\\r\\n if (_this13.props.onDrop) {\\r\\n try {\\r\\n if ((yield _this13.props.onDrop(event)) === false) {\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (e) {\\r\\n console.error(e);\\r\\n }\\r\\n }\\r\\n const file = event.dataTransfer.files[0];\\r\\n if ((0,_data_blob__WEBPACK_IMPORTED_MODULE_41__.isSupportedImageFile)(file)) {\\r\\n // first attempt to decode scene from the image if it's embedded\\r\\n // ---------------------------------------------------------------------\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.png || (file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.svg) {\\r\\n try {\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n const scene = yield (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted());\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n return;\\r\\n }\\r\\n catch (error) {\\r\\n if (error.name !== \\\"EncodingError\\\") {\\r\\n throw error;\\r\\n }\\r\\n }\\r\\n } // if no scene is embedded or we fail for whatever reason, fall back\\r\\n // to importing as regular image\\r\\n // ---------------------------------------------------------------------\\r\\n const { x: sceneX, y: sceneY } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const imageElement = _this13.createImageElement({\\r\\n sceneX,\\r\\n sceneY\\r\\n });\\r\\n _this13.insertImageElement(imageElement, file);\\r\\n _this13.initializeImageDimensions(imageElement);\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [imageElement.id]: true\\r\\n }\\r\\n });\\r\\n return;\\r\\n }\\r\\n }\\r\\n catch (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }\\r\\n const libraryShapes = event.dataTransfer.getData(_constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib);\\r\\n if (libraryShapes !== \\\"\\\") {\\r\\n _this13.addElementsFromPasteOrLibrary({\\r\\n elements: JSON.parse(libraryShapes),\\r\\n position: event,\\r\\n files: null\\r\\n });\\r\\n return;\\r\\n }\\r\\n const file = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files[0];\\r\\n if ((file === null || file === void 0 ? void 0 : file.type) === _constants__WEBPACK_IMPORTED_MODULE_12__.MIME_TYPES.excalidrawlib || ((_b = file === null || file === void 0 ? void 0 : file.name) === null || _b === void 0 ? void 0 : _b.endsWith(\\\".excalidrawlib\\\"))) {\\r\\n _this13.library.importLibrary(file).then(function () {\\r\\n // Close and then open to get the libraries updated\\r\\n _this13.setState({\\r\\n isLibraryOpen: false\\r\\n });\\r\\n _this13.setState({\\r\\n isLibraryOpen: true\\r\\n });\\r\\n }).catch(function (error) {\\r\\n return _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n }); // default: assume an Excalidraw file regardless of extension/MimeType\\r\\n }\\r\\n else {\\r\\n _this13.setState({\\r\\n isLoading: true\\r\\n });\\r\\n if (_data_filesystem__WEBPACK_IMPORTED_MODULE_44__.nativeFileSystemSupported) {\\r\\n try {\\r\\n // This will only work as of Chrome 86,\\r\\n // but can be safely ignored on older releases.\\r\\n const item = event.dataTransfer.items[0];\\r\\n file.handle = yield item.getAsFileSystemHandle();\\r\\n }\\r\\n catch (error) {\\r\\n console.warn(error.name, error.message);\\r\\n }\\r\\n }\\r\\n yield _this13.loadFileToCanvas(file);\\r\\n }\\r\\n });\\r\\n return function (_x13) {\\r\\n return _ref20.apply(this, arguments);\\r\\n };\\r\\n }();\\r\\n this.loadFileToCanvas = function (file) {\\r\\n (0,_data__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob)(file, _this13.state, _this13.scene.getElementsIncludingDeleted()).then(function (scene) {\\r\\n _this13.syncActionResult(_objectSpread(_objectSpread({}, scene), {}, {\\r\\n appState: _objectSpread(_objectSpread({}, scene.appState || _this13.state), {}, {\\r\\n isLoading: false\\r\\n }),\\r\\n replaceFiles: true,\\r\\n commitToHistory: true\\r\\n }));\\r\\n }).catch(function (error) {\\r\\n _this13.setState({\\r\\n isLoading: false,\\r\\n errorMessage: error.message\\r\\n });\\r\\n });\\r\\n };\\r\\n this.handleCanvasContextMenu = function (event) {\\r\\n event.preventDefault();\\r\\n const { x, y } = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)(event, _this13.state);\\r\\n const element = _this13.getElementAtPosition(x, y, {\\r\\n preferSelected: true\\r\\n });\\r\\n const type = element ? \\\"element\\\" : \\\"canvas\\\";\\r\\n const container = _this13.excalidrawContainerRef.current;\\r\\n const { top: offsetTop, left: offsetLeft } = container.getBoundingClientRect();\\r\\n const left = event.clientX - offsetLeft;\\r\\n const top = event.clientY - offsetTop;\\r\\n if (element && !_this13.state.selectedElementIds[element.id]) {\\r\\n _this13.setState({\\r\\n selectedElementIds: {\\r\\n [element.id]: true\\r\\n }\\r\\n }, function () {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n });\\r\\n }\\r\\n else {\\r\\n _this13._openContextMenu({\\r\\n top,\\r\\n left\\r\\n }, type);\\r\\n }\\r\\n };\\r\\n this.maybeDragNewGenericElement = function (pointerDownState, event) {\\r\\n var _a;\\r\\n const draggingElement = _this13.state.draggingElement;\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n if (!draggingElement) {\\r\\n return;\\r\\n }\\r\\n if (draggingElement.type === \\\"selection\\\") {\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.origin.x, pointerDownState.origin.y, pointerCoords.x, pointerCoords.y, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.x, pointerCoords.x), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.origin.y, pointerCoords.y), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event));\\r\\n }\\r\\n else {\\r\\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x, pointerCoords.y, _this13.state.gridSize);\\r\\n const image = (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isInitializedImageElement)(draggingElement) && ((_a = _this13.imageCache.get(draggingElement.fileId)) === null || _a === void 0 ? void 0 : _a.image);\\r\\n const aspectRatio = image && !(image instanceof Promise) ? image.width / image.height : null;\\r\\n (0,_element__WEBPACK_IMPORTED_MODULE_17__.dragNewElement)(draggingElement, _this13.state.elementType, pointerDownState.originInGrid.x, pointerDownState.originInGrid.y, gridX, gridY, (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.x, gridX), (0,_utils__WEBPACK_IMPORTED_MODULE_35__.distance)(pointerDownState.originInGrid.y, gridY), (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(draggingElement) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), aspectRatio);\\r\\n _this13.maybeSuggestBindingForAll([draggingElement]);\\r\\n }\\r\\n };\\r\\n this.maybeHandleResize = function (pointerDownState, event) {\\r\\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_31__.getSelectedElements)(_this13.scene.getElements(), _this13.state);\\r\\n const transformHandleType = pointerDownState.resize.handleType;\\r\\n _this13.setState({\\r\\n // TODO: rename this state field to \\\"isScaling\\\" to distinguish\\r\\n // it from the generic \\\"isResizing\\\" which includes scaling and\\r\\n // rotating\\r\\n isResizing: transformHandleType && transformHandleType !== \\\"rotation\\\",\\r\\n isRotating: transformHandleType === \\\"rotation\\\"\\r\\n });\\r\\n const pointerCoords = pointerDownState.lastCoords;\\r\\n const [resizeX, resizeY] = (0,_math__WEBPACK_IMPORTED_MODULE_28__.getGridPoint)(pointerCoords.x - pointerDownState.resize.offset.x, pointerCoords.y - pointerDownState.resize.offset.y, _this13.state.gridSize);\\r\\n if ((0,_element__WEBPACK_IMPORTED_MODULE_17__.transformElements)(pointerDownState, transformHandleType, selectedElements, pointerDownState.resize.arrowDirection, (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldRotateWithDiscreteAngle)(event), (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldResizeFromCenter)(event), selectedElements.length === 1 && (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_22__.isImageElement)(selectedElements[0]) ? !(0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event) : (0,_keys__WEBPACK_IMPORTED_MODULE_27__.shouldMaintainAspectRatio)(event), resizeX, resizeY, pointerDownState.resize.center.x, pointerDownState.resize.center.y)) {\\r\\n _this13.maybeSuggestBindingForAll(selectedElements);\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n this._openContextMenu = function (_ref21, type) {\\r\\n let { left, top } = _ref21;\\r\\n const maybeGroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeUngroupAction = _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipHorizontal = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const maybeFlipVertical = _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical.contextItemPredicate(_this13.actionManager.getElementsIncludingDeleted(), _this13.actionManager.getAppState());\\r\\n const separator = \\\"separator\\\";\\r\\n const elements = _this13.scene.getElements();\\r\\n const options = [];\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng);\\r\\n }\\r\\n if (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) {\\r\\n options.push(_actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg);\\r\\n }\\r\\n if (type === \\\"canvas\\\") {\\r\\n const viewModeOptions = [...options, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats];\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: viewModeOptions,\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && navigator.clipboard && separator, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsPng, _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0 && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyAsSvg, (_clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardBlob && elements.length > 0 || _clipboard__WEBPACK_IMPORTED_MODULE_11__.probablySupportsClipboardWriteText && elements.length > 0) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSelectAll, separator, typeof _this13.props.gridModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleGridMode, typeof _this13.props.zenModeEnabled === \\\"undefined\\\" && _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleZenMode, typeof _this13.props.viewModeEnabled === \\\"undefined\\\" && _actions_actionToggleViewMode__WEBPACK_IMPORTED_MODULE_40__.actionToggleViewMode, _actions__WEBPACK_IMPORTED_MODULE_5__.actionToggleStats],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n }\\r\\n else if (type === \\\"element\\\") {\\r\\n if (_this13.state.viewModeEnabled) {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, ...options],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n else {\\r\\n _ContextMenu__WEBPACK_IMPORTED_MODULE_36__[\\\"default\\\"].push({\\r\\n options: [_this13.isMobile && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCut, _this13.isMobile && navigator.clipboard && _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopy, _this13.isMobile && navigator.clipboard && {\\r\\n name: \\\"paste\\\",\\r\\n perform: function (elements, appStates) {\\r\\n _this13.pasteFromClipboard(null);\\r\\n return {\\r\\n commitToHistory: false\\r\\n };\\r\\n },\\r\\n contextItemLabel: \\\"labels.paste\\\"\\r\\n }, _this13.isMobile && separator, ...options, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionCopyStyles, _actions__WEBPACK_IMPORTED_MODULE_5__.actionPasteStyles, separator, maybeGroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionGroup, maybeUngroupAction && _actions__WEBPACK_IMPORTED_MODULE_5__.actionUngroup, (maybeGroupAction || maybeUngroupAction) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionAddToLibrary, separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendBackward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringForward, _actions__WEBPACK_IMPORTED_MODULE_5__.actionSendToBack, _actions__WEBPACK_IMPORTED_MODULE_5__.actionBringToFront, separator, maybeFlipHorizontal && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipHorizontal, maybeFlipVertical && _actions__WEBPACK_IMPORTED_MODULE_5__.actionFlipVertical, (maybeFlipHorizontal || maybeFlipVertical) && separator, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDuplicateSelection, _actions__WEBPACK_IMPORTED_MODULE_5__.actionDeleteSelected],\\r\\n top,\\r\\n left,\\r\\n actionManager: _this13.actionManager,\\r\\n appState: _this13.state,\\r\\n container: _this13.excalidrawContainerRef.current\\r\\n });\\r\\n }\\r\\n }\\r\\n };\\r\\n this.handleWheel = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.withBatchedUpdates)(function (event) {\\r\\n event.preventDefault();\\r\\n if (isPanning) {\\r\\n return;\\r\\n }\\r\\n const { deltaX, deltaY } = event;\\r\\n const { selectedElementIds, previousSelectedElementIds } = _this13.state; // note that event.ctrlKey is necessary to handle pinch zooming\\r\\n if (event.metaKey || event.ctrlKey) {\\r\\n const sign = Math.sign(deltaY);\\r\\n const MAX_STEP = 10;\\r\\n let delta = Math.abs(deltaY);\\r\\n if (delta > MAX_STEP) {\\r\\n delta = MAX_STEP;\\r\\n }\\r\\n delta *= sign;\\r\\n if (Object.keys(previousSelectedElementIds).length !== 0) {\\r\\n setTimeout(function () {\\r\\n _this13.setState({\\r\\n selectedElementIds: previousSelectedElementIds,\\r\\n previousSelectedElementIds: {}\\r\\n });\\r\\n }, 1000);\\r\\n }\\r\\n let newZoom = _this13.state.zoom.value - delta / 100; // increase zoom steps the more zoomed-in we are (applies to >100% only)\\r\\n newZoom += Math.log10(Math.max(1, _this13.state.zoom.value)) * -sign; // round to nearest step\\r\\n newZoom = Math.round(newZoom * _constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100) / (_constants__WEBPACK_IMPORTED_MODULE_12__.ZOOM_STEP * 100);\\r\\n _this13.setState(function (_ref22) {\\r\\n let { zoom, offsetLeft, offsetTop } = _ref22;\\r\\n return {\\r\\n zoom: (0,_scene_zoom__WEBPACK_IMPORTED_MODULE_33__.getNewZoom)((0,_scene__WEBPACK_IMPORTED_MODULE_31__.getNormalizedZoom)(newZoom), zoom, {\\r\\n left: offsetLeft,\\r\\n top: offsetTop\\r\\n }, {\\r\\n x: cursorX,\\r\\n y: cursorY\\r\\n }),\\r\\n selectedElementIds: {},\\r\\n previousSelectedElementIds: Object.keys(selectedElementIds).length !== 0 ? selectedElementIds : previousSelectedElementIds,\\r\\n shouldCacheIgnoreZoom: true\\r\\n };\\r\\n });\\r\\n _this13.resetShouldCacheIgnoreZoomDebounced();\\r\\n return;\\r\\n } // scroll horizontally when shift pressed\\r\\n if (event.shiftKey) {\\r\\n _this13.setState(function (_ref23) {\\r\\n let { zoom, scrollX } = _ref23;\\r\\n return {\\r\\n // on Mac, shift+wheel tends to result in deltaX\\r\\n scrollX: scrollX - (deltaY || deltaX) / zoom.value\\r\\n };\\r\\n });\\r\\n return;\\r\\n }\\r\\n _this13.setState(function (_ref24) {\\r\\n let { zoom, scrollX, scrollY } = _ref24;\\r\\n return {\\r\\n scrollX: scrollX - deltaX / zoom.value,\\r\\n scrollY: scrollY - deltaY / zoom.value\\r\\n };\\r\\n });\\r\\n });\\r\\n this.savePointer = function (x, y, button) {\\r\\n var _a, _b;\\r\\n if (!x || !y) {\\r\\n return;\\r\\n }\\r\\n const pointer = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.viewportCoordsToSceneCoords)({\\r\\n clientX: x,\\r\\n clientY: y\\r\\n }, _this13.state);\\r\\n if (isNaN(pointer.x) || isNaN(pointer.y)) { // sometimes the pointer goes off screen\\r\\n }\\r\\n (_b = (_a = _this13.props).onPointerUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, {\\r\\n pointer,\\r\\n button,\\r\\n pointersMap: gesture.pointers\\r\\n });\\r\\n };\\r\\n this.resetShouldCacheIgnoreZoomDebounced = (0,_utils__WEBPACK_IMPORTED_MODULE_35__.debounce)(function () {\\r\\n if (!_this13.unmounted) {\\r\\n _this13.setState({\\r\\n shouldCacheIgnoreZoom: false\\r\\n });\\r\\n }\\r\\n }, 300);\\r\\n this.updateDOMRect = function (cb) {\\r\\n var _a;\\r\\n if ((_a = _this13.excalidrawContainerRef) === null || _a === void 0 ? void 0 : _a.current) {\\r\\n const excalidrawContainer = _this13.excalidrawContainerRef.current;\\r\\n const { width, height, left: offsetLeft, top: offsetTop } = excalidrawContainer.getBoundingClientRect();\\r\\n const { width: currentWidth, height: currentHeight, offsetTop: currentOffsetTop, offsetLeft: currentOffsetLeft } = _this13.state;\\r\\n if (width === currentWidth && height === currentHeight && offsetLeft === currentOffsetLeft && offsetTop === currentOffsetTop) {\\r\\n if (cb) {\\r\\n cb();\\r\\n }\\r\\n return;\\r\\n }\\r\\n _this13.setState({\\r\\n width,\\r\\n height,\\r\\n offsetLeft,\\r\\n offsetTop\\r\\n }, function () {\\r\\n cb && cb();\\r\\n });\\r\\n }\\r\\n };\\r\\n this.refresh = function () {\\r\\n _this13.setState(_objectSpread({}, _this13.getCanvasOffsets()));\\r\\n };\\r\\n};\\r\\nif (\\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.TEST || \\\"development\\\" === _constants__WEBPACK_IMPORTED_MODULE_12__.ENV.DEVELOPMENT) {\\r\\n window.h = window.h || {};\\r\\n Object.defineProperties(window.h, {\\r\\n elements: {\\r\\n configurable: true,\\r\\n get() {\\r\\n return this.app.scene.getElementsIncludingDeleted();\\r\\n },\\r\\n set(elements) {\\r\\n return this.app.scene.replaceAllElements(elements);\\r\\n }\\r\\n }\\r\\n });\\r\\n}\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (App);\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LE9BQU8sQ0FBQyxRQUFRLENBQUM7Z0JBQ2YsS0FBSztnQkFDTCxNQUFNO2dCQUNOLFVBQVU7Z0JBQ1YsU0FBUzthQUNWLEVBQUU7Z0JBQ0QsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ2IsQ0FBQyxDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxPQUFPLEdBQUc7UUFDYixPQUFPLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUMsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLElBQUksYUFBb0IsS0FBSyxpREFBUSxJQUFJLGFBQW9CLEtBQUssd0RBQWUsRUFBRTtJQUNqRixNQUFNLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO1FBQ2hDLFFBQVEsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBRWxCLEdBQUc7Z0JBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1lBQ3RELENBQUM7WUFFRCxHQUFHLENBQUMsUUFBUTtnQkFDVixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JELENBQUM7U0FFRjtLQUNGLENBQUMsQ0FBQztDQUNKO0FBRUQsaUVBQWUsR0FBRyxFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQXBwLnRzeD8zOGU2Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfYXN5bmNUb0dlbmVyYXRvciBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9hc3luY1RvR2VuZXJhdG9yXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgbmFub2lkIH0gZnJvbSBcIm5hbm9pZFwiO1xuaW1wb3J0IHsgYWN0aW9uQWRkVG9MaWJyYXJ5LCBhY3Rpb25CcmluZ0ZvcndhcmQsIGFjdGlvbkJyaW5nVG9Gcm9udCwgYWN0aW9uQ29weSwgYWN0aW9uQ29weUFzUG5nLCBhY3Rpb25Db3B5QXNTdmcsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvbkN1dCwgYWN0aW9uRGVsZXRlU2VsZWN0ZWQsIGFjdGlvbkR1cGxpY2F0ZVNlbGVjdGlvbiwgYWN0aW9uRmluYWxpemUsIGFjdGlvbkZsaXBIb3Jpem9udGFsLCBhY3Rpb25GbGlwVmVydGljYWwsIGFjdGlvbkdyb3VwLCBhY3Rpb25QYXN0ZVN0eWxlcywgYWN0aW9uU2VsZWN0QWxsLCBhY3Rpb25TZW5kQmFja3dhcmQsIGFjdGlvblNlbmRUb0JhY2ssIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCBhY3Rpb25Ub2dnbGVTdGF0cywgYWN0aW9uVG9nZ2xlWmVuTW9kZSwgYWN0aW9uVW5ncm91cCwgem9vbVRvRml0RWxlbWVudHMgfSBmcm9tIFwiLi4vYWN0aW9uc1wiO1xuaW1wb3J0IHsgY3JlYXRlUmVkb0FjdGlvbiwgY3JlYXRlVW5kb0FjdGlvbiB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkhpc3RvcnlcIjtcbmltcG9ydCB7IEFjdGlvbk1hbmFnZXIgfSBmcm9tIFwiLi4vYWN0aW9ucy9tYW5hZ2VyXCI7XG5pbXBvcnQgeyBhY3Rpb25zIH0gZnJvbSBcIi4uL2FjdGlvbnMvcmVnaXN0ZXJcIjtcbmltcG9ydCB7IHRyYWNrRXZlbnQgfSBmcm9tIFwiLi4vYW5hbHl0aWNzXCI7XG5pbXBvcnQgeyBnZXREZWZhdWx0QXBwU3RhdGUgfSBmcm9tIFwiLi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IGNvcHlUb0NsaXBib2FyZCwgcGFyc2VDbGlwYm9hcmQsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRCbG9iLCBwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkV3JpdGVUZXh0IH0gZnJvbSBcIi4uL2NsaXBib2FyZFwiO1xuaW1wb3J0IHsgQVBQX05BTUUsIENVUlNPUl9UWVBFLCBERUZBVUxUX01BWF9JTUFHRV9XSURUSF9PUl9IRUlHSFQsIERFRkFVTFRfVUlfT1BUSU9OUywgREVGQVVMVF9WRVJUSUNBTF9BTElHTiwgRFJBR0dJTkdfVEhSRVNIT0xELCBFTEVNRU5UX1NISUZUX1RSQU5TTEFURV9BTU9VTlQsIEVMRU1FTlRfVFJBTlNMQVRFX0FNT1VOVCwgRU5WLCBFVkVOVCwgR1JJRF9TSVpFLCBJTUFHRV9SRU5ERVJfVElNRU9VVCwgTElORV9DT05GSVJNX1RIUkVTSE9MRCwgTUFYX0FMTE9XRURfRklMRV9CWVRFUywgTUlNRV9UWVBFUywgTVFfTUFYX0hFSUdIVF9MQU5EU0NBUEUsIE1RX01BWF9XSURUSF9MQU5EU0NBUEUsIE1RX01BWF9XSURUSF9QT1JUUkFJVCwgUE9JTlRFUl9CVVRUT04sIFNDUk9MTF9USU1FT1VULCBUQVBfVFdJQ0VfVElNRU9VVCwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQsIFRIRU1FLCBUT1VDSF9DVFhfTUVOVV9USU1FT1VULCBVUkxfSEFTSF9LRVlTLCBVUkxfUVVFUllfS0VZUywgWk9PTV9TVEVQIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbG9hZEZyb21CbG9iIH0gZnJvbSBcIi4uL2RhdGFcIjtcbmltcG9ydCB7IGlzVmFsaWRMaWJyYXJ5IH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IExpYnJhcnkgZnJvbSBcIi4uL2RhdGEvbGlicmFyeVwiO1xuaW1wb3J0IHsgcmVzdG9yZSwgcmVzdG9yZUVsZW1lbnRzLCByZXN0b3JlTGlicmFyeUl0ZW1zIH0gZnJvbSBcIi4uL2RhdGEvcmVzdG9yZVwiO1xuaW1wb3J0IHsgZHJhZ05ld0VsZW1lbnQsIGRyYWdTZWxlY3RlZEVsZW1lbnRzLCBkdXBsaWNhdGVFbGVtZW50LCBnZXRDb21tb25Cb3VuZHMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCwgZ2V0RHJhZ09mZnNldFhZLCBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUsIGdldE5vcm1hbGl6ZWREaW1lbnNpb25zLCBnZXRQZXJmZWN0RWxlbWVudFNpemUsIGdldFJlc2l6ZUFycm93RGlyZWN0aW9uLCBnZXRSZXNpemVPZmZzZXRYWSwgZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMsIGhpdFRlc3QsIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudCwgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsIGlzTm9uRGVsZXRlZEVsZW1lbnQsIGlzVGV4dEVsZW1lbnQsIG5ld0VsZW1lbnQsIG5ld0xpbmVhckVsZW1lbnQsIG5ld1RleHRFbGVtZW50LCBuZXdJbWFnZUVsZW1lbnQsIHRleHRXeXNpd3lnLCB0cmFuc2Zvcm1FbGVtZW50cywgdXBkYXRlVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cywgZml4QmluZGluZ3NBZnRlckRlbGV0aW9uLCBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24sIGdldEVsaWdpYmxlRWxlbWVudHNGb3JCaW5kaW5nLCBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcsIGlzQmluZGluZ0VuYWJsZWQsIGlzTGluZWFyRWxlbWVudFNpbXBsZUFuZEFscmVhZHlCb3VuZCwgbWF5YmVCaW5kTGluZWFyRWxlbWVudCwgc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudCwgdW5iaW5kTGluZWFyRWxlbWVudHMsIHVwZGF0ZUJvdW5kRWxlbWVudHMgfSBmcm9tIFwiLi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4uL2VsZW1lbnQvbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgYnVtcFZlcnNpb24sIG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZGVlcENvcHlFbGVtZW50LCBuZXdGcmVlRHJhd0VsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9uZXdFbGVtZW50XCI7XG5pbXBvcnQgeyBoYXNCb3VuZFRleHRFbGVtZW50LCBpc0JpbmRpbmdFbGVtZW50LCBpc0JpbmRpbmdFbGVtZW50VHlwZSwgaXNCb3VuZFRvQ29udGFpbmVyLCBpc0ltYWdlRWxlbWVudCwgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50LCBpc0xpbmVhckVsZW1lbnRUeXBlIH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0Q2VudGVyLCBnZXREaXN0YW5jZSB9IGZyb20gXCIuLi9nZXN0dXJlXCI7XG5pbXBvcnQgeyBlZGl0R3JvdXBGb3JTZWxlY3RlZEVsZW1lbnQsIGdldEVsZW1lbnRzSW5Hcm91cCwgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudCwgZ2V0U2VsZWN0ZWRHcm91cElkcywgaXNFbGVtZW50SW5Hcm91cCwgaXNTZWxlY3RlZFZpYUdyb3VwLCBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcbmltcG9ydCB7IGRlZmF1bHRMYW5nLCBnZXRMYW5ndWFnZSwgbGFuZ3VhZ2VzLCBzZXRMYW5ndWFnZSwgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyBDT0RFUywgc2hvdWxkUmVzaXplRnJvbUNlbnRlciwgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbywgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUsIGlzQXJyb3dLZXksIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgZ2V0R3JpZFBvaW50LCBpc1BhdGhBTG9vcCwgcm90YXRlIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lIH0gZnJvbSBcIi4uL3JlbmRlcmVyXCI7XG5pbXBvcnQgeyBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50IH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGNhbGN1bGF0ZVNjcm9sbENlbnRlciwgZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbiwgZ2V0RWxlbWVudHNBdFBvc2l0aW9uLCBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbiwgZ2V0Tm9ybWFsaXplZFpvb20sIGdldFNlbGVjdGVkRWxlbWVudHMsIGhhc0JhY2tncm91bmQsIGlzT3ZlclNjcm9sbEJhcnMsIGlzU29tZUVsZW1lbnRTZWxlY3RlZCB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgZ2V0TmV3Wm9vbSB9IGZyb20gXCIuLi9zY2VuZS96b29tXCI7XG5pbXBvcnQgeyBmaW5kU2hhcGVCeUtleSB9IGZyb20gXCIuLi9zaGFwZXNcIjtcbmltcG9ydCB7IGRlYm91bmNlLCBkaXN0YW5jZSwgZ2V0Rm9udFN0cmluZywgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIsIGlzSW5wdXRMaWtlLCBpc1Rvb2xJY29uLCBpc1dyaXRhYmxlRWxlbWVudCwgcmVzZXRDdXJzb3IsIHJlc29sdmFibGVQcm9taXNlLCBzY2VuZUNvb3Jkc1RvVmlld3BvcnRDb29yZHMsIHNldEN1cnNvciwgc2V0Q3Vyc29yRm9yU2hhcGUsIHR1cGxlVG9Db29ycywgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzLCB3aXRoQmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBDb250ZXh0TWVudSBmcm9tIFwiLi9Db250ZXh0TWVudVwiO1xuaW1wb3J0IExheWVyVUkgZnJvbSBcIi4vTGF5ZXJVSVwiO1xuaW1wb3J0IHsgU3RhdHMgfSBmcm9tIFwiLi9TdGF0c1wiO1xuaW1wb3J0IHsgVG9hc3QgfSBmcm9tIFwiLi9Ub2FzdFwiO1xuaW1wb3J0IHsgYWN0aW9uVG9nZ2xlVmlld01vZGUgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Ub2dnbGVWaWV3TW9kZVwiO1xuaW1wb3J0IHsgZGF0YVVSTFRvRmlsZSwgZ2VuZXJhdGVJZEZyb21GaWxlLCBnZXREYXRhVVJMLCBpc1N1cHBvcnRlZEltYWdlRmlsZSwgcmVzaXplSW1hZ2VGaWxlLCBTVkdTdHJpbmdUb0ZpbGUgfSBmcm9tIFwiLi4vZGF0YS9ibG9iXCI7XG5pbXBvcnQgeyBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsIGxvYWRIVE1MSW1hZ2VFbGVtZW50LCBub3JtYWxpemVTVkcsIHVwZGF0ZUltYWdlQ2FjaGUgYXMgX3VwZGF0ZUltYWdlQ2FjaGUgfSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuaW1wb3J0IHRocm90dGxlIGZyb20gXCJsb2Rhc2gudGhyb3R0bGVcIjtcbmltcG9ydCB7IGZpbGVPcGVuLCBuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkIH0gZnJvbSBcIi4uL2RhdGEvZmlsZXN5c3RlbVwiO1xuaW1wb3J0IHsgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbiwgZ2V0QXBwcm94TWluTGluZUhlaWdodCwgZ2V0QXBwcm94TWluTGluZVdpZHRoLCBnZXRCb3VuZFRleHRFbGVtZW50SWQgfSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi4vZWxlbWVudC9jb2xsaXNpb25cIjtcbmltcG9ydCB7IHJlc2l6ZVNpbmdsZUVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9yZXNpemVFbGVtZW50c1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmltcG9ydCB7IGpzeHMgYXMgX2pzeHMgfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBsZXQgc2hvd0ZvdXJ0aEZvbnQgPSBmYWxzZTtcbmNvbnN0IElzTW9iaWxlQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KGZhbHNlKTtcbmV4cG9ydCBjb25zdCB1c2VJc01vYmlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoSXNNb2JpbGVDb250ZXh0KTtcbn07XG5jb25zdCBFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dCA9IC8qI19fUFVSRV9fKi9SZWFjdC5jcmVhdGVDb250ZXh0KHtcbiAgY29udGFpbmVyOiBudWxsLFxuICBpZDogbnVsbFxufSk7XG5leHBvcnQgY29uc3QgdXNlRXhjYWxpZHJhd0NvbnRhaW5lciA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHVzZUNvbnRleHQoRXhjYWxpZHJhd0NvbnRhaW5lckNvbnRleHQpO1xufTtcbmxldCBkaWRUYXBUd2ljZSA9IGZhbHNlO1xubGV0IHRhcHBlZFR3aWNlVGltZXIgPSAwO1xubGV0IGN1cnNvclggPSAwO1xubGV0IGN1cnNvclkgPSAwO1xubGV0IGlzSG9sZGluZ1NwYWNlID0gZmFsc2U7XG5sZXQgaXNQYW5uaW5nID0gZmFsc2U7XG5sZXQgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xubGV0IGN1cnJlbnRTY3JvbGxCYXJzID0ge1xuICBob3Jpem9udGFsOiBudWxsLFxuICB2ZXJ0aWNhbDogbnVsbFxufTtcbmxldCB0b3VjaFRpbWVvdXQgPSAwO1xubGV0IGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xubGV0IGxhc3RQb2ludGVyVXAgPSBudWxsO1xuY29uc3QgZ2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IG5ldyBNYXAoKSxcbiAgbGFzdENlbnRlcjogbnVsbCxcbiAgaW5pdGlhbERpc3RhbmNlOiBudWxsLFxuICBpbml0aWFsU2NhbGU6IG51bGxcbn07XG5cbmNsYXNzIEFwcCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgdmFyIF90aGlzO1xuXG4gICAgc3VwZXIocHJvcHMpO1xuICAgIF90aGlzID0gdGhpcztcblxuICAgIF9pbml0aWFsaXNlUHJvcHMuY2FsbCh0aGlzKTtcblxuICAgIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICAgIGNvbnN0IHtcbiAgICAgIGV4Y2FsaWRyYXdSZWYsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHplbk1vZGVFbmFibGVkID0gZmFsc2UsXG4gICAgICBncmlkTW9kZUVuYWJsZWQgPSBmYWxzZSxcbiAgICAgIHRoZW1lID0gZGVmYXVsdEFwcFN0YXRlLnRoZW1lLFxuICAgICAgbmFtZSA9IGRlZmF1bHRBcHBTdGF0ZS5uYW1lXG4gICAgfSA9IHByb3BzO1xuICAgIHRoaXMuc3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZGVmYXVsdEFwcFN0YXRlKSwge30sIHtcbiAgICAgIHRoZW1lLFxuICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgfSwgdGhpcy5nZXRDYW52YXNPZmZzZXRzKCkpLCB7fSwge1xuICAgICAgdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICBncmlkU2l6ZTogZ3JpZE1vZGVFbmFibGVkID8gR1JJRF9TSVpFIDogbnVsbCxcbiAgICAgIG5hbWUsXG4gICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsXG4gICAgICBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodFxuICAgIH0pO1xuICAgIHRoaXMuaWQgPSBuYW5vaWQoKTtcblxuICAgIGlmIChleGNhbGlkcmF3UmVmKSB7XG4gICAgICBjb25zdCByZWFkeVByb21pc2UgPSBcImN1cnJlbnRcIiBpbiBleGNhbGlkcmF3UmVmICYmIGV4Y2FsaWRyYXdSZWYuY3VycmVudD8ucmVhZHlQcm9taXNlIHx8IHJlc29sdmFibGVQcm9taXNlKCk7XG4gICAgICBjb25zdCBhcGkgPSB7XG4gICAgICAgIHJlYWR5OiB0cnVlLFxuICAgICAgICByZWFkeVByb21pc2UsXG4gICAgICAgIHVwZGF0ZVNjZW5lOiB0aGlzLnVwZGF0ZVNjZW5lLFxuICAgICAgICBhZGRGaWxlczogdGhpcy5hZGRGaWxlcyxcbiAgICAgICAgcmVzZXRTY2VuZTogdGhpcy5yZXNldFNjZW5lLFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZDogdGhpcy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCxcbiAgICAgICAgaGlzdG9yeToge1xuICAgICAgICAgIGNsZWFyOiB0aGlzLnJlc2V0SGlzdG9yeVxuICAgICAgICB9LFxuICAgICAgICBzY3JvbGxUb0NvbnRlbnQ6IHRoaXMuc2Nyb2xsVG9Db250ZW50LFxuICAgICAgICB6b29tVG9GaXQ6IHRoaXMuem9vbVRvRml0LFxuICAgICAgICBnZXRTY2VuZUVsZW1lbnRzOiB0aGlzLmdldFNjZW5lRWxlbWVudHMsXG4gICAgICAgIGdldEFwcFN0YXRlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzLnN0YXRlO1xuICAgICAgICB9LFxuICAgICAgICBnZXRGaWxlczogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBfdGhpcy5maWxlcztcbiAgICAgICAgfSxcbiAgICAgICAgcmVmcmVzaDogdGhpcy5yZWZyZXNoLFxuICAgICAgICBpbXBvcnRMaWJyYXJ5OiB0aGlzLmltcG9ydExpYnJhcnlGcm9tVXJsLFxuICAgICAgICBzZXRUb2FzdE1lc3NhZ2U6IHRoaXMuc2V0VG9hc3RNZXNzYWdlLFxuICAgICAgICB1cGRhdGVDb250YWluZXJTaXplOiB0aGlzLnVwZGF0ZUNvbnRhaW5lclNpemUsXG4gICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICBzZXRMb2NhbEZvbnQ6IHRoaXMuc2V0TG9jYWxGb250XG4gICAgICB9O1xuXG4gICAgICBpZiAodHlwZW9mIGV4Y2FsaWRyYXdSZWYgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICBleGNhbGlkcmF3UmVmKGFwaSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBleGNhbGlkcmF3UmVmLmN1cnJlbnQgPSBhcGk7XG4gICAgICB9XG5cbiAgICAgIHJlYWR5UHJvbWlzZS5yZXNvbHZlKGFwaSk7XG4gICAgfVxuXG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUgPSB7XG4gICAgICBjb250YWluZXI6IHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50LFxuICAgICAgaWQ6IHRoaXMuaWRcbiAgICB9O1xuICAgIHRoaXMuc2NlbmUgPSBuZXcgU2NlbmUoKTtcbiAgICB0aGlzLmxpYnJhcnkgPSBuZXcgTGlicmFyeSh0aGlzKTtcbiAgICB0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSgpO1xuICAgIHRoaXMuYWN0aW9uTWFuYWdlciA9IG5ldyBBY3Rpb25NYW5hZ2VyKHRoaXMuc3luY0FjdGlvblJlc3VsdCwgZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF90aGlzLnN0YXRlO1xuICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKTtcbiAgICB9LCB0aGlzKTtcbiAgICB0aGlzLmFjdGlvbk1hbmFnZXIucmVnaXN0ZXJBbGwoYWN0aW9ucyk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVVuZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gICAgdGhpcy5hY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyQWN0aW9uKGNyZWF0ZVJlZG9BY3Rpb24odGhpcy5oaXN0b3J5KSk7XG4gIH1cblxuICByZW5kZXJDYW52YXMoKSB7XG4gICAgY29uc3QgY2FudmFzU2NhbGUgPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICBjb25zdCB7XG4gICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICBoZWlnaHQ6IGNhbnZhc0RPTUhlaWdodCxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZFxuICAgIH0gPSB0aGlzLnN0YXRlO1xuICAgIGNvbnN0IGNhbnZhc1dpZHRoID0gY2FudmFzRE9NV2lkdGggKiBjYW52YXNTY2FsZTtcbiAgICBjb25zdCBjYW52YXNIZWlnaHQgPSBjYW52YXNET01IZWlnaHQgKiBjYW52YXNTY2FsZTtcblxuICAgIGlmICh2aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImNhbnZhc1wiLCB7XG4gICAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3X19jYW52YXNcIixcbiAgICAgICAgc3R5bGU6IHtcbiAgICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBjYW52YXNET01IZWlnaHQsXG4gICAgICAgICAgY3Vyc29yOiBDVVJTT1JfVFlQRS5HUkFCXG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiBjYW52YXNXaWR0aCxcbiAgICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICAgIHJlZjogdGhpcy5oYW5kbGVDYW52YXNSZWYsXG4gICAgICAgIG9uQ29udGV4dE1lbnU6IHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUsXG4gICAgICAgIG9uUG9pbnRlck1vdmU6IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUsXG4gICAgICAgIG9uUG9pbnRlclVwOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICAgIG9uUG9pbnRlckNhbmNlbDogdGhpcy5yZW1vdmVQb2ludGVyLFxuICAgICAgICBvblRvdWNoTW92ZTogdGhpcy5oYW5kbGVUb3VjaE1vdmUsXG4gICAgICAgIG9uUG9pbnRlckRvd246IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd24sXG4gICAgICAgIGNoaWxkcmVuOiB0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIilcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImNhbnZhc1wiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiZXhjYWxpZHJhd19fY2FudmFzXCIsXG4gICAgICBzdHlsZToge1xuICAgICAgICB3aWR0aDogY2FudmFzRE9NV2lkdGgsXG4gICAgICAgIGhlaWdodDogY2FudmFzRE9NSGVpZ2h0XG4gICAgICB9LFxuICAgICAgd2lkdGg6IGNhbnZhc1dpZHRoLFxuICAgICAgaGVpZ2h0OiBjYW52YXNIZWlnaHQsXG4gICAgICByZWY6IHRoaXMuaGFuZGxlQ2FudmFzUmVmLFxuICAgICAgb25Db250ZXh0TWVudTogdGhpcy5oYW5kbGVDYW52YXNDb250ZXh0TWVudSxcbiAgICAgIG9uUG9pbnRlckRvd246IHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlckRvd24sXG4gICAgICBvbkRvdWJsZUNsaWNrOiB0aGlzLmhhbmRsZUNhbnZhc0RvdWJsZUNsaWNrLFxuICAgICAgb25Qb2ludGVyTW92ZTogdGhpcy5oYW5kbGVDYW52YXNQb2ludGVyTW92ZSxcbiAgICAgIG9uUG9pbnRlclVwOiB0aGlzLnJlbW92ZVBvaW50ZXIsXG4gICAgICBvblBvaW50ZXJDYW5jZWw6IHRoaXMucmVtb3ZlUG9pbnRlcixcbiAgICAgIG9uVG91Y2hNb3ZlOiB0aGlzLmhhbmRsZVRvdWNoTW92ZSxcbiAgICAgIGNoaWxkcmVuOiB0KFwibGFiZWxzLmRyYXdpbmdDYW52YXNcIilcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICB2YXIgX3RoaXMyID0gdGhpcztcblxuICAgIGNvbnN0IHtcbiAgICAgIHplbk1vZGVFbmFibGVkLFxuICAgICAgdmlld01vZGVFbmFibGVkXG4gICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3Qge1xuICAgICAgb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXIsXG4gICAgICByZW5kZXJDdXN0b21TdGF0c1xuICAgIH0gPSB0aGlzLnByb3BzO1xuICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICBjbGFzc05hbWU6IGNsc3goXCJleGNhbGlkcmF3IGV4Y2FsaWRyYXctY29udGFpbmVyXCIsIHtcbiAgICAgICAgXCJleGNhbGlkcmF3LS12aWV3LW1vZGVcIjogdmlld01vZGVFbmFibGVkLFxuICAgICAgICBcImV4Y2FsaWRyYXctLW1vYmlsZVwiOiB0aGlzLmlzTW9iaWxlXG4gICAgICB9KSxcbiAgICAgIHJlZjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLFxuICAgICAgb25Ecm9wOiB0aGlzLmhhbmRsZUFwcE9uRHJvcCxcbiAgICAgIHRhYkluZGV4OiAwLFxuICAgICAgb25LZXlEb3duOiB0aGlzLnByb3BzLmhhbmRsZUtleWJvYXJkR2xvYmFsbHkgPyB1bmRlZmluZWQgOiB0aGlzLm9uS2V5RG93bixcbiAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChFeGNhbGlkcmF3Q29udGFpbmVyQ29udGV4dC5Qcm92aWRlciwge1xuICAgICAgICB2YWx1ZTogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUsXG4gICAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeHMoSXNNb2JpbGVDb250ZXh0LlByb3ZpZGVyLCB7XG4gICAgICAgICAgdmFsdWU6IHRoaXMuaXNNb2JpbGUsXG4gICAgICAgICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChMYXllclVJLCB7XG4gICAgICAgICAgICBjYW52YXM6IHRoaXMuY2FudmFzLFxuICAgICAgICAgICAgYXBwU3RhdGU6IHRoaXMuc3RhdGUsXG4gICAgICAgICAgICBmaWxlczogdGhpcy5maWxlcyxcbiAgICAgICAgICAgIHNldEFwcFN0YXRlOiB0aGlzLnNldEFwcFN0YXRlLFxuICAgICAgICAgICAgYWN0aW9uTWFuYWdlcjogdGhpcy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgICAgZWxlbWVudHM6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSxcbiAgICAgICAgICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2s6IG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgICAgICAgICBvbkxvY2tUb2dnbGU6IHRoaXMudG9nZ2xlTG9jayxcbiAgICAgICAgICAgIG9uSW5zZXJ0RWxlbWVudHM6IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMyLmFkZEVsZW1lbnRzRnJvbVBhc3RlT3JMaWJyYXJ5KHtcbiAgICAgICAgICAgICAgICBlbGVtZW50cyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogXCJjZW50ZXJcIixcbiAgICAgICAgICAgICAgICBmaWxlczogbnVsbFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB6ZW5Nb2RlRW5hYmxlZDogemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICB0b2dnbGVaZW5Nb2RlOiB0aGlzLnRvZ2dsZVplbk1vZGUsXG4gICAgICAgICAgICBsYW5nQ29kZTogZ2V0TGFuZ3VhZ2UoKS5jb2RlLFxuICAgICAgICAgICAgaXNDb2xsYWJvcmF0aW5nOiB0aGlzLnByb3BzLmlzQ29sbGFib3JhdGluZyxcbiAgICAgICAgICAgIHJlbmRlclRvcFJpZ2h0VUk6IHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICAgICAgICByZW5kZXJDdXN0b21Gb290ZXI6IHJlbmRlckZvb3RlcixcbiAgICAgICAgICAgIHZpZXdNb2RlRW5hYmxlZDogdmlld01vZGVFbmFibGVkLFxuICAgICAgICAgICAgc2hvd0V4aXRaZW5Nb2RlQnRuOiB0eXBlb2YgdGhpcy5wcm9wcz8uemVuTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgICBzaG93VGhlbWVCdG46IHR5cGVvZiB0aGlzLnByb3BzPy50aGVtZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0aGlzLnByb3BzLlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLnRoZW1lLFxuICAgICAgICAgICAgbGlicmFyeVJldHVyblVybDogdGhpcy5wcm9wcy5saWJyYXJ5UmV0dXJuVXJsLFxuICAgICAgICAgICAgVUlPcHRpb25zOiB0aGlzLnByb3BzLlVJT3B0aW9ucyxcbiAgICAgICAgICAgIGZvY3VzQ29udGFpbmVyOiB0aGlzLmZvY3VzQ29udGFpbmVyLFxuICAgICAgICAgICAgbGlicmFyeTogdGhpcy5saWJyYXJ5LFxuICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICBvbkltYWdlQWN0aW9uOiB0aGlzLm9uSW1hZ2VBY3Rpb25cbiAgICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiXG4gICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgICAgIGNsYXNzTmFtZTogXCJleGNhbGlkcmF3LWNvbnRleHRNZW51Q29udGFpbmVyXCJcbiAgICAgICAgICB9KSwgdGhpcy5zdGF0ZS5zaG93U3RhdHMgJiYgLyojX19QVVJFX18qL19qc3goU3RhdHMsIHtcbiAgICAgICAgICAgIGFwcFN0YXRlOiB0aGlzLnN0YXRlLFxuICAgICAgICAgICAgc2V0QXBwU3RhdGU6IHRoaXMuc2V0QXBwU3RhdGUsXG4gICAgICAgICAgICBlbGVtZW50czogdGhpcy5zY2VuZS5nZXRFbGVtZW50cygpLFxuICAgICAgICAgICAgb25DbG9zZTogdGhpcy50b2dnbGVTdGF0cyxcbiAgICAgICAgICAgIHJlbmRlckN1c3RvbVN0YXRzOiByZW5kZXJDdXN0b21TdGF0c1xuICAgICAgICAgIH0pLCB0aGlzLnN0YXRlLnRvYXN0TWVzc2FnZSAhPT0gbnVsbCAmJiAvKiNfX1BVUkVfXyovX2pzeChUb2FzdCwge1xuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5zdGF0ZS50b2FzdE1lc3NhZ2UsXG4gICAgICAgICAgICBjbGVhclRvYXN0OiB0aGlzLmNsZWFyVG9hc3RcbiAgICAgICAgICB9KSwgLyojX19QVVJFX18qL19qc3goXCJtYWluXCIsIHtcbiAgICAgICAgICAgIGNoaWxkcmVuOiB0aGlzLnJlbmRlckNhbnZhcygpXG4gICAgICAgICAgfSldXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICByZXR1cm4gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICAgIF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyVmFsdWUuY29udGFpbmVyID0gX3RoaXMzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcblxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UKSB7XG4gICAgICAgIGNvbnN0IHNldFN0YXRlID0gX3RoaXMzLnNldFN0YXRlLmJpbmQoX3RoaXMzKTtcblxuICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh3aW5kb3cuaCwge1xuICAgICAgICAgIHN0YXRlOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF90aGlzMy5zdGF0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIHNldFN0YXRlOiB7XG4gICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gX3RoaXMzLnNldFN0YXRlKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICBhcHA6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfdGhpczNcbiAgICAgICAgICB9LFxuICAgICAgICAgIGhpc3Rvcnk6IHtcbiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgIHZhbHVlOiBfdGhpczMuaGlzdG9yeVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMy5zY2VuZS5hZGRDYWxsYmFjayhfdGhpczMub25TY2VuZVVwZGF0ZWQpO1xuXG4gICAgICBfdGhpczMuYWRkRXZlbnRMaXN0ZW5lcnMoKTtcblxuICAgICAgaWYgKF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgICAgX3RoaXMzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93ICYmIF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmPy5jdXJyZW50KSB7XG4gICAgICAgIF90aGlzMy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gY29tcHV0ZSBpc01vYmlsZSBzdGF0ZVxuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0XG4gICAgICAgICAgfSA9IF90aGlzMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgICBfdGhpczMuaXNNb2JpbGUgPSB3aWR0aCA8IE1RX01BWF9XSURUSF9QT1JUUkFJVCB8fCBoZWlnaHQgPCBNUV9NQVhfSEVJR0hUX0xBTkRTQ0FQRSAmJiB3aWR0aCA8IE1RX01BWF9XSURUSF9MQU5EU0NBUEU7IC8vIHJlZnJlc2ggb2Zmc2V0c1xuICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgICAgICAgX3RoaXMzLnVwZGF0ZURPTVJlY3QoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIF90aGlzMy5yZXNpemVPYnNlcnZlcj8ub2JzZXJ2ZShfdGhpczMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICAgIH0gZWxzZSBpZiAod2luZG93Lm1hdGNoTWVkaWEpIHtcbiAgICAgICAgY29uc3QgbWVkaWFRdWVyeSA9IHdpbmRvdy5tYXRjaE1lZGlhKGAobWF4LXdpZHRoOiAke01RX01BWF9XSURUSF9QT1JUUkFJVH1weCksIChtYXgtaGVpZ2h0OiAke01RX01BWF9IRUlHSFRfTEFORFNDQVBFfXB4KSBhbmQgKG1heC13aWR0aDogJHtNUV9NQVhfV0lEVEhfTEFORFNDQVBFfXB4KWApO1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMy5pc01vYmlsZSA9IG1lZGlhUXVlcnkubWF0Y2hlcztcbiAgICAgICAgfTtcblxuICAgICAgICBtZWRpYVF1ZXJ5LmFkZExpc3RlbmVyKGhhbmRsZXIpO1xuXG4gICAgICAgIF90aGlzMy5kZXRhY2hJc01vYmlsZU1xSGFuZGxlciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gbWVkaWFRdWVyeS5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTtcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoLnNsaWNlKDEpKTtcblxuICAgICAgaWYgKHNlYXJjaFBhcmFtcy5oYXMoXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpKSB7XG4gICAgICAgIC8vIE9idGFpbiBhIGZpbGUgdGhhdCB3YXMgc2hhcmVkIHZpYSB0aGUgV2ViIFNoYXJlIFRhcmdldCBBUEkuXG4gICAgICAgIF90aGlzMy5yZXN0b3JlRmlsZUZyb21TaGFyZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMzLnVwZGF0ZURPTVJlY3QoX3RoaXMzLmluaXRpYWxpemVTY2VuZSk7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICB0aGlzLmltYWdlQ2FjaGUuY2xlYXIoKTtcbiAgICB0aGlzLnJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICBjbGVhclRpbWVvdXQodG91Y2hUaW1lb3V0KTtcbiAgICB0b3VjaFRpbWVvdXQgPSAwO1xuICB9XG5cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCB0aGlzLnJlbW92ZVBvaW50ZXIpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuQ09QWSwgdGhpcy5vbkNvcHkpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHRoaXMucGFzdGVGcm9tQ2xpcGJvYXJkKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkNVVCwgdGhpcy5vbkN1dCk7XG4gICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lcj8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5TQ1JPTEwsIHRoaXMub25TY3JvbGwpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULk1PVVNFX01PVkUsIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgdGhpcy5vbktleVVwKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5SRVNJWkUsIHRoaXMub25SZXNpemUsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5VTkxPQUQsIHRoaXMub25VbmxvYWQsIGZhbHNlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0aGlzLm9uQmx1ciwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkRSQUdfT1ZFUiwgdGhpcy5kaXNhYmxlRXZlbnQsIGZhbHNlKTtcbiAgICB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudD8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5EUk9QLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9TVEFSVCwgdGhpcy5vbkdlc3R1cmVTdGFydCwgZmFsc2UpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuR0VTVFVSRV9DSEFOR0UsIHRoaXMub25HZXN0dXJlQ2hhbmdlLCBmYWxzZSk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0VORCwgdGhpcy5vbkdlc3R1cmVFbmQsIGZhbHNlKTtcbiAgICB0aGlzLmRldGFjaElzTW9iaWxlTXFIYW5kbGVyPy4oKTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXJzKCkge1xuICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRoaXMucmVtb3ZlUG9pbnRlcik7IC8vICMzNTUzXG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkNPUFksIHRoaXMub25Db3B5KTtcblxuICAgIGlmICh0aGlzLnByb3BzLmhhbmRsZUtleWJvYXJkR2xvYmFsbHkpIHtcbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgdGhpcy5vbktleURvd24sIGZhbHNlKTtcbiAgICB9XG5cbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCB0aGlzLm9uS2V5VXAsIHtcbiAgICAgIHBhc3NpdmU6IHRydWVcbiAgICB9KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULk1PVVNFX01PVkUsIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uKTsgLy8gcmVyZW5kZXIgdGV4dCBlbGVtZW50cyBvbiBmb250IGxvYWQgdG8gZml4ICM2MzcgJiYgIzE1NTNcblxuICAgIGRvY3VtZW50LmZvbnRzPy5hZGRFdmVudExpc3RlbmVyPy4oXCJsb2FkaW5nZG9uZVwiLCB0aGlzLm9uRm9udExvYWRlZCk7IC8vIFNhZmFyaS1vbmx5IGRlc2t0b3AgcGluY2ggem9vbVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX1NUQVJULCB0aGlzLm9uR2VzdHVyZVN0YXJ0LCBmYWxzZSk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5HRVNUVVJFX0NIQU5HRSwgdGhpcy5vbkdlc3R1cmVDaGFuZ2UsIGZhbHNlKTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkdFU1RVUkVfRU5ELCB0aGlzLm9uR2VzdHVyZUVuZCwgZmFsc2UpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QQVNURSwgdGhpcy5wYXN0ZUZyb21DbGlwYm9hcmQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuQ1VULCB0aGlzLm9uQ3V0KTtcblxuICAgIGlmICh0aGlzLnByb3BzLmRldGVjdFNjcm9sbCkge1xuICAgICAgdGhpcy5uZWFyZXN0U2Nyb2xsYWJsZUNvbnRhaW5lciA9IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyKHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50KTtcbiAgICAgIHRoaXMubmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5TQ1JPTEwsIHRoaXMub25TY3JvbGwpO1xuICAgIH1cblxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlJFU0laRSwgdGhpcy5vblJlc2l6ZSwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlVOTE9BRCwgdGhpcy5vblVubG9hZCwgZmFsc2UpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRoaXMub25CbHVyLCBmYWxzZSk7XG4gICAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuRFJBR19PVkVSLCB0aGlzLmRpc2FibGVFdmVudCwgZmFsc2UpO1xuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5hZGRFdmVudExpc3RlbmVyKEVWRU5ULkRST1AsIHRoaXMuZGlzYWJsZUV2ZW50LCBmYWxzZSk7XG4gIH1cblxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzLCBwcmV2U3RhdGUpIHtcbiAgICB2YXIgX3RoaXM0ID0gdGhpcztcblxuICAgIGlmIChwcmV2UHJvcHMubGFuZ0NvZGUgIT09IHRoaXMucHJvcHMubGFuZ0NvZGUpIHtcbiAgICAgIHRoaXMudXBkYXRlTGFuZ3VhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLnZpZXdNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICB2aWV3TW9kZUVuYWJsZWQ6ICEhdGhpcy5wcm9wcy52aWV3TW9kZUVuYWJsZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2U3RhdGUudmlld01vZGVFbmFibGVkICE9PSB0aGlzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVycygpO1xuICAgICAgdGhpcy5kZXNlbGVjdEVsZW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaWYgKHByZXZQcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHplbk1vZGVFbmFibGVkOiAhIXRoaXMucHJvcHMuemVuTW9kZUVuYWJsZWRcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcmV2UHJvcHMudGhlbWUgIT09IHRoaXMucHJvcHMudGhlbWUgJiYgdGhpcy5wcm9wcy50aGVtZSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHRoZW1lOiB0aGlzLnByb3BzLnRoZW1lXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmdyaWRNb2RlRW5hYmxlZCAhPT0gdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBncmlkU2l6ZTogdGhpcy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPyBHUklEX1NJWkUgOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wcm9wcy5uYW1lICYmIHByZXZQcm9wcy5uYW1lICE9PSB0aGlzLnByb3BzLm5hbWUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBuYW1lOiB0aGlzLnByb3BzLm5hbWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jbGFzc0xpc3QudG9nZ2xlKFwidGhlbWUtLWRhcmtcIiwgdGhpcy5zdGF0ZS50aGVtZSA9PT0gXCJkYXJrXCIpO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIXRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW3RoaXMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkXSkge1xuICAgICAgLy8gZGVmZXIgc28gdGhhdCB0aGUgY29tbWl0VG9IaXN0b3J5IGZsYWcgaXNuJ3QgcmVzZXQgdmlhIGN1cnJlbnQgdXBkYXRlXG4gICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgX3RoaXM0LmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCB7XG4gICAgICBtdWx0aUVsZW1lbnRcbiAgICB9ID0gcHJldlN0YXRlO1xuXG4gICAgaWYgKHByZXZTdGF0ZS5lbGVtZW50VHlwZSAhPT0gdGhpcy5zdGF0ZS5lbGVtZW50VHlwZSAmJiBtdWx0aUVsZW1lbnQgIT0gbnVsbCAmJiBpc0JpbmRpbmdFbmFibGVkKHRoaXMuc3RhdGUpICYmIGlzQmluZGluZ0VsZW1lbnQobXVsdGlFbGVtZW50KSkge1xuICAgICAgbWF5YmVCaW5kTGluZWFyRWxlbWVudChtdWx0aUVsZW1lbnQsIHRoaXMuc3RhdGUsIHRoaXMuc2NlbmUsIHR1cGxlVG9Db29ycyhMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKG11bHRpRWxlbWVudCwgLTEpKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY3Vyc29yQnV0dG9uID0ge307XG4gICAgY29uc3QgcG9pbnRlclZpZXdwb3J0Q29vcmRzID0ge307XG4gICAgY29uc3QgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzID0ge307XG4gICAgY29uc3QgcG9pbnRlclVzZXJuYW1lcyA9IHt9O1xuICAgIGNvbnN0IHBvaW50ZXJVc2VyU3RhdGVzID0ge307XG4gICAgdGhpcy5zdGF0ZS5jb2xsYWJvcmF0b3JzLmZvckVhY2goZnVuY3Rpb24gKHVzZXIsIHNvY2tldElkKSB7XG4gICAgICBpZiAodXNlci5zZWxlY3RlZEVsZW1lbnRJZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBPYmplY3Qua2V5cyh1c2VyLnNlbGVjdGVkRWxlbWVudElkcykpIHtcbiAgICAgICAgICBpZiAoIShpZCBpbiByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHMpKSB7XG4gICAgICAgICAgICByZW1vdGVTZWxlY3RlZEVsZW1lbnRJZHNbaWRdID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzW2lkXS5wdXNoKHNvY2tldElkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXVzZXIucG9pbnRlcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1c2VyLnVzZXJuYW1lKSB7XG4gICAgICAgIHBvaW50ZXJVc2VybmFtZXNbc29ja2V0SWRdID0gdXNlci51c2VybmFtZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHVzZXIudXNlclN0YXRlKSB7XG4gICAgICAgIHBvaW50ZXJVc2VyU3RhdGVzW3NvY2tldElkXSA9IHVzZXIudXNlclN0YXRlO1xuICAgICAgfVxuXG4gICAgICBwb2ludGVyVmlld3BvcnRDb29yZHNbc29ja2V0SWRdID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKHtcbiAgICAgICAgc2NlbmVYOiB1c2VyLnBvaW50ZXIueCxcbiAgICAgICAgc2NlbmVZOiB1c2VyLnBvaW50ZXIueVxuICAgICAgfSwgX3RoaXM0LnN0YXRlKTtcbiAgICAgIGN1cnNvckJ1dHRvbltzb2NrZXRJZF0gPSB1c2VyLmJ1dHRvbjtcbiAgICB9KTtcbiAgICBjb25zdCByZW5kZXJpbmdFbGVtZW50cyA9IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIGlmIChpc0ltYWdlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpZiAoIC8vIG5vdCBwbGFjZWQgb24gY2FudmFzIHlldCAoYnV0IGluIGVsZW1lbnRzIGFycmF5KVxuICAgICAgICBfdGhpczQuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCAmJiBlbGVtZW50LmlkID09PSBfdGhpczQuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudC5pZCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBkb24ndCByZW5kZXIgdGV4dCBlbGVtZW50IHRoYXQncyBiZWluZyBjdXJyZW50bHkgZWRpdGVkIChpdCdzXG4gICAgICAvLyByZW5kZXJlZCBvbiByZW1vdGUgb25seSlcblxuXG4gICAgICByZXR1cm4gIV90aGlzNC5zdGF0ZS5lZGl0aW5nRWxlbWVudCB8fCBfdGhpczQuc3RhdGUuZWRpdGluZ0VsZW1lbnQudHlwZSAhPT0gXCJ0ZXh0XCIgfHwgZWxlbWVudC5pZCAhPT0gX3RoaXM0LnN0YXRlLmVkaXRpbmdFbGVtZW50LmlkO1xuICAgIH0pO1xuICAgIGNvbnN0IHtcbiAgICAgIGF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCxcbiAgICAgIHNjcm9sbEJhcnNcbiAgICB9ID0gcmVuZGVyU2NlbmUocmVuZGVyaW5nRWxlbWVudHMsIHRoaXMuc3RhdGUsIHRoaXMuc3RhdGUuc2VsZWN0aW9uRWxlbWVudCwgd2luZG93LmRldmljZVBpeGVsUmF0aW8sIHRoaXMucmMsIHRoaXMuY2FudmFzLCB7XG4gICAgICBzY3JvbGxYOiB0aGlzLnN0YXRlLnNjcm9sbFgsXG4gICAgICBzY3JvbGxZOiB0aGlzLnN0YXRlLnNjcm9sbFksXG4gICAgICB2aWV3QmFja2dyb3VuZENvbG9yOiB0aGlzLnN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICB6b29tOiB0aGlzLnN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHBvaW50ZXJWaWV3cG9ydENvb3JkcyxcbiAgICAgIHJlbW90ZVBvaW50ZXJCdXR0b246IGN1cnNvckJ1dHRvbixcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkcyxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VybmFtZXM6IHBvaW50ZXJVc2VybmFtZXMsXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczogcG9pbnRlclVzZXJTdGF0ZXMsXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRoaXMuc3RhdGUuc2hvdWxkQ2FjaGVJZ25vcmVab29tLFxuICAgICAgdGhlbWU6IHRoaXMuc3RhdGUudGhlbWUsXG4gICAgICBpbWFnZUNhY2hlOiB0aGlzLmltYWdlQ2FjaGUsXG4gICAgICBpc0V4cG9ydGluZzogZmFsc2UsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiAhdGhpcy5pc01vYmlsZVxuICAgIH0pO1xuXG4gICAgaWYgKHNjcm9sbEJhcnMpIHtcbiAgICAgIGN1cnJlbnRTY3JvbGxCYXJzID0gc2Nyb2xsQmFycztcbiAgICB9XG5cbiAgICBjb25zdCBzY3JvbGxlZE91dHNpZGUgPSAvLyBoaWRlIHdoZW4gZWRpdGluZyB0ZXh0XG4gICAgaXNUZXh0RWxlbWVudCh0aGlzLnN0YXRlLmVkaXRpbmdFbGVtZW50KSA/IGZhbHNlIDogIWF0TGVhc3RPbmVWaXNpYmxlRWxlbWVudCAmJiByZW5kZXJpbmdFbGVtZW50cy5sZW5ndGggPiAwO1xuXG4gICAgaWYgKHRoaXMuc3RhdGUuc2Nyb2xsZWRPdXRzaWRlICE9PSBzY3JvbGxlZE91dHNpZGUpIHtcbiAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICBzY3JvbGxlZE91dHNpZGVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMuaGlzdG9yeS5yZWNvcmQodGhpcy5zdGF0ZSwgdGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG4gICAgdGhpcy5zY2hlZHVsZUltYWdlUmVmcmVzaCgpOyAvLyBEbyBub3Qgbm90aWZ5IGNvbnN1bWVycyBpZiB3ZSdyZSBzdGlsbCBsb2FkaW5nIHRoZSBzY2VuZS4gQW1vbmcgb3RoZXJcbiAgICAvLyBwb3RlbnRpYWwgaXNzdWVzLCB0aGlzIGZpeGVzIGEgY2FzZSB3aGVyZSB0aGUgdGFiIGlzbid0IGZvY3VzZWQgZHVyaW5nXG4gICAgLy8gaW5pdCwgd2hpY2ggd291bGQgdHJpZ2dlciBvbkNoYW5nZSB3aXRoIGVtcHR5IGVsZW1lbnRzLCB3aGljaCB3b3VsZCB0aGVuXG4gICAgLy8gb3ZlcnJpZGUgd2hhdGV2ZXIgaXMgaW4gbG9jYWxTdG9yYWdlIGN1cnJlbnRseS5cblxuICAgIGlmICghdGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgIHRoaXMucHJvcHMub25DaGFuZ2U/Lih0aGlzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCB0aGlzLnN0YXRlLCB0aGlzLmZpbGVzKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgcmVzZXRUYXBUd2ljZSgpIHtcbiAgICBkaWRUYXBUd2ljZSA9IGZhbHNlO1xuICB9XG5cbiAgYWRkVGV4dEZyb21QYXN0ZSh0ZXh0KSB7XG4gICAgY29uc3Qge1xuICAgICAgeCxcbiAgICAgIHlcbiAgICB9ID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgIGNsaWVudFg6IGN1cnNvclgsXG4gICAgICBjbGllbnRZOiBjdXJzb3JZXG4gICAgfSwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHgsXG4gICAgICB5LFxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IHRoaXMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0LFxuICAgICAgcmF3VGV4dDogdGV4dCxcbiAgICAgIGZvbnRTaXplOiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiB0aGlzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogdGhpcy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR05cbiAgICB9KTtcbiAgICB0aGlzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4udGhpcy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgfSAvLyBDb2xsYWJvcmF0aW9uXG5cblxuICBzZWxlY3RTaGFwZVRvb2woZWxlbWVudFR5cGUpIHtcbiAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZSh0aGlzLmNhbnZhcywgZWxlbWVudFR5cGUpO1xuICAgIH1cblxuICAgIGlmIChpc1Rvb2xJY29uKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7XG4gICAgICB0aGlzLmZvY3VzQ29udGFpbmVyKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0xpbmVhckVsZW1lbnRUeXBlKGVsZW1lbnRUeXBlKSkge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGVsZW1lbnRUeXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIHRoaXMub25JbWFnZUFjdGlvbigpO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgZWxlbWVudFR5cGVcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZVRleHRXeXNpd3lnKGVsZW1lbnQsIF9yZWYpIHtcbiAgICB2YXIgX3RoaXM1ID0gdGhpcztcblxuICAgIGxldCB7XG4gICAgICBpc0V4aXN0aW5nRWxlbWVudCA9IGZhbHNlXG4gICAgfSA9IF9yZWY7XG5cbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gZnVuY3Rpb24gKHRleHQsIG9yaWdpbmFsVGV4dCwgaXNEZWxldGVkLCByYXdUZXh0KSB7XG4gICAgICBfdGhpczUuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczUuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKGZ1bmN0aW9uIChfZWxlbWVudCkge1xuICAgICAgICBpZiAoX2VsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiYgaXNUZXh0RWxlbWVudChfZWxlbWVudCkpIHtcbiAgICAgICAgICByZXR1cm4gdXBkYXRlVGV4dEVsZW1lbnQoX2VsZW1lbnQsIHtcbiAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICBpc0RlbGV0ZWQsXG4gICAgICAgICAgICBvcmlnaW5hbFRleHQsXG4gICAgICAgICAgICByYXdUZXh0OiByYXdUZXh0ID8/IG9yaWdpbmFsVGV4dFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9lbGVtZW50O1xuICAgICAgfSldKTtcbiAgICB9O1xuXG4gICAgaWYgKGlzRXhpc3RpbmdFbGVtZW50ICYmIHRoaXMucHJvcHMub25CZWZvcmVUZXh0RWRpdCkge1xuICAgICAgY29uc3QgdGV4dCA9IHRoaXMucHJvcHMub25CZWZvcmVUZXh0RWRpdChlbGVtZW50KTtcblxuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLnRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkubWFwKGZ1bmN0aW9uIChfZWxlbWVudCkge1xuICAgICAgICAgIGlmIChfZWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCAmJiBpc1RleHRFbGVtZW50KF9lbGVtZW50KSkge1xuICAgICAgICAgICAgZWxlbWVudCA9IHVwZGF0ZVRleHRFbGVtZW50KF9lbGVtZW50LCB7XG4gICAgICAgICAgICAgIHRleHQsXG4gICAgICAgICAgICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgIG9yaWdpbmFsVGV4dDogdGV4dFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gX2VsZW1lbnQ7XG4gICAgICAgIH0pXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGV4dFd5c2l3eWcoe1xuICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICBhcHBTdGF0ZTogdGhpcy5zdGF0ZSxcbiAgICAgIGNhbnZhczogdGhpcy5jYW52YXMsXG4gICAgICBnZXRWaWV3cG9ydENvb3JkczogZnVuY3Rpb24gKHgsIHkpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHg6IHZpZXdwb3J0WCxcbiAgICAgICAgICB5OiB2aWV3cG9ydFlcbiAgICAgICAgfSA9IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3Jkcyh7XG4gICAgICAgICAgc2NlbmVYOiB4LFxuICAgICAgICAgIHNjZW5lWTogeVxuICAgICAgICB9LCBfdGhpczUuc3RhdGUpO1xuICAgICAgICByZXR1cm4gW3ZpZXdwb3J0WCAtIF90aGlzNS5zdGF0ZS5vZmZzZXRMZWZ0LCB2aWV3cG9ydFkgLSBfdGhpczUuc3RhdGUub2Zmc2V0VG9wXTtcbiAgICAgIH0sXG4gICAgICBvbkNoYW5nZTogd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICh0ZXh0KSB7XG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgdGV4dCwgZmFsc2UpO1xuXG4gICAgICAgIGlmIChpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgdXBkYXRlQm91bmRFbGVtZW50cyhlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICBvblN1Ym1pdDogd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHRleHQsXG4gICAgICAgICAgdmlhS2V5Ym9hcmQsXG4gICAgICAgICAgb3JpZ2luYWxUZXh0XG4gICAgICAgIH0gPSBfcmVmMjtcbiAgICAgICAgY29uc3QgaXNEZWxldGVkID0gIXRleHQudHJpbSgpO1xuICAgICAgICBjb25zdCByYXdUZXh0ID0gb3JpZ2luYWxUZXh0OyAvL3Nob3VsZCB0aGlzIGJlIG9yaWdpbmFsVGV4dD8/XG5cbiAgICAgICAgaWYgKF90aGlzNS5wcm9wcy5vbkJlZm9yZVRleHRTdWJtaXQpIHtcbiAgICAgICAgICBjb25zdCBbdXBkYXRlZFRleHQsIHVwZGF0ZWRPcmlnaW5hbFRleHRdID0gX3RoaXM1LnByb3BzLm9uQmVmb3JlVGV4dFN1Ym1pdChlbGVtZW50LCB0ZXh0LCBvcmlnaW5hbFRleHQsIGlzRGVsZXRlZCk7XG5cbiAgICAgICAgICB0ZXh0ID0gdXBkYXRlZFRleHQgPz8gdGV4dDtcbiAgICAgICAgICBvcmlnaW5hbFRleHQgPSB1cGRhdGVkT3JpZ2luYWxUZXh0ID8/IG9yaWdpbmFsVGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZUVsZW1lbnQodGV4dCwgb3JpZ2luYWxUZXh0LCBpc0RlbGV0ZWQsIHJhd1RleHQpOyAvLyBzZWxlY3QgdGhlIGNyZWF0ZWQgdGV4dCBlbGVtZW50IG9ubHkgaWYgc3VibWl0dGluZyB2aWEga2V5Ym9hcmRcbiAgICAgICAgLy8gKHdoZW4gc3VibWl0dGluZyB2aWEgY2xpY2sgaXQgc2hvdWxkIGFjdCBhcyBzaWduYWwgdG8gZGVzZWxlY3QpXG5cbiAgICAgICAgaWYgKCFpc0RlbGV0ZWQgJiYgdmlhS2V5Ym9hcmQpIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50SWRUb1NlbGVjdCA9IGVsZW1lbnQuY29udGFpbmVySWQgPyBlbGVtZW50LmNvbnRhaW5lcklkIDogZWxlbWVudC5pZDtcblxuICAgICAgICAgIF90aGlzNS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgW2VsZW1lbnRJZFRvU2VsZWN0XTogdHJ1ZVxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0RlbGV0ZWQpIHtcbiAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRGVsZXRpb24oX3RoaXM1LnNjZW5lLmdldEVsZW1lbnRzKCksIFtlbGVtZW50XSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzRGVsZXRlZCB8fCBpc0V4aXN0aW5nRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzNS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXM1LnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKF90aGlzNS5zdGF0ZS5lbGVtZW50TG9ja2VkKSB7XG4gICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXM1LmNhbnZhcywgX3RoaXM1LnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzNS5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfSksXG4gICAgICBlbGVtZW50LFxuICAgICAgZXhjYWxpZHJhd0NvbnRhaW5lcjogdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQsXG4gICAgICBhcHA6IHRoaXNcbiAgICB9KTsgLy8gZGVzZWxlY3QgYWxsIG90aGVyIGVsZW1lbnRzIHdoZW4gaW5zZXJ0aW5nIHRleHRcblxuICAgIHRoaXMuZGVzZWxlY3RFbGVtZW50cygpOyAvLyBkbyBhbiBpbml0aWFsIHVwZGF0ZSB0byByZS1pbml0aWFsaXplIGVsZW1lbnQgcG9zaXRpb24gc2luY2Ugd2Ugd2VyZVxuICAgIC8vIG1vZGlmeWluZyBlbGVtZW50J3MgeC95IGZvciBzYWtlIG9mIGVkaXRvciAoY2FzZTogc3luY2luZyB0byByZW1vdGUpXG5cbiAgICB1cGRhdGVFbGVtZW50KGVsZW1lbnQudGV4dCwgZWxlbWVudC5vcmlnaW5hbFRleHQsIGZhbHNlKTtcbiAgfVxuXG4gIGRlc2VsZWN0RWxlbWVudHMoKSB7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0VGV4dEVsZW1lbnRBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgaWYgKGVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiAhZWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudEF0UG9zaXRpb24oeCwgeSwgb3B0cykge1xuICAgIGNvbnN0IGFsbEhpdEVsZW1lbnRzID0gdGhpcy5nZXRFbGVtZW50c0F0UG9zaXRpb24oeCwgeSwgb3B0cz8uaW5jbHVkZUJvdW5kVGV4dEVsZW1lbnQpO1xuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGlmIChvcHRzPy5wcmVmZXJTZWxlY3RlZCkge1xuICAgICAgICBmb3IgKGxldCBpbmRleCA9IGFsbEhpdEVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID4gLTE7IGluZGV4LS0pIHtcbiAgICAgICAgICBpZiAodGhpcy5zdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbYWxsSGl0RWxlbWVudHNbaW5kZXhdLmlkXSkge1xuICAgICAgICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzW2luZGV4XTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFdpdGhIaWdoZXN0WkluZGV4ID0gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMV07IC8vIElmIHdlJ3JlIGhpdHRpbmcgZWxlbWVudCB3aXRoIGhpZ2hlc3Qgei1pbmRleCBvbmx5IG9uIGl0cyBib3VuZGluZyBib3hcbiAgICAgIC8vIHdoaWxlIGFsc28gaGl0dGluZyBvdGhlciBlbGVtZW50IGZpZ3VyZSwgdGhlIGxhdHRlciBzaG91bGQgYmUgY29uc2lkZXJlZC5cblxuICAgICAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXgsIHRoaXMuc3RhdGUsIHgsIHkpID8gYWxsSGl0RWxlbWVudHNbYWxsSGl0RWxlbWVudHMubGVuZ3RoIC0gMl0gOiBlbGVtZW50V2l0aEhpZ2hlc3RaSW5kZXg7XG4gICAgfVxuXG4gICAgaWYgKGFsbEhpdEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIGFsbEhpdEVsZW1lbnRzWzBdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgZ2V0RWxlbWVudHNBdFBvc2l0aW9uKHgsIHkpIHtcbiAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgIGxldCBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA9IGFyZ3VtZW50cy5sZW5ndGggPiAyICYmIGFyZ3VtZW50c1syXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzJdIDogZmFsc2U7XG4gICAgY29uc3QgZWxlbWVudHMgPSBpbmNsdWRlQm91bmRUZXh0RWxlbWVudCA/IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSA6IHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKS5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAhKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGdldEVsZW1lbnRzQXRQb3NpdGlvbihlbGVtZW50cywgZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBoaXRUZXN0KGVsZW1lbnQsIF90aGlzNi5zdGF0ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH1cblxuICBtYXliZUNsZWFudXBBZnRlck1pc3NpbmdQb2ludGVyVXAoZXZlbnQpIHtcbiAgICBpZiAobGFzdFBvaW50ZXJVcCAhPT0gbnVsbCkge1xuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgc29tZXRpbWVzIHdlIGRvbid0IGdldCBhIHBvaW50ZXJ1cCBhZnRlciBhIHBvaW50ZXJkb3duLFxuICAgICAgLy8gdGhpcyBjYW4gaGFwcGVuIHdoZW4gYSBjb250ZXh0dWFsIG1lbnUgb3IgYWxlcnQgaXMgdHJpZ2dlcmVkLiBJbiBvcmRlciB0byBhdm9pZFxuICAgICAgLy8gYmVpbmcgaW4gYSB3ZWlyZCBzdGF0ZSwgd2UgY2xlYW4gdXAgb24gdGhlIG5leHQgcG9pbnRlcmRvd25cbiAgICAgIGxhc3RQb2ludGVyVXAoZXZlbnQpO1xuICAgIH1cbiAgfSAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIGV2ZW50IGlzIGEgcGFubmluZ1xuXG5cbiAgdXBkYXRlR2VzdHVyZU9uUG9pbnRlckRvd24oZXZlbnQpIHtcbiAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgIHg6IGV2ZW50LmNsaWVudFgsXG4gICAgICB5OiBldmVudC5jbGllbnRZXG4gICAgfSk7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyKSB7XG4gICAgICBnZXN0dXJlLmxhc3RDZW50ZXIgPSBnZXRDZW50ZXIoZ2VzdHVyZS5wb2ludGVycyk7XG4gICAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IHRoaXMuc3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2V0RGlzdGFuY2UoQXJyYXkuZnJvbShnZXN0dXJlLnBvaW50ZXJzLnZhbHVlcygpKSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbFBvaW50ZXJEb3duU3RhdGUoZXZlbnQpIHtcbiAgICBjb25zdCBvcmlnaW4gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoZXZlbnQsIHRoaXMuc3RhdGUpO1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgdGhpcy5zdGF0ZSk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpO1xuICAgIHJldHVybiB7XG4gICAgICBvcmlnaW4sXG4gICAgICB3aXRoQ21kT3JDdHJsOiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSxcbiAgICAgIG9yaWdpbkluR3JpZDogdHVwbGVUb0Nvb3JzKGdldEdyaWRQb2ludChvcmlnaW4ueCwgb3JpZ2luLnksIHRoaXMuc3RhdGUuZ3JpZFNpemUpKSxcbiAgICAgIHNjcm9sbGJhcnM6IGlzT3ZlclNjcm9sbEJhcnMoY3VycmVudFNjcm9sbEJhcnMsIGV2ZW50LmNsaWVudFggLSB0aGlzLnN0YXRlLm9mZnNldExlZnQsIGV2ZW50LmNsaWVudFkgLSB0aGlzLnN0YXRlLm9mZnNldFRvcCksXG4gICAgICAvLyB3ZSBuZWVkIHRvIGR1cGxpY2F0ZSBiZWNhdXNlIHdlJ2xsIGJlIHVwZGF0aW5nIHRoaXMgc3RhdGVcbiAgICAgIGxhc3RDb29yZHM6IF9vYmplY3RTcHJlYWQoe30sIG9yaWdpbiksXG4gICAgICBvcmlnaW5hbEVsZW1lbnRzOiB0aGlzLnNjZW5lLmdldEVsZW1lbnRzKCkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGVsZW1lbnQpIHtcbiAgICAgICAgYWNjLnNldChlbGVtZW50LmlkLCBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCkpO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSwgbmV3IE1hcCgpKSxcbiAgICAgIHJlc2l6ZToge1xuICAgICAgICBoYW5kbGVUeXBlOiBmYWxzZSxcbiAgICAgICAgaXNSZXNpemluZzogZmFsc2UsXG4gICAgICAgIG9mZnNldDoge1xuICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgeTogMFxuICAgICAgICB9LFxuICAgICAgICBhcnJvd0RpcmVjdGlvbjogXCJvcmlnaW5cIixcbiAgICAgICAgY2VudGVyOiB7XG4gICAgICAgICAgeDogKG1heFggKyBtaW5YKSAvIDIsXG4gICAgICAgICAgeTogKG1heFkgKyBtaW5ZKSAvIDJcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGhpdDoge1xuICAgICAgICBlbGVtZW50OiBudWxsLFxuICAgICAgICBhbGxIaXRFbGVtZW50czogW10sXG4gICAgICAgIHdhc0FkZGVkVG9TZWxlY3Rpb246IGZhbHNlLFxuICAgICAgICBoYXNCZWVuRHVwbGljYXRlZDogZmFsc2UsXG4gICAgICAgIGhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzOiB0aGlzLmlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKG9yaWdpbiwgc2VsZWN0ZWRFbGVtZW50cyksXG4gICAgICAgIGhhc0hpdEVsZW1lbnRJbnNpZGU6IGZhbHNlXG4gICAgICB9LFxuICAgICAgZHJhZzoge1xuICAgICAgICBoYXNPY2N1cnJlZDogZmFsc2UsXG4gICAgICAgIG9mZnNldDogbnVsbFxuICAgICAgfSxcbiAgICAgIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgICAgIG9uTW92ZTogbnVsbCxcbiAgICAgICAgb25VcDogbnVsbCxcbiAgICAgICAgb25LZXlVcDogbnVsbCxcbiAgICAgICAgb25LZXlEb3duOiBudWxsXG4gICAgICB9LFxuICAgICAgYm94U2VsZWN0aW9uOiB7XG4gICAgICAgIGhhc09jY3VycmVkOiBmYWxzZVxuICAgICAgfVxuICAgIH07XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBldmVudCBpcyBhIGRyYWdnaW5nIGEgc2Nyb2xsYmFyXG5cblxuICBoYW5kbGVEcmFnZ2luZ1Njcm9sbEJhcihldmVudCwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczcgPSB0aGlzO1xuXG4gICAgaWYgKCEocG9pbnRlckRvd25TdGF0ZS5zY3JvbGxiYXJzLmlzT3ZlckVpdGhlciAmJiAhdGhpcy5zdGF0ZS5tdWx0aUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IHRydWU7XG4gICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBldmVudC5jbGllbnRYO1xuICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gZXZlbnQuY2xpZW50WTtcbiAgICBjb25zdCBvblBvaW50ZXJNb3ZlID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0O1xuXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczcuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSk7XG4gICAgY29uc3Qgb25Qb2ludGVyVXAgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgaXNEcmFnZ2luZ1Njcm9sbEJhciA9IGZhbHNlO1xuICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXM3LmNhbnZhcywgX3RoaXM3LnN0YXRlLmVsZW1lbnRUeXBlKTtcbiAgICAgIGxhc3RQb2ludGVyVXAgPSBudWxsO1xuXG4gICAgICBfdGhpczcuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzNy5zYXZlUG9pbnRlcihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCBcInVwXCIpO1xuXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgIH0pO1xuICAgIGxhc3RQb2ludGVyVXAgPSBvblBvaW50ZXJVcDtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIG9uUG9pbnRlclVwKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlzQVNlbGVjdGVkRWxlbWVudChoaXRFbGVtZW50KSB7XG4gICAgcmV0dXJuIGhpdEVsZW1lbnQgIT0gbnVsbCAmJiB0aGlzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1toaXRFbGVtZW50LmlkXTtcbiAgfVxuXG4gIGlzSGl0dGluZ0NvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzKHBvaW50LCBzZWxlY3RlZEVsZW1lbnRzKSB7XG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0gLy8gSG93IG1hbnkgcGl4ZWxzIG9mZiB0aGUgc2hhcGUgYm91bmRhcnkgd2Ugc3RpbGwgY29uc2lkZXIgYSBoaXRcblxuXG4gICAgY29uc3QgdGhyZXNob2xkID0gMTAgLyB0aGlzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldENvbW1vbkJvdW5kcyhzZWxlY3RlZEVsZW1lbnRzKTtcbiAgICByZXR1cm4gcG9pbnQueCA+IHgxIC0gdGhyZXNob2xkICYmIHBvaW50LnggPCB4MiArIHRocmVzaG9sZCAmJiBwb2ludC55ID4geTEgLSB0aHJlc2hvbGQgJiYgcG9pbnQueSA8IHkyICsgdGhyZXNob2xkO1xuICB9XG5cbiAgb25LZXlEb3duRnJvbVBvaW50ZXJEb3duSGFuZGxlcihwb2ludGVyRG93blN0YXRlKSB7XG4gICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgaWYgKF90aGlzOC5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczgubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgcmV0dXJuIHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIFByZXZlbnRzIGZvY3VzIGZyb20gZXNjYXBpbmcgZXhjYWxpZHJhdyB0YWJcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5BTFQgJiYgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKF90aGlzOS5tYXliZUhhbmRsZVJlc2l6ZShwb2ludGVyRG93blN0YXRlLCBldmVudCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczkubWF5YmVEcmFnTmV3R2VuZXJpY0VsZW1lbnQocG9pbnRlckRvd25TdGF0ZSwgZXZlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSkge1xuICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgIHJldHVybiB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBXZSBuZWVkIHRvIGluaXRpYWxpemUgZHJhZ09mZnNldFhZIG9ubHkgYWZ0ZXIgd2UndmUgdXBkYXRlZFxuICAgICAgLy8gYHN0YXRlLnNlbGVjdGVkRWxlbWVudElkc2Agb24gcG9pbnRlckRvd24uIERvaW5nIGl0IGhlcmUgaW4gcG9pbnRlck1vdmVcbiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgc2hvdWxkIGhvcGVmdWxseSBlbnN1cmUgd2UncmUgYWxyZWFkeSB3b3JraW5nIHdpdGhcbiAgICAgIC8vIHRoZSB1cGRhdGVkIHN0YXRlLlxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQgPT09IG51bGwpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldCA9IHR1cGxlVG9Db29ycyhnZXREcmFnT2Zmc2V0WFkoZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcblxuICAgICAgaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTAuaGFuZGxlUG9pbnRlck1vdmVPdmVyU2Nyb2xsYmFycyhldmVudCwgcG9pbnRlckRvd25TdGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEwLnN0YXRlKTtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCwgcG9pbnRlckNvb3Jkcy55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTsgLy8gZm9yIGFycm93cy9saW5lcywgZG9uJ3Qgc3RhcnQgZHJhZ2dpbmcgdW50aWwgYSBnaXZlbiB0aHJlc2hvbGRcbiAgICAgIC8vIHRvIGVuc3VyZSB3ZSBkb24ndCBjcmVhdGUgYSAyLXBvaW50IGFycm93IGJ5IG1pc3Rha2Ugd2hlblxuICAgICAgLy8gdXNlciBjbGlja3MgbW91c2UgaW4gYSB3YXkgdGhhdCBpdCBtb3ZlcyBhIHRpbnkgYml0ICh0aHVzXG4gICAgICAvLyB0cmlnZ2VyaW5nIHBvaW50ZXJtb3ZlKVxuXG4gICAgICBpZiAoIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8IF90aGlzMTAuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwibGluZVwiKSkge1xuICAgICAgICBpZiAoZGlzdGFuY2UyZChwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSkgPCBEUkFHR0lOR19USFJFU0hPTEQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmlzUmVzaXppbmcpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy55ID0gcG9pbnRlckNvb3Jkcy55O1xuXG4gICAgICAgIGlmIChfdGhpczEwLm1heWJlSGFuZGxlUmVzaXplKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGRpZERyYWcgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZVBvaW50RHJhZ2dpbmcoX3RoaXMxMC5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTAuc2V0U3RhdGUoYXBwU3RhdGUpO1xuICAgICAgICB9LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZnVuY3Rpb24gKGVsZW1lbnQsIHBvaW50c1NjZW5lQ29vcmRzKSB7XG4gICAgICAgICAgX3RoaXMxMC5tYXliZVN1Z2dlc3RCaW5kaW5nc0ZvckxpbmVhckVsZW1lbnRBdENvb3JkcyhlbGVtZW50LCBwb2ludHNTY2VuZUNvb3Jkcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChkaWREcmFnKSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnggPSBwb2ludGVyQ29vcmRzLng7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpczEwLmlzQVNlbGVjdGVkRWxlbWVudChlbGVtZW50KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoKGhhc0hpdEFTZWxlY3RlZEVsZW1lbnQgfHwgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMpICYmICggLy8gdGhpcyBhbGxvd3MgZm9yIGJveC1zZWxlY3RpbmcgcG9pbnRzIHdoZW4gY2xpY2tpbmcgaW5zaWRlIHRoZVxuICAgICAgLy8gbGluZSdzIGJvdW5kaW5nIGJveFxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgIWV2ZW50LnNoaWZ0S2V5KSAmJiAoIC8vIGJveC1zZWxlY3Rpbmcgd2l0aG91dCBzaGlmdCB3aGVuIGVkaXRpbmcgbGluZSwgbm90IGNsaWNraW5nIG9uIGEgbGluZVxuICAgICAgIV90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMC5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudD8uZWxlbWVudElkICE9PSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50Py5pZCB8fCBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRFbGVtZW50SW5zaWRlKSkge1xuICAgICAgICAvLyBNYXJraW5nIHRoYXQgY2xpY2sgd2FzIHVzZWQgZm9yIGRyYWdnaW5nIHRvIGNoZWNrXG4gICAgICAgIC8vIGlmIGVsZW1lbnRzIHNob3VsZCBiZSBkZXNlbGVjdGVkIG9uIHBvaW50ZXJ1cFxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgPSB0cnVlO1xuICAgICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTAuc3RhdGUpOyAvLyBwcmV2ZW50IGRyYWdnaW5nIGV2ZW4gaWYgd2UncmUgbm8gbG9uZ2VyIGhvbGRpbmcgY21kL2N0cmwgb3RoZXJ3aXNlXG4gICAgICAgIC8vIGl0IHdvdWxkIGhhdmUgd2VpcmQgcmVzdWx0cyAoc3R1ZmYganVtcGluZyBhbGwgb3ZlciB0aGUgc2NyZWVuKVxuXG4gICAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA+IDAgJiYgIXBvaW50ZXJEb3duU3RhdGUud2l0aENtZE9yQ3RybCkge1xuICAgICAgICAgIGNvbnN0IFtkcmFnWCwgZHJhZ1ldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJDb29yZHMueCAtIHBvaW50ZXJEb3duU3RhdGUuZHJhZy5vZmZzZXQueCwgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgICBjb25zdCBbZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWV0gPSBbTWF0aC5hYnMocG9pbnRlckNvb3Jkcy54IC0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCksIE1hdGguYWJzKHBvaW50ZXJDb29yZHMueSAtIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpXTsgLy8gV2Ugb25seSBkcmFnIGluIG9uZSBkaXJlY3Rpb24gaWYgc2hpZnQgaXMgcHJlc3NlZFxuXG4gICAgICAgICAgY29uc3QgbG9ja0RpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgICAgIGRyYWdTZWxlY3RlZEVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUsIHNlbGVjdGVkRWxlbWVudHMsIGRyYWdYLCBkcmFnWSwgbG9ja0RpcmVjdGlvbiwgZHJhZ0Rpc3RhbmNlWCwgZHJhZ0Rpc3RhbmNlWSwgX3RoaXMxMC5zdGF0ZSk7XG5cbiAgICAgICAgICBfdGhpczEwLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7IC8vIFdlIGR1cGxpY2F0ZSB0aGUgc2VsZWN0ZWQgZWxlbWVudCBpZiBhbHQgaXMgcHJlc3NlZCBvbiBwb2ludGVyIG1vdmVcblxuXG4gICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSAmJiAhcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQpIHtcbiAgICAgICAgICAgIC8vIE1vdmUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBlbGVtZW50cyB0byB0aGUgdG9wIG9mIHRoZSB6IGluZGV4IHN0YWNrLCBhbmRcbiAgICAgICAgICAgIC8vIHB1dCB0aGUgZHVwbGljYXRlcyB3aGVyZSB0aGUgc2VsZWN0ZWQgZWxlbWVudHMgdXNlZCB0byBiZS5cbiAgICAgICAgICAgIC8vICh0aGUgb3JpZ2luIHBvaW50IHdoZXJlIHRoZSBkcmFnZ2luZyBzdGFydGVkKVxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzQmVlbkR1cGxpY2F0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50c1RvQXBwZW5kID0gW107XG4gICAgICAgICAgICBjb25zdCBncm91cElkTWFwID0gbmV3IE1hcCgpO1xuICAgICAgICAgICAgY29uc3Qgb2xkSWRUb0R1cGxpY2F0ZWRJZCA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuXG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudElkcyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIF90aGlzMTAuc3RhdGUsIHRydWUpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudC5pZDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkRWxlbWVudElkcy5pbmNsdWRlcyhlbGVtZW50LmlkKSB8fCAvLyBjYXNlOiB0aGUgc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzIG1pZ2h0IG5vdCBoYXZlIGJlZW5cbiAgICAgICAgICAgICAgLy8gdXBkYXRlZCB5ZXQgYnkgdGhlIHRpbWUgdGhpcyBtb3VzZW1vdmUgZXZlbnQgaXMgZmlyZWRcbiAgICAgICAgICAgICAgZWxlbWVudC5pZCA9PT0gaGl0RWxlbWVudD8uaWQgJiYgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGR1cGxpY2F0ZWRFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEwLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50KTtcbiAgICAgICAgICAgICAgICBjb25zdCBbb3JpZ2luRHJhZ1gsIG9yaWdpbkRyYWdZXSA9IGdldEdyaWRQb2ludChwb2ludGVyRG93blN0YXRlLm9yaWdpbi54IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcG9pbnRlckRvd25TdGF0ZS5kcmFnLm9mZnNldC55LCBfdGhpczEwLnN0YXRlLmdyaWRTaXplKTtcbiAgICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KGR1cGxpY2F0ZWRFbGVtZW50LCB7XG4gICAgICAgICAgICAgICAgICB4OiBkdXBsaWNhdGVkRWxlbWVudC54ICsgKG9yaWdpbkRyYWdYIC0gZHJhZ1gpLFxuICAgICAgICAgICAgICAgICAgeTogZHVwbGljYXRlZEVsZW1lbnQueSArIChvcmlnaW5EcmFnWSAtIGRyYWdZKVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGR1cGxpY2F0ZWRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBlbGVtZW50c1RvQXBwZW5kLnB1c2goZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgb2xkSWRUb0R1cGxpY2F0ZWRJZC5zZXQoZWxlbWVudC5pZCwgZHVwbGljYXRlZEVsZW1lbnQuaWQpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG5leHRFbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRTY2VuZUVsZW1lbnRzID0gWy4uLm5leHRFbGVtZW50cywgLi4uZWxlbWVudHNUb0FwcGVuZF07XG4gICAgICAgICAgICBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHNUb0FwcGVuZCwgb2xkSWRUb0R1cGxpY2F0ZWRJZCk7XG4gICAgICAgICAgICBmaXhCaW5kaW5nc0FmdGVyRHVwbGljYXRpb24obmV4dFNjZW5lRWxlbWVudHMsIGVsZW1lbnRzVG9BcHBlbmQsIG9sZElkVG9EdXBsaWNhdGVkSWQsIFwiZHVwbGljYXRlc1NlcnZlQXNPbGRcIik7XG5cbiAgICAgICAgICAgIF90aGlzMTAuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKG5leHRTY2VuZUVsZW1lbnRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gLy8gSXQgaXMgdmVyeSBpbXBvcnRhbnQgdG8gcmVhZCB0aGlzLnN0YXRlIHdpdGhpbiBlYWNoIG1vdmUgZXZlbnQsXG4gICAgICAvLyBvdGhlcndpc2Ugd2Ugd291bGQgcmVhZCBhIHN0YWxlIG9uZSFcblxuXG4gICAgICBjb25zdCBkcmFnZ2luZ0VsZW1lbnQgPSBfdGhpczEwLnN0YXRlLmRyYWdnaW5nRWxlbWVudDtcblxuICAgICAgaWYgKCFkcmFnZ2luZ0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50LnR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgICBjb25zdCBwb2ludHMgPSBkcmFnZ2luZ0VsZW1lbnQucG9pbnRzO1xuICAgICAgICBjb25zdCBkeCA9IHBvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54O1xuICAgICAgICBjb25zdCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55O1xuICAgICAgICBjb25zdCBwcmVzc3VyZXMgPSBkcmFnZ2luZ0VsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSA/IGRyYWdnaW5nRWxlbWVudC5wcmVzc3VyZXMgOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW2R4LCBkeV1dLFxuICAgICAgICAgIHByZXNzdXJlc1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gZ3JpZFggLSBkcmFnZ2luZ0VsZW1lbnQueDtcbiAgICAgICAgbGV0IGR5ID0gZ3JpZFkgLSBkcmFnZ2luZ0VsZW1lbnQueTtcblxuICAgICAgICBpZiAoc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpICYmIHBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAoe1xuICAgICAgICAgICAgd2lkdGg6IGR4LFxuICAgICAgICAgICAgaGVpZ2h0OiBkeVxuICAgICAgICAgIH0gPSBnZXRQZXJmZWN0RWxlbWVudFNpemUoX3RoaXMxMC5zdGF0ZS5lbGVtZW50VHlwZSwgZHgsIGR5KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocG9pbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgICBwb2ludHM6IFsuLi5wb2ludHMsIFtkeCwgZHldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHBvaW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtkeCwgZHldXVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICAgIC8vIFdoZW4gY3JlYXRpbmcgYSBsaW5lYXIgZWxlbWVudCBieSBkcmFnZ2luZ1xuICAgICAgICAgIF90aGlzMTAubWF5YmVTdWdnZXN0QmluZGluZ3NGb3JMaW5lYXJFbGVtZW50QXRDb29yZHMoZHJhZ2dpbmdFbGVtZW50LCBbcG9pbnRlckNvb3Jkc10sIF90aGlzMTAuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHMueCA9IHBvaW50ZXJDb29yZHMueDtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSBwb2ludGVyQ29vcmRzLnk7XG5cbiAgICAgICAgX3RoaXMxMC5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudChwb2ludGVyRG93blN0YXRlLCBldmVudCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEwLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuYm94U2VsZWN0aW9uLmhhc09jY3VycmVkID0gdHJ1ZTtcblxuICAgICAgICBjb25zdCBlbGVtZW50cyA9IF90aGlzMTAuc2NlbmUuZ2V0RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIC8vIGFsbG93cyBmb3IgYm94LXNlbGVjdGluZyBwb2ludHMgKHdpdGhvdXQgc2hpZnQpXG4gICAgICAgICFfdGhpczEwLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmIGlzU29tZUVsZW1lbnRTZWxlY3RlZChlbGVtZW50cywgX3RoaXMxMC5zdGF0ZSkpIHtcbiAgICAgICAgICBpZiAocG9pbnRlckRvd25TdGF0ZS53aXRoQ21kT3JDdHJsICYmIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgICBbcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pLCBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSAvLyBib3gtc2VsZWN0IGxpbmUgZWRpdG9yIHBvaW50c1xuXG5cbiAgICAgICAgaWYgKF90aGlzMTAuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmhhbmRsZUJveFNlbGVjdGlvbihldmVudCwgX3RoaXMxMC5zdGF0ZSwgX3RoaXMxMC5zZXRTdGF0ZS5iaW5kKF90aGlzMTApKTsgLy8gcmVndWxhciBib3gtc2VsZWN0XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24gPSBnZXRFbGVtZW50c1dpdGhpblNlbGVjdGlvbihlbGVtZW50cywgZHJhZ2dpbmdFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTAuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwgZWxlbWVudHNXaXRoaW5TZWxlY3Rpb24ucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgIH0sIHt9KSksIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPyB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdXNpbmcgY3RybC9jbWQsIHNlbGVjdCB0aGUgaGl0RWxlbWVudCBvbmx5IGlmIHdlXG4gICAgICAgICAgICAgICAgLy8gaGF2ZW4ndCBib3gtc2VsZWN0ZWQgYW55dGhpbmcgZWxzZVxuICAgICAgICAgICAgICAgIFtwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50LmlkXTogIWVsZW1lbnRzV2l0aGluU2VsZWN0aW9uLmxlbmd0aFxuICAgICAgICAgICAgICB9IDogbnVsbClcbiAgICAgICAgICAgIH0pLCBfdGhpczEwLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0gLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBwb2ludGVyIG1vdmUgaGFwcGVuZWQgb3ZlciBlaXRoZXIgc2Nyb2xsYmFyXG5cblxuICBoYW5kbGVQb2ludGVyTW92ZU92ZXJTY3JvbGxiYXJzKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuc2Nyb2xsYmFycy5pc092ZXJIb3Jpem9udGFsKSB7XG4gICAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WDtcbiAgICAgIGNvbnN0IGR4ID0geCAtIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54O1xuICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc3RhdGUuc2Nyb2xsWCAtIGR4IC8gdGhpcy5zdGF0ZS56b29tLnZhbHVlXG4gICAgICB9KTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENvb3Jkcy54ID0geDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChwb2ludGVyRG93blN0YXRlLnNjcm9sbGJhcnMuaXNPdmVyVmVydGljYWwpIHtcbiAgICAgIGNvbnN0IHkgPSBldmVudC5jbGllbnRZO1xuICAgICAgY29uc3QgZHkgPSB5IC0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnk7XG4gICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWTogdGhpcy5zdGF0ZS5zY3JvbGxZIC0gZHkgLyB0aGlzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzLnkgPSB5O1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgb25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICB2YXIgX3RoaXMxMSA9IHRoaXM7XG5cbiAgICByZXR1cm4gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChjaGlsZEV2ZW50KSB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudCxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50LFxuICAgICAgICBtdWx0aUVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnRUeXBlLFxuICAgICAgICBlbGVtZW50TG9ja2VkLFxuICAgICAgICBpc1Jlc2l6aW5nLFxuICAgICAgICBpc1JvdGF0aW5nXG4gICAgICB9ID0gX3RoaXMxMS5zdGF0ZTtcblxuICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgIGlzUmVzaXppbmc6IGZhbHNlLFxuICAgICAgICBpc1JvdGF0aW5nOiBmYWxzZSxcbiAgICAgICAgcmVzaXppbmdFbGVtZW50OiBudWxsLFxuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBudWxsLFxuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIixcbiAgICAgICAgLy8gdGV4dCBlbGVtZW50cyBhcmUgcmVzZXQgb24gZmluYWxpemUsIGFuZCByZXNldHRpbmcgb24gcG9pbnRlcnVwXG4gICAgICAgIC8vIG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBkb3VibGUgdGFwc1xuICAgICAgICBlZGl0aW5nRWxlbWVudDogbXVsdGlFbGVtZW50IHx8IGlzVGV4dEVsZW1lbnQoX3RoaXMxMS5zdGF0ZS5lZGl0aW5nRWxlbWVudCkgPyBfdGhpczExLnN0YXRlLmVkaXRpbmdFbGVtZW50IDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTEuc2F2ZVBvaW50ZXIoY2hpbGRFdmVudC5jbGllbnRYLCBjaGlsZEV2ZW50LmNsaWVudFksIFwidXBcIik7IC8vIEhhbmRsZSBlbmQgb2YgZHJhZ2dpbmcgYSBwb2ludCBvZiBhIGxpbmVhciBlbGVtZW50LCBtaWdodCBjbG9zZSBhIGxvb3BcbiAgICAgIC8vIGFuZCBzZXRzIGJpbmRpbmcgZWxlbWVudFxuXG5cbiAgICAgIGlmIChfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgIGlmICghcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQgJiYgKHBvaW50ZXJEb3duU3RhdGUuaGl0Py5lbGVtZW50Py5pZCAhPT0gX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgfHwgIXBvaW50ZXJEb3duU3RhdGUuaGl0Lmhhc0hpdEVsZW1lbnRJbnNpZGUpKSB7XG4gICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGVkaXRpbmdMaW5lYXJFbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyVXAoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCwgX3RoaXMxMS5zdGF0ZSk7XG5cbiAgICAgICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IF90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGFzdFBvaW50ZXJVcCA9IG51bGw7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCk7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlET1dOLCBwb2ludGVyRG93blN0YXRlLmV2ZW50TGlzdGVuZXJzLm9uS2V5RG93bik7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihFVkVOVC5LRVlVUCwgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwKTtcblxuICAgICAgaWYgKF90aGlzMTEuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCkge1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBwZW5kaW5nSW1hZ2VFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZHJhZ2dpbmdFbGVtZW50Py50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICAgICAgY29uc3QgcG9pbnRlckNvb3JkcyA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhjaGlsZEV2ZW50LCBfdGhpczExLnN0YXRlKTtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gZHJhZ2dpbmdFbGVtZW50LnBvaW50cztcbiAgICAgICAgbGV0IGR4ID0gcG9pbnRlckNvb3Jkcy54IC0gZHJhZ2dpbmdFbGVtZW50Lng7XG4gICAgICAgIGxldCBkeSA9IHBvaW50ZXJDb29yZHMueSAtIGRyYWdnaW5nRWxlbWVudC55OyAvLyBBbGxvd3MgZG90cyB0byBhdm9pZCBiZWluZyBmbGFnZ2VkIGFzIGluZmluaXRlbHkgc21hbGxcblxuICAgICAgICBpZiAoZHggPT09IHBvaW50c1swXVswXSAmJiBkeSA9PT0gcG9pbnRzWzBdWzFdKSB7XG4gICAgICAgICAgZHkgKz0gMC4wMDAxO1xuICAgICAgICAgIGR4ICs9IDAuMDAwMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByZXNzdXJlcyA9IGRyYWdnaW5nRWxlbWVudC5zaW11bGF0ZVByZXNzdXJlID8gW10gOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnByZXNzdXJlcywgY2hpbGRFdmVudC5wcmVzc3VyZV07XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCB7XG4gICAgICAgICAgcG9pbnRzOiBbLi4ucG9pbnRzLCBbZHgsIGR5XV0sXG4gICAgICAgICAgcHJlc3N1cmVzLFxuICAgICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogW2R4LCBkeV1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGlzSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gZHJhZ2dpbmdFbGVtZW50O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgX3RoaXMxMS5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCk7XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgICBbaW1hZ2VFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIF90aGlzMTEuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcblxuICAgICAgICAgIF90aGlzMTEuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsLmlkICE9PSBpbWFnZUVsZW1lbnQuaWQ7XG4gICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgX3RoaXMxMS5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMaW5lYXJFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudC5wb2ludHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoY2hpbGRFdmVudCwgX3RoaXMxMS5zdGF0ZSk7XG5cbiAgICAgICAgaWYgKCFwb2ludGVyRG93blN0YXRlLmRyYWcuaGFzT2NjdXJyZWQgJiYgZHJhZ2dpbmdFbGVtZW50ICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwge1xuICAgICAgICAgICAgcG9pbnRzOiBbLi4uZHJhZ2dpbmdFbGVtZW50LnBvaW50cywgW3BvaW50ZXJDb29yZHMueCAtIGRyYWdnaW5nRWxlbWVudC54LCBwb2ludGVyQ29vcmRzLnkgLSBkcmFnZ2luZ0VsZW1lbnQueV1dXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIG11bHRpRWxlbWVudDogZHJhZ2dpbmdFbGVtZW50LFxuICAgICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IF90aGlzMTEuc3RhdGUuZHJhZ2dpbmdFbGVtZW50XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAocG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFtdWx0aUVsZW1lbnQpIHtcbiAgICAgICAgICBpZiAoaXNCaW5kaW5nRW5hYmxlZChfdGhpczExLnN0YXRlKSAmJiBpc0JpbmRpbmdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkpIHtcbiAgICAgICAgICAgIG1heWJlQmluZExpbmVhckVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczExLnN0YXRlLCBfdGhpczExLnNjZW5lLCBwb2ludGVyQ29vcmRzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXSxcbiAgICAgICAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBudWxsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIWVsZW1lbnRMb2NrZWQpIHtcbiAgICAgICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTEuY2FudmFzKTtcblxuICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzKSwge30sIHtcbiAgICAgICAgICAgICAgICAgIFtfdGhpczExLnN0YXRlLmRyYWdnaW5nRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRyYWdnaW5nRWxlbWVudDogbnVsbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBbX3RoaXMxMS5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmIGRyYWdnaW5nRWxlbWVudCAmJiBpc0ludmlzaWJseVNtYWxsRWxlbWVudChkcmFnZ2luZ0VsZW1lbnQpKSB7XG4gICAgICAgIC8vIHJlbW92ZSBpbnZpc2libGUgZWxlbWVudCB3aGljaCB3YXMgYWRkZWQgaW4gb25Qb2ludGVyRG93blxuICAgICAgICBfdGhpczExLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLnNsaWNlKDAsIC0xKSk7XG5cbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoZHJhZ2dpbmdFbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZXNpemluZ0VsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMS5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzaXppbmdFbGVtZW50ICYmIGlzSW52aXNpYmx5U21hbGxFbGVtZW50KHJlc2l6aW5nRWxlbWVudCkpIHtcbiAgICAgICAgX3RoaXMxMS5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maWx0ZXIoZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgcmV0dXJuIGVsLmlkICE9PSByZXNpemluZ0VsZW1lbnQuaWQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH0gLy8gQ29kZSBiZWxvdyBoYW5kbGVzIHNlbGVjdGlvbiB3aGVuIGVsZW1lbnQocykgd2VyZW4ndFxuICAgICAgLy8gZHJhZyBvciBhZGRlZCB0byBzZWxlY3Rpb24gb24gcG9pbnRlciBkb3duIHBoYXNlLlxuXG5cbiAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuXG4gICAgICBpZiAoaGl0RWxlbWVudCAmJiAhcG9pbnRlckRvd25TdGF0ZS5kcmFnLmhhc09jY3VycmVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC53YXNBZGRlZFRvU2VsZWN0aW9uICYmICggLy8gaWYgd2UncmUgZWRpdGluZyBhIGxpbmUsIHBvaW50ZXJ1cCBzaG91bGRuJ3Qgc3dpdGNoIHNlbGVjdGlvbiBpZlxuICAgICAgLy8gYm94IHNlbGVjdGVkXG4gICAgICAhX3RoaXMxMS5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCB8fCAhcG9pbnRlckRvd25TdGF0ZS5ib3hTZWxlY3Rpb24uaGFzT2NjdXJyZWQpKSB7XG4gICAgICAgIC8vIHdoZW4gaW5zaWRlIGxpbmUgZWRpdG9yLCBzaGlmdCBzZWxlY3RzIHBvaW50cyBpbnN0ZWFkXG4gICAgICAgIGlmIChjaGlsZEV2ZW50LnNoaWZ0S2V5ICYmICFfdGhpczExLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgaWYgKF90aGlzMTEuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICBpZiAoaXNTZWxlY3RlZFZpYUdyb3VwKF90aGlzMTEuc3RhdGUsIGhpdEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gdW5zZWxlY3QgYWxsIGdyb3VwcyBoaXRFbGVtZW50IGlzIHBhcnQgb2ZcbiAgICAgICAgICAgICAgLy8gYXMgd2VsbCBhcyBhbGwgZWxlbWVudHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgZ3JvdXBzXG4gICAgICAgICAgICAgIC8vIGhpdEVsZW1lbnQgaXMgcGFydCBvZlxuICAgICAgICAgICAgICBjb25zdCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMgPSBoaXRFbGVtZW50Lmdyb3VwSWRzLmZsYXRNYXAoZnVuY3Rpb24gKGdyb3VwSWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RWxlbWVudHNJbkdyb3VwKF90aGlzMTEuc2NlbmUuZ2V0RWxlbWVudHMoKSwgZ3JvdXBJZCk7XG4gICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSkucmVkdWNlKGZ1bmN0aW9uIChwcmV2SWQsIGFjYykge1xuICAgICAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZJZCksIGFjYyk7XG4gICAgICAgICAgICAgIH0sIHt9KTtcblxuICAgICAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChfcHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBoaXRFbGVtZW50Lmdyb3VwSWRzLm1hcChmdW5jdGlvbiAoZ0lkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgW2dJZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICB9KS5yZWR1Y2UoZnVuY3Rpb24gKHByZXYsIGFjYykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2KSwgYWNjKTtcbiAgICAgICAgICAgICAgICAgIH0sIHt9KSksXG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCBpZHNPZlNlbGVjdGVkRWxlbWVudHNUaGF0QXJlSW5Hcm91cHMpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyByZW1vdmUgZWxlbWVudCBmcm9tIHNlbGVjdGlvbiB3aGlsZVxuICAgICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdyb3Vwc0ZvclNlbGVjdGVkRWxlbWVudHMoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBwcmV2U3RhdGUpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgICBbaGl0RWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0pLCBfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gYWRkIGVsZW1lbnQgdG8gc2VsZWN0aW9uIHdoaWxlXG4gICAgICAgICAgICAvLyBrZWVwaW5nIHByZXYgZWxlbWVudHMgc2VsZWN0ZWRcbiAgICAgICAgICAgIF90aGlzMTEuc2V0U3RhdGUoZnVuY3Rpb24gKF9wcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3ByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKHt9LCBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCBfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCkpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIV90aGlzMTEuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiYgIXBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCAmJiAhX3RoaXMxMS5zdGF0ZS5pc1Jlc2l6aW5nICYmIChoaXRFbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudChoaXRFbGVtZW50LCBfdGhpczExLnN0YXRlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55KSB8fCAhaGl0RWxlbWVudCAmJiBwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykpIHtcbiAgICAgICAgLy8gRGVzZWxlY3Qgc2VsZWN0ZWQgZWxlbWVudHNcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgICBzZWxlY3RlZEdyb3VwSWRzOiB7fSxcbiAgICAgICAgICBlZGl0aW5nR3JvdXBJZDogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiICYmIGRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgICBfdGhpczExLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgICBbZHJhZ2dpbmdFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiIHx8IGlzU29tZUVsZW1lbnRTZWxlY3RlZChfdGhpczExLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTEuc3RhdGUpKSB7XG4gICAgICAgIF90aGlzMTEuaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUuZHJhZy5oYXNPY2N1cnJlZCB8fCBpc1Jlc2l6aW5nIHx8IGlzUm90YXRpbmcpIHtcbiAgICAgICAgKGlzQmluZGluZ0VuYWJsZWQoX3RoaXMxMS5zdGF0ZSkgPyBiaW5kT3JVbmJpbmRTZWxlY3RlZEVsZW1lbnRzIDogdW5iaW5kTGluZWFyRWxlbWVudHMpKGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMS5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczExLnN0YXRlKSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghZWxlbWVudExvY2tlZCAmJiBlbGVtZW50VHlwZSAhPT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTEuY2FudmFzKTtcblxuICAgICAgICBfdGhpczExLnNldFN0YXRlKHtcbiAgICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdLFxuICAgICAgICAgIGVsZW1lbnRUeXBlOiBcInNlbGVjdGlvblwiXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMS5zZXRTdGF0ZSh7XG4gICAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBudWxsLFxuICAgICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cykge1xuICAgIGNvbnN0IHN1Z2dlc3RlZEJpbmRpbmdzID0gZ2V0RWxpZ2libGVFbGVtZW50c0ZvckJpbmRpbmcoc2VsZWN0ZWRFbGVtZW50cyk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nc1xuICAgIH0pO1xuICB9XG5cbiAgY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCkge1xuICAgIHRoaXMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIC8vIENvbnRpbnVlIGVkaXRpbmcgdGhlIHNhbWUgZ3JvdXAgaWYgdGhlIHVzZXIgc2VsZWN0ZWQgYSBkaWZmZXJlbnRcbiAgICAgICAgLy8gZWxlbWVudCBmcm9tIGl0XG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBwcmV2U3RhdGUuZWRpdGluZ0dyb3VwSWQgJiYgaGl0RWxlbWVudCAhPSBudWxsICYmIGlzRWxlbWVudEluR3JvdXAoaGl0RWxlbWVudCwgcHJldlN0YXRlLmVkaXRpbmdHcm91cElkKSA/IHByZXZTdGF0ZS5lZGl0aW5nR3JvdXBJZCA6IG51bGxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHRoaXMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgfSk7XG4gIH1cblxuICBnZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHgsIHksIGFwcFN0YXRlLCBjYW52YXMsIHNjYWxlKSB7XG4gICAgY29uc3QgZWxlbWVudENsaWNrZWRJbnNpZGUgPSBnZXRFbGVtZW50Q29udGFpbmluZ1Bvc2l0aW9uKHRoaXMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gIWlzVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgfSksIHgsIHkpO1xuXG4gICAgaWYgKGVsZW1lbnRDbGlja2VkSW5zaWRlKSB7XG4gICAgICBjb25zdCBlbGVtZW50Q2VudGVyWCA9IGVsZW1lbnRDbGlja2VkSW5zaWRlLnggKyBlbGVtZW50Q2xpY2tlZEluc2lkZS53aWR0aCAvIDI7XG4gICAgICBjb25zdCBlbGVtZW50Q2VudGVyWSA9IGVsZW1lbnRDbGlja2VkSW5zaWRlLnkgKyBlbGVtZW50Q2xpY2tlZEluc2lkZS5oZWlnaHQgLyAyO1xuICAgICAgY29uc3QgZGlzdGFuY2VUb0NlbnRlciA9IE1hdGguaHlwb3QoeCAtIGVsZW1lbnRDZW50ZXJYLCB5IC0gZWxlbWVudENlbnRlclkpO1xuICAgICAgY29uc3QgaXNTbmFwcGVkVG9DZW50ZXIgPSBkaXN0YW5jZVRvQ2VudGVyIDwgVEVYVF9UT19DRU5URVJfU05BUF9USFJFU0hPTEQ7XG5cbiAgICAgIGlmIChpc1NuYXBwZWRUb0NlbnRlcikge1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgeDogdmlld3BvcnRYLFxuICAgICAgICAgIHk6IHZpZXdwb3J0WVxuICAgICAgICB9ID0gc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzKHtcbiAgICAgICAgICBzY2VuZVg6IGVsZW1lbnRDZW50ZXJYLFxuICAgICAgICAgIHNjZW5lWTogZWxlbWVudENlbnRlcllcbiAgICAgICAgfSwgYXBwU3RhdGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZpZXdwb3J0WCxcbiAgICAgICAgICB2aWV3cG9ydFksXG4gICAgICAgICAgZWxlbWVudENlbnRlclgsXG4gICAgICAgICAgZWxlbWVudENlbnRlcllcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRDYW52YXNPZmZzZXRzKCkge1xuICAgIGlmICh0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSB0aGlzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbGVmdCxcbiAgICAgICAgdG9wXG4gICAgICB9ID0gZXhjYWxpZHJhd0NvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldExlZnQ6IGxlZnQsXG4gICAgICAgIG9mZnNldFRvcDogdG9wXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvZmZzZXRMZWZ0OiAwLFxuICAgICAgb2Zmc2V0VG9wOiAwXG4gICAgfTtcbiAgfVxuXG4gIHVwZGF0ZUxhbmd1YWdlKCkge1xuICAgIHZhciBfdGhpczEyID0gdGhpcztcblxuICAgIHJldHVybiBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgY29uc3QgY3VycmVudExhbmcgPSBsYW5ndWFnZXMuZmluZChmdW5jdGlvbiAobGFuZykge1xuICAgICAgICByZXR1cm4gbGFuZy5jb2RlID09PSBfdGhpczEyLnByb3BzLmxhbmdDb2RlO1xuICAgICAgfSkgfHwgZGVmYXVsdExhbmc7XG4gICAgICB5aWVsZCBzZXRMYW5ndWFnZShjdXJyZW50TGFuZyk7XG5cbiAgICAgIF90aGlzMTIuc2V0QXBwU3RhdGUoe30pO1xuICAgIH0pKCk7XG4gIH1cblxufSAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gVEVTVCBIT09LU1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG5BcHAuZGVmYXVsdFByb3BzID0ge1xuICAvLyBuZWVkZWQgZm9yIHRlc3RzIHRvIHBhc3Mgc2luY2Ugd2UgZGlyZWN0bHkgcmVuZGVyIEFwcCBpbiBtYW55IHRlc3RzXG4gIFVJT3B0aW9uczogREVGQVVMVF9VSV9PUFRJT05TXG59O1xuXG52YXIgX2luaXRpYWxpc2VQcm9wcyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyIF90aGlzMTMgPSB0aGlzO1xuXG4gIHRoaXMuY2FudmFzID0gbnVsbDtcbiAgdGhpcy5yYyA9IG51bGw7XG4gIHRoaXMudW5tb3VudGVkID0gZmFsc2U7XG4gIHRoaXMuaXNNb2JpbGUgPSBmYWxzZTtcbiAgdGhpcy5leGNhbGlkcmF3Q29udGFpbmVyUmVmID0gLyojX19QVVJFX18qL1JlYWN0LmNyZWF0ZVJlZigpO1xuICB0aGlzLmZpbGVzID0ge307XG4gIHRoaXMuaW1hZ2VDYWNoZSA9IG5ldyBNYXAoKTtcblxuICB0aGlzLmZvY3VzQ29udGFpbmVyID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdGhpczEzLnByb3BzLmF1dG9Gb2N1cykge1xuICAgICAgX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gIH07XG5cbiAgdGhpcy5nZXRTY2VuZUVsZW1lbnRzID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG4gIH07XG5cbiAgdGhpcy5zeW5jQWN0aW9uUmVzdWx0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChhY3Rpb25SZXN1bHQpIHtcbiAgICBpZiAoX3RoaXMxMy51bm1vdW50ZWQgfHwgYWN0aW9uUmVzdWx0ID09PSBmYWxzZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBlZGl0aW5nRWxlbWVudCA9IG51bGw7XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKSB7XG4gICAgICBhY3Rpb25SZXN1bHQuZWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudD8uaWQgPT09IGVsZW1lbnQuaWQgJiYgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCAhPT0gZWxlbWVudCAmJiBpc05vbkRlbGV0ZWRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoYWN0aW9uUmVzdWx0LmVsZW1lbnRzKTtcblxuICAgICAgaWYgKGFjdGlvblJlc3VsdC5jb21taXRUb0hpc3RvcnkpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhY3Rpb25SZXN1bHQuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBhY3Rpb25SZXN1bHQucmVwbGFjZUZpbGVzID8gYWN0aW9uUmVzdWx0LmZpbGVzIDogX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgYWN0aW9uUmVzdWx0LmZpbGVzKTtcblxuICAgICAgX3RoaXMxMy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUoKTtcbiAgICB9XG5cbiAgICBpZiAoYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IGVkaXRpbmdFbGVtZW50KSB7XG4gICAgICBpZiAoYWN0aW9uUmVzdWx0LmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgICBfdGhpczEzLmhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGxldCB2aWV3TW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy52aWV3TW9kZUVuYWJsZWQgfHwgZmFsc2U7XG4gICAgICBsZXQgemVuTW9kZUVuYWJsZWQgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy56ZW5Nb2RlRW5hYmxlZCB8fCBmYWxzZTtcbiAgICAgIGxldCBncmlkU2l6ZSA9IGFjdGlvblJlc3VsdD8uYXBwU3RhdGU/LmdyaWRTaXplIHx8IG51bGw7XG4gICAgICBsZXQgdGhlbWUgPSBhY3Rpb25SZXN1bHQ/LmFwcFN0YXRlPy50aGVtZSB8fCBUSEVNRS5MSUdIVDtcbiAgICAgIGxldCBuYW1lID0gYWN0aW9uUmVzdWx0Py5hcHBTdGF0ZT8ubmFtZSA/PyBfdGhpczEzLnN0YXRlLm5hbWU7XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgdmlld01vZGVFbmFibGVkID0gX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB6ZW5Nb2RlRW5hYmxlZCA9IF90aGlzMTMucHJvcHMuemVuTW9kZUVuYWJsZWQ7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgZ3JpZFNpemUgPSBfdGhpczEzLnByb3BzLmdyaWRNb2RlRW5hYmxlZCA/IEdSSURfU0laRSA6IG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy50aGVtZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICB0aGVtZSA9IF90aGlzMTMucHJvcHMudGhlbWU7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgX3RoaXMxMy5wcm9wcy5uYW1lICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgIG5hbWUgPSBfdGhpczEzLnByb3BzLm5hbWU7XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHN0YXRlKSB7XG4gICAgICAgIC8vIHVzaW5nIE9iamVjdC5hc3NpZ24gaW5zdGVhZCBvZiBzcHJlYWQgdG8gZm9vbCBUUyA0LjIuMisgaW50b1xuICAgICAgICAvLyByZWdhcmRpbmcgdGhlIHJlc3VsdGluZyB0eXBlIGFzIG5vdCBjb250YWluaW5nIHVuZGVmaW5lZFxuICAgICAgICAvLyAod2hpY2ggdGhlIGZvbGxvd2luZyBleHByZXNzaW9uIHdpbGwgbmV2ZXIgY29udGFpbilcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oYWN0aW9uUmVzdWx0LmFwcFN0YXRlIHx8IHt9LCB7XG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVkaXRpbmdFbGVtZW50IHx8IGFjdGlvblJlc3VsdC5hcHBTdGF0ZT8uZWRpdGluZ0VsZW1lbnQgfHwgbnVsbCxcbiAgICAgICAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgICAgICAgemVuTW9kZUVuYWJsZWQsXG4gICAgICAgICAgZ3JpZFNpemUsXG4gICAgICAgICAgdGhlbWUsXG4gICAgICAgICAgbmFtZVxuICAgICAgICB9KTtcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGFjdGlvblJlc3VsdC5zeW5jSGlzdG9yeSkge1xuICAgICAgICAgIF90aGlzMTMuaGlzdG9yeS5zZXRDdXJyZW50U3RhdGUoX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMub25CbHVyID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkOiB0cnVlXG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMub25VbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5vbkJsdXIoKTtcbiAgfTtcblxuICB0aGlzLmRpc2FibGVFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH07XG5cbiAgdGhpcy5vbkZvbnRMb2FkZWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5vblNjZW5lVXBkYXRlZCgpO1xuICB9O1xuXG4gIHRoaXMuaW1wb3J0TGlicmFyeUZyb21VcmwgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMyA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAodXJsLCB0b2tlbikge1xuICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5oYXNoLmluY2x1ZGVzKFVSTF9IQVNIX0tFWVMuYWRkTGlicmFyeSkpIHtcbiAgICAgICAgY29uc3QgaGFzaCA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkpO1xuICAgICAgICBoYXNoLmRlbGV0ZShVUkxfSEFTSF9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgIyR7aGFzaC50b1N0cmluZygpfWApO1xuICAgICAgfSBlbHNlIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoLmluY2x1ZGVzKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTtcbiAgICAgICAgcXVlcnkuZGVsZXRlKFVSTF9RVUVSWV9LRVlTLmFkZExpYnJhcnkpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sIEFQUF9OQU1FLCBgPyR7cXVlcnkudG9TdHJpbmcoKX1gKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVxdWVzdCA9IHlpZWxkIGZldGNoKGRlY29kZVVSSUNvbXBvbmVudCh1cmwpKTtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIHJlcXVlc3QuYmxvYigpO1xuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5wYXJzZSh5aWVsZCBibG9iLnRleHQoKSk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkTGlicmFyeShqc29uKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRva2VuID09PSBfdGhpczEzLmlkIHx8IHdpbmRvdy5jb25maXJtKHQoXCJhbGVydHMuY29uZmlybUFkZExpYnJhcnlcIiwge1xuICAgICAgICAgIG51bVNoYXBlczogKGpzb24ubGlicmFyeUl0ZW1zIHx8IGpzb24ubGlicmFyeSB8fCBbXSkubGVuZ3RoXG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIHlpZWxkIF90aGlzMTMubGlicmFyeS5pbXBvcnRMaWJyYXJ5KGJsb2IsIFwicHVibGlzaGVkXCIpOyAvLyBoYWNrIHRvIHJlcmVuZGVyIHRoZSBsaWJyYXJ5IGl0ZW1zIGFmdGVyIGltcG9ydFxuXG4gICAgICAgICAgaWYgKF90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3Blbikge1xuICAgICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IGZhbHNlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTGlicmFyeU9wZW46IHRydWVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgd2luZG93LmFsZXJ0KHQoXCJhbGVydHMuZXJyb3JMb2FkaW5nTGlicmFyeVwiKSk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgX3RoaXMxMy5mb2N1c0NvbnRhaW5lcigpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeCwgX3gyKSB7XG4gICAgICByZXR1cm4gX3JlZjMuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5yZXNldEhpc3RvcnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5oaXN0b3J5LmNsZWFyKCk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIGdldERlZmF1bHRBcHBTdGF0ZSgpKSwge30sIHtcbiAgICAgICAgaXNMb2FkaW5nOiBvcHRzPy5yZXNldExvYWRpbmdTdGF0ZSA/IGZhbHNlIDogc3RhdGUuaXNMb2FkaW5nLFxuICAgICAgICB0aGVtZTogX3RoaXMxMy5zdGF0ZS50aGVtZVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuICB9KTtcbiAgdGhpcy5pbml0aWFsaXplU2NlbmUgPSAvKiNfX1BVUkVfXyovX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qICgpIHtcbiAgICBpZiAoXCJsYXVuY2hRdWV1ZVwiIGluIHdpbmRvdyAmJiBcIkxhdW5jaFBhcmFtc1wiIGluIHdpbmRvdykge1xuICAgICAgd2luZG93LmxhdW5jaFF1ZXVlLnNldENvbnN1bWVyKCAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgX3JlZjUgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGxhdW5jaFBhcmFtcykge1xuICAgICAgICAgIGlmICghbGF1bmNoUGFyYW1zLmZpbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVIYW5kbGUgPSBsYXVuY2hQYXJhbXMuZmlsZXNbMF07XG4gICAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGVIYW5kbGUuZ2V0RmlsZSgpO1xuICAgICAgICAgIGJsb2IuaGFuZGxlID0gZmlsZUhhbmRsZTtcbiAgICAgICAgICBsb2FkRnJvbUJsb2IoYmxvYiwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkudGhlbihmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgICAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDMpIHtcbiAgICAgICAgICByZXR1cm4gX3JlZjUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKSk7XG4gICAgfVxuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmlzTG9hZGluZykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzTG9hZGluZzogdHJ1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGV0IGluaXRpYWxEYXRhID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBpbml0aWFsRGF0YSA9ICh5aWVsZCBfdGhpczEzLnByb3BzLmluaXRpYWxEYXRhKSB8fCBudWxsO1xuXG4gICAgICBpZiAoaW5pdGlhbERhdGE/LmxpYnJhcnlJdGVtcykge1xuICAgICAgICBfdGhpczEzLmxpYnJhcnlJdGVtc0Zyb21TdG9yYWdlID0gcmVzdG9yZUxpYnJhcnlJdGVtcyhpbml0aWFsRGF0YS5saWJyYXJ5SXRlbXMsIFwidW5wdWJsaXNoZWRcIik7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgaW5pdGlhbERhdGEgPSB7XG4gICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgZXJyb3JNZXNzYWdlOiBlcnJvci5tZXNzYWdlIHx8IFwiRW5jb3VudGVyZWQgYW4gZXJyb3IgZHVyaW5nIGltcG9ydGluZyBvciByZXN0b3Jpbmcgc2NlbmUgZGF0YVwiXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmUgPSByZXN0b3JlKGluaXRpYWxEYXRhLCBudWxsLCBudWxsKTtcbiAgICBzY2VuZS5hcHBTdGF0ZSA9IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUpLCB7fSwge1xuICAgICAgZWxlbWVudFR5cGU6IHNjZW5lLmFwcFN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIgPyBcInNlbGVjdGlvblwiIDogc2NlbmUuYXBwU3RhdGUuZWxlbWVudFR5cGUsXG4gICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgfSk7XG5cbiAgICBpZiAoaW5pdGlhbERhdGE/LnNjcm9sbFRvQ29udGVudCkge1xuICAgICAgc2NlbmUuYXBwU3RhdGUgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwgY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKHNjZW5lLmVsZW1lbnRzLCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lLmFwcFN0YXRlKSwge30sIHtcbiAgICAgICAgd2lkdGg6IF90aGlzMTMuc3RhdGUud2lkdGgsXG4gICAgICAgIGhlaWdodDogX3RoaXMxMy5zdGF0ZS5oZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3AsXG4gICAgICAgIG9mZnNldExlZnQ6IF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdFxuICAgICAgfSksIG51bGwpKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnJlc2V0SGlzdG9yeSgpO1xuXG4gICAgX3RoaXMxMy5zeW5jQWN0aW9uUmVzdWx0KF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUpLCB7fSwge1xuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlXG4gICAgfSkpO1xuXG4gICAgY29uc3QgbGlicmFyeVVybCA9IC8vIGN1cnJlbnRcbiAgICBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpKS5nZXQoVVJMX0hBU0hfS0VZUy5hZGRMaWJyYXJ5KSB8fCAvLyBsZWdhY3ksIGtlcHQgZm9yIGNvbXBhdCByZWFzb25zXG4gICAgbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5nZXQoVVJMX1FVRVJZX0tFWVMuYWRkTGlicmFyeSk7XG5cbiAgICBpZiAobGlicmFyeVVybCkge1xuICAgICAgeWllbGQgX3RoaXMxMy5pbXBvcnRMaWJyYXJ5RnJvbVVybChsaWJyYXJ5VXJsKTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uUmVzaXplID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7fSk7XG4gIH0pO1xuICB0aGlzLm9uU2Nyb2xsID0gZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIG9mZnNldFRvcCxcbiAgICAgIG9mZnNldExlZnRcbiAgICB9ID0gX3RoaXMxMy5nZXRDYW52YXNPZmZzZXRzKCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChzdGF0ZSkge1xuICAgICAgaWYgKHN0YXRlLm9mZnNldExlZnQgPT09IG9mZnNldExlZnQgJiYgc3RhdGUub2Zmc2V0VG9wID09PSBvZmZzZXRUb3ApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdFxuICAgICAgfTtcbiAgICB9KTtcbiAgfSwgU0NST0xMX1RJTUVPVVQpO1xuICB0aGlzLm9uQ3V0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmN1dEFsbCgpO1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfSk7XG4gIHRoaXMub25Db3B5ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzRXhjYWxpZHJhd0FjdGl2ZSA9IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50Py5jb250YWlucyhkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcblxuICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlIHx8IGlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfdGhpczEzLmNvcHlBbGwoKTtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH0pO1xuXG4gIHRoaXMuY3V0QWxsID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuY29weUFsbCgpO1xuXG4gICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVsZXRlU2VsZWN0ZWQpO1xuICB9O1xuXG4gIHRoaXMuY29weUFsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb3B5VG9DbGlwYm9hcmQoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmZpbGVzKTtcbiAgfTtcblxuICB0aGlzLm9uVGFwU3RhcnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoIWRpZFRhcFR3aWNlKSB7XG4gICAgICBkaWRUYXBUd2ljZSA9IHRydWU7XG4gICAgICBjbGVhclRpbWVvdXQodGFwcGVkVHdpY2VUaW1lcik7XG4gICAgICB0YXBwZWRUd2ljZVRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoQXBwLnJlc2V0VGFwVHdpY2UsIFRBUF9UV0lDRV9USU1FT1VUKTtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIGluc2VydCB0ZXh0IG9ubHkgaWYgd2UgdGFwcGVkIHR3aWNlIHdpdGggYSBzaW5nbGUgZmluZ2VyXG4gICAgLy8gZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEgd2lsbCBhbHNvIHByZXZlbnQgaW5zZXJ0aW5nIHRleHQgd2hlbiB1c2VyJ3Mgem9vbWluZ1xuXG5cbiAgICBpZiAoZGlkVGFwVHdpY2UgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGNvbnN0IFt0b3VjaF0gPSBldmVudC50b3VjaGVzOyAvLyBAdHMtaWdub3JlXG5cbiAgICAgIF90aGlzMTMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2soe1xuICAgICAgICBjbGllbnRYOiB0b3VjaC5jbGllbnRYLFxuICAgICAgICBjbGllbnRZOiB0b3VjaC5jbGllbnRZXG4gICAgICB9KTtcblxuICAgICAgZGlkVGFwVHdpY2UgPSBmYWxzZTtcbiAgICAgIGNsZWFyVGltZW91dCh0YXBwZWRUd2ljZVRpbWVyKTtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMub25UYXBFbmQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGggPiAwKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUucHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHNcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnBhc3RlRnJvbUNsaXBib2FyZCA9IHdpdGhCYXRjaGVkVXBkYXRlcyggLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjYgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICAvLyAjNjg2XG4gICAgICBjb25zdCB0YXJnZXQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgICAgY29uc3QgaXNFeGNhbGlkcmF3QWN0aXZlID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ/LmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICAgIGlmICghaXNFeGNhbGlkcmF3QWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZWxlbWVudFVuZGVyQ3Vyc29yID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChjdXJzb3JYLCBjdXJzb3JZKTtcblxuICAgICAgaWYgKCAvLyBpZiBubyBDbGlwYm9hcmRFdmVudCBzdXBwbGllZCwgYXNzdW1lIHdlJ3JlIHBhc3RpbmcgdmlhIGNvbnRleHRNZW51XG4gICAgICAvLyB0aHVzIHRoZXNlIGNoZWNrcyBkb24ndCBtYWtlIHNlbnNlXG4gICAgICBldmVudCAmJiAoIShlbGVtZW50VW5kZXJDdXJzb3IgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCkgfHwgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSAvLyBtdXN0IGJlIGNhbGxlZCBpbiB0aGUgc2FtZSBmcmFtZSAodGh1cyBiZWZvcmUgYW55IGF3YWl0cykgYXMgdGhlIHBhc3RlXG4gICAgICAvLyBldmVudCBlbHNlIHNvbWUgYnJvd3NlcnMgKEZGLi4uKSB3aWxsIGNsZWFyIHRoZSBjbGlwYm9hcmREYXRhXG4gICAgICAvLyAoc29tZXRoaW5nIHNvbWV0aGluZyBzZWN1cml0eSlcblxuXG4gICAgICBsZXQgZmlsZSA9IGV2ZW50Py5jbGlwYm9hcmREYXRhPy5maWxlc1swXTtcbiAgICAgIGNvbnN0IGRhdGEgPSB5aWVsZCBwYXJzZUNsaXBib2FyZChldmVudCk7XG5cbiAgICAgIGlmICghZmlsZSAmJiBkYXRhLnRleHQpIHtcbiAgICAgICAgY29uc3Qgc3RyaW5nID0gZGF0YS50ZXh0LnRyaW0oKTtcblxuICAgICAgICBpZiAoc3RyaW5nLnN0YXJ0c1dpdGgoXCI8c3ZnXCIpICYmIHN0cmluZy5lbmRzV2l0aChcIjwvc3ZnPlwiKSkge1xuICAgICAgICAgIC8vIGlnbm9yZSBTVkcgdmFsaWRhdGlvbi9ub3JtYWxpemF0aW9uIHdoaWNoIHdpbGwgYmUgZG9uZSBkdXJpbmcgaW1hZ2VcbiAgICAgICAgICAvLyBpbml0aWFsaXphdGlvblxuICAgICAgICAgIGZpbGUgPSBTVkdTdHJpbmdUb0ZpbGUoc3RyaW5nKTtcbiAgICAgICAgfVxuICAgICAgfSAvLyBwcmVmZXIgc3ByZWFkc2hlZXQgZGF0YSBvdmVyIGltYWdlIGZpbGUgKE1TIE9mZmljZS9MaWJyZSBPZmZpY2UpXG5cblxuICAgICAgaWYgKGlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpICYmICFkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4OiBzY2VuZVgsXG4gICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgICAgIGNsaWVudFg6IGN1cnNvclgsXG4gICAgICAgICAgY2xpZW50WTogY3Vyc29yWVxuICAgICAgICB9LCBfdGhpczEzLnN0YXRlKTtcblxuICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgc2NlbmVYLFxuICAgICAgICAgIHNjZW5lWVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGZpbGUpO1xuXG4gICAgICAgIF90aGlzMTMuaW5pdGlhbGl6ZUltYWdlRGltZW5zaW9ucyhpbWFnZUVsZW1lbnQpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgICAgW2ltYWdlRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKF90aGlzMTMucHJvcHMub25QYXN0ZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICgoeWllbGQgX3RoaXMxMy5wcm9wcy5vblBhc3RlKGRhdGEsIGV2ZW50KSkgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkYXRhLmVycm9yTWVzc2FnZSkge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGRhdGEuZXJyb3JNZXNzYWdlXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLnNwcmVhZHNoZWV0KSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBhc3RlRGlhbG9nOiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLnNwcmVhZHNoZWV0LFxuICAgICAgICAgICAgc2hvd246IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIGlmIChkYXRhLmVsZW1lbnRzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBkYXRhLmVsZW1lbnRzLFxuICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzIHx8IG51bGwsXG4gICAgICAgICAgcG9zaXRpb246IFwiY3Vyc29yXCJcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGRhdGEudGV4dCkge1xuICAgICAgICBfdGhpczEzLmFkZFRleHRGcm9tUGFzdGUoZGF0YS50ZXh0KTtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZWxlY3RTaGFwZVRvb2woXCJzZWxlY3Rpb25cIik7XG5cbiAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDQpIHtcbiAgICAgIHJldHVybiBfcmVmNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKSk7XG5cbiAgdGhpcy5hZGRFbGVtZW50c0Zyb21QYXN0ZU9yTGlicmFyeSA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gICAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMob3B0cy5lbGVtZW50cywgbnVsbCk7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgICBjb25zdCBlbGVtZW50c0NlbnRlclggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSAvIDI7XG4gICAgY29uc3QgZWxlbWVudHNDZW50ZXJZID0gZGlzdGFuY2UobWluWSwgbWF4WSkgLyAyO1xuICAgIGNvbnN0IGNsaWVudFggPSB0eXBlb2Ygb3B0cy5wb3NpdGlvbiA9PT0gXCJvYmplY3RcIiA/IG9wdHMucG9zaXRpb24uY2xpZW50WCA6IG9wdHMucG9zaXRpb24gPT09IFwiY3Vyc29yXCIgPyBjdXJzb3JYIDogX3RoaXMxMy5zdGF0ZS53aWR0aCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldExlZnQ7XG4gICAgY29uc3QgY2xpZW50WSA9IHR5cGVvZiBvcHRzLnBvc2l0aW9uID09PSBcIm9iamVjdFwiID8gb3B0cy5wb3NpdGlvbi5jbGllbnRZIDogb3B0cy5wb3NpdGlvbiA9PT0gXCJjdXJzb3JcIiA/IGN1cnNvclkgOiBfdGhpczEzLnN0YXRlLmhlaWdodCAvIDIgKyBfdGhpczEzLnN0YXRlLm9mZnNldFRvcDtcbiAgICBjb25zdCB7XG4gICAgICB4LFxuICAgICAgeVxuICAgIH0gPSB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMoe1xuICAgICAgY2xpZW50WCxcbiAgICAgIGNsaWVudFlcbiAgICB9LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCBkeCA9IHggLSBlbGVtZW50c0NlbnRlclg7XG4gICAgY29uc3QgZHkgPSB5IC0gZWxlbWVudHNDZW50ZXJZO1xuICAgIGNvbnN0IGdyb3VwSWRNYXAgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQoZHgsIGR5LCBfdGhpczEzLnN0YXRlLmdyaWRTaXplKTtcbiAgICBjb25zdCBvbGRJZFRvRHVwbGljYXRlZElkID0gbmV3IE1hcCgpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnRzID0gZWxlbWVudHMubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICBjb25zdCBuZXdFbGVtZW50ID0gZHVwbGljYXRlRWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkLCBncm91cElkTWFwLCBlbGVtZW50LCB7XG4gICAgICAgIHg6IGVsZW1lbnQueCArIGdyaWRYIC0gbWluWCxcbiAgICAgICAgeTogZWxlbWVudC55ICsgZ3JpZFkgLSBtaW5ZXG4gICAgICB9KTtcbiAgICAgIG9sZElkVG9EdXBsaWNhdGVkSWQuc2V0KGVsZW1lbnQuaWQsIG5ld0VsZW1lbnQuaWQpO1xuICAgICAgcmV0dXJuIG5ld0VsZW1lbnQ7XG4gICAgfSk7XG4gICAgYmluZFRleHRUb1NoYXBlQWZ0ZXJEdXBsaWNhdGlvbihuZXdFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuICAgIGNvbnN0IG5leHRFbGVtZW50cyA9IFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCAuLi5uZXdFbGVtZW50c107XG4gICAgZml4QmluZGluZ3NBZnRlckR1cGxpY2F0aW9uKG5leHRFbGVtZW50cywgZWxlbWVudHMsIG9sZElkVG9EdXBsaWNhdGVkSWQpO1xuXG4gICAgaWYgKG9wdHMuZmlsZXMpIHtcbiAgICAgIF90aGlzMTMuZmlsZXMgPSBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF90aGlzMTMuZmlsZXMpLCBvcHRzLmZpbGVzKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhuZXh0RWxlbWVudHMpO1xuXG4gICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZSxcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczogbmV3RWxlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChtYXAsIGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgICAgICBtYXBbZWxlbWVudC5pZF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KSxcbiAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9XG4gICAgfSksIF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSksIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChvcHRzLmZpbGVzKSB7XG4gICAgICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChcInNlbGVjdGlvblwiKTtcbiAgfTtcblxuICB0aGlzLnNldEFwcFN0YXRlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIF90aGlzMTMuc2V0U3RhdGUob2JqKTtcbiAgfTtcblxuICB0aGlzLnJlbW92ZVBvaW50ZXIgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyByZW1vdmUgdG91Y2ggaGFuZGxlciBmb3IgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIiAmJiB0b3VjaFRpbWVvdXQpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcbiAgICAgIGludmFsaWRhdGVDb250ZXh0TWVudSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGdlc3R1cmUucG9pbnRlcnMuZGVsZXRlKGV2ZW50LnBvaW50ZXJJZCk7XG4gIH07XG5cbiAgdGhpcy50b2dnbGVMb2NrID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZWxlbWVudExvY2tlZDogIXByZXZTdGF0ZS5lbGVtZW50TG9ja2VkLFxuICAgICAgICBlbGVtZW50VHlwZTogcHJldlN0YXRlLmVsZW1lbnRMb2NrZWQgPyBcInNlbGVjdGlvblwiIDogcHJldlN0YXRlLmVsZW1lbnRUeXBlXG4gICAgICB9O1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMudG9nZ2xlWmVuTW9kZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVaZW5Nb2RlKTtcbiAgfTtcblxuICB0aGlzLnRvZ2dsZVN0YXRzID0gZnVuY3Rpb24gKCkge1xuICAgIGlmICghX3RoaXMxMy5zdGF0ZS5zaG93U3RhdHMpIHtcbiAgICAgIHRyYWNrRXZlbnQoXCJkaWFsb2dcIiwgXCJzdGF0c1wiKTtcbiAgICB9XG5cbiAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25Ub2dnbGVTdGF0cyk7XG4gIH07XG5cbiAgdGhpcy5zY3JvbGxUb0NvbnRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgbGV0IHRhcmdldCA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKHt9LCBjYWxjdWxhdGVTY3JvbGxDZW50ZXIoQXJyYXkuaXNBcnJheSh0YXJnZXQpID8gdGFyZ2V0IDogW3RhcmdldF0sIF90aGlzMTMuc3RhdGUsIF90aGlzMTMuY2FudmFzKSkpO1xuICB9O1xuXG4gIHRoaXMuem9vbVRvRml0ID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCB0YXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICBsZXQgbWF4Wm9vbSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICBsZXQgbWFyZ2luID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiAwLjAzO1xuXG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHRhcmdldCA9IF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKTtcbiAgICB9XG5cbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4Wm9vbSA9IDE7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh6b29tVG9GaXRFbGVtZW50cyh0YXJnZXQsIF90aGlzMTMuc3RhdGUsIGZhbHNlLCBtYXhab29tLCBtYXJnaW4pLmFwcFN0YXRlKTtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZUNvbnRhaW5lclNpemUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGNvbnRhaW5lcnMpIHtcbiAgICBjb250YWluZXJzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICBjb25zdCBbeCwgeV0gPSByb3RhdGUoZWwueCArIGVsLndpZHRoLCBlbC55ICsgZWwuaGVpZ2h0LCBlbC54ICsgZWwud2lkdGggLyAyLCBlbC55ICsgZWwuaGVpZ2h0IC8gMiwgZWwuYW5nbGUpO1xuICAgICAgcmVzaXplU2luZ2xlRWxlbWVudChlbCwgdHJ1ZSwgZWwsIFwic2VcIiwgdHJ1ZSwgeCwgeSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHRoaXMuY2xlYXJUb2FzdCA9IGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHRvYXN0TWVzc2FnZTogbnVsbFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuc2V0VG9hc3RNZXNzYWdlID0gZnVuY3Rpb24gKHRvYXN0TWVzc2FnZSkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgdG9hc3RNZXNzYWdlXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXN0b3JlRmlsZUZyb21TaGFyZSA9IC8qI19fUFVSRV9fKi9fYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB3ZWJTaGFyZVRhcmdldENhY2hlID0geWllbGQgY2FjaGVzLm9wZW4oXCJ3ZWItc2hhcmUtdGFyZ2V0XCIpO1xuICAgICAgY29uc3QgZmlsZSA9IHlpZWxkIHdlYlNoYXJlVGFyZ2V0Q2FjaGUubWF0Y2goXCJzaGFyZWQtZmlsZVwiKTtcblxuICAgICAgaWYgKGZpbGUpIHtcbiAgICAgICAgY29uc3QgYmxvYiA9IHlpZWxkIGZpbGUuYmxvYigpO1xuXG4gICAgICAgIF90aGlzMTMubG9hZEZpbGVUb0NhbnZhcyhibG9iKTtcblxuICAgICAgICB5aWVsZCB3ZWJTaGFyZVRhcmdldENhY2hlLmRlbGV0ZShcInNoYXJlZC1maWxlXCIpO1xuICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgQVBQX05BTUUsIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG4gIHRoaXMuYWRkRmlsZXMgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGZpbGVzKSB7XG4gICAgY29uc3QgZmlsZXNNYXAgPSBmaWxlcy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZmlsZURhdGEpIHtcbiAgICAgIGFjYy5zZXQoZmlsZURhdGEuaWQsIGZpbGVEYXRhKTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgbmV3IE1hcCgpKTtcbiAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwgT2JqZWN0LmZyb21FbnRyaWVzKGZpbGVzTWFwKSk7IC8vIGJ1bXAgdmVyc2lvbnMgZm9yIGVsZW1lbnRzIHRoYXQgcmVmZXJlbmNlIGFkZGVkIGZpbGVzIHNvIHRoYXRcbiAgICAvLyB3ZS9ob3N0IGFwcHMgY2FuIGRldGVjdCB0aGUgY2hhbmdlLCBhbmQgaW52YWxpZGF0ZSB0aGUgaW1hZ2UgJiBzaGFwZVxuICAgIC8vIGNhY2hlXG5cbiAgICBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgaWYgKGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQoZWxlbWVudCkgJiYgZmlsZXNNYXAuaGFzKGVsZW1lbnQuZmlsZUlkKSkge1xuICAgICAgICBfdGhpczEzLmltYWdlQ2FjaGUuZGVsZXRlKGVsZW1lbnQuZmlsZUlkKTtcblxuICAgICAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICBidW1wVmVyc2lvbihlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcblxuICAgIF90aGlzMTMuYWRkTmV3SW1hZ2VzVG9JbWFnZUNhY2hlKCk7XG4gIH0pO1xuXG4gIHRoaXMuc2V0TG9jYWxGb250ID0gZnVuY3Rpb24gKHNob3dPblBhbmVsKSB7XG4gICAgc2hvd0ZvdXJ0aEZvbnQgPSBzaG93T25QYW5lbDtcbiAgfTtcblxuICB0aGlzLnVwZGF0ZVNjZW5lID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChzY2VuZURhdGEpIHtcbiAgICBpZiAoc2NlbmVEYXRhLmNvbW1pdFRvSGlzdG9yeSkge1xuICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuYXBwU3RhdGUpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoc2NlbmVEYXRhLmFwcFN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmVsZW1lbnRzKSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhzY2VuZURhdGEuZWxlbWVudHMpO1xuICAgIH1cblxuICAgIGlmIChzY2VuZURhdGEuY29sbGFib3JhdG9ycykge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGNvbGxhYm9yYXRvcnM6IHNjZW5lRGF0YS5jb2xsYWJvcmF0b3JzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoc2NlbmVEYXRhLmxpYnJhcnlJdGVtcykge1xuICAgICAgX3RoaXMxMy5saWJyYXJ5LnNhdmVMaWJyYXJ5KHJlc3RvcmVMaWJyYXJ5SXRlbXMoc2NlbmVEYXRhLmxpYnJhcnlJdGVtcywgXCJ1bnB1Ymxpc2hlZFwiKSk7XG4gICAgfVxuICB9KTtcblxuICB0aGlzLm9uU2NlbmVVcGRhdGVkID0gZnVuY3Rpb24gKCkge1xuICAgIF90aGlzMTMuc2V0U3RhdGUoe30pO1xuICB9O1xuXG4gIHRoaXMudXBkYXRlQ3VycmVudEN1cnNvclBvc2l0aW9uID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGN1cnNvclggPSBldmVudC5jbGllbnRYO1xuICAgIGN1cnNvclkgPSBldmVudC5jbGllbnRZO1xuICB9KTtcbiAgdGhpcy5vbktleURvd24gPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gbm9ybWFsaXplIGBldmVudC5rZXlgIHdoZW4gQ2Fwc0xvY2sgaXMgcHJlc3NlZCAjMjM3MlxuICAgIGlmIChcIlByb3h5XCIgaW4gd2luZG93ICYmICghZXZlbnQuc2hpZnRLZXkgJiYgL15bQS1aXSQvLnRlc3QoZXZlbnQua2V5KSB8fCBldmVudC5zaGlmdEtleSAmJiAvXlthLXpdJC8udGVzdChldmVudC5rZXkpKSkge1xuICAgICAgZXZlbnQgPSBuZXcgUHJveHkoZXZlbnQsIHtcbiAgICAgICAgZ2V0KGV2LCBwcm9wKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBldltwcm9wXTtcblxuICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgLy8gZml4IGZvciBQcm94aWVzIGhpamFja2luZyBgdGhpc2BcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5iaW5kKGV2KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gcHJvcCA9PT0gXCJrZXlcIiA/IC8vIENhcHNMb2NrIGludmVydHMgY2FwaXRhbGl6YXRpb24gYmFzZWQgb24gU2hpZnRLZXksIHNvIGludmVydFxuICAgICAgICAgIC8vIGl0IGJhY2tcbiAgICAgICAgICBldmVudC5zaGlmdEtleSA/IGV2LmtleS50b1VwcGVyQ2FzZSgpIDogZXYua2V5LnRvTG93ZXJDYXNlKCkgOiB2YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSAmJiBldmVudC5rZXkgIT09IEtFWVMuRVNDQVBFIHx8IC8vIGNhc2U6IHVzaW5nIGFycm93cyB0byBtb3ZlIGJldHdlZW4gYnV0dG9uc1xuICAgIGlzQXJyb3dLZXkoZXZlbnQua2V5KSAmJiBpc0lucHV0TGlrZShldmVudC50YXJnZXQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RVUVTVElPTl9NQVJLKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvd0hlbHBEaWFsb2c6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLmFjdGlvbk1hbmFnZXIuaGFuZGxlS2V5RG93bihldmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChldmVudC5jb2RlID09PSBDT0RFUy5aRVJPKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNMaWJyYXJ5T3BlbjogIV90aGlzMTMuc3RhdGUuaXNMaWJyYXJ5T3BlblxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGlzQXJyb3dLZXkoZXZlbnQua2V5KSkge1xuICAgICAgY29uc3Qgc3RlcCA9IF90aGlzMTMuc3RhdGUuZ3JpZFNpemUgJiYgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UIDogX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSkgfHwgKGV2ZW50LnNoaWZ0S2V5ID8gRUxFTUVOVF9TSElGVF9UUkFOU0xBVEVfQU1PVU5UIDogRUxFTUVOVF9UUkFOU0xBVEVfQU1PVU5UKTtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSwgdHJ1ZSk7XG4gICAgICBsZXQgb2Zmc2V0WCA9IDA7XG4gICAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuQVJST1dfTEVGVCkge1xuICAgICAgICBvZmZzZXRYID0gLXN0ZXA7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5BUlJPV19SSUdIVCkge1xuICAgICAgICBvZmZzZXRYID0gc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX1VQKSB7XG4gICAgICAgIG9mZnNldFkgPSAtc3RlcDtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkFSUk9XX0RPV04pIHtcbiAgICAgICAgb2Zmc2V0WSA9IHN0ZXA7XG4gICAgICB9XG5cbiAgICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICB4OiBlbGVtZW50LnggKyBvZmZzZXRYLFxuICAgICAgICAgIHk6IGVsZW1lbnQueSArIG9mZnNldFlcbiAgICAgICAgfSk7XG4gICAgICAgIHVwZGF0ZUJvdW5kRWxlbWVudHMoZWxlbWVudCwge1xuICAgICAgICAgIHNpbXVsdGFuZW91c2x5VXBkYXRlZDogc2VsZWN0ZWRFbGVtZW50c1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0xpbmVhckVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQuZWxlbWVudElkICE9PSBzZWxlY3RlZEVsZW1lbnRzWzBdLmlkKSB7XG4gICAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDogbmV3IExpbmVhckVsZW1lbnRFZGl0b3Ioc2VsZWN0ZWRFbGVtZW50c1swXSwgX3RoaXMxMy5zY2VuZSlcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudCA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG5cbiAgICAgICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgICBzY2VuZVg6IHNlbGVjdGVkRWxlbWVudC54ICsgc2VsZWN0ZWRFbGVtZW50LndpZHRoIC8gMixcbiAgICAgICAgICBzY2VuZVk6IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDIsXG4gICAgICAgICAgc2hvdWxkQmluZDogdHJ1ZVxuICAgICAgICB9KTtcblxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYWx0S2V5ICYmICFldmVudC5tZXRhS2V5ICYmIF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ID09PSBudWxsKSB7XG4gICAgICBjb25zdCBzaGFwZSA9IGZpbmRTaGFwZUJ5S2V5KGV2ZW50LmtleSk7XG5cbiAgICAgIGlmIChzaGFwZSkge1xuICAgICAgICBfdGhpczEzLnNlbGVjdFNoYXBlVG9vbChzaGFwZSk7XG4gICAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5RKSB7XG4gICAgICAgIF90aGlzMTMudG9nZ2xlTG9jaygpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UgJiYgZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAwKSB7XG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IHRydWU7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUJCSU5HKTtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5HIHx8IGV2ZW50LmtleSA9PT0gS0VZUy5TKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSA9PT0gXCJzZWxlY3Rpb25cIiAmJiAhc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkcgJiYgKGhhc0JhY2tncm91bmQoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSkgfHwgc2VsZWN0ZWRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBoYXNCYWNrZ3JvdW5kKGVsZW1lbnQudHlwZSk7XG4gICAgICB9KSkpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcImJhY2tncm91bmRDb2xvclBpY2tlclwiXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlMpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgb3BlblBvcHVwOiBcInN0cm9rZUNvbG9yUGlja2VyXCJcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbktleVVwID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC5rZXkgPT09IEtFWVMuU1BBQ0UpIHtcbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNldEN1cnNvckZvclNoYXBlKF90aGlzMTMuY2FudmFzLCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgICAgIHNlbGVjdGVkR3JvdXBJZHM6IHt9LFxuICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICBpc0hvbGRpbmdTcGFjZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIV90aGlzMTMuc3RhdGUuaXNCaW5kaW5nRW5hYmxlZCkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGlzQmluZGluZ0VuYWJsZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChpc0Fycm93S2V5KGV2ZW50LmtleSkpIHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBpc0JpbmRpbmdFbmFibGVkKF90aGlzMTMuc3RhdGUpID8gYmluZE9yVW5iaW5kU2VsZWN0ZWRFbGVtZW50cyhzZWxlY3RlZEVsZW1lbnRzKSA6IHVuYmluZExpbmVhckVsZW1lbnRzKHNlbGVjdGVkRWxlbWVudHMpO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc3VnZ2VzdGVkQmluZGluZ3M6IFtdXG4gICAgICB9KTtcbiAgICB9XG4gIH0pO1xuICB0aGlzLm9uR2VzdHVyZVN0YXJ0ID0gd2l0aEJhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge31cbiAgICB9KTtcblxuICAgIGdlc3R1cmUuaW5pdGlhbFNjYWxlID0gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlO1xuICB9KTtcbiAgdGhpcy5vbkdlc3R1cmVDaGFuZ2UgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsgLy8gb25HZXN0dXJlQ2hhbmdlIG9ubHkgaGFzIHpvb20gZmFjdG9yIGJ1dCBub3QgdGhlIGNlbnRlci5cbiAgICAvLyBJZiB3ZSdyZSBvbiBpUGFkIG9yIGlQaG9uZSwgdGhlbiB3ZSByZWNvZ25pemUgbXVsdGktdG91Y2ggYW5kIHdpbGxcbiAgICAvLyB6b29tIGluIGF0IHRoZSByaWdodCBsb2NhdGlvbiBvbiB0aGUgdG91Y2hNb3ZlIGhhbmRsZXIgYWxyZWFkeS5cbiAgICAvLyBPbiBNYWNib29rLCB3ZSBkb24ndCBoYXZlIHRob3NlIGV2ZW50cyBzbyB3aWxsIHpvb20gaW4gYXQgdGhlXG4gICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbnN0ZWFkLlxuXG4gICAgaWYgKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGluaXRpYWxTY2FsZSA9IGdlc3R1cmUuaW5pdGlhbFNjYWxlO1xuXG4gICAgaWYgKGluaXRpYWxTY2FsZSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjgpIHtcbiAgICAgICAgbGV0IHtcbiAgICAgICAgICB6b29tLFxuICAgICAgICAgIG9mZnNldExlZnQsXG4gICAgICAgICAgb2Zmc2V0VG9wXG4gICAgICAgIH0gPSBfcmVmODtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB6b29tOiBnZXROZXdab29tKGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIGV2ZW50LnNjYWxlKSwgem9vbSwge1xuICAgICAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgICAgIHRvcDogb2Zmc2V0VG9wXG4gICAgICAgICAgfSwge1xuICAgICAgICAgICAgeDogY3Vyc29yWCxcbiAgICAgICAgICAgIHk6IGN1cnNvcllcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgdGhpcy5vbkdlc3R1cmVFbmQgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHt9LFxuICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgfSk7XG5cbiAgICBnZXN0dXJlLmluaXRpYWxTY2FsZSA9IG51bGw7XG4gIH0pO1xuXG4gIHRoaXMuc3RhcnRUZXh0RWRpdGluZyA9IGZ1bmN0aW9uIChfcmVmOSkge1xuICAgIGxldCB7XG4gICAgICBzY2VuZVgsXG4gICAgICBzY2VuZVksXG4gICAgICBzaG91bGRCaW5kLFxuICAgICAgaW5zZXJ0QXRQYXJlbnRDZW50ZXIgPSB0cnVlXG4gICAgfSA9IF9yZWY5O1xuXG4gICAgbGV0IHBhcmVudENlbnRlclBvc2l0aW9uID0gaW5zZXJ0QXRQYXJlbnRDZW50ZXIgJiYgX3RoaXMxMy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcywgd2luZG93LmRldmljZVBpeGVsUmF0aW8pOyAvLyBiaW5kIHRvIGNvbnRhaW5lciB3aGVuIHNob3VsZEJpbmQgaXMgdHJ1ZSBvclxuICAgIC8vIGNsaWNrZWQgb24gY2VudGVyIG9mIGNvbnRhaW5lclxuXG5cbiAgICBjb25zdCBjb250YWluZXIgPSBzaG91bGRCaW5kIHx8IHBhcmVudENlbnRlclBvc2l0aW9uID8gZ2V0RWxlbWVudENvbnRhaW5pbmdQb3NpdGlvbihfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbGUpIHtcbiAgICAgIHJldHVybiAhaXNUZXh0RWxlbWVudChlbGUpO1xuICAgIH0pLCBzY2VuZVgsIHNjZW5lWSkgOiBudWxsO1xuXG4gICAgbGV0IGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBfdGhpczEzLmdldFRleHRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7IC8vIGNvbnNpZGVyIGJvdW5kZWQgdGV4dCBlbGVtZW50IGlmIGNvbnRhaW5lciBwcmVzZW50XG5cblxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuXG4gICAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGV4aXN0aW5nVGV4dEVsZW1lbnQgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIWV4aXN0aW5nVGV4dEVsZW1lbnQgJiYgY29udGFpbmVyKSB7XG4gICAgICBjb25zdCBmb250U3RyaW5nID0ge1xuICAgICAgICBmb250U2l6ZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseVxuICAgICAgfTtcbiAgICAgIGNvbnN0IG1pbldpZHRoID0gZ2V0QXBwcm94TWluTGluZVdpZHRoKGdldEZvbnRTdHJpbmcoZm9udFN0cmluZykpO1xuICAgICAgY29uc3QgbWluSGVpZ2h0ID0gZ2V0QXBwcm94TWluTGluZUhlaWdodChnZXRGb250U3RyaW5nKGZvbnRTdHJpbmcpKTtcbiAgICAgIGNvbnN0IG5ld0hlaWdodCA9IE1hdGgubWF4KGNvbnRhaW5lci5oZWlnaHQsIG1pbkhlaWdodCk7XG4gICAgICBjb25zdCBuZXdXaWR0aCA9IE1hdGgubWF4KGNvbnRhaW5lci53aWR0aCwgbWluV2lkdGgpO1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0OiBuZXdIZWlnaHQsXG4gICAgICAgIHdpZHRoOiBuZXdXaWR0aFxuICAgICAgfSk7XG4gICAgICBzY2VuZVggPSBjb250YWluZXIueCArIG5ld1dpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGNvbnRhaW5lci55ICsgbmV3SGVpZ2h0IC8gMjtcblxuICAgICAgaWYgKHBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIHBhcmVudENlbnRlclBvc2l0aW9uID0gX3RoaXMxMy5nZXRUZXh0V3lzaXd5Z1NuYXBwZWRUb0NlbnRlclBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLmNhbnZhcywgd2luZG93LmRldmljZVBpeGVsUmF0aW8pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGVsZW1lbnQgPSBleGlzdGluZ1RleHRFbGVtZW50ID8gZXhpc3RpbmdUZXh0RWxlbWVudCA6IG5ld1RleHRFbGVtZW50KHtcbiAgICAgIHg6IHBhcmVudENlbnRlclBvc2l0aW9uID8gcGFyZW50Q2VudGVyUG9zaXRpb24uZWxlbWVudENlbnRlclggOiBzY2VuZVgsXG4gICAgICB5OiBwYXJlbnRDZW50ZXJQb3NpdGlvbiA/IHBhcmVudENlbnRlclBvc2l0aW9uLmVsZW1lbnRDZW50ZXJZIDogc2NlbmVZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3MsXG4gICAgICB0ZXh0OiBcIlwiLFxuICAgICAgcmF3VGV4dDogXCJcIixcbiAgICAgIGZvbnRTaXplOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIHRleHRBbGlnbjogcGFyZW50Q2VudGVyUG9zaXRpb24gPyBcImNlbnRlclwiIDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVRleHRBbGlnbixcbiAgICAgIHZlcnRpY2FsQWxpZ246IHBhcmVudENlbnRlclBvc2l0aW9uID8gXCJtaWRkbGVcIiA6IERFRkFVTFRfVkVSVElDQUxfQUxJR04sXG4gICAgICBjb250YWluZXJJZDogY29udGFpbmVyPy5pZCA/PyB1bmRlZmluZWQsXG4gICAgICBncm91cElkczogY29udGFpbmVyPy5ncm91cElkcyA/PyBbXVxuICAgIH0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudFxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXN0aW5nVGV4dEVsZW1lbnQpIHtcbiAgICAgIC8vIGlmIHRleHQgZWxlbWVudCBpcyBubyBsb25nZXIgY2VudGVyZWQgdG8gYSBjb250YWluZXIsIHJlc2V0XG4gICAgICAvLyB2ZXJ0aWNhbEFsaWduIHRvIGRlZmF1bHQgYmVjYXVzZSBpdCdzIGN1cnJlbnRseSBpbnRlcm5hbC1vbmx5XG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uIHx8IGVsZW1lbnQudGV4dEFsaWduICE9PSBcImNlbnRlclwiKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHZlcnRpY2FsQWxpZ246IERFRkFVTFRfVkVSVElDQUxfQUxJR05cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBlbGVtZW50XSk7IC8vIGNhc2U6IGNyZWF0aW5nIG5ldyB0ZXh0IG5vdCBjZW50ZXJlZCB0byBwYXJlbnQgZWxlbWVuZW50IOKGkiBvZmZzZXQgWVxuICAgICAgLy8gc28gdGhhdCB0aGUgdGV4dCBpcyBjZW50ZXJlZCB0byBjdXJzb3IgcG9zaXRpb25cblxuXG4gICAgICBpZiAoIXBhcmVudENlbnRlclBvc2l0aW9uKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHk6IGVsZW1lbnQueSAtIGVsZW1lbnQuYmFzZWxpbmUgLyAyXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICB9KTtcblxuICAgIF90aGlzMTMuaGFuZGxlVGV4dFd5c2l3eWcoZWxlbWVudCwge1xuICAgICAgaXNFeGlzdGluZ0VsZW1lbnQ6ICEhZXhpc3RpbmdUZXh0RWxlbWVudFxuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzRG91YmxlQ2xpY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBjYXNlOiBkb3VibGUtY2xpY2tpbmcgd2l0aCBhcnJvdy9saW5lIHRvb2wgc2VsZWN0ZWQgd291bGQgYm90aCBjcmVhdGVcbiAgICAvLyB0ZXh0IGFuZCBlbnRlciBtdWx0aUVsZW1lbnQgbW9kZVxuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gd2Ugc2hvdWxkIG9ubHkgYmUgYWJsZSB0byBkb3VibGUgY2xpY2sgd2hlbiBtb2RlIGlzIHNlbGVjdGlvblxuXG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSAhPT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKF90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHMoKSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pKSB7XG4gICAgICBpZiAoIV90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHwgX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5lbGVtZW50SWQgIT09IHNlbGVjdGVkRWxlbWVudHNbMF0uaWQpIHtcbiAgICAgICAgX3RoaXMxMy5oaXN0b3J5LnJlc3VtZVJlY29yZGluZygpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBuZXcgTGluZWFyRWxlbWVudEVkaXRvcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBfdGhpczEzLnNjZW5lKVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcbiAgICBsZXQge1xuICAgICAgeDogc2NlbmVYLFxuICAgICAgeTogc2NlbmVZXG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgY29uc3Qgc2VsZWN0ZWRHcm91cElkcyA9IGdldFNlbGVjdGVkR3JvdXBJZHMoX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRHcm91cElkcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVgsIHNjZW5lWSk7XG5cbiAgICAgIGNvbnN0IHNlbGVjdGVkR3JvdXBJZCA9IGhpdEVsZW1lbnQgJiYgZ2V0U2VsZWN0ZWRHcm91cElkRm9yRWxlbWVudChoaXRFbGVtZW50LCBfdGhpczEzLnN0YXRlLnNlbGVjdGVkR3JvdXBJZHMpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRHcm91cElkKSB7XG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgICAgIHJldHVybiBzZWxlY3RHcm91cHNGb3JTZWxlY3RlZEVsZW1lbnRzKF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlKSwge30sIHtcbiAgICAgICAgICAgIGVkaXRpbmdHcm91cElkOiBzZWxlY3RlZEdyb3VwSWQsXG4gICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IHtcbiAgICAgICAgICAgICAgW2hpdEVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge31cbiAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzKTtcblxuICAgIGlmICghZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgIV90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCksIF90aGlzMTMuc3RhdGUpO1xuXG4gICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgICAgY29uc3QgY2FuQmluZFRleHQgPSBoYXNCb3VuZFRleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICAgICAgc2NlbmVYID0gc2VsZWN0ZWRFbGVtZW50LnggKyBzZWxlY3RlZEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgICAgIHNjZW5lWSA9IHNlbGVjdGVkRWxlbWVudC55ICsgc2VsZWN0ZWRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zdGFydFRleHRFZGl0aW5nKHtcbiAgICAgICAgc2NlbmVYLFxuICAgICAgICBzY2VuZVksXG4gICAgICAgIHNob3VsZEJpbmQ6IGZhbHNlLFxuICAgICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBfdGhpczEzLnNhdmVQb2ludGVyKGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFksIF90aGlzMTMuc3RhdGUuY3Vyc29yQnV0dG9uKTtcblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLmhhcyhldmVudC5wb2ludGVySWQpKSB7XG4gICAgICBnZXN0dXJlLnBvaW50ZXJzLnNldChldmVudC5wb2ludGVySWQsIHtcbiAgICAgICAgeDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgeTogZXZlbnQuY2xpZW50WVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5pdGlhbFNjYWxlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGU7XG5cbiAgICBpZiAoZ2VzdHVyZS5wb2ludGVycy5zaXplID09PSAyICYmIGdlc3R1cmUubGFzdENlbnRlciAmJiBpbml0aWFsU2NhbGUgJiYgZ2VzdHVyZS5pbml0aWFsRGlzdGFuY2UpIHtcbiAgICAgIGNvbnN0IGNlbnRlciA9IGdldENlbnRlcihnZXN0dXJlLnBvaW50ZXJzKTtcbiAgICAgIGNvbnN0IGRlbHRhWCA9IGNlbnRlci54IC0gZ2VzdHVyZS5sYXN0Q2VudGVyLng7XG4gICAgICBjb25zdCBkZWx0YVkgPSBjZW50ZXIueSAtIGdlc3R1cmUubGFzdENlbnRlci55O1xuICAgICAgZ2VzdHVyZS5sYXN0Q2VudGVyID0gY2VudGVyO1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBnZXREaXN0YW5jZShBcnJheS5mcm9tKGdlc3R1cmUucG9pbnRlcnMudmFsdWVzKCkpKTtcbiAgICAgIGNvbnN0IHNjYWxlRmFjdG9yID0gZGlzdGFuY2UgLyBnZXN0dXJlLmluaXRpYWxEaXN0YW5jZTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAoX3JlZjEwKSB7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgem9vbSxcbiAgICAgICAgICBzY3JvbGxYLFxuICAgICAgICAgIHNjcm9sbFksXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3BcbiAgICAgICAgfSA9IF9yZWYxMDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzY3JvbGxYOiBzY3JvbGxYICsgZGVsdGFYIC8gem9vbS52YWx1ZSxcbiAgICAgICAgICBzY3JvbGxZOiBzY3JvbGxZICsgZGVsdGFZIC8gem9vbS52YWx1ZSxcbiAgICAgICAgICB6b29tOiBnZXROZXdab29tKGdldE5vcm1hbGl6ZWRab29tKGluaXRpYWxTY2FsZSAqIHNjYWxlRmFjdG9yKSwgem9vbSwge1xuICAgICAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgICAgIHRvcDogb2Zmc2V0VG9wXG4gICAgICAgICAgfSwgY2VudGVyKSxcbiAgICAgICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IHRydWVcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnJlc2V0U2hvdWxkQ2FjaGVJZ25vcmVab29tRGVib3VuY2VkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlc3R1cmUubGFzdENlbnRlciA9IGdlc3R1cmUuaW5pdGlhbERpc3RhbmNlID0gZ2VzdHVyZS5pbml0aWFsU2NhbGUgPSBudWxsO1xuICAgIH1cblxuICAgIGlmIChpc0hvbGRpbmdTcGFjZSB8fCBpc1Bhbm5pbmcgfHwgaXNEcmFnZ2luZ1Njcm9sbEJhcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGlzUG9pbnRlck92ZXJTY3JvbGxCYXJzID0gaXNPdmVyU2Nyb2xsQmFycyhjdXJyZW50U2Nyb2xsQmFycywgZXZlbnQuY2xpZW50WCAtIF90aGlzMTMuc3RhdGUub2Zmc2V0TGVmdCwgZXZlbnQuY2xpZW50WSAtIF90aGlzMTMuc3RhdGUub2Zmc2V0VG9wKTtcbiAgICBjb25zdCBpc092ZXJTY3JvbGxCYXIgPSBpc1BvaW50ZXJPdmVyU2Nyb2xsQmFycy5pc092ZXJFaXRoZXI7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgaWYgKGlzT3ZlclNjcm9sbEJhcikge1xuICAgICAgICByZXNldEN1cnNvcihfdGhpczEzLmNhbnZhcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2NlbmVQb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKGV2ZW50LCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCB7XG4gICAgICB4OiBzY2VuZVBvaW50ZXJYLFxuICAgICAgeTogc2NlbmVQb2ludGVyWVxuICAgIH0gPSBzY2VuZVBvaW50ZXI7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5pc0RyYWdnaW5nKSB7XG4gICAgICBjb25zdCBlZGl0aW5nTGluZWFyRWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuaGFuZGxlUG9pbnRlck1vdmUoZXZlbnQsIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgICBpZiAoZWRpdGluZ0xpbmVhckVsZW1lbnQgIT09IF90aGlzMTMuc3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnRcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChlZGl0aW5nTGluZWFyRWxlbWVudC5sYXN0VW5jb21taXR0ZWRQb2ludCAhPSBudWxsKSB7XG4gICAgICAgIF90aGlzMTMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yKHNjZW5lUG9pbnRlcik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzQmluZGluZ0VsZW1lbnRUeXBlKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpKSB7XG4gICAgICAvLyBIb3ZlcmluZyB3aXRoIGEgc2VsZWN0ZWQgdG9vbCBvciBjcmVhdGluZyBuZXcgbGluZWFyIGVsZW1lbnQgdmlhIGNsaWNrXG4gICAgICAvLyBhbmQgcG9pbnRcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcblxuICAgICAgaWYgKGlzQmluZGluZ0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSkge1xuICAgICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzKGRyYWdnaW5nRWxlbWVudCwgW3NjZW5lUG9pbnRlcl0sIF90aGlzMTMuc3RhdGUuc3RhcnRCb3VuZEVsZW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5tYXliZVN1Z2dlc3RCaW5kaW5nQXRDdXJzb3Ioc2NlbmVQb2ludGVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5tdWx0aUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbXVsdGlFbGVtZW50XG4gICAgICB9ID0gX3RoaXMxMy5zdGF0ZTtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeDogcngsXG4gICAgICAgIHk6IHJ5XG4gICAgICB9ID0gbXVsdGlFbGVtZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICBwb2ludHMsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludFxuICAgICAgfSA9IG11bHRpRWxlbWVudDtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICBzZXRDdXJzb3JGb3JTaGFwZShfdGhpczEzLmNhbnZhcywgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSk7XG5cbiAgICAgIGlmIChsYXN0UG9pbnQgPT09IGxhc3RDb21taXR0ZWRQb2ludCkge1xuICAgICAgICAvLyBpZiB3ZSBoYXZlbid0IHlldCBjcmVhdGVkIGEgdGVtcCBwb2ludCBhbmQgd2UncmUgYmV5b25kIGNvbW1pdC16b25lXG4gICAgICAgIC8vIHRocmVzaG9sZCwgYWRkIGEgcG9pbnRcbiAgICAgICAgaWYgKGRpc3RhbmNlMmQoc2NlbmVQb2ludGVyWCAtIHJ4LCBzY2VuZVBvaW50ZXJZIC0gcnksIGxhc3RQb2ludFswXSwgbGFzdFBvaW50WzFdKSA+PSBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cywgW3NjZW5lUG9pbnRlclggLSByeCwgc2NlbmVQb2ludGVyWSAtIHJ5XV1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpOyAvLyBpbiB0aGlzIGJyYW5jaCwgd2UncmUgaW5zaWRlIHRoZSBjb21taXQgem9uZSwgYW5kIG5vIHVuY29tbWl0dGVkXG4gICAgICAgICAgLy8gcG9pbnQgZXhpc3RzLiBUaHVzIGRvIG5vdGhpbmcgKGRvbid0IGFkZC9yZW1vdmUgcG9pbnRzKS5cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChwb2ludHMubGVuZ3RoID4gMiAmJiBsYXN0Q29tbWl0dGVkUG9pbnQgJiYgZGlzdGFuY2UyZChzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeSwgbGFzdENvbW1pdHRlZFBvaW50WzBdLCBsYXN0Q29tbWl0dGVkUG9pbnRbMV0pIDwgTElORV9DT05GSVJNX1RIUkVTSE9MRCkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogcG9pbnRzLnNsaWNlKDAsIC0xKVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChwb2ludHMsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLlBPSU5URVIpO1xuICAgICAgICB9IC8vIHVwZGF0ZSBsYXN0IHVuY29tbWl0dGVkIHBvaW50XG5cblxuICAgICAgICBtdXRhdGVFbGVtZW50KG11bHRpRWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogWy4uLnBvaW50cy5zbGljZSgwLCAtMSksIFtzY2VuZVBvaW50ZXJYIC0gcngsIHNjZW5lUG9pbnRlclkgLSByeV1dXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGFzRGVzZWxlY3RlZEJ1dHRvbiA9IEJvb2xlYW4oZXZlbnQuYnV0dG9ucyk7XG5cbiAgICBpZiAoaGFzRGVzZWxlY3RlZEJ1dHRvbiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiICYmIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgIT09IFwidGV4dFwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgIWlzT3ZlclNjcm9sbEJhciAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlID0gZ2V0RWxlbWVudFdpdGhUcmFuc2Zvcm1IYW5kbGVUeXBlKGVsZW1lbnRzLCBfdGhpczEzLnN0YXRlLCBzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcblxuICAgICAgaWYgKGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZSAmJiBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUudHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPiAxICYmICFpc092ZXJTY3JvbGxCYXIpIHtcbiAgICAgIGNvbnN0IHRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRUcmFuc2Zvcm1IYW5kbGVUeXBlRnJvbUNvb3JkcyhnZXRDb21tb25Cb3VuZHMoc2VsZWN0ZWRFbGVtZW50cyksIHNjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGdldEN1cnNvckZvclJlc2l6aW5nRWxlbWVudCh7XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZVxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXRFbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbihzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnkpO1xuXG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwidGV4dFwiKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIGlzVGV4dEVsZW1lbnQoaGl0RWxlbWVudCkgPyBDVVJTT1JfVFlQRS5URVhUIDogQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkdSQUIpO1xuICAgIH0gZWxzZSBpZiAoaXNPdmVyU2Nyb2xsQmFyKSB7XG4gICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLkFVVE8pO1xuICAgIH0gZWxzZSBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZCk7XG5cbiAgICAgIGlmIChlbGVtZW50ICYmIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtzY2VuZVBvaW50ZXIueCwgc2NlbmVQb2ludGVyLnldKSkge1xuICAgICAgICBzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMsIENVUlNPUl9UWVBFLk1PVkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBDVVJTT1JfVFlQRS5BVVRPKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKCAvLyBpZiB1c2luZyBjbWQvY3RybCwgd2UncmUgbm90IGRyYWdnaW5nXG4gICAgIWV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmIChoaXRFbGVtZW50IHx8IF90aGlzMTMuaXNIaXR0aW5nQ29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHMoc2NlbmVQb2ludGVyLCBzZWxlY3RlZEVsZW1lbnRzKSkpIHtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuTU9WRSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQVVUTyk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gdHJ1ZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gcmVtb3ZlIGFueSBhY3RpdmUgc2VsZWN0aW9uIHdoZW4gd2Ugc3RhcnQgdG8gaW50ZXJhY3Qgd2l0aCBjYW52YXNcbiAgICAvLyAobWFpbmx5LCB3ZSBjYXJlIGFib3V0IHJlbW92aW5nIHNlbGVjdGlvbiBvdXRzaWRlIHRoZSBjb21wb25lbnQgd2hpY2hcbiAgICAvLyAgd291bGQgcHJldmVudCBvdXIgY29weSBoYW5kbGluZyBvdGhlcndpc2UpXG4gICAgY29uc3Qgc2VsZWN0aW9uID0gZG9jdW1lbnQuZ2V0U2VsZWN0aW9uKCk7XG5cbiAgICBpZiAoc2VsZWN0aW9uPy5hbmNob3JOb2RlKSB7XG4gICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgfVxuXG4gICAgX3RoaXMxMy5tYXliZU9wZW5Db250ZXh0TWVudUFmdGVyUG9pbnRlckRvd25PblRvdWNoRGV2aWNlcyhldmVudCk7XG5cbiAgICBfdGhpczEzLm1heWJlQ2xlYW51cEFmdGVyTWlzc2luZ1BvaW50ZXJVcChldmVudCk7XG5cbiAgICBpZiAoaXNQYW5uaW5nKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBsYXN0UG9pbnRlckRvd25XaXRoOiBldmVudC5wb2ludGVyVHlwZSxcbiAgICAgIGN1cnNvckJ1dHRvbjogXCJkb3duXCJcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJkb3duXCIpO1xuXG4gICAgaWYgKF90aGlzMTMuaGFuZGxlQ2FudmFzUGFuVXNpbmdXaGVlbE9yU3BhY2VEcmFnKGV2ZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gb25seSBoYW5kbGUgbGVmdCBtb3VzZSBidXR0b24gb3IgdG91Y2hcblxuXG4gICAgaWYgKGV2ZW50LmJ1dHRvbiAhPT0gUE9JTlRFUl9CVVRUT04uTUFJTiAmJiBldmVudC5idXR0b24gIT09IFBPSU5URVJfQlVUVE9OLlRPVUNIKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3RoaXMxMy51cGRhdGVHZXN0dXJlT25Qb2ludGVyRG93bihldmVudCk7IC8vIGRvbid0IHNlbGVjdCB3aGlsZSBwYW5uaW5nXG5cblxuICAgIGlmIChnZXN0dXJlLnBvaW50ZXJzLnNpemUgPiAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBTdGF0ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIGEgcG9pbnRlciBpbnRlcmFjdGlvbiwgd2hpY2ggc3RhcnRzIHdpdGggYVxuICAgIC8vIHBvaW50ZXJEb3duIGV2ZW50LCBlbmRzIHdpdGggYSBwb2ludGVyVXAgZXZlbnQgKG9yIGFub3RoZXIgcG9pbnRlckRvd24pXG5cblxuICAgIGNvbnN0IHBvaW50ZXJEb3duU3RhdGUgPSBfdGhpczEzLmluaXRpYWxQb2ludGVyRG93blN0YXRlKGV2ZW50KTtcblxuICAgIGlmIChfdGhpczEzLmhhbmRsZURyYWdnaW5nU2Nyb2xsQmFyKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uKCk7XG5cbiAgICBfdGhpczEzLnVwZGF0ZUJpbmRpbmdFbmFibGVkT25Qb2ludGVyTW92ZShldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVUZXh0T25Qb2ludGVyRG93bihldmVudCwgcG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiB8fCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImxpbmVcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVMaW5lYXJFbGVtZW50T25Qb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfSBlbHNlIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgIC8vIHJlc2V0IGltYWdlIHByZXZpZXcgb24gcG9pbnRlcmRvd25cbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuQ1JPU1NIQUlSKTtcblxuICAgICAgaWYgKCFfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgZHJhZ2dpbmdFbGVtZW50OiBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQsXG4gICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgIG11bHRpRWxlbWVudDogbnVsbFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgeCxcbiAgICAgICAgeVxuICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG4gICAgICBtdXRhdGVFbGVtZW50KF90aGlzMTMuc3RhdGUucGVuZGluZ0ltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwiZnJlZWRyYXdcIikge1xuICAgICAgX3RoaXMxMy5oYW5kbGVGcmVlRHJhd0VsZW1lbnRPblBvaW50ZXJEb3duKGV2ZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5jcmVhdGVHZW5lcmljRWxlbWVudE9uUG9pbnRlckRvd24oX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSk7XG4gICAgfVxuXG4gICAgY29uc3Qgb25Qb2ludGVyTW92ZSA9IF90aGlzMTMub25Qb2ludGVyTW92ZUZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBjb25zdCBvblBvaW50ZXJVcCA9IF90aGlzMTMub25Qb2ludGVyVXBGcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlEb3duID0gX3RoaXMxMy5vbktleURvd25Gcm9tUG9pbnRlckRvd25IYW5kbGVyKHBvaW50ZXJEb3duU3RhdGUpO1xuXG4gICAgY29uc3Qgb25LZXlVcCA9IF90aGlzMTMub25LZXlVcEZyb21Qb2ludGVyRG93bkhhbmRsZXIocG9pbnRlckRvd25TdGF0ZSk7XG5cbiAgICBsYXN0UG9pbnRlclVwID0gb25Qb2ludGVyVXA7XG5cbiAgICBpZiAoIV90aGlzMTMuc3RhdGUudmlld01vZGVFbmFibGVkKSB7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX01PVkUsIG9uUG9pbnRlck1vdmUpO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgb25Qb2ludGVyVXApO1xuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuS0VZRE9XTiwgb25LZXlEb3duKTtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULktFWVVQLCBvbktleVVwKTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25Nb3ZlID0gb25Qb2ludGVyTW92ZTtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25VcCA9IG9uUG9pbnRlclVwO1xuICAgICAgcG9pbnRlckRvd25TdGF0ZS5ldmVudExpc3RlbmVycy5vbktleVVwID0gb25LZXlVcDtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGUuZXZlbnRMaXN0ZW5lcnMub25LZXlEb3duID0gb25LZXlEb3duO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlT3BlbkNvbnRleHRNZW51QWZ0ZXJQb2ludGVyRG93bk9uVG91Y2hEZXZpY2VzID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgLy8gZGVhbCB3aXRoIG9wZW5pbmcgY29udGV4dCBtZW51IG9uIHRvdWNoIGRldmljZXNcbiAgICBpZiAoZXZlbnQucG9pbnRlclR5cGUgPT09IFwidG91Y2hcIikge1xuICAgICAgaW52YWxpZGF0ZUNvbnRleHRNZW51ID0gZmFsc2U7XG5cbiAgICAgIGlmICh0b3VjaFRpbWVvdXQpIHtcbiAgICAgICAgLy8gSWYgdGhlcmUncyBhbHJlYWR5IGEgdG91Y2hUaW1lb3V0LCB0aGlzIG1lYW5zIHRoYXQgdGhlcmUncyBhbm90aGVyXG4gICAgICAgIC8vIHRvdWNoIGRvd24gYW5kIHdlIGFyZSBkb2luZyBhbm90aGVyIHRvdWNoLCBzbyB3ZSBzaG91bGRuJ3Qgb3BlbiB0aGVcbiAgICAgICAgLy8gY29udGV4dCBtZW51LlxuICAgICAgICBpbnZhbGlkYXRlQ29udGV4dE1lbnUgPSB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3BlbiB0aGUgY29udGV4dCBtZW51IHdpdGggdGhlIGZpcnN0IHRvdWNoJ3MgY2xpZW50WCBhbmQgY2xpZW50WVxuICAgICAgICAvLyBpZiB0aGUgdG91Y2ggaXMgbm90IG1vdmluZ1xuICAgICAgICB0b3VjaFRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgdG91Y2hUaW1lb3V0ID0gMDtcblxuICAgICAgICAgIGlmICghaW52YWxpZGF0ZUNvbnRleHRNZW51KSB7XG4gICAgICAgICAgICBfdGhpczEzLmhhbmRsZUNhbnZhc0NvbnRleHRNZW51KGV2ZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIFRPVUNIX0NUWF9NRU5VX1RJTUVPVVQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICB0aGlzLmhhbmRsZUNhbnZhc1BhblVzaW5nV2hlZWxPclNwYWNlRHJhZyA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmICghKGdlc3R1cmUucG9pbnRlcnMuc2l6ZSA9PT0gMCAmJiAoZXZlbnQuYnV0dG9uID09PSBQT0lOVEVSX0JVVFRPTi5XSEVFTCB8fCBldmVudC5idXR0b24gPT09IFBPSU5URVJfQlVUVE9OLk1BSU4gJiYgaXNIb2xkaW5nU3BhY2UgfHwgX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpKSB8fCBpc1RleHRFbGVtZW50KF90aGlzMTMuc3RhdGUuZWRpdGluZ0VsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaXNQYW5uaW5nID0gdHJ1ZTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGxldCBuZXh0UGFzdGVQcmV2ZW50ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBpc0xpbnV4ID0gL0xpbnV4Ly50ZXN0KHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0pO1xuICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQkJJTkcpO1xuICAgIGxldCB7XG4gICAgICBjbGllbnRYOiBsYXN0WCxcbiAgICAgIGNsaWVudFk6IGxhc3RZXG4gICAgfSA9IGV2ZW50O1xuICAgIGNvbnN0IG9uUG9pbnRlck1vdmUgPSB3aXRoQmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBjb25zdCBkZWx0YVggPSBsYXN0WCAtIGV2ZW50LmNsaWVudFg7XG4gICAgICBjb25zdCBkZWx0YVkgPSBsYXN0WSAtIGV2ZW50LmNsaWVudFk7XG4gICAgICBsYXN0WCA9IGV2ZW50LmNsaWVudFg7XG4gICAgICBsYXN0WSA9IGV2ZW50LmNsaWVudFk7XG4gICAgICAvKlxuICAgICAgICogUHJldmVudCBwYXN0ZSBldmVudCBpZiB3ZSBtb3ZlIHdoaWxlIG1pZGRsZSBjbGlja2luZyBvbiBMaW51eC5cbiAgICAgICAqIFNlZSBpc3N1ZSAjMTM4My5cbiAgICAgICAqL1xuXG4gICAgICBpZiAoaXNMaW51eCAmJiAhbmV4dFBhc3RlUHJldmVudGVkICYmIChNYXRoLmFicyhkZWx0YVgpID4gMSB8fCBNYXRoLmFicyhkZWx0YVkpID4gMSkpIHtcbiAgICAgICAgbmV4dFBhc3RlUHJldmVudGVkID0gdHJ1ZTtcbiAgICAgICAgLyogUHJldmVudCB0aGUgbmV4dCBwYXN0ZSBldmVudCAqL1xuXG4gICAgICAgIGNvbnN0IHByZXZlbnROZXh0UGFzdGUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9O1xuICAgICAgICAvKlxuICAgICAgICAgKiBSZWVuYWJsZSBuZXh0IHBhc3RlIGluIGNhc2Ugb2YgZGlzYWJsZWQgbWlkZGxlIGNsaWNrIHBhc3RlIGZvclxuICAgICAgICAgKiBhbnkgcmVhc29uOlxuICAgICAgICAgKiAtIHJpZ3RoIGNsaWNrIHBhc3RlXG4gICAgICAgICAqIC0gZW1wdHkgY2xpcGJvYXJkXG4gICAgICAgICAqL1xuXG5cbiAgICAgICAgY29uc3QgZW5hYmxlTmV4dFBhc3RlID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBBU1RFLCBwcmV2ZW50TmV4dFBhc3RlKTtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIGVuYWJsZU5leHRQYXN0ZSk7XG4gICAgICAgICAgfSwgMTAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUEFTVEUsIHByZXZlbnROZXh0UGFzdGUpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5QT0lOVEVSX1VQLCBlbmFibGVOZXh0UGFzdGUpO1xuICAgICAgfVxuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2Nyb2xsWDogX3RoaXMxMy5zdGF0ZS5zY3JvbGxYIC0gZGVsdGFYIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiBfdGhpczEzLnN0YXRlLnNjcm9sbFkgLSBkZWx0YVkgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWVcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIGNvbnN0IHRlYXJkb3duID0gd2l0aEJhdGNoZWRVcGRhdGVzKGxhc3RQb2ludGVyVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBsYXN0UG9pbnRlclVwID0gbnVsbDtcbiAgICAgIGlzUGFubmluZyA9IGZhbHNlO1xuXG4gICAgICBpZiAoIWlzSG9sZGluZ1NwYWNlKSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnZpZXdNb2RlRW5hYmxlZCkge1xuICAgICAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuR1JBQik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0Q3Vyc29yRm9yU2hhcGUoX3RoaXMxMy5jYW52YXMsIF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBjdXJzb3JCdXR0b246IFwidXBcIlxuICAgICAgfSk7XG5cbiAgICAgIF90aGlzMTMuc2F2ZVBvaW50ZXIoZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSwgXCJ1cFwiKTtcblxuICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlBPSU5URVJfVVAsIHRlYXJkb3duKTtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULkJMVVIsIHRlYXJkb3duKTtcbiAgICB9KTtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihFVkVOVC5CTFVSLCB0ZWFyZG93bik7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9NT1ZFLCBvblBvaW50ZXJNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiB0cnVlXG4gICAgfSk7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuUE9JTlRFUl9VUCwgdGVhcmRvd24pO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIHRoaXMuY2xlYXJTZWxlY3Rpb25JZk5vdFVzaW5nU2VsZWN0aW9uID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlICE9PSBcInNlbGVjdGlvblwiKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgIGVkaXRpbmdHcm91cElkOiBudWxsXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVTZWxlY3Rpb25PblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgaWYgKF90aGlzMTMuc3RhdGUuZWxlbWVudFR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnRzID0gX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpO1xuXG4gICAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiAhX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgPSBnZXRFbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUoZWxlbWVudHMsIF90aGlzMTMuc3RhdGUsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuem9vbSwgZXZlbnQucG9pbnRlclR5cGUpO1xuXG4gICAgICAgIGlmIChlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUgIT0gbnVsbCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcmVzaXppbmdFbGVtZW50OiBlbGVtZW50V2l0aFRyYW5zZm9ybUhhbmRsZVR5cGUuZWxlbWVudFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSA9IGVsZW1lbnRXaXRoVHJhbnNmb3JtSGFuZGxlVHlwZS50cmFuc2Zvcm1IYW5kbGVUeXBlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5oYW5kbGVUeXBlID0gZ2V0VHJhbnNmb3JtSGFuZGxlVHlwZUZyb21Db29yZHMoZ2V0Q29tbW9uQm91bmRzKHNlbGVjdGVkRWxlbWVudHMpLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBfdGhpczEzLnN0YXRlLnpvb20sIGV2ZW50LnBvaW50ZXJUeXBlKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBnZXRDdXJzb3JGb3JSZXNpemluZ0VsZW1lbnQoe1xuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGU6IHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGVcbiAgICAgICAgfSkpO1xuICAgICAgICBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5pc1Jlc2l6aW5nID0gdHJ1ZTtcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0ID0gdHVwbGVUb0Nvb3JzKGdldFJlc2l6ZU9mZnNldFhZKHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHMsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpKTtcblxuICAgICAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEgJiYgaXNMaW5lYXJFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmIHNlbGVjdGVkRWxlbWVudHNbMF0ucG9pbnRzLmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uID0gZ2V0UmVzaXplQXJyb3dEaXJlY3Rpb24ocG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZSwgc2VsZWN0ZWRFbGVtZW50c1swXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICAgICAgY29uc3QgcmV0ID0gTGluZWFyRWxlbWVudEVkaXRvci5oYW5kbGVQb2ludGVyRG93bihldmVudCwgX3RoaXMxMy5zdGF0ZSwgZnVuY3Rpb24gKGFwcFN0YXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMxMy5zZXRTdGF0ZShhcHBTdGF0ZSk7XG4gICAgICAgICAgfSwgX3RoaXMxMy5oaXN0b3J5LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbik7XG5cbiAgICAgICAgICBpZiAocmV0LmhpdEVsZW1lbnQpIHtcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQgPSByZXQuaGl0RWxlbWVudDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAocmV0LmRpZEFkZFBvaW50KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gLy8gaGl0RWxlbWVudCBtYXkgYWxyZWFkeSBiZSBzZXQgYWJvdmUsIHNvIGNoZWNrIGZpcnN0XG5cblxuICAgICAgICBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50ID0gcG9pbnRlckRvd25TdGF0ZS5oaXQuZWxlbWVudCA/PyBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnkpO1xuXG4gICAgICAgIGlmIChwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50KSB7XG4gICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQuaGFzSGl0RWxlbWVudEluc2lkZSA9IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KHBvaW50ZXJEb3duU3RhdGUuaGl0LmVsZW1lbnQsIF90aGlzMTMuc3RhdGUsIFtwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55XSk7XG4gICAgICAgIH0gLy8gRm9yIG92ZXJsYXBwZWQgZWxlbWVudHMgb25lIHBvc2l0aW9uIG1heSBoaXRcbiAgICAgICAgLy8gbXVsdGlwbGUgZWxlbWVudHNcblxuXG4gICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0LmFsbEhpdEVsZW1lbnRzID0gX3RoaXMxMy5nZXRFbGVtZW50c0F0UG9zaXRpb24ocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSk7XG4gICAgICAgIGNvbnN0IGhpdEVsZW1lbnQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5lbGVtZW50O1xuICAgICAgICBjb25zdCBzb21lSGl0RWxlbWVudElzU2VsZWN0ZWQgPSBwb2ludGVyRG93blN0YXRlLmhpdC5hbGxIaXRFbGVtZW50cy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzMTMuaXNBU2VsZWN0ZWRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoKGhpdEVsZW1lbnQgPT09IG51bGwgfHwgIXNvbWVIaXRFbGVtZW50SXNTZWxlY3RlZCkgJiYgIWV2ZW50LnNoaWZ0S2V5ICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgIF90aGlzMTMuY2xlYXJTZWxlY3Rpb24oaGl0RWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtfdGhpczEzLnN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LmVsZW1lbnRJZF06IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTsgLy8gSWYgd2UgY2xpY2sgb24gc29tZXRoaW5nXG5cbiAgICAgICAgfSBlbHNlIGlmIChoaXRFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAvLyBvbiBDTUQvQ1RSTCwgZHJpbGwgZG93biB0byBoaXQgZWxlbWVudCByZWdhcmRsZXNzIG9mIGdyb3VwcyBldGMuXG4gICAgICAgICAgaWYgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUuaGl0Lndhc0FkZGVkVG9TZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgZWRpdEdyb3VwRm9yU2VsZWN0ZWRFbGVtZW50KHByZXZTdGF0ZSwgaGl0RWxlbWVudCkpLCB7fSwge1xuICAgICAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRFbGVtZW50SWRzOiBfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pOyAvLyBtYXJrIGFzIG5vdCBjb21wbGV0ZWx5IGhhbmRsZWQgc28gYXMgdG8gYWxsb3cgZHJhZ2dpbmcgZXRjLlxuXG5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9IC8vIGRlc2VsZWN0IGlmIGl0ZW0gaXMgc2VsZWN0ZWRcbiAgICAgICAgICAvLyBpZiBzaGlmdCBpcyBub3QgY2xpY2tlZCwgdGhpcyB3aWxsIGFsd2F5cyByZXR1cm4gdHJ1ZVxuICAgICAgICAgIC8vIG90aGVyd2lzZSwgaXQgd2lsbCB0cmlnZ2VyIHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50XG4gICAgICAgICAgLy8gc3RhdGUgb2YgdGhlIGJveFxuXG5cbiAgICAgICAgICBpZiAoIV90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzW2hpdEVsZW1lbnQuaWRdKSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IGVkaXRpbmcgYSBncm91cCwgZXhpdGluZyBlZGl0aW5nIG1vZGUgYW5kIGRlc2VsZWN0IHRoZSBncm91cC5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLmVkaXRpbmdHcm91cElkICYmICFpc0VsZW1lbnRJbkdyb3VwKGhpdEVsZW1lbnQsIF90aGlzMTMuc3RhdGUuZWRpdGluZ0dyb3VwSWQpKSB7XG4gICAgICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cElkczoge30sXG4gICAgICAgICAgICAgICAgZWRpdGluZ0dyb3VwSWQ6IG51bGxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IC8vIEFkZCBoaXQgZWxlbWVudCB0byBzZWxlY3Rpb24uIEF0IHRoaXMgcG9pbnQgaWYgd2UncmUgbm90IGhvbGRpbmdcbiAgICAgICAgICAgIC8vIFNISUZUIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGVsZW1lbnQocykgd2VyZSBkZXNlbGVjdGVkIGFib3ZlXG4gICAgICAgICAgICAvLyAobWFrZSBzdXJlIHlvdSB1c2Ugc2V0U3RhdGUgdXBkYXRlciB0byB1c2UgbGF0ZXN0IHN0YXRlKVxuXG5cbiAgICAgICAgICAgIGlmICghc29tZUhpdEVsZW1lbnRJc1NlbGVjdGVkICYmICFwb2ludGVyRG93blN0YXRlLmhpdC5oYXNIaXRDb21tb25Cb3VuZGluZ0JveE9mU2VsZWN0ZWRFbGVtZW50cykge1xuICAgICAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0R3JvdXBzRm9yU2VsZWN0ZWRFbGVtZW50cyhfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICAgICAgICAgIFtoaXRFbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9KSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpKTtcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5oaXQud2FzQWRkZWRUb1NlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IF90aGlzMTMuc3RhdGUuc2VsZWN0ZWRFbGVtZW50SWRzXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLmhhbmRsZVRleHRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgLy8gaWYgd2UncmUgY3VycmVudGx5IHN0aWxsIGVkaXRpbmcgdGV4dCwgY2xpY2tpbmcgb3V0c2lkZVxuICAgIC8vIHNob3VsZCBvbmx5IGZpbmFsaXplIGl0LCBub3QgY3JlYXRlIGFub3RoZXIgKGlycmVzcGVjdGl2ZVxuICAgIC8vIG9mIHN0YXRlLmVsZW1lbnRMb2NrZWQpXG4gICAgaWYgKGlzVGV4dEVsZW1lbnQoX3RoaXMxMy5zdGF0ZS5lZGl0aW5nRWxlbWVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2NlbmVYID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueDtcbiAgICBsZXQgc2NlbmVZID0gcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueTtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBfdGhpczEzLmdldEVsZW1lbnRBdFBvc2l0aW9uKHNjZW5lWCwgc2NlbmVZLCB7XG4gICAgICBpbmNsdWRlQm91bmRUZXh0RWxlbWVudDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgY2FuQmluZFRleHQgPSBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgaWYgKGNhbkJpbmRUZXh0KSB7XG4gICAgICBzY2VuZVggPSBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIHNjZW5lWSA9IGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9XG5cbiAgICBfdGhpczEzLnN0YXJ0VGV4dEVkaXRpbmcoe1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZLFxuICAgICAgc2hvdWxkQmluZDogZmFsc2UsXG4gICAgICBpbnNlcnRBdFBhcmVudENlbnRlcjogIWV2ZW50LmFsdEtleVxuICAgIH0pO1xuXG4gICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuXG4gICAgaWYgKCFfdGhpczEzLnN0YXRlLmVsZW1lbnRMb2NrZWQpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBlbGVtZW50VHlwZTogXCJzZWxlY3Rpb25cIlxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuaGFuZGxlRnJlZURyYXdFbGVtZW50T25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCwgZWxlbWVudFR5cGUsIHBvaW50ZXJEb3duU3RhdGUpIHtcbiAgICAvLyBCZWdpbiBhIG1hcmsgY2FwdHVyZS4gVGhpcyBkb2VzIG5vdCBoYXZlIHRvIHVwZGF0ZSBzdGF0ZSB5ZXQuXG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgbnVsbCk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ZyZWVEcmF3RWxlbWVudCh7XG4gICAgICB0eXBlOiBlbGVtZW50VHlwZSxcbiAgICAgIHg6IGdyaWRYLFxuICAgICAgeTogZ3JpZFksXG4gICAgICBzdHJva2VDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZUNvbG9yLFxuICAgICAgYmFja2dyb3VuZENvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtQmFja2dyb3VuZENvbG9yLFxuICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgc3Ryb2tlV2lkdGg6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VXaWR0aCxcbiAgICAgIHN0cm9rZVN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlU3R5bGUsXG4gICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICBvcGFjaXR5OiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtT3BhY2l0eSxcbiAgICAgIHN0cm9rZVNoYXJwbmVzczogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUxpbmVhclN0cm9rZVNoYXJwbmVzcyxcbiAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGV2ZW50LnByZXNzdXJlID09PSAwLjVcbiAgICB9KTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKHByZXZTdGF0ZSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogZmFsc2VcbiAgICAgICAgfSlcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcmVzc3VyZXMgPSBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUgPyBlbGVtZW50LnByZXNzdXJlcyA6IFsuLi5lbGVtZW50LnByZXNzdXJlcywgZXZlbnQucHJlc3N1cmVdO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzOiBbWzAsIDBdXSxcbiAgICAgIHByZXNzdXJlc1xuICAgIH0pO1xuICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhwb2ludGVyRG93blN0YXRlLm9yaWdpbiwgX3RoaXMxMy5zY2VuZSk7XG5cbiAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICBlZGl0aW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLmNyZWF0ZUltYWdlRWxlbWVudCA9IGZ1bmN0aW9uIChfcmVmMTEpIHtcbiAgICBsZXQge1xuICAgICAgc2NlbmVYLFxuICAgICAgc2NlbmVZXG4gICAgfSA9IF9yZWYxMTtcbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChzY2VuZVgsIHNjZW5lWSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0ltYWdlRWxlbWVudCh7XG4gICAgICB0eXBlOiBcImltYWdlXCIsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3NcbiAgICB9KTtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfTtcblxuICB0aGlzLmhhbmRsZUxpbmVhckVsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGV2ZW50LCBlbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZSkge1xuICAgIGlmIChfdGhpczEzLnN0YXRlLm11bHRpRWxlbWVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICBtdWx0aUVsZW1lbnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlOyAvLyBmaW5hbGl6ZSBpZiBjb21wbGV0aW5nIGEgbG9vcFxuXG4gICAgICBpZiAobXVsdGlFbGVtZW50LnR5cGUgPT09IFwibGluZVwiICYmIGlzUGF0aEFMb29wKG11bHRpRWxlbWVudC5wb2ludHMsIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChtdWx0aUVsZW1lbnQsIHtcbiAgICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG11bHRpRWxlbWVudC5wb2ludHNbbXVsdGlFbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpczEzLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25GaW5hbGl6ZSk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB7XG4gICAgICAgIHg6IHJ4LFxuICAgICAgICB5OiByeSxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50XG4gICAgICB9ID0gbXVsdGlFbGVtZW50OyAvLyBjbGlja2luZyBpbnNpZGUgY29tbWl0IHpvbmUg4oaSIGZpbmFsaXplIGFycm93XG5cbiAgICAgIGlmIChtdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEgJiYgbGFzdENvbW1pdHRlZFBvaW50ICYmIGRpc3RhbmNlMmQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCAtIHJ4LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55IC0gcnksIGxhc3RDb21taXR0ZWRQb2ludFswXSwgbGFzdENvbW1pdHRlZFBvaW50WzFdKSA8IExJTkVfQ09ORklSTV9USFJFU0hPTEQpIHtcbiAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZShmdW5jdGlvbiAocHJldlN0YXRlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByZXZTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMpLCB7fSwge1xuICAgICAgICAgICAgW211bHRpRWxlbWVudC5pZF06IHRydWVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfSk7IC8vIGNsaWNraW5nIG91dHNpZGUgY29tbWl0IHpvbmUg4oaSIHVwZGF0ZSByZWZlcmVuY2UgZm9yIGxhc3QgY29tbWl0dGVkXG4gICAgICAvLyBwb2ludFxuXG5cbiAgICAgIG11dGF0ZUVsZW1lbnQobXVsdGlFbGVtZW50LCB7XG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbXVsdGlFbGVtZW50LnBvaW50c1ttdWx0aUVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdXG4gICAgICB9KTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgQ1VSU09SX1RZUEUuUE9JTlRFUik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLngsIHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgLyogSWYgYXJyb3cgaXMgcHJlLWFycm93aGVhZHMsIGl0IHdpbGwgaGF2ZSB1bmRlZmluZWQgZm9yIGJvdGggc3RhcnQgYW5kIGVuZCBhcnJvd2hlYWRzLlxuICAgICAgSWYgc28sIHdlIHdhbnQgaXQgdG8gYmUgbnVsbCBmb3Igc3RhcnQgYW5kIFwiYXJyb3dcIiBmb3IgZW5kLiBJZiB0aGUgbGluZWFyIGl0ZW0gaXMgbm90XG4gICAgICBhbiBhcnJvdywgd2Ugd2FudCBpdCB0byBiZSBudWxsIGZvciBib3RoLiBPdGhlcndpc2UsIHdlIHdhbnQgaXQgdG8gdXNlIHRoZVxuICAgICAgdmFsdWVzIGZyb20gYXBwU3RhdGUuICovXG5cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZCxcbiAgICAgICAgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuICAgICAgY29uc3QgW3N0YXJ0QXJyb3doZWFkLCBlbmRBcnJvd2hlYWRdID0gZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIiA/IFtjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkLCBjdXJyZW50SXRlbUVuZEFycm93aGVhZF0gOiBbbnVsbCwgbnVsbF07XG4gICAgICBjb25zdCBlbGVtZW50ID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgICAgIHR5cGU6IGVsZW1lbnRUeXBlLFxuICAgICAgICB4OiBncmlkWCxcbiAgICAgICAgeTogZ3JpZFksXG4gICAgICAgIHN0cm9rZUNvbG9yOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlQ29sb3IsXG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgICAgZmlsbFN0eWxlOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtRmlsbFN0eWxlLFxuICAgICAgICBzdHJva2VXaWR0aDogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVdpZHRoLFxuICAgICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgICByb3VnaG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1Sb3VnaG5lc3MsXG4gICAgICAgIG9wYWNpdHk6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1PcGFjaXR5LFxuICAgICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1MaW5lYXJTdHJva2VTaGFycG5lc3MsXG4gICAgICAgIHN0YXJ0QXJyb3doZWFkLFxuICAgICAgICBlbmRBcnJvd2hlYWRcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKGZ1bmN0aW9uIChwcmV2U3RhdGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJldlN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyksIHt9LCB7XG4gICAgICAgICAgICBbZWxlbWVudC5pZF06IGZhbHNlXG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBbLi4uZWxlbWVudC5wb2ludHMsIFswLCAwXV1cbiAgICAgIH0pO1xuICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luLCBfdGhpczEzLnNjZW5lKTtcblxuICAgICAgX3RoaXMxMy5zY2VuZS5yZXBsYWNlQWxsRWxlbWVudHMoWy4uLl90aGlzMTMuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIGVsZW1lbnRdKTtcblxuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIGRyYWdnaW5nRWxlbWVudDogZWxlbWVudCxcbiAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIHN0YXJ0Qm91bmRFbGVtZW50OiBib3VuZEVsZW1lbnQsXG4gICAgICAgIHN1Z2dlc3RlZEJpbmRpbmdzOiBbXVxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMuY3JlYXRlR2VuZXJpY0VsZW1lbnRPblBvaW50ZXJEb3duID0gZnVuY3Rpb24gKGVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlKSB7XG4gICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgX3RoaXMxMy5zdGF0ZS5ncmlkU2l6ZSk7XG4gICAgY29uc3QgZWxlbWVudCA9IG5ld0VsZW1lbnQoe1xuICAgICAgdHlwZTogZWxlbWVudFR5cGUsXG4gICAgICB4OiBncmlkWCxcbiAgICAgIHk6IGdyaWRZLFxuICAgICAgc3Ryb2tlQ29sb3I6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcixcbiAgICAgIGZpbGxTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbUZpbGxTdHlsZSxcbiAgICAgIHN0cm9rZVdpZHRoOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtU3Ryb2tlV2lkdGgsXG4gICAgICBzdHJva2VTdHlsZTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbVN0cm9rZVN0eWxlLFxuICAgICAgcm91Z2huZXNzOiBfdGhpczEzLnN0YXRlLmN1cnJlbnRJdGVtUm91Z2huZXNzLFxuICAgICAgb3BhY2l0eTogX3RoaXMxMy5zdGF0ZS5jdXJyZW50SXRlbU9wYWNpdHksXG4gICAgICBzdHJva2VTaGFycG5lc3M6IF90aGlzMTMuc3RhdGUuY3VycmVudEl0ZW1TdHJva2VTaGFycG5lc3NcbiAgICB9KTtcblxuICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBzZWxlY3Rpb25FbGVtZW50OiBlbGVtZW50LFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnRcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhbLi4uX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgZWxlbWVudF0pO1xuXG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgbXVsdGlFbGVtZW50OiBudWxsLFxuICAgICAgICBkcmFnZ2luZ0VsZW1lbnQ6IGVsZW1lbnQsXG4gICAgICAgIGVkaXRpbmdFbGVtZW50OiBlbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5pbml0aWFsaXplSW1hZ2UgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTIgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKF9yZWYxMykge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW1hZ2VGaWxlLFxuICAgICAgICBpbWFnZUVsZW1lbnQ6IF9pbWFnZUVsZW1lbnQsXG4gICAgICAgIHNob3dDdXJzb3JJbWFnZVByZXZpZXcgPSBmYWxzZVxuICAgICAgfSA9IF9yZWYxMztcblxuICAgICAgLy8gYXQgdGhpcyBwb2ludCB0aGlzIHNob3VsZCBiZSBndWFyYW50ZWVkIGltYWdlIGZpbGUsIGJ1dCB3ZSBkbyB0aGlzIGNoZWNrXG4gICAgICAvLyB0byBzYXRpc2Z5IFRTIGRvd24gdGhlIGxpbmVcbiAgICAgIGlmICghaXNTdXBwb3J0ZWRJbWFnZUZpbGUoaW1hZ2VGaWxlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWltZVR5cGUgPSBpbWFnZUZpbGUudHlwZTtcbiAgICAgIHNldEN1cnNvcihfdGhpczEzLmNhbnZhcywgXCJ3YWl0XCIpO1xuXG4gICAgICBpZiAobWltZVR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0gU1ZHU3RyaW5nVG9GaWxlKHlpZWxkIG5vcm1hbGl6ZVNWRyh5aWVsZCBpbWFnZUZpbGUudGV4dCgpKSwgaW1hZ2VGaWxlLm5hbWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMuc3ZnSW1hZ2VJbnNlcnRFcnJvclwiKSk7XG4gICAgICAgIH1cbiAgICAgIH0gLy8gZ2VuZXJhdGUgaW1hZ2UgaWQgKGJ5IGRlZmF1bHQgdGhlIGZpbGUgZGlnZXN0KSBiZWZvcmUgYW55XG4gICAgICAvLyByZXNpemluZy9jb21wcmVzc2lvbiB0YWtlcyBwbGFjZSB0byBrZWVwIGl0IG1vcmUgcG9ydGFibGVcblxuXG4gICAgICBjb25zdCBmaWxlSWQgPSB5aWVsZCBfdGhpczEzLnByb3BzLmdlbmVyYXRlSWRGb3JGaWxlPy4oaW1hZ2VGaWxlKSB8fCBnZW5lcmF0ZUlkRnJvbUZpbGUoaW1hZ2VGaWxlKTtcblxuICAgICAgaWYgKCFmaWxlSWQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFwiQ291bGRuJ3QgZ2VuZXJhdGUgZmlsZSBpZCBvciB0aGUgc3VwcGxpZWQgYGdlbmVyYXRlSWRGb3JGaWxlYCBkaWRuJ3QgcmVzb2x2ZSB0byBvbmUuXCIpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXhpc3RpbmdGaWxlRGF0YSA9IF90aGlzMTMuZmlsZXNbZmlsZUlkXTtcblxuICAgICAgaWYgKCFleGlzdGluZ0ZpbGVEYXRhPy5kYXRhVVJMKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaW1hZ2VGaWxlID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICAgICAgbWF4V2lkdGhPckhlaWdodDogREVGQVVMVF9NQVhfSU1BR0VfV0lEVEhfT1JfSEVJR0hUXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIHRyeWluZyB0byByZXNpbmcgaW1hZ2UgZmlsZSBvbiBpbnNlcnRpb25cIiwgZXJyb3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltYWdlRmlsZS5zaXplID4gTUFYX0FMTE9XRURfRklMRV9CWVRFUykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcih0KFwiZXJyb3JzLmZpbGVUb29CaWdcIiwge1xuICAgICAgICAgICAgbWF4U2l6ZTogYCR7TWF0aC50cnVuYyhNQVhfQUxMT1dFRF9GSUxFX0JZVEVTIC8gMTAyNCAvIDEwMjQpfU1CYFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvd0N1cnNvckltYWdlUHJldmlldykge1xuICAgICAgICBjb25zdCBkYXRhVVJMID0gX3RoaXMxMy5maWxlc1tmaWxlSWRdPy5kYXRhVVJMOyAvLyBvcHRpbWl6YXRpb24gc28gdGhhdCB3ZSBkb24ndCB1bm5lY2Vzc2FyaWx5IHJlc2l6ZSB0aGUgb3JpZ2luYWxcbiAgICAgICAgLy8gZnVsbC1zaXplIGZpbGUgZm9yIGN1cnNvciBwcmV2aWV3XG4gICAgICAgIC8vIChpdCdzIG11Y2ggZmFzdGVyIHRvIGNvbnZlcnQgdGhlIHJlc2l6ZWQgZGF0YVVSTCB0byBGaWxlKVxuXG4gICAgICAgIGNvbnN0IHJlc2l6ZWRGaWxlID0gZGF0YVVSTCAmJiBkYXRhVVJMVG9GaWxlKGRhdGFVUkwpO1xuXG4gICAgICAgIF90aGlzMTMuc2V0SW1hZ2VQcmV2aWV3Q3Vyc29yKHJlc2l6ZWRGaWxlIHx8IGltYWdlRmlsZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFVUkwgPSBfdGhpczEzLmZpbGVzW2ZpbGVJZF0/LmRhdGFVUkwgfHwgKHlpZWxkIGdldERhdGFVUkwoaW1hZ2VGaWxlKSk7XG4gICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBtdXRhdGVFbGVtZW50KF9pbWFnZUVsZW1lbnQsIHtcbiAgICAgICAgZmlsZUlkXG4gICAgICB9LCBmYWxzZSk7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2UoIC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfcmVmMTQgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBfdGhpczEzLmZpbGVzID0gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmZpbGVzKSwge30sIHtcbiAgICAgICAgICAgICAgW2ZpbGVJZF06IHtcbiAgICAgICAgICAgICAgICBtaW1lVHlwZSxcbiAgICAgICAgICAgICAgICBpZDogZmlsZUlkLFxuICAgICAgICAgICAgICAgIGRhdGFVUkwsXG4gICAgICAgICAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgY2FjaGVkSW1hZ2VEYXRhID0gX3RoaXMxMy5pbWFnZUNhY2hlLmdldChmaWxlSWQpO1xuXG4gICAgICAgICAgICBpZiAoIWNhY2hlZEltYWdlRGF0YSkge1xuICAgICAgICAgICAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuXG4gICAgICAgICAgICAgIHlpZWxkIF90aGlzMTMudXBkYXRlSW1hZ2VDYWNoZShbaW1hZ2VFbGVtZW50XSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjYWNoZWRJbWFnZURhdGE/LmltYWdlIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICB5aWVsZCBjYWNoZWRJbWFnZURhdGEuaW1hZ2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQgJiYgX3RoaXMxMy5zdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ/LmlkICE9PSBpbWFnZUVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2VEaW1lbnNpb25zKGltYWdlRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJlc29sdmUoaW1hZ2VFbGVtZW50KTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgICAgICByZWplY3QobmV3IEVycm9yKHQoXCJlcnJvcnMuaW1hZ2VJbnNlcnRFcnJvclwiKSkpO1xuICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBpZiAoIXNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgICAgICAgICAgcmVzZXRDdXJzb3IoX3RoaXMxMy5jYW52YXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChfeDYsIF94Nykge1xuICAgICAgICAgIHJldHVybiBfcmVmMTQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgfTtcbiAgICAgIH0oKSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94NSkge1xuICAgICAgcmV0dXJuIF9yZWYxMi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmluc2VydEltYWdlRWxlbWVudCA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNSA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsIHNob3dDdXJzb3JJbWFnZVByZXZpZXcpIHtcbiAgICAgIF90aGlzMTMuc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKFsuLi5fdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLCBpbWFnZUVsZW1lbnRdKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgeWllbGQgX3RoaXMxMy5pbml0aWFsaXplSW1hZ2Uoe1xuICAgICAgICAgIGltYWdlRmlsZSxcbiAgICAgICAgICBpbWFnZUVsZW1lbnQsXG4gICAgICAgICAgc2hvd0N1cnNvckltYWdlUHJldmlld1xuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgaXNEZWxldGVkOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcblxuICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfHwgdChcImVycm9ycy5pbWFnZUluc2VydEVycm9yXCIpXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChfeDgsIF94OSwgX3gxMCkge1xuICAgICAgcmV0dXJuIF9yZWYxNS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLnNldEltYWdlUHJldmlld0N1cnNvciA9IC8qI19fUFVSRV9fKi9mdW5jdGlvbiAoKSB7XG4gICAgdmFyIF9yZWYxNiA9IF9hc3luY1RvR2VuZXJhdG9yKGZ1bmN0aW9uKiAoaW1hZ2VGaWxlKSB7XG4gICAgICAvLyBtdXN0bid0IGJlIGxhcmdlciB0aGFuIDEyOCBweFxuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19CYXNpY19Vc2VyX0ludGVyZmFjZS9Vc2luZ19VUkxfdmFsdWVzX2Zvcl90aGVfY3Vyc29yX3Byb3BlcnR5XG4gICAgICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDk2O1xuICAgICAgY29uc3QgaW1hZ2VQcmV2aWV3ID0geWllbGQgcmVzaXplSW1hZ2VGaWxlKGltYWdlRmlsZSwge1xuICAgICAgICBtYXhXaWR0aE9ySGVpZ2h0OiBjdXJzb3JJbWFnZVNpemVQeFxuICAgICAgfSk7XG4gICAgICBsZXQgcHJldmlld0RhdGFVUkwgPSB5aWVsZCBnZXREYXRhVVJMKGltYWdlUHJldmlldyk7IC8vIFNWRyBjYW5ub3QgYmUgcmVzaXplZCB2aWEgYHJlc2l6ZUltYWdlRmlsZWAgc28gd2UgcmVzaXplIGJ5IHJlbmRlcmluZyB0b1xuICAgICAgLy8gYSBzbWFsbCBjYW52YXNcblxuICAgICAgaWYgKGltYWdlRmlsZS50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgICBjb25zdCBpbWcgPSB5aWVsZCBsb2FkSFRNTEltYWdlRWxlbWVudChwcmV2aWV3RGF0YVVSTCk7XG4gICAgICAgIGxldCBoZWlnaHQgPSBNYXRoLm1pbihpbWcuaGVpZ2h0LCBjdXJzb3JJbWFnZVNpemVQeCk7XG4gICAgICAgIGxldCB3aWR0aCA9IGhlaWdodCAqIChpbWcud2lkdGggLyBpbWcuaGVpZ2h0KTtcblxuICAgICAgICBpZiAod2lkdGggPiBjdXJzb3JJbWFnZVNpemVQeCkge1xuICAgICAgICAgIHdpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgICAgICAgaGVpZ2h0ID0gd2lkdGggKiAoaW1nLmhlaWdodCAvIGltZy53aWR0aCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICBjYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZywgMCwgMCwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIHByZXZpZXdEYXRhVVJMID0gY2FudmFzLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2Zyk7XG4gICAgICB9XG5cbiAgICAgIGlmIChfdGhpczEzLnN0YXRlLnBlbmRpbmdJbWFnZUVsZW1lbnQpIHtcbiAgICAgICAgc2V0Q3Vyc29yKF90aGlzMTMuY2FudmFzLCBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSA0IDQsIGF1dG9gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmdW5jdGlvbiAoX3gxMSkge1xuICAgICAgcmV0dXJuIF9yZWYxNi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLm9uSW1hZ2VBY3Rpb24gPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTcgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgaW5zZXJ0T25DYW52YXNEaXJlY3RseVxuICAgICAgfSA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDoge1xuICAgICAgICBpbnNlcnRPbkNhbnZhc0RpcmVjdGx5OiBmYWxzZVxuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY2xpZW50WCA9IF90aGlzMTMuc3RhdGUud2lkdGggLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRMZWZ0O1xuICAgICAgICBjb25zdCBjbGllbnRZID0gX3RoaXMxMy5zdGF0ZS5oZWlnaHQgLyAyICsgX3RoaXMxMy5zdGF0ZS5vZmZzZXRUb3A7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3Jkcyh7XG4gICAgICAgICAgY2xpZW50WCxcbiAgICAgICAgICBjbGllbnRZXG4gICAgICAgIH0sIF90aGlzMTMuc3RhdGUpO1xuICAgICAgICBjb25zdCBpbWFnZUZpbGUgPSB5aWVsZCBmaWxlT3Blbih7XG4gICAgICAgICAgZGVzY3JpcHRpb246IFwiSW1hZ2VcIixcbiAgICAgICAgICBleHRlbnNpb25zOiBbXCJqcGdcIiwgXCJwbmdcIiwgXCJzdmdcIiwgXCJnaWZcIl1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaW1hZ2VFbGVtZW50ID0gX3RoaXMxMy5jcmVhdGVJbWFnZUVsZW1lbnQoe1xuICAgICAgICAgIHNjZW5lWDogeCxcbiAgICAgICAgICBzY2VuZVk6IHlcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGluc2VydE9uQ2FudmFzRGlyZWN0bHkpIHtcbiAgICAgICAgICBfdGhpczEzLmluc2VydEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQsIGltYWdlRmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRmluYWxpemUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgcGVuZGluZ0ltYWdlRWxlbWVudDogaW1hZ2VFbGVtZW50XG4gICAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgX3RoaXMxMy5pbnNlcnRJbWFnZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCBpbWFnZUZpbGUsXG4gICAgICAgICAgICAvKiBzaG93Q3Vyc29ySW1hZ2VQcmV2aWV3ICovXG4gICAgICAgICAgICB0cnVlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgIHBlbmRpbmdJbWFnZUVsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWRpdGluZ0VsZW1lbnQ6IG51bGwsXG4gICAgICAgICAgZWxlbWVudFR5cGU6IFwic2VsZWN0aW9uXCJcbiAgICAgICAgfSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzMTMuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkZpbmFsaXplKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIF9yZWYxNy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH0oKTtcblxuICB0aGlzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMgPSBmdW5jdGlvbiAoaW1hZ2VFbGVtZW50KSB7XG4gICAgbGV0IGZvcmNlTmF0dXJhbFNpemUgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IGZhbHNlO1xuICAgIGNvbnN0IGltYWdlID0gaXNJbml0aWFsaXplZEltYWdlRWxlbWVudChpbWFnZUVsZW1lbnQpICYmIF90aGlzMTMuaW1hZ2VDYWNoZS5nZXQoaW1hZ2VFbGVtZW50LmZpbGVJZCk/LmltYWdlO1xuXG4gICAgaWYgKCFpbWFnZSB8fCBpbWFnZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGlmIChpbWFnZUVsZW1lbnQud2lkdGggPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUgJiYgaW1hZ2VFbGVtZW50LmhlaWdodCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIF90aGlzMTMuc3RhdGUuem9vbS52YWx1ZSkge1xuICAgICAgICBjb25zdCBwbGFjZWhvbGRlclNpemUgPSAxMDAgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoaW1hZ2VFbGVtZW50LCB7XG4gICAgICAgICAgeDogaW1hZ2VFbGVtZW50LnggLSBwbGFjZWhvbGRlclNpemUgLyAyLFxuICAgICAgICAgIHk6IGltYWdlRWxlbWVudC55IC0gcGxhY2Vob2xkZXJTaXplIC8gMixcbiAgICAgICAgICB3aWR0aDogcGxhY2Vob2xkZXJTaXplLFxuICAgICAgICAgIGhlaWdodDogcGxhY2Vob2xkZXJTaXplXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlTmF0dXJhbFNpemUgfHwgLy8gaWYgdXNlci1jcmVhdGVkIGJvdW5kaW5nIGJveCBpcyBiZWxvdyB0aHJlc2hvbGQsIGFzc3VtZSB0aGVcbiAgICAvLyBpbnRlbnRpb24gd2FzIHRvIGNsaWNrIGluc3RlYWQgb2YgZHJhZywgYW5kIHVzZSB0aGUgaW1hZ2Unc1xuICAgIC8vIGludHJpbnNpYyBzaXplXG4gICAgaW1hZ2VFbGVtZW50LndpZHRoIDwgRFJBR0dJTkdfVEhSRVNIT0xEIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlICYmIGltYWdlRWxlbWVudC5oZWlnaHQgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBfdGhpczEzLnN0YXRlLnpvb20udmFsdWUpIHtcbiAgICAgIGNvbnN0IG1pbkhlaWdodCA9IE1hdGgubWF4KF90aGlzMTMuc3RhdGUuaGVpZ2h0IC0gMTIwLCAxNjApOyAvLyBtYXggNjUlIG9mIGNhbnZhcyBoZWlnaHQsIGNsYW1wZWQgdG8gPDMwMHB4LCB2aCAtIDEyMHB4PlxuXG4gICAgICBjb25zdCBtYXhIZWlnaHQgPSBNYXRoLm1pbihtaW5IZWlnaHQsIE1hdGguZmxvb3IoX3RoaXMxMy5zdGF0ZS5oZWlnaHQgKiAwLjUpIC8gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IE1hdGgubWluKGltYWdlLm5hdHVyYWxIZWlnaHQsIG1heEhlaWdodCk7XG4gICAgICBjb25zdCB3aWR0aCA9IGhlaWdodCAqIChpbWFnZS5uYXR1cmFsV2lkdGggLyBpbWFnZS5uYXR1cmFsSGVpZ2h0KTsgLy8gYWRkIGN1cnJlbnQgaW1hZ2VFbGVtZW50IHdpZHRoL2hlaWdodCB0byBhY2NvdW50IGZvciBwcmV2aW91cyBjZW50ZXJpbmdcbiAgICAgIC8vIG9mIHRoZSBwbGFjaG9sZGVyIGltYWdlXG5cbiAgICAgIGNvbnN0IHggPSBpbWFnZUVsZW1lbnQueCArIGltYWdlRWxlbWVudC53aWR0aCAvIDIgLSB3aWR0aCAvIDI7XG4gICAgICBjb25zdCB5ID0gaW1hZ2VFbGVtZW50LnkgKyBpbWFnZUVsZW1lbnQuaGVpZ2h0IC8gMiAtIGhlaWdodCAvIDI7XG4gICAgICBtdXRhdGVFbGVtZW50KGltYWdlRWxlbWVudCwge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy51cGRhdGVJbWFnZUNhY2hlID0gLyojX19QVVJFX18qL2Z1bmN0aW9uICgpIHtcbiAgICB2YXIgX3JlZjE4ID0gX2FzeW5jVG9HZW5lcmF0b3IoZnVuY3Rpb24qIChlbGVtZW50cykge1xuICAgICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgICAgY29uc3Qge1xuICAgICAgICB1cGRhdGVkRmlsZXMsXG4gICAgICAgIGVycm9yZWRGaWxlc1xuICAgICAgfSA9IHlpZWxkIF91cGRhdGVJbWFnZUNhY2hlKHtcbiAgICAgICAgaW1hZ2VDYWNoZTogX3RoaXMxMy5pbWFnZUNhY2hlLFxuICAgICAgICBmaWxlSWRzOiBlbGVtZW50cy5tYXAoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgICByZXR1cm4gZWxlbWVudC5maWxlSWQ7XG4gICAgICAgIH0pLFxuICAgICAgICBmaWxlc1xuICAgICAgfSk7XG5cbiAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSB8fCBlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICBpZiAodXBkYXRlZEZpbGVzLmhhcyhlbGVtZW50LmZpbGVJZCkpIHtcbiAgICAgICAgICAgIGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlcnJvcmVkRmlsZXMuc2l6ZSkge1xuICAgICAgICBfdGhpczEzLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLm1hcChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgIGlmIChpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGVsZW1lbnQpICYmIGVycm9yZWRGaWxlcy5oYXMoZWxlbWVudC5maWxlSWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlbWVudCwge1xuICAgICAgICAgICAgICBzdGF0dXM6IFwiZXJyb3JcIlxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdXBkYXRlZEZpbGVzLFxuICAgICAgICBlcnJvcmVkRmlsZXNcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTIpIHtcbiAgICAgIHJldHVybiBfcmVmMTguYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5hZGROZXdJbWFnZXNUb0ltYWdlQ2FjaGUgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMTkgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKCkge1xuICAgICAgbGV0IGltYWdlRWxlbWVudHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCkpO1xuICAgICAgbGV0IGZpbGVzID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBfdGhpczEzLmZpbGVzO1xuICAgICAgY29uc3QgdW5jYWNoZWRJbWFnZUVsZW1lbnRzID0gaW1hZ2VFbGVtZW50cy5maWx0ZXIoZnVuY3Rpb24gKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuICFlbGVtZW50LmlzRGVsZXRlZCAmJiAhX3RoaXMxMy5pbWFnZUNhY2hlLmhhcyhlbGVtZW50LmZpbGVJZCk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHVuY2FjaGVkSW1hZ2VFbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgIHVwZGF0ZWRGaWxlc1xuICAgICAgICB9ID0geWllbGQgX3RoaXMxMy51cGRhdGVJbWFnZUNhY2hlKHVuY2FjaGVkSW1hZ2VFbGVtZW50cywgZmlsZXMpO1xuXG4gICAgICAgIGlmICh1cGRhdGVkRmlsZXMuc2l6ZSkge1xuICAgICAgICAgIF90aGlzMTMuc2NlbmUuaW5mb3JtTXV0YXRpb24oKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiBfcmVmMTkuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5zY2hlZHVsZUltYWdlUmVmcmVzaCA9IHRocm90dGxlKGZ1bmN0aW9uICgpIHtcbiAgICBfdGhpczEzLmFkZE5ld0ltYWdlc1RvSW1hZ2VDYWNoZSgpO1xuICB9LCBJTUFHRV9SRU5ERVJfVElNRU9VVCk7XG5cbiAgdGhpcy51cGRhdGVCaW5kaW5nRW5hYmxlZE9uUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBzaG91bGRFbmFibGVCaW5kaW5nID0gc2hvdWxkRW5hYmxlQmluZGluZ0ZvclBvaW50ZXJFdmVudChldmVudCk7XG5cbiAgICBpZiAoX3RoaXMxMy5zdGF0ZS5pc0JpbmRpbmdFbmFibGVkICE9PSBzaG91bGRFbmFibGVCaW5kaW5nKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgaXNCaW5kaW5nRW5hYmxlZDogc2hvdWxkRW5hYmxlQmluZGluZ1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIHRoaXMubWF5YmVTdWdnZXN0QmluZGluZ0F0Q3Vyc29yID0gZnVuY3Rpb24gKHBvaW50ZXJDb29yZHMpIHtcbiAgICBjb25zdCBob3ZlcmVkQmluZGFibGVFbGVtZW50ID0gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKHBvaW50ZXJDb29yZHMsIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nczogaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsID8gW2hvdmVyZWRCaW5kYWJsZUVsZW1lbnRdIDogW11cbiAgICB9KTtcbiAgfTtcblxuICB0aGlzLm1heWJlU3VnZ2VzdEJpbmRpbmdzRm9yTGluZWFyRWxlbWVudEF0Q29vcmRzID0gZnVuY3Rpb24gKGxpbmVhckVsZW1lbnQsIHBvaW50ZXJDb29yZHMsIG9wcG9zaXRlQmluZGluZ0JvdW5kRWxlbWVudCkge1xuICAgIGlmICghcG9pbnRlckNvb3Jkcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdWdnZXN0ZWRCaW5kaW5ncyA9IHBvaW50ZXJDb29yZHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGNvb3Jkcykge1xuICAgICAgY29uc3QgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCA9IGdldEhvdmVyZWRFbGVtZW50Rm9yQmluZGluZyhjb29yZHMsIF90aGlzMTMuc2NlbmUpO1xuXG4gICAgICBpZiAoaG92ZXJlZEJpbmRhYmxlRWxlbWVudCAhPSBudWxsICYmICFpc0xpbmVhckVsZW1lbnRTaW1wbGVBbmRBbHJlYWR5Qm91bmQobGluZWFyRWxlbWVudCwgb3Bwb3NpdGVCaW5kaW5nQm91bmRFbGVtZW50Py5pZCwgaG92ZXJlZEJpbmRhYmxlRWxlbWVudCkpIHtcbiAgICAgICAgYWNjLnB1c2goaG92ZXJlZEJpbmRhYmxlRWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10pO1xuXG4gICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICBzdWdnZXN0ZWRCaW5kaW5nc1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzUmVmID0gZnVuY3Rpb24gKGNhbnZhcykge1xuICAgIC8vIGNhbnZhcyBpcyBudWxsIHdoZW4gdW5tb3VudGluZ1xuICAgIGlmIChjYW52YXMgIT09IG51bGwpIHtcbiAgICAgIF90aGlzMTMuY2FudmFzID0gY2FudmFzO1xuICAgICAgX3RoaXMxMy5yYyA9IHJvdWdoLmNhbnZhcyhfdGhpczEzLmNhbnZhcyk7XG5cbiAgICAgIF90aGlzMTMuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoRVZFTlQuV0hFRUwsIF90aGlzMTMuaGFuZGxlV2hlZWwsIHtcbiAgICAgICAgcGFzc2l2ZTogZmFsc2VcbiAgICAgIH0pO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCBfdGhpczEzLm9uVGFwU3RhcnQpO1xuXG4gICAgICBfdGhpczEzLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX0VORCwgX3RoaXMxMy5vblRhcEVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULldIRUVMLCBfdGhpczEzLmhhbmRsZVdoZWVsKTtcbiAgICAgIF90aGlzMTMuY2FudmFzPy5yZW1vdmVFdmVudExpc3RlbmVyKEVWRU5ULlRPVUNIX1NUQVJULCBfdGhpczEzLm9uVGFwU3RhcnQpO1xuICAgICAgX3RoaXMxMy5jYW52YXM/LnJlbW92ZUV2ZW50TGlzdGVuZXIoRVZFTlQuVE9VQ0hfRU5ELCBfdGhpczEzLm9uVGFwRW5kKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVBcHBPbkRyb3AgPSAvKiNfX1BVUkVfXyovZnVuY3Rpb24gKCkge1xuICAgIHZhciBfcmVmMjAgPSBfYXN5bmNUb0dlbmVyYXRvcihmdW5jdGlvbiogKGV2ZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoX3RoaXMxMy5wcm9wcy5vbkRyb3ApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKCh5aWVsZCBfdGhpczEzLnByb3BzLm9uRHJvcChldmVudCkpID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdO1xuXG4gICAgICAgIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgICAgICAgIC8vIGZpcnN0IGF0dGVtcHQgdG8gZGVjb2RlIHNjZW5lIGZyb20gdGhlIGltYWdlIGlmIGl0J3MgZW1iZWRkZWRcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5wbmcgfHwgZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgICAgICAgICBmaWxlLmhhbmRsZSA9IHlpZWxkIGl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBzY2VuZSA9IHlpZWxkIGxvYWRGcm9tQmxvYihmaWxlLCBfdGhpczEzLnN0YXRlLCBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpKTtcblxuICAgICAgICAgICAgICBfdGhpczEzLnN5bmNBY3Rpb25SZXN1bHQoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBzY2VuZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZVxuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgaWYgKGVycm9yLm5hbWUgIT09IFwiRW5jb2RpbmdFcnJvclwiKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IC8vIGlmIG5vIHNjZW5lIGlzIGVtYmVkZGVkIG9yIHdlIGZhaWwgZm9yIHdoYXRldmVyIHJlYXNvbiwgZmFsbCBiYWNrXG4gICAgICAgICAgLy8gdG8gaW1wb3J0aW5nIGFzIHJlZ3VsYXIgaW1hZ2VcbiAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgeDogc2NlbmVYLFxuICAgICAgICAgICAgeTogc2NlbmVZXG4gICAgICAgICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICAgICAgICBjb25zdCBpbWFnZUVsZW1lbnQgPSBfdGhpczEzLmNyZWF0ZUltYWdlRWxlbWVudCh7XG4gICAgICAgICAgICBzY2VuZVgsXG4gICAgICAgICAgICBzY2VuZVlcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIF90aGlzMTMuaW5zZXJ0SW1hZ2VFbGVtZW50KGltYWdlRWxlbWVudCwgZmlsZSk7XG5cbiAgICAgICAgICBfdGhpczEzLmluaXRpYWxpemVJbWFnZURpbWVuc2lvbnMoaW1hZ2VFbGVtZW50KTtcblxuICAgICAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7XG4gICAgICAgICAgICAgIFtpbWFnZUVsZW1lbnQuaWRdOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yTWVzc2FnZTogZXJyb3IubWVzc2FnZVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGlicmFyeVNoYXBlcyA9IGV2ZW50LmRhdGFUcmFuc2Zlci5nZXREYXRhKE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYik7XG5cbiAgICAgIGlmIChsaWJyYXJ5U2hhcGVzICE9PSBcIlwiKSB7XG4gICAgICAgIF90aGlzMTMuYWRkRWxlbWVudHNGcm9tUGFzdGVPckxpYnJhcnkoe1xuICAgICAgICAgIGVsZW1lbnRzOiBKU09OLnBhcnNlKGxpYnJhcnlTaGFwZXMpLFxuICAgICAgICAgIHBvc2l0aW9uOiBldmVudCxcbiAgICAgICAgICBmaWxlczogbnVsbFxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXI/LmZpbGVzWzBdO1xuXG4gICAgICBpZiAoZmlsZT8udHlwZSA9PT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliIHx8IGZpbGU/Lm5hbWU/LmVuZHNXaXRoKFwiLmV4Y2FsaWRyYXdsaWJcIikpIHtcbiAgICAgICAgX3RoaXMxMy5saWJyYXJ5LmltcG9ydExpYnJhcnkoZmlsZSkudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgLy8gQ2xvc2UgYW5kIHRoZW4gb3BlbiB0byBnZXQgdGhlIGxpYnJhcmllcyB1cGRhdGVkXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xpYnJhcnlPcGVuOiBmYWxzZVxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpc0xpYnJhcnlPcGVuOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgIHJldHVybiBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzTG9hZGluZzogZmFsc2UsXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7IC8vIGRlZmF1bHQ6IGFzc3VtZSBhbiBFeGNhbGlkcmF3IGZpbGUgcmVnYXJkbGVzcyBvZiBleHRlbnNpb24vTWltZVR5cGVcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgICAgaXNMb2FkaW5nOiB0cnVlXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvbmx5IHdvcmsgYXMgb2YgQ2hyb21lIDg2LFxuICAgICAgICAgICAgLy8gYnV0IGNhbiBiZSBzYWZlbHkgaWdub3JlZCBvbiBvbGRlciByZWxlYXNlcy5cbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBldmVudC5kYXRhVHJhbnNmZXIuaXRlbXNbMF07XG4gICAgICAgICAgICBmaWxlLmhhbmRsZSA9IHlpZWxkIGl0ZW0uZ2V0QXNGaWxlU3lzdGVtSGFuZGxlKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB5aWVsZCBfdGhpczEzLmxvYWRGaWxlVG9DYW52YXMoZmlsZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZnVuY3Rpb24gKF94MTMpIHtcbiAgICAgIHJldHVybiBfcmVmMjAuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9KCk7XG5cbiAgdGhpcy5sb2FkRmlsZVRvQ2FudmFzID0gZnVuY3Rpb24gKGZpbGUpIHtcbiAgICBsb2FkRnJvbUJsb2IoZmlsZSwgX3RoaXMxMy5zdGF0ZSwgX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSkudGhlbihmdW5jdGlvbiAoc2NlbmUpIHtcbiAgICAgIF90aGlzMTMuc3luY0FjdGlvblJlc3VsdChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHNjZW5lKSwge30sIHtcbiAgICAgICAgYXBwU3RhdGU6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgc2NlbmUuYXBwU3RhdGUgfHwgX3RoaXMxMy5zdGF0ZSksIHt9LCB7XG4gICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZVxuICAgICAgICB9KSxcbiAgICAgICAgcmVwbGFjZUZpbGVzOiB0cnVlLFxuICAgICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWVcbiAgICAgIH0pKTtcbiAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICBpc0xvYWRpbmc6IGZhbHNlLFxuICAgICAgICBlcnJvck1lc3NhZ2U6IGVycm9yLm1lc3NhZ2VcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIHRoaXMuaGFuZGxlQ2FudmFzQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IHtcbiAgICAgIHgsXG4gICAgICB5XG4gICAgfSA9IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyhldmVudCwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gX3RoaXMxMy5nZXRFbGVtZW50QXRQb3NpdGlvbih4LCB5LCB7XG4gICAgICBwcmVmZXJTZWxlY3RlZDogdHJ1ZVxuICAgIH0pO1xuXG4gICAgY29uc3QgdHlwZSA9IGVsZW1lbnQgPyBcImVsZW1lbnRcIiA6IFwiY2FudmFzXCI7XG4gICAgY29uc3QgY29udGFpbmVyID0gX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnQ7XG4gICAgY29uc3Qge1xuICAgICAgdG9wOiBvZmZzZXRUb3AsXG4gICAgICBsZWZ0OiBvZmZzZXRMZWZ0XG4gICAgfSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBsZWZ0ID0gZXZlbnQuY2xpZW50WCAtIG9mZnNldExlZnQ7XG4gICAgY29uc3QgdG9wID0gZXZlbnQuY2xpZW50WSAtIG9mZnNldFRvcDtcblxuICAgIGlmIChlbGVtZW50ICYmICFfdGhpczEzLnN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXSkge1xuICAgICAgX3RoaXMxMy5zZXRTdGF0ZSh7XG4gICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge1xuICAgICAgICAgIFtlbGVtZW50LmlkXTogdHJ1ZVxuICAgICAgICB9XG4gICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIF90aGlzMTMuX29wZW5Db250ZXh0TWVudSh7XG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnRcbiAgICAgICAgfSwgdHlwZSk7XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3RoaXMxMy5fb3BlbkNvbnRleHRNZW51KHtcbiAgICAgICAgdG9wLFxuICAgICAgICBsZWZ0XG4gICAgICB9LCB0eXBlKTtcbiAgICB9XG4gIH07XG5cbiAgdGhpcy5tYXliZURyYWdOZXdHZW5lcmljRWxlbWVudCA9IGZ1bmN0aW9uIChwb2ludGVyRG93blN0YXRlLCBldmVudCkge1xuICAgIGNvbnN0IGRyYWdnaW5nRWxlbWVudCA9IF90aGlzMTMuc3RhdGUuZHJhZ2dpbmdFbGVtZW50O1xuICAgIGNvbnN0IHBvaW50ZXJDb29yZHMgPSBwb2ludGVyRG93blN0YXRlLmxhc3RDb29yZHM7XG5cbiAgICBpZiAoIWRyYWdnaW5nRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChkcmFnZ2luZ0VsZW1lbnQudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgICAgZHJhZ05ld0VsZW1lbnQoZHJhZ2dpbmdFbGVtZW50LCBfdGhpczEzLnN0YXRlLmVsZW1lbnRUeXBlLCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi54LCBwb2ludGVyRG93blN0YXRlLm9yaWdpbi55LCBwb2ludGVyQ29vcmRzLngsIHBvaW50ZXJDb29yZHMueSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueCwgcG9pbnRlckNvb3Jkcy54KSwgZGlzdGFuY2UocG9pbnRlckRvd25TdGF0ZS5vcmlnaW4ueSwgcG9pbnRlckNvb3Jkcy55KSwgc2hvdWxkTWFpbnRhaW5Bc3BlY3RSYXRpbyhldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW2dyaWRYLCBncmlkWV0gPSBnZXRHcmlkUG9pbnQocG9pbnRlckNvb3Jkcy54LCBwb2ludGVyQ29vcmRzLnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuICAgICAgY29uc3QgaW1hZ2UgPSBpc0luaXRpYWxpemVkSW1hZ2VFbGVtZW50KGRyYWdnaW5nRWxlbWVudCkgJiYgX3RoaXMxMy5pbWFnZUNhY2hlLmdldChkcmFnZ2luZ0VsZW1lbnQuZmlsZUlkKT8uaW1hZ2U7XG4gICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IGltYWdlICYmICEoaW1hZ2UgaW5zdGFuY2VvZiBQcm9taXNlKSA/IGltYWdlLndpZHRoIC8gaW1hZ2UuaGVpZ2h0IDogbnVsbDtcbiAgICAgIGRyYWdOZXdFbGVtZW50KGRyYWdnaW5nRWxlbWVudCwgX3RoaXMxMy5zdGF0ZS5lbGVtZW50VHlwZSwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueCwgcG9pbnRlckRvd25TdGF0ZS5vcmlnaW5JbkdyaWQueSwgZ3JpZFgsIGdyaWRZLCBkaXN0YW5jZShwb2ludGVyRG93blN0YXRlLm9yaWdpbkluR3JpZC54LCBncmlkWCksIGRpc3RhbmNlKHBvaW50ZXJEb3duU3RhdGUub3JpZ2luSW5HcmlkLnksIGdyaWRZKSwgaXNJbWFnZUVsZW1lbnQoZHJhZ2dpbmdFbGVtZW50KSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCBzaG91bGRSZXNpemVGcm9tQ2VudGVyKGV2ZW50KSwgYXNwZWN0UmF0aW8pO1xuXG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoW2RyYWdnaW5nRWxlbWVudF0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLm1heWJlSGFuZGxlUmVzaXplID0gZnVuY3Rpb24gKHBvaW50ZXJEb3duU3RhdGUsIGV2ZW50KSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoX3RoaXMxMy5zY2VuZS5nZXRFbGVtZW50cygpLCBfdGhpczEzLnN0YXRlKTtcbiAgICBjb25zdCB0cmFuc2Zvcm1IYW5kbGVUeXBlID0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuaGFuZGxlVHlwZTtcblxuICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgLy8gVE9ETzogcmVuYW1lIHRoaXMgc3RhdGUgZmllbGQgdG8gXCJpc1NjYWxpbmdcIiB0byBkaXN0aW5ndWlzaFxuICAgICAgLy8gaXQgZnJvbSB0aGUgZ2VuZXJpYyBcImlzUmVzaXppbmdcIiB3aGljaCBpbmNsdWRlcyBzY2FsaW5nIGFuZFxuICAgICAgLy8gcm90YXRpbmdcbiAgICAgIGlzUmVzaXppbmc6IHRyYW5zZm9ybUhhbmRsZVR5cGUgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJyb3RhdGlvblwiLFxuICAgICAgaXNSb3RhdGluZzogdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJyb3RhdGlvblwiXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludGVyQ29vcmRzID0gcG9pbnRlckRvd25TdGF0ZS5sYXN0Q29vcmRzO1xuICAgIGNvbnN0IFtyZXNpemVYLCByZXNpemVZXSA9IGdldEdyaWRQb2ludChwb2ludGVyQ29vcmRzLnggLSBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5vZmZzZXQueCwgcG9pbnRlckNvb3Jkcy55IC0gcG9pbnRlckRvd25TdGF0ZS5yZXNpemUub2Zmc2V0LnksIF90aGlzMTMuc3RhdGUuZ3JpZFNpemUpO1xuXG4gICAgaWYgKHRyYW5zZm9ybUVsZW1lbnRzKHBvaW50ZXJEb3duU3RhdGUsIHRyYW5zZm9ybUhhbmRsZVR5cGUsIHNlbGVjdGVkRWxlbWVudHMsIHBvaW50ZXJEb3duU3RhdGUucmVzaXplLmFycm93RGlyZWN0aW9uLCBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCksIHNob3VsZFJlc2l6ZUZyb21DZW50ZXIoZXZlbnQpLCBzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0ltYWdlRWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSA/ICFzaG91bGRNYWludGFpbkFzcGVjdFJhdGlvKGV2ZW50KSA6IHNob3VsZE1haW50YWluQXNwZWN0UmF0aW8oZXZlbnQpLCByZXNpemVYLCByZXNpemVZLCBwb2ludGVyRG93blN0YXRlLnJlc2l6ZS5jZW50ZXIueCwgcG9pbnRlckRvd25TdGF0ZS5yZXNpemUuY2VudGVyLnkpKSB7XG4gICAgICBfdGhpczEzLm1heWJlU3VnZ2VzdEJpbmRpbmdGb3JBbGwoc2VsZWN0ZWRFbGVtZW50cyk7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICB0aGlzLl9vcGVuQ29udGV4dE1lbnUgPSBmdW5jdGlvbiAoX3JlZjIxLCB0eXBlKSB7XG4gICAgbGV0IHtcbiAgICAgIGxlZnQsXG4gICAgICB0b3BcbiAgICB9ID0gX3JlZjIxO1xuICAgIGNvbnN0IG1heWJlR3JvdXBBY3Rpb24gPSBhY3Rpb25Hcm91cC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZVVuZ3JvdXBBY3Rpb24gPSBhY3Rpb25Vbmdyb3VwLmNvbnRleHRJdGVtUHJlZGljYXRlKF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKSwgX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLmdldEFwcFN0YXRlKCkpO1xuICAgIGNvbnN0IG1heWJlRmxpcEhvcml6b250YWwgPSBhY3Rpb25GbGlwSG9yaXpvbnRhbC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBtYXliZUZsaXBWZXJ0aWNhbCA9IGFjdGlvbkZsaXBWZXJ0aWNhbC5jb250ZXh0SXRlbVByZWRpY2F0ZShfdGhpczEzLmFjdGlvbk1hbmFnZXIuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCksIF90aGlzMTMuYWN0aW9uTWFuYWdlci5nZXRBcHBTdGF0ZSgpKTtcbiAgICBjb25zdCBzZXBhcmF0b3IgPSBcInNlcGFyYXRvclwiO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBfdGhpczEzLnNjZW5lLmdldEVsZW1lbnRzKCk7XG5cbiAgICBjb25zdCBvcHRpb25zID0gW107XG5cbiAgICBpZiAocHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGFjdGlvbkNvcHlBc1BuZyk7XG4gICAgfVxuXG4gICAgaWYgKHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgb3B0aW9ucy5wdXNoKGFjdGlvbkNvcHlBc1N2Zyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGUgPT09IFwiY2FudmFzXCIpIHtcbiAgICAgIGNvbnN0IHZpZXdNb2RlT3B0aW9ucyA9IFsuLi5vcHRpb25zLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy5ncmlkTW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlR3JpZE1vZGUsIHR5cGVvZiBfdGhpczEzLnByb3BzLnplbk1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZVplbk1vZGUsIHR5cGVvZiBfdGhpczEzLnByb3BzLnZpZXdNb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVWaWV3TW9kZSwgYWN0aW9uVG9nZ2xlU3RhdHNdO1xuXG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogdmlld01vZGVPcHRpb25zLFxuICAgICAgICAgIHRvcCxcbiAgICAgICAgICBsZWZ0LFxuICAgICAgICAgIGFjdGlvbk1hbmFnZXI6IF90aGlzMTMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgICBhcHBTdGF0ZTogX3RoaXMxMy5zdGF0ZSxcbiAgICAgICAgICBjb250YWluZXI6IF90aGlzMTMuZXhjYWxpZHJhd0NvbnRhaW5lclJlZi5jdXJyZW50XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW190aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiB7XG4gICAgICAgICAgICBuYW1lOiBcInBhc3RlXCIsXG4gICAgICAgICAgICBwZXJmb3JtOiBmdW5jdGlvbiAoZWxlbWVudHMsIGFwcFN0YXRlcykge1xuICAgICAgICAgICAgICBfdGhpczEzLnBhc3RlRnJvbUNsaXBib2FyZChudWxsKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbW1pdFRvSGlzdG9yeTogZmFsc2VcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5wYXN0ZVwiXG4gICAgICAgICAgfSwgX3RoaXMxMy5pc01vYmlsZSAmJiBuYXZpZ2F0b3IuY2xpcGJvYXJkICYmIHNlcGFyYXRvciwgcHJvYmFibHlTdXBwb3J0c0NsaXBib2FyZEJsb2IgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNQbmcsIHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCAmJiBhY3Rpb25Db3B5QXNTdmcsIChwcm9iYWJseVN1cHBvcnRzQ2xpcGJvYXJkQmxvYiAmJiBlbGVtZW50cy5sZW5ndGggPiAwIHx8IHByb2JhYmx5U3VwcG9ydHNDbGlwYm9hcmRXcml0ZVRleHQgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25TZWxlY3RBbGwsIHNlcGFyYXRvciwgdHlwZW9mIF90aGlzMTMucHJvcHMuZ3JpZE1vZGVFbmFibGVkID09PSBcInVuZGVmaW5lZFwiICYmIGFjdGlvblRvZ2dsZUdyaWRNb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy56ZW5Nb2RlRW5hYmxlZCA9PT0gXCJ1bmRlZmluZWRcIiAmJiBhY3Rpb25Ub2dnbGVaZW5Nb2RlLCB0eXBlb2YgX3RoaXMxMy5wcm9wcy52aWV3TW9kZUVuYWJsZWQgPT09IFwidW5kZWZpbmVkXCIgJiYgYWN0aW9uVG9nZ2xlVmlld01vZGUsIGFjdGlvblRvZ2dsZVN0YXRzXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwiZWxlbWVudFwiKSB7XG4gICAgICBpZiAoX3RoaXMxMy5zdGF0ZS52aWV3TW9kZUVuYWJsZWQpIHtcbiAgICAgICAgQ29udGV4dE1lbnUucHVzaCh7XG4gICAgICAgICAgb3B0aW9uczogW25hdmlnYXRvci5jbGlwYm9hcmQgJiYgYWN0aW9uQ29weSwgLi4ub3B0aW9uc10sXG4gICAgICAgICAgdG9wLFxuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgYWN0aW9uTWFuYWdlcjogX3RoaXMxMy5hY3Rpb25NYW5hZ2VyLFxuICAgICAgICAgIGFwcFN0YXRlOiBfdGhpczEzLnN0YXRlLFxuICAgICAgICAgIGNvbnRhaW5lcjogX3RoaXMxMy5leGNhbGlkcmF3Q29udGFpbmVyUmVmLmN1cnJlbnRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBDb250ZXh0TWVudS5wdXNoKHtcbiAgICAgICAgICBvcHRpb25zOiBbX3RoaXMxMy5pc01vYmlsZSAmJiBhY3Rpb25DdXQsIF90aGlzMTMuaXNNb2JpbGUgJiYgbmF2aWdhdG9yLmNsaXBib2FyZCAmJiBhY3Rpb25Db3B5LCBfdGhpczEzLmlzTW9iaWxlICYmIG5hdmlnYXRvci5jbGlwYm9hcmQgJiYge1xuICAgICAgICAgICAgbmFtZTogXCJwYXN0ZVwiLFxuICAgICAgICAgICAgcGVyZm9ybTogZnVuY3Rpb24gKGVsZW1lbnRzLCBhcHBTdGF0ZXMpIHtcbiAgICAgICAgICAgICAgX3RoaXMxMy5wYXN0ZUZyb21DbGlwYm9hcmQobnVsbCk7XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb21taXRUb0hpc3Rvcnk6IGZhbHNlXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMucGFzdGVcIlxuICAgICAgICAgIH0sIF90aGlzMTMuaXNNb2JpbGUgJiYgc2VwYXJhdG9yLCAuLi5vcHRpb25zLCBzZXBhcmF0b3IsIGFjdGlvbkNvcHlTdHlsZXMsIGFjdGlvblBhc3RlU3R5bGVzLCBzZXBhcmF0b3IsIG1heWJlR3JvdXBBY3Rpb24gJiYgYWN0aW9uR3JvdXAsIG1heWJlVW5ncm91cEFjdGlvbiAmJiBhY3Rpb25Vbmdyb3VwLCAobWF5YmVHcm91cEFjdGlvbiB8fCBtYXliZVVuZ3JvdXBBY3Rpb24pICYmIHNlcGFyYXRvciwgYWN0aW9uQWRkVG9MaWJyYXJ5LCBzZXBhcmF0b3IsIGFjdGlvblNlbmRCYWNrd2FyZCwgYWN0aW9uQnJpbmdGb3J3YXJkLCBhY3Rpb25TZW5kVG9CYWNrLCBhY3Rpb25CcmluZ1RvRnJvbnQsIHNlcGFyYXRvciwgbWF5YmVGbGlwSG9yaXpvbnRhbCAmJiBhY3Rpb25GbGlwSG9yaXpvbnRhbCwgbWF5YmVGbGlwVmVydGljYWwgJiYgYWN0aW9uRmxpcFZlcnRpY2FsLCAobWF5YmVGbGlwSG9yaXpvbnRhbCB8fCBtYXliZUZsaXBWZXJ0aWNhbCkgJiYgc2VwYXJhdG9yLCBhY3Rpb25EdXBsaWNhdGVTZWxlY3Rpb24sIGFjdGlvbkRlbGV0ZVNlbGVjdGVkXSxcbiAgICAgICAgICB0b3AsXG4gICAgICAgICAgbGVmdCxcbiAgICAgICAgICBhY3Rpb25NYW5hZ2VyOiBfdGhpczEzLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgICAgYXBwU3RhdGU6IF90aGlzMTMuc3RhdGUsXG4gICAgICAgICAgY29udGFpbmVyOiBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgdGhpcy5oYW5kbGVXaGVlbCA9IHdpdGhCYXRjaGVkVXBkYXRlcyhmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgaWYgKGlzUGFubmluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHtcbiAgICAgIGRlbHRhWCxcbiAgICAgIGRlbHRhWVxuICAgIH0gPSBldmVudDtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkc1xuICAgIH0gPSBfdGhpczEzLnN0YXRlOyAvLyBub3RlIHRoYXQgZXZlbnQuY3RybEtleSBpcyBuZWNlc3NhcnkgdG8gaGFuZGxlIHBpbmNoIHpvb21pbmdcblxuICAgIGlmIChldmVudC5tZXRhS2V5IHx8IGV2ZW50LmN0cmxLZXkpIHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oZGVsdGFZKTtcbiAgICAgIGNvbnN0IE1BWF9TVEVQID0gMTA7XG4gICAgICBsZXQgZGVsdGEgPSBNYXRoLmFicyhkZWx0YVkpO1xuXG4gICAgICBpZiAoZGVsdGEgPiBNQVhfU1RFUCkge1xuICAgICAgICBkZWx0YSA9IE1BWF9TVEVQO1xuICAgICAgfVxuXG4gICAgICBkZWx0YSAqPSBzaWduO1xuXG4gICAgICBpZiAoT2JqZWN0LmtleXMocHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMpLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczoge31cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSwgMTAwMCk7XG4gICAgICB9XG5cbiAgICAgIGxldCBuZXdab29tID0gX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlIC0gZGVsdGEgLyAxMDA7IC8vIGluY3JlYXNlIHpvb20gc3RlcHMgdGhlIG1vcmUgem9vbWVkLWluIHdlIGFyZSAoYXBwbGllcyB0byA+MTAwJSBvbmx5KVxuXG4gICAgICBuZXdab29tICs9IE1hdGgubG9nMTAoTWF0aC5tYXgoMSwgX3RoaXMxMy5zdGF0ZS56b29tLnZhbHVlKSkgKiAtc2lnbjsgLy8gcm91bmQgdG8gbmVhcmVzdCBzdGVwXG5cbiAgICAgIG5ld1pvb20gPSBNYXRoLnJvdW5kKG5ld1pvb20gKiBaT09NX1NURVAgKiAxMDApIC8gKFpPT01fU1RFUCAqIDEwMCk7XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyMikge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgb2Zmc2V0TGVmdCxcbiAgICAgICAgICBvZmZzZXRUb3BcbiAgICAgICAgfSA9IF9yZWYyMjtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB6b29tOiBnZXROZXdab29tKGdldE5vcm1hbGl6ZWRab29tKG5ld1pvb20pLCB6b29tLCB7XG4gICAgICAgICAgICBsZWZ0OiBvZmZzZXRMZWZ0LFxuICAgICAgICAgICAgdG9wOiBvZmZzZXRUb3BcbiAgICAgICAgICB9LCB7XG4gICAgICAgICAgICB4OiBjdXJzb3JYLFxuICAgICAgICAgICAgeTogY3Vyc29yWVxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICAgICAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IE9iamVjdC5rZXlzKHNlbGVjdGVkRWxlbWVudElkcykubGVuZ3RoICE9PSAwID8gc2VsZWN0ZWRFbGVtZW50SWRzIDogcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiB0cnVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgX3RoaXMxMy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCgpO1xuXG4gICAgICByZXR1cm47XG4gICAgfSAvLyBzY3JvbGwgaG9yaXpvbnRhbGx5IHdoZW4gc2hpZnQgcHJlc3NlZFxuXG5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyMykge1xuICAgICAgICBsZXQge1xuICAgICAgICAgIHpvb20sXG4gICAgICAgICAgc2Nyb2xsWFxuICAgICAgICB9ID0gX3JlZjIzO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC8vIG9uIE1hYywgc2hpZnQrd2hlZWwgdGVuZHMgdG8gcmVzdWx0IGluIGRlbHRhWFxuICAgICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSAoZGVsdGFZIHx8IGRlbHRhWCkgLyB6b29tLnZhbHVlXG4gICAgICAgIH07XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF90aGlzMTMuc2V0U3RhdGUoZnVuY3Rpb24gKF9yZWYyNCkge1xuICAgICAgbGV0IHtcbiAgICAgICAgem9vbSxcbiAgICAgICAgc2Nyb2xsWCxcbiAgICAgICAgc2Nyb2xsWVxuICAgICAgfSA9IF9yZWYyNDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNjcm9sbFg6IHNjcm9sbFggLSBkZWx0YVggLyB6b29tLnZhbHVlLFxuICAgICAgICBzY3JvbGxZOiBzY3JvbGxZIC0gZGVsdGFZIC8gem9vbS52YWx1ZVxuICAgICAgfTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5zYXZlUG9pbnRlciA9IGZ1bmN0aW9uICh4LCB5LCBidXR0b24pIHtcbiAgICBpZiAoIXggfHwgIXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwb2ludGVyID0gdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzKHtcbiAgICAgIGNsaWVudFg6IHgsXG4gICAgICBjbGllbnRZOiB5XG4gICAgfSwgX3RoaXMxMy5zdGF0ZSk7XG5cbiAgICBpZiAoaXNOYU4ocG9pbnRlci54KSB8fCBpc05hTihwb2ludGVyLnkpKSB7Ly8gc29tZXRpbWVzIHRoZSBwb2ludGVyIGdvZXMgb2ZmIHNjcmVlblxuICAgIH1cblxuICAgIF90aGlzMTMucHJvcHMub25Qb2ludGVyVXBkYXRlPy4oe1xuICAgICAgcG9pbnRlcixcbiAgICAgIGJ1dHRvbixcbiAgICAgIHBvaW50ZXJzTWFwOiBnZXN0dXJlLnBvaW50ZXJzXG4gICAgfSk7XG4gIH07XG5cbiAgdGhpcy5yZXNldFNob3VsZENhY2hlSWdub3JlWm9vbURlYm91bmNlZCA9IGRlYm91bmNlKGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIV90aGlzMTMudW5tb3VudGVkKSB7XG4gICAgICBfdGhpczEzLnNldFN0YXRlKHtcbiAgICAgICAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9LCAzMDApO1xuXG4gIHRoaXMudXBkYXRlRE9NUmVjdCA9IGZ1bmN0aW9uIChjYikge1xuICAgIGlmIChfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWY/LmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGV4Y2FsaWRyYXdDb250YWluZXIgPSBfdGhpczEzLmV4Y2FsaWRyYXdDb250YWluZXJSZWYuY3VycmVudDtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgd2lkdGgsXG4gICAgICAgIGhlaWdodCxcbiAgICAgICAgbGVmdDogb2Zmc2V0TGVmdCxcbiAgICAgICAgdG9wOiBvZmZzZXRUb3BcbiAgICAgIH0gPSBleGNhbGlkcmF3Q29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB3aWR0aDogY3VycmVudFdpZHRoLFxuICAgICAgICBoZWlnaHQ6IGN1cnJlbnRIZWlnaHQsXG4gICAgICAgIG9mZnNldFRvcDogY3VycmVudE9mZnNldFRvcCxcbiAgICAgICAgb2Zmc2V0TGVmdDogY3VycmVudE9mZnNldExlZnRcbiAgICAgIH0gPSBfdGhpczEzLnN0YXRlO1xuXG4gICAgICBpZiAod2lkdGggPT09IGN1cnJlbnRXaWR0aCAmJiBoZWlnaHQgPT09IGN1cnJlbnRIZWlnaHQgJiYgb2Zmc2V0TGVmdCA9PT0gY3VycmVudE9mZnNldExlZnQgJiYgb2Zmc2V0VG9wID09PSBjdXJyZW50T2Zmc2V0VG9wKSB7XG4gICAgICAgIGlmIChjYikge1xuICAgICAgICAgIGNiKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIF90aGlzMTMuc2V0U3RhdGUoe1xuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICBvZmZzZXRMZWZ0LFxuICAgICAgICBvZmZzZXRUb3BcbiAgICAgIH0sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgY2IgJiYgY2IoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICB0aGlzLnJlZnJlc2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgX3RoaXMxMy5zZXRTdGF0ZShfb2JqZWN0U3ByZWFkKHt9LCBfdGhpczEzLmdldENhbnZhc09mZnNldHMoKSkpO1xuICB9O1xufTtcblxuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBFTlYuVEVTVCB8fCBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gRU5WLkRFVkVMT1BNRU5UKSB7XG4gIHdpbmRvdy5oID0gd2luZG93LmggfHwge307XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHdpbmRvdy5oLCB7XG4gICAgZWxlbWVudHM6IHtcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblxuICAgICAgZ2V0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5hcHAuc2NlbmUuZ2V0RWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKCk7XG4gICAgICB9LFxuXG4gICAgICBzZXQoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYXBwLnNjZW5lLnJlcGxhY2VBbGxFbGVtZW50cyhlbGVtZW50cyk7XG4gICAgICB9XG5cbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBcHA7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../components/App.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/App.tsx?");
1889
1889
 
1890
1890
  /***/ }),
1891
1891
 
@@ -1995,7 +1995,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
1995
1995
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
1996
1996
 
1997
1997
  "use strict";
1998
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Popover */ \\\"../../components/Popover.tsx\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _ContextMenu_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ContextMenu.scss */ \\\"../../components/ContextMenu.scss\\\");\\n/* harmony import */ var _ContextMenu_scss__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_ContextMenu_scss__WEBPACK_IMPORTED_MODULE_4__);\\n/* harmony import */ var _actions_shortcuts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/shortcuts */ \\\"../../actions/shortcuts.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst ContextMenu = function (_ref) {\\r\\n let { options, onCloseRequest, top, left, actionManager, appState } = _ref;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_Popover__WEBPACK_IMPORTED_MODULE_2__.Popover, {\\r\\n onCloseRequest: onCloseRequest,\\r\\n top: top,\\r\\n left: left,\\r\\n fitInViewport: true,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"ul\\\", {\\r\\n className: \\\"context-menu\\\",\\r\\n onContextMenu: function (event) {\\r\\n return event.preventDefault();\\r\\n },\\r\\n children: options.map(function (option, idx) {\\r\\n var _a;\\r\\n if (option === \\\"separator\\\") {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"hr\\\", {\\r\\n className: \\\"context-menu-option-separator\\\"\\r\\n }, idx);\\r\\n }\\r\\n const actionName = option.name;\\r\\n const label = option.contextItemLabel ? (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(option.contextItemLabel) : \\\"\\\";\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"li\\\", {\\r\\n \\\"data-testid\\\": actionName,\\r\\n onClick: onCloseRequest,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\\\"button\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(\\\"context-menu-option\\\", {\\r\\n dangerous: actionName === \\\"deleteSelectedElements\\\",\\r\\n checkmark: (_a = option.checked) === null || _a === void 0 ? void 0 : _a.call(option, appState)\\r\\n }),\\r\\n onClick: function () {\\r\\n return actionManager.executeAction(option);\\r\\n },\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"div\\\", {\\r\\n className: \\\"context-menu-option__label\\\",\\r\\n children: label\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"kbd\\\", {\\r\\n className: \\\"context-menu-option__shortcut\\\",\\r\\n children: actionName ? (0,_actions_shortcuts__WEBPACK_IMPORTED_MODULE_5__.getShortcutFromShortcutName)(actionName) : \\\"\\\"\\r\\n })]\\r\\n })\\r\\n }, idx);\\r\\n })\\r\\n })\\r\\n });\\r\\n};\\r\\nconst contextMenuNodeByContainer = new WeakMap();\\r\\nconst getContextMenuNode = function (container) {\\r\\n let contextMenuNode = contextMenuNodeByContainer.get(container);\\r\\n if (contextMenuNode) {\\r\\n return contextMenuNode;\\r\\n }\\r\\n contextMenuNode = document.createElement(\\\"div\\\");\\r\\n container.querySelector(\\\".excalidraw-contextMenuContainer\\\").appendChild(contextMenuNode);\\r\\n contextMenuNodeByContainer.set(container, contextMenuNode);\\r\\n return contextMenuNode;\\r\\n};\\r\\nconst handleClose = function (container) {\\r\\n const contextMenuNode = contextMenuNodeByContainer.get(container);\\r\\n if (contextMenuNode) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_0__.unmountComponentAtNode)(contextMenuNode);\\r\\n contextMenuNode.remove();\\r\\n contextMenuNodeByContainer.delete(container);\\r\\n }\\r\\n};\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\\r\\n push(params) {\\r\\n const options = Array.of();\\r\\n params.options.forEach(function (option) {\\r\\n if (option) {\\r\\n options.push(option);\\r\\n }\\r\\n });\\r\\n if (options.length) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_0__.render)(/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ContextMenu, {\\r\\n top: params.top,\\r\\n left: params.left,\\r\\n options: options,\\r\\n onCloseRequest: function () {\\r\\n return handleClose(params.container);\\r\\n },\\r\\n actionManager: params.actionManager,\\r\\n appState: params.appState\\r\\n }), getContextMenuNode(params.container));\\r\\n }\\r\\n }\\r\\n});\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QyxTQUFTLENBQUMsQ0FBQyxDQUFDO1NBQzNDO0lBQ0gsQ0FBQztDQUVGLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9Db250ZXh0TWVudS50c3g/ODEyNCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZW5kZXIsIHVubW91bnRDb21wb25lbnRBdE5vZGUgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgY2xzeCBmcm9tIFwiY2xzeFwiO1xuaW1wb3J0IHsgUG9wb3ZlciB9IGZyb20gXCIuL1BvcG92ZXJcIjtcbmltcG9ydCB7IHQgfSBmcm9tIFwiLi4vaTE4blwiO1xuaW1wb3J0IFwiLi9Db250ZXh0TWVudS5zY3NzXCI7XG5pbXBvcnQgeyBnZXRTaG9ydGN1dEZyb21TaG9ydGN1dE5hbWUgfSBmcm9tIFwiLi4vYWN0aW9ucy9zaG9ydGN1dHNcIjtcbmltcG9ydCB7IGpzeCBhcyBfanN4IH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5pbXBvcnQgeyBqc3hzIGFzIF9qc3hzIH0gZnJvbSBcInJlYWN0L2pzeC1ydW50aW1lXCI7XG5cbmNvbnN0IENvbnRleHRNZW51ID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBvcHRpb25zLFxuICAgIG9uQ2xvc2VSZXF1ZXN0LFxuICAgIHRvcCxcbiAgICBsZWZ0LFxuICAgIGFjdGlvbk1hbmFnZXIsXG4gICAgYXBwU3RhdGVcbiAgfSA9IF9yZWY7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChQb3BvdmVyLCB7XG4gICAgb25DbG9zZVJlcXVlc3Q6IG9uQ2xvc2VSZXF1ZXN0LFxuICAgIHRvcDogdG9wLFxuICAgIGxlZnQ6IGxlZnQsXG4gICAgZml0SW5WaWV3cG9ydDogdHJ1ZSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goXCJ1bFwiLCB7XG4gICAgICBjbGFzc05hbWU6IFwiY29udGV4dC1tZW51XCIsXG4gICAgICBvbkNvbnRleHRNZW51OiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9LFxuICAgICAgY2hpbGRyZW46IG9wdGlvbnMubWFwKGZ1bmN0aW9uIChvcHRpb24sIGlkeCkge1xuICAgICAgICBpZiAob3B0aW9uID09PSBcInNlcGFyYXRvclwiKSB7XG4gICAgICAgICAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiaHJcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRleHQtbWVudS1vcHRpb24tc2VwYXJhdG9yXCJcbiAgICAgICAgICB9LCBpZHgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYWN0aW9uTmFtZSA9IG9wdGlvbi5uYW1lO1xuICAgICAgICBjb25zdCBsYWJlbCA9IG9wdGlvbi5jb250ZXh0SXRlbUxhYmVsID8gdChvcHRpb24uY29udGV4dEl0ZW1MYWJlbCkgOiBcIlwiO1xuICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJsaVwiLCB7XG4gICAgICAgICAgXCJkYXRhLXRlc3RpZFwiOiBhY3Rpb25OYW1lLFxuICAgICAgICAgIG9uQ2xpY2s6IG9uQ2xvc2VSZXF1ZXN0LFxuICAgICAgICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeHMoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBjbHN4KFwiY29udGV4dC1tZW51LW9wdGlvblwiLCB7XG4gICAgICAgICAgICAgIGRhbmdlcm91czogYWN0aW9uTmFtZSA9PT0gXCJkZWxldGVTZWxlY3RlZEVsZW1lbnRzXCIsXG4gICAgICAgICAgICAgIGNoZWNrbWFyazogb3B0aW9uLmNoZWNrZWQ/LihhcHBTdGF0ZSlcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICByZXR1cm4gYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKG9wdGlvbik7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hpbGRyZW46IFsvKiNfX1BVUkVfXyovX2pzeChcImRpdlwiLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJjb250ZXh0LW1lbnUtb3B0aW9uX19sYWJlbFwiLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogbGFiZWxcbiAgICAgICAgICAgIH0pLCAvKiNfX1BVUkVfXyovX2pzeChcImtiZFwiLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJjb250ZXh0LW1lbnUtb3B0aW9uX19zaG9ydGN1dFwiLFxuICAgICAgICAgICAgICBjaGlsZHJlbjogYWN0aW9uTmFtZSA/IGdldFNob3J0Y3V0RnJvbVNob3J0Y3V0TmFtZShhY3Rpb25OYW1lKSA6IFwiXCJcbiAgICAgICAgICAgIH0pXVxuICAgICAgICAgIH0pXG4gICAgICAgIH0sIGlkeCk7XG4gICAgICB9KVxuICAgIH0pXG4gIH0pO1xufTtcblxuY29uc3QgY29udGV4dE1lbnVOb2RlQnlDb250YWluZXIgPSBuZXcgV2Vha01hcCgpO1xuXG5jb25zdCBnZXRDb250ZXh0TWVudU5vZGUgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gIGxldCBjb250ZXh0TWVudU5vZGUgPSBjb250ZXh0TWVudU5vZGVCeUNvbnRhaW5lci5nZXQoY29udGFpbmVyKTtcblxuICBpZiAoY29udGV4dE1lbnVOb2RlKSB7XG4gICAgcmV0dXJuIGNvbnRleHRNZW51Tm9kZTtcbiAgfVxuXG4gIGNvbnRleHRNZW51Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctY29udGV4dE1lbnVDb250YWluZXJcIikuYXBwZW5kQ2hpbGQoY29udGV4dE1lbnVOb2RlKTtcbiAgY29udGV4dE1lbnVOb2RlQnlDb250YWluZXIuc2V0KGNvbnRhaW5lciwgY29udGV4dE1lbnVOb2RlKTtcbiAgcmV0dXJuIGNvbnRleHRNZW51Tm9kZTtcbn07XG5cbmNvbnN0IGhhbmRsZUNsb3NlID0gZnVuY3Rpb24gKGNvbnRhaW5lcikge1xuICBjb25zdCBjb250ZXh0TWVudU5vZGUgPSBjb250ZXh0TWVudU5vZGVCeUNvbnRhaW5lci5nZXQoY29udGFpbmVyKTtcblxuICBpZiAoY29udGV4dE1lbnVOb2RlKSB7XG4gICAgdW5tb3VudENvbXBvbmVudEF0Tm9kZShjb250ZXh0TWVudU5vZGUpO1xuICAgIGNvbnRleHRNZW51Tm9kZS5yZW1vdmUoKTtcbiAgICBjb250ZXh0TWVudU5vZGVCeUNvbnRhaW5lci5kZWxldGUoY29udGFpbmVyKTtcbiAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBwdXNoKHBhcmFtcykge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBBcnJheS5vZigpO1xuICAgIHBhcmFtcy5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24gKG9wdGlvbikge1xuICAgICAgaWYgKG9wdGlvbikge1xuICAgICAgICBvcHRpb25zLnB1c2gob3B0aW9uKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmxlbmd0aCkge1xuICAgICAgcmVuZGVyKCAvKiNfX1BVUkVfXyovX2pzeChDb250ZXh0TWVudSwge1xuICAgICAgICB0b3A6IHBhcmFtcy50b3AsXG4gICAgICAgIGxlZnQ6IHBhcmFtcy5sZWZ0LFxuICAgICAgICBvcHRpb25zOiBvcHRpb25zLFxuICAgICAgICBvbkNsb3NlUmVxdWVzdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBoYW5kbGVDbG9zZShwYXJhbXMuY29udGFpbmVyKTtcbiAgICAgICAgfSxcbiAgICAgICAgYWN0aW9uTWFuYWdlcjogcGFyYW1zLmFjdGlvbk1hbmFnZXIsXG4gICAgICAgIGFwcFN0YXRlOiBwYXJhbXMuYXBwU3RhdGVcbiAgICAgIH0pLCBnZXRDb250ZXh0TWVudU5vZGUocGFyYW1zLmNvbnRhaW5lcikpO1xuICAgIH1cbiAgfVxuXG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../components/ContextMenu.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/ContextMenu.tsx?");
1998
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__)\\n/* harmony export */ });\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var clsx__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! clsx */ \\\"../../../node_modules/clsx/dist/clsx.m.js\\\");\\n/* harmony import */ var _Popover__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Popover */ \\\"../../components/Popover.tsx\\\");\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _ContextMenu_scss__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./ContextMenu.scss */ \\\"../../components/ContextMenu.scss\\\");\\n/* harmony import */ var _ContextMenu_scss__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_ContextMenu_scss__WEBPACK_IMPORTED_MODULE_4__);\\n/* harmony import */ var _actions_shortcuts__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../actions/shortcuts */ \\\"../../actions/shortcuts.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst ContextMenu = function (_ref) {\\r\\n let { options, onCloseRequest, top, left, actionManager, appState } = _ref;\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(_Popover__WEBPACK_IMPORTED_MODULE_2__.Popover, {\\r\\n onCloseRequest: onCloseRequest,\\r\\n top: top,\\r\\n left: left,\\r\\n fitInViewport: true,\\r\\n offsetLeft: appState.offsetLeft,\\r\\n offsetTop: appState.offsetTop,\\r\\n viewportWidth: appState.width,\\r\\n viewportHeight: appState.height,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"ul\\\", {\\r\\n className: \\\"context-menu\\\",\\r\\n onContextMenu: function (event) {\\r\\n return event.preventDefault();\\r\\n },\\r\\n children: options.map(function (option, idx) {\\r\\n var _a;\\r\\n if (option === \\\"separator\\\") {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"hr\\\", {\\r\\n className: \\\"context-menu-option-separator\\\"\\r\\n }, idx);\\r\\n }\\r\\n const actionName = option.name;\\r\\n const label = option.contextItemLabel ? (0,_i18n__WEBPACK_IMPORTED_MODULE_3__.t)(option.contextItemLabel) : \\\"\\\";\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"li\\\", {\\r\\n \\\"data-testid\\\": actionName,\\r\\n onClick: onCloseRequest,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsxs)(\\\"button\\\", {\\r\\n className: (0,clsx__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(\\\"context-menu-option\\\", {\\r\\n dangerous: actionName === \\\"deleteSelectedElements\\\",\\r\\n checkmark: (_a = option.checked) === null || _a === void 0 ? void 0 : _a.call(option, appState)\\r\\n }),\\r\\n onClick: function () {\\r\\n return actionManager.executeAction(option);\\r\\n },\\r\\n children: [/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"div\\\", {\\r\\n className: \\\"context-menu-option__label\\\",\\r\\n children: label\\r\\n }), /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(\\\"kbd\\\", {\\r\\n className: \\\"context-menu-option__shortcut\\\",\\r\\n children: actionName ? (0,_actions_shortcuts__WEBPACK_IMPORTED_MODULE_5__.getShortcutFromShortcutName)(actionName) : \\\"\\\"\\r\\n })]\\r\\n })\\r\\n }, idx);\\r\\n })\\r\\n })\\r\\n });\\r\\n};\\r\\nconst contextMenuNodeByContainer = new WeakMap();\\r\\nconst getContextMenuNode = function (container) {\\r\\n let contextMenuNode = contextMenuNodeByContainer.get(container);\\r\\n if (contextMenuNode) {\\r\\n return contextMenuNode;\\r\\n }\\r\\n contextMenuNode = document.createElement(\\\"div\\\");\\r\\n container.querySelector(\\\".excalidraw-contextMenuContainer\\\").appendChild(contextMenuNode);\\r\\n contextMenuNodeByContainer.set(container, contextMenuNode);\\r\\n return contextMenuNode;\\r\\n};\\r\\nconst handleClose = function (container) {\\r\\n const contextMenuNode = contextMenuNodeByContainer.get(container);\\r\\n if (contextMenuNode) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_0__.unmountComponentAtNode)(contextMenuNode);\\r\\n contextMenuNode.remove();\\r\\n contextMenuNodeByContainer.delete(container);\\r\\n }\\r\\n};\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ({\\r\\n push(params) {\\r\\n const options = Array.of();\\r\\n params.options.forEach(function (option) {\\r\\n if (option) {\\r\\n options.push(option);\\r\\n }\\r\\n });\\r\\n if (options.length) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_0__.render)(/*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_6__.jsx)(ContextMenu, {\\r\\n top: params.top,\\r\\n left: params.left,\\r\\n options: options,\\r\\n onCloseRequest: function () {\\r\\n return handleClose(params.container);\\r\\n },\\r\\n actionManager: params.actionManager,\\r\\n appState: params.appState\\r\\n }), getContextMenuNode(params.container));\\r\\n }\\r\\n }\\r\\n});\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2dCQUNELGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtnQkFDbkMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2FBQzFCLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7Q0FFRixFQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvQ29udGV4dE1lbnUudHN4PzgxMjQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVuZGVyLCB1bm1vdW50Q29tcG9uZW50QXROb2RlIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IGNsc3ggZnJvbSBcImNsc3hcIjtcbmltcG9ydCB7IFBvcG92ZXIgfSBmcm9tIFwiLi9Qb3BvdmVyXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCBcIi4vQ29udGV4dE1lbnUuc2Nzc1wiO1xuaW1wb3J0IHsgZ2V0U2hvcnRjdXRGcm9tU2hvcnRjdXROYW1lIH0gZnJvbSBcIi4uL2FjdGlvbnMvc2hvcnRjdXRzXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuaW1wb3J0IHsganN4cyBhcyBfanN4cyB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBDb250ZXh0TWVudSA9IGZ1bmN0aW9uIChfcmVmKSB7XG4gIGxldCB7XG4gICAgb3B0aW9ucyxcbiAgICBvbkNsb3NlUmVxdWVzdCxcbiAgICB0b3AsXG4gICAgbGVmdCxcbiAgICBhY3Rpb25NYW5hZ2VyLFxuICAgIGFwcFN0YXRlXG4gIH0gPSBfcmVmO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goUG9wb3Zlciwge1xuICAgIG9uQ2xvc2VSZXF1ZXN0OiBvbkNsb3NlUmVxdWVzdCxcbiAgICB0b3A6IHRvcCxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIGZpdEluVmlld3BvcnQ6IHRydWUsXG4gICAgb2Zmc2V0TGVmdDogYXBwU3RhdGUub2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRUb3A6IGFwcFN0YXRlLm9mZnNldFRvcCxcbiAgICB2aWV3cG9ydFdpZHRoOiBhcHBTdGF0ZS53aWR0aCxcbiAgICB2aWV3cG9ydEhlaWdodDogYXBwU3RhdGUuaGVpZ2h0LFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChcInVsXCIsIHtcbiAgICAgIGNsYXNzTmFtZTogXCJjb250ZXh0LW1lbnVcIixcbiAgICAgIG9uQ29udGV4dE1lbnU6IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICByZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0sXG4gICAgICBjaGlsZHJlbjogb3B0aW9ucy5tYXAoZnVuY3Rpb24gKG9wdGlvbiwgaWR4KSB7XG4gICAgICAgIGlmIChvcHRpb24gPT09IFwic2VwYXJhdG9yXCIpIHtcbiAgICAgICAgICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJoclwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IFwiY29udGV4dC1tZW51LW9wdGlvbi1zZXBhcmF0b3JcIlxuICAgICAgICAgIH0sIGlkeCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhY3Rpb25OYW1lID0gb3B0aW9uLm5hbWU7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gb3B0aW9uLmNvbnRleHRJdGVtTGFiZWwgPyB0KG9wdGlvbi5jb250ZXh0SXRlbUxhYmVsKSA6IFwiXCI7XG4gICAgICAgIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChcImxpXCIsIHtcbiAgICAgICAgICBcImRhdGEtdGVzdGlkXCI6IGFjdGlvbk5hbWUsXG4gICAgICAgICAgb25DbGljazogb25DbG9zZVJlcXVlc3QsXG4gICAgICAgICAgY2hpbGRyZW46IC8qI19fUFVSRV9fKi9fanN4cyhcImJ1dHRvblwiLCB7XG4gICAgICAgICAgICBjbGFzc05hbWU6IGNsc3goXCJjb250ZXh0LW1lbnUtb3B0aW9uXCIsIHtcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzOiBhY3Rpb25OYW1lID09PSBcImRlbGV0ZVNlbGVjdGVkRWxlbWVudHNcIixcbiAgICAgICAgICAgICAgY2hlY2ttYXJrOiBvcHRpb24uY2hlY2tlZD8uKGFwcFN0YXRlKVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBvbkNsaWNrOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBhY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24ob3B0aW9uKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjaGlsZHJlbjogWy8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRleHQtbWVudS1vcHRpb25fX2xhYmVsXCIsXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBsYWJlbFxuICAgICAgICAgICAgfSksIC8qI19fUFVSRV9fKi9fanN4KFwia2JkXCIsIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcImNvbnRleHQtbWVudS1vcHRpb25fX3Nob3J0Y3V0XCIsXG4gICAgICAgICAgICAgIGNoaWxkcmVuOiBhY3Rpb25OYW1lID8gZ2V0U2hvcnRjdXRGcm9tU2hvcnRjdXROYW1lKGFjdGlvbk5hbWUpIDogXCJcIlxuICAgICAgICAgICAgfSldXG4gICAgICAgICAgfSlcbiAgICAgICAgfSwgaWR4KTtcbiAgICAgIH0pXG4gICAgfSlcbiAgfSk7XG59O1xuXG5jb25zdCBjb250ZXh0TWVudU5vZGVCeUNvbnRhaW5lciA9IG5ldyBXZWFrTWFwKCk7XG5cbmNvbnN0IGdldENvbnRleHRNZW51Tm9kZSA9IGZ1bmN0aW9uIChjb250YWluZXIpIHtcbiAgbGV0IGNvbnRleHRNZW51Tm9kZSA9IGNvbnRleHRNZW51Tm9kZUJ5Q29udGFpbmVyLmdldChjb250YWluZXIpO1xuXG4gIGlmIChjb250ZXh0TWVudU5vZGUpIHtcbiAgICByZXR1cm4gY29udGV4dE1lbnVOb2RlO1xuICB9XG5cbiAgY29udGV4dE1lbnVOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoXCIuZXhjYWxpZHJhdy1jb250ZXh0TWVudUNvbnRhaW5lclwiKS5hcHBlbmRDaGlsZChjb250ZXh0TWVudU5vZGUpO1xuICBjb250ZXh0TWVudU5vZGVCeUNvbnRhaW5lci5zZXQoY29udGFpbmVyLCBjb250ZXh0TWVudU5vZGUpO1xuICByZXR1cm4gY29udGV4dE1lbnVOb2RlO1xufTtcblxuY29uc3QgaGFuZGxlQ2xvc2UgPSBmdW5jdGlvbiAoY29udGFpbmVyKSB7XG4gIGNvbnN0IGNvbnRleHRNZW51Tm9kZSA9IGNvbnRleHRNZW51Tm9kZUJ5Q29udGFpbmVyLmdldChjb250YWluZXIpO1xuXG4gIGlmIChjb250ZXh0TWVudU5vZGUpIHtcbiAgICB1bm1vdW50Q29tcG9uZW50QXROb2RlKGNvbnRleHRNZW51Tm9kZSk7XG4gICAgY29udGV4dE1lbnVOb2RlLnJlbW92ZSgpO1xuICAgIGNvbnRleHRNZW51Tm9kZUJ5Q29udGFpbmVyLmRlbGV0ZShjb250YWluZXIpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHB1c2gocGFyYW1zKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IEFycmF5Lm9mKCk7XG4gICAgcGFyYW1zLm9wdGlvbnMuZm9yRWFjaChmdW5jdGlvbiAob3B0aW9uKSB7XG4gICAgICBpZiAob3B0aW9uKSB7XG4gICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG9wdGlvbnMubGVuZ3RoKSB7XG4gICAgICByZW5kZXIoIC8qI19fUFVSRV9fKi9fanN4KENvbnRleHRNZW51LCB7XG4gICAgICAgIHRvcDogcGFyYW1zLnRvcCxcbiAgICAgICAgbGVmdDogcGFyYW1zLmxlZnQsXG4gICAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgICAgIG9uQ2xvc2VSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgcmV0dXJuIGhhbmRsZUNsb3NlKHBhcmFtcy5jb250YWluZXIpO1xuICAgICAgICB9LFxuICAgICAgICBhY3Rpb25NYW5hZ2VyOiBwYXJhbXMuYWN0aW9uTWFuYWdlcixcbiAgICAgICAgYXBwU3RhdGU6IHBhcmFtcy5hcHBTdGF0ZVxuICAgICAgfSksIGdldENvbnRleHRNZW51Tm9kZShwYXJhbXMuY29udGFpbmVyKSk7XG4gICAgfVxuICB9XG5cbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../components/ContextMenu.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/ContextMenu.tsx?");
1999
1999
 
2000
2000
  /***/ }),
2001
2001
 
@@ -2248,7 +2248,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
2248
2248
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2249
2249
 
2250
2250
  "use strict";
2251
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Popover\\\": () => (/* binding */ Popover)\\n/* harmony export */ });\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Popover.scss */ \\\"../../components/Popover.scss\\\");\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_Popover_scss__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Popover = function (_ref) {\\r\\n let { children, left, top, onCloseRequest, fitInViewport = false } = _ref;\\r\\n const popoverRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); // ensure the popover doesn't overflow the viewport\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(function () {\\r\\n if (fitInViewport && popoverRef.current) {\\r\\n const element = popoverRef.current;\\r\\n const { x, y, width, height } = element.getBoundingClientRect();\\r\\n const viewportWidth = window.innerWidth;\\r\\n if (x + width > viewportWidth) {\\r\\n element.style.left = `${viewportWidth - width}px`;\\r\\n }\\r\\n const viewportHeight = window.innerHeight;\\r\\n if (y + height > viewportHeight) {\\r\\n element.style.top = `${viewportHeight - height}px`;\\r\\n }\\r\\n }\\r\\n }, [fitInViewport]);\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\\r\\n if (onCloseRequest) {\\r\\n const handler = function (event) {\\r\\n var _a;\\r\\n if (!((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates)(function () {\\r\\n return onCloseRequest(event);\\r\\n });\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"pointerdown\\\", handler, false);\\r\\n return function () {\\r\\n return document.removeEventListener(\\\"pointerdown\\\", handler, false);\\r\\n };\\r\\n }\\r\\n }, [onCloseRequest]);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\\\"div\\\", {\\r\\n className: \\\"popover\\\",\\r\\n style: {\\r\\n top,\\r\\n left\\r\\n },\\r\\n ref: popoverRef,\\r\\n children: children\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vY29tcG9uZW50cy9Qb3BvdmVyLnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFrRTtBQUMxQztBQUM0QjtBQUNKO0FBQ3pDLE1BQU0sT0FBTyxHQUFHLFVBQVUsSUFBSTtJQUNuQyxJQUFJLEVBQ0YsUUFBUSxFQUNSLElBQUksRUFDSixHQUFHLEVBQ0gsY0FBYyxFQUNkLGFBQWEsR0FBRyxLQUFLLEVBQ3RCLEdBQUcsSUFBSSxDQUFDO0lBQ1QsTUFBTSxVQUFVLEdBQUcsNkNBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1EQUFtRDtJQUVwRixzREFBZSxDQUFDO1FBQ2QsSUFBSSxhQUFhLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ25DLE1BQU0sRUFDSixDQUFDLEVBQ0QsQ0FBQyxFQUNELEtBQUssRUFDTCxNQUFNLEVBQ1AsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUNwQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO1lBRXhDLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRyxhQUFhLEVBQUU7Z0JBQzdCLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEdBQUcsYUFBYSxHQUFHLEtBQUssSUFBSSxDQUFDO2FBQ25EO1lBRUQsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQztZQUUxQyxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsY0FBYyxFQUFFO2dCQUMvQixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxHQUFHLGNBQWMsR0FBRyxNQUFNLElBQUksQ0FBQzthQUNwRDtTQUNGO0lBQ0gsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNwQixnREFBUyxDQUFDO1FBQ1IsSUFBSSxjQUFjLEVBQUU7WUFDbEIsTUFBTSxPQUFPLEdBQUcsVUFBVSxLQUFLOztnQkFDN0IsSUFBSSxDQUFDLGlCQUFVLENBQUMsT0FBTywwQ0FBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFFO29CQUMvQyxrRUFBdUIsQ0FBQzt3QkFDdEIsT0FBTyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQy9CLENBQUMsQ0FBQyxDQUFDO2lCQUNKO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDekQsT0FBTztnQkFDTCxPQUFPLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JFLENBQUMsQ0FBQztTQUNIO0lBQ0gsQ0FBQyxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUNyQixPQUFPLGFBQWEsdURBQUksQ0FBQyxLQUFLLEVBQUU7UUFDOUIsU0FBUyxFQUFFLFNBQVM7UUFDcEIsS0FBSyxFQUFFO1lBQ0wsR0FBRztZQUNILElBQUk7U0FDTDtRQUNELEdBQUcsRUFBRSxVQUFVO1FBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbkIsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2NvbXBvbmVudHMvUG9wb3Zlci50c3g/NmU5NSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgdXNlTGF5b3V0RWZmZWN0LCB1c2VSZWYsIHVzZUVmZmVjdCB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFwiLi9Qb3BvdmVyLnNjc3NcIjtcbmltcG9ydCB7IHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIH0gZnJvbSBcInJlYWN0LWRvbVwiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcbmV4cG9ydCBjb25zdCBQb3BvdmVyID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBjaGlsZHJlbixcbiAgICBsZWZ0LFxuICAgIHRvcCxcbiAgICBvbkNsb3NlUmVxdWVzdCxcbiAgICBmaXRJblZpZXdwb3J0ID0gZmFsc2VcbiAgfSA9IF9yZWY7XG4gIGNvbnN0IHBvcG92ZXJSZWYgPSB1c2VSZWYobnVsbCk7IC8vIGVuc3VyZSB0aGUgcG9wb3ZlciBkb2Vzbid0IG92ZXJmbG93IHRoZSB2aWV3cG9ydFxuXG4gIHVzZUxheW91dEVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGZpdEluVmlld3BvcnQgJiYgcG9wb3ZlclJlZi5jdXJyZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gcG9wb3ZlclJlZi5jdXJyZW50O1xuICAgICAgY29uc3Qge1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0XG4gICAgICB9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aDtcblxuICAgICAgaWYgKHggKyB3aWR0aCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7dmlld3BvcnRXaWR0aCAtIHdpZHRofXB4YDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgdmlld3BvcnRIZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgIGlmICh5ICsgaGVpZ2h0ID4gdmlld3BvcnRIZWlnaHQpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS50b3AgPSBgJHt2aWV3cG9ydEhlaWdodCAtIGhlaWdodH1weGA7XG4gICAgICB9XG4gICAgfVxuICB9LCBbZml0SW5WaWV3cG9ydF0pO1xuICB1c2VFZmZlY3QoZnVuY3Rpb24gKCkge1xuICAgIGlmIChvbkNsb3NlUmVxdWVzdCkge1xuICAgICAgY29uc3QgaGFuZGxlciA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBpZiAoIXBvcG92ZXJSZWYuY3VycmVudD8uY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiBvbkNsb3NlUmVxdWVzdChldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBoYW5kbGVyLCBmYWxzZSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIH07XG4gICAgfVxuICB9LCBbb25DbG9zZVJlcXVlc3RdKTtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KFwiZGl2XCIsIHtcbiAgICBjbGFzc05hbWU6IFwicG9wb3ZlclwiLFxuICAgIHN0eWxlOiB7XG4gICAgICB0b3AsXG4gICAgICBsZWZ0XG4gICAgfSxcbiAgICByZWY6IHBvcG92ZXJSZWYsXG4gICAgY2hpbGRyZW46IGNoaWxkcmVuXG4gIH0pO1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../components/Popover.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/Popover.tsx?");
2251
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"Popover\\\": () => (/* binding */ Popover)\\n/* harmony export */ });\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./Popover.scss */ \\\"../../components/Popover.scss\\\");\\n/* harmony import */ var _Popover_scss__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_Popover_scss__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react-dom */ \\\"react-dom\\\");\\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Popover = function (_ref) {\\r\\n let { children, left, top, onCloseRequest, fitInViewport = false, offsetLeft = 0, offsetTop = 0, viewportWidth = window.innerWidth, viewportHeight = window.innerHeight } = _ref;\\r\\n const popoverRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); // ensure the popover doesn't overflow the viewport\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useLayoutEffect)(function () {\\r\\n if (fitInViewport && popoverRef.current) {\\r\\n const element = popoverRef.current;\\r\\n const { x, y, width, height } = element.getBoundingClientRect();\\r\\n if (x + width - offsetLeft > viewportWidth) {\\r\\n element.style.left = `${viewportWidth - width}px`;\\r\\n }\\r\\n if (y + height - offsetTop > viewportHeight) {\\r\\n element.style.top = `${viewportHeight - height}px`;\\r\\n }\\r\\n }\\r\\n }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {\\r\\n if (onCloseRequest) {\\r\\n const handler = function (event) {\\r\\n var _a;\\r\\n if (!((_a = popoverRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\\r\\n (0,react_dom__WEBPACK_IMPORTED_MODULE_2__.unstable_batchedUpdates)(function () {\\r\\n return onCloseRequest(event);\\r\\n });\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"pointerdown\\\", handler, false);\\r\\n return function () {\\r\\n return document.removeEventListener(\\\"pointerdown\\\", handler, false);\\r\\n };\\r\\n }\\r\\n }, [onCloseRequest]);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(\\\"div\\\", {\\r\\n className: \\\"popover\\\",\\r\\n style: {\\r\\n top,\\r\\n left\\r\\n },\\r\\n ref: popoverRef,\\r\\n children: children\\r\\n });\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vY29tcG9uZW50cy9Qb3BvdmVyLnRzeC5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFrRTtBQUMxQztBQUM0QjtBQUNKO0FBQ3pDLE1BQU0sT0FBTyxHQUFHLFVBQVUsSUFBSTtJQUNuQyxJQUFJLEVBQ0YsUUFBUSxFQUNSLElBQUksRUFDSixHQUFHLEVBQ0gsY0FBYyxFQUNkLGFBQWEsR0FBRyxLQUFLLEVBQ3JCLFVBQVUsR0FBRyxDQUFDLEVBQ2QsU0FBUyxHQUFHLENBQUMsRUFDYixhQUFhLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFDakMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxXQUFXLEVBQ3BDLEdBQUcsSUFBSSxDQUFDO0lBQ1QsTUFBTSxVQUFVLEdBQUcsNkNBQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLG1EQUFtRDtJQUVwRixzREFBZSxDQUFDO1FBQ2QsSUFBSSxhQUFhLElBQUksVUFBVSxDQUFDLE9BQU8sRUFBRTtZQUN2QyxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQ25DLE1BQU0sRUFDSixDQUFDLEVBQ0QsQ0FBQyxFQUNELEtBQUssRUFDTCxNQUFNLEVBQ1AsR0FBRyxPQUFPLENBQUMscUJBQXFCLEVBQUUsQ0FBQztZQUVwQyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsVUFBVSxHQUFHLGFBQWEsRUFBRTtnQkFDMUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsR0FBRyxhQUFhLEdBQUcsS0FBSyxJQUFJLENBQUM7YUFDbkQ7WUFFRCxJQUFJLENBQUMsR0FBRyxNQUFNLEdBQUcsU0FBUyxHQUFHLGNBQWMsRUFBRTtnQkFDM0MsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsR0FBRyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUM7YUFDcEQ7U0FDRjtJQUNILENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzFFLGdEQUFTLENBQUM7UUFDUixJQUFJLGNBQWMsRUFBRTtZQUNsQixNQUFNLE9BQU8sR0FBRyxVQUFVLEtBQUs7O2dCQUM3QixJQUFJLENBQUMsaUJBQVUsQ0FBQyxPQUFPLDBDQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUU7b0JBQy9DLGtFQUF1QixDQUFDO3dCQUN0QixPQUFPLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDL0IsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7WUFDSCxDQUFDLENBQUM7WUFFRixRQUFRLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN6RCxPQUFPO2dCQUNMLE9BQU8sUUFBUSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDO1NBQ0g7SUFDSCxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sYUFBYSx1REFBSSxDQUFDLEtBQUssRUFBRTtRQUM5QixTQUFTLEVBQUUsU0FBUztRQUNwQixLQUFLLEVBQUU7WUFDTCxHQUFHO1lBQ0gsSUFBSTtTQUNMO1FBQ0QsR0FBRyxFQUFFLFVBQVU7UUFDZixRQUFRLEVBQUUsUUFBUTtLQUNuQixDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vY29tcG9uZW50cy9Qb3BvdmVyLnRzeD82ZTk1Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZWFjdCwgeyB1c2VMYXlvdXRFZmZlY3QsIHVzZVJlZiwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgXCIuL1BvcG92ZXIuc2Nzc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuZXhwb3J0IGNvbnN0IFBvcG92ZXIgPSBmdW5jdGlvbiAoX3JlZikge1xuICBsZXQge1xuICAgIGNoaWxkcmVuLFxuICAgIGxlZnQsXG4gICAgdG9wLFxuICAgIG9uQ2xvc2VSZXF1ZXN0LFxuICAgIGZpdEluVmlld3BvcnQgPSBmYWxzZSxcbiAgICBvZmZzZXRMZWZ0ID0gMCxcbiAgICBvZmZzZXRUb3AgPSAwLFxuICAgIHZpZXdwb3J0V2lkdGggPSB3aW5kb3cuaW5uZXJXaWR0aCxcbiAgICB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodFxuICB9ID0gX3JlZjtcbiAgY29uc3QgcG9wb3ZlclJlZiA9IHVzZVJlZihudWxsKTsgLy8gZW5zdXJlIHRoZSBwb3BvdmVyIGRvZXNuJ3Qgb3ZlcmZsb3cgdGhlIHZpZXdwb3J0XG5cbiAgdXNlTGF5b3V0RWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoZml0SW5WaWV3cG9ydCAmJiBwb3BvdmVyUmVmLmN1cnJlbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBwb3BvdmVyUmVmLmN1cnJlbnQ7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICAgIHdpZHRoLFxuICAgICAgICBoZWlnaHRcbiAgICAgIH0gPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICBpZiAoeCArIHdpZHRoIC0gb2Zmc2V0TGVmdCA+IHZpZXdwb3J0V2lkdGgpIHtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5sZWZ0ID0gYCR7dmlld3BvcnRXaWR0aCAtIHdpZHRofXB4YDtcbiAgICAgIH1cblxuICAgICAgaWYgKHkgKyBoZWlnaHQgLSBvZmZzZXRUb3AgPiB2aWV3cG9ydEhlaWdodCkge1xuICAgICAgICBlbGVtZW50LnN0eWxlLnRvcCA9IGAke3ZpZXdwb3J0SGVpZ2h0IC0gaGVpZ2h0fXB4YDtcbiAgICAgIH1cbiAgICB9XG4gIH0sIFtmaXRJblZpZXdwb3J0LCB2aWV3cG9ydFdpZHRoLCB2aWV3cG9ydEhlaWdodCwgb2Zmc2V0TGVmdCwgb2Zmc2V0VG9wXSk7XG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgaWYgKG9uQ2xvc2VSZXF1ZXN0KSB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmICghcG9wb3ZlclJlZi5jdXJyZW50Py5jb250YWlucyhldmVudC50YXJnZXQpKSB7XG4gICAgICAgICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIG9uQ2xvc2VSZXF1ZXN0KGV2ZW50KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIGhhbmRsZXIsIGZhbHNlKTtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgaGFuZGxlciwgZmFsc2UpO1xuICAgICAgfTtcbiAgICB9XG4gIH0sIFtvbkNsb3NlUmVxdWVzdF0pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goXCJkaXZcIiwge1xuICAgIGNsYXNzTmFtZTogXCJwb3BvdmVyXCIsXG4gICAgc3R5bGU6IHtcbiAgICAgIHRvcCxcbiAgICAgIGxlZnRcbiAgICB9LFxuICAgIHJlZjogcG9wb3ZlclJlZixcbiAgICBjaGlsZHJlbjogY2hpbGRyZW5cbiAgfSk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../components/Popover.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../components/Popover.tsx?");
2252
2252
 
2253
2253
  /***/ }),
2254
2254
 
@@ -2611,7 +2611,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
2611
2611
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2612
2612
 
2613
2613
  "use strict";
2614
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"newElement\\\": () => (/* binding */ newElement),\\n/* harmony export */ \\\"newTextElement\\\": () => (/* binding */ newTextElement),\\n/* harmony export */ \\\"updateTextElement\\\": () => (/* binding */ updateTextElement),\\n/* harmony export */ \\\"newFreeDrawElement\\\": () => (/* binding */ newFreeDrawElement),\\n/* harmony export */ \\\"newLinearElement\\\": () => (/* binding */ newLinearElement),\\n/* harmony export */ \\\"newImageElement\\\": () => (/* binding */ newImageElement),\\n/* harmony export */ \\\"deepCopyElement\\\": () => (/* binding */ deepCopyElement),\\n/* harmony export */ \\\"duplicateElement\\\": () => (/* binding */ duplicateElement)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../random */ \\\"../../random.ts\\\");\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! . */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"x\\\", \\\"y\\\", \\\"strokeColor\\\", \\\"backgroundColor\\\", \\\"fillStyle\\\", \\\"strokeWidth\\\", \\\"strokeStyle\\\", \\\"roughness\\\", \\\"opacity\\\", \\\"width\\\", \\\"height\\\", \\\"angle\\\", \\\"groupIds\\\", \\\"strokeSharpness\\\", \\\"boundElements\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst _newElementBase = function (type, _ref) {\\r\\n var _a, _b;\\r\\n let { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], strokeSharpness, boundElements = null } = _ref, rest = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(_ref, _excluded);\\r\\n const element = {\\r\\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)(),\\r\\n type,\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height,\\r\\n angle,\\r\\n strokeColor,\\r\\n backgroundColor,\\r\\n fillStyle,\\r\\n strokeWidth,\\r\\n strokeStyle,\\r\\n roughness,\\r\\n opacity,\\r\\n groupIds,\\r\\n strokeSharpness,\\r\\n seed: (_a = rest.seed) !== null && _a !== void 0 ? _a : (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)(),\\r\\n version: rest.version || 1,\\r\\n versionNonce: (_b = rest.versionNonce) !== null && _b !== void 0 ? _b : 0,\\r\\n isDeleted: false,\\r\\n boundElements,\\r\\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getUpdatedTimestamp)()\\r\\n };\\r\\n return element;\\r\\n};\\r\\nconst newElement = function (opts) {\\r\\n return _newElementBase(opts.type, opts);\\r\\n};\\r\\n/** computes element x/y offset based on textAlign/verticalAlign */\\r\\nconst getTextElementPositionOffsets = function (opts, metrics) {\\r\\n return {\\r\\n x: opts.textAlign === \\\"center\\\" ? metrics.width / 2 : opts.textAlign === \\\"right\\\" ? metrics.width : 0,\\r\\n y: opts.verticalAlign === \\\"middle\\\" ? metrics.height / 2 : 0\\r\\n };\\r\\n};\\r\\nconst newTextElement = function (opts) {\\r\\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(opts.text, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(opts));\\r\\n const offsets = getTextElementPositionOffsets(opts, metrics);\\r\\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_4__.newElementWith)(_objectSpread(_objectSpread({}, _newElementBase(\\\"text\\\", opts)), {}, {\\r\\n text: opts.text,\\r\\n rawText: opts.rawText,\\r\\n fontSize: opts.fontSize,\\r\\n fontFamily: opts.fontFamily,\\r\\n textAlign: opts.textAlign,\\r\\n verticalAlign: opts.verticalAlign,\\r\\n x: opts.x - offsets.x,\\r\\n y: opts.y - offsets.y,\\r\\n width: metrics.width,\\r\\n height: metrics.height,\\r\\n baseline: metrics.baseline,\\r\\n containerId: opts.containerId || null,\\r\\n originalText: opts.text\\r\\n }), {});\\r\\n return textElement;\\r\\n};\\r\\nconst getAdjustedDimensions = function (element, nextText) {\\r\\n let maxWidth = null;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\\r\\n if (container) {\\r\\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2;\\r\\n }\\r\\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline } = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element), maxWidth);\\r\\n const { textAlign, verticalAlign } = element;\\r\\n let x;\\r\\n let y;\\r\\n if (textAlign === \\\"center\\\" && verticalAlign === \\\"middle\\\" && !element.containerId) {\\r\\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element), maxWidth);\\r\\n const offsets = getTextElementPositionOffsets(element, {\\r\\n width: nextWidth - prevMetrics.width,\\r\\n height: nextHeight - prevMetrics.height\\r\\n });\\r\\n x = element.x - offsets.x;\\r\\n y = element.y - offsets.y;\\r\\n }\\r\\n else {\\r\\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_6__.getElementAbsoluteCoords)(element);\\r\\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_8__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight);\\r\\n const deltaX1 = (x1 - nextX1) / 2;\\r\\n const deltaY1 = (y1 - nextY1) / 2;\\r\\n const deltaX2 = (x2 - nextX2) / 2;\\r\\n const deltaY2 = (y2 - nextY2) / 2;\\r\\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_7__.adjustXYWithRotation)({\\r\\n s: true,\\r\\n e: textAlign === \\\"center\\\" || textAlign === \\\"left\\\",\\r\\n w: textAlign === \\\"center\\\" || textAlign === \\\"right\\\"\\r\\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\\r\\n } // make sure container dimensions are set properly when\\r\\n // text editor overflows beyond viewport dimensions\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_10__.isBoundToContainer)(element)) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\\r\\n let height = container.height;\\r\\n let width = container.width;\\r\\n if (nextHeight > height - _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2) {\\r\\n height = nextHeight + _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2;\\r\\n }\\r\\n if (nextWidth > width - _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2) {\\r\\n width = nextWidth + _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2;\\r\\n }\\r\\n if (height !== container.height || width !== container.width) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(container, {\\r\\n height,\\r\\n width\\r\\n });\\r\\n }\\r\\n }\\r\\n return {\\r\\n width: nextWidth,\\r\\n height: nextHeight,\\r\\n x: Number.isFinite(x) ? x : element.x,\\r\\n y: Number.isFinite(y) ? y : element.y,\\r\\n baseline: nextBaseline\\r\\n };\\r\\n};\\r\\nconst updateTextElement = function (element, _ref2, isSubmit) {\\r\\n let { text, isDeleted, originalText, rawText } = _ref2;\\r\\n const boundToContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_10__.isBoundToContainer)(element); // Don't update dimensions and text value for bounded text unless submitted\\r\\n const dimensions = boundToContainer && !isSubmit ? undefined : getAdjustedDimensions(element, text);\\r\\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_4__.newElementWith)(element, _objectSpread({\\r\\n text,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText,\\r\\n //should this be rather originalText??\\r\\n originalText,\\r\\n isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : element.isDeleted\\r\\n }, dimensions));\\r\\n};\\r\\nconst newFreeDrawElement = function (opts) {\\r\\n return _objectSpread(_objectSpread({}, _newElementBase(opts.type, opts)), {}, {\\r\\n points: opts.points || [],\\r\\n pressures: [],\\r\\n simulatePressure: opts.simulatePressure,\\r\\n lastCommittedPoint: null\\r\\n });\\r\\n};\\r\\nconst newLinearElement = function (opts) {\\r\\n return _objectSpread(_objectSpread({}, _newElementBase(opts.type, opts)), {}, {\\r\\n points: opts.points || [],\\r\\n lastCommittedPoint: null,\\r\\n startBinding: null,\\r\\n endBinding: null,\\r\\n startArrowhead: opts.startArrowhead,\\r\\n endArrowhead: opts.endArrowhead\\r\\n });\\r\\n};\\r\\nconst newImageElement = function (opts) {\\r\\n return _objectSpread(_objectSpread({}, _newElementBase(\\\"image\\\", opts)), {}, {\\r\\n // in the future we'll support changing stroke color for some SVG elements,\\r\\n // and `transparent` will likely mean \\\"use original colors of the image\\\"\\r\\n strokeColor: \\\"transparent\\\",\\r\\n status: \\\"pending\\\",\\r\\n fileId: null,\\r\\n scale: [1, 1]\\r\\n });\\r\\n}; // Simplified deep clone for the purpose of cloning ExcalidrawElement only\\r\\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\\r\\n//\\r\\n// Adapted from https://github.com/lukeed/klona\\r\\nconst deepCopyElement = function (val) {\\r\\n let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\\r\\n if (val == null || typeof val !== \\\"object\\\") {\\r\\n return val;\\r\\n }\\r\\n if (Object.prototype.toString.call(val) === \\\"[object Object]\\\") {\\r\\n const tmp = typeof val.constructor === \\\"function\\\" ? Object.create(Object.getPrototypeOf(val)) : {};\\r\\n for (const key in val) {\\r\\n if (val.hasOwnProperty(key)) {\\r\\n // don't copy top-level shape property, which we want to regenerate\\r\\n if (depth === 0 && (key === \\\"shape\\\" || key === \\\"canvas\\\")) {\\r\\n continue;\\r\\n }\\r\\n tmp[key] = deepCopyElement(val[key], depth + 1);\\r\\n }\\r\\n }\\r\\n return tmp;\\r\\n }\\r\\n if (Array.isArray(val)) {\\r\\n let k = val.length;\\r\\n const arr = new Array(k);\\r\\n while (k--) {\\r\\n arr[k] = deepCopyElement(val[k], depth + 1);\\r\\n }\\r\\n return arr;\\r\\n }\\r\\n return val;\\r\\n};\\r\\n/**\\r\\n * Duplicate an element, often used in the alt-drag operation.\\r\\n * Note that this method has gotten a bit complicated since the\\r\\n * introduction of gruoping/ungrouping elements.\\r\\n * @param editingGroupId The current group being edited. The new\\r\\n * element will inherit this group and its\\r\\n * parents.\\r\\n * @param groupIdMapForOperation A Map that maps old group IDs to\\r\\n * duplicated ones. If you are duplicating\\r\\n * multiple elements at once, share this map\\r\\n * amongst all of them\\r\\n * @param element Element to duplicate\\r\\n * @param overrides Any element properties to override\\r\\n */\\r\\nconst duplicateElement = function (editingGroupId, groupIdMapForOperation, element, overrides) {\\r\\n var _a, _b;\\r\\n let copy = deepCopyElement(element);\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_2__.isTestEnv)()) {\\r\\n copy.id = `${copy.id}_copy`; // `window.h` may not be defined in some unit tests\\r\\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find(function (el) {\\r\\n return el.id === copy.id;\\r\\n })) {\\r\\n copy.id += \\\"_copy\\\";\\r\\n }\\r\\n }\\r\\n else {\\r\\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)();\\r\\n }\\r\\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getUpdatedTimestamp)();\\r\\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)();\\r\\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_5__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, function (groupId) {\\r\\n if (!groupIdMapForOperation.has(groupId)) {\\r\\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)());\\r\\n }\\r\\n return groupIdMapForOperation.get(groupId);\\r\\n });\\r\\n if (overrides) {\\r\\n copy = Object.assign(copy, overrides);\\r\\n }\\r\\n return copy;\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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U0FDcEI7S0FDRjtTQUFNO1FBQ0wsSUFBSSxDQUFDLEVBQUUsR0FBRyxpREFBUSxFQUFFLENBQUM7S0FDdEI7SUFFRCxJQUFJLENBQUMsT0FBTyxHQUFHLDJEQUFtQixFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxzREFBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxxRUFBNEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxVQUFVLE9BQU87UUFDM0YsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN4QyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLGlEQUFRLEVBQUUsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDN0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLFNBQVMsRUFBRTtRQUNiLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztLQUN2QztJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbmV3RWxlbWVudC50cz8xYTIwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfZGVmaW5lUHJvcGVydHkgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvZGVmaW5lUHJvcGVydHlcIjtcbmltcG9ydCBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMgZnJvbSBcIkBiYWJlbC9ydW50aW1lL2hlbHBlcnMvb2JqZWN0V2l0aG91dFByb3BlcnRpZXNcIjtcbmNvbnN0IF9leGNsdWRlZCA9IFtcInhcIiwgXCJ5XCIsIFwic3Ryb2tlQ29sb3JcIiwgXCJiYWNrZ3JvdW5kQ29sb3JcIiwgXCJmaWxsU3R5bGVcIiwgXCJzdHJva2VXaWR0aFwiLCBcInN0cm9rZVN0eWxlXCIsIFwicm91Z2huZXNzXCIsIFwib3BhY2l0eVwiLCBcIndpZHRoXCIsIFwiaGVpZ2h0XCIsIFwiYW5nbGVcIiwgXCJncm91cElkc1wiLCBcInN0cm9rZVNoYXJwbmVzc1wiLCBcImJvdW5kRWxlbWVudHNcIl07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCB7IGdldEZvbnRTdHJpbmcsIGdldFVwZGF0ZWRUaW1lc3RhbXAsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgcmFuZG9tSW50ZWdlciwgcmFuZG9tSWQgfSBmcm9tIFwiLi4vcmFuZG9tXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24gfSBmcm9tIFwiLi4vZ3JvdXBzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgYWRqdXN0WFlXaXRoUm90YXRpb24gfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHsgZ2V0Q29udGFpbmVyRWxlbWVudCwgbWVhc3VyZVRleHQgfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBfbmV3RWxlbWVudEJhc2UgPSBmdW5jdGlvbiAodHlwZSwgX3JlZikge1xuICBsZXQge1xuICAgIHgsXG4gICAgeSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHN0cm9rZVNoYXJwbmVzcyxcbiAgICBib3VuZEVsZW1lbnRzID0gbnVsbFxuICB9ID0gX3JlZixcbiAgICAgIHJlc3QgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMoX3JlZiwgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCBlbGVtZW50ID0ge1xuICAgIGlkOiByZXN0LmlkIHx8IHJhbmRvbUlkKCksXG4gICAgdHlwZSxcbiAgICB4LFxuICAgIHksXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGFuZ2xlLFxuICAgIHN0cm9rZUNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBmaWxsU3R5bGUsXG4gICAgc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlU3R5bGUsXG4gICAgcm91Z2huZXNzLFxuICAgIG9wYWNpdHksXG4gICAgZ3JvdXBJZHMsXG4gICAgc3Ryb2tlU2hhcnBuZXNzLFxuICAgIHNlZWQ6IHJlc3Quc2VlZCA/PyByYW5kb21JbnRlZ2VyKCksXG4gICAgdmVyc2lvbjogcmVzdC52ZXJzaW9uIHx8IDEsXG4gICAgdmVyc2lvbk5vbmNlOiByZXN0LnZlcnNpb25Ob25jZSA/PyAwLFxuICAgIGlzRGVsZXRlZDogZmFsc2UsXG4gICAgYm91bmRFbGVtZW50cyxcbiAgICB1cGRhdGVkOiBnZXRVcGRhdGVkVGltZXN0YW1wKClcbiAgfTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHJldHVybiBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKTtcbn07XG4vKiogY29tcHV0ZXMgZWxlbWVudCB4L3kgb2Zmc2V0IGJhc2VkIG9uIHRleHRBbGlnbi92ZXJ0aWNhbEFsaWduICovXG5cbmNvbnN0IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzID0gZnVuY3Rpb24gKG9wdHMsIG1ldHJpY3MpIHtcbiAgcmV0dXJuIHtcbiAgICB4OiBvcHRzLnRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiA/IG1ldHJpY3Mud2lkdGggLyAyIDogb3B0cy50ZXh0QWxpZ24gPT09IFwicmlnaHRcIiA/IG1ldHJpY3Mud2lkdGggOiAwLFxuICAgIHk6IG9wdHMudmVydGljYWxBbGlnbiA9PT0gXCJtaWRkbGVcIiA/IG1ldHJpY3MuaGVpZ2h0IC8gMiA6IDBcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdUZXh0RWxlbWVudCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dChvcHRzLnRleHQsIGdldEZvbnRTdHJpbmcob3B0cykpO1xuICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMob3B0cywgbWV0cmljcyk7XG4gIGNvbnN0IHRleHRFbGVtZW50ID0gbmV3RWxlbWVudFdpdGgoX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfbmV3RWxlbWVudEJhc2UoXCJ0ZXh0XCIsIG9wdHMpKSwge30sIHtcbiAgICB0ZXh0OiBvcHRzLnRleHQsXG4gICAgcmF3VGV4dDogb3B0cy5yYXdUZXh0LFxuICAgIGZvbnRTaXplOiBvcHRzLmZvbnRTaXplLFxuICAgIGZvbnRGYW1pbHk6IG9wdHMuZm9udEZhbWlseSxcbiAgICB0ZXh0QWxpZ246IG9wdHMudGV4dEFsaWduLFxuICAgIHZlcnRpY2FsQWxpZ246IG9wdHMudmVydGljYWxBbGlnbixcbiAgICB4OiBvcHRzLnggLSBvZmZzZXRzLngsXG4gICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgIGhlaWdodDogbWV0cmljcy5oZWlnaHQsXG4gICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUsXG4gICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICBvcmlnaW5hbFRleHQ6IG9wdHMudGV4dFxuICB9KSwge30pO1xuICByZXR1cm4gdGV4dEVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBZGp1c3RlZERpbWVuc2lvbnMgPSBmdW5jdGlvbiAoZWxlbWVudCwgbmV4dFRleHQpIHtcbiAgbGV0IG1heFdpZHRoID0gbnVsbDtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgbWF4V2lkdGggPSBjb250YWluZXIud2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIGJhc2VsaW5lOiBuZXh0QmFzZWxpbmVcbiAgfSA9IG1lYXN1cmVUZXh0KG5leHRUZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBtYXhXaWR0aCk7XG4gIGNvbnN0IHtcbiAgICB0ZXh0QWxpZ24sXG4gICAgdmVydGljYWxBbGlnblxuICB9ID0gZWxlbWVudDtcbiAgbGV0IHg7XG4gIGxldCB5O1xuXG4gIGlmICh0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgJiYgdmVydGljYWxBbGlnbiA9PT0gXCJtaWRkbGVcIiAmJiAhZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIGNvbnN0IHByZXZNZXRyaWNzID0gbWVhc3VyZVRleHQoZWxlbWVudC50ZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBtYXhXaWR0aCk7XG4gICAgY29uc3Qgb2Zmc2V0cyA9IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzKGVsZW1lbnQsIHtcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGggLSBwcmV2TWV0cmljcy53aWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCAtIHByZXZNZXRyaWNzLmhlaWdodFxuICAgIH0pO1xuICAgIHggPSBlbGVtZW50LnggLSBvZmZzZXRzLng7XG4gICAgeSA9IGVsZW1lbnQueSAtIG9mZnNldHMueTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IFtuZXh0WDEsIG5leHRZMSwgbmV4dFgyLCBuZXh0WTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50LCBuZXh0V2lkdGgsIG5leHRIZWlnaHQpO1xuICAgIGNvbnN0IGRlbHRhWDEgPSAoeDEgLSBuZXh0WDEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkxID0gKHkxIC0gbmV4dFkxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFYMiA9ICh4MiAtIG5leHRYMikgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTIgPSAoeTIgLSBuZXh0WTIpIC8gMjtcbiAgICBbeCwgeV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbih7XG4gICAgICBzOiB0cnVlLFxuICAgICAgZTogdGV4dEFsaWduID09PSBcImNlbnRlclwiIHx8IHRleHRBbGlnbiA9PT0gXCJsZWZ0XCIsXG4gICAgICB3OiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICB9LCBlbGVtZW50LngsIGVsZW1lbnQueSwgZWxlbWVudC5hbmdsZSwgZGVsdGFYMSwgZGVsdGFZMSwgZGVsdGFYMiwgZGVsdGFZMik7XG4gIH0gLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBkaW1lbnNpb25zIGFyZSBzZXQgcHJvcGVybHkgd2hlblxuICAvLyB0ZXh0IGVkaXRvciBvdmVyZmxvd3MgYmV5b25kIHZpZXdwb3J0IGRpbWVuc2lvbnNcblxuXG4gIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIGxldCBoZWlnaHQgPSBjb250YWluZXIuaGVpZ2h0O1xuICAgIGxldCB3aWR0aCA9IGNvbnRhaW5lci53aWR0aDtcblxuICAgIGlmIChuZXh0SGVpZ2h0ID4gaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMikge1xuICAgICAgaGVpZ2h0ID0gbmV4dEhlaWdodCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgfVxuXG4gICAgaWYgKG5leHRXaWR0aCA+IHdpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogMikge1xuICAgICAgd2lkdGggPSBuZXh0V2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgIH1cblxuICAgIGlmIChoZWlnaHQgIT09IGNvbnRhaW5lci5oZWlnaHQgfHwgd2lkdGggIT09IGNvbnRhaW5lci53aWR0aCkge1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0LFxuICAgICAgICB3aWR0aFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgIGhlaWdodDogbmV4dEhlaWdodCxcbiAgICB4OiBOdW1iZXIuaXNGaW5pdGUoeCkgPyB4IDogZWxlbWVudC54LFxuICAgIHk6IE51bWJlci5pc0Zpbml0ZSh5KSA/IHkgOiBlbGVtZW50LnksXG4gICAgYmFzZWxpbmU6IG5leHRCYXNlbGluZVxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVRleHRFbGVtZW50ID0gZnVuY3Rpb24gKGVsZW1lbnQsIF9yZWYyLCBpc1N1Ym1pdCkge1xuICBsZXQge1xuICAgIHRleHQsXG4gICAgaXNEZWxldGVkLFxuICAgIG9yaWdpbmFsVGV4dCxcbiAgICByYXdUZXh0XG4gIH0gPSBfcmVmMjtcbiAgY29uc3QgYm91bmRUb0NvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTsgLy8gRG9uJ3QgdXBkYXRlIGRpbWVuc2lvbnMgYW5kIHRleHQgdmFsdWUgZm9yIGJvdW5kZWQgdGV4dCB1bmxlc3Mgc3VibWl0dGVkXG5cbiAgY29uc3QgZGltZW5zaW9ucyA9IGJvdW5kVG9Db250YWluZXIgJiYgIWlzU3VibWl0ID8gdW5kZWZpbmVkIDogZ2V0QWRqdXN0ZWREaW1lbnNpb25zKGVsZW1lbnQsIHRleHQpO1xuICByZXR1cm4gbmV3RWxlbWVudFdpdGgoZWxlbWVudCwgX29iamVjdFNwcmVhZCh7XG4gICAgdGV4dCxcbiAgICByYXdUZXh0OiByYXdUZXh0ID8/IG9yaWdpbmFsVGV4dCxcbiAgICAvL3Nob3VsZCB0aGlzIGJlIHJhdGhlciBvcmlnaW5hbFRleHQ/P1xuICAgIG9yaWdpbmFsVGV4dCxcbiAgICBpc0RlbGV0ZWQ6IGlzRGVsZXRlZCA/PyBlbGVtZW50LmlzRGVsZXRlZFxuICB9LCBkaW1lbnNpb25zKSk7XG59O1xuZXhwb3J0IGNvbnN0IG5ld0ZyZWVEcmF3RWxlbWVudCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9uZXdFbGVtZW50QmFzZShvcHRzLnR5cGUsIG9wdHMpKSwge30sIHtcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIHByZXNzdXJlczogW10sXG4gICAgc2ltdWxhdGVQcmVzc3VyZTogb3B0cy5zaW11bGF0ZVByZXNzdXJlLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbFxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgbmV3TGluZWFyRWxlbWVudCA9IGZ1bmN0aW9uIChvcHRzKSB7XG4gIHJldHVybiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9uZXdFbGVtZW50QmFzZShvcHRzLnR5cGUsIG9wdHMpKSwge30sIHtcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICBzdGFydEJpbmRpbmc6IG51bGwsXG4gICAgZW5kQmluZGluZzogbnVsbCxcbiAgICBzdGFydEFycm93aGVhZDogb3B0cy5zdGFydEFycm93aGVhZCxcbiAgICBlbmRBcnJvd2hlYWQ6IG9wdHMuZW5kQXJyb3doZWFkXG4gIH0pO1xufTtcbmV4cG9ydCBjb25zdCBuZXdJbWFnZUVsZW1lbnQgPSBmdW5jdGlvbiAob3B0cykge1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfbmV3RWxlbWVudEJhc2UoXCJpbWFnZVwiLCBvcHRzKSksIHt9LCB7XG4gICAgLy8gaW4gdGhlIGZ1dHVyZSB3ZSdsbCBzdXBwb3J0IGNoYW5naW5nIHN0cm9rZSBjb2xvciBmb3Igc29tZSBTVkcgZWxlbWVudHMsXG4gICAgLy8gYW5kIGB0cmFuc3BhcmVudGAgd2lsbCBsaWtlbHkgbWVhbiBcInVzZSBvcmlnaW5hbCBjb2xvcnMgb2YgdGhlIGltYWdlXCJcbiAgICBzdHJva2VDb2xvcjogXCJ0cmFuc3BhcmVudFwiLFxuICAgIHN0YXR1czogXCJwZW5kaW5nXCIsXG4gICAgZmlsZUlkOiBudWxsLFxuICAgIHNjYWxlOiBbMSwgMV1cbiAgfSk7XG59OyAvLyBTaW1wbGlmaWVkIGRlZXAgY2xvbmUgZm9yIHRoZSBwdXJwb3NlIG9mIGNsb25pbmcgRXhjYWxpZHJhd0VsZW1lbnQgb25seVxuLy8gKGRvZXNuJ3QgY2xvbmUgRGF0ZSwgUmVnRXhwLCBNYXAsIFNldCwgVHlwZWQgYXJyYXlzIGV0Yy4pXG4vL1xuLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9sdWtlZWQva2xvbmFcblxuZXhwb3J0IGNvbnN0IGRlZXBDb3B5RWxlbWVudCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgbGV0IGRlcHRoID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuXG4gIGlmICh2YWwgPT0gbnVsbCB8fCB0eXBlb2YgdmFsICE9PSBcIm9iamVjdFwiKSB7XG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuXG4gIGlmIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsKSA9PT0gXCJbb2JqZWN0IE9iamVjdF1cIikge1xuICAgIGNvbnN0IHRtcCA9IHR5cGVvZiB2YWwuY29uc3RydWN0b3IgPT09IFwiZnVuY3Rpb25cIiA/IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbCkpIDoge307XG5cbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBkb24ndCBjb3B5IHRvcC1sZXZlbCBzaGFwZSBwcm9wZXJ0eSwgd2hpY2ggd2Ugd2FudCB0byByZWdlbmVyYXRlXG4gICAgICAgIGlmIChkZXB0aCA9PT0gMCAmJiAoa2V5ID09PSBcInNoYXBlXCIgfHwga2V5ID09PSBcImNhbnZhc1wiKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdG1wW2tleV0gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRtcDtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICBsZXQgayA9IHZhbC5sZW5ndGg7XG4gICAgY29uc3QgYXJyID0gbmV3IEFycmF5KGspO1xuXG4gICAgd2hpbGUgKGstLSkge1xuICAgICAgYXJyW2tdID0gZGVlcENvcHlFbGVtZW50KHZhbFtrXSwgZGVwdGggKyAxKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG4vKipcbiAqIER1cGxpY2F0ZSBhbiBlbGVtZW50LCBvZnRlbiB1c2VkIGluIHRoZSBhbHQtZHJhZyBvcGVyYXRpb24uXG4gKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgaGFzIGdvdHRlbiBhIGJpdCBjb21wbGljYXRlZCBzaW5jZSB0aGVcbiAqIGludHJvZHVjdGlvbiBvZiBncnVvcGluZy91bmdyb3VwaW5nIGVsZW1lbnRzLlxuICogQHBhcmFtIGVkaXRpbmdHcm91cElkIFRoZSBjdXJyZW50IGdyb3VwIGJlaW5nIGVkaXRlZC4gVGhlIG5ld1xuICogICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgd2lsbCBpbmhlcml0IHRoaXMgZ3JvdXAgYW5kIGl0c1xuICogICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHMuXG4gKiBAcGFyYW0gZ3JvdXBJZE1hcEZvck9wZXJhdGlvbiBBIE1hcCB0aGF0IG1hcHMgb2xkIGdyb3VwIElEcyB0b1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlZCBvbmVzLiBJZiB5b3UgYXJlIGR1cGxpY2F0aW5nXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBlbGVtZW50cyBhdCBvbmNlLCBzaGFyZSB0aGlzIG1hcFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW1vbmdzdCBhbGwgb2YgdGhlbVxuICogQHBhcmFtIGVsZW1lbnQgRWxlbWVudCB0byBkdXBsaWNhdGVcbiAqIEBwYXJhbSBvdmVycmlkZXMgQW55IGVsZW1lbnQgcHJvcGVydGllcyB0byBvdmVycmlkZVxuICovXG5cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gZnVuY3Rpb24gKGVkaXRpbmdHcm91cElkLCBncm91cElkTWFwRm9yT3BlcmF0aW9uLCBlbGVtZW50LCBvdmVycmlkZXMpIHtcbiAgbGV0IGNvcHkgPSBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCk7XG5cbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgY29weS5pZCA9IGAke2NvcHkuaWR9X2NvcHlgOyAvLyBgd2luZG93LmhgIG1heSBub3QgYmUgZGVmaW5lZCBpbiBzb21lIHVuaXQgdGVzdHNcblxuICAgIGlmICh3aW5kb3cuaD8uYXBwPy5nZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZCgpLmZpbmQoZnVuY3Rpb24gKGVsKSB7XG4gICAgICByZXR1cm4gZWwuaWQgPT09IGNvcHkuaWQ7XG4gICAgfSkpIHtcbiAgICAgIGNvcHkuaWQgKz0gXCJfY29weVwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb3B5LmlkID0gcmFuZG9tSWQoKTtcbiAgfVxuXG4gIGNvcHkudXBkYXRlZCA9IGdldFVwZGF0ZWRUaW1lc3RhbXAoKTtcbiAgY29weS5zZWVkID0gcmFuZG9tSW50ZWdlcigpO1xuICBjb3B5Lmdyb3VwSWRzID0gZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbihjb3B5Lmdyb3VwSWRzLCBlZGl0aW5nR3JvdXBJZCwgZnVuY3Rpb24gKGdyb3VwSWQpIHtcbiAgICBpZiAoIWdyb3VwSWRNYXBGb3JPcGVyYXRpb24uaGFzKGdyb3VwSWQpKSB7XG4gICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByYW5kb21JZCgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ3JvdXBJZE1hcEZvck9wZXJhdGlvbi5nZXQoZ3JvdXBJZCk7XG4gIH0pO1xuXG4gIGlmIChvdmVycmlkZXMpIHtcbiAgICBjb3B5ID0gT2JqZWN0LmFzc2lnbihjb3B5LCBvdmVycmlkZXMpO1xuICB9XG5cbiAgcmV0dXJuIGNvcHk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/newElement.ts\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../element/newElement.ts?");
2614
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"newElement\\\": () => (/* binding */ newElement),\\n/* harmony export */ \\\"newTextElement\\\": () => (/* binding */ newTextElement),\\n/* harmony export */ \\\"updateTextElement\\\": () => (/* binding */ updateTextElement),\\n/* harmony export */ \\\"newFreeDrawElement\\\": () => (/* binding */ newFreeDrawElement),\\n/* harmony export */ \\\"newLinearElement\\\": () => (/* binding */ newLinearElement),\\n/* harmony export */ \\\"newImageElement\\\": () => (/* binding */ newImageElement),\\n/* harmony export */ \\\"deepCopyElement\\\": () => (/* binding */ deepCopyElement),\\n/* harmony export */ \\\"duplicateElement\\\": () => (/* binding */ duplicateElement)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"../../../node_modules/@babel/runtime/helpers/esm/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"../../../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../random */ \\\"../../random.ts\\\");\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../groups */ \\\"../../groups.ts\\\");\\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! . */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../math */ \\\"../../math.ts\\\");\\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./bounds */ \\\"../../element/bounds.ts\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"x\\\", \\\"y\\\", \\\"strokeColor\\\", \\\"backgroundColor\\\", \\\"fillStyle\\\", \\\"strokeWidth\\\", \\\"strokeStyle\\\", \\\"roughness\\\", \\\"opacity\\\", \\\"width\\\", \\\"height\\\", \\\"angle\\\", \\\"groupIds\\\", \\\"strokeSharpness\\\", \\\"boundElements\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0,_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_0__[\\\"default\\\"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst _newElementBase = function (type, _ref) {\\r\\n var _a, _b;\\r\\n let { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], strokeSharpness, boundElements = null } = _ref, rest = (0,_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_1__[\\\"default\\\"])(_ref, _excluded);\\r\\n const element = {\\r\\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)(),\\r\\n type,\\r\\n x,\\r\\n y,\\r\\n width,\\r\\n height,\\r\\n angle,\\r\\n strokeColor,\\r\\n backgroundColor,\\r\\n fillStyle,\\r\\n strokeWidth,\\r\\n strokeStyle,\\r\\n roughness,\\r\\n opacity,\\r\\n groupIds,\\r\\n strokeSharpness,\\r\\n seed: (_a = rest.seed) !== null && _a !== void 0 ? _a : (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)(),\\r\\n version: rest.version || 1,\\r\\n versionNonce: (_b = rest.versionNonce) !== null && _b !== void 0 ? _b : 0,\\r\\n isDeleted: false,\\r\\n boundElements,\\r\\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getUpdatedTimestamp)()\\r\\n };\\r\\n return element;\\r\\n};\\r\\nconst newElement = function (opts) {\\r\\n return _newElementBase(opts.type, opts);\\r\\n};\\r\\n/** computes element x/y offset based on textAlign/verticalAlign */\\r\\nconst getTextElementPositionOffsets = function (opts, metrics) {\\r\\n return {\\r\\n x: opts.textAlign === \\\"center\\\" ? metrics.width / 2 : opts.textAlign === \\\"right\\\" ? metrics.width : 0,\\r\\n y: opts.verticalAlign === \\\"middle\\\" ? metrics.height / 2 : 0\\r\\n };\\r\\n};\\r\\nconst newTextElement = function (opts) {\\r\\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(opts.text, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(opts));\\r\\n const offsets = getTextElementPositionOffsets(opts, metrics);\\r\\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_4__.newElementWith)(_objectSpread(_objectSpread({}, _newElementBase(\\\"text\\\", opts)), {}, {\\r\\n text: opts.text,\\r\\n rawText: opts.rawText,\\r\\n fontSize: opts.fontSize,\\r\\n fontFamily: opts.fontFamily,\\r\\n textAlign: opts.textAlign,\\r\\n verticalAlign: opts.verticalAlign,\\r\\n x: opts.x - offsets.x,\\r\\n y: opts.y - offsets.y,\\r\\n width: metrics.width,\\r\\n height: metrics.height,\\r\\n baseline: metrics.baseline,\\r\\n containerId: opts.containerId || null,\\r\\n originalText: opts.text\\r\\n }), {});\\r\\n return textElement;\\r\\n};\\r\\nconst getAdjustedDimensions = function (element, nextText) {\\r\\n let maxWidth = null;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\\r\\n if (container) {\\r\\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2;\\r\\n }\\r\\n const { width: nextWidth, height: nextHeight, baseline: nextBaseline } = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element), maxWidth);\\r\\n const { textAlign, verticalAlign } = element;\\r\\n let x;\\r\\n let y;\\r\\n if (textAlign === \\\"center\\\" && verticalAlign === \\\"middle\\\" && !element.containerId) {\\r\\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element), maxWidth);\\r\\n const offsets = getTextElementPositionOffsets(element, {\\r\\n width: nextWidth - prevMetrics.width,\\r\\n height: nextHeight - prevMetrics.height\\r\\n });\\r\\n x = element.x - offsets.x;\\r\\n y = element.y - offsets.y;\\r\\n }\\r\\n else {\\r\\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_6__.getElementAbsoluteCoords)(element);\\r\\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_8__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight);\\r\\n const deltaX1 = (x1 - nextX1) / 2;\\r\\n const deltaY1 = (y1 - nextY1) / 2;\\r\\n const deltaX2 = (x2 - nextX2) / 2;\\r\\n const deltaY2 = (y2 - nextY2) / 2;\\r\\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_7__.adjustXYWithRotation)({\\r\\n s: true,\\r\\n e: textAlign === \\\"center\\\" || textAlign === \\\"left\\\",\\r\\n w: textAlign === \\\"center\\\" || textAlign === \\\"right\\\"\\r\\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\\r\\n } // make sure container dimensions are set properly when\\r\\n // text editor overflows beyond viewport dimensions\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_10__.isBoundToContainer)(element)) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\\r\\n let height = container.height;\\r\\n let width = container.width;\\r\\n if (nextHeight > height - _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2) {\\r\\n height = nextHeight + _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2;\\r\\n }\\r\\n if (nextWidth > width - _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2) {\\r\\n width = nextWidth + _constants__WEBPACK_IMPORTED_MODULE_11__.BOUND_TEXT_PADDING * 2;\\r\\n }\\r\\n if (height !== container.height || width !== container.width) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_4__.mutateElement)(container, {\\r\\n height,\\r\\n width\\r\\n });\\r\\n }\\r\\n }\\r\\n return {\\r\\n width: nextWidth,\\r\\n height: nextHeight,\\r\\n x: Number.isFinite(x) ? x : element.x,\\r\\n y: Number.isFinite(y) ? y : element.y,\\r\\n baseline: nextBaseline\\r\\n };\\r\\n};\\r\\nconst updateTextElement = function (element, _ref2) {\\r\\n let { text, isDeleted, originalText, rawText } = _ref2;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getContainerElement)(element);\\r\\n if (container) {\\r\\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getFontString)(element), container.width);\\r\\n }\\r\\n const dimensions = getAdjustedDimensions(element, text);\\r\\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_4__.newElementWith)(element, _objectSpread({\\r\\n text,\\r\\n rawText: rawText !== null && rawText !== void 0 ? rawText : originalText,\\r\\n //should this be rather originalText??\\r\\n originalText,\\r\\n isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : element.isDeleted\\r\\n }, dimensions));\\r\\n};\\r\\nconst newFreeDrawElement = function (opts) {\\r\\n return _objectSpread(_objectSpread({}, _newElementBase(opts.type, opts)), {}, {\\r\\n points: opts.points || [],\\r\\n pressures: [],\\r\\n simulatePressure: opts.simulatePressure,\\r\\n lastCommittedPoint: null\\r\\n });\\r\\n};\\r\\nconst newLinearElement = function (opts) {\\r\\n return _objectSpread(_objectSpread({}, _newElementBase(opts.type, opts)), {}, {\\r\\n points: opts.points || [],\\r\\n lastCommittedPoint: null,\\r\\n startBinding: null,\\r\\n endBinding: null,\\r\\n startArrowhead: opts.startArrowhead,\\r\\n endArrowhead: opts.endArrowhead\\r\\n });\\r\\n};\\r\\nconst newImageElement = function (opts) {\\r\\n return _objectSpread(_objectSpread({}, _newElementBase(\\\"image\\\", opts)), {}, {\\r\\n // in the future we'll support changing stroke color for some SVG elements,\\r\\n // and `transparent` will likely mean \\\"use original colors of the image\\\"\\r\\n strokeColor: \\\"transparent\\\",\\r\\n status: \\\"pending\\\",\\r\\n fileId: null,\\r\\n scale: [1, 1]\\r\\n });\\r\\n}; // Simplified deep clone for the purpose of cloning ExcalidrawElement only\\r\\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\\r\\n//\\r\\n// Adapted from https://github.com/lukeed/klona\\r\\nconst deepCopyElement = function (val) {\\r\\n let depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\\r\\n if (val == null || typeof val !== \\\"object\\\") {\\r\\n return val;\\r\\n }\\r\\n if (Object.prototype.toString.call(val) === \\\"[object Object]\\\") {\\r\\n const tmp = typeof val.constructor === \\\"function\\\" ? Object.create(Object.getPrototypeOf(val)) : {};\\r\\n for (const key in val) {\\r\\n if (val.hasOwnProperty(key)) {\\r\\n // don't copy top-level shape property, which we want to regenerate\\r\\n if (depth === 0 && (key === \\\"shape\\\" || key === \\\"canvas\\\")) {\\r\\n continue;\\r\\n }\\r\\n tmp[key] = deepCopyElement(val[key], depth + 1);\\r\\n }\\r\\n }\\r\\n return tmp;\\r\\n }\\r\\n if (Array.isArray(val)) {\\r\\n let k = val.length;\\r\\n const arr = new Array(k);\\r\\n while (k--) {\\r\\n arr[k] = deepCopyElement(val[k], depth + 1);\\r\\n }\\r\\n return arr;\\r\\n }\\r\\n return val;\\r\\n};\\r\\n/**\\r\\n * Duplicate an element, often used in the alt-drag operation.\\r\\n * Note that this method has gotten a bit complicated since the\\r\\n * introduction of gruoping/ungrouping elements.\\r\\n * @param editingGroupId The current group being edited. The new\\r\\n * element will inherit this group and its\\r\\n * parents.\\r\\n * @param groupIdMapForOperation A Map that maps old group IDs to\\r\\n * duplicated ones. If you are duplicating\\r\\n * multiple elements at once, share this map\\r\\n * amongst all of them\\r\\n * @param element Element to duplicate\\r\\n * @param overrides Any element properties to override\\r\\n */\\r\\nconst duplicateElement = function (editingGroupId, groupIdMapForOperation, element, overrides) {\\r\\n var _a, _b;\\r\\n let copy = deepCopyElement(element);\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_2__.isTestEnv)()) {\\r\\n copy.id = `${copy.id}_copy`; // `window.h` may not be defined in some unit tests\\r\\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find(function (el) {\\r\\n return el.id === copy.id;\\r\\n })) {\\r\\n copy.id += \\\"_copy\\\";\\r\\n }\\r\\n }\\r\\n else {\\r\\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)();\\r\\n }\\r\\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getUpdatedTimestamp)();\\r\\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)();\\r\\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_5__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, function (groupId) {\\r\\n if (!groupIdMapForOperation.has(groupId)) {\\r\\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomId)());\\r\\n }\\r\\n return groupIdMapForOperation.get(groupId);\\r\\n });\\r\\n if (overrides) {\\r\\n copy = Object.assign(copy, overrides);\\r\\n }\\r\\n return copy;\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUNGLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDO1NBQ3BCO0tBQ0Y7U0FBTTtRQUNMLElBQUksQ0FBQyxFQUFFLEdBQUcsaURBQVEsRUFBRSxDQUFDO0tBQ3RCO0lBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRywyREFBbUIsRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsc0RBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcscUVBQTRCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsVUFBVSxPQUFPO1FBQzNGLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxpREFBUSxFQUFFLENBQUMsQ0FBQztTQUNqRDtRQUVELE9BQU8sc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDdkM7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L25ld0VsZW1lbnQudHM/MWEyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5pbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJ4XCIsIFwieVwiLCBcInN0cm9rZUNvbG9yXCIsIFwiYmFja2dyb3VuZENvbG9yXCIsIFwiZmlsbFN0eWxlXCIsIFwic3Ryb2tlV2lkdGhcIiwgXCJzdHJva2VTdHlsZVwiLCBcInJvdWdobmVzc1wiLCBcIm9wYWNpdHlcIiwgXCJ3aWR0aFwiLCBcImhlaWdodFwiLCBcImFuZ2xlXCIsIFwiZ3JvdXBJZHNcIiwgXCJzdHJva2VTaGFycG5lc3NcIiwgXCJib3VuZEVsZW1lbnRzXCJdO1xuXG5mdW5jdGlvbiBvd25LZXlzKG9iamVjdCwgZW51bWVyYWJsZU9ubHkpIHsgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmplY3QpOyBpZiAoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scykgeyB2YXIgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMob2JqZWN0KTsgZW51bWVyYWJsZU9ubHkgJiYgKHN5bWJvbHMgPSBzeW1ib2xzLmZpbHRlcihmdW5jdGlvbiAoc3ltKSB7IHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iamVjdCwgc3ltKS5lbnVtZXJhYmxlOyB9KSksIGtleXMucHVzaC5hcHBseShrZXlzLCBzeW1ib2xzKTsgfSByZXR1cm4ga2V5czsgfVxuXG5mdW5jdGlvbiBfb2JqZWN0U3ByZWFkKHRhcmdldCkgeyBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgeyB2YXIgc291cmNlID0gbnVsbCAhPSBhcmd1bWVudHNbaV0gPyBhcmd1bWVudHNbaV0gOiB7fTsgaSAlIDIgPyBvd25LZXlzKE9iamVjdChzb3VyY2UpLCAhMCkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IF9kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgc291cmNlW2tleV0pOyB9KSA6IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzID8gT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhzb3VyY2UpKSA6IG93bktleXMoT2JqZWN0KHNvdXJjZSkpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Ioc291cmNlLCBrZXkpKTsgfSk7IH0gcmV0dXJuIHRhcmdldDsgfVxuXG5pbXBvcnQgeyBnZXRGb250U3RyaW5nLCBnZXRVcGRhdGVkVGltZXN0YW1wLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJhbmRvbUludGVnZXIsIHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGFkanVzdFhZV2l0aFJvdGF0aW9uIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi9ib3VuZHNcIjtcbmltcG9ydCB7IGdldENvbnRhaW5lckVsZW1lbnQsIG1lYXN1cmVUZXh0LCB3cmFwVGV4dCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0JvdW5kVG9Db250YWluZXIgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBCT1VORF9URVhUX1BBRERJTkcgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5cbmNvbnN0IF9uZXdFbGVtZW50QmFzZSA9IGZ1bmN0aW9uICh0eXBlLCBfcmVmKSB7XG4gIGxldCB7XG4gICAgeCxcbiAgICB5LFxuICAgIHN0cm9rZUNvbG9yLFxuICAgIGJhY2tncm91bmRDb2xvcixcbiAgICBmaWxsU3R5bGUsXG4gICAgc3Ryb2tlV2lkdGgsXG4gICAgc3Ryb2tlU3R5bGUsXG4gICAgcm91Z2huZXNzLFxuICAgIG9wYWNpdHksXG4gICAgd2lkdGggPSAwLFxuICAgIGhlaWdodCA9IDAsXG4gICAgYW5nbGUgPSAwLFxuICAgIGdyb3VwSWRzID0gW10sXG4gICAgc3Ryb2tlU2hhcnBuZXNzLFxuICAgIGJvdW5kRWxlbWVudHMgPSBudWxsXG4gIH0gPSBfcmVmLFxuICAgICAgcmVzdCA9IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyhfcmVmLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IGVsZW1lbnQgPSB7XG4gICAgaWQ6IHJlc3QuaWQgfHwgcmFuZG9tSWQoKSxcbiAgICB0eXBlLFxuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYW5nbGUsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MsXG4gICAgb3BhY2l0eSxcbiAgICBncm91cElkcyxcbiAgICBzdHJva2VTaGFycG5lc3MsXG4gICAgc2VlZDogcmVzdC5zZWVkID8/IHJhbmRvbUludGVnZXIoKSxcbiAgICB2ZXJzaW9uOiByZXN0LnZlcnNpb24gfHwgMSxcbiAgICB2ZXJzaW9uTm9uY2U6IHJlc3QudmVyc2lvbk5vbmNlID8/IDAsXG4gICAgaXNEZWxldGVkOiBmYWxzZSxcbiAgICBib3VuZEVsZW1lbnRzLFxuICAgIHVwZGF0ZWQ6IGdldFVwZGF0ZWRUaW1lc3RhbXAoKVxuICB9O1xuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdFbGVtZW50ID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgcmV0dXJuIF9uZXdFbGVtZW50QmFzZShvcHRzLnR5cGUsIG9wdHMpO1xufTtcbi8qKiBjb21wdXRlcyBlbGVtZW50IHgveSBvZmZzZXQgYmFzZWQgb24gdGV4dEFsaWduL3ZlcnRpY2FsQWxpZ24gKi9cblxuY29uc3QgZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMgPSBmdW5jdGlvbiAob3B0cywgbWV0cmljcykge1xuICByZXR1cm4ge1xuICAgIHg6IG9wdHMudGV4dEFsaWduID09PSBcImNlbnRlclwiID8gbWV0cmljcy53aWR0aCAvIDIgOiBvcHRzLnRleHRBbGlnbiA9PT0gXCJyaWdodFwiID8gbWV0cmljcy53aWR0aCA6IDAsXG4gICAgeTogb3B0cy52ZXJ0aWNhbEFsaWduID09PSBcIm1pZGRsZVwiID8gbWV0cmljcy5oZWlnaHQgLyAyIDogMFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld1RleHRFbGVtZW50ID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KG9wdHMudGV4dCwgZ2V0Rm9udFN0cmluZyhvcHRzKSk7XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhvcHRzLCBtZXRyaWNzKTtcbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIF9uZXdFbGVtZW50QmFzZShcInRleHRcIiwgb3B0cykpLCB7fSwge1xuICAgIHRleHQ6IG9wdHMudGV4dCxcbiAgICByYXdUZXh0OiBvcHRzLnJhd1RleHQsXG4gICAgZm9udFNpemU6IG9wdHMuZm9udFNpemUsXG4gICAgZm9udEZhbWlseTogb3B0cy5mb250RmFtaWx5LFxuICAgIHRleHRBbGlnbjogb3B0cy50ZXh0QWxpZ24sXG4gICAgdmVydGljYWxBbGlnbjogb3B0cy52ZXJ0aWNhbEFsaWduLFxuICAgIHg6IG9wdHMueCAtIG9mZnNldHMueCxcbiAgICB5OiBvcHRzLnkgLSBvZmZzZXRzLnksXG4gICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICBjb250YWluZXJJZDogb3B0cy5jb250YWluZXJJZCB8fCBudWxsLFxuICAgIG9yaWdpbmFsVGV4dDogb3B0cy50ZXh0XG4gIH0pLCB7fSk7XG4gIHJldHVybiB0ZXh0RWxlbWVudDtcbn07XG5cbmNvbnN0IGdldEFkanVzdGVkRGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGVtZW50LCBuZXh0VGV4dCkge1xuICBsZXQgbWF4V2lkdGggPSBudWxsO1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cblxuICBjb25zdCB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgYmFzZWxpbmU6IG5leHRCYXNlbGluZVxuICB9ID0gbWVhc3VyZVRleHQobmV4dFRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIG1heFdpZHRoKTtcbiAgY29uc3Qge1xuICAgIHRleHRBbGlnbixcbiAgICB2ZXJ0aWNhbEFsaWduXG4gIH0gPSBlbGVtZW50O1xuICBsZXQgeDtcbiAgbGV0IHk7XG5cbiAgaWYgKHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiAmJiB2ZXJ0aWNhbEFsaWduID09PSBcIm1pZGRsZVwiICYmICFlbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgY29uc3QgcHJldk1ldHJpY3MgPSBtZWFzdXJlVGV4dChlbGVtZW50LnRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIG1heFdpZHRoKTtcbiAgICBjb25zdCBvZmZzZXRzID0gZ2V0VGV4dEVsZW1lbnRQb3NpdGlvbk9mZnNldHMoZWxlbWVudCwge1xuICAgICAgd2lkdGg6IG5leHRXaWR0aCAtIHByZXZNZXRyaWNzLndpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0IC0gcHJldk1ldHJpY3MuaGVpZ2h0XG4gICAgfSk7XG4gICAgeCA9IGVsZW1lbnQueCAtIG9mZnNldHMueDtcbiAgICB5ID0gZWxlbWVudC55IC0gb2Zmc2V0cy55O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgW25leHRYMSwgbmV4dFkxLCBuZXh0WDIsIG5leHRZMl0gPSBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQsIG5leHRXaWR0aCwgbmV4dEhlaWdodCk7XG4gICAgY29uc3QgZGVsdGFYMSA9ICh4MSAtIG5leHRYMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWTEgPSAoeTEgLSBuZXh0WTEpIC8gMjtcbiAgICBjb25zdCBkZWx0YVgyID0gKHgyIC0gbmV4dFgyKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMiA9ICh5MiAtIG5leHRZMikgLyAyO1xuICAgIFt4LCB5XSA9IGFkanVzdFhZV2l0aFJvdGF0aW9uKHtcbiAgICAgIHM6IHRydWUsXG4gICAgICBlOiB0ZXh0QWxpZ24gPT09IFwiY2VudGVyXCIgfHwgdGV4dEFsaWduID09PSBcImxlZnRcIixcbiAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIlxuICAgIH0sIGVsZW1lbnQueCwgZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlLCBkZWx0YVgxLCBkZWx0YVkxLCBkZWx0YVgyLCBkZWx0YVkyKTtcbiAgfSAvLyBtYWtlIHN1cmUgY29udGFpbmVyIGRpbWVuc2lvbnMgYXJlIHNldCBwcm9wZXJseSB3aGVuXG4gIC8vIHRleHQgZWRpdG9yIG92ZXJmbG93cyBiZXlvbmQgdmlld3BvcnQgZGltZW5zaW9uc1xuXG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgbGV0IGhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgbGV0IHdpZHRoID0gY29udGFpbmVyLndpZHRoO1xuXG4gICAgaWYgKG5leHRIZWlnaHQgPiBoZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyKSB7XG4gICAgICBoZWlnaHQgPSBuZXh0SGVpZ2h0ICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgICB9XG5cbiAgICBpZiAobmV4dFdpZHRoID4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyKSB7XG4gICAgICB3aWR0aCA9IG5leHRXaWR0aCArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgfVxuXG4gICAgaWYgKGhlaWdodCAhPT0gY29udGFpbmVyLmhlaWdodCB8fCB3aWR0aCAhPT0gY29udGFpbmVyLndpZHRoKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQsXG4gICAgICAgIHdpZHRoXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIHg6IE51bWJlci5pc0Zpbml0ZSh4KSA/IHggOiBlbGVtZW50LngsXG4gICAgeTogTnVtYmVyLmlzRmluaXRlKHkpID8geSA6IGVsZW1lbnQueSxcbiAgICBiYXNlbGluZTogbmV4dEJhc2VsaW5lXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlVGV4dEVsZW1lbnQgPSBmdW5jdGlvbiAoZWxlbWVudCwgX3JlZjIpIHtcbiAgbGV0IHtcbiAgICB0ZXh0LFxuICAgIGlzRGVsZXRlZCxcbiAgICBvcmlnaW5hbFRleHQsXG4gICAgcmF3VGV4dFxuICB9ID0gX3JlZjI7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIHRleHQgPSB3cmFwVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKGVsZW1lbnQpLCBjb250YWluZXIud2lkdGgpO1xuICB9XG5cbiAgY29uc3QgZGltZW5zaW9ucyA9IGdldEFkanVzdGVkRGltZW5zaW9ucyhlbGVtZW50LCB0ZXh0KTtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKGVsZW1lbnQsIF9vYmplY3RTcHJlYWQoe1xuICAgIHRleHQsXG4gICAgcmF3VGV4dDogcmF3VGV4dCA/PyBvcmlnaW5hbFRleHQsXG4gICAgLy9zaG91bGQgdGhpcyBiZSByYXRoZXIgb3JpZ2luYWxUZXh0Pz9cbiAgICBvcmlnaW5hbFRleHQsXG4gICAgaXNEZWxldGVkOiBpc0RlbGV0ZWQgPz8gZWxlbWVudC5pc0RlbGV0ZWRcbiAgfSwgZGltZW5zaW9ucykpO1xufTtcbmV4cG9ydCBjb25zdCBuZXdGcmVlRHJhd0VsZW1lbnQgPSBmdW5jdGlvbiAob3B0cykge1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKSksIHt9LCB7XG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBwcmVzc3VyZXM6IFtdLFxuICAgIHNpbXVsYXRlUHJlc3N1cmU6IG9wdHMuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGxcbiAgfSk7XG59O1xuZXhwb3J0IGNvbnN0IG5ld0xpbmVhckVsZW1lbnQgPSBmdW5jdGlvbiAob3B0cykge1xuICByZXR1cm4gX29iamVjdFNwcmVhZChfb2JqZWN0U3ByZWFkKHt9LCBfbmV3RWxlbWVudEJhc2Uob3B0cy50eXBlLCBvcHRzKSksIHt9LCB7XG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gICAgc3RhcnRCaW5kaW5nOiBudWxsLFxuICAgIGVuZEJpbmRpbmc6IG51bGwsXG4gICAgc3RhcnRBcnJvd2hlYWQ6IG9wdHMuc3RhcnRBcnJvd2hlYWQsXG4gICAgZW5kQXJyb3doZWFkOiBvcHRzLmVuZEFycm93aGVhZFxuICB9KTtcbn07XG5leHBvcnQgY29uc3QgbmV3SW1hZ2VFbGVtZW50ID0gZnVuY3Rpb24gKG9wdHMpIHtcbiAgcmV0dXJuIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgX25ld0VsZW1lbnRCYXNlKFwiaW1hZ2VcIiwgb3B0cykpLCB7fSwge1xuICAgIC8vIGluIHRoZSBmdXR1cmUgd2UnbGwgc3VwcG9ydCBjaGFuZ2luZyBzdHJva2UgY29sb3IgZm9yIHNvbWUgU1ZHIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBgdHJhbnNwYXJlbnRgIHdpbGwgbGlrZWx5IG1lYW4gXCJ1c2Ugb3JpZ2luYWwgY29sb3JzIG9mIHRoZSBpbWFnZVwiXG4gICAgc3Ryb2tlQ29sb3I6IFwidHJhbnNwYXJlbnRcIixcbiAgICBzdGF0dXM6IFwicGVuZGluZ1wiLFxuICAgIGZpbGVJZDogbnVsbCxcbiAgICBzY2FsZTogWzEsIDFdXG4gIH0pO1xufTsgLy8gU2ltcGxpZmllZCBkZWVwIGNsb25lIGZvciB0aGUgcHVycG9zZSBvZiBjbG9uaW5nIEV4Y2FsaWRyYXdFbGVtZW50IG9ubHlcbi8vIChkb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsIFR5cGVkIGFycmF5cyBldGMuKVxuLy9cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL2tsb25hXG5cbmV4cG9ydCBjb25zdCBkZWVwQ29weUVsZW1lbnQgPSBmdW5jdGlvbiAodmFsKSB7XG4gIGxldCBkZXB0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMDtcblxuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICBjb25zdCB0bXAgPSB0eXBlb2YgdmFsLmNvbnN0cnVjdG9yID09PSBcImZ1bmN0aW9uXCIgPyBPYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWwpKSA6IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKSB7XG4gICAgICBpZiAodmFsLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gZG9uJ3QgY29weSB0b3AtbGV2ZWwgc2hhcGUgcHJvcGVydHksIHdoaWNoIHdlIHdhbnQgdG8gcmVnZW5lcmF0ZVxuICAgICAgICBpZiAoZGVwdGggPT09IDAgJiYgKGtleSA9PT0gXCJzaGFwZVwiIHx8IGtleSA9PT0gXCJjYW52YXNcIikpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRtcFtrZXldID0gZGVlcENvcHlFbGVtZW50KHZhbFtrZXldLCBkZXB0aCArIDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcblxuICAgIHdoaWxlIChrLS0pIHtcbiAgICAgIGFycltrXSA9IGRlZXBDb3B5RWxlbWVudCh2YWxba10sIGRlcHRoICsgMSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFycjtcbiAgfVxuXG4gIHJldHVybiB2YWw7XG59O1xuLyoqXG4gKiBEdXBsaWNhdGUgYW4gZWxlbWVudCwgb2Z0ZW4gdXNlZCBpbiB0aGUgYWx0LWRyYWcgb3BlcmF0aW9uLlxuICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGhhcyBnb3R0ZW4gYSBiaXQgY29tcGxpY2F0ZWQgc2luY2UgdGhlXG4gKiBpbnRyb2R1Y3Rpb24gb2YgZ3J1b3BpbmcvdW5ncm91cGluZyBlbGVtZW50cy5cbiAqIEBwYXJhbSBlZGl0aW5nR3JvdXBJZCBUaGUgY3VycmVudCBncm91cCBiZWluZyBlZGl0ZWQuIFRoZSBuZXdcbiAqICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHdpbGwgaW5oZXJpdCB0aGlzIGdyb3VwIGFuZCBpdHNcbiAqICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLlxuICogQHBhcmFtIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24gQSBNYXAgdGhhdCBtYXBzIG9sZCBncm91cCBJRHMgdG9cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZWQgb25lcy4gSWYgeW91IGFyZSBkdXBsaWNhdGluZ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgZWxlbWVudHMgYXQgb25jZSwgc2hhcmUgdGhpcyBtYXBcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFtb25nc3QgYWxsIG9mIHRoZW1cbiAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gZHVwbGljYXRlXG4gKiBAcGFyYW0gb3ZlcnJpZGVzIEFueSBlbGVtZW50IHByb3BlcnRpZXMgdG8gb3ZlcnJpZGVcbiAqL1xuXG5leHBvcnQgY29uc3QgZHVwbGljYXRlRWxlbWVudCA9IGZ1bmN0aW9uIChlZGl0aW5nR3JvdXBJZCwgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbiwgZWxlbWVudCwgb3ZlcnJpZGVzKSB7XG4gIGxldCBjb3B5ID0gZGVlcENvcHlFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIGNvcHkuaWQgPSBgJHtjb3B5LmlkfV9jb3B5YDsgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG5cbiAgICBpZiAod2luZG93Lmg/LmFwcD8uZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQoKS5maW5kKGZ1bmN0aW9uIChlbCkge1xuICAgICAgcmV0dXJuIGVsLmlkID09PSBjb3B5LmlkO1xuICAgIH0pKSB7XG4gICAgICBjb3B5LmlkICs9IFwiX2NvcHlcIjtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29weS5pZCA9IHJhbmRvbUlkKCk7XG4gIH1cblxuICBjb3B5LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oY29weS5ncm91cElkcywgZWRpdGluZ0dyb3VwSWQsIGZ1bmN0aW9uIChncm91cElkKSB7XG4gICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbi5zZXQoZ3JvdXBJZCwgcmFuZG9tSWQoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdyb3VwSWRNYXBGb3JPcGVyYXRpb24uZ2V0KGdyb3VwSWQpO1xuICB9KTtcblxuICBpZiAob3ZlcnJpZGVzKSB7XG4gICAgY29weSA9IE9iamVjdC5hc3NpZ24oY29weSwgb3ZlcnJpZGVzKTtcbiAgfVxuXG4gIHJldHVybiBjb3B5O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///../../element/newElement.ts\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../element/newElement.ts?");
2615
2615
 
2616
2616
  /***/ }),
2617
2617
 
@@ -2677,7 +2677,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
2677
2677
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2678
2678
 
2679
2679
  "use strict";
2680
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"textWysiwyg\\\": () => (/* binding */ textWysiwyg)\\n/* harmony export */ });\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \\\"../../actions/actionProperties.tsx\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst normalizeText = function (text) {\\r\\n return text // replace tabs with spaces so they render and measure correctly\\r\\n .replace(/\\\\t/g, \\\" \\\") // normalize newlines\\r\\n .replace(/\\\\r?\\\\n|\\\\r/g, \\\"\\\\n\\\");\\r\\n};\\r\\nconst getTransform = function (width, height, angle, appState, maxWidth, maxHeight) {\\r\\n const { zoom, offsetTop, offsetLeft } = appState;\\r\\n const degree = 180 * angle / Math.PI; // offsets must be multiplied by 2 to account for the division by 2 of\\r\\n // the whole expression afterwards\\r\\n let translateX = (width - offsetLeft * 2) * (zoom.value - 1) / 2;\\r\\n let translateY = (height - offsetTop * 2) * (zoom.value - 1) / 2;\\r\\n if (width > maxWidth && zoom.value !== 1) {\\r\\n translateX = (maxWidth - offsetLeft * 2) * (zoom.value - 1) / 2;\\r\\n }\\r\\n if (height > maxHeight && zoom.value !== 1) {\\r\\n translateY = (maxHeight - offsetTop * 2) * (zoom.value - 1) / 2;\\r\\n }\\r\\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\\r\\n};\\r\\nconst textWysiwyg = function (_ref) {\\r\\n let { id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app } = _ref;\\r\\n const textPropertiesUpdated = function (updatedElement, editable) {\\r\\n const currentFont = editable.style.fontFamily.replaceAll('\\\"', \\\"\\\");\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({\\r\\n fontFamily: updatedElement.fontFamily\\r\\n }) !== currentFont) {\\r\\n return true;\\r\\n }\\r\\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n let originalContainerHeight;\\r\\n let approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element));\\r\\n const initialText = element.originalText;\\r\\n const updateWysiwygStyle = function () {\\r\\n var _a;\\r\\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\\r\\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\\r\\n let coordX = updatedElement.x;\\r\\n let coordY = updatedElement.y;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedElement);\\r\\n let maxWidth = updatedElement.width;\\r\\n let maxHeight = updatedElement.height;\\r\\n let width = updatedElement.width; // Set to element height by default since thats\\r\\n // what is going to be used for unbounded text\\r\\n let height = updatedElement.height;\\r\\n if (container && updatedElement.containerId) {\\r\\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable); // using editor.style.height to get the accurate height of text editor\\r\\n const editorHeight = Number(editable.style.height.slice(0, -2));\\r\\n if (editorHeight > 0) {\\r\\n height = editorHeight;\\r\\n }\\r\\n if (propertiesUpdated) {\\r\\n approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement));\\r\\n originalContainerHeight = container.height; // update height of the editor after properties updated\\r\\n height = updatedElement.height;\\r\\n }\\r\\n if (!originalContainerHeight) {\\r\\n originalContainerHeight = container.height;\\r\\n }\\r\\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n width = maxWidth; // The coordinates of text box set a distance of\\r\\n // 30px to preserve padding\\r\\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING; // autogrow container height if text exceeds\\r\\n if (height > maxHeight) {\\r\\n const diff = Math.min(height - maxHeight, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n height: container.height + diff\\r\\n });\\r\\n return;\\r\\n }\\r\\n else if ( // autoshrink container height until original container height\\r\\n // is reached when text is removed\\r\\n container.height > originalContainerHeight && height < maxHeight) {\\r\\n const diff = Math.min(maxHeight - height, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n height: container.height - diff\\r\\n });\\r\\n } // Start pushing text upward until a diff of 30px (padding)\\r\\n // is reached\\r\\n else {\\r\\n // vertically center align the text\\r\\n coordY = container.y + container.height / 2 - height / 2;\\r\\n }\\r\\n }\\r\\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\\r\\n const { textAlign } = updatedElement;\\r\\n editable.value = updatedElement.originalText;\\r\\n const lines = updatedElement.originalText.split(\\\"\\\\n\\\");\\r\\n const lineHeight = updatedElement.containerId ? approxLineHeight : updatedElement.height / lines.length;\\r\\n if (!container) {\\r\\n maxWidth = (appState.width - 8 - ((appState.scrollX + updatedElement.x) * appState.zoom.value + appState.zoom.translation.x)) / appState.zoom.value - // margin-right of parent if any\\r\\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\\r\\n } // Make sure text editor height doesn't go beyond viewport\\r\\n const editorMaxHeight = (appState.height - viewportY - ( // There is a ~14px difference which keeps on increasing\\r\\n // with every zoom step when offset present hence I am subtracting it here\\r\\n // However this is not the best fix and breaks in\\r\\n // few scenarios\\r\\n appState.offsetTop ? (appState.zoom.value * 100 - 100) / 10 * 14 : 0)) / appState.zoom.value;\\r\\n const angle = container ? container.angle : updatedElement.angle;\\r\\n Object.assign(editable.style, {\\r\\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\\r\\n // must be defined *after* font ¯\\\\_(ツ)_/¯\\r\\n lineHeight: `${lineHeight}px`,\\r\\n width: `${width}px`,\\r\\n height: `${height}px`,\\r\\n left: `${viewportX}px`,\\r\\n top: `${viewportY}px`,\\r\\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\\r\\n textAlign,\\r\\n color: updatedElement.strokeColor,\\r\\n opacity: updatedElement.opacity / 100,\\r\\n filter: \\\"var(--theme-filter)\\\",\\r\\n maxWidth: `${maxWidth}px`,\\r\\n maxHeight: `${editorMaxHeight}px`\\r\\n }); // For some reason updating font attribute doesn't set font family\\r\\n // hence updating font family explicitly for test environment\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\\r\\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedElement);\\r\\n }\\r\\n }\\r\\n };\\r\\n const editable = document.createElement(\\\"textarea\\\");\\r\\n editable.dir = \\\"auto\\\";\\r\\n editable.tabIndex = 0;\\r\\n editable.dataset.type = \\\"wysiwyg\\\"; // prevent line wrapping on Safari\\r\\n editable.wrap = \\\"off\\\";\\r\\n editable.classList.add(\\\"excalidraw-wysiwyg\\\");\\r\\n let whiteSpace = \\\"pre\\\";\\r\\n let wordBreak = \\\"normal\\\";\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\\r\\n whiteSpace = \\\"pre-wrap\\\";\\r\\n wordBreak = \\\"break-word\\\";\\r\\n }\\r\\n Object.assign(editable.style, {\\r\\n position: \\\"absolute\\\",\\r\\n display: \\\"inline-block\\\",\\r\\n minHeight: \\\"1em\\\",\\r\\n backfaceVisibility: \\\"hidden\\\",\\r\\n margin: 0,\\r\\n padding: 0,\\r\\n border: 0,\\r\\n outline: 0,\\r\\n resize: \\\"none\\\",\\r\\n background: \\\"transparent\\\",\\r\\n overflow: \\\"hidden\\\",\\r\\n // must be specified because in dark mode canvas creates a stacking context\\r\\n zIndex: \\\"var(--zIndex-wysiwyg)\\\",\\r\\n wordBreak,\\r\\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\\r\\n whiteSpace,\\r\\n overflowWrap: \\\"break-word\\\"\\r\\n });\\r\\n updateWysiwygStyle();\\r\\n if (onChange) {\\r\\n editable.oninput = function () {\\r\\n // using scrollHeight here since we need to calculate\\r\\n // number of lines so cannot use editable.style.height\\r\\n // as that gets updated below\\r\\n const lines = editable.scrollHeight / approxLineHeight; // auto increase height only when lines > 1 so its\\r\\n // measured correctly and vertically alignes for\\r\\n // first line as well as setting height to \\\"auto\\\"\\r\\n // doubles the height as soon as user starts typing\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\\r\\n let height = \\\"auto\\\";\\r\\n if (lines === 2) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\\r\\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\\\"\\\\n\\\").length; // This is browser behaviour when setting height to \\\"auto\\\"\\r\\n // It sets the height needed for 2 lines even if actual\\r\\n // line count is 1 as mentioned above as well\\r\\n // hence reducing the height by half if actual line count is 1\\r\\n // so single line aligns vertically when deleting\\r\\n if (actualLineCount === 1) {\\r\\n height = `${editable.scrollHeight / 2}px`;\\r\\n }\\r\\n }\\r\\n editable.style.height = height;\\r\\n editable.style.height = `${editable.scrollHeight}px`;\\r\\n }\\r\\n onChange(normalizeText(editable.value));\\r\\n };\\r\\n }\\r\\n editable.onkeydown = function (event) {\\r\\n event.stopPropagation();\\r\\n if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\\r\\n }\\r\\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\\r\\n event.preventDefault();\\r\\n submittedViaKeyboard = true;\\r\\n handleSubmit();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\\r\\n event.preventDefault();\\r\\n if (event.isComposing || event.keyCode === 229) {\\r\\n return;\\r\\n }\\r\\n submittedViaKeyboard = true;\\r\\n handleSubmit();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB || event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] && (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT)) {\\r\\n event.preventDefault();\\r\\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\\r\\n outdent();\\r\\n }\\r\\n else {\\r\\n indent();\\r\\n } // We must send an input event to resize the element\\r\\n editable.dispatchEvent(new Event(\\\"input\\\"));\\r\\n }\\r\\n };\\r\\n const TAB_SIZE = 4;\\r\\n const TAB = \\\" \\\".repeat(TAB_SIZE);\\r\\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\\r\\n const indent = function () {\\r\\n const { selectionStart, selectionEnd } = editable;\\r\\n const linesStartIndices = getSelectedLinesStartIndices();\\r\\n let value = editable.value;\\r\\n linesStartIndices.forEach(function (startIndex) {\\r\\n const startValue = value.slice(0, startIndex);\\r\\n const endValue = value.slice(startIndex);\\r\\n value = `${startValue}${TAB}${endValue}`;\\r\\n });\\r\\n editable.value = value;\\r\\n editable.selectionStart = selectionStart + TAB_SIZE;\\r\\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\\r\\n };\\r\\n const outdent = function () {\\r\\n const { selectionStart, selectionEnd } = editable;\\r\\n const linesStartIndices = getSelectedLinesStartIndices();\\r\\n const removedTabs = [];\\r\\n let value = editable.value;\\r\\n linesStartIndices.forEach(function (startIndex) {\\r\\n const tabMatch = value.slice(startIndex, startIndex + TAB_SIZE).match(RE_LEADING_TAB);\\r\\n if (tabMatch) {\\r\\n const startValue = value.slice(0, startIndex);\\r\\n const endValue = value.slice(startIndex + tabMatch[0].length); // Delete a tab from the line\\r\\n value = `${startValue}${endValue}`;\\r\\n removedTabs.push(startIndex);\\r\\n }\\r\\n });\\r\\n editable.value = value;\\r\\n if (removedTabs.length) {\\r\\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\\r\\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\\r\\n }\\r\\n else {\\r\\n // If the cursor is before the first tab removed, ex:\\r\\n // Line| #1\\r\\n // Line #2\\r\\n // Lin|e #3\\r\\n // we should reset the selectionStart to his initial value.\\r\\n editable.selectionStart = selectionStart;\\r\\n }\\r\\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\\r\\n }\\r\\n };\\r\\n /**\\r\\n * @returns indeces of start positions of selected lines, in reverse order\\r\\n */\\r\\n const getSelectedLinesStartIndices = function () {\\r\\n let { selectionStart, selectionEnd, value } = editable; // chars before selectionStart on the same line\\r\\n const startOffset = value.slice(0, selectionStart).match(/[^\\\\n]*$/)[0].length; // put caret at the start of the line\\r\\n selectionStart = selectionStart - startOffset;\\r\\n const selected = value.slice(selectionStart, selectionEnd);\\r\\n return selected.split(\\\"\\\\n\\\").reduce(function (startIndices, line, idx, lines) {\\r\\n return startIndices.concat(idx ? // curr line index is prev line's start + prev line's length + \\\\n\\r\\n startIndices[idx - 1] + lines[idx - 1].length + 1 : // first selected line\\r\\n selectionStart);\\r\\n }, []).reverse();\\r\\n };\\r\\n const stopEvent = function (event) {\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\r\\n }; // using a state variable instead of passing it to the handleSubmit callback\\r\\n // so that we don't need to create separate a callback for event handlers\\r\\n let submittedViaKeyboard = false;\\r\\n const handleSubmit = function () {\\r\\n var _a, _b;\\r\\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\\r\\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\\r\\n // wysiwyg on update\\r\\n cleanup();\\r\\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\\r\\n if (!updateElement) {\\r\\n return;\\r\\n }\\r\\n let wrappedText = \\\"\\\";\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updateElement) && (updateElement === null || updateElement === void 0 ? void 0 : updateElement.containerId)) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\\r\\n if (container) {\\r\\n wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updateElement), container.width);\\r\\n if (updateElement.containerId) {\\r\\n const editorHeight = Number(editable.style.height.slice(0, -2));\\r\\n if (editable.value) {\\r\\n // Don't mutate if text is not updated\\r\\n if (initialText !== editable.value) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updateElement, {\\r\\n // vertically center align\\r\\n y: container.y + container.height / 2 - editorHeight / 2,\\r\\n height: editorHeight,\\r\\n width: Number(editable.style.width.slice(0, -2)),\\r\\n // preserve padding\\r\\n x: container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING,\\r\\n angle: container.angle\\r\\n });\\r\\n }\\r\\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\\r\\n if (!boundTextElementId || boundTextElementId !== element.id) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n boundElements: (container.boundElements || []).concat({\\r\\n type: \\\"text\\\",\\r\\n id: element.id\\r\\n })\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter(function (ele) {\\r\\n return ele.type !== \\\"text\\\";\\r\\n })\\r\\n });\\r\\n }\\r\\n }\\r\\n }\\r\\n }\\r\\n else {\\r\\n wrappedText = editable.value;\\r\\n }\\r\\n onSubmit({\\r\\n text: normalizeText(wrappedText),\\r\\n viaKeyboard: submittedViaKeyboard,\\r\\n originalText: editable.value\\r\\n });\\r\\n };\\r\\n const cleanup = function () {\\r\\n if (isDestroyed) {\\r\\n return;\\r\\n }\\r\\n isDestroyed = true; // remove events to ensure they don't late-fire\\r\\n editable.onblur = null;\\r\\n editable.oninput = null;\\r\\n editable.onkeydown = null;\\r\\n if (observer) {\\r\\n observer.disconnect();\\r\\n }\\r\\n window.removeEventListener(\\\"resize\\\", updateWysiwygStyle);\\r\\n window.removeEventListener(\\\"wheel\\\", stopEvent, true);\\r\\n window.removeEventListener(\\\"pointerdown\\\", onPointerDown);\\r\\n window.removeEventListener(\\\"pointerup\\\", bindBlurEvent);\\r\\n window.removeEventListener(\\\"blur\\\", handleSubmit);\\r\\n unbindUpdate();\\r\\n editable.remove();\\r\\n };\\r\\n const bindBlurEvent = function (event) {\\r\\n window.removeEventListener(\\\"pointerup\\\", bindBlurEvent); // Deferred so that the pointerdown that initiates the wysiwyg doesn't\\r\\n // trigger the blur on ensuing pointerup.\\r\\n // Also to handle cases such as picking a color which would trigger a blur\\r\\n // in that same tick.\\r\\n const target = event === null || event === void 0 ? void 0 : event.target;\\r\\n const isTargetColorPicker = target instanceof HTMLInputElement && target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\\r\\n setTimeout(function () {\\r\\n editable.onblur = handleSubmit;\\r\\n if (target && isTargetColorPicker) {\\r\\n target.onblur = function () {\\r\\n editable.focus();\\r\\n };\\r\\n } // case: clicking on the same property → no change → no update → no focus\\r\\n if (!isTargetColorPicker) {\\r\\n editable.focus();\\r\\n }\\r\\n });\\r\\n }; // prevent blur when changing properties from the menu\\r\\n const onPointerDown = function (event) {\\r\\n const isTargetColorPicker = event.target instanceof HTMLInputElement && event.target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\\r\\n if ((event.target instanceof HTMLElement || event.target instanceof SVGElement) && event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) && !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target) || isTargetColorPicker) {\\r\\n editable.onblur = null;\\r\\n window.addEventListener(\\\"pointerup\\\", bindBlurEvent); // handle edge-case where pointerup doesn't fire e.g. due to user\\r\\n // alt-tabbing away\\r\\n window.addEventListener(\\\"blur\\\", handleSubmit);\\r\\n }\\r\\n }; // handle updates of textElement properties of editing element\\r\\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element).addCallback(function () {\\r\\n var _a;\\r\\n updateWysiwygStyle();\\r\\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\\\".color-picker-input\\\"));\\r\\n if (!isColorPickerActive) {\\r\\n editable.focus();\\r\\n }\\r\\n }); // ---------------------------------------------------------------------------\\r\\n let isDestroyed = false; // select on init (focusing is done separately inside the bindBlurEvent()\\r\\n // because we need it to happen *after* the blur event from `pointerdown`)\\r\\n editable.select();\\r\\n bindBlurEvent(); // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\\r\\n // is preferred so we catch changes from host, where window may not resize.\\r\\n let observer = null;\\r\\n if (canvas && \\\"ResizeObserver\\\" in window) {\\r\\n observer = new window.ResizeObserver(function () {\\r\\n updateWysiwygStyle();\\r\\n });\\r\\n observer.observe(canvas);\\r\\n }\\r\\n else {\\r\\n window.addEventListener(\\\"resize\\\", updateWysiwygStyle);\\r\\n }\\r\\n window.addEventListener(\\\"pointerdown\\\", onPointerDown);\\r\\n window.addEventListener(\\\"wheel\\\", stopEvent, {\\r\\n passive: false,\\r\\n capture: true\\r\\n });\\r\\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\\\".excalidraw-textEditorContainer\\\").appendChild(editable);\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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dFd5c2l3eWcudHN4PzU3ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgaXNXcml0YWJsZUVsZW1lbnQsIGdldEZvbnRTdHJpbmcsIGdldEZvbnRGYW1pbHlTdHJpbmcsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgQk9VTkRfVEVYVF9QQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEFwcHJveExpbmVIZWlnaHQsIGdldEJvdW5kVGV4dEVsZW1lbnRJZCwgZ2V0Q29udGFpbmVyRWxlbWVudCwgd3JhcFRleHQgfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgYWN0aW9uRGVjcmVhc2VGb250U2l6ZSwgYWN0aW9uSW5jcmVhc2VGb250U2l6ZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0IC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpIC8vIG5vcm1hbGl6ZSBuZXdsaW5lc1xuICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIik7XG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gIGNvbnN0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldFRvcCxcbiAgICBvZmZzZXRMZWZ0XG4gIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gMTgwICogYW5nbGUgLyBNYXRoLlBJOyAvLyBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGllZCBieSAyIHRvIGFjY291bnQgZm9yIHRoZSBkaXZpc2lvbiBieSAyIG9mXG4gIC8vIHRoZSB3aG9sZSBleHByZXNzaW9uIGFmdGVyd2FyZHNcblxuICBsZXQgdHJhbnNsYXRlWCA9ICh3aWR0aCAtIG9mZnNldExlZnQgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgLSBvZmZzZXRUb3AgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkgLyAyO1xuXG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoIC0gb2Zmc2V0TGVmdCAqIDIpICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gKG1heEhlaWdodCAtIG9mZnNldFRvcCAqIDIpICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpZCxcbiAgICBhcHBTdGF0ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBvblN1Ym1pdCxcbiAgICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICAgIGFwcFxuICB9ID0gX3JlZjtcblxuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSBmdW5jdGlvbiAodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKSB7XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2VBbGwoJ1wiJywgXCJcIik7XG5cbiAgICBpZiAoZ2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgICBmb250RmFtaWx5OiB1cGRhdGVkRWxlbWVudC5mb250RmFtaWx5XG4gICAgfSkgIT09IGN1cnJlbnRGb250KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYCR7dXBkYXRlZEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDtcbiAgbGV0IGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuICBjb25zdCBpbml0aWFsVGV4dCA9IGVsZW1lbnQub3JpZ2luYWxUZXh0O1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGlkKTtcblxuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7IC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXRzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG5cbiAgICAgIGxldCBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKTsgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcblxuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIGhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7IC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcblxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIG1heEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICB3aWR0aCA9IG1heFdpZHRoOyAvLyBUaGUgY29vcmRpbmF0ZXMgb2YgdGV4dCBib3ggc2V0IGEgZGlzdGFuY2Ugb2ZcbiAgICAgICAgLy8gMzBweCB0byBwcmVzZXJ2ZSBwYWRkaW5nXG5cbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkc7IC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG5cbiAgICAgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihoZWlnaHQgLSBtYXhIZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgKyBkaWZmXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckhlaWdodCAmJiBoZWlnaHQgPCBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4obWF4SGVpZ2h0IC0gaGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZlxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB0ZXh0QWxpZ25cbiAgICAgIH0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0O1xuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQgPyBhcHByb3hMaW5lSGVpZ2h0IDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9IChhcHBTdGF0ZS53aWR0aCAtIDggLSAoKGFwcFN0YXRlLnNjcm9sbFggKyB1cGRhdGVkRWxlbWVudC54KSAqIGFwcFN0YXRlLnpvb20udmFsdWUgKyBhcHBTdGF0ZS56b29tLnRyYW5zbGF0aW9uLngpKSAvIGFwcFN0YXRlLnpvb20udmFsdWUgLSAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICBOdW1iZXIoZ2V0Q29tcHV0ZWRTdHlsZShleGNhbGlkcmF3Q29udGFpbmVyPy5wYXJlbnROb2RlKS5tYXJnaW5SaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgfSAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG5cblxuICAgICAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID0gKGFwcFN0YXRlLmhlaWdodCAtIHZpZXdwb3J0WSAtICggLy8gVGhlcmUgaXMgYSB+MTRweCBkaWZmZXJlbmNlIHdoaWNoIGtlZXBzIG9uIGluY3JlYXNpbmdcbiAgICAgIC8vIHdpdGggZXZlcnkgem9vbSBzdGVwIHdoZW4gb2Zmc2V0IHByZXNlbnQgaGVuY2UgSSBhbSBzdWJ0cmFjdGluZyBpdCBoZXJlXG4gICAgICAvLyBIb3dldmVyIHRoaXMgaXMgbm90IHRoZSBiZXN0IGZpeCBhbmQgYnJlYWtzIGluXG4gICAgICAvLyBmZXcgc2NlbmFyaW9zXG4gICAgICBhcHBTdGF0ZS5vZmZzZXRUb3AgPyAoYXBwU3RhdGUuem9vbS52YWx1ZSAqIDEwMCAtIDEwMCkgLyAxMCAqIDE0IDogMCkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGNvbnN0IGFuZ2xlID0gY29udGFpbmVyID8gY29udGFpbmVyLmFuZ2xlIDogdXBkYXRlZEVsZW1lbnQuYW5nbGU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0od2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgZWRpdG9yTWF4SGVpZ2h0KSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YFxuICAgICAgfSk7IC8vIEZvciBzb21lIHJlYXNvbiB1cGRhdGluZyBmb250IGF0dHJpYnV0ZSBkb2Vzbid0IHNldCBmb250IGZhbWlseVxuICAgICAgLy8gaGVuY2UgdXBkYXRpbmcgZm9udCBmYW1pbHkgZXhwbGljaXRseSBmb3IgdGVzdCBlbnZpcm9ubWVudFxuXG4gICAgICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlTdHJpbmcodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBlZGl0YWJsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKTtcbiAgZWRpdGFibGUuZGlyID0gXCJhdXRvXCI7XG4gIGVkaXRhYmxlLnRhYkluZGV4ID0gMDtcbiAgZWRpdGFibGUuZGF0YXNldC50eXBlID0gXCJ3eXNpd3lnXCI7IC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyBvbiBTYWZhcmlcblxuICBlZGl0YWJsZS53cmFwID0gXCJvZmZcIjtcbiAgZWRpdGFibGUuY2xhc3NMaXN0LmFkZChcImV4Y2FsaWRyYXctd3lzaXd5Z1wiKTtcbiAgbGV0IHdoaXRlU3BhY2UgPSBcInByZVwiO1xuICBsZXQgd29yZEJyZWFrID0gXCJub3JtYWxcIjtcblxuICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgd2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgICB3b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgfVxuXG4gIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgbWluSGVpZ2h0OiBcIjFlbVwiLFxuICAgIGJhY2tmYWNlVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBib3JkZXI6IDAsXG4gICAgb3V0bGluZTogMCxcbiAgICByZXNpemU6IFwibm9uZVwiLFxuICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICBvdmVyZmxvdzogXCJoaWRkZW5cIixcbiAgICAvLyBtdXN0IGJlIHNwZWNpZmllZCBiZWNhdXNlIGluIGRhcmsgbW9kZSBjYW52YXMgY3JlYXRlcyBhIHN0YWNraW5nIGNvbnRleHRcbiAgICB6SW5kZXg6IFwidmFyKC0tekluZGV4LXd5c2l3eWcpXCIsXG4gICAgd29yZEJyZWFrLFxuICAgIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyAoYHdoaXRlc3BhY2U6IG5vd3JhcGAgZG9lc24ndCB3b3JrIG9uIEZGKVxuICAgIHdoaXRlU3BhY2UsXG4gICAgb3ZlcmZsb3dXcmFwOiBcImJyZWFrLXdvcmRcIlxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIHVzaW5nIHNjcm9sbEhlaWdodCBoZXJlIHNpbmNlIHdlIG5lZWQgdG8gY2FsY3VsYXRlXG4gICAgICAvLyBudW1iZXIgb2YgbGluZXMgc28gY2Fubm90IHVzZSBlZGl0YWJsZS5zdHlsZS5oZWlnaHRcbiAgICAgIC8vIGFzIHRoYXQgZ2V0cyB1cGRhdGVkIGJlbG93XG4gICAgICBjb25zdCBsaW5lcyA9IGVkaXRhYmxlLnNjcm9sbEhlaWdodCAvIGFwcHJveExpbmVIZWlnaHQ7IC8vIGF1dG8gaW5jcmVhc2UgaGVpZ2h0IG9ubHkgd2hlbiBsaW5lcyAgPiAxIHNvIGl0c1xuICAgICAgLy8gbWVhc3VyZWQgY29ycmVjdGx5IGFuZCB2ZXJ0aWNhbGx5IGFsaWduZXMgZm9yXG4gICAgICAvLyBmaXJzdCBsaW5lIGFzIHdlbGwgYXMgc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgIC8vIGRvdWJsZXMgdGhlIGhlaWdodCBhcyBzb29uIGFzIHVzZXIgc3RhcnRzIHR5cGluZ1xuXG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpICYmIGxpbmVzID4gMSkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gXCJhdXRvXCI7XG5cbiAgICAgICAgaWYgKGxpbmVzID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxMaW5lQ291bnQgPSB3cmFwVGV4dChlZGl0YWJsZS52YWx1ZSwgZ2V0Rm9udFN0cmluZyhlbGVtZW50KSwgY29udGFpbmVyLndpZHRoKS5zcGxpdChcIlxcblwiKS5sZW5ndGg7IC8vIFRoaXMgaXMgYnJvd3NlciBiZWhhdmlvdXIgd2hlbiBzZXR0aW5nIGhlaWdodCB0byBcImF1dG9cIlxuICAgICAgICAgIC8vIEl0IHNldHMgdGhlIGhlaWdodCBuZWVkZWQgZm9yIDIgbGluZXMgZXZlbiBpZiBhY3R1YWxcbiAgICAgICAgICAvLyBsaW5lIGNvdW50IGlzIDEgYXMgbWVudGlvbmVkIGFib3ZlIGFzIHdlbGxcbiAgICAgICAgICAvLyBoZW5jZSByZWR1Y2luZyB0aGUgaGVpZ2h0IGJ5IGhhbGYgaWYgYWN0dWFsIGxpbmUgY291bnQgaXMgMVxuICAgICAgICAgIC8vIHNvIHNpbmdsZSBsaW5lIGFsaWducyB2ZXJ0aWNhbGx5IHdoZW4gZGVsZXRpbmdcblxuICAgICAgICAgIGlmIChhY3R1YWxMaW5lQ291bnQgPT09IDEpIHtcbiAgICAgICAgICAgIGhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodCAvIDJ9cHhgO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgIH1cblxuICAgICAgb25DaGFuZ2Uobm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSkpO1xuICAgIH07XG4gIH1cblxuICBlZGl0YWJsZS5vbmtleWRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIGlmIChhY3Rpb25EZWNyZWFzZUZvbnRTaXplLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlY3JlYXNlRm9udFNpemUpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uSW5jcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25JbmNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUiAmJiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLlRBQiB8fCBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJiAoZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUIHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfUklHSFQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUKSB7XG4gICAgICAgIG91dGRlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCgpO1xuICAgICAgfSAvLyBXZSBtdXN0IHNlbmQgYW4gaW5wdXQgZXZlbnQgdG8gcmVzaXplIHRoZSBlbGVtZW50XG5cblxuICAgICAgZWRpdGFibGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFRBQl9TSVpFID0gNDtcbiAgY29uc3QgVEFCID0gXCIgXCIucmVwZWF0KFRBQl9TSVpFKTtcbiAgY29uc3QgUkVfTEVBRElOR19UQUIgPSBuZXcgUmVnRXhwKGBeIHsxLCR7VEFCX1NJWkV9fWApO1xuXG4gIGNvbnN0IGluZGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgIHNlbGVjdGlvbkVuZFxuICAgIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKGZ1bmN0aW9uIChzdGFydEluZGV4KSB7XG4gICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXgpO1xuICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7VEFCfSR7ZW5kVmFsdWV9YDtcbiAgICB9KTtcbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgKyBUQUJfU0laRTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQgKyBUQUJfU0laRSAqIGxpbmVzU3RhcnRJbmRpY2VzLmxlbmd0aDtcbiAgfTtcblxuICBjb25zdCBvdXRkZW50ID0gZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgc2VsZWN0aW9uRW5kXG4gICAgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuICAgIGNvbnN0IHJlbW92ZWRUYWJzID0gW107XG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgICAgY29uc3QgdGFiTWF0Y2ggPSB2YWx1ZS5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgVEFCX1NJWkUpLm1hdGNoKFJFX0xFQURJTkdfVEFCKTtcblxuICAgICAgaWYgKHRhYk1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4ICsgdGFiTWF0Y2hbMF0ubGVuZ3RoKTsgLy8gRGVsZXRlIGEgdGFiIGZyb20gdGhlIGxpbmVcblxuICAgICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtlbmRWYWx1ZX1gO1xuICAgICAgICByZW1vdmVkVGFicy5wdXNoKHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAocmVtb3ZlZFRhYnMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSkge1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IE1hdGgubWF4KHNlbGVjdGlvblN0YXJ0IC0gVEFCX1NJWkUsIHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCB0YWIgcmVtb3ZlZCwgZXg6XG4gICAgICAgIC8vIExpbmV8ICMxXG4gICAgICAgIC8vICAgICBMaW5lICMyXG4gICAgICAgIC8vIExpbnxlICMzXG4gICAgICAgIC8vIHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0aW9uU3RhcnQgdG8gaGlzIGluaXRpYWwgdmFsdWUuXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB9XG5cbiAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgLSBUQUJfU0laRSAqIHJlbW92ZWRUYWJzLmxlbmd0aCk7XG4gICAgfVxuICB9O1xuICAvKipcbiAgICogQHJldHVybnMgaW5kZWNlcyBvZiBzdGFydCBwb3NpdGlvbnMgb2Ygc2VsZWN0ZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG5cblxuICBjb25zdCBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCB7XG4gICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgIHNlbGVjdGlvbkVuZCxcbiAgICAgIHZhbHVlXG4gICAgfSA9IGVkaXRhYmxlOyAvLyBjaGFycyBiZWZvcmUgc2VsZWN0aW9uU3RhcnQgb24gdGhlIHNhbWUgbGluZVxuXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1teXFxuXSokLylbMF0ubGVuZ3RoOyAvLyBwdXQgY2FyZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG5cbiAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0IC0gc3RhcnRPZmZzZXQ7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB2YWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcbiAgICByZXR1cm4gc2VsZWN0ZWQuc3BsaXQoXCJcXG5cIikucmVkdWNlKGZ1bmN0aW9uIChzdGFydEluZGljZXMsIGxpbmUsIGlkeCwgbGluZXMpIHtcbiAgICAgIHJldHVybiBzdGFydEluZGljZXMuY29uY2F0KGlkeCA/IC8vIGN1cnIgbGluZSBpbmRleCBpcyBwcmV2IGxpbmUncyBzdGFydCArIHByZXYgbGluZSdzIGxlbmd0aCArIFxcblxuICAgICAgc3RhcnRJbmRpY2VzW2lkeCAtIDFdICsgbGluZXNbaWR4IC0gMV0ubGVuZ3RoICsgMSA6IC8vIGZpcnN0IHNlbGVjdGVkIGxpbmVcbiAgICAgIHNlbGVjdGlvblN0YXJ0KTtcbiAgICB9LCBbXSkucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07IC8vIHVzaW5nIGEgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IHRvIHRoZSBoYW5kbGVTdWJtaXQgY2FsbGJhY2tcbiAgLy8gc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBhIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGVyc1xuXG5cbiAgbGV0IHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gZmFsc2U7XG5cbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gZnVuY3Rpb24gKCkge1xuICAgIC8vIGNsZWFudXAgbXVzdCBiZSBydW4gYmVmb3JlIG9uU3VibWl0IG90aGVyd2lzZSB3aGVuIGFwcCBibHVycyB0aGUgd3lzaXd5Z1xuICAgIC8vIGl0J2QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agb2YgYmx1cuKGkm9uU3VibWl0IGFmdGVyIHdlIHJlLWZvY3VzIHRoZVxuICAgIC8vIHd5c2l3eWcgb24gdXBkYXRlXG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmlkKTtcblxuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCB3cmFwcGVkVGV4dCA9IFwiXCI7XG5cbiAgICBpZiAoaXNUZXh0RWxlbWVudCh1cGRhdGVFbGVtZW50KSAmJiB1cGRhdGVFbGVtZW50Py5jb250YWluZXJJZCkge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVFbGVtZW50KTtcblxuICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICB3cmFwcGVkVGV4dCA9IHdyYXBUZXh0KGVkaXRhYmxlLnZhbHVlLCBnZXRGb250U3RyaW5nKHVwZGF0ZUVsZW1lbnQpLCBjb250YWluZXIud2lkdGgpO1xuXG4gICAgICAgIGlmICh1cGRhdGVFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuXG4gICAgICAgICAgaWYgKGVkaXRhYmxlLnZhbHVlKSB7XG4gICAgICAgICAgICAvLyBEb24ndCBtdXRhdGUgaWYgdGV4dCBpcyBub3QgdXBkYXRlZFxuICAgICAgICAgICAgaWYgKGluaXRpYWxUZXh0ICE9PSBlZGl0YWJsZS52YWx1ZSkge1xuICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZUVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICAvLyB2ZXJ0aWNhbGx5IGNlbnRlciBhbGlnblxuICAgICAgICAgICAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIgLSBlZGl0b3JIZWlnaHQgLyAyLFxuICAgICAgICAgICAgICAgIGhlaWdodDogZWRpdG9ySGVpZ2h0LFxuICAgICAgICAgICAgICAgIHdpZHRoOiBOdW1iZXIoZWRpdGFibGUuc3R5bGUud2lkdGguc2xpY2UoMCwgLTIpKSxcbiAgICAgICAgICAgICAgICAvLyBwcmVzZXJ2ZSBwYWRkaW5nXG4gICAgICAgICAgICAgICAgeDogY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkcsXG4gICAgICAgICAgICAgICAgYW5nbGU6IGNvbnRhaW5lci5hbmdsZVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgICAgIGlmICghYm91bmRUZXh0RWxlbWVudElkIHx8IGJvdW5kVGV4dEVsZW1lbnRJZCAhPT0gZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWRcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihmdW5jdGlvbiAoZWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZS50eXBlICE9PSBcInRleHRcIjtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB3cmFwcGVkVGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIH1cblxuICAgIG9uU3VibWl0KHtcbiAgICAgIHRleHQ6IG5vcm1hbGl6ZVRleHQod3JhcHBlZFRleHQpLFxuICAgICAgdmlhS2V5Ym9hcmQ6IHN1Ym1pdHRlZFZpYUtleWJvYXJkLFxuICAgICAgb3JpZ2luYWxUZXh0OiBlZGl0YWJsZS52YWx1ZVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFudXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaXNEZXN0cm95ZWQgPSB0cnVlOyAvLyByZW1vdmUgZXZlbnRzIHRvIGVuc3VyZSB0aGV5IGRvbid0IGxhdGUtZmlyZVxuXG4gICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gbnVsbDtcbiAgICBlZGl0YWJsZS5vbmtleWRvd24gPSBudWxsO1xuXG4gICAgaWYgKG9ic2VydmVyKSB7XG4gICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgfVxuXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwgdHJ1ZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcbiAgICB1bmJpbmRVcGRhdGUoKTtcbiAgICBlZGl0YWJsZS5yZW1vdmUoKTtcbiAgfTtcblxuICBjb25zdCBiaW5kQmx1ckV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7IC8vIERlZmVycmVkIHNvIHRoYXQgdGhlIHBvaW50ZXJkb3duIHRoYXQgaW5pdGlhdGVzIHRoZSB3eXNpd3lnIGRvZXNuJ3RcbiAgICAvLyB0cmlnZ2VyIHRoZSBibHVyIG9uIGVuc3VpbmcgcG9pbnRlcnVwLlxuICAgIC8vIEFsc28gdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMgcGlja2luZyBhIGNvbG9yIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBibHVyXG4gICAgLy8gaW4gdGhhdCBzYW1lIHRpY2suXG5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudD8udGFyZ2V0O1xuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPSB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIHRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJiBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gaGFuZGxlU3VibWl0O1xuXG4gICAgICBpZiAodGFyZ2V0ICYmIGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgdGFyZ2V0Lm9uYmx1ciA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgfSAvLyBjYXNlOiBjbGlja2luZyBvbiB0aGUgc2FtZSBwcm9wZXJ0eSDihpIgbm8gY2hhbmdlIOKGkiBubyB1cGRhdGUg4oaSIG5vIGZvY3VzXG5cblxuICAgICAgaWYgKCFpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07IC8vIHByZXZlbnQgYmx1ciB3aGVuIGNoYW5naW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgbWVudVxuXG5cbiAgY29uc3Qgb25Qb2ludGVyRG93biA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPSBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGV2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJiBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpO1xuXG4gICAgaWYgKChldmVudC50YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCB8fCBldmVudC50YXJnZXQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSAmJiBldmVudC50YXJnZXQuY2xvc2VzdChgLiR7Q0xBU1NFUy5TSEFQRV9BQ1RJT05TX01FTlV9YCkgJiYgIWlzV3JpdGFibGVFbGVtZW50KGV2ZW50LnRhcmdldCkgfHwgaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpOyAvLyBoYW5kbGUgZWRnZS1jYXNlIHdoZXJlIHBvaW50ZXJ1cCBkb2Vzbid0IGZpcmUgZS5nLiBkdWUgdG8gdXNlclxuICAgICAgLy8gYWx0LXRhYmJpbmcgYXdheVxuXG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcbiAgICB9XG4gIH07IC8vIGhhbmRsZSB1cGRhdGVzIG9mIHRleHRFbGVtZW50IHByb3BlcnRpZXMgb2YgZWRpdGluZyBlbGVtZW50XG5cblxuICBjb25zdCB1bmJpbmRVcGRhdGUgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KS5hZGRDYWxsYmFjayhmdW5jdGlvbiAoKSB7XG4gICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgY29uc3QgaXNDb2xvclBpY2tlckFjdGl2ZSA9ICEhZG9jdW1lbnQuYWN0aXZlRWxlbWVudD8uY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIik7XG5cbiAgICBpZiAoIWlzQ29sb3JQaWNrZXJBY3RpdmUpIHtcbiAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgfVxuICB9KTsgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgbGV0IGlzRGVzdHJveWVkID0gZmFsc2U7IC8vIHNlbGVjdCBvbiBpbml0IChmb2N1c2luZyBpcyBkb25lIHNlcGFyYXRlbHkgaW5zaWRlIHRoZSBiaW5kQmx1ckV2ZW50KClcbiAgLy8gYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGhhcHBlbiAqYWZ0ZXIqIHRoZSBibHVyIGV2ZW50IGZyb20gYHBvaW50ZXJkb3duYClcblxuICBlZGl0YWJsZS5zZWxlY3QoKTtcbiAgYmluZEJsdXJFdmVudCgpOyAvLyByZXBvc2l0aW9uIHd5c2l3eWcgaW4gY2FzZSBvZiBjYW52YXMgaXMgcmVzaXplZC4gVXNpbmcgUmVzaXplT2JzZXJ2ZXJcbiAgLy8gaXMgcHJlZmVycmVkIHNvIHdlIGNhdGNoIGNoYW5nZXMgZnJvbSBob3N0LCB3aGVyZSB3aW5kb3cgbWF5IG5vdCByZXNpemUuXG5cbiAgbGV0IG9ic2VydmVyID0gbnVsbDtcblxuICBpZiAoY2FudmFzICYmIFwiUmVzaXplT2JzZXJ2ZXJcIiBpbiB3aW5kb3cpIHtcbiAgICBvYnNlcnZlciA9IG5ldyB3aW5kb3cuUmVzaXplT2JzZXJ2ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSk7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShjYW52YXMpO1xuICB9IGVsc2Uge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gIH1cblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIndoZWVsXCIsIHN0b3BFdmVudCwge1xuICAgIHBhc3NpdmU6IGZhbHNlLFxuICAgIGNhcHR1cmU6IHRydWVcbiAgfSk7XG4gIGV4Y2FsaWRyYXdDb250YWluZXI/LnF1ZXJ5U2VsZWN0b3IoXCIuZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIpLmFwcGVuZENoaWxkKGVkaXRhYmxlKTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../element/textWysiwyg.tsx?");
2680
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"textWysiwyg\\\": () => (/* binding */ textWysiwyg)\\n/* harmony export */ });\\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \\\"../../keys.ts\\\");\\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \\\"../../utils.ts\\\");\\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \\\"../../scene/Scene.ts\\\");\\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \\\"../../element/textElement.ts\\\");\\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \\\"../../actions/actionProperties.tsx\\\");\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst normalizeText = function (text) {\\r\\n return text // replace tabs with spaces so they render and measure correctly\\r\\n .replace(/\\\\t/g, \\\" \\\") // normalize newlines\\r\\n .replace(/\\\\r?\\\\n|\\\\r/g, \\\"\\\\n\\\");\\r\\n};\\r\\nconst getTransform = function (width, height, angle, appState, maxWidth, maxHeight) {\\r\\n const { zoom, offsetTop, offsetLeft } = appState;\\r\\n const degree = 180 * angle / Math.PI; // offsets must be multiplied by 2 to account for the division by 2 of\\r\\n // the whole expression afterwards\\r\\n let translateX = (width - offsetLeft * 2) * (zoom.value - 1) / 2;\\r\\n let translateY = (height - offsetTop * 2) * (zoom.value - 1) / 2;\\r\\n if (width > maxWidth && zoom.value !== 1) {\\r\\n translateX = (maxWidth - offsetLeft * 2) * (zoom.value - 1) / 2;\\r\\n }\\r\\n if (height > maxHeight && zoom.value !== 1) {\\r\\n translateY = (maxHeight - offsetTop * 2) * (zoom.value - 1) / 2;\\r\\n }\\r\\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\\r\\n};\\r\\nconst textWysiwyg = function (_ref) {\\r\\n let { id, appState, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app } = _ref;\\r\\n const textPropertiesUpdated = function (updatedElement, editable) {\\r\\n const currentFont = editable.style.fontFamily.replaceAll('\\\"', \\\"\\\");\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({\\r\\n fontFamily: updatedElement.fontFamily\\r\\n }) !== currentFont) {\\r\\n return true;\\r\\n }\\r\\n if (`${updatedElement.fontSize}px` !== editable.style.fontSize) {\\r\\n return true;\\r\\n }\\r\\n return false;\\r\\n };\\r\\n let originalContainerHeight;\\r\\n let approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element));\\r\\n const updateWysiwygStyle = function () {\\r\\n var _a;\\r\\n const updatedElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\\r\\n if (updatedElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedElement)) {\\r\\n let coordX = updatedElement.x;\\r\\n let coordY = updatedElement.y;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedElement);\\r\\n let maxWidth = updatedElement.width;\\r\\n let maxHeight = updatedElement.height;\\r\\n let width = updatedElement.width; // Set to element height by default since thats\\r\\n // what is going to be used for unbounded text\\r\\n let height = updatedElement.height;\\r\\n if (container && updatedElement.containerId) {\\r\\n const propertiesUpdated = textPropertiesUpdated(updatedElement, editable); // using editor.style.height to get the accurate height of text editor\\r\\n const editorHeight = Number(editable.style.height.slice(0, -2));\\r\\n if (editorHeight > 0) {\\r\\n height = editorHeight;\\r\\n }\\r\\n if (propertiesUpdated) {\\r\\n approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement));\\r\\n originalContainerHeight = container.height; // update height of the editor after properties updated\\r\\n height = updatedElement.height;\\r\\n }\\r\\n if (!originalContainerHeight) {\\r\\n originalContainerHeight = container.height;\\r\\n }\\r\\n maxWidth = container.width - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n maxHeight = container.height - _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING * 2;\\r\\n width = maxWidth; // The coordinates of text box set a distance of\\r\\n // 30px to preserve padding\\r\\n coordX = container.x + _constants__WEBPACK_IMPORTED_MODULE_4__.BOUND_TEXT_PADDING; // autogrow container height if text exceeds\\r\\n if (height > maxHeight) {\\r\\n const diff = Math.min(height - maxHeight, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n height: container.height + diff\\r\\n });\\r\\n return;\\r\\n }\\r\\n else if ( // autoshrink container height until original container height\\r\\n // is reached when text is removed\\r\\n container.height > originalContainerHeight && height < maxHeight) {\\r\\n const diff = Math.min(maxHeight - height, approxLineHeight);\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n height: container.height - diff\\r\\n });\\r\\n } // Start pushing text upward until a diff of 30px (padding)\\r\\n // is reached\\r\\n else {\\r\\n // vertically center align the text\\r\\n coordY = container.y + container.height / 2 - height / 2;\\r\\n }\\r\\n }\\r\\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\\r\\n const { textAlign } = updatedElement;\\r\\n editable.value = updatedElement.originalText;\\r\\n const lines = updatedElement.originalText.split(\\\"\\\\n\\\");\\r\\n const lineHeight = updatedElement.containerId ? approxLineHeight : updatedElement.height / lines.length;\\r\\n if (!container) {\\r\\n maxWidth = (appState.width - 8 - ((appState.scrollX + updatedElement.x) * appState.zoom.value + appState.zoom.translation.x)) / appState.zoom.value - // margin-right of parent if any\\r\\n Number(getComputedStyle(excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.parentNode).marginRight.slice(0, -2));\\r\\n } // Make sure text editor height doesn't go beyond viewport\\r\\n const editorMaxHeight = (appState.height - viewportY - ( // There is a ~14px difference which keeps on increasing\\r\\n // with every zoom step when offset present hence I am subtracting it here\\r\\n // However this is not the best fix and breaks in\\r\\n // few scenarios\\r\\n appState.offsetTop ? (appState.zoom.value * 100 - 100) / 10 * 14 : 0)) / appState.zoom.value;\\r\\n const angle = container ? container.angle : updatedElement.angle;\\r\\n Object.assign(editable.style, {\\r\\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedElement),\\r\\n // must be defined *after* font ¯\\\\_(ツ)_/¯\\r\\n lineHeight: `${lineHeight}px`,\\r\\n width: `${width}px`,\\r\\n height: `${height}px`,\\r\\n left: `${viewportX}px`,\\r\\n top: `${viewportY}px`,\\r\\n transform: getTransform(width, height, angle, appState, maxWidth, editorMaxHeight),\\r\\n textAlign,\\r\\n color: updatedElement.strokeColor,\\r\\n opacity: updatedElement.opacity / 100,\\r\\n filter: \\\"var(--theme-filter)\\\",\\r\\n maxWidth: `${maxWidth}px`,\\r\\n maxHeight: `${editorMaxHeight}px`\\r\\n }); // For some reason updating font attribute doesn't set font family\\r\\n // hence updating font family explicitly for test environment\\r\\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\\r\\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedElement);\\r\\n }\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedElement, {\\r\\n x: coordX,\\r\\n y: coordY\\r\\n });\\r\\n }\\r\\n };\\r\\n const editable = document.createElement(\\\"textarea\\\");\\r\\n editable.dir = \\\"auto\\\";\\r\\n editable.tabIndex = 0;\\r\\n editable.dataset.type = \\\"wysiwyg\\\"; // prevent line wrapping on Safari\\r\\n editable.wrap = \\\"off\\\";\\r\\n editable.classList.add(\\\"excalidraw-wysiwyg\\\");\\r\\n let whiteSpace = \\\"pre\\\";\\r\\n let wordBreak = \\\"normal\\\";\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\\r\\n whiteSpace = \\\"pre-wrap\\\";\\r\\n wordBreak = \\\"break-word\\\";\\r\\n }\\r\\n Object.assign(editable.style, {\\r\\n position: \\\"absolute\\\",\\r\\n display: \\\"inline-block\\\",\\r\\n minHeight: \\\"1em\\\",\\r\\n backfaceVisibility: \\\"hidden\\\",\\r\\n margin: 0,\\r\\n padding: 0,\\r\\n border: 0,\\r\\n outline: 0,\\r\\n resize: \\\"none\\\",\\r\\n background: \\\"transparent\\\",\\r\\n overflow: \\\"hidden\\\",\\r\\n // must be specified because in dark mode canvas creates a stacking context\\r\\n zIndex: \\\"var(--zIndex-wysiwyg)\\\",\\r\\n wordBreak,\\r\\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\\r\\n whiteSpace,\\r\\n overflowWrap: \\\"break-word\\\"\\r\\n });\\r\\n updateWysiwygStyle();\\r\\n if (onChange) {\\r\\n editable.oninput = function () {\\r\\n // using scrollHeight here since we need to calculate\\r\\n // number of lines so cannot use editable.style.height\\r\\n // as that gets updated below\\r\\n const lines = editable.scrollHeight / approxLineHeight; // auto increase height only when lines > 1 so its\\r\\n // measured correctly and vertically alignes for\\r\\n // first line as well as setting height to \\\"auto\\\"\\r\\n // doubles the height as soon as user starts typing\\r\\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\\r\\n let height = \\\"auto\\\";\\r\\n if (lines === 2) {\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\\r\\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(element), container.width).split(\\\"\\\\n\\\").length; // This is browser behaviour when setting height to \\\"auto\\\"\\r\\n // It sets the height needed for 2 lines even if actual\\r\\n // line count is 1 as mentioned above as well\\r\\n // hence reducing the height by half if actual line count is 1\\r\\n // so single line aligns vertically when deleting\\r\\n if (actualLineCount === 1) {\\r\\n height = `${editable.scrollHeight / 2}px`;\\r\\n }\\r\\n }\\r\\n editable.style.height = height;\\r\\n editable.style.height = `${editable.scrollHeight}px`;\\r\\n }\\r\\n onChange(normalizeText(editable.value));\\r\\n };\\r\\n }\\r\\n editable.onkeydown = function (event) {\\r\\n event.stopPropagation();\\r\\n if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\\r\\n }\\r\\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\\r\\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\\r\\n event.preventDefault();\\r\\n submittedViaKeyboard = true;\\r\\n handleSubmit();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\\r\\n event.preventDefault();\\r\\n if (event.isComposing || event.keyCode === 229) {\\r\\n return;\\r\\n }\\r\\n submittedViaKeyboard = true;\\r\\n handleSubmit();\\r\\n }\\r\\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB || event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] && (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT)) {\\r\\n event.preventDefault();\\r\\n if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\\r\\n outdent();\\r\\n }\\r\\n else {\\r\\n indent();\\r\\n } // We must send an input event to resize the element\\r\\n editable.dispatchEvent(new Event(\\\"input\\\"));\\r\\n }\\r\\n };\\r\\n const TAB_SIZE = 4;\\r\\n const TAB = \\\" \\\".repeat(TAB_SIZE);\\r\\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\\r\\n const indent = function () {\\r\\n const { selectionStart, selectionEnd } = editable;\\r\\n const linesStartIndices = getSelectedLinesStartIndices();\\r\\n let value = editable.value;\\r\\n linesStartIndices.forEach(function (startIndex) {\\r\\n const startValue = value.slice(0, startIndex);\\r\\n const endValue = value.slice(startIndex);\\r\\n value = `${startValue}${TAB}${endValue}`;\\r\\n });\\r\\n editable.value = value;\\r\\n editable.selectionStart = selectionStart + TAB_SIZE;\\r\\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\\r\\n };\\r\\n const outdent = function () {\\r\\n const { selectionStart, selectionEnd } = editable;\\r\\n const linesStartIndices = getSelectedLinesStartIndices();\\r\\n const removedTabs = [];\\r\\n let value = editable.value;\\r\\n linesStartIndices.forEach(function (startIndex) {\\r\\n const tabMatch = value.slice(startIndex, startIndex + TAB_SIZE).match(RE_LEADING_TAB);\\r\\n if (tabMatch) {\\r\\n const startValue = value.slice(0, startIndex);\\r\\n const endValue = value.slice(startIndex + tabMatch[0].length); // Delete a tab from the line\\r\\n value = `${startValue}${endValue}`;\\r\\n removedTabs.push(startIndex);\\r\\n }\\r\\n });\\r\\n editable.value = value;\\r\\n if (removedTabs.length) {\\r\\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\\r\\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\\r\\n }\\r\\n else {\\r\\n // If the cursor is before the first tab removed, ex:\\r\\n // Line| #1\\r\\n // Line #2\\r\\n // Lin|e #3\\r\\n // we should reset the selectionStart to his initial value.\\r\\n editable.selectionStart = selectionStart;\\r\\n }\\r\\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\\r\\n }\\r\\n };\\r\\n /**\\r\\n * @returns indeces of start positions of selected lines, in reverse order\\r\\n */\\r\\n const getSelectedLinesStartIndices = function () {\\r\\n let { selectionStart, selectionEnd, value } = editable; // chars before selectionStart on the same line\\r\\n const startOffset = value.slice(0, selectionStart).match(/[^\\\\n]*$/)[0].length; // put caret at the start of the line\\r\\n selectionStart = selectionStart - startOffset;\\r\\n const selected = value.slice(selectionStart, selectionEnd);\\r\\n return selected.split(\\\"\\\\n\\\").reduce(function (startIndices, line, idx, lines) {\\r\\n return startIndices.concat(idx ? // curr line index is prev line's start + prev line's length + \\\\n\\r\\n startIndices[idx - 1] + lines[idx - 1].length + 1 : // first selected line\\r\\n selectionStart);\\r\\n }, []).reverse();\\r\\n };\\r\\n const stopEvent = function (event) {\\r\\n event.preventDefault();\\r\\n event.stopPropagation();\\r\\n }; // using a state variable instead of passing it to the handleSubmit callback\\r\\n // so that we don't need to create separate a callback for event handlers\\r\\n let submittedViaKeyboard = false;\\r\\n const handleSubmit = function () {\\r\\n var _a, _b;\\r\\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\\r\\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\\r\\n // wysiwyg on update\\r\\n cleanup();\\r\\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\\r\\n if (!updateElement) {\\r\\n return;\\r\\n }\\r\\n let text = editable.value;\\r\\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\\r\\n if (container) {\\r\\n text = updateElement.text;\\r\\n if (editable.value) {\\r\\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\\r\\n if (!boundTextElementId || boundTextElementId !== element.id) {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n boundElements: (container.boundElements || []).concat({\\r\\n type: \\\"text\\\",\\r\\n id: element.id\\r\\n })\\r\\n });\\r\\n }\\r\\n }\\r\\n else {\\r\\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\\r\\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter(function (ele) {\\r\\n return !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele);\\r\\n })\\r\\n });\\r\\n }\\r\\n }\\r\\n onSubmit({\\r\\n text,\\r\\n viaKeyboard: submittedViaKeyboard,\\r\\n originalText: editable.value\\r\\n });\\r\\n };\\r\\n const cleanup = function () {\\r\\n if (isDestroyed) {\\r\\n return;\\r\\n }\\r\\n isDestroyed = true; // remove events to ensure they don't late-fire\\r\\n editable.onblur = null;\\r\\n editable.oninput = null;\\r\\n editable.onkeydown = null;\\r\\n if (observer) {\\r\\n observer.disconnect();\\r\\n }\\r\\n window.removeEventListener(\\\"resize\\\", updateWysiwygStyle);\\r\\n window.removeEventListener(\\\"wheel\\\", stopEvent, true);\\r\\n window.removeEventListener(\\\"pointerdown\\\", onPointerDown);\\r\\n window.removeEventListener(\\\"pointerup\\\", bindBlurEvent);\\r\\n window.removeEventListener(\\\"blur\\\", handleSubmit);\\r\\n unbindUpdate();\\r\\n editable.remove();\\r\\n };\\r\\n const bindBlurEvent = function (event) {\\r\\n window.removeEventListener(\\\"pointerup\\\", bindBlurEvent); // Deferred so that the pointerdown that initiates the wysiwyg doesn't\\r\\n // trigger the blur on ensuing pointerup.\\r\\n // Also to handle cases such as picking a color which would trigger a blur\\r\\n // in that same tick.\\r\\n const target = event === null || event === void 0 ? void 0 : event.target;\\r\\n const isTargetColorPicker = target instanceof HTMLInputElement && target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\\r\\n setTimeout(function () {\\r\\n editable.onblur = handleSubmit;\\r\\n if (target && isTargetColorPicker) {\\r\\n target.onblur = function () {\\r\\n editable.focus();\\r\\n };\\r\\n } // case: clicking on the same property → no change → no update → no focus\\r\\n if (!isTargetColorPicker) {\\r\\n editable.focus();\\r\\n }\\r\\n });\\r\\n }; // prevent blur when changing properties from the menu\\r\\n const onPointerDown = function (event) {\\r\\n const isTargetColorPicker = event.target instanceof HTMLInputElement && event.target.closest(\\\".color-picker-input\\\") && (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\\r\\n if ((event.target instanceof HTMLElement || event.target instanceof SVGElement) && event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) && !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target) || isTargetColorPicker) {\\r\\n editable.onblur = null;\\r\\n window.addEventListener(\\\"pointerup\\\", bindBlurEvent); // handle edge-case where pointerup doesn't fire e.g. due to user\\r\\n // alt-tabbing away\\r\\n window.addEventListener(\\\"blur\\\", handleSubmit);\\r\\n }\\r\\n }; // handle updates of textElement properties of editing element\\r\\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\\\"default\\\"].getScene(element).addCallback(function () {\\r\\n var _a;\\r\\n updateWysiwygStyle();\\r\\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\\\".color-picker-input\\\"));\\r\\n if (!isColorPickerActive) {\\r\\n editable.focus();\\r\\n }\\r\\n }); // ---------------------------------------------------------------------------\\r\\n let isDestroyed = false; // select on init (focusing is done separately inside the bindBlurEvent()\\r\\n // because we need it to happen *after* the blur event from `pointerdown`)\\r\\n editable.select();\\r\\n bindBlurEvent(); // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\\r\\n // is preferred so we catch changes from host, where window may not resize.\\r\\n let observer = null;\\r\\n if (canvas && \\\"ResizeObserver\\\" in window) {\\r\\n observer = new window.ResizeObserver(function () {\\r\\n updateWysiwygStyle();\\r\\n });\\r\\n observer.observe(canvas);\\r\\n }\\r\\n else {\\r\\n window.addEventListener(\\\"resize\\\", updateWysiwygStyle);\\r\\n }\\r\\n window.addEventListener(\\\"pointerdown\\\", onPointerDown);\\r\\n window.addEventListener(\\\"wheel\\\", stopEvent, {\\r\\n passive: false,\\r\\n capture: true\\r\\n });\\r\\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\\\".excalidraw-textEditorContainer\\\").appendChild(editable);\\r\\n};\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3guanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQXNDO0FBQ3NEO0FBQ3pEO0FBQzhCO0FBQ047QUFDWDtBQUMwRDtBQUNiO0FBRTdGLE1BQU0sYUFBYSxHQUFHLFVBQVUsSUFBSTtJQUNsQyxPQUFPLElBQUksQ0FBQyxnRUFBZ0U7U0FDM0UsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQyxxQkFBcUI7U0FDaEQsT0FBTyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxVQUFVLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUztJQUNoRixNQUFNLEVBQ0osSUFBSSxFQUNKLFNBQVMsRUFDVCxVQUFVLEVBQ1gsR0FBRyxRQUFRLENBQUM7SUFDYixNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxzRUFBc0U7SUFDNUcsa0NBQWtDO0lBRWxDLElBQUksVUFBVSxHQUFHLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pFLElBQUksVUFBVSxHQUFHLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRWpFLElBQUksS0FBSyxHQUFHLFFBQVEsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTtRQUN4QyxVQUFVLEdBQUcsQ0FBQyxRQUFRLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDakU7SUFFRCxJQUFJLE1BQU0sR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7UUFDMUMsVUFBVSxHQUFHLENBQUMsU0FBUyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQ2pFO0lBRUQsT0FBTyxhQUFhLFVBQVUsT0FBTyxVQUFVLGFBQWEsSUFBSSxDQUFDLEtBQUssWUFBWSxNQUFNLE1BQU0sQ0FBQztBQUNqRyxDQUFDLENBQUM7QUFFSyxNQUFNLFdBQVcsR0FBRyxVQUFVLElBQUk7SUFDdkMsSUFBSSxFQUNGLEVBQUUsRUFDRixRQUFRLEVBQ1IsUUFBUSxFQUNSLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsT0FBTyxFQUNQLE1BQU0sRUFDTixtQkFBbUIsRUFDbkIsR0FBRyxFQUNKLEdBQUcsSUFBSSxDQUFDO0lBRVQsTUFBTSxxQkFBcUIsR0FBRyxVQUFVLGNBQWMsRUFBRSxRQUFRO1FBQzlELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbEUsSUFBSSwyREFBbUIsQ0FBQztZQUN0QixVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7U0FDdEMsQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUNsQixPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsSUFBSSxHQUFHLGNBQWMsQ0FBQyxRQUFRLElBQUksS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUM5RCxPQUFPLElBQUksQ0FBQztTQUNiO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUM7SUFFRixJQUFJLHVCQUF1QixDQUFDO0lBQzVCLElBQUksZ0JBQWdCLEdBQUcsaUVBQW1CLENBQUMscURBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sa0JBQWtCLEdBQUc7O1FBQ3pCLE1BQU0sY0FBYyxHQUFHLG1FQUFjLENBQUMsT0FBTyxDQUFDLDBDQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUUvRCxJQUFJLGNBQWMsSUFBSSwwREFBYSxDQUFDLGNBQWMsQ0FBQyxFQUFFO1lBQ25ELElBQUksTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUM7WUFDOUIsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQztZQUM5QixNQUFNLFNBQVMsR0FBRyxpRUFBbUIsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0RCxJQUFJLFFBQVEsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDO1lBQ3BDLElBQUksU0FBUyxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7WUFDdEMsSUFBSSxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLCtDQUErQztZQUNqRiw4Q0FBOEM7WUFFOUMsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUVuQyxJQUFJLFNBQVMsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxNQUFNLGlCQUFpQixHQUFHLHFCQUFxQixDQUFDLGNBQWMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLHNFQUFzRTtnQkFFakosTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoRSxJQUFJLFlBQVksR0FBRyxDQUFDLEVBQUU7b0JBQ3BCLE1BQU0sR0FBRyxZQUFZLENBQUM7aUJBQ3ZCO2dCQUVELElBQUksaUJBQWlCLEVBQUU7b0JBQ3JCLGdCQUFnQixHQUFHLGlFQUFtQixDQUFDLHFEQUFhLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztvQkFDdEUsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLHVEQUF1RDtvQkFFbkcsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLENBQUM7aUJBQ2hDO2dCQUVELElBQUksQ0FBQyx1QkFBdUIsRUFBRTtvQkFDNUIsdUJBQXVCLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztpQkFDNUM7Z0JBRUQsUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsMERBQWtCLEdBQUcsQ0FBQyxDQUFDO2dCQUNwRCxTQUFTLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRywwREFBa0IsR0FBRyxDQUFDLENBQUM7Z0JBQ3RELEtBQUssR0FBRyxRQUFRLENBQUMsQ0FBQyxnREFBZ0Q7Z0JBQ2xFLDJCQUEyQjtnQkFFM0IsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsMERBQWtCLENBQUMsQ0FBQyw0Q0FBNEM7Z0JBRXZGLElBQUksTUFBTSxHQUFHLFNBQVMsRUFBRTtvQkFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7b0JBQzVELDZEQUFhLENBQUMsU0FBUyxFQUFFO3dCQUN2QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sR0FBRyxJQUFJO3FCQUNoQyxDQUFDLENBQUM7b0JBQ0gsT0FBTztpQkFDUjtxQkFBTSxLQUFLLDhEQUE4RDtnQkFDMUUsa0NBQWtDO2dCQUNsQyxTQUFTLENBQUMsTUFBTSxHQUFHLHVCQUF1QixJQUFJLE1BQU0sR0FBRyxTQUFTLEVBQUU7b0JBQ2hFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxHQUFHLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO29CQUM1RCw2REFBYSxDQUFDLFNBQVMsRUFBRTt3QkFDdkIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSTtxQkFDaEMsQ0FBQyxDQUFDO2lCQUNKLENBQUMsMkRBQTJEO2dCQUM3RCxhQUFhO3FCQUNSO29CQUNILG1DQUFtQztvQkFDbkMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztpQkFDMUQ7YUFDRjtZQUVELE1BQU0sQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pFLE1BQU0sRUFDSixTQUFTLEVBQ1YsR0FBRyxjQUFjLENBQUM7WUFDbkIsUUFBUSxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsWUFBWSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxHQUFHLGNBQWMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7WUFFeEcsSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDZCxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxnQ0FBZ0M7b0JBQ3RMLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxtQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FBRSxVQUFVLENBQUMsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDcEYsQ0FBQywwREFBMEQ7WUFHNUQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLFNBQVMsR0FBRyxFQUFFLHdEQUF3RDtZQUNqSCwwRUFBMEU7WUFDMUUsaURBQWlEO1lBQ2pELGdCQUFnQjtZQUNoQixRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzdGLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztZQUNqRSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUU7Z0JBQzVCLElBQUksRUFBRSxxREFBYSxDQUFDLGNBQWMsQ0FBQztnQkFDbkMseUNBQXlDO2dCQUN6QyxVQUFVLEVBQUUsR0FBRyxVQUFVLElBQUk7Z0JBQzdCLEtBQUssRUFBRSxHQUFHLEtBQUssSUFBSTtnQkFDbkIsTUFBTSxFQUFFLEdBQUcsTUFBTSxJQUFJO2dCQUNyQixJQUFJLEVBQUUsR0FBRyxTQUFTLElBQUk7Z0JBQ3RCLEdBQUcsRUFBRSxHQUFHLFNBQVMsSUFBSTtnQkFDckIsU0FBUyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQztnQkFDbEYsU0FBUztnQkFDVCxLQUFLLEVBQUUsY0FBYyxDQUFDLFdBQVc7Z0JBQ2pDLE9BQU8sRUFBRSxjQUFjLENBQUMsT0FBTyxHQUFHLEdBQUc7Z0JBQ3JDLE1BQU0sRUFBRSxxQkFBcUI7Z0JBQzdCLFFBQVEsRUFBRSxHQUFHLFFBQVEsSUFBSTtnQkFDekIsU0FBUyxFQUFFLEdBQUcsZUFBZSxJQUFJO2FBQ2xDLENBQUMsQ0FBQyxDQUFDLGtFQUFrRTtZQUN0RSw2REFBNkQ7WUFFN0QsSUFBSSxpREFBUyxFQUFFLEVBQUU7Z0JBQ2YsUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsMkRBQW1CLENBQUMsY0FBYyxDQUFDLENBQUM7YUFDakU7WUFFRCw2REFBYSxDQUFDLGNBQWMsRUFBRTtnQkFDNUIsQ0FBQyxFQUFFLE1BQU07Z0JBQ1QsQ0FBQyxFQUFFLE1BQU07YUFDVixDQUFDLENBQUM7U0FDSjtJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEQsUUFBUSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUM7SUFDdEIsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDdEIsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLENBQUMsa0NBQWtDO0lBRXJFLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDN0MsSUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLElBQUksU0FBUyxHQUFHLFFBQVEsQ0FBQztJQUV6QixJQUFJLCtEQUFrQixDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQy9CLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDeEIsU0FBUyxHQUFHLFlBQVksQ0FBQztLQUMxQjtJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUM1QixRQUFRLEVBQUUsVUFBVTtRQUNwQixPQUFPLEVBQUUsY0FBYztRQUN2QixTQUFTLEVBQUUsS0FBSztRQUNoQixrQkFBa0IsRUFBRSxRQUFRO1FBQzVCLE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxFQUFFLENBQUM7UUFDVixNQUFNLEVBQUUsQ0FBQztRQUNULE9BQU8sRUFBRSxDQUFDO1FBQ1YsTUFBTSxFQUFFLE1BQU07UUFDZCxVQUFVLEVBQUUsYUFBYTtRQUN6QixRQUFRLEVBQUUsUUFBUTtRQUNsQiwyRUFBMkU7UUFDM0UsTUFBTSxFQUFFLHVCQUF1QjtRQUMvQixTQUFTO1FBQ1Qsa0VBQWtFO1FBQ2xFLFVBQVU7UUFDVixZQUFZLEVBQUUsWUFBWTtLQUMzQixDQUFDLENBQUM7SUFDSCxrQkFBa0IsRUFBRSxDQUFDO0lBRXJCLElBQUksUUFBUSxFQUFFO1FBQ1osUUFBUSxDQUFDLE9BQU8sR0FBRztZQUNqQixxREFBcUQ7WUFDckQsc0RBQXNEO1lBQ3RELDZCQUE2QjtZQUM3QixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUMsbURBQW1EO1lBQzNHLGdEQUFnRDtZQUNoRCxpREFBaUQ7WUFDakQsbURBQW1EO1lBRW5ELElBQUksK0RBQWtCLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtnQkFDNUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUVwQixJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7b0JBQ2YsTUFBTSxTQUFTLEdBQUcsaUVBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7b0JBQy9DLE1BQU0sZUFBZSxHQUFHLHNEQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxxREFBYSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsMERBQTBEO29CQUN4Syx1REFBdUQ7b0JBQ3ZELDZDQUE2QztvQkFDN0MsOERBQThEO29CQUM5RCxpREFBaUQ7b0JBRWpELElBQUksZUFBZSxLQUFLLENBQUMsRUFBRTt3QkFDekIsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksQ0FBQztxQkFDM0M7aUJBQ0Y7Z0JBRUQsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO2dCQUMvQixRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxZQUFZLElBQUksQ0FBQzthQUN0RDtZQUVELFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO0tBQ0g7SUFFRCxRQUFRLENBQUMsU0FBUyxHQUFHLFVBQVUsS0FBSztRQUNsQyxLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBSSxxRkFBOEIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUN6QyxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyw2RUFBc0IsQ0FBQyxDQUFDO1NBQ3pEO2FBQU0sSUFBSSxxRkFBOEIsQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNoRCxHQUFHLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyw2RUFBc0IsQ0FBQyxDQUFDO1NBQ3pEO2FBQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxLQUFLLDhDQUFXLEVBQUU7WUFDcEMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3ZCLG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUM1QixZQUFZLEVBQUUsQ0FBQztTQUNoQjthQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyw2Q0FBVSxJQUFJLEtBQUssQ0FBQyxtREFBZ0IsQ0FBQyxFQUFFO1lBQzlELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV2QixJQUFJLEtBQUssQ0FBQyxXQUFXLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxHQUFHLEVBQUU7Z0JBQzlDLE9BQU87YUFDUjtZQUVELG9CQUFvQixHQUFHLElBQUksQ0FBQztZQUM1QixZQUFZLEVBQUUsQ0FBQztTQUNoQjthQUFNLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSywyQ0FBUSxJQUFJLEtBQUssQ0FBQyxtREFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxxREFBa0IsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHNEQUFtQixDQUFDLEVBQUU7WUFDekksS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXZCLElBQUksS0FBSyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUMsSUFBSSxLQUFLLHFEQUFrQixFQUFFO2dCQUN2RCxPQUFPLEVBQUUsQ0FBQzthQUNYO2lCQUFNO2dCQUNMLE1BQU0sRUFBRSxDQUFDO2FBQ1YsQ0FBQyxvREFBb0Q7WUFHdEQsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzVDO0lBQ0gsQ0FBQyxDQUFDO0lBRUYsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ25CLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakMsTUFBTSxjQUFjLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBRXZELE1BQU0sTUFBTSxHQUFHO1FBQ2IsTUFBTSxFQUNKLGNBQWMsRUFDZCxZQUFZLEVBQ2IsR0FBRyxRQUFRLENBQUM7UUFDYixNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixFQUFFLENBQUM7UUFDekQsSUFBSSxLQUFLLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQixpQkFBaUIsQ0FBQyxPQUFPLENBQUMsVUFBVSxVQUFVO1lBQzVDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDekMsS0FBSyxHQUFHLEdBQUcsVUFBVSxHQUFHLEdBQUcsR0FBRyxRQUFRLEVBQUUsQ0FBQztRQUMzQyxDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLFFBQVEsQ0FBQyxjQUFjLEdBQUcsY0FBYyxHQUFHLFFBQVEsQ0FBQztRQUNwRCxRQUFRLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxRQUFRLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDO0lBQzdFLENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHO1FBQ2QsTUFBTSxFQUNKLGNBQWMsRUFDZCxZQUFZLEVBQ2IsR0FBRyxRQUFRLENBQUM7UUFDYixNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixFQUFFLENBQUM7UUFDekQsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksS0FBSyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDM0IsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFVBQVUsVUFBVTtZQUM1QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBRXRGLElBQUksUUFBUSxFQUFFO2dCQUNaLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2dCQUM5QyxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyw2QkFBNkI7Z0JBRTVGLEtBQUssR0FBRyxHQUFHLFVBQVUsR0FBRyxRQUFRLEVBQUUsQ0FBQztnQkFDbkMsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQzthQUM5QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFdkIsSUFBSSxXQUFXLENBQUMsTUFBTSxFQUFFO1lBQ3RCLElBQUksY0FBYyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN4RCxRQUFRLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLFFBQVEsRUFBRSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BHO2lCQUFNO2dCQUNMLHFEQUFxRDtnQkFDckQsV0FBVztnQkFDWCxjQUFjO2dCQUNkLFdBQVc7Z0JBQ1gsMkRBQTJEO2dCQUMzRCxRQUFRLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQzthQUMxQztZQUVELFFBQVEsQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxFQUFFLFlBQVksR0FBRyxRQUFRLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3pHO0lBQ0gsQ0FBQyxDQUFDO0lBQ0Y7O09BRUc7SUFHSCxNQUFNLDRCQUE0QixHQUFHO1FBQ25DLElBQUksRUFDRixjQUFjLEVBQ2QsWUFBWSxFQUNaLEtBQUssRUFDTixHQUFHLFFBQVEsQ0FBQyxDQUFDLCtDQUErQztRQUU3RCxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMscUNBQXFDO1FBRXBILGNBQWMsR0FBRyxjQUFjLEdBQUcsV0FBVyxDQUFDO1FBQzlDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQzNELE9BQU8sUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxZQUFZLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxLQUFLO1lBQ3pFLE9BQU8sWUFBWSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGlFQUFpRTtnQkFDbEcsWUFBWSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtnQkFDMUUsY0FBYyxDQUFDLENBQUM7UUFDbEIsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLFVBQVUsS0FBSztRQUMvQixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDLDRFQUE0RTtJQUMvRSx5RUFBeUU7SUFHekUsSUFBSSxvQkFBb0IsR0FBRyxLQUFLLENBQUM7SUFFakMsTUFBTSxZQUFZLEdBQUc7O1FBQ25CLDJFQUEyRTtRQUMzRSw0RUFBNEU7UUFDNUUsb0JBQW9CO1FBQ3BCLE9BQU8sRUFBRSxDQUFDO1FBQ1YsTUFBTSxhQUFhLEdBQUcsbUVBQWMsQ0FBQyxPQUFPLENBQUMsMENBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV0RSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ2xCLE9BQU87U0FDUjtRQUVELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDMUIsTUFBTSxTQUFTLEdBQUcsaUVBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFckQsSUFBSSxTQUFTLEVBQUU7WUFDYixJQUFJLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQztZQUUxQixJQUFJLFFBQVEsQ0FBQyxLQUFLLEVBQUU7Z0JBQ2xCLE1BQU0sa0JBQWtCLEdBQUcsbUVBQXFCLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBRTVELElBQUksQ0FBQyxrQkFBa0IsSUFBSSxrQkFBa0IsS0FBSyxPQUFPLENBQUMsRUFBRSxFQUFFO29CQUM1RCw2REFBYSxDQUFDLFNBQVMsRUFBRTt3QkFDdkIsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7NEJBQ3BELElBQUksRUFBRSxNQUFNOzRCQUNaLEVBQUUsRUFBRSxPQUFPLENBQUMsRUFBRTt5QkFDZixDQUFDO3FCQUNILENBQUMsQ0FBQztpQkFDSjthQUNGO2lCQUFNO2dCQUNMLDZEQUFhLENBQUMsU0FBUyxFQUFFO29CQUN2QixhQUFhLEVBQUUsZUFBUyxDQUFDLGFBQWEsMENBQUUsTUFBTSxDQUFDLFVBQVUsR0FBRzt3QkFDMUQsT0FBTyxDQUFDLDBEQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzdCLENBQUMsQ0FBQztpQkFDSCxDQUFDLENBQUM7YUFDSjtTQUNGO1FBRUQsUUFBUSxDQUFDO1lBQ1AsSUFBSTtZQUNKLFdBQVcsRUFBRSxvQkFBb0I7WUFDakMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxLQUFLO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztJQUVGLE1BQU0sT0FBTyxHQUFHO1FBQ2QsSUFBSSxXQUFXLEVBQUU7WUFDZixPQUFPO1NBQ1I7UUFFRCxXQUFXLEdBQUcsSUFBSSxDQUFDLENBQUMsK0NBQStDO1FBRW5FLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLFFBQVEsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLFFBQVEsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBRTFCLElBQUksUUFBUSxFQUFFO1lBQ1osUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDO1NBQ3ZCO1FBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUN2RCxNQUFNLENBQUMsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ2pELFlBQVksRUFBRSxDQUFDO1FBQ2YsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHLFVBQVUsS0FBSztRQUNuQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsc0VBQXNFO1FBQzlILHlDQUF5QztRQUN6QywwRUFBMEU7UUFDMUUscUJBQXFCO1FBRXJCLE1BQU0sTUFBTSxHQUFHLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxNQUFNLENBQUM7UUFDN0IsTUFBTSxtQkFBbUIsR0FBRyxNQUFNLFlBQVksZ0JBQWdCLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLHlEQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JJLFVBQVUsQ0FBQztZQUNULFFBQVEsQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1lBRS9CLElBQUksTUFBTSxJQUFJLG1CQUFtQixFQUFFO2dCQUNqQyxNQUFNLENBQUMsTUFBTSxHQUFHO29CQUNkLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDbkIsQ0FBQyxDQUFDO2FBQ0gsQ0FBQyx5RUFBeUU7WUFHM0UsSUFBSSxDQUFDLG1CQUFtQixFQUFFO2dCQUN4QixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDbEI7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtJQUd6RCxNQUFNLGFBQWEsR0FBRyxVQUFVLEtBQUs7UUFDbkMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsTUFBTSxZQUFZLGdCQUFnQixJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLElBQUkseURBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXZKLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxZQUFZLFdBQVcsSUFBSSxLQUFLLENBQUMsTUFBTSxZQUFZLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksa0VBQTBCLEVBQUUsQ0FBQyxJQUFJLENBQUMseURBQWlCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG1CQUFtQixFQUFFO1lBQ3BNLFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxpRUFBaUU7WUFDdEgsbUJBQW1CO1lBRW5CLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDLENBQUMsQ0FBQyw4REFBOEQ7SUFHakUsTUFBTSxZQUFZLEdBQUcsNkRBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLENBQUM7O1FBQ3ZELGtCQUFrQixFQUFFLENBQUM7UUFDckIsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUMsZUFBUSxDQUFDLGFBQWEsMENBQUUsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUM7UUFFckYsSUFBSSxDQUFDLG1CQUFtQixFQUFFO1lBQ3hCLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNsQjtJQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsOEVBQThFO0lBRWxGLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLHlFQUF5RTtJQUNsRywwRUFBMEU7SUFFMUUsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2xCLGFBQWEsRUFBRSxDQUFDLENBQUMsd0VBQXdFO0lBQ3pGLDJFQUEyRTtJQUUzRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUM7SUFFcEIsSUFBSSxNQUFNLElBQUksZ0JBQWdCLElBQUksTUFBTSxFQUFFO1FBQ3hDLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUM7WUFDbkMsa0JBQWtCLEVBQUUsQ0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUI7U0FBTTtRQUNMLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUN2RDtJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7UUFDMUMsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQztJQUNILG1CQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUFFLGFBQWEsQ0FBQyxpQ0FBaUMsRUFBRSxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDOUYsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dFd5c2l3eWcudHN4PzU3ZmQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHsgaXNXcml0YWJsZUVsZW1lbnQsIGdldEZvbnRTdHJpbmcsIGdldEZvbnRGYW1pbHlTdHJpbmcsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgQk9VTkRfVEVYVF9QQURESU5HIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEFwcHJveExpbmVIZWlnaHQsIGdldEJvdW5kVGV4dEVsZW1lbnRJZCwgZ2V0Q29udGFpbmVyRWxlbWVudCwgd3JhcFRleHQgfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgYWN0aW9uRGVjcmVhc2VGb250U2l6ZSwgYWN0aW9uSW5jcmVhc2VGb250U2l6ZSB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcblxuY29uc3Qgbm9ybWFsaXplVGV4dCA9IGZ1bmN0aW9uICh0ZXh0KSB7XG4gIHJldHVybiB0ZXh0IC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpIC8vIG5vcm1hbGl6ZSBuZXdsaW5lc1xuICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIik7XG59O1xuXG5jb25zdCBnZXRUcmFuc2Zvcm0gPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gIGNvbnN0IHtcbiAgICB6b29tLFxuICAgIG9mZnNldFRvcCxcbiAgICBvZmZzZXRMZWZ0XG4gIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gMTgwICogYW5nbGUgLyBNYXRoLlBJOyAvLyBvZmZzZXRzIG11c3QgYmUgbXVsdGlwbGllZCBieSAyIHRvIGFjY291bnQgZm9yIHRoZSBkaXZpc2lvbiBieSAyIG9mXG4gIC8vIHRoZSB3aG9sZSBleHByZXNzaW9uIGFmdGVyd2FyZHNcblxuICBsZXQgdHJhbnNsYXRlWCA9ICh3aWR0aCAtIG9mZnNldExlZnQgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgLSBvZmZzZXRUb3AgKiAyKSAqICh6b29tLnZhbHVlIC0gMSkgLyAyO1xuXG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoIC0gb2Zmc2V0TGVmdCAqIDIpICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICBpZiAoaGVpZ2h0ID4gbWF4SGVpZ2h0ICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVZID0gKG1heEhlaWdodCAtIG9mZnNldFRvcCAqIDIpICogKHpvb20udmFsdWUgLSAxKSAvIDI7XG4gIH1cblxuICByZXR1cm4gYHRyYW5zbGF0ZSgke3RyYW5zbGF0ZVh9cHgsICR7dHJhbnNsYXRlWX1weCkgc2NhbGUoJHt6b29tLnZhbHVlfSkgcm90YXRlKCR7ZGVncmVlfWRlZylgO1xufTtcblxuZXhwb3J0IGNvbnN0IHRleHRXeXNpd3lnID0gZnVuY3Rpb24gKF9yZWYpIHtcbiAgbGV0IHtcbiAgICBpZCxcbiAgICBhcHBTdGF0ZSxcbiAgICBvbkNoYW5nZSxcbiAgICBvblN1Ym1pdCxcbiAgICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgICBlbGVtZW50LFxuICAgIGNhbnZhcyxcbiAgICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICAgIGFwcFxuICB9ID0gX3JlZjtcblxuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSBmdW5jdGlvbiAodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKSB7XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2VBbGwoJ1wiJywgXCJcIik7XG5cbiAgICBpZiAoZ2V0Rm9udEZhbWlseVN0cmluZyh7XG4gICAgICBmb250RmFtaWx5OiB1cGRhdGVkRWxlbWVudC5mb250RmFtaWx5XG4gICAgfSkgIT09IGN1cnJlbnRGb250KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoYCR7dXBkYXRlZEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGxldCBvcmlnaW5hbENvbnRhaW5lckhlaWdodDtcbiAgbGV0IGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KGlkKTtcblxuICAgIGlmICh1cGRhdGVkRWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7XG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHdpZHRoID0gdXBkYXRlZEVsZW1lbnQud2lkdGg7IC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXRzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG5cbiAgICAgIGxldCBoZWlnaHQgPSB1cGRhdGVkRWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydGllc1VwZGF0ZWQgPSB0ZXh0UHJvcGVydGllc1VwZGF0ZWQodXBkYXRlZEVsZW1lbnQsIGVkaXRhYmxlKTsgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuXG4gICAgICAgIGNvbnN0IGVkaXRvckhlaWdodCA9IE51bWJlcihlZGl0YWJsZS5zdHlsZS5oZWlnaHQuc2xpY2UoMCwgLTIpKTtcblxuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIGhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpKTtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7IC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcblxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghb3JpZ2luYWxDb250YWluZXJIZWlnaHQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBtYXhXaWR0aCA9IGNvbnRhaW5lci53aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gICAgICAgIG1heEhlaWdodCA9IGNvbnRhaW5lci5oZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICAgICAgICB3aWR0aCA9IG1heFdpZHRoOyAvLyBUaGUgY29vcmRpbmF0ZXMgb2YgdGV4dCBib3ggc2V0IGEgZGlzdGFuY2Ugb2ZcbiAgICAgICAgLy8gMzBweCB0byBwcmVzZXJ2ZSBwYWRkaW5nXG5cbiAgICAgICAgY29vcmRYID0gY29udGFpbmVyLnggKyBCT1VORF9URVhUX1BBRERJTkc7IC8vIGF1dG9ncm93IGNvbnRhaW5lciBoZWlnaHQgaWYgdGV4dCBleGNlZWRzXG5cbiAgICAgICAgaWYgKGhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihoZWlnaHQgLSBtYXhIZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lci5oZWlnaHQgKyBkaWZmXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKCAvLyBhdXRvc2hyaW5rIGNvbnRhaW5lciBoZWlnaHQgdW50aWwgb3JpZ2luYWwgY29udGFpbmVyIGhlaWdodFxuICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgIGNvbnRhaW5lci5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckhlaWdodCAmJiBoZWlnaHQgPCBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4obWF4SGVpZ2h0IC0gaGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgaGVpZ2h0OiBjb250YWluZXIuaGVpZ2h0IC0gZGlmZlxuICAgICAgICAgIH0pO1xuICAgICAgICB9IC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyIC0gaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3Qge1xuICAgICAgICB0ZXh0QWxpZ25cbiAgICAgIH0gPSB1cGRhdGVkRWxlbWVudDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZEVsZW1lbnQub3JpZ2luYWxUZXh0O1xuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkRWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZEVsZW1lbnQuY29udGFpbmVySWQgPyBhcHByb3hMaW5lSGVpZ2h0IDogdXBkYXRlZEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuXG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9IChhcHBTdGF0ZS53aWR0aCAtIDggLSAoKGFwcFN0YXRlLnNjcm9sbFggKyB1cGRhdGVkRWxlbWVudC54KSAqIGFwcFN0YXRlLnpvb20udmFsdWUgKyBhcHBTdGF0ZS56b29tLnRyYW5zbGF0aW9uLngpKSAvIGFwcFN0YXRlLnpvb20udmFsdWUgLSAvLyBtYXJnaW4tcmlnaHQgb2YgcGFyZW50IGlmIGFueVxuICAgICAgICBOdW1iZXIoZ2V0Q29tcHV0ZWRTdHlsZShleGNhbGlkcmF3Q29udGFpbmVyPy5wYXJlbnROb2RlKS5tYXJnaW5SaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgfSAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG5cblxuICAgICAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID0gKGFwcFN0YXRlLmhlaWdodCAtIHZpZXdwb3J0WSAtICggLy8gVGhlcmUgaXMgYSB+MTRweCBkaWZmZXJlbmNlIHdoaWNoIGtlZXBzIG9uIGluY3JlYXNpbmdcbiAgICAgIC8vIHdpdGggZXZlcnkgem9vbSBzdGVwIHdoZW4gb2Zmc2V0IHByZXNlbnQgaGVuY2UgSSBhbSBzdWJ0cmFjdGluZyBpdCBoZXJlXG4gICAgICAvLyBIb3dldmVyIHRoaXMgaXMgbm90IHRoZSBiZXN0IGZpeCBhbmQgYnJlYWtzIGluXG4gICAgICAvLyBmZXcgc2NlbmFyaW9zXG4gICAgICBhcHBTdGF0ZS5vZmZzZXRUb3AgPyAoYXBwU3RhdGUuem9vbS52YWx1ZSAqIDEwMCAtIDEwMCkgLyAxMCAqIDE0IDogMCkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIGNvbnN0IGFuZ2xlID0gY29udGFpbmVyID8gY29udGFpbmVyLmFuZ2xlIDogdXBkYXRlZEVsZW1lbnQuYW5nbGU7XG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7d2lkdGh9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke2hlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0od2lkdGgsIGhlaWdodCwgYW5nbGUsIGFwcFN0YXRlLCBtYXhXaWR0aCwgZWRpdG9yTWF4SGVpZ2h0KSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRFbGVtZW50Lm9wYWNpdHkgLyAxMDAsXG4gICAgICAgIGZpbHRlcjogXCJ2YXIoLS10aGVtZS1maWx0ZXIpXCIsXG4gICAgICAgIG1heFdpZHRoOiBgJHttYXhXaWR0aH1weGAsXG4gICAgICAgIG1heEhlaWdodDogYCR7ZWRpdG9yTWF4SGVpZ2h0fXB4YFxuICAgICAgfSk7IC8vIEZvciBzb21lIHJlYXNvbiB1cGRhdGluZyBmb250IGF0dHJpYnV0ZSBkb2Vzbid0IHNldCBmb250IGZhbWlseVxuICAgICAgLy8gaGVuY2UgdXBkYXRpbmcgZm9udCBmYW1pbHkgZXhwbGljaXRseSBmb3IgdGVzdCBlbnZpcm9ubWVudFxuXG4gICAgICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlTdHJpbmcodXBkYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZWRFbGVtZW50LCB7XG4gICAgICAgIHg6IGNvb3JkWCxcbiAgICAgICAgeTogY29vcmRZXG4gICAgICB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiOyAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG5cbiAgZWRpdGFibGUud3JhcCA9IFwib2ZmXCI7XG4gIGVkaXRhYmxlLmNsYXNzTGlzdC5hZGQoXCJleGNhbGlkcmF3LXd5c2l3eWdcIik7XG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cblxuICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIG1pbkhlaWdodDogXCIxZW1cIixcbiAgICBiYWNrZmFjZVZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIG91dGxpbmU6IDAsXG4gICAgcmVzaXplOiBcIm5vbmVcIixcbiAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgLy8gbXVzdCBiZSBzcGVjaWZpZWQgYmVjYXVzZSBpbiBkYXJrIG1vZGUgY2FudmFzIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0XG4gICAgekluZGV4OiBcInZhcigtLXpJbmRleC13eXNpd3lnKVwiLFxuICAgIHdvcmRCcmVhayxcbiAgICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgKGB3aGl0ZXNwYWNlOiBub3dyYXBgIGRvZXNuJ3Qgd29yayBvbiBGRilcbiAgICB3aGl0ZVNwYWNlLFxuICAgIG92ZXJmbG93V3JhcDogXCJicmVhay13b3JkXCJcbiAgfSk7XG4gIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuXG4gIGlmIChvbkNoYW5nZSkge1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyB1c2luZyBzY3JvbGxIZWlnaHQgaGVyZSBzaW5jZSB3ZSBuZWVkIHRvIGNhbGN1bGF0ZVxuICAgICAgLy8gbnVtYmVyIG9mIGxpbmVzIHNvIGNhbm5vdCB1c2UgZWRpdGFibGUuc3R5bGUuaGVpZ2h0XG4gICAgICAvLyBhcyB0aGF0IGdldHMgdXBkYXRlZCBiZWxvd1xuICAgICAgY29uc3QgbGluZXMgPSBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBhcHByb3hMaW5lSGVpZ2h0OyAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbmVzIGZvclxuICAgICAgLy8gZmlyc3QgbGluZSBhcyB3ZWxsIGFzIHNldHRpbmcgaGVpZ2h0IHRvIFwiYXV0b1wiXG4gICAgICAvLyBkb3VibGVzIHRoZSBoZWlnaHQgYXMgc29vbiBhcyB1c2VyIHN0YXJ0cyB0eXBpbmdcblxuICAgICAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSAmJiBsaW5lcyA+IDEpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IFwiYXV0b1wiO1xuXG4gICAgICAgIGlmIChsaW5lcyA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgYWN0dWFsTGluZUNvdW50ID0gd3JhcFRleHQoZWRpdGFibGUudmFsdWUsIGdldEZvbnRTdHJpbmcoZWxlbWVudCksIGNvbnRhaW5lci53aWR0aCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoOyAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG5cbiAgICAgICAgICBpZiAoYWN0dWFsTGluZUNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyAyfXB4YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodH1weGA7XG4gICAgICB9XG5cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHwgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiYgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH0gLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuXG5cbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcblxuICBjb25zdCBpbmRlbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qge1xuICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzZWxlY3Rpb25FbmRcbiAgICB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaChmdW5jdGlvbiAoc3RhcnRJbmRleCkge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB7XG4gICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgIHNlbGVjdGlvbkVuZFxuICAgIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFicyA9IFtdO1xuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goZnVuY3Rpb24gKHN0YXJ0SW5kZXgpIHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKS5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7IC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG5cbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLCByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuXG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgpO1xuICAgIH1cbiAgfTtcbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGVjZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuXG5cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQge1xuICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICBzZWxlY3Rpb25FbmQsXG4gICAgICB2YWx1ZVxuICAgIH0gPSBlZGl0YWJsZTsgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcblxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pWzBdLmxlbmd0aDsgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG4gICAgcmV0dXJuIHNlbGVjdGVkLnNwbGl0KFwiXFxuXCIpLnJlZHVjZShmdW5jdGlvbiAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSB7XG4gICAgICByZXR1cm4gc3RhcnRJbmRpY2VzLmNvbmNhdChpZHggPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDEgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICBzZWxlY3Rpb25TdGFydCk7XG4gICAgfSwgW10pLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9OyAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcblxuXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuXG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5pZCk7XG5cbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuXG4gICAgICBpZiAoZWRpdGFibGUudmFsdWUpIHtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG5cbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgcmV0dXJuICFpc1RleHRFbGVtZW50KGVsZSk7XG4gICAgICAgICAgfSlcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgb25TdWJtaXQoe1xuICAgICAgdGV4dCxcbiAgICAgIHZpYUtleWJvYXJkOiBzdWJtaXR0ZWRWaWFLZXlib2FyZCxcbiAgICAgIG9yaWdpbmFsVGV4dDogZWRpdGFibGUudmFsdWVcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gZnVuY3Rpb24gKCkge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzRGVzdHJveWVkID0gdHJ1ZTsgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcblxuICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IG51bGw7XG4gICAgZWRpdGFibGUub25rZXlkb3duID0gbnVsbDtcblxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgdW5iaW5kVXBkYXRlKCk7XG4gICAgZWRpdGFibGUucmVtb3ZlKCk7XG4gIH07XG5cbiAgY29uc3QgYmluZEJsdXJFdmVudCA9IGZ1bmN0aW9uIChldmVudCkge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpOyAvLyBEZWZlcnJlZCBzbyB0aGF0IHRoZSBwb2ludGVyZG93biB0aGF0IGluaXRpYXRlcyB0aGUgd3lzaXd5ZyBkb2Vzbid0XG4gICAgLy8gdHJpZ2dlciB0aGUgYmx1ciBvbiBlbnN1aW5nIHBvaW50ZXJ1cC5cbiAgICAvLyBBbHNvIHRvIGhhbmRsZSBjYXNlcyBzdWNoIGFzIHBpY2tpbmcgYSBjb2xvciB3aGljaCB3b3VsZCB0cmlnZ2VyIGEgYmx1clxuICAgIC8vIGluIHRoYXQgc2FtZSB0aWNrLlxuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID0gdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiB0YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiYgaXNXcml0YWJsZUVsZW1lbnQodGFyZ2V0KTtcbiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IGhhbmRsZVN1Ym1pdDtcblxuICAgICAgaWYgKHRhcmdldCAmJiBpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIHRhcmdldC5vbmJsdXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgICAgfTtcbiAgICAgIH0gLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuXG5cbiAgICAgIGlmICghaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgfVxuICAgIH0pO1xuICB9OyAvLyBwcmV2ZW50IGJsdXIgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1lbnVcblxuXG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID0gZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJiBldmVudC50YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiYgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcblxuICAgIGlmICgoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHwgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgJiYgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke0NMQVNTRVMuU0hBUEVfQUNUSU9OU19NRU5VfWApICYmICFpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpIHx8IGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTsgLy8gaGFuZGxlIGVkZ2UtY2FzZSB3aGVyZSBwb2ludGVydXAgZG9lc24ndCBmaXJlIGUuZy4gZHVlIHRvIHVzZXJcbiAgICAgIC8vIGFsdC10YWJiaW5nIGF3YXlcblxuICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG4gICAgfVxuICB9OyAvLyBoYW5kbGUgdXBkYXRlcyBvZiB0ZXh0RWxlbWVudCBwcm9wZXJ0aWVzIG9mIGVkaXRpbmcgZWxlbWVudFxuXG5cbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkuYWRkQ2FsbGJhY2soZnVuY3Rpb24gKCkge1xuICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIGNvbnN0IGlzQ29sb3JQaWNrZXJBY3RpdmUgPSAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpO1xuXG4gICAgaWYgKCFpc0NvbG9yUGlja2VyQWN0aXZlKSB7XG4gICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgIH1cbiAgfSk7IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlOyAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG5cbiAgZWRpdGFibGUuc2VsZWN0KCk7XG4gIGJpbmRCbHVyRXZlbnQoKTsgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuXG4gIGxldCBvYnNlcnZlciA9IG51bGw7XG5cbiAgaWYgKGNhbnZhcyAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKGZ1bmN0aW9uICgpIHtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY2FudmFzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlOiB0cnVlXG4gIH0pO1xuICBleGNhbGlkcmF3Q29udGFpbmVyPy5xdWVyeVNlbGVjdG9yKFwiLmV4Y2FsaWRyYXctdGV4dEVkaXRvckNvbnRhaW5lclwiKS5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/../../element/textWysiwyg.tsx?");
2681
2681
 
2682
2682
  /***/ }),
2683
2683
 
@@ -2864,7 +2864,7 @@ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */
2864
2864
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2865
2865
 
2866
2866
  "use strict";
2867
- eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getSceneVersion),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.isInvisiblySmallElement),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getNonDeletedElements),\\n/* harmony export */ \\\"defaultLang\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang),\\n/* harmony export */ \\\"languages\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.languages),\\n/* harmony export */ \\\"restore\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restore),\\n/* harmony export */ \\\"restoreAppState\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreAppState),\\n/* harmony export */ \\\"restoreElements\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreElements),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToCanvas),\\n/* harmony export */ \\\"exportToBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToBlob),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToSvg),\\n/* harmony export */ \\\"serializeAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.serializeAsJSON),\\n/* harmony export */ \\\"loadLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadLibraryFromBlob),\\n/* harmony export */ \\\"loadFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob),\\n/* harmony export */ \\\"getFreeDrawSvgPath\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getFreeDrawSvgPath),\\n/* harmony export */ \\\"getCommonBoundingBox\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getCommonBoundingBox),\\n/* harmony export */ \\\"getMaximumGroups\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getMaximumGroups),\\n/* harmony export */ \\\"intersectElementWithLine\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.intersectElementWithLine),\\n/* harmony export */ \\\"determineFocusDistance\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.determineFocusDistance),\\n/* harmony export */ \\\"isLinearElement\\\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__.isLinearElement),\\n/* harmony export */ \\\"FONT_FAMILY\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.FONT_FAMILY),\\n/* harmony export */ \\\"THEME\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.THEME),\\n/* harmony export */ \\\"mutateElement\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.mutateElement),\\n/* harmony export */ \\\"newElementWith\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.newElementWith),\\n/* harmony export */ \\\"bumpVersion\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.bumpVersion)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"./node_modules/@babel/runtime/helpers/objectWithoutProperties.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"./node_modules/@babel/runtime/helpers/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _publicPath__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./publicPath */ \\\"./publicPath.js\\\");\\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/InitializeApp */ \\\"../../components/InitializeApp.tsx\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/app.scss */ \\\"../../css/app.scss\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../css/styles.scss */ \\\"../../css/styles.scss\\\");\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_7__);\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../packages/utils */ \\\"../utils.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"initialData\\\", \\\"UIOptions\\\"], _excluded2 = [\\\"initialData\\\", \\\"UIOptions\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Excalidraw = function (props) {\\r\\n var _a, _b, _c;\\r\\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, onBeforeTextSubmit, generateIdForFile, onThemeChange } = props;\\r\\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\\r\\n const UIOptions = {\\r\\n canvasActions: _objectSpread(_objectSpread({}, _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions)\\r\\n };\\r\\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\\r\\n UIOptions.canvasActions.export.saveFileToDisk = (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions[\\\"export\\\"].saveFileToDisk;\\r\\n }\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () {\\r\\n // Block pinch-zooming on iOS outside of the content area\\r\\n const handleTouchMove = function (event) {\\r\\n // @ts-ignore\\r\\n if (typeof event.scale === \\\"number\\\" && event.scale !== 1) {\\r\\n event.preventDefault();\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"touchmove\\\", handleTouchMove, {\\r\\n passive: false\\r\\n });\\r\\n return function () {\\r\\n document.removeEventListener(\\\"touchmove\\\", handleTouchMove);\\r\\n };\\r\\n }, []);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__.InitializeApp, {\\r\\n langCode: langCode,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_5__[\\\"default\\\"], {\\r\\n onChange: onChange,\\r\\n initialData: initialData,\\r\\n excalidrawRef: excalidrawRef,\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n isCollaborating: isCollaborating,\\r\\n onPointerUpdate: onPointerUpdate,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderFooter: renderFooter,\\r\\n langCode: langCode,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n gridModeEnabled: gridModeEnabled,\\r\\n libraryReturnUrl: libraryReturnUrl,\\r\\n theme: theme,\\r\\n name: name,\\r\\n renderCustomStats: renderCustomStats,\\r\\n UIOptions: UIOptions,\\r\\n onPaste: onPaste,\\r\\n onDrop: onDrop,\\r\\n detectScroll: detectScroll,\\r\\n handleKeyboardGlobally: handleKeyboardGlobally,\\r\\n onLibraryChange: onLibraryChange,\\r\\n autoFocus: autoFocus,\\r\\n onBeforeTextEdit: onBeforeTextEdit,\\r\\n onBeforeTextSubmit: onBeforeTextSubmit,\\r\\n generateIdForFile: generateIdForFile,\\r\\n onThemeChange: onThemeChange\\r\\n })\\r\\n });\\r\\n};\\r\\nconst areEqual = function (prevProps, nextProps) {\\r\\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(prevProps, _excluded);\\r\\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(nextProps, _excluded2); // comparing UIOptions\\r\\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\\r\\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\\r\\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\\r\\n return false;\\r\\n }\\r\\n const isUIOptionsSame = prevUIOptionsKeys.every(function (key) {\\r\\n if (key === \\\"canvasActions\\\") {\\r\\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\\r\\n canvasOptionKeys.every(function (key) {\\r\\n var _a, _b, _c, _d;\\r\\n if (key === \\\"export\\\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\\r\\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\\r\\n }\\r\\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\\r\\n });\\r\\n }\\r\\n return true;\\r\\n });\\r\\n const prevKeys = Object.keys(prevProps);\\r\\n const nextKeys = Object.keys(nextProps);\\r\\n return isUIOptionsSame && prevKeys.length === nextKeys.length && prevKeys.every(function (key) {\\r\\n return prev[key] === next[key];\\r\\n });\\r\\n};\\r\\nconst forwardedRefComp = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.forwardRef)(function (props, ref) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(Excalidraw, _objectSpread(_objectSpread({}, props), {}, {\\r\\n excalidrawRef: ref\\r\\n }));\\r\\n});\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().memo(forwardedRefComp, areEqual));\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9pbmRleC50c3guanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBc0Y7QUFDbEI7QUFDcEUsTUFBTSxTQUFTLEdBQUcsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLEVBQ3hDLFVBQVUsR0FBRyxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUVoRCxTQUFTLE9BQU8sQ0FBQyxNQUFNLEVBQUUsY0FBYyxJQUFJLElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsRUFBRTtJQUFFLElBQUksT0FBTyxHQUFHLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUFDLGNBQWMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsR0FBRyxJQUFJLE9BQU8sTUFBTSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztDQUFFLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRXJWLFNBQVMsYUFBYSxDQUFDLE1BQU0sSUFBSSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtJQUFFLElBQUksTUFBTSxHQUFHLElBQUksSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLEdBQUcsSUFBSSw0RUFBZSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUFFLENBQUMsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBRXJjO0FBQy9CO0FBQ3lDO0FBQ3hCO0FBQ1g7QUFDRztBQUNVO0FBQ1k7QUFDTDtBQUVoRCxNQUFNLFVBQVUsR0FBRyxVQUFVLEtBQUs7O0lBQ2hDLE1BQU0sRUFDSixRQUFRLEVBQ1IsV0FBVyxFQUNYLGFBQWEsRUFDYixtQkFBbUIsRUFDbkIsZUFBZSxFQUNmLGVBQWUsRUFDZixnQkFBZ0IsRUFDaEIsWUFBWSxFQUNaLFFBQVEsR0FBRyxtREFBZ0IsRUFDM0IsZUFBZSxFQUNmLGNBQWMsRUFDZCxlQUFlLEVBQ2YsZ0JBQWdCLEVBQ2hCLEtBQUssRUFDTCxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLE9BQU8sRUFDUCxNQUFNLEVBQ04sWUFBWSxHQUFHLElBQUksRUFDbkIsc0JBQXNCLEdBQUcsS0FBSyxFQUM5QixlQUFlLEVBQ2YsU0FBUyxHQUFHLEtBQUssRUFDakIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixpQkFBaUIsRUFDakIsYUFBYSxFQUNkLEdBQUcsS0FBSyxDQUFDO0lBQ1YsTUFBTSxhQUFhLEdBQUcsV0FBSyxDQUFDLFNBQVMsMENBQUUsYUFBYSxDQUFDO0lBQ3JELE1BQU0sU0FBUyxHQUFHO1FBQ2hCLGFBQWEsRUFBRSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSx3RUFBZ0MsQ0FBQyxFQUFFLGFBQWEsQ0FBQztLQUNqRyxDQUFDO0lBRUYsSUFBSSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsTUFBTSxFQUFFO1FBQ3pCLFNBQVMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWMsR0FBRyx5QkFBYSxDQUFDLE1BQU0sMENBQUUsY0FBYyxtQ0FBSSxpR0FBc0QsQ0FBQztLQUNoSjtJQUVELGdEQUFTLENBQUM7UUFDUix5REFBeUQ7UUFDekQsTUFBTSxlQUFlLEdBQUcsVUFBVSxLQUFLO1lBQ3JDLGFBQWE7WUFDYixJQUFJLE9BQU8sS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0JBQ3hELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQzthQUN4QjtRQUNILENBQUMsQ0FBQztRQUVGLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFO1lBQ3RELE9BQU8sRUFBRSxLQUFLO1NBQ2YsQ0FBQyxDQUFDO1FBQ0gsT0FBTztZQUNMLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDN0QsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1AsT0FBTyxhQUFhLHdEQUFJLENBQUMsb0VBQWEsRUFBRTtRQUN0QyxRQUFRLEVBQUUsUUFBUTtRQUNsQixRQUFRLEVBQUUsYUFBYSx3REFBSSxDQUFDLHVEQUFHLEVBQUU7WUFDL0IsUUFBUSxFQUFFLFFBQVE7WUFDbEIsV0FBVyxFQUFFLFdBQVc7WUFDeEIsYUFBYSxFQUFFLGFBQWE7WUFDNUIsbUJBQW1CLEVBQUUsbUJBQW1CO1lBQ3hDLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLGVBQWUsRUFBRSxlQUFlO1lBQ2hDLGdCQUFnQixFQUFFLGdCQUFnQjtZQUNsQyxZQUFZLEVBQUUsWUFBWTtZQUMxQixRQUFRLEVBQUUsUUFBUTtZQUNsQixlQUFlLEVBQUUsZUFBZTtZQUNoQyxjQUFjLEVBQUUsY0FBYztZQUM5QixlQUFlLEVBQUUsZUFBZTtZQUNoQyxnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsS0FBSyxFQUFFLEtBQUs7WUFDWixJQUFJLEVBQUUsSUFBSTtZQUNWLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxTQUFTLEVBQUUsU0FBUztZQUNwQixPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLFlBQVksRUFBRSxZQUFZO1lBQzFCLHNCQUFzQixFQUFFLHNCQUFzQjtZQUM5QyxlQUFlLEVBQUUsZUFBZTtZQUNoQyxTQUFTLEVBQUUsU0FBUztZQUNwQixnQkFBZ0IsRUFBRSxnQkFBZ0I7WUFDbEMsa0JBQWtCLEVBQUUsa0JBQWtCO1lBQ3RDLGlCQUFpQixFQUFFLGlCQUFpQjtZQUNwQyxhQUFhLEVBQUUsYUFBYTtTQUM3QixDQUFDO0tBQ0gsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxRQUFRLEdBQUcsVUFBVSxTQUFTLEVBQUUsU0FBUztJQUM3QyxNQUFNLEVBQ0osV0FBVyxFQUFFLGVBQWUsRUFDNUIsU0FBUyxFQUFFLGFBQWEsR0FBRyxFQUFFLEVBQzlCLEdBQUcsU0FBUyxFQUNQLElBQUksR0FBRyxxRkFBd0IsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFNUQsTUFBTSxFQUNKLFdBQVcsRUFBRSxlQUFlLEVBQzVCLFNBQVMsRUFBRSxhQUFhLEdBQUcsRUFBRSxFQUM5QixHQUFHLFNBQVMsRUFDUCxJQUFJLEdBQUcscUZBQXdCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsc0JBQXNCO0lBR3BGLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxNQUFNLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFckQsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLEtBQUssaUJBQWlCLENBQUMsTUFBTSxFQUFFO1FBQ3pELE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHO1FBQzNELElBQUksR0FBRyxLQUFLLGVBQWUsRUFBRTtZQUMzQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xFLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUc7O2dCQUNsQyxJQUFJLEdBQUcsS0FBSyxRQUFRLEtBQUksbUJBQWEsYUFBYixhQUFhLHVCQUFiLGFBQWEsQ0FBRSxhQUFhLDBDQUFFLE1BQU0sTUFBSSxtQkFBYSxhQUFiLGFBQWEsdUJBQWIsYUFBYSxDQUFFLGFBQWEsMENBQUUsTUFBTSxHQUFFO29CQUNwRyxPQUFPLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUM7aUJBQ2hIO2dCQUVELE9BQU8sb0JBQWEsYUFBYixhQUFhLHVCQUFiLGFBQWEsQ0FBRSxhQUFhLDBDQUFHLEdBQUcsQ0FBQyxPQUFLLG1CQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsYUFBYSwwQ0FBRyxHQUFHLENBQUMsRUFBQztZQUNyRixDQUFDLENBQUMsQ0FBQztTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QyxPQUFPLGVBQWUsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLFFBQVEsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUc7UUFDM0YsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLGtEQUFVLENBQUMsVUFBVSxLQUFLLEVBQUUsR0FBRztJQUNuRSxPQUFPLGFBQWEsd0RBQUksQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFO1FBQy9FLGFBQWEsRUFBRSxHQUFHO0tBQ25CLENBQUMsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLENBQUM7QUFDSCw4RUFBNEIsaURBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsRUFBQztBQUM2QjtBQUM1QztBQUMyQjtBQUNvSztBQUN4TDtBQUNOO0FBQ29DIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW5kZXgudHN4P2NlNzQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF9vYmplY3RXaXRob3V0UHJvcGVydGllcyBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9vYmplY3RXaXRob3V0UHJvcGVydGllc1wiO1xuaW1wb3J0IF9kZWZpbmVQcm9wZXJ0eSBmcm9tIFwiQGJhYmVsL3J1bnRpbWUvaGVscGVycy9kZWZpbmVQcm9wZXJ0eVwiO1xuY29uc3QgX2V4Y2x1ZGVkID0gW1wiaW5pdGlhbERhdGFcIiwgXCJVSU9wdGlvbnNcIl0sXG4gICAgICBfZXhjbHVkZWQyID0gW1wiaW5pdGlhbERhdGFcIiwgXCJVSU9wdGlvbnNcIl07XG5cbmZ1bmN0aW9uIG93bktleXMob2JqZWN0LCBlbnVtZXJhYmxlT25seSkgeyB2YXIga2V5cyA9IE9iamVjdC5rZXlzKG9iamVjdCk7IGlmIChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7IHZhciBzeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhvYmplY3QpOyBlbnVtZXJhYmxlT25seSAmJiAoc3ltYm9scyA9IHN5bWJvbHMuZmlsdGVyKGZ1bmN0aW9uIChzeW0pIHsgcmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iob2JqZWN0LCBzeW0pLmVudW1lcmFibGU7IH0pKSwga2V5cy5wdXNoLmFwcGx5KGtleXMsIHN5bWJvbHMpOyB9IHJldHVybiBrZXlzOyB9XG5cbmZ1bmN0aW9uIF9vYmplY3RTcHJlYWQodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBudWxsICE9IGFyZ3VtZW50c1tpXSA/IGFyZ3VtZW50c1tpXSA6IHt9OyBpICUgMiA/IG93bktleXMoT2JqZWN0KHNvdXJjZSksICEwKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgX2RlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBzb3VyY2Vba2V5XSk7IH0pIDogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHNvdXJjZSkpIDogb3duS2V5cyhPYmplY3Qoc291cmNlKSkuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpOyB9KTsgfSByZXR1cm4gdGFyZ2V0OyB9XG5cbmltcG9ydCBSZWFjdCwgeyB1c2VFZmZlY3QsIGZvcndhcmRSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBcIi4vcHVibGljUGF0aFwiO1xuaW1wb3J0IHsgSW5pdGlhbGl6ZUFwcCB9IGZyb20gXCIuLi8uLi9jb21wb25lbnRzL0luaXRpYWxpemVBcHBcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgXCIuLi8uLi9jc3MvYXBwLnNjc3NcIjtcbmltcG9ydCBcIi4uLy4uL2Nzcy9zdHlsZXMuc2Nzc1wiO1xuaW1wb3J0IHsgZGVmYXVsdExhbmcgfSBmcm9tIFwiLi4vLi4vaTE4blwiO1xuaW1wb3J0IHsgREVGQVVMVF9VSV9PUFRJT05TIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsganN4IGFzIF9qc3ggfSBmcm9tIFwicmVhY3QvanN4LXJ1bnRpbWVcIjtcblxuY29uc3QgRXhjYWxpZHJhdyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICBjb25zdCB7XG4gICAgb25DaGFuZ2UsXG4gICAgaW5pdGlhbERhdGEsXG4gICAgZXhjYWxpZHJhd1JlZixcbiAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgIGlzQ29sbGFib3JhdGluZyxcbiAgICBvblBvaW50ZXJVcGRhdGUsXG4gICAgcmVuZGVyVG9wUmlnaHRVSSxcbiAgICByZW5kZXJGb290ZXIsXG4gICAgbGFuZ0NvZGUgPSBkZWZhdWx0TGFuZy5jb2RlLFxuICAgIHZpZXdNb2RlRW5hYmxlZCxcbiAgICB6ZW5Nb2RlRW5hYmxlZCxcbiAgICBncmlkTW9kZUVuYWJsZWQsXG4gICAgbGlicmFyeVJldHVyblVybCxcbiAgICB0aGVtZSxcbiAgICBuYW1lLFxuICAgIHJlbmRlckN1c3RvbVN0YXRzLFxuICAgIG9uUGFzdGUsXG4gICAgb25Ecm9wLFxuICAgIGRldGVjdFNjcm9sbCA9IHRydWUsXG4gICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSA9IGZhbHNlLFxuICAgIG9uTGlicmFyeUNoYW5nZSxcbiAgICBhdXRvRm9jdXMgPSBmYWxzZSxcbiAgICBvbkJlZm9yZVRleHRFZGl0LFxuICAgIG9uQmVmb3JlVGV4dFN1Ym1pdCxcbiAgICBnZW5lcmF0ZUlkRm9yRmlsZSxcbiAgICBvblRoZW1lQ2hhbmdlXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgY2FudmFzQWN0aW9ucyA9IHByb3BzLlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucztcbiAgY29uc3QgVUlPcHRpb25zID0ge1xuICAgIGNhbnZhc0FjdGlvbnM6IF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgREVGQVVMVF9VSV9PUFRJT05TLmNhbnZhc0FjdGlvbnMpLCBjYW52YXNBY3Rpb25zKVxuICB9O1xuXG4gIGlmIChjYW52YXNBY3Rpb25zPy5leHBvcnQpIHtcbiAgICBVSU9wdGlvbnMuY2FudmFzQWN0aW9ucy5leHBvcnQuc2F2ZUZpbGVUb0Rpc2sgPSBjYW52YXNBY3Rpb25zLmV4cG9ydD8uc2F2ZUZpbGVUb0Rpc2sgPz8gREVGQVVMVF9VSV9PUFRJT05TLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrO1xuICB9XG5cbiAgdXNlRWZmZWN0KGZ1bmN0aW9uICgpIHtcbiAgICAvLyBCbG9jayBwaW5jaC16b29taW5nIG9uIGlPUyBvdXRzaWRlIG9mIHRoZSBjb250ZW50IGFyZWFcbiAgICBjb25zdCBoYW5kbGVUb3VjaE1vdmUgPSBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGlmICh0eXBlb2YgZXZlbnQuc2NhbGUgPT09IFwibnVtYmVyXCIgJiYgZXZlbnQuc2NhbGUgIT09IDEpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLCBoYW5kbGVUb3VjaE1vdmUsIHtcbiAgICAgIHBhc3NpdmU6IGZhbHNlXG4gICAgfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlKTtcbiAgICB9O1xuICB9LCBbXSk7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChJbml0aWFsaXplQXBwLCB7XG4gICAgbGFuZ0NvZGU6IGxhbmdDb2RlLFxuICAgIGNoaWxkcmVuOiAvKiNfX1BVUkVfXyovX2pzeChBcHAsIHtcbiAgICAgIG9uQ2hhbmdlOiBvbkNoYW5nZSxcbiAgICAgIGluaXRpYWxEYXRhOiBpbml0aWFsRGF0YSxcbiAgICAgIGV4Y2FsaWRyYXdSZWY6IGV4Y2FsaWRyYXdSZWYsXG4gICAgICBvbkNvbGxhYkJ1dHRvbkNsaWNrOiBvbkNvbGxhYkJ1dHRvbkNsaWNrLFxuICAgICAgaXNDb2xsYWJvcmF0aW5nOiBpc0NvbGxhYm9yYXRpbmcsXG4gICAgICBvblBvaW50ZXJVcGRhdGU6IG9uUG9pbnRlclVwZGF0ZSxcbiAgICAgIHJlbmRlclRvcFJpZ2h0VUk6IHJlbmRlclRvcFJpZ2h0VUksXG4gICAgICByZW5kZXJGb290ZXI6IHJlbmRlckZvb3RlcixcbiAgICAgIGxhbmdDb2RlOiBsYW5nQ29kZSxcbiAgICAgIHZpZXdNb2RlRW5hYmxlZDogdmlld01vZGVFbmFibGVkLFxuICAgICAgemVuTW9kZUVuYWJsZWQ6IHplbk1vZGVFbmFibGVkLFxuICAgICAgZ3JpZE1vZGVFbmFibGVkOiBncmlkTW9kZUVuYWJsZWQsXG4gICAgICBsaWJyYXJ5UmV0dXJuVXJsOiBsaWJyYXJ5UmV0dXJuVXJsLFxuICAgICAgdGhlbWU6IHRoZW1lLFxuICAgICAgbmFtZTogbmFtZSxcbiAgICAgIHJlbmRlckN1c3RvbVN0YXRzOiByZW5kZXJDdXN0b21TdGF0cyxcbiAgICAgIFVJT3B0aW9uczogVUlPcHRpb25zLFxuICAgICAgb25QYXN0ZTogb25QYXN0ZSxcbiAgICAgIG9uRHJvcDogb25Ecm9wLFxuICAgICAgZGV0ZWN0U2Nyb2xsOiBkZXRlY3RTY3JvbGwsXG4gICAgICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5OiBoYW5kbGVLZXlib2FyZEdsb2JhbGx5LFxuICAgICAgb25MaWJyYXJ5Q2hhbmdlOiBvbkxpYnJhcnlDaGFuZ2UsXG4gICAgICBhdXRvRm9jdXM6IGF1dG9Gb2N1cyxcbiAgICAgIG9uQmVmb3JlVGV4dEVkaXQ6IG9uQmVmb3JlVGV4dEVkaXQsXG4gICAgICBvbkJlZm9yZVRleHRTdWJtaXQ6IG9uQmVmb3JlVGV4dFN1Ym1pdCxcbiAgICAgIGdlbmVyYXRlSWRGb3JGaWxlOiBnZW5lcmF0ZUlkRm9yRmlsZSxcbiAgICAgIG9uVGhlbWVDaGFuZ2U6IG9uVGhlbWVDaGFuZ2VcbiAgICB9KVxuICB9KTtcbn07XG5cbmNvbnN0IGFyZUVxdWFsID0gZnVuY3Rpb24gKHByZXZQcm9wcywgbmV4dFByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBpbml0aWFsRGF0YTogcHJldkluaXRpYWxEYXRhLFxuICAgIFVJT3B0aW9uczogcHJldlVJT3B0aW9ucyA9IHt9XG4gIH0gPSBwcmV2UHJvcHMsXG4gICAgICAgIHByZXYgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMocHJldlByb3BzLCBfZXhjbHVkZWQpO1xuXG4gIGNvbnN0IHtcbiAgICBpbml0aWFsRGF0YTogbmV4dEluaXRpYWxEYXRhLFxuICAgIFVJT3B0aW9uczogbmV4dFVJT3B0aW9ucyA9IHt9XG4gIH0gPSBuZXh0UHJvcHMsXG4gICAgICAgIG5leHQgPSBfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMobmV4dFByb3BzLCBfZXhjbHVkZWQyKTsgLy8gY29tcGFyaW5nIFVJT3B0aW9uc1xuXG5cbiAgY29uc3QgcHJldlVJT3B0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhwcmV2VUlPcHRpb25zKTtcbiAgY29uc3QgbmV4dFVJT3B0aW9uc0tleXMgPSBPYmplY3Qua2V5cyhuZXh0VUlPcHRpb25zKTtcblxuICBpZiAocHJldlVJT3B0aW9uc0tleXMubGVuZ3RoICE9PSBuZXh0VUlPcHRpb25zS2V5cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBpc1VJT3B0aW9uc1NhbWUgPSBwcmV2VUlPcHRpb25zS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKGtleSA9PT0gXCJjYW52YXNBY3Rpb25zXCIpIHtcbiAgICAgIGNvbnN0IGNhbnZhc09wdGlvbktleXMgPSBPYmplY3Qua2V5cyhwcmV2VUlPcHRpb25zLmNhbnZhc0FjdGlvbnMpO1xuICAgICAgY2FudmFzT3B0aW9uS2V5cy5ldmVyeShmdW5jdGlvbiAoa2V5KSB7XG4gICAgICAgIGlmIChrZXkgPT09IFwiZXhwb3J0XCIgJiYgcHJldlVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uZXhwb3J0ICYmIG5leHRVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydCkge1xuICAgICAgICAgIHJldHVybiBwcmV2VUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID09PSBuZXh0VUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByZXZVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LltrZXldID09PSBuZXh0VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5ba2V5XTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcbiAgY29uc3QgcHJldktleXMgPSBPYmplY3Qua2V5cyhwcmV2UHJvcHMpO1xuICBjb25zdCBuZXh0S2V5cyA9IE9iamVjdC5rZXlzKG5leHRQcm9wcyk7XG4gIHJldHVybiBpc1VJT3B0aW9uc1NhbWUgJiYgcHJldktleXMubGVuZ3RoID09PSBuZXh0S2V5cy5sZW5ndGggJiYgcHJldktleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIHJldHVybiBwcmV2W2tleV0gPT09IG5leHRba2V5XTtcbiAgfSk7XG59O1xuXG5jb25zdCBmb3J3YXJkZWRSZWZDb21wID0gLyojX19QVVJFX18qL2ZvcndhcmRSZWYoZnVuY3Rpb24gKHByb3BzLCByZWYpIHtcbiAgcmV0dXJuIC8qI19fUFVSRV9fKi9fanN4KEV4Y2FsaWRyYXcsIF9vYmplY3RTcHJlYWQoX29iamVjdFNwcmVhZCh7fSwgcHJvcHMpLCB7fSwge1xuICAgIGV4Y2FsaWRyYXdSZWY6IHJlZlxuICB9KSk7XG59KTtcbmV4cG9ydCBkZWZhdWx0IC8qI19fUFVSRV9fKi9SZWFjdC5tZW1vKGZvcndhcmRlZFJlZkNvbXAsIGFyZUVxdWFsKTtcbmV4cG9ydCB7IGdldFNjZW5lVmVyc2lvbiwgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsIGdldE5vbkRlbGV0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi8uLi9lbGVtZW50XCI7XG5leHBvcnQgeyBkZWZhdWx0TGFuZywgbGFuZ3VhZ2VzIH0gZnJvbSBcIi4uLy4uL2kxOG5cIjtcbmV4cG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVBcHBTdGF0ZSwgcmVzdG9yZUVsZW1lbnRzIH0gZnJvbSBcIi4uLy4uL2RhdGEvcmVzdG9yZVwiO1xuZXhwb3J0IHsgZXhwb3J0VG9DYW52YXMsIGV4cG9ydFRvQmxvYiwgZXhwb3J0VG9TdmcsIHNlcmlhbGl6ZUFzSlNPTiwgbG9hZExpYnJhcnlGcm9tQmxvYiwgbG9hZEZyb21CbG9iLCBnZXRGcmVlRHJhd1N2Z1BhdGgsIGdldENvbW1vbkJvdW5kaW5nQm94LCBnZXRNYXhpbXVtR3JvdXBzLCBpbnRlcnNlY3RFbGVtZW50V2l0aExpbmUsIGRldGVybWluZUZvY3VzRGlzdGFuY2UgfSBmcm9tIFwiLi4vLi4vcGFja2FnZXMvdXRpbHNcIjtcbmV4cG9ydCB7IGlzTGluZWFyRWxlbWVudCB9IGZyb20gXCIuLi8uLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmV4cG9ydCB7IEZPTlRfRkFNSUxZLCBUSEVNRSB9IGZyb20gXCIuLi8uLi9jb25zdGFudHNcIjtcbmV4cG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoLCBidW1wVmVyc2lvbiB9IGZyb20gXCIuLi8uLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\\n//# sourceURL=webpack-internal:///./index.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/./index.tsx?");
2867
+ eval("eval(\"__webpack_require__.r(__webpack_exports__);\\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\\n/* harmony export */ \\\"default\\\": () => (__WEBPACK_DEFAULT_EXPORT__),\\n/* harmony export */ \\\"getSceneVersion\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getSceneVersion),\\n/* harmony export */ \\\"isInvisiblySmallElement\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.isInvisiblySmallElement),\\n/* harmony export */ \\\"getNonDeletedElements\\\": () => (/* reexport safe */ _element__WEBPACK_IMPORTED_MODULE_11__.getNonDeletedElements),\\n/* harmony export */ \\\"defaultLang\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang),\\n/* harmony export */ \\\"languages\\\": () => (/* reexport safe */ _i18n__WEBPACK_IMPORTED_MODULE_8__.languages),\\n/* harmony export */ \\\"restore\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restore),\\n/* harmony export */ \\\"restoreAppState\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreAppState),\\n/* harmony export */ \\\"restoreElements\\\": () => (/* reexport safe */ _data_restore__WEBPACK_IMPORTED_MODULE_12__.restoreElements),\\n/* harmony export */ \\\"exportToCanvas\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToCanvas),\\n/* harmony export */ \\\"exportToBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToBlob),\\n/* harmony export */ \\\"exportToSvg\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.exportToSvg),\\n/* harmony export */ \\\"serializeAsJSON\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.serializeAsJSON),\\n/* harmony export */ \\\"loadLibraryFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadLibraryFromBlob),\\n/* harmony export */ \\\"loadFromBlob\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.loadFromBlob),\\n/* harmony export */ \\\"getFreeDrawSvgPath\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getFreeDrawSvgPath),\\n/* harmony export */ \\\"getCommonBoundingBox\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getCommonBoundingBox),\\n/* harmony export */ \\\"getMaximumGroups\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.getMaximumGroups),\\n/* harmony export */ \\\"intersectElementWithLine\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.intersectElementWithLine),\\n/* harmony export */ \\\"determineFocusDistance\\\": () => (/* reexport safe */ _packages_utils__WEBPACK_IMPORTED_MODULE_13__.determineFocusDistance),\\n/* harmony export */ \\\"isLinearElement\\\": () => (/* reexport safe */ _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__.isLinearElement),\\n/* harmony export */ \\\"FONT_FAMILY\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.FONT_FAMILY),\\n/* harmony export */ \\\"THEME\\\": () => (/* reexport safe */ _constants__WEBPACK_IMPORTED_MODULE_9__.THEME),\\n/* harmony export */ \\\"mutateElement\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.mutateElement),\\n/* harmony export */ \\\"newElementWith\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.newElementWith),\\n/* harmony export */ \\\"bumpVersion\\\": () => (/* reexport safe */ _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__.bumpVersion)\\n/* harmony export */ });\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @babel/runtime/helpers/objectWithoutProperties */ \\\"./node_modules/@babel/runtime/helpers/objectWithoutProperties.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0__);\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @babel/runtime/helpers/defineProperty */ \\\"./node_modules/@babel/runtime/helpers/defineProperty.js\\\");\\n/* harmony import */ var _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1__);\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react */ \\\"react\\\");\\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_2__);\\n/* harmony import */ var _publicPath__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./publicPath */ \\\"./publicPath.js\\\");\\n/* harmony import */ var _components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../components/InitializeApp */ \\\"../../components/InitializeApp.tsx\\\");\\n/* harmony import */ var _components_App__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../../components/App */ \\\"../../components/App.tsx\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/app.scss */ \\\"../../css/app.scss\\\");\\n/* harmony import */ var _css_app_scss__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(_css_app_scss__WEBPACK_IMPORTED_MODULE_6__);\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../../css/styles.scss */ \\\"../../css/styles.scss\\\");\\n/* harmony import */ var _css_styles_scss__WEBPACK_IMPORTED_MODULE_7___default = /*#__PURE__*/__webpack_require__.n(_css_styles_scss__WEBPACK_IMPORTED_MODULE_7__);\\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../../i18n */ \\\"../../i18n.ts\\\");\\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../../constants */ \\\"../../constants.ts\\\");\\n/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! react/jsx-runtime */ \\\"../../../node_modules/react/jsx-runtime.js\\\");\\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../../element */ \\\"../../element/index.ts\\\");\\n/* harmony import */ var _data_restore__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ../../data/restore */ \\\"../../data/restore.ts\\\");\\n/* harmony import */ var _packages_utils__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../../packages/utils */ \\\"../utils.ts\\\");\\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(/*! ../../element/typeChecks */ \\\"../../element/typeChecks.ts\\\");\\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(/*! ../../element/mutateElement */ \\\"../../element/mutateElement.ts\\\");\\n\\r\\n\\r\\nconst _excluded = [\\\"initialData\\\", \\\"UIOptions\\\"], _excluded2 = [\\\"initialData\\\", \\\"UIOptions\\\"];\\r\\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) {\\r\\n var symbols = Object.getOwnPropertySymbols(object);\\r\\n enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols);\\r\\n} return keys; }\\r\\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) {\\r\\n var source = null != arguments[i] ? arguments[i] : {};\\r\\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _babel_runtime_helpers_defineProperty__WEBPACK_IMPORTED_MODULE_1___default()(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); });\\r\\n} return target; }\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\nconst Excalidraw = function (props) {\\r\\n var _a, _b, _c;\\r\\n const { onChange, initialData, excalidrawRef, onCollabButtonClick, isCollaborating = false, onPointerUpdate, renderTopRightUI, renderFooter, langCode = _i18n__WEBPACK_IMPORTED_MODULE_8__.defaultLang.code, viewModeEnabled, zenModeEnabled, gridModeEnabled, libraryReturnUrl, theme, name, renderCustomStats, onPaste, onDrop, detectScroll = true, handleKeyboardGlobally = false, onLibraryChange, autoFocus = false, onBeforeTextEdit, onBeforeTextSubmit, generateIdForFile, onThemeChange } = props;\\r\\n const canvasActions = (_a = props.UIOptions) === null || _a === void 0 ? void 0 : _a.canvasActions;\\r\\n const UIOptions = {\\r\\n canvasActions: _objectSpread(_objectSpread({}, _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions), canvasActions)\\r\\n };\\r\\n if (canvasActions === null || canvasActions === void 0 ? void 0 : canvasActions.export) {\\r\\n UIOptions.canvasActions.export.saveFileToDisk = (_c = (_b = canvasActions.export) === null || _b === void 0 ? void 0 : _b.saveFileToDisk) !== null && _c !== void 0 ? _c : _constants__WEBPACK_IMPORTED_MODULE_9__.DEFAULT_UI_OPTIONS.canvasActions[\\\"export\\\"].saveFileToDisk;\\r\\n }\\r\\n (0,react__WEBPACK_IMPORTED_MODULE_2__.useEffect)(function () {\\r\\n // Block pinch-zooming on iOS outside of the content area\\r\\n const handleTouchMove = function (event) {\\r\\n // @ts-ignore\\r\\n if (typeof event.scale === \\\"number\\\" && event.scale !== 1) {\\r\\n event.preventDefault();\\r\\n }\\r\\n };\\r\\n document.addEventListener(\\\"touchmove\\\", handleTouchMove, {\\r\\n passive: false\\r\\n });\\r\\n return function () {\\r\\n document.removeEventListener(\\\"touchmove\\\", handleTouchMove);\\r\\n };\\r\\n }, []);\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_InitializeApp__WEBPACK_IMPORTED_MODULE_4__.InitializeApp, {\\r\\n langCode: langCode,\\r\\n children: /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(_components_App__WEBPACK_IMPORTED_MODULE_5__[\\\"default\\\"], {\\r\\n onChange: onChange,\\r\\n initialData: initialData,\\r\\n excalidrawRef: excalidrawRef,\\r\\n onCollabButtonClick: onCollabButtonClick,\\r\\n isCollaborating: isCollaborating,\\r\\n onPointerUpdate: onPointerUpdate,\\r\\n renderTopRightUI: renderTopRightUI,\\r\\n renderFooter: renderFooter,\\r\\n langCode: langCode,\\r\\n viewModeEnabled: viewModeEnabled,\\r\\n zenModeEnabled: zenModeEnabled,\\r\\n gridModeEnabled: gridModeEnabled,\\r\\n libraryReturnUrl: libraryReturnUrl,\\r\\n theme: theme,\\r\\n name: name,\\r\\n renderCustomStats: renderCustomStats,\\r\\n UIOptions: UIOptions,\\r\\n onPaste: onPaste,\\r\\n onDrop: onDrop,\\r\\n detectScroll: detectScroll,\\r\\n handleKeyboardGlobally: handleKeyboardGlobally,\\r\\n onLibraryChange: onLibraryChange,\\r\\n autoFocus: autoFocus,\\r\\n onBeforeTextEdit: onBeforeTextEdit,\\r\\n onBeforeTextSubmit: onBeforeTextSubmit,\\r\\n generateIdForFile: generateIdForFile,\\r\\n onThemeChange: onThemeChange\\r\\n })\\r\\n });\\r\\n};\\r\\nconst areEqual = function (prevProps, nextProps) {\\r\\n const { initialData: prevInitialData, UIOptions: prevUIOptions = {} } = prevProps, prev = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(prevProps, _excluded);\\r\\n const { initialData: nextInitialData, UIOptions: nextUIOptions = {} } = nextProps, next = _babel_runtime_helpers_objectWithoutProperties__WEBPACK_IMPORTED_MODULE_0___default()(nextProps, _excluded2); // comparing UIOptions\\r\\n const prevUIOptionsKeys = Object.keys(prevUIOptions);\\r\\n const nextUIOptionsKeys = Object.keys(nextUIOptions);\\r\\n if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\\r\\n return false;\\r\\n }\\r\\n const isUIOptionsSame = prevUIOptionsKeys.every(function (key) {\\r\\n if (key === \\\"canvasActions\\\") {\\r\\n const canvasOptionKeys = Object.keys(prevUIOptions.canvasActions);\\r\\n canvasOptionKeys.every(function (key) {\\r\\n var _a, _b, _c, _d;\\r\\n if (key === \\\"export\\\" && ((_a = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _a === void 0 ? void 0 : _a.export) && ((_b = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _b === void 0 ? void 0 : _b.export)) {\\r\\n return prevUIOptions.canvasActions.export.saveFileToDisk === nextUIOptions.canvasActions.export.saveFileToDisk;\\r\\n }\\r\\n return ((_c = prevUIOptions === null || prevUIOptions === void 0 ? void 0 : prevUIOptions.canvasActions) === null || _c === void 0 ? void 0 : _c[key]) === ((_d = nextUIOptions === null || nextUIOptions === void 0 ? void 0 : nextUIOptions.canvasActions) === null || _d === void 0 ? void 0 : _d[key]);\\r\\n });\\r\\n }\\r\\n return true;\\r\\n });\\r\\n const prevKeys = Object.keys(prevProps);\\r\\n const nextKeys = Object.keys(nextProps);\\r\\n return isUIOptionsSame && prevKeys.length === nextKeys.length && prevKeys.every(function (key) {\\r\\n return prev[key] === next[key];\\r\\n });\\r\\n};\\r\\nconst forwardedRefComp = /*#__PURE__*/ (0,react__WEBPACK_IMPORTED_MODULE_2__.forwardRef)(function (props, ref) {\\r\\n return /*#__PURE__*/ (0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_10__.jsx)(Excalidraw, _objectSpread(_objectSpread({}, props), {}, {\\r\\n excalidrawRef: ref\\r\\n }));\\r\\n});\\r\\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_2___default().memo(forwardedRefComp, areEqual));\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n\\r\\n//# sourceURL=[module]\\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3hDLE9BQU8sZUFBZSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRztRQUMzRixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLGFBQWEsa0RBQVUsQ0FBQyxVQUFVLEtBQUssRUFBRSxHQUFHO0lBQ25FLE9BQU8sYUFBYSx3REFBSSxDQUFDLFVBQVUsRUFBRSxhQUFhLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUU7UUFDL0UsYUFBYSxFQUFFLEdBQUc7S0FDbkIsQ0FBQyxDQUFDLENBQUM7QUFDTixDQUFDLENBQUMsQ0FBQztBQUNILDhFQUE0QixpREFBVSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQyxFQUFDO0FBQzZCO0FBQzVDO0FBQzJCO0FBQ29LO0FBQ3hMO0FBQ047QUFDb0MiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbmRleC50c3g/Y2U3NCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzIGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzXCI7XG5pbXBvcnQgX2RlZmluZVByb3BlcnR5IGZyb20gXCJAYmFiZWwvcnVudGltZS9oZWxwZXJzL2RlZmluZVByb3BlcnR5XCI7XG5jb25zdCBfZXhjbHVkZWQgPSBbXCJpbml0aWFsRGF0YVwiLCBcIlVJT3B0aW9uc1wiXSxcbiAgICAgIF9leGNsdWRlZDIgPSBbXCJpbml0aWFsRGF0YVwiLCBcIlVJT3B0aW9uc1wiXTtcblxuZnVuY3Rpb24gb3duS2V5cyhvYmplY3QsIGVudW1lcmFibGVPbmx5KSB7IHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqZWN0KTsgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMpIHsgdmFyIHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG9iamVjdCk7IGVudW1lcmFibGVPbmx5ICYmIChzeW1ib2xzID0gc3ltYm9scy5maWx0ZXIoZnVuY3Rpb24gKHN5bSkgeyByZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmplY3QsIHN5bSkuZW51bWVyYWJsZTsgfSkpLCBrZXlzLnB1c2guYXBwbHkoa2V5cywgc3ltYm9scyk7IH0gcmV0dXJuIGtleXM7IH1cblxuZnVuY3Rpb24gX29iamVjdFNwcmVhZCh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IG51bGwgIT0gYXJndW1lbnRzW2ldID8gYXJndW1lbnRzW2ldIDoge307IGkgJSAyID8gb3duS2V5cyhPYmplY3Qoc291cmNlKSwgITApLmZvckVhY2goZnVuY3Rpb24gKGtleSkgeyBfZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHNvdXJjZVtrZXldKTsgfSkgOiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyA/IE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoc291cmNlKSkgOiBvd25LZXlzKE9iamVjdChzb3VyY2UpKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvdXJjZSwga2V5KSk7IH0pOyB9IHJldHVybiB0YXJnZXQ7IH1cblxuaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgZm9yd2FyZFJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IFwiLi9wdWJsaWNQYXRoXCI7XG5pbXBvcnQgeyBJbml0aWFsaXplQXBwIH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvSW5pdGlhbGl6ZUFwcFwiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCBcIi4uLy4uL2Nzcy9hcHAuc2Nzc1wiO1xuaW1wb3J0IFwiLi4vLi4vY3NzL3N0eWxlcy5zY3NzXCI7XG5pbXBvcnQgeyBkZWZhdWx0TGFuZyB9IGZyb20gXCIuLi8uLi9pMThuXCI7XG5pbXBvcnQgeyBERUZBVUxUX1VJX09QVElPTlMgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBqc3ggYXMgX2pzeCB9IGZyb20gXCJyZWFjdC9qc3gtcnVudGltZVwiO1xuXG5jb25zdCBFeGNhbGlkcmF3ID0gZnVuY3Rpb24gKHByb3BzKSB7XG4gIGNvbnN0IHtcbiAgICBvbkNoYW5nZSxcbiAgICBpbml0aWFsRGF0YSxcbiAgICBleGNhbGlkcmF3UmVmLFxuICAgIG9uQ29sbGFiQnV0dG9uQ2xpY2ssXG4gICAgaXNDb2xsYWJvcmF0aW5nID0gZmFsc2UsXG4gICAgb25Qb2ludGVyVXBkYXRlLFxuICAgIHJlbmRlclRvcFJpZ2h0VUksXG4gICAgcmVuZGVyRm9vdGVyLFxuICAgIGxhbmdDb2RlID0gZGVmYXVsdExhbmcuY29kZSxcbiAgICB2aWV3TW9kZUVuYWJsZWQsXG4gICAgemVuTW9kZUVuYWJsZWQsXG4gICAgZ3JpZE1vZGVFbmFibGVkLFxuICAgIGxpYnJhcnlSZXR1cm5VcmwsXG4gICAgdGhlbWUsXG4gICAgbmFtZSxcbiAgICByZW5kZXJDdXN0b21TdGF0cyxcbiAgICBvblBhc3RlLFxuICAgIG9uRHJvcCxcbiAgICBkZXRlY3RTY3JvbGwgPSB0cnVlLFxuICAgIGhhbmRsZUtleWJvYXJkR2xvYmFsbHkgPSBmYWxzZSxcbiAgICBvbkxpYnJhcnlDaGFuZ2UsXG4gICAgYXV0b0ZvY3VzID0gZmFsc2UsXG4gICAgb25CZWZvcmVUZXh0RWRpdCxcbiAgICBvbkJlZm9yZVRleHRTdWJtaXQsXG4gICAgZ2VuZXJhdGVJZEZvckZpbGUsXG4gICAgb25UaGVtZUNoYW5nZVxuICB9ID0gcHJvcHM7XG4gIGNvbnN0IGNhbnZhc0FjdGlvbnMgPSBwcm9wcy5VSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM7XG4gIGNvbnN0IFVJT3B0aW9ucyA9IHtcbiAgICBjYW52YXNBY3Rpb25zOiBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIERFRkFVTFRfVUlfT1BUSU9OUy5jYW52YXNBY3Rpb25zKSwgY2FudmFzQWN0aW9ucylcbiAgfTtcblxuICBpZiAoY2FudmFzQWN0aW9ucz8uZXhwb3J0KSB7XG4gICAgVUlPcHRpb25zLmNhbnZhc0FjdGlvbnMuZXhwb3J0LnNhdmVGaWxlVG9EaXNrID0gY2FudmFzQWN0aW9ucy5leHBvcnQ/LnNhdmVGaWxlVG9EaXNrID8/IERFRkFVTFRfVUlfT1BUSU9OUy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzaztcbiAgfVxuXG4gIHVzZUVmZmVjdChmdW5jdGlvbiAoKSB7XG4gICAgLy8gQmxvY2sgcGluY2gtem9vbWluZyBvbiBpT1Mgb3V0c2lkZSBvZiB0aGUgY29udGVudCBhcmVhXG4gICAgY29uc3QgaGFuZGxlVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBpZiAodHlwZW9mIGV2ZW50LnNjYWxlID09PSBcIm51bWJlclwiICYmIGV2ZW50LnNjYWxlICE9PSAxKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJ0b3VjaG1vdmVcIiwgaGFuZGxlVG91Y2hNb3ZlLCB7XG4gICAgICBwYXNzaXZlOiBmYWxzZVxuICAgIH0pO1xuICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsIGhhbmRsZVRvdWNoTW92ZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuICByZXR1cm4gLyojX19QVVJFX18qL19qc3goSW5pdGlhbGl6ZUFwcCwge1xuICAgIGxhbmdDb2RlOiBsYW5nQ29kZSxcbiAgICBjaGlsZHJlbjogLyojX19QVVJFX18qL19qc3goQXBwLCB7XG4gICAgICBvbkNoYW5nZTogb25DaGFuZ2UsXG4gICAgICBpbml0aWFsRGF0YTogaW5pdGlhbERhdGEsXG4gICAgICBleGNhbGlkcmF3UmVmOiBleGNhbGlkcmF3UmVmLFxuICAgICAgb25Db2xsYWJCdXR0b25DbGljazogb25Db2xsYWJCdXR0b25DbGljayxcbiAgICAgIGlzQ29sbGFib3JhdGluZzogaXNDb2xsYWJvcmF0aW5nLFxuICAgICAgb25Qb2ludGVyVXBkYXRlOiBvblBvaW50ZXJVcGRhdGUsXG4gICAgICByZW5kZXJUb3BSaWdodFVJOiByZW5kZXJUb3BSaWdodFVJLFxuICAgICAgcmVuZGVyRm9vdGVyOiByZW5kZXJGb290ZXIsXG4gICAgICBsYW5nQ29kZTogbGFuZ0NvZGUsXG4gICAgICB2aWV3TW9kZUVuYWJsZWQ6IHZpZXdNb2RlRW5hYmxlZCxcbiAgICAgIHplbk1vZGVFbmFibGVkOiB6ZW5Nb2RlRW5hYmxlZCxcbiAgICAgIGdyaWRNb2RlRW5hYmxlZDogZ3JpZE1vZGVFbmFibGVkLFxuICAgICAgbGlicmFyeVJldHVyblVybDogbGlicmFyeVJldHVyblVybCxcbiAgICAgIHRoZW1lOiB0aGVtZSxcbiAgICAgIG5hbWU6IG5hbWUsXG4gICAgICByZW5kZXJDdXN0b21TdGF0czogcmVuZGVyQ3VzdG9tU3RhdHMsXG4gICAgICBVSU9wdGlvbnM6IFVJT3B0aW9ucyxcbiAgICAgIG9uUGFzdGU6IG9uUGFzdGUsXG4gICAgICBvbkRyb3A6IG9uRHJvcCxcbiAgICAgIGRldGVjdFNjcm9sbDogZGV0ZWN0U2Nyb2xsLFxuICAgICAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseTogaGFuZGxlS2V5Ym9hcmRHbG9iYWxseSxcbiAgICAgIG9uTGlicmFyeUNoYW5nZTogb25MaWJyYXJ5Q2hhbmdlLFxuICAgICAgYXV0b0ZvY3VzOiBhdXRvRm9jdXMsXG4gICAgICBvbkJlZm9yZVRleHRFZGl0OiBvbkJlZm9yZVRleHRFZGl0LFxuICAgICAgb25CZWZvcmVUZXh0U3VibWl0OiBvbkJlZm9yZVRleHRTdWJtaXQsXG4gICAgICBnZW5lcmF0ZUlkRm9yRmlsZTogZ2VuZXJhdGVJZEZvckZpbGUsXG4gICAgICBvblRoZW1lQ2hhbmdlOiBvblRoZW1lQ2hhbmdlXG4gICAgfSlcbiAgfSk7XG59O1xuXG5jb25zdCBhcmVFcXVhbCA9IGZ1bmN0aW9uIChwcmV2UHJvcHMsIG5leHRQcm9wcykge1xuICBjb25zdCB7XG4gICAgaW5pdGlhbERhdGE6IHByZXZJbml0aWFsRGF0YSxcbiAgICBVSU9wdGlvbnM6IHByZXZVSU9wdGlvbnMgPSB7fVxuICB9ID0gcHJldlByb3BzLFxuICAgICAgICBwcmV2ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKHByZXZQcm9wcywgX2V4Y2x1ZGVkKTtcblxuICBjb25zdCB7XG4gICAgaW5pdGlhbERhdGE6IG5leHRJbml0aWFsRGF0YSxcbiAgICBVSU9wdGlvbnM6IG5leHRVSU9wdGlvbnMgPSB7fVxuICB9ID0gbmV4dFByb3BzLFxuICAgICAgICBuZXh0ID0gX29iamVjdFdpdGhvdXRQcm9wZXJ0aWVzKG5leHRQcm9wcywgX2V4Y2x1ZGVkMik7IC8vIGNvbXBhcmluZyBVSU9wdGlvbnNcblxuXG4gIGNvbnN0IHByZXZVSU9wdGlvbnNLZXlzID0gT2JqZWN0LmtleXMocHJldlVJT3B0aW9ucyk7XG4gIGNvbnN0IG5leHRVSU9wdGlvbnNLZXlzID0gT2JqZWN0LmtleXMobmV4dFVJT3B0aW9ucyk7XG5cbiAgaWYgKHByZXZVSU9wdGlvbnNLZXlzLmxlbmd0aCAhPT0gbmV4dFVJT3B0aW9uc0tleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNVSU9wdGlvbnNTYW1lID0gcHJldlVJT3B0aW9uc0tleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgIGlmIChrZXkgPT09IFwiY2FudmFzQWN0aW9uc1wiKSB7XG4gICAgICBjb25zdCBjYW52YXNPcHRpb25LZXlzID0gT2JqZWN0LmtleXMocHJldlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zKTtcbiAgICAgIGNhbnZhc09wdGlvbktleXMuZXZlcnkoZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoa2V5ID09PSBcImV4cG9ydFwiICYmIHByZXZVSU9wdGlvbnM/LmNhbnZhc0FjdGlvbnM/LmV4cG9ydCAmJiBuZXh0VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5leHBvcnQpIHtcbiAgICAgICAgICByZXR1cm4gcHJldlVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzayA9PT0gbmV4dFVJT3B0aW9ucy5jYW52YXNBY3Rpb25zLmV4cG9ydC5zYXZlRmlsZVRvRGlzaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwcmV2VUlPcHRpb25zPy5jYW52YXNBY3Rpb25zPy5ba2V5XSA9PT0gbmV4dFVJT3B0aW9ucz8uY2FudmFzQWN0aW9ucz8uW2tleV07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG4gIGNvbnN0IHByZXZLZXlzID0gT2JqZWN0LmtleXMocHJldlByb3BzKTtcbiAgY29uc3QgbmV4dEtleXMgPSBPYmplY3Qua2V5cyhuZXh0UHJvcHMpO1xuICByZXR1cm4gaXNVSU9wdGlvbnNTYW1lICYmIHByZXZLZXlzLmxlbmd0aCA9PT0gbmV4dEtleXMubGVuZ3RoICYmIHByZXZLZXlzLmV2ZXJ5KGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gcHJldltrZXldID09PSBuZXh0W2tleV07XG4gIH0pO1xufTtcblxuY29uc3QgZm9yd2FyZGVkUmVmQ29tcCA9IC8qI19fUFVSRV9fKi9mb3J3YXJkUmVmKGZ1bmN0aW9uIChwcm9wcywgcmVmKSB7XG4gIHJldHVybiAvKiNfX1BVUkVfXyovX2pzeChFeGNhbGlkcmF3LCBfb2JqZWN0U3ByZWFkKF9vYmplY3RTcHJlYWQoe30sIHByb3BzKSwge30sIHtcbiAgICBleGNhbGlkcmF3UmVmOiByZWZcbiAgfSkpO1xufSk7XG5leHBvcnQgZGVmYXVsdCAvKiNfX1BVUkVfXyovUmVhY3QubWVtbyhmb3J3YXJkZWRSZWZDb21wLCBhcmVFcXVhbCk7XG5leHBvcnQgeyBnZXRTY2VuZVZlcnNpb24sIGlzSW52aXNpYmx5U21hbGxFbGVtZW50LCBnZXROb25EZWxldGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vLi4vZWxlbWVudFwiO1xuZXhwb3J0IHsgZGVmYXVsdExhbmcsIGxhbmd1YWdlcyB9IGZyb20gXCIuLi8uLi9pMThuXCI7XG5leHBvcnQgeyByZXN0b3JlLCByZXN0b3JlQXBwU3RhdGUsIHJlc3RvcmVFbGVtZW50cyB9IGZyb20gXCIuLi8uLi9kYXRhL3Jlc3RvcmVcIjtcbmV4cG9ydCB7IGV4cG9ydFRvQ2FudmFzLCBleHBvcnRUb0Jsb2IsIGV4cG9ydFRvU3ZnLCBzZXJpYWxpemVBc0pTT04sIGxvYWRMaWJyYXJ5RnJvbUJsb2IsIGxvYWRGcm9tQmxvYiwgZ2V0RnJlZURyYXdTdmdQYXRoLCBnZXRDb21tb25Cb3VuZGluZ0JveCwgZ2V0TWF4aW11bUdyb3VwcywgaW50ZXJzZWN0RWxlbWVudFdpdGhMaW5lLCBkZXRlcm1pbmVGb2N1c0Rpc3RhbmNlIH0gZnJvbSBcIi4uLy4uL3BhY2thZ2VzL3V0aWxzXCI7XG5leHBvcnQgeyBpc0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi4vLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5leHBvcnQgeyBGT05UX0ZBTUlMWSwgVEhFTUUgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5leHBvcnQgeyBtdXRhdGVFbGVtZW50LCBuZXdFbGVtZW50V2l0aCwgYnVtcFZlcnNpb24gfSBmcm9tIFwiLi4vLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\\n//# sourceURL=webpack-internal:///./index.tsx\\n\");\n\n//# sourceURL=webpack://Excalidraw/./index.tsx?");
2868
2868
 
2869
2869
  /***/ }),
2870
2870
 
@@ -3777,7 +3777,7 @@ eval("module.exports = JSON.parse('{\"labels\":{\"paste\":\"貼上\",\"pasteChar
3777
3777
  /***/ ((module) => {
3778
3778
 
3779
3779
  "use strict";
3780
- eval("module.exports = JSON.parse('{\"name\":\"@zsviczian/excalidraw\",\"version\":\"0.10.0-obsidian-35\",\"main\":\"main.js\",\"types\":\"types/packages/excalidraw/index.d.ts\",\"files\":[\"dist/*\",\"types/*\"],\"publishConfig\":{\"access\":\"public\"},\"description\":\"Excalidraw as a React component\",\"repository\":\"https://github.com/excalidraw/excalidraw\",\"license\":\"MIT\",\"keywords\":[\"excalidraw\",\"excalidraw-embed\",\"react\",\"npm\",\"npm excalidraw\"],\"browserslist\":{\"production\":[\">0.2%\",\"not dead\",\"not ie <= 11\",\"not op_mini all\",\"not safari < 12\",\"not kaios <= 2.5\",\"not edge < 79\",\"not chrome < 70\",\"not and_uc < 13\",\"not samsung < 10\"],\"development\":[\"last 1 chrome version\",\"last 1 firefox version\",\"last 1 safari version\"]},\"peerDependencies\":{\"react\":\"^17.0.2\",\"react-dom\":\"^17.0.2\"},\"devDependencies\":{\"@babel/core\":\"7.16.7\",\"@babel/plugin-transform-arrow-functions\":\"7.16.7\",\"@babel/plugin-transform-async-to-generator\":\"7.16.0\",\"@babel/plugin-transform-runtime\":\"7.16.4\",\"@babel/plugin-transform-typescript\":\"7.16.1\",\"@babel/preset-env\":\"7.16.7\",\"@babel/preset-react\":\"7.16.7\",\"@babel/preset-typescript\":\"7.16.7\",\"autoprefixer\":\"10.4.2\",\"babel-loader\":\"8.2.3\",\"babel-plugin-transform-class-properties\":\"6.24.1\",\"cross-env\":\"7.0.3\",\"css-loader\":\"6.5.1\",\"mini-css-extract-plugin\":\"2.4.6\",\"postcss-loader\":\"6.2.1\",\"sass-loader\":\"12.4.0\",\"terser-webpack-plugin\":\"5.3.0\",\"ts-loader\":\"9.2.6\",\"typescript\":\"4.5.4\",\"webpack\":\"5.65.0\",\"webpack-bundle-analyzer\":\"4.5.0\",\"webpack-cli\":\"4.9.1\",\"webpack-dev-server\":\"4.7.2\",\"webpack-merge\":\"5.8.0\"},\"bugs\":\"https://github.com/excalidraw/excalidraw/issues\",\"homepage\":\"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw\",\"scripts\":{\"gen:types\":\"tsc --project ../../../tsconfig-types.json\",\"build:umd\":\"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types\",\"build:umd:withAnalyzer\":\"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js\",\"pack\":\"yarn build:umd && yarn pack\",\"start\":\"webpack serve --config webpack.dev-server.config.js \"},\"dependencies\":{\"dotenv\":\"10.0.0\"}}');\n\n//# sourceURL=webpack://Excalidraw/./package.json?");
3780
+ eval("module.exports = JSON.parse('{\"name\":\"@zsviczian/excalidraw\",\"version\":\"0.10.0-obsidian-36\",\"main\":\"main.js\",\"types\":\"types/packages/excalidraw/index.d.ts\",\"files\":[\"dist/*\",\"types/*\"],\"publishConfig\":{\"access\":\"public\"},\"description\":\"Excalidraw as a React component\",\"repository\":\"https://github.com/excalidraw/excalidraw\",\"license\":\"MIT\",\"keywords\":[\"excalidraw\",\"excalidraw-embed\",\"react\",\"npm\",\"npm excalidraw\"],\"browserslist\":{\"production\":[\">0.2%\",\"not dead\",\"not ie <= 11\",\"not op_mini all\",\"not safari < 12\",\"not kaios <= 2.5\",\"not edge < 79\",\"not chrome < 70\",\"not and_uc < 13\",\"not samsung < 10\"],\"development\":[\"last 1 chrome version\",\"last 1 firefox version\",\"last 1 safari version\"]},\"peerDependencies\":{\"react\":\"^17.0.2\",\"react-dom\":\"^17.0.2\"},\"devDependencies\":{\"@babel/core\":\"7.16.7\",\"@babel/plugin-transform-arrow-functions\":\"7.16.7\",\"@babel/plugin-transform-async-to-generator\":\"7.16.0\",\"@babel/plugin-transform-runtime\":\"7.16.8\",\"@babel/plugin-transform-typescript\":\"7.16.1\",\"@babel/preset-env\":\"7.16.7\",\"@babel/preset-react\":\"7.16.7\",\"@babel/preset-typescript\":\"7.16.7\",\"autoprefixer\":\"10.4.2\",\"babel-loader\":\"8.2.3\",\"babel-plugin-transform-class-properties\":\"6.24.1\",\"cross-env\":\"7.0.3\",\"css-loader\":\"6.5.1\",\"mini-css-extract-plugin\":\"2.4.6\",\"postcss-loader\":\"6.2.1\",\"sass-loader\":\"12.4.0\",\"terser-webpack-plugin\":\"5.3.0\",\"ts-loader\":\"9.2.6\",\"typescript\":\"4.5.4\",\"webpack\":\"5.65.0\",\"webpack-bundle-analyzer\":\"4.5.0\",\"webpack-cli\":\"4.9.1\",\"webpack-dev-server\":\"4.7.3\",\"webpack-merge\":\"5.8.0\"},\"bugs\":\"https://github.com/excalidraw/excalidraw/issues\",\"homepage\":\"https://github.com/excalidraw/excalidraw/tree/master/src/packages/excalidraw\",\"scripts\":{\"gen:types\":\"tsc --project ../../../tsconfig-types.json\",\"build:umd\":\"cross-env NODE_ENV=production webpack --config webpack.prod.config.js && cross-env NODE_ENV=development webpack --config webpack.dev.config.js && yarn gen:types\",\"build:umd:withAnalyzer\":\"cross-env NODE_ENV=production ANALYZER=true webpack --config webpack.prod.config.js\",\"pack\":\"yarn build:umd && yarn pack\",\"start\":\"webpack serve --config webpack.dev-server.config.js \"},\"dependencies\":{\"dotenv\":\"10.0.0\"}}');\n\n//# sourceURL=webpack://Excalidraw/./package.json?");
3781
3781
 
3782
3782
  /***/ })
3783
3783