@excalidraw/excalidraw 0.14.2-cef6094 → 0.14.2-dd4c333
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.
- package/dist/excalidraw.development.js +18 -18
- package/dist/excalidraw.production.min.js +1 -1
- package/package.json +1 -1
- package/types/actions/actionDuplicateSelection.d.ts +1 -1
- package/types/actions/shortcuts.d.ts +1 -0
- package/types/actions/types.d.ts +1 -0
- package/types/data/blob.d.ts +1 -0
- package/types/element/mutateElement.d.ts +1 -0
- package/types/element/newElement.d.ts +1 -0
- package/types/element/textElement.d.ts +1 -0
- package/types/element/typeChecks.d.ts +1 -0
- package/types/element/types.d.ts +1 -0
- package/types/types.d.ts +1 -0
- package/types/utility-types.d.ts +22 -0
|
@@ -2316,7 +2316,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2316
2316
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2317
2317
|
|
|
2318
2318
|
"use strict";
|
|
2319
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getShortcutFromShortcutName\": () => (/* binding */ getShortcutFromShortcutName)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n\n\n\nconst shortcutMap = {\n toggleTheme: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+Alt+D\")],\n saveScene: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+S\")],\n loadScene: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+O\")],\n clearCanvas: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Delete\")],\n imageExport: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+E\")],\n cut: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+X\")],\n copy: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+C\")],\n paste: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+V\")],\n copyStyles: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+C\")],\n pasteStyles: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+V\")],\n selectAll: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+A\")],\n deleteSelectedElements: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Delete\")],\n duplicateSelection: [\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+D\"),\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(`Alt+${(0,_i18n__WEBPACK_IMPORTED_MODULE_1__.t)(\"helpDialog.drag\")}`),\n ],\n sendBackward: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+[\")],\n bringForward: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+]\")],\n sendToBack: [\n _constants__WEBPACK_IMPORTED_MODULE_0__.isDarwin\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+[\")\n : (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+[\"),\n ],\n bringToFront: [\n _constants__WEBPACK_IMPORTED_MODULE_0__.isDarwin\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+]\")\n : (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+]\"),\n ],\n copyAsPng: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+Alt+C\")],\n copyAsSvg: [],\n group: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+G\")],\n ungroup: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+G\")],\n gridMode: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+'\")],\n zenMode: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Alt+Z\")],\n stats: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Alt+/\")],\n addToLibrary: [],\n flipHorizontal: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+H\")],\n flipVertical: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+V\")],\n viewMode: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Alt+R\")],\n hyperlink: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+K\")],\n toggleLock: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+L\")],\n};\nconst getShortcutFromShortcutName = (name) => {\n const shortcuts = shortcutMap[name];\n // if multiple shortcuts available, take the first one\n return shortcuts && shortcuts.length > 0 ? shortcuts[0] : \"\";\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQy9ELENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL3Nob3J0Y3V0cy50cz85ZTBhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyBnZXRTaG9ydGN1dEtleSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQWN0aW9uTmFtZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCB0eXBlIFNob3J0Y3V0TmFtZSA9XG4gIHwgU3VidHlwZU9mPFxuICAgICAgQWN0aW9uTmFtZSxcbiAgICAgIHwgXCJ0b2dnbGVUaGVtZVwiXG4gICAgICB8IFwibG9hZFNjZW5lXCJcbiAgICAgIHwgXCJjbGVhckNhbnZhc1wiXG4gICAgICB8IFwiY3V0XCJcbiAgICAgIHwgXCJjb3B5XCJcbiAgICAgIHwgXCJwYXN0ZVwiXG4gICAgICB8IFwiY29weVN0eWxlc1wiXG4gICAgICB8IFwicGFzdGVTdHlsZXNcIlxuICAgICAgfCBcInNlbGVjdEFsbFwiXG4gICAgICB8IFwiZGVsZXRlU2VsZWN0ZWRFbGVtZW50c1wiXG4gICAgICB8IFwiZHVwbGljYXRlU2VsZWN0aW9uXCJcbiAgICAgIHwgXCJzZW5kQmFja3dhcmRcIlxuICAgICAgfCBcImJyaW5nRm9yd2FyZFwiXG4gICAgICB8IFwic2VuZFRvQmFja1wiXG4gICAgICB8IFwiYnJpbmdUb0Zyb250XCJcbiAgICAgIHwgXCJjb3B5QXNQbmdcIlxuICAgICAgfCBcImNvcHlBc1N2Z1wiXG4gICAgICB8IFwiZ3JvdXBcIlxuICAgICAgfCBcInVuZ3JvdXBcIlxuICAgICAgfCBcImdyaWRNb2RlXCJcbiAgICAgIHwgXCJ6ZW5Nb2RlXCJcbiAgICAgIHwgXCJzdGF0c1wiXG4gICAgICB8IFwiYWRkVG9MaWJyYXJ5XCJcbiAgICAgIHwgXCJ2aWV3TW9kZVwiXG4gICAgICB8IFwiZmxpcEhvcml6b250YWxcIlxuICAgICAgfCBcImZsaXBWZXJ0aWNhbFwiXG4gICAgICB8IFwiaHlwZXJsaW5rXCJcbiAgICAgIHwgXCJ0b2dnbGVMb2NrXCJcbiAgICA+XG4gIHwgXCJzYXZlU2NlbmVcIlxuICB8IFwiaW1hZ2VFeHBvcnRcIjtcblxuY29uc3Qgc2hvcnRjdXRNYXA6IFJlY29yZDxTaG9ydGN1dE5hbWUsIHN0cmluZ1tdPiA9IHtcbiAgdG9nZ2xlVGhlbWU6IFtnZXRTaG9ydGN1dEtleShcIlNoaWZ0K0FsdCtEXCIpXSxcbiAgc2F2ZVNjZW5lOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrU1wiKV0sXG4gIGxvYWRTY2VuZTogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK09cIildLFxuICBjbGVhckNhbnZhczogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0RlbGV0ZVwiKV0sXG4gIGltYWdlRXhwb3J0OiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrU2hpZnQrRVwiKV0sXG4gIGN1dDogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1hcIildLFxuICBjb3B5OiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrQ1wiKV0sXG4gIHBhc3RlOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrVlwiKV0sXG4gIGNvcHlTdHlsZXM6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtBbHQrQ1wiKV0sXG4gIHBhc3RlU3R5bGVzOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrQWx0K1ZcIildLFxuICBzZWxlY3RBbGw6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtBXCIpXSxcbiAgZGVsZXRlU2VsZWN0ZWRFbGVtZW50czogW2dldFNob3J0Y3V0S2V5KFwiRGVsZXRlXCIpXSxcbiAgZHVwbGljYXRlU2VsZWN0aW9uOiBbXG4gICAgZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrRFwiKSxcbiAgICBnZXRTaG9ydGN1dEtleShgQWx0KyR7dChcImhlbHBEaWFsb2cuZHJhZ1wiKX1gKSxcbiAgXSxcbiAgc2VuZEJhY2t3YXJkOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrW1wiKV0sXG4gIGJyaW5nRm9yd2FyZDogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK11cIildLFxuICBzZW5kVG9CYWNrOiBbXG4gICAgaXNEYXJ3aW5cbiAgICAgID8gZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrQWx0K1tcIilcbiAgICAgIDogZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrU2hpZnQrW1wiKSxcbiAgXSxcbiAgYnJpbmdUb0Zyb250OiBbXG4gICAgaXNEYXJ3aW5cbiAgICAgID8gZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrQWx0K11cIilcbiAgICAgIDogZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrU2hpZnQrXVwiKSxcbiAgXSxcbiAgY29weUFzUG5nOiBbZ2V0U2hvcnRjdXRLZXkoXCJTaGlmdCtBbHQrQ1wiKV0sXG4gIGNvcHlBc1N2ZzogW10sXG4gIGdyb3VwOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrR1wiKV0sXG4gIHVuZ3JvdXA6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtTaGlmdCtHXCIpXSxcbiAgZ3JpZE1vZGU6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCsnXCIpXSxcbiAgemVuTW9kZTogW2dldFNob3J0Y3V0S2V5KFwiQWx0K1pcIildLFxuICBzdGF0czogW2dldFNob3J0Y3V0S2V5KFwiQWx0Ky9cIildLFxuICBhZGRUb0xpYnJhcnk6IFtdLFxuICBmbGlwSG9yaXpvbnRhbDogW2dldFNob3J0Y3V0S2V5KFwiU2hpZnQrSFwiKV0sXG4gIGZsaXBWZXJ0aWNhbDogW2dldFNob3J0Y3V0S2V5KFwiU2hpZnQrVlwiKV0sXG4gIHZpZXdNb2RlOiBbZ2V0U2hvcnRjdXRLZXkoXCJBbHQrUlwiKV0sXG4gIGh5cGVybGluazogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0tcIildLFxuICB0b2dnbGVMb2NrOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrU2hpZnQrTFwiKV0sXG59O1xuXG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRGcm9tU2hvcnRjdXROYW1lID0gKG5hbWU6IFNob3J0Y3V0TmFtZSkgPT4ge1xuICBjb25zdCBzaG9ydGN1dHMgPSBzaG9ydGN1dE1hcFtuYW1lXTtcbiAgLy8gaWYgbXVsdGlwbGUgc2hvcnRjdXRzIGF2YWlsYWJsZSwgdGFrZSB0aGUgZmlyc3Qgb25lXG4gIHJldHVybiBzaG9ydGN1dHMgJiYgc2hvcnRjdXRzLmxlbmd0aCA+IDAgPyBzaG9ydGN1dHNbMF0gOiBcIlwiO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/shortcuts.ts\n");
|
|
2319
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getShortcutFromShortcutName\": () => (/* binding */ getShortcutFromShortcutName)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n\n\n\nconst shortcutMap = {\n toggleTheme: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+Alt+D\")],\n saveScene: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+S\")],\n loadScene: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+O\")],\n clearCanvas: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Delete\")],\n imageExport: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+E\")],\n cut: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+X\")],\n copy: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+C\")],\n paste: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+V\")],\n copyStyles: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+C\")],\n pasteStyles: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+V\")],\n selectAll: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+A\")],\n deleteSelectedElements: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Delete\")],\n duplicateSelection: [\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+D\"),\n (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(`Alt+${(0,_i18n__WEBPACK_IMPORTED_MODULE_1__.t)(\"helpDialog.drag\")}`),\n ],\n sendBackward: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+[\")],\n bringForward: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+]\")],\n sendToBack: [\n _constants__WEBPACK_IMPORTED_MODULE_0__.isDarwin\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+[\")\n : (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+[\"),\n ],\n bringToFront: [\n _constants__WEBPACK_IMPORTED_MODULE_0__.isDarwin\n ? (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Alt+]\")\n : (0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+]\"),\n ],\n copyAsPng: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+Alt+C\")],\n copyAsSvg: [],\n group: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+G\")],\n ungroup: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+G\")],\n gridMode: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+'\")],\n zenMode: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Alt+Z\")],\n stats: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Alt+/\")],\n addToLibrary: [],\n flipHorizontal: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+H\")],\n flipVertical: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Shift+V\")],\n viewMode: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"Alt+R\")],\n hyperlink: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+K\")],\n toggleLock: [(0,_utils__WEBPACK_IMPORTED_MODULE_2__.getShortcutKey)(\"CtrlOrCmd+Shift+L\")],\n};\nconst getShortcutFromShortcutName = (name) => {\n const shortcuts = shortcutMap[name];\n // if multiple shortcuts available, take the first one\n return shortcuts && shortcuts.length > 0 ? shortcuts[0] : \"\";\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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UyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQy9ELENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9hY3Rpb25zL3Nob3J0Y3V0cy50cz85ZTBhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgdCB9IGZyb20gXCIuLi9pMThuXCI7XG5pbXBvcnQgeyBTdWJ0eXBlT2YgfSBmcm9tIFwiLi4vdXRpbGl0eS10eXBlc1wiO1xuaW1wb3J0IHsgZ2V0U2hvcnRjdXRLZXkgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEFjdGlvbk5hbWUgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBTaG9ydGN1dE5hbWUgPVxuICB8IFN1YnR5cGVPZjxcbiAgICAgIEFjdGlvbk5hbWUsXG4gICAgICB8IFwidG9nZ2xlVGhlbWVcIlxuICAgICAgfCBcImxvYWRTY2VuZVwiXG4gICAgICB8IFwiY2xlYXJDYW52YXNcIlxuICAgICAgfCBcImN1dFwiXG4gICAgICB8IFwiY29weVwiXG4gICAgICB8IFwicGFzdGVcIlxuICAgICAgfCBcImNvcHlTdHlsZXNcIlxuICAgICAgfCBcInBhc3RlU3R5bGVzXCJcbiAgICAgIHwgXCJzZWxlY3RBbGxcIlxuICAgICAgfCBcImRlbGV0ZVNlbGVjdGVkRWxlbWVudHNcIlxuICAgICAgfCBcImR1cGxpY2F0ZVNlbGVjdGlvblwiXG4gICAgICB8IFwic2VuZEJhY2t3YXJkXCJcbiAgICAgIHwgXCJicmluZ0ZvcndhcmRcIlxuICAgICAgfCBcInNlbmRUb0JhY2tcIlxuICAgICAgfCBcImJyaW5nVG9Gcm9udFwiXG4gICAgICB8IFwiY29weUFzUG5nXCJcbiAgICAgIHwgXCJjb3B5QXNTdmdcIlxuICAgICAgfCBcImdyb3VwXCJcbiAgICAgIHwgXCJ1bmdyb3VwXCJcbiAgICAgIHwgXCJncmlkTW9kZVwiXG4gICAgICB8IFwiemVuTW9kZVwiXG4gICAgICB8IFwic3RhdHNcIlxuICAgICAgfCBcImFkZFRvTGlicmFyeVwiXG4gICAgICB8IFwidmlld01vZGVcIlxuICAgICAgfCBcImZsaXBIb3Jpem9udGFsXCJcbiAgICAgIHwgXCJmbGlwVmVydGljYWxcIlxuICAgICAgfCBcImh5cGVybGlua1wiXG4gICAgICB8IFwidG9nZ2xlTG9ja1wiXG4gICAgPlxuICB8IFwic2F2ZVNjZW5lXCJcbiAgfCBcImltYWdlRXhwb3J0XCI7XG5cbmNvbnN0IHNob3J0Y3V0TWFwOiBSZWNvcmQ8U2hvcnRjdXROYW1lLCBzdHJpbmdbXT4gPSB7XG4gIHRvZ2dsZVRoZW1lOiBbZ2V0U2hvcnRjdXRLZXkoXCJTaGlmdCtBbHQrRFwiKV0sXG4gIHNhdmVTY2VuZTogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1NcIildLFxuICBsb2FkU2NlbmU6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtPXCIpXSxcbiAgY2xlYXJDYW52YXM6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtEZWxldGVcIildLFxuICBpbWFnZUV4cG9ydDogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1NoaWZ0K0VcIildLFxuICBjdXQ6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtYXCIpXSxcbiAgY29weTogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0NcIildLFxuICBwYXN0ZTogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1ZcIildLFxuICBjb3B5U3R5bGVzOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrQWx0K0NcIildLFxuICBwYXN0ZVN0eWxlczogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0FsdCtWXCIpXSxcbiAgc2VsZWN0QWxsOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrQVwiKV0sXG4gIGRlbGV0ZVNlbGVjdGVkRWxlbWVudHM6IFtnZXRTaG9ydGN1dEtleShcIkRlbGV0ZVwiKV0sXG4gIGR1cGxpY2F0ZVNlbGVjdGlvbjogW1xuICAgIGdldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0RcIiksXG4gICAgZ2V0U2hvcnRjdXRLZXkoYEFsdCske3QoXCJoZWxwRGlhbG9nLmRyYWdcIil9YCksXG4gIF0sXG4gIHNlbmRCYWNrd2FyZDogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1tcIildLFxuICBicmluZ0ZvcndhcmQ6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtdXCIpXSxcbiAgc2VuZFRvQmFjazogW1xuICAgIGlzRGFyd2luXG4gICAgICA/IGdldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0FsdCtbXCIpXG4gICAgICA6IGdldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1NoaWZ0K1tcIiksXG4gIF0sXG4gIGJyaW5nVG9Gcm9udDogW1xuICAgIGlzRGFyd2luXG4gICAgICA/IGdldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0FsdCtdXCIpXG4gICAgICA6IGdldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1NoaWZ0K11cIiksXG4gIF0sXG4gIGNvcHlBc1BuZzogW2dldFNob3J0Y3V0S2V5KFwiU2hpZnQrQWx0K0NcIildLFxuICBjb3B5QXNTdmc6IFtdLFxuICBncm91cDogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK0dcIildLFxuICB1bmdyb3VwOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrU2hpZnQrR1wiKV0sXG4gIGdyaWRNb2RlOiBbZ2V0U2hvcnRjdXRLZXkoXCJDdHJsT3JDbWQrJ1wiKV0sXG4gIHplbk1vZGU6IFtnZXRTaG9ydGN1dEtleShcIkFsdCtaXCIpXSxcbiAgc3RhdHM6IFtnZXRTaG9ydGN1dEtleShcIkFsdCsvXCIpXSxcbiAgYWRkVG9MaWJyYXJ5OiBbXSxcbiAgZmxpcEhvcml6b250YWw6IFtnZXRTaG9ydGN1dEtleShcIlNoaWZ0K0hcIildLFxuICBmbGlwVmVydGljYWw6IFtnZXRTaG9ydGN1dEtleShcIlNoaWZ0K1ZcIildLFxuICB2aWV3TW9kZTogW2dldFNob3J0Y3V0S2V5KFwiQWx0K1JcIildLFxuICBoeXBlcmxpbms6IFtnZXRTaG9ydGN1dEtleShcIkN0cmxPckNtZCtLXCIpXSxcbiAgdG9nZ2xlTG9jazogW2dldFNob3J0Y3V0S2V5KFwiQ3RybE9yQ21kK1NoaWZ0K0xcIildLFxufTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0RnJvbVNob3J0Y3V0TmFtZSA9IChuYW1lOiBTaG9ydGN1dE5hbWUpID0+IHtcbiAgY29uc3Qgc2hvcnRjdXRzID0gc2hvcnRjdXRNYXBbbmFtZV07XG4gIC8vIGlmIG11bHRpcGxlIHNob3J0Y3V0cyBhdmFpbGFibGUsIHRha2UgdGhlIGZpcnN0IG9uZVxuICByZXR1cm4gc2hvcnRjdXRzICYmIHNob3J0Y3V0cy5sZW5ndGggPiAwID8gc2hvcnRjdXRzWzBdIDogXCJcIjtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../actions/shortcuts.ts\n");
|
|
2320
2320
|
|
|
2321
2321
|
/***/ }),
|
|
2322
2322
|
|
|
@@ -2338,7 +2338,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2338
2338
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2339
2339
|
|
|
2340
2340
|
"use strict";
|
|
2341
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-
|
|
2341
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-dd4c333\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-dd4c333\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsZzlCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksZzlCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2342
2342
|
|
|
2343
2343
|
/***/ }),
|
|
2344
2344
|
|
|
@@ -3251,7 +3251,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3251
3251
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3252
3252
|
|
|
3253
3253
|
"use strict";
|
|
3254
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVGStringToFile\": () => (/* binding */ SVGStringToFile),\n/* harmony export */ \"blobToArrayBuffer\": () => (/* binding */ blobToArrayBuffer),\n/* harmony export */ \"canvasToBlob\": () => (/* binding */ canvasToBlob),\n/* harmony export */ \"createFile\": () => (/* binding */ createFile),\n/* harmony export */ \"dataURLToFile\": () => (/* binding */ dataURLToFile),\n/* harmony export */ \"generateIdFromFile\": () => (/* binding */ generateIdFromFile),\n/* harmony export */ \"getDataURL\": () => (/* binding */ getDataURL),\n/* harmony export */ \"getFileFromEvent\": () => (/* binding */ getFileFromEvent),\n/* harmony export */ \"getFileHandle\": () => (/* binding */ getFileHandle),\n/* harmony export */ \"getFileHandleType\": () => (/* binding */ getFileHandleType),\n/* harmony export */ \"getMimeType\": () => (/* binding */ getMimeType),\n/* harmony export */ \"isImageFileHandle\": () => (/* binding */ isImageFileHandle),\n/* harmony export */ \"isImageFileHandleType\": () => (/* binding */ isImageFileHandleType),\n/* harmony export */ \"isSupportedImageFile\": () => (/* binding */ isSupportedImageFile),\n/* harmony export */ \"loadFromBlob\": () => (/* binding */ loadFromBlob),\n/* harmony export */ \"loadLibraryFromBlob\": () => (/* binding */ loadLibraryFromBlob),\n/* harmony export */ \"loadSceneOrLibraryFromBlob\": () => (/* binding */ loadSceneOrLibraryFromBlob),\n/* harmony export */ \"normalizeFile\": () => (/* binding */ normalizeFile),\n/* harmony export */ \"parseLibraryJSON\": () => (/* binding */ parseLibraryJSON),\n/* harmony export */ \"resizeImageFile\": () => (/* binding */ resizeImageFile)\n/* harmony export */ });\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.browser.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../errors */ \"../../errors.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _filesystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _json__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./json */ \"../../data/json.ts\");\n/* harmony import */ var _restore__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./restore */ \"../../data/restore.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nconst parseFileContents = (blob) => __awaiter(void 0, void 0, void 0, function* () {\n let contents;\n if (blob.type === _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.png) {\n try {\n return yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./image */ \"../../data/image.ts\"))).decodePngMetadata(blob);\n }\n catch (error) {\n if (error.message === \"INVALID\") {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.imageDoesNotContainScene\"), \"EncodingError\");\n }\n else {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.cannotRestoreFromImage\"), \"EncodingError\");\n }\n }\n }\n else {\n if (\"text\" in Blob) {\n contents = yield blob.text();\n }\n else {\n contents = yield new Promise((resolve) => {\n const reader = new FileReader();\n reader.readAsText(blob, \"utf8\");\n reader.onloadend = () => {\n if (reader.readyState === FileReader.DONE) {\n resolve(reader.result);\n }\n };\n });\n }\n if (blob.type === _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg) {\n try {\n return yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./image */ \"../../data/image.ts\"))).decodeSvgMetadata({\n svg: contents,\n });\n }\n catch (error) {\n if (error.message === \"INVALID\") {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.imageDoesNotContainScene\"), \"EncodingError\");\n }\n else {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.cannotRestoreFromImage\"), \"EncodingError\");\n }\n }\n }\n }\n return contents;\n});\nconst getMimeType = (blob) => {\n let name;\n if (typeof blob === \"string\") {\n name = blob;\n }\n else {\n if (blob.type) {\n return blob.type;\n }\n name = blob.name || \"\";\n }\n if (/\\.(excalidraw|json)$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.json;\n }\n else if (/\\.png$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.png;\n }\n else if (/\\.jpe?g$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.jpg;\n }\n else if (/\\.svg$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg;\n }\n return \"\";\n};\nconst getFileHandleType = (handle) => {\n var _a;\n if (!handle) {\n return null;\n }\n return ((_a = handle.name.match(/\\.(json|excalidraw|png|svg)$/)) === null || _a === void 0 ? void 0 : _a[1]) || null;\n};\nconst isImageFileHandleType = (type) => {\n return type === \"png\" || type === \"svg\";\n};\nconst isImageFileHandle = (handle) => {\n const type = getFileHandleType(handle);\n return type === \"png\" || type === \"svg\";\n};\nconst isSupportedImageFile = (blob) => {\n const { type } = blob || {};\n return (!!type && _constants__WEBPACK_IMPORTED_MODULE_1__.ALLOWED_IMAGE_MIME_TYPES.includes(type));\n};\nconst loadSceneOrLibraryFromBlob = (blob, \n/** @see restore.localAppState */\nlocalAppState, localElements, \n/** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\nfileHandle) => __awaiter(void 0, void 0, void 0, function* () {\n const contents = yield parseFileContents(blob);\n try {\n const data = JSON.parse(contents);\n if ((0,_json__WEBPACK_IMPORTED_MODULE_8__.isValidExcalidrawData)(data)) {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidraw,\n data: (0,_restore__WEBPACK_IMPORTED_MODULE_9__.restore)({\n elements: (0,_element__WEBPACK_IMPORTED_MODULE_2__.clearElementsForExport)(data.elements || []),\n appState: Object.assign(Object.assign({ theme: localAppState === null || localAppState === void 0 ? void 0 : localAppState.theme, fileHandle: fileHandle || blob.handle || null }, (0,_appState__WEBPACK_IMPORTED_MODULE_0__.cleanAppStateForExport)(data.appState || {})), (localAppState\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_5__.calculateScrollCenter)(data.elements || [], localAppState, null)\n : {})),\n files: data.files,\n }, localAppState, localElements, { repairBindings: true }),\n };\n }\n else if ((0,_json__WEBPACK_IMPORTED_MODULE_8__.isValidLibrary)(data)) {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidrawlib,\n data,\n };\n }\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.couldNotLoadInvalidFile\"));\n }\n catch (error) {\n console.error(error.message);\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.couldNotLoadInvalidFile\"));\n }\n});\nconst loadFromBlob = (blob, \n/** @see restore.localAppState */\nlocalAppState, localElements, \n/** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\nfileHandle) => __awaiter(void 0, void 0, void 0, function* () {\n const ret = yield loadSceneOrLibraryFromBlob(blob, localAppState, localElements, fileHandle);\n if (ret.type !== _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidraw) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.couldNotLoadInvalidFile\"));\n }\n return ret.data;\n});\nconst parseLibraryJSON = (json, defaultStatus = \"unpublished\") => {\n const data = JSON.parse(json);\n if (!(0,_json__WEBPACK_IMPORTED_MODULE_8__.isValidLibrary)(data)) {\n throw new Error(\"Invalid library\");\n }\n const libraryItems = data.libraryItems || data.library;\n return (0,_restore__WEBPACK_IMPORTED_MODULE_9__.restoreLibraryItems)(libraryItems, defaultStatus);\n};\nconst loadLibraryFromBlob = (blob, defaultStatus = \"unpublished\") => __awaiter(void 0, void 0, void 0, function* () {\n return parseLibraryJSON(yield parseFileContents(blob), defaultStatus);\n});\nconst canvasToBlob = (canvas) => __awaiter(void 0, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n try {\n canvas.toBlob((blob) => {\n if (!blob) {\n return reject(new _errors__WEBPACK_IMPORTED_MODULE_3__.CanvasError((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"canvasError.canvasTooBig\"), \"CANVAS_POSSIBLY_TOO_BIG\"));\n }\n resolve(blob);\n });\n }\n catch (error) {\n reject(error);\n }\n });\n});\n/** generates SHA-1 digest from supplied file (if not supported, falls back\n to a 40-char base64 random id) */\nconst generateIdFromFile = (file) => __awaiter(void 0, void 0, void 0, function* () {\n try {\n const hashBuffer = yield window.crypto.subtle.digest(\"SHA-1\", yield blobToArrayBuffer(file));\n return (0,_utils__WEBPACK_IMPORTED_MODULE_6__.bytesToHexString)(new Uint8Array(hashBuffer));\n }\n catch (error) {\n console.error(error);\n // length 40 to align with the HEX length of SHA-1 (which is 160 bit)\n return (0,nanoid__WEBPACK_IMPORTED_MODULE_10__.nanoid)(40);\n }\n});\nconst getDataURL = (file) => __awaiter(void 0, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const dataURL = reader.result;\n resolve(dataURL);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n});\nconst dataURLToFile = (dataURL, filename = \"\") => {\n const dataIndexStart = dataURL.indexOf(\",\");\n const byteString = atob(dataURL.slice(dataIndexStart + 1));\n const mimeType = dataURL.slice(0, dataIndexStart).split(\":\")[1].split(\";\")[0];\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new File([ab], filename, { type: mimeType });\n};\nconst resizeImageFile = (file, opts) => __awaiter(void 0, void 0, void 0, function* () {\n // SVG files shouldn't a can't be resized\n if (file.type === _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg) {\n return file;\n }\n const [pica, imageBlobReduce] = yield Promise.all([\n __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.t.bind(__webpack_require__, /*! pica */ \"../../../node_modules/pica/dist/pica.js\", 23)).then((res) => res.default),\n // a wrapper for pica for better API\n __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! image-blob-reduce */ \"../../../node_modules/image-blob-reduce/dist/image-blob-reduce.esm.mjs\")).then((res) => res.default),\n ]);\n // CRA's minification settings break pica in WebWorkers, so let's disable\n // them for now\n // https://github.com/nodeca/image-blob-reduce/issues/21#issuecomment-757365513\n const reduce = imageBlobReduce({\n pica: pica({ features: [\"js\", \"wasm\"] }),\n });\n if (opts.outputType) {\n const { outputType } = opts;\n reduce._create_blob = function (env) {\n return this.pica.toBlob(env.out_canvas, outputType, 0.8).then((blob) => {\n env.out_blob = blob;\n return env;\n });\n };\n }\n if (!isSupportedImageFile(file)) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"errors.unsupportedFileType\"));\n }\n return new File([yield reduce.toBlob(file, { max: opts.maxWidthOrHeight })], file.name, {\n type: opts.outputType || file.type,\n });\n});\nconst SVGStringToFile = (SVGString, filename = \"\") => {\n return new File([new TextEncoder().encode(SVGString)], filename, {\n type: _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg,\n });\n};\nconst getFileFromEvent = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const file = event.dataTransfer.files.item(0);\n const fileHandle = yield getFileHandle(event);\n return { file: file ? yield normalizeFile(file) : null, fileHandle };\n});\nconst getFileHandle = (event) => __awaiter(void 0, void 0, void 0, function* () {\n if (_filesystem__WEBPACK_IMPORTED_MODULE_7__.nativeFileSystemSupported) {\n try {\n const item = event.dataTransfer.items[0];\n const handle = (yield item.getAsFileSystemHandle()) || null;\n return handle;\n }\n catch (error) {\n console.warn(error.name, error.message);\n return null;\n }\n }\n return null;\n});\n/**\n * attempts to detect if a buffer is a valid image by checking its leading bytes\n */\nconst getActualMimeTypeFromImage = (buffer) => {\n let mimeType = null;\n const first8Bytes = `${[...new Uint8Array(buffer).slice(0, 8)].join(\" \")} `;\n // uint8 leading bytes\n const headerBytes = {\n // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n png: \"137 80 78 71 13 10 26 10 \",\n // https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure\n // jpg is a bit wonky. Checking the first three bytes should be enough,\n // but may yield false positives. (https://stackoverflow.com/a/23360709/927631)\n jpg: \"255 216 255 \",\n // https://en.wikipedia.org/wiki/GIF#Example_GIF_file\n gif: \"71 73 70 56 57 97 \",\n };\n if (first8Bytes === headerBytes.png) {\n mimeType = _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.png;\n }\n else if (first8Bytes.startsWith(headerBytes.jpg)) {\n mimeType = _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.jpg;\n }\n else if (first8Bytes.startsWith(headerBytes.gif)) {\n mimeType = _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.gif;\n }\n return mimeType;\n};\nconst createFile = (blob, mimeType, name) => {\n return new File([blob], name || \"\", {\n type: mimeType,\n });\n};\n/** attempts to detect correct mimeType if none is set, or if an image\n * has an incorrect extension.\n * Note: doesn't handle missing .excalidraw/.excalidrawlib extension */\nconst normalizeFile = (file) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b;\n if (!file.type) {\n if ((_a = file === null || file === void 0 ? void 0 : file.name) === null || _a === void 0 ? void 0 : _a.endsWith(\".excalidrawlib\")) {\n file = createFile(yield blobToArrayBuffer(file), _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidrawlib, file.name);\n }\n else if ((_b = file === null || file === void 0 ? void 0 : file.name) === null || _b === void 0 ? void 0 : _b.endsWith(\".excalidraw\")) {\n file = createFile(yield blobToArrayBuffer(file), _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidraw, file.name);\n }\n else {\n const buffer = yield blobToArrayBuffer(file);\n const mimeType = getActualMimeTypeFromImage(buffer);\n if (mimeType) {\n file = createFile(buffer, mimeType, file.name);\n }\n }\n // when the file is an image, make sure the extension corresponds to the\n // actual mimeType (this is an edge case, but happens sometime)\n }\n else if (isSupportedImageFile(file)) {\n const buffer = yield blobToArrayBuffer(file);\n const mimeType = getActualMimeTypeFromImage(buffer);\n if (mimeType && mimeType !== file.type) {\n file = createFile(buffer, mimeType, file.name);\n }\n }\n return file;\n});\nconst blobToArrayBuffer = (blob) => {\n if (\"arrayBuffer\" in blob) {\n return blob.arrayBuffer();\n }\n // Safari\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n var _a;\n if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {\n return reject(new Error(\"Couldn't convert blob to ArrayBuffer\"));\n }\n resolve(event.target.result);\n };\n reader.readAsArrayBuffer(blob);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxDQUFDO2FBQ2xFO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBcUIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL2Jsb2IudHM/YTgzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5pbXBvcnQgeyBjbGVhbkFwcFN0YXRlRm9yRXhwb3J0IH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBBTExPV0VEX0lNQUdFX01JTUVfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjbGVhckVsZW1lbnRzRm9yRXhwb3J0IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50LCBGaWxlSWQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgQ2FudmFzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IGNhbGN1bGF0ZVNjcm9sbENlbnRlciB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIERhdGFVUkwsIExpYnJhcnlJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBieXRlc1RvSGV4U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBGaWxlU3lzdGVtSGFuZGxlLCBuYXRpdmVGaWxlU3lzdGVtU3VwcG9ydGVkIH0gZnJvbSBcIi4vZmlsZXN5c3RlbVwiO1xuaW1wb3J0IHsgaXNWYWxpZEV4Y2FsaWRyYXdEYXRhLCBpc1ZhbGlkTGlicmFyeSB9IGZyb20gXCIuL2pzb25cIjtcbmltcG9ydCB7IHJlc3RvcmUsIHJlc3RvcmVMaWJyYXJ5SXRlbXMgfSBmcm9tIFwiLi9yZXN0b3JlXCI7XG5pbXBvcnQgeyBJbXBvcnRlZExpYnJhcnlEYXRhIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuY29uc3QgcGFyc2VGaWxlQ29udGVudHMgPSBhc3luYyAoYmxvYjogQmxvYiB8IEZpbGUpID0+IHtcbiAgbGV0IGNvbnRlbnRzOiBzdHJpbmc7XG5cbiAgaWYgKGJsb2IudHlwZSA9PT0gTUlNRV9UWVBFUy5wbmcpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IChcbiAgICAgICAgYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tDaHVua05hbWU6IFwiaW1hZ2VcIiAqLyBcIi4vaW1hZ2VcIilcbiAgICAgICkuZGVjb2RlUG5nTWV0YWRhdGEoYmxvYik7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgPT09IFwiSU5WQUxJRFwiKSB7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgICAgdChcImFsZXJ0cy5pbWFnZURvZXNOb3RDb250YWluU2NlbmVcIiksXG4gICAgICAgICAgXCJFbmNvZGluZ0Vycm9yXCIsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFxuICAgICAgICAgIHQoXCJhbGVydHMuY2Fubm90UmVzdG9yZUZyb21JbWFnZVwiKSxcbiAgICAgICAgICBcIkVuY29kaW5nRXJyb3JcIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKFwidGV4dFwiIGluIEJsb2IpIHtcbiAgICAgIGNvbnRlbnRzID0gYXdhaXQgYmxvYi50ZXh0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnRlbnRzID0gYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoYmxvYiwgXCJ1dGY4XCIpO1xuICAgICAgICByZWFkZXIub25sb2FkZW5kID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChyZWFkZXIucmVhZHlTdGF0ZSA9PT0gRmlsZVJlYWRlci5ET05FKSB7XG4gICAgICAgICAgICByZXNvbHZlKHJlYWRlci5yZXN1bHQgYXMgc3RyaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGJsb2IudHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCAoXG4gICAgICAgICAgYXdhaXQgaW1wb3J0KC8qIHdlYnBhY2tDaHVua05hbWU6IFwiaW1hZ2VcIiAqLyBcIi4vaW1hZ2VcIilcbiAgICAgICAgKS5kZWNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgICAgc3ZnOiBjb250ZW50cyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICAgIGlmIChlcnJvci5tZXNzYWdlID09PSBcIklOVkFMSURcIikge1xuICAgICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgICAgICB0KFwiYWxlcnRzLmltYWdlRG9lc05vdENvbnRhaW5TY2VuZVwiKSxcbiAgICAgICAgICAgIFwiRW5jb2RpbmdFcnJvclwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICAgIHQoXCJhbGVydHMuY2Fubm90UmVzdG9yZUZyb21JbWFnZVwiKSxcbiAgICAgICAgICAgIFwiRW5jb2RpbmdFcnJvclwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNvbnRlbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1pbWVUeXBlID0gKGJsb2I6IEJsb2IgfCBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBsZXQgbmFtZTogc3RyaW5nO1xuICBpZiAodHlwZW9mIGJsb2IgPT09IFwic3RyaW5nXCIpIHtcbiAgICBuYW1lID0gYmxvYjtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYmxvYi50eXBlKSB7XG4gICAgICByZXR1cm4gYmxvYi50eXBlO1xuICAgIH1cbiAgICBuYW1lID0gYmxvYi5uYW1lIHx8IFwiXCI7XG4gIH1cbiAgaWYgKC9cXC4oZXhjYWxpZHJhd3xqc29uKSQvLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4gTUlNRV9UWVBFUy5qc29uO1xuICB9IGVsc2UgaWYgKC9cXC5wbmckLy50ZXN0KG5hbWUpKSB7XG4gICAgcmV0dXJuIE1JTUVfVFlQRVMucG5nO1xuICB9IGVsc2UgaWYgKC9cXC5qcGU/ZyQvLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4gTUlNRV9UWVBFUy5qcGc7XG4gIH0gZWxzZSBpZiAoL1xcLnN2ZyQvLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4gTUlNRV9UWVBFUy5zdmc7XG4gIH1cbiAgcmV0dXJuIFwiXCI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RmlsZUhhbmRsZVR5cGUgPSAoaGFuZGxlOiBGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbCkgPT4ge1xuICBpZiAoIWhhbmRsZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIGhhbmRsZS5uYW1lLm1hdGNoKC9cXC4oanNvbnxleGNhbGlkcmF3fHBuZ3xzdmcpJC8pPy5bMV0gfHwgbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0ltYWdlRmlsZUhhbmRsZVR5cGUgPSAoXG4gIHR5cGU6IHN0cmluZyB8IG51bGwsXG4pOiB0eXBlIGlzIFwicG5nXCIgfCBcInN2Z1wiID0+IHtcbiAgcmV0dXJuIHR5cGUgPT09IFwicG5nXCIgfHwgdHlwZSA9PT0gXCJzdmdcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0ltYWdlRmlsZUhhbmRsZSA9IChoYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUgfCBudWxsKSA9PiB7XG4gIGNvbnN0IHR5cGUgPSBnZXRGaWxlSGFuZGxlVHlwZShoYW5kbGUpO1xuICByZXR1cm4gdHlwZSA9PT0gXCJwbmdcIiB8fCB0eXBlID09PSBcInN2Z1wiO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzU3VwcG9ydGVkSW1hZ2VGaWxlID0gKFxuICBibG9iOiBCbG9iIHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IGJsb2IgaXMgQmxvYiAmIHsgdHlwZTogdHlwZW9mIEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFU1tudW1iZXJdIH0gPT4ge1xuICBjb25zdCB7IHR5cGUgfSA9IGJsb2IgfHwge307XG4gIHJldHVybiAoXG4gICAgISF0eXBlICYmIChBTExPV0VEX0lNQUdFX01JTUVfVFlQRVMgYXMgcmVhZG9ubHkgc3RyaW5nW10pLmluY2x1ZGVzKHR5cGUpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZFNjZW5lT3JMaWJyYXJ5RnJvbUJsb2IgPSBhc3luYyAoXG4gIGJsb2I6IEJsb2IgfCBGaWxlLFxuICAvKiogQHNlZSByZXN0b3JlLmxvY2FsQXBwU3RhdGUgKi9cbiAgbG9jYWxBcHBTdGF0ZTogQXBwU3RhdGUgfCBudWxsLFxuICBsb2NhbEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbCxcbiAgLyoqIEZpbGVTeXN0ZW1IYW5kbGUuIERlZmF1bHRzIHRvIGBibG9iLmhhbmRsZWAgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIG51bGwuICovXG4gIGZpbGVIYW5kbGU/OiBGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCBjb250ZW50cyA9IGF3YWl0IHBhcnNlRmlsZUNvbnRlbnRzKGJsb2IpO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGNvbnRlbnRzKTtcbiAgICBpZiAoaXNWYWxpZEV4Y2FsaWRyYXdEYXRhKGRhdGEpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBNSU1FX1RZUEVTLmV4Y2FsaWRyYXcsXG4gICAgICAgIGRhdGE6IHJlc3RvcmUoXG4gICAgICAgICAge1xuICAgICAgICAgICAgZWxlbWVudHM6IGNsZWFyRWxlbWVudHNGb3JFeHBvcnQoZGF0YS5lbGVtZW50cyB8fCBbXSksXG4gICAgICAgICAgICBhcHBTdGF0ZToge1xuICAgICAgICAgICAgICB0aGVtZTogbG9jYWxBcHBTdGF0ZT8udGhlbWUsXG4gICAgICAgICAgICAgIGZpbGVIYW5kbGU6IGZpbGVIYW5kbGUgfHwgYmxvYi5oYW5kbGUgfHwgbnVsbCxcbiAgICAgICAgICAgICAgLi4uY2xlYW5BcHBTdGF0ZUZvckV4cG9ydChkYXRhLmFwcFN0YXRlIHx8IHt9KSxcbiAgICAgICAgICAgICAgLi4uKGxvY2FsQXBwU3RhdGVcbiAgICAgICAgICAgICAgICA/IGNhbGN1bGF0ZVNjcm9sbENlbnRlcihcbiAgICAgICAgICAgICAgICAgICAgZGF0YS5lbGVtZW50cyB8fCBbXSxcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxBcHBTdGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmaWxlczogZGF0YS5maWxlcyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxvY2FsQXBwU3RhdGUsXG4gICAgICAgICAgbG9jYWxFbGVtZW50cyxcbiAgICAgICAgICB7IHJlcGFpckJpbmRpbmdzOiB0cnVlIH0sXG4gICAgICAgICksXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAoaXNWYWxpZExpYnJhcnkoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYixcbiAgICAgICAgZGF0YSxcbiAgICAgIH07XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcih0KFwiYWxlcnRzLmNvdWxkTm90TG9hZEludmFsaWRGaWxlXCIpKTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IubWVzc2FnZSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKHQoXCJhbGVydHMuY291bGROb3RMb2FkSW52YWxpZEZpbGVcIikpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZyb21CbG9iID0gYXN5bmMgKFxuICBibG9iOiBCbG9iLFxuICAvKiogQHNlZSByZXN0b3JlLmxvY2FsQXBwU3RhdGUgKi9cbiAgbG9jYWxBcHBTdGF0ZTogQXBwU3RhdGUgfCBudWxsLFxuICBsb2NhbEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbCxcbiAgLyoqIEZpbGVTeXN0ZW1IYW5kbGUuIERlZmF1bHRzIHRvIGBibG9iLmhhbmRsZWAgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIG51bGwuICovXG4gIGZpbGVIYW5kbGU/OiBGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCByZXQgPSBhd2FpdCBsb2FkU2NlbmVPckxpYnJhcnlGcm9tQmxvYihcbiAgICBibG9iLFxuICAgIGxvY2FsQXBwU3RhdGUsXG4gICAgbG9jYWxFbGVtZW50cyxcbiAgICBmaWxlSGFuZGxlLFxuICApO1xuICBpZiAocmV0LnR5cGUgIT09IE1JTUVfVFlQRVMuZXhjYWxpZHJhdykge1xuICAgIHRocm93IG5ldyBFcnJvcih0KFwiYWxlcnRzLmNvdWxkTm90TG9hZEludmFsaWRGaWxlXCIpKTtcbiAgfVxuICByZXR1cm4gcmV0LmRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VMaWJyYXJ5SlNPTiA9IChcbiAganNvbjogc3RyaW5nLFxuICBkZWZhdWx0U3RhdHVzOiBMaWJyYXJ5SXRlbVtcInN0YXR1c1wiXSA9IFwidW5wdWJsaXNoZWRcIixcbikgPT4ge1xuICBjb25zdCBkYXRhOiBJbXBvcnRlZExpYnJhcnlEYXRhIHwgdW5kZWZpbmVkID0gSlNPTi5wYXJzZShqc29uKTtcbiAgaWYgKCFpc1ZhbGlkTGlicmFyeShkYXRhKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgbGlicmFyeVwiKTtcbiAgfVxuICBjb25zdCBsaWJyYXJ5SXRlbXMgPSBkYXRhLmxpYnJhcnlJdGVtcyB8fCBkYXRhLmxpYnJhcnk7XG4gIHJldHVybiByZXN0b3JlTGlicmFyeUl0ZW1zKGxpYnJhcnlJdGVtcywgZGVmYXVsdFN0YXR1cyk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZExpYnJhcnlGcm9tQmxvYiA9IGFzeW5jIChcbiAgYmxvYjogQmxvYixcbiAgZGVmYXVsdFN0YXR1czogTGlicmFyeUl0ZW1bXCJzdGF0dXNcIl0gPSBcInVucHVibGlzaGVkXCIsXG4pID0+IHtcbiAgcmV0dXJuIHBhcnNlTGlicmFyeUpTT04oYXdhaXQgcGFyc2VGaWxlQ29udGVudHMoYmxvYiksIGRlZmF1bHRTdGF0dXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhbnZhc1RvQmxvYiA9IGFzeW5jIChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCxcbik6IFByb21pc2U8QmxvYj4gPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjYW52YXMudG9CbG9iKChibG9iKSA9PiB7XG4gICAgICAgIGlmICghYmxvYikge1xuICAgICAgICAgIHJldHVybiByZWplY3QoXG4gICAgICAgICAgICBuZXcgQ2FudmFzRXJyb3IoXG4gICAgICAgICAgICAgIHQoXCJjYW52YXNFcnJvci5jYW52YXNUb29CaWdcIiksXG4gICAgICAgICAgICAgIFwiQ0FOVkFTX1BPU1NJQkxZX1RPT19CSUdcIixcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKGJsb2IpO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqIGdlbmVyYXRlcyBTSEEtMSBkaWdlc3QgZnJvbSBzdXBwbGllZCBmaWxlIChpZiBub3Qgc3VwcG9ydGVkLCBmYWxscyBiYWNrXG4gICAgdG8gYSA0MC1jaGFyIGJhc2U2NCByYW5kb20gaWQpICovXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVJZEZyb21GaWxlID0gYXN5bmMgKGZpbGU6IEZpbGUpOiBQcm9taXNlPEZpbGVJZD4gPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGhhc2hCdWZmZXIgPSBhd2FpdCB3aW5kb3cuY3J5cHRvLnN1YnRsZS5kaWdlc3QoXG4gICAgICBcIlNIQS0xXCIsXG4gICAgICBhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihmaWxlKSxcbiAgICApO1xuICAgIHJldHVybiBieXRlc1RvSGV4U3RyaW5nKG5ldyBVaW50OEFycmF5KGhhc2hCdWZmZXIpKSBhcyBGaWxlSWQ7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAvLyBsZW5ndGggNDAgdG8gYWxpZ24gd2l0aCB0aGUgSEVYIGxlbmd0aCBvZiBTSEEtMSAod2hpY2ggaXMgMTYwIGJpdClcbiAgICByZXR1cm4gbmFub2lkKDQwKSBhcyBGaWxlSWQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRhVVJMID0gYXN5bmMgKGZpbGU6IEJsb2IgfCBGaWxlKTogUHJvbWlzZTxEYXRhVVJMPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVVSTCA9IHJlYWRlci5yZXN1bHQgYXMgRGF0YVVSTDtcbiAgICAgIHJlc29sdmUoZGF0YVVSTCk7XG4gICAgfTtcbiAgICByZWFkZXIub25lcnJvciA9IChlcnJvcikgPT4gcmVqZWN0KGVycm9yKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChmaWxlKTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZGF0YVVSTFRvRmlsZSA9IChkYXRhVVJMOiBEYXRhVVJMLCBmaWxlbmFtZSA9IFwiXCIpID0+IHtcbiAgY29uc3QgZGF0YUluZGV4U3RhcnQgPSBkYXRhVVJMLmluZGV4T2YoXCIsXCIpO1xuICBjb25zdCBieXRlU3RyaW5nID0gYXRvYihkYXRhVVJMLnNsaWNlKGRhdGFJbmRleFN0YXJ0ICsgMSkpO1xuICBjb25zdCBtaW1lVHlwZSA9IGRhdGFVUkwuc2xpY2UoMCwgZGF0YUluZGV4U3RhcnQpLnNwbGl0KFwiOlwiKVsxXS5zcGxpdChcIjtcIilbMF07XG5cbiAgY29uc3QgYWIgPSBuZXcgQXJyYXlCdWZmZXIoYnl0ZVN0cmluZy5sZW5ndGgpO1xuICBjb25zdCBpYSA9IG5ldyBVaW50OEFycmF5KGFiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlU3RyaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgaWFbaV0gPSBieXRlU3RyaW5nLmNoYXJDb2RlQXQoaSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBGaWxlKFthYl0sIGZpbGVuYW1lLCB7IHR5cGU6IG1pbWVUeXBlIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUltYWdlRmlsZSA9IGFzeW5jIChcbiAgZmlsZTogRmlsZSxcbiAgb3B0czoge1xuICAgIC8qKiB1bmRlZmluZWQgaW5kaWNhdGVzIGF1dG8gKi9cbiAgICBvdXRwdXRUeXBlPzogdHlwZW9mIE1JTUVfVFlQRVNbXCJqcGdcIl07XG4gICAgbWF4V2lkdGhPckhlaWdodDogbnVtYmVyO1xuICB9LFxuKTogUHJvbWlzZTxGaWxlPiA9PiB7XG4gIC8vIFNWRyBmaWxlcyBzaG91bGRuJ3QgYSBjYW4ndCBiZSByZXNpemVkXG4gIGlmIChmaWxlLnR5cGUgPT09IE1JTUVfVFlQRVMuc3ZnKSB7XG4gICAgcmV0dXJuIGZpbGU7XG4gIH1cblxuICBjb25zdCBbcGljYSwgaW1hZ2VCbG9iUmVkdWNlXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICBpbXBvcnQoXCJwaWNhXCIpLnRoZW4oKHJlcykgPT4gcmVzLmRlZmF1bHQpLFxuICAgIC8vIGEgd3JhcHBlciBmb3IgcGljYSBmb3IgYmV0dGVyIEFQSVxuICAgIGltcG9ydChcImltYWdlLWJsb2ItcmVkdWNlXCIpLnRoZW4oKHJlcykgPT4gcmVzLmRlZmF1bHQpLFxuICBdKTtcblxuICAvLyBDUkEncyBtaW5pZmljYXRpb24gc2V0dGluZ3MgYnJlYWsgcGljYSBpbiBXZWJXb3JrZXJzLCBzbyBsZXQncyBkaXNhYmxlXG4gIC8vIHRoZW0gZm9yIG5vd1xuICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWNhL2ltYWdlLWJsb2ItcmVkdWNlL2lzc3Vlcy8yMSNpc3N1ZWNvbW1lbnQtNzU3MzY1NTEzXG4gIGNvbnN0IHJlZHVjZSA9IGltYWdlQmxvYlJlZHVjZSh7XG4gICAgcGljYTogcGljYSh7IGZlYXR1cmVzOiBbXCJqc1wiLCBcIndhc21cIl0gfSksXG4gIH0pO1xuXG4gIGlmIChvcHRzLm91dHB1dFR5cGUpIHtcbiAgICBjb25zdCB7IG91dHB1dFR5cGUgfSA9IG9wdHM7XG4gICAgcmVkdWNlLl9jcmVhdGVfYmxvYiA9IGZ1bmN0aW9uIChlbnYpIHtcbiAgICAgIHJldHVybiB0aGlzLnBpY2EudG9CbG9iKGVudi5vdXRfY2FudmFzLCBvdXRwdXRUeXBlLCAwLjgpLnRoZW4oKGJsb2IpID0+IHtcbiAgICAgICAgZW52Lm91dF9ibG9iID0gYmxvYjtcbiAgICAgICAgcmV0dXJuIGVudjtcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICBpZiAoIWlzU3VwcG9ydGVkSW1hZ2VGaWxlKGZpbGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHQoXCJlcnJvcnMudW5zdXBwb3J0ZWRGaWxlVHlwZVwiKSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEZpbGUoXG4gICAgW2F3YWl0IHJlZHVjZS50b0Jsb2IoZmlsZSwgeyBtYXg6IG9wdHMubWF4V2lkdGhPckhlaWdodCB9KV0sXG4gICAgZmlsZS5uYW1lLFxuICAgIHtcbiAgICAgIHR5cGU6IG9wdHMub3V0cHV0VHlwZSB8fCBmaWxlLnR5cGUsXG4gICAgfSxcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBTVkdTdHJpbmdUb0ZpbGUgPSAoU1ZHU3RyaW5nOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcgPSBcIlwiKSA9PiB7XG4gIHJldHVybiBuZXcgRmlsZShbbmV3IFRleHRFbmNvZGVyKCkuZW5jb2RlKFNWR1N0cmluZyldLCBmaWxlbmFtZSwge1xuICAgIHR5cGU6IE1JTUVfVFlQRVMuc3ZnLFxuICB9KSBhcyBGaWxlICYgeyB0eXBlOiB0eXBlb2YgTUlNRV9UWVBFUy5zdmcgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlRnJvbUV2ZW50ID0gYXN5bmMgKFxuICBldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50PixcbikgPT4ge1xuICBjb25zdCBmaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzLml0ZW0oMCk7XG4gIGNvbnN0IGZpbGVIYW5kbGUgPSBhd2FpdCBnZXRGaWxlSGFuZGxlKGV2ZW50KTtcblxuICByZXR1cm4geyBmaWxlOiBmaWxlID8gYXdhaXQgbm9ybWFsaXplRmlsZShmaWxlKSA6IG51bGwsIGZpbGVIYW5kbGUgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlSGFuZGxlID0gYXN5bmMgKFxuICBldmVudDogUmVhY3QuRHJhZ0V2ZW50PEhUTUxEaXZFbGVtZW50Pixcbik6IFByb21pc2U8RmlsZVN5c3RlbUhhbmRsZSB8IG51bGw+ID0+IHtcbiAgaWYgKG5hdGl2ZUZpbGVTeXN0ZW1TdXBwb3J0ZWQpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgaXRlbSA9IGV2ZW50LmRhdGFUcmFuc2Zlci5pdGVtc1swXTtcbiAgICAgIGNvbnN0IGhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGwgPVxuICAgICAgICAoYXdhaXQgKGl0ZW0gYXMgYW55KS5nZXRBc0ZpbGVTeXN0ZW1IYW5kbGUoKSkgfHwgbnVsbDtcblxuICAgICAgcmV0dXJuIGhhbmRsZTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oZXJyb3IubmFtZSwgZXJyb3IubWVzc2FnZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIGF0dGVtcHRzIHRvIGRldGVjdCBpZiBhIGJ1ZmZlciBpcyBhIHZhbGlkIGltYWdlIGJ5IGNoZWNraW5nIGl0cyBsZWFkaW5nIGJ5dGVzXG4gKi9cbmNvbnN0IGdldEFjdHVhbE1pbWVUeXBlRnJvbUltYWdlID0gKGJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IHtcbiAgbGV0IG1pbWVUeXBlOiBWYWx1ZU9mPFBpY2s8dHlwZW9mIE1JTUVfVFlQRVMsIFwicG5nXCIgfCBcImpwZ1wiIHwgXCJnaWZcIj4+IHwgbnVsbCA9XG4gICAgbnVsbDtcblxuICBjb25zdCBmaXJzdDhCeXRlcyA9IGAke1suLi5uZXcgVWludDhBcnJheShidWZmZXIpLnNsaWNlKDAsIDgpXS5qb2luKFwiIFwiKX0gYDtcblxuICAvLyB1aW50OCBsZWFkaW5nIGJ5dGVzXG4gIGNvbnN0IGhlYWRlckJ5dGVzID0ge1xuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BvcnRhYmxlX05ldHdvcmtfR3JhcGhpY3MjRmlsZV9oZWFkZXJcbiAgICBwbmc6IFwiMTM3IDgwIDc4IDcxIDEzIDEwIDI2IDEwIFwiLFxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pQRUcjU3ludGF4X2FuZF9zdHJ1Y3R1cmVcbiAgICAvLyBqcGcgaXMgYSBiaXQgd29ua3kuIENoZWNraW5nIHRoZSBmaXJzdCB0aHJlZSBieXRlcyBzaG91bGQgYmUgZW5vdWdoLFxuICAgIC8vIGJ1dCBtYXkgeWllbGQgZmFsc2UgcG9zaXRpdmVzLiAoaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIzMzYwNzA5LzkyNzYzMSlcbiAgICBqcGc6IFwiMjU1IDIxNiAyNTUgXCIsXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvR0lGI0V4YW1wbGVfR0lGX2ZpbGVcbiAgICBnaWY6IFwiNzEgNzMgNzAgNTYgNTcgOTcgXCIsXG4gIH07XG5cbiAgaWYgKGZpcnN0OEJ5dGVzID09PSBoZWFkZXJCeXRlcy5wbmcpIHtcbiAgICBtaW1lVHlwZSA9IE1JTUVfVFlQRVMucG5nO1xuICB9IGVsc2UgaWYgKGZpcnN0OEJ5dGVzLnN0YXJ0c1dpdGgoaGVhZGVyQnl0ZXMuanBnKSkge1xuICAgIG1pbWVUeXBlID0gTUlNRV9UWVBFUy5qcGc7XG4gIH0gZWxzZSBpZiAoZmlyc3Q4Qnl0ZXMuc3RhcnRzV2l0aChoZWFkZXJCeXRlcy5naWYpKSB7XG4gICAgbWltZVR5cGUgPSBNSU1FX1RZUEVTLmdpZjtcbiAgfVxuICByZXR1cm4gbWltZVR5cGU7XG59O1xuXG5leHBvcnQgY29uc3QgY3JlYXRlRmlsZSA9IChcbiAgYmxvYjogRmlsZSB8IEJsb2IgfCBBcnJheUJ1ZmZlcixcbiAgbWltZVR5cGU6IFZhbHVlT2Y8dHlwZW9mIE1JTUVfVFlQRVM+LFxuICBuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pID0+IHtcbiAgcmV0dXJuIG5ldyBGaWxlKFtibG9iXSwgbmFtZSB8fCBcIlwiLCB7XG4gICAgdHlwZTogbWltZVR5cGUsXG4gIH0pO1xufTtcblxuLyoqIGF0dGVtcHRzIHRvIGRldGVjdCBjb3JyZWN0IG1pbWVUeXBlIGlmIG5vbmUgaXMgc2V0LCBvciBpZiBhbiBpbWFnZVxuICogaGFzIGFuIGluY29ycmVjdCBleHRlbnNpb24uXG4gKiBOb3RlOiBkb2Vzbid0IGhhbmRsZSBtaXNzaW5nIC5leGNhbGlkcmF3Ly5leGNhbGlkcmF3bGliIGV4dGVuc2lvbiAgKi9cbmV4cG9ydCBjb25zdCBub3JtYWxpemVGaWxlID0gYXN5bmMgKGZpbGU6IEZpbGUpID0+IHtcbiAgaWYgKCFmaWxlLnR5cGUpIHtcbiAgICBpZiAoZmlsZT8ubmFtZT8uZW5kc1dpdGgoXCIuZXhjYWxpZHJhd2xpYlwiKSkge1xuICAgICAgZmlsZSA9IGNyZWF0ZUZpbGUoXG4gICAgICAgIGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGZpbGUpLFxuICAgICAgICBNSU1FX1RZUEVTLmV4Y2FsaWRyYXdsaWIsXG4gICAgICAgIGZpbGUubmFtZSxcbiAgICAgICk7XG4gICAgfSBlbHNlIGlmIChmaWxlPy5uYW1lPy5lbmRzV2l0aChcIi5leGNhbGlkcmF3XCIpKSB7XG4gICAgICBmaWxlID0gY3JlYXRlRmlsZShcbiAgICAgICAgYXdhaXQgYmxvYlRvQXJyYXlCdWZmZXIoZmlsZSksXG4gICAgICAgIE1JTUVfVFlQRVMuZXhjYWxpZHJhdyxcbiAgICAgICAgZmlsZS5uYW1lLFxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgYmxvYlRvQXJyYXlCdWZmZXIoZmlsZSk7XG4gICAgICBjb25zdCBtaW1lVHlwZSA9IGdldEFjdHVhbE1pbWVUeXBlRnJvbUltYWdlKGJ1ZmZlcik7XG4gICAgICBpZiAobWltZVR5cGUpIHtcbiAgICAgICAgZmlsZSA9IGNyZWF0ZUZpbGUoYnVmZmVyLCBtaW1lVHlwZSwgZmlsZS5uYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gd2hlbiB0aGUgZmlsZSBpcyBhbiBpbWFnZSwgbWFrZSBzdXJlIHRoZSBleHRlbnNpb24gY29ycmVzcG9uZHMgdG8gdGhlXG4gICAgLy8gYWN0dWFsIG1pbWVUeXBlICh0aGlzIGlzIGFuIGVkZ2UgY2FzZSwgYnV0IGhhcHBlbnMgc29tZXRpbWUpXG4gIH0gZWxzZSBpZiAoaXNTdXBwb3J0ZWRJbWFnZUZpbGUoZmlsZSkpIHtcbiAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihmaWxlKTtcbiAgICBjb25zdCBtaW1lVHlwZSA9IGdldEFjdHVhbE1pbWVUeXBlRnJvbUltYWdlKGJ1ZmZlcik7XG4gICAgaWYgKG1pbWVUeXBlICYmIG1pbWVUeXBlICE9PSBmaWxlLnR5cGUpIHtcbiAgICAgIGZpbGUgPSBjcmVhdGVGaWxlKGJ1ZmZlciwgbWltZVR5cGUsIGZpbGUubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbGU7XG59O1xuXG5leHBvcnQgY29uc3QgYmxvYlRvQXJyYXlCdWZmZXIgPSAoYmxvYjogQmxvYik6IFByb21pc2U8QXJyYXlCdWZmZXI+ID0+IHtcbiAgaWYgKFwiYXJyYXlCdWZmZXJcIiBpbiBibG9iKSB7XG4gICAgcmV0dXJuIGJsb2IuYXJyYXlCdWZmZXIoKTtcbiAgfVxuICAvLyBTYWZhcmlcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoZXZlbnQpID0+IHtcbiAgICAgIGlmICghZXZlbnQudGFyZ2V0Py5yZXN1bHQpIHtcbiAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXCJDb3VsZG4ndCBjb252ZXJ0IGJsb2IgdG8gQXJyYXlCdWZmZXJcIikpO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZShldmVudC50YXJnZXQucmVzdWx0IGFzIEFycmF5QnVmZmVyKTtcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihibG9iKTtcbiAgfSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../data/blob.ts\n");
|
|
3254
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVGStringToFile\": () => (/* binding */ SVGStringToFile),\n/* harmony export */ \"blobToArrayBuffer\": () => (/* binding */ blobToArrayBuffer),\n/* harmony export */ \"canvasToBlob\": () => (/* binding */ canvasToBlob),\n/* harmony export */ \"createFile\": () => (/* binding */ createFile),\n/* harmony export */ \"dataURLToFile\": () => (/* binding */ dataURLToFile),\n/* harmony export */ \"generateIdFromFile\": () => (/* binding */ generateIdFromFile),\n/* harmony export */ \"getDataURL\": () => (/* binding */ getDataURL),\n/* harmony export */ \"getFileFromEvent\": () => (/* binding */ getFileFromEvent),\n/* harmony export */ \"getFileHandle\": () => (/* binding */ getFileHandle),\n/* harmony export */ \"getFileHandleType\": () => (/* binding */ getFileHandleType),\n/* harmony export */ \"getMimeType\": () => (/* binding */ getMimeType),\n/* harmony export */ \"isImageFileHandle\": () => (/* binding */ isImageFileHandle),\n/* harmony export */ \"isImageFileHandleType\": () => (/* binding */ isImageFileHandleType),\n/* harmony export */ \"isSupportedImageFile\": () => (/* binding */ isSupportedImageFile),\n/* harmony export */ \"loadFromBlob\": () => (/* binding */ loadFromBlob),\n/* harmony export */ \"loadLibraryFromBlob\": () => (/* binding */ loadLibraryFromBlob),\n/* harmony export */ \"loadSceneOrLibraryFromBlob\": () => (/* binding */ loadSceneOrLibraryFromBlob),\n/* harmony export */ \"normalizeFile\": () => (/* binding */ normalizeFile),\n/* harmony export */ \"parseLibraryJSON\": () => (/* binding */ parseLibraryJSON),\n/* harmony export */ \"resizeImageFile\": () => (/* binding */ resizeImageFile)\n/* harmony export */ });\n/* harmony import */ var nanoid__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! nanoid */ \"../../../node_modules/nanoid/index.browser.js\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _errors__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../errors */ \"../../errors.ts\");\n/* harmony import */ var _i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../i18n */ \"../../i18n.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _filesystem__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./filesystem */ \"../../data/filesystem.ts\");\n/* harmony import */ var _json__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./json */ \"../../data/json.ts\");\n/* harmony import */ var _restore__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./restore */ \"../../data/restore.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nconst parseFileContents = (blob) => __awaiter(void 0, void 0, void 0, function* () {\n let contents;\n if (blob.type === _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.png) {\n try {\n return yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./image */ \"../../data/image.ts\"))).decodePngMetadata(blob);\n }\n catch (error) {\n if (error.message === \"INVALID\") {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.imageDoesNotContainScene\"), \"EncodingError\");\n }\n else {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.cannotRestoreFromImage\"), \"EncodingError\");\n }\n }\n }\n else {\n if (\"text\" in Blob) {\n contents = yield blob.text();\n }\n else {\n contents = yield new Promise((resolve) => {\n const reader = new FileReader();\n reader.readAsText(blob, \"utf8\");\n reader.onloadend = () => {\n if (reader.readyState === FileReader.DONE) {\n resolve(reader.result);\n }\n };\n });\n }\n if (blob.type === _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg) {\n try {\n return yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ./image */ \"../../data/image.ts\"))).decodeSvgMetadata({\n svg: contents,\n });\n }\n catch (error) {\n if (error.message === \"INVALID\") {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.imageDoesNotContainScene\"), \"EncodingError\");\n }\n else {\n throw new DOMException((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.cannotRestoreFromImage\"), \"EncodingError\");\n }\n }\n }\n }\n return contents;\n});\nconst getMimeType = (blob) => {\n let name;\n if (typeof blob === \"string\") {\n name = blob;\n }\n else {\n if (blob.type) {\n return blob.type;\n }\n name = blob.name || \"\";\n }\n if (/\\.(excalidraw|json)$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.json;\n }\n else if (/\\.png$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.png;\n }\n else if (/\\.jpe?g$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.jpg;\n }\n else if (/\\.svg$/.test(name)) {\n return _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg;\n }\n return \"\";\n};\nconst getFileHandleType = (handle) => {\n var _a;\n if (!handle) {\n return null;\n }\n return ((_a = handle.name.match(/\\.(json|excalidraw|png|svg)$/)) === null || _a === void 0 ? void 0 : _a[1]) || null;\n};\nconst isImageFileHandleType = (type) => {\n return type === \"png\" || type === \"svg\";\n};\nconst isImageFileHandle = (handle) => {\n const type = getFileHandleType(handle);\n return type === \"png\" || type === \"svg\";\n};\nconst isSupportedImageFile = (blob) => {\n const { type } = blob || {};\n return (!!type && _constants__WEBPACK_IMPORTED_MODULE_1__.ALLOWED_IMAGE_MIME_TYPES.includes(type));\n};\nconst loadSceneOrLibraryFromBlob = (blob, \n/** @see restore.localAppState */\nlocalAppState, localElements, \n/** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\nfileHandle) => __awaiter(void 0, void 0, void 0, function* () {\n const contents = yield parseFileContents(blob);\n try {\n const data = JSON.parse(contents);\n if ((0,_json__WEBPACK_IMPORTED_MODULE_8__.isValidExcalidrawData)(data)) {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidraw,\n data: (0,_restore__WEBPACK_IMPORTED_MODULE_9__.restore)({\n elements: (0,_element__WEBPACK_IMPORTED_MODULE_2__.clearElementsForExport)(data.elements || []),\n appState: Object.assign(Object.assign({ theme: localAppState === null || localAppState === void 0 ? void 0 : localAppState.theme, fileHandle: fileHandle || blob.handle || null }, (0,_appState__WEBPACK_IMPORTED_MODULE_0__.cleanAppStateForExport)(data.appState || {})), (localAppState\n ? (0,_scene__WEBPACK_IMPORTED_MODULE_5__.calculateScrollCenter)(data.elements || [], localAppState, null)\n : {})),\n files: data.files,\n }, localAppState, localElements, { repairBindings: true }),\n };\n }\n else if ((0,_json__WEBPACK_IMPORTED_MODULE_8__.isValidLibrary)(data)) {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidrawlib,\n data,\n };\n }\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.couldNotLoadInvalidFile\"));\n }\n catch (error) {\n console.error(error.message);\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.couldNotLoadInvalidFile\"));\n }\n});\nconst loadFromBlob = (blob, \n/** @see restore.localAppState */\nlocalAppState, localElements, \n/** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\nfileHandle) => __awaiter(void 0, void 0, void 0, function* () {\n const ret = yield loadSceneOrLibraryFromBlob(blob, localAppState, localElements, fileHandle);\n if (ret.type !== _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidraw) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"alerts.couldNotLoadInvalidFile\"));\n }\n return ret.data;\n});\nconst parseLibraryJSON = (json, defaultStatus = \"unpublished\") => {\n const data = JSON.parse(json);\n if (!(0,_json__WEBPACK_IMPORTED_MODULE_8__.isValidLibrary)(data)) {\n throw new Error(\"Invalid library\");\n }\n const libraryItems = data.libraryItems || data.library;\n return (0,_restore__WEBPACK_IMPORTED_MODULE_9__.restoreLibraryItems)(libraryItems, defaultStatus);\n};\nconst loadLibraryFromBlob = (blob, defaultStatus = \"unpublished\") => __awaiter(void 0, void 0, void 0, function* () {\n return parseLibraryJSON(yield parseFileContents(blob), defaultStatus);\n});\nconst canvasToBlob = (canvas) => __awaiter(void 0, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n try {\n canvas.toBlob((blob) => {\n if (!blob) {\n return reject(new _errors__WEBPACK_IMPORTED_MODULE_3__.CanvasError((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"canvasError.canvasTooBig\"), \"CANVAS_POSSIBLY_TOO_BIG\"));\n }\n resolve(blob);\n });\n }\n catch (error) {\n reject(error);\n }\n });\n});\n/** generates SHA-1 digest from supplied file (if not supported, falls back\n to a 40-char base64 random id) */\nconst generateIdFromFile = (file) => __awaiter(void 0, void 0, void 0, function* () {\n try {\n const hashBuffer = yield window.crypto.subtle.digest(\"SHA-1\", yield blobToArrayBuffer(file));\n return (0,_utils__WEBPACK_IMPORTED_MODULE_6__.bytesToHexString)(new Uint8Array(hashBuffer));\n }\n catch (error) {\n console.error(error);\n // length 40 to align with the HEX length of SHA-1 (which is 160 bit)\n return (0,nanoid__WEBPACK_IMPORTED_MODULE_10__.nanoid)(40);\n }\n});\nconst getDataURL = (file) => __awaiter(void 0, void 0, void 0, function* () {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n const dataURL = reader.result;\n resolve(dataURL);\n };\n reader.onerror = (error) => reject(error);\n reader.readAsDataURL(file);\n });\n});\nconst dataURLToFile = (dataURL, filename = \"\") => {\n const dataIndexStart = dataURL.indexOf(\",\");\n const byteString = atob(dataURL.slice(dataIndexStart + 1));\n const mimeType = dataURL.slice(0, dataIndexStart).split(\":\")[1].split(\";\")[0];\n const ab = new ArrayBuffer(byteString.length);\n const ia = new Uint8Array(ab);\n for (let i = 0; i < byteString.length; i++) {\n ia[i] = byteString.charCodeAt(i);\n }\n return new File([ab], filename, { type: mimeType });\n};\nconst resizeImageFile = (file, opts) => __awaiter(void 0, void 0, void 0, function* () {\n // SVG files shouldn't a can't be resized\n if (file.type === _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg) {\n return file;\n }\n const [pica, imageBlobReduce] = yield Promise.all([\n __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.t.bind(__webpack_require__, /*! pica */ \"../../../node_modules/pica/dist/pica.js\", 23)).then((res) => res.default),\n // a wrapper for pica for better API\n __webpack_require__.e(/*! import() */ \"vendor\").then(__webpack_require__.bind(__webpack_require__, /*! image-blob-reduce */ \"../../../node_modules/image-blob-reduce/dist/image-blob-reduce.esm.mjs\")).then((res) => res.default),\n ]);\n // CRA's minification settings break pica in WebWorkers, so let's disable\n // them for now\n // https://github.com/nodeca/image-blob-reduce/issues/21#issuecomment-757365513\n const reduce = imageBlobReduce({\n pica: pica({ features: [\"js\", \"wasm\"] }),\n });\n if (opts.outputType) {\n const { outputType } = opts;\n reduce._create_blob = function (env) {\n return this.pica.toBlob(env.out_canvas, outputType, 0.8).then((blob) => {\n env.out_blob = blob;\n return env;\n });\n };\n }\n if (!isSupportedImageFile(file)) {\n throw new Error((0,_i18n__WEBPACK_IMPORTED_MODULE_4__.t)(\"errors.unsupportedFileType\"));\n }\n return new File([yield reduce.toBlob(file, { max: opts.maxWidthOrHeight })], file.name, {\n type: opts.outputType || file.type,\n });\n});\nconst SVGStringToFile = (SVGString, filename = \"\") => {\n return new File([new TextEncoder().encode(SVGString)], filename, {\n type: _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.svg,\n });\n};\nconst getFileFromEvent = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const file = event.dataTransfer.files.item(0);\n const fileHandle = yield getFileHandle(event);\n return { file: file ? yield normalizeFile(file) : null, fileHandle };\n});\nconst getFileHandle = (event) => __awaiter(void 0, void 0, void 0, function* () {\n if (_filesystem__WEBPACK_IMPORTED_MODULE_7__.nativeFileSystemSupported) {\n try {\n const item = event.dataTransfer.items[0];\n const handle = (yield item.getAsFileSystemHandle()) || null;\n return handle;\n }\n catch (error) {\n console.warn(error.name, error.message);\n return null;\n }\n }\n return null;\n});\n/**\n * attempts to detect if a buffer is a valid image by checking its leading bytes\n */\nconst getActualMimeTypeFromImage = (buffer) => {\n let mimeType = null;\n const first8Bytes = `${[...new Uint8Array(buffer).slice(0, 8)].join(\" \")} `;\n // uint8 leading bytes\n const headerBytes = {\n // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n png: \"137 80 78 71 13 10 26 10 \",\n // https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure\n // jpg is a bit wonky. Checking the first three bytes should be enough,\n // but may yield false positives. (https://stackoverflow.com/a/23360709/927631)\n jpg: \"255 216 255 \",\n // https://en.wikipedia.org/wiki/GIF#Example_GIF_file\n gif: \"71 73 70 56 57 97 \",\n };\n if (first8Bytes === headerBytes.png) {\n mimeType = _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.png;\n }\n else if (first8Bytes.startsWith(headerBytes.jpg)) {\n mimeType = _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.jpg;\n }\n else if (first8Bytes.startsWith(headerBytes.gif)) {\n mimeType = _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.gif;\n }\n return mimeType;\n};\nconst createFile = (blob, mimeType, name) => {\n return new File([blob], name || \"\", {\n type: mimeType,\n });\n};\n/** attempts to detect correct mimeType if none is set, or if an image\n * has an incorrect extension.\n * Note: doesn't handle missing .excalidraw/.excalidrawlib extension */\nconst normalizeFile = (file) => __awaiter(void 0, void 0, void 0, function* () {\n var _a, _b;\n if (!file.type) {\n if ((_a = file === null || file === void 0 ? void 0 : file.name) === null || _a === void 0 ? void 0 : _a.endsWith(\".excalidrawlib\")) {\n file = createFile(yield blobToArrayBuffer(file), _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidrawlib, file.name);\n }\n else if ((_b = file === null || file === void 0 ? void 0 : file.name) === null || _b === void 0 ? void 0 : _b.endsWith(\".excalidraw\")) {\n file = createFile(yield blobToArrayBuffer(file), _constants__WEBPACK_IMPORTED_MODULE_1__.MIME_TYPES.excalidraw, file.name);\n }\n else {\n const buffer = yield blobToArrayBuffer(file);\n const mimeType = getActualMimeTypeFromImage(buffer);\n if (mimeType) {\n file = createFile(buffer, mimeType, file.name);\n }\n }\n // when the file is an image, make sure the extension corresponds to the\n // actual mimeType (this is an edge case, but happens sometime)\n }\n else if (isSupportedImageFile(file)) {\n const buffer = yield blobToArrayBuffer(file);\n const mimeType = getActualMimeTypeFromImage(buffer);\n if (mimeType && mimeType !== file.type) {\n file = createFile(buffer, mimeType, file.name);\n }\n }\n return file;\n});\nconst blobToArrayBuffer = (blob) => {\n if (\"arrayBuffer\" in blob) {\n return blob.arrayBuffer();\n }\n // Safari\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n var _a;\n if (!((_a = event.target) === null || _a === void 0 ? void 0 : _a.result)) {\n return reject(new Error(\"Couldn't convert blob to ArrayBuffer\"));\n }\n resolve(event.target.result);\n };\n reader.readAsArrayBuffer(blob);\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZGF0YS9ibG9iLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBZ0M7QUFDcUI7QUFDZTtBQUNoQjtBQUVaO0FBQ1o7QUFDcUI7QUFHTDtBQUMrQjtBQUNaO0FBQ047QUFHekQsTUFBTSxpQkFBaUIsR0FBRyxDQUFPLElBQWlCLEVBQUUsRUFBRTtJQUNwRCxJQUFJLFFBQWdCLENBQUM7SUFFckIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLHNEQUFjLEVBQUU7UUFDaEMsSUFBSTtZQUNGLE9BQU8sTUFBTSxDQUNYLE1BQU0sMEhBQWlELENBQ3hELENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDM0I7UUFBQyxPQUFPLEtBQVUsRUFBRTtZQUNuQixJQUFJLEtBQUssQ0FBQyxPQUFPLEtBQUssU0FBUyxFQUFFO2dCQUMvQixNQUFNLElBQUksWUFBWSxDQUNwQix3Q0FBQyxDQUFDLGlDQUFpQyxDQUFDLEVBQ3BDLGVBQWUsQ0FDaEIsQ0FBQzthQUNIO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxZQUFZLENBQ3BCLHdDQUFDLENBQUMsK0JBQStCLENBQUMsRUFDbEMsZUFBZSxDQUNoQixDQUFDO2FBQ0g7U0FDRjtLQUNGO1NBQU07UUFDTCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEIsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzlCO2FBQU07WUFDTCxRQUFRLEdBQUcsTUFBTSxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO2dCQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNoQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDaEMsTUFBTSxDQUFDLFNBQVMsR0FBRyxHQUFHLEVBQUU7b0JBQ3RCLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsSUFBSSxFQUFFO3dCQUN6QyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQWdCLENBQUMsQ0FBQztxQkFDbEM7Z0JBQ0gsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxzREFBYyxFQUFFO1lBQ2hDLElBQUk7Z0JBQ0YsT0FBTyxNQUFNLENBQ1gsTUFBTSwwSEFBaUQsQ0FDeEQsQ0FBQyxpQkFBaUIsQ0FBQztvQkFDbEIsR0FBRyxFQUFFLFFBQVE7aUJBQ2QsQ0FBQyxDQUFDO2FBQ0o7WUFBQyxPQUFPLEtBQVUsRUFBRTtnQkFDbkIsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtvQkFDL0IsTUFBTSxJQUFJLFlBQVksQ0FDcEIsd0NBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxFQUNwQyxlQUFlLENBQ2hCLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsTUFBTSxJQUFJLFlBQVksQ0FDcEIsd0NBQUMsQ0FBQywrQkFBK0IsQ0FBQyxFQUNsQyxlQUFlLENBQ2hCLENBQUM7aUJBQ0g7YUFDRjtTQUNGO0tBQ0Y7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDLEVBQUM7QUFFSyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQW1CLEVBQVUsRUFBRTtJQUN6RCxJQUFJLElBQVksQ0FBQztJQUNqQixJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM1QixJQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2I7U0FBTTtRQUNMLElBQUksSUFBSSxDQUFDLElBQUksRUFBRTtZQUNiLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztTQUNsQjtRQUNELElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQztLQUN4QjtJQUNELElBQUksc0JBQXNCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3JDLE9BQU8sdURBQWUsQ0FBQztLQUN4QjtTQUFNLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUM5QixPQUFPLHNEQUFjLENBQUM7S0FDdkI7U0FBTSxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDaEMsT0FBTyxzREFBYyxDQUFDO0tBQ3ZCO1NBQU0sSUFBSSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQzlCLE9BQU8sc0RBQWMsQ0FBQztLQUN2QjtJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQyxDQUFDO0FBRUssTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE1BQStCLEVBQUUsRUFBRTs7SUFDbkUsSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUNYLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxPQUFPLGFBQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLDBDQUFHLENBQUMsQ0FBQyxLQUFJLElBQUksQ0FBQztBQUN4RSxDQUFDLENBQUM7QUFFSyxNQUFNLHFCQUFxQixHQUFHLENBQ25DLElBQW1CLEVBQ0ksRUFBRTtJQUN6QixPQUFPLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFFSyxNQUFNLGlCQUFpQixHQUFHLENBQUMsTUFBK0IsRUFBRSxFQUFFO0lBQ25FLE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQUVLLE1BQU0sb0JBQW9CLEdBQUcsQ0FDbEMsSUFBNkIsRUFDcUMsRUFBRTtJQUNwRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztJQUM1QixPQUFPLENBQ0wsQ0FBQyxDQUFDLElBQUksSUFBSyx5RUFBdUQsQ0FBQyxJQUFJLENBQUMsQ0FDekUsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVLLE1BQU0sMEJBQTBCLEdBQUcsQ0FDeEMsSUFBaUI7QUFDakIsaUNBQWlDO0FBQ2pDLGFBQThCLEVBQzlCLGFBQWtEO0FBQ2xELDhFQUE4RTtBQUM5RSxVQUFvQyxFQUNwQyxFQUFFO0lBQ0YsTUFBTSxRQUFRLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQyxJQUFJO1FBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQyxJQUFJLDREQUFxQixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLDZEQUFxQjtnQkFDM0IsSUFBSSxFQUFFLGlEQUFPLENBQ1g7b0JBQ0UsUUFBUSxFQUFFLGdFQUFzQixDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO29CQUNyRCxRQUFRLGdDQUNOLEtBQUssRUFBRSxhQUFhLGFBQWIsYUFBYSx1QkFBYixhQUFhLENBQUUsS0FBSyxFQUMzQixVQUFVLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUMxQyxpRUFBc0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxHQUMzQyxDQUFDLGFBQWE7d0JBQ2YsQ0FBQyxDQUFDLDZEQUFxQixDQUNuQixJQUFJLENBQUMsUUFBUSxJQUFJLEVBQUUsRUFDbkIsYUFBYSxFQUNiLElBQUksQ0FDTDt3QkFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQ1I7b0JBQ0QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2lCQUNsQixFQUNELGFBQWEsRUFDYixhQUFhLEVBQ2IsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFLENBQ3pCO2FBQ0YsQ0FBQztTQUNIO2FBQU0sSUFBSSxxREFBYyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9CLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLGdFQUF3QjtnQkFDOUIsSUFBSTthQUNMLENBQUM7U0FDSDtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQVUsRUFBRTtRQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHdDQUFDLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxDQUFDO0tBQ3REO0FBQ0gsQ0FBQyxFQUFDO0FBRUssTUFBTSxZQUFZLEdBQUcsQ0FDMUIsSUFBVTtBQUNWLGlDQUFpQztBQUNqQyxhQUE4QixFQUM5QixhQUFrRDtBQUNsRCw4RUFBOEU7QUFDOUUsVUFBb0MsRUFDcEMsRUFBRTtJQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sMEJBQTBCLENBQzFDLElBQUksRUFDSixhQUFhLEVBQ2IsYUFBYSxFQUNiLFVBQVUsQ0FDWCxDQUFDO0lBQ0YsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLDZEQUFxQixFQUFFO1FBQ3RDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0NBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUM7QUFDbEIsQ0FBQyxFQUFDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixJQUFZLEVBQ1osZ0JBQXVDLGFBQWEsRUFDcEQsRUFBRTtJQUNGLE1BQU0sSUFBSSxHQUFvQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9ELElBQUksQ0FBQyxxREFBYyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQztLQUNwQztJQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN2RCxPQUFPLDZEQUFtQixDQUFDLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztBQUMxRCxDQUFDLENBQUM7QUFFSyxNQUFNLG1CQUFtQixHQUFHLENBQ2pDLElBQVUsRUFDVixnQkFBdUMsYUFBYSxFQUNwRCxFQUFFO0lBQ0YsT0FBTyxnQkFBZ0IsQ0FBQyxNQUFNLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3hFLENBQUMsRUFBQztBQUVLLE1BQU0sWUFBWSxHQUFHLENBQzFCLE1BQXlCLEVBQ1YsRUFBRTtJQUNqQixPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLElBQUk7WUFDRixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUU7b0JBQ1QsT0FBTyxNQUFNLENBQ1gsSUFBSSxnREFBVyxDQUNiLHdDQUFDLENBQUMsMEJBQTBCLENBQUMsRUFDN0IseUJBQXlCLENBQzFCLENBQ0YsQ0FBQztpQkFDSDtnQkFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUNmO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLEVBQUM7QUFFRjtxQ0FDcUM7QUFDOUIsTUFBTSxrQkFBa0IsR0FBRyxDQUFPLElBQVUsRUFBbUIsRUFBRTtJQUN0RSxJQUFJO1FBQ0YsTUFBTSxVQUFVLEdBQUcsTUFBTSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQ2xELE9BQU8sRUFDUCxNQUFNLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUM5QixDQUFDO1FBQ0YsT0FBTyx3REFBZ0IsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBVyxDQUFDO0tBQy9EO0lBQUMsT0FBTyxLQUFVLEVBQUU7UUFDbkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQixxRUFBcUU7UUFDckUsT0FBTywrQ0FBTSxDQUFDLEVBQUUsQ0FBVyxDQUFDO0tBQzdCO0FBQ0gsQ0FBQyxFQUFDO0FBRUssTUFBTSxVQUFVLEdBQUcsQ0FBTyxJQUFpQixFQUFvQixFQUFFO0lBQ3RFLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztRQUNoQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBaUIsQ0FBQztZQUN6QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkIsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLEVBQUM7QUFFSyxNQUFNLGFBQWEsR0FBRyxDQUFDLE9BQWdCLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxFQUFFO0lBQy9ELE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU5RSxNQUFNLEVBQUUsR0FBRyxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsTUFBTSxFQUFFLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEM7SUFDRCxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDdEQsQ0FBQyxDQUFDO0FBRUssTUFBTSxlQUFlLEdBQUcsQ0FDN0IsSUFBVSxFQUNWLElBSUMsRUFDYyxFQUFFO0lBQ2pCLHlDQUF5QztJQUN6QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssc0RBQWMsRUFBRTtRQUNoQyxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxDQUFDLElBQUksRUFBRSxlQUFlLENBQUMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDaEQsZ0tBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7UUFDekMsb0NBQW9DO1FBQ3BDLHNNQUEyQixDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztLQUN2RCxDQUFDLENBQUM7SUFFSCx5RUFBeUU7SUFDekUsZUFBZTtJQUNmLCtFQUErRTtJQUMvRSxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUM7UUFDN0IsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO0tBQ3pDLENBQUMsQ0FBQztJQUVILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNuQixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDO1FBQzVCLE1BQU0sQ0FBQyxZQUFZLEdBQUcsVUFBVSxHQUFHO1lBQ2pDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUU7Z0JBQ3JFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO0tBQ0g7SUFFRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBQyxDQUFDLDRCQUE0QixDQUFDLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sSUFBSSxJQUFJLENBQ2IsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFDM0QsSUFBSSxDQUFDLElBQUksRUFDVDtRQUNFLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJO0tBQ25DLENBQ0YsQ0FBQztBQUNKLENBQUMsRUFBQztBQUVLLE1BQU0sZUFBZSxHQUFHLENBQUMsU0FBaUIsRUFBRSxXQUFtQixFQUFFLEVBQUUsRUFBRTtJQUMxRSxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxXQUFXLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUU7UUFDL0QsSUFBSSxFQUFFLHNEQUFjO0tBQ3JCLENBQTJDLENBQUM7QUFDL0MsQ0FBQyxDQUFDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUM5QixLQUFzQyxFQUN0QyxFQUFFO0lBQ0YsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDO0FBQ3ZFLENBQUMsRUFBQztBQUVLLE1BQU0sYUFBYSxHQUFHLENBQzNCLEtBQXNDLEVBQ0osRUFBRTtJQUNwQyxJQUFJLGtFQUF5QixFQUFFO1FBQzdCLElBQUk7WUFDRixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLE1BQU0sR0FDVixDQUFDLE1BQU8sSUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUMsSUFBSSxJQUFJLENBQUM7WUFFeEQsT0FBTyxNQUFNLENBQUM7U0FDZjtRQUFDLE9BQU8sS0FBVSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDeEMsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLEVBQUM7QUFFRjs7R0FFRztBQUNILE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxNQUFtQixFQUFFLEVBQUU7SUFDekQsSUFBSSxRQUFRLEdBQ1YsSUFBSSxDQUFDO0lBRVAsTUFBTSxXQUFXLEdBQUcsR0FBRyxDQUFDLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO0lBRTVFLHNCQUFzQjtJQUN0QixNQUFNLFdBQVcsR0FBRztRQUNsQixzRUFBc0U7UUFDdEUsR0FBRyxFQUFFLDJCQUEyQjtRQUNoQywwREFBMEQ7UUFDMUQsdUVBQXVFO1FBQ3ZFLCtFQUErRTtRQUMvRSxHQUFHLEVBQUUsY0FBYztRQUNuQixxREFBcUQ7UUFDckQsR0FBRyxFQUFFLG9CQUFvQjtLQUMxQixDQUFDO0lBRUYsSUFBSSxXQUFXLEtBQUssV0FBVyxDQUFDLEdBQUcsRUFBRTtRQUNuQyxRQUFRLEdBQUcsc0RBQWMsQ0FBQztLQUMzQjtTQUFNLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDbEQsUUFBUSxHQUFHLHNEQUFjLENBQUM7S0FDM0I7U0FBTSxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xELFFBQVEsR0FBRyxzREFBYyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUssTUFBTSxVQUFVLEdBQUcsQ0FDeEIsSUFBK0IsRUFDL0IsUUFBb0MsRUFDcEMsSUFBd0IsRUFDeEIsRUFBRTtJQUNGLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFO1FBQ2xDLElBQUksRUFBRSxRQUFRO0tBQ2YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDO0FBRUY7O3dFQUV3RTtBQUNqRSxNQUFNLGFBQWEsR0FBRyxDQUFPLElBQVUsRUFBRSxFQUFFOztJQUNoRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRTtRQUNkLElBQUksVUFBSSxhQUFKLElBQUksdUJBQUosSUFBSSxDQUFFLElBQUksMENBQUUsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7WUFDMUMsSUFBSSxHQUFHLFVBQVUsQ0FDZixNQUFNLGlCQUFpQixDQUFDLElBQUksQ0FBQyxFQUM3QixnRUFBd0IsRUFDeEIsSUFBSSxDQUFDLElBQUksQ0FDVixDQUFDO1NBQ0g7YUFBTSxJQUFJLFVBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRSxJQUFJLDBDQUFFLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRTtZQUM5QyxJQUFJLEdBQUcsVUFBVSxDQUNmLE1BQU0saUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQzdCLDZEQUFxQixFQUNyQixJQUFJLENBQUMsSUFBSSxDQUNWLENBQUM7U0FDSDthQUFNO1lBQ0wsTUFBTSxNQUFNLEdBQUcsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNwRCxJQUFJLFFBQVEsRUFBRTtnQkFDWixJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ2hEO1NBQ0Y7UUFDRCx3RUFBd0U7UUFDeEUsK0RBQStEO0tBQ2hFO1NBQU0sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxNQUFNLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLDBCQUEwQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUSxJQUFJLFFBQVEsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ3RDLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEQ7S0FDRjtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyxFQUFDO0FBRUssTUFBTSxpQkFBaUIsR0FBRyxDQUFDLElBQVUsRUFBd0IsRUFBRTtJQUNwRSxJQUFJLGFBQWEsSUFBSSxJQUFJLEVBQUU7UUFDekIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7S0FDM0I7SUFDRCxTQUFTO0lBQ1QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUNyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTs7WUFDeEIsSUFBSSxDQUFDLFlBQUssQ0FBQyxNQUFNLDBDQUFFLE1BQU0sR0FBRTtnQkFDekIsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0NBQXNDLENBQUMsQ0FBQyxDQUFDO2FBQ2xFO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBcUIsQ0FBQyxDQUFDO1FBQzlDLENBQUMsQ0FBQztRQUNGLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL2Jsb2IudHM/YTgzZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBuYW5vaWQgfSBmcm9tIFwibmFub2lkXCI7XG5pbXBvcnQgeyBjbGVhbkFwcFN0YXRlRm9yRXhwb3J0IH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBBTExPV0VEX0lNQUdFX01JTUVfVFlQRVMsIE1JTUVfVFlQRVMgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBjbGVhckVsZW1lbnRzRm9yRXhwb3J0IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50LCBGaWxlSWQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgQ2FudmFzRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzXCI7XG5pbXBvcnQgeyB0IH0gZnJvbSBcIi4uL2kxOG5cIjtcbmltcG9ydCB7IGNhbGN1bGF0ZVNjcm9sbENlbnRlciB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIERhdGFVUkwsIExpYnJhcnlJdGVtIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBWYWx1ZU9mIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7IGJ5dGVzVG9IZXhTdHJpbmcgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IEZpbGVTeXN0ZW1IYW5kbGUsIG5hdGl2ZUZpbGVTeXN0ZW1TdXBwb3J0ZWQgfSBmcm9tIFwiLi9maWxlc3lzdGVtXCI7XG5pbXBvcnQgeyBpc1ZhbGlkRXhjYWxpZHJhd0RhdGEsIGlzVmFsaWRMaWJyYXJ5IH0gZnJvbSBcIi4vanNvblwiO1xuaW1wb3J0IHsgcmVzdG9yZSwgcmVzdG9yZUxpYnJhcnlJdGVtcyB9IGZyb20gXCIuL3Jlc3RvcmVcIjtcbmltcG9ydCB7IEltcG9ydGVkTGlicmFyeURhdGEgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG5jb25zdCBwYXJzZUZpbGVDb250ZW50cyA9IGFzeW5jIChibG9iOiBCbG9iIHwgRmlsZSkgPT4ge1xuICBsZXQgY29udGVudHM6IHN0cmluZztcblxuICBpZiAoYmxvYi50eXBlID09PSBNSU1FX1RZUEVTLnBuZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi9pbWFnZVwiKVxuICAgICAgKS5kZWNvZGVQbmdNZXRhZGF0YShibG9iKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBpZiAoZXJyb3IubWVzc2FnZSA9PT0gXCJJTlZBTElEXCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICB0KFwiYWxlcnRzLmltYWdlRG9lc05vdENvbnRhaW5TY2VuZVwiKSxcbiAgICAgICAgICBcIkVuY29kaW5nRXJyb3JcIixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oXG4gICAgICAgICAgdChcImFsZXJ0cy5jYW5ub3RSZXN0b3JlRnJvbUltYWdlXCIpLFxuICAgICAgICAgIFwiRW5jb2RpbmdFcnJvclwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoXCJ0ZXh0XCIgaW4gQmxvYikge1xuICAgICAgY29udGVudHMgPSBhd2FpdCBibG9iLnRleHQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudHMgPSBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgICByZWFkZXIucmVhZEFzVGV4dChibG9iLCBcInV0ZjhcIik7XG4gICAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKHJlYWRlci5yZWFkeVN0YXRlID09PSBGaWxlUmVhZGVyLkRPTkUpIHtcbiAgICAgICAgICAgIHJlc29sdmUocmVhZGVyLnJlc3VsdCBhcyBzdHJpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoYmxvYi50eXBlID09PSBNSU1FX1RZUEVTLnN2Zykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IChcbiAgICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi9pbWFnZVwiKVxuICAgICAgICApLmRlY29kZVN2Z01ldGFkYXRhKHtcbiAgICAgICAgICBzdmc6IGNvbnRlbnRzLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgICAgaWYgKGVycm9yLm1lc3NhZ2UgPT09IFwiSU5WQUxJRFwiKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihcbiAgICAgICAgICAgIHQoXCJhbGVydHMuaW1hZ2VEb2VzTm90Q29udGFpblNjZW5lXCIpLFxuICAgICAgICAgICAgXCJFbmNvZGluZ0Vycm9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKFxuICAgICAgICAgICAgdChcImFsZXJ0cy5jYW5ub3RSZXN0b3JlRnJvbUltYWdlXCIpLFxuICAgICAgICAgICAgXCJFbmNvZGluZ0Vycm9yXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gY29udGVudHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWltZVR5cGUgPSAoYmxvYjogQmxvYiB8IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGxldCBuYW1lOiBzdHJpbmc7XG4gIGlmICh0eXBlb2YgYmxvYiA9PT0gXCJzdHJpbmdcIikge1xuICAgIG5hbWUgPSBibG9iO1xuICB9IGVsc2Uge1xuICAgIGlmIChibG9iLnR5cGUpIHtcbiAgICAgIHJldHVybiBibG9iLnR5cGU7XG4gICAgfVxuICAgIG5hbWUgPSBibG9iLm5hbWUgfHwgXCJcIjtcbiAgfVxuICBpZiAoL1xcLihleGNhbGlkcmF3fGpzb24pJC8udGVzdChuYW1lKSkge1xuICAgIHJldHVybiBNSU1FX1RZUEVTLmpzb247XG4gIH0gZWxzZSBpZiAoL1xcLnBuZyQvLnRlc3QobmFtZSkpIHtcbiAgICByZXR1cm4gTUlNRV9UWVBFUy5wbmc7XG4gIH0gZWxzZSBpZiAoL1xcLmpwZT9nJC8udGVzdChuYW1lKSkge1xuICAgIHJldHVybiBNSU1FX1RZUEVTLmpwZztcbiAgfSBlbHNlIGlmICgvXFwuc3ZnJC8udGVzdChuYW1lKSkge1xuICAgIHJldHVybiBNSU1FX1RZUEVTLnN2ZztcbiAgfVxuICByZXR1cm4gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGaWxlSGFuZGxlVHlwZSA9IChoYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUgfCBudWxsKSA9PiB7XG4gIGlmICghaGFuZGxlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4gaGFuZGxlLm5hbWUubWF0Y2goL1xcLihqc29ufGV4Y2FsaWRyYXd8cG5nfHN2ZykkLyk/LlsxXSB8fCBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSW1hZ2VGaWxlSGFuZGxlVHlwZSA9IChcbiAgdHlwZTogc3RyaW5nIHwgbnVsbCxcbik6IHR5cGUgaXMgXCJwbmdcIiB8IFwic3ZnXCIgPT4ge1xuICByZXR1cm4gdHlwZSA9PT0gXCJwbmdcIiB8fCB0eXBlID09PSBcInN2Z1wiO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSW1hZ2VGaWxlSGFuZGxlID0gKGhhbmRsZTogRmlsZVN5c3RlbUhhbmRsZSB8IG51bGwpID0+IHtcbiAgY29uc3QgdHlwZSA9IGdldEZpbGVIYW5kbGVUeXBlKGhhbmRsZSk7XG4gIHJldHVybiB0eXBlID09PSBcInBuZ1wiIHx8IHR5cGUgPT09IFwic3ZnXCI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNTdXBwb3J0ZWRJbWFnZUZpbGUgPSAoXG4gIGJsb2I6IEJsb2IgfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogYmxvYiBpcyBCbG9iICYgeyB0eXBlOiB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl0gfSA9PiB7XG4gIGNvbnN0IHsgdHlwZSB9ID0gYmxvYiB8fCB7fTtcbiAgcmV0dXJuIChcbiAgICAhIXR5cGUgJiYgKEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFUyBhcyByZWFkb25seSBzdHJpbmdbXSkuaW5jbHVkZXModHlwZSlcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkU2NlbmVPckxpYnJhcnlGcm9tQmxvYiA9IGFzeW5jIChcbiAgYmxvYjogQmxvYiB8IEZpbGUsXG4gIC8qKiBAc2VlIHJlc3RvcmUubG9jYWxBcHBTdGF0ZSAqL1xuICBsb2NhbEFwcFN0YXRlOiBBcHBTdGF0ZSB8IG51bGwsXG4gIGxvY2FsRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gfCBudWxsLFxuICAvKiogRmlsZVN5c3RlbUhhbmRsZS4gRGVmYXVsdHMgdG8gYGJsb2IuaGFuZGxlYCBpZiBkZWZpbmVkLCBvdGhlcndpc2UgbnVsbC4gKi9cbiAgZmlsZUhhbmRsZT86IEZpbGVTeXN0ZW1IYW5kbGUgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRlbnRzID0gYXdhaXQgcGFyc2VGaWxlQ29udGVudHMoYmxvYik7XG4gIHRyeSB7XG4gICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UoY29udGVudHMpO1xuICAgIGlmIChpc1ZhbGlkRXhjYWxpZHJhd0RhdGEoZGF0YSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IE1JTUVfVFlQRVMuZXhjYWxpZHJhdyxcbiAgICAgICAgZGF0YTogcmVzdG9yZShcbiAgICAgICAgICB7XG4gICAgICAgICAgICBlbGVtZW50czogY2xlYXJFbGVtZW50c0ZvckV4cG9ydChkYXRhLmVsZW1lbnRzIHx8IFtdKSxcbiAgICAgICAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgICAgICAgIHRoZW1lOiBsb2NhbEFwcFN0YXRlPy50aGVtZSxcbiAgICAgICAgICAgICAgZmlsZUhhbmRsZTogZmlsZUhhbmRsZSB8fCBibG9iLmhhbmRsZSB8fCBudWxsLFxuICAgICAgICAgICAgICAuLi5jbGVhbkFwcFN0YXRlRm9yRXhwb3J0KGRhdGEuYXBwU3RhdGUgfHwge30pLFxuICAgICAgICAgICAgICAuLi4obG9jYWxBcHBTdGF0ZVxuICAgICAgICAgICAgICAgID8gY2FsY3VsYXRlU2Nyb2xsQ2VudGVyKFxuICAgICAgICAgICAgICAgICAgICBkYXRhLmVsZW1lbnRzIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICBsb2NhbEFwcFN0YXRlLFxuICAgICAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZpbGVzOiBkYXRhLmZpbGVzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbG9jYWxBcHBTdGF0ZSxcbiAgICAgICAgICBsb2NhbEVsZW1lbnRzLFxuICAgICAgICAgIHsgcmVwYWlyQmluZGluZ3M6IHRydWUgfSxcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmIChpc1ZhbGlkTGlicmFyeShkYXRhKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogTUlNRV9UWVBFUy5leGNhbGlkcmF3bGliLFxuICAgICAgICBkYXRhLFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKHQoXCJhbGVydHMuY291bGROb3RMb2FkSW52YWxpZEZpbGVcIikpO1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IodChcImFsZXJ0cy5jb3VsZE5vdExvYWRJbnZhbGlkRmlsZVwiKSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkRnJvbUJsb2IgPSBhc3luYyAoXG4gIGJsb2I6IEJsb2IsXG4gIC8qKiBAc2VlIHJlc3RvcmUubG9jYWxBcHBTdGF0ZSAqL1xuICBsb2NhbEFwcFN0YXRlOiBBcHBTdGF0ZSB8IG51bGwsXG4gIGxvY2FsRWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10gfCBudWxsLFxuICAvKiogRmlsZVN5c3RlbUhhbmRsZS4gRGVmYXVsdHMgdG8gYGJsb2IuaGFuZGxlYCBpZiBkZWZpbmVkLCBvdGhlcndpc2UgbnVsbC4gKi9cbiAgZmlsZUhhbmRsZT86IEZpbGVTeXN0ZW1IYW5kbGUgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IHJldCA9IGF3YWl0IGxvYWRTY2VuZU9yTGlicmFyeUZyb21CbG9iKFxuICAgIGJsb2IsXG4gICAgbG9jYWxBcHBTdGF0ZSxcbiAgICBsb2NhbEVsZW1lbnRzLFxuICAgIGZpbGVIYW5kbGUsXG4gICk7XG4gIGlmIChyZXQudHlwZSAhPT0gTUlNRV9UWVBFUy5leGNhbGlkcmF3KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHQoXCJhbGVydHMuY291bGROb3RMb2FkSW52YWxpZEZpbGVcIikpO1xuICB9XG4gIHJldHVybiByZXQuZGF0YTtcbn07XG5cbmV4cG9ydCBjb25zdCBwYXJzZUxpYnJhcnlKU09OID0gKFxuICBqc29uOiBzdHJpbmcsXG4gIGRlZmF1bHRTdGF0dXM6IExpYnJhcnlJdGVtW1wic3RhdHVzXCJdID0gXCJ1bnB1Ymxpc2hlZFwiLFxuKSA9PiB7XG4gIGNvbnN0IGRhdGE6IEltcG9ydGVkTGlicmFyeURhdGEgfCB1bmRlZmluZWQgPSBKU09OLnBhcnNlKGpzb24pO1xuICBpZiAoIWlzVmFsaWRMaWJyYXJ5KGRhdGEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBsaWJyYXJ5XCIpO1xuICB9XG4gIGNvbnN0IGxpYnJhcnlJdGVtcyA9IGRhdGEubGlicmFyeUl0ZW1zIHx8IGRhdGEubGlicmFyeTtcbiAgcmV0dXJuIHJlc3RvcmVMaWJyYXJ5SXRlbXMobGlicmFyeUl0ZW1zLCBkZWZhdWx0U3RhdHVzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBsb2FkTGlicmFyeUZyb21CbG9iID0gYXN5bmMgKFxuICBibG9iOiBCbG9iLFxuICBkZWZhdWx0U3RhdHVzOiBMaWJyYXJ5SXRlbVtcInN0YXR1c1wiXSA9IFwidW5wdWJsaXNoZWRcIixcbikgPT4ge1xuICByZXR1cm4gcGFyc2VMaWJyYXJ5SlNPTihhd2FpdCBwYXJzZUZpbGVDb250ZW50cyhibG9iKSwgZGVmYXVsdFN0YXR1cyk7XG59O1xuXG5leHBvcnQgY29uc3QgY2FudmFzVG9CbG9iID0gYXN5bmMgKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50LFxuKTogUHJvbWlzZTxCbG9iPiA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGNhbnZhcy50b0Jsb2IoKGJsb2IpID0+IHtcbiAgICAgICAgaWYgKCFibG9iKSB7XG4gICAgICAgICAgcmV0dXJuIHJlamVjdChcbiAgICAgICAgICAgIG5ldyBDYW52YXNFcnJvcihcbiAgICAgICAgICAgICAgdChcImNhbnZhc0Vycm9yLmNhbnZhc1Rvb0JpZ1wiKSxcbiAgICAgICAgICAgICAgXCJDQU5WQVNfUE9TU0lCTFlfVE9PX0JJR1wiLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoYmxvYik7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICByZWplY3QoZXJyb3IpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKiogZ2VuZXJhdGVzIFNIQS0xIGRpZ2VzdCBmcm9tIHN1cHBsaWVkIGZpbGUgKGlmIG5vdCBzdXBwb3J0ZWQsIGZhbGxzIGJhY2tcbiAgICB0byBhIDQwLWNoYXIgYmFzZTY0IHJhbmRvbSBpZCkgKi9cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZUlkRnJvbUZpbGUgPSBhc3luYyAoZmlsZTogRmlsZSk6IFByb21pc2U8RmlsZUlkPiA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgaGFzaEJ1ZmZlciA9IGF3YWl0IHdpbmRvdy5jcnlwdG8uc3VidGxlLmRpZ2VzdChcbiAgICAgIFwiU0hBLTFcIixcbiAgICAgIGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGZpbGUpLFxuICAgICk7XG4gICAgcmV0dXJuIGJ5dGVzVG9IZXhTdHJpbmcobmV3IFVpbnQ4QXJyYXkoaGFzaEJ1ZmZlcikpIGFzIEZpbGVJZDtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIC8vIGxlbmd0aCA0MCB0byBhbGlnbiB3aXRoIHRoZSBIRVggbGVuZ3RoIG9mIFNIQS0xICh3aGljaCBpcyAxNjAgYml0KVxuICAgIHJldHVybiBuYW5vaWQoNDApIGFzIEZpbGVJZDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGFVUkwgPSBhc3luYyAoZmlsZTogQmxvYiB8IEZpbGUpOiBQcm9taXNlPERhdGFVUkw+ID0+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkYXRhVVJMID0gcmVhZGVyLnJlc3VsdCBhcyBEYXRhVVJMO1xuICAgICAgcmVzb2x2ZShkYXRhVVJMKTtcbiAgICB9O1xuICAgIHJlYWRlci5vbmVycm9yID0gKGVycm9yKSA9PiByZWplY3QoZXJyb3IpO1xuICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKGZpbGUpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBkYXRhVVJMVG9GaWxlID0gKGRhdGFVUkw6IERhdGFVUkwsIGZpbGVuYW1lID0gXCJcIikgPT4ge1xuICBjb25zdCBkYXRhSW5kZXhTdGFydCA9IGRhdGFVUkwuaW5kZXhPZihcIixcIik7XG4gIGNvbnN0IGJ5dGVTdHJpbmcgPSBhdG9iKGRhdGFVUkwuc2xpY2UoZGF0YUluZGV4U3RhcnQgKyAxKSk7XG4gIGNvbnN0IG1pbWVUeXBlID0gZGF0YVVSTC5zbGljZSgwLCBkYXRhSW5kZXhTdGFydCkuc3BsaXQoXCI6XCIpWzFdLnNwbGl0KFwiO1wiKVswXTtcblxuICBjb25zdCBhYiA9IG5ldyBBcnJheUJ1ZmZlcihieXRlU3RyaW5nLmxlbmd0aCk7XG4gIGNvbnN0IGlhID0gbmV3IFVpbnQ4QXJyYXkoYWIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJ5dGVTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBpYVtpXSA9IGJ5dGVTdHJpbmcuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gbmV3IEZpbGUoW2FiXSwgZmlsZW5hbWUsIHsgdHlwZTogbWltZVR5cGUgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzaXplSW1hZ2VGaWxlID0gYXN5bmMgKFxuICBmaWxlOiBGaWxlLFxuICBvcHRzOiB7XG4gICAgLyoqIHVuZGVmaW5lZCBpbmRpY2F0ZXMgYXV0byAqL1xuICAgIG91dHB1dFR5cGU/OiB0eXBlb2YgTUlNRV9UWVBFU1tcImpwZ1wiXTtcbiAgICBtYXhXaWR0aE9ySGVpZ2h0OiBudW1iZXI7XG4gIH0sXG4pOiBQcm9taXNlPEZpbGU+ID0+IHtcbiAgLy8gU1ZHIGZpbGVzIHNob3VsZG4ndCBhIGNhbid0IGJlIHJlc2l6ZWRcbiAgaWYgKGZpbGUudHlwZSA9PT0gTUlNRV9UWVBFUy5zdmcpIHtcbiAgICByZXR1cm4gZmlsZTtcbiAgfVxuXG4gIGNvbnN0IFtwaWNhLCBpbWFnZUJsb2JSZWR1Y2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgIGltcG9ydChcInBpY2FcIikudGhlbigocmVzKSA9PiByZXMuZGVmYXVsdCksXG4gICAgLy8gYSB3cmFwcGVyIGZvciBwaWNhIGZvciBiZXR0ZXIgQVBJXG4gICAgaW1wb3J0KFwiaW1hZ2UtYmxvYi1yZWR1Y2VcIikudGhlbigocmVzKSA9PiByZXMuZGVmYXVsdCksXG4gIF0pO1xuXG4gIC8vIENSQSdzIG1pbmlmaWNhdGlvbiBzZXR0aW5ncyBicmVhayBwaWNhIGluIFdlYldvcmtlcnMsIHNvIGxldCdzIGRpc2FibGVcbiAgLy8gdGhlbSBmb3Igbm93XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvaW1hZ2UtYmxvYi1yZWR1Y2UvaXNzdWVzLzIxI2lzc3VlY29tbWVudC03NTczNjU1MTNcbiAgY29uc3QgcmVkdWNlID0gaW1hZ2VCbG9iUmVkdWNlKHtcbiAgICBwaWNhOiBwaWNhKHsgZmVhdHVyZXM6IFtcImpzXCIsIFwid2FzbVwiXSB9KSxcbiAgfSk7XG5cbiAgaWYgKG9wdHMub3V0cHV0VHlwZSkge1xuICAgIGNvbnN0IHsgb3V0cHV0VHlwZSB9ID0gb3B0cztcbiAgICByZWR1Y2UuX2NyZWF0ZV9ibG9iID0gZnVuY3Rpb24gKGVudikge1xuICAgICAgcmV0dXJuIHRoaXMucGljYS50b0Jsb2IoZW52Lm91dF9jYW52YXMsIG91dHB1dFR5cGUsIDAuOCkudGhlbigoYmxvYikgPT4ge1xuICAgICAgICBlbnYub3V0X2Jsb2IgPSBibG9iO1xuICAgICAgICByZXR1cm4gZW52O1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGlmICghaXNTdXBwb3J0ZWRJbWFnZUZpbGUoZmlsZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IodChcImVycm9ycy51bnN1cHBvcnRlZEZpbGVUeXBlXCIpKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgRmlsZShcbiAgICBbYXdhaXQgcmVkdWNlLnRvQmxvYihmaWxlLCB7IG1heDogb3B0cy5tYXhXaWR0aE9ySGVpZ2h0IH0pXSxcbiAgICBmaWxlLm5hbWUsXG4gICAge1xuICAgICAgdHlwZTogb3B0cy5vdXRwdXRUeXBlIHx8IGZpbGUudHlwZSxcbiAgICB9LFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IFNWR1N0cmluZ1RvRmlsZSA9IChTVkdTdHJpbmc6IHN0cmluZywgZmlsZW5hbWU6IHN0cmluZyA9IFwiXCIpID0+IHtcbiAgcmV0dXJuIG5ldyBGaWxlKFtuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoU1ZHU3RyaW5nKV0sIGZpbGVuYW1lLCB7XG4gICAgdHlwZTogTUlNRV9UWVBFUy5zdmcsXG4gIH0pIGFzIEZpbGUgJiB7IHR5cGU6IHR5cGVvZiBNSU1FX1RZUEVTLnN2ZyB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVGcm9tRXZlbnQgPSBhc3luYyAoXG4gIGV2ZW50OiBSZWFjdC5EcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+LFxuKSA9PiB7XG4gIGNvbnN0IGZpbGUgPSBldmVudC5kYXRhVHJhbnNmZXIuZmlsZXMuaXRlbSgwKTtcbiAgY29uc3QgZmlsZUhhbmRsZSA9IGF3YWl0IGdldEZpbGVIYW5kbGUoZXZlbnQpO1xuXG4gIHJldHVybiB7IGZpbGU6IGZpbGUgPyBhd2FpdCBub3JtYWxpemVGaWxlKGZpbGUpIDogbnVsbCwgZmlsZUhhbmRsZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZpbGVIYW5kbGUgPSBhc3luYyAoXG4gIGV2ZW50OiBSZWFjdC5EcmFnRXZlbnQ8SFRNTERpdkVsZW1lbnQ+LFxuKTogUHJvbWlzZTxGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbD4gPT4ge1xuICBpZiAobmF0aXZlRmlsZVN5c3RlbVN1cHBvcnRlZCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBpdGVtID0gZXZlbnQuZGF0YVRyYW5zZmVyLml0ZW1zWzBdO1xuICAgICAgY29uc3QgaGFuZGxlOiBGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbCA9XG4gICAgICAgIChhd2FpdCAoaXRlbSBhcyBhbnkpLmdldEFzRmlsZVN5c3RlbUhhbmRsZSgpKSB8fCBudWxsO1xuXG4gICAgICByZXR1cm4gaGFuZGxlO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihlcnJvci5uYW1lLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogYXR0ZW1wdHMgdG8gZGV0ZWN0IGlmIGEgYnVmZmVyIGlzIGEgdmFsaWQgaW1hZ2UgYnkgY2hlY2tpbmcgaXRzIGxlYWRpbmcgYnl0ZXNcbiAqL1xuY29uc3QgZ2V0QWN0dWFsTWltZVR5cGVGcm9tSW1hZ2UgPSAoYnVmZmVyOiBBcnJheUJ1ZmZlcikgPT4ge1xuICBsZXQgbWltZVR5cGU6IFZhbHVlT2Y8UGljazx0eXBlb2YgTUlNRV9UWVBFUywgXCJwbmdcIiB8IFwianBnXCIgfCBcImdpZlwiPj4gfCBudWxsID1cbiAgICBudWxsO1xuXG4gIGNvbnN0IGZpcnN0OEJ5dGVzID0gYCR7Wy4uLm5ldyBVaW50OEFycmF5KGJ1ZmZlcikuc2xpY2UoMCwgOCldLmpvaW4oXCIgXCIpfSBgO1xuXG4gIC8vIHVpbnQ4IGxlYWRpbmcgYnl0ZXNcbiAgY29uc3QgaGVhZGVyQnl0ZXMgPSB7XG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUG9ydGFibGVfTmV0d29ya19HcmFwaGljcyNGaWxlX2hlYWRlclxuICAgIHBuZzogXCIxMzcgODAgNzggNzEgMTMgMTAgMjYgMTAgXCIsXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSlBFRyNTeW50YXhfYW5kX3N0cnVjdHVyZVxuICAgIC8vIGpwZyBpcyBhIGJpdCB3b25reS4gQ2hlY2tpbmcgdGhlIGZpcnN0IHRocmVlIGJ5dGVzIHNob3VsZCBiZSBlbm91Z2gsXG4gICAgLy8gYnV0IG1heSB5aWVsZCBmYWxzZSBwb3NpdGl2ZXMuIChodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjMzNjA3MDkvOTI3NjMxKVxuICAgIGpwZzogXCIyNTUgMjE2IDI1NSBcIixcbiAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9HSUYjRXhhbXBsZV9HSUZfZmlsZVxuICAgIGdpZjogXCI3MSA3MyA3MCA1NiA1NyA5NyBcIixcbiAgfTtcblxuICBpZiAoZmlyc3Q4Qnl0ZXMgPT09IGhlYWRlckJ5dGVzLnBuZykge1xuICAgIG1pbWVUeXBlID0gTUlNRV9UWVBFUy5wbmc7XG4gIH0gZWxzZSBpZiAoZmlyc3Q4Qnl0ZXMuc3RhcnRzV2l0aChoZWFkZXJCeXRlcy5qcGcpKSB7XG4gICAgbWltZVR5cGUgPSBNSU1FX1RZUEVTLmpwZztcbiAgfSBlbHNlIGlmIChmaXJzdDhCeXRlcy5zdGFydHNXaXRoKGhlYWRlckJ5dGVzLmdpZikpIHtcbiAgICBtaW1lVHlwZSA9IE1JTUVfVFlQRVMuZ2lmO1xuICB9XG4gIHJldHVybiBtaW1lVHlwZTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVGaWxlID0gKFxuICBibG9iOiBGaWxlIHwgQmxvYiB8IEFycmF5QnVmZmVyLFxuICBtaW1lVHlwZTogVmFsdWVPZjx0eXBlb2YgTUlNRV9UWVBFUz4sXG4gIG5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbikgPT4ge1xuICByZXR1cm4gbmV3IEZpbGUoW2Jsb2JdLCBuYW1lIHx8IFwiXCIsIHtcbiAgICB0eXBlOiBtaW1lVHlwZSxcbiAgfSk7XG59O1xuXG4vKiogYXR0ZW1wdHMgdG8gZGV0ZWN0IGNvcnJlY3QgbWltZVR5cGUgaWYgbm9uZSBpcyBzZXQsIG9yIGlmIGFuIGltYWdlXG4gKiBoYXMgYW4gaW5jb3JyZWN0IGV4dGVuc2lvbi5cbiAqIE5vdGU6IGRvZXNuJ3QgaGFuZGxlIG1pc3NpbmcgLmV4Y2FsaWRyYXcvLmV4Y2FsaWRyYXdsaWIgZXh0ZW5zaW9uICAqL1xuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZUZpbGUgPSBhc3luYyAoZmlsZTogRmlsZSkgPT4ge1xuICBpZiAoIWZpbGUudHlwZSkge1xuICAgIGlmIChmaWxlPy5uYW1lPy5lbmRzV2l0aChcIi5leGNhbGlkcmF3bGliXCIpKSB7XG4gICAgICBmaWxlID0gY3JlYXRlRmlsZShcbiAgICAgICAgYXdhaXQgYmxvYlRvQXJyYXlCdWZmZXIoZmlsZSksXG4gICAgICAgIE1JTUVfVFlQRVMuZXhjYWxpZHJhd2xpYixcbiAgICAgICAgZmlsZS5uYW1lLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGZpbGU/Lm5hbWU/LmVuZHNXaXRoKFwiLmV4Y2FsaWRyYXdcIikpIHtcbiAgICAgIGZpbGUgPSBjcmVhdGVGaWxlKFxuICAgICAgICBhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihmaWxlKSxcbiAgICAgICAgTUlNRV9UWVBFUy5leGNhbGlkcmF3LFxuICAgICAgICBmaWxlLm5hbWUsXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBidWZmZXIgPSBhd2FpdCBibG9iVG9BcnJheUJ1ZmZlcihmaWxlKTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gZ2V0QWN0dWFsTWltZVR5cGVGcm9tSW1hZ2UoYnVmZmVyKTtcbiAgICAgIGlmIChtaW1lVHlwZSkge1xuICAgICAgICBmaWxlID0gY3JlYXRlRmlsZShidWZmZXIsIG1pbWVUeXBlLCBmaWxlLm5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyB3aGVuIHRoZSBmaWxlIGlzIGFuIGltYWdlLCBtYWtlIHN1cmUgdGhlIGV4dGVuc2lvbiBjb3JyZXNwb25kcyB0byB0aGVcbiAgICAvLyBhY3R1YWwgbWltZVR5cGUgKHRoaXMgaXMgYW4gZWRnZSBjYXNlLCBidXQgaGFwcGVucyBzb21ldGltZSlcbiAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZEltYWdlRmlsZShmaWxlKSkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IGJsb2JUb0FycmF5QnVmZmVyKGZpbGUpO1xuICAgIGNvbnN0IG1pbWVUeXBlID0gZ2V0QWN0dWFsTWltZVR5cGVGcm9tSW1hZ2UoYnVmZmVyKTtcbiAgICBpZiAobWltZVR5cGUgJiYgbWltZVR5cGUgIT09IGZpbGUudHlwZSkge1xuICAgICAgZmlsZSA9IGNyZWF0ZUZpbGUoYnVmZmVyLCBtaW1lVHlwZSwgZmlsZS5uYW1lKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBibG9iVG9BcnJheUJ1ZmZlciA9IChibG9iOiBCbG9iKTogUHJvbWlzZTxBcnJheUJ1ZmZlcj4gPT4ge1xuICBpZiAoXCJhcnJheUJ1ZmZlclwiIGluIGJsb2IpIHtcbiAgICByZXR1cm4gYmxvYi5hcnJheUJ1ZmZlcigpO1xuICB9XG4gIC8vIFNhZmFyaVxuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgcmVhZGVyLm9ubG9hZCA9IChldmVudCkgPT4ge1xuICAgICAgaWYgKCFldmVudC50YXJnZXQ/LnJlc3VsdCkge1xuICAgICAgICByZXR1cm4gcmVqZWN0KG5ldyBFcnJvcihcIkNvdWxkbid0IGNvbnZlcnQgYmxvYiB0byBBcnJheUJ1ZmZlclwiKSk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGV2ZW50LnRhcmdldC5yZXN1bHQgYXMgQXJyYXlCdWZmZXIpO1xuICAgIH07XG4gICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGJsb2IpO1xuICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../data/blob.ts\n");
|
|
3255
3255
|
|
|
3256
3256
|
/***/ }),
|
|
3257
3257
|
|
|
@@ -3350,7 +3350,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3350
3350
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3351
3351
|
|
|
3352
3352
|
"use strict";
|
|
3353
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AllowedExcalidrawActiveTools\": () => (/* binding */ AllowedExcalidrawActiveTools),\n/* harmony export */ \"restore\": () => (/* binding */ restore),\n/* harmony export */ \"restoreAppState\": () => (/* binding */ restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* binding */ restoreElements),\n/* harmony export */ \"restoreLibraryItems\": () => (/* binding */ restoreLibraryItems)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n\n\n\n\n\n\n\n\n\n\nconst AllowedExcalidrawActiveTools = {\n selection: true,\n text: true,\n rectangle: true,\n diamond: true,\n ellipse: true,\n line: true,\n image: true,\n arrow: true,\n freedraw: true,\n eraser: false,\n custom: true,\n hand: true,\n};\nconst getFontFamilyByName = (fontFamilyName) => {\n if (Object.keys(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY).includes(fontFamilyName)) {\n return _constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY[fontFamilyName];\n }\n return _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_FONT_FAMILY;\n};\nconst restoreElementWithProperties = (element, extra) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n const base = {\n type: extra.type || element.type,\n // all elements must have version > 0 so getSceneVersion() will pick up\n // newly added elements\n version: element.version || 1,\n versionNonce: (_a = element.versionNonce) !== null && _a !== void 0 ? _a : 0,\n isDeleted: (_b = element.isDeleted) !== null && _b !== void 0 ? _b : false,\n id: element.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n fillStyle: element.fillStyle || \"hachure\",\n strokeWidth: element.strokeWidth || 1,\n strokeStyle: (_c = element.strokeStyle) !== null && _c !== void 0 ? _c : \"solid\",\n roughness: (_d = element.roughness) !== null && _d !== void 0 ? _d : 1,\n opacity: element.opacity == null ? 100 : element.opacity,\n angle: element.angle || 0,\n x: (_f = (_e = extra.x) !== null && _e !== void 0 ? _e : element.x) !== null && _f !== void 0 ? _f : 0,\n y: (_h = (_g = extra.y) !== null && _g !== void 0 ? _g : element.y) !== null && _h !== void 0 ? _h : 0,\n strokeColor: element.strokeColor || open_color__WEBPACK_IMPORTED_MODULE_8__.black,\n backgroundColor: element.backgroundColor || \"transparent\",\n width: element.width || 0,\n height: element.height || 0,\n seed: (_j = element.seed) !== null && _j !== void 0 ? _j : 1,\n groupIds: (_k = element.groupIds) !== null && _k !== void 0 ? _k : [],\n roundness: element.roundness\n ? element.roundness\n : element.strokeSharpness === \"round\"\n ? {\n // for old elements that would now use adaptive radius algo,\n // use legacy algo instead\n type: (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isUsingAdaptiveRadius)(element.type)\n ? _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.LEGACY\n : _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n boundElements: element.boundElementIds\n ? element.boundElementIds.map((id) => ({ type: \"arrow\", id }))\n : (_l = element.boundElements) !== null && _l !== void 0 ? _l : [],\n updated: (_m = element.updated) !== null && _m !== void 0 ? _m : (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getUpdatedTimestamp)(),\n link: (_o = element.link) !== null && _o !== void 0 ? _o : null,\n locked: (_p = element.locked) !== null && _p !== void 0 ? _p : false,\n };\n if (\"customData\" in element) {\n base.customData = element.customData;\n }\n if (_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY in element) {\n base[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY] = element[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY];\n }\n return Object.assign(Object.assign(Object.assign({}, base), (0,_element__WEBPACK_IMPORTED_MODULE_0__.getNormalizedDimensions)(base)), extra);\n};\nconst restoreElement = (element, refreshDimensions = false) => {\n var _a, _b;\n switch (element.type) {\n case \"text\":\n let fontSize = element.fontSize;\n let fontFamily = element.fontFamily;\n if (\"font\" in element) {\n const [fontPx, _fontFamily] = element.font.split(\" \");\n fontSize = parseInt(fontPx, 10);\n fontFamily = getFontFamilyByName(_fontFamily);\n }\n element = restoreElementWithProperties(element, {\n fontSize,\n fontFamily,\n text: (_a = element.text) !== null && _a !== void 0 ? _a : \"\",\n textAlign: element.textAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_TEXT_ALIGN,\n verticalAlign: element.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERTICAL_ALIGN,\n containerId: (_b = element.containerId) !== null && _b !== void 0 ? _b : null,\n originalText: element.originalText || element.text,\n });\n if (refreshDimensions) {\n element = Object.assign(Object.assign({}, element), (0,_element__WEBPACK_IMPORTED_MODULE_0__.refreshTextDimensions)(element));\n }\n return element;\n case \"freedraw\": {\n return restoreElementWithProperties(element, {\n points: element.points,\n lastCommittedPoint: null,\n simulatePressure: element.simulatePressure,\n pressures: element.pressures,\n });\n }\n case \"image\":\n return restoreElementWithProperties(element, {\n status: element.status || \"pending\",\n fileId: element.fileId,\n scale: element.scale || [1, 1],\n });\n case \"line\":\n // @ts-ignore LEGACY type\n // eslint-disable-next-line no-fallthrough\n case \"draw\":\n case \"arrow\": {\n const { startArrowhead = null, endArrowhead = element.type === \"arrow\" ? \"arrow\" : null, } = element;\n let x = element.x;\n let y = element.y;\n let points = // migrate old arrow model to new one\n !Array.isArray(element.points) || element.points.length < 2\n ? [\n [0, 0],\n [element.width, element.height],\n ]\n : element.points;\n if (points[0][0] !== 0 || points[0][1] !== 0) {\n ({ points, x, y } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__.LinearElementEditor.getNormalizedPoints(element));\n }\n return restoreElementWithProperties(element, {\n type: element.type === \"draw\"\n ? \"line\"\n : element.type,\n startBinding: element.startBinding,\n endBinding: element.endBinding,\n lastCommittedPoint: null,\n startArrowhead,\n endArrowhead,\n points,\n x,\n y,\n });\n }\n // generic elements\n case \"ellipse\":\n return restoreElementWithProperties(element, {});\n case \"rectangle\":\n return restoreElementWithProperties(element, {});\n case \"diamond\":\n return restoreElementWithProperties(element, {});\n // Don't use default case so as to catch a missing an element type case.\n // We also don't want to throw, but instead return void so we filter\n // out these unsupported elements from the restored array.\n }\n};\n/**\n * Repairs contaienr element's boundElements array by removing duplicates and\n * fixing containerId of bound elements if not present. Also removes any\n * bound elements that do not exist in the elements array.\n *\n * NOTE mutates elements.\n */\nconst repairContainerElement = (container, elementsMap) => {\n if (container.boundElements) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = container.boundElements.slice();\n // dedupe bindings & fix boundElement.containerId if not set already\n const boundIds = new Set();\n container.boundElements = boundElements.reduce((acc, binding) => {\n const boundElement = elementsMap.get(binding.id);\n if (boundElement && !boundIds.has(binding.id)) {\n boundIds.add(binding.id);\n if (boundElement.isDeleted) {\n return acc;\n }\n acc.push(binding);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(boundElement) &&\n // being slightly conservative here, preserving existing containerId\n // if defined, lest boundElements is stale\n !boundElement.containerId) {\n boundElement.containerId =\n container.id;\n }\n }\n return acc;\n }, []);\n }\n};\n/**\n * Repairs target bound element's container's boundElements array,\n * or removes contaienrId if container does not exist.\n *\n * NOTE mutates elements.\n */\nconst repairBoundElement = (boundElement, elementsMap) => {\n const container = boundElement.containerId\n ? elementsMap.get(boundElement.containerId)\n : null;\n if (!container) {\n boundElement.containerId = null;\n return;\n }\n if (boundElement.isDeleted) {\n return;\n }\n if (container.boundElements &&\n !container.boundElements.find((binding) => binding.id === boundElement.id)) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = (container.boundElements || (container.boundElements = [])).slice();\n boundElements.push({ type: \"text\", id: boundElement.id });\n container.boundElements = boundElements;\n }\n};\nconst restoreElements = (elements, \n/** NOTE doesn't serve for reconciliation */\nlocalElements, opts) => {\n const localElementsMap = localElements ? (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(localElements) : null;\n const restoredElements = (elements || []).reduce((elements, element) => {\n // filtering out selection, which is legacy, no longer kept in elements,\n // and causing issues if retained\n if (element.type !== \"selection\" && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isInvisiblySmallElement)(element)) {\n let migratedElement = restoreElement(element, opts === null || opts === void 0 ? void 0 : opts.refreshDimensions);\n if (migratedElement) {\n const localElement = localElementsMap === null || localElementsMap === void 0 ? void 0 : localElementsMap.get(element.id);\n if (localElement && localElement.version > migratedElement.version) {\n migratedElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_6__.bumpVersion)(migratedElement, localElement.version);\n }\n elements.push(migratedElement);\n }\n }\n return elements;\n }, []);\n if (!(opts === null || opts === void 0 ? void 0 : opts.repairBindings)) {\n return restoredElements;\n }\n // repair binding. Mutates elements.\n const restoredElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(restoredElements);\n for (const element of restoredElements) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(element) && element.containerId) {\n repairBoundElement(element, restoredElementsMap);\n }\n else if (element.boundElements) {\n repairContainerElement(element, restoredElementsMap);\n }\n }\n return restoredElements;\n};\nconst coalesceAppStateValue = (key, appState, defaultAppState) => {\n const value = appState[key];\n // NOTE the value! assertion is needed in TS 4.5.5 (fixed in newer versions)\n return value !== undefined ? value : defaultAppState[key];\n};\nconst LegacyAppStateMigrations = {\n isLibraryOpen: (appState, defaultAppState) => {\n return [\n \"openSidebar\",\n \"isLibraryOpen\" in appState\n ? appState.isLibraryOpen\n ? \"library\"\n : null\n : coalesceAppStateValue(\"openSidebar\", appState, defaultAppState),\n ];\n },\n isLibraryMenuDocked: (appState, defaultAppState) => {\n var _a;\n return [\n \"isSidebarDocked\",\n (_a = appState.isLibraryMenuDocked) !== null && _a !== void 0 ? _a : coalesceAppStateValue(\"isSidebarDocked\", appState, defaultAppState),\n ];\n },\n};\nconst restoreAppState = (appState, localAppState) => {\n var _a, _b, _c;\n appState = appState || {};\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_4__.getDefaultAppState)();\n const nextAppState = {};\n // first, migrate all legacy AppState properties to new ones. We do it\n // in one go before migrate the rest of the properties in case the new ones\n // depend on checking any other key (i.e. they are coupled)\n for (const legacyKey of Object.keys(LegacyAppStateMigrations)) {\n if (legacyKey in appState) {\n const [nextKey, nextValue] = LegacyAppStateMigrations[legacyKey](appState, defaultAppState);\n nextAppState[nextKey] = nextValue;\n }\n }\n for (const [key, defaultValue] of Object.entries(defaultAppState)) {\n // if AppState contains a legacy key, prefer that one and migrate its\n // value to the new one\n const suppliedValue = appState[key];\n const localValue = localAppState ? localAppState[key] : undefined;\n nextAppState[key] =\n suppliedValue !== undefined\n ? suppliedValue\n : localValue !== undefined\n ? localValue\n : defaultValue;\n }\n return Object.assign(Object.assign({}, nextAppState), { cursorButton: (localAppState === null || localAppState === void 0 ? void 0 : localAppState.cursorButton) || \"up\", \n // reset on fresh restore so as to hide the UI button if penMode not active\n penDetected: (_a = localAppState === null || localAppState === void 0 ? void 0 : localAppState.penDetected) !== null && _a !== void 0 ? _a : (appState.penMode ? (_b = appState.penDetected) !== null && _b !== void 0 ? _b : false : false), activeTool: Object.assign(Object.assign({}, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.updateActiveTool)(defaultAppState, nextAppState.activeTool.type &&\n AllowedExcalidrawActiveTools[nextAppState.activeTool.type]\n ? nextAppState.activeTool\n : { type: \"selection\" })), { lastActiveTool: null, locked: (_c = nextAppState.activeTool.locked) !== null && _c !== void 0 ? _c : false }), \n // Migrates from previous version where appState.zoom was a number\n zoom: typeof appState.zoom === \"number\"\n ? {\n value: appState.zoom,\n }\n : appState.zoom || defaultAppState.zoom, \n // when sidebar docked and user left it open in last session,\n // keep it open. If not docked, keep it closed irrespective of last state.\n openSidebar: nextAppState.openSidebar === \"library\"\n ? nextAppState.isSidebarDocked\n ? \"library\"\n : null\n : nextAppState.openSidebar });\n};\nconst restore = (data, \n/**\n * Local AppState (`this.state` or initial state from localStorage) so that we\n * don't overwrite local state with default values (when values not\n * explicitly specified).\n * Supply `null` if you can't get access to it.\n */\nlocalAppState, localElements, elementsConfig) => {\n return {\n elements: restoreElements(data === null || data === void 0 ? void 0 : data.elements, localElements, elementsConfig),\n appState: restoreAppState(data === null || data === void 0 ? void 0 : data.appState, localAppState || null),\n files: (data === null || data === void 0 ? void 0 : data.files) || {},\n };\n};\nconst restoreLibraryItem = (libraryItem) => {\n const elements = restoreElements((0,_element__WEBPACK_IMPORTED_MODULE_0__.getNonDeletedElements)(libraryItem.elements), null);\n return elements.length ? Object.assign(Object.assign({}, libraryItem), { elements }) : null;\n};\nconst restoreLibraryItems = (libraryItems = [], defaultStatus) => {\n const restoredItems = [];\n for (const item of libraryItems) {\n // migrate older libraries\n if (Array.isArray(item)) {\n const restoredItem = restoreLibraryItem({\n status: defaultStatus,\n elements: item,\n id: (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n created: Date.now(),\n });\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n else {\n const _item = item;\n const restoredItem = restoreLibraryItem(Object.assign(Object.assign({}, _item), { id: _item.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(), status: _item.status || defaultStatus, created: _item.created || Date.now() }));\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n }\n return restoredItems;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUN4QyxLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksRUFBRTtRQUMvQiwwQkFBMEI7UUFDMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO2dCQUN0QyxNQUFNLEVBQUUsYUFBYTtnQkFDckIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsRUFBRSxFQUFFLGlEQUFRLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDcEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDbEM7U0FDRjthQUFNO1lBQ0wsTUFBTSxLQUFLLEdBQUcsSUFHYixDQUFDO1lBQ0YsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLGlDQUNsQyxLQUFLLEtBQ1IsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksaURBQVEsRUFBRSxFQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxhQUFhLEVBQ3JDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFDcEMsQ0FBQztZQUNILElBQUksWUFBWSxFQUFFO2dCQUNoQixhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7S0FDRjtJQUNELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL3Jlc3RvcmUudHM/ODcyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1NlbGVjdGlvbkVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgU3Ryb2tlUm91bmRuZXNzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBwU3RhdGUsXG4gIEJpbmFyeUZpbGVzLFxuICBMaWJyYXJ5SXRlbSxcbiAgTm9ybWFsaXplZFpvb21WYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSwgTGVnYWN5QXBwU3RhdGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsXG4gIHJlZnJlc2hUZXh0RGltZW5zaW9ucyxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIGlzVXNpbmdBZGFwdGl2ZVJhZGl1cyB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9URVhUX0FMSUdOLFxuICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICBQUkVDRURJTkdfRUxFTUVOVF9LRVksXG4gIEZPTlRfRkFNSUxZLFxuICBST1VORE5FU1MsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0VXBkYXRlZFRpbWVzdGFtcCwgdXBkYXRlQWN0aXZlVG9vbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbnR5cGUgUmVzdG9yZWRBcHBTdGF0ZSA9IE9taXQ8XG4gIEFwcFN0YXRlLFxuICBcIm9mZnNldFRvcFwiIHwgXCJvZmZzZXRMZWZ0XCIgfCBcIndpZHRoXCIgfCBcImhlaWdodFwiXG4+O1xuXG5leHBvcnQgY29uc3QgQWxsb3dlZEV4Y2FsaWRyYXdBY3RpdmVUb29sczogUmVjb3JkPFxuICBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl1bXCJ0eXBlXCJdLFxuICBib29sZWFuXG4+ID0ge1xuICBzZWxlY3Rpb246IHRydWUsXG4gIHRleHQ6IHRydWUsXG4gIHJlY3RhbmdsZTogdHJ1ZSxcbiAgZGlhbW9uZDogdHJ1ZSxcbiAgZWxsaXBzZTogdHJ1ZSxcbiAgbGluZTogdHJ1ZSxcbiAgaW1hZ2U6IHRydWUsXG4gIGFycm93OiB0cnVlLFxuICBmcmVlZHJhdzogdHJ1ZSxcbiAgZXJhc2VyOiBmYWxzZSxcbiAgY3VzdG9tOiB0cnVlLFxuICBoYW5kOiB0cnVlLFxufTtcblxuZXhwb3J0IHR5cGUgUmVzdG9yZWREYXRhU3RhdGUgPSB7XG4gIGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdO1xuICBhcHBTdGF0ZTogUmVzdG9yZWRBcHBTdGF0ZTtcbiAgZmlsZXM6IEJpbmFyeUZpbGVzO1xufTtcblxuY29uc3QgZ2V0Rm9udEZhbWlseUJ5TmFtZSA9IChmb250RmFtaWx5TmFtZTogc3RyaW5nKTogRm9udEZhbWlseVZhbHVlcyA9PiB7XG4gIGlmIChPYmplY3Qua2V5cyhGT05UX0ZBTUlMWSkuaW5jbHVkZXMoZm9udEZhbWlseU5hbWUpKSB7XG4gICAgcmV0dXJuIEZPTlRfRkFNSUxZW1xuICAgICAgZm9udEZhbWlseU5hbWUgYXMga2V5b2YgdHlwZW9mIEZPTlRfRkFNSUxZXG4gICAgXSBhcyBGb250RmFtaWx5VmFsdWVzO1xuICB9XG4gIHJldHVybiBERUZBVUxUX0ZPTlRfRkFNSUxZO1xufTtcblxuY29uc3QgcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyA9IDxcbiAgVCBleHRlbmRzIFJlcXVpcmVkPE9taXQ8RXhjYWxpZHJhd0VsZW1lbnQsIFwiY3VzdG9tRGF0YVwiPj4gJiB7XG4gICAgY3VzdG9tRGF0YT86IEV4Y2FsaWRyYXdFbGVtZW50W1wiY3VzdG9tRGF0YVwiXTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgICBib3VuZEVsZW1lbnRJZHM/OiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdW107XG4gICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgc3Ryb2tlU2hhcnBuZXNzPzogU3Ryb2tlUm91bmRuZXNzO1xuICAgIC8qKiBtZXRhZGF0YSB0aGF0IG1heSBiZSBwcmVzZW50IGluIGVsZW1lbnRzIGR1cmluZyBjb2xsYWJvcmF0aW9uICovXG4gICAgW1BSRUNFRElOR19FTEVNRU5UX0tFWV0/OiBzdHJpbmc7XG4gIH0sXG4gIEsgZXh0ZW5kcyBQaWNrPFQsIGtleW9mIE9taXQ8UmVxdWlyZWQ8VD4sIGtleW9mIEV4Y2FsaWRyYXdFbGVtZW50Pj4sXG4+KFxuICBlbGVtZW50OiBULFxuICBleHRyYTogUGljazxcbiAgICBULFxuICAgIC8vIFRoaXMgZXh0cmEgUGljazxULCBrZXlvZiBLPiBlbnN1cmUgbm8gZXhjZXNzIHByb3BlcnRpZXMgYXJlIHBhc3NlZC5cbiAgICAvLyBAdHMtaWdub3JlIFRTIGNvbXBsYWlucyBoZXJlIGJ1dCB0eXBlIGNoZWNrcyB0aGUgY2FsbCBzaXRlcyBmaW5lLlxuICAgIGtleW9mIEtcbiAgPiAmXG4gICAgUGFydGlhbDxQaWNrPEV4Y2FsaWRyYXdFbGVtZW50LCBcInR5cGVcIiB8IFwieFwiIHwgXCJ5XCI+Pixcbik6IFQgPT4ge1xuICBjb25zdCBiYXNlOiBQaWNrPFQsIGtleW9mIEV4Y2FsaWRyYXdFbGVtZW50PiAmIHtcbiAgICBbUFJFQ0VESU5HX0VMRU1FTlRfS0VZXT86IHN0cmluZztcbiAgfSA9IHtcbiAgICB0eXBlOiBleHRyYS50eXBlIHx8IGVsZW1lbnQudHlwZSxcbiAgICAvLyBhbGwgZWxlbWVudHMgbXVzdCBoYXZlIHZlcnNpb24gPiAwIHNvIGdldFNjZW5lVmVyc2lvbigpIHdpbGwgcGljayB1cFxuICAgIC8vIG5ld2x5IGFkZGVkIGVsZW1lbnRzXG4gICAgdmVyc2lvbjogZWxlbWVudC52ZXJzaW9uIHx8IDEsXG4gICAgdmVyc2lvbk5vbmNlOiBlbGVtZW50LnZlcnNpb25Ob25jZSA/PyAwLFxuICAgIGlzRGVsZXRlZDogZWxlbWVudC5pc0RlbGV0ZWQgPz8gZmFsc2UsXG4gICAgaWQ6IGVsZW1lbnQuaWQgfHwgcmFuZG9tSWQoKSxcbiAgICBmaWxsU3R5bGU6IGVsZW1lbnQuZmlsbFN0eWxlIHx8IFwiaGFjaHVyZVwiLFxuICAgIHN0cm9rZVdpZHRoOiBlbGVtZW50LnN0cm9rZVdpZHRoIHx8IDEsXG4gICAgc3Ryb2tlU3R5bGU6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgPz8gXCJzb2xpZFwiLFxuICAgIHJvdWdobmVzczogZWxlbWVudC5yb3VnaG5lc3MgPz8gMSxcbiAgICBvcGFjaXR5OiBlbGVtZW50Lm9wYWNpdHkgPT0gbnVsbCA/IDEwMCA6IGVsZW1lbnQub3BhY2l0eSxcbiAgICBhbmdsZTogZWxlbWVudC5hbmdsZSB8fCAwLFxuICAgIHg6IGV4dHJhLnggPz8gZWxlbWVudC54ID8/IDAsXG4gICAgeTogZXh0cmEueSA/PyBlbGVtZW50LnkgPz8gMCxcbiAgICBzdHJva2VDb2xvcjogZWxlbWVudC5zdHJva2VDb2xvciB8fCBvYy5ibGFjayxcbiAgICBiYWNrZ3JvdW5kQ29sb3I6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yIHx8IFwidHJhbnNwYXJlbnRcIixcbiAgICB3aWR0aDogZWxlbWVudC53aWR0aCB8fCAwLFxuICAgIGhlaWdodDogZWxlbWVudC5oZWlnaHQgfHwgMCxcbiAgICBzZWVkOiBlbGVtZW50LnNlZWQgPz8gMSxcbiAgICBncm91cElkczogZWxlbWVudC5ncm91cElkcyA/PyBbXSxcbiAgICByb3VuZG5lc3M6IGVsZW1lbnQucm91bmRuZXNzXG4gICAgICA/IGVsZW1lbnQucm91bmRuZXNzXG4gICAgICA6IGVsZW1lbnQuc3Ryb2tlU2hhcnBuZXNzID09PSBcInJvdW5kXCJcbiAgICAgID8ge1xuICAgICAgICAgIC8vIGZvciBvbGQgZWxlbWVudHMgdGhhdCB3b3VsZCBub3cgdXNlIGFkYXB0aXZlIHJhZGl1cyBhbGdvLFxuICAgICAgICAgIC8vIHVzZSBsZWdhY3kgYWxnbyBpbnN0ZWFkXG4gICAgICAgICAgdHlwZTogaXNVc2luZ0FkYXB0aXZlUmFkaXVzKGVsZW1lbnQudHlwZSlcbiAgICAgICAgICAgID8gUk9VTkRORVNTLkxFR0FDWVxuICAgICAgICAgICAgOiBST1VORE5FU1MuUFJPUE9SVElPTkFMX1JBRElVUyxcbiAgICAgICAgfVxuICAgICAgOiBudWxsLFxuICAgIGJvdW5kRWxlbWVudHM6IGVsZW1lbnQuYm91bmRFbGVtZW50SWRzXG4gICAgICA/IGVsZW1lbnQuYm91bmRFbGVtZW50SWRzLm1hcCgoaWQpID0+ICh7IHR5cGU6IFwiYXJyb3dcIiwgaWQgfSkpXG4gICAgICA6IGVsZW1lbnQuYm91bmRFbGVtZW50cyA/PyBbXSxcbiAgICB1cGRhdGVkOiBlbGVtZW50LnVwZGF0ZWQgPz8gZ2V0VXBkYXRlZFRpbWVzdGFtcCgpLFxuICAgIGxpbms6IGVsZW1lbnQubGluayA/PyBudWxsLFxuICAgIGxvY2tlZDogZWxlbWVudC5sb2NrZWQgPz8gZmFsc2UsXG4gIH07XG5cbiAgaWYgKFwiY3VzdG9tRGF0YVwiIGluIGVsZW1lbnQpIHtcbiAgICBiYXNlLmN1c3RvbURhdGEgPSBlbGVtZW50LmN1c3RvbURhdGE7XG4gIH1cblxuICBpZiAoUFJFQ0VESU5HX0VMRU1FTlRfS0VZIGluIGVsZW1lbnQpIHtcbiAgICBiYXNlW1BSRUNFRElOR19FTEVNRU5UX0tFWV0gPSBlbGVtZW50W1BSRUNFRElOR19FTEVNRU5UX0tFWV07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmJhc2UsXG4gICAgLi4uZ2V0Tm9ybWFsaXplZERpbWVuc2lvbnMoYmFzZSksXG4gICAgLi4uZXh0cmEsXG4gIH0gYXMgdW5rbm93biBhcyBUO1xufTtcblxuY29uc3QgcmVzdG9yZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2x1ZGU8RXhjYWxpZHJhd0VsZW1lbnQsIEV4Y2FsaWRyYXdTZWxlY3Rpb25FbGVtZW50PixcbiAgcmVmcmVzaERpbWVuc2lvbnMgPSBmYWxzZSxcbik6IHR5cGVvZiBlbGVtZW50IHwgbnVsbCA9PiB7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIGxldCBmb250U2l6ZSA9IGVsZW1lbnQuZm9udFNpemU7XG4gICAgICBsZXQgZm9udEZhbWlseSA9IGVsZW1lbnQuZm9udEZhbWlseTtcbiAgICAgIGlmIChcImZvbnRcIiBpbiBlbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IFtmb250UHgsIF9mb250RmFtaWx5XTogW3N0cmluZywgc3RyaW5nXSA9IChcbiAgICAgICAgICBlbGVtZW50IGFzIGFueVxuICAgICAgICApLmZvbnQuc3BsaXQoXCIgXCIpO1xuICAgICAgICBmb250U2l6ZSA9IHBhcnNlSW50KGZvbnRQeCwgMTApO1xuICAgICAgICBmb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseUJ5TmFtZShfZm9udEZhbWlseSk7XG4gICAgICB9XG4gICAgICBlbGVtZW50ID0gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7XG4gICAgICAgIGZvbnRTaXplLFxuICAgICAgICBmb250RmFtaWx5LFxuICAgICAgICB0ZXh0OiBlbGVtZW50LnRleHQgPz8gXCJcIixcbiAgICAgICAgdGV4dEFsaWduOiBlbGVtZW50LnRleHRBbGlnbiB8fCBERUZBVUxUX1RFWFRfQUxJR04sXG4gICAgICAgIHZlcnRpY2FsQWxpZ246IGVsZW1lbnQudmVydGljYWxBbGlnbiB8fCBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICAgICAgICBjb250YWluZXJJZDogZWxlbWVudC5jb250YWluZXJJZCA/PyBudWxsLFxuICAgICAgICBvcmlnaW5hbFRleHQ6IGVsZW1lbnQub3JpZ2luYWxUZXh0IHx8IGVsZW1lbnQudGV4dCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVmcmVzaERpbWVuc2lvbnMpIHtcbiAgICAgICAgZWxlbWVudCA9IHsgLi4uZWxlbWVudCwgLi4ucmVmcmVzaFRleHREaW1lbnNpb25zKGVsZW1lbnQpIH07XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICBwb2ludHM6IGVsZW1lbnQucG9pbnRzLFxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gICAgICAgIHNpbXVsYXRlUHJlc3N1cmU6IGVsZW1lbnQuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICAgICAgcHJlc3N1cmVzOiBlbGVtZW50LnByZXNzdXJlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgc3RhdHVzOiBlbGVtZW50LnN0YXR1cyB8fCBcInBlbmRpbmdcIixcbiAgICAgICAgZmlsZUlkOiBlbGVtZW50LmZpbGVJZCxcbiAgICAgICAgc2NhbGU6IGVsZW1lbnQuc2NhbGUgfHwgWzEsIDFdLFxuICAgICAgfSk7XG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICAvLyBAdHMtaWdub3JlIExFR0FDWSB0eXBlXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWZhbGx0aHJvdWdoXG4gICAgY2FzZSBcImRyYXdcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjoge1xuICAgICAgY29uc3Qge1xuICAgICAgICBzdGFydEFycm93aGVhZCA9IG51bGwsXG4gICAgICAgIGVuZEFycm93aGVhZCA9IGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiID8gXCJhcnJvd1wiIDogbnVsbCxcbiAgICAgIH0gPSBlbGVtZW50O1xuXG4gICAgICBsZXQgeCA9IGVsZW1lbnQueDtcbiAgICAgIGxldCB5ID0gZWxlbWVudC55O1xuICAgICAgbGV0IHBvaW50cyA9IC8vIG1pZ3JhdGUgb2xkIGFycm93IG1vZGVsIHRvIG5ldyBvbmVcbiAgICAgICAgIUFycmF5LmlzQXJyYXkoZWxlbWVudC5wb2ludHMpIHx8IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDJcbiAgICAgICAgICA/IFtcbiAgICAgICAgICAgICAgWzAsIDBdLFxuICAgICAgICAgICAgICBbZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHRdLFxuICAgICAgICAgICAgXVxuICAgICAgICAgIDogZWxlbWVudC5wb2ludHM7XG5cbiAgICAgIGlmIChwb2ludHNbMF1bMF0gIT09IDAgfHwgcG9pbnRzWzBdWzFdICE9PSAwKSB7XG4gICAgICAgICh7IHBvaW50cywgeCwgeSB9ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXROb3JtYWxpemVkUG9pbnRzKGVsZW1lbnQpKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICB0eXBlOlxuICAgICAgICAgIChlbGVtZW50LnR5cGUgYXMgRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdIHwgXCJkcmF3XCIpID09PSBcImRyYXdcIlxuICAgICAgICAgICAgPyBcImxpbmVcIlxuICAgICAgICAgICAgOiBlbGVtZW50LnR5cGUsXG4gICAgICAgIHN0YXJ0QmluZGluZzogZWxlbWVudC5zdGFydEJpbmRpbmcsXG4gICAgICAgIGVuZEJpbmRpbmc6IGVsZW1lbnQuZW5kQmluZGluZyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBzdGFydEFycm93aGVhZCxcbiAgICAgICAgZW5kQXJyb3doZWFkLFxuICAgICAgICBwb2ludHMsXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBnZW5lcmljIGVsZW1lbnRzXG4gICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHt9KTtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHt9KTtcblxuICAgIC8vIERvbid0IHVzZSBkZWZhdWx0IGNhc2Ugc28gYXMgdG8gY2F0Y2ggYSBtaXNzaW5nIGFuIGVsZW1lbnQgdHlwZSBjYXNlLlxuICAgIC8vIFdlIGFsc28gZG9uJ3Qgd2FudCB0byB0aHJvdywgYnV0IGluc3RlYWQgcmV0dXJuIHZvaWQgc28gd2UgZmlsdGVyXG4gICAgLy8gb3V0IHRoZXNlIHVuc3VwcG9ydGVkIGVsZW1lbnRzIGZyb20gdGhlIHJlc3RvcmVkIGFycmF5LlxuICB9XG59O1xuXG4vKipcbiAqIFJlcGFpcnMgY29udGFpZW5yIGVsZW1lbnQncyBib3VuZEVsZW1lbnRzIGFycmF5IGJ5IHJlbW92aW5nIGR1cGxpY2F0ZXMgYW5kXG4gKiBmaXhpbmcgY29udGFpbmVySWQgb2YgYm91bmQgZWxlbWVudHMgaWYgbm90IHByZXNlbnQuIEFsc28gcmVtb3ZlcyBhbnlcbiAqIGJvdW5kIGVsZW1lbnRzIHRoYXQgZG8gbm90IGV4aXN0IGluIHRoZSBlbGVtZW50cyBhcnJheS5cbiAqXG4gKiBOT1RFIG11dGF0ZXMgZWxlbWVudHMuXG4gKi9cbmNvbnN0IHJlcGFpckNvbnRhaW5lckVsZW1lbnQgPSAoXG4gIGNvbnRhaW5lcjogTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4sXG4gIGVsZW1lbnRzTWFwOiBNYXA8c3RyaW5nLCBNdXRhYmxlPEV4Y2FsaWRyYXdFbGVtZW50Pj4sXG4pID0+IHtcbiAgaWYgKGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzKSB7XG4gICAgLy8gY29weSBiZWNhdXNlIHdlJ3JlIG5vdCBjbG9uaW5nIG9uIHJlc3RvcmUsIGFuZCB3ZSBkb24ndCB3YW50IHRvIG11dGF0ZSB1cHN0cmVhbVxuICAgIGNvbnN0IGJvdW5kRWxlbWVudHMgPSBjb250YWluZXIuYm91bmRFbGVtZW50cy5zbGljZSgpO1xuXG4gICAgLy8gZGVkdXBlIGJpbmRpbmdzICYgZml4IGJvdW5kRWxlbWVudC5jb250YWluZXJJZCBpZiBub3Qgc2V0IGFscmVhZHlcbiAgICBjb25zdCBib3VuZElkcyA9IG5ldyBTZXQ8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXT4oKTtcbiAgICBjb250YWluZXIuYm91bmRFbGVtZW50cyA9IGJvdW5kRWxlbWVudHMucmVkdWNlKFxuICAgICAgKFxuICAgICAgICBhY2M6IE11dGFibGU8Tm9uTnVsbGFibGU8RXhjYWxpZHJhd0VsZW1lbnRbXCJib3VuZEVsZW1lbnRzXCJdPj4sXG4gICAgICAgIGJpbmRpbmcsXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgYm91bmRFbGVtZW50ID0gZWxlbWVudHNNYXAuZ2V0KGJpbmRpbmcuaWQpO1xuICAgICAgICBpZiAoYm91bmRFbGVtZW50ICYmICFib3VuZElkcy5oYXMoYmluZGluZy5pZCkpIHtcbiAgICAgICAgICBib3VuZElkcy5hZGQoYmluZGluZy5pZCk7XG5cbiAgICAgICAgICBpZiAoYm91bmRFbGVtZW50LmlzRGVsZXRlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBhY2MucHVzaChiaW5kaW5nKTtcblxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGlzVGV4dEVsZW1lbnQoYm91bmRFbGVtZW50KSAmJlxuICAgICAgICAgICAgLy8gYmVpbmcgc2xpZ2h0bHkgY29uc2VydmF0aXZlIGhlcmUsIHByZXNlcnZpbmcgZXhpc3RpbmcgY29udGFpbmVySWRcbiAgICAgICAgICAgIC8vIGlmIGRlZmluZWQsIGxlc3QgYm91bmRFbGVtZW50cyBpcyBzdGFsZVxuICAgICAgICAgICAgIWJvdW5kRWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgKGJvdW5kRWxlbWVudCBhcyBNdXRhYmxlPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4pLmNvbnRhaW5lcklkID1cbiAgICAgICAgICAgICAgY29udGFpbmVyLmlkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVwYWlycyB0YXJnZXQgYm91bmQgZWxlbWVudCdzIGNvbnRhaW5lcidzIGJvdW5kRWxlbWVudHMgYXJyYXksXG4gKiBvciByZW1vdmVzIGNvbnRhaWVucklkIGlmIGNvbnRhaW5lciBkb2VzIG5vdCBleGlzdC5cbiAqXG4gKiBOT1RFIG11dGF0ZXMgZWxlbWVudHMuXG4gKi9cbmNvbnN0IHJlcGFpckJvdW5kRWxlbWVudCA9IChcbiAgYm91bmRFbGVtZW50OiBNdXRhYmxlPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4sXG4gIGVsZW1lbnRzTWFwOiBNYXA8c3RyaW5nLCBNdXRhYmxlPEV4Y2FsaWRyYXdFbGVtZW50Pj4sXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gYm91bmRFbGVtZW50LmNvbnRhaW5lcklkXG4gICAgPyBlbGVtZW50c01hcC5nZXQoYm91bmRFbGVtZW50LmNvbnRhaW5lcklkKVxuICAgIDogbnVsbDtcblxuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIGJvdW5kRWxlbWVudC5jb250YWluZXJJZCA9IG51bGw7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGJvdW5kRWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoXG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgJiZcbiAgICAhY29udGFpbmVyLmJvdW5kRWxlbWVudHMuZmluZCgoYmluZGluZykgPT4gYmluZGluZy5pZCA9PT0gYm91bmRFbGVtZW50LmlkKVxuICApIHtcbiAgICAvLyBjb3B5IGJlY2F1c2Ugd2UncmUgbm90IGNsb25pbmcgb24gcmVzdG9yZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gbXV0YXRlIHVwc3RyZWFtXG4gICAgY29uc3QgYm91bmRFbGVtZW50cyA9IChcbiAgICAgIGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IChjb250YWluZXIuYm91bmRFbGVtZW50cyA9IFtdKVxuICAgICkuc2xpY2UoKTtcbiAgICBib3VuZEVsZW1lbnRzLnB1c2goeyB0eXBlOiBcInRleHRcIiwgaWQ6IGJvdW5kRWxlbWVudC5pZCB9KTtcbiAgICBjb250YWluZXIuYm91bmRFbGVtZW50cyA9IGJvdW5kRWxlbWVudHM7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZXN0b3JlRWxlbWVudHMgPSAoXG4gIGVsZW1lbnRzOiBJbXBvcnRlZERhdGFTdGF0ZVtcImVsZW1lbnRzXCJdLFxuICAvKiogTk9URSBkb2Vzbid0IHNlcnZlIGZvciByZWNvbmNpbGlhdGlvbiAqL1xuICBsb2NhbEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgb3B0cz86IHsgcmVmcmVzaERpbWVuc2lvbnM/OiBib29sZWFuOyByZXBhaXJCaW5kaW5ncz86IGJvb2xlYW4gfSB8IHVuZGVmaW5lZCxcbik6IEV4Y2FsaWRyYXdFbGVtZW50W10gPT4ge1xuICBjb25zdCBsb2NhbEVsZW1lbnRzTWFwID0gbG9jYWxFbGVtZW50cyA/IGFycmF5VG9NYXAobG9jYWxFbGVtZW50cykgOiBudWxsO1xuICBjb25zdCByZXN0b3JlZEVsZW1lbnRzID0gKGVsZW1lbnRzIHx8IFtdKS5yZWR1Y2UoKGVsZW1lbnRzLCBlbGVtZW50KSA9PiB7XG4gICAgLy8gZmlsdGVyaW5nIG91dCBzZWxlY3Rpb24sIHdoaWNoIGlzIGxlZ2FjeSwgbm8gbG9uZ2VyIGtlcHQgaW4gZWxlbWVudHMsXG4gICAgLy8gYW5kIGNhdXNpbmcgaXNzdWVzIGlmIHJldGFpbmVkXG4gICAgaWYgKGVsZW1lbnQudHlwZSAhPT0gXCJzZWxlY3Rpb25cIiAmJiAhaXNJbnZpc2libHlTbWFsbEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIGxldCBtaWdyYXRlZEVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCA9IHJlc3RvcmVFbGVtZW50KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBvcHRzPy5yZWZyZXNoRGltZW5zaW9ucyxcbiAgICAgICk7XG4gICAgICBpZiAobWlncmF0ZWRFbGVtZW50KSB7XG4gICAgICAgIGNvbnN0IGxvY2FsRWxlbWVudCA9IGxvY2FsRWxlbWVudHNNYXA/LmdldChlbGVtZW50LmlkKTtcbiAgICAgICAgaWYgKGxvY2FsRWxlbWVudCAmJiBsb2NhbEVsZW1lbnQudmVyc2lvbiA+IG1pZ3JhdGVkRWxlbWVudC52ZXJzaW9uKSB7XG4gICAgICAgICAgbWlncmF0ZWRFbGVtZW50ID0gYnVtcFZlcnNpb24obWlncmF0ZWRFbGVtZW50LCBsb2NhbEVsZW1lbnQudmVyc2lvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudHMucHVzaChtaWdyYXRlZEVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudHM7XG4gIH0sIFtdIGFzIEV4Y2FsaWRyYXdFbGVtZW50W10pO1xuXG4gIGlmICghb3B0cz8ucmVwYWlyQmluZGluZ3MpIHtcbiAgICByZXR1cm4gcmVzdG9yZWRFbGVtZW50cztcbiAgfVxuXG4gIC8vIHJlcGFpciBiaW5kaW5nLiBNdXRhdGVzIGVsZW1lbnRzLlxuICBjb25zdCByZXN0b3JlZEVsZW1lbnRzTWFwID0gYXJyYXlUb01hcChyZXN0b3JlZEVsZW1lbnRzKTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIHJlc3RvcmVkRWxlbWVudHMpIHtcbiAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBlbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICByZXBhaXJCb3VuZEVsZW1lbnQoZWxlbWVudCwgcmVzdG9yZWRFbGVtZW50c01hcCk7XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LmJvdW5kRWxlbWVudHMpIHtcbiAgICAgIHJlcGFpckNvbnRhaW5lckVsZW1lbnQoZWxlbWVudCwgcmVzdG9yZWRFbGVtZW50c01hcCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3RvcmVkRWxlbWVudHM7XG59O1xuXG5jb25zdCBjb2FsZXNjZUFwcFN0YXRlVmFsdWUgPSA8XG4gIFQgZXh0ZW5kcyBrZXlvZiBSZXR1cm5UeXBlPHR5cGVvZiBnZXREZWZhdWx0QXBwU3RhdGU+LFxuPihcbiAga2V5OiBULFxuICBhcHBTdGF0ZTogRXhjbHVkZTxJbXBvcnRlZERhdGFTdGF0ZVtcImFwcFN0YXRlXCJdLCBudWxsIHwgdW5kZWZpbmVkPixcbiAgZGVmYXVsdEFwcFN0YXRlOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXREZWZhdWx0QXBwU3RhdGU+LFxuKSA9PiB7XG4gIGNvbnN0IHZhbHVlID0gYXBwU3RhdGVba2V5XTtcbiAgLy8gTk9URSB0aGUgdmFsdWUhIGFzc2VydGlvbiBpcyBuZWVkZWQgaW4gVFMgNC41LjUgKGZpeGVkIGluIG5ld2VyIHZlcnNpb25zKVxuICByZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlISA6IGRlZmF1bHRBcHBTdGF0ZVtrZXldO1xufTtcblxuY29uc3QgTGVnYWN5QXBwU3RhdGVNaWdyYXRpb25zOiB7XG4gIFtLIGluIGtleW9mIExlZ2FjeUFwcFN0YXRlXTogKFxuICAgIEltcG9ydGVkRGF0YVN0YXRlOiBFeGNsdWRlPEltcG9ydGVkRGF0YVN0YXRlW1wiYXBwU3RhdGVcIl0sIG51bGwgfCB1bmRlZmluZWQ+LFxuICAgIGRlZmF1bHRBcHBTdGF0ZTogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbiAgKSA9PiBbTGVnYWN5QXBwU3RhdGVbS11bMV0sIEFwcFN0YXRlW0xlZ2FjeUFwcFN0YXRlW0tdWzFdXV07XG59ID0ge1xuICBpc0xpYnJhcnlPcGVuOiAoYXBwU3RhdGUsIGRlZmF1bHRBcHBTdGF0ZSkgPT4ge1xuICAgIHJldHVybiBbXG4gICAgICBcIm9wZW5TaWRlYmFyXCIsXG4gICAgICBcImlzTGlicmFyeU9wZW5cIiBpbiBhcHBTdGF0ZVxuICAgICAgICA/IGFwcFN0YXRlLmlzTGlicmFyeU9wZW5cbiAgICAgICAgICA/IFwibGlicmFyeVwiXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIDogY29hbGVzY2VBcHBTdGF0ZVZhbHVlKFwib3BlblNpZGViYXJcIiwgYXBwU3RhdGUsIGRlZmF1bHRBcHBTdGF0ZSksXG4gICAgXTtcbiAgfSxcbiAgaXNMaWJyYXJ5TWVudURvY2tlZDogKGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJpc1NpZGViYXJEb2NrZWRcIixcbiAgICAgIGFwcFN0YXRlLmlzTGlicmFyeU1lbnVEb2NrZWQgPz9cbiAgICAgICAgY29hbGVzY2VBcHBTdGF0ZVZhbHVlKFwiaXNTaWRlYmFyRG9ja2VkXCIsIGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpLFxuICAgIF07XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZUFwcFN0YXRlID0gKFxuICBhcHBTdGF0ZTogSW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXSxcbiAgbG9jYWxBcHBTdGF0ZTogUGFydGlhbDxBcHBTdGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkLFxuKTogUmVzdG9yZWRBcHBTdGF0ZSA9PiB7XG4gIGFwcFN0YXRlID0gYXBwU3RhdGUgfHwge307XG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICBjb25zdCBuZXh0QXBwU3RhdGUgPSB7fSBhcyB0eXBlb2YgZGVmYXVsdEFwcFN0YXRlO1xuXG4gIC8vIGZpcnN0LCBtaWdyYXRlIGFsbCBsZWdhY3kgQXBwU3RhdGUgcHJvcGVydGllcyB0byBuZXcgb25lcy4gV2UgZG8gaXRcbiAgLy8gaW4gb25lIGdvIGJlZm9yZSBtaWdyYXRlIHRoZSByZXN0IG9mIHRoZSBwcm9wZXJ0aWVzIGluIGNhc2UgdGhlIG5ldyBvbmVzXG4gIC8vIGRlcGVuZCBvbiBjaGVja2luZyBhbnkgb3RoZXIga2V5IChpLmUuIHRoZXkgYXJlIGNvdXBsZWQpXG4gIGZvciAoY29uc3QgbGVnYWN5S2V5IG9mIE9iamVjdC5rZXlzKFxuICAgIExlZ2FjeUFwcFN0YXRlTWlncmF0aW9ucyxcbiAgKSBhcyAoa2V5b2YgdHlwZW9mIExlZ2FjeUFwcFN0YXRlTWlncmF0aW9ucylbXSkge1xuICAgIGlmIChsZWdhY3lLZXkgaW4gYXBwU3RhdGUpIHtcbiAgICAgIGNvbnN0IFtuZXh0S2V5LCBuZXh0VmFsdWVdID0gTGVnYWN5QXBwU3RhdGVNaWdyYXRpb25zW2xlZ2FjeUtleV0oXG4gICAgICAgIGFwcFN0YXRlLFxuICAgICAgICBkZWZhdWx0QXBwU3RhdGUsXG4gICAgICApO1xuICAgICAgKG5leHRBcHBTdGF0ZSBhcyBhbnkpW25leHRLZXldID0gbmV4dFZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgW2tleSwgZGVmYXVsdFZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkZWZhdWx0QXBwU3RhdGUpIGFzIFtcbiAgICBrZXlvZiB0eXBlb2YgZGVmYXVsdEFwcFN0YXRlLFxuICAgIGFueSxcbiAgXVtdKSB7XG4gICAgLy8gaWYgQXBwU3RhdGUgY29udGFpbnMgYSBsZWdhY3kga2V5LCBwcmVmZXIgdGhhdCBvbmUgYW5kIG1pZ3JhdGUgaXRzXG4gICAgLy8gdmFsdWUgdG8gdGhlIG5ldyBvbmVcbiAgICBjb25zdCBzdXBwbGllZFZhbHVlID0gYXBwU3RhdGVba2V5XTtcblxuICAgIGNvbnN0IGxvY2FsVmFsdWUgPSBsb2NhbEFwcFN0YXRlID8gbG9jYWxBcHBTdGF0ZVtrZXldIDogdW5kZWZpbmVkO1xuICAgIChuZXh0QXBwU3RhdGUgYXMgYW55KVtrZXldID1cbiAgICAgIHN1cHBsaWVkVmFsdWUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHN1cHBsaWVkVmFsdWVcbiAgICAgICAgOiBsb2NhbFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBsb2NhbFZhbHVlXG4gICAgICAgIDogZGVmYXVsdFZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5uZXh0QXBwU3RhdGUsXG4gICAgY3Vyc29yQnV0dG9uOiBsb2NhbEFwcFN0YXRlPy5jdXJzb3JCdXR0b24gfHwgXCJ1cFwiLFxuICAgIC8vIHJlc2V0IG9uIGZyZXNoIHJlc3RvcmUgc28gYXMgdG8gaGlkZSB0aGUgVUkgYnV0dG9uIGlmIHBlbk1vZGUgbm90IGFjdGl2ZVxuICAgIHBlbkRldGVjdGVkOlxuICAgICAgbG9jYWxBcHBTdGF0ZT8ucGVuRGV0ZWN0ZWQgPz9cbiAgICAgIChhcHBTdGF0ZS5wZW5Nb2RlID8gYXBwU3RhdGUucGVuRGV0ZWN0ZWQgPz8gZmFsc2UgOiBmYWxzZSksXG4gICAgYWN0aXZlVG9vbDoge1xuICAgICAgLi4udXBkYXRlQWN0aXZlVG9vbChcbiAgICAgICAgZGVmYXVsdEFwcFN0YXRlLFxuICAgICAgICBuZXh0QXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlICYmXG4gICAgICAgICAgQWxsb3dlZEV4Y2FsaWRyYXdBY3RpdmVUb29sc1tuZXh0QXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlXVxuICAgICAgICAgID8gbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2xcbiAgICAgICAgICA6IHsgdHlwZTogXCJzZWxlY3Rpb25cIiB9LFxuICAgICAgKSxcbiAgICAgIGxhc3RBY3RpdmVUb29sOiBudWxsLFxuICAgICAgbG9ja2VkOiBuZXh0QXBwU3RhdGUuYWN0aXZlVG9vbC5sb2NrZWQgPz8gZmFsc2UsXG4gICAgfSxcbiAgICAvLyBNaWdyYXRlcyBmcm9tIHByZXZpb3VzIHZlcnNpb24gd2hlcmUgYXBwU3RhdGUuem9vbSB3YXMgYSBudW1iZXJcbiAgICB6b29tOlxuICAgICAgdHlwZW9mIGFwcFN0YXRlLnpvb20gPT09IFwibnVtYmVyXCJcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB2YWx1ZTogYXBwU3RhdGUuem9vbSBhcyBOb3JtYWxpemVkWm9vbVZhbHVlLFxuICAgICAgICAgIH1cbiAgICAgICAgOiBhcHBTdGF0ZS56b29tIHx8IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgIC8vIHdoZW4gc2lkZWJhciBkb2NrZWQgYW5kIHVzZXIgbGVmdCBpdCBvcGVuIGluIGxhc3Qgc2Vzc2lvbixcbiAgICAvLyBrZWVwIGl0IG9wZW4uIElmIG5vdCBkb2NrZWQsIGtlZXAgaXQgY2xvc2VkIGlycmVzcGVjdGl2ZSBvZiBsYXN0IHN0YXRlLlxuICAgIG9wZW5TaWRlYmFyOlxuICAgICAgbmV4dEFwcFN0YXRlLm9wZW5TaWRlYmFyID09PSBcImxpYnJhcnlcIlxuICAgICAgICA/IG5leHRBcHBTdGF0ZS5pc1NpZGViYXJEb2NrZWRcbiAgICAgICAgICA/IFwibGlicmFyeVwiXG4gICAgICAgICAgOiBudWxsXG4gICAgICAgIDogbmV4dEFwcFN0YXRlLm9wZW5TaWRlYmFyLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmUgPSAoXG4gIGRhdGE6IFBpY2s8SW1wb3J0ZWREYXRhU3RhdGUsIFwiYXBwU3RhdGVcIiB8IFwiZWxlbWVudHNcIiB8IFwiZmlsZXNcIj4gfCBudWxsLFxuICAvKipcbiAgICogTG9jYWwgQXBwU3RhdGUgKGB0aGlzLnN0YXRlYCBvciBpbml0aWFsIHN0YXRlIGZyb20gbG9jYWxTdG9yYWdlKSBzbyB0aGF0IHdlXG4gICAqIGRvbid0IG92ZXJ3cml0ZSBsb2NhbCBzdGF0ZSB3aXRoIGRlZmF1bHQgdmFsdWVzICh3aGVuIHZhbHVlcyBub3RcbiAgICogZXhwbGljaXRseSBzcGVjaWZpZWQpLlxuICAgKiBTdXBwbHkgYG51bGxgIGlmIHlvdSBjYW4ndCBnZXQgYWNjZXNzIHRvIGl0LlxuICAgKi9cbiAgbG9jYWxBcHBTdGF0ZTogUGFydGlhbDxBcHBTdGF0ZT4gfCBudWxsIHwgdW5kZWZpbmVkLFxuICBsb2NhbEVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgZWxlbWVudHNDb25maWc/OiB7IHJlZnJlc2hEaW1lbnNpb25zPzogYm9vbGVhbjsgcmVwYWlyQmluZGluZ3M/OiBib29sZWFuIH0sXG4pOiBSZXN0b3JlZERhdGFTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgZWxlbWVudHM6IHJlc3RvcmVFbGVtZW50cyhkYXRhPy5lbGVtZW50cywgbG9jYWxFbGVtZW50cywgZWxlbWVudHNDb25maWcpLFxuICAgIGFwcFN0YXRlOiByZXN0b3JlQXBwU3RhdGUoZGF0YT8uYXBwU3RhdGUsIGxvY2FsQXBwU3RhdGUgfHwgbnVsbCksXG4gICAgZmlsZXM6IGRhdGE/LmZpbGVzIHx8IHt9LFxuICB9O1xufTtcblxuY29uc3QgcmVzdG9yZUxpYnJhcnlJdGVtID0gKGxpYnJhcnlJdGVtOiBMaWJyYXJ5SXRlbSkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IHJlc3RvcmVFbGVtZW50cyhcbiAgICBnZXROb25EZWxldGVkRWxlbWVudHMobGlicmFyeUl0ZW0uZWxlbWVudHMpLFxuICAgIG51bGwsXG4gICk7XG4gIHJldHVybiBlbGVtZW50cy5sZW5ndGggPyB7IC4uLmxpYnJhcnlJdGVtLCBlbGVtZW50cyB9IDogbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCByZXN0b3JlTGlicmFyeUl0ZW1zID0gKFxuICBsaWJyYXJ5SXRlbXM6IEltcG9ydGVkRGF0YVN0YXRlW1wibGlicmFyeUl0ZW1zXCJdID0gW10sXG4gIGRlZmF1bHRTdGF0dXM6IExpYnJhcnlJdGVtW1wic3RhdHVzXCJdLFxuKSA9PiB7XG4gIGNvbnN0IHJlc3RvcmVkSXRlbXM6IExpYnJhcnlJdGVtW10gPSBbXTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGxpYnJhcnlJdGVtcykge1xuICAgIC8vIG1pZ3JhdGUgb2xkZXIgbGlicmFyaWVzXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGNvbnN0IHJlc3RvcmVkSXRlbSA9IHJlc3RvcmVMaWJyYXJ5SXRlbSh7XG4gICAgICAgIHN0YXR1czogZGVmYXVsdFN0YXR1cyxcbiAgICAgICAgZWxlbWVudHM6IGl0ZW0sXG4gICAgICAgIGlkOiByYW5kb21JZCgpLFxuICAgICAgICBjcmVhdGVkOiBEYXRlLm5vdygpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdG9yZWRJdGVtKSB7XG4gICAgICAgIHJlc3RvcmVkSXRlbXMucHVzaChyZXN0b3JlZEl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBfaXRlbSA9IGl0ZW0gYXMgTWFya09wdGlvbmFsPFxuICAgICAgICBMaWJyYXJ5SXRlbSxcbiAgICAgICAgXCJpZFwiIHwgXCJzdGF0dXNcIiB8IFwiY3JlYXRlZFwiXG4gICAgICA+O1xuICAgICAgY29uc3QgcmVzdG9yZWRJdGVtID0gcmVzdG9yZUxpYnJhcnlJdGVtKHtcbiAgICAgICAgLi4uX2l0ZW0sXG4gICAgICAgIGlkOiBfaXRlbS5pZCB8fCByYW5kb21JZCgpLFxuICAgICAgICBzdGF0dXM6IF9pdGVtLnN0YXR1cyB8fCBkZWZhdWx0U3RhdHVzLFxuICAgICAgICBjcmVhdGVkOiBfaXRlbS5jcmVhdGVkIHx8IERhdGUubm93KCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN0b3JlZEl0ZW0pIHtcbiAgICAgICAgcmVzdG9yZWRJdGVtcy5wdXNoKHJlc3RvcmVkSXRlbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN0b3JlZEl0ZW1zO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../data/restore.ts\n");
|
|
3353
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"AllowedExcalidrawActiveTools\": () => (/* binding */ AllowedExcalidrawActiveTools),\n/* harmony export */ \"restore\": () => (/* binding */ restore),\n/* harmony export */ \"restoreAppState\": () => (/* binding */ restoreAppState),\n/* harmony export */ \"restoreElements\": () => (/* binding */ restoreElements),\n/* harmony export */ \"restoreLibraryItems\": () => (/* binding */ restoreLibraryItems)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n\n\n\n\n\n\n\n\n\n\nconst AllowedExcalidrawActiveTools = {\n selection: true,\n text: true,\n rectangle: true,\n diamond: true,\n ellipse: true,\n line: true,\n image: true,\n arrow: true,\n freedraw: true,\n eraser: false,\n custom: true,\n hand: true,\n};\nconst getFontFamilyByName = (fontFamilyName) => {\n if (Object.keys(_constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY).includes(fontFamilyName)) {\n return _constants__WEBPACK_IMPORTED_MODULE_3__.FONT_FAMILY[fontFamilyName];\n }\n return _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_FONT_FAMILY;\n};\nconst restoreElementWithProperties = (element, extra) => {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;\n const base = {\n type: extra.type || element.type,\n // all elements must have version > 0 so getSceneVersion() will pick up\n // newly added elements\n version: element.version || 1,\n versionNonce: (_a = element.versionNonce) !== null && _a !== void 0 ? _a : 0,\n isDeleted: (_b = element.isDeleted) !== null && _b !== void 0 ? _b : false,\n id: element.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n fillStyle: element.fillStyle || \"hachure\",\n strokeWidth: element.strokeWidth || 1,\n strokeStyle: (_c = element.strokeStyle) !== null && _c !== void 0 ? _c : \"solid\",\n roughness: (_d = element.roughness) !== null && _d !== void 0 ? _d : 1,\n opacity: element.opacity == null ? 100 : element.opacity,\n angle: element.angle || 0,\n x: (_f = (_e = extra.x) !== null && _e !== void 0 ? _e : element.x) !== null && _f !== void 0 ? _f : 0,\n y: (_h = (_g = extra.y) !== null && _g !== void 0 ? _g : element.y) !== null && _h !== void 0 ? _h : 0,\n strokeColor: element.strokeColor || open_color__WEBPACK_IMPORTED_MODULE_8__.black,\n backgroundColor: element.backgroundColor || \"transparent\",\n width: element.width || 0,\n height: element.height || 0,\n seed: (_j = element.seed) !== null && _j !== void 0 ? _j : 1,\n groupIds: (_k = element.groupIds) !== null && _k !== void 0 ? _k : [],\n roundness: element.roundness\n ? element.roundness\n : element.strokeSharpness === \"round\"\n ? {\n // for old elements that would now use adaptive radius algo,\n // use legacy algo instead\n type: (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isUsingAdaptiveRadius)(element.type)\n ? _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.LEGACY\n : _constants__WEBPACK_IMPORTED_MODULE_3__.ROUNDNESS.PROPORTIONAL_RADIUS,\n }\n : null,\n boundElements: element.boundElementIds\n ? element.boundElementIds.map((id) => ({ type: \"arrow\", id }))\n : (_l = element.boundElements) !== null && _l !== void 0 ? _l : [],\n updated: (_m = element.updated) !== null && _m !== void 0 ? _m : (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getUpdatedTimestamp)(),\n link: (_o = element.link) !== null && _o !== void 0 ? _o : null,\n locked: (_p = element.locked) !== null && _p !== void 0 ? _p : false,\n };\n if (\"customData\" in element) {\n base.customData = element.customData;\n }\n if (_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY in element) {\n base[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY] = element[_constants__WEBPACK_IMPORTED_MODULE_3__.PRECEDING_ELEMENT_KEY];\n }\n return Object.assign(Object.assign(Object.assign({}, base), (0,_element__WEBPACK_IMPORTED_MODULE_0__.getNormalizedDimensions)(base)), extra);\n};\nconst restoreElement = (element, refreshDimensions = false) => {\n var _a, _b;\n switch (element.type) {\n case \"text\":\n let fontSize = element.fontSize;\n let fontFamily = element.fontFamily;\n if (\"font\" in element) {\n const [fontPx, _fontFamily] = element.font.split(\" \");\n fontSize = parseInt(fontPx, 10);\n fontFamily = getFontFamilyByName(_fontFamily);\n }\n element = restoreElementWithProperties(element, {\n fontSize,\n fontFamily,\n text: (_a = element.text) !== null && _a !== void 0 ? _a : \"\",\n textAlign: element.textAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_TEXT_ALIGN,\n verticalAlign: element.verticalAlign || _constants__WEBPACK_IMPORTED_MODULE_3__.DEFAULT_VERTICAL_ALIGN,\n containerId: (_b = element.containerId) !== null && _b !== void 0 ? _b : null,\n originalText: element.originalText || element.text,\n });\n if (refreshDimensions) {\n element = Object.assign(Object.assign({}, element), (0,_element__WEBPACK_IMPORTED_MODULE_0__.refreshTextDimensions)(element));\n }\n return element;\n case \"freedraw\": {\n return restoreElementWithProperties(element, {\n points: element.points,\n lastCommittedPoint: null,\n simulatePressure: element.simulatePressure,\n pressures: element.pressures,\n });\n }\n case \"image\":\n return restoreElementWithProperties(element, {\n status: element.status || \"pending\",\n fileId: element.fileId,\n scale: element.scale || [1, 1],\n });\n case \"line\":\n // @ts-ignore LEGACY type\n // eslint-disable-next-line no-fallthrough\n case \"draw\":\n case \"arrow\": {\n const { startArrowhead = null, endArrowhead = element.type === \"arrow\" ? \"arrow\" : null, } = element;\n let x = element.x;\n let y = element.y;\n let points = // migrate old arrow model to new one\n !Array.isArray(element.points) || element.points.length < 2\n ? [\n [0, 0],\n [element.width, element.height],\n ]\n : element.points;\n if (points[0][0] !== 0 || points[0][1] !== 0) {\n ({ points, x, y } = _element_linearElementEditor__WEBPACK_IMPORTED_MODULE_5__.LinearElementEditor.getNormalizedPoints(element));\n }\n return restoreElementWithProperties(element, {\n type: element.type === \"draw\"\n ? \"line\"\n : element.type,\n startBinding: element.startBinding,\n endBinding: element.endBinding,\n lastCommittedPoint: null,\n startArrowhead,\n endArrowhead,\n points,\n x,\n y,\n });\n }\n // generic elements\n case \"ellipse\":\n return restoreElementWithProperties(element, {});\n case \"rectangle\":\n return restoreElementWithProperties(element, {});\n case \"diamond\":\n return restoreElementWithProperties(element, {});\n // Don't use default case so as to catch a missing an element type case.\n // We also don't want to throw, but instead return void so we filter\n // out these unsupported elements from the restored array.\n }\n};\n/**\n * Repairs contaienr element's boundElements array by removing duplicates and\n * fixing containerId of bound elements if not present. Also removes any\n * bound elements that do not exist in the elements array.\n *\n * NOTE mutates elements.\n */\nconst repairContainerElement = (container, elementsMap) => {\n if (container.boundElements) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = container.boundElements.slice();\n // dedupe bindings & fix boundElement.containerId if not set already\n const boundIds = new Set();\n container.boundElements = boundElements.reduce((acc, binding) => {\n const boundElement = elementsMap.get(binding.id);\n if (boundElement && !boundIds.has(binding.id)) {\n boundIds.add(binding.id);\n if (boundElement.isDeleted) {\n return acc;\n }\n acc.push(binding);\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(boundElement) &&\n // being slightly conservative here, preserving existing containerId\n // if defined, lest boundElements is stale\n !boundElement.containerId) {\n boundElement.containerId =\n container.id;\n }\n }\n return acc;\n }, []);\n }\n};\n/**\n * Repairs target bound element's container's boundElements array,\n * or removes contaienrId if container does not exist.\n *\n * NOTE mutates elements.\n */\nconst repairBoundElement = (boundElement, elementsMap) => {\n const container = boundElement.containerId\n ? elementsMap.get(boundElement.containerId)\n : null;\n if (!container) {\n boundElement.containerId = null;\n return;\n }\n if (boundElement.isDeleted) {\n return;\n }\n if (container.boundElements &&\n !container.boundElements.find((binding) => binding.id === boundElement.id)) {\n // copy because we're not cloning on restore, and we don't want to mutate upstream\n const boundElements = (container.boundElements || (container.boundElements = [])).slice();\n boundElements.push({ type: \"text\", id: boundElement.id });\n container.boundElements = boundElements;\n }\n};\nconst restoreElements = (elements, \n/** NOTE doesn't serve for reconciliation */\nlocalElements, opts) => {\n const localElementsMap = localElements ? (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(localElements) : null;\n const restoredElements = (elements || []).reduce((elements, element) => {\n // filtering out selection, which is legacy, no longer kept in elements,\n // and causing issues if retained\n if (element.type !== \"selection\" && !(0,_element__WEBPACK_IMPORTED_MODULE_0__.isInvisiblySmallElement)(element)) {\n let migratedElement = restoreElement(element, opts === null || opts === void 0 ? void 0 : opts.refreshDimensions);\n if (migratedElement) {\n const localElement = localElementsMap === null || localElementsMap === void 0 ? void 0 : localElementsMap.get(element.id);\n if (localElement && localElement.version > migratedElement.version) {\n migratedElement = (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_6__.bumpVersion)(migratedElement, localElement.version);\n }\n elements.push(migratedElement);\n }\n }\n return elements;\n }, []);\n if (!(opts === null || opts === void 0 ? void 0 : opts.repairBindings)) {\n return restoredElements;\n }\n // repair binding. Mutates elements.\n const restoredElementsMap = (0,_utils__WEBPACK_IMPORTED_MODULE_7__.arrayToMap)(restoredElements);\n for (const element of restoredElements) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(element) && element.containerId) {\n repairBoundElement(element, restoredElementsMap);\n }\n else if (element.boundElements) {\n repairContainerElement(element, restoredElementsMap);\n }\n }\n return restoredElements;\n};\nconst coalesceAppStateValue = (key, appState, defaultAppState) => {\n const value = appState[key];\n // NOTE the value! assertion is needed in TS 4.5.5 (fixed in newer versions)\n return value !== undefined ? value : defaultAppState[key];\n};\nconst LegacyAppStateMigrations = {\n isLibraryOpen: (appState, defaultAppState) => {\n return [\n \"openSidebar\",\n \"isLibraryOpen\" in appState\n ? appState.isLibraryOpen\n ? \"library\"\n : null\n : coalesceAppStateValue(\"openSidebar\", appState, defaultAppState),\n ];\n },\n isLibraryMenuDocked: (appState, defaultAppState) => {\n var _a;\n return [\n \"isSidebarDocked\",\n (_a = appState.isLibraryMenuDocked) !== null && _a !== void 0 ? _a : coalesceAppStateValue(\"isSidebarDocked\", appState, defaultAppState),\n ];\n },\n};\nconst restoreAppState = (appState, localAppState) => {\n var _a, _b, _c;\n appState = appState || {};\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_4__.getDefaultAppState)();\n const nextAppState = {};\n // first, migrate all legacy AppState properties to new ones. We do it\n // in one go before migrate the rest of the properties in case the new ones\n // depend on checking any other key (i.e. they are coupled)\n for (const legacyKey of Object.keys(LegacyAppStateMigrations)) {\n if (legacyKey in appState) {\n const [nextKey, nextValue] = LegacyAppStateMigrations[legacyKey](appState, defaultAppState);\n nextAppState[nextKey] = nextValue;\n }\n }\n for (const [key, defaultValue] of Object.entries(defaultAppState)) {\n // if AppState contains a legacy key, prefer that one and migrate its\n // value to the new one\n const suppliedValue = appState[key];\n const localValue = localAppState ? localAppState[key] : undefined;\n nextAppState[key] =\n suppliedValue !== undefined\n ? suppliedValue\n : localValue !== undefined\n ? localValue\n : defaultValue;\n }\n return Object.assign(Object.assign({}, nextAppState), { cursorButton: (localAppState === null || localAppState === void 0 ? void 0 : localAppState.cursorButton) || \"up\", \n // reset on fresh restore so as to hide the UI button if penMode not active\n penDetected: (_a = localAppState === null || localAppState === void 0 ? void 0 : localAppState.penDetected) !== null && _a !== void 0 ? _a : (appState.penMode ? (_b = appState.penDetected) !== null && _b !== void 0 ? _b : false : false), activeTool: Object.assign(Object.assign({}, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.updateActiveTool)(defaultAppState, nextAppState.activeTool.type &&\n AllowedExcalidrawActiveTools[nextAppState.activeTool.type]\n ? nextAppState.activeTool\n : { type: \"selection\" })), { lastActiveTool: null, locked: (_c = nextAppState.activeTool.locked) !== null && _c !== void 0 ? _c : false }), \n // Migrates from previous version where appState.zoom was a number\n zoom: typeof appState.zoom === \"number\"\n ? {\n value: appState.zoom,\n }\n : appState.zoom || defaultAppState.zoom, \n // when sidebar docked and user left it open in last session,\n // keep it open. If not docked, keep it closed irrespective of last state.\n openSidebar: nextAppState.openSidebar === \"library\"\n ? nextAppState.isSidebarDocked\n ? \"library\"\n : null\n : nextAppState.openSidebar });\n};\nconst restore = (data, \n/**\n * Local AppState (`this.state` or initial state from localStorage) so that we\n * don't overwrite local state with default values (when values not\n * explicitly specified).\n * Supply `null` if you can't get access to it.\n */\nlocalAppState, localElements, elementsConfig) => {\n return {\n elements: restoreElements(data === null || data === void 0 ? void 0 : data.elements, localElements, elementsConfig),\n appState: restoreAppState(data === null || data === void 0 ? void 0 : data.appState, localAppState || null),\n files: (data === null || data === void 0 ? void 0 : data.files) || {},\n };\n};\nconst restoreLibraryItem = (libraryItem) => {\n const elements = restoreElements((0,_element__WEBPACK_IMPORTED_MODULE_0__.getNonDeletedElements)(libraryItem.elements), null);\n return elements.length ? Object.assign(Object.assign({}, libraryItem), { elements }) : null;\n};\nconst restoreLibraryItems = (libraryItems = [], defaultStatus) => {\n const restoredItems = [];\n for (const item of libraryItems) {\n // migrate older libraries\n if (Array.isArray(item)) {\n const restoredItem = restoreLibraryItem({\n status: defaultStatus,\n elements: item,\n id: (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(),\n created: Date.now(),\n });\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n else {\n const _item = item;\n const restoredItem = restoreLibraryItem(Object.assign(Object.assign({}, _item), { id: _item.id || (0,_random__WEBPACK_IMPORTED_MODULE_2__.randomId)(), status: _item.status || defaultStatus, created: _item.created || Date.now() }));\n if (restoredItem) {\n restoredItems.push(restoredItem);\n }\n }\n }\n return restoredItems;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TSxhQUFhLEdBQWtCLEVBQUUsQ0FBQztJQUN4QyxLQUFLLE1BQU0sSUFBSSxJQUFJLFlBQVksRUFBRTtRQUMvQiwwQkFBMEI7UUFDMUIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDO2dCQUN0QyxNQUFNLEVBQUUsYUFBYTtnQkFDckIsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsRUFBRSxFQUFFLGlEQUFRLEVBQUU7Z0JBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7YUFDcEIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDbEM7U0FDRjthQUFNO1lBQ0wsTUFBTSxLQUFLLEdBQUcsSUFHYixDQUFDO1lBQ0YsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLGlDQUNsQyxLQUFLLEtBQ1IsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLElBQUksaURBQVEsRUFBRSxFQUMxQixNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU0sSUFBSSxhQUFhLEVBQ3JDLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFDcEMsQ0FBQztZQUNILElBQUksWUFBWSxFQUFFO2dCQUNoQixhQUFhLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQ2xDO1NBQ0Y7S0FDRjtJQUNELE9BQU8sYUFBYSxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9kYXRhL3Jlc3RvcmUudHM/ODcyMCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd1NlbGVjdGlvbkVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgU3Ryb2tlUm91bmRuZXNzLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHtcbiAgQXBwU3RhdGUsXG4gIEJpbmFyeUZpbGVzLFxuICBMaWJyYXJ5SXRlbSxcbiAgTm9ybWFsaXplZFpvb21WYWx1ZSxcbn0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSwgTGVnYWN5QXBwU3RhdGUgfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzLFxuICBnZXROb3JtYWxpemVkRGltZW5zaW9ucyxcbiAgaXNJbnZpc2libHlTbWFsbEVsZW1lbnQsXG4gIHJlZnJlc2hUZXh0RGltZW5zaW9ucyxcbn0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIGlzVXNpbmdBZGFwdGl2ZVJhZGl1cyB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9URVhUX0FMSUdOLFxuICBERUZBVUxUX1ZFUlRJQ0FMX0FMSUdOLFxuICBQUkVDRURJTkdfRUxFTUVOVF9LRVksXG4gIEZPTlRfRkFNSUxZLFxuICBST1VORE5FU1MsXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcbmltcG9ydCB7IGJ1bXBWZXJzaW9uIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0VXBkYXRlZFRpbWVzdGFtcCwgdXBkYXRlQWN0aXZlVG9vbCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgYXJyYXlUb01hcCB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5pbXBvcnQgeyBNYXJrT3B0aW9uYWwsIE11dGFibGUgfSBmcm9tIFwiLi4vdXRpbGl0eS10eXBlc1wiO1xuXG50eXBlIFJlc3RvcmVkQXBwU3RhdGUgPSBPbWl0PFxuICBBcHBTdGF0ZSxcbiAgXCJvZmZzZXRUb3BcIiB8IFwib2Zmc2V0TGVmdFwiIHwgXCJ3aWR0aFwiIHwgXCJoZWlnaHRcIlxuPjtcblxuZXhwb3J0IGNvbnN0IEFsbG93ZWRFeGNhbGlkcmF3QWN0aXZlVG9vbHM6IFJlY29yZDxcbiAgQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdW1widHlwZVwiXSxcbiAgYm9vbGVhblxuPiA9IHtcbiAgc2VsZWN0aW9uOiB0cnVlLFxuICB0ZXh0OiB0cnVlLFxuICByZWN0YW5nbGU6IHRydWUsXG4gIGRpYW1vbmQ6IHRydWUsXG4gIGVsbGlwc2U6IHRydWUsXG4gIGxpbmU6IHRydWUsXG4gIGltYWdlOiB0cnVlLFxuICBhcnJvdzogdHJ1ZSxcbiAgZnJlZWRyYXc6IHRydWUsXG4gIGVyYXNlcjogZmFsc2UsXG4gIGN1c3RvbTogdHJ1ZSxcbiAgaGFuZDogdHJ1ZSxcbn07XG5cbmV4cG9ydCB0eXBlIFJlc3RvcmVkRGF0YVN0YXRlID0ge1xuICBlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXTtcbiAgYXBwU3RhdGU6IFJlc3RvcmVkQXBwU3RhdGU7XG4gIGZpbGVzOiBCaW5hcnlGaWxlcztcbn07XG5cbmNvbnN0IGdldEZvbnRGYW1pbHlCeU5hbWUgPSAoZm9udEZhbWlseU5hbWU6IHN0cmluZyk6IEZvbnRGYW1pbHlWYWx1ZXMgPT4ge1xuICBpZiAoT2JqZWN0LmtleXMoRk9OVF9GQU1JTFkpLmluY2x1ZGVzKGZvbnRGYW1pbHlOYW1lKSkge1xuICAgIHJldHVybiBGT05UX0ZBTUlMWVtcbiAgICAgIGZvbnRGYW1pbHlOYW1lIGFzIGtleW9mIHR5cGVvZiBGT05UX0ZBTUlMWVxuICAgIF0gYXMgRm9udEZhbWlseVZhbHVlcztcbiAgfVxuICByZXR1cm4gREVGQVVMVF9GT05UX0ZBTUlMWTtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMgPSA8XG4gIFQgZXh0ZW5kcyBSZXF1aXJlZDxPbWl0PEV4Y2FsaWRyYXdFbGVtZW50LCBcImN1c3RvbURhdGFcIj4+ICYge1xuICAgIGN1c3RvbURhdGE/OiBFeGNhbGlkcmF3RWxlbWVudFtcImN1c3RvbURhdGFcIl07XG4gICAgLyoqIEBkZXByZWNhdGVkICovXG4gICAgYm91bmRFbGVtZW50SWRzPzogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXVtdO1xuICAgIC8qKiBAZGVwcmVjYXRlZCAqL1xuICAgIHN0cm9rZVNoYXJwbmVzcz86IFN0cm9rZVJvdW5kbmVzcztcbiAgICAvKiogbWV0YWRhdGEgdGhhdCBtYXkgYmUgcHJlc2VudCBpbiBlbGVtZW50cyBkdXJpbmcgY29sbGFib3JhdGlvbiAqL1xuICAgIFtQUkVDRURJTkdfRUxFTUVOVF9LRVldPzogc3RyaW5nO1xuICB9LFxuICBLIGV4dGVuZHMgUGljazxULCBrZXlvZiBPbWl0PFJlcXVpcmVkPFQ+LCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4+LFxuPihcbiAgZWxlbWVudDogVCxcbiAgZXh0cmE6IFBpY2s8XG4gICAgVCxcbiAgICAvLyBUaGlzIGV4dHJhIFBpY2s8VCwga2V5b2YgSz4gZW5zdXJlIG5vIGV4Y2VzcyBwcm9wZXJ0aWVzIGFyZSBwYXNzZWQuXG4gICAgLy8gQHRzLWlnbm9yZSBUUyBjb21wbGFpbnMgaGVyZSBidXQgdHlwZSBjaGVja3MgdGhlIGNhbGwgc2l0ZXMgZmluZS5cbiAgICBrZXlvZiBLXG4gID4gJlxuICAgIFBhcnRpYWw8UGljazxFeGNhbGlkcmF3RWxlbWVudCwgXCJ0eXBlXCIgfCBcInhcIiB8IFwieVwiPj4sXG4pOiBUID0+IHtcbiAgY29uc3QgYmFzZTogUGljazxULCBrZXlvZiBFeGNhbGlkcmF3RWxlbWVudD4gJiB7XG4gICAgW1BSRUNFRElOR19FTEVNRU5UX0tFWV0/OiBzdHJpbmc7XG4gIH0gPSB7XG4gICAgdHlwZTogZXh0cmEudHlwZSB8fCBlbGVtZW50LnR5cGUsXG4gICAgLy8gYWxsIGVsZW1lbnRzIG11c3QgaGF2ZSB2ZXJzaW9uID4gMCBzbyBnZXRTY2VuZVZlcnNpb24oKSB3aWxsIHBpY2sgdXBcbiAgICAvLyBuZXdseSBhZGRlZCBlbGVtZW50c1xuICAgIHZlcnNpb246IGVsZW1lbnQudmVyc2lvbiB8fCAxLFxuICAgIHZlcnNpb25Ob25jZTogZWxlbWVudC52ZXJzaW9uTm9uY2UgPz8gMCxcbiAgICBpc0RlbGV0ZWQ6IGVsZW1lbnQuaXNEZWxldGVkID8/IGZhbHNlLFxuICAgIGlkOiBlbGVtZW50LmlkIHx8IHJhbmRvbUlkKCksXG4gICAgZmlsbFN0eWxlOiBlbGVtZW50LmZpbGxTdHlsZSB8fCBcImhhY2h1cmVcIixcbiAgICBzdHJva2VXaWR0aDogZWxlbWVudC5zdHJva2VXaWR0aCB8fCAxLFxuICAgIHN0cm9rZVN0eWxlOiBlbGVtZW50LnN0cm9rZVN0eWxlID8/IFwic29saWRcIixcbiAgICByb3VnaG5lc3M6IGVsZW1lbnQucm91Z2huZXNzID8/IDEsXG4gICAgb3BhY2l0eTogZWxlbWVudC5vcGFjaXR5ID09IG51bGwgPyAxMDAgOiBlbGVtZW50Lm9wYWNpdHksXG4gICAgYW5nbGU6IGVsZW1lbnQuYW5nbGUgfHwgMCxcbiAgICB4OiBleHRyYS54ID8/IGVsZW1lbnQueCA/PyAwLFxuICAgIHk6IGV4dHJhLnkgPz8gZWxlbWVudC55ID8/IDAsXG4gICAgc3Ryb2tlQ29sb3I6IGVsZW1lbnQuc3Ryb2tlQ29sb3IgfHwgb2MuYmxhY2ssXG4gICAgYmFja2dyb3VuZENvbG9yOiBlbGVtZW50LmJhY2tncm91bmRDb2xvciB8fCBcInRyYW5zcGFyZW50XCIsXG4gICAgd2lkdGg6IGVsZW1lbnQud2lkdGggfHwgMCxcbiAgICBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IHx8IDAsXG4gICAgc2VlZDogZWxlbWVudC5zZWVkID8/IDEsXG4gICAgZ3JvdXBJZHM6IGVsZW1lbnQuZ3JvdXBJZHMgPz8gW10sXG4gICAgcm91bmRuZXNzOiBlbGVtZW50LnJvdW5kbmVzc1xuICAgICAgPyBlbGVtZW50LnJvdW5kbmVzc1xuICAgICAgOiBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJyb3VuZFwiXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBmb3Igb2xkIGVsZW1lbnRzIHRoYXQgd291bGQgbm93IHVzZSBhZGFwdGl2ZSByYWRpdXMgYWxnbyxcbiAgICAgICAgICAvLyB1c2UgbGVnYWN5IGFsZ28gaW5zdGVhZFxuICAgICAgICAgIHR5cGU6IGlzVXNpbmdBZGFwdGl2ZVJhZGl1cyhlbGVtZW50LnR5cGUpXG4gICAgICAgICAgICA/IFJPVU5ETkVTUy5MRUdBQ1lcbiAgICAgICAgICAgIDogUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMsXG4gICAgICAgIH1cbiAgICAgIDogbnVsbCxcbiAgICBib3VuZEVsZW1lbnRzOiBlbGVtZW50LmJvdW5kRWxlbWVudElkc1xuICAgICAgPyBlbGVtZW50LmJvdW5kRWxlbWVudElkcy5tYXAoKGlkKSA9PiAoeyB0eXBlOiBcImFycm93XCIsIGlkIH0pKVxuICAgICAgOiBlbGVtZW50LmJvdW5kRWxlbWVudHMgPz8gW10sXG4gICAgdXBkYXRlZDogZWxlbWVudC51cGRhdGVkID8/IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rOiBlbGVtZW50LmxpbmsgPz8gbnVsbCxcbiAgICBsb2NrZWQ6IGVsZW1lbnQubG9ja2VkID8/IGZhbHNlLFxuICB9O1xuXG4gIGlmIChcImN1c3RvbURhdGFcIiBpbiBlbGVtZW50KSB7XG4gICAgYmFzZS5jdXN0b21EYXRhID0gZWxlbWVudC5jdXN0b21EYXRhO1xuICB9XG5cbiAgaWYgKFBSRUNFRElOR19FTEVNRU5UX0tFWSBpbiBlbGVtZW50KSB7XG4gICAgYmFzZVtQUkVDRURJTkdfRUxFTUVOVF9LRVldID0gZWxlbWVudFtQUkVDRURJTkdfRUxFTUVOVF9LRVldO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5iYXNlLFxuICAgIC4uLmdldE5vcm1hbGl6ZWREaW1lbnNpb25zKGJhc2UpLFxuICAgIC4uLmV4dHJhLFxuICB9IGFzIHVua25vd24gYXMgVDtcbn07XG5cbmNvbnN0IHJlc3RvcmVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNsdWRlPEV4Y2FsaWRyYXdFbGVtZW50LCBFeGNhbGlkcmF3U2VsZWN0aW9uRWxlbWVudD4sXG4gIHJlZnJlc2hEaW1lbnNpb25zID0gZmFsc2UsXG4pOiB0eXBlb2YgZWxlbWVudCB8IG51bGwgPT4ge1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgICBsZXQgZm9udFNpemUgPSBlbGVtZW50LmZvbnRTaXplO1xuICAgICAgbGV0IGZvbnRGYW1pbHkgPSBlbGVtZW50LmZvbnRGYW1pbHk7XG4gICAgICBpZiAoXCJmb250XCIgaW4gZWxlbWVudCkge1xuICAgICAgICBjb25zdCBbZm9udFB4LCBfZm9udEZhbWlseV06IFtzdHJpbmcsIHN0cmluZ10gPSAoXG4gICAgICAgICAgZWxlbWVudCBhcyBhbnlcbiAgICAgICAgKS5mb250LnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9udFNpemUgPSBwYXJzZUludChmb250UHgsIDEwKTtcbiAgICAgICAgZm9udEZhbWlseSA9IGdldEZvbnRGYW1pbHlCeU5hbWUoX2ZvbnRGYW1pbHkpO1xuICAgICAgfVxuICAgICAgZWxlbWVudCA9IHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge1xuICAgICAgICBmb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseSxcbiAgICAgICAgdGV4dDogZWxlbWVudC50ZXh0ID8/IFwiXCIsXG4gICAgICAgIHRleHRBbGlnbjogZWxlbWVudC50ZXh0QWxpZ24gfHwgREVGQVVMVF9URVhUX0FMSUdOLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduOiBlbGVtZW50LnZlcnRpY2FsQWxpZ24gfHwgREVGQVVMVF9WRVJUSUNBTF9BTElHTixcbiAgICAgICAgY29udGFpbmVySWQ6IGVsZW1lbnQuY29udGFpbmVySWQgPz8gbnVsbCxcbiAgICAgICAgb3JpZ2luYWxUZXh0OiBlbGVtZW50Lm9yaWdpbmFsVGV4dCB8fCBlbGVtZW50LnRleHQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlZnJlc2hEaW1lbnNpb25zKSB7XG4gICAgICAgIGVsZW1lbnQgPSB7IC4uLmVsZW1lbnQsIC4uLnJlZnJlc2hUZXh0RGltZW5zaW9ucyhlbGVtZW50KSB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6IHtcbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgcG9pbnRzOiBlbGVtZW50LnBvaW50cyxcbiAgICAgICAgbGFzdENvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBzaW11bGF0ZVByZXNzdXJlOiBlbGVtZW50LnNpbXVsYXRlUHJlc3N1cmUsXG4gICAgICAgIHByZXNzdXJlczogZWxlbWVudC5wcmVzc3VyZXMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7XG4gICAgICAgIHN0YXR1czogZWxlbWVudC5zdGF0dXMgfHwgXCJwZW5kaW5nXCIsXG4gICAgICAgIGZpbGVJZDogZWxlbWVudC5maWxlSWQsXG4gICAgICAgIHNjYWxlOiBlbGVtZW50LnNjYWxlIHx8IFsxLCAxXSxcbiAgICAgIH0pO1xuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgLy8gQHRzLWlnbm9yZSBMRUdBQ1kgdHlwZVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1mYWxsdGhyb3VnaFxuICAgIGNhc2UgXCJkcmF3XCI6XG4gICAgY2FzZSBcImFycm93XCI6IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQgPSBudWxsLFxuICAgICAgICBlbmRBcnJvd2hlYWQgPSBlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICB9ID0gZWxlbWVudDtcblxuICAgICAgbGV0IHggPSBlbGVtZW50Lng7XG4gICAgICBsZXQgeSA9IGVsZW1lbnQueTtcbiAgICAgIGxldCBwb2ludHMgPSAvLyBtaWdyYXRlIG9sZCBhcnJvdyBtb2RlbCB0byBuZXcgb25lXG4gICAgICAgICFBcnJheS5pc0FycmF5KGVsZW1lbnQucG9pbnRzKSB8fCBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyXG4gICAgICAgICAgPyBbXG4gICAgICAgICAgICAgIFswLCAwXSxcbiAgICAgICAgICAgICAgW2VsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0XSxcbiAgICAgICAgICAgIF1cbiAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzO1xuXG4gICAgICBpZiAocG9pbnRzWzBdWzBdICE9PSAwIHx8IHBvaW50c1swXVsxXSAhPT0gMCkge1xuICAgICAgICAoeyBwb2ludHMsIHgsIHkgfSA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Tm9ybWFsaXplZFBvaW50cyhlbGVtZW50KSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXN0b3JlRWxlbWVudFdpdGhQcm9wZXJ0aWVzKGVsZW1lbnQsIHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICAoZWxlbWVudC50eXBlIGFzIEV4Y2FsaWRyYXdFbGVtZW50W1widHlwZVwiXSB8IFwiZHJhd1wiKSA9PT0gXCJkcmF3XCJcbiAgICAgICAgICAgID8gXCJsaW5lXCJcbiAgICAgICAgICAgIDogZWxlbWVudC50eXBlLFxuICAgICAgICBzdGFydEJpbmRpbmc6IGVsZW1lbnQuc3RhcnRCaW5kaW5nLFxuICAgICAgICBlbmRCaW5kaW5nOiBlbGVtZW50LmVuZEJpbmRpbmcsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICAgICAgc3RhcnRBcnJvd2hlYWQsXG4gICAgICAgIGVuZEFycm93aGVhZCxcbiAgICAgICAgcG9pbnRzLFxuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gZ2VuZXJpYyBlbGVtZW50c1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgICAgcmV0dXJuIHJlc3RvcmVFbGVtZW50V2l0aFByb3BlcnRpZXMoZWxlbWVudCwge30pO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gcmVzdG9yZUVsZW1lbnRXaXRoUHJvcGVydGllcyhlbGVtZW50LCB7fSk7XG5cbiAgICAvLyBEb24ndCB1c2UgZGVmYXVsdCBjYXNlIHNvIGFzIHRvIGNhdGNoIGEgbWlzc2luZyBhbiBlbGVtZW50IHR5cGUgY2FzZS5cbiAgICAvLyBXZSBhbHNvIGRvbid0IHdhbnQgdG8gdGhyb3csIGJ1dCBpbnN0ZWFkIHJldHVybiB2b2lkIHNvIHdlIGZpbHRlclxuICAgIC8vIG91dCB0aGVzZSB1bnN1cHBvcnRlZCBlbGVtZW50cyBmcm9tIHRoZSByZXN0b3JlZCBhcnJheS5cbiAgfVxufTtcblxuLyoqXG4gKiBSZXBhaXJzIGNvbnRhaWVuciBlbGVtZW50J3MgYm91bmRFbGVtZW50cyBhcnJheSBieSByZW1vdmluZyBkdXBsaWNhdGVzIGFuZFxuICogZml4aW5nIGNvbnRhaW5lcklkIG9mIGJvdW5kIGVsZW1lbnRzIGlmIG5vdCBwcmVzZW50LiBBbHNvIHJlbW92ZXMgYW55XG4gKiBib3VuZCBlbGVtZW50cyB0aGF0IGRvIG5vdCBleGlzdCBpbiB0aGUgZWxlbWVudHMgYXJyYXkuXG4gKlxuICogTk9URSBtdXRhdGVzIGVsZW1lbnRzLlxuICovXG5jb25zdCByZXBhaXJDb250YWluZXJFbGVtZW50ID0gKFxuICBjb250YWluZXI6IE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+LFxuICBlbGVtZW50c01hcDogTWFwPHN0cmluZywgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+LFxuKSA9PiB7XG4gIGlmIChjb250YWluZXIuYm91bmRFbGVtZW50cykge1xuICAgIC8vIGNvcHkgYmVjYXVzZSB3ZSdyZSBub3QgY2xvbmluZyBvbiByZXN0b3JlLCBhbmQgd2UgZG9uJ3Qgd2FudCB0byBtdXRhdGUgdXBzdHJlYW1cbiAgICBjb25zdCBib3VuZEVsZW1lbnRzID0gY29udGFpbmVyLmJvdW5kRWxlbWVudHMuc2xpY2UoKTtcblxuICAgIC8vIGRlZHVwZSBiaW5kaW5ncyAmIGZpeCBib3VuZEVsZW1lbnQuY29udGFpbmVySWQgaWYgbm90IHNldCBhbHJlYWR5XG4gICAgY29uc3QgYm91bmRJZHMgPSBuZXcgU2V0PEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+KCk7XG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBib3VuZEVsZW1lbnRzLnJlZHVjZShcbiAgICAgIChcbiAgICAgICAgYWNjOiBNdXRhYmxlPE5vbk51bGxhYmxlPEV4Y2FsaWRyYXdFbGVtZW50W1wiYm91bmRFbGVtZW50c1wiXT4+LFxuICAgICAgICBiaW5kaW5nLFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IGJvdW5kRWxlbWVudCA9IGVsZW1lbnRzTWFwLmdldChiaW5kaW5nLmlkKTtcbiAgICAgICAgaWYgKGJvdW5kRWxlbWVudCAmJiAhYm91bmRJZHMuaGFzKGJpbmRpbmcuaWQpKSB7XG4gICAgICAgICAgYm91bmRJZHMuYWRkKGJpbmRpbmcuaWQpO1xuXG4gICAgICAgICAgaWYgKGJvdW5kRWxlbWVudC5pc0RlbGV0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWNjLnB1c2goYmluZGluZyk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpc1RleHRFbGVtZW50KGJvdW5kRWxlbWVudCkgJiZcbiAgICAgICAgICAgIC8vIGJlaW5nIHNsaWdodGx5IGNvbnNlcnZhdGl2ZSBoZXJlLCBwcmVzZXJ2aW5nIGV4aXN0aW5nIGNvbnRhaW5lcklkXG4gICAgICAgICAgICAvLyBpZiBkZWZpbmVkLCBsZXN0IGJvdW5kRWxlbWVudHMgaXMgc3RhbGVcbiAgICAgICAgICAgICFib3VuZEVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIChib3VuZEVsZW1lbnQgYXMgTXV0YWJsZTxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+KS5jb250YWluZXJJZCA9XG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlcGFpcnMgdGFyZ2V0IGJvdW5kIGVsZW1lbnQncyBjb250YWluZXIncyBib3VuZEVsZW1lbnRzIGFycmF5LFxuICogb3IgcmVtb3ZlcyBjb250YWllbnJJZCBpZiBjb250YWluZXIgZG9lcyBub3QgZXhpc3QuXG4gKlxuICogTk9URSBtdXRhdGVzIGVsZW1lbnRzLlxuICovXG5jb25zdCByZXBhaXJCb3VuZEVsZW1lbnQgPSAoXG4gIGJvdW5kRWxlbWVudDogTXV0YWJsZTxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+LFxuICBlbGVtZW50c01hcDogTWFwPHN0cmluZywgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+LFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGJvdW5kRWxlbWVudC5jb250YWluZXJJZFxuICAgID8gZWxlbWVudHNNYXAuZ2V0KGJvdW5kRWxlbWVudC5jb250YWluZXJJZClcbiAgICA6IG51bGw7XG5cbiAgaWYgKCFjb250YWluZXIpIHtcbiAgICBib3VuZEVsZW1lbnQuY29udGFpbmVySWQgPSBudWxsO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChib3VuZEVsZW1lbnQuaXNEZWxldGVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKFxuICAgIGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzICYmXG4gICAgIWNvbnRhaW5lci5ib3VuZEVsZW1lbnRzLmZpbmQoKGJpbmRpbmcpID0+IGJpbmRpbmcuaWQgPT09IGJvdW5kRWxlbWVudC5pZClcbiAgKSB7XG4gICAgLy8gY29weSBiZWNhdXNlIHdlJ3JlIG5vdCBjbG9uaW5nIG9uIHJlc3RvcmUsIGFuZCB3ZSBkb24ndCB3YW50IHRvIG11dGF0ZSB1cHN0cmVhbVxuICAgIGNvbnN0IGJvdW5kRWxlbWVudHMgPSAoXG4gICAgICBjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBbXSlcbiAgICApLnNsaWNlKCk7XG4gICAgYm91bmRFbGVtZW50cy5wdXNoKHsgdHlwZTogXCJ0ZXh0XCIsIGlkOiBib3VuZEVsZW1lbnQuaWQgfSk7XG4gICAgY29udGFpbmVyLmJvdW5kRWxlbWVudHMgPSBib3VuZEVsZW1lbnRzO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZUVsZW1lbnRzID0gKFxuICBlbGVtZW50czogSW1wb3J0ZWREYXRhU3RhdGVbXCJlbGVtZW50c1wiXSxcbiAgLyoqIE5PVEUgZG9lc24ndCBzZXJ2ZSBmb3IgcmVjb25jaWxpYXRpb24gKi9cbiAgbG9jYWxFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIG9wdHM/OiB7IHJlZnJlc2hEaW1lbnNpb25zPzogYm9vbGVhbjsgcmVwYWlyQmluZGluZ3M/OiBib29sZWFuIH0gfCB1bmRlZmluZWQsXG4pOiBFeGNhbGlkcmF3RWxlbWVudFtdID0+IHtcbiAgY29uc3QgbG9jYWxFbGVtZW50c01hcCA9IGxvY2FsRWxlbWVudHMgPyBhcnJheVRvTWFwKGxvY2FsRWxlbWVudHMpIDogbnVsbDtcbiAgY29uc3QgcmVzdG9yZWRFbGVtZW50cyA9IChlbGVtZW50cyB8fCBbXSkucmVkdWNlKChlbGVtZW50cywgZWxlbWVudCkgPT4ge1xuICAgIC8vIGZpbHRlcmluZyBvdXQgc2VsZWN0aW9uLCB3aGljaCBpcyBsZWdhY3ksIG5vIGxvbmdlciBrZXB0IGluIGVsZW1lbnRzLFxuICAgIC8vIGFuZCBjYXVzaW5nIGlzc3VlcyBpZiByZXRhaW5lZFxuICAgIGlmIChlbGVtZW50LnR5cGUgIT09IFwic2VsZWN0aW9uXCIgJiYgIWlzSW52aXNpYmx5U21hbGxFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBsZXQgbWlncmF0ZWRFbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwgPSByZXN0b3JlRWxlbWVudChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgb3B0cz8ucmVmcmVzaERpbWVuc2lvbnMsXG4gICAgICApO1xuICAgICAgaWYgKG1pZ3JhdGVkRWxlbWVudCkge1xuICAgICAgICBjb25zdCBsb2NhbEVsZW1lbnQgPSBsb2NhbEVsZW1lbnRzTWFwPy5nZXQoZWxlbWVudC5pZCk7XG4gICAgICAgIGlmIChsb2NhbEVsZW1lbnQgJiYgbG9jYWxFbGVtZW50LnZlcnNpb24gPiBtaWdyYXRlZEVsZW1lbnQudmVyc2lvbikge1xuICAgICAgICAgIG1pZ3JhdGVkRWxlbWVudCA9IGJ1bXBWZXJzaW9uKG1pZ3JhdGVkRWxlbWVudCwgbG9jYWxFbGVtZW50LnZlcnNpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRzLnB1c2gobWlncmF0ZWRFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzO1xuICB9LCBbXSBhcyBFeGNhbGlkcmF3RWxlbWVudFtdKTtcblxuICBpZiAoIW9wdHM/LnJlcGFpckJpbmRpbmdzKSB7XG4gICAgcmV0dXJuIHJlc3RvcmVkRWxlbWVudHM7XG4gIH1cblxuICAvLyByZXBhaXIgYmluZGluZy4gTXV0YXRlcyBlbGVtZW50cy5cbiAgY29uc3QgcmVzdG9yZWRFbGVtZW50c01hcCA9IGFycmF5VG9NYXAocmVzdG9yZWRFbGVtZW50cyk7XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiByZXN0b3JlZEVsZW1lbnRzKSB7XG4gICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgICAgcmVwYWlyQm91bmRFbGVtZW50KGVsZW1lbnQsIHJlc3RvcmVkRWxlbWVudHNNYXApO1xuICAgIH0gZWxzZSBpZiAoZWxlbWVudC5ib3VuZEVsZW1lbnRzKSB7XG4gICAgICByZXBhaXJDb250YWluZXJFbGVtZW50KGVsZW1lbnQsIHJlc3RvcmVkRWxlbWVudHNNYXApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN0b3JlZEVsZW1lbnRzO1xufTtcblxuY29uc3QgY29hbGVzY2VBcHBTdGF0ZVZhbHVlID0gPFxuICBUIGV4dGVuZHMga2V5b2YgUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbj4oXG4gIGtleTogVCxcbiAgYXBwU3RhdGU6IEV4Y2x1ZGU8SW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXSwgbnVsbCB8IHVuZGVmaW5lZD4sXG4gIGRlZmF1bHRBcHBTdGF0ZTogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0RGVmYXVsdEFwcFN0YXRlPixcbikgPT4ge1xuICBjb25zdCB2YWx1ZSA9IGFwcFN0YXRlW2tleV07XG4gIC8vIE5PVEUgdGhlIHZhbHVlISBhc3NlcnRpb24gaXMgbmVlZGVkIGluIFRTIDQuNS41IChmaXhlZCBpbiBuZXdlciB2ZXJzaW9ucylcbiAgcmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSEgOiBkZWZhdWx0QXBwU3RhdGVba2V5XTtcbn07XG5cbmNvbnN0IExlZ2FjeUFwcFN0YXRlTWlncmF0aW9uczoge1xuICBbSyBpbiBrZXlvZiBMZWdhY3lBcHBTdGF0ZV06IChcbiAgICBJbXBvcnRlZERhdGFTdGF0ZTogRXhjbHVkZTxJbXBvcnRlZERhdGFTdGF0ZVtcImFwcFN0YXRlXCJdLCBudWxsIHwgdW5kZWZpbmVkPixcbiAgICBkZWZhdWx0QXBwU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIGdldERlZmF1bHRBcHBTdGF0ZT4sXG4gICkgPT4gW0xlZ2FjeUFwcFN0YXRlW0tdWzFdLCBBcHBTdGF0ZVtMZWdhY3lBcHBTdGF0ZVtLXVsxXV1dO1xufSA9IHtcbiAgaXNMaWJyYXJ5T3BlbjogKGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpID0+IHtcbiAgICByZXR1cm4gW1xuICAgICAgXCJvcGVuU2lkZWJhclwiLFxuICAgICAgXCJpc0xpYnJhcnlPcGVuXCIgaW4gYXBwU3RhdGVcbiAgICAgICAgPyBhcHBTdGF0ZS5pc0xpYnJhcnlPcGVuXG4gICAgICAgICAgPyBcImxpYnJhcnlcIlxuICAgICAgICAgIDogbnVsbFxuICAgICAgICA6IGNvYWxlc2NlQXBwU3RhdGVWYWx1ZShcIm9wZW5TaWRlYmFyXCIsIGFwcFN0YXRlLCBkZWZhdWx0QXBwU3RhdGUpLFxuICAgIF07XG4gIH0sXG4gIGlzTGlicmFyeU1lbnVEb2NrZWQ6IChhcHBTdGF0ZSwgZGVmYXVsdEFwcFN0YXRlKSA9PiB7XG4gICAgcmV0dXJuIFtcbiAgICAgIFwiaXNTaWRlYmFyRG9ja2VkXCIsXG4gICAgICBhcHBTdGF0ZS5pc0xpYnJhcnlNZW51RG9ja2VkID8/XG4gICAgICAgIGNvYWxlc2NlQXBwU3RhdGVWYWx1ZShcImlzU2lkZWJhckRvY2tlZFwiLCBhcHBTdGF0ZSwgZGVmYXVsdEFwcFN0YXRlKSxcbiAgICBdO1xuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IHJlc3RvcmVBcHBTdGF0ZSA9IChcbiAgYXBwU3RhdGU6IEltcG9ydGVkRGF0YVN0YXRlW1wiYXBwU3RhdGVcIl0sXG4gIGxvY2FsQXBwU3RhdGU6IFBhcnRpYWw8QXBwU3RhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbik6IFJlc3RvcmVkQXBwU3RhdGUgPT4ge1xuICBhcHBTdGF0ZSA9IGFwcFN0YXRlIHx8IHt9O1xuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcbiAgY29uc3QgbmV4dEFwcFN0YXRlID0ge30gYXMgdHlwZW9mIGRlZmF1bHRBcHBTdGF0ZTtcblxuICAvLyBmaXJzdCwgbWlncmF0ZSBhbGwgbGVnYWN5IEFwcFN0YXRlIHByb3BlcnRpZXMgdG8gbmV3IG9uZXMuIFdlIGRvIGl0XG4gIC8vIGluIG9uZSBnbyBiZWZvcmUgbWlncmF0ZSB0aGUgcmVzdCBvZiB0aGUgcHJvcGVydGllcyBpbiBjYXNlIHRoZSBuZXcgb25lc1xuICAvLyBkZXBlbmQgb24gY2hlY2tpbmcgYW55IG90aGVyIGtleSAoaS5lLiB0aGV5IGFyZSBjb3VwbGVkKVxuICBmb3IgKGNvbnN0IGxlZ2FjeUtleSBvZiBPYmplY3Qua2V5cyhcbiAgICBMZWdhY3lBcHBTdGF0ZU1pZ3JhdGlvbnMsXG4gICkgYXMgKGtleW9mIHR5cGVvZiBMZWdhY3lBcHBTdGF0ZU1pZ3JhdGlvbnMpW10pIHtcbiAgICBpZiAobGVnYWN5S2V5IGluIGFwcFN0YXRlKSB7XG4gICAgICBjb25zdCBbbmV4dEtleSwgbmV4dFZhbHVlXSA9IExlZ2FjeUFwcFN0YXRlTWlncmF0aW9uc1tsZWdhY3lLZXldKFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgZGVmYXVsdEFwcFN0YXRlLFxuICAgICAgKTtcbiAgICAgIChuZXh0QXBwU3RhdGUgYXMgYW55KVtuZXh0S2V5XSA9IG5leHRWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGNvbnN0IFtrZXksIGRlZmF1bHRWYWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZGVmYXVsdEFwcFN0YXRlKSBhcyBbXG4gICAga2V5b2YgdHlwZW9mIGRlZmF1bHRBcHBTdGF0ZSxcbiAgICBhbnksXG4gIF1bXSkge1xuICAgIC8vIGlmIEFwcFN0YXRlIGNvbnRhaW5zIGEgbGVnYWN5IGtleSwgcHJlZmVyIHRoYXQgb25lIGFuZCBtaWdyYXRlIGl0c1xuICAgIC8vIHZhbHVlIHRvIHRoZSBuZXcgb25lXG4gICAgY29uc3Qgc3VwcGxpZWRWYWx1ZSA9IGFwcFN0YXRlW2tleV07XG5cbiAgICBjb25zdCBsb2NhbFZhbHVlID0gbG9jYWxBcHBTdGF0ZSA/IGxvY2FsQXBwU3RhdGVba2V5XSA6IHVuZGVmaW5lZDtcbiAgICAobmV4dEFwcFN0YXRlIGFzIGFueSlba2V5XSA9XG4gICAgICBzdXBwbGllZFZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBzdXBwbGllZFZhbHVlXG4gICAgICAgIDogbG9jYWxWYWx1ZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gbG9jYWxWYWx1ZVxuICAgICAgICA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ubmV4dEFwcFN0YXRlLFxuICAgIGN1cnNvckJ1dHRvbjogbG9jYWxBcHBTdGF0ZT8uY3Vyc29yQnV0dG9uIHx8IFwidXBcIixcbiAgICAvLyByZXNldCBvbiBmcmVzaCByZXN0b3JlIHNvIGFzIHRvIGhpZGUgdGhlIFVJIGJ1dHRvbiBpZiBwZW5Nb2RlIG5vdCBhY3RpdmVcbiAgICBwZW5EZXRlY3RlZDpcbiAgICAgIGxvY2FsQXBwU3RhdGU/LnBlbkRldGVjdGVkID8/XG4gICAgICAoYXBwU3RhdGUucGVuTW9kZSA/IGFwcFN0YXRlLnBlbkRldGVjdGVkID8/IGZhbHNlIDogZmFsc2UpLFxuICAgIGFjdGl2ZVRvb2w6IHtcbiAgICAgIC4uLnVwZGF0ZUFjdGl2ZVRvb2woXG4gICAgICAgIGRlZmF1bHRBcHBTdGF0ZSxcbiAgICAgICAgbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSAmJlxuICAgICAgICAgIEFsbG93ZWRFeGNhbGlkcmF3QWN0aXZlVG9vbHNbbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZV1cbiAgICAgICAgICA/IG5leHRBcHBTdGF0ZS5hY3RpdmVUb29sXG4gICAgICAgICAgOiB7IHR5cGU6IFwic2VsZWN0aW9uXCIgfSxcbiAgICAgICksXG4gICAgICBsYXN0QWN0aXZlVG9vbDogbnVsbCxcbiAgICAgIGxvY2tlZDogbmV4dEFwcFN0YXRlLmFjdGl2ZVRvb2wubG9ja2VkID8/IGZhbHNlLFxuICAgIH0sXG4gICAgLy8gTWlncmF0ZXMgZnJvbSBwcmV2aW91cyB2ZXJzaW9uIHdoZXJlIGFwcFN0YXRlLnpvb20gd2FzIGEgbnVtYmVyXG4gICAgem9vbTpcbiAgICAgIHR5cGVvZiBhcHBTdGF0ZS56b29tID09PSBcIm51bWJlclwiXG4gICAgICAgID8ge1xuICAgICAgICAgICAgdmFsdWU6IGFwcFN0YXRlLnpvb20gYXMgTm9ybWFsaXplZFpvb21WYWx1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDogYXBwU3RhdGUuem9vbSB8fCBkZWZhdWx0QXBwU3RhdGUuem9vbSxcbiAgICAvLyB3aGVuIHNpZGViYXIgZG9ja2VkIGFuZCB1c2VyIGxlZnQgaXQgb3BlbiBpbiBsYXN0IHNlc3Npb24sXG4gICAgLy8ga2VlcCBpdCBvcGVuLiBJZiBub3QgZG9ja2VkLCBrZWVwIGl0IGNsb3NlZCBpcnJlc3BlY3RpdmUgb2YgbGFzdCBzdGF0ZS5cbiAgICBvcGVuU2lkZWJhcjpcbiAgICAgIG5leHRBcHBTdGF0ZS5vcGVuU2lkZWJhciA9PT0gXCJsaWJyYXJ5XCJcbiAgICAgICAgPyBuZXh0QXBwU3RhdGUuaXNTaWRlYmFyRG9ja2VkXG4gICAgICAgICAgPyBcImxpYnJhcnlcIlxuICAgICAgICAgIDogbnVsbFxuICAgICAgICA6IG5leHRBcHBTdGF0ZS5vcGVuU2lkZWJhcixcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXN0b3JlID0gKFxuICBkYXRhOiBQaWNrPEltcG9ydGVkRGF0YVN0YXRlLCBcImFwcFN0YXRlXCIgfCBcImVsZW1lbnRzXCIgfCBcImZpbGVzXCI+IHwgbnVsbCxcbiAgLyoqXG4gICAqIExvY2FsIEFwcFN0YXRlIChgdGhpcy5zdGF0ZWAgb3IgaW5pdGlhbCBzdGF0ZSBmcm9tIGxvY2FsU3RvcmFnZSkgc28gdGhhdCB3ZVxuICAgKiBkb24ndCBvdmVyd3JpdGUgbG9jYWwgc3RhdGUgd2l0aCBkZWZhdWx0IHZhbHVlcyAod2hlbiB2YWx1ZXMgbm90XG4gICAqIGV4cGxpY2l0bHkgc3BlY2lmaWVkKS5cbiAgICogU3VwcGx5IGBudWxsYCBpZiB5b3UgY2FuJ3QgZ2V0IGFjY2VzcyB0byBpdC5cbiAgICovXG4gIGxvY2FsQXBwU3RhdGU6IFBhcnRpYWw8QXBwU3RhdGU+IHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgbG9jYWxFbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSB8IG51bGwgfCB1bmRlZmluZWQsXG4gIGVsZW1lbnRzQ29uZmlnPzogeyByZWZyZXNoRGltZW5zaW9ucz86IGJvb2xlYW47IHJlcGFpckJpbmRpbmdzPzogYm9vbGVhbiB9LFxuKTogUmVzdG9yZWREYXRhU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIGVsZW1lbnRzOiByZXN0b3JlRWxlbWVudHMoZGF0YT8uZWxlbWVudHMsIGxvY2FsRWxlbWVudHMsIGVsZW1lbnRzQ29uZmlnKSxcbiAgICBhcHBTdGF0ZTogcmVzdG9yZUFwcFN0YXRlKGRhdGE/LmFwcFN0YXRlLCBsb2NhbEFwcFN0YXRlIHx8IG51bGwpLFxuICAgIGZpbGVzOiBkYXRhPy5maWxlcyB8fCB7fSxcbiAgfTtcbn07XG5cbmNvbnN0IHJlc3RvcmVMaWJyYXJ5SXRlbSA9IChsaWJyYXJ5SXRlbTogTGlicmFyeUl0ZW0pID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSByZXN0b3JlRWxlbWVudHMoXG4gICAgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzKGxpYnJhcnlJdGVtLmVsZW1lbnRzKSxcbiAgICBudWxsLFxuICApO1xuICByZXR1cm4gZWxlbWVudHMubGVuZ3RoID8geyAuLi5saWJyYXJ5SXRlbSwgZWxlbWVudHMgfSA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzdG9yZUxpYnJhcnlJdGVtcyA9IChcbiAgbGlicmFyeUl0ZW1zOiBJbXBvcnRlZERhdGFTdGF0ZVtcImxpYnJhcnlJdGVtc1wiXSA9IFtdLFxuICBkZWZhdWx0U3RhdHVzOiBMaWJyYXJ5SXRlbVtcInN0YXR1c1wiXSxcbikgPT4ge1xuICBjb25zdCByZXN0b3JlZEl0ZW1zOiBMaWJyYXJ5SXRlbVtdID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiBsaWJyYXJ5SXRlbXMpIHtcbiAgICAvLyBtaWdyYXRlIG9sZGVyIGxpYnJhcmllc1xuICAgIGlmIChBcnJheS5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICBjb25zdCByZXN0b3JlZEl0ZW0gPSByZXN0b3JlTGlicmFyeUl0ZW0oe1xuICAgICAgICBzdGF0dXM6IGRlZmF1bHRTdGF0dXMsXG4gICAgICAgIGVsZW1lbnRzOiBpdGVtLFxuICAgICAgICBpZDogcmFuZG9tSWQoKSxcbiAgICAgICAgY3JlYXRlZDogRGF0ZS5ub3coKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3RvcmVkSXRlbSkge1xuICAgICAgICByZXN0b3JlZEl0ZW1zLnB1c2gocmVzdG9yZWRJdGVtKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgX2l0ZW0gPSBpdGVtIGFzIE1hcmtPcHRpb25hbDxcbiAgICAgICAgTGlicmFyeUl0ZW0sXG4gICAgICAgIFwiaWRcIiB8IFwic3RhdHVzXCIgfCBcImNyZWF0ZWRcIlxuICAgICAgPjtcbiAgICAgIGNvbnN0IHJlc3RvcmVkSXRlbSA9IHJlc3RvcmVMaWJyYXJ5SXRlbSh7XG4gICAgICAgIC4uLl9pdGVtLFxuICAgICAgICBpZDogX2l0ZW0uaWQgfHwgcmFuZG9tSWQoKSxcbiAgICAgICAgc3RhdHVzOiBfaXRlbS5zdGF0dXMgfHwgZGVmYXVsdFN0YXR1cyxcbiAgICAgICAgY3JlYXRlZDogX2l0ZW0uY3JlYXRlZCB8fCBEYXRlLm5vdygpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVzdG9yZWRJdGVtKSB7XG4gICAgICAgIHJlc3RvcmVkSXRlbXMucHVzaChyZXN0b3JlZEl0ZW0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdG9yZWRJdGVtcztcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../data/restore.ts\n");
|
|
3354
3354
|
|
|
3355
3355
|
/***/ }),
|
|
3356
3356
|
|
|
@@ -3394,7 +3394,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3394
3394
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3395
3395
|
|
|
3396
3396
|
"use strict";
|
|
3397
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getMinMaxXYFromCurvePathOps\": () => (/* binding */ getMinMaxXYFromCurvePathOps),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n\n\n\n\n\n\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nconst getElementAbsoluteCoords = (element, includeBoundText = false) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getElementAbsoluteCoords(element, includeBoundText);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getContainerElement)(element);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const coords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, element);\n return [\n coords.x,\n coords.y,\n coords.x + element.width,\n coords.y + element.height,\n coords.x + element.width / 2,\n coords.y + element.height / 2,\n ];\n }\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n element.x + element.width / 2,\n element.y + element.height / 2,\n ];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = (element) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = (shape) => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return (Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3);\n};\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n if (!hasSolution) {\n return false;\n }\n let s1 = null;\n let s2 = null;\n let t1 = Infinity;\n let t2 = Infinity;\n if (a === 0) {\n t1 = t2 = -c / b;\n }\n else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n return [s1, s2];\n};\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n if (solX) {\n const xs = solX.filter((x) => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce((limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n }\n else if (op === \"lineTo\") {\n // TODO: Implement this\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = (points) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getFreeDrawElementAbsoluteCoords = (element) => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n const x1 = minX + element.x;\n const y1 = minY + element.y;\n const x2 = maxX + element.x;\n const y2 = maxY + element.y;\n return [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2];\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]];\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n }\n else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n let length = 0;\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] = element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n }\n else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n // Return points\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\nconst generateLinearElementShape = (element) => {\n const generator = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const options = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element);\n const method = (() => {\n if (element.roundness) {\n return \"curve\";\n }\n if (options.fill) {\n return \"polygon\";\n }\n return \"linearPath\";\n })();\n return generator[method](element.points, options);\n};\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n var _a;\n if (element.points.length < 2) {\n const [pointX, pointY] = element.points[0];\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + pointX, element.y + pointY, cx, cy, element.angle);\n let coords = [x, y, x, y];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, [x, y, x, y], boundTextElement);\n coords = [\n coordsWithBoundText[0],\n coordsWithBoundText[1],\n coordsWithBoundText[2],\n coordsWithBoundText[3],\n ];\n }\n return coords;\n }\n // first element is always the curve\n const cachedShape = (_a = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) === null || _a === void 0 ? void 0 : _a[0];\n const shape = cachedShape !== null && cachedShape !== void 0 ? cachedShape : generateLinearElementShape(element);\n const ops = getCurvePathOps(shape);\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n const res = getMinMaxXYFromCurvePathOps(ops, transformXY);\n let coords = [\n res[0],\n res[1],\n res[2],\n res[3],\n ];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, coords, boundTextElement);\n coords = [\n coordsWithBoundText[0],\n coordsWithBoundText[1],\n coordsWithBoundText[2],\n coordsWithBoundText[3],\n ];\n }\n return coords;\n};\n// We could cache this stuff\nconst getElementBounds = (element) => {\n let bounds;\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n }\n else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n }\n else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n return bounds;\n};\nconst getCommonBounds = (elements) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n }\n else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = !element.roundness\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getElementPointsCoords = (element, points) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.roundness == null\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = (elements) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNuQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQy9DO1NBQU07UUFDTCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUss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UUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBRyxpREFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFO1lBQzFCLFdBQVcsR0FBRyxRQUFRLENBQUM7WUFDdkIsY0FBYyxHQUFHLE9BQU8sQ0FBQztTQUMxQjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFhSyxNQUFNLG9CQUFvQixHQUFHLENBQ2xDLFFBQXdFLEVBQ25FLEVBQUU7SUFDUCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSTtRQUNKLElBQUk7UUFDSixJQUFJO1FBQ0osS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLEdBQUcsSUFBSTtRQUNuQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUN4QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvYm91bmRzLnRzPzhiZTIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBBcnJvd2hlYWQsXG4gIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBkaXN0YW5jZTJkLCByb3RhdGUgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgRHJhd2FibGUsIE9wIH0gZnJvbSBcInJvdWdoanMvYmluL2NvcmVcIjtcbmltcG9ydCB7IFBvaW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRTaGFwZUZvckVsZW1lbnQsXG4gIGdlbmVyYXRlUm91Z2hPcHRpb25zLFxufSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGlzRnJlZURyYXdFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IHJlc2NhbGVQb2ludHMgfSBmcm9tIFwiLi4vcG9pbnRzXCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBnZXRDb250YWluZXJFbGVtZW50IH0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5cbi8vIHggYW5kIHkgcG9zaXRpb24gb2YgdG9wIGxlZnQgY29ybmVyLCB4IGFuZCB5IHBvc2l0aW9uIG9mIGJvdHRvbSByaWdodCBjb3JuZXJcbmV4cG9ydCB0eXBlIEJvdW5kcyA9IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xudHlwZSBNYXliZVF1YWRyYXRpY1NvbHV0aW9uID0gW251bWJlciB8IG51bGwsIG51bWJlciB8IG51bGxdIHwgZmFsc2U7XG5cbi8vIElmIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQgZnJvbSByaWdodCB0byBsZWZ0LCB0aGUgd2lkdGggaXMgZ29pbmcgdG8gYmUgbmVnYXRpdmVcbi8vIFRoaXMgc2V0IG9mIGZ1bmN0aW9ucyByZXRyaWV2ZXMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSA0IHBvaW50cy5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBpbmNsdWRlQm91bmRUZXh0OiBib29sZWFuID0gZmFsc2UsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIGluY2x1ZGVCb3VuZFRleHQsXG4gICAgKTtcbiAgfSBlbHNlIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgY29uc3QgY29vcmRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgZWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGNvb3Jkcy54LFxuICAgICAgICBjb29yZHMueSxcbiAgICAgICAgY29vcmRzLnggKyBlbGVtZW50LndpZHRoLFxuICAgICAgICBjb29yZHMueSArIGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICBjb29yZHMueCArIGVsZW1lbnQud2lkdGggLyAyLFxuICAgICAgICBjb29yZHMueSArIGVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgICAgIF07XG4gICAgfVxuICB9XG4gIHJldHVybiBbXG4gICAgZWxlbWVudC54LFxuICAgIGVsZW1lbnQueSxcbiAgICBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoLFxuICAgIGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0LFxuICAgIGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyLFxuICAgIGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0IC8gMixcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb2ludFJlbGF0aXZlVG8gPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhYnNvbHV0ZUNvb3JkczogUG9pbnQsXG4pOiBQb2ludCA9PiB7XG4gIHJldHVybiBbYWJzb2x1dGVDb29yZHNbMF0gLSBlbGVtZW50LngsIGFic29sdXRlQ29vcmRzWzFdIC0gZWxlbWVudC55XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaWFtb25kUG9pbnRzID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIC8vIEhlcmUgd2UgYWRkICsxIHRvIGF2b2lkIHRoZXNlIG51bWJlcnMgdG8gYmUgMFxuICAvLyBvdGhlcndpc2Ugcm91Z2guanMgd2lsbCB0aHJvdyBhbiBlcnJvciBjb21wbGFpbmluZyBhYm91dCBpdFxuICBjb25zdCB0b3BYID0gTWF0aC5mbG9vcihlbGVtZW50LndpZHRoIC8gMikgKyAxO1xuICBjb25zdCB0b3BZID0gMDtcbiAgY29uc3QgcmlnaHRYID0gZWxlbWVudC53aWR0aDtcbiAgY29uc3QgcmlnaHRZID0gTWF0aC5mbG9vcihlbGVtZW50LmhlaWdodCAvIDIpICsgMTtcbiAgY29uc3QgYm90dG9tWCA9IHRvcFg7XG4gIGNvbnN0IGJvdHRvbVkgPSBlbGVtZW50LmhlaWdodDtcbiAgY29uc3QgbGVmdFggPSAwO1xuICBjb25zdCBsZWZ0WSA9IHJpZ2h0WTtcblxuICByZXR1cm4gW3RvcFgsIHRvcFksIHJpZ2h0WCwgcmlnaHRZLCBib3R0b21YLCBib3R0b21ZLCBsZWZ0WCwgbGVmdFldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnZlUGF0aE9wcyA9IChzaGFwZTogRHJhd2FibGUpOiBPcFtdID0+IHtcbiAgZm9yIChjb25zdCBzZXQgb2Ygc2hhcGUuc2V0cykge1xuICAgIGlmIChzZXQudHlwZSA9PT0gXCJwYXRoXCIpIHtcbiAgICAgIHJldHVybiBzZXQub3BzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2hhcGUuc2V0c1swXS5vcHM7XG59O1xuXG4vLyByZWZlcmVuY2U6IGh0dHBzOi8vZWxpb3Qtam9uZXMuY29tLzIwMTkvMTIvY3ViaWMtYmV6aWVyLWN1cnZlLWJvdW5kaW5nLWJveGVzXG5jb25zdCBnZXRCZXppZXJWYWx1ZUZvclQgPSAoXG4gIHQ6IG51bWJlcixcbiAgcDA6IG51bWJlcixcbiAgcDE6IG51bWJlcixcbiAgcDI6IG51bWJlcixcbiAgcDM6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBvbmVNaW51c1QgPSAxIC0gdDtcbiAgcmV0dXJuIChcbiAgICBNYXRoLnBvdyhvbmVNaW51c1QsIDMpICogcDAgK1xuICAgIDMgKiBNYXRoLnBvdyhvbmVNaW51c1QsIDIpICogdCAqIHAxICtcbiAgICAzICogb25lTWludXNUICogTWF0aC5wb3codCwgMikgKiBwMiArXG4gICAgTWF0aC5wb3codCwgMykgKiBwM1xuICApO1xufTtcblxuY29uc3Qgc29sdmVRdWFkcmF0aWMgPSAoXG4gIHAwOiBudW1iZXIsXG4gIHAxOiBudW1iZXIsXG4gIHAyOiBudW1iZXIsXG4gIHAzOiBudW1iZXIsXG4pOiBNYXliZVF1YWRyYXRpY1NvbHV0aW9uID0+IHtcbiAgY29uc3QgaSA9IHAxIC0gcDA7XG4gIGNvbnN0IGogPSBwMiAtIHAxO1xuICBjb25zdCBrID0gcDMgLSBwMjtcblxuICBjb25zdCBhID0gMyAqIGkgLSA2ICogaiArIDMgKiBrO1xuICBjb25zdCBiID0gNiAqIGogLSA2ICogaTtcbiAgY29uc3QgYyA9IDMgKiBpO1xuXG4gIGNvbnN0IHNxcnRQYXJ0ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGNvbnN0IGhhc1NvbHV0aW9uID0gc3FydFBhcnQgPj0gMDtcblxuICBpZiAoIWhhc1NvbHV0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbGV0IHMxID0gbnVsbDtcbiAgbGV0IHMyID0gbnVsbDtcblxuICBsZXQgdDEgPSBJbmZpbml0eTtcbiAgbGV0IHQyID0gSW5maW5pdHk7XG5cbiAgaWYgKGEgPT09IDApIHtcbiAgICB0MSA9IHQyID0gLWMgLyBiO1xuICB9IGVsc2Uge1xuICAgIHQxID0gKC1iICsgTWF0aC5zcXJ0KHNxcnRQYXJ0KSkgLyAoMiAqIGEpO1xuICAgIHQyID0gKC1iIC0gTWF0aC5zcXJ0KHNxcnRQYXJ0KSkgLyAoMiAqIGEpO1xuICB9XG5cbiAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSkge1xuICAgIHMxID0gZ2V0QmV6aWVyVmFsdWVGb3JUKHQxLCBwMCwgcDEsIHAyLCBwMyk7XG4gIH1cblxuICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgczIgPSBnZXRCZXppZXJWYWx1ZUZvclQodDIsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIHJldHVybiBbczEsIHMyXTtcbn07XG5cbmNvbnN0IGdldEN1YmljQmV6aWVyQ3VydmVCb3VuZCA9IChcbiAgcDA6IFBvaW50LFxuICBwMTogUG9pbnQsXG4gIHAyOiBQb2ludCxcbiAgcDM6IFBvaW50LFxuKTogQm91bmRzID0+IHtcbiAgY29uc3Qgc29sWCA9IHNvbHZlUXVhZHJhdGljKHAwWzBdLCBwMVswXSwgcDJbMF0sIHAzWzBdKTtcbiAgY29uc3Qgc29sWSA9IHNvbHZlUXVhZHJhdGljKHAwWzFdLCBwMVsxXSwgcDJbMV0sIHAzWzFdKTtcblxuICBsZXQgbWluWCA9IE1hdGgubWluKHAwWzBdLCBwM1swXSk7XG4gIGxldCBtYXhYID0gTWF0aC5tYXgocDBbMF0sIHAzWzBdKTtcblxuICBpZiAoc29sWCkge1xuICAgIGNvbnN0IHhzID0gc29sWC5maWx0ZXIoKHgpID0+IHggIT09IG51bGwpIGFzIG51bWJlcltdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCAuLi54cyk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIC4uLnhzKTtcbiAgfVxuXG4gIGxldCBtaW5ZID0gTWF0aC5taW4ocDBbMV0sIHAzWzFdKTtcbiAgbGV0IG1heFkgPSBNYXRoLm1heChwMFsxXSwgcDNbMV0pO1xuICBpZiAoc29sWSkge1xuICAgIGNvbnN0IHlzID0gc29sWS5maWx0ZXIoKHkpID0+IHkgIT09IG51bGwpIGFzIG51bWJlcltdO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCAuLi55cyk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIC4uLnlzKTtcbiAgfVxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyA9IChcbiAgb3BzOiBPcFtdLFxuICB0cmFuc2Zvcm1YWT86ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgbGV0IGN1cnJlbnRQOiBQb2ludCA9IFswLCAwXTtcblxuICBjb25zdCB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfSA9IG9wcy5yZWR1Y2UoXG4gICAgKGxpbWl0cywgeyBvcCwgZGF0YSB9KSA9PiB7XG4gICAgICAvLyBUaGVyZSBhcmUgb25seSBmb3VyIG9wZXJhdGlvbiB0eXBlczpcbiAgICAgIC8vIG1vdmUsIGJjdXJ2ZVRvLCBsaW5lVG8sIGFuZCBjdXJ2ZVRvXG4gICAgICBpZiAob3AgPT09IFwibW92ZVwiKSB7XG4gICAgICAgIC8vIGNoYW5nZSBzdGFydGluZyBwb2ludFxuICAgICAgICBjdXJyZW50UCA9IGRhdGEgYXMgdW5rbm93biBhcyBQb2ludDtcbiAgICAgICAgLy8gbW92ZSBvcGVyYXRpb24gZG9lcyBub3QgZHJhdyBhbnl0aGluZzsgc28sIGl0IGFsd2F5c1xuICAgICAgICAvLyByZXR1cm5zIGZhbHNlXG4gICAgICB9IGVsc2UgaWYgKG9wID09PSBcImJjdXJ2ZVRvXCIpIHtcbiAgICAgICAgY29uc3QgX3AxID0gW2RhdGFbMF0sIGRhdGFbMV1dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBfcDIgPSBbZGF0YVsyXSwgZGF0YVszXV0gYXMgUG9pbnQ7XG4gICAgICAgIGNvbnN0IF9wMyA9IFtkYXRhWzRdLCBkYXRhWzVdXSBhcyBQb2ludDtcblxuICAgICAgICBjb25zdCBwMSA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AxKSA6IF9wMTtcbiAgICAgICAgY29uc3QgcDIgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMikgOiBfcDI7XG4gICAgICAgIGNvbnN0IHAzID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDMpIDogX3AzO1xuXG4gICAgICAgIGNvbnN0IHAwID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5jdXJyZW50UCkgOiBjdXJyZW50UDtcbiAgICAgICAgY3VycmVudFAgPSBfcDM7XG5cbiAgICAgICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q3ViaWNCZXppZXJDdXJ2ZUJvdW5kKFxuICAgICAgICAgIHAwLFxuICAgICAgICAgIHAxLFxuICAgICAgICAgIHAyLFxuICAgICAgICAgIHAzLFxuICAgICAgICApO1xuXG4gICAgICAgIGxpbWl0cy5taW5YID0gTWF0aC5taW4obGltaXRzLm1pblgsIG1pblgpO1xuICAgICAgICBsaW1pdHMubWluWSA9IE1hdGgubWluKGxpbWl0cy5taW5ZLCBtaW5ZKTtcblxuICAgICAgICBsaW1pdHMubWF4WCA9IE1hdGgubWF4KGxpbWl0cy5tYXhYLCBtYXhYKTtcbiAgICAgICAgbGltaXRzLm1heFkgPSBNYXRoLm1heChsaW1pdHMubWF4WSwgbWF4WSk7XG4gICAgICB9IGVsc2UgaWYgKG9wID09PSBcImxpbmVUb1wiKSB7XG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICB9IGVsc2UgaWYgKG9wID09PSBcInFjdXJ2ZVRvXCIpIHtcbiAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgIH1cbiAgICAgIHJldHVybiBsaW1pdHM7XG4gICAgfSxcbiAgICB7IG1pblg6IEluZmluaXR5LCBtaW5ZOiBJbmZpbml0eSwgbWF4WDogLUluZmluaXR5LCBtYXhZOiAtSW5maW5pdHkgfSxcbiAgKTtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5cbmNvbnN0IGdldEJvdW5kc0Zyb21Qb2ludHMgPSAoXG4gIHBvaW50czogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudFtcInBvaW50c1wiXSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gIGZvciAoY29uc3QgW3gsIHldIG9mIHBvaW50cykge1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4KTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeSk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5KTtcbiAgfVxuXG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5jb25zdCBnZXRGcmVlRHJhd0VsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEJvdW5kc0Zyb21Qb2ludHMoZWxlbWVudC5wb2ludHMpO1xuICBjb25zdCB4MSA9IG1pblggKyBlbGVtZW50Lng7XG4gIGNvbnN0IHkxID0gbWluWSArIGVsZW1lbnQueTtcbiAgY29uc3QgeDIgPSBtYXhYICsgZWxlbWVudC54O1xuICBjb25zdCB5MiA9IG1heFkgKyBlbGVtZW50Lnk7XG4gIHJldHVybiBbeDEsIHkxLCB4MiwgeTIsICh4MSArIHgyKSAvIDIsICh5MSArIHkyKSAvIDJdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFycm93aGVhZFBvaW50cyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIHNoYXBlOiBEcmF3YWJsZVtdLFxuICBwb3NpdGlvbjogXCJzdGFydFwiIHwgXCJlbmRcIixcbiAgYXJyb3doZWFkOiBBcnJvd2hlYWQsXG4pID0+IHtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlWzBdKTtcbiAgaWYgKG9wcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBUaGUgaW5kZXggb2YgdGhlIGJDdXJ2ZSBvcGVyYXRpb24gdG8gZXhhbWluZS5cbiAgY29uc3QgaW5kZXggPSBwb3NpdGlvbiA9PT0gXCJzdGFydFwiID8gMSA6IG9wcy5sZW5ndGggLSAxO1xuXG4gIGNvbnN0IGRhdGEgPSBvcHNbaW5kZXhdLmRhdGE7XG4gIGNvbnN0IHAzID0gW2RhdGFbNF0sIGRhdGFbNV1dIGFzIFBvaW50O1xuICBjb25zdCBwMiA9IFtkYXRhWzJdLCBkYXRhWzNdXSBhcyBQb2ludDtcbiAgY29uc3QgcDEgPSBbZGF0YVswXSwgZGF0YVsxXV0gYXMgUG9pbnQ7XG5cbiAgLy8gV2UgbmVlZCB0byBmaW5kIHAwIG9mIHRoZSBiZXppZXIgY3VydmUuXG4gIC8vIEl0IGlzIHR5cGljYWxseSB0aGUgbGFzdCBwb2ludCBvZiB0aGUgcHJldmlvdXNcbiAgLy8gY3VydmU7IGl0IGNhbiBhbHNvIGJlIHRoZSBwb3NpdGlvbiBvZiBtb3ZlVG8gb3BlcmF0aW9uLlxuICBjb25zdCBwcmV2T3AgPSBvcHNbaW5kZXggLSAxXTtcbiAgbGV0IHAwOiBQb2ludCA9IFswLCAwXTtcbiAgaWYgKHByZXZPcC5vcCA9PT0gXCJtb3ZlXCIpIHtcbiAgICBwMCA9IHByZXZPcC5kYXRhIGFzIHVua25vd24gYXMgUG9pbnQ7XG4gIH0gZWxzZSBpZiAocHJldk9wLm9wID09PSBcImJjdXJ2ZVRvXCIpIHtcbiAgICBwMCA9IFtwcmV2T3AuZGF0YVs0XSwgcHJldk9wLmRhdGFbNV1dO1xuICB9XG5cbiAgLy8gQih0KSA9IHAwICogKDEtdCleMyArIDNwMSAqIHQgKiAoMS10KV4yICsgM3AyICogdF4yICogKDEtdCkgKyBwMyAqIHReM1xuICBjb25zdCBlcXVhdGlvbiA9ICh0OiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PlxuICAgIE1hdGgucG93KDEgLSB0LCAzKSAqIHAzW2lkeF0gK1xuICAgIDMgKiB0ICogTWF0aC5wb3coMSAtIHQsIDIpICogcDJbaWR4XSArXG4gICAgMyAqIE1hdGgucG93KHQsIDIpICogKDEgLSB0KSAqIHAxW2lkeF0gK1xuICAgIHAwW2lkeF0gKiBNYXRoLnBvdyh0LCAzKTtcblxuICAvLyBFZSBrbm93IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBhcnJvdyAob3IgdGhlIGZpcnN0LCBpZiBzdGFydCBhcnJvd2hlYWQpLlxuICBjb25zdCBbeDIsIHkyXSA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyBwMCA6IHAzO1xuXG4gIC8vIEJ5IHVzaW5nIGN1YmljIGJlemllciBlcXVhdGlvbiAoQih0KSkgYW5kIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLFxuICAvLyB3ZSBjYWxjdWxhdGUgYSBwb2ludCB0aGF0IGlzIGNsb3NlciB0byB0aGUgbGFzdCBwb2ludC5cbiAgLy8gVGhlIHZhbHVlIDAuMyBpcyBjaG9zZW4gYXJiaXRyYXJpbHkgYW5kIGl0IHdvcmtzIGJlc3QgZm9yIGFsbFxuICAvLyB0aGUgdGVzdGVkIGNhc2VzLlxuICBjb25zdCBbeDEsIHkxXSA9IFtlcXVhdGlvbigwLjMsIDApLCBlcXVhdGlvbigwLjMsIDEpXTtcblxuICAvLyBGaW5kIHRoZSBub3JtYWxpemVkIGRpcmVjdGlvbiB2ZWN0b3IgYmFzZWQgb24gdGhlXG4gIC8vIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBwb2ludHMuXG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh4MiAtIHgxLCB5MiAtIHkxKTtcbiAgY29uc3QgbnggPSAoeDIgLSB4MSkgLyBkaXN0YW5jZTtcbiAgY29uc3QgbnkgPSAoeTIgLSB5MSkgLyBkaXN0YW5jZTtcblxuICBjb25zdCBzaXplID0ge1xuICAgIGFycm93OiAzMCxcbiAgICBiYXI6IDE1LFxuICAgIGRvdDogMTUsXG4gICAgdHJpYW5nbGU6IDE1LFxuICB9W2Fycm93aGVhZF07IC8vIHBpeGVscyAod2lsbCBkaWZmZXIgZm9yIGVhY2ggYXJyb3doZWFkKVxuXG4gIGxldCBsZW5ndGggPSAwO1xuXG4gIGlmIChhcnJvd2hlYWQgPT09IFwiYXJyb3dcIikge1xuICAgIC8vIExlbmd0aCBmb3IgLT4gYXJyb3dzIGlzIGJhc2VkIG9uIHRoZSBsZW5ndGggb2YgdGhlIGxhc3Qgc2VjdGlvblxuICAgIGNvbnN0IFtjeCwgY3ldID0gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgW3B4LCBweV0gPVxuICAgICAgZWxlbWVudC5wb2ludHMubGVuZ3RoID4gMVxuICAgICAgICA/IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDJdXG4gICAgICAgIDogWzAsIDBdO1xuXG4gICAgbGVuZ3RoID0gTWF0aC5oeXBvdChjeCAtIHB4LCBjeSAtIHB5KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMZW5ndGggZm9yIG90aGVyIGFycm93aGVhZCB0eXBlcyBpcyBiYXNlZCBvbiB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBsaW5lXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50LnBvaW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgW3B4LCBweV0gPSBlbGVtZW50LnBvaW50c1tpIC0gMV0gfHwgWzAsIDBdO1xuICAgICAgY29uc3QgW2N4LCBjeV0gPSBlbGVtZW50LnBvaW50c1tpXTtcbiAgICAgIGxlbmd0aCArPSBNYXRoLmh5cG90KGN4IC0gcHgsIGN5IC0gcHkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFNjYWxlIGRvd24gdGhlIGFycm93aGVhZCB1bnRpbCB3ZSBoaXQgYSBjZXJ0YWluIHNpemUgc28gdGhhdCBpdCBkb2Vzbid0IGxvb2sgd2VpcmQuXG4gIC8vIFRoaXMgdmFsdWUgaXMgc2VsZWN0ZWQgYnkgbWluaW1pemluZyBhIG1pbmltdW0gc2l6ZSB3aXRoIHRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIGFycm93aGVhZFxuICBjb25zdCBtaW5TaXplID0gTWF0aC5taW4oc2l6ZSwgbGVuZ3RoIC8gMik7XG4gIGNvbnN0IHhzID0geDIgLSBueCAqIG1pblNpemU7XG4gIGNvbnN0IHlzID0geTIgLSBueSAqIG1pblNpemU7XG5cbiAgaWYgKGFycm93aGVhZCA9PT0gXCJkb3RcIikge1xuICAgIGNvbnN0IHIgPSBNYXRoLmh5cG90KHlzIC0geTIsIHhzIC0geDIpICsgZWxlbWVudC5zdHJva2VXaWR0aDtcbiAgICByZXR1cm4gW3gyLCB5Miwgcl07XG4gIH1cblxuICBjb25zdCBhbmdsZSA9IHtcbiAgICBhcnJvdzogMjAsXG4gICAgYmFyOiA5MCxcbiAgICB0cmlhbmdsZTogMjUsXG4gIH1bYXJyb3doZWFkXTsgLy8gZGVncmVlc1xuXG4gIC8vIFJldHVybiBwb2ludHNcbiAgY29uc3QgW3gzLCB5M10gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsICgtYW5nbGUgKiBNYXRoLlBJKSAvIDE4MCk7XG4gIGNvbnN0IFt4NCwgeTRdID0gcm90YXRlKHhzLCB5cywgeDIsIHkyLCAoYW5nbGUgKiBNYXRoLlBJKSAvIDE4MCk7XG4gIHJldHVybiBbeDIsIHkyLCB4MywgeTMsIHg0LCB5NF07XG59O1xuXG5jb25zdCBnZW5lcmF0ZUxpbmVhckVsZW1lbnRTaGFwZSA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4pOiBEcmF3YWJsZSA9PiB7XG4gIGNvbnN0IGdlbmVyYXRvciA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICBjb25zdCBvcHRpb25zID0gZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCk7XG5cbiAgY29uc3QgbWV0aG9kID0gKCgpID0+IHtcbiAgICBpZiAoZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgIHJldHVybiBcImN1cnZlXCI7XG4gICAgfVxuICAgIGlmIChvcHRpb25zLmZpbGwpIHtcbiAgICAgIHJldHVybiBcInBvbHlnb25cIjtcbiAgICB9XG4gICAgcmV0dXJuIFwibGluZWFyUGF0aFwiO1xuICB9KSgpO1xuXG4gIHJldHVybiBnZW5lcmF0b3JbbWV0aG9kXShlbGVtZW50LnBvaW50cyBhcyBNdXRhYmxlPFBvaW50PltdLCBvcHRpb25zKTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRSb3RhdGVkQm91bmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgY3g6IG51bWJlcixcbiAgY3k6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICBjb25zdCBbcG9pbnRYLCBwb2ludFldID0gZWxlbWVudC5wb2ludHNbMF07XG4gICAgY29uc3QgW3gsIHldID0gcm90YXRlKFxuICAgICAgZWxlbWVudC54ICsgcG9pbnRYLFxuICAgICAgZWxlbWVudC55ICsgcG9pbnRZLFxuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIGVsZW1lbnQuYW5nbGUsXG4gICAgKTtcblxuICAgIGxldCBjb29yZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW3gsIHksIHgsIHldO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICBjb25zdCBjb29yZHNXaXRoQm91bmRUZXh0ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRNaW5NYXhYWVdpdGhCb3VuZFRleHQoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFt4LCB5LCB4LCB5XSxcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudCxcbiAgICAgICk7XG4gICAgICBjb29yZHMgPSBbXG4gICAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbMF0sXG4gICAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbMV0sXG4gICAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbMl0sXG4gICAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbM10sXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gY29vcmRzO1xuICB9XG5cbiAgLy8gZmlyc3QgZWxlbWVudCBpcyBhbHdheXMgdGhlIGN1cnZlXG4gIGNvbnN0IGNhY2hlZFNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpPy5bMF07XG4gIGNvbnN0IHNoYXBlID0gY2FjaGVkU2hhcGUgPz8gZ2VuZXJhdGVMaW5lYXJFbGVtZW50U2hhcGUoZWxlbWVudCk7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZSk7XG4gIGNvbnN0IHRyYW5zZm9ybVhZID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgIHJvdGF0ZShlbGVtZW50LnggKyB4LCBlbGVtZW50LnkgKyB5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICBjb25zdCByZXMgPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzLCB0cmFuc2Zvcm1YWSk7XG4gIGxldCBjb29yZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW1xuICAgIHJlc1swXSxcbiAgICByZXNbMV0sXG4gICAgcmVzWzJdLFxuICAgIHJlc1szXSxcbiAgXTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgY29uc3QgY29vcmRzV2l0aEJvdW5kVGV4dCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0TWluTWF4WFlXaXRoQm91bmRUZXh0KFxuICAgICAgZWxlbWVudCxcbiAgICAgIGNvb3JkcyxcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgICBjb29yZHMgPSBbXG4gICAgICBjb29yZHNXaXRoQm91bmRUZXh0WzBdLFxuICAgICAgY29vcmRzV2l0aEJvdW5kVGV4dFsxXSxcbiAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbMl0sXG4gICAgICBjb29yZHNXaXRoQm91bmRUZXh0WzNdLFxuICAgIF07XG4gIH1cbiAgcmV0dXJuIGNvb3Jkcztcbn07XG5cbi8vIFdlIGNvdWxkIGNhY2hlIHRoaXMgc3R1ZmZcbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50Qm91bmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgbGV0IGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCBjeCwgY3ldID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRCb3VuZHNGcm9tUG9pbnRzKFxuICAgICAgZWxlbWVudC5wb2ludHMubWFwKChbeCwgeV0pID0+XG4gICAgICAgIHJvdGF0ZSh4LCB5LCBjeCAtIGVsZW1lbnQueCwgY3kgLSBlbGVtZW50LnksIGVsZW1lbnQuYW5nbGUpLFxuICAgICAgKSxcbiAgICApO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICAgIG1heFkgKyBlbGVtZW50LnksXG4gICAgXTtcbiAgfSBlbHNlIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBib3VuZHMgPSBnZXRMaW5lYXJFbGVtZW50Um90YXRlZEJvdW5kcyhlbGVtZW50LCBjeCwgY3kpO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICBjb25zdCBbeDExLCB5MTFdID0gcm90YXRlKGN4LCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDEyLCB5MTJdID0gcm90YXRlKGN4LCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIyLCB5MjJdID0gcm90YXRlKHgxLCBjeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIxLCB5MjFdID0gcm90YXRlKHgyLCBjeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gIH0gZWxzZSBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIGNvbnN0IHcgPSAoeDIgLSB4MSkgLyAyO1xuICAgIGNvbnN0IGggPSAoeTIgLSB5MSkgLyAyO1xuICAgIGNvbnN0IGNvcyA9IE1hdGguY29zKGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IHNpbiA9IE1hdGguc2luKGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IHd3ID0gTWF0aC5oeXBvdCh3ICogY29zLCBoICogc2luKTtcbiAgICBjb25zdCBoaCA9IE1hdGguaHlwb3QoaCAqIGNvcywgdyAqIHNpbik7XG4gICAgYm91bmRzID0gW2N4IC0gd3csIGN5IC0gaGgsIGN4ICsgd3csIGN5ICsgaGhdO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt4MTEsIHkxMV0gPSByb3RhdGUoeDEsIHkxLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MTIsIHkxMl0gPSByb3RhdGUoeDEsIHkyLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MjIsIHkyMl0gPSByb3RhdGUoeDIsIHkyLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MjEsIHkyMV0gPSByb3RhdGUoeDIsIHkxLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgIGJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgfVxuXG4gIHJldHVybiBib3VuZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29tbW9uQm91bmRzID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gWzAsIDAsIDAsIDBdO1xuICB9XG5cbiAgbGV0IG1pblggPSBJbmZpbml0eTtcbiAgbGV0IG1heFggPSAtSW5maW5pdHk7XG4gIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhZID0gLUluZmluaXR5O1xuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeDEpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5MSk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeTIpO1xuICB9KTtcblxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBuZXh0V2lkdGg6IG51bWJlcixcbiAgbmV4dEhlaWdodDogbnVtYmVyLFxuICBub3JtYWxpemVQb2ludHM6IGJvb2xlYW4sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmICghKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkpIHtcbiAgICByZXR1cm4gW1xuICAgICAgZWxlbWVudC54LFxuICAgICAgZWxlbWVudC55LFxuICAgICAgZWxlbWVudC54ICsgbmV4dFdpZHRoLFxuICAgICAgZWxlbWVudC55ICsgbmV4dEhlaWdodCxcbiAgICBdO1xuICB9XG5cbiAgY29uc3QgcG9pbnRzID0gcmVzY2FsZVBvaW50cyhcbiAgICAwLFxuICAgIG5leHRXaWR0aCxcbiAgICByZXNjYWxlUG9pbnRzKDEsIG5leHRIZWlnaHQsIGVsZW1lbnQucG9pbnRzLCBub3JtYWxpemVQb2ludHMpLFxuICAgIG5vcm1hbGl6ZVBvaW50cyxcbiAgKTtcblxuICBsZXQgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBGcmVlIERyYXdcbiAgICBib3VuZHMgPSBnZXRCb3VuZHNGcm9tUG9pbnRzKHBvaW50cyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTGluZVxuICAgIGNvbnN0IGdlbiA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICAgIGNvbnN0IGN1cnZlID0gIWVsZW1lbnQucm91bmRuZXNzXG4gICAgICA/IGdlbi5saW5lYXJQYXRoKFxuICAgICAgICAgIHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sXG4gICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgIClcbiAgICAgIDogZ2VuLmN1cnZlKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKTtcblxuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gICAgYm91bmRzID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIH1cblxuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBib3VuZHM7XG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50UG9pbnRzQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgcG9pbnRzOiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSlbXSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgLy8gVGhpcyBtaWdodCBiZSBjb21wdXRhdGlvbmFsbHkgaGVhdmV5XG4gIGNvbnN0IGdlbiA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICBjb25zdCBjdXJ2ZSA9XG4gICAgZWxlbWVudC5yb3VuZG5lc3MgPT0gbnVsbFxuICAgICAgPyBnZW4ubGluZWFyUGF0aChcbiAgICAgICAgICBwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLFxuICAgICAgICAgIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpLFxuICAgICAgICApXG4gICAgICA6IGdlbi5jdXJ2ZShwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSk7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMpO1xuICByZXR1cm4gW1xuICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgbWluWSArIGVsZW1lbnQueSxcbiAgICBtYXhYICsgZWxlbWVudC54LFxuICAgIG1heFkgKyBlbGVtZW50LnksXG4gIF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2xvc2VzdEVsZW1lbnRCb3VuZHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBmcm9tOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuICBsZXQgY2xvc2VzdEVsZW1lbnQgPSBlbGVtZW50c1swXTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKCh4MSArIHgyKSAvIDIsICh5MSArIHkyKSAvIDIsIGZyb20ueCwgZnJvbS55KTtcblxuICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgY2xvc2VzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGdldEVsZW1lbnRCb3VuZHMoY2xvc2VzdEVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBCb3gge1xuICBtaW5YOiBudW1iZXI7XG4gIG1pblk6IG51bWJlcjtcbiAgbWF4WDogbnVtYmVyO1xuICBtYXhZOiBudW1iZXI7XG4gIG1pZFg6IG51bWJlcjtcbiAgbWlkWTogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGdldENvbW1vbkJvdW5kaW5nQm94ID0gKFxuICBlbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSB8IHJlYWRvbmx5IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W10sXG4pOiBCb3ggPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoZWxlbWVudHMpO1xuICByZXR1cm4ge1xuICAgIG1pblgsXG4gICAgbWluWSxcbiAgICBtYXhYLFxuICAgIG1heFksXG4gICAgd2lkdGg6IG1heFggLSBtaW5YLFxuICAgIGhlaWdodDogbWF4WSAtIG1pblksXG4gICAgbWlkWDogKG1pblggKyBtYXhYKSAvIDIsXG4gICAgbWlkWTogKG1pblkgKyBtYXhZKSAvIDIsXG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
|
|
3397
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getMinMaxXYFromCurvePathOps\": () => (/* binding */ getMinMaxXYFromCurvePathOps),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n\n\n\n\n\n\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nconst getElementAbsoluteCoords = (element, includeBoundText = false) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getElementAbsoluteCoords(element, includeBoundText);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getContainerElement)(element);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const coords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, element);\n return [\n coords.x,\n coords.y,\n coords.x + element.width,\n coords.y + element.height,\n coords.x + element.width / 2,\n coords.y + element.height / 2,\n ];\n }\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n element.x + element.width / 2,\n element.y + element.height / 2,\n ];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = (element) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = (shape) => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return (Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3);\n};\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n if (!hasSolution) {\n return false;\n }\n let s1 = null;\n let s2 = null;\n let t1 = Infinity;\n let t2 = Infinity;\n if (a === 0) {\n t1 = t2 = -c / b;\n }\n else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n return [s1, s2];\n};\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n if (solX) {\n const xs = solX.filter((x) => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce((limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n }\n else if (op === \"lineTo\") {\n // TODO: Implement this\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = (points) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getFreeDrawElementAbsoluteCoords = (element) => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n const x1 = minX + element.x;\n const y1 = minY + element.y;\n const x2 = maxX + element.x;\n const y2 = maxY + element.y;\n return [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2];\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]];\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n }\n else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n let length = 0;\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] = element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n }\n else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n // Return points\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\nconst generateLinearElementShape = (element) => {\n const generator = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const options = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element);\n const method = (() => {\n if (element.roundness) {\n return \"curve\";\n }\n if (options.fill) {\n return \"polygon\";\n }\n return \"linearPath\";\n })();\n return generator[method](element.points, options);\n};\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n var _a;\n if (element.points.length < 2) {\n const [pointX, pointY] = element.points[0];\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + pointX, element.y + pointY, cx, cy, element.angle);\n let coords = [x, y, x, y];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, [x, y, x, y], boundTextElement);\n coords = [\n coordsWithBoundText[0],\n coordsWithBoundText[1],\n coordsWithBoundText[2],\n coordsWithBoundText[3],\n ];\n }\n return coords;\n }\n // first element is always the curve\n const cachedShape = (_a = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) === null || _a === void 0 ? void 0 : _a[0];\n const shape = cachedShape !== null && cachedShape !== void 0 ? cachedShape : generateLinearElementShape(element);\n const ops = getCurvePathOps(shape);\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n const res = getMinMaxXYFromCurvePathOps(ops, transformXY);\n let coords = [\n res[0],\n res[1],\n res[2],\n res[3],\n ];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, coords, boundTextElement);\n coords = [\n coordsWithBoundText[0],\n coordsWithBoundText[1],\n coordsWithBoundText[2],\n coordsWithBoundText[3],\n ];\n }\n return coords;\n};\n// We could cache this stuff\nconst getElementBounds = (element) => {\n let bounds;\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n }\n else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n }\n else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n return bounds;\n};\nconst getCommonBounds = (elements) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n }\n else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = !element.roundness\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getElementPointsCoords = (element, points) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.roundness == null\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = (elements) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9ib3VuZHMudHMuanMiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVE2QztBQUNQO0FBTUg7QUFNYjtBQUNvQjtBQUMrQjtBQUNiO0FBTzVELGtGQUFrRjtBQUNsRix5RUFBeUU7QUFDbEUsTUFBTSx3QkFBd0IsR0FBRyxDQUN0QyxPQUEwQixFQUMxQixtQkFBNEIsS0FBSyxFQUNpQixFQUFFO0lBQ3BELElBQUksOERBQWlCLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDOUIsT0FBTyxnQ0FBZ0MsQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUNsRDtTQUFNLElBQUksNERBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNuQyxPQUFPLDhGQUE0QyxDQUNqRCxPQUFPLEVBQ1AsZ0JBQWdCLENBQ2pCLENBQUM7S0FDSDtTQUFNLElBQUksMERBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNqQyxNQUFNLFNBQVMsR0FBRyxpRUFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxJQUFJLDJEQUFjLENBQUMsU0FBUyxDQUFDLEVBQUU7WUFDN0IsTUFBTSxNQUFNLEdBQUcsaUdBQStDLENBQzVELFNBQVMsRUFDVCxPQUE2QyxDQUM5QyxDQUFDO1lBQ0YsT0FBTztnQkFDTCxNQUFNLENBQUMsQ0FBQztnQkFDUixNQUFNLENBQUMsQ0FBQztnQkFDUixNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLO2dCQUN4QixNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNO2dCQUN6QixNQUFNLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUM7YUFDOUIsQ0FBQztTQUNIO0tBQ0Y7SUFDRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLENBQUM7UUFDVCxPQUFPLENBQUMsQ0FBQztRQUNULE9BQU8sQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUs7UUFDekIsT0FBTyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTTtRQUMxQixPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQztRQUM3QixPQUFPLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQztLQUMvQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxlQUFlLEdBQUcsQ0FDN0IsT0FBMEIsRUFDMUIsY0FBcUIsRUFDZCxFQUFFO0lBQ1QsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsQ0FBQyxDQUFDO0FBRUssTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQTBCLEVBQUUsRUFBRTtJQUM3RCxnREFBZ0Q7SUFDaEQsOERBQThEO0lBQzlELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0MsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQztJQUNyQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQy9CLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNoQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUM7SUFFckIsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN0RSxDQUFDLENBQUM7QUFFSyxNQUFNLGVBQWUsR0FBRyxDQUFDLEtBQWUsRUFBUSxFQUFFO0lBQ3ZELEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLElBQUksRUFBRTtRQUM1QixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssTUFBTSxFQUFFO1lBQ3ZCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUNoQjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUMzQixDQUFDLENBQUM7QUFFRiwrRUFBK0U7QUFDL0UsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixDQUFTLEVBQ1QsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQ1YsRUFBVSxFQUNWLEVBQUU7SUFDRixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sQ0FDTCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFO1FBQzNCLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtRQUNuQyxDQUFDLEdBQUcsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUU7UUFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUNwQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FDckIsRUFBVSxFQUNWLEVBQVUsRUFDVixFQUFVLEVBQ1YsRUFBVSxFQUNjLEVBQUU7SUFDMUIsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztJQUNsQixNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFFbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFaEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuQyxNQUFNLFdBQVcsR0FBRyxRQUFRLElBQUksQ0FBQyxDQUFDO0lBRWxDLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDaEIsT0FBTyxLQUFLLENBQUM7S0FDZDtJQUVELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztJQUNkLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQztJQUVkLElBQUksRUFBRSxHQUFHLFFBQVEsQ0FBQztJQUNsQixJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUM7SUFFbEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ1gsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDbEI7U0FBTTtRQUNMLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMxQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDM0M7SUFFRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRTtRQUN0QixFQUFFLEdBQUcsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzdDO0lBRUQsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUU7UUFDdEIsRUFBRSxHQUFHLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM3QztJQUVELE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSx3QkFBd0IsR0FBRyxDQUMvQixFQUFTLEVBQ1QsRUFBUyxFQUNULEVBQVMsRUFDVCxFQUFTLEVBQ0QsRUFBRTtJQUNWLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbEMsSUFBSSxJQUFJLEVBQUU7UUFDUixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFhLENBQUM7UUFDdEQsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFFRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsQyxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQWEsQ0FBQztRQUN0RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUM7QUFFSyxNQUFNLDJCQUEyQixHQUFHLENBQ3pDLEdBQVMsRUFDVCxXQUF3RCxFQUN0QixFQUFFO0lBQ3BDLElBQUksUUFBUSxHQUFVLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUMzQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFO1FBQ3ZCLHVDQUF1QztRQUN2QyxzQ0FBc0M7UUFDdEMsSUFBSSxFQUFFLEtBQUssTUFBTSxFQUFFO1lBQ2pCLHdCQUF3QjtZQUN4QixRQUFRLEdBQUcsSUFBd0IsQ0FBQztZQUNwQyx1REFBdUQ7WUFDdkQsZ0JBQWdCO1NBQ2pCO2FBQU0sSUFBSSxFQUFFLEtBQUssVUFBVSxFQUFFO1lBQzVCLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBVSxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBVSxDQUFDO1lBQ3hDLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBVSxDQUFDO1lBRXhDLE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNuRCxNQUFNLEVBQUUsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDbkQsTUFBTSxFQUFFLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1lBRW5ELE1BQU0sRUFBRSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztZQUM3RCxRQUFRLEdBQUcsR0FBRyxDQUFDO1lBRWYsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLHdCQUF3QixDQUN2RCxFQUFFLEVBQ0YsRUFBRSxFQUNGLEVBQUUsRUFDRixFQUFFLENBQ0gsQ0FBQztZQUVGLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBRTFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzNDO2FBQU0sSUFBSSxFQUFFLEtBQUssUUFBUSxFQUFFO1lBQzFCLHVCQUF1QjtTQUN4QjthQUFNLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUM1Qix1QkFBdUI7U0FDeEI7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLEVBQ0QsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUNyRSxDQUFDO0lBQ0YsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQztBQUVGLE1BQU0sbUJBQW1CLEdBQUcsQ0FDMUIsTUFBMkMsRUFDVCxFQUFFO0lBQ3BDLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFDckIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUM7SUFFckIsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sRUFBRTtRQUMzQixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDMUI7SUFFRCxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSxnQ0FBZ0MsR0FBRyxDQUN2QyxPQUFrQyxFQUNnQixFQUFFO0lBQ3BELE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDckUsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxFQUFFLEdBQUcsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDNUIsT0FBTyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDeEQsQ0FBQyxDQUFDO0FBRUssTUFBTSxrQkFBa0IsR0FBRyxDQUNoQyxPQUFnQyxFQUNoQyxLQUFpQixFQUNqQixRQUF5QixFQUN6QixTQUFvQixFQUNwQixFQUFFO0lBQ0YsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLElBQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELGdEQUFnRDtJQUNoRCxNQUFNLEtBQUssR0FBRyxRQUFRLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRXhELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFDN0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7SUFDdkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7SUFDdkMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFVLENBQUM7SUFFdkMsMENBQTBDO0lBQzFDLGlEQUFpRDtJQUNqRCwwREFBMEQ7SUFDMUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QixJQUFJLEVBQUUsR0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2QixJQUFJLE1BQU0sQ0FBQyxFQUFFLEtBQUssTUFBTSxFQUFFO1FBQ3hCLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBd0IsQ0FBQztLQUN0QztTQUFNLElBQUksTUFBTSxDQUFDLEVBQUUsS0FBSyxVQUFVLEVBQUU7UUFDbkMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkM7SUFFRCx5RUFBeUU7SUFDekUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFTLEVBQUUsR0FBVyxFQUFFLEVBQUUsQ0FDMUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDNUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUNwQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQztRQUN0QyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFM0IsMEVBQTBFO0lBQzFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsUUFBUSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFFaEQsa0VBQWtFO0lBQ2xFLHlEQUF5RDtJQUN6RCxnRUFBZ0U7SUFDaEUsb0JBQW9CO0lBQ3BCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV0RCxvREFBb0Q7SUFDcEQsZ0NBQWdDO0lBQ2hDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDOUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUVoQyxNQUFNLElBQUksR0FBRztRQUNYLEtBQUssRUFBRSxFQUFFO1FBQ1QsR0FBRyxFQUFFLEVBQUU7UUFDUCxHQUFHLEVBQUUsRUFBRTtRQUNQLFFBQVEsRUFBRSxFQUFFO0tBQ2IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBDQUEwQztJQUV4RCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFZixJQUFJLFNBQVMsS0FBSyxPQUFPLEVBQUU7UUFDekIsa0VBQWtFO1FBQ2xFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUMzRCxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUNaLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDdkIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQzNDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUViLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZDO1NBQU07UUFDTCw0RUFBNEU7UUFDNUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzlDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDakQsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1NBQ3hDO0tBQ0Y7SUFFRCxzRkFBc0Y7SUFDdEYsNkZBQTZGO0lBQzdGLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMzQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUU3QixJQUFJLFNBQVMsS0FBSyxLQUFLLEVBQUU7UUFDdkIsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3BCO0lBRUQsTUFBTSxLQUFLLEdBQUc7UUFDWixLQUFLLEVBQUUsRUFBRTtRQUNULEdBQUcsRUFBRSxFQUFFO1FBQ1AsUUFBUSxFQUFFLEVBQUU7S0FDYixDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsVUFBVTtJQUV4QixnQkFBZ0I7SUFDaEIsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyw2Q0FBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNsRSxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNqRSxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNsQyxDQUFDLENBQUM7QUFFRixNQUFNLDBCQUEwQixHQUFHLENBQ2pDLE9BQWdDLEVBQ3RCLEVBQUU7SUFDWixNQUFNLFNBQVMsR0FBRyxtRUFBZSxFQUFFLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsNkVBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFOUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLEVBQUU7UUFDbkIsSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQ3JCLE9BQU8sT0FBTyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUVMLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUEwQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3hFLENBQUMsQ0FBQztBQUVGLE1BQU0sNkJBQTZCLEdBQUcsQ0FDcEMsT0FBZ0MsRUFDaEMsRUFBVSxFQUNWLEVBQVUsRUFDd0IsRUFBRTs7SUFDcEMsSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsNkNBQU0sQ0FDbkIsT0FBTyxDQUFDLENBQUMsR0FBRyxNQUFNLEVBQ2xCLE9BQU8sQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUNsQixFQUFFLEVBQ0YsRUFBRSxFQUNGLE9BQU8sQ0FBQyxLQUFLLENBQ2QsQ0FBQztRQUVGLElBQUksTUFBTSxHQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVELE1BQU0sZ0JBQWdCLEdBQUcsaUVBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixNQUFNLG1CQUFtQixHQUFHLDhGQUE0QyxDQUN0RSxPQUFPLEVBQ1AsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDWixnQkFBZ0IsQ0FDakIsQ0FBQztZQUNGLE1BQU0sR0FBRztnQkFDUCxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLG1CQUFtQixDQUFDLENBQUMsQ0FBQztnQkFDdEIsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO2dCQUN0QixtQkFBbUIsQ0FBQyxDQUFDLENBQUM7YUFDdkIsQ0FBQztTQUNIO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVELG9DQUFvQztJQUNwQyxNQUFNLFdBQVcsR0FBRyxpRkFBa0IsQ0FBQyxPQUFPLENBQUMsMENBQUcsQ0FBQyxDQUFDLENBQUM7SUFDckQsTUFBTSxLQUFLLEdBQUcsV0FBVyxhQUFYLFdBQVcsY0FBWCxXQUFXLEdBQUksMEJBQTBCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakUsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ25DLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQzNDLDZDQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUQsTUFBTSxHQUFHLEdBQUcsMkJBQTJCLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzFELElBQUksTUFBTSxHQUFxQztRQUM3QyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ04sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDTixHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQ1AsQ0FBQztJQUNGLE1BQU0sZ0JBQWdCLEdBQUcsaUVBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEQsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixNQUFNLG1CQUFtQixHQUFHLDhGQUE0QyxDQUN0RSxPQUFPLEVBQ1AsTUFBTSxFQUNOLGdCQUFnQixDQUNqQixDQUFDO1FBQ0YsTUFBTSxHQUFHO1lBQ1AsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLG1CQUFtQixDQUFDLENBQUMsQ0FBQztZQUN0QixtQkFBbUIsQ0FBQyxDQUFDLENBQUM7WUFDdEIsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCLENBQUM7S0FDSDtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUVGLDRCQUE0QjtBQUNyQixNQUFNLGdCQUFnQixHQUFHLENBQzlCLE9BQTBCLEVBQ1EsRUFBRTtJQUNwQyxJQUFJLE1BQXdDLENBQUM7SUFFN0MsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsSUFBSSw4REFBaUIsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUM5QixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsbUJBQW1CLENBQ2xELE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUM1Qiw2Q0FBTSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUM1RCxDQUNGLENBQUM7UUFFRixPQUFPO1lBQ0wsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1lBQ2hCLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQztZQUNoQixJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUM7WUFDaEIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxDQUFDO1NBQ2pCLENBQUM7S0FDSDtTQUFNLElBQUksNERBQWUsQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUNuQyxNQUFNLEdBQUcsNkJBQTZCLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztLQUN6RDtTQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyw2Q0FBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyw2Q0FBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyw2Q0FBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyw2Q0FBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNuQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQy9DO1NBQU07UUFDTCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUss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UUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQzNCLE1BQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNuRCxNQUFNLFFBQVEsR0FBRyxpREFBVSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUUsSUFBSSxRQUFRLEdBQUcsV0FBVyxFQUFFO1lBQzFCLFdBQVcsR0FBRyxRQUFRLENBQUM7WUFDdkIsY0FBYyxHQUFHLE9BQU8sQ0FBQztTQUMxQjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMxQyxDQUFDLENBQUM7QUFhSyxNQUFNLG9CQUFvQixHQUFHLENBQ2xDLFFBQXdFLEVBQ25FLEVBQUU7SUFDUCxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzNELE9BQU87UUFDTCxJQUFJO1FBQ0osSUFBSTtRQUNKLElBQUk7UUFDSixJQUFJO1FBQ0osS0FBSyxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ2xCLE1BQU0sRUFBRSxJQUFJLEdBQUcsSUFBSTtRQUNuQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztRQUN2QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQztLQUN4QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvYm91bmRzLnRzPzhiZTIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBBcnJvd2hlYWQsXG4gIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBkaXN0YW5jZTJkLCByb3RhdGUgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgRHJhd2FibGUsIE9wIH0gZnJvbSBcInJvdWdoanMvYmluL2NvcmVcIjtcbmltcG9ydCB7IFBvaW50IH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQge1xuICBnZXRTaGFwZUZvckVsZW1lbnQsXG4gIGdlbmVyYXRlUm91Z2hPcHRpb25zLFxufSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGlzRnJlZURyYXdFbGVtZW50LFxuICBpc0xpbmVhckVsZW1lbnQsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IHJlc2NhbGVQb2ludHMgfSBmcm9tIFwiLi4vcG9pbnRzXCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBnZXRDb250YWluZXJFbGVtZW50IH0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcblxuLy8geCBhbmQgeSBwb3NpdGlvbiBvZiB0b3AgbGVmdCBjb3JuZXIsIHggYW5kIHkgcG9zaXRpb24gb2YgYm90dG9tIHJpZ2h0IGNvcm5lclxuZXhwb3J0IHR5cGUgQm91bmRzID0gcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG50eXBlIE1heWJlUXVhZHJhdGljU29sdXRpb24gPSBbbnVtYmVyIHwgbnVsbCwgbnVtYmVyIHwgbnVsbF0gfCBmYWxzZTtcblxuLy8gSWYgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoZSB3aWR0aCBpcyBnb2luZyB0byBiZSBuZWdhdGl2ZVxuLy8gVGhpcyBzZXQgb2YgZnVuY3Rpb25zIHJldHJpZXZlcyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIDQgcG9pbnRzLlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGluY2x1ZGVCb3VuZFRleHQ6IGJvb2xlYW4gPSBmYWxzZSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiBnZXRGcmVlRHJhd0VsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgfSBlbHNlIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgaW5jbHVkZUJvdW5kVGV4dCxcbiAgICApO1xuICB9IGVsc2UgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBjb25zdCBjb29yZHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgICAgY29udGFpbmVyLFxuICAgICAgICBlbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgY29vcmRzLngsXG4gICAgICAgIGNvb3Jkcy55LFxuICAgICAgICBjb29yZHMueCArIGVsZW1lbnQud2lkdGgsXG4gICAgICAgIGNvb3Jkcy55ICsgZWxlbWVudC5oZWlnaHQsXG4gICAgICAgIGNvb3Jkcy54ICsgZWxlbWVudC53aWR0aCAvIDIsXG4gICAgICAgIGNvb3Jkcy55ICsgZWxlbWVudC5oZWlnaHQgLyAyLFxuICAgICAgXTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtcbiAgICBlbGVtZW50LngsXG4gICAgZWxlbWVudC55LFxuICAgIGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGgsXG4gICAgZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQsXG4gICAgZWxlbWVudC54ICsgZWxlbWVudC53aWR0aCAvIDIsXG4gICAgZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQgLyAyLFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvaW50UmVsYXRpdmVUbyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGFic29sdXRlQ29vcmRzOiBQb2ludCxcbik6IFBvaW50ID0+IHtcbiAgcmV0dXJuIFthYnNvbHV0ZUNvb3Jkc1swXSAtIGVsZW1lbnQueCwgYWJzb2x1dGVDb29yZHNbMV0gLSBlbGVtZW50LnldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpYW1vbmRQb2ludHMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgLy8gSGVyZSB3ZSBhZGQgKzEgdG8gYXZvaWQgdGhlc2UgbnVtYmVycyB0byBiZSAwXG4gIC8vIG90aGVyd2lzZSByb3VnaC5qcyB3aWxsIHRocm93IGFuIGVycm9yIGNvbXBsYWluaW5nIGFib3V0IGl0XG4gIGNvbnN0IHRvcFggPSBNYXRoLmZsb29yKGVsZW1lbnQud2lkdGggLyAyKSArIDE7XG4gIGNvbnN0IHRvcFkgPSAwO1xuICBjb25zdCByaWdodFggPSBlbGVtZW50LndpZHRoO1xuICBjb25zdCByaWdodFkgPSBNYXRoLmZsb29yKGVsZW1lbnQuaGVpZ2h0IC8gMikgKyAxO1xuICBjb25zdCBib3R0b21YID0gdG9wWDtcbiAgY29uc3QgYm90dG9tWSA9IGVsZW1lbnQuaGVpZ2h0O1xuICBjb25zdCBsZWZ0WCA9IDA7XG4gIGNvbnN0IGxlZnRZID0gcmlnaHRZO1xuXG4gIHJldHVybiBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VydmVQYXRoT3BzID0gKHNoYXBlOiBEcmF3YWJsZSk6IE9wW10gPT4ge1xuICBmb3IgKGNvbnN0IHNldCBvZiBzaGFwZS5zZXRzKSB7XG4gICAgaWYgKHNldC50eXBlID09PSBcInBhdGhcIikge1xuICAgICAgcmV0dXJuIHNldC5vcHM7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaGFwZS5zZXRzWzBdLm9wcztcbn07XG5cbi8vIHJlZmVyZW5jZTogaHR0cHM6Ly9lbGlvdC1qb25lcy5jb20vMjAxOS8xMi9jdWJpYy1iZXppZXItY3VydmUtYm91bmRpbmctYm94ZXNcbmNvbnN0IGdldEJlemllclZhbHVlRm9yVCA9IChcbiAgdDogbnVtYmVyLFxuICBwMDogbnVtYmVyLFxuICBwMTogbnVtYmVyLFxuICBwMjogbnVtYmVyLFxuICBwMzogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IG9uZU1pbnVzVCA9IDEgLSB0O1xuICByZXR1cm4gKFxuICAgIE1hdGgucG93KG9uZU1pbnVzVCwgMykgKiBwMCArXG4gICAgMyAqIE1hdGgucG93KG9uZU1pbnVzVCwgMikgKiB0ICogcDEgK1xuICAgIDMgKiBvbmVNaW51c1QgKiBNYXRoLnBvdyh0LCAyKSAqIHAyICtcbiAgICBNYXRoLnBvdyh0LCAzKSAqIHAzXG4gICk7XG59O1xuXG5jb25zdCBzb2x2ZVF1YWRyYXRpYyA9IChcbiAgcDA6IG51bWJlcixcbiAgcDE6IG51bWJlcixcbiAgcDI6IG51bWJlcixcbiAgcDM6IG51bWJlcixcbik6IE1heWJlUXVhZHJhdGljU29sdXRpb24gPT4ge1xuICBjb25zdCBpID0gcDEgLSBwMDtcbiAgY29uc3QgaiA9IHAyIC0gcDE7XG4gIGNvbnN0IGsgPSBwMyAtIHAyO1xuXG4gIGNvbnN0IGEgPSAzICogaSAtIDYgKiBqICsgMyAqIGs7XG4gIGNvbnN0IGIgPSA2ICogaiAtIDYgKiBpO1xuICBjb25zdCBjID0gMyAqIGk7XG5cbiAgY29uc3Qgc3FydFBhcnQgPSBiICogYiAtIDQgKiBhICogYztcbiAgY29uc3QgaGFzU29sdXRpb24gPSBzcXJ0UGFydCA+PSAwO1xuXG4gIGlmICghaGFzU29sdXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsZXQgczEgPSBudWxsO1xuICBsZXQgczIgPSBudWxsO1xuXG4gIGxldCB0MSA9IEluZmluaXR5O1xuICBsZXQgdDIgPSBJbmZpbml0eTtcblxuICBpZiAoYSA9PT0gMCkge1xuICAgIHQxID0gdDIgPSAtYyAvIGI7XG4gIH0gZWxzZSB7XG4gICAgdDEgPSAoLWIgKyBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gICAgdDIgPSAoLWIgLSBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gIH1cblxuICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgczEgPSBnZXRCZXppZXJWYWx1ZUZvclQodDEsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIGlmICh0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICBzMiA9IGdldEJlemllclZhbHVlRm9yVCh0MiwgcDAsIHAxLCBwMiwgcDMpO1xuICB9XG5cbiAgcmV0dXJuIFtzMSwgczJdO1xufTtcblxuY29uc3QgZ2V0Q3ViaWNCZXppZXJDdXJ2ZUJvdW5kID0gKFxuICBwMDogUG9pbnQsXG4gIHAxOiBQb2ludCxcbiAgcDI6IFBvaW50LFxuICBwMzogUG9pbnQsXG4pOiBCb3VuZHMgPT4ge1xuICBjb25zdCBzb2xYID0gc29sdmVRdWFkcmF0aWMocDBbMF0sIHAxWzBdLCBwMlswXSwgcDNbMF0pO1xuICBjb25zdCBzb2xZID0gc29sdmVRdWFkcmF0aWMocDBbMV0sIHAxWzFdLCBwMlsxXSwgcDNbMV0pO1xuXG4gIGxldCBtaW5YID0gTWF0aC5taW4ocDBbMF0sIHAzWzBdKTtcbiAgbGV0IG1heFggPSBNYXRoLm1heChwMFswXSwgcDNbMF0pO1xuXG4gIGlmIChzb2xYKSB7XG4gICAgY29uc3QgeHMgPSBzb2xYLmZpbHRlcigoeCkgPT4geCAhPT0gbnVsbCkgYXMgbnVtYmVyW107XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIC4uLnhzKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgLi4ueHMpO1xuICB9XG5cbiAgbGV0IG1pblkgPSBNYXRoLm1pbihwMFsxXSwgcDNbMV0pO1xuICBsZXQgbWF4WSA9IE1hdGgubWF4KHAwWzFdLCBwM1sxXSk7XG4gIGlmIChzb2xZKSB7XG4gICAgY29uc3QgeXMgPSBzb2xZLmZpbHRlcigoeSkgPT4geSAhPT0gbnVsbCkgYXMgbnVtYmVyW107XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIC4uLnlzKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgLi4ueXMpO1xuICB9XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzID0gKFxuICBvcHM6IE9wW10sXG4gIHRyYW5zZm9ybVhZPzogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgY3VycmVudFA6IFBvaW50ID0gWzAsIDBdO1xuXG4gIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9ID0gb3BzLnJlZHVjZShcbiAgICAobGltaXRzLCB7IG9wLCBkYXRhIH0pID0+IHtcbiAgICAgIC8vIFRoZXJlIGFyZSBvbmx5IGZvdXIgb3BlcmF0aW9uIHR5cGVzOlxuICAgICAgLy8gbW92ZSwgYmN1cnZlVG8sIGxpbmVUbywgYW5kIGN1cnZlVG9cbiAgICAgIGlmIChvcCA9PT0gXCJtb3ZlXCIpIHtcbiAgICAgICAgLy8gY2hhbmdlIHN0YXJ0aW5nIHBvaW50XG4gICAgICAgIGN1cnJlbnRQID0gZGF0YSBhcyB1bmtub3duIGFzIFBvaW50O1xuICAgICAgICAvLyBtb3ZlIG9wZXJhdGlvbiBkb2VzIG5vdCBkcmF3IGFueXRoaW5nOyBzbywgaXQgYWx3YXlzXG4gICAgICAgIC8vIHJldHVybnMgZmFsc2VcbiAgICAgIH0gZWxzZSBpZiAob3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgICAgICBjb25zdCBfcDEgPSBbZGF0YVswXSwgZGF0YVsxXV0gYXMgUG9pbnQ7XG4gICAgICAgIGNvbnN0IF9wMiA9IFtkYXRhWzJdLCBkYXRhWzNdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgX3AzID0gW2RhdGFbNF0sIGRhdGFbNV1dIGFzIFBvaW50O1xuXG4gICAgICAgIGNvbnN0IHAxID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDEpIDogX3AxO1xuICAgICAgICBjb25zdCBwMiA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AyKSA6IF9wMjtcbiAgICAgICAgY29uc3QgcDMgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMykgOiBfcDM7XG5cbiAgICAgICAgY29uc3QgcDAgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLmN1cnJlbnRQKSA6IGN1cnJlbnRQO1xuICAgICAgICBjdXJyZW50UCA9IF9wMztcblxuICAgICAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDdWJpY0JlemllckN1cnZlQm91bmQoXG4gICAgICAgICAgcDAsXG4gICAgICAgICAgcDEsXG4gICAgICAgICAgcDIsXG4gICAgICAgICAgcDMsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGltaXRzLm1pblggPSBNYXRoLm1pbihsaW1pdHMubWluWCwgbWluWCk7XG4gICAgICAgIGxpbWl0cy5taW5ZID0gTWF0aC5taW4obGltaXRzLm1pblksIG1pblkpO1xuXG4gICAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIG1heFgpO1xuICAgICAgICBsaW1pdHMubWF4WSA9IE1hdGgubWF4KGxpbWl0cy5tYXhZLCBtYXhZKTtcbiAgICAgIH0gZWxzZSBpZiAob3AgPT09IFwibGluZVRvXCIpIHtcbiAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgIH0gZWxzZSBpZiAob3AgPT09IFwicWN1cnZlVG9cIikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgfVxuICAgICAgcmV0dXJuIGxpbWl0cztcbiAgICB9LFxuICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICApO1xuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0Qm91bmRzRnJvbVBvaW50cyA9IChcbiAgcG9pbnRzOiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50W1wicG9pbnRzXCJdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgbWluWCA9IEluZmluaXR5O1xuICBsZXQgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgZm9yIChjb25zdCBbeCwgeV0gb2YgcG9pbnRzKSB7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5KTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeCk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkpO1xuICB9XG5cbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5cbmNvbnN0IGdldEZyZWVEcmF3RWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gIGNvbnN0IHgxID0gbWluWCArIGVsZW1lbnQueDtcbiAgY29uc3QgeTEgPSBtaW5ZICsgZWxlbWVudC55O1xuICBjb25zdCB4MiA9IG1heFggKyBlbGVtZW50Lng7XG4gIGNvbnN0IHkyID0gbWF4WSArIGVsZW1lbnQueTtcbiAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiwgKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMl07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkUG9pbnRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgc2hhcGU6IERyYXdhYmxlW10sXG4gIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbikgPT4ge1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuICBpZiAob3BzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpbmRleCBvZiB0aGUgYkN1cnZlIG9wZXJhdGlvbiB0byBleGFtaW5lLlxuICBjb25zdCBpbmRleCA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyAxIDogb3BzLmxlbmd0aCAtIDE7XG5cbiAgY29uc3QgZGF0YSA9IG9wc1tpbmRleF0uZGF0YTtcbiAgY29uc3QgcDMgPSBbZGF0YVs0XSwgZGF0YVs1XV0gYXMgUG9pbnQ7XG4gIGNvbnN0IHAyID0gW2RhdGFbMl0sIGRhdGFbM11dIGFzIFBvaW50O1xuICBjb25zdCBwMSA9IFtkYXRhWzBdLCBkYXRhWzFdXSBhcyBQb2ludDtcblxuICAvLyBXZSBuZWVkIHRvIGZpbmQgcDAgb2YgdGhlIGJlemllciBjdXJ2ZS5cbiAgLy8gSXQgaXMgdHlwaWNhbGx5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBwcmV2aW91c1xuICAvLyBjdXJ2ZTsgaXQgY2FuIGFsc28gYmUgdGhlIHBvc2l0aW9uIG9mIG1vdmVUbyBvcGVyYXRpb24uXG4gIGNvbnN0IHByZXZPcCA9IG9wc1tpbmRleCAtIDFdO1xuICBsZXQgcDA6IFBvaW50ID0gWzAsIDBdO1xuICBpZiAocHJldk9wLm9wID09PSBcIm1vdmVcIikge1xuICAgIHAwID0gcHJldk9wLmRhdGEgYXMgdW5rbm93biBhcyBQb2ludDtcbiAgfSBlbHNlIGlmIChwcmV2T3Aub3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgIHAwID0gW3ByZXZPcC5kYXRhWzRdLCBwcmV2T3AuZGF0YVs1XV07XG4gIH1cblxuICAvLyBCKHQpID0gcDAgKiAoMS10KV4zICsgM3AxICogdCAqICgxLXQpXjIgKyAzcDIgKiB0XjIgKiAoMS10KSArIHAzICogdF4zXG4gIGNvbnN0IGVxdWF0aW9uID0gKHQ6IG51bWJlciwgaWR4OiBudW1iZXIpID0+XG4gICAgTWF0aC5wb3coMSAtIHQsIDMpICogcDNbaWR4XSArXG4gICAgMyAqIHQgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBwMltpZHhdICtcbiAgICAzICogTWF0aC5wb3codCwgMikgKiAoMSAtIHQpICogcDFbaWR4XSArXG4gICAgcDBbaWR4XSAqIE1hdGgucG93KHQsIDMpO1xuXG4gIC8vIEVlIGtub3cgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGFycm93IChvciB0aGUgZmlyc3QsIGlmIHN0YXJ0IGFycm93aGVhZCkuXG4gIGNvbnN0IFt4MiwgeTJdID0gcG9zaXRpb24gPT09IFwic3RhcnRcIiA/IHAwIDogcDM7XG5cbiAgLy8gQnkgdXNpbmcgY3ViaWMgYmV6aWVyIGVxdWF0aW9uIChCKHQpKSBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMsXG4gIC8vIHdlIGNhbGN1bGF0ZSBhIHBvaW50IHRoYXQgaXMgY2xvc2VyIHRvIHRoZSBsYXN0IHBvaW50LlxuICAvLyBUaGUgdmFsdWUgMC4zIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhbmQgaXQgd29ya3MgYmVzdCBmb3IgYWxsXG4gIC8vIHRoZSB0ZXN0ZWQgY2FzZXMuXG4gIGNvbnN0IFt4MSwgeTFdID0gW2VxdWF0aW9uKDAuMywgMCksIGVxdWF0aW9uKDAuMywgMSldO1xuXG4gIC8vIEZpbmQgdGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGVcbiAgLy8gcHJldmlvdXNseSBjYWxjdWxhdGVkIHBvaW50cy5cbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmh5cG90KHgyIC0geDEsIHkyIC0geTEpO1xuICBjb25zdCBueCA9ICh4MiAtIHgxKSAvIGRpc3RhbmNlO1xuICBjb25zdCBueSA9ICh5MiAtIHkxKSAvIGRpc3RhbmNlO1xuXG4gIGNvbnN0IHNpemUgPSB7XG4gICAgYXJyb3c6IDMwLFxuICAgIGJhcjogMTUsXG4gICAgZG90OiAxNSxcbiAgICB0cmlhbmdsZTogMTUsXG4gIH1bYXJyb3doZWFkXTsgLy8gcGl4ZWxzICh3aWxsIGRpZmZlciBmb3IgZWFjaCBhcnJvd2hlYWQpXG5cbiAgbGV0IGxlbmd0aCA9IDA7XG5cbiAgaWYgKGFycm93aGVhZCA9PT0gXCJhcnJvd1wiKSB7XG4gICAgLy8gTGVuZ3RoIGZvciAtPiBhcnJvd3MgaXMgYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBzZWN0aW9uXG4gICAgY29uc3QgW2N4LCBjeV0gPSBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBbcHgsIHB5XSA9XG4gICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxXG4gICAgICAgID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBbMCwgMF07XG5cbiAgICBsZW5ndGggPSBNYXRoLmh5cG90KGN4IC0gcHgsIGN5IC0gcHkpO1xuICB9IGVsc2Uge1xuICAgIC8vIExlbmd0aCBmb3Igb3RoZXIgYXJyb3doZWFkIHR5cGVzIGlzIGJhc2VkIG9uIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGxpbmVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzW2kgLSAxXSB8fCBbMCwgMF07XG4gICAgICBjb25zdCBbY3gsIGN5XSA9IGVsZW1lbnQucG9pbnRzW2ldO1xuICAgICAgbGVuZ3RoICs9IE1hdGguaHlwb3QoY3ggLSBweCwgY3kgLSBweSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2NhbGUgZG93biB0aGUgYXJyb3doZWFkIHVudGlsIHdlIGhpdCBhIGNlcnRhaW4gc2l6ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbG9vayB3ZWlyZC5cbiAgLy8gVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCBieSBtaW5pbWl6aW5nIGEgbWluaW11bSBzaXplIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgYXJyb3doZWFkXG4gIGNvbnN0IG1pblNpemUgPSBNYXRoLm1pbihzaXplLCBsZW5ndGggLyAyKTtcbiAgY29uc3QgeHMgPSB4MiAtIG54ICogbWluU2l6ZTtcbiAgY29uc3QgeXMgPSB5MiAtIG55ICogbWluU2l6ZTtcblxuICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgY29uc3QgciA9IE1hdGguaHlwb3QoeXMgLSB5MiwgeHMgLSB4MikgKyBlbGVtZW50LnN0cm9rZVdpZHRoO1xuICAgIHJldHVybiBbeDIsIHkyLCByXTtcbiAgfVxuXG4gIGNvbnN0IGFuZ2xlID0ge1xuICAgIGFycm93OiAyMCxcbiAgICBiYXI6IDkwLFxuICAgIHRyaWFuZ2xlOiAyNSxcbiAgfVthcnJvd2hlYWRdOyAvLyBkZWdyZWVzXG5cbiAgLy8gUmV0dXJuIHBvaW50c1xuICBjb25zdCBbeDMsIHkzXSA9IHJvdGF0ZSh4cywgeXMsIHgyLCB5MiwgKC1hbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgY29uc3QgW3g0LCB5NF0gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgcmV0dXJuIFt4MiwgeTIsIHgzLCB5MywgeDQsIHk0XTtcbn07XG5cbmNvbnN0IGdlbmVyYXRlTGluZWFyRWxlbWVudFNoYXBlID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbik6IERyYXdhYmxlID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICBjb25zdCBtZXRob2QgPSAoKCkgPT4ge1xuICAgIGlmIChlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgcmV0dXJuIFwiY3VydmVcIjtcbiAgICB9XG4gICAgaWYgKG9wdGlvbnMuZmlsbCkge1xuICAgICAgcmV0dXJuIFwicG9seWdvblwiO1xuICAgIH1cbiAgICByZXR1cm4gXCJsaW5lYXJQYXRoXCI7XG4gIH0pKCk7XG5cbiAgcmV0dXJuIGdlbmVyYXRvclttZXRob2RdKGVsZW1lbnQucG9pbnRzIGFzIE11dGFibGU8UG9pbnQ+W10sIG9wdGlvbnMpO1xufTtcblxuY29uc3QgZ2V0TGluZWFyRWxlbWVudFJvdGF0ZWRCb3VuZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBjeDogbnVtYmVyLFxuICBjeTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoIDwgMikge1xuICAgIGNvbnN0IFtwb2ludFgsIHBvaW50WV0gPSBlbGVtZW50LnBvaW50c1swXTtcbiAgICBjb25zdCBbeCwgeV0gPSByb3RhdGUoXG4gICAgICBlbGVtZW50LnggKyBwb2ludFgsXG4gICAgICBlbGVtZW50LnkgKyBwb2ludFksXG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICApO1xuXG4gICAgbGV0IGNvb3JkczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbeCwgeSwgeCwgeV07XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvb3Jkc1dpdGhCb3VuZFRleHQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldE1pbk1heFhZV2l0aEJvdW5kVGV4dChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgW3gsIHksIHgsIHldLFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICAgKTtcbiAgICAgIGNvb3JkcyA9IFtcbiAgICAgICAgY29vcmRzV2l0aEJvdW5kVGV4dFswXSxcbiAgICAgICAgY29vcmRzV2l0aEJvdW5kVGV4dFsxXSxcbiAgICAgICAgY29vcmRzV2l0aEJvdW5kVGV4dFsyXSxcbiAgICAgICAgY29vcmRzV2l0aEJvdW5kVGV4dFszXSxcbiAgICAgIF07XG4gICAgfVxuICAgIHJldHVybiBjb29yZHM7XG4gIH1cblxuICAvLyBmaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0aGUgY3VydmVcbiAgY29uc3QgY2FjaGVkU2hhcGUgPSBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCk/LlswXTtcbiAgY29uc3Qgc2hhcGUgPSBjYWNoZWRTaGFwZSA/PyBnZW5lcmF0ZUxpbmVhckVsZW1lbnRTaGFwZShlbGVtZW50KTtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlKTtcbiAgY29uc3QgdHJhbnNmb3JtWFkgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+XG4gICAgcm90YXRlKGVsZW1lbnQueCArIHgsIGVsZW1lbnQueSArIHksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gIGNvbnN0IHJlcyA9IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMsIHRyYW5zZm9ybVhZKTtcbiAgbGV0IGNvb3JkczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgcmVzWzBdLFxuICAgIHJlc1sxXSxcbiAgICByZXNbMl0sXG4gICAgcmVzWzNdLFxuICBdO1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICBjb25zdCBjb29yZHNXaXRoQm91bmRUZXh0ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRNaW5NYXhYWVdpdGhCb3VuZFRleHQoXG4gICAgICBlbGVtZW50LFxuICAgICAgY29vcmRzLFxuICAgICAgYm91bmRUZXh0RWxlbWVudCxcbiAgICApO1xuICAgIGNvb3JkcyA9IFtcbiAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbMF0sXG4gICAgICBjb29yZHNXaXRoQm91bmRUZXh0WzFdLFxuICAgICAgY29vcmRzV2l0aEJvdW5kVGV4dFsyXSxcbiAgICAgIGNvb3Jkc1dpdGhCb3VuZFRleHRbM10sXG4gICAgXTtcbiAgfVxuICByZXR1cm4gY29vcmRzO1xufTtcblxuLy8gV2UgY291bGQgY2FjaGUgdGhpcyBzdHVmZlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCb3VuZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBbeDEsIHkxLCB4MiwgeTIsIGN4LCBjeV0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEJvdW5kc0Zyb21Qb2ludHMoXG4gICAgICBlbGVtZW50LnBvaW50cy5tYXAoKFt4LCB5XSkgPT5cbiAgICAgICAgcm90YXRlKHgsIHksIGN4IC0gZWxlbWVudC54LCBjeSAtIGVsZW1lbnQueSwgZWxlbWVudC5hbmdsZSksXG4gICAgICApLFxuICAgICk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgbWluWCArIGVsZW1lbnQueCxcbiAgICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgICBtYXhYICsgZWxlbWVudC54LFxuICAgICAgbWF4WSArIGVsZW1lbnQueSxcbiAgICBdO1xuICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSkge1xuICAgIGJvdW5kcyA9IGdldExpbmVhckVsZW1lbnRSb3RhdGVkQm91bmRzKGVsZW1lbnQsIGN4LCBjeSk7XG4gIH0gZWxzZSBpZiAoZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIGNvbnN0IFt4MTEsIHkxMV0gPSByb3RhdGUoY3gsIHkxLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MTIsIHkxMl0gPSByb3RhdGUoY3gsIHkyLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MjIsIHkyMl0gPSByb3RhdGUoeDEsIGN5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IFt4MjEsIHkyMV0gPSByb3RhdGUoeDIsIGN5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IG1pblggPSBNYXRoLm1pbih4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgIGNvbnN0IG1heFkgPSBNYXRoLm1heCh5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgIGJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgY29uc3QgdyA9ICh4MiAtIHgxKSAvIDI7XG4gICAgY29uc3QgaCA9ICh5MiAtIHkxKSAvIDI7XG4gICAgY29uc3QgY29zID0gTWF0aC5jb3MoZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3Qgc2luID0gTWF0aC5zaW4oZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3Qgd3cgPSBNYXRoLmh5cG90KHcgKiBjb3MsIGggKiBzaW4pO1xuICAgIGNvbnN0IGhoID0gTWF0aC5oeXBvdChoICogY29zLCB3ICogc2luKTtcbiAgICBib3VuZHMgPSBbY3ggLSB3dywgY3kgLSBoaCwgY3ggKyB3dywgY3kgKyBoaF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZSh4MSwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZSh4MSwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMiwgeTIyXSA9IHJvdGF0ZSh4MiwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9XG5cbiAgcmV0dXJuIGJvdW5kcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb21tb25Cb3VuZHMgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gIH1cblxuICBsZXQgbWluWCA9IEluZmluaXR5O1xuICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50Qm91bmRzKGVsZW1lbnQpO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCB4MSk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkxKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgeDIpO1xuICAgIG1heFkgPSBNYXRoLm1heChtYXhZLCB5Mik7XG4gIH0pO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIG5leHRXaWR0aDogbnVtYmVyLFxuICBuZXh0SGVpZ2h0OiBudW1iZXIsXG4gIG5vcm1hbGl6ZVBvaW50czogYm9vbGVhbixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKCEoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSkge1xuICAgIHJldHVybiBbXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LnggKyBuZXh0V2lkdGgsXG4gICAgICBlbGVtZW50LnkgKyBuZXh0SGVpZ2h0LFxuICAgIF07XG4gIH1cblxuICBjb25zdCBwb2ludHMgPSByZXNjYWxlUG9pbnRzKFxuICAgIDAsXG4gICAgbmV4dFdpZHRoLFxuICAgIHJlc2NhbGVQb2ludHMoMSwgbmV4dEhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksXG4gICAgbm9ybWFsaXplUG9pbnRzLFxuICApO1xuXG4gIGxldCBib3VuZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIEZyZWUgRHJhd1xuICAgIGJvdW5kcyA9IGdldEJvdW5kc0Zyb21Qb2ludHMocG9pbnRzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBMaW5lXG4gICAgY29uc3QgZ2VuID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gICAgY29uc3QgY3VydmUgPSAhZWxlbWVudC5yb3VuZG5lc3NcbiAgICAgID8gZ2VuLmxpbmVhclBhdGgoXG4gICAgICAgICAgcG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSxcbiAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgKVxuICAgICAgOiBnZW4uY3VydmUocG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCkpO1xuXG4gICAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGN1cnZlKTtcbiAgICBib3VuZHMgPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGJvdW5kcztcbiAgcmV0dXJuIFtcbiAgICBtaW5YICsgZWxlbWVudC54LFxuICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICBtYXhZICsgZWxlbWVudC55LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRQb2ludHNDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBwb2ludHM6IHJlYWRvbmx5IChyZWFkb25seSBbbnVtYmVyLCBudW1iZXJdKVtdLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICAvLyBUaGlzIG1pZ2h0IGJlIGNvbXB1dGF0aW9uYWxseSBoZWF2ZXlcbiAgY29uc3QgZ2VuID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gIGNvbnN0IGN1cnZlID1cbiAgICBlbGVtZW50LnJvdW5kbmVzcyA9PSBudWxsXG4gICAgICA/IGdlbi5saW5lYXJQYXRoKFxuICAgICAgICAgIHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sXG4gICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgIClcbiAgICAgIDogZ2VuLmN1cnZlKHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKTtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGN1cnZlKTtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDbG9zZXN0RWxlbWVudEJvdW5kcyA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGZyb206IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKCFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gWzAsIDAsIDAsIDBdO1xuICB9XG5cbiAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gIGxldCBjbG9zZXN0RWxlbWVudCA9IGVsZW1lbnRzWzBdO1xuXG4gIGVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlMmQoKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMiwgZnJvbS54LCBmcm9tLnkpO1xuXG4gICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICBjbG9zZXN0RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZ2V0RWxlbWVudEJvdW5kcyhjbG9zZXN0RWxlbWVudCk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEJveCB7XG4gIG1pblg6IG51bWJlcjtcbiAgbWluWTogbnVtYmVyO1xuICBtYXhYOiBudW1iZXI7XG4gIG1heFk6IG51bWJlcjtcbiAgbWlkWDogbnVtYmVyO1xuICBtaWRZOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgZ2V0Q29tbW9uQm91bmRpbmdCb3ggPSAoXG4gIGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdIHwgcmVhZG9ubHkgTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXSxcbik6IEJveCA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIHJldHVybiB7XG4gICAgbWluWCxcbiAgICBtaW5ZLFxuICAgIG1heFgsXG4gICAgbWF4WSxcbiAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICBtaWRYOiAobWluWCArIG1heFgpIC8gMixcbiAgICBtaWRZOiAobWluWSArIG1heFkpIC8gMixcbiAgfTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
|
|
3398
3398
|
|
|
3399
3399
|
/***/ }),
|
|
3400
3400
|
|
|
@@ -3405,7 +3405,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3405
3405
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3406
3406
|
|
|
3407
3407
|
"use strict";
|
|
3408
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindingBorderTest\": () => (/* binding */ bindingBorderTest),\n/* harmony export */ \"determineFocusDistance\": () => (/* binding */ determineFocusDistance),\n/* harmony export */ \"determineFocusPoint\": () => (/* binding */ determineFocusPoint),\n/* harmony export */ \"distanceToBindableElement\": () => (/* binding */ distanceToBindableElement),\n/* harmony export */ \"findFocusPointForEllipse\": () => (/* binding */ findFocusPointForEllipse),\n/* harmony export */ \"findFocusPointForRectangulars\": () => (/* binding */ findFocusPointForRectangulars),\n/* harmony export */ \"getCircleIntersections\": () => (/* binding */ getCircleIntersections),\n/* harmony export */ \"hitTest\": () => (/* binding */ hitTest),\n/* harmony export */ \"intersectElementWithLine\": () => (/* binding */ intersectElementWithLine),\n/* harmony export */ \"isHittingElementBoundingBoxWithoutHittingElement\": () => (/* binding */ isHittingElementBoundingBoxWithoutHittingElement),\n/* harmony export */ \"isHittingElementNotConsideringBoundingBox\": () => (/* binding */ isHittingElementNotConsideringBoundingBox),\n/* harmony export */ \"isPointHittingElementBoundingBox\": () => (/* binding */ isPointHittingElementBoundingBox),\n/* harmony export */ \"maxBindingGap\": () => (/* binding */ maxBindingGap),\n/* harmony export */ \"pointInAbsoluteCoords\": () => (/* binding */ pointInAbsoluteCoords)\n/* harmony export */ });\n/* harmony import */ var _ga__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ga */ \"../../ga.ts\");\n/* harmony import */ var _gapoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../gapoints */ \"../../gapoints.ts\");\n/* harmony import */ var _gadirections__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../gadirections */ \"../../gadirections.ts\");\n/* harmony import */ var _galines__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../galines */ \"../../galines.ts\");\n/* harmony import */ var _gatransforms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../gatransforms */ \"../../gatransforms.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var points_on_curve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! points-on-curve */ \"../../../node_modules/points-on-curve/lib/index.js\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _transformHandles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./transformHandles */ \"../../element/transformHandles.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst isElementDraggableFromInside = (element) => {\n if (element.type === \"arrow\") {\n return false;\n }\n if (element.type === \"freedraw\") {\n return true;\n }\n const isDraggableFromInside = !(0,_utils__WEBPACK_IMPORTED_MODULE_11__.isTransparent)(element.backgroundColor) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.hasBoundTextElement)(element);\n if (element.type === \"line\") {\n return isDraggableFromInside && (0,_math__WEBPACK_IMPORTED_MODULE_5__.isPathALoop)(element.points);\n }\n return isDraggableFromInside || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isImageElement)(element);\n};\nconst hitTest = (element, appState, x, y) => {\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / appState.zoom.value;\n const point = [x, y];\n if (isElementSelected(appState, element) &&\n (0,_transformHandles__WEBPACK_IMPORTED_MODULE_12__.shouldShowBoundingBox)([element], appState)) {\n return isPointHittingElementBoundingBox(element, point, threshold);\n }\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_13__.getBoundTextElement)(element);\n if (boundTextElement) {\n const isHittingBoundTextElement = hitTest(boundTextElement, appState, x, y);\n if (isHittingBoundTextElement) {\n return true;\n }\n }\n return isHittingElementNotConsideringBoundingBox(element, appState, point);\n};\nconst isHittingElementBoundingBoxWithoutHittingElement = (element, appState, x, y) => {\n const threshold = 10 / appState.zoom.value;\n // So that bound text element hit is considered within bounding box of container even if its outside actual bounding box of element\n // eg for linear elements text can be outside the element bounding box\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_13__.getBoundTextElement)(element);\n if (boundTextElement && hitTest(boundTextElement, appState, x, y)) {\n return false;\n }\n return (!isHittingElementNotConsideringBoundingBox(element, appState, [x, y]) &&\n isPointHittingElementBoundingBox(element, [x, y], threshold));\n};\nconst isHittingElementNotConsideringBoundingBox = (element, appState, point) => {\n const threshold = 10 / appState.zoom.value;\n const check = (0,___WEBPACK_IMPORTED_MODULE_10__.isTextElement)(element)\n ? isStrictlyInside\n : isElementDraggableFromInside(element)\n ? isInsideCheck\n : isNearCheck;\n return hitTestPointAgainstElement({ element, point, threshold, check });\n};\nconst isElementSelected = (appState, element) => appState.selectedElementIds[element.id];\nconst isPointHittingElementBoundingBox = (element, [x, y], threshold) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const elementCenterX = (x1 + x2) / 2;\n const elementCenterY = (y1 + y2) / 2;\n // reverse rotate to take element's angle into account.\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.rotate)(x, y, elementCenterX, elementCenterY, -element.angle);\n return (rotatedX > x1 - threshold &&\n rotatedX < x2 + threshold &&\n rotatedY > y1 - threshold &&\n rotatedY < y2 + threshold);\n};\nconst bindingBorderTest = (element, { x, y }) => {\n const threshold = maxBindingGap(element, element.width, element.height);\n const check = isOutsideCheck;\n const point = [x, y];\n return hitTestPointAgainstElement({ element, point, threshold, check });\n};\nconst maxBindingGap = (element, elementWidth, elementHeight) => {\n // Aligns diamonds with rectangles\n const shapeRatio = element.type === \"diamond\" ? 1 / Math.sqrt(2) : 1;\n const smallerDimension = shapeRatio * Math.min(elementWidth, elementHeight);\n // We make the bindable boundary bigger for bigger elements\n return Math.max(16, Math.min(0.25 * smallerDimension, 32));\n};\nconst hitTestPointAgainstElement = (args) => {\n switch (args.element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n case \"ellipse\":\n const distance = distanceToBindableElement(args.element, args.point);\n return args.check(distance, args.threshold);\n case \"freedraw\": {\n if (!args.check(distanceToRectangle(args.element, args.point), args.threshold)) {\n return false;\n }\n return hitTestFreeDrawElement(args.element, args.point, args.threshold);\n }\n case \"arrow\":\n case \"line\":\n return hitTestLinear(args);\n case \"selection\":\n console.warn(\"This should not happen, we need to investigate why it does.\");\n return false;\n }\n};\nconst distanceToBindableElement = (element, point) => {\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return distanceToRectangle(element, point);\n case \"diamond\":\n return distanceToDiamond(element, point);\n case \"ellipse\":\n return distanceToEllipse(element, point);\n }\n};\nconst isStrictlyInside = (distance, threshold) => {\n return distance < 0;\n};\nconst isInsideCheck = (distance, threshold) => {\n return distance < threshold;\n};\nconst isNearCheck = (distance, threshold) => {\n return Math.abs(distance) < threshold;\n};\nconst isOutsideCheck = (distance, threshold) => {\n return 0 <= distance && distance < threshold;\n};\nconst distanceToRectangle = (element, point) => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n return Math.max(_gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, _galines__WEBPACK_IMPORTED_MODULE_3__.equation(0, 1, -hheight)), _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, _galines__WEBPACK_IMPORTED_MODULE_3__.equation(1, 0, -hwidth)));\n};\nconst distanceToDiamond = (element, point) => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n const side = _galines__WEBPACK_IMPORTED_MODULE_3__.equation(hheight, hwidth, -hheight * hwidth);\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, side);\n};\nconst distanceToEllipse = (element, point) => {\n const [pointRel, tangent] = ellipseParamsForTest(element, point);\n return -_galines__WEBPACK_IMPORTED_MODULE_3__.sign(tangent) * _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, tangent);\n};\nconst ellipseParamsForTest = (element, point) => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n const [px, py] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(pointRel);\n // We're working in positive quadrant, so start with `t = 45deg`, `tx=cos(t)`\n let tx = 0.707;\n let ty = 0.707;\n const a = hwidth;\n const b = hheight;\n // This is a numerical method to find the params tx, ty at which\n // the ellipse has the closest point to the given point\n [0, 1, 2, 3].forEach((_) => {\n const xx = a * tx;\n const yy = b * ty;\n const ex = ((a * a - b * b) * Math.pow(tx, 3)) / a;\n const ey = ((b * b - a * a) * Math.pow(ty, 3)) / b;\n const rx = xx - ex;\n const ry = yy - ey;\n const qx = px - ex;\n const qy = py - ey;\n const r = Math.hypot(ry, rx);\n const q = Math.hypot(qy, qx);\n tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));\n ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));\n const t = Math.hypot(ty, tx);\n tx /= t;\n ty /= t;\n });\n const closestPoint = _ga__WEBPACK_IMPORTED_MODULE_0__.point(a * tx, b * ty);\n const tangent = _galines__WEBPACK_IMPORTED_MODULE_3__.orthogonalThrough(pointRel, closestPoint);\n return [pointRel, tangent];\n};\nconst hitTestFreeDrawElement = (element, point, threshold) => {\n // Check point-distance-to-line-segment for every segment in the\n // element's points (its input points, not its outline points).\n // This is... okay? It's plenty fast, but the GA library may\n // have a faster option.\n let x;\n let y;\n if (element.angle === 0) {\n x = point[0] - element.x;\n y = point[1] - element.y;\n }\n else {\n // Counter-rotate the point around center before testing\n const [minX, minY, maxX, maxY] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const rotatedPoint = (0,_math__WEBPACK_IMPORTED_MODULE_5__.rotatePoint)(point, [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2], -element.angle);\n x = rotatedPoint[0] - element.x;\n y = rotatedPoint[1] - element.y;\n }\n let [A, B] = element.points;\n let P;\n // For freedraw dots\n if ((0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(A[0], A[1], x, y) < threshold ||\n (0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(B[0], B[1], x, y) < threshold) {\n return true;\n }\n // For freedraw lines\n for (let i = 0; i < element.points.length; i++) {\n const delta = [B[0] - A[0], B[1] - A[1]];\n const length = Math.hypot(delta[1], delta[0]);\n const U = [delta[0] / length, delta[1] / length];\n const C = [x - A[0], y - A[1]];\n const d = (C[0] * U[0] + C[1] * U[1]) / Math.hypot(U[1], U[0]);\n P = [A[0] + U[0] * d, A[1] + U[1] * d];\n const da = (0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(P[0], P[1], A[0], A[1]);\n const db = (0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(P[0], P[1], B[0], B[1]);\n P = db < da && da > length ? B : da < db && db > length ? A : P;\n if (Math.hypot(y - P[1], x - P[0]) < threshold) {\n return true;\n }\n A = B;\n B = element.points[i + 1];\n }\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__.getShapeForElement)(element);\n // for filled freedraw shapes, support\n // selecting from inside\n if (shape && shape.sets.length) {\n return hitTestRoughShape(shape, x, y, threshold);\n }\n return false;\n};\nconst hitTestLinear = (args) => {\n const { element, threshold } = args;\n if (!(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__.getShapeForElement)(element)) {\n return false;\n }\n const [point, pointAbs, hwidth, hheight] = pointRelativeToElement(args.element, args.point);\n const side1 = _galines__WEBPACK_IMPORTED_MODULE_3__.equation(0, 1, -hheight);\n const side2 = _galines__WEBPACK_IMPORTED_MODULE_3__.equation(1, 0, -hwidth);\n if (!isInsideCheck(_gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointAbs, side1), threshold) ||\n !isInsideCheck(_gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointAbs, side2), threshold)) {\n return false;\n }\n const [relX, relY] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(point);\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__.getShapeForElement)(element);\n if (!shape) {\n return false;\n }\n if (args.check === isInsideCheck) {\n const hit = shape.some((subshape) => hitTestCurveInside(subshape, relX, relY, element.roundness ? \"round\" : \"sharp\"));\n if (hit) {\n return true;\n }\n }\n // hit test all \"subshapes\" of the linear element\n return shape.some((subshape) => hitTestRoughShape(subshape, relX, relY, threshold));\n};\n// Returns:\n// 1. the point relative to the elements (x, y) position\n// 2. the point relative to the element's center with positive (x, y)\n// 3. half element width\n// 4. half element height\n//\n// Note that for linear elements the (x, y) position is not at the\n// top right corner of their boundary.\n//\n// Rectangles, diamonds and ellipses are symmetrical over axes,\n// and other elements have a rectangular boundary,\n// so we only need to perform hit tests for the positive quadrant.\nconst pointRelativeToElement = (element, pointTuple) => {\n const point = _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(pointTuple);\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const elementCoords = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const center = coordsCenter([x1, y1, x2, y2]);\n // GA has angle orientation opposite to `rotate`\n const rotate = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.rotation(center, element.angle);\n const pointRotated = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(rotate, point);\n const pointRelToCenter = _ga__WEBPACK_IMPORTED_MODULE_0__.sub(pointRotated, _gadirections__WEBPACK_IMPORTED_MODULE_2__.from(center));\n const pointRelToCenterAbs = _gapoints__WEBPACK_IMPORTED_MODULE_1__.abs(pointRelToCenter);\n const elementPos = _ga__WEBPACK_IMPORTED_MODULE_0__.offset(element.x, element.y);\n const pointRelToPos = _ga__WEBPACK_IMPORTED_MODULE_0__.sub(pointRotated, elementPos);\n const [ax, ay, bx, by] = elementCoords;\n const halfWidth = (bx - ax) / 2;\n const halfHeight = (by - ay) / 2;\n return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];\n};\n// Returns point in absolute coordinates\nconst pointInAbsoluteCoords = (element, \n// Point relative to the element position\npoint) => {\n const [x, y] = point;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const cx = (x2 - x1) / 2;\n const cy = (y2 - y1) / 2;\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.rotate)(x, y, cx, cy, element.angle);\n return [element.x + rotatedX, element.y + rotatedY];\n};\nconst relativizationToElementCenter = (element) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const center = coordsCenter([x1, y1, x2, y2]);\n // GA has angle orientation opposite to `rotate`\n const rotate = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.rotation(center, element.angle);\n const translate = _ga__WEBPACK_IMPORTED_MODULE_0__.reverse(_gatransforms__WEBPACK_IMPORTED_MODULE_4__.translation(_gadirections__WEBPACK_IMPORTED_MODULE_2__.from(center)));\n return _gatransforms__WEBPACK_IMPORTED_MODULE_4__.compose(rotate, translate);\n};\nconst coordsCenter = ([ax, ay, bx, by]) => {\n return _ga__WEBPACK_IMPORTED_MODULE_0__.point((ax + bx) / 2, (ay + by) / 2);\n};\n// The focus distance is the oriented ratio between the size of\n// the `element` and the \"focus image\" of the element on which\n// all focus points lie, so it's a number between -1 and 1.\n// The line going through `a` and `b` is a tangent to the \"focus image\"\n// of the element.\nconst determineFocusDistance = (element, \n// Point on the line, in absolute coordinates\na, \n// Another point on the line, in absolute coordinates (closer to element)\nb) => {\n const relateToCenter = relativizationToElementCenter(element);\n const aRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(a));\n const bRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(b));\n const line = _galines__WEBPACK_IMPORTED_MODULE_3__.through(aRel, bRel);\n const q = element.height / element.width;\n const hwidth = element.width / 2;\n const hheight = element.height / 2;\n const n = line[2];\n const m = line[3];\n const c = line[1];\n const mabs = Math.abs(m);\n const nabs = Math.abs(n);\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return c / (hwidth * (nabs + q * mabs));\n case \"diamond\":\n return mabs < nabs ? c / (nabs * hwidth) : c / (mabs * hheight);\n case \"ellipse\":\n return c / (hwidth * Math.sqrt(Math.pow(n, 2) + Math.pow(q, 2) * Math.pow(m, 2)));\n }\n};\nconst determineFocusPoint = (element, \n// The oriented, relative distance from the center of `element` of the\n// returned focusPoint\nfocus, adjecentPoint) => {\n if (focus === 0) {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const center = coordsCenter([x1, y1, x2, y2]);\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(center);\n }\n const relateToCenter = relativizationToElementCenter(element);\n const adjecentPointRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(adjecentPoint));\n const reverseRelateToCenter = _ga__WEBPACK_IMPORTED_MODULE_0__.reverse(relateToCenter);\n let point;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n point = findFocusPointForRectangulars(element, focus, adjecentPointRel);\n break;\n case \"ellipse\":\n point = findFocusPointForEllipse(element, focus, adjecentPointRel);\n break;\n }\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(_gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(reverseRelateToCenter, point));\n};\n// Returns 2 or 0 intersection points between line going through `a` and `b`\n// and the `element`, in ascending order of distance from `a`.\nconst intersectElementWithLine = (element, \n// Point on the line, in absolute coordinates\na, \n// Another point on the line, in absolute coordinates\nb, \n// If given, the element is inflated by this value\ngap = 0) => {\n const relateToCenter = relativizationToElementCenter(element);\n const aRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(a));\n const bRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(b));\n const line = _galines__WEBPACK_IMPORTED_MODULE_3__.through(aRel, bRel);\n const reverseRelateToCenter = _ga__WEBPACK_IMPORTED_MODULE_0__.reverse(relateToCenter);\n const intersections = getSortedElementLineIntersections(element, line, aRel, gap);\n return intersections.map((point) => _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(_gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(reverseRelateToCenter, point)));\n};\nconst getSortedElementLineIntersections = (element, \n// Relative to element center\nline, \n// Relative to element center\nnearPoint, gap = 0) => {\n let intersections;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n const corners = getCorners(element);\n intersections = corners\n .flatMap((point, i) => {\n const edge = [point, corners[(i + 1) % 4]];\n return intersectSegment(line, offsetSegment(edge, gap));\n })\n .concat(corners.flatMap((point) => getCircleIntersections(point, gap, line)));\n break;\n case \"ellipse\":\n intersections = getEllipseIntersections(element, gap, line);\n break;\n }\n if (intersections.length < 2) {\n // Ignore the \"edge\" case of only intersecting with a single corner\n return [];\n }\n const sortedIntersections = intersections.sort((i1, i2) => _gapoints__WEBPACK_IMPORTED_MODULE_1__.distance(i1, nearPoint) - _gapoints__WEBPACK_IMPORTED_MODULE_1__.distance(i2, nearPoint));\n return [\n sortedIntersections[0],\n sortedIntersections[sortedIntersections.length - 1],\n ];\n};\nconst getCorners = (element, scale = 1) => {\n const hx = (scale * element.width) / 2;\n const hy = (scale * element.height) / 2;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(hx, hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(hx, -hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(-hx, -hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(-hx, hy),\n ];\n case \"diamond\":\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(0, hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(hx, 0),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(0, -hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(-hx, 0),\n ];\n }\n};\n// Returns intersection of `line` with `segment`, with `segment` moved by\n// `gap` in its polar direction.\n// If intersection coincides with second segment point returns empty array.\nconst intersectSegment = (line, segment) => {\n const [a, b] = segment;\n const aDist = _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(a, line);\n const bDist = _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(b, line);\n if (aDist * bDist >= 0) {\n // The intersection is outside segment `(a, b)`\n return [];\n }\n return [_gapoints__WEBPACK_IMPORTED_MODULE_1__.intersect(line, _galines__WEBPACK_IMPORTED_MODULE_3__.through(a, b))];\n};\nconst offsetSegment = (segment, distance) => {\n const [a, b] = segment;\n const offset = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.translationOrthogonal(_gadirections__WEBPACK_IMPORTED_MODULE_2__.fromTo(a, b), distance);\n return [_gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(offset, a), _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(offset, b)];\n};\nconst getEllipseIntersections = (element, gap, line) => {\n const a = element.width / 2 + gap;\n const b = element.height / 2 + gap;\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const squares = a * a * m * m + b * b * n * n;\n const discr = squares - c * c;\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = -a * a * m * c;\n const yn = -b * b * n * c;\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn + a * b * n * discrRoot) / squares, (yn - a * b * m * discrRoot) / squares),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn - a * b * n * discrRoot) / squares, (yn + a * b * m * discrRoot) / squares),\n ];\n};\nconst getCircleIntersections = (center, radius, line) => {\n if (radius === 0) {\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(line, center) === 0 ? [center] : [];\n }\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const [a, b] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(center);\n const r = radius;\n const squares = m * m + n * n;\n const discr = r * r * squares - Math.pow((m * a + n * b + c), 2);\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = a * n * n - b * m * n - m * c;\n const yn = b * m * m - a * m * n - n * c;\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn + n * discrRoot) / squares, (yn - m * discrRoot) / squares),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn - n * discrRoot) / squares, (yn + m * discrRoot) / squares),\n ];\n};\n// The focus point is the tangent point of the \"focus image\" of the\n// `element`, where the tangent goes through `point`.\nconst findFocusPointForEllipse = (ellipse, \n// Between -1 and 1 (not 0) the relative size of the \"focus image\" of\n// the element on which the focus point lies\nrelativeDistance, \n// The point for which we're trying to find the focus point, relative\n// to the ellipse center.\npoint) => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const a = (ellipse.width * relativeDistanceAbs) / 2;\n const b = (ellipse.height * relativeDistanceAbs) / 2;\n const orientation = Math.sign(relativeDistance);\n const [px, pyo] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(point);\n // The calculation below can't handle py = 0\n const py = pyo === 0 ? 0.0001 : pyo;\n const squares = Math.pow(px, 2) * Math.pow(b, 2) + Math.pow(py, 2) * Math.pow(a, 2);\n // Tangent mx + ny + 1 = 0\n const m = (-px * Math.pow(b, 2) +\n orientation * py * Math.sqrt(Math.max(0, squares - Math.pow(a, 2) * Math.pow(b, 2)))) /\n squares;\n const n = (-m * px - 1) / py;\n const x = -(Math.pow(a, 2) * m) / (Math.pow(n, 2) * Math.pow(b, 2) + Math.pow(m, 2) * Math.pow(a, 2));\n return _ga__WEBPACK_IMPORTED_MODULE_0__.point(x, (-m * x - 1) / n);\n};\nconst findFocusPointForRectangulars = (element, \n// Between -1 and 1 for how far away should the focus point be relative\n// to the size of the element. Sign determines orientation.\nrelativeDistance, \n// The point for which we're trying to find the focus point, relative\n// to the element center.\npoint) => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const orientation = Math.sign(relativeDistance);\n const corners = getCorners(element, relativeDistanceAbs);\n let maxDistance = 0;\n let tangentPoint = null;\n corners.forEach((corner) => {\n const distance = orientation * _galines__WEBPACK_IMPORTED_MODULE_3__.through(point, corner)[1];\n if (distance > maxDistance) {\n maxDistance = distance;\n tangentPoint = corner;\n }\n });\n return tangentPoint;\n};\nconst pointInBezierEquation = (p0, p1, p2, p3, [mx, my], lineThreshold) => {\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // go through t in increments of 0.01\n let t = 0;\n while (t <= 1.0) {\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));\n if (diff < lineThreshold) {\n return true;\n }\n t += 0.01;\n }\n return false;\n};\nconst hitTestCurveInside = (drawable, x, y, roundness) => {\n const ops = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getCurvePathOps)(drawable);\n const points = [];\n let odd = false; // select one line out of double lines\n for (const operation of ops) {\n if (operation.op === \"move\") {\n odd = !odd;\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n }\n else if (operation.op === \"bcurveTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n points.push([operation.data[2], operation.data[3]]);\n points.push([operation.data[4], operation.data[5]]);\n }\n }\n else if (operation.op === \"lineTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n }\n }\n if (points.length >= 4) {\n if (roundness === \"sharp\") {\n return (0,_math__WEBPACK_IMPORTED_MODULE_5__.isPointInPolygon)(points, x, y);\n }\n const polygonPoints = (0,points_on_curve__WEBPACK_IMPORTED_MODULE_6__.pointsOnBezierCurves)(points, 10, 5);\n return (0,_math__WEBPACK_IMPORTED_MODULE_5__.isPointInPolygon)(polygonPoints, x, y);\n }\n return false;\n};\nconst hitTestRoughShape = (drawable, x, y, lineThreshold) => {\n // read operations from first opSet\n const ops = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getCurvePathOps)(drawable);\n // set start position as (0,0) just in case\n // move operation does not exist (unlikely but it is worth safekeeping it)\n let currentP = [0, 0];\n return ops.some(({ op, data }, idx) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n // create points from bezier curve\n // bezier curve stores data as a flattened array of three positions\n // [x1, y1, x2, y2, x3, y3]\n const p1 = [data[0], data[1]];\n const p2 = [data[2], data[3]];\n const p3 = [data[4], data[5]];\n const p0 = currentP;\n currentP = p3;\n // check if points are on the curve\n // cubic bezier curves require four parameters\n // the first parameter is the last stored position (p0)\n const retVal = pointInBezierEquation(p0, p1, p2, p3, [x, y], lineThreshold);\n // set end point of bezier curve as the new starting point for\n // upcoming operations as each operation is based on the last drawn\n // position of the previous operation\n return retVal;\n }\n else if (op === \"lineTo\") {\n return hitTestCurveInside(drawable, x, y, \"sharp\");\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n console.warn(\"qcurveTo is not implemented yet\");\n }\n return false;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2QyxNQUFNLEVBQUUsR0FBRyxpREFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLGlEQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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Q2Y7YUFBTSxJQUFJLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFDMUIsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNwRDthQUFNLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUM1Qix1QkFBdUI7WUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2NvbGxpc2lvbi50cz80OTdhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEdBIGZyb20gXCIuLi9nYVwiO1xuaW1wb3J0ICogYXMgR0FQb2ludCBmcm9tIFwiLi4vZ2Fwb2ludHNcIjtcbmltcG9ydCAqIGFzIEdBRGlyZWN0aW9uIGZyb20gXCIuLi9nYWRpcmVjdGlvbnNcIjtcbmltcG9ydCAqIGFzIEdBTGluZSBmcm9tIFwiLi4vZ2FsaW5lc1wiO1xuaW1wb3J0ICogYXMgR0FUcmFuc2Zvcm0gZnJvbSBcIi4uL2dhdHJhbnNmb3Jtc1wiO1xuXG5pbXBvcnQge1xuICBkaXN0YW5jZTJkLFxuICByb3RhdGVQb2ludCxcbiAgaXNQYXRoQUxvb3AsXG4gIGlzUG9pbnRJblBvbHlnb24sXG4gIHJvdGF0ZSxcbn0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHBvaW50c09uQmV6aWVyQ3VydmVzIH0gZnJvbSBcInBvaW50cy1vbi1jdXJ2ZVwiO1xuXG5pbXBvcnQge1xuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3UmVjdGFuZ2xlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0RpYW1vbmRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGxpcHNlRWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIFN0cm9rZVJvdW5kbmVzcyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLCBnZXRDdXJ2ZVBhdGhPcHMsIEJvdW5kcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERyYXdhYmxlIH0gZnJvbSBcInJvdWdoanMvYmluL2NvcmVcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgaGFzQm91bmRUZXh0RWxlbWVudCwgaXNJbWFnZUVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzVHJhbnNwYXJlbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHNob3VsZFNob3dCb3VuZGluZ0JveCB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IGdldEJvdW5kVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuXG5jb25zdCBpc0VsZW1lbnREcmFnZ2FibGVGcm9tSW5zaWRlID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4pOiBib29sZWFuID0+IHtcbiAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJmcmVlZHJhd1wiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgaXNEcmFnZ2FibGVGcm9tSW5zaWRlID1cbiAgICAhaXNUcmFuc3BhcmVudChlbGVtZW50LmJhY2tncm91bmRDb2xvcikgfHwgaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJsaW5lXCIpIHtcbiAgICByZXR1cm4gaXNEcmFnZ2FibGVGcm9tSW5zaWRlICYmIGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKTtcbiAgfVxuICByZXR1cm4gaXNEcmFnZ2FibGVGcm9tSW5zaWRlIHx8IGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGhpdFRlc3QgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IGJvb2xlYW4gPT4ge1xuICAvLyBIb3cgbWFueSBwaXhlbHMgb2ZmIHRoZSBzaGFwZSBib3VuZGFyeSB3ZSBzdGlsbCBjb25zaWRlciBhIGhpdFxuICBjb25zdCB0aHJlc2hvbGQgPSAxMCAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gIGNvbnN0IHBvaW50OiBQb2ludCA9IFt4LCB5XTtcblxuICBpZiAoXG4gICAgaXNFbGVtZW50U2VsZWN0ZWQoYXBwU3RhdGUsIGVsZW1lbnQpICYmXG4gICAgc2hvdWxkU2hvd0JvdW5kaW5nQm94KFtlbGVtZW50XSwgYXBwU3RhdGUpXG4gICkge1xuICAgIHJldHVybiBpc1BvaW50SGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveChlbGVtZW50LCBwb2ludCwgdGhyZXNob2xkKTtcbiAgfVxuXG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgIGNvbnN0IGlzSGl0dGluZ0JvdW5kVGV4dEVsZW1lbnQgPSBoaXRUZXN0KGJvdW5kVGV4dEVsZW1lbnQsIGFwcFN0YXRlLCB4LCB5KTtcbiAgICBpZiAoaXNIaXR0aW5nQm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50LCBhcHBTdGF0ZSwgcG9pbnQpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveFdpdGhvdXRIaXR0aW5nRWxlbWVudCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcblxuICAvLyBTbyB0aGF0IGJvdW5kIHRleHQgZWxlbWVudCBoaXQgaXMgY29uc2lkZXJlZCB3aXRoaW4gYm91bmRpbmcgYm94IG9mIGNvbnRhaW5lciBldmVuIGlmIGl0cyBvdXRzaWRlIGFjdHVhbCBib3VuZGluZyBib3ggb2YgZWxlbWVudFxuICAvLyBlZyBmb3IgbGluZWFyIGVsZW1lbnRzIHRleHQgY2FuIGJlIG91dHNpZGUgdGhlIGVsZW1lbnQgYm91bmRpbmcgYm94XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudCAmJiBoaXRUZXN0KGJvdW5kVGV4dEVsZW1lbnQsIGFwcFN0YXRlLCB4LCB5KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgIWlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnQsIGFwcFN0YXRlLCBbeCwgeV0pICYmXG4gICAgaXNQb2ludEhpdHRpbmdFbGVtZW50Qm91bmRpbmdCb3goZWxlbWVudCwgW3gsIHldLCB0aHJlc2hvbGQpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBwb2ludDogUG9pbnQsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgdGhyZXNob2xkID0gMTAgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICBjb25zdCBjaGVjayA9IGlzVGV4dEVsZW1lbnQoZWxlbWVudClcbiAgICA/IGlzU3RyaWN0bHlJbnNpZGVcbiAgICA6IGlzRWxlbWVudERyYWdnYWJsZUZyb21JbnNpZGUoZWxlbWVudClcbiAgICA/IGlzSW5zaWRlQ2hlY2tcbiAgICA6IGlzTmVhckNoZWNrO1xuICByZXR1cm4gaGl0VGVzdFBvaW50QWdhaW5zdEVsZW1lbnQoeyBlbGVtZW50LCBwb2ludCwgdGhyZXNob2xkLCBjaGVjayB9KTtcbn07XG5cbmNvbnN0IGlzRWxlbWVudFNlbGVjdGVkID0gKFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+LFxuKSA9PiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHNbZWxlbWVudC5pZF07XG5cbmV4cG9ydCBjb25zdCBpc1BvaW50SGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD4sXG4gIFt4LCB5XTogUG9pbnQsXG4gIHRocmVzaG9sZDogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGVsZW1lbnRDZW50ZXJYID0gKHgxICsgeDIpIC8gMjtcbiAgY29uc3QgZWxlbWVudENlbnRlclkgPSAoeTEgKyB5MikgLyAyO1xuICAvLyByZXZlcnNlIHJvdGF0ZSB0byB0YWtlIGVsZW1lbnQncyBhbmdsZSBpbnRvIGFjY291bnQuXG4gIGNvbnN0IFtyb3RhdGVkWCwgcm90YXRlZFldID0gcm90YXRlKFxuICAgIHgsXG4gICAgeSxcbiAgICBlbGVtZW50Q2VudGVyWCxcbiAgICBlbGVtZW50Q2VudGVyWSxcbiAgICAtZWxlbWVudC5hbmdsZSxcbiAgKTtcblxuICByZXR1cm4gKFxuICAgIHJvdGF0ZWRYID4geDEgLSB0aHJlc2hvbGQgJiZcbiAgICByb3RhdGVkWCA8IHgyICsgdGhyZXNob2xkICYmXG4gICAgcm90YXRlZFkgPiB5MSAtIHRocmVzaG9sZCAmJlxuICAgIHJvdGF0ZWRZIDwgeTIgKyB0aHJlc2hvbGRcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kaW5nQm9yZGVyVGVzdCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50PixcbiAgeyB4LCB5IH06IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSxcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB0aHJlc2hvbGQgPSBtYXhCaW5kaW5nR2FwKGVsZW1lbnQsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0KTtcbiAgY29uc3QgY2hlY2sgPSBpc091dHNpZGVDaGVjaztcbiAgY29uc3QgcG9pbnQ6IFBvaW50ID0gW3gsIHldO1xuICByZXR1cm4gaGl0VGVzdFBvaW50QWdhaW5zdEVsZW1lbnQoeyBlbGVtZW50LCBwb2ludCwgdGhyZXNob2xkLCBjaGVjayB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBtYXhCaW5kaW5nR2FwID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgZWxlbWVudFdpZHRoOiBudW1iZXIsXG4gIGVsZW1lbnRIZWlnaHQ6IG51bWJlcixcbik6IG51bWJlciA9PiB7XG4gIC8vIEFsaWducyBkaWFtb25kcyB3aXRoIHJlY3RhbmdsZXNcbiAgY29uc3Qgc2hhcGVSYXRpbyA9IGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIgPyAxIC8gTWF0aC5zcXJ0KDIpIDogMTtcbiAgY29uc3Qgc21hbGxlckRpbWVuc2lvbiA9IHNoYXBlUmF0aW8gKiBNYXRoLm1pbihlbGVtZW50V2lkdGgsIGVsZW1lbnRIZWlnaHQpO1xuICAvLyBXZSBtYWtlIHRoZSBiaW5kYWJsZSBib3VuZGFyeSBiaWdnZXIgZm9yIGJpZ2dlciBlbGVtZW50c1xuICByZXR1cm4gTWF0aC5tYXgoMTYsIE1hdGgubWluKDAuMjUgKiBzbWFsbGVyRGltZW5zaW9uLCAzMikpO1xufTtcblxudHlwZSBIaXRUZXN0QXJncyA9IHtcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50O1xuICBwb2ludDogUG9pbnQ7XG4gIHRocmVzaG9sZDogbnVtYmVyO1xuICBjaGVjazogKGRpc3RhbmNlOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyKSA9PiBib29sZWFuO1xufTtcblxuY29uc3QgaGl0VGVzdFBvaW50QWdhaW5zdEVsZW1lbnQgPSAoYXJnczogSGl0VGVzdEFyZ3MpOiBib29sZWFuID0+IHtcbiAgc3dpdGNoIChhcmdzLmVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2VUb0JpbmRhYmxlRWxlbWVudChhcmdzLmVsZW1lbnQsIGFyZ3MucG9pbnQpO1xuICAgICAgcmV0dXJuIGFyZ3MuY2hlY2soZGlzdGFuY2UsIGFyZ3MudGhyZXNob2xkKTtcbiAgICBjYXNlIFwiZnJlZWRyYXdcIjoge1xuICAgICAgaWYgKFxuICAgICAgICAhYXJncy5jaGVjayhcbiAgICAgICAgICBkaXN0YW5jZVRvUmVjdGFuZ2xlKGFyZ3MuZWxlbWVudCwgYXJncy5wb2ludCksXG4gICAgICAgICAgYXJncy50aHJlc2hvbGQsXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoaXRUZXN0RnJlZURyYXdFbGVtZW50KGFyZ3MuZWxlbWVudCwgYXJncy5wb2ludCwgYXJncy50aHJlc2hvbGQpO1xuICAgIH1cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICBjYXNlIFwibGluZVwiOlxuICAgICAgcmV0dXJuIGhpdFRlc3RMaW5lYXIoYXJncyk7XG4gICAgY2FzZSBcInNlbGVjdGlvblwiOlxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBcIlRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIHdlIG5lZWQgdG8gaW52ZXN0aWdhdGUgd2h5IGl0IGRvZXMuXCIsXG4gICAgICApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2VUb0JpbmRhYmxlRWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgcG9pbnQ6IFBvaW50LFxuKTogbnVtYmVyID0+IHtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIHJldHVybiBkaXN0YW5jZVRvUmVjdGFuZ2xlKGVsZW1lbnQsIHBvaW50KTtcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgICAgcmV0dXJuIGRpc3RhbmNlVG9EaWFtb25kKGVsZW1lbnQsIHBvaW50KTtcbiAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgcmV0dXJuIGRpc3RhbmNlVG9FbGxpcHNlKGVsZW1lbnQsIHBvaW50KTtcbiAgfVxufTtcblxuY29uc3QgaXNTdHJpY3RseUluc2lkZSA9IChkaXN0YW5jZTogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZGlzdGFuY2UgPCAwO1xufTtcblxuY29uc3QgaXNJbnNpZGVDaGVjayA9IChkaXN0YW5jZTogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZGlzdGFuY2UgPCB0aHJlc2hvbGQ7XG59O1xuXG5jb25zdCBpc05lYXJDaGVjayA9IChkaXN0YW5jZTogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gTWF0aC5hYnMoZGlzdGFuY2UpIDwgdGhyZXNob2xkO1xufTtcblxuY29uc3QgaXNPdXRzaWRlQ2hlY2sgPSAoZGlzdGFuY2U6IG51bWJlciwgdGhyZXNob2xkOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIDAgPD0gZGlzdGFuY2UgJiYgZGlzdGFuY2UgPCB0aHJlc2hvbGQ7XG59O1xuXG5jb25zdCBkaXN0YW5jZVRvUmVjdGFuZ2xlID0gKFxuICBlbGVtZW50OlxuICAgIHwgRXhjYWxpZHJhd1JlY3RhbmdsZUVsZW1lbnRcbiAgICB8IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgcG9pbnQ6IFBvaW50LFxuKTogbnVtYmVyID0+IHtcbiAgY29uc3QgWywgcG9pbnRSZWwsIGh3aWR0aCwgaGhlaWdodF0gPSBwb2ludFJlbGF0aXZlVG9FbGVtZW50KGVsZW1lbnQsIHBvaW50KTtcbiAgcmV0dXJuIE1hdGgubWF4KFxuICAgIEdBUG9pbnQuZGlzdGFuY2VUb0xpbmUocG9pbnRSZWwsIEdBTGluZS5lcXVhdGlvbigwLCAxLCAtaGhlaWdodCkpLFxuICAgIEdBUG9pbnQuZGlzdGFuY2VUb0xpbmUocG9pbnRSZWwsIEdBTGluZS5lcXVhdGlvbigxLCAwLCAtaHdpZHRoKSksXG4gICk7XG59O1xuXG5jb25zdCBkaXN0YW5jZVRvRGlhbW9uZCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0RpYW1vbmRFbGVtZW50LFxuICBwb2ludDogUG9pbnQsXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBbLCBwb2ludFJlbCwgaHdpZHRoLCBoaGVpZ2h0XSA9IHBvaW50UmVsYXRpdmVUb0VsZW1lbnQoZWxlbWVudCwgcG9pbnQpO1xuICBjb25zdCBzaWRlID0gR0FMaW5lLmVxdWF0aW9uKGhoZWlnaHQsIGh3aWR0aCwgLWhoZWlnaHQgKiBod2lkdGgpO1xuICByZXR1cm4gR0FQb2ludC5kaXN0YW5jZVRvTGluZShwb2ludFJlbCwgc2lkZSk7XG59O1xuXG5jb25zdCBkaXN0YW5jZVRvRWxsaXBzZSA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsbGlwc2VFbGVtZW50LFxuICBwb2ludDogUG9pbnQsXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBbcG9pbnRSZWwsIHRhbmdlbnRdID0gZWxsaXBzZVBhcmFtc0ZvclRlc3QoZWxlbWVudCwgcG9pbnQpO1xuICByZXR1cm4gLUdBTGluZS5zaWduKHRhbmdlbnQpICogR0FQb2ludC5kaXN0YW5jZVRvTGluZShwb2ludFJlbCwgdGFuZ2VudCk7XG59O1xuXG5jb25zdCBlbGxpcHNlUGFyYW1zRm9yVGVzdCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsbGlwc2VFbGVtZW50LFxuICBwb2ludDogUG9pbnQsXG4pOiBbR0EuUG9pbnQsIEdBLkxpbmVdID0+IHtcbiAgY29uc3QgWywgcG9pbnRSZWwsIGh3aWR0aCwgaGhlaWdodF0gPSBwb2ludFJlbGF0aXZlVG9FbGVtZW50KGVsZW1lbnQsIHBvaW50KTtcbiAgY29uc3QgW3B4LCBweV0gPSBHQVBvaW50LnRvVHVwbGUocG9pbnRSZWwpO1xuXG4gIC8vIFdlJ3JlIHdvcmtpbmcgaW4gcG9zaXRpdmUgcXVhZHJhbnQsIHNvIHN0YXJ0IHdpdGggYHQgPSA0NWRlZ2AsIGB0eD1jb3ModClgXG4gIGxldCB0eCA9IDAuNzA3O1xuICBsZXQgdHkgPSAwLjcwNztcblxuICBjb25zdCBhID0gaHdpZHRoO1xuICBjb25zdCBiID0gaGhlaWdodDtcblxuICAvLyBUaGlzIGlzIGEgbnVtZXJpY2FsIG1ldGhvZCB0byBmaW5kIHRoZSBwYXJhbXMgdHgsIHR5IGF0IHdoaWNoXG4gIC8vIHRoZSBlbGxpcHNlIGhhcyB0aGUgY2xvc2VzdCBwb2ludCB0byB0aGUgZ2l2ZW4gcG9pbnRcbiAgWzAsIDEsIDIsIDNdLmZvckVhY2goKF8pID0+IHtcbiAgICBjb25zdCB4eCA9IGEgKiB0eDtcbiAgICBjb25zdCB5eSA9IGIgKiB0eTtcblxuICAgIGNvbnN0IGV4ID0gKChhICogYSAtIGIgKiBiKSAqIHR4ICoqIDMpIC8gYTtcbiAgICBjb25zdCBleSA9ICgoYiAqIGIgLSBhICogYSkgKiB0eSAqKiAzKSAvIGI7XG5cbiAgICBjb25zdCByeCA9IHh4IC0gZXg7XG4gICAgY29uc3QgcnkgPSB5eSAtIGV5O1xuXG4gICAgY29uc3QgcXggPSBweCAtIGV4O1xuICAgIGNvbnN0IHF5ID0gcHkgLSBleTtcblxuICAgIGNvbnN0IHIgPSBNYXRoLmh5cG90KHJ5LCByeCk7XG4gICAgY29uc3QgcSA9IE1hdGguaHlwb3QocXksIHF4KTtcblxuICAgIHR4ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgKChxeCAqIHIpIC8gcSArIGV4KSAvIGEpKTtcbiAgICB0eSA9IE1hdGgubWluKDEsIE1hdGgubWF4KDAsICgocXkgKiByKSAvIHEgKyBleSkgLyBiKSk7XG4gICAgY29uc3QgdCA9IE1hdGguaHlwb3QodHksIHR4KTtcbiAgICB0eCAvPSB0O1xuICAgIHR5IC89IHQ7XG4gIH0pO1xuXG4gIGNvbnN0IGNsb3Nlc3RQb2ludCA9IEdBLnBvaW50KGEgKiB0eCwgYiAqIHR5KTtcblxuICBjb25zdCB0YW5nZW50ID0gR0FMaW5lLm9ydGhvZ29uYWxUaHJvdWdoKHBvaW50UmVsLCBjbG9zZXN0UG9pbnQpO1xuICByZXR1cm4gW3BvaW50UmVsLCB0YW5nZW50XTtcbn07XG5cbmNvbnN0IGhpdFRlc3RGcmVlRHJhd0VsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIHBvaW50OiBQb2ludCxcbiAgdGhyZXNob2xkOiBudW1iZXIsXG4pOiBib29sZWFuID0+IHtcbiAgLy8gQ2hlY2sgcG9pbnQtZGlzdGFuY2UtdG8tbGluZS1zZWdtZW50IGZvciBldmVyeSBzZWdtZW50IGluIHRoZVxuICAvLyBlbGVtZW50J3MgcG9pbnRzIChpdHMgaW5wdXQgcG9pbnRzLCBub3QgaXRzIG91dGxpbmUgcG9pbnRzKS5cbiAgLy8gVGhpcyBpcy4uLiBva2F5PyBJdCdzIHBsZW50eSBmYXN0LCBidXQgdGhlIEdBIGxpYnJhcnkgbWF5XG4gIC8vIGhhdmUgYSBmYXN0ZXIgb3B0aW9uLlxuXG4gIGxldCB4OiBudW1iZXI7XG4gIGxldCB5OiBudW1iZXI7XG5cbiAgaWYgKGVsZW1lbnQuYW5nbGUgPT09IDApIHtcbiAgICB4ID0gcG9pbnRbMF0gLSBlbGVtZW50Lng7XG4gICAgeSA9IHBvaW50WzFdIC0gZWxlbWVudC55O1xuICB9IGVsc2Uge1xuICAgIC8vIENvdW50ZXItcm90YXRlIHRoZSBwb2ludCBhcm91bmQgY2VudGVyIGJlZm9yZSB0ZXN0aW5nXG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IHJvdGF0ZWRQb2ludCA9IHJvdGF0ZVBvaW50KFxuICAgICAgcG9pbnQsXG4gICAgICBbbWluWCArIChtYXhYIC0gbWluWCkgLyAyLCBtaW5ZICsgKG1heFkgLSBtaW5ZKSAvIDJdLFxuICAgICAgLWVsZW1lbnQuYW5nbGUsXG4gICAgKTtcbiAgICB4ID0gcm90YXRlZFBvaW50WzBdIC0gZWxlbWVudC54O1xuICAgIHkgPSByb3RhdGVkUG9pbnRbMV0gLSBlbGVtZW50Lnk7XG4gIH1cblxuICBsZXQgW0EsIEJdID0gZWxlbWVudC5wb2ludHM7XG4gIGxldCBQOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8vIEZvciBmcmVlZHJhdyBkb3RzXG4gIGlmIChcbiAgICBkaXN0YW5jZTJkKEFbMF0sIEFbMV0sIHgsIHkpIDwgdGhyZXNob2xkIHx8XG4gICAgZGlzdGFuY2UyZChCWzBdLCBCWzFdLCB4LCB5KSA8IHRocmVzaG9sZFxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIEZvciBmcmVlZHJhdyBsaW5lc1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGVsdGEgPSBbQlswXSAtIEFbMF0sIEJbMV0gLSBBWzFdXTtcbiAgICBjb25zdCBsZW5ndGggPSBNYXRoLmh5cG90KGRlbHRhWzFdLCBkZWx0YVswXSk7XG5cbiAgICBjb25zdCBVID0gW2RlbHRhWzBdIC8gbGVuZ3RoLCBkZWx0YVsxXSAvIGxlbmd0aF07XG4gICAgY29uc3QgQyA9IFt4IC0gQVswXSwgeSAtIEFbMV1dO1xuICAgIGNvbnN0IGQgPSAoQ1swXSAqIFVbMF0gKyBDWzFdICogVVsxXSkgLyBNYXRoLmh5cG90KFVbMV0sIFVbMF0pO1xuICAgIFAgPSBbQVswXSArIFVbMF0gKiBkLCBBWzFdICsgVVsxXSAqIGRdO1xuXG4gICAgY29uc3QgZGEgPSBkaXN0YW5jZTJkKFBbMF0sIFBbMV0sIEFbMF0sIEFbMV0pO1xuICAgIGNvbnN0IGRiID0gZGlzdGFuY2UyZChQWzBdLCBQWzFdLCBCWzBdLCBCWzFdKTtcblxuICAgIFAgPSBkYiA8IGRhICYmIGRhID4gbGVuZ3RoID8gQiA6IGRhIDwgZGIgJiYgZGIgPiBsZW5ndGggPyBBIDogUDtcblxuICAgIGlmIChNYXRoLmh5cG90KHkgLSBQWzFdLCB4IC0gUFswXSkgPCB0aHJlc2hvbGQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIEEgPSBCO1xuICAgIEIgPSBlbGVtZW50LnBvaW50c1tpICsgMV07XG4gIH1cblxuICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcblxuICAvLyBmb3IgZmlsbGVkIGZyZWVkcmF3IHNoYXBlcywgc3VwcG9ydFxuICAvLyBzZWxlY3RpbmcgZnJvbSBpbnNpZGVcbiAgaWYgKHNoYXBlICYmIHNoYXBlLnNldHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGhpdFRlc3RSb3VnaFNoYXBlKHNoYXBlLCB4LCB5LCB0aHJlc2hvbGQpO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgaGl0VGVzdExpbmVhciA9IChhcmdzOiBIaXRUZXN0QXJncyk6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB7IGVsZW1lbnQsIHRocmVzaG9sZCB9ID0gYXJncztcbiAgaWYgKCFnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBbcG9pbnQsIHBvaW50QWJzLCBod2lkdGgsIGhoZWlnaHRdID0gcG9pbnRSZWxhdGl2ZVRvRWxlbWVudChcbiAgICBhcmdzLmVsZW1lbnQsXG4gICAgYXJncy5wb2ludCxcbiAgKTtcbiAgY29uc3Qgc2lkZTEgPSBHQUxpbmUuZXF1YXRpb24oMCwgMSwgLWhoZWlnaHQpO1xuICBjb25zdCBzaWRlMiA9IEdBTGluZS5lcXVhdGlvbigxLCAwLCAtaHdpZHRoKTtcbiAgaWYgKFxuICAgICFpc0luc2lkZUNoZWNrKEdBUG9pbnQuZGlzdGFuY2VUb0xpbmUocG9pbnRBYnMsIHNpZGUxKSwgdGhyZXNob2xkKSB8fFxuICAgICFpc0luc2lkZUNoZWNrKEdBUG9pbnQuZGlzdGFuY2VUb0xpbmUocG9pbnRBYnMsIHNpZGUyKSwgdGhyZXNob2xkKVxuICApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgW3JlbFgsIHJlbFldID0gR0FQb2ludC50b1R1cGxlKHBvaW50KTtcblxuICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50IGFzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50KTtcblxuICBpZiAoIXNoYXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKGFyZ3MuY2hlY2sgPT09IGlzSW5zaWRlQ2hlY2spIHtcbiAgICBjb25zdCBoaXQgPSBzaGFwZS5zb21lKChzdWJzaGFwZSkgPT5cbiAgICAgIGhpdFRlc3RDdXJ2ZUluc2lkZShcbiAgICAgICAgc3Vic2hhcGUsXG4gICAgICAgIHJlbFgsXG4gICAgICAgIHJlbFksXG4gICAgICAgIGVsZW1lbnQucm91bmRuZXNzID8gXCJyb3VuZFwiIDogXCJzaGFycFwiLFxuICAgICAgKSxcbiAgICApO1xuICAgIGlmIChoaXQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIGhpdCB0ZXN0IGFsbCBcInN1YnNoYXBlc1wiIG9mIHRoZSBsaW5lYXIgZWxlbWVudFxuICByZXR1cm4gc2hhcGUuc29tZSgoc3Vic2hhcGUpID0+XG4gICAgaGl0VGVzdFJvdWdoU2hhcGUoc3Vic2hhcGUsIHJlbFgsIHJlbFksIHRocmVzaG9sZCksXG4gICk7XG59O1xuXG4vLyBSZXR1cm5zOlxuLy8gICAxLiB0aGUgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnRzICh4LCB5KSBwb3NpdGlvblxuLy8gICAyLiB0aGUgcG9pbnQgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQncyBjZW50ZXIgd2l0aCBwb3NpdGl2ZSAoeCwgeSlcbi8vICAgMy4gaGFsZiBlbGVtZW50IHdpZHRoXG4vLyAgIDQuIGhhbGYgZWxlbWVudCBoZWlnaHRcbi8vXG4vLyBOb3RlIHRoYXQgZm9yIGxpbmVhciBlbGVtZW50cyB0aGUgKHgsIHkpIHBvc2l0aW9uIGlzIG5vdCBhdCB0aGVcbi8vIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlaXIgYm91bmRhcnkuXG4vL1xuLy8gUmVjdGFuZ2xlcywgZGlhbW9uZHMgYW5kIGVsbGlwc2VzIGFyZSBzeW1tZXRyaWNhbCBvdmVyIGF4ZXMsXG4vLyBhbmQgb3RoZXIgZWxlbWVudHMgaGF2ZSBhIHJlY3Rhbmd1bGFyIGJvdW5kYXJ5LFxuLy8gc28gd2Ugb25seSBuZWVkIHRvIHBlcmZvcm0gaGl0IHRlc3RzIGZvciB0aGUgcG9zaXRpdmUgcXVhZHJhbnQuXG5jb25zdCBwb2ludFJlbGF0aXZlVG9FbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgcG9pbnRUdXBsZTogUG9pbnQsXG4pOiBbR0EuUG9pbnQsIEdBLlBvaW50LCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCBwb2ludCA9IEdBUG9pbnQuZnJvbShwb2ludFR1cGxlKTtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgZWxlbWVudENvb3JkcyA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgY2VudGVyID0gY29vcmRzQ2VudGVyKFt4MSwgeTEsIHgyLCB5Ml0pO1xuICAvLyBHQSBoYXMgYW5nbGUgb3JpZW50YXRpb24gb3Bwb3NpdGUgdG8gYHJvdGF0ZWBcbiAgY29uc3Qgcm90YXRlID0gR0FUcmFuc2Zvcm0ucm90YXRpb24oY2VudGVyLCBlbGVtZW50LmFuZ2xlKTtcbiAgY29uc3QgcG9pbnRSb3RhdGVkID0gR0FUcmFuc2Zvcm0uYXBwbHkocm90YXRlLCBwb2ludCk7XG4gIGNvbnN0IHBvaW50UmVsVG9DZW50ZXIgPSBHQS5zdWIocG9pbnRSb3RhdGVkLCBHQURpcmVjdGlvbi5mcm9tKGNlbnRlcikpO1xuICBjb25zdCBwb2ludFJlbFRvQ2VudGVyQWJzID0gR0FQb2ludC5hYnMocG9pbnRSZWxUb0NlbnRlcik7XG4gIGNvbnN0IGVsZW1lbnRQb3MgPSBHQS5vZmZzZXQoZWxlbWVudC54LCBlbGVtZW50LnkpO1xuICBjb25zdCBwb2ludFJlbFRvUG9zID0gR0Euc3ViKHBvaW50Um90YXRlZCwgZWxlbWVudFBvcyk7XG4gIGNvbnN0IFtheCwgYXksIGJ4LCBieV0gPSBlbGVtZW50Q29vcmRzO1xuICBjb25zdCBoYWxmV2lkdGggPSAoYnggLSBheCkgLyAyO1xuICBjb25zdCBoYWxmSGVpZ2h0ID0gKGJ5IC0gYXkpIC8gMjtcbiAgcmV0dXJuIFtwb2ludFJlbFRvUG9zLCBwb2ludFJlbFRvQ2VudGVyQWJzLCBoYWxmV2lkdGgsIGhhbGZIZWlnaHRdO1xufTtcblxuLy8gUmV0dXJucyBwb2ludCBpbiBhYnNvbHV0ZSBjb29yZGluYXRlc1xuZXhwb3J0IGNvbnN0IHBvaW50SW5BYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIC8vIFBvaW50IHJlbGF0aXZlIHRvIHRoZSBlbGVtZW50IHBvc2l0aW9uXG4gIHBvaW50OiBQb2ludCxcbik6IFBvaW50ID0+IHtcbiAgY29uc3QgW3gsIHldID0gcG9pbnQ7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGN4ID0gKHgyIC0geDEpIC8gMjtcbiAgY29uc3QgY3kgPSAoeTIgLSB5MSkgLyAyO1xuICBjb25zdCBbcm90YXRlZFgsIHJvdGF0ZWRZXSA9IHJvdGF0ZSh4LCB5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICByZXR1cm4gW2VsZW1lbnQueCArIHJvdGF0ZWRYLCBlbGVtZW50LnkgKyByb3RhdGVkWV07XG59O1xuXG5jb25zdCByZWxhdGl2aXphdGlvblRvRWxlbWVudENlbnRlciA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4pOiBHQS5UcmFuc2Zvcm0gPT4ge1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjZW50ZXIgPSBjb29yZHNDZW50ZXIoW3gxLCB5MSwgeDIsIHkyXSk7XG4gIC8vIEdBIGhhcyBhbmdsZSBvcmllbnRhdGlvbiBvcHBvc2l0ZSB0byBgcm90YXRlYFxuICBjb25zdCByb3RhdGUgPSBHQVRyYW5zZm9ybS5yb3RhdGlvbihjZW50ZXIsIGVsZW1lbnQuYW5nbGUpO1xuICBjb25zdCB0cmFuc2xhdGUgPSBHQS5yZXZlcnNlKFxuICAgIEdBVHJhbnNmb3JtLnRyYW5zbGF0aW9uKEdBRGlyZWN0aW9uLmZyb20oY2VudGVyKSksXG4gICk7XG4gIHJldHVybiBHQVRyYW5zZm9ybS5jb21wb3NlKHJvdGF0ZSwgdHJhbnNsYXRlKTtcbn07XG5cbmNvbnN0IGNvb3Jkc0NlbnRlciA9IChbYXgsIGF5LCBieCwgYnldOiBCb3VuZHMpOiBHQS5Qb2ludCA9PiB7XG4gIHJldHVybiBHQS5wb2ludCgoYXggKyBieCkgLyAyLCAoYXkgKyBieSkgLyAyKTtcbn07XG5cbi8vIFRoZSBmb2N1cyBkaXN0YW5jZSBpcyB0aGUgb3JpZW50ZWQgcmF0aW8gYmV0d2VlbiB0aGUgc2l6ZSBvZlxuLy8gdGhlIGBlbGVtZW50YCBhbmQgdGhlIFwiZm9jdXMgaW1hZ2VcIiBvZiB0aGUgZWxlbWVudCBvbiB3aGljaFxuLy8gYWxsIGZvY3VzIHBvaW50cyBsaWUsIHNvIGl0J3MgYSBudW1iZXIgYmV0d2VlbiAtMSBhbmQgMS5cbi8vIFRoZSBsaW5lIGdvaW5nIHRocm91Z2ggYGFgIGFuZCBgYmAgaXMgYSB0YW5nZW50IHRvIHRoZSBcImZvY3VzIGltYWdlXCJcbi8vIG9mIHRoZSBlbGVtZW50LlxuZXhwb3J0IGNvbnN0IGRldGVybWluZUZvY3VzRGlzdGFuY2UgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIC8vIFBvaW50IG9uIHRoZSBsaW5lLCBpbiBhYnNvbHV0ZSBjb29yZGluYXRlc1xuICBhOiBQb2ludCxcbiAgLy8gQW5vdGhlciBwb2ludCBvbiB0aGUgbGluZSwgaW4gYWJzb2x1dGUgY29vcmRpbmF0ZXMgKGNsb3NlciB0byBlbGVtZW50KVxuICBiOiBQb2ludCxcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IHJlbGF0ZVRvQ2VudGVyID0gcmVsYXRpdml6YXRpb25Ub0VsZW1lbnRDZW50ZXIoZWxlbWVudCk7XG4gIGNvbnN0IGFSZWwgPSBHQVRyYW5zZm9ybS5hcHBseShyZWxhdGVUb0NlbnRlciwgR0FQb2ludC5mcm9tKGEpKTtcbiAgY29uc3QgYlJlbCA9IEdBVHJhbnNmb3JtLmFwcGx5KHJlbGF0ZVRvQ2VudGVyLCBHQVBvaW50LmZyb20oYikpO1xuICBjb25zdCBsaW5lID0gR0FMaW5lLnRocm91Z2goYVJlbCwgYlJlbCk7XG4gIGNvbnN0IHEgPSBlbGVtZW50LmhlaWdodCAvIGVsZW1lbnQud2lkdGg7XG4gIGNvbnN0IGh3aWR0aCA9IGVsZW1lbnQud2lkdGggLyAyO1xuICBjb25zdCBoaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICBjb25zdCBuID0gbGluZVsyXTtcbiAgY29uc3QgbSA9IGxpbmVbM107XG4gIGNvbnN0IGMgPSBsaW5lWzFdO1xuICBjb25zdCBtYWJzID0gTWF0aC5hYnMobSk7XG4gIGNvbnN0IG5hYnMgPSBNYXRoLmFicyhuKTtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIHJldHVybiBjIC8gKGh3aWR0aCAqIChuYWJzICsgcSAqIG1hYnMpKTtcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgICAgcmV0dXJuIG1hYnMgPCBuYWJzID8gYyAvIChuYWJzICogaHdpZHRoKSA6IGMgLyAobWFicyAqIGhoZWlnaHQpO1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICByZXR1cm4gYyAvIChod2lkdGggKiBNYXRoLnNxcnQobiAqKiAyICsgcSAqKiAyICogbSAqKiAyKSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkZXRlcm1pbmVGb2N1c1BvaW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICAvLyBUaGUgb3JpZW50ZWQsIHJlbGF0aXZlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBvZiBgZWxlbWVudGAgb2YgdGhlXG4gIC8vIHJldHVybmVkIGZvY3VzUG9pbnRcbiAgZm9jdXM6IG51bWJlcixcbiAgYWRqZWNlbnRQb2ludDogUG9pbnQsXG4pOiBQb2ludCA9PiB7XG4gIGlmIChmb2N1cyA9PT0gMCkge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgY2VudGVyID0gY29vcmRzQ2VudGVyKFt4MSwgeTEsIHgyLCB5Ml0pO1xuICAgIHJldHVybiBHQVBvaW50LnRvVHVwbGUoY2VudGVyKTtcbiAgfVxuICBjb25zdCByZWxhdGVUb0NlbnRlciA9IHJlbGF0aXZpemF0aW9uVG9FbGVtZW50Q2VudGVyKGVsZW1lbnQpO1xuICBjb25zdCBhZGplY2VudFBvaW50UmVsID0gR0FUcmFuc2Zvcm0uYXBwbHkoXG4gICAgcmVsYXRlVG9DZW50ZXIsXG4gICAgR0FQb2ludC5mcm9tKGFkamVjZW50UG9pbnQpLFxuICApO1xuICBjb25zdCByZXZlcnNlUmVsYXRlVG9DZW50ZXIgPSBHQS5yZXZlcnNlKHJlbGF0ZVRvQ2VudGVyKTtcbiAgbGV0IHBvaW50O1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICBwb2ludCA9IGZpbmRGb2N1c1BvaW50Rm9yUmVjdGFuZ3VsYXJzKGVsZW1lbnQsIGZvY3VzLCBhZGplY2VudFBvaW50UmVsKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICBwb2ludCA9IGZpbmRGb2N1c1BvaW50Rm9yRWxsaXBzZShlbGVtZW50LCBmb2N1cywgYWRqZWNlbnRQb2ludFJlbCk7XG4gICAgICBicmVhaztcbiAgfVxuICByZXR1cm4gR0FQb2ludC50b1R1cGxlKEdBVHJhbnNmb3JtLmFwcGx5KHJldmVyc2VSZWxhdGVUb0NlbnRlciwgcG9pbnQpKTtcbn07XG5cbi8vIFJldHVybnMgMiBvciAwIGludGVyc2VjdGlvbiBwb2ludHMgYmV0d2VlbiBsaW5lIGdvaW5nIHRocm91Z2ggYGFgIGFuZCBgYmBcbi8vIGFuZCB0aGUgYGVsZW1lbnRgLCBpbiBhc2NlbmRpbmcgb3JkZXIgb2YgZGlzdGFuY2UgZnJvbSBgYWAuXG5leHBvcnQgY29uc3QgaW50ZXJzZWN0RWxlbWVudFdpdGhMaW5lID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICAvLyBQb2ludCBvbiB0aGUgbGluZSwgaW4gYWJzb2x1dGUgY29vcmRpbmF0ZXNcbiAgYTogUG9pbnQsXG4gIC8vIEFub3RoZXIgcG9pbnQgb24gdGhlIGxpbmUsIGluIGFic29sdXRlIGNvb3JkaW5hdGVzXG4gIGI6IFBvaW50LFxuICAvLyBJZiBnaXZlbiwgdGhlIGVsZW1lbnQgaXMgaW5mbGF0ZWQgYnkgdGhpcyB2YWx1ZVxuICBnYXA6IG51bWJlciA9IDAsXG4pOiBQb2ludFtdID0+IHtcbiAgY29uc3QgcmVsYXRlVG9DZW50ZXIgPSByZWxhdGl2aXphdGlvblRvRWxlbWVudENlbnRlcihlbGVtZW50KTtcbiAgY29uc3QgYVJlbCA9IEdBVHJhbnNmb3JtLmFwcGx5KHJlbGF0ZVRvQ2VudGVyLCBHQVBvaW50LmZyb20oYSkpO1xuICBjb25zdCBiUmVsID0gR0FUcmFuc2Zvcm0uYXBwbHkocmVsYXRlVG9DZW50ZXIsIEdBUG9pbnQuZnJvbShiKSk7XG4gIGNvbnN0IGxpbmUgPSBHQUxpbmUudGhyb3VnaChhUmVsLCBiUmVsKTtcbiAgY29uc3QgcmV2ZXJzZVJlbGF0ZVRvQ2VudGVyID0gR0EucmV2ZXJzZShyZWxhdGVUb0NlbnRlcik7XG4gIGNvbnN0IGludGVyc2VjdGlvbnMgPSBnZXRTb3J0ZWRFbGVtZW50TGluZUludGVyc2VjdGlvbnMoXG4gICAgZWxlbWVudCxcbiAgICBsaW5lLFxuICAgIGFSZWwsXG4gICAgZ2FwLFxuICApO1xuICByZXR1cm4gaW50ZXJzZWN0aW9ucy5tYXAoKHBvaW50KSA9PlxuICAgIEdBUG9pbnQudG9UdXBsZShHQVRyYW5zZm9ybS5hcHBseShyZXZlcnNlUmVsYXRlVG9DZW50ZXIsIHBvaW50KSksXG4gICk7XG59O1xuXG5jb25zdCBnZXRTb3J0ZWRFbGVtZW50TGluZUludGVyc2VjdGlvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIC8vIFJlbGF0aXZlIHRvIGVsZW1lbnQgY2VudGVyXG4gIGxpbmU6IEdBLkxpbmUsXG4gIC8vIFJlbGF0aXZlIHRvIGVsZW1lbnQgY2VudGVyXG4gIG5lYXJQb2ludDogR0EuUG9pbnQsXG4gIGdhcDogbnVtYmVyID0gMCxcbik6IEdBLlBvaW50W10gPT4ge1xuICBsZXQgaW50ZXJzZWN0aW9uczogR0EuUG9pbnRbXTtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgICAgY29uc3QgY29ybmVycyA9IGdldENvcm5lcnMoZWxlbWVudCk7XG4gICAgICBpbnRlcnNlY3Rpb25zID0gY29ybmVyc1xuICAgICAgICAuZmxhdE1hcCgocG9pbnQsIGkpID0+IHtcbiAgICAgICAgICBjb25zdCBlZGdlOiBbR0EuUG9pbnQsIEdBLlBvaW50XSA9IFtwb2ludCwgY29ybmVyc1soaSArIDEpICUgNF1dO1xuICAgICAgICAgIHJldHVybiBpbnRlcnNlY3RTZWdtZW50KGxpbmUsIG9mZnNldFNlZ21lbnQoZWRnZSwgZ2FwKSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jb25jYXQoXG4gICAgICAgICAgY29ybmVycy5mbGF0TWFwKChwb2ludCkgPT4gZ2V0Q2lyY2xlSW50ZXJzZWN0aW9ucyhwb2ludCwgZ2FwLCBsaW5lKSksXG4gICAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgaW50ZXJzZWN0aW9ucyA9IGdldEVsbGlwc2VJbnRlcnNlY3Rpb25zKGVsZW1lbnQsIGdhcCwgbGluZSk7XG4gICAgICBicmVhaztcbiAgfVxuICBpZiAoaW50ZXJzZWN0aW9ucy5sZW5ndGggPCAyKSB7XG4gICAgLy8gSWdub3JlIHRoZSBcImVkZ2VcIiBjYXNlIG9mIG9ubHkgaW50ZXJzZWN0aW5nIHdpdGggYSBzaW5nbGUgY29ybmVyXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHNvcnRlZEludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3Rpb25zLnNvcnQoXG4gICAgKGkxLCBpMikgPT5cbiAgICAgIEdBUG9pbnQuZGlzdGFuY2UoaTEsIG5lYXJQb2ludCkgLSBHQVBvaW50LmRpc3RhbmNlKGkyLCBuZWFyUG9pbnQpLFxuICApO1xuICByZXR1cm4gW1xuICAgIHNvcnRlZEludGVyc2VjdGlvbnNbMF0sXG4gICAgc29ydGVkSW50ZXJzZWN0aW9uc1tzb3J0ZWRJbnRlcnNlY3Rpb25zLmxlbmd0aCAtIDFdLFxuICBdO1xufTtcblxuY29uc3QgZ2V0Q29ybmVycyA9IChcbiAgZWxlbWVudDpcbiAgICB8IEV4Y2FsaWRyYXdSZWN0YW5nbGVFbGVtZW50XG4gICAgfCBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50XG4gICAgfCBFeGNhbGlkcmF3RGlhbW9uZEVsZW1lbnRcbiAgICB8IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgc2NhbGU6IG51bWJlciA9IDEsXG4pOiBHQS5Qb2ludFtdID0+IHtcbiAgY29uc3QgaHggPSAoc2NhbGUgKiBlbGVtZW50LndpZHRoKSAvIDI7XG4gIGNvbnN0IGh5ID0gKHNjYWxlICogZWxlbWVudC5oZWlnaHQpIC8gMjtcbiAgc3dpdGNoIChlbGVtZW50LnR5cGUpIHtcbiAgICBjYXNlIFwicmVjdGFuZ2xlXCI6XG4gICAgY2FzZSBcImltYWdlXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICAgIHJldHVybiBbXG4gICAgICAgIEdBLnBvaW50KGh4LCBoeSksXG4gICAgICAgIEdBLnBvaW50KGh4LCAtaHkpLFxuICAgICAgICBHQS5wb2ludCgtaHgsIC1oeSksXG4gICAgICAgIEdBLnBvaW50KC1oeCwgaHkpLFxuICAgICAgXTtcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgR0EucG9pbnQoMCwgaHkpLFxuICAgICAgICBHQS5wb2ludChoeCwgMCksXG4gICAgICAgIEdBLnBvaW50KDAsIC1oeSksXG4gICAgICAgIEdBLnBvaW50KC1oeCwgMCksXG4gICAgICBdO1xuICB9XG59O1xuXG4vLyBSZXR1cm5zIGludGVyc2VjdGlvbiBvZiBgbGluZWAgd2l0aCBgc2VnbWVudGAsIHdpdGggYHNlZ21lbnRgIG1vdmVkIGJ5XG4vLyBgZ2FwYCBpbiBpdHMgcG9sYXIgZGlyZWN0aW9uLlxuLy8gSWYgaW50ZXJzZWN0aW9uIGNvaW5jaWRlcyB3aXRoIHNlY29uZCBzZWdtZW50IHBvaW50IHJldHVybnMgZW1wdHkgYXJyYXkuXG5jb25zdCBpbnRlcnNlY3RTZWdtZW50ID0gKFxuICBsaW5lOiBHQS5MaW5lLFxuICBzZWdtZW50OiBbR0EuUG9pbnQsIEdBLlBvaW50XSxcbik6IEdBLlBvaW50W10gPT4ge1xuICBjb25zdCBbYSwgYl0gPSBzZWdtZW50O1xuICBjb25zdCBhRGlzdCA9IEdBUG9pbnQuZGlzdGFuY2VUb0xpbmUoYSwgbGluZSk7XG4gIGNvbnN0IGJEaXN0ID0gR0FQb2ludC5kaXN0YW5jZVRvTGluZShiLCBsaW5lKTtcbiAgaWYgKGFEaXN0ICogYkRpc3QgPj0gMCkge1xuICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gaXMgb3V0c2lkZSBzZWdtZW50IGAoYSwgYilgXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBbR0FQb2ludC5pbnRlcnNlY3QobGluZSwgR0FMaW5lLnRocm91Z2goYSwgYikpXTtcbn07XG5cbmNvbnN0IG9mZnNldFNlZ21lbnQgPSAoXG4gIHNlZ21lbnQ6IFtHQS5Qb2ludCwgR0EuUG9pbnRdLFxuICBkaXN0YW5jZTogbnVtYmVyLFxuKTogW0dBLlBvaW50LCBHQS5Qb2ludF0gPT4ge1xuICBjb25zdCBbYSwgYl0gPSBzZWdtZW50O1xuICBjb25zdCBvZmZzZXQgPSBHQVRyYW5zZm9ybS50cmFuc2xhdGlvbk9ydGhvZ29uYWwoXG4gICAgR0FEaXJlY3Rpb24uZnJvbVRvKGEsIGIpLFxuICAgIGRpc3RhbmNlLFxuICApO1xuICByZXR1cm4gW0dBVHJhbnNmb3JtLmFwcGx5KG9mZnNldCwgYSksIEdBVHJhbnNmb3JtLmFwcGx5KG9mZnNldCwgYildO1xufTtcblxuY29uc3QgZ2V0RWxsaXBzZUludGVyc2VjdGlvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGxpcHNlRWxlbWVudCxcbiAgZ2FwOiBudW1iZXIsXG4gIGxpbmU6IEdBLkxpbmUsXG4pOiBHQS5Qb2ludFtdID0+IHtcbiAgY29uc3QgYSA9IGVsZW1lbnQud2lkdGggLyAyICsgZ2FwO1xuICBjb25zdCBiID0gZWxlbWVudC5oZWlnaHQgLyAyICsgZ2FwO1xuICBjb25zdCBtID0gbGluZVsyXTtcbiAgY29uc3QgbiA9IGxpbmVbM107XG4gIGNvbnN0IGMgPSBsaW5lWzFdO1xuICBjb25zdCBzcXVhcmVzID0gYSAqIGEgKiBtICogbSArIGIgKiBiICogbiAqIG47XG4gIGNvbnN0IGRpc2NyID0gc3F1YXJlcyAtIGMgKiBjO1xuICBpZiAoc3F1YXJlcyA9PT0gMCB8fCBkaXNjciA8PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IGRpc2NyUm9vdCA9IE1hdGguc3FydChkaXNjcik7XG4gIGNvbnN0IHhuID0gLWEgKiBhICogbSAqIGM7XG4gIGNvbnN0IHluID0gLWIgKiBiICogbiAqIGM7XG4gIHJldHVybiBbXG4gICAgR0EucG9pbnQoXG4gICAgICAoeG4gKyBhICogYiAqIG4gKiBkaXNjclJvb3QpIC8gc3F1YXJlcyxcbiAgICAgICh5biAtIGEgKiBiICogbSAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzLFxuICAgICksXG4gICAgR0EucG9pbnQoXG4gICAgICAoeG4gLSBhICogYiAqIG4gKiBkaXNjclJvb3QpIC8gc3F1YXJlcyxcbiAgICAgICh5biArIGEgKiBiICogbSAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzLFxuICAgICksXG4gIF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q2lyY2xlSW50ZXJzZWN0aW9ucyA9IChcbiAgY2VudGVyOiBHQS5Qb2ludCxcbiAgcmFkaXVzOiBudW1iZXIsXG4gIGxpbmU6IEdBLkxpbmUsXG4pOiBHQS5Qb2ludFtdID0+IHtcbiAgaWYgKHJhZGl1cyA9PT0gMCkge1xuICAgIHJldHVybiBHQVBvaW50LmRpc3RhbmNlVG9MaW5lKGxpbmUsIGNlbnRlcikgPT09IDAgPyBbY2VudGVyXSA6IFtdO1xuICB9XG4gIGNvbnN0IG0gPSBsaW5lWzJdO1xuICBjb25zdCBuID0gbGluZVszXTtcbiAgY29uc3QgYyA9IGxpbmVbMV07XG4gIGNvbnN0IFthLCBiXSA9IEdBUG9pbnQudG9UdXBsZShjZW50ZXIpO1xuICBjb25zdCByID0gcmFkaXVzO1xuICBjb25zdCBzcXVhcmVzID0gbSAqIG0gKyBuICogbjtcbiAgY29uc3QgZGlzY3IgPSByICogciAqIHNxdWFyZXMgLSAobSAqIGEgKyBuICogYiArIGMpICoqIDI7XG4gIGlmIChzcXVhcmVzID09PSAwIHx8IGRpc2NyIDw9IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGlzY3JSb290ID0gTWF0aC5zcXJ0KGRpc2NyKTtcbiAgY29uc3QgeG4gPSBhICogbiAqIG4gLSBiICogbSAqIG4gLSBtICogYztcbiAgY29uc3QgeW4gPSBiICogbSAqIG0gLSBhICogbSAqIG4gLSBuICogYztcblxuICByZXR1cm4gW1xuICAgIEdBLnBvaW50KCh4biArIG4gKiBkaXNjclJvb3QpIC8gc3F1YXJlcywgKHluIC0gbSAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzKSxcbiAgICBHQS5wb2ludCgoeG4gLSBuICogZGlzY3JSb290KSAvIHNxdWFyZXMsICh5biArIG0gKiBkaXNjclJvb3QpIC8gc3F1YXJlcyksXG4gIF07XG59O1xuXG4vLyBUaGUgZm9jdXMgcG9pbnQgaXMgdGhlIHRhbmdlbnQgcG9pbnQgb2YgdGhlIFwiZm9jdXMgaW1hZ2VcIiBvZiB0aGVcbi8vIGBlbGVtZW50YCwgd2hlcmUgdGhlIHRhbmdlbnQgZ29lcyB0aHJvdWdoIGBwb2ludGAuXG5leHBvcnQgY29uc3QgZmluZEZvY3VzUG9pbnRGb3JFbGxpcHNlID0gKFxuICBlbGxpcHNlOiBFeGNhbGlkcmF3RWxsaXBzZUVsZW1lbnQsXG4gIC8vIEJldHdlZW4gLTEgYW5kIDEgKG5vdCAwKSB0aGUgcmVsYXRpdmUgc2l6ZSBvZiB0aGUgXCJmb2N1cyBpbWFnZVwiIG9mXG4gIC8vIHRoZSBlbGVtZW50IG9uIHdoaWNoIHRoZSBmb2N1cyBwb2ludCBsaWVzXG4gIHJlbGF0aXZlRGlzdGFuY2U6IG51bWJlcixcbiAgLy8gVGhlIHBvaW50IGZvciB3aGljaCB3ZSdyZSB0cnlpbmcgdG8gZmluZCB0aGUgZm9jdXMgcG9pbnQsIHJlbGF0aXZlXG4gIC8vIHRvIHRoZSBlbGxpcHNlIGNlbnRlci5cbiAgcG9pbnQ6IEdBLlBvaW50LFxuKTogR0EuUG9pbnQgPT4ge1xuICBjb25zdCByZWxhdGl2ZURpc3RhbmNlQWJzID0gTWF0aC5hYnMocmVsYXRpdmVEaXN0YW5jZSk7XG4gIGNvbnN0IGEgPSAoZWxsaXBzZS53aWR0aCAqIHJlbGF0aXZlRGlzdGFuY2VBYnMpIC8gMjtcbiAgY29uc3QgYiA9IChlbGxpcHNlLmhlaWdodCAqIHJlbGF0aXZlRGlzdGFuY2VBYnMpIC8gMjtcblxuICBjb25zdCBvcmllbnRhdGlvbiA9IE1hdGguc2lnbihyZWxhdGl2ZURpc3RhbmNlKTtcbiAgY29uc3QgW3B4LCBweW9dID0gR0FQb2ludC50b1R1cGxlKHBvaW50KTtcblxuICAvLyBUaGUgY2FsY3VsYXRpb24gYmVsb3cgY2FuJ3QgaGFuZGxlIHB5ID0gMFxuICBjb25zdCBweSA9IHB5byA9PT0gMCA/IDAuMDAwMSA6IHB5bztcblxuICBjb25zdCBzcXVhcmVzID0gcHggKiogMiAqIGIgKiogMiArIHB5ICoqIDIgKiBhICoqIDI7XG4gIC8vIFRhbmdlbnQgbXggKyBueSArIDEgPSAwXG4gIGNvbnN0IG0gPVxuICAgICgtcHggKiBiICoqIDIgK1xuICAgICAgb3JpZW50YXRpb24gKiBweSAqIE1hdGguc3FydChNYXRoLm1heCgwLCBzcXVhcmVzIC0gYSAqKiAyICogYiAqKiAyKSkpIC9cbiAgICBzcXVhcmVzO1xuXG4gIGNvbnN0IG4gPSAoLW0gKiBweCAtIDEpIC8gcHk7XG5cbiAgY29uc3QgeCA9IC0oYSAqKiAyICogbSkgLyAobiAqKiAyICogYiAqKiAyICsgbSAqKiAyICogYSAqKiAyKTtcbiAgcmV0dXJuIEdBLnBvaW50KHgsICgtbSAqIHggLSAxKSAvIG4pO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRGb2N1c1BvaW50Rm9yUmVjdGFuZ3VsYXJzID0gKFxuICBlbGVtZW50OlxuICAgIHwgRXhjYWxpZHJhd1JlY3RhbmdsZUVsZW1lbnRcbiAgICB8IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRcbiAgICB8IEV4Y2FsaWRyYXdEaWFtb25kRWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAvLyBCZXR3ZWVuIC0xIGFuZCAxIGZvciBob3cgZmFyIGF3YXkgc2hvdWxkIHRoZSBmb2N1cyBwb2ludCBiZSByZWxhdGl2ZVxuICAvLyB0byB0aGUgc2l6ZSBvZiB0aGUgZWxlbWVudC4gU2lnbiBkZXRlcm1pbmVzIG9yaWVudGF0aW9uLlxuICByZWxhdGl2ZURpc3RhbmNlOiBudW1iZXIsXG4gIC8vIFRoZSBwb2ludCBmb3Igd2hpY2ggd2UncmUgdHJ5aW5nIHRvIGZpbmQgdGhlIGZvY3VzIHBvaW50LCByZWxhdGl2ZVxuICAvLyB0byB0aGUgZWxlbWVudCBjZW50ZXIuXG4gIHBvaW50OiBHQS5Qb2ludCxcbik6IEdBLlBvaW50ID0+IHtcbiAgY29uc3QgcmVsYXRpdmVEaXN0YW5jZUFicyA9IE1hdGguYWJzKHJlbGF0aXZlRGlzdGFuY2UpO1xuICBjb25zdCBvcmllbnRhdGlvbiA9IE1hdGguc2lnbihyZWxhdGl2ZURpc3RhbmNlKTtcbiAgY29uc3QgY29ybmVycyA9IGdldENvcm5lcnMoZWxlbWVudCwgcmVsYXRpdmVEaXN0YW5jZUFicyk7XG5cbiAgbGV0IG1heERpc3RhbmNlID0gMDtcbiAgbGV0IHRhbmdlbnRQb2ludDogbnVsbCB8IEdBLlBvaW50ID0gbnVsbDtcbiAgY29ybmVycy5mb3JFYWNoKChjb3JuZXIpID0+IHtcbiAgICBjb25zdCBkaXN0YW5jZSA9IG9yaWVudGF0aW9uICogR0FMaW5lLnRocm91Z2gocG9pbnQsIGNvcm5lcilbMV07XG4gICAgaWYgKGRpc3RhbmNlID4gbWF4RGlzdGFuY2UpIHtcbiAgICAgIG1heERpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICB0YW5nZW50UG9pbnQgPSBjb3JuZXI7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHRhbmdlbnRQb2ludCE7XG59O1xuXG5jb25zdCBwb2ludEluQmV6aWVyRXF1YXRpb24gPSAoXG4gIHAwOiBQb2ludCxcbiAgcDE6IFBvaW50LFxuICBwMjogUG9pbnQsXG4gIHAzOiBQb2ludCxcbiAgW214LCBteV06IFBvaW50LFxuICBsaW5lVGhyZXNob2xkOiBudW1iZXIsXG4pID0+IHtcbiAgLy8gQih0KSA9IHAwICogKDEtdCleMyArIDNwMSAqIHQgKiAoMS10KV4yICsgM3AyICogdF4yICogKDEtdCkgKyBwMyAqIHReM1xuICBjb25zdCBlcXVhdGlvbiA9ICh0OiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PlxuICAgIE1hdGgucG93KDEgLSB0LCAzKSAqIHAzW2lkeF0gK1xuICAgIDMgKiB0ICogTWF0aC5wb3coMSAtIHQsIDIpICogcDJbaWR4XSArXG4gICAgMyAqIE1hdGgucG93KHQsIDIpICogKDEgLSB0KSAqIHAxW2lkeF0gK1xuICAgIHAwW2lkeF0gKiBNYXRoLnBvdyh0LCAzKTtcblxuICAvLyBnbyB0aHJvdWdoIHQgaW4gaW5jcmVtZW50cyBvZiAwLjAxXG4gIGxldCB0ID0gMDtcbiAgd2hpbGUgKHQgPD0gMS4wKSB7XG4gICAgY29uc3QgdHggPSBlcXVhdGlvbih0LCAwKTtcbiAgICBjb25zdCB0eSA9IGVxdWF0aW9uKHQsIDEpO1xuXG4gICAgY29uc3QgZGlmZiA9IE1hdGguc3FydChNYXRoLnBvdyh0eCAtIG14LCAyKSArIE1hdGgucG93KHR5IC0gbXksIDIpKTtcblxuICAgIGlmIChkaWZmIDwgbGluZVRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdCArPSAwLjAxO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgaGl0VGVzdEN1cnZlSW5zaWRlID0gKFxuICBkcmF3YWJsZTogRHJhd2FibGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICByb3VuZG5lc3M6IFN0cm9rZVJvdW5kbmVzcyxcbikgPT4ge1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoZHJhd2FibGUpO1xuICBjb25zdCBwb2ludHM6IE11dGFibGU8UG9pbnQ+W10gPSBbXTtcbiAgbGV0IG9kZCA9IGZhbHNlOyAvLyBzZWxlY3Qgb25lIGxpbmUgb3V0IG9mIGRvdWJsZSBsaW5lc1xuICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcHMpIHtcbiAgICBpZiAob3BlcmF0aW9uLm9wID09PSBcIm1vdmVcIikge1xuICAgICAgb2RkID0gIW9kZDtcbiAgICAgIGlmIChvZGQpIHtcbiAgICAgICAgcG9pbnRzLnB1c2goW29wZXJhdGlvbi5kYXRhWzBdLCBvcGVyYXRpb24uZGF0YVsxXV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLm9wID09PSBcImJjdXJ2ZVRvXCIpIHtcbiAgICAgIGlmIChvZGQpIHtcbiAgICAgICAgcG9pbnRzLnB1c2goW29wZXJhdGlvbi5kYXRhWzBdLCBvcGVyYXRpb24uZGF0YVsxXV0pO1xuICAgICAgICBwb2ludHMucHVzaChbb3BlcmF0aW9uLmRhdGFbMl0sIG9wZXJhdGlvbi5kYXRhWzNdXSk7XG4gICAgICAgIHBvaW50cy5wdXNoKFtvcGVyYXRpb24uZGF0YVs0XSwgb3BlcmF0aW9uLmRhdGFbNV1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG9wZXJhdGlvbi5vcCA9PT0gXCJsaW5lVG9cIikge1xuICAgICAgaWYgKG9kZCkge1xuICAgICAgICBwb2ludHMucHVzaChbb3BlcmF0aW9uLmRhdGFbMF0sIG9wZXJhdGlvbi5kYXRhWzFdXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGlmIChwb2ludHMubGVuZ3RoID49IDQpIHtcbiAgICBpZiAocm91bmRuZXNzID09PSBcInNoYXJwXCIpIHtcbiAgICAgIHJldHVybiBpc1BvaW50SW5Qb2x5Z29uKHBvaW50cywgeCwgeSk7XG4gICAgfVxuICAgIGNvbnN0IHBvbHlnb25Qb2ludHMgPSBwb2ludHNPbkJlemllckN1cnZlcyhwb2ludHMsIDEwLCA1KTtcbiAgICByZXR1cm4gaXNQb2ludEluUG9seWdvbihwb2x5Z29uUG9pbnRzLCB4LCB5KTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBoaXRUZXN0Um91Z2hTaGFwZSA9IChcbiAgZHJhd2FibGU6IERyYXdhYmxlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgbGluZVRocmVzaG9sZDogbnVtYmVyLFxuKSA9PiB7XG4gIC8vIHJlYWQgb3BlcmF0aW9ucyBmcm9tIGZpcnN0IG9wU2V0XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhkcmF3YWJsZSk7XG5cbiAgLy8gc2V0IHN0YXJ0IHBvc2l0aW9uIGFzICgwLDApIGp1c3QgaW4gY2FzZVxuICAvLyBtb3ZlIG9wZXJhdGlvbiBkb2VzIG5vdCBleGlzdCAodW5saWtlbHkgYnV0IGl0IGlzIHdvcnRoIHNhZmVrZWVwaW5nIGl0KVxuICBsZXQgY3VycmVudFA6IFBvaW50ID0gWzAsIDBdO1xuXG4gIHJldHVybiBvcHMuc29tZSgoeyBvcCwgZGF0YSB9LCBpZHgpID0+IHtcbiAgICAvLyBUaGVyZSBhcmUgb25seSBmb3VyIG9wZXJhdGlvbiB0eXBlczpcbiAgICAvLyBtb3ZlLCBiY3VydmVUbywgbGluZVRvLCBhbmQgY3VydmVUb1xuICAgIGlmIChvcCA9PT0gXCJtb3ZlXCIpIHtcbiAgICAgIC8vIGNoYW5nZSBzdGFydGluZyBwb2ludFxuICAgICAgY3VycmVudFAgPSBkYXRhIGFzIHVua25vd24gYXMgUG9pbnQ7XG4gICAgICAvLyBtb3ZlIG9wZXJhdGlvbiBkb2VzIG5vdCBkcmF3IGFueXRoaW5nOyBzbywgaXQgYWx3YXlzXG4gICAgICAvLyByZXR1cm5zIGZhbHNlXG4gICAgfSBlbHNlIGlmIChvcCA9PT0gXCJiY3VydmVUb1wiKSB7XG4gICAgICAvLyBjcmVhdGUgcG9pbnRzIGZyb20gYmV6aWVyIGN1cnZlXG4gICAgICAvLyBiZXppZXIgY3VydmUgc3RvcmVzIGRhdGEgYXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdGhyZWUgcG9zaXRpb25zXG4gICAgICAvLyBbeDEsIHkxLCB4MiwgeTIsIHgzLCB5M11cbiAgICAgIGNvbnN0IHAxID0gW2RhdGFbMF0sIGRhdGFbMV1dIGFzIFBvaW50O1xuICAgICAgY29uc3QgcDIgPSBbZGF0YVsyXSwgZGF0YVszXV0gYXMgUG9pbnQ7XG4gICAgICBjb25zdCBwMyA9IFtkYXRhWzRdLCBkYXRhWzVdXSBhcyBQb2ludDtcblxuICAgICAgY29uc3QgcDAgPSBjdXJyZW50UDtcbiAgICAgIGN1cnJlbnRQID0gcDM7XG5cbiAgICAgIC8vIGNoZWNrIGlmIHBvaW50cyBhcmUgb24gdGhlIGN1cnZlXG4gICAgICAvLyBjdWJpYyBiZXppZXIgY3VydmVzIHJlcXVpcmUgZm91ciBwYXJhbWV0ZXJzXG4gICAgICAvLyB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZSBsYXN0IHN0b3JlZCBwb3NpdGlvbiAocDApXG4gICAgICBjb25zdCByZXRWYWwgPSBwb2ludEluQmV6aWVyRXF1YXRpb24oXG4gICAgICAgIHAwLFxuICAgICAgICBwMSxcbiAgICAgICAgcDIsXG4gICAgICAgIHAzLFxuICAgICAgICBbeCwgeV0sXG4gICAgICAgIGxpbmVUaHJlc2hvbGQsXG4gICAgICApO1xuXG4gICAgICAvLyBzZXQgZW5kIHBvaW50IG9mIGJlemllciBjdXJ2ZSBhcyB0aGUgbmV3IHN0YXJ0aW5nIHBvaW50IGZvclxuICAgICAgLy8gdXBjb21pbmcgb3BlcmF0aW9ucyBhcyBlYWNoIG9wZXJhdGlvbiBpcyBiYXNlZCBvbiB0aGUgbGFzdCBkcmF3blxuICAgICAgLy8gcG9zaXRpb24gb2YgdGhlIHByZXZpb3VzIG9wZXJhdGlvblxuICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9IGVsc2UgaWYgKG9wID09PSBcImxpbmVUb1wiKSB7XG4gICAgICByZXR1cm4gaGl0VGVzdEN1cnZlSW5zaWRlKGRyYXdhYmxlLCB4LCB5LCBcInNoYXJwXCIpO1xuICAgIH0gZWxzZSBpZiAob3AgPT09IFwicWN1cnZlVG9cIikge1xuICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICAgIGNvbnNvbGUud2FybihcInFjdXJ2ZVRvIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXRcIik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/collision.ts\n");
|
|
3408
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindingBorderTest\": () => (/* binding */ bindingBorderTest),\n/* harmony export */ \"determineFocusDistance\": () => (/* binding */ determineFocusDistance),\n/* harmony export */ \"determineFocusPoint\": () => (/* binding */ determineFocusPoint),\n/* harmony export */ \"distanceToBindableElement\": () => (/* binding */ distanceToBindableElement),\n/* harmony export */ \"findFocusPointForEllipse\": () => (/* binding */ findFocusPointForEllipse),\n/* harmony export */ \"findFocusPointForRectangulars\": () => (/* binding */ findFocusPointForRectangulars),\n/* harmony export */ \"getCircleIntersections\": () => (/* binding */ getCircleIntersections),\n/* harmony export */ \"hitTest\": () => (/* binding */ hitTest),\n/* harmony export */ \"intersectElementWithLine\": () => (/* binding */ intersectElementWithLine),\n/* harmony export */ \"isHittingElementBoundingBoxWithoutHittingElement\": () => (/* binding */ isHittingElementBoundingBoxWithoutHittingElement),\n/* harmony export */ \"isHittingElementNotConsideringBoundingBox\": () => (/* binding */ isHittingElementNotConsideringBoundingBox),\n/* harmony export */ \"isPointHittingElementBoundingBox\": () => (/* binding */ isPointHittingElementBoundingBox),\n/* harmony export */ \"maxBindingGap\": () => (/* binding */ maxBindingGap),\n/* harmony export */ \"pointInAbsoluteCoords\": () => (/* binding */ pointInAbsoluteCoords)\n/* harmony export */ });\n/* harmony import */ var _ga__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../ga */ \"../../ga.ts\");\n/* harmony import */ var _gapoints__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../gapoints */ \"../../gapoints.ts\");\n/* harmony import */ var _gadirections__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../gadirections */ \"../../gadirections.ts\");\n/* harmony import */ var _galines__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../galines */ \"../../galines.ts\");\n/* harmony import */ var _gatransforms__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../gatransforms */ \"../../gatransforms.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var points_on_curve__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! points-on-curve */ \"../../../node_modules/points-on-curve/lib/index.js\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _transformHandles__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./transformHandles */ \"../../element/transformHandles.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst isElementDraggableFromInside = (element) => {\n if (element.type === \"arrow\") {\n return false;\n }\n if (element.type === \"freedraw\") {\n return true;\n }\n const isDraggableFromInside = !(0,_utils__WEBPACK_IMPORTED_MODULE_11__.isTransparent)(element.backgroundColor) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.hasBoundTextElement)(element);\n if (element.type === \"line\") {\n return isDraggableFromInside && (0,_math__WEBPACK_IMPORTED_MODULE_5__.isPathALoop)(element.points);\n }\n return isDraggableFromInside || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isImageElement)(element);\n};\nconst hitTest = (element, appState, x, y) => {\n // How many pixels off the shape boundary we still consider a hit\n const threshold = 10 / appState.zoom.value;\n const point = [x, y];\n if (isElementSelected(appState, element) &&\n (0,_transformHandles__WEBPACK_IMPORTED_MODULE_12__.shouldShowBoundingBox)([element], appState)) {\n return isPointHittingElementBoundingBox(element, point, threshold);\n }\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_13__.getBoundTextElement)(element);\n if (boundTextElement) {\n const isHittingBoundTextElement = hitTest(boundTextElement, appState, x, y);\n if (isHittingBoundTextElement) {\n return true;\n }\n }\n return isHittingElementNotConsideringBoundingBox(element, appState, point);\n};\nconst isHittingElementBoundingBoxWithoutHittingElement = (element, appState, x, y) => {\n const threshold = 10 / appState.zoom.value;\n // So that bound text element hit is considered within bounding box of container even if its outside actual bounding box of element\n // eg for linear elements text can be outside the element bounding box\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_13__.getBoundTextElement)(element);\n if (boundTextElement && hitTest(boundTextElement, appState, x, y)) {\n return false;\n }\n return (!isHittingElementNotConsideringBoundingBox(element, appState, [x, y]) &&\n isPointHittingElementBoundingBox(element, [x, y], threshold));\n};\nconst isHittingElementNotConsideringBoundingBox = (element, appState, point) => {\n const threshold = 10 / appState.zoom.value;\n const check = (0,___WEBPACK_IMPORTED_MODULE_10__.isTextElement)(element)\n ? isStrictlyInside\n : isElementDraggableFromInside(element)\n ? isInsideCheck\n : isNearCheck;\n return hitTestPointAgainstElement({ element, point, threshold, check });\n};\nconst isElementSelected = (appState, element) => appState.selectedElementIds[element.id];\nconst isPointHittingElementBoundingBox = (element, [x, y], threshold) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const elementCenterX = (x1 + x2) / 2;\n const elementCenterY = (y1 + y2) / 2;\n // reverse rotate to take element's angle into account.\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.rotate)(x, y, elementCenterX, elementCenterY, -element.angle);\n return (rotatedX > x1 - threshold &&\n rotatedX < x2 + threshold &&\n rotatedY > y1 - threshold &&\n rotatedY < y2 + threshold);\n};\nconst bindingBorderTest = (element, { x, y }) => {\n const threshold = maxBindingGap(element, element.width, element.height);\n const check = isOutsideCheck;\n const point = [x, y];\n return hitTestPointAgainstElement({ element, point, threshold, check });\n};\nconst maxBindingGap = (element, elementWidth, elementHeight) => {\n // Aligns diamonds with rectangles\n const shapeRatio = element.type === \"diamond\" ? 1 / Math.sqrt(2) : 1;\n const smallerDimension = shapeRatio * Math.min(elementWidth, elementHeight);\n // We make the bindable boundary bigger for bigger elements\n return Math.max(16, Math.min(0.25 * smallerDimension, 32));\n};\nconst hitTestPointAgainstElement = (args) => {\n switch (args.element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n case \"ellipse\":\n const distance = distanceToBindableElement(args.element, args.point);\n return args.check(distance, args.threshold);\n case \"freedraw\": {\n if (!args.check(distanceToRectangle(args.element, args.point), args.threshold)) {\n return false;\n }\n return hitTestFreeDrawElement(args.element, args.point, args.threshold);\n }\n case \"arrow\":\n case \"line\":\n return hitTestLinear(args);\n case \"selection\":\n console.warn(\"This should not happen, we need to investigate why it does.\");\n return false;\n }\n};\nconst distanceToBindableElement = (element, point) => {\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return distanceToRectangle(element, point);\n case \"diamond\":\n return distanceToDiamond(element, point);\n case \"ellipse\":\n return distanceToEllipse(element, point);\n }\n};\nconst isStrictlyInside = (distance, threshold) => {\n return distance < 0;\n};\nconst isInsideCheck = (distance, threshold) => {\n return distance < threshold;\n};\nconst isNearCheck = (distance, threshold) => {\n return Math.abs(distance) < threshold;\n};\nconst isOutsideCheck = (distance, threshold) => {\n return 0 <= distance && distance < threshold;\n};\nconst distanceToRectangle = (element, point) => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n return Math.max(_gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, _galines__WEBPACK_IMPORTED_MODULE_3__.equation(0, 1, -hheight)), _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, _galines__WEBPACK_IMPORTED_MODULE_3__.equation(1, 0, -hwidth)));\n};\nconst distanceToDiamond = (element, point) => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n const side = _galines__WEBPACK_IMPORTED_MODULE_3__.equation(hheight, hwidth, -hheight * hwidth);\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, side);\n};\nconst distanceToEllipse = (element, point) => {\n const [pointRel, tangent] = ellipseParamsForTest(element, point);\n return -_galines__WEBPACK_IMPORTED_MODULE_3__.sign(tangent) * _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointRel, tangent);\n};\nconst ellipseParamsForTest = (element, point) => {\n const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n const [px, py] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(pointRel);\n // We're working in positive quadrant, so start with `t = 45deg`, `tx=cos(t)`\n let tx = 0.707;\n let ty = 0.707;\n const a = hwidth;\n const b = hheight;\n // This is a numerical method to find the params tx, ty at which\n // the ellipse has the closest point to the given point\n [0, 1, 2, 3].forEach((_) => {\n const xx = a * tx;\n const yy = b * ty;\n const ex = ((a * a - b * b) * Math.pow(tx, 3)) / a;\n const ey = ((b * b - a * a) * Math.pow(ty, 3)) / b;\n const rx = xx - ex;\n const ry = yy - ey;\n const qx = px - ex;\n const qy = py - ey;\n const r = Math.hypot(ry, rx);\n const q = Math.hypot(qy, qx);\n tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));\n ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));\n const t = Math.hypot(ty, tx);\n tx /= t;\n ty /= t;\n });\n const closestPoint = _ga__WEBPACK_IMPORTED_MODULE_0__.point(a * tx, b * ty);\n const tangent = _galines__WEBPACK_IMPORTED_MODULE_3__.orthogonalThrough(pointRel, closestPoint);\n return [pointRel, tangent];\n};\nconst hitTestFreeDrawElement = (element, point, threshold) => {\n // Check point-distance-to-line-segment for every segment in the\n // element's points (its input points, not its outline points).\n // This is... okay? It's plenty fast, but the GA library may\n // have a faster option.\n let x;\n let y;\n if (element.angle === 0) {\n x = point[0] - element.x;\n y = point[1] - element.y;\n }\n else {\n // Counter-rotate the point around center before testing\n const [minX, minY, maxX, maxY] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const rotatedPoint = (0,_math__WEBPACK_IMPORTED_MODULE_5__.rotatePoint)(point, [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2], -element.angle);\n x = rotatedPoint[0] - element.x;\n y = rotatedPoint[1] - element.y;\n }\n let [A, B] = element.points;\n let P;\n // For freedraw dots\n if ((0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(A[0], A[1], x, y) < threshold ||\n (0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(B[0], B[1], x, y) < threshold) {\n return true;\n }\n // For freedraw lines\n for (let i = 0; i < element.points.length; i++) {\n const delta = [B[0] - A[0], B[1] - A[1]];\n const length = Math.hypot(delta[1], delta[0]);\n const U = [delta[0] / length, delta[1] / length];\n const C = [x - A[0], y - A[1]];\n const d = (C[0] * U[0] + C[1] * U[1]) / Math.hypot(U[1], U[0]);\n P = [A[0] + U[0] * d, A[1] + U[1] * d];\n const da = (0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(P[0], P[1], A[0], A[1]);\n const db = (0,_math__WEBPACK_IMPORTED_MODULE_5__.distance2d)(P[0], P[1], B[0], B[1]);\n P = db < da && da > length ? B : da < db && db > length ? A : P;\n if (Math.hypot(y - P[1], x - P[0]) < threshold) {\n return true;\n }\n A = B;\n B = element.points[i + 1];\n }\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__.getShapeForElement)(element);\n // for filled freedraw shapes, support\n // selecting from inside\n if (shape && shape.sets.length) {\n return hitTestRoughShape(shape, x, y, threshold);\n }\n return false;\n};\nconst hitTestLinear = (args) => {\n const { element, threshold } = args;\n if (!(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__.getShapeForElement)(element)) {\n return false;\n }\n const [point, pointAbs, hwidth, hheight] = pointRelativeToElement(args.element, args.point);\n const side1 = _galines__WEBPACK_IMPORTED_MODULE_3__.equation(0, 1, -hheight);\n const side2 = _galines__WEBPACK_IMPORTED_MODULE_3__.equation(1, 0, -hwidth);\n if (!isInsideCheck(_gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointAbs, side1), threshold) ||\n !isInsideCheck(_gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(pointAbs, side2), threshold)) {\n return false;\n }\n const [relX, relY] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(point);\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_8__.getShapeForElement)(element);\n if (!shape) {\n return false;\n }\n if (args.check === isInsideCheck) {\n const hit = shape.some((subshape) => hitTestCurveInside(subshape, relX, relY, element.roundness ? \"round\" : \"sharp\"));\n if (hit) {\n return true;\n }\n }\n // hit test all \"subshapes\" of the linear element\n return shape.some((subshape) => hitTestRoughShape(subshape, relX, relY, threshold));\n};\n// Returns:\n// 1. the point relative to the elements (x, y) position\n// 2. the point relative to the element's center with positive (x, y)\n// 3. half element width\n// 4. half element height\n//\n// Note that for linear elements the (x, y) position is not at the\n// top right corner of their boundary.\n//\n// Rectangles, diamonds and ellipses are symmetrical over axes,\n// and other elements have a rectangular boundary,\n// so we only need to perform hit tests for the positive quadrant.\nconst pointRelativeToElement = (element, pointTuple) => {\n const point = _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(pointTuple);\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const elementCoords = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const center = coordsCenter([x1, y1, x2, y2]);\n // GA has angle orientation opposite to `rotate`\n const rotate = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.rotation(center, element.angle);\n const pointRotated = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(rotate, point);\n const pointRelToCenter = _ga__WEBPACK_IMPORTED_MODULE_0__.sub(pointRotated, _gadirections__WEBPACK_IMPORTED_MODULE_2__.from(center));\n const pointRelToCenterAbs = _gapoints__WEBPACK_IMPORTED_MODULE_1__.abs(pointRelToCenter);\n const elementPos = _ga__WEBPACK_IMPORTED_MODULE_0__.offset(element.x, element.y);\n const pointRelToPos = _ga__WEBPACK_IMPORTED_MODULE_0__.sub(pointRotated, elementPos);\n const [ax, ay, bx, by] = elementCoords;\n const halfWidth = (bx - ax) / 2;\n const halfHeight = (by - ay) / 2;\n return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];\n};\n// Returns point in absolute coordinates\nconst pointInAbsoluteCoords = (element, \n// Point relative to the element position\npoint) => {\n const [x, y] = point;\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const cx = (x2 - x1) / 2;\n const cy = (y2 - y1) / 2;\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.rotate)(x, y, cx, cy, element.angle);\n return [element.x + rotatedX, element.y + rotatedY];\n};\nconst relativizationToElementCenter = (element) => {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const center = coordsCenter([x1, y1, x2, y2]);\n // GA has angle orientation opposite to `rotate`\n const rotate = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.rotation(center, element.angle);\n const translate = _ga__WEBPACK_IMPORTED_MODULE_0__.reverse(_gatransforms__WEBPACK_IMPORTED_MODULE_4__.translation(_gadirections__WEBPACK_IMPORTED_MODULE_2__.from(center)));\n return _gatransforms__WEBPACK_IMPORTED_MODULE_4__.compose(rotate, translate);\n};\nconst coordsCenter = ([ax, ay, bx, by]) => {\n return _ga__WEBPACK_IMPORTED_MODULE_0__.point((ax + bx) / 2, (ay + by) / 2);\n};\n// The focus distance is the oriented ratio between the size of\n// the `element` and the \"focus image\" of the element on which\n// all focus points lie, so it's a number between -1 and 1.\n// The line going through `a` and `b` is a tangent to the \"focus image\"\n// of the element.\nconst determineFocusDistance = (element, \n// Point on the line, in absolute coordinates\na, \n// Another point on the line, in absolute coordinates (closer to element)\nb) => {\n const relateToCenter = relativizationToElementCenter(element);\n const aRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(a));\n const bRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(b));\n const line = _galines__WEBPACK_IMPORTED_MODULE_3__.through(aRel, bRel);\n const q = element.height / element.width;\n const hwidth = element.width / 2;\n const hheight = element.height / 2;\n const n = line[2];\n const m = line[3];\n const c = line[1];\n const mabs = Math.abs(m);\n const nabs = Math.abs(n);\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return c / (hwidth * (nabs + q * mabs));\n case \"diamond\":\n return mabs < nabs ? c / (nabs * hwidth) : c / (mabs * hheight);\n case \"ellipse\":\n return c / (hwidth * Math.sqrt(Math.pow(n, 2) + Math.pow(q, 2) * Math.pow(m, 2)));\n }\n};\nconst determineFocusPoint = (element, \n// The oriented, relative distance from the center of `element` of the\n// returned focusPoint\nfocus, adjecentPoint) => {\n if (focus === 0) {\n const [x1, y1, x2, y2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getElementAbsoluteCoords)(element);\n const center = coordsCenter([x1, y1, x2, y2]);\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(center);\n }\n const relateToCenter = relativizationToElementCenter(element);\n const adjecentPointRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(adjecentPoint));\n const reverseRelateToCenter = _ga__WEBPACK_IMPORTED_MODULE_0__.reverse(relateToCenter);\n let point;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n point = findFocusPointForRectangulars(element, focus, adjecentPointRel);\n break;\n case \"ellipse\":\n point = findFocusPointForEllipse(element, focus, adjecentPointRel);\n break;\n }\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(_gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(reverseRelateToCenter, point));\n};\n// Returns 2 or 0 intersection points between line going through `a` and `b`\n// and the `element`, in ascending order of distance from `a`.\nconst intersectElementWithLine = (element, \n// Point on the line, in absolute coordinates\na, \n// Another point on the line, in absolute coordinates\nb, \n// If given, the element is inflated by this value\ngap = 0) => {\n const relateToCenter = relativizationToElementCenter(element);\n const aRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(a));\n const bRel = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(relateToCenter, _gapoints__WEBPACK_IMPORTED_MODULE_1__.from(b));\n const line = _galines__WEBPACK_IMPORTED_MODULE_3__.through(aRel, bRel);\n const reverseRelateToCenter = _ga__WEBPACK_IMPORTED_MODULE_0__.reverse(relateToCenter);\n const intersections = getSortedElementLineIntersections(element, line, aRel, gap);\n return intersections.map((point) => _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(_gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(reverseRelateToCenter, point)));\n};\nconst getSortedElementLineIntersections = (element, \n// Relative to element center\nline, \n// Relative to element center\nnearPoint, gap = 0) => {\n let intersections;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n case \"diamond\":\n const corners = getCorners(element);\n intersections = corners\n .flatMap((point, i) => {\n const edge = [point, corners[(i + 1) % 4]];\n return intersectSegment(line, offsetSegment(edge, gap));\n })\n .concat(corners.flatMap((point) => getCircleIntersections(point, gap, line)));\n break;\n case \"ellipse\":\n intersections = getEllipseIntersections(element, gap, line);\n break;\n }\n if (intersections.length < 2) {\n // Ignore the \"edge\" case of only intersecting with a single corner\n return [];\n }\n const sortedIntersections = intersections.sort((i1, i2) => _gapoints__WEBPACK_IMPORTED_MODULE_1__.distance(i1, nearPoint) - _gapoints__WEBPACK_IMPORTED_MODULE_1__.distance(i2, nearPoint));\n return [\n sortedIntersections[0],\n sortedIntersections[sortedIntersections.length - 1],\n ];\n};\nconst getCorners = (element, scale = 1) => {\n const hx = (scale * element.width) / 2;\n const hy = (scale * element.height) / 2;\n switch (element.type) {\n case \"rectangle\":\n case \"image\":\n case \"text\":\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(hx, hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(hx, -hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(-hx, -hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(-hx, hy),\n ];\n case \"diamond\":\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(0, hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(hx, 0),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(0, -hy),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point(-hx, 0),\n ];\n }\n};\n// Returns intersection of `line` with `segment`, with `segment` moved by\n// `gap` in its polar direction.\n// If intersection coincides with second segment point returns empty array.\nconst intersectSegment = (line, segment) => {\n const [a, b] = segment;\n const aDist = _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(a, line);\n const bDist = _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(b, line);\n if (aDist * bDist >= 0) {\n // The intersection is outside segment `(a, b)`\n return [];\n }\n return [_gapoints__WEBPACK_IMPORTED_MODULE_1__.intersect(line, _galines__WEBPACK_IMPORTED_MODULE_3__.through(a, b))];\n};\nconst offsetSegment = (segment, distance) => {\n const [a, b] = segment;\n const offset = _gatransforms__WEBPACK_IMPORTED_MODULE_4__.translationOrthogonal(_gadirections__WEBPACK_IMPORTED_MODULE_2__.fromTo(a, b), distance);\n return [_gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(offset, a), _gatransforms__WEBPACK_IMPORTED_MODULE_4__.apply(offset, b)];\n};\nconst getEllipseIntersections = (element, gap, line) => {\n const a = element.width / 2 + gap;\n const b = element.height / 2 + gap;\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const squares = a * a * m * m + b * b * n * n;\n const discr = squares - c * c;\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = -a * a * m * c;\n const yn = -b * b * n * c;\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn + a * b * n * discrRoot) / squares, (yn - a * b * m * discrRoot) / squares),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn - a * b * n * discrRoot) / squares, (yn + a * b * m * discrRoot) / squares),\n ];\n};\nconst getCircleIntersections = (center, radius, line) => {\n if (radius === 0) {\n return _gapoints__WEBPACK_IMPORTED_MODULE_1__.distanceToLine(line, center) === 0 ? [center] : [];\n }\n const m = line[2];\n const n = line[3];\n const c = line[1];\n const [a, b] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(center);\n const r = radius;\n const squares = m * m + n * n;\n const discr = r * r * squares - Math.pow((m * a + n * b + c), 2);\n if (squares === 0 || discr <= 0) {\n return [];\n }\n const discrRoot = Math.sqrt(discr);\n const xn = a * n * n - b * m * n - m * c;\n const yn = b * m * m - a * m * n - n * c;\n return [\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn + n * discrRoot) / squares, (yn - m * discrRoot) / squares),\n _ga__WEBPACK_IMPORTED_MODULE_0__.point((xn - n * discrRoot) / squares, (yn + m * discrRoot) / squares),\n ];\n};\n// The focus point is the tangent point of the \"focus image\" of the\n// `element`, where the tangent goes through `point`.\nconst findFocusPointForEllipse = (ellipse, \n// Between -1 and 1 (not 0) the relative size of the \"focus image\" of\n// the element on which the focus point lies\nrelativeDistance, \n// The point for which we're trying to find the focus point, relative\n// to the ellipse center.\npoint) => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const a = (ellipse.width * relativeDistanceAbs) / 2;\n const b = (ellipse.height * relativeDistanceAbs) / 2;\n const orientation = Math.sign(relativeDistance);\n const [px, pyo] = _gapoints__WEBPACK_IMPORTED_MODULE_1__.toTuple(point);\n // The calculation below can't handle py = 0\n const py = pyo === 0 ? 0.0001 : pyo;\n const squares = Math.pow(px, 2) * Math.pow(b, 2) + Math.pow(py, 2) * Math.pow(a, 2);\n // Tangent mx + ny + 1 = 0\n const m = (-px * Math.pow(b, 2) +\n orientation * py * Math.sqrt(Math.max(0, squares - Math.pow(a, 2) * Math.pow(b, 2)))) /\n squares;\n const n = (-m * px - 1) / py;\n const x = -(Math.pow(a, 2) * m) / (Math.pow(n, 2) * Math.pow(b, 2) + Math.pow(m, 2) * Math.pow(a, 2));\n return _ga__WEBPACK_IMPORTED_MODULE_0__.point(x, (-m * x - 1) / n);\n};\nconst findFocusPointForRectangulars = (element, \n// Between -1 and 1 for how far away should the focus point be relative\n// to the size of the element. Sign determines orientation.\nrelativeDistance, \n// The point for which we're trying to find the focus point, relative\n// to the element center.\npoint) => {\n const relativeDistanceAbs = Math.abs(relativeDistance);\n const orientation = Math.sign(relativeDistance);\n const corners = getCorners(element, relativeDistanceAbs);\n let maxDistance = 0;\n let tangentPoint = null;\n corners.forEach((corner) => {\n const distance = orientation * _galines__WEBPACK_IMPORTED_MODULE_3__.through(point, corner)[1];\n if (distance > maxDistance) {\n maxDistance = distance;\n tangentPoint = corner;\n }\n });\n return tangentPoint;\n};\nconst pointInBezierEquation = (p0, p1, p2, p3, [mx, my], lineThreshold) => {\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // go through t in increments of 0.01\n let t = 0;\n while (t <= 1.0) {\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));\n if (diff < lineThreshold) {\n return true;\n }\n t += 0.01;\n }\n return false;\n};\nconst hitTestCurveInside = (drawable, x, y, roundness) => {\n const ops = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getCurvePathOps)(drawable);\n const points = [];\n let odd = false; // select one line out of double lines\n for (const operation of ops) {\n if (operation.op === \"move\") {\n odd = !odd;\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n }\n else if (operation.op === \"bcurveTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n points.push([operation.data[2], operation.data[3]]);\n points.push([operation.data[4], operation.data[5]]);\n }\n }\n else if (operation.op === \"lineTo\") {\n if (odd) {\n points.push([operation.data[0], operation.data[1]]);\n }\n }\n }\n if (points.length >= 4) {\n if (roundness === \"sharp\") {\n return (0,_math__WEBPACK_IMPORTED_MODULE_5__.isPointInPolygon)(points, x, y);\n }\n const polygonPoints = (0,points_on_curve__WEBPACK_IMPORTED_MODULE_6__.pointsOnBezierCurves)(points, 10, 5);\n return (0,_math__WEBPACK_IMPORTED_MODULE_5__.isPointInPolygon)(polygonPoints, x, y);\n }\n return false;\n};\nconst hitTestRoughShape = (drawable, x, y, lineThreshold) => {\n // read operations from first opSet\n const ops = (0,_bounds__WEBPACK_IMPORTED_MODULE_7__.getCurvePathOps)(drawable);\n // set start position as (0,0) just in case\n // move operation does not exist (unlikely but it is worth safekeeping it)\n let currentP = [0, 0];\n return ops.some(({ op, data }, idx) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n // create points from bezier curve\n // bezier curve stores data as a flattened array of three positions\n // [x1, y1, x2, y2, x3, y3]\n const p1 = [data[0], data[1]];\n const p2 = [data[2], data[3]];\n const p3 = [data[4], data[5]];\n const p0 = currentP;\n currentP = p3;\n // check if points are on the curve\n // cubic bezier curves require four parameters\n // the first parameter is the last stored position (p0)\n const retVal = pointInBezierEquation(p0, p1, p2, p3, [x, y], lineThreshold);\n // set end point of bezier curve as the new starting point for\n // upcoming operations as each operation is based on the last drawn\n // position of the previous operation\n return retVal;\n }\n else if (op === \"lineTo\") {\n return hitTestCurveInside(drawable, x, y, \"sharp\");\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n console.warn(\"qcurveTo is not implemented yet\");\n }\n return false;\n });\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFOUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztRQUNqRCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQy9CLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV2QyxNQUFNLEVBQUUsR0FBRyxpREFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sRUFBRSxHQUFHLGlEQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFD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Q2Y7YUFBTSxJQUFJLEVBQUUsS0FBSyxRQUFRLEVBQUU7WUFDMUIsT0FBTyxrQkFBa0IsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNwRDthQUFNLElBQUksRUFBRSxLQUFLLFVBQVUsRUFBRTtZQUM1Qix1QkFBdUI7WUFDdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2NvbGxpc2lvbi50cz80OTdhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIEdBIGZyb20gXCIuLi9nYVwiO1xuaW1wb3J0ICogYXMgR0FQb2ludCBmcm9tIFwiLi4vZ2Fwb2ludHNcIjtcbmltcG9ydCAqIGFzIEdBRGlyZWN0aW9uIGZyb20gXCIuLi9nYWRpcmVjdGlvbnNcIjtcbmltcG9ydCAqIGFzIEdBTGluZSBmcm9tIFwiLi4vZ2FsaW5lc1wiO1xuaW1wb3J0ICogYXMgR0FUcmFuc2Zvcm0gZnJvbSBcIi4uL2dhdHJhbnNmb3Jtc1wiO1xuXG5pbXBvcnQge1xuICBkaXN0YW5jZTJkLFxuICByb3RhdGVQb2ludCxcbiAgaXNQYXRoQUxvb3AsXG4gIGlzUG9pbnRJblBvbHlnb24sXG4gIHJvdGF0ZSxcbn0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCB7IHBvaW50c09uQmV6aWVyQ3VydmVzIH0gZnJvbSBcInBvaW50cy1vbi1jdXJ2ZVwiO1xuXG5pbXBvcnQge1xuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3UmVjdGFuZ2xlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0RpYW1vbmRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdFbGxpcHNlRWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIFN0cm9rZVJvdW5kbmVzcyxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLCBnZXRDdXJ2ZVBhdGhPcHMsIEJvdW5kcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERyYXdhYmxlIH0gZnJvbSBcInJvdWdoanMvYmluL2NvcmVcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgaGFzQm91bmRUZXh0RWxlbWVudCwgaXNJbWFnZUVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzVHJhbnNwYXJlbnQgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHNob3VsZFNob3dCb3VuZGluZ0JveCB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCB7IGdldEJvdW5kVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gXCIuLi91dGlsaXR5LXR5cGVzXCI7XG5cbmNvbnN0IGlzRWxlbWVudERyYWdnYWJsZUZyb21JbnNpZGUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAoZWxlbWVudC50eXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoZWxlbWVudC50eXBlID09PSBcImZyZWVkcmF3XCIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBpc0RyYWdnYWJsZUZyb21JbnNpZGUgPVxuICAgICFpc1RyYW5zcGFyZW50KGVsZW1lbnQuYmFja2dyb3VuZENvbG9yKSB8fCBoYXNCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICBpZiAoZWxlbWVudC50eXBlID09PSBcImxpbmVcIikge1xuICAgIHJldHVybiBpc0RyYWdnYWJsZUZyb21JbnNpZGUgJiYgaXNQYXRoQUxvb3AoZWxlbWVudC5wb2ludHMpO1xuICB9XG4gIHJldHVybiBpc0RyYWdnYWJsZUZyb21JbnNpZGUgfHwgaXNJbWFnZUVsZW1lbnQoZWxlbWVudCk7XG59O1xuXG5leHBvcnQgY29uc3QgaGl0VGVzdCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogYm9vbGVhbiA9PiB7XG4gIC8vIEhvdyBtYW55IHBpeGVscyBvZmYgdGhlIHNoYXBlIGJvdW5kYXJ5IHdlIHN0aWxsIGNvbnNpZGVyIGEgaGl0XG4gIGNvbnN0IHRocmVzaG9sZCA9IDEwIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgY29uc3QgcG9pbnQ6IFBvaW50ID0gW3gsIHldO1xuXG4gIGlmIChcbiAgICBpc0VsZW1lbnRTZWxlY3RlZChhcHBTdGF0ZSwgZWxlbWVudCkgJiZcbiAgICBzaG91bGRTaG93Qm91bmRpbmdCb3goW2VsZW1lbnRdLCBhcHBTdGF0ZSlcbiAgKSB7XG4gICAgcmV0dXJuIGlzUG9pbnRIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94KGVsZW1lbnQsIHBvaW50LCB0aHJlc2hvbGQpO1xuICB9XG5cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgY29uc3QgaXNIaXR0aW5nQm91bmRUZXh0RWxlbWVudCA9IGhpdFRlc3QoYm91bmRUZXh0RWxlbWVudCwgYXBwU3RhdGUsIHgsIHkpO1xuICAgIGlmIChpc0hpdHRpbmdCb3VuZFRleHRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnQsIGFwcFN0YXRlLCBwb2ludCk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94V2l0aG91dEhpdHRpbmdFbGVtZW50ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBib29sZWFuID0+IHtcbiAgY29uc3QgdGhyZXNob2xkID0gMTAgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuXG4gIC8vIFNvIHRoYXQgYm91bmQgdGV4dCBlbGVtZW50IGhpdCBpcyBjb25zaWRlcmVkIHdpdGhpbiBib3VuZGluZyBib3ggb2YgY29udGFpbmVyIGV2ZW4gaWYgaXRzIG91dHNpZGUgYWN0dWFsIGJvdW5kaW5nIGJveCBvZiBlbGVtZW50XG4gIC8vIGVnIGZvciBsaW5lYXIgZWxlbWVudHMgdGV4dCBjYW4gYmUgb3V0c2lkZSB0aGUgZWxlbWVudCBib3VuZGluZyBib3hcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50ICYmIGhpdFRlc3QoYm91bmRUZXh0RWxlbWVudCwgYXBwU3RhdGUsIHgsIHkpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICAhaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudCwgYXBwU3RhdGUsIFt4LCB5XSkgJiZcbiAgICBpc1BvaW50SGl0dGluZ0VsZW1lbnRCb3VuZGluZ0JveChlbGVtZW50LCBbeCwgeV0sIHRocmVzaG9sZClcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIHBvaW50OiBQb2ludCxcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB0aHJlc2hvbGQgPSAxMCAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gIGNvbnN0IGNoZWNrID0gaXNUZXh0RWxlbWVudChlbGVtZW50KVxuICAgID8gaXNTdHJpY3RseUluc2lkZVxuICAgIDogaXNFbGVtZW50RHJhZ2dhYmxlRnJvbUluc2lkZShlbGVtZW50KVxuICAgID8gaXNJbnNpZGVDaGVja1xuICAgIDogaXNOZWFyQ2hlY2s7XG4gIHJldHVybiBoaXRUZXN0UG9pbnRBZ2FpbnN0RWxlbWVudCh7IGVsZW1lbnQsIHBvaW50LCB0aHJlc2hvbGQsIGNoZWNrIH0pO1xufTtcblxuY29uc3QgaXNFbGVtZW50U2VsZWN0ZWQgPSAoXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD4sXG4pID0+IGFwcFN0YXRlLnNlbGVjdGVkRWxlbWVudElkc1tlbGVtZW50LmlkXTtcblxuZXhwb3J0IGNvbnN0IGlzUG9pbnRIaXR0aW5nRWxlbWVudEJvdW5kaW5nQm94ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PixcbiAgW3gsIHldOiBQb2ludCxcbiAgdGhyZXNob2xkOiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgZWxlbWVudENlbnRlclggPSAoeDEgKyB4MikgLyAyO1xuICBjb25zdCBlbGVtZW50Q2VudGVyWSA9ICh5MSArIHkyKSAvIDI7XG4gIC8vIHJldmVyc2Ugcm90YXRlIHRvIHRha2UgZWxlbWVudCdzIGFuZ2xlIGludG8gYWNjb3VudC5cbiAgY29uc3QgW3JvdGF0ZWRYLCByb3RhdGVkWV0gPSByb3RhdGUoXG4gICAgeCxcbiAgICB5LFxuICAgIGVsZW1lbnRDZW50ZXJYLFxuICAgIGVsZW1lbnRDZW50ZXJZLFxuICAgIC1lbGVtZW50LmFuZ2xlLFxuICApO1xuXG4gIHJldHVybiAoXG4gICAgcm90YXRlZFggPiB4MSAtIHRocmVzaG9sZCAmJlxuICAgIHJvdGF0ZWRYIDwgeDIgKyB0aHJlc2hvbGQgJiZcbiAgICByb3RhdGVkWSA+IHkxIC0gdGhyZXNob2xkICYmXG4gICAgcm90YXRlZFkgPCB5MiArIHRocmVzaG9sZFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRpbmdCb3JkZXJUZXN0ID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQ+LFxuICB7IHgsIHkgfTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHRocmVzaG9sZCA9IG1heEJpbmRpbmdHYXAoZWxlbWVudCwgZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHQpO1xuICBjb25zdCBjaGVjayA9IGlzT3V0c2lkZUNoZWNrO1xuICBjb25zdCBwb2ludDogUG9pbnQgPSBbeCwgeV07XG4gIHJldHVybiBoaXRUZXN0UG9pbnRBZ2FpbnN0RWxlbWVudCh7IGVsZW1lbnQsIHBvaW50LCB0aHJlc2hvbGQsIGNoZWNrIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG1heEJpbmRpbmdHYXAgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBlbGVtZW50V2lkdGg6IG51bWJlcixcbiAgZWxlbWVudEhlaWdodDogbnVtYmVyLFxuKTogbnVtYmVyID0+IHtcbiAgLy8gQWxpZ25zIGRpYW1vbmRzIHdpdGggcmVjdGFuZ2xlc1xuICBjb25zdCBzaGFwZVJhdGlvID0gZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIiA/IDEgLyBNYXRoLnNxcnQoMikgOiAxO1xuICBjb25zdCBzbWFsbGVyRGltZW5zaW9uID0gc2hhcGVSYXRpbyAqIE1hdGgubWluKGVsZW1lbnRXaWR0aCwgZWxlbWVudEhlaWdodCk7XG4gIC8vIFdlIG1ha2UgdGhlIGJpbmRhYmxlIGJvdW5kYXJ5IGJpZ2dlciBmb3IgYmlnZ2VyIGVsZW1lbnRzXG4gIHJldHVybiBNYXRoLm1heCgxNiwgTWF0aC5taW4oMC4yNSAqIHNtYWxsZXJEaW1lbnNpb24sIDMyKSk7XG59O1xuXG50eXBlIEhpdFRlc3RBcmdzID0ge1xuICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQ7XG4gIHBvaW50OiBQb2ludDtcbiAgdGhyZXNob2xkOiBudW1iZXI7XG4gIGNoZWNrOiAoZGlzdGFuY2U6IG51bWJlciwgdGhyZXNob2xkOiBudW1iZXIpID0+IGJvb2xlYW47XG59O1xuXG5jb25zdCBoaXRUZXN0UG9pbnRBZ2FpbnN0RWxlbWVudCA9IChhcmdzOiBIaXRUZXN0QXJncyk6IGJvb2xlYW4gPT4ge1xuICBzd2l0Y2ggKGFyZ3MuZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZVRvQmluZGFibGVFbGVtZW50KGFyZ3MuZWxlbWVudCwgYXJncy5wb2ludCk7XG4gICAgICByZXR1cm4gYXJncy5jaGVjayhkaXN0YW5jZSwgYXJncy50aHJlc2hvbGQpO1xuICAgIGNhc2UgXCJmcmVlZHJhd1wiOiB7XG4gICAgICBpZiAoXG4gICAgICAgICFhcmdzLmNoZWNrKFxuICAgICAgICAgIGRpc3RhbmNlVG9SZWN0YW5nbGUoYXJncy5lbGVtZW50LCBhcmdzLnBvaW50KSxcbiAgICAgICAgICBhcmdzLnRocmVzaG9sZCxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGhpdFRlc3RGcmVlRHJhd0VsZW1lbnQoYXJncy5lbGVtZW50LCBhcmdzLnBvaW50LCBhcmdzLnRocmVzaG9sZCk7XG4gICAgfVxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgICByZXR1cm4gaGl0VGVzdExpbmVhcihhcmdzKTtcbiAgICBjYXNlIFwic2VsZWN0aW9uXCI6XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIFwiVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgd2UgbmVlZCB0byBpbnZlc3RpZ2F0ZSB3aHkgaXQgZG9lcy5cIixcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZVRvQmluZGFibGVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBwb2ludDogUG9pbnQsXG4pOiBudW1iZXIgPT4ge1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgcmV0dXJuIGRpc3RhbmNlVG9SZWN0YW5nbGUoZWxlbWVudCwgcG9pbnQpO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gZGlzdGFuY2VUb0RpYW1vbmQoZWxlbWVudCwgcG9pbnQpO1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICByZXR1cm4gZGlzdGFuY2VUb0VsbGlwc2UoZWxlbWVudCwgcG9pbnQpO1xuICB9XG59O1xuXG5jb25zdCBpc1N0cmljdGx5SW5zaWRlID0gKGRpc3RhbmNlOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBkaXN0YW5jZSA8IDA7XG59O1xuXG5jb25zdCBpc0luc2lkZUNoZWNrID0gKGRpc3RhbmNlOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBkaXN0YW5jZSA8IHRocmVzaG9sZDtcbn07XG5cbmNvbnN0IGlzTmVhckNoZWNrID0gKGRpc3RhbmNlOiBudW1iZXIsIHRocmVzaG9sZDogbnVtYmVyKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBNYXRoLmFicyhkaXN0YW5jZSkgPCB0aHJlc2hvbGQ7XG59O1xuXG5jb25zdCBpc091dHNpZGVDaGVjayA9IChkaXN0YW5jZTogbnVtYmVyLCB0aHJlc2hvbGQ6IG51bWJlcik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gMCA8PSBkaXN0YW5jZSAmJiBkaXN0YW5jZSA8IHRocmVzaG9sZDtcbn07XG5cbmNvbnN0IGRpc3RhbmNlVG9SZWN0YW5nbGUgPSAoXG4gIGVsZW1lbnQ6XG4gICAgfCBFeGNhbGlkcmF3UmVjdGFuZ2xlRWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd1RleHRFbGVtZW50XG4gICAgfCBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50XG4gICAgfCBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBwb2ludDogUG9pbnQsXG4pOiBudW1iZXIgPT4ge1xuICBjb25zdCBbLCBwb2ludFJlbCwgaHdpZHRoLCBoaGVpZ2h0XSA9IHBvaW50UmVsYXRpdmVUb0VsZW1lbnQoZWxlbWVudCwgcG9pbnQpO1xuICByZXR1cm4gTWF0aC5tYXgoXG4gICAgR0FQb2ludC5kaXN0YW5jZVRvTGluZShwb2ludFJlbCwgR0FMaW5lLmVxdWF0aW9uKDAsIDEsIC1oaGVpZ2h0KSksXG4gICAgR0FQb2ludC5kaXN0YW5jZVRvTGluZShwb2ludFJlbCwgR0FMaW5lLmVxdWF0aW9uKDEsIDAsIC1od2lkdGgpKSxcbiAgKTtcbn07XG5cbmNvbnN0IGRpc3RhbmNlVG9EaWFtb25kID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RGlhbW9uZEVsZW1lbnQsXG4gIHBvaW50OiBQb2ludCxcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IFssIHBvaW50UmVsLCBod2lkdGgsIGhoZWlnaHRdID0gcG9pbnRSZWxhdGl2ZVRvRWxlbWVudChlbGVtZW50LCBwb2ludCk7XG4gIGNvbnN0IHNpZGUgPSBHQUxpbmUuZXF1YXRpb24oaGhlaWdodCwgaHdpZHRoLCAtaGhlaWdodCAqIGh3aWR0aCk7XG4gIHJldHVybiBHQVBvaW50LmRpc3RhbmNlVG9MaW5lKHBvaW50UmVsLCBzaWRlKTtcbn07XG5cbmNvbnN0IGRpc3RhbmNlVG9FbGxpcHNlID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxsaXBzZUVsZW1lbnQsXG4gIHBvaW50OiBQb2ludCxcbik6IG51bWJlciA9PiB7XG4gIGNvbnN0IFtwb2ludFJlbCwgdGFuZ2VudF0gPSBlbGxpcHNlUGFyYW1zRm9yVGVzdChlbGVtZW50LCBwb2ludCk7XG4gIHJldHVybiAtR0FMaW5lLnNpZ24odGFuZ2VudCkgKiBHQVBvaW50LmRpc3RhbmNlVG9MaW5lKHBvaW50UmVsLCB0YW5nZW50KTtcbn07XG5cbmNvbnN0IGVsbGlwc2VQYXJhbXNGb3JUZXN0ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxsaXBzZUVsZW1lbnQsXG4gIHBvaW50OiBQb2ludCxcbik6IFtHQS5Qb2ludCwgR0EuTGluZV0gPT4ge1xuICBjb25zdCBbLCBwb2ludFJlbCwgaHdpZHRoLCBoaGVpZ2h0XSA9IHBvaW50UmVsYXRpdmVUb0VsZW1lbnQoZWxlbWVudCwgcG9pbnQpO1xuICBjb25zdCBbcHgsIHB5XSA9IEdBUG9pbnQudG9UdXBsZShwb2ludFJlbCk7XG5cbiAgLy8gV2UncmUgd29ya2luZyBpbiBwb3NpdGl2ZSBxdWFkcmFudCwgc28gc3RhcnQgd2l0aCBgdCA9IDQ1ZGVnYCwgYHR4PWNvcyh0KWBcbiAgbGV0IHR4ID0gMC43MDc7XG4gIGxldCB0eSA9IDAuNzA3O1xuXG4gIGNvbnN0IGEgPSBod2lkdGg7XG4gIGNvbnN0IGIgPSBoaGVpZ2h0O1xuXG4gIC8vIFRoaXMgaXMgYSBudW1lcmljYWwgbWV0aG9kIHRvIGZpbmQgdGhlIHBhcmFtcyB0eCwgdHkgYXQgd2hpY2hcbiAgLy8gdGhlIGVsbGlwc2UgaGFzIHRoZSBjbG9zZXN0IHBvaW50IHRvIHRoZSBnaXZlbiBwb2ludFxuICBbMCwgMSwgMiwgM10uZm9yRWFjaCgoXykgPT4ge1xuICAgIGNvbnN0IHh4ID0gYSAqIHR4O1xuICAgIGNvbnN0IHl5ID0gYiAqIHR5O1xuXG4gICAgY29uc3QgZXggPSAoKGEgKiBhIC0gYiAqIGIpICogdHggKiogMykgLyBhO1xuICAgIGNvbnN0IGV5ID0gKChiICogYiAtIGEgKiBhKSAqIHR5ICoqIDMpIC8gYjtcblxuICAgIGNvbnN0IHJ4ID0geHggLSBleDtcbiAgICBjb25zdCByeSA9IHl5IC0gZXk7XG5cbiAgICBjb25zdCBxeCA9IHB4IC0gZXg7XG4gICAgY29uc3QgcXkgPSBweSAtIGV5O1xuXG4gICAgY29uc3QgciA9IE1hdGguaHlwb3QocnksIHJ4KTtcbiAgICBjb25zdCBxID0gTWF0aC5oeXBvdChxeSwgcXgpO1xuXG4gICAgdHggPSBNYXRoLm1pbigxLCBNYXRoLm1heCgwLCAoKHF4ICogcikgLyBxICsgZXgpIC8gYSkpO1xuICAgIHR5ID0gTWF0aC5taW4oMSwgTWF0aC5tYXgoMCwgKChxeSAqIHIpIC8gcSArIGV5KSAvIGIpKTtcbiAgICBjb25zdCB0ID0gTWF0aC5oeXBvdCh0eSwgdHgpO1xuICAgIHR4IC89IHQ7XG4gICAgdHkgLz0gdDtcbiAgfSk7XG5cbiAgY29uc3QgY2xvc2VzdFBvaW50ID0gR0EucG9pbnQoYSAqIHR4LCBiICogdHkpO1xuXG4gIGNvbnN0IHRhbmdlbnQgPSBHQUxpbmUub3J0aG9nb25hbFRocm91Z2gocG9pbnRSZWwsIGNsb3Nlc3RQb2ludCk7XG4gIHJldHVybiBbcG9pbnRSZWwsIHRhbmdlbnRdO1xufTtcblxuY29uc3QgaGl0VGVzdEZyZWVEcmF3RWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgcG9pbnQ6IFBvaW50LFxuICB0aHJlc2hvbGQ6IG51bWJlcixcbik6IGJvb2xlYW4gPT4ge1xuICAvLyBDaGVjayBwb2ludC1kaXN0YW5jZS10by1saW5lLXNlZ21lbnQgZm9yIGV2ZXJ5IHNlZ21lbnQgaW4gdGhlXG4gIC8vIGVsZW1lbnQncyBwb2ludHMgKGl0cyBpbnB1dCBwb2ludHMsIG5vdCBpdHMgb3V0bGluZSBwb2ludHMpLlxuICAvLyBUaGlzIGlzLi4uIG9rYXk/IEl0J3MgcGxlbnR5IGZhc3QsIGJ1dCB0aGUgR0EgbGlicmFyeSBtYXlcbiAgLy8gaGF2ZSBhIGZhc3RlciBvcHRpb24uXG5cbiAgbGV0IHg6IG51bWJlcjtcbiAgbGV0IHk6IG51bWJlcjtcblxuICBpZiAoZWxlbWVudC5hbmdsZSA9PT0gMCkge1xuICAgIHggPSBwb2ludFswXSAtIGVsZW1lbnQueDtcbiAgICB5ID0gcG9pbnRbMV0gLSBlbGVtZW50Lnk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQ291bnRlci1yb3RhdGUgdGhlIHBvaW50IGFyb3VuZCBjZW50ZXIgYmVmb3JlIHRlc3RpbmdcbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3Qgcm90YXRlZFBvaW50ID0gcm90YXRlUG9pbnQoXG4gICAgICBwb2ludCxcbiAgICAgIFttaW5YICsgKG1heFggLSBtaW5YKSAvIDIsIG1pblkgKyAobWF4WSAtIG1pblkpIC8gMl0sXG4gICAgICAtZWxlbWVudC5hbmdsZSxcbiAgICApO1xuICAgIHggPSByb3RhdGVkUG9pbnRbMF0gLSBlbGVtZW50Lng7XG4gICAgeSA9IHJvdGF0ZWRQb2ludFsxXSAtIGVsZW1lbnQueTtcbiAgfVxuXG4gIGxldCBbQSwgQl0gPSBlbGVtZW50LnBvaW50cztcbiAgbGV0IFA6IHJlYWRvbmx5IFtudW1iZXIsIG51bWJlcl07XG5cbiAgLy8gRm9yIGZyZWVkcmF3IGRvdHNcbiAgaWYgKFxuICAgIGRpc3RhbmNlMmQoQVswXSwgQVsxXSwgeCwgeSkgPCB0aHJlc2hvbGQgfHxcbiAgICBkaXN0YW5jZTJkKEJbMF0sIEJbMV0sIHgsIHkpIDwgdGhyZXNob2xkXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gRm9yIGZyZWVkcmF3IGxpbmVzXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5wb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZWx0YSA9IFtCWzBdIC0gQVswXSwgQlsxXSAtIEFbMV1dO1xuICAgIGNvbnN0IGxlbmd0aCA9IE1hdGguaHlwb3QoZGVsdGFbMV0sIGRlbHRhWzBdKTtcblxuICAgIGNvbnN0IFUgPSBbZGVsdGFbMF0gLyBsZW5ndGgsIGRlbHRhWzFdIC8gbGVuZ3RoXTtcbiAgICBjb25zdCBDID0gW3ggLSBBWzBdLCB5IC0gQVsxXV07XG4gICAgY29uc3QgZCA9IChDWzBdICogVVswXSArIENbMV0gKiBVWzFdKSAvIE1hdGguaHlwb3QoVVsxXSwgVVswXSk7XG4gICAgUCA9IFtBWzBdICsgVVswXSAqIGQsIEFbMV0gKyBVWzFdICogZF07XG5cbiAgICBjb25zdCBkYSA9IGRpc3RhbmNlMmQoUFswXSwgUFsxXSwgQVswXSwgQVsxXSk7XG4gICAgY29uc3QgZGIgPSBkaXN0YW5jZTJkKFBbMF0sIFBbMV0sIEJbMF0sIEJbMV0pO1xuXG4gICAgUCA9IGRiIDwgZGEgJiYgZGEgPiBsZW5ndGggPyBCIDogZGEgPCBkYiAmJiBkYiA+IGxlbmd0aCA/IEEgOiBQO1xuXG4gICAgaWYgKE1hdGguaHlwb3QoeSAtIFBbMV0sIHggLSBQWzBdKSA8IHRocmVzaG9sZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgQSA9IEI7XG4gICAgQiA9IGVsZW1lbnQucG9pbnRzW2kgKyAxXTtcbiAgfVxuXG4gIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuXG4gIC8vIGZvciBmaWxsZWQgZnJlZWRyYXcgc2hhcGVzLCBzdXBwb3J0XG4gIC8vIHNlbGVjdGluZyBmcm9tIGluc2lkZVxuICBpZiAoc2hhcGUgJiYgc2hhcGUuc2V0cy5sZW5ndGgpIHtcbiAgICByZXR1cm4gaGl0VGVzdFJvdWdoU2hhcGUoc2hhcGUsIHgsIHksIHRocmVzaG9sZCk7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBoaXRUZXN0TGluZWFyID0gKGFyZ3M6IEhpdFRlc3RBcmdzKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHsgZWxlbWVudCwgdGhyZXNob2xkIH0gPSBhcmdzO1xuICBpZiAoIWdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IFtwb2ludCwgcG9pbnRBYnMsIGh3aWR0aCwgaGhlaWdodF0gPSBwb2ludFJlbGF0aXZlVG9FbGVtZW50KFxuICAgIGFyZ3MuZWxlbWVudCxcbiAgICBhcmdzLnBvaW50LFxuICApO1xuICBjb25zdCBzaWRlMSA9IEdBTGluZS5lcXVhdGlvbigwLCAxLCAtaGhlaWdodCk7XG4gIGNvbnN0IHNpZGUyID0gR0FMaW5lLmVxdWF0aW9uKDEsIDAsIC1od2lkdGgpO1xuICBpZiAoXG4gICAgIWlzSW5zaWRlQ2hlY2soR0FQb2ludC5kaXN0YW5jZVRvTGluZShwb2ludEFicywgc2lkZTEpLCB0aHJlc2hvbGQpIHx8XG4gICAgIWlzSW5zaWRlQ2hlY2soR0FQb2ludC5kaXN0YW5jZVRvTGluZShwb2ludEFicywgc2lkZTIpLCB0aHJlc2hvbGQpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBbcmVsWCwgcmVsWV0gPSBHQVBvaW50LnRvVHVwbGUocG9pbnQpO1xuXG4gIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQgYXMgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQpO1xuXG4gIGlmICghc2hhcGUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoYXJncy5jaGVjayA9PT0gaXNJbnNpZGVDaGVjaykge1xuICAgIGNvbnN0IGhpdCA9IHNoYXBlLnNvbWUoKHN1YnNoYXBlKSA9PlxuICAgICAgaGl0VGVzdEN1cnZlSW5zaWRlKFxuICAgICAgICBzdWJzaGFwZSxcbiAgICAgICAgcmVsWCxcbiAgICAgICAgcmVsWSxcbiAgICAgICAgZWxlbWVudC5yb3VuZG5lc3MgPyBcInJvdW5kXCIgOiBcInNoYXJwXCIsXG4gICAgICApLFxuICAgICk7XG4gICAgaWYgKGhpdCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gaGl0IHRlc3QgYWxsIFwic3Vic2hhcGVzXCIgb2YgdGhlIGxpbmVhciBlbGVtZW50XG4gIHJldHVybiBzaGFwZS5zb21lKChzdWJzaGFwZSkgPT5cbiAgICBoaXRUZXN0Um91Z2hTaGFwZShzdWJzaGFwZSwgcmVsWCwgcmVsWSwgdGhyZXNob2xkKSxcbiAgKTtcbn07XG5cbi8vIFJldHVybnM6XG4vLyAgIDEuIHRoZSBwb2ludCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudHMgKHgsIHkpIHBvc2l0aW9uXG4vLyAgIDIuIHRoZSBwb2ludCByZWxhdGl2ZSB0byB0aGUgZWxlbWVudCdzIGNlbnRlciB3aXRoIHBvc2l0aXZlICh4LCB5KVxuLy8gICAzLiBoYWxmIGVsZW1lbnQgd2lkdGhcbi8vICAgNC4gaGFsZiBlbGVtZW50IGhlaWdodFxuLy9cbi8vIE5vdGUgdGhhdCBmb3IgbGluZWFyIGVsZW1lbnRzIHRoZSAoeCwgeSkgcG9zaXRpb24gaXMgbm90IGF0IHRoZVxuLy8gdG9wIHJpZ2h0IGNvcm5lciBvZiB0aGVpciBib3VuZGFyeS5cbi8vXG4vLyBSZWN0YW5nbGVzLCBkaWFtb25kcyBhbmQgZWxsaXBzZXMgYXJlIHN5bW1ldHJpY2FsIG92ZXIgYXhlcyxcbi8vIGFuZCBvdGhlciBlbGVtZW50cyBoYXZlIGEgcmVjdGFuZ3VsYXIgYm91bmRhcnksXG4vLyBzbyB3ZSBvbmx5IG5lZWQgdG8gcGVyZm9ybSBoaXQgdGVzdHMgZm9yIHRoZSBwb3NpdGl2ZSBxdWFkcmFudC5cbmNvbnN0IHBvaW50UmVsYXRpdmVUb0VsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBwb2ludFR1cGxlOiBQb2ludCxcbik6IFtHQS5Qb2ludCwgR0EuUG9pbnQsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IHBvaW50ID0gR0FQb2ludC5mcm9tKHBvaW50VHVwbGUpO1xuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBlbGVtZW50Q29vcmRzID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjZW50ZXIgPSBjb29yZHNDZW50ZXIoW3gxLCB5MSwgeDIsIHkyXSk7XG4gIC8vIEdBIGhhcyBhbmdsZSBvcmllbnRhdGlvbiBvcHBvc2l0ZSB0byBgcm90YXRlYFxuICBjb25zdCByb3RhdGUgPSBHQVRyYW5zZm9ybS5yb3RhdGlvbihjZW50ZXIsIGVsZW1lbnQuYW5nbGUpO1xuICBjb25zdCBwb2ludFJvdGF0ZWQgPSBHQVRyYW5zZm9ybS5hcHBseShyb3RhdGUsIHBvaW50KTtcbiAgY29uc3QgcG9pbnRSZWxUb0NlbnRlciA9IEdBLnN1Yihwb2ludFJvdGF0ZWQsIEdBRGlyZWN0aW9uLmZyb20oY2VudGVyKSk7XG4gIGNvbnN0IHBvaW50UmVsVG9DZW50ZXJBYnMgPSBHQVBvaW50LmFicyhwb2ludFJlbFRvQ2VudGVyKTtcbiAgY29uc3QgZWxlbWVudFBvcyA9IEdBLm9mZnNldChlbGVtZW50LngsIGVsZW1lbnQueSk7XG4gIGNvbnN0IHBvaW50UmVsVG9Qb3MgPSBHQS5zdWIocG9pbnRSb3RhdGVkLCBlbGVtZW50UG9zKTtcbiAgY29uc3QgW2F4LCBheSwgYngsIGJ5XSA9IGVsZW1lbnRDb29yZHM7XG4gIGNvbnN0IGhhbGZXaWR0aCA9IChieCAtIGF4KSAvIDI7XG4gIGNvbnN0IGhhbGZIZWlnaHQgPSAoYnkgLSBheSkgLyAyO1xuICByZXR1cm4gW3BvaW50UmVsVG9Qb3MsIHBvaW50UmVsVG9DZW50ZXJBYnMsIGhhbGZXaWR0aCwgaGFsZkhlaWdodF07XG59O1xuXG4vLyBSZXR1cm5zIHBvaW50IGluIGFic29sdXRlIGNvb3JkaW5hdGVzXG5leHBvcnQgY29uc3QgcG9pbnRJbkFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgLy8gUG9pbnQgcmVsYXRpdmUgdG8gdGhlIGVsZW1lbnQgcG9zaXRpb25cbiAgcG9pbnQ6IFBvaW50LFxuKTogUG9pbnQgPT4ge1xuICBjb25zdCBbeCwgeV0gPSBwb2ludDtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgY29uc3QgY3ggPSAoeDIgLSB4MSkgLyAyO1xuICBjb25zdCBjeSA9ICh5MiAtIHkxKSAvIDI7XG4gIGNvbnN0IFtyb3RhdGVkWCwgcm90YXRlZFldID0gcm90YXRlKHgsIHksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gIHJldHVybiBbZWxlbWVudC54ICsgcm90YXRlZFgsIGVsZW1lbnQueSArIHJvdGF0ZWRZXTtcbn07XG5cbmNvbnN0IHJlbGF0aXZpemF0aW9uVG9FbGVtZW50Q2VudGVyID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbik6IEdBLlRyYW5zZm9ybSA9PiB7XG4gIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIGNvbnN0IGNlbnRlciA9IGNvb3Jkc0NlbnRlcihbeDEsIHkxLCB4MiwgeTJdKTtcbiAgLy8gR0EgaGFzIGFuZ2xlIG9yaWVudGF0aW9uIG9wcG9zaXRlIHRvIGByb3RhdGVgXG4gIGNvbnN0IHJvdGF0ZSA9IEdBVHJhbnNmb3JtLnJvdGF0aW9uKGNlbnRlciwgZWxlbWVudC5hbmdsZSk7XG4gIGNvbnN0IHRyYW5zbGF0ZSA9IEdBLnJldmVyc2UoXG4gICAgR0FUcmFuc2Zvcm0udHJhbnNsYXRpb24oR0FEaXJlY3Rpb24uZnJvbShjZW50ZXIpKSxcbiAgKTtcbiAgcmV0dXJuIEdBVHJhbnNmb3JtLmNvbXBvc2Uocm90YXRlLCB0cmFuc2xhdGUpO1xufTtcblxuY29uc3QgY29vcmRzQ2VudGVyID0gKFtheCwgYXksIGJ4LCBieV06IEJvdW5kcyk6IEdBLlBvaW50ID0+IHtcbiAgcmV0dXJuIEdBLnBvaW50KChheCArIGJ4KSAvIDIsIChheSArIGJ5KSAvIDIpO1xufTtcblxuLy8gVGhlIGZvY3VzIGRpc3RhbmNlIGlzIHRoZSBvcmllbnRlZCByYXRpbyBiZXR3ZWVuIHRoZSBzaXplIG9mXG4vLyB0aGUgYGVsZW1lbnRgIGFuZCB0aGUgXCJmb2N1cyBpbWFnZVwiIG9mIHRoZSBlbGVtZW50IG9uIHdoaWNoXG4vLyBhbGwgZm9jdXMgcG9pbnRzIGxpZSwgc28gaXQncyBhIG51bWJlciBiZXR3ZWVuIC0xIGFuZCAxLlxuLy8gVGhlIGxpbmUgZ29pbmcgdGhyb3VnaCBgYWAgYW5kIGBiYCBpcyBhIHRhbmdlbnQgdG8gdGhlIFwiZm9jdXMgaW1hZ2VcIlxuLy8gb2YgdGhlIGVsZW1lbnQuXG5leHBvcnQgY29uc3QgZGV0ZXJtaW5lRm9jdXNEaXN0YW5jZSA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgLy8gUG9pbnQgb24gdGhlIGxpbmUsIGluIGFic29sdXRlIGNvb3JkaW5hdGVzXG4gIGE6IFBvaW50LFxuICAvLyBBbm90aGVyIHBvaW50IG9uIHRoZSBsaW5lLCBpbiBhYnNvbHV0ZSBjb29yZGluYXRlcyAoY2xvc2VyIHRvIGVsZW1lbnQpXG4gIGI6IFBvaW50LFxuKTogbnVtYmVyID0+IHtcbiAgY29uc3QgcmVsYXRlVG9DZW50ZXIgPSByZWxhdGl2aXphdGlvblRvRWxlbWVudENlbnRlcihlbGVtZW50KTtcbiAgY29uc3QgYVJlbCA9IEdBVHJhbnNmb3JtLmFwcGx5KHJlbGF0ZVRvQ2VudGVyLCBHQVBvaW50LmZyb20oYSkpO1xuICBjb25zdCBiUmVsID0gR0FUcmFuc2Zvcm0uYXBwbHkocmVsYXRlVG9DZW50ZXIsIEdBUG9pbnQuZnJvbShiKSk7XG4gIGNvbnN0IGxpbmUgPSBHQUxpbmUudGhyb3VnaChhUmVsLCBiUmVsKTtcbiAgY29uc3QgcSA9IGVsZW1lbnQuaGVpZ2h0IC8gZWxlbWVudC53aWR0aDtcbiAgY29uc3QgaHdpZHRoID0gZWxlbWVudC53aWR0aCAvIDI7XG4gIGNvbnN0IGhoZWlnaHQgPSBlbGVtZW50LmhlaWdodCAvIDI7XG4gIGNvbnN0IG4gPSBsaW5lWzJdO1xuICBjb25zdCBtID0gbGluZVszXTtcbiAgY29uc3QgYyA9IGxpbmVbMV07XG4gIGNvbnN0IG1hYnMgPSBNYXRoLmFicyhtKTtcbiAgY29uc3QgbmFicyA9IE1hdGguYWJzKG4pO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgcmV0dXJuIGMgLyAoaHdpZHRoICogKG5hYnMgKyBxICogbWFicykpO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gbWFicyA8IG5hYnMgPyBjIC8gKG5hYnMgKiBod2lkdGgpIDogYyAvIChtYWJzICogaGhlaWdodCk7XG4gICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICAgIHJldHVybiBjIC8gKGh3aWR0aCAqIE1hdGguc3FydChuICoqIDIgKyBxICoqIDIgKiBtICoqIDIpKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRldGVybWluZUZvY3VzUG9pbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIC8vIFRoZSBvcmllbnRlZCwgcmVsYXRpdmUgZGlzdGFuY2UgZnJvbSB0aGUgY2VudGVyIG9mIGBlbGVtZW50YCBvZiB0aGVcbiAgLy8gcmV0dXJuZWQgZm9jdXNQb2ludFxuICBmb2N1czogbnVtYmVyLFxuICBhZGplY2VudFBvaW50OiBQb2ludCxcbik6IFBvaW50ID0+IHtcbiAgaWYgKGZvY3VzID09PSAwKSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjZW50ZXIgPSBjb29yZHNDZW50ZXIoW3gxLCB5MSwgeDIsIHkyXSk7XG4gICAgcmV0dXJuIEdBUG9pbnQudG9UdXBsZShjZW50ZXIpO1xuICB9XG4gIGNvbnN0IHJlbGF0ZVRvQ2VudGVyID0gcmVsYXRpdml6YXRpb25Ub0VsZW1lbnRDZW50ZXIoZWxlbWVudCk7XG4gIGNvbnN0IGFkamVjZW50UG9pbnRSZWwgPSBHQVRyYW5zZm9ybS5hcHBseShcbiAgICByZWxhdGVUb0NlbnRlcixcbiAgICBHQVBvaW50LmZyb20oYWRqZWNlbnRQb2ludCksXG4gICk7XG4gIGNvbnN0IHJldmVyc2VSZWxhdGVUb0NlbnRlciA9IEdBLnJldmVyc2UocmVsYXRlVG9DZW50ZXIpO1xuICBsZXQgcG9pbnQ7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgIGNhc2UgXCJ0ZXh0XCI6XG4gICAgY2FzZSBcImRpYW1vbmRcIjpcbiAgICAgIHBvaW50ID0gZmluZEZvY3VzUG9pbnRGb3JSZWN0YW5ndWxhcnMoZWxlbWVudCwgZm9jdXMsIGFkamVjZW50UG9pbnRSZWwpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICAgIHBvaW50ID0gZmluZEZvY3VzUG9pbnRGb3JFbGxpcHNlKGVsZW1lbnQsIGZvY3VzLCBhZGplY2VudFBvaW50UmVsKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIHJldHVybiBHQVBvaW50LnRvVHVwbGUoR0FUcmFuc2Zvcm0uYXBwbHkocmV2ZXJzZVJlbGF0ZVRvQ2VudGVyLCBwb2ludCkpO1xufTtcblxuLy8gUmV0dXJucyAyIG9yIDAgaW50ZXJzZWN0aW9uIHBvaW50cyBiZXR3ZWVuIGxpbmUgZ29pbmcgdGhyb3VnaCBgYWAgYW5kIGBiYFxuLy8gYW5kIHRoZSBgZWxlbWVudGAsIGluIGFzY2VuZGluZyBvcmRlciBvZiBkaXN0YW5jZSBmcm9tIGBhYC5cbmV4cG9ydCBjb25zdCBpbnRlcnNlY3RFbGVtZW50V2l0aExpbmUgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIC8vIFBvaW50IG9uIHRoZSBsaW5lLCBpbiBhYnNvbHV0ZSBjb29yZGluYXRlc1xuICBhOiBQb2ludCxcbiAgLy8gQW5vdGhlciBwb2ludCBvbiB0aGUgbGluZSwgaW4gYWJzb2x1dGUgY29vcmRpbmF0ZXNcbiAgYjogUG9pbnQsXG4gIC8vIElmIGdpdmVuLCB0aGUgZWxlbWVudCBpcyBpbmZsYXRlZCBieSB0aGlzIHZhbHVlXG4gIGdhcDogbnVtYmVyID0gMCxcbik6IFBvaW50W10gPT4ge1xuICBjb25zdCByZWxhdGVUb0NlbnRlciA9IHJlbGF0aXZpemF0aW9uVG9FbGVtZW50Q2VudGVyKGVsZW1lbnQpO1xuICBjb25zdCBhUmVsID0gR0FUcmFuc2Zvcm0uYXBwbHkocmVsYXRlVG9DZW50ZXIsIEdBUG9pbnQuZnJvbShhKSk7XG4gIGNvbnN0IGJSZWwgPSBHQVRyYW5zZm9ybS5hcHBseShyZWxhdGVUb0NlbnRlciwgR0FQb2ludC5mcm9tKGIpKTtcbiAgY29uc3QgbGluZSA9IEdBTGluZS50aHJvdWdoKGFSZWwsIGJSZWwpO1xuICBjb25zdCByZXZlcnNlUmVsYXRlVG9DZW50ZXIgPSBHQS5yZXZlcnNlKHJlbGF0ZVRvQ2VudGVyKTtcbiAgY29uc3QgaW50ZXJzZWN0aW9ucyA9IGdldFNvcnRlZEVsZW1lbnRMaW5lSW50ZXJzZWN0aW9ucyhcbiAgICBlbGVtZW50LFxuICAgIGxpbmUsXG4gICAgYVJlbCxcbiAgICBnYXAsXG4gICk7XG4gIHJldHVybiBpbnRlcnNlY3Rpb25zLm1hcCgocG9pbnQpID0+XG4gICAgR0FQb2ludC50b1R1cGxlKEdBVHJhbnNmb3JtLmFwcGx5KHJldmVyc2VSZWxhdGVUb0NlbnRlciwgcG9pbnQpKSxcbiAgKTtcbn07XG5cbmNvbnN0IGdldFNvcnRlZEVsZW1lbnRMaW5lSW50ZXJzZWN0aW9ucyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgLy8gUmVsYXRpdmUgdG8gZWxlbWVudCBjZW50ZXJcbiAgbGluZTogR0EuTGluZSxcbiAgLy8gUmVsYXRpdmUgdG8gZWxlbWVudCBjZW50ZXJcbiAgbmVhclBvaW50OiBHQS5Qb2ludCxcbiAgZ2FwOiBudW1iZXIgPSAwLFxuKTogR0EuUG9pbnRbXSA9PiB7XG4gIGxldCBpbnRlcnNlY3Rpb25zOiBHQS5Qb2ludFtdO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICBjb25zdCBjb3JuZXJzID0gZ2V0Q29ybmVycyhlbGVtZW50KTtcbiAgICAgIGludGVyc2VjdGlvbnMgPSBjb3JuZXJzXG4gICAgICAgIC5mbGF0TWFwKChwb2ludCwgaSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGVkZ2U6IFtHQS5Qb2ludCwgR0EuUG9pbnRdID0gW3BvaW50LCBjb3JuZXJzWyhpICsgMSkgJSA0XV07XG4gICAgICAgICAgcmV0dXJuIGludGVyc2VjdFNlZ21lbnQobGluZSwgb2Zmc2V0U2VnbWVudChlZGdlLCBnYXApKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNvbmNhdChcbiAgICAgICAgICBjb3JuZXJzLmZsYXRNYXAoKHBvaW50KSA9PiBnZXRDaXJjbGVJbnRlcnNlY3Rpb25zKHBvaW50LCBnYXAsIGxpbmUpKSxcbiAgICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICBpbnRlcnNlY3Rpb25zID0gZ2V0RWxsaXBzZUludGVyc2VjdGlvbnMoZWxlbWVudCwgZ2FwLCBsaW5lKTtcbiAgICAgIGJyZWFrO1xuICB9XG4gIGlmIChpbnRlcnNlY3Rpb25zLmxlbmd0aCA8IDIpIHtcbiAgICAvLyBJZ25vcmUgdGhlIFwiZWRnZVwiIGNhc2Ugb2Ygb25seSBpbnRlcnNlY3Rpbmcgd2l0aCBhIHNpbmdsZSBjb3JuZXJcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3Qgc29ydGVkSW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuc29ydChcbiAgICAoaTEsIGkyKSA9PlxuICAgICAgR0FQb2ludC5kaXN0YW5jZShpMSwgbmVhclBvaW50KSAtIEdBUG9pbnQuZGlzdGFuY2UoaTIsIG5lYXJQb2ludCksXG4gICk7XG4gIHJldHVybiBbXG4gICAgc29ydGVkSW50ZXJzZWN0aW9uc1swXSxcbiAgICBzb3J0ZWRJbnRlcnNlY3Rpb25zW3NvcnRlZEludGVyc2VjdGlvbnMubGVuZ3RoIC0gMV0sXG4gIF07XG59O1xuXG5jb25zdCBnZXRDb3JuZXJzID0gKFxuICBlbGVtZW50OlxuICAgIHwgRXhjYWxpZHJhd1JlY3RhbmdsZUVsZW1lbnRcbiAgICB8IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRcbiAgICB8IEV4Y2FsaWRyYXdEaWFtb25kRWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBzY2FsZTogbnVtYmVyID0gMSxcbik6IEdBLlBvaW50W10gPT4ge1xuICBjb25zdCBoeCA9IChzY2FsZSAqIGVsZW1lbnQud2lkdGgpIC8gMjtcbiAgY29uc3QgaHkgPSAoc2NhbGUgKiBlbGVtZW50LmhlaWdodCkgLyAyO1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgcmV0dXJuIFtcbiAgICAgICAgR0EucG9pbnQoaHgsIGh5KSxcbiAgICAgICAgR0EucG9pbnQoaHgsIC1oeSksXG4gICAgICAgIEdBLnBvaW50KC1oeCwgLWh5KSxcbiAgICAgICAgR0EucG9pbnQoLWh4LCBoeSksXG4gICAgICBdO1xuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICByZXR1cm4gW1xuICAgICAgICBHQS5wb2ludCgwLCBoeSksXG4gICAgICAgIEdBLnBvaW50KGh4LCAwKSxcbiAgICAgICAgR0EucG9pbnQoMCwgLWh5KSxcbiAgICAgICAgR0EucG9pbnQoLWh4LCAwKSxcbiAgICAgIF07XG4gIH1cbn07XG5cbi8vIFJldHVybnMgaW50ZXJzZWN0aW9uIG9mIGBsaW5lYCB3aXRoIGBzZWdtZW50YCwgd2l0aCBgc2VnbWVudGAgbW92ZWQgYnlcbi8vIGBnYXBgIGluIGl0cyBwb2xhciBkaXJlY3Rpb24uXG4vLyBJZiBpbnRlcnNlY3Rpb24gY29pbmNpZGVzIHdpdGggc2Vjb25kIHNlZ21lbnQgcG9pbnQgcmV0dXJucyBlbXB0eSBhcnJheS5cbmNvbnN0IGludGVyc2VjdFNlZ21lbnQgPSAoXG4gIGxpbmU6IEdBLkxpbmUsXG4gIHNlZ21lbnQ6IFtHQS5Qb2ludCwgR0EuUG9pbnRdLFxuKTogR0EuUG9pbnRbXSA9PiB7XG4gIGNvbnN0IFthLCBiXSA9IHNlZ21lbnQ7XG4gIGNvbnN0IGFEaXN0ID0gR0FQb2ludC5kaXN0YW5jZVRvTGluZShhLCBsaW5lKTtcbiAgY29uc3QgYkRpc3QgPSBHQVBvaW50LmRpc3RhbmNlVG9MaW5lKGIsIGxpbmUpO1xuICBpZiAoYURpc3QgKiBiRGlzdCA+PSAwKSB7XG4gICAgLy8gVGhlIGludGVyc2VjdGlvbiBpcyBvdXRzaWRlIHNlZ21lbnQgYChhLCBiKWBcbiAgICByZXR1cm4gW107XG4gIH1cbiAgcmV0dXJuIFtHQVBvaW50LmludGVyc2VjdChsaW5lLCBHQUxpbmUudGhyb3VnaChhLCBiKSldO1xufTtcblxuY29uc3Qgb2Zmc2V0U2VnbWVudCA9IChcbiAgc2VnbWVudDogW0dBLlBvaW50LCBHQS5Qb2ludF0sXG4gIGRpc3RhbmNlOiBudW1iZXIsXG4pOiBbR0EuUG9pbnQsIEdBLlBvaW50XSA9PiB7XG4gIGNvbnN0IFthLCBiXSA9IHNlZ21lbnQ7XG4gIGNvbnN0IG9mZnNldCA9IEdBVHJhbnNmb3JtLnRyYW5zbGF0aW9uT3J0aG9nb25hbChcbiAgICBHQURpcmVjdGlvbi5mcm9tVG8oYSwgYiksXG4gICAgZGlzdGFuY2UsXG4gICk7XG4gIHJldHVybiBbR0FUcmFuc2Zvcm0uYXBwbHkob2Zmc2V0LCBhKSwgR0FUcmFuc2Zvcm0uYXBwbHkob2Zmc2V0LCBiKV07XG59O1xuXG5jb25zdCBnZXRFbGxpcHNlSW50ZXJzZWN0aW9ucyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsbGlwc2VFbGVtZW50LFxuICBnYXA6IG51bWJlcixcbiAgbGluZTogR0EuTGluZSxcbik6IEdBLlBvaW50W10gPT4ge1xuICBjb25zdCBhID0gZWxlbWVudC53aWR0aCAvIDIgKyBnYXA7XG4gIGNvbnN0IGIgPSBlbGVtZW50LmhlaWdodCAvIDIgKyBnYXA7XG4gIGNvbnN0IG0gPSBsaW5lWzJdO1xuICBjb25zdCBuID0gbGluZVszXTtcbiAgY29uc3QgYyA9IGxpbmVbMV07XG4gIGNvbnN0IHNxdWFyZXMgPSBhICogYSAqIG0gKiBtICsgYiAqIGIgKiBuICogbjtcbiAgY29uc3QgZGlzY3IgPSBzcXVhcmVzIC0gYyAqIGM7XG4gIGlmIChzcXVhcmVzID09PSAwIHx8IGRpc2NyIDw9IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgY29uc3QgZGlzY3JSb290ID0gTWF0aC5zcXJ0KGRpc2NyKTtcbiAgY29uc3QgeG4gPSAtYSAqIGEgKiBtICogYztcbiAgY29uc3QgeW4gPSAtYiAqIGIgKiBuICogYztcbiAgcmV0dXJuIFtcbiAgICBHQS5wb2ludChcbiAgICAgICh4biArIGEgKiBiICogbiAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzLFxuICAgICAgKHluIC0gYSAqIGIgKiBtICogZGlzY3JSb290KSAvIHNxdWFyZXMsXG4gICAgKSxcbiAgICBHQS5wb2ludChcbiAgICAgICh4biAtIGEgKiBiICogbiAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzLFxuICAgICAgKHluICsgYSAqIGIgKiBtICogZGlzY3JSb290KSAvIHNxdWFyZXMsXG4gICAgKSxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDaXJjbGVJbnRlcnNlY3Rpb25zID0gKFxuICBjZW50ZXI6IEdBLlBvaW50LFxuICByYWRpdXM6IG51bWJlcixcbiAgbGluZTogR0EuTGluZSxcbik6IEdBLlBvaW50W10gPT4ge1xuICBpZiAocmFkaXVzID09PSAwKSB7XG4gICAgcmV0dXJuIEdBUG9pbnQuZGlzdGFuY2VUb0xpbmUobGluZSwgY2VudGVyKSA9PT0gMCA/IFtjZW50ZXJdIDogW107XG4gIH1cbiAgY29uc3QgbSA9IGxpbmVbMl07XG4gIGNvbnN0IG4gPSBsaW5lWzNdO1xuICBjb25zdCBjID0gbGluZVsxXTtcbiAgY29uc3QgW2EsIGJdID0gR0FQb2ludC50b1R1cGxlKGNlbnRlcik7XG4gIGNvbnN0IHIgPSByYWRpdXM7XG4gIGNvbnN0IHNxdWFyZXMgPSBtICogbSArIG4gKiBuO1xuICBjb25zdCBkaXNjciA9IHIgKiByICogc3F1YXJlcyAtIChtICogYSArIG4gKiBiICsgYykgKiogMjtcbiAgaWYgKHNxdWFyZXMgPT09IDAgfHwgZGlzY3IgPD0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBkaXNjclJvb3QgPSBNYXRoLnNxcnQoZGlzY3IpO1xuICBjb25zdCB4biA9IGEgKiBuICogbiAtIGIgKiBtICogbiAtIG0gKiBjO1xuICBjb25zdCB5biA9IGIgKiBtICogbSAtIGEgKiBtICogbiAtIG4gKiBjO1xuXG4gIHJldHVybiBbXG4gICAgR0EucG9pbnQoKHhuICsgbiAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzLCAoeW4gLSBtICogZGlzY3JSb290KSAvIHNxdWFyZXMpLFxuICAgIEdBLnBvaW50KCh4biAtIG4gKiBkaXNjclJvb3QpIC8gc3F1YXJlcywgKHluICsgbSAqIGRpc2NyUm9vdCkgLyBzcXVhcmVzKSxcbiAgXTtcbn07XG5cbi8vIFRoZSBmb2N1cyBwb2ludCBpcyB0aGUgdGFuZ2VudCBwb2ludCBvZiB0aGUgXCJmb2N1cyBpbWFnZVwiIG9mIHRoZVxuLy8gYGVsZW1lbnRgLCB3aGVyZSB0aGUgdGFuZ2VudCBnb2VzIHRocm91Z2ggYHBvaW50YC5cbmV4cG9ydCBjb25zdCBmaW5kRm9jdXNQb2ludEZvckVsbGlwc2UgPSAoXG4gIGVsbGlwc2U6IEV4Y2FsaWRyYXdFbGxpcHNlRWxlbWVudCxcbiAgLy8gQmV0d2VlbiAtMSBhbmQgMSAobm90IDApIHRoZSByZWxhdGl2ZSBzaXplIG9mIHRoZSBcImZvY3VzIGltYWdlXCIgb2ZcbiAgLy8gdGhlIGVsZW1lbnQgb24gd2hpY2ggdGhlIGZvY3VzIHBvaW50IGxpZXNcbiAgcmVsYXRpdmVEaXN0YW5jZTogbnVtYmVyLFxuICAvLyBUaGUgcG9pbnQgZm9yIHdoaWNoIHdlJ3JlIHRyeWluZyB0byBmaW5kIHRoZSBmb2N1cyBwb2ludCwgcmVsYXRpdmVcbiAgLy8gdG8gdGhlIGVsbGlwc2UgY2VudGVyLlxuICBwb2ludDogR0EuUG9pbnQsXG4pOiBHQS5Qb2ludCA9PiB7XG4gIGNvbnN0IHJlbGF0aXZlRGlzdGFuY2VBYnMgPSBNYXRoLmFicyhyZWxhdGl2ZURpc3RhbmNlKTtcbiAgY29uc3QgYSA9IChlbGxpcHNlLndpZHRoICogcmVsYXRpdmVEaXN0YW5jZUFicykgLyAyO1xuICBjb25zdCBiID0gKGVsbGlwc2UuaGVpZ2h0ICogcmVsYXRpdmVEaXN0YW5jZUFicykgLyAyO1xuXG4gIGNvbnN0IG9yaWVudGF0aW9uID0gTWF0aC5zaWduKHJlbGF0aXZlRGlzdGFuY2UpO1xuICBjb25zdCBbcHgsIHB5b10gPSBHQVBvaW50LnRvVHVwbGUocG9pbnQpO1xuXG4gIC8vIFRoZSBjYWxjdWxhdGlvbiBiZWxvdyBjYW4ndCBoYW5kbGUgcHkgPSAwXG4gIGNvbnN0IHB5ID0gcHlvID09PSAwID8gMC4wMDAxIDogcHlvO1xuXG4gIGNvbnN0IHNxdWFyZXMgPSBweCAqKiAyICogYiAqKiAyICsgcHkgKiogMiAqIGEgKiogMjtcbiAgLy8gVGFuZ2VudCBteCArIG55ICsgMSA9IDBcbiAgY29uc3QgbSA9XG4gICAgKC1weCAqIGIgKiogMiArXG4gICAgICBvcmllbnRhdGlvbiAqIHB5ICogTWF0aC5zcXJ0KE1hdGgubWF4KDAsIHNxdWFyZXMgLSBhICoqIDIgKiBiICoqIDIpKSkgL1xuICAgIHNxdWFyZXM7XG5cbiAgY29uc3QgbiA9ICgtbSAqIHB4IC0gMSkgLyBweTtcblxuICBjb25zdCB4ID0gLShhICoqIDIgKiBtKSAvIChuICoqIDIgKiBiICoqIDIgKyBtICoqIDIgKiBhICoqIDIpO1xuICByZXR1cm4gR0EucG9pbnQoeCwgKC1tICogeCAtIDEpIC8gbik7XG59O1xuXG5leHBvcnQgY29uc3QgZmluZEZvY3VzUG9pbnRGb3JSZWN0YW5ndWxhcnMgPSAoXG4gIGVsZW1lbnQ6XG4gICAgfCBFeGNhbGlkcmF3UmVjdGFuZ2xlRWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd0ltYWdlRWxlbWVudFxuICAgIHwgRXhjYWxpZHJhd0RpYW1vbmRFbGVtZW50XG4gICAgfCBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIC8vIEJldHdlZW4gLTEgYW5kIDEgZm9yIGhvdyBmYXIgYXdheSBzaG91bGQgdGhlIGZvY3VzIHBvaW50IGJlIHJlbGF0aXZlXG4gIC8vIHRvIHRoZSBzaXplIG9mIHRoZSBlbGVtZW50LiBTaWduIGRldGVybWluZXMgb3JpZW50YXRpb24uXG4gIHJlbGF0aXZlRGlzdGFuY2U6IG51bWJlcixcbiAgLy8gVGhlIHBvaW50IGZvciB3aGljaCB3ZSdyZSB0cnlpbmcgdG8gZmluZCB0aGUgZm9jdXMgcG9pbnQsIHJlbGF0aXZlXG4gIC8vIHRvIHRoZSBlbGVtZW50IGNlbnRlci5cbiAgcG9pbnQ6IEdBLlBvaW50LFxuKTogR0EuUG9pbnQgPT4ge1xuICBjb25zdCByZWxhdGl2ZURpc3RhbmNlQWJzID0gTWF0aC5hYnMocmVsYXRpdmVEaXN0YW5jZSk7XG4gIGNvbnN0IG9yaWVudGF0aW9uID0gTWF0aC5zaWduKHJlbGF0aXZlRGlzdGFuY2UpO1xuICBjb25zdCBjb3JuZXJzID0gZ2V0Q29ybmVycyhlbGVtZW50LCByZWxhdGl2ZURpc3RhbmNlQWJzKTtcblxuICBsZXQgbWF4RGlzdGFuY2UgPSAwO1xuICBsZXQgdGFuZ2VudFBvaW50OiBudWxsIHwgR0EuUG9pbnQgPSBudWxsO1xuICBjb3JuZXJzLmZvckVhY2goKGNvcm5lcikgPT4ge1xuICAgIGNvbnN0IGRpc3RhbmNlID0gb3JpZW50YXRpb24gKiBHQUxpbmUudGhyb3VnaChwb2ludCwgY29ybmVyKVsxXTtcbiAgICBpZiAoZGlzdGFuY2UgPiBtYXhEaXN0YW5jZSkge1xuICAgICAgbWF4RGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIHRhbmdlbnRQb2ludCA9IGNvcm5lcjtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gdGFuZ2VudFBvaW50ITtcbn07XG5cbmNvbnN0IHBvaW50SW5CZXppZXJFcXVhdGlvbiA9IChcbiAgcDA6IFBvaW50LFxuICBwMTogUG9pbnQsXG4gIHAyOiBQb2ludCxcbiAgcDM6IFBvaW50LFxuICBbbXgsIG15XTogUG9pbnQsXG4gIGxpbmVUaHJlc2hvbGQ6IG51bWJlcixcbikgPT4ge1xuICAvLyBCKHQpID0gcDAgKiAoMS10KV4zICsgM3AxICogdCAqICgxLXQpXjIgKyAzcDIgKiB0XjIgKiAoMS10KSArIHAzICogdF4zXG4gIGNvbnN0IGVxdWF0aW9uID0gKHQ6IG51bWJlciwgaWR4OiBudW1iZXIpID0+XG4gICAgTWF0aC5wb3coMSAtIHQsIDMpICogcDNbaWR4XSArXG4gICAgMyAqIHQgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBwMltpZHhdICtcbiAgICAzICogTWF0aC5wb3codCwgMikgKiAoMSAtIHQpICogcDFbaWR4XSArXG4gICAgcDBbaWR4XSAqIE1hdGgucG93KHQsIDMpO1xuXG4gIC8vIGdvIHRocm91Z2ggdCBpbiBpbmNyZW1lbnRzIG9mIDAuMDFcbiAgbGV0IHQgPSAwO1xuICB3aGlsZSAodCA8PSAxLjApIHtcbiAgICBjb25zdCB0eCA9IGVxdWF0aW9uKHQsIDApO1xuICAgIGNvbnN0IHR5ID0gZXF1YXRpb24odCwgMSk7XG5cbiAgICBjb25zdCBkaWZmID0gTWF0aC5zcXJ0KE1hdGgucG93KHR4IC0gbXgsIDIpICsgTWF0aC5wb3codHkgLSBteSwgMikpO1xuXG4gICAgaWYgKGRpZmYgPCBsaW5lVGhyZXNob2xkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0ICs9IDAuMDE7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBoaXRUZXN0Q3VydmVJbnNpZGUgPSAoXG4gIGRyYXdhYmxlOiBEcmF3YWJsZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIHJvdW5kbmVzczogU3Ryb2tlUm91bmRuZXNzLFxuKSA9PiB7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhkcmF3YWJsZSk7XG4gIGNvbnN0IHBvaW50czogTXV0YWJsZTxQb2ludD5bXSA9IFtdO1xuICBsZXQgb2RkID0gZmFsc2U7IC8vIHNlbGVjdCBvbmUgbGluZSBvdXQgb2YgZG91YmxlIGxpbmVzXG4gIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIG9wcykge1xuICAgIGlmIChvcGVyYXRpb24ub3AgPT09IFwibW92ZVwiKSB7XG4gICAgICBvZGQgPSAhb2RkO1xuICAgICAgaWYgKG9kZCkge1xuICAgICAgICBwb2ludHMucHVzaChbb3BlcmF0aW9uLmRhdGFbMF0sIG9wZXJhdGlvbi5kYXRhWzFdXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChvcGVyYXRpb24ub3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgICAgaWYgKG9kZCkge1xuICAgICAgICBwb2ludHMucHVzaChbb3BlcmF0aW9uLmRhdGFbMF0sIG9wZXJhdGlvbi5kYXRhWzFdXSk7XG4gICAgICAgIHBvaW50cy5wdXNoKFtvcGVyYXRpb24uZGF0YVsyXSwgb3BlcmF0aW9uLmRhdGFbM11dKTtcbiAgICAgICAgcG9pbnRzLnB1c2goW29wZXJhdGlvbi5kYXRhWzRdLCBvcGVyYXRpb24uZGF0YVs1XV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAob3BlcmF0aW9uLm9wID09PSBcImxpbmVUb1wiKSB7XG4gICAgICBpZiAob2RkKSB7XG4gICAgICAgIHBvaW50cy5wdXNoKFtvcGVyYXRpb24uZGF0YVswXSwgb3BlcmF0aW9uLmRhdGFbMV1dKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgaWYgKHBvaW50cy5sZW5ndGggPj0gNCkge1xuICAgIGlmIChyb3VuZG5lc3MgPT09IFwic2hhcnBcIikge1xuICAgICAgcmV0dXJuIGlzUG9pbnRJblBvbHlnb24ocG9pbnRzLCB4LCB5KTtcbiAgICB9XG4gICAgY29uc3QgcG9seWdvblBvaW50cyA9IHBvaW50c09uQmV6aWVyQ3VydmVzKHBvaW50cywgMTAsIDUpO1xuICAgIHJldHVybiBpc1BvaW50SW5Qb2x5Z29uKHBvbHlnb25Qb2ludHMsIHgsIHkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmNvbnN0IGhpdFRlc3RSb3VnaFNoYXBlID0gKFxuICBkcmF3YWJsZTogRHJhd2FibGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBsaW5lVGhyZXNob2xkOiBudW1iZXIsXG4pID0+IHtcbiAgLy8gcmVhZCBvcGVyYXRpb25zIGZyb20gZmlyc3Qgb3BTZXRcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGRyYXdhYmxlKTtcblxuICAvLyBzZXQgc3RhcnQgcG9zaXRpb24gYXMgKDAsMCkganVzdCBpbiBjYXNlXG4gIC8vIG1vdmUgb3BlcmF0aW9uIGRvZXMgbm90IGV4aXN0ICh1bmxpa2VseSBidXQgaXQgaXMgd29ydGggc2FmZWtlZXBpbmcgaXQpXG4gIGxldCBjdXJyZW50UDogUG9pbnQgPSBbMCwgMF07XG5cbiAgcmV0dXJuIG9wcy5zb21lKCh7IG9wLCBkYXRhIH0sIGlkeCkgPT4ge1xuICAgIC8vIFRoZXJlIGFyZSBvbmx5IGZvdXIgb3BlcmF0aW9uIHR5cGVzOlxuICAgIC8vIG1vdmUsIGJjdXJ2ZVRvLCBsaW5lVG8sIGFuZCBjdXJ2ZVRvXG4gICAgaWYgKG9wID09PSBcIm1vdmVcIikge1xuICAgICAgLy8gY2hhbmdlIHN0YXJ0aW5nIHBvaW50XG4gICAgICBjdXJyZW50UCA9IGRhdGEgYXMgdW5rbm93biBhcyBQb2ludDtcbiAgICAgIC8vIG1vdmUgb3BlcmF0aW9uIGRvZXMgbm90IGRyYXcgYW55dGhpbmc7IHNvLCBpdCBhbHdheXNcbiAgICAgIC8vIHJldHVybnMgZmFsc2VcbiAgICB9IGVsc2UgaWYgKG9wID09PSBcImJjdXJ2ZVRvXCIpIHtcbiAgICAgIC8vIGNyZWF0ZSBwb2ludHMgZnJvbSBiZXppZXIgY3VydmVcbiAgICAgIC8vIGJlemllciBjdXJ2ZSBzdG9yZXMgZGF0YSBhcyBhIGZsYXR0ZW5lZCBhcnJheSBvZiB0aHJlZSBwb3NpdGlvbnNcbiAgICAgIC8vIFt4MSwgeTEsIHgyLCB5MiwgeDMsIHkzXVxuICAgICAgY29uc3QgcDEgPSBbZGF0YVswXSwgZGF0YVsxXV0gYXMgUG9pbnQ7XG4gICAgICBjb25zdCBwMiA9IFtkYXRhWzJdLCBkYXRhWzNdXSBhcyBQb2ludDtcbiAgICAgIGNvbnN0IHAzID0gW2RhdGFbNF0sIGRhdGFbNV1dIGFzIFBvaW50O1xuXG4gICAgICBjb25zdCBwMCA9IGN1cnJlbnRQO1xuICAgICAgY3VycmVudFAgPSBwMztcblxuICAgICAgLy8gY2hlY2sgaWYgcG9pbnRzIGFyZSBvbiB0aGUgY3VydmVcbiAgICAgIC8vIGN1YmljIGJlemllciBjdXJ2ZXMgcmVxdWlyZSBmb3VyIHBhcmFtZXRlcnNcbiAgICAgIC8vIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIGxhc3Qgc3RvcmVkIHBvc2l0aW9uIChwMClcbiAgICAgIGNvbnN0IHJldFZhbCA9IHBvaW50SW5CZXppZXJFcXVhdGlvbihcbiAgICAgICAgcDAsXG4gICAgICAgIHAxLFxuICAgICAgICBwMixcbiAgICAgICAgcDMsXG4gICAgICAgIFt4LCB5XSxcbiAgICAgICAgbGluZVRocmVzaG9sZCxcbiAgICAgICk7XG5cbiAgICAgIC8vIHNldCBlbmQgcG9pbnQgb2YgYmV6aWVyIGN1cnZlIGFzIHRoZSBuZXcgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAvLyB1cGNvbWluZyBvcGVyYXRpb25zIGFzIGVhY2ggb3BlcmF0aW9uIGlzIGJhc2VkIG9uIHRoZSBsYXN0IGRyYXduXG4gICAgICAvLyBwb3NpdGlvbiBvZiB0aGUgcHJldmlvdXMgb3BlcmF0aW9uXG4gICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gZWxzZSBpZiAob3AgPT09IFwibGluZVRvXCIpIHtcbiAgICAgIHJldHVybiBoaXRUZXN0Q3VydmVJbnNpZGUoZHJhd2FibGUsIHgsIHksIFwic2hhcnBcIik7XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gXCJxY3VydmVUb1wiKSB7XG4gICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgY29uc29sZS53YXJuKFwicWN1cnZlVG8gaXMgbm90IGltcGxlbWVudGVkIHlldFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/collision.ts\n");
|
|
3409
3409
|
|
|
3410
3410
|
/***/ }),
|
|
3411
3411
|
|
|
@@ -3449,7 +3449,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3449
3449
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3450
3450
|
|
|
3451
3451
|
"use strict";
|
|
3452
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LinearElementEditor\": () => (/* binding */ LinearElementEditor)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./binding */ \"../../element/binding.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst editorMidPointsCache = { version: null, points: [], zoom: null };\nclass LinearElementEditor {\n constructor(element, scene) {\n this.elementId = element.id;\n _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].mapElementToScene(this.elementId, scene);\n LinearElementEditor.normalizePoints(element);\n this.selectedPointsIndices = null;\n this.lastUncommittedPoint = null;\n this.isDragging = false;\n this.pointerOffset = { x: 0, y: 0 };\n this.startBindingElement = \"keep\";\n this.endBindingElement = \"keep\";\n this.pointerDownState = {\n prevSelectedPointsIndices: null,\n lastClickedPoint: -1,\n origin: null,\n segmentMidpoint: {\n value: null,\n index: null,\n added: false,\n },\n };\n this.hoverPointIndex = -1;\n this.segmentMidPointHoveredCoords = null;\n }\n /**\n * @param id the `elementId` from the instance of this class (so that we can\n * statically guarantee this method returns an ExcalidrawLinearElement)\n */\n static getElement(id) {\n var _a;\n const element = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getScene(id)) === null || _a === void 0 ? void 0 : _a.getNonDeletedElement(id);\n if (element) {\n return element;\n }\n return null;\n }\n static handleBoxSelection(event, appState, setState) {\n var _a;\n if (!appState.editingLinearElement ||\n ((_a = appState.draggingElement) === null || _a === void 0 ? void 0 : _a.type) !== \"selection\") {\n return false;\n }\n const { editingLinearElement } = appState;\n const { selectedPointsIndices, elementId } = editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return false;\n }\n const [selectionX1, selectionY1, selectionX2, selectionY2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(appState.draggingElement);\n const pointsSceneCoords = LinearElementEditor.getPointsGlobalCoordinates(element);\n const nextSelectedPoints = pointsSceneCoords.reduce((acc, point, index) => {\n if ((point[0] >= selectionX1 &&\n point[0] <= selectionX2 &&\n point[1] >= selectionY1 &&\n point[1] <= selectionY2) ||\n (event.shiftKey && (selectedPointsIndices === null || selectedPointsIndices === void 0 ? void 0 : selectedPointsIndices.includes(index)))) {\n acc.push(index);\n }\n return acc;\n }, []);\n setState({\n editingLinearElement: Object.assign(Object.assign({}, editingLinearElement), { selectedPointsIndices: nextSelectedPoints.length\n ? nextSelectedPoints\n : null }),\n });\n }\n /** @returns whether point was dragged */\n static handlePointDragging(event, appState, scenePointerX, scenePointerY, maybeSuggestBinding, linearElementEditor) {\n if (!linearElementEditor) {\n return false;\n }\n const { selectedPointsIndices, elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return false;\n }\n // point that's being dragged (out of all selected points)\n const draggingPoint = element.points[linearElementEditor.pointerDownState.lastClickedPoint];\n if (selectedPointsIndices && draggingPoint) {\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_8__.shouldRotateWithDiscreteAngle)(event) &&\n selectedPointsIndices.length === 1 &&\n element.points.length > 1) {\n const selectedIndex = selectedPointsIndices[0];\n const referencePoint = element.points[selectedIndex === 0 ? 1 : selectedIndex - 1];\n const [width, height] = LinearElementEditor._getShiftLockedDelta(element, referencePoint, [scenePointerX, scenePointerY], appState.gridSize);\n LinearElementEditor.movePoints(element, [\n {\n index: selectedIndex,\n point: [width + referencePoint[0], height + referencePoint[1]],\n isDragging: selectedIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint,\n },\n ]);\n }\n else {\n const newDraggingPointPosition = LinearElementEditor.createPointAt(element, scenePointerX - linearElementEditor.pointerOffset.x, scenePointerY - linearElementEditor.pointerOffset.y, appState.gridSize);\n const deltaX = newDraggingPointPosition[0] - draggingPoint[0];\n const deltaY = newDraggingPointPosition[1] - draggingPoint[1];\n LinearElementEditor.movePoints(element, selectedPointsIndices.map((pointIndex) => {\n const newPointPosition = pointIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint\n ? LinearElementEditor.createPointAt(element, scenePointerX - linearElementEditor.pointerOffset.x, scenePointerY - linearElementEditor.pointerOffset.y, appState.gridSize)\n : [\n element.points[pointIndex][0] + deltaX,\n element.points[pointIndex][1] + deltaY,\n ];\n return {\n index: pointIndex,\n point: newPointPosition,\n isDragging: pointIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint,\n };\n }));\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n if (boundTextElement) {\n (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.handleBindTextResize)(element, false);\n }\n }\n // suggest bindings for first and last point if selected\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindingElement)(element, false)) {\n const coords = [];\n const firstSelectedIndex = selectedPointsIndices[0];\n if (firstSelectedIndex === 0) {\n coords.push((0,_utils__WEBPACK_IMPORTED_MODULE_6__.tupleToCoors)(LinearElementEditor.getPointGlobalCoordinates(element, element.points[0])));\n }\n const lastSelectedIndex = selectedPointsIndices[selectedPointsIndices.length - 1];\n if (lastSelectedIndex === element.points.length - 1) {\n coords.push((0,_utils__WEBPACK_IMPORTED_MODULE_6__.tupleToCoors)(LinearElementEditor.getPointGlobalCoordinates(element, element.points[lastSelectedIndex])));\n }\n if (coords.length) {\n maybeSuggestBinding(element, coords);\n }\n }\n return true;\n }\n return false;\n }\n static handlePointerUp(event, editingLinearElement, appState) {\n var _a;\n const { elementId, selectedPointsIndices, isDragging, pointerDownState } = editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return editingLinearElement;\n }\n const bindings = {};\n if (isDragging && selectedPointsIndices) {\n for (const selectedPoint of selectedPointsIndices) {\n if (selectedPoint === 0 ||\n selectedPoint === element.points.length - 1) {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.isPathALoop)(element.points, appState.zoom.value)) {\n LinearElementEditor.movePoints(element, [\n {\n index: selectedPoint,\n point: selectedPoint === 0\n ? element.points[element.points.length - 1]\n : element.points[0],\n },\n ]);\n }\n const bindingElement = (0,_binding__WEBPACK_IMPORTED_MODULE_5__.isBindingEnabled)(appState)\n ? (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)((0,_utils__WEBPACK_IMPORTED_MODULE_6__.tupleToCoors)(LinearElementEditor.getPointAtIndexGlobalCoordinates(element, selectedPoint)), _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getScene(element))\n : null;\n bindings[selectedPoint === 0 ? \"startBindingElement\" : \"endBindingElement\"] = bindingElement;\n }\n }\n }\n return Object.assign(Object.assign(Object.assign({}, editingLinearElement), bindings), { \n // if clicking without previously dragging a point(s), and not holding\n // shift, deselect all points except the one clicked. If holding shift,\n // toggle the point.\n selectedPointsIndices: isDragging || event.shiftKey\n ? !isDragging &&\n event.shiftKey &&\n ((_a = pointerDownState.prevSelectedPointsIndices) === null || _a === void 0 ? void 0 : _a.includes(pointerDownState.lastClickedPoint))\n ? selectedPointsIndices &&\n selectedPointsIndices.filter((pointIndex) => pointIndex !== pointerDownState.lastClickedPoint)\n : selectedPointsIndices\n : (selectedPointsIndices === null || selectedPointsIndices === void 0 ? void 0 : selectedPointsIndices.includes(pointerDownState.lastClickedPoint))\n ? [pointerDownState.lastClickedPoint]\n : selectedPointsIndices, isDragging: false, pointerOffset: { x: 0, y: 0 } });\n }\n static isSegmentTooShort(element, startPoint, endPoint, zoom) {\n let distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n if (element.points.length > 2 && element.roundness) {\n distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getBezierCurveLength)(element, endPoint);\n }\n return distance * zoom.value < LinearElementEditor.POINT_HANDLE_SIZE * 4;\n }\n static getSegmentMidPoint(element, startPoint, endPoint, endPointIndex) {\n let segmentMidPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.centerPoint)(startPoint, endPoint);\n if (element.points.length > 2 && element.roundness) {\n const controlPoints = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getControlPointsForBezierCurve)(element, element.points[endPointIndex]);\n if (controlPoints) {\n const t = (0,_math__WEBPACK_IMPORTED_MODULE_0__.mapIntervalToBezierT)(element, element.points[endPointIndex], 0.5);\n const [tx, ty] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getBezierXY)(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3], t);\n segmentMidPoint = LinearElementEditor.getPointGlobalCoordinates(element, [tx, ty]);\n }\n }\n return segmentMidPoint;\n }\n static getSegmentMidPointIndex(linearElementEditor, appState, midPoint) {\n const element = LinearElementEditor.getElement(linearElementEditor.elementId);\n if (!element) {\n return -1;\n }\n const midPoints = LinearElementEditor.getEditorMidPoints(element, appState);\n let index = 0;\n while (index < midPoints.length) {\n if (LinearElementEditor.arePointsEqual(midPoint, midPoints[index])) {\n return index + 1;\n }\n index++;\n }\n return -1;\n }\n static handlePointerDown(event, appState, history, scenePointer, linearElementEditor) {\n var _a;\n const ret = {\n didAddPoint: false,\n hitElement: null,\n linearElementEditor: null,\n };\n if (!linearElementEditor) {\n return ret;\n }\n const { elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return ret;\n }\n const segmentMidpoint = LinearElementEditor.getSegmentMidpointHitCoords(linearElementEditor, scenePointer, appState);\n let segmentMidpointIndex = null;\n if (segmentMidpoint) {\n segmentMidpointIndex = LinearElementEditor.getSegmentMidPointIndex(linearElementEditor, appState, segmentMidpoint);\n }\n if (event.altKey && appState.editingLinearElement) {\n if (linearElementEditor.lastUncommittedPoint == null) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n points: [\n ...element.points,\n LinearElementEditor.createPointAt(element, scenePointer.x, scenePointer.y, appState.gridSize),\n ],\n });\n ret.didAddPoint = true;\n }\n history.resumeRecording();\n ret.linearElementEditor = Object.assign(Object.assign({}, linearElementEditor), { pointerDownState: {\n prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n lastClickedPoint: -1,\n origin: { x: scenePointer.x, y: scenePointer.y },\n segmentMidpoint: {\n value: segmentMidpoint,\n index: segmentMidpointIndex,\n added: false,\n },\n }, selectedPointsIndices: [element.points.length - 1], lastUncommittedPoint: null, endBindingElement: (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)(scenePointer, _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getScene(element)) });\n ret.didAddPoint = true;\n return ret;\n }\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(element, appState.zoom, scenePointer.x, scenePointer.y);\n // if we clicked on a point, set the element as hitElement otherwise\n // it would get deselected if the point is outside the hitbox area\n if (clickedPointIndex >= 0 || segmentMidpoint) {\n ret.hitElement = element;\n }\n else {\n // You might be wandering why we are storing the binding elements on\n // LinearElementEditor and passing them in, instead of calculating them\n // from the end points of the `linearElement` - this is to allow disabling\n // binding (which needs to happen at the point the user finishes moving\n // the point).\n const { startBindingElement, endBindingElement } = linearElementEditor;\n if ((0,_binding__WEBPACK_IMPORTED_MODULE_5__.isBindingEnabled)(appState) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindingElement)(element)) {\n (0,_binding__WEBPACK_IMPORTED_MODULE_5__.bindOrUnbindLinearElement)(element, startBindingElement, endBindingElement);\n }\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const targetPoint = clickedPointIndex > -1 &&\n (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + element.points[clickedPointIndex][0], element.y + element.points[clickedPointIndex][1], cx, cy, element.angle);\n const nextSelectedPointsIndices = clickedPointIndex > -1 || event.shiftKey\n ? event.shiftKey ||\n ((_a = linearElementEditor.selectedPointsIndices) === null || _a === void 0 ? void 0 : _a.includes(clickedPointIndex))\n ? normalizeSelectedPoints([\n ...(linearElementEditor.selectedPointsIndices || []),\n clickedPointIndex,\n ])\n : [clickedPointIndex]\n : null;\n ret.linearElementEditor = Object.assign(Object.assign({}, linearElementEditor), { pointerDownState: {\n prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n lastClickedPoint: clickedPointIndex,\n origin: { x: scenePointer.x, y: scenePointer.y },\n segmentMidpoint: {\n value: segmentMidpoint,\n index: segmentMidpointIndex,\n added: false,\n },\n }, selectedPointsIndices: nextSelectedPointsIndices, pointerOffset: targetPoint\n ? {\n x: scenePointer.x - targetPoint[0],\n y: scenePointer.y - targetPoint[1],\n }\n : { x: 0, y: 0 } });\n return ret;\n }\n static arePointsEqual(point1, point2) {\n if (!point1 && !point2) {\n return true;\n }\n if (!point1 || !point2) {\n return false;\n }\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.arePointsEqual)(point1, point2);\n }\n static handlePointerMove(event, scenePointerX, scenePointerY, appState) {\n if (!appState.editingLinearElement) {\n return null;\n }\n const { elementId, lastUncommittedPoint } = appState.editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return appState.editingLinearElement;\n }\n const { points } = element;\n const lastPoint = points[points.length - 1];\n if (!event.altKey) {\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.deletePoints(element, [points.length - 1]);\n }\n return Object.assign(Object.assign({}, appState.editingLinearElement), { lastUncommittedPoint: null });\n }\n let newPoint;\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_8__.shouldRotateWithDiscreteAngle)(event) && points.length >= 2) {\n const lastCommittedPoint = points[points.length - 2];\n const [width, height] = LinearElementEditor._getShiftLockedDelta(element, lastCommittedPoint, [scenePointerX, scenePointerY], appState.gridSize);\n newPoint = [\n width + lastCommittedPoint[0],\n height + lastCommittedPoint[1],\n ];\n }\n else {\n newPoint = LinearElementEditor.createPointAt(element, scenePointerX - appState.editingLinearElement.pointerOffset.x, scenePointerY - appState.editingLinearElement.pointerOffset.y, appState.gridSize);\n }\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: newPoint,\n },\n ]);\n }\n else {\n LinearElementEditor.addPoints(element, appState, [{ point: newPoint }]);\n }\n return Object.assign(Object.assign({}, appState.editingLinearElement), { lastUncommittedPoint: element.points[element.points.length - 1] });\n }\n /** scene coords */\n static getPointGlobalCoordinates(element, point) {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let { x, y } = element;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y];\n }\n /** scene coords */\n static getPointsGlobalCoordinates(element) {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n return element.points.map((point) => {\n let { x, y } = element;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y];\n });\n }\n static getPointAtIndexGlobalCoordinates(element, indexMaybeFromEnd) {\n const index = indexMaybeFromEnd < 0\n ? element.points.length + indexMaybeFromEnd\n : indexMaybeFromEnd;\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const point = element.points[index];\n const { x, y } = element;\n return point\n ? (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x + point[0], y + point[1], cx, cy, element.angle)\n : (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx, cy, element.angle);\n }\n static pointFromAbsoluteCoords(element, absoluteCoords) {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(absoluteCoords[0], absoluteCoords[1], cx, cy, -element.angle);\n return [x - element.x, y - element.y];\n }\n static getPointIndexUnderCursor(element, zoom, x, y) {\n const pointHandles = LinearElementEditor.getPointsGlobalCoordinates(element);\n let idx = pointHandles.length;\n // loop from right to left because points on the right are rendered over\n // points on the left, thus should take precedence when clicking, if they\n // overlap\n while (--idx > -1) {\n const point = pointHandles[idx];\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(x, y, point[0], point[1]) * zoom.value <\n // +1px to account for outline stroke\n LinearElementEditor.POINT_HANDLE_SIZE + 1) {\n return idx;\n }\n }\n return -1;\n }\n static createPointAt(element, scenePointerX, scenePointerY, gridSize) {\n const pointerOnGrid = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getGridPoint)(scenePointerX, scenePointerY, gridSize);\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(pointerOnGrid[0], pointerOnGrid[1], cx, cy, -element.angle);\n return [rotatedX - element.x, rotatedY - element.y];\n }\n /**\n * Normalizes line points so that the start point is at [0,0]. This is\n * expected in various parts of the codebase. Also returns new x/y to account\n * for the potential normalization.\n */\n static getNormalizedPoints(element) {\n const { points } = element;\n const offsetX = points[0][0];\n const offsetY = points[0][1];\n return {\n points: points.map((point, _idx) => {\n return [point[0] - offsetX, point[1] - offsetY];\n }),\n x: element.x + offsetX,\n y: element.y + offsetY,\n };\n }\n // element-mutating methods\n // ---------------------------------------------------------------------------\n static normalizePoints(element) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, LinearElementEditor.getNormalizedPoints(element));\n }\n static duplicateSelectedPoints(appState) {\n if (!appState.editingLinearElement) {\n return false;\n }\n const { selectedPointsIndices, elementId } = appState.editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element || selectedPointsIndices === null) {\n return false;\n }\n const { points } = element;\n const nextSelectedIndices = [];\n let pointAddedToEnd = false;\n let indexCursor = -1;\n const nextPoints = points.reduce((acc, point, index) => {\n ++indexCursor;\n acc.push(point);\n const isSelected = selectedPointsIndices.includes(index);\n if (isSelected) {\n const nextPoint = points[index + 1];\n if (!nextPoint) {\n pointAddedToEnd = true;\n }\n acc.push(nextPoint\n ? [(point[0] + nextPoint[0]) / 2, (point[1] + nextPoint[1]) / 2]\n : [point[0], point[1]]);\n nextSelectedIndices.push(indexCursor + 1);\n ++indexCursor;\n }\n return acc;\n }, []);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, { points: nextPoints });\n // temp hack to ensure the line doesn't move when adding point to the end,\n // potentially expanding the bounding box\n if (pointAddedToEnd) {\n const lastPoint = element.points[element.points.length - 1];\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: [lastPoint[0] + 30, lastPoint[1] + 30],\n },\n ]);\n }\n return {\n appState: Object.assign(Object.assign({}, appState), { editingLinearElement: Object.assign(Object.assign({}, appState.editingLinearElement), { selectedPointsIndices: nextSelectedIndices }) }),\n };\n }\n static deletePoints(element, pointIndices) {\n let offsetX = 0;\n let offsetY = 0;\n const isDeletingOriginPoint = pointIndices.includes(0);\n // if deleting first point, make the next to be [0,0] and recalculate\n // positions of the rest with respect to it\n if (isDeletingOriginPoint) {\n const firstNonDeletedPoint = element.points.find((point, idx) => {\n return !pointIndices.includes(idx);\n });\n if (firstNonDeletedPoint) {\n offsetX = firstNonDeletedPoint[0];\n offsetY = firstNonDeletedPoint[1];\n }\n }\n const nextPoints = element.points.reduce((acc, point, idx) => {\n if (!pointIndices.includes(idx)) {\n acc.push(!acc.length ? [0, 0] : [point[0] - offsetX, point[1] - offsetY]);\n }\n return acc;\n }, []);\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n static addPoints(element, appState, targetPoints) {\n const offsetX = 0;\n const offsetY = 0;\n const nextPoints = [...element.points, ...targetPoints.map((x) => x.point)];\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n static movePoints(element, targetPoints, otherUpdates) {\n const { points } = element;\n // in case we're moving start point, instead of modifying its position\n // which would break the invariant of it being at [0,0], we move\n // all the other points in the opposite direction by delta to\n // offset it. We do the same with actual element.x/y position, so\n // this hacks are completely transparent to the user.\n let offsetX = 0;\n let offsetY = 0;\n const selectedOriginPoint = targetPoints.find(({ index }) => index === 0);\n if (selectedOriginPoint) {\n offsetX =\n selectedOriginPoint.point[0] + points[selectedOriginPoint.index][0];\n offsetY =\n selectedOriginPoint.point[1] + points[selectedOriginPoint.index][1];\n }\n const nextPoints = points.map((point, idx) => {\n const selectedPointData = targetPoints.find((p) => p.index === idx);\n if (selectedPointData) {\n if (selectedOriginPoint) {\n return point;\n }\n const deltaX = selectedPointData.point[0] - points[selectedPointData.index][0];\n const deltaY = selectedPointData.point[1] - points[selectedPointData.index][1];\n return [point[0] + deltaX, point[1] + deltaY];\n }\n return offsetX || offsetY\n ? [point[0] - offsetX, point[1] - offsetY]\n : point;\n });\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY, otherUpdates);\n }\n static shouldAddMidpoint(linearElementEditor, pointerCoords, appState) {\n const element = LinearElementEditor.getElement(linearElementEditor.elementId);\n if (!element) {\n return false;\n }\n const { segmentMidpoint } = linearElementEditor.pointerDownState;\n if (segmentMidpoint.added ||\n segmentMidpoint.value === null ||\n segmentMidpoint.index === null ||\n linearElementEditor.pointerDownState.origin === null) {\n return false;\n }\n const origin = linearElementEditor.pointerDownState.origin;\n const dist = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(origin.x, origin.y, pointerCoords.x, pointerCoords.y);\n if (!appState.editingLinearElement &&\n dist < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / appState.zoom.value) {\n return false;\n }\n return true;\n }\n static addMidpoint(linearElementEditor, pointerCoords, appState) {\n const element = LinearElementEditor.getElement(linearElementEditor.elementId);\n if (!element) {\n return;\n }\n const { segmentMidpoint } = linearElementEditor.pointerDownState;\n const ret = {\n pointerDownState: linearElementEditor.pointerDownState,\n selectedPointsIndices: linearElementEditor.selectedPointsIndices,\n };\n const midpoint = LinearElementEditor.createPointAt(element, pointerCoords.x, pointerCoords.y, appState.gridSize);\n const points = [\n ...element.points.slice(0, segmentMidpoint.index),\n midpoint,\n ...element.points.slice(segmentMidpoint.index),\n ];\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n points,\n });\n ret.pointerDownState = Object.assign(Object.assign({}, linearElementEditor.pointerDownState), { segmentMidpoint: Object.assign(Object.assign({}, linearElementEditor.pointerDownState.segmentMidpoint), { added: true }), lastClickedPoint: segmentMidpoint.index });\n ret.selectedPointsIndices = [segmentMidpoint.index];\n return ret;\n }\n static _updatePoints(element, nextPoints, offsetX, offsetY, otherUpdates) {\n const nextCoords = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getElementPointsCoords)(element, nextPoints);\n const prevCoords = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getElementPointsCoords)(element, element.points);\n const nextCenterX = (nextCoords[0] + nextCoords[2]) / 2;\n const nextCenterY = (nextCoords[1] + nextCoords[3]) / 2;\n const prevCenterX = (prevCoords[0] + prevCoords[2]) / 2;\n const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;\n const dX = prevCenterX - nextCenterX;\n const dY = prevCenterY - nextCenterY;\n const rotated = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(offsetX, offsetY, dX, dY, element.angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, Object.assign(Object.assign({}, otherUpdates), { points: nextPoints, x: element.x + rotated[0], y: element.y + rotated[1] }));\n }\n static _getShiftLockedDelta(element, referencePoint, scenePointer, gridSize) {\n const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates(element, referencePoint);\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getGridPoint)(scenePointer[0], scenePointer[1], gridSize);\n const { width, height } = (0,___WEBPACK_IMPORTED_MODULE_1__.getLockedLinearCursorAlignSize)(referencePointCoords[0], referencePointCoords[1], gridX, gridY);\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([width, height], [0, 0], -element.angle);\n }\n}\n// ---------------------------------------------------------------------------\n// static methods\n// ---------------------------------------------------------------------------\nLinearElementEditor.POINT_HANDLE_SIZE = 10;\nLinearElementEditor.getEditorMidPoints = (element, appState) => {\n const boundText = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n // Since its not needed outside editor unless 2 pointer lines or bound text\n if (!appState.editingLinearElement &&\n element.points.length > 2 &&\n !boundText) {\n return [];\n }\n if (editorMidPointsCache.version === element.version &&\n editorMidPointsCache.zoom === appState.zoom.value) {\n return editorMidPointsCache.points;\n }\n LinearElementEditor.updateEditorMidPointsCache(element, appState);\n return editorMidPointsCache.points;\n};\nLinearElementEditor.updateEditorMidPointsCache = (element, appState) => {\n const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n let index = 0;\n const midpoints = [];\n while (index < points.length - 1) {\n if (LinearElementEditor.isSegmentTooShort(element, element.points[index], element.points[index + 1], appState.zoom)) {\n midpoints.push(null);\n index++;\n continue;\n }\n const segmentMidPoint = LinearElementEditor.getSegmentMidPoint(element, points[index], points[index + 1], index + 1);\n midpoints.push(segmentMidPoint);\n index++;\n }\n editorMidPointsCache.points = midpoints;\n editorMidPointsCache.version = element.version;\n editorMidPointsCache.zoom = appState.zoom.value;\n};\nLinearElementEditor.getSegmentMidpointHitCoords = (linearElementEditor, scenePointer, appState) => {\n const { elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return null;\n }\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(element, appState.zoom, scenePointer.x, scenePointer.y);\n if (clickedPointIndex >= 0) {\n return null;\n }\n const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n if (points.length >= 3 && !appState.editingLinearElement) {\n return null;\n }\n const threshold = LinearElementEditor.POINT_HANDLE_SIZE / appState.zoom.value;\n const existingSegmentMidpointHitCoords = linearElementEditor.segmentMidPointHoveredCoords;\n if (existingSegmentMidpointHitCoords) {\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(existingSegmentMidpointHitCoords[0], existingSegmentMidpointHitCoords[1], scenePointer.x, scenePointer.y);\n if (distance <= threshold) {\n return existingSegmentMidpointHitCoords;\n }\n }\n let index = 0;\n const midPoints = LinearElementEditor.getEditorMidPoints(element, appState);\n while (index < midPoints.length) {\n if (midPoints[index] !== null) {\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(midPoints[index][0], midPoints[index][1], scenePointer.x, scenePointer.y);\n if (distance <= threshold) {\n return midPoints[index];\n }\n }\n index++;\n }\n return null;\n};\nLinearElementEditor.getBoundTextElementPosition = (element, boundTextElement) => {\n const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n if (points.length < 2) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(boundTextElement, { isDeleted: true });\n }\n let x = 0;\n let y = 0;\n if (element.points.length % 2 === 1) {\n const index = Math.floor(element.points.length / 2);\n const midPoint = LinearElementEditor.getPointGlobalCoordinates(element, element.points[index]);\n x = midPoint[0] - boundTextElement.width / 2;\n y = midPoint[1] - boundTextElement.height / 2;\n }\n else {\n const index = element.points.length / 2 - 1;\n let midSegmentMidpoint = editorMidPointsCache.points[index];\n if (element.points.length === 2) {\n midSegmentMidpoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.centerPoint)(points[0], points[1]);\n }\n if (!midSegmentMidpoint ||\n editorMidPointsCache.version !== element.version) {\n midSegmentMidpoint = LinearElementEditor.getSegmentMidPoint(element, points[index], points[index + 1], index + 1);\n }\n x = midSegmentMidpoint[0] - boundTextElement.width / 2;\n y = midSegmentMidpoint[1] - boundTextElement.height / 2;\n }\n return { x, y };\n};\nLinearElementEditor.getMinMaxXYWithBoundText = (element, elementBounds, boundTextElement) => {\n let [x1, y1, x2, y2] = elementBounds;\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const { x: boundTextX1, y: boundTextY1 } = LinearElementEditor.getBoundTextElementPosition(element, boundTextElement);\n const boundTextX2 = boundTextX1 + boundTextElement.width;\n const boundTextY2 = boundTextY1 + boundTextElement.height;\n const topLeftRotatedPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([x1, y1], [cx, cy], element.angle);\n const topRightRotatedPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([x2, y1], [cx, cy], element.angle);\n const counterRotateBoundTextTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX1, boundTextY1], [cx, cy], -element.angle);\n const counterRotateBoundTextTopRight = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX2, boundTextY1], [cx, cy], -element.angle);\n const counterRotateBoundTextBottomLeft = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX1, boundTextY2], [cx, cy], -element.angle);\n const counterRotateBoundTextBottomRight = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX2, boundTextY2], [cx, cy], -element.angle);\n if (topLeftRotatedPoint[0] < topRightRotatedPoint[0] &&\n topLeftRotatedPoint[1] >= topRightRotatedPoint[1]) {\n x1 = Math.min(x1, counterRotateBoundTextBottomLeft[0]);\n x2 = Math.max(x2, Math.max(counterRotateBoundTextTopRight[0], counterRotateBoundTextBottomRight[0]));\n y1 = Math.min(y1, counterRotateBoundTextTopLeft[1]);\n y2 = Math.max(y2, counterRotateBoundTextBottomRight[1]);\n }\n else if (topLeftRotatedPoint[0] >= topRightRotatedPoint[0] &&\n topLeftRotatedPoint[1] > topRightRotatedPoint[1]) {\n x1 = Math.min(x1, counterRotateBoundTextBottomRight[0]);\n x2 = Math.max(x2, Math.max(counterRotateBoundTextTopLeft[0], counterRotateBoundTextTopRight[0]));\n y1 = Math.min(y1, counterRotateBoundTextBottomLeft[1]);\n y2 = Math.max(y2, counterRotateBoundTextTopRight[1]);\n }\n else if (topLeftRotatedPoint[0] >= topRightRotatedPoint[0]) {\n x1 = Math.min(x1, counterRotateBoundTextTopRight[0]);\n x2 = Math.max(x2, counterRotateBoundTextBottomLeft[0]);\n y1 = Math.min(y1, counterRotateBoundTextBottomRight[1]);\n y2 = Math.max(y2, counterRotateBoundTextTopLeft[1]);\n }\n else if (topLeftRotatedPoint[1] <= topRightRotatedPoint[1]) {\n x1 = Math.min(x1, Math.min(counterRotateBoundTextTopRight[0], counterRotateBoundTextTopLeft[0]));\n x2 = Math.max(x2, counterRotateBoundTextBottomRight[0]);\n y1 = Math.min(y1, counterRotateBoundTextTopRight[1]);\n y2 = Math.max(y2, counterRotateBoundTextBottomLeft[1]);\n }\n return [x1, y1, x2, y2, cx, cy];\n};\nLinearElementEditor.getElementAbsoluteCoords = (element, includeBoundText = false) => {\n let coords;\n let x1;\n let y1;\n let x2;\n let y2;\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_10__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n x1 = minX + element.x;\n y1 = minY + element.y;\n x2 = maxX + element.x;\n y2 = maxY + element.y;\n }\n else {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_10__.getShapeForElement)(element);\n // first element is always the curve\n const ops = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getCurvePathOps)(shape[0]);\n const [minX, minY, maxX, maxY] = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getMinMaxXYFromCurvePathOps)(ops);\n x1 = minX + element.x;\n y1 = minY + element.y;\n x2 = maxX + element.x;\n y2 = maxY + element.y;\n }\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n coords = [x1, y1, x2, y2, cx, cy];\n if (!includeBoundText) {\n return coords;\n }\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n if (boundTextElement) {\n coords = LinearElementEditor.getMinMaxXYWithBoundText(element, [x1, y1, x2, y2], boundTextElement);\n }\n return coords;\n};\nconst normalizeSelectedPoints = (points) => {\n let nextPoints = [\n ...new Set(points.filter((p) => p !== null && p !== -1)),\n ];\n nextPoints = nextPoints.sort((a, b) => a - b);\n return nextPoints.length ? nextPoints : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQmlCO0FBQzREO0FBSzNEO0FBRThCO0FBR2I7QUFLaEI7QUFDcUI7QUFDUTtBQUNRO0FBQ2tCO0FBQ1g7QUFDYjtBQUVsRCxNQUFNLG9CQUFvQixHQUl0QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDdkMsTUFBTSxtQkFBbUI7SUErQjlCLFlBQVksT0FBNEMsRUFBRSxLQUFZO1FBQ3BFLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEVBRXhCLENBQUM7UUFDRixzRUFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDcEIsTUFBTSxFQUFFLElBQUk7WUFFWixlQUFlLEVBQUU7Z0JBQ2YsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLEtBQUs7YUFDYjtTQUNGLENBQUM7UUFD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RSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQ3JCLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFDRCxNQUFNLGdCQUFnQixHQUFHLGlFQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELElBQUksZ0JBQWdCLEVBQUU7UUFDcEIsTUFBTSxHQUFHLG1CQUFtQixDQUFDLHdCQUF3QixDQUNuRCxPQUFPLEVBQ1AsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFDaEIsZ0JBQWdCLENBQ2pCLENBQUM7S0FDSDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUdKLE1BQU0sdUJBQXVCLEdBQUcsQ0FDOUIsTUFBeUIsRUFDUixFQUFFO0lBQ25CLElBQUksVUFBVSxHQUFHO1FBQ2YsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdDLENBQUM7SUFDZCxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQy9DLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3IudHM/ZmM0MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBOb25EZWxldGVkLFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIFBvaW50QmluZGluZyxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRpc3RhbmNlMmQsXG4gIHJvdGF0ZSxcbiAgaXNQYXRoQUxvb3AsXG4gIGdldEdyaWRQb2ludCxcbiAgcm90YXRlUG9pbnQsXG4gIGNlbnRlclBvaW50LFxuICBnZXRDb250cm9sUG9pbnRzRm9yQmV6aWVyQ3VydmUsXG4gIGdldEJlemllclhZLFxuICBnZXRCZXppZXJDdXJ2ZUxlbmd0aCxcbiAgbWFwSW50ZXJ2YWxUb0JlemllclQsXG4gIGFyZVBvaW50c0VxdWFsLFxufSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLCBnZXRMb2NrZWRMaW5lYXJDdXJzb3JBbGlnblNpemUgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHtcbiAgZ2V0Q3VydmVQYXRoT3BzLFxuICBnZXRFbGVtZW50UG9pbnRzQ29vcmRzLFxuICBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMsXG59IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHsgUG9pbnQsIEFwcFN0YXRlLCBQb2ludGVyQ29vcmRzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcblxuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHtcbiAgYmluZE9yVW5iaW5kTGluZWFyRWxlbWVudCxcbiAgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLFxuICBpc0JpbmRpbmdFbmFibGVkLFxufSBmcm9tIFwiLi9iaW5kaW5nXCI7XG5pbXBvcnQgeyB0dXBsZVRvQ29vcnMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGlzQmluZGluZ0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgRFJBR0dJTkdfVEhSRVNIT0xEIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5jb25zdCBlZGl0b3JNaWRQb2ludHNDYWNoZToge1xuICB2ZXJzaW9uOiBudW1iZXIgfCBudWxsO1xuICBwb2ludHM6IChQb2ludCB8IG51bGwpW107XG4gIHpvb206IG51bWJlciB8IG51bGw7XG59ID0geyB2ZXJzaW9uOiBudWxsLCBwb2ludHM6IFtdLCB6b29tOiBudWxsIH07XG5leHBvcnQgY2xhc3MgTGluZWFyRWxlbWVudEVkaXRvciB7XG4gIHB1YmxpYyByZWFkb25seSBlbGVtZW50SWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gJiB7XG4gICAgX2JyYW5kOiBcImV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50SWRcIjtcbiAgfTtcbiAgLyoqIGluZGljZXMgKi9cbiAgcHVibGljIHJlYWRvbmx5IHNlbGVjdGVkUG9pbnRzSW5kaWNlczogcmVhZG9ubHkgbnVtYmVyW10gfCBudWxsO1xuXG4gIHB1YmxpYyByZWFkb25seSBwb2ludGVyRG93blN0YXRlOiBSZWFkb25seTx7XG4gICAgcHJldlNlbGVjdGVkUG9pbnRzSW5kaWNlczogcmVhZG9ubHkgbnVtYmVyW10gfCBudWxsO1xuICAgIC8qKiBpbmRleCAqL1xuICAgIGxhc3RDbGlja2VkUG9pbnQ6IG51bWJlcjtcbiAgICBvcmlnaW46IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT4gfCBudWxsO1xuICAgIHNlZ21lbnRNaWRwb2ludDoge1xuICAgICAgdmFsdWU6IFBvaW50IHwgbnVsbDtcbiAgICAgIGluZGV4OiBudW1iZXIgfCBudWxsO1xuICAgICAgYWRkZWQ6IGJvb2xlYW47XG4gICAgfTtcbiAgfT47XG5cbiAgLyoqIHdoZXRoZXIgeW91J3JlIGRyYWdnaW5nIGEgcG9pbnQgKi9cbiAgcHVibGljIHJlYWRvbmx5IGlzRHJhZ2dpbmc6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSBsYXN0VW5jb21taXR0ZWRQb2ludDogUG9pbnQgfCBudWxsO1xuICBwdWJsaWMgcmVhZG9ubHkgcG9pbnRlck9mZnNldDogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PjtcbiAgcHVibGljIHJlYWRvbmx5IHN0YXJ0QmluZGluZ0VsZW1lbnQ6XG4gICAgfCBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50XG4gICAgfCBudWxsXG4gICAgfCBcImtlZXBcIjtcbiAgcHVibGljIHJlYWRvbmx5IGVuZEJpbmRpbmdFbGVtZW50OiBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50IHwgbnVsbCB8IFwia2VlcFwiO1xuICBwdWJsaWMgcmVhZG9ubHkgaG92ZXJQb2ludEluZGV4OiBudW1iZXI7XG4gIHB1YmxpYyByZWFkb25seSBzZWdtZW50TWlkUG9pbnRIb3ZlcmVkQ29vcmRzOiBQb2ludCB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sIHNjZW5lOiBTY2VuZSkge1xuICAgIHRoaXMuZWxlbWVudElkID0gZWxlbWVudC5pZCBhcyBzdHJpbmcgJiB7XG4gICAgICBfYnJhbmQ6IFwiZXhjYWxpZHJhd0xpbmVhckVsZW1lbnRJZFwiO1xuICAgIH07XG4gICAgU2NlbmUubWFwRWxlbWVudFRvU2NlbmUodGhpcy5lbGVtZW50SWQsIHNjZW5lKTtcbiAgICBMaW5lYXJFbGVtZW50RWRpdG9yLm5vcm1hbGl6ZVBvaW50cyhlbGVtZW50KTtcblxuICAgIHRoaXMuc2VsZWN0ZWRQb2ludHNJbmRpY2VzID0gbnVsbDtcbiAgICB0aGlzLmxhc3RVbmNvbW1pdHRlZFBvaW50ID0gbnVsbDtcbiAgICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgICB0aGlzLnBvaW50ZXJPZmZzZXQgPSB7IHg6IDAsIHk6IDAgfTtcbiAgICB0aGlzLnN0YXJ0QmluZGluZ0VsZW1lbnQgPSBcImtlZXBcIjtcbiAgICB0aGlzLmVuZEJpbmRpbmdFbGVtZW50ID0gXCJrZWVwXCI7XG4gICAgdGhpcy5wb2ludGVyRG93blN0YXRlID0ge1xuICAgICAgcHJldlNlbGVjdGVkUG9pbnRzSW5kaWNlczogbnVsbCxcbiAgICAgIGxhc3RDbGlja2VkUG9pbnQ6IC0xLFxuICAgICAgb3JpZ2luOiBudWxsLFxuXG4gICAgICBzZWdtZW50TWlkcG9pbnQ6IHtcbiAgICAgICAgdmFsdWU6IG51bGwsXG4gICAgICAgIGluZGV4OiBudWxsLFxuICAgICAgICBhZGRlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIH07XG4gICAgdGhpcy5ob3ZlclBvaW50SW5kZXggPSAtMTtcbiAgICB0aGlzLnNlZ21lbnRNaWRQb2ludEhvdmVyZWRDb29yZHMgPSBudWxsO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIHN0YXRpYyBtZXRob2RzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHN0YXRpYyBQT0lOVF9IQU5ETEVfU0laRSA9IDEwO1xuICAvKipcbiAgICogQHBhcmFtIGlkIHRoZSBgZWxlbWVudElkYCBmcm9tIHRoZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIChzbyB0aGF0IHdlIGNhblxuICAgKiAgc3RhdGljYWxseSBndWFyYW50ZWUgdGhpcyBtZXRob2QgcmV0dXJucyBhbiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudClcbiAgICovXG4gIHN0YXRpYyBnZXRFbGVtZW50KGlkOiBJbnN0YW5jZVR5cGU8dHlwZW9mIExpbmVhckVsZW1lbnRFZGl0b3I+W1wiZWxlbWVudElkXCJdKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGlkKT8uZ2V0Tm9uRGVsZXRlZEVsZW1lbnQoaWQpO1xuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudCBhcyBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PjtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlQm94U2VsZWN0aW9uKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIHNldFN0YXRlOiBSZWFjdC5Db21wb25lbnQ8YW55LCBBcHBTdGF0ZT5bXCJzZXRTdGF0ZVwiXSxcbiAgKSB7XG4gICAgaWYgKFxuICAgICAgIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50IHx8XG4gICAgICBhcHBTdGF0ZS5kcmFnZ2luZ0VsZW1lbnQ/LnR5cGUgIT09IFwic2VsZWN0aW9uXCJcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBlZGl0aW5nTGluZWFyRWxlbWVudCB9ID0gYXBwU3RhdGU7XG4gICAgY29uc3QgeyBzZWxlY3RlZFBvaW50c0luZGljZXMsIGVsZW1lbnRJZCB9ID0gZWRpdGluZ0xpbmVhckVsZW1lbnQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgW3NlbGVjdGlvblgxLCBzZWxlY3Rpb25ZMSwgc2VsZWN0aW9uWDIsIHNlbGVjdGlvblkyXSA9XG4gICAgICBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoYXBwU3RhdGUuZHJhZ2dpbmdFbGVtZW50KTtcblxuICAgIGNvbnN0IHBvaW50c1NjZW5lQ29vcmRzID1cbiAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCk7XG5cbiAgICBjb25zdCBuZXh0U2VsZWN0ZWRQb2ludHMgPSBwb2ludHNTY2VuZUNvb3Jkcy5yZWR1Y2UoXG4gICAgICAoYWNjOiBudW1iZXJbXSwgcG9pbnQsIGluZGV4KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAocG9pbnRbMF0gPj0gc2VsZWN0aW9uWDEgJiZcbiAgICAgICAgICAgIHBvaW50WzBdIDw9IHNlbGVjdGlvblgyICYmXG4gICAgICAgICAgICBwb2ludFsxXSA+PSBzZWxlY3Rpb25ZMSAmJlxuICAgICAgICAgICAgcG9pbnRbMV0gPD0gc2VsZWN0aW9uWTIpIHx8XG4gICAgICAgICAgKGV2ZW50LnNoaWZ0S2V5ICYmIHNlbGVjdGVkUG9pbnRzSW5kaWNlcz8uaW5jbHVkZXMoaW5kZXgpKVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2MucHVzaChpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfSxcbiAgICAgIFtdLFxuICAgICk7XG5cbiAgICBzZXRTdGF0ZSh7XG4gICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDoge1xuICAgICAgICAuLi5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgc2VsZWN0ZWRQb2ludHNJbmRpY2VzOiBuZXh0U2VsZWN0ZWRQb2ludHMubGVuZ3RoXG4gICAgICAgICAgPyBuZXh0U2VsZWN0ZWRQb2ludHNcbiAgICAgICAgICA6IG51bGwsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIEByZXR1cm5zIHdoZXRoZXIgcG9pbnQgd2FzIGRyYWdnZWQgKi9cbiAgc3RhdGljIGhhbmRsZVBvaW50RHJhZ2dpbmcoXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgc2NlbmVQb2ludGVyWDogbnVtYmVyLFxuICAgIHNjZW5lUG9pbnRlclk6IG51bWJlcixcbiAgICBtYXliZVN1Z2dlc3RCaW5kaW5nOiAoXG4gICAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICAgIHBvaW50U2NlbmVDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdLFxuICAgICkgPT4gdm9pZCxcbiAgICBsaW5lYXJFbGVtZW50RWRpdG9yOiBMaW5lYXJFbGVtZW50RWRpdG9yLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIWxpbmVhckVsZW1lbnRFZGl0b3IpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgeyBzZWxlY3RlZFBvaW50c0luZGljZXMsIGVsZW1lbnRJZCB9ID0gbGluZWFyRWxlbWVudEVkaXRvcjtcbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gcG9pbnQgdGhhdCdzIGJlaW5nIGRyYWdnZWQgKG91dCBvZiBhbGwgc2VsZWN0ZWQgcG9pbnRzKVxuICAgIGNvbnN0IGRyYWdnaW5nUG9pbnQgPSBlbGVtZW50LnBvaW50c1tcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZS5sYXN0Q2xpY2tlZFBvaW50XG4gICAgXSBhcyBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHNlbGVjdGVkUG9pbnRzSW5kaWNlcyAmJiBkcmFnZ2luZ1BvaW50KSB7XG4gICAgICBpZiAoXG4gICAgICAgIHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJlxuICAgICAgICBzZWxlY3RlZFBvaW50c0luZGljZXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIGVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDFcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRQb2ludHNJbmRpY2VzWzBdO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VQb2ludCA9XG4gICAgICAgICAgZWxlbWVudC5wb2ludHNbc2VsZWN0ZWRJbmRleCA9PT0gMCA/IDEgOiBzZWxlY3RlZEluZGV4IC0gMV07XG5cbiAgICAgICAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID0gTGluZWFyRWxlbWVudEVkaXRvci5fZ2V0U2hpZnRMb2NrZWREZWx0YShcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHJlZmVyZW5jZVBvaW50LFxuICAgICAgICAgIFtzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZXSxcbiAgICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLm1vdmVQb2ludHMoZWxlbWVudCwgW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGluZGV4OiBzZWxlY3RlZEluZGV4LFxuICAgICAgICAgICAgcG9pbnQ6IFt3aWR0aCArIHJlZmVyZW5jZVBvaW50WzBdLCBoZWlnaHQgKyByZWZlcmVuY2VQb2ludFsxXV0sXG4gICAgICAgICAgICBpc0RyYWdnaW5nOlxuICAgICAgICAgICAgICBzZWxlY3RlZEluZGV4ID09PVxuICAgICAgICAgICAgICBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludCxcbiAgICAgICAgICB9LFxuICAgICAgICBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG5ld0RyYWdnaW5nUG9pbnRQb3NpdGlvbiA9IExpbmVhckVsZW1lbnRFZGl0b3IuY3JlYXRlUG9pbnRBdChcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclggLSBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJPZmZzZXQueCxcbiAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyT2Zmc2V0LnksXG4gICAgICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgZGVsdGFYID0gbmV3RHJhZ2dpbmdQb2ludFBvc2l0aW9uWzBdIC0gZHJhZ2dpbmdQb2ludFswXTtcbiAgICAgICAgY29uc3QgZGVsdGFZID0gbmV3RHJhZ2dpbmdQb2ludFBvc2l0aW9uWzFdIC0gZHJhZ2dpbmdQb2ludFsxXTtcblxuICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLm1vdmVQb2ludHMoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBzZWxlY3RlZFBvaW50c0luZGljZXMubWFwKChwb2ludEluZGV4KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdQb2ludFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgcG9pbnRJbmRleCA9PT1cbiAgICAgICAgICAgICAgbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlLmxhc3RDbGlja2VkUG9pbnRcbiAgICAgICAgICAgICAgICA/IExpbmVhckVsZW1lbnRFZGl0b3IuY3JlYXRlUG9pbnRBdChcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgc2NlbmVQb2ludGVyWCAtIGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlck9mZnNldC54LFxuICAgICAgICAgICAgICAgICAgICBzY2VuZVBvaW50ZXJZIC0gbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyT2Zmc2V0LnksXG4gICAgICAgICAgICAgICAgICAgIGFwcFN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogKFtcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wb2ludHNbcG9pbnRJbmRleF1bMF0gKyBkZWx0YVgsXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucG9pbnRzW3BvaW50SW5kZXhdWzFdICsgZGVsdGFZLFxuICAgICAgICAgICAgICAgICAgXSBhcyBjb25zdCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBpbmRleDogcG9pbnRJbmRleCxcbiAgICAgICAgICAgICAgcG9pbnQ6IG5ld1BvaW50UG9zaXRpb24sXG4gICAgICAgICAgICAgIGlzRHJhZ2dpbmc6XG4gICAgICAgICAgICAgICAgcG9pbnRJbmRleCA9PT1cbiAgICAgICAgICAgICAgICBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICAgICAgaGFuZGxlQmluZFRleHRSZXNpemUoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIHN1Z2dlc3QgYmluZGluZ3MgZm9yIGZpcnN0IGFuZCBsYXN0IHBvaW50IGlmIHNlbGVjdGVkXG4gICAgICBpZiAoaXNCaW5kaW5nRWxlbWVudChlbGVtZW50LCBmYWxzZSkpIHtcbiAgICAgICAgY29uc3QgY29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH1bXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGZpcnN0U2VsZWN0ZWRJbmRleCA9IHNlbGVjdGVkUG9pbnRzSW5kaWNlc1swXTtcbiAgICAgICAgaWYgKGZpcnN0U2VsZWN0ZWRJbmRleCA9PT0gMCkge1xuICAgICAgICAgIGNvb3Jkcy5wdXNoKFxuICAgICAgICAgICAgdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBvaW50c1swXSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGxhc3RTZWxlY3RlZEluZGV4ID1cbiAgICAgICAgICBzZWxlY3RlZFBvaW50c0luZGljZXNbc2VsZWN0ZWRQb2ludHNJbmRpY2VzLmxlbmd0aCAtIDFdO1xuICAgICAgICBpZiAobGFzdFNlbGVjdGVkSW5kZXggPT09IGVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICBjb29yZHMucHVzaChcbiAgICAgICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgZWxlbWVudC5wb2ludHNbbGFzdFNlbGVjdGVkSW5kZXhdLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvb3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICBtYXliZVN1Z2dlc3RCaW5kaW5nKGVsZW1lbnQsIGNvb3Jkcyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGljIGhhbmRsZVBvaW50ZXJVcChcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBMaW5lYXJFbGVtZW50RWRpdG9yLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKTogTGluZWFyRWxlbWVudEVkaXRvciB7XG4gICAgY29uc3QgeyBlbGVtZW50SWQsIHNlbGVjdGVkUG9pbnRzSW5kaWNlcywgaXNEcmFnZ2luZywgcG9pbnRlckRvd25TdGF0ZSB9ID1cbiAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoZWxlbWVudElkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlZGl0aW5nTGluZWFyRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCBiaW5kaW5nczogTXV0YWJsZTxcbiAgICAgIFBhcnRpYWw8XG4gICAgICAgIFBpY2s8XG4gICAgICAgICAgSW5zdGFuY2VUeXBlPHR5cGVvZiBMaW5lYXJFbGVtZW50RWRpdG9yPixcbiAgICAgICAgICBcInN0YXJ0QmluZGluZ0VsZW1lbnRcIiB8IFwiZW5kQmluZGluZ0VsZW1lbnRcIlxuICAgICAgICA+XG4gICAgICA+XG4gICAgPiA9IHt9O1xuXG4gICAgaWYgKGlzRHJhZ2dpbmcgJiYgc2VsZWN0ZWRQb2ludHNJbmRpY2VzKSB7XG4gICAgICBmb3IgKGNvbnN0IHNlbGVjdGVkUG9pbnQgb2Ygc2VsZWN0ZWRQb2ludHNJbmRpY2VzKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzZWxlY3RlZFBvaW50ID09PSAwIHx8XG4gICAgICAgICAgc2VsZWN0ZWRQb2ludCA9PT0gZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAoaXNQYXRoQUxvb3AoZWxlbWVudC5wb2ludHMsIGFwcFN0YXRlLnpvb20udmFsdWUpKSB7XG4gICAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLm1vdmVQb2ludHMoZWxlbWVudCwgW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaW5kZXg6IHNlbGVjdGVkUG9pbnQsXG4gICAgICAgICAgICAgICAgcG9pbnQ6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFBvaW50ID09PSAwXG4gICAgICAgICAgICAgICAgICAgID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICAgICAgOiBlbGVtZW50LnBvaW50c1swXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGJpbmRpbmdFbGVtZW50ID0gaXNCaW5kaW5nRW5hYmxlZChhcHBTdGF0ZSlcbiAgICAgICAgICAgID8gZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICAgICAgICAgIHR1cGxlVG9Db29ycyhcbiAgICAgICAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRBdEluZGV4R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9pbnQhLFxuICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpISxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBudWxsO1xuXG4gICAgICAgICAgYmluZGluZ3NbXG4gICAgICAgICAgICBzZWxlY3RlZFBvaW50ID09PSAwID8gXCJzdGFydEJpbmRpbmdFbGVtZW50XCIgOiBcImVuZEJpbmRpbmdFbGVtZW50XCJcbiAgICAgICAgICBdID0gYmluZGluZ0VsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAuLi5iaW5kaW5ncyxcbiAgICAgIC8vIGlmIGNsaWNraW5nIHdpdGhvdXQgcHJldmlvdXNseSBkcmFnZ2luZyBhIHBvaW50KHMpLCBhbmQgbm90IGhvbGRpbmdcbiAgICAgIC8vIHNoaWZ0LCBkZXNlbGVjdCBhbGwgcG9pbnRzIGV4Y2VwdCB0aGUgb25lIGNsaWNrZWQuIElmIGhvbGRpbmcgc2hpZnQsXG4gICAgICAvLyB0b2dnbGUgdGhlIHBvaW50LlxuICAgICAgc2VsZWN0ZWRQb2ludHNJbmRpY2VzOlxuICAgICAgICBpc0RyYWdnaW5nIHx8IGV2ZW50LnNoaWZ0S2V5XG4gICAgICAgICAgPyAhaXNEcmFnZ2luZyAmJlxuICAgICAgICAgICAgZXZlbnQuc2hpZnRLZXkgJiZcbiAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUucHJldlNlbGVjdGVkUG9pbnRzSW5kaWNlcz8uaW5jbHVkZXMoXG4gICAgICAgICAgICAgIHBvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgID8gc2VsZWN0ZWRQb2ludHNJbmRpY2VzICYmXG4gICAgICAgICAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKHBvaW50SW5kZXgpID0+XG4gICAgICAgICAgICAgICAgICBwb2ludEluZGV4ICE9PSBwb2ludGVyRG93blN0YXRlLmxhc3RDbGlja2VkUG9pbnQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogc2VsZWN0ZWRQb2ludHNJbmRpY2VzXG4gICAgICAgICAgOiBzZWxlY3RlZFBvaW50c0luZGljZXM/LmluY2x1ZGVzKHBvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludClcbiAgICAgICAgICA/IFtwb2ludGVyRG93blN0YXRlLmxhc3RDbGlja2VkUG9pbnRdXG4gICAgICAgICAgOiBzZWxlY3RlZFBvaW50c0luZGljZXMsXG4gICAgICBpc0RyYWdnaW5nOiBmYWxzZSxcbiAgICAgIHBvaW50ZXJPZmZzZXQ6IHsgeDogMCwgeTogMCB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZ2V0RWRpdG9yTWlkUG9pbnRzID0gKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKTogdHlwZW9mIGVkaXRvck1pZFBvaW50c0NhY2hlW1wicG9pbnRzXCJdID0+IHtcbiAgICBjb25zdCBib3VuZFRleHQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgLy8gU2luY2UgaXRzIG5vdCBuZWVkZWQgb3V0c2lkZSBlZGl0b3IgdW5sZXNzIDIgcG9pbnRlciBsaW5lcyBvciBib3VuZCB0ZXh0XG4gICAgaWYgKFxuICAgICAgIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50ICYmXG4gICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAyICYmXG4gICAgICAhYm91bmRUZXh0XG4gICAgKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGVkaXRvck1pZFBvaW50c0NhY2hlLnZlcnNpb24gPT09IGVsZW1lbnQudmVyc2lvbiAmJlxuICAgICAgZWRpdG9yTWlkUG9pbnRzQ2FjaGUuem9vbSA9PT0gYXBwU3RhdGUuem9vbS52YWx1ZVxuICAgICkge1xuICAgICAgcmV0dXJuIGVkaXRvck1pZFBvaW50c0NhY2hlLnBvaW50cztcbiAgICB9XG4gICAgTGluZWFyRWxlbWVudEVkaXRvci51cGRhdGVFZGl0b3JNaWRQb2ludHNDYWNoZShlbGVtZW50LCBhcHBTdGF0ZSk7XG4gICAgcmV0dXJuIGVkaXRvck1pZFBvaW50c0NhY2hlLnBvaW50cyE7XG4gIH07XG5cbiAgc3RhdGljIHVwZGF0ZUVkaXRvck1pZFBvaW50c0NhY2hlID0gKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhlbGVtZW50KTtcblxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgbWlkcG9pbnRzOiAoUG9pbnQgfCBudWxsKVtdID0gW107XG4gICAgd2hpbGUgKGluZGV4IDwgcG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIGlmIChcbiAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5pc1NlZ21lbnRUb29TaG9ydChcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIGVsZW1lbnQucG9pbnRzW2luZGV4XSxcbiAgICAgICAgICBlbGVtZW50LnBvaW50c1tpbmRleCArIDFdLFxuICAgICAgICAgIGFwcFN0YXRlLnpvb20sXG4gICAgICAgIClcbiAgICAgICkge1xuICAgICAgICBtaWRwb2ludHMucHVzaChudWxsKTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCBzZWdtZW50TWlkUG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgICAgcG9pbnRzW2luZGV4ICsgMV0sXG4gICAgICAgIGluZGV4ICsgMSxcbiAgICAgICk7XG4gICAgICBtaWRwb2ludHMucHVzaChzZWdtZW50TWlkUG9pbnQpO1xuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgZWRpdG9yTWlkUG9pbnRzQ2FjaGUucG9pbnRzID0gbWlkcG9pbnRzO1xuICAgIGVkaXRvck1pZFBvaW50c0NhY2hlLnZlcnNpb24gPSBlbGVtZW50LnZlcnNpb247XG4gICAgZWRpdG9yTWlkUG9pbnRzQ2FjaGUuem9vbSA9IGFwcFN0YXRlLnpvb20udmFsdWU7XG4gIH07XG5cbiAgc3RhdGljIGdldFNlZ21lbnRNaWRwb2ludEhpdENvb3JkcyA9IChcbiAgICBsaW5lYXJFbGVtZW50RWRpdG9yOiBMaW5lYXJFbGVtZW50RWRpdG9yLFxuICAgIHNjZW5lUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiB7XG4gICAgY29uc3QgeyBlbGVtZW50SWQgfSA9IGxpbmVhckVsZW1lbnRFZGl0b3I7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChlbGVtZW50SWQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNsaWNrZWRQb2ludEluZGV4ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEluZGV4VW5kZXJDdXJzb3IoXG4gICAgICBlbGVtZW50LFxuICAgICAgYXBwU3RhdGUuem9vbSxcbiAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgc2NlbmVQb2ludGVyLnksXG4gICAgKTtcbiAgICBpZiAoY2xpY2tlZFBvaW50SW5kZXggPj0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHBvaW50cyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCk7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPj0gMyAmJiAhYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHRocmVzaG9sZCA9XG4gICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLlBPSU5UX0hBTkRMRV9TSVpFIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcblxuICAgIGNvbnN0IGV4aXN0aW5nU2VnbWVudE1pZHBvaW50SGl0Q29vcmRzID1cbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3Iuc2VnbWVudE1pZFBvaW50SG92ZXJlZENvb3JkcztcbiAgICBpZiAoZXhpc3RpbmdTZWdtZW50TWlkcG9pbnRIaXRDb29yZHMpIHtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgICAgZXhpc3RpbmdTZWdtZW50TWlkcG9pbnRIaXRDb29yZHNbMF0sXG4gICAgICAgIGV4aXN0aW5nU2VnbWVudE1pZHBvaW50SGl0Q29vcmRzWzFdLFxuICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgc2NlbmVQb2ludGVyLnksXG4gICAgICApO1xuICAgICAgaWYgKGRpc3RhbmNlIDw9IHRocmVzaG9sZCkge1xuICAgICAgICByZXR1cm4gZXhpc3RpbmdTZWdtZW50TWlkcG9pbnRIaXRDb29yZHM7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBpbmRleCA9IDA7XG4gICAgY29uc3QgbWlkUG9pbnRzOiB0eXBlb2YgZWRpdG9yTWlkUG9pbnRzQ2FjaGVbXCJwb2ludHNcIl0gPVxuICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoZWxlbWVudCwgYXBwU3RhdGUpO1xuICAgIHdoaWxlIChpbmRleCA8IG1pZFBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChtaWRQb2ludHNbaW5kZXhdICE9PSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgICAgICBtaWRQb2ludHNbaW5kZXhdIVswXSxcbiAgICAgICAgICBtaWRQb2ludHNbaW5kZXhdIVsxXSxcbiAgICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRpc3RhbmNlIDw9IHRocmVzaG9sZCkge1xuICAgICAgICAgIHJldHVybiBtaWRQb2ludHNbaW5kZXhdO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGluZGV4Kys7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuXG4gIHN0YXRpYyBpc1NlZ21lbnRUb29TaG9ydChcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICBzdGFydFBvaW50OiBQb2ludCxcbiAgICBlbmRQb2ludDogUG9pbnQsXG4gICAgem9vbTogQXBwU3RhdGVbXCJ6b29tXCJdLFxuICApIHtcbiAgICBsZXQgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgc3RhcnRQb2ludFswXSxcbiAgICAgIHN0YXJ0UG9pbnRbMV0sXG4gICAgICBlbmRQb2ludFswXSxcbiAgICAgIGVuZFBvaW50WzFdLFxuICAgICk7XG4gICAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDIgJiYgZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgIGRpc3RhbmNlID0gZ2V0QmV6aWVyQ3VydmVMZW5ndGgoZWxlbWVudCwgZW5kUG9pbnQpO1xuICAgIH1cblxuICAgIHJldHVybiBkaXN0YW5jZSAqIHpvb20udmFsdWUgPCBMaW5lYXJFbGVtZW50RWRpdG9yLlBPSU5UX0hBTkRMRV9TSVpFICogNDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRTZWdtZW50TWlkUG9pbnQoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgc3RhcnRQb2ludDogUG9pbnQsXG4gICAgZW5kUG9pbnQ6IFBvaW50LFxuICAgIGVuZFBvaW50SW5kZXg6IG51bWJlcixcbiAgKSB7XG4gICAgbGV0IHNlZ21lbnRNaWRQb2ludCA9IGNlbnRlclBvaW50KHN0YXJ0UG9pbnQsIGVuZFBvaW50KTtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID4gMiAmJiBlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgY29uc3QgY29udHJvbFBvaW50cyA9IGdldENvbnRyb2xQb2ludHNGb3JCZXppZXJDdXJ2ZShcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgZWxlbWVudC5wb2ludHNbZW5kUG9pbnRJbmRleF0sXG4gICAgICApO1xuICAgICAgaWYgKGNvbnRyb2xQb2ludHMpIHtcbiAgICAgICAgY29uc3QgdCA9IG1hcEludGVydmFsVG9CZXppZXJUKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgZWxlbWVudC5wb2ludHNbZW5kUG9pbnRJbmRleF0sXG4gICAgICAgICAgMC41LFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IFt0eCwgdHldID0gZ2V0QmV6aWVyWFkoXG4gICAgICAgICAgY29udHJvbFBvaW50c1swXSxcbiAgICAgICAgICBjb250cm9sUG9pbnRzWzFdLFxuICAgICAgICAgIGNvbnRyb2xQb2ludHNbMl0sXG4gICAgICAgICAgY29udHJvbFBvaW50c1szXSxcbiAgICAgICAgICB0LFxuICAgICAgICApO1xuICAgICAgICBzZWdtZW50TWlkUG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBbdHgsIHR5XSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VnbWVudE1pZFBvaW50O1xuICB9XG5cbiAgc3RhdGljIGdldFNlZ21lbnRNaWRQb2ludEluZGV4KFxuICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIG1pZFBvaW50OiBQb2ludCxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IuZWxlbWVudElkLFxuICAgICk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfVxuICAgIGNvbnN0IG1pZFBvaW50cyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWRpdG9yTWlkUG9pbnRzKGVsZW1lbnQsIGFwcFN0YXRlKTtcbiAgICBsZXQgaW5kZXggPSAwO1xuICAgIHdoaWxlIChpbmRleCA8IG1pZFBvaW50cy5sZW5ndGgpIHtcbiAgICAgIGlmIChMaW5lYXJFbGVtZW50RWRpdG9yLmFyZVBvaW50c0VxdWFsKG1pZFBvaW50LCBtaWRQb2ludHNbaW5kZXhdKSkge1xuICAgICAgICByZXR1cm4gaW5kZXggKyAxO1xuICAgICAgfVxuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgc3RhdGljIGhhbmRsZVBvaW50ZXJEb3duKFxuICAgIGV2ZW50OiBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+LFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBoaXN0b3J5OiBIaXN0b3J5LFxuICAgIHNjZW5lUG9pbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICk6IHtcbiAgICBkaWRBZGRQb2ludDogYm9vbGVhbjtcbiAgICBoaXRFbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PiB8IG51bGw7XG4gICAgbGluZWFyRWxlbWVudEVkaXRvcjogTGluZWFyRWxlbWVudEVkaXRvciB8IG51bGw7XG4gIH0ge1xuICAgIGNvbnN0IHJldDogUmV0dXJuVHlwZTx0eXBlb2YgTGluZWFyRWxlbWVudEVkaXRvcltcImhhbmRsZVBvaW50ZXJEb3duXCJdPiA9IHtcbiAgICAgIGRpZEFkZFBvaW50OiBmYWxzZSxcbiAgICAgIGhpdEVsZW1lbnQ6IG51bGwsXG4gICAgICBsaW5lYXJFbGVtZW50RWRpdG9yOiBudWxsLFxuICAgIH07XG5cbiAgICBpZiAoIWxpbmVhckVsZW1lbnRFZGl0b3IpIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBlbGVtZW50SWQgfSA9IGxpbmVhckVsZW1lbnRFZGl0b3I7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChlbGVtZW50SWQpO1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cbiAgICBjb25zdCBzZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRwb2ludEhpdENvb3JkcyhcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgICBzY2VuZVBvaW50ZXIsXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuICAgIGxldCBzZWdtZW50TWlkcG9pbnRJbmRleCA9IG51bGw7XG4gICAgaWYgKHNlZ21lbnRNaWRwb2ludCkge1xuICAgICAgc2VnbWVudE1pZHBvaW50SW5kZXggPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludEluZGV4KFxuICAgICAgICBsaW5lYXJFbGVtZW50RWRpdG9yLFxuICAgICAgICBhcHBTdGF0ZSxcbiAgICAgICAgc2VnbWVudE1pZHBvaW50LFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LmFsdEtleSAmJiBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgaWYgKGxpbmVhckVsZW1lbnRFZGl0b3IubGFzdFVuY29tbWl0dGVkUG9pbnQgPT0gbnVsbCkge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgICAgICBwb2ludHM6IFtcbiAgICAgICAgICAgIC4uLmVsZW1lbnQucG9pbnRzLFxuICAgICAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5jcmVhdGVQb2ludEF0KFxuICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgICAgICAgICAgc2NlbmVQb2ludGVyLnksXG4gICAgICAgICAgICAgIGFwcFN0YXRlLmdyaWRTaXplLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0LmRpZEFkZFBvaW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGhpc3RvcnkucmVzdW1lUmVjb3JkaW5nKCk7XG4gICAgICByZXQubGluZWFyRWxlbWVudEVkaXRvciA9IHtcbiAgICAgICAgLi4ubGluZWFyRWxlbWVudEVkaXRvcixcbiAgICAgICAgcG9pbnRlckRvd25TdGF0ZToge1xuICAgICAgICAgIHByZXZTZWxlY3RlZFBvaW50c0luZGljZXM6IGxpbmVhckVsZW1lbnRFZGl0b3Iuc2VsZWN0ZWRQb2ludHNJbmRpY2VzLFxuICAgICAgICAgIGxhc3RDbGlja2VkUG9pbnQ6IC0xLFxuICAgICAgICAgIG9yaWdpbjogeyB4OiBzY2VuZVBvaW50ZXIueCwgeTogc2NlbmVQb2ludGVyLnkgfSxcbiAgICAgICAgICBzZWdtZW50TWlkcG9pbnQ6IHtcbiAgICAgICAgICAgIHZhbHVlOiBzZWdtZW50TWlkcG9pbnQsXG4gICAgICAgICAgICBpbmRleDogc2VnbWVudE1pZHBvaW50SW5kZXgsXG4gICAgICAgICAgICBhZGRlZDogZmFsc2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0ZWRQb2ludHNJbmRpY2VzOiBbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0sXG4gICAgICAgIGxhc3RVbmNvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgICBlbmRCaW5kaW5nRWxlbWVudDogZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nKFxuICAgICAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEsXG4gICAgICAgICksXG4gICAgICB9O1xuXG4gICAgICByZXQuZGlkQWRkUG9pbnQgPSB0cnVlO1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCBjbGlja2VkUG9pbnRJbmRleCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRJbmRleFVuZGVyQ3Vyc29yKFxuICAgICAgZWxlbWVudCxcbiAgICAgIGFwcFN0YXRlLnpvb20sXG4gICAgICBzY2VuZVBvaW50ZXIueCxcbiAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICk7XG4gICAgLy8gaWYgd2UgY2xpY2tlZCBvbiBhIHBvaW50LCBzZXQgdGhlIGVsZW1lbnQgYXMgaGl0RWxlbWVudCBvdGhlcndpc2VcbiAgICAvLyBpdCB3b3VsZCBnZXQgZGVzZWxlY3RlZCBpZiB0aGUgcG9pbnQgaXMgb3V0c2lkZSB0aGUgaGl0Ym94IGFyZWFcbiAgICBpZiAoY2xpY2tlZFBvaW50SW5kZXggPj0gMCB8fCBzZWdtZW50TWlkcG9pbnQpIHtcbiAgICAgIHJldC5oaXRFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gWW91IG1pZ2h0IGJlIHdhbmRlcmluZyB3aHkgd2UgYXJlIHN0b3JpbmcgdGhlIGJpbmRpbmcgZWxlbWVudHMgb25cbiAgICAgIC8vIExpbmVhckVsZW1lbnRFZGl0b3IgYW5kIHBhc3NpbmcgdGhlbSBpbiwgaW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGVtXG4gICAgICAvLyBmcm9tIHRoZSBlbmQgcG9pbnRzIG9mIHRoZSBgbGluZWFyRWxlbWVudGAgLSB0aGlzIGlzIHRvIGFsbG93IGRpc2FibGluZ1xuICAgICAgLy8gYmluZGluZyAod2hpY2ggbmVlZHMgdG8gaGFwcGVuIGF0IHRoZSBwb2ludCB0aGUgdXNlciBmaW5pc2hlcyBtb3ZpbmdcbiAgICAgIC8vIHRoZSBwb2ludCkuXG4gICAgICBjb25zdCB7IHN0YXJ0QmluZGluZ0VsZW1lbnQsIGVuZEJpbmRpbmdFbGVtZW50IH0gPSBsaW5lYXJFbGVtZW50RWRpdG9yO1xuICAgICAgaWYgKGlzQmluZGluZ0VuYWJsZWQoYXBwU3RhdGUpICYmIGlzQmluZGluZ0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgYmluZE9yVW5iaW5kTGluZWFyRWxlbWVudChcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHN0YXJ0QmluZGluZ0VsZW1lbnQsXG4gICAgICAgICAgZW5kQmluZGluZ0VsZW1lbnQsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvbnN0IHRhcmdldFBvaW50ID1cbiAgICAgIGNsaWNrZWRQb2ludEluZGV4ID4gLTEgJiZcbiAgICAgIHJvdGF0ZShcbiAgICAgICAgZWxlbWVudC54ICsgZWxlbWVudC5wb2ludHNbY2xpY2tlZFBvaW50SW5kZXhdWzBdLFxuICAgICAgICBlbGVtZW50LnkgKyBlbGVtZW50LnBvaW50c1tjbGlja2VkUG9pbnRJbmRleF1bMV0sXG4gICAgICAgIGN4LFxuICAgICAgICBjeSxcbiAgICAgICAgZWxlbWVudC5hbmdsZSxcbiAgICAgICk7XG5cbiAgICBjb25zdCBuZXh0U2VsZWN0ZWRQb2ludHNJbmRpY2VzID1cbiAgICAgIGNsaWNrZWRQb2ludEluZGV4ID4gLTEgfHwgZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgPyBldmVudC5zaGlmdEtleSB8fFxuICAgICAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3Iuc2VsZWN0ZWRQb2ludHNJbmRpY2VzPy5pbmNsdWRlcyhjbGlja2VkUG9pbnRJbmRleClcbiAgICAgICAgICA/IG5vcm1hbGl6ZVNlbGVjdGVkUG9pbnRzKFtcbiAgICAgICAgICAgICAgLi4uKGxpbmVhckVsZW1lbnRFZGl0b3Iuc2VsZWN0ZWRQb2ludHNJbmRpY2VzIHx8IFtdKSxcbiAgICAgICAgICAgICAgY2xpY2tlZFBvaW50SW5kZXgsXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIDogW2NsaWNrZWRQb2ludEluZGV4XVxuICAgICAgICA6IG51bGw7XG4gICAgcmV0LmxpbmVhckVsZW1lbnRFZGl0b3IgPSB7XG4gICAgICAuLi5saW5lYXJFbGVtZW50RWRpdG9yLFxuICAgICAgcG9pbnRlckRvd25TdGF0ZToge1xuICAgICAgICBwcmV2U2VsZWN0ZWRQb2ludHNJbmRpY2VzOiBsaW5lYXJFbGVtZW50RWRpdG9yLnNlbGVjdGVkUG9pbnRzSW5kaWNlcyxcbiAgICAgICAgbGFzdENsaWNrZWRQb2ludDogY2xpY2tlZFBvaW50SW5kZXgsXG4gICAgICAgIG9yaWdpbjogeyB4OiBzY2VuZVBvaW50ZXIueCwgeTogc2NlbmVQb2ludGVyLnkgfSxcbiAgICAgICAgc2VnbWVudE1pZHBvaW50OiB7XG4gICAgICAgICAgdmFsdWU6IHNlZ21lbnRNaWRwb2ludCxcbiAgICAgICAgICBpbmRleDogc2VnbWVudE1pZHBvaW50SW5kZXgsXG4gICAgICAgICAgYWRkZWQ6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlczogbmV4dFNlbGVjdGVkUG9pbnRzSW5kaWNlcyxcbiAgICAgIHBvaW50ZXJPZmZzZXQ6IHRhcmdldFBvaW50XG4gICAgICAgID8ge1xuICAgICAgICAgICAgeDogc2NlbmVQb2ludGVyLnggLSB0YXJnZXRQb2ludFswXSxcbiAgICAgICAgICAgIHk6IHNjZW5lUG9pbnRlci55IC0gdGFyZ2V0UG9pbnRbMV0sXG4gICAgICAgICAgfVxuICAgICAgICA6IHsgeDogMCwgeTogMCB9LFxuICAgIH07XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgc3RhdGljIGFyZVBvaW50c0VxdWFsKHBvaW50MTogUG9pbnQgfCBudWxsLCBwb2ludDI6IFBvaW50IHwgbnVsbCkge1xuICAgIGlmICghcG9pbnQxICYmICFwb2ludDIpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoIXBvaW50MSB8fCAhcG9pbnQyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBhcmVQb2ludHNFcXVhbChwb2ludDEsIHBvaW50Mik7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlUG9pbnRlck1vdmUoXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgc2NlbmVQb2ludGVyWDogbnVtYmVyLFxuICAgIHNjZW5lUG9pbnRlclk6IG51bWJlcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICk6IExpbmVhckVsZW1lbnRFZGl0b3IgfCBudWxsIHtcbiAgICBpZiAoIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgeyBlbGVtZW50SWQsIGxhc3RVbmNvbW1pdHRlZFBvaW50IH0gPSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudDtcbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwb2ludHMgfSA9IGVsZW1lbnQ7XG4gICAgY29uc3QgbGFzdFBvaW50ID0gcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXTtcblxuICAgIGlmICghZXZlbnQuYWx0S2V5KSB7XG4gICAgICBpZiAobGFzdFBvaW50ID09PSBsYXN0VW5jb21taXR0ZWRQb2ludCkge1xuICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmRlbGV0ZVBvaW50cyhlbGVtZW50LCBbcG9pbnRzLmxlbmd0aCAtIDFdKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICBsYXN0VW5jb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgbGV0IG5ld1BvaW50OiBQb2ludDtcblxuICAgIGlmIChzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZShldmVudCkgJiYgcG9pbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICBjb25zdCBsYXN0Q29tbWl0dGVkUG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDJdO1xuXG4gICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBMaW5lYXJFbGVtZW50RWRpdG9yLl9nZXRTaGlmdExvY2tlZERlbHRhKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBsYXN0Q29tbWl0dGVkUG9pbnQsXG4gICAgICAgIFtzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZXSxcbiAgICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICApO1xuXG4gICAgICBuZXdQb2ludCA9IFtcbiAgICAgICAgd2lkdGggKyBsYXN0Q29tbWl0dGVkUG9pbnRbMF0sXG4gICAgICAgIGhlaWdodCArIGxhc3RDb21taXR0ZWRQb2ludFsxXSxcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld1BvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5jcmVhdGVQb2ludEF0KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBzY2VuZVBvaW50ZXJYIC0gYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQucG9pbnRlck9mZnNldC54LFxuICAgICAgICBzY2VuZVBvaW50ZXJZIC0gYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQucG9pbnRlck9mZnNldC55LFxuICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGxhc3RQb2ludCA9PT0gbGFzdFVuY29tbWl0dGVkUG9pbnQpIHtcbiAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IubW92ZVBvaW50cyhlbGVtZW50LCBbXG4gICAgICAgIHtcbiAgICAgICAgICBpbmRleDogZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMSxcbiAgICAgICAgICBwb2ludDogbmV3UG9pbnQsXG4gICAgICAgIH0sXG4gICAgICBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5hZGRQb2ludHMoZWxlbWVudCwgYXBwU3RhdGUsIFt7IHBvaW50OiBuZXdQb2ludCB9XSk7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICAuLi5hcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgIGxhc3RVbmNvbW1pdHRlZFBvaW50OiBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIHNjZW5lIGNvb3JkcyAqL1xuICBzdGF0aWMgZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICBwb2ludDogUG9pbnQsXG4gICkge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcblxuICAgIGxldCB7IHgsIHkgfSA9IGVsZW1lbnQ7XG4gICAgW3gsIHldID0gcm90YXRlKHggKyBwb2ludFswXSwgeSArIHBvaW50WzFdLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIHJldHVybiBbeCwgeV0gYXMgY29uc3Q7XG4gIH1cblxuICAvKiogc2NlbmUgY29vcmRzICovXG4gIHN0YXRpYyBnZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgKTogUG9pbnRbXSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIHJldHVybiBlbGVtZW50LnBvaW50cy5tYXAoKHBvaW50KSA9PiB7XG4gICAgICBsZXQgeyB4LCB5IH0gPSBlbGVtZW50O1xuICAgICAgW3gsIHldID0gcm90YXRlKHggKyBwb2ludFswXSwgeSArIHBvaW50WzFdLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgcmV0dXJuIFt4LCB5XSBhcyBjb25zdDtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICBpbmRleE1heWJlRnJvbUVuZDogbnVtYmVyLCAvLyAtMSBmb3IgbGFzdCBlbGVtZW50XG4gICk6IFBvaW50IHtcbiAgICBjb25zdCBpbmRleCA9XG4gICAgICBpbmRleE1heWJlRnJvbUVuZCA8IDBcbiAgICAgICAgPyBlbGVtZW50LnBvaW50cy5sZW5ndGggKyBpbmRleE1heWJlRnJvbUVuZFxuICAgICAgICA6IGluZGV4TWF5YmVGcm9tRW5kO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcblxuICAgIGNvbnN0IHBvaW50ID0gZWxlbWVudC5wb2ludHNbaW5kZXhdO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gZWxlbWVudDtcbiAgICByZXR1cm4gcG9pbnRcbiAgICAgID8gcm90YXRlKHggKyBwb2ludFswXSwgeSArIHBvaW50WzFdLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpXG4gICAgICA6IHJvdGF0ZSh4LCB5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICB9XG5cbiAgc3RhdGljIHBvaW50RnJvbUFic29sdXRlQ29vcmRzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIGFic29sdXRlQ29vcmRzOiBQb2ludCxcbiAgKTogUG9pbnQge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgICBjb25zdCBbeCwgeV0gPSByb3RhdGUoXG4gICAgICBhYnNvbHV0ZUNvb3Jkc1swXSxcbiAgICAgIGFic29sdXRlQ29vcmRzWzFdLFxuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIC1lbGVtZW50LmFuZ2xlLFxuICAgICk7XG4gICAgcmV0dXJuIFt4IC0gZWxlbWVudC54LCB5IC0gZWxlbWVudC55XTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRQb2ludEluZGV4VW5kZXJDdXJzb3IoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgem9vbTogQXBwU3RhdGVbXCJ6b29tXCJdLFxuICAgIHg6IG51bWJlcixcbiAgICB5OiBudW1iZXIsXG4gICkge1xuICAgIGNvbnN0IHBvaW50SGFuZGxlcyA9XG4gICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGVsZW1lbnQpO1xuICAgIGxldCBpZHggPSBwb2ludEhhbmRsZXMubGVuZ3RoO1xuICAgIC8vIGxvb3AgZnJvbSByaWdodCB0byBsZWZ0IGJlY2F1c2UgcG9pbnRzIG9uIHRoZSByaWdodCBhcmUgcmVuZGVyZWQgb3ZlclxuICAgIC8vIHBvaW50cyBvbiB0aGUgbGVmdCwgdGh1cyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIHdoZW4gY2xpY2tpbmcsIGlmIHRoZXlcbiAgICAvLyBvdmVybGFwXG4gICAgd2hpbGUgKC0taWR4ID4gLTEpIHtcbiAgICAgIGNvbnN0IHBvaW50ID0gcG9pbnRIYW5kbGVzW2lkeF07XG4gICAgICBpZiAoXG4gICAgICAgIGRpc3RhbmNlMmQoeCwgeSwgcG9pbnRbMF0sIHBvaW50WzFdKSAqIHpvb20udmFsdWUgPFxuICAgICAgICAvLyArMXB4IHRvIGFjY291bnQgZm9yIG91dGxpbmUgc3Ryb2tlXG4gICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuUE9JTlRfSEFORExFX1NJWkUgKyAxXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGlkeDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIC0xO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZVBvaW50QXQoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgc2NlbmVQb2ludGVyWDogbnVtYmVyLFxuICAgIHNjZW5lUG9pbnRlclk6IG51bWJlcixcbiAgICBncmlkU2l6ZTogbnVtYmVyIHwgbnVsbCxcbiAgKTogUG9pbnQge1xuICAgIGNvbnN0IHBvaW50ZXJPbkdyaWQgPSBnZXRHcmlkUG9pbnQoc2NlbmVQb2ludGVyWCwgc2NlbmVQb2ludGVyWSwgZ3JpZFNpemUpO1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgICBjb25zdCBbcm90YXRlZFgsIHJvdGF0ZWRZXSA9IHJvdGF0ZShcbiAgICAgIHBvaW50ZXJPbkdyaWRbMF0sXG4gICAgICBwb2ludGVyT25HcmlkWzFdLFxuICAgICAgY3gsXG4gICAgICBjeSxcbiAgICAgIC1lbGVtZW50LmFuZ2xlLFxuICAgICk7XG5cbiAgICByZXR1cm4gW3JvdGF0ZWRYIC0gZWxlbWVudC54LCByb3RhdGVkWSAtIGVsZW1lbnQueV07XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyBsaW5lIHBvaW50cyBzbyB0aGF0IHRoZSBzdGFydCBwb2ludCBpcyBhdCBbMCwwXS4gVGhpcyBpc1xuICAgKiBleHBlY3RlZCBpbiB2YXJpb3VzIHBhcnRzIG9mIHRoZSBjb2RlYmFzZS4gQWxzbyByZXR1cm5zIG5ldyB4L3kgdG8gYWNjb3VudFxuICAgKiBmb3IgdGhlIHBvdGVudGlhbCBub3JtYWxpemF0aW9uLlxuICAgKi9cbiAgc3RhdGljIGdldE5vcm1hbGl6ZWRQb2ludHMoZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQpIHtcbiAgICBjb25zdCB7IHBvaW50cyB9ID0gZWxlbWVudDtcblxuICAgIGNvbnN0IG9mZnNldFggPSBwb2ludHNbMF1bMF07XG4gICAgY29uc3Qgb2Zmc2V0WSA9IHBvaW50c1swXVsxXTtcblxuICAgIHJldHVybiB7XG4gICAgICBwb2ludHM6IHBvaW50cy5tYXAoKHBvaW50LCBfaWR4KSA9PiB7XG4gICAgICAgIHJldHVybiBbcG9pbnRbMF0gLSBvZmZzZXRYLCBwb2ludFsxXSAtIG9mZnNldFldIGFzIGNvbnN0O1xuICAgICAgfSksXG4gICAgICB4OiBlbGVtZW50LnggKyBvZmZzZXRYLFxuICAgICAgeTogZWxlbWVudC55ICsgb2Zmc2V0WSxcbiAgICB9O1xuICB9XG5cbiAgLy8gZWxlbWVudC1tdXRhdGluZyBtZXRob2RzXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHN0YXRpYyBub3JtYWxpemVQb2ludHMoZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4pIHtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Tm9ybWFsaXplZFBvaW50cyhlbGVtZW50KSk7XG4gIH1cblxuICBzdGF0aWMgZHVwbGljYXRlU2VsZWN0ZWRQb2ludHMoYXBwU3RhdGU6IEFwcFN0YXRlKSB7XG4gICAgaWYgKCFhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgc2VsZWN0ZWRQb2ludHNJbmRpY2VzLCBlbGVtZW50SWQgfSA9IGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50O1xuXG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChlbGVtZW50SWQpO1xuXG4gICAgaWYgKCFlbGVtZW50IHx8IHNlbGVjdGVkUG9pbnRzSW5kaWNlcyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgcG9pbnRzIH0gPSBlbGVtZW50O1xuXG4gICAgY29uc3QgbmV4dFNlbGVjdGVkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcblxuICAgIGxldCBwb2ludEFkZGVkVG9FbmQgPSBmYWxzZTtcbiAgICBsZXQgaW5kZXhDdXJzb3IgPSAtMTtcbiAgICBjb25zdCBuZXh0UG9pbnRzID0gcG9pbnRzLnJlZHVjZSgoYWNjOiBQb2ludFtdLCBwb2ludCwgaW5kZXgpID0+IHtcbiAgICAgICsraW5kZXhDdXJzb3I7XG4gICAgICBhY2MucHVzaChwb2ludCk7XG5cbiAgICAgIGNvbnN0IGlzU2VsZWN0ZWQgPSBzZWxlY3RlZFBvaW50c0luZGljZXMuaW5jbHVkZXMoaW5kZXgpO1xuICAgICAgaWYgKGlzU2VsZWN0ZWQpIHtcbiAgICAgICAgY29uc3QgbmV4dFBvaW50ID0gcG9pbnRzW2luZGV4ICsgMV07XG5cbiAgICAgICAgaWYgKCFuZXh0UG9pbnQpIHtcbiAgICAgICAgICBwb2ludEFkZGVkVG9FbmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGFjYy5wdXNoKFxuICAgICAgICAgIG5leHRQb2ludFxuICAgICAgICAgICAgPyBbKHBvaW50WzBdICsgbmV4dFBvaW50WzBdKSAvIDIsIChwb2ludFsxXSArIG5leHRQb2ludFsxXSkgLyAyXVxuICAgICAgICAgICAgOiBbcG9pbnRbMF0sIHBvaW50WzFdXSxcbiAgICAgICAgKTtcblxuICAgICAgICBuZXh0U2VsZWN0ZWRJbmRpY2VzLnB1c2goaW5kZXhDdXJzb3IgKyAxKTtcbiAgICAgICAgKytpbmRleEN1cnNvcjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHsgcG9pbnRzOiBuZXh0UG9pbnRzIH0pO1xuXG4gICAgLy8gdGVtcCBoYWNrIHRvIGVuc3VyZSB0aGUgbGluZSBkb2Vzbid0IG1vdmUgd2hlbiBhZGRpbmcgcG9pbnQgdG8gdGhlIGVuZCxcbiAgICAvLyBwb3RlbnRpYWxseSBleHBhbmRpbmcgdGhlIGJvdW5kaW5nIGJveFxuICAgIGlmIChwb2ludEFkZGVkVG9FbmQpIHtcbiAgICAgIGNvbnN0IGxhc3RQb2ludCA9IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdO1xuICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5tb3ZlUG9pbnRzKGVsZW1lbnQsIFtcbiAgICAgICAge1xuICAgICAgICAgIGluZGV4OiBlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxLFxuICAgICAgICAgIHBvaW50OiBbbGFzdFBvaW50WzBdICsgMzAsIGxhc3RQb2ludFsxXSArIDMwXSxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBhcHBTdGF0ZToge1xuICAgICAgICAuLi5hcHBTdGF0ZSxcbiAgICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IHtcbiAgICAgICAgICAuLi5hcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgICAgICBzZWxlY3RlZFBvaW50c0luZGljZXM6IG5leHRTZWxlY3RlZEluZGljZXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgZGVsZXRlUG9pbnRzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIHBvaW50SW5kaWNlczogcmVhZG9ubHkgbnVtYmVyW10sXG4gICkge1xuICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICBjb25zdCBpc0RlbGV0aW5nT3JpZ2luUG9pbnQgPSBwb2ludEluZGljZXMuaW5jbHVkZXMoMCk7XG5cbiAgICAvLyBpZiBkZWxldGluZyBmaXJzdCBwb2ludCwgbWFrZSB0aGUgbmV4dCB0byBiZSBbMCwwXSBhbmQgcmVjYWxjdWxhdGVcbiAgICAvLyBwb3NpdGlvbnMgb2YgdGhlIHJlc3Qgd2l0aCByZXNwZWN0IHRvIGl0XG4gICAgaWYgKGlzRGVsZXRpbmdPcmlnaW5Qb2ludCkge1xuICAgICAgY29uc3QgZmlyc3ROb25EZWxldGVkUG9pbnQgPSBlbGVtZW50LnBvaW50cy5maW5kKChwb2ludCwgaWR4KSA9PiB7XG4gICAgICAgIHJldHVybiAhcG9pbnRJbmRpY2VzLmluY2x1ZGVzKGlkeCk7XG4gICAgICB9KTtcbiAgICAgIGlmIChmaXJzdE5vbkRlbGV0ZWRQb2ludCkge1xuICAgICAgICBvZmZzZXRYID0gZmlyc3ROb25EZWxldGVkUG9pbnRbMF07XG4gICAgICAgIG9mZnNldFkgPSBmaXJzdE5vbkRlbGV0ZWRQb2ludFsxXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9pbnRzID0gZWxlbWVudC5wb2ludHMucmVkdWNlKChhY2M6IFBvaW50W10sIHBvaW50LCBpZHgpID0+IHtcbiAgICAgIGlmICghcG9pbnRJbmRpY2VzLmluY2x1ZGVzKGlkeCkpIHtcbiAgICAgICAgYWNjLnB1c2goXG4gICAgICAgICAgIWFjYy5sZW5ndGggPyBbMCwgMF0gOiBbcG9pbnRbMF0gLSBvZmZzZXRYLCBwb2ludFsxXSAtIG9mZnNldFldLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG5cbiAgICBMaW5lYXJFbGVtZW50RWRpdG9yLl91cGRhdGVQb2ludHMoZWxlbWVudCwgbmV4dFBvaW50cywgb2Zmc2V0WCwgb2Zmc2V0WSk7XG4gIH1cblxuICBzdGF0aWMgYWRkUG9pbnRzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICB0YXJnZXRQb2ludHM6IHsgcG9pbnQ6IFBvaW50IH1bXSxcbiAgKSB7XG4gICAgY29uc3Qgb2Zmc2V0WCA9IDA7XG4gICAgY29uc3Qgb2Zmc2V0WSA9IDA7XG5cbiAgICBjb25zdCBuZXh0UG9pbnRzID0gWy4uLmVsZW1lbnQucG9pbnRzLCAuLi50YXJnZXRQb2ludHMubWFwKCh4KSA9PiB4LnBvaW50KV07XG4gICAgTGluZWFyRWxlbWVudEVkaXRvci5fdXBkYXRlUG9pbnRzKGVsZW1lbnQsIG5leHRQb2ludHMsIG9mZnNldFgsIG9mZnNldFkpO1xuICB9XG5cbiAgc3RhdGljIG1vdmVQb2ludHMoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgdGFyZ2V0UG9pbnRzOiB7IGluZGV4OiBudW1iZXI7IHBvaW50OiBQb2ludDsgaXNEcmFnZ2luZz86IGJvb2xlYW4gfVtdLFxuICAgIG90aGVyVXBkYXRlcz86IHsgc3RhcnRCaW5kaW5nPzogUG9pbnRCaW5kaW5nOyBlbmRCaW5kaW5nPzogUG9pbnRCaW5kaW5nIH0sXG4gICkge1xuICAgIGNvbnN0IHsgcG9pbnRzIH0gPSBlbGVtZW50O1xuXG4gICAgLy8gaW4gY2FzZSB3ZSdyZSBtb3Zpbmcgc3RhcnQgcG9pbnQsIGluc3RlYWQgb2YgbW9kaWZ5aW5nIGl0cyBwb3NpdGlvblxuICAgIC8vIHdoaWNoIHdvdWxkIGJyZWFrIHRoZSBpbnZhcmlhbnQgb2YgaXQgYmVpbmcgYXQgWzAsMF0sIHdlIG1vdmVcbiAgICAvLyBhbGwgdGhlIG90aGVyIHBvaW50cyBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGJ5IGRlbHRhIHRvXG4gICAgLy8gb2Zmc2V0IGl0LiBXZSBkbyB0aGUgc2FtZSB3aXRoIGFjdHVhbCBlbGVtZW50LngveSBwb3NpdGlvbiwgc29cbiAgICAvLyB0aGlzIGhhY2tzIGFyZSBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLlxuICAgIGxldCBvZmZzZXRYID0gMDtcbiAgICBsZXQgb2Zmc2V0WSA9IDA7XG5cbiAgICBjb25zdCBzZWxlY3RlZE9yaWdpblBvaW50ID0gdGFyZ2V0UG9pbnRzLmZpbmQoKHsgaW5kZXggfSkgPT4gaW5kZXggPT09IDApO1xuXG4gICAgaWYgKHNlbGVjdGVkT3JpZ2luUG9pbnQpIHtcbiAgICAgIG9mZnNldFggPVxuICAgICAgICBzZWxlY3RlZE9yaWdpblBvaW50LnBvaW50WzBdICsgcG9pbnRzW3NlbGVjdGVkT3JpZ2luUG9pbnQuaW5kZXhdWzBdO1xuICAgICAgb2Zmc2V0WSA9XG4gICAgICAgIHNlbGVjdGVkT3JpZ2luUG9pbnQucG9pbnRbMV0gKyBwb2ludHNbc2VsZWN0ZWRPcmlnaW5Qb2ludC5pbmRleF1bMV07XG4gICAgfVxuXG4gICAgY29uc3QgbmV4dFBvaW50cyA9IHBvaW50cy5tYXAoKHBvaW50LCBpZHgpID0+IHtcbiAgICAgIGNvbnN0IHNlbGVjdGVkUG9pbnREYXRhID0gdGFyZ2V0UG9pbnRzLmZpbmQoKHApID0+IHAuaW5kZXggPT09IGlkeCk7XG4gICAgICBpZiAoc2VsZWN0ZWRQb2ludERhdGEpIHtcbiAgICAgICAgaWYgKHNlbGVjdGVkT3JpZ2luUG9pbnQpIHtcbiAgICAgICAgICByZXR1cm4gcG9pbnQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWx0YVggPVxuICAgICAgICAgIHNlbGVjdGVkUG9pbnREYXRhLnBvaW50WzBdIC0gcG9pbnRzW3NlbGVjdGVkUG9pbnREYXRhLmluZGV4XVswXTtcbiAgICAgICAgY29uc3QgZGVsdGFZID1cbiAgICAgICAgICBzZWxlY3RlZFBvaW50RGF0YS5wb2ludFsxXSAtIHBvaW50c1tzZWxlY3RlZFBvaW50RGF0YS5pbmRleF1bMV07XG5cbiAgICAgICAgcmV0dXJuIFtwb2ludFswXSArIGRlbHRhWCwgcG9pbnRbMV0gKyBkZWx0YVldIGFzIGNvbnN0O1xuICAgICAgfVxuICAgICAgcmV0dXJuIG9mZnNldFggfHwgb2Zmc2V0WVxuICAgICAgICA/IChbcG9pbnRbMF0gLSBvZmZzZXRYLCBwb2ludFsxXSAtIG9mZnNldFldIGFzIGNvbnN0KVxuICAgICAgICA6IHBvaW50O1xuICAgIH0pO1xuXG4gICAgTGluZWFyRWxlbWVudEVkaXRvci5fdXBkYXRlUG9pbnRzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIG5leHRQb2ludHMsXG4gICAgICBvZmZzZXRYLFxuICAgICAgb2Zmc2V0WSxcbiAgICAgIG90aGVyVXBkYXRlcyxcbiAgICApO1xuICB9XG5cbiAgc3RhdGljIHNob3VsZEFkZE1pZHBvaW50KFxuICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgcG9pbnRlckNvb3JkczogUG9pbnRlckNvb3JkcyxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoXG4gICAgICBsaW5lYXJFbGVtZW50RWRpdG9yLmVsZW1lbnRJZCxcbiAgICApO1xuXG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzZWdtZW50TWlkcG9pbnQgfSA9IGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZTtcblxuICAgIGlmIChcbiAgICAgIHNlZ21lbnRNaWRwb2ludC5hZGRlZCB8fFxuICAgICAgc2VnbWVudE1pZHBvaW50LnZhbHVlID09PSBudWxsIHx8XG4gICAgICBzZWdtZW50TWlkcG9pbnQuaW5kZXggPT09IG51bGwgfHxcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZS5vcmlnaW4gPT09IG51bGxcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBvcmlnaW4gPSBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJEb3duU3RhdGUub3JpZ2luITtcbiAgICBjb25zdCBkaXN0ID0gZGlzdGFuY2UyZChcbiAgICAgIG9yaWdpbi54LFxuICAgICAgb3JpZ2luLnksXG4gICAgICBwb2ludGVyQ29vcmRzLngsXG4gICAgICBwb2ludGVyQ29vcmRzLnksXG4gICAgKTtcbiAgICBpZiAoXG4gICAgICAhYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgIGRpc3QgPCBEUkFHR0lOR19USFJFU0hPTEQgLyBhcHBTdGF0ZS56b29tLnZhbHVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc3RhdGljIGFkZE1pZHBvaW50KFxuICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgcG9pbnRlckNvb3JkczogUG9pbnRlckNvb3JkcyxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkge1xuICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoXG4gICAgICBsaW5lYXJFbGVtZW50RWRpdG9yLmVsZW1lbnRJZCxcbiAgICApO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHNlZ21lbnRNaWRwb2ludCB9ID0gbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlO1xuICAgIGNvbnN0IHJldDoge1xuICAgICAgcG9pbnRlckRvd25TdGF0ZTogTGluZWFyRWxlbWVudEVkaXRvcltcInBvaW50ZXJEb3duU3RhdGVcIl07XG4gICAgICBzZWxlY3RlZFBvaW50c0luZGljZXM6IExpbmVhckVsZW1lbnRFZGl0b3JbXCJzZWxlY3RlZFBvaW50c0luZGljZXNcIl07XG4gICAgfSA9IHtcbiAgICAgIHBvaW50ZXJEb3duU3RhdGU6IGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZSxcbiAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlczogbGluZWFyRWxlbWVudEVkaXRvci5zZWxlY3RlZFBvaW50c0luZGljZXMsXG4gICAgfTtcblxuICAgIGNvbnN0IG1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5jcmVhdGVQb2ludEF0KFxuICAgICAgZWxlbWVudCxcbiAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICAgIGFwcFN0YXRlLmdyaWRTaXplLFxuICAgICk7XG4gICAgY29uc3QgcG9pbnRzID0gW1xuICAgICAgLi4uZWxlbWVudC5wb2ludHMuc2xpY2UoMCwgc2VnbWVudE1pZHBvaW50LmluZGV4ISksXG4gICAgICBtaWRwb2ludCxcbiAgICAgIC4uLmVsZW1lbnQucG9pbnRzLnNsaWNlKHNlZ21lbnRNaWRwb2ludC5pbmRleCEpLFxuICAgIF07XG5cbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIHBvaW50cyxcbiAgICB9KTtcblxuICAgIHJldC5wb2ludGVyRG93blN0YXRlID0ge1xuICAgICAgLi4ubGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlLFxuICAgICAgc2VnbWVudE1pZHBvaW50OiB7XG4gICAgICAgIC4uLmxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZS5zZWdtZW50TWlkcG9pbnQsXG4gICAgICAgIGFkZGVkOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIGxhc3RDbGlja2VkUG9pbnQ6IHNlZ21lbnRNaWRwb2ludC5pbmRleCEsXG4gICAgfTtcbiAgICByZXQuc2VsZWN0ZWRQb2ludHNJbmRpY2VzID0gW3NlZ21lbnRNaWRwb2ludC5pbmRleCFdO1xuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfdXBkYXRlUG9pbnRzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIG5leHRQb2ludHM6IHJlYWRvbmx5IFBvaW50W10sXG4gICAgb2Zmc2V0WDogbnVtYmVyLFxuICAgIG9mZnNldFk6IG51bWJlcixcbiAgICBvdGhlclVwZGF0ZXM/OiB7IHN0YXJ0QmluZGluZz86IFBvaW50QmluZGluZzsgZW5kQmluZGluZz86IFBvaW50QmluZGluZyB9LFxuICApIHtcbiAgICBjb25zdCBuZXh0Q29vcmRzID0gZ2V0RWxlbWVudFBvaW50c0Nvb3JkcyhlbGVtZW50LCBuZXh0UG9pbnRzKTtcbiAgICBjb25zdCBwcmV2Q29vcmRzID0gZ2V0RWxlbWVudFBvaW50c0Nvb3JkcyhlbGVtZW50LCBlbGVtZW50LnBvaW50cyk7XG4gICAgY29uc3QgbmV4dENlbnRlclggPSAobmV4dENvb3Jkc1swXSArIG5leHRDb29yZHNbMl0pIC8gMjtcbiAgICBjb25zdCBuZXh0Q2VudGVyWSA9IChuZXh0Q29vcmRzWzFdICsgbmV4dENvb3Jkc1szXSkgLyAyO1xuICAgIGNvbnN0IHByZXZDZW50ZXJYID0gKHByZXZDb29yZHNbMF0gKyBwcmV2Q29vcmRzWzJdKSAvIDI7XG4gICAgY29uc3QgcHJldkNlbnRlclkgPSAocHJldkNvb3Jkc1sxXSArIHByZXZDb29yZHNbM10pIC8gMjtcbiAgICBjb25zdCBkWCA9IHByZXZDZW50ZXJYIC0gbmV4dENlbnRlclg7XG4gICAgY29uc3QgZFkgPSBwcmV2Q2VudGVyWSAtIG5leHRDZW50ZXJZO1xuICAgIGNvbnN0IHJvdGF0ZWQgPSByb3RhdGUob2Zmc2V0WCwgb2Zmc2V0WSwgZFgsIGRZLCBlbGVtZW50LmFuZ2xlKTtcbiAgICBtdXRhdGVFbGVtZW50KGVsZW1lbnQsIHtcbiAgICAgIC4uLm90aGVyVXBkYXRlcyxcbiAgICAgIHBvaW50czogbmV4dFBvaW50cyxcbiAgICAgIHg6IGVsZW1lbnQueCArIHJvdGF0ZWRbMF0sXG4gICAgICB5OiBlbGVtZW50LnkgKyByb3RhdGVkWzFdLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgX2dldFNoaWZ0TG9ja2VkRGVsdGEoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgcmVmZXJlbmNlUG9pbnQ6IFBvaW50LFxuICAgIHNjZW5lUG9pbnRlcjogUG9pbnQsXG4gICAgZ3JpZFNpemU6IG51bWJlciB8IG51bGwsXG4gICkge1xuICAgIGNvbnN0IHJlZmVyZW5jZVBvaW50Q29vcmRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgZWxlbWVudCxcbiAgICAgIHJlZmVyZW5jZVBvaW50LFxuICAgICk7XG5cbiAgICBjb25zdCBbZ3JpZFgsIGdyaWRZXSA9IGdldEdyaWRQb2ludChcbiAgICAgIHNjZW5lUG9pbnRlclswXSxcbiAgICAgIHNjZW5lUG9pbnRlclsxXSxcbiAgICAgIGdyaWRTaXplLFxuICAgICk7XG5cbiAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IGdldExvY2tlZExpbmVhckN1cnNvckFsaWduU2l6ZShcbiAgICAgIHJlZmVyZW5jZVBvaW50Q29vcmRzWzBdLFxuICAgICAgcmVmZXJlbmNlUG9pbnRDb29yZHNbMV0sXG4gICAgICBncmlkWCxcbiAgICAgIGdyaWRZLFxuICAgICk7XG5cbiAgICByZXR1cm4gcm90YXRlUG9pbnQoW3dpZHRoLCBoZWlnaHRdLCBbMCwgMF0sIC1lbGVtZW50LmFuZ2xlKTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24gPSAoXG4gICAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gICAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0+IHtcbiAgICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGVsZW1lbnQpO1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgbXV0YXRlRWxlbWVudChib3VuZFRleHRFbGVtZW50LCB7IGlzRGVsZXRlZDogdHJ1ZSB9KTtcbiAgICB9XG4gICAgbGV0IHggPSAwO1xuICAgIGxldCB5ID0gMDtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgICAgY29uc3QgaW5kZXggPSBNYXRoLmZsb29yKGVsZW1lbnQucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgICAgY29uc3QgbWlkUG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGVsZW1lbnQucG9pbnRzW2luZGV4XSxcbiAgICAgICk7XG4gICAgICB4ID0gbWlkUG9pbnRbMF0gLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIHkgPSBtaWRQb2ludFsxXSAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaW5kZXggPSBlbGVtZW50LnBvaW50cy5sZW5ndGggLyAyIC0gMTtcblxuICAgICAgbGV0IG1pZFNlZ21lbnRNaWRwb2ludCA9IGVkaXRvck1pZFBvaW50c0NhY2hlLnBvaW50c1tpbmRleF07XG4gICAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IGNlbnRlclBvaW50KHBvaW50c1swXSwgcG9pbnRzWzFdKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgIW1pZFNlZ21lbnRNaWRwb2ludCB8fFxuICAgICAgICBlZGl0b3JNaWRQb2ludHNDYWNoZS52ZXJzaW9uICE9PSBlbGVtZW50LnZlcnNpb25cbiAgICAgICkge1xuICAgICAgICBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHBvaW50c1tpbmRleF0sXG4gICAgICAgICAgcG9pbnRzW2luZGV4ICsgMV0sXG4gICAgICAgICAgaW5kZXggKyAxLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgeCA9IG1pZFNlZ21lbnRNaWRwb2ludFswXSAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgeSA9IG1pZFNlZ21lbnRNaWRwb2ludFsxXSAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICB9XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9O1xuXG4gIHN0YXRpYyBnZXRNaW5NYXhYWVdpdGhCb3VuZFRleHQgPSAoXG4gICAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gICAgZWxlbWVudEJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgICBsZXQgW3gxLCB5MSwgeDIsIHkyXSA9IGVsZW1lbnRCb3VuZHM7XG4gICAgY29uc3QgY3ggPSAoeDEgKyB4MikgLyAyO1xuICAgIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgICBjb25zdCB7IHg6IGJvdW5kVGV4dFgxLCB5OiBib3VuZFRleHRZMSB9ID1cbiAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICAgKTtcbiAgICBjb25zdCBib3VuZFRleHRYMiA9IGJvdW5kVGV4dFgxICsgYm91bmRUZXh0RWxlbWVudC53aWR0aDtcbiAgICBjb25zdCBib3VuZFRleHRZMiA9IGJvdW5kVGV4dFkxICsgYm91bmRUZXh0RWxlbWVudC5oZWlnaHQ7XG5cbiAgICBjb25zdCB0b3BMZWZ0Um90YXRlZFBvaW50ID0gcm90YXRlUG9pbnQoW3gxLCB5MV0sIFtjeCwgY3ldLCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCB0b3BSaWdodFJvdGF0ZWRQb2ludCA9IHJvdGF0ZVBvaW50KFt4MiwgeTFdLCBbY3gsIGN5XSwgZWxlbWVudC5hbmdsZSk7XG5cbiAgICBjb25zdCBjb3VudGVyUm90YXRlQm91bmRUZXh0VG9wTGVmdCA9IHJvdGF0ZVBvaW50KFxuICAgICAgW2JvdW5kVGV4dFgxLCBib3VuZFRleHRZMV0sXG5cbiAgICAgIFtjeCwgY3ldLFxuXG4gICAgICAtZWxlbWVudC5hbmdsZSxcbiAgICApO1xuICAgIGNvbnN0IGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodCA9IHJvdGF0ZVBvaW50KFxuICAgICAgW2JvdW5kVGV4dFgyLCBib3VuZFRleHRZMV0sXG5cbiAgICAgIFtjeCwgY3ldLFxuXG4gICAgICAtZWxlbWVudC5hbmdsZSxcbiAgICApO1xuICAgIGNvbnN0IGNvdW50ZXJSb3RhdGVCb3VuZFRleHRCb3R0b21MZWZ0ID0gcm90YXRlUG9pbnQoXG4gICAgICBbYm91bmRUZXh0WDEsIGJvdW5kVGV4dFkyXSxcblxuICAgICAgW2N4LCBjeV0sXG5cbiAgICAgIC1lbGVtZW50LmFuZ2xlLFxuICAgICk7XG4gICAgY29uc3QgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbVJpZ2h0ID0gcm90YXRlUG9pbnQoXG4gICAgICBbYm91bmRUZXh0WDIsIGJvdW5kVGV4dFkyXSxcblxuICAgICAgW2N4LCBjeV0sXG5cbiAgICAgIC1lbGVtZW50LmFuZ2xlLFxuICAgICk7XG5cbiAgICBpZiAoXG4gICAgICB0b3BMZWZ0Um90YXRlZFBvaW50WzBdIDwgdG9wUmlnaHRSb3RhdGVkUG9pbnRbMF0gJiZcbiAgICAgIHRvcExlZnRSb3RhdGVkUG9pbnRbMV0gPj0gdG9wUmlnaHRSb3RhdGVkUG9pbnRbMV1cbiAgICApIHtcbiAgICAgIHgxID0gTWF0aC5taW4oeDEsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRCb3R0b21MZWZ0WzBdKTtcbiAgICAgIHgyID0gTWF0aC5tYXgoXG4gICAgICAgIHgyLFxuICAgICAgICBNYXRoLm1heChcbiAgICAgICAgICBjb3VudGVyUm90YXRlQm91bmRUZXh0VG9wUmlnaHRbMF0sXG4gICAgICAgICAgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbVJpZ2h0WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BMZWZ0WzFdKTtcblxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbVJpZ2h0WzFdKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdG9wTGVmdFJvdGF0ZWRQb2ludFswXSA+PSB0b3BSaWdodFJvdGF0ZWRQb2ludFswXSAmJlxuICAgICAgdG9wTGVmdFJvdGF0ZWRQb2ludFsxXSA+IHRvcFJpZ2h0Um90YXRlZFBvaW50WzFdXG4gICAgKSB7XG4gICAgICB4MSA9IE1hdGgubWluKHgxLCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tUmlnaHRbMF0pO1xuICAgICAgeDIgPSBNYXRoLm1heChcbiAgICAgICAgeDIsXG4gICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BMZWZ0WzBdLFxuICAgICAgICAgIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodFswXSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tTGVmdFsxXSk7XG5cbiAgICAgIHkyID0gTWF0aC5tYXgoeTIsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodFsxXSk7XG4gICAgfSBlbHNlIGlmICh0b3BMZWZ0Um90YXRlZFBvaW50WzBdID49IHRvcFJpZ2h0Um90YXRlZFBvaW50WzBdKSB7XG4gICAgICB4MSA9IE1hdGgubWluKHgxLCBjb3VudGVyUm90YXRlQm91bmRUZXh0VG9wUmlnaHRbMF0pO1xuICAgICAgeDIgPSBNYXRoLm1heCh4MiwgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbUxlZnRbMF0pO1xuICAgICAgeTEgPSBNYXRoLm1pbih5MSwgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbVJpZ2h0WzFdKTtcblxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcExlZnRbMV0pO1xuICAgIH0gZWxzZSBpZiAodG9wTGVmdFJvdGF0ZWRQb2ludFsxXSA8PSB0b3BSaWdodFJvdGF0ZWRQb2ludFsxXSkge1xuICAgICAgeDEgPSBNYXRoLm1pbihcbiAgICAgICAgeDEsXG4gICAgICAgIE1hdGgubWluKFxuICAgICAgICAgIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodFswXSxcbiAgICAgICAgICBjb3VudGVyUm90YXRlQm91bmRUZXh0VG9wTGVmdFswXSxcbiAgICAgICAgKSxcbiAgICAgICk7XG5cbiAgICAgIHgyID0gTWF0aC5tYXgoeDIsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRCb3R0b21SaWdodFswXSk7XG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb3VudGVyUm90YXRlQm91bmRUZXh0VG9wUmlnaHRbMV0pO1xuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbUxlZnRbMV0pO1xuICAgIH1cblxuICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTIsIGN4LCBjeV07XG4gIH07XG5cbiAgc3RhdGljIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICBpbmNsdWRlQm91bmRUZXh0OiBib29sZWFuID0gZmFsc2UsXG4gICk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gICAgbGV0IGNvb3JkczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIGxldCB4MTtcbiAgICBsZXQgeTE7XG4gICAgbGV0IHgyO1xuICAgIGxldCB5MjtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoIDwgMiB8fCAhZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAvLyBYWFggdGhpcyBpcyBqdXN0IGEgcG9vciBlc3RpbWF0ZSBhbmQgbm90IHZlcnkgdXNlZnVsXG4gICAgICBjb25zdCB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfSA9IGVsZW1lbnQucG9pbnRzLnJlZHVjZShcbiAgICAgICAgKGxpbWl0cywgW3gsIHldKSA9PiB7XG4gICAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgeSk7XG4gICAgICAgICAgbGltaXRzLm1pblggPSBNYXRoLm1pbihsaW1pdHMubWluWCwgeCk7XG5cbiAgICAgICAgICBsaW1pdHMubWF4WCA9IE1hdGgubWF4KGxpbWl0cy5tYXhYLCB4KTtcbiAgICAgICAgICBsaW1pdHMubWF4WSA9IE1hdGgubWF4KGxpbWl0cy5tYXhZLCB5KTtcblxuICAgICAgICAgIHJldHVybiBsaW1pdHM7XG4gICAgICAgIH0sXG4gICAgICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICAgICAgKTtcbiAgICAgIHgxID0gbWluWCArIGVsZW1lbnQueDtcbiAgICAgIHkxID0gbWluWSArIGVsZW1lbnQueTtcbiAgICAgIHgyID0gbWF4WCArIGVsZW1lbnQueDtcbiAgICAgIHkyID0gbWF4WSArIGVsZW1lbnQueTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhO1xuXG4gICAgICAvLyBmaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0aGUgY3VydmVcbiAgICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZVswXSk7XG5cbiAgICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMpO1xuICAgICAgeDEgPSBtaW5YICsgZWxlbWVudC54O1xuICAgICAgeTEgPSBtaW5ZICsgZWxlbWVudC55O1xuICAgICAgeDIgPSBtYXhYICsgZWxlbWVudC54O1xuICAgICAgeTIgPSBtYXhZICsgZWxlbWVudC55O1xuICAgIH1cbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvb3JkcyA9IFt4MSwgeTEsIHgyLCB5MiwgY3gsIGN5XTtcblxuICAgIGlmICghaW5jbHVkZUJvdW5kVGV4dCkge1xuICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgIGNvb3JkcyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0TWluTWF4WFlXaXRoQm91bmRUZXh0KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBbeDEsIHkxLCB4MiwgeTJdLFxuICAgICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29vcmRzO1xuICB9O1xufVxuXG5jb25zdCBub3JtYWxpemVTZWxlY3RlZFBvaW50cyA9IChcbiAgcG9pbnRzOiAobnVtYmVyIHwgbnVsbClbXSxcbik6IG51bWJlcltdIHwgbnVsbCA9PiB7XG4gIGxldCBuZXh0UG9pbnRzID0gW1xuICAgIC4uLm5ldyBTZXQocG9pbnRzLmZpbHRlcigocCkgPT4gcCAhPT0gbnVsbCAmJiBwICE9PSAtMSkpLFxuICBdIGFzIG51bWJlcltdO1xuICBuZXh0UG9pbnRzID0gbmV4dFBvaW50cy5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIHJldHVybiBuZXh0UG9pbnRzLmxlbmd0aCA/IG5leHRQb2ludHMgOiBudWxsO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/linearElementEditor.ts\n");
|
|
3452
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"LinearElementEditor\": () => (/* binding */ LinearElementEditor)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _binding__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./binding */ \"../../element/binding.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst editorMidPointsCache = { version: null, points: [], zoom: null };\nclass LinearElementEditor {\n constructor(element, scene) {\n this.elementId = element.id;\n _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].mapElementToScene(this.elementId, scene);\n LinearElementEditor.normalizePoints(element);\n this.selectedPointsIndices = null;\n this.lastUncommittedPoint = null;\n this.isDragging = false;\n this.pointerOffset = { x: 0, y: 0 };\n this.startBindingElement = \"keep\";\n this.endBindingElement = \"keep\";\n this.pointerDownState = {\n prevSelectedPointsIndices: null,\n lastClickedPoint: -1,\n origin: null,\n segmentMidpoint: {\n value: null,\n index: null,\n added: false,\n },\n };\n this.hoverPointIndex = -1;\n this.segmentMidPointHoveredCoords = null;\n }\n /**\n * @param id the `elementId` from the instance of this class (so that we can\n * statically guarantee this method returns an ExcalidrawLinearElement)\n */\n static getElement(id) {\n var _a;\n const element = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getScene(id)) === null || _a === void 0 ? void 0 : _a.getNonDeletedElement(id);\n if (element) {\n return element;\n }\n return null;\n }\n static handleBoxSelection(event, appState, setState) {\n var _a;\n if (!appState.editingLinearElement ||\n ((_a = appState.draggingElement) === null || _a === void 0 ? void 0 : _a.type) !== \"selection\") {\n return false;\n }\n const { editingLinearElement } = appState;\n const { selectedPointsIndices, elementId } = editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return false;\n }\n const [selectionX1, selectionY1, selectionX2, selectionY2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(appState.draggingElement);\n const pointsSceneCoords = LinearElementEditor.getPointsGlobalCoordinates(element);\n const nextSelectedPoints = pointsSceneCoords.reduce((acc, point, index) => {\n if ((point[0] >= selectionX1 &&\n point[0] <= selectionX2 &&\n point[1] >= selectionY1 &&\n point[1] <= selectionY2) ||\n (event.shiftKey && (selectedPointsIndices === null || selectedPointsIndices === void 0 ? void 0 : selectedPointsIndices.includes(index)))) {\n acc.push(index);\n }\n return acc;\n }, []);\n setState({\n editingLinearElement: Object.assign(Object.assign({}, editingLinearElement), { selectedPointsIndices: nextSelectedPoints.length\n ? nextSelectedPoints\n : null }),\n });\n }\n /** @returns whether point was dragged */\n static handlePointDragging(event, appState, scenePointerX, scenePointerY, maybeSuggestBinding, linearElementEditor) {\n if (!linearElementEditor) {\n return false;\n }\n const { selectedPointsIndices, elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return false;\n }\n // point that's being dragged (out of all selected points)\n const draggingPoint = element.points[linearElementEditor.pointerDownState.lastClickedPoint];\n if (selectedPointsIndices && draggingPoint) {\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_8__.shouldRotateWithDiscreteAngle)(event) &&\n selectedPointsIndices.length === 1 &&\n element.points.length > 1) {\n const selectedIndex = selectedPointsIndices[0];\n const referencePoint = element.points[selectedIndex === 0 ? 1 : selectedIndex - 1];\n const [width, height] = LinearElementEditor._getShiftLockedDelta(element, referencePoint, [scenePointerX, scenePointerY], appState.gridSize);\n LinearElementEditor.movePoints(element, [\n {\n index: selectedIndex,\n point: [width + referencePoint[0], height + referencePoint[1]],\n isDragging: selectedIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint,\n },\n ]);\n }\n else {\n const newDraggingPointPosition = LinearElementEditor.createPointAt(element, scenePointerX - linearElementEditor.pointerOffset.x, scenePointerY - linearElementEditor.pointerOffset.y, appState.gridSize);\n const deltaX = newDraggingPointPosition[0] - draggingPoint[0];\n const deltaY = newDraggingPointPosition[1] - draggingPoint[1];\n LinearElementEditor.movePoints(element, selectedPointsIndices.map((pointIndex) => {\n const newPointPosition = pointIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint\n ? LinearElementEditor.createPointAt(element, scenePointerX - linearElementEditor.pointerOffset.x, scenePointerY - linearElementEditor.pointerOffset.y, appState.gridSize)\n : [\n element.points[pointIndex][0] + deltaX,\n element.points[pointIndex][1] + deltaY,\n ];\n return {\n index: pointIndex,\n point: newPointPosition,\n isDragging: pointIndex ===\n linearElementEditor.pointerDownState.lastClickedPoint,\n };\n }));\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n if (boundTextElement) {\n (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.handleBindTextResize)(element, false);\n }\n }\n // suggest bindings for first and last point if selected\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindingElement)(element, false)) {\n const coords = [];\n const firstSelectedIndex = selectedPointsIndices[0];\n if (firstSelectedIndex === 0) {\n coords.push((0,_utils__WEBPACK_IMPORTED_MODULE_6__.tupleToCoors)(LinearElementEditor.getPointGlobalCoordinates(element, element.points[0])));\n }\n const lastSelectedIndex = selectedPointsIndices[selectedPointsIndices.length - 1];\n if (lastSelectedIndex === element.points.length - 1) {\n coords.push((0,_utils__WEBPACK_IMPORTED_MODULE_6__.tupleToCoors)(LinearElementEditor.getPointGlobalCoordinates(element, element.points[lastSelectedIndex])));\n }\n if (coords.length) {\n maybeSuggestBinding(element, coords);\n }\n }\n return true;\n }\n return false;\n }\n static handlePointerUp(event, editingLinearElement, appState) {\n var _a;\n const { elementId, selectedPointsIndices, isDragging, pointerDownState } = editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return editingLinearElement;\n }\n const bindings = {};\n if (isDragging && selectedPointsIndices) {\n for (const selectedPoint of selectedPointsIndices) {\n if (selectedPoint === 0 ||\n selectedPoint === element.points.length - 1) {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.isPathALoop)(element.points, appState.zoom.value)) {\n LinearElementEditor.movePoints(element, [\n {\n index: selectedPoint,\n point: selectedPoint === 0\n ? element.points[element.points.length - 1]\n : element.points[0],\n },\n ]);\n }\n const bindingElement = (0,_binding__WEBPACK_IMPORTED_MODULE_5__.isBindingEnabled)(appState)\n ? (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)((0,_utils__WEBPACK_IMPORTED_MODULE_6__.tupleToCoors)(LinearElementEditor.getPointAtIndexGlobalCoordinates(element, selectedPoint)), _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getScene(element))\n : null;\n bindings[selectedPoint === 0 ? \"startBindingElement\" : \"endBindingElement\"] = bindingElement;\n }\n }\n }\n return Object.assign(Object.assign(Object.assign({}, editingLinearElement), bindings), { \n // if clicking without previously dragging a point(s), and not holding\n // shift, deselect all points except the one clicked. If holding shift,\n // toggle the point.\n selectedPointsIndices: isDragging || event.shiftKey\n ? !isDragging &&\n event.shiftKey &&\n ((_a = pointerDownState.prevSelectedPointsIndices) === null || _a === void 0 ? void 0 : _a.includes(pointerDownState.lastClickedPoint))\n ? selectedPointsIndices &&\n selectedPointsIndices.filter((pointIndex) => pointIndex !== pointerDownState.lastClickedPoint)\n : selectedPointsIndices\n : (selectedPointsIndices === null || selectedPointsIndices === void 0 ? void 0 : selectedPointsIndices.includes(pointerDownState.lastClickedPoint))\n ? [pointerDownState.lastClickedPoint]\n : selectedPointsIndices, isDragging: false, pointerOffset: { x: 0, y: 0 } });\n }\n static isSegmentTooShort(element, startPoint, endPoint, zoom) {\n let distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(startPoint[0], startPoint[1], endPoint[0], endPoint[1]);\n if (element.points.length > 2 && element.roundness) {\n distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getBezierCurveLength)(element, endPoint);\n }\n return distance * zoom.value < LinearElementEditor.POINT_HANDLE_SIZE * 4;\n }\n static getSegmentMidPoint(element, startPoint, endPoint, endPointIndex) {\n let segmentMidPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.centerPoint)(startPoint, endPoint);\n if (element.points.length > 2 && element.roundness) {\n const controlPoints = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getControlPointsForBezierCurve)(element, element.points[endPointIndex]);\n if (controlPoints) {\n const t = (0,_math__WEBPACK_IMPORTED_MODULE_0__.mapIntervalToBezierT)(element, element.points[endPointIndex], 0.5);\n const [tx, ty] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getBezierXY)(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3], t);\n segmentMidPoint = LinearElementEditor.getPointGlobalCoordinates(element, [tx, ty]);\n }\n }\n return segmentMidPoint;\n }\n static getSegmentMidPointIndex(linearElementEditor, appState, midPoint) {\n const element = LinearElementEditor.getElement(linearElementEditor.elementId);\n if (!element) {\n return -1;\n }\n const midPoints = LinearElementEditor.getEditorMidPoints(element, appState);\n let index = 0;\n while (index < midPoints.length) {\n if (LinearElementEditor.arePointsEqual(midPoint, midPoints[index])) {\n return index + 1;\n }\n index++;\n }\n return -1;\n }\n static handlePointerDown(event, appState, history, scenePointer, linearElementEditor) {\n var _a;\n const ret = {\n didAddPoint: false,\n hitElement: null,\n linearElementEditor: null,\n };\n if (!linearElementEditor) {\n return ret;\n }\n const { elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return ret;\n }\n const segmentMidpoint = LinearElementEditor.getSegmentMidpointHitCoords(linearElementEditor, scenePointer, appState);\n let segmentMidpointIndex = null;\n if (segmentMidpoint) {\n segmentMidpointIndex = LinearElementEditor.getSegmentMidPointIndex(linearElementEditor, appState, segmentMidpoint);\n }\n if (event.altKey && appState.editingLinearElement) {\n if (linearElementEditor.lastUncommittedPoint == null) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n points: [\n ...element.points,\n LinearElementEditor.createPointAt(element, scenePointer.x, scenePointer.y, appState.gridSize),\n ],\n });\n ret.didAddPoint = true;\n }\n history.resumeRecording();\n ret.linearElementEditor = Object.assign(Object.assign({}, linearElementEditor), { pointerDownState: {\n prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n lastClickedPoint: -1,\n origin: { x: scenePointer.x, y: scenePointer.y },\n segmentMidpoint: {\n value: segmentMidpoint,\n index: segmentMidpointIndex,\n added: false,\n },\n }, selectedPointsIndices: [element.points.length - 1], lastUncommittedPoint: null, endBindingElement: (0,_binding__WEBPACK_IMPORTED_MODULE_5__.getHoveredElementForBinding)(scenePointer, _scene_Scene__WEBPACK_IMPORTED_MODULE_4__[\"default\"].getScene(element)) });\n ret.didAddPoint = true;\n return ret;\n }\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(element, appState.zoom, scenePointer.x, scenePointer.y);\n // if we clicked on a point, set the element as hitElement otherwise\n // it would get deselected if the point is outside the hitbox area\n if (clickedPointIndex >= 0 || segmentMidpoint) {\n ret.hitElement = element;\n }\n else {\n // You might be wandering why we are storing the binding elements on\n // LinearElementEditor and passing them in, instead of calculating them\n // from the end points of the `linearElement` - this is to allow disabling\n // binding (which needs to happen at the point the user finishes moving\n // the point).\n const { startBindingElement, endBindingElement } = linearElementEditor;\n if ((0,_binding__WEBPACK_IMPORTED_MODULE_5__.isBindingEnabled)(appState) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_7__.isBindingElement)(element)) {\n (0,_binding__WEBPACK_IMPORTED_MODULE_5__.bindOrUnbindLinearElement)(element, startBindingElement, endBindingElement);\n }\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const targetPoint = clickedPointIndex > -1 &&\n (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + element.points[clickedPointIndex][0], element.y + element.points[clickedPointIndex][1], cx, cy, element.angle);\n const nextSelectedPointsIndices = clickedPointIndex > -1 || event.shiftKey\n ? event.shiftKey ||\n ((_a = linearElementEditor.selectedPointsIndices) === null || _a === void 0 ? void 0 : _a.includes(clickedPointIndex))\n ? normalizeSelectedPoints([\n ...(linearElementEditor.selectedPointsIndices || []),\n clickedPointIndex,\n ])\n : [clickedPointIndex]\n : null;\n ret.linearElementEditor = Object.assign(Object.assign({}, linearElementEditor), { pointerDownState: {\n prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n lastClickedPoint: clickedPointIndex,\n origin: { x: scenePointer.x, y: scenePointer.y },\n segmentMidpoint: {\n value: segmentMidpoint,\n index: segmentMidpointIndex,\n added: false,\n },\n }, selectedPointsIndices: nextSelectedPointsIndices, pointerOffset: targetPoint\n ? {\n x: scenePointer.x - targetPoint[0],\n y: scenePointer.y - targetPoint[1],\n }\n : { x: 0, y: 0 } });\n return ret;\n }\n static arePointsEqual(point1, point2) {\n if (!point1 && !point2) {\n return true;\n }\n if (!point1 || !point2) {\n return false;\n }\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.arePointsEqual)(point1, point2);\n }\n static handlePointerMove(event, scenePointerX, scenePointerY, appState) {\n if (!appState.editingLinearElement) {\n return null;\n }\n const { elementId, lastUncommittedPoint } = appState.editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return appState.editingLinearElement;\n }\n const { points } = element;\n const lastPoint = points[points.length - 1];\n if (!event.altKey) {\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.deletePoints(element, [points.length - 1]);\n }\n return Object.assign(Object.assign({}, appState.editingLinearElement), { lastUncommittedPoint: null });\n }\n let newPoint;\n if ((0,_keys__WEBPACK_IMPORTED_MODULE_8__.shouldRotateWithDiscreteAngle)(event) && points.length >= 2) {\n const lastCommittedPoint = points[points.length - 2];\n const [width, height] = LinearElementEditor._getShiftLockedDelta(element, lastCommittedPoint, [scenePointerX, scenePointerY], appState.gridSize);\n newPoint = [\n width + lastCommittedPoint[0],\n height + lastCommittedPoint[1],\n ];\n }\n else {\n newPoint = LinearElementEditor.createPointAt(element, scenePointerX - appState.editingLinearElement.pointerOffset.x, scenePointerY - appState.editingLinearElement.pointerOffset.y, appState.gridSize);\n }\n if (lastPoint === lastUncommittedPoint) {\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: newPoint,\n },\n ]);\n }\n else {\n LinearElementEditor.addPoints(element, appState, [{ point: newPoint }]);\n }\n return Object.assign(Object.assign({}, appState.editingLinearElement), { lastUncommittedPoint: element.points[element.points.length - 1] });\n }\n /** scene coords */\n static getPointGlobalCoordinates(element, point) {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n let { x, y } = element;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y];\n }\n /** scene coords */\n static getPointsGlobalCoordinates(element) {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n return element.points.map((point) => {\n let { x, y } = element;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x + point[0], y + point[1], cx, cy, element.angle);\n return [x, y];\n });\n }\n static getPointAtIndexGlobalCoordinates(element, indexMaybeFromEnd) {\n const index = indexMaybeFromEnd < 0\n ? element.points.length + indexMaybeFromEnd\n : indexMaybeFromEnd;\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const point = element.points[index];\n const { x, y } = element;\n return point\n ? (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x + point[0], y + point[1], cx, cy, element.angle)\n : (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx, cy, element.angle);\n }\n static pointFromAbsoluteCoords(element, absoluteCoords) {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(absoluteCoords[0], absoluteCoords[1], cx, cy, -element.angle);\n return [x - element.x, y - element.y];\n }\n static getPointIndexUnderCursor(element, zoom, x, y) {\n const pointHandles = LinearElementEditor.getPointsGlobalCoordinates(element);\n let idx = pointHandles.length;\n // loop from right to left because points on the right are rendered over\n // points on the left, thus should take precedence when clicking, if they\n // overlap\n while (--idx > -1) {\n const point = pointHandles[idx];\n if ((0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(x, y, point[0], point[1]) * zoom.value <\n // +1px to account for outline stroke\n LinearElementEditor.POINT_HANDLE_SIZE + 1) {\n return idx;\n }\n }\n return -1;\n }\n static createPointAt(element, scenePointerX, scenePointerY, gridSize) {\n const pointerOnGrid = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getGridPoint)(scenePointerX, scenePointerY, gridSize);\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const [rotatedX, rotatedY] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(pointerOnGrid[0], pointerOnGrid[1], cx, cy, -element.angle);\n return [rotatedX - element.x, rotatedY - element.y];\n }\n /**\n * Normalizes line points so that the start point is at [0,0]. This is\n * expected in various parts of the codebase. Also returns new x/y to account\n * for the potential normalization.\n */\n static getNormalizedPoints(element) {\n const { points } = element;\n const offsetX = points[0][0];\n const offsetY = points[0][1];\n return {\n points: points.map((point, _idx) => {\n return [point[0] - offsetX, point[1] - offsetY];\n }),\n x: element.x + offsetX,\n y: element.y + offsetY,\n };\n }\n // element-mutating methods\n // ---------------------------------------------------------------------------\n static normalizePoints(element) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, LinearElementEditor.getNormalizedPoints(element));\n }\n static duplicateSelectedPoints(appState) {\n if (!appState.editingLinearElement) {\n return false;\n }\n const { selectedPointsIndices, elementId } = appState.editingLinearElement;\n const element = LinearElementEditor.getElement(elementId);\n if (!element || selectedPointsIndices === null) {\n return false;\n }\n const { points } = element;\n const nextSelectedIndices = [];\n let pointAddedToEnd = false;\n let indexCursor = -1;\n const nextPoints = points.reduce((acc, point, index) => {\n ++indexCursor;\n acc.push(point);\n const isSelected = selectedPointsIndices.includes(index);\n if (isSelected) {\n const nextPoint = points[index + 1];\n if (!nextPoint) {\n pointAddedToEnd = true;\n }\n acc.push(nextPoint\n ? [(point[0] + nextPoint[0]) / 2, (point[1] + nextPoint[1]) / 2]\n : [point[0], point[1]]);\n nextSelectedIndices.push(indexCursor + 1);\n ++indexCursor;\n }\n return acc;\n }, []);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, { points: nextPoints });\n // temp hack to ensure the line doesn't move when adding point to the end,\n // potentially expanding the bounding box\n if (pointAddedToEnd) {\n const lastPoint = element.points[element.points.length - 1];\n LinearElementEditor.movePoints(element, [\n {\n index: element.points.length - 1,\n point: [lastPoint[0] + 30, lastPoint[1] + 30],\n },\n ]);\n }\n return {\n appState: Object.assign(Object.assign({}, appState), { editingLinearElement: Object.assign(Object.assign({}, appState.editingLinearElement), { selectedPointsIndices: nextSelectedIndices }) }),\n };\n }\n static deletePoints(element, pointIndices) {\n let offsetX = 0;\n let offsetY = 0;\n const isDeletingOriginPoint = pointIndices.includes(0);\n // if deleting first point, make the next to be [0,0] and recalculate\n // positions of the rest with respect to it\n if (isDeletingOriginPoint) {\n const firstNonDeletedPoint = element.points.find((point, idx) => {\n return !pointIndices.includes(idx);\n });\n if (firstNonDeletedPoint) {\n offsetX = firstNonDeletedPoint[0];\n offsetY = firstNonDeletedPoint[1];\n }\n }\n const nextPoints = element.points.reduce((acc, point, idx) => {\n if (!pointIndices.includes(idx)) {\n acc.push(!acc.length ? [0, 0] : [point[0] - offsetX, point[1] - offsetY]);\n }\n return acc;\n }, []);\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n static addPoints(element, appState, targetPoints) {\n const offsetX = 0;\n const offsetY = 0;\n const nextPoints = [...element.points, ...targetPoints.map((x) => x.point)];\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n }\n static movePoints(element, targetPoints, otherUpdates) {\n const { points } = element;\n // in case we're moving start point, instead of modifying its position\n // which would break the invariant of it being at [0,0], we move\n // all the other points in the opposite direction by delta to\n // offset it. We do the same with actual element.x/y position, so\n // this hacks are completely transparent to the user.\n let offsetX = 0;\n let offsetY = 0;\n const selectedOriginPoint = targetPoints.find(({ index }) => index === 0);\n if (selectedOriginPoint) {\n offsetX =\n selectedOriginPoint.point[0] + points[selectedOriginPoint.index][0];\n offsetY =\n selectedOriginPoint.point[1] + points[selectedOriginPoint.index][1];\n }\n const nextPoints = points.map((point, idx) => {\n const selectedPointData = targetPoints.find((p) => p.index === idx);\n if (selectedPointData) {\n if (selectedOriginPoint) {\n return point;\n }\n const deltaX = selectedPointData.point[0] - points[selectedPointData.index][0];\n const deltaY = selectedPointData.point[1] - points[selectedPointData.index][1];\n return [point[0] + deltaX, point[1] + deltaY];\n }\n return offsetX || offsetY\n ? [point[0] - offsetX, point[1] - offsetY]\n : point;\n });\n LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY, otherUpdates);\n }\n static shouldAddMidpoint(linearElementEditor, pointerCoords, appState) {\n const element = LinearElementEditor.getElement(linearElementEditor.elementId);\n if (!element) {\n return false;\n }\n const { segmentMidpoint } = linearElementEditor.pointerDownState;\n if (segmentMidpoint.added ||\n segmentMidpoint.value === null ||\n segmentMidpoint.index === null ||\n linearElementEditor.pointerDownState.origin === null) {\n return false;\n }\n const origin = linearElementEditor.pointerDownState.origin;\n const dist = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(origin.x, origin.y, pointerCoords.x, pointerCoords.y);\n if (!appState.editingLinearElement &&\n dist < _constants__WEBPACK_IMPORTED_MODULE_11__.DRAGGING_THRESHOLD / appState.zoom.value) {\n return false;\n }\n return true;\n }\n static addMidpoint(linearElementEditor, pointerCoords, appState) {\n const element = LinearElementEditor.getElement(linearElementEditor.elementId);\n if (!element) {\n return;\n }\n const { segmentMidpoint } = linearElementEditor.pointerDownState;\n const ret = {\n pointerDownState: linearElementEditor.pointerDownState,\n selectedPointsIndices: linearElementEditor.selectedPointsIndices,\n };\n const midpoint = LinearElementEditor.createPointAt(element, pointerCoords.x, pointerCoords.y, appState.gridSize);\n const points = [\n ...element.points.slice(0, segmentMidpoint.index),\n midpoint,\n ...element.points.slice(segmentMidpoint.index),\n ];\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, {\n points,\n });\n ret.pointerDownState = Object.assign(Object.assign({}, linearElementEditor.pointerDownState), { segmentMidpoint: Object.assign(Object.assign({}, linearElementEditor.pointerDownState.segmentMidpoint), { added: true }), lastClickedPoint: segmentMidpoint.index });\n ret.selectedPointsIndices = [segmentMidpoint.index];\n return ret;\n }\n static _updatePoints(element, nextPoints, offsetX, offsetY, otherUpdates) {\n const nextCoords = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getElementPointsCoords)(element, nextPoints);\n const prevCoords = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getElementPointsCoords)(element, element.points);\n const nextCenterX = (nextCoords[0] + nextCoords[2]) / 2;\n const nextCenterY = (nextCoords[1] + nextCoords[3]) / 2;\n const prevCenterX = (prevCoords[0] + prevCoords[2]) / 2;\n const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;\n const dX = prevCenterX - nextCenterX;\n const dY = prevCenterY - nextCenterY;\n const rotated = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(offsetX, offsetY, dX, dY, element.angle);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(element, Object.assign(Object.assign({}, otherUpdates), { points: nextPoints, x: element.x + rotated[0], y: element.y + rotated[1] }));\n }\n static _getShiftLockedDelta(element, referencePoint, scenePointer, gridSize) {\n const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates(element, referencePoint);\n const [gridX, gridY] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.getGridPoint)(scenePointer[0], scenePointer[1], gridSize);\n const { width, height } = (0,___WEBPACK_IMPORTED_MODULE_1__.getLockedLinearCursorAlignSize)(referencePointCoords[0], referencePointCoords[1], gridX, gridY);\n return (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([width, height], [0, 0], -element.angle);\n }\n}\n// ---------------------------------------------------------------------------\n// static methods\n// ---------------------------------------------------------------------------\nLinearElementEditor.POINT_HANDLE_SIZE = 10;\nLinearElementEditor.getEditorMidPoints = (element, appState) => {\n const boundText = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n // Since its not needed outside editor unless 2 pointer lines or bound text\n if (!appState.editingLinearElement &&\n element.points.length > 2 &&\n !boundText) {\n return [];\n }\n if (editorMidPointsCache.version === element.version &&\n editorMidPointsCache.zoom === appState.zoom.value) {\n return editorMidPointsCache.points;\n }\n LinearElementEditor.updateEditorMidPointsCache(element, appState);\n return editorMidPointsCache.points;\n};\nLinearElementEditor.updateEditorMidPointsCache = (element, appState) => {\n const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n let index = 0;\n const midpoints = [];\n while (index < points.length - 1) {\n if (LinearElementEditor.isSegmentTooShort(element, element.points[index], element.points[index + 1], appState.zoom)) {\n midpoints.push(null);\n index++;\n continue;\n }\n const segmentMidPoint = LinearElementEditor.getSegmentMidPoint(element, points[index], points[index + 1], index + 1);\n midpoints.push(segmentMidPoint);\n index++;\n }\n editorMidPointsCache.points = midpoints;\n editorMidPointsCache.version = element.version;\n editorMidPointsCache.zoom = appState.zoom.value;\n};\nLinearElementEditor.getSegmentMidpointHitCoords = (linearElementEditor, scenePointer, appState) => {\n const { elementId } = linearElementEditor;\n const element = LinearElementEditor.getElement(elementId);\n if (!element) {\n return null;\n }\n const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(element, appState.zoom, scenePointer.x, scenePointer.y);\n if (clickedPointIndex >= 0) {\n return null;\n }\n const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n if (points.length >= 3 && !appState.editingLinearElement) {\n return null;\n }\n const threshold = LinearElementEditor.POINT_HANDLE_SIZE / appState.zoom.value;\n const existingSegmentMidpointHitCoords = linearElementEditor.segmentMidPointHoveredCoords;\n if (existingSegmentMidpointHitCoords) {\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(existingSegmentMidpointHitCoords[0], existingSegmentMidpointHitCoords[1], scenePointer.x, scenePointer.y);\n if (distance <= threshold) {\n return existingSegmentMidpointHitCoords;\n }\n }\n let index = 0;\n const midPoints = LinearElementEditor.getEditorMidPoints(element, appState);\n while (index < midPoints.length) {\n if (midPoints[index] !== null) {\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)(midPoints[index][0], midPoints[index][1], scenePointer.x, scenePointer.y);\n if (distance <= threshold) {\n return midPoints[index];\n }\n }\n index++;\n }\n return null;\n};\nLinearElementEditor.getBoundTextElementPosition = (element, boundTextElement) => {\n const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n if (points.length < 2) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_3__.mutateElement)(boundTextElement, { isDeleted: true });\n }\n let x = 0;\n let y = 0;\n if (element.points.length % 2 === 1) {\n const index = Math.floor(element.points.length / 2);\n const midPoint = LinearElementEditor.getPointGlobalCoordinates(element, element.points[index]);\n x = midPoint[0] - boundTextElement.width / 2;\n y = midPoint[1] - boundTextElement.height / 2;\n }\n else {\n const index = element.points.length / 2 - 1;\n let midSegmentMidpoint = editorMidPointsCache.points[index];\n if (element.points.length === 2) {\n midSegmentMidpoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.centerPoint)(points[0], points[1]);\n }\n if (!midSegmentMidpoint ||\n editorMidPointsCache.version !== element.version) {\n midSegmentMidpoint = LinearElementEditor.getSegmentMidPoint(element, points[index], points[index + 1], index + 1);\n }\n x = midSegmentMidpoint[0] - boundTextElement.width / 2;\n y = midSegmentMidpoint[1] - boundTextElement.height / 2;\n }\n return { x, y };\n};\nLinearElementEditor.getMinMaxXYWithBoundText = (element, elementBounds, boundTextElement) => {\n let [x1, y1, x2, y2] = elementBounds;\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n const { x: boundTextX1, y: boundTextY1 } = LinearElementEditor.getBoundTextElementPosition(element, boundTextElement);\n const boundTextX2 = boundTextX1 + boundTextElement.width;\n const boundTextY2 = boundTextY1 + boundTextElement.height;\n const topLeftRotatedPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([x1, y1], [cx, cy], element.angle);\n const topRightRotatedPoint = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([x2, y1], [cx, cy], element.angle);\n const counterRotateBoundTextTopLeft = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX1, boundTextY1], [cx, cy], -element.angle);\n const counterRotateBoundTextTopRight = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX2, boundTextY1], [cx, cy], -element.angle);\n const counterRotateBoundTextBottomLeft = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX1, boundTextY2], [cx, cy], -element.angle);\n const counterRotateBoundTextBottomRight = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([boundTextX2, boundTextY2], [cx, cy], -element.angle);\n if (topLeftRotatedPoint[0] < topRightRotatedPoint[0] &&\n topLeftRotatedPoint[1] >= topRightRotatedPoint[1]) {\n x1 = Math.min(x1, counterRotateBoundTextBottomLeft[0]);\n x2 = Math.max(x2, Math.max(counterRotateBoundTextTopRight[0], counterRotateBoundTextBottomRight[0]));\n y1 = Math.min(y1, counterRotateBoundTextTopLeft[1]);\n y2 = Math.max(y2, counterRotateBoundTextBottomRight[1]);\n }\n else if (topLeftRotatedPoint[0] >= topRightRotatedPoint[0] &&\n topLeftRotatedPoint[1] > topRightRotatedPoint[1]) {\n x1 = Math.min(x1, counterRotateBoundTextBottomRight[0]);\n x2 = Math.max(x2, Math.max(counterRotateBoundTextTopLeft[0], counterRotateBoundTextTopRight[0]));\n y1 = Math.min(y1, counterRotateBoundTextBottomLeft[1]);\n y2 = Math.max(y2, counterRotateBoundTextTopRight[1]);\n }\n else if (topLeftRotatedPoint[0] >= topRightRotatedPoint[0]) {\n x1 = Math.min(x1, counterRotateBoundTextTopRight[0]);\n x2 = Math.max(x2, counterRotateBoundTextBottomLeft[0]);\n y1 = Math.min(y1, counterRotateBoundTextBottomRight[1]);\n y2 = Math.max(y2, counterRotateBoundTextTopLeft[1]);\n }\n else if (topLeftRotatedPoint[1] <= topRightRotatedPoint[1]) {\n x1 = Math.min(x1, Math.min(counterRotateBoundTextTopRight[0], counterRotateBoundTextTopLeft[0]));\n x2 = Math.max(x2, counterRotateBoundTextBottomRight[0]);\n y1 = Math.min(y1, counterRotateBoundTextTopRight[1]);\n y2 = Math.max(y2, counterRotateBoundTextBottomLeft[1]);\n }\n return [x1, y1, x2, y2, cx, cy];\n};\nLinearElementEditor.getElementAbsoluteCoords = (element, includeBoundText = false) => {\n let coords;\n let x1;\n let y1;\n let x2;\n let y2;\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_10__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n x1 = minX + element.x;\n y1 = minY + element.y;\n x2 = maxX + element.x;\n y2 = maxY + element.y;\n }\n else {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_10__.getShapeForElement)(element);\n // first element is always the curve\n const ops = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getCurvePathOps)(shape[0]);\n const [minX, minY, maxX, maxY] = (0,_bounds__WEBPACK_IMPORTED_MODULE_2__.getMinMaxXYFromCurvePathOps)(ops);\n x1 = minX + element.x;\n y1 = minY + element.y;\n x2 = maxX + element.x;\n y2 = maxY + element.y;\n }\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n coords = [x1, y1, x2, y2, cx, cy];\n if (!includeBoundText) {\n return coords;\n }\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_9__.getBoundTextElement)(element);\n if (boundTextElement) {\n coords = LinearElementEditor.getMinMaxXYWithBoundText(element, [x1, y1, x2, y2], boundTextElement);\n }\n return coords;\n};\nconst normalizeSelectedPoints = (points) => {\n let nextPoints = [\n ...new Set(points.filter((p) => p !== null && p !== -1)),\n ];\n nextPoints = nextPoints.sort((a, b) => a - b);\n return nextPoints.length ? nextPoints : null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFvQmlCO0FBQzREO0FBSzNEO0FBRThCO0FBR2I7QUFLaEI7QUFDcUI7QUFDUTtBQUNRO0FBQ2tCO0FBQ1g7QUFDYjtBQUdsRCxNQUFNLG9CQUFvQixHQUl0QixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7QUFDdkMsTUFBTSxtQkFBbUI7SUErQjlCLFlBQVksT0FBNEMsRUFBRSxLQUFZO1FBQ3BFLElBQUksQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEVBRXhCLENBQUM7UUFDRixzRUFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9DLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDakMsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQztRQUNoQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUc7WUFDdEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQixnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDcEIsTUFBTSxFQUFFLElBQUk7WUFFWixlQUFlLEVBQUU7Z0JBQ2YsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLElBQUk7Z0JBQ1gsS0FBSyxFQUFFLEtBQUs7YUFDYjtTQUNGLENBQUM7UUFD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RSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQ3JCLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFDRCxNQUFNLGdCQUFnQixHQUFHLGlFQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3RELElBQUksZ0JBQWdCLEVBQUU7UUFDcEIsTUFBTSxHQUFHLG1CQUFtQixDQUFDLHdCQUF3QixDQUNuRCxPQUFPLEVBQ1AsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFDaEIsZ0JBQWdCLENBQ2pCLENBQUM7S0FDSDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMsQ0FBQztBQUdKLE1BQU0sdUJBQXVCLEdBQUcsQ0FDOUIsTUFBeUIsRUFDUixFQUFFO0lBQ25CLElBQUksVUFBVSxHQUFHO1FBQ2YsR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdDLENBQUM7SUFDZCxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QyxPQUFPLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0FBQy9DLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2xpbmVhckVsZW1lbnRFZGl0b3IudHM/ZmM0MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBOb25EZWxldGVkLFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIFBvaW50QmluZGluZyxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGRpc3RhbmNlMmQsXG4gIHJvdGF0ZSxcbiAgaXNQYXRoQUxvb3AsXG4gIGdldEdyaWRQb2ludCxcbiAgcm90YXRlUG9pbnQsXG4gIGNlbnRlclBvaW50LFxuICBnZXRDb250cm9sUG9pbnRzRm9yQmV6aWVyQ3VydmUsXG4gIGdldEJlemllclhZLFxuICBnZXRCZXppZXJDdXJ2ZUxlbmd0aCxcbiAgbWFwSW50ZXJ2YWxUb0JlemllclQsXG4gIGFyZVBvaW50c0VxdWFsLFxufSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzLCBnZXRMb2NrZWRMaW5lYXJDdXJzb3JBbGlnblNpemUgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHtcbiAgZ2V0Q3VydmVQYXRoT3BzLFxuICBnZXRFbGVtZW50UG9pbnRzQ29vcmRzLFxuICBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMsXG59IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHsgUG9pbnQsIEFwcFN0YXRlLCBQb2ludGVyQ29vcmRzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IEhpc3RvcnkgZnJvbSBcIi4uL2hpc3RvcnlcIjtcblxuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHtcbiAgYmluZE9yVW5iaW5kTGluZWFyRWxlbWVudCxcbiAgZ2V0SG92ZXJlZEVsZW1lbnRGb3JCaW5kaW5nLFxuICBpc0JpbmRpbmdFbmFibGVkLFxufSBmcm9tIFwiLi9iaW5kaW5nXCI7XG5pbXBvcnQgeyB0dXBsZVRvQ29vcnMgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IGlzQmluZGluZ0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBzaG91bGRSb3RhdGVXaXRoRGlzY3JldGVBbmdsZSB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQgeyBnZXRCb3VuZFRleHRFbGVtZW50LCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXRTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgRFJBR0dJTkdfVEhSRVNIT0xEIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gXCIuLi91dGlsaXR5LXR5cGVzXCI7XG5cbmNvbnN0IGVkaXRvck1pZFBvaW50c0NhY2hlOiB7XG4gIHZlcnNpb246IG51bWJlciB8IG51bGw7XG4gIHBvaW50czogKFBvaW50IHwgbnVsbClbXTtcbiAgem9vbTogbnVtYmVyIHwgbnVsbDtcbn0gPSB7IHZlcnNpb246IG51bGwsIHBvaW50czogW10sIHpvb206IG51bGwgfTtcbmV4cG9ydCBjbGFzcyBMaW5lYXJFbGVtZW50RWRpdG9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGVsZW1lbnRJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSAmIHtcbiAgICBfYnJhbmQ6IFwiZXhjYWxpZHJhd0xpbmVhckVsZW1lbnRJZFwiO1xuICB9O1xuICAvKiogaW5kaWNlcyAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0ZWRQb2ludHNJbmRpY2VzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGw7XG5cbiAgcHVibGljIHJlYWRvbmx5IHBvaW50ZXJEb3duU3RhdGU6IFJlYWRvbmx5PHtcbiAgICBwcmV2U2VsZWN0ZWRQb2ludHNJbmRpY2VzOiByZWFkb25seSBudW1iZXJbXSB8IG51bGw7XG4gICAgLyoqIGluZGV4ICovXG4gICAgbGFzdENsaWNrZWRQb2ludDogbnVtYmVyO1xuICAgIG9yaWdpbjogUmVhZG9ubHk8eyB4OiBudW1iZXI7IHk6IG51bWJlciB9PiB8IG51bGw7XG4gICAgc2VnbWVudE1pZHBvaW50OiB7XG4gICAgICB2YWx1ZTogUG9pbnQgfCBudWxsO1xuICAgICAgaW5kZXg6IG51bWJlciB8IG51bGw7XG4gICAgICBhZGRlZDogYm9vbGVhbjtcbiAgICB9O1xuICB9PjtcblxuICAvKiogd2hldGhlciB5b3UncmUgZHJhZ2dpbmcgYSBwb2ludCAqL1xuICBwdWJsaWMgcmVhZG9ubHkgaXNEcmFnZ2luZzogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGxhc3RVbmNvbW1pdHRlZFBvaW50OiBQb2ludCB8IG51bGw7XG4gIHB1YmxpYyByZWFkb25seSBwb2ludGVyT2Zmc2V0OiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+O1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhcnRCaW5kaW5nRWxlbWVudDpcbiAgICB8IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnRcbiAgICB8IG51bGxcbiAgICB8IFwia2VlcFwiO1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kQmluZGluZ0VsZW1lbnQ6IEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQgfCBudWxsIHwgXCJrZWVwXCI7XG4gIHB1YmxpYyByZWFkb25seSBob3ZlclBvaW50SW5kZXg6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IHNlZ21lbnRNaWRQb2ludEhvdmVyZWRDb29yZHM6IFBvaW50IHwgbnVsbDtcblxuICBjb25zdHJ1Y3RvcihlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50Piwgc2NlbmU6IFNjZW5lKSB7XG4gICAgdGhpcy5lbGVtZW50SWQgPSBlbGVtZW50LmlkIGFzIHN0cmluZyAmIHtcbiAgICAgIF9icmFuZDogXCJleGNhbGlkcmF3TGluZWFyRWxlbWVudElkXCI7XG4gICAgfTtcbiAgICBTY2VuZS5tYXBFbGVtZW50VG9TY2VuZSh0aGlzLmVsZW1lbnRJZCwgc2NlbmUpO1xuICAgIExpbmVhckVsZW1lbnRFZGl0b3Iubm9ybWFsaXplUG9pbnRzKGVsZW1lbnQpO1xuXG4gICAgdGhpcy5zZWxlY3RlZFBvaW50c0luZGljZXMgPSBudWxsO1xuICAgIHRoaXMubGFzdFVuY29tbWl0dGVkUG9pbnQgPSBudWxsO1xuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMucG9pbnRlck9mZnNldCA9IHsgeDogMCwgeTogMCB9O1xuICAgIHRoaXMuc3RhcnRCaW5kaW5nRWxlbWVudCA9IFwia2VlcFwiO1xuICAgIHRoaXMuZW5kQmluZGluZ0VsZW1lbnQgPSBcImtlZXBcIjtcbiAgICB0aGlzLnBvaW50ZXJEb3duU3RhdGUgPSB7XG4gICAgICBwcmV2U2VsZWN0ZWRQb2ludHNJbmRpY2VzOiBudWxsLFxuICAgICAgbGFzdENsaWNrZWRQb2ludDogLTEsXG4gICAgICBvcmlnaW46IG51bGwsXG5cbiAgICAgIHNlZ21lbnRNaWRwb2ludDoge1xuICAgICAgICB2YWx1ZTogbnVsbCxcbiAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgIGFkZGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICB0aGlzLmhvdmVyUG9pbnRJbmRleCA9IC0xO1xuICAgIHRoaXMuc2VnbWVudE1pZFBvaW50SG92ZXJlZENvb3JkcyA9IG51bGw7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgLy8gc3RhdGljIG1ldGhvZHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgc3RhdGljIFBPSU5UX0hBTkRMRV9TSVpFID0gMTA7XG4gIC8qKlxuICAgKiBAcGFyYW0gaWQgdGhlIGBlbGVtZW50SWRgIGZyb20gdGhlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgKHNvIHRoYXQgd2UgY2FuXG4gICAqICBzdGF0aWNhbGx5IGd1YXJhbnRlZSB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50KVxuICAgKi9cbiAgc3RhdGljIGdldEVsZW1lbnQoaWQ6IEluc3RhbmNlVHlwZTx0eXBlb2YgTGluZWFyRWxlbWVudEVkaXRvcj5bXCJlbGVtZW50SWRcIl0pIHtcbiAgICBjb25zdCBlbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoaWQpPy5nZXROb25EZWxldGVkRWxlbWVudChpZCk7XG4gICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBlbGVtZW50IGFzIE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVCb3hTZWxlY3Rpb24oXG4gICAgZXZlbnQ6IFBvaW50ZXJFdmVudCxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgc2V0U3RhdGU6IFJlYWN0LkNvbXBvbmVudDxhbnksIEFwcFN0YXRlPltcInNldFN0YXRlXCJdLFxuICApIHtcbiAgICBpZiAoXG4gICAgICAhYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgfHxcbiAgICAgIGFwcFN0YXRlLmRyYWdnaW5nRWxlbWVudD8udHlwZSAhPT0gXCJzZWxlY3Rpb25cIlxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IGVkaXRpbmdMaW5lYXJFbGVtZW50IH0gPSBhcHBTdGF0ZTtcbiAgICBjb25zdCB7IHNlbGVjdGVkUG9pbnRzSW5kaWNlcywgZWxlbWVudElkIH0gPSBlZGl0aW5nTGluZWFyRWxlbWVudDtcblxuICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoZWxlbWVudElkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBbc2VsZWN0aW9uWDEsIHNlbGVjdGlvblkxLCBzZWxlY3Rpb25YMiwgc2VsZWN0aW9uWTJdID1cbiAgICAgIGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhhcHBTdGF0ZS5kcmFnZ2luZ0VsZW1lbnQpO1xuXG4gICAgY29uc3QgcG9pbnRzU2NlbmVDb29yZHMgPVxuICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhlbGVtZW50KTtcblxuICAgIGNvbnN0IG5leHRTZWxlY3RlZFBvaW50cyA9IHBvaW50c1NjZW5lQ29vcmRzLnJlZHVjZShcbiAgICAgIChhY2M6IG51bWJlcltdLCBwb2ludCwgaW5kZXgpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChwb2ludFswXSA+PSBzZWxlY3Rpb25YMSAmJlxuICAgICAgICAgICAgcG9pbnRbMF0gPD0gc2VsZWN0aW9uWDIgJiZcbiAgICAgICAgICAgIHBvaW50WzFdID49IHNlbGVjdGlvblkxICYmXG4gICAgICAgICAgICBwb2ludFsxXSA8PSBzZWxlY3Rpb25ZMikgfHxcbiAgICAgICAgICAoZXZlbnQuc2hpZnRLZXkgJiYgc2VsZWN0ZWRQb2ludHNJbmRpY2VzPy5pbmNsdWRlcyhpbmRleCkpXG4gICAgICAgICkge1xuICAgICAgICAgIGFjYy5wdXNoKGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9LFxuICAgICAgW10sXG4gICAgKTtcblxuICAgIHNldFN0YXRlKHtcbiAgICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiB7XG4gICAgICAgIC4uLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICBzZWxlY3RlZFBvaW50c0luZGljZXM6IG5leHRTZWxlY3RlZFBvaW50cy5sZW5ndGhcbiAgICAgICAgICA/IG5leHRTZWxlY3RlZFBvaW50c1xuICAgICAgICAgIDogbnVsbCxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKiogQHJldHVybnMgd2hldGhlciBwb2ludCB3YXMgZHJhZ2dlZCAqL1xuICBzdGF0aWMgaGFuZGxlUG9pbnREcmFnZ2luZyhcbiAgICBldmVudDogUG9pbnRlckV2ZW50LFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBzY2VuZVBvaW50ZXJYOiBudW1iZXIsXG4gICAgc2NlbmVQb2ludGVyWTogbnVtYmVyLFxuICAgIG1heWJlU3VnZ2VzdEJpbmRpbmc6IChcbiAgICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgICAgcG9pbnRTY2VuZUNvb3JkczogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9W10sXG4gICAgKSA9PiB2b2lkLFxuICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICk6IGJvb2xlYW4ge1xuICAgIGlmICghbGluZWFyRWxlbWVudEVkaXRvcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB7IHNlbGVjdGVkUG9pbnRzSW5kaWNlcywgZWxlbWVudElkIH0gPSBsaW5lYXJFbGVtZW50RWRpdG9yO1xuICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoZWxlbWVudElkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBwb2ludCB0aGF0J3MgYmVpbmcgZHJhZ2dlZCAob3V0IG9mIGFsbCBzZWxlY3RlZCBwb2ludHMpXG4gICAgY29uc3QgZHJhZ2dpbmdQb2ludCA9IGVsZW1lbnQucG9pbnRzW1xuICAgICAgbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlLmxhc3RDbGlja2VkUG9pbnRcbiAgICBdIGFzIFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAoc2VsZWN0ZWRQb2ludHNJbmRpY2VzICYmIGRyYWdnaW5nUG9pbnQpIHtcbiAgICAgIGlmIChcbiAgICAgICAgc2hvdWxkUm90YXRlV2l0aERpc2NyZXRlQW5nbGUoZXZlbnQpICYmXG4gICAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlcy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgZWxlbWVudC5wb2ludHMubGVuZ3RoID4gMVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkSW5kZXggPSBzZWxlY3RlZFBvaW50c0luZGljZXNbMF07XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZVBvaW50ID1cbiAgICAgICAgICBlbGVtZW50LnBvaW50c1tzZWxlY3RlZEluZGV4ID09PSAwID8gMSA6IHNlbGVjdGVkSW5kZXggLSAxXTtcblxuICAgICAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBMaW5lYXJFbGVtZW50RWRpdG9yLl9nZXRTaGlmdExvY2tlZERlbHRhKFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgcmVmZXJlbmNlUG9pbnQsXG4gICAgICAgICAgW3NjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclldLFxuICAgICAgICAgIGFwcFN0YXRlLmdyaWRTaXplLFxuICAgICAgICApO1xuXG4gICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IubW92ZVBvaW50cyhlbGVtZW50LCBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgaW5kZXg6IHNlbGVjdGVkSW5kZXgsXG4gICAgICAgICAgICBwb2ludDogW3dpZHRoICsgcmVmZXJlbmNlUG9pbnRbMF0sIGhlaWdodCArIHJlZmVyZW5jZVBvaW50WzFdXSxcbiAgICAgICAgICAgIGlzRHJhZ2dpbmc6XG4gICAgICAgICAgICAgIHNlbGVjdGVkSW5kZXggPT09XG4gICAgICAgICAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZS5sYXN0Q2xpY2tlZFBvaW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbmV3RHJhZ2dpbmdQb2ludFBvc2l0aW9uID0gTGluZWFyRWxlbWVudEVkaXRvci5jcmVhdGVQb2ludEF0KFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgc2NlbmVQb2ludGVyWCAtIGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlck9mZnNldC54LFxuICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJPZmZzZXQueSxcbiAgICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBkZWx0YVggPSBuZXdEcmFnZ2luZ1BvaW50UG9zaXRpb25bMF0gLSBkcmFnZ2luZ1BvaW50WzBdO1xuICAgICAgICBjb25zdCBkZWx0YVkgPSBuZXdEcmFnZ2luZ1BvaW50UG9zaXRpb25bMV0gLSBkcmFnZ2luZ1BvaW50WzFdO1xuXG4gICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IubW92ZVBvaW50cyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlcy5tYXAoKHBvaW50SW5kZXgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5ld1BvaW50UG9zaXRpb24gPVxuICAgICAgICAgICAgICBwb2ludEluZGV4ID09PVxuICAgICAgICAgICAgICBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludFxuICAgICAgICAgICAgICAgID8gTGluZWFyRWxlbWVudEVkaXRvci5jcmVhdGVQb2ludEF0KFxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBzY2VuZVBvaW50ZXJYIC0gbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyT2Zmc2V0LngsXG4gICAgICAgICAgICAgICAgICAgIHNjZW5lUG9pbnRlclkgLSBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJPZmZzZXQueSxcbiAgICAgICAgICAgICAgICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiAoW1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnBvaW50c1twb2ludEluZGV4XVswXSArIGRlbHRhWCxcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wb2ludHNbcG9pbnRJbmRleF1bMV0gKyBkZWx0YVksXG4gICAgICAgICAgICAgICAgICBdIGFzIGNvbnN0KTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIGluZGV4OiBwb2ludEluZGV4LFxuICAgICAgICAgICAgICBwb2ludDogbmV3UG9pbnRQb3NpdGlvbixcbiAgICAgICAgICAgICAgaXNEcmFnZ2luZzpcbiAgICAgICAgICAgICAgICBwb2ludEluZGV4ID09PVxuICAgICAgICAgICAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZS5sYXN0Q2xpY2tlZFBvaW50LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgICAgICBoYW5kbGVCaW5kVGV4dFJlc2l6ZShlbGVtZW50LCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gc3VnZ2VzdCBiaW5kaW5ncyBmb3IgZmlyc3QgYW5kIGxhc3QgcG9pbnQgaWYgc2VsZWN0ZWRcbiAgICAgIGlmIChpc0JpbmRpbmdFbGVtZW50KGVsZW1lbnQsIGZhbHNlKSkge1xuICAgICAgICBjb25zdCBjb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfVtdID0gW107XG5cbiAgICAgICAgY29uc3QgZmlyc3RTZWxlY3RlZEluZGV4ID0gc2VsZWN0ZWRQb2ludHNJbmRpY2VzWzBdO1xuICAgICAgICBpZiAoZmlyc3RTZWxlY3RlZEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgY29vcmRzLnB1c2goXG4gICAgICAgICAgICB0dXBsZVRvQ29vcnMoXG4gICAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgICAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgICAgICAgIGVsZW1lbnQucG9pbnRzWzBdLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbGFzdFNlbGVjdGVkSW5kZXggPVxuICAgICAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlc1tzZWxlY3RlZFBvaW50c0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChsYXN0U2VsZWN0ZWRJbmRleCA9PT0gZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGNvb3Jkcy5wdXNoKFxuICAgICAgICAgICAgdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICBlbGVtZW50LnBvaW50c1tsYXN0U2VsZWN0ZWRJbmRleF0sXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgIG1heWJlU3VnZ2VzdEJpbmRpbmcoZWxlbWVudCwgY29vcmRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlUG9pbnRlclVwKFxuICAgIGV2ZW50OiBQb2ludGVyRXZlbnQsXG4gICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICApOiBMaW5lYXJFbGVtZW50RWRpdG9yIHtcbiAgICBjb25zdCB7IGVsZW1lbnRJZCwgc2VsZWN0ZWRQb2ludHNJbmRpY2VzLCBpc0RyYWdnaW5nLCBwb2ludGVyRG93blN0YXRlIH0gPVxuICAgICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChlbGVtZW50SWQpO1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIGVkaXRpbmdMaW5lYXJFbGVtZW50O1xuICAgIH1cblxuICAgIGNvbnN0IGJpbmRpbmdzOiBNdXRhYmxlPFxuICAgICAgUGFydGlhbDxcbiAgICAgICAgUGljazxcbiAgICAgICAgICBJbnN0YW5jZVR5cGU8dHlwZW9mIExpbmVhckVsZW1lbnRFZGl0b3I+LFxuICAgICAgICAgIFwic3RhcnRCaW5kaW5nRWxlbWVudFwiIHwgXCJlbmRCaW5kaW5nRWxlbWVudFwiXG4gICAgICAgID5cbiAgICAgID5cbiAgICA+ID0ge307XG5cbiAgICBpZiAoaXNEcmFnZ2luZyAmJiBzZWxlY3RlZFBvaW50c0luZGljZXMpIHtcbiAgICAgIGZvciAoY29uc3Qgc2VsZWN0ZWRQb2ludCBvZiBzZWxlY3RlZFBvaW50c0luZGljZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHNlbGVjdGVkUG9pbnQgPT09IDAgfHxcbiAgICAgICAgICBzZWxlY3RlZFBvaW50ID09PSBlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXG4gICAgICAgICkge1xuICAgICAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cywgYXBwU3RhdGUuem9vbS52YWx1ZSkpIHtcbiAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IubW92ZVBvaW50cyhlbGVtZW50LCBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpbmRleDogc2VsZWN0ZWRQb2ludCxcbiAgICAgICAgICAgICAgICBwb2ludDpcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUG9pbnQgPT09IDBcbiAgICAgICAgICAgICAgICAgICAgPyBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzWzBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgYmluZGluZ0VsZW1lbnQgPSBpc0JpbmRpbmdFbmFibGVkKGFwcFN0YXRlKVxuICAgICAgICAgICAgPyBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICAgICAgICAgICAgdHVwbGVUb0Nvb3JzKFxuICAgICAgICAgICAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEF0SW5kZXhHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQb2ludCEsXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkhLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBiaW5kaW5nc1tcbiAgICAgICAgICAgIHNlbGVjdGVkUG9pbnQgPT09IDAgPyBcInN0YXJ0QmluZGluZ0VsZW1lbnRcIiA6IFwiZW5kQmluZGluZ0VsZW1lbnRcIlxuICAgICAgICAgIF0gPSBiaW5kaW5nRWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAuLi5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICAgIC4uLmJpbmRpbmdzLFxuICAgICAgLy8gaWYgY2xpY2tpbmcgd2l0aG91dCBwcmV2aW91c2x5IGRyYWdnaW5nIGEgcG9pbnQocyksIGFuZCBub3QgaG9sZGluZ1xuICAgICAgLy8gc2hpZnQsIGRlc2VsZWN0IGFsbCBwb2ludHMgZXhjZXB0IHRoZSBvbmUgY2xpY2tlZC4gSWYgaG9sZGluZyBzaGlmdCxcbiAgICAgIC8vIHRvZ2dsZSB0aGUgcG9pbnQuXG4gICAgICBzZWxlY3RlZFBvaW50c0luZGljZXM6XG4gICAgICAgIGlzRHJhZ2dpbmcgfHwgZXZlbnQuc2hpZnRLZXlcbiAgICAgICAgICA/ICFpc0RyYWdnaW5nICYmXG4gICAgICAgICAgICBldmVudC5zaGlmdEtleSAmJlxuICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5wcmV2U2VsZWN0ZWRQb2ludHNJbmRpY2VzPy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgcG9pbnRlckRvd25TdGF0ZS5sYXN0Q2xpY2tlZFBvaW50LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgPyBzZWxlY3RlZFBvaW50c0luZGljZXMgJiZcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQb2ludHNJbmRpY2VzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAocG9pbnRJbmRleCkgPT5cbiAgICAgICAgICAgICAgICAgIHBvaW50SW5kZXggIT09IHBvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgOiBzZWxlY3RlZFBvaW50c0luZGljZXNcbiAgICAgICAgICA6IHNlbGVjdGVkUG9pbnRzSW5kaWNlcz8uaW5jbHVkZXMocG9pbnRlckRvd25TdGF0ZS5sYXN0Q2xpY2tlZFBvaW50KVxuICAgICAgICAgID8gW3BvaW50ZXJEb3duU3RhdGUubGFzdENsaWNrZWRQb2ludF1cbiAgICAgICAgICA6IHNlbGVjdGVkUG9pbnRzSW5kaWNlcyxcbiAgICAgIGlzRHJhZ2dpbmc6IGZhbHNlLFxuICAgICAgcG9pbnRlck9mZnNldDogeyB4OiAwLCB5OiAwIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBnZXRFZGl0b3JNaWRQb2ludHMgPSAoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICApOiB0eXBlb2YgZWRpdG9yTWlkUG9pbnRzQ2FjaGVbXCJwb2ludHNcIl0gPT4ge1xuICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICAvLyBTaW5jZSBpdHMgbm90IG5lZWRlZCBvdXRzaWRlIGVkaXRvciB1bmxlc3MgMiBwb2ludGVyIGxpbmVzIG9yIGJvdW5kIHRleHRcbiAgICBpZiAoXG4gICAgICAhYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQgJiZcbiAgICAgIGVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDIgJiZcbiAgICAgICFib3VuZFRleHRcbiAgICApIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgZWRpdG9yTWlkUG9pbnRzQ2FjaGUudmVyc2lvbiA9PT0gZWxlbWVudC52ZXJzaW9uICYmXG4gICAgICBlZGl0b3JNaWRQb2ludHNDYWNoZS56b29tID09PSBhcHBTdGF0ZS56b29tLnZhbHVlXG4gICAgKSB7XG4gICAgICByZXR1cm4gZWRpdG9yTWlkUG9pbnRzQ2FjaGUucG9pbnRzO1xuICAgIH1cbiAgICBMaW5lYXJFbGVtZW50RWRpdG9yLnVwZGF0ZUVkaXRvck1pZFBvaW50c0NhY2hlKGVsZW1lbnQsIGFwcFN0YXRlKTtcbiAgICByZXR1cm4gZWRpdG9yTWlkUG9pbnRzQ2FjaGUucG9pbnRzITtcbiAgfTtcblxuICBzdGF0aWMgdXBkYXRlRWRpdG9yTWlkUG9pbnRzQ2FjaGUgPSAoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICApID0+IHtcbiAgICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGVsZW1lbnQpO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBtaWRwb2ludHM6IChQb2ludCB8IG51bGwpW10gPSBbXTtcbiAgICB3aGlsZSAoaW5kZXggPCBwb2ludHMubGVuZ3RoIC0gMSkge1xuICAgICAgaWYgKFxuICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmlzU2VnbWVudFRvb1Nob3J0KFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgZWxlbWVudC5wb2ludHNbaW5kZXhdLFxuICAgICAgICAgIGVsZW1lbnQucG9pbnRzW2luZGV4ICsgMV0sXG4gICAgICAgICAgYXBwU3RhdGUuem9vbSxcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIG1pZHBvaW50cy5wdXNoKG51bGwpO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNlZ21lbnRNaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBwb2ludHNbaW5kZXhdLFxuICAgICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgICAgaW5kZXggKyAxLFxuICAgICAgKTtcbiAgICAgIG1pZHBvaW50cy5wdXNoKHNlZ21lbnRNaWRQb2ludCk7XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgICBlZGl0b3JNaWRQb2ludHNDYWNoZS5wb2ludHMgPSBtaWRwb2ludHM7XG4gICAgZWRpdG9yTWlkUG9pbnRzQ2FjaGUudmVyc2lvbiA9IGVsZW1lbnQudmVyc2lvbjtcbiAgICBlZGl0b3JNaWRQb2ludHNDYWNoZS56b29tID0gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0U2VnbWVudE1pZHBvaW50SGl0Q29vcmRzID0gKFxuICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IExpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgc2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICApID0+IHtcbiAgICBjb25zdCB7IGVsZW1lbnRJZCB9ID0gbGluZWFyRWxlbWVudEVkaXRvcjtcbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2xpY2tlZFBvaW50SW5kZXggPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50SW5kZXhVbmRlckN1cnNvcihcbiAgICAgIGVsZW1lbnQsXG4gICAgICBhcHBTdGF0ZS56b29tLFxuICAgICAgc2NlbmVQb2ludGVyLngsXG4gICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICApO1xuICAgIGlmIChjbGlja2VkUG9pbnRJbmRleCA+PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhlbGVtZW50KTtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCA+PSAzICYmICFhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgdGhyZXNob2xkID1cbiAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuUE9JTlRfSEFORExFX1NJWkUgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuXG4gICAgY29uc3QgZXhpc3RpbmdTZWdtZW50TWlkcG9pbnRIaXRDb29yZHMgPVxuICAgICAgbGluZWFyRWxlbWVudEVkaXRvci5zZWdtZW50TWlkUG9pbnRIb3ZlcmVkQ29vcmRzO1xuICAgIGlmIChleGlzdGluZ1NlZ21lbnRNaWRwb2ludEhpdENvb3Jkcykge1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgICBleGlzdGluZ1NlZ21lbnRNaWRwb2ludEhpdENvb3Jkc1swXSxcbiAgICAgICAgZXhpc3RpbmdTZWdtZW50TWlkcG9pbnRIaXRDb29yZHNbMV0sXG4gICAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICk7XG4gICAgICBpZiAoZGlzdGFuY2UgPD0gdGhyZXNob2xkKSB7XG4gICAgICAgIHJldHVybiBleGlzdGluZ1NlZ21lbnRNaWRwb2ludEhpdENvb3JkcztcbiAgICAgIH1cbiAgICB9XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBjb25zdCBtaWRQb2ludHM6IHR5cGVvZiBlZGl0b3JNaWRQb2ludHNDYWNoZVtcInBvaW50c1wiXSA9XG4gICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhlbGVtZW50LCBhcHBTdGF0ZSk7XG4gICAgd2hpbGUgKGluZGV4IDwgbWlkUG9pbnRzLmxlbmd0aCkge1xuICAgICAgaWYgKG1pZFBvaW50c1tpbmRleF0gIT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgICAgIG1pZFBvaW50c1tpbmRleF0hWzBdLFxuICAgICAgICAgIG1pZFBvaW50c1tpbmRleF0hWzFdLFxuICAgICAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgICAgIHNjZW5lUG9pbnRlci55LFxuICAgICAgICApO1xuICAgICAgICBpZiAoZGlzdGFuY2UgPD0gdGhyZXNob2xkKSB7XG4gICAgICAgICAgcmV0dXJuIG1pZFBvaW50c1tpbmRleF07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW5kZXgrKztcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG5cbiAgc3RhdGljIGlzU2VnbWVudFRvb1Nob3J0KFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIHN0YXJ0UG9pbnQ6IFBvaW50LFxuICAgIGVuZFBvaW50OiBQb2ludCxcbiAgICB6b29tOiBBcHBTdGF0ZVtcInpvb21cIl0sXG4gICkge1xuICAgIGxldCBkaXN0YW5jZSA9IGRpc3RhbmNlMmQoXG4gICAgICBzdGFydFBvaW50WzBdLFxuICAgICAgc3RhcnRQb2ludFsxXSxcbiAgICAgIGVuZFBvaW50WzBdLFxuICAgICAgZW5kUG9pbnRbMV0sXG4gICAgKTtcbiAgICBpZiAoZWxlbWVudC5wb2ludHMubGVuZ3RoID4gMiAmJiBlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgZGlzdGFuY2UgPSBnZXRCZXppZXJDdXJ2ZUxlbmd0aChlbGVtZW50LCBlbmRQb2ludCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpc3RhbmNlICogem9vbS52YWx1ZSA8IExpbmVhckVsZW1lbnRFZGl0b3IuUE9JTlRfSEFORExFX1NJWkUgKiA0O1xuICB9XG5cbiAgc3RhdGljIGdldFNlZ21lbnRNaWRQb2ludChcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICBzdGFydFBvaW50OiBQb2ludCxcbiAgICBlbmRQb2ludDogUG9pbnQsXG4gICAgZW5kUG9pbnRJbmRleDogbnVtYmVyLFxuICApIHtcbiAgICBsZXQgc2VnbWVudE1pZFBvaW50ID0gY2VudGVyUG9pbnQoc3RhcnRQb2ludCwgZW5kUG9pbnQpO1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPiAyICYmIGVsZW1lbnQucm91bmRuZXNzKSB7XG4gICAgICBjb25zdCBjb250cm9sUG9pbnRzID0gZ2V0Q29udHJvbFBvaW50c0ZvckJlemllckN1cnZlKFxuICAgICAgICBlbGVtZW50LFxuICAgICAgICBlbGVtZW50LnBvaW50c1tlbmRQb2ludEluZGV4XSxcbiAgICAgICk7XG4gICAgICBpZiAoY29udHJvbFBvaW50cykge1xuICAgICAgICBjb25zdCB0ID0gbWFwSW50ZXJ2YWxUb0JlemllclQoXG4gICAgICAgICAgZWxlbWVudCxcbiAgICAgICAgICBlbGVtZW50LnBvaW50c1tlbmRQb2ludEluZGV4XSxcbiAgICAgICAgICAwLjUsXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3QgW3R4LCB0eV0gPSBnZXRCZXppZXJYWShcbiAgICAgICAgICBjb250cm9sUG9pbnRzWzBdLFxuICAgICAgICAgIGNvbnRyb2xQb2ludHNbMV0sXG4gICAgICAgICAgY29udHJvbFBvaW50c1syXSxcbiAgICAgICAgICBjb250cm9sUG9pbnRzWzNdLFxuICAgICAgICAgIHQsXG4gICAgICAgICk7XG4gICAgICAgIHNlZ21lbnRNaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgICAgICBlbGVtZW50LFxuICAgICAgICAgIFt0eCwgdHldLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzZWdtZW50TWlkUG9pbnQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0U2VnbWVudE1pZFBvaW50SW5kZXgoXG4gICAgbGluZWFyRWxlbWVudEVkaXRvcjogTGluZWFyRWxlbWVudEVkaXRvcixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgbWlkUG9pbnQ6IFBvaW50LFxuICApIHtcbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KFxuICAgICAgbGluZWFyRWxlbWVudEVkaXRvci5lbGVtZW50SWQsXG4gICAgKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9XG4gICAgY29uc3QgbWlkUG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoZWxlbWVudCwgYXBwU3RhdGUpO1xuICAgIGxldCBpbmRleCA9IDA7XG4gICAgd2hpbGUgKGluZGV4IDwgbWlkUG9pbnRzLmxlbmd0aCkge1xuICAgICAgaWYgKExpbmVhckVsZW1lbnRFZGl0b3IuYXJlUG9pbnRzRXF1YWwobWlkUG9pbnQsIG1pZFBvaW50c1tpbmRleF0pKSB7XG4gICAgICAgIHJldHVybiBpbmRleCArIDE7XG4gICAgICB9XG4gICAgICBpbmRleCsrO1xuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBzdGF0aWMgaGFuZGxlUG9pbnRlckRvd24oXG4gICAgZXZlbnQ6IFJlYWN0LlBvaW50ZXJFdmVudDxIVE1MQ2FudmFzRWxlbWVudD4sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGhpc3Rvcnk6IEhpc3RvcnksXG4gICAgc2NlbmVQb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0sXG4gICAgbGluZWFyRWxlbWVudEVkaXRvcjogTGluZWFyRWxlbWVudEVkaXRvcixcbiAgKToge1xuICAgIGRpZEFkZFBvaW50OiBib29sZWFuO1xuICAgIGhpdEVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+IHwgbnVsbDtcbiAgICBsaW5lYXJFbGVtZW50RWRpdG9yOiBMaW5lYXJFbGVtZW50RWRpdG9yIHwgbnVsbDtcbiAgfSB7XG4gICAgY29uc3QgcmV0OiBSZXR1cm5UeXBlPHR5cGVvZiBMaW5lYXJFbGVtZW50RWRpdG9yW1wiaGFuZGxlUG9pbnRlckRvd25cIl0+ID0ge1xuICAgICAgZGlkQWRkUG9pbnQ6IGZhbHNlLFxuICAgICAgaGl0RWxlbWVudDogbnVsbCxcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3I6IG51bGwsXG4gICAgfTtcblxuICAgIGlmICghbGluZWFyRWxlbWVudEVkaXRvcikge1xuICAgICAgcmV0dXJuIHJldDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGVsZW1lbnRJZCB9ID0gbGluZWFyRWxlbWVudEVkaXRvcjtcbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGNvbnN0IHNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZHBvaW50SGl0Q29vcmRzKFxuICAgICAgbGluZWFyRWxlbWVudEVkaXRvcixcbiAgICAgIHNjZW5lUG9pbnRlcixcbiAgICAgIGFwcFN0YXRlLFxuICAgICk7XG4gICAgbGV0IHNlZ21lbnRNaWRwb2ludEluZGV4ID0gbnVsbDtcbiAgICBpZiAoc2VnbWVudE1pZHBvaW50KSB7XG4gICAgICBzZWdtZW50TWlkcG9pbnRJbmRleCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50SW5kZXgoXG4gICAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgICAgIGFwcFN0YXRlLFxuICAgICAgICBzZWdtZW50TWlkcG9pbnQsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZXZlbnQuYWx0S2V5ICYmIGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICBpZiAobGluZWFyRWxlbWVudEVkaXRvci5sYXN0VW5jb21taXR0ZWRQb2ludCA9PSBudWxsKSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgICAgIHBvaW50czogW1xuICAgICAgICAgICAgLi4uZWxlbWVudC5wb2ludHMsXG4gICAgICAgICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmNyZWF0ZVBvaW50QXQoXG4gICAgICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgICAgICAgICBzY2VuZVBvaW50ZXIueSxcbiAgICAgICAgICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXQuZGlkQWRkUG9pbnQgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaGlzdG9yeS5yZXN1bWVSZWNvcmRpbmcoKTtcbiAgICAgIHJldC5saW5lYXJFbGVtZW50RWRpdG9yID0ge1xuICAgICAgICAuLi5saW5lYXJFbGVtZW50RWRpdG9yLFxuICAgICAgICBwb2ludGVyRG93blN0YXRlOiB7XG4gICAgICAgICAgcHJldlNlbGVjdGVkUG9pbnRzSW5kaWNlczogbGluZWFyRWxlbWVudEVkaXRvci5zZWxlY3RlZFBvaW50c0luZGljZXMsXG4gICAgICAgICAgbGFzdENsaWNrZWRQb2ludDogLTEsXG4gICAgICAgICAgb3JpZ2luOiB7IHg6IHNjZW5lUG9pbnRlci54LCB5OiBzY2VuZVBvaW50ZXIueSB9LFxuICAgICAgICAgIHNlZ21lbnRNaWRwb2ludDoge1xuICAgICAgICAgICAgdmFsdWU6IHNlZ21lbnRNaWRwb2ludCxcbiAgICAgICAgICAgIGluZGV4OiBzZWdtZW50TWlkcG9pbnRJbmRleCxcbiAgICAgICAgICAgIGFkZGVkOiBmYWxzZSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3RlZFBvaW50c0luZGljZXM6IFtlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXSxcbiAgICAgICAgbGFzdFVuY29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gICAgICAgIGVuZEJpbmRpbmdFbGVtZW50OiBnZXRIb3ZlcmVkRWxlbWVudEZvckJpbmRpbmcoXG4gICAgICAgICAgc2NlbmVQb2ludGVyLFxuICAgICAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpISxcbiAgICAgICAgKSxcbiAgICAgIH07XG5cbiAgICAgIHJldC5kaWRBZGRQb2ludCA9IHRydWU7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGNvbnN0IGNsaWNrZWRQb2ludEluZGV4ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEluZGV4VW5kZXJDdXJzb3IoXG4gICAgICBlbGVtZW50LFxuICAgICAgYXBwU3RhdGUuem9vbSxcbiAgICAgIHNjZW5lUG9pbnRlci54LFxuICAgICAgc2NlbmVQb2ludGVyLnksXG4gICAgKTtcbiAgICAvLyBpZiB3ZSBjbGlja2VkIG9uIGEgcG9pbnQsIHNldCB0aGUgZWxlbWVudCBhcyBoaXRFbGVtZW50IG90aGVyd2lzZVxuICAgIC8vIGl0IHdvdWxkIGdldCBkZXNlbGVjdGVkIGlmIHRoZSBwb2ludCBpcyBvdXRzaWRlIHRoZSBoaXRib3ggYXJlYVxuICAgIGlmIChjbGlja2VkUG9pbnRJbmRleCA+PSAwIHx8IHNlZ21lbnRNaWRwb2ludCkge1xuICAgICAgcmV0LmhpdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBZb3UgbWlnaHQgYmUgd2FuZGVyaW5nIHdoeSB3ZSBhcmUgc3RvcmluZyB0aGUgYmluZGluZyBlbGVtZW50cyBvblxuICAgICAgLy8gTGluZWFyRWxlbWVudEVkaXRvciBhbmQgcGFzc2luZyB0aGVtIGluLCBpbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIHRoZW1cbiAgICAgIC8vIGZyb20gdGhlIGVuZCBwb2ludHMgb2YgdGhlIGBsaW5lYXJFbGVtZW50YCAtIHRoaXMgaXMgdG8gYWxsb3cgZGlzYWJsaW5nXG4gICAgICAvLyBiaW5kaW5nICh3aGljaCBuZWVkcyB0byBoYXBwZW4gYXQgdGhlIHBvaW50IHRoZSB1c2VyIGZpbmlzaGVzIG1vdmluZ1xuICAgICAgLy8gdGhlIHBvaW50KS5cbiAgICAgIGNvbnN0IHsgc3RhcnRCaW5kaW5nRWxlbWVudCwgZW5kQmluZGluZ0VsZW1lbnQgfSA9IGxpbmVhckVsZW1lbnRFZGl0b3I7XG4gICAgICBpZiAoaXNCaW5kaW5nRW5hYmxlZChhcHBTdGF0ZSkgJiYgaXNCaW5kaW5nRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgICBiaW5kT3JVbmJpbmRMaW5lYXJFbGVtZW50KFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgc3RhcnRCaW5kaW5nRWxlbWVudCxcbiAgICAgICAgICBlbmRCaW5kaW5nRWxlbWVudCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gICAgY29uc3QgdGFyZ2V0UG9pbnQgPVxuICAgICAgY2xpY2tlZFBvaW50SW5kZXggPiAtMSAmJlxuICAgICAgcm90YXRlKFxuICAgICAgICBlbGVtZW50LnggKyBlbGVtZW50LnBvaW50c1tjbGlja2VkUG9pbnRJbmRleF1bMF0sXG4gICAgICAgIGVsZW1lbnQueSArIGVsZW1lbnQucG9pbnRzW2NsaWNrZWRQb2ludEluZGV4XVsxXSxcbiAgICAgICAgY3gsXG4gICAgICAgIGN5LFxuICAgICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgKTtcblxuICAgIGNvbnN0IG5leHRTZWxlY3RlZFBvaW50c0luZGljZXMgPVxuICAgICAgY2xpY2tlZFBvaW50SW5kZXggPiAtMSB8fCBldmVudC5zaGlmdEtleVxuICAgICAgICA/IGV2ZW50LnNoaWZ0S2V5IHx8XG4gICAgICAgICAgbGluZWFyRWxlbWVudEVkaXRvci5zZWxlY3RlZFBvaW50c0luZGljZXM/LmluY2x1ZGVzKGNsaWNrZWRQb2ludEluZGV4KVxuICAgICAgICAgID8gbm9ybWFsaXplU2VsZWN0ZWRQb2ludHMoW1xuICAgICAgICAgICAgICAuLi4obGluZWFyRWxlbWVudEVkaXRvci5zZWxlY3RlZFBvaW50c0luZGljZXMgfHwgW10pLFxuICAgICAgICAgICAgICBjbGlja2VkUG9pbnRJbmRleCxcbiAgICAgICAgICAgIF0pXG4gICAgICAgICAgOiBbY2xpY2tlZFBvaW50SW5kZXhdXG4gICAgICAgIDogbnVsbDtcbiAgICByZXQubGluZWFyRWxlbWVudEVkaXRvciA9IHtcbiAgICAgIC4uLmxpbmVhckVsZW1lbnRFZGl0b3IsXG4gICAgICBwb2ludGVyRG93blN0YXRlOiB7XG4gICAgICAgIHByZXZTZWxlY3RlZFBvaW50c0luZGljZXM6IGxpbmVhckVsZW1lbnRFZGl0b3Iuc2VsZWN0ZWRQb2ludHNJbmRpY2VzLFxuICAgICAgICBsYXN0Q2xpY2tlZFBvaW50OiBjbGlja2VkUG9pbnRJbmRleCxcbiAgICAgICAgb3JpZ2luOiB7IHg6IHNjZW5lUG9pbnRlci54LCB5OiBzY2VuZVBvaW50ZXIueSB9LFxuICAgICAgICBzZWdtZW50TWlkcG9pbnQ6IHtcbiAgICAgICAgICB2YWx1ZTogc2VnbWVudE1pZHBvaW50LFxuICAgICAgICAgIGluZGV4OiBzZWdtZW50TWlkcG9pbnRJbmRleCxcbiAgICAgICAgICBhZGRlZDogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgc2VsZWN0ZWRQb2ludHNJbmRpY2VzOiBuZXh0U2VsZWN0ZWRQb2ludHNJbmRpY2VzLFxuICAgICAgcG9pbnRlck9mZnNldDogdGFyZ2V0UG9pbnRcbiAgICAgICAgPyB7XG4gICAgICAgICAgICB4OiBzY2VuZVBvaW50ZXIueCAtIHRhcmdldFBvaW50WzBdLFxuICAgICAgICAgICAgeTogc2NlbmVQb2ludGVyLnkgLSB0YXJnZXRQb2ludFsxXSxcbiAgICAgICAgICB9XG4gICAgICAgIDogeyB4OiAwLCB5OiAwIH0sXG4gICAgfTtcblxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICBzdGF0aWMgYXJlUG9pbnRzRXF1YWwocG9pbnQxOiBQb2ludCB8IG51bGwsIHBvaW50MjogUG9pbnQgfCBudWxsKSB7XG4gICAgaWYgKCFwb2ludDEgJiYgIXBvaW50Mikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICghcG9pbnQxIHx8ICFwb2ludDIpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGFyZVBvaW50c0VxdWFsKHBvaW50MSwgcG9pbnQyKTtcbiAgfVxuXG4gIHN0YXRpYyBoYW5kbGVQb2ludGVyTW92ZShcbiAgICBldmVudDogUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PixcbiAgICBzY2VuZVBvaW50ZXJYOiBudW1iZXIsXG4gICAgc2NlbmVQb2ludGVyWTogbnVtYmVyLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKTogTGluZWFyRWxlbWVudEVkaXRvciB8IG51bGwge1xuICAgIGlmICghYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCB7IGVsZW1lbnRJZCwgbGFzdFVuY29tbWl0dGVkUG9pbnQgfSA9IGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50O1xuICAgIGNvbnN0IGVsZW1lbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVsZW1lbnQoZWxlbWVudElkKTtcbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudDtcbiAgICB9XG5cbiAgICBjb25zdCB7IHBvaW50cyB9ID0gZWxlbWVudDtcbiAgICBjb25zdCBsYXN0UG9pbnQgPSBwb2ludHNbcG9pbnRzLmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKCFldmVudC5hbHRLZXkpIHtcbiAgICAgIGlmIChsYXN0UG9pbnQgPT09IGxhc3RVbmNvbW1pdHRlZFBvaW50KSB7XG4gICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZGVsZXRlUG9pbnRzKGVsZW1lbnQsIFtwb2ludHMubGVuZ3RoIC0gMV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQsXG4gICAgICAgIGxhc3RVbmNvbW1pdHRlZFBvaW50OiBudWxsLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgbmV3UG9pbnQ6IFBvaW50O1xuXG4gICAgaWYgKHNob3VsZFJvdGF0ZVdpdGhEaXNjcmV0ZUFuZ2xlKGV2ZW50KSAmJiBwb2ludHMubGVuZ3RoID49IDIpIHtcbiAgICAgIGNvbnN0IGxhc3RDb21taXR0ZWRQb2ludCA9IHBvaW50c1twb2ludHMubGVuZ3RoIC0gMl07XG5cbiAgICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IExpbmVhckVsZW1lbnRFZGl0b3IuX2dldFNoaWZ0TG9ja2VkRGVsdGEoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGxhc3RDb21taXR0ZWRQb2ludCxcbiAgICAgICAgW3NjZW5lUG9pbnRlclgsIHNjZW5lUG9pbnRlclldLFxuICAgICAgICBhcHBTdGF0ZS5ncmlkU2l6ZSxcbiAgICAgICk7XG5cbiAgICAgIG5ld1BvaW50ID0gW1xuICAgICAgICB3aWR0aCArIGxhc3RDb21taXR0ZWRQb2ludFswXSxcbiAgICAgICAgaGVpZ2h0ICsgbGFzdENvbW1pdHRlZFBvaW50WzFdLFxuICAgICAgXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3UG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmNyZWF0ZVBvaW50QXQoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIHNjZW5lUG9pbnRlclggLSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5wb2ludGVyT2Zmc2V0LngsXG4gICAgICAgIHNjZW5lUG9pbnRlclkgLSBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudC5wb2ludGVyT2Zmc2V0LnksXG4gICAgICAgIGFwcFN0YXRlLmdyaWRTaXplLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAobGFzdFBvaW50ID09PSBsYXN0VW5jb21taXR0ZWRQb2ludCkge1xuICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5tb3ZlUG9pbnRzKGVsZW1lbnQsIFtcbiAgICAgICAge1xuICAgICAgICAgIGluZGV4OiBlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxLFxuICAgICAgICAgIHBvaW50OiBuZXdQb2ludCxcbiAgICAgICAgfSxcbiAgICAgIF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLmFkZFBvaW50cyhlbGVtZW50LCBhcHBTdGF0ZSwgW3sgcG9pbnQ6IG5ld1BvaW50IH1dKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgbGFzdFVuY29tbWl0dGVkUG9pbnQ6IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdLFxuICAgIH07XG4gIH1cblxuICAvKiogc2NlbmUgY29vcmRzICovXG4gIHN0YXRpYyBnZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIHBvaW50OiBQb2ludCxcbiAgKSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuXG4gICAgbGV0IHsgeCwgeSB9ID0gZWxlbWVudDtcbiAgICBbeCwgeV0gPSByb3RhdGUoeCArIHBvaW50WzBdLCB5ICsgcG9pbnRbMV0sIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgcmV0dXJuIFt4LCB5XSBhcyBjb25zdDtcbiAgfVxuXG4gIC8qKiBzY2VuZSBjb29yZHMgKi9cbiAgc3RhdGljIGdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICApOiBQb2ludFtdIHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gICAgcmV0dXJuIGVsZW1lbnQucG9pbnRzLm1hcCgocG9pbnQpID0+IHtcbiAgICAgIGxldCB7IHgsIHkgfSA9IGVsZW1lbnQ7XG4gICAgICBbeCwgeV0gPSByb3RhdGUoeCArIHBvaW50WzBdLCB5ICsgcG9pbnRbMV0sIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICByZXR1cm4gW3gsIHldIGFzIGNvbnN0O1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIGdldFBvaW50QXRJbmRleEdsb2JhbENvb3JkaW5hdGVzKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICAgIGluZGV4TWF5YmVGcm9tRW5kOiBudW1iZXIsIC8vIC0xIGZvciBsYXN0IGVsZW1lbnRcbiAgKTogUG9pbnQge1xuICAgIGNvbnN0IGluZGV4ID1cbiAgICAgIGluZGV4TWF5YmVGcm9tRW5kIDwgMFxuICAgICAgICA/IGVsZW1lbnQucG9pbnRzLmxlbmd0aCArIGluZGV4TWF5YmVGcm9tRW5kXG4gICAgICAgIDogaW5kZXhNYXliZUZyb21FbmQ7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuXG4gICAgY29uc3QgcG9pbnQgPSBlbGVtZW50LnBvaW50c1tpbmRleF07XG4gICAgY29uc3QgeyB4LCB5IH0gPSBlbGVtZW50O1xuICAgIHJldHVybiBwb2ludFxuICAgICAgPyByb3RhdGUoeCArIHBvaW50WzBdLCB5ICsgcG9pbnRbMV0sIGN4LCBjeSwgZWxlbWVudC5hbmdsZSlcbiAgICAgIDogcm90YXRlKHgsIHksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gIH1cblxuICBzdGF0aWMgcG9pbnRGcm9tQWJzb2x1dGVDb29yZHMoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgYWJzb2x1dGVDb29yZHM6IFBvaW50LFxuICApOiBQb2ludCB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvbnN0IFt4LCB5XSA9IHJvdGF0ZShcbiAgICAgIGFic29sdXRlQ29vcmRzWzBdLFxuICAgICAgYWJzb2x1dGVDb29yZHNbMV0sXG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgLWVsZW1lbnQuYW5nbGUsXG4gICAgKTtcbiAgICByZXR1cm4gW3ggLSBlbGVtZW50LngsIHkgLSBlbGVtZW50LnldO1xuICB9XG5cbiAgc3RhdGljIGdldFBvaW50SW5kZXhVbmRlckN1cnNvcihcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICB6b29tOiBBcHBTdGF0ZVtcInpvb21cIl0sXG4gICAgeDogbnVtYmVyLFxuICAgIHk6IG51bWJlcixcbiAgKSB7XG4gICAgY29uc3QgcG9pbnRIYW5kbGVzID1cbiAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCk7XG4gICAgbGV0IGlkeCA9IHBvaW50SGFuZGxlcy5sZW5ndGg7XG4gICAgLy8gbG9vcCBmcm9tIHJpZ2h0IHRvIGxlZnQgYmVjYXVzZSBwb2ludHMgb24gdGhlIHJpZ2h0IGFyZSByZW5kZXJlZCBvdmVyXG4gICAgLy8gcG9pbnRzIG9uIHRoZSBsZWZ0LCB0aHVzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugd2hlbiBjbGlja2luZywgaWYgdGhleVxuICAgIC8vIG92ZXJsYXBcbiAgICB3aGlsZSAoLS1pZHggPiAtMSkge1xuICAgICAgY29uc3QgcG9pbnQgPSBwb2ludEhhbmRsZXNbaWR4XTtcbiAgICAgIGlmIChcbiAgICAgICAgZGlzdGFuY2UyZCh4LCB5LCBwb2ludFswXSwgcG9pbnRbMV0pICogem9vbS52YWx1ZSA8XG4gICAgICAgIC8vICsxcHggdG8gYWNjb3VudCBmb3Igb3V0bGluZSBzdHJva2VcbiAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5QT0lOVF9IQU5ETEVfU0laRSArIDFcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gaWR4O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gLTE7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlUG9pbnRBdChcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICBzY2VuZVBvaW50ZXJYOiBudW1iZXIsXG4gICAgc2NlbmVQb2ludGVyWTogbnVtYmVyLFxuICAgIGdyaWRTaXplOiBudW1iZXIgfCBudWxsLFxuICApOiBQb2ludCB7XG4gICAgY29uc3QgcG9pbnRlck9uR3JpZCA9IGdldEdyaWRQb2ludChzY2VuZVBvaW50ZXJYLCBzY2VuZVBvaW50ZXJZLCBncmlkU2l6ZSk7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvbnN0IFtyb3RhdGVkWCwgcm90YXRlZFldID0gcm90YXRlKFxuICAgICAgcG9pbnRlck9uR3JpZFswXSxcbiAgICAgIHBvaW50ZXJPbkdyaWRbMV0sXG4gICAgICBjeCxcbiAgICAgIGN5LFxuICAgICAgLWVsZW1lbnQuYW5nbGUsXG4gICAgKTtcblxuICAgIHJldHVybiBbcm90YXRlZFggLSBlbGVtZW50LngsIHJvdGF0ZWRZIC0gZWxlbWVudC55XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3JtYWxpemVzIGxpbmUgcG9pbnRzIHNvIHRoYXQgdGhlIHN0YXJ0IHBvaW50IGlzIGF0IFswLDBdLiBUaGlzIGlzXG4gICAqIGV4cGVjdGVkIGluIHZhcmlvdXMgcGFydHMgb2YgdGhlIGNvZGViYXNlLiBBbHNvIHJldHVybnMgbmV3IHgveSB0byBhY2NvdW50XG4gICAqIGZvciB0aGUgcG90ZW50aWFsIG5vcm1hbGl6YXRpb24uXG4gICAqL1xuICBzdGF0aWMgZ2V0Tm9ybWFsaXplZFBvaW50cyhlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCkge1xuICAgIGNvbnN0IHsgcG9pbnRzIH0gPSBlbGVtZW50O1xuXG4gICAgY29uc3Qgb2Zmc2V0WCA9IHBvaW50c1swXVswXTtcbiAgICBjb25zdCBvZmZzZXRZID0gcG9pbnRzWzBdWzFdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHBvaW50czogcG9pbnRzLm1hcCgocG9pbnQsIF9pZHgpID0+IHtcbiAgICAgICAgcmV0dXJuIFtwb2ludFswXSAtIG9mZnNldFgsIHBvaW50WzFdIC0gb2Zmc2V0WV0gYXMgY29uc3Q7XG4gICAgICB9KSxcbiAgICAgIHg6IGVsZW1lbnQueCArIG9mZnNldFgsXG4gICAgICB5OiBlbGVtZW50LnkgKyBvZmZzZXRZLFxuICAgIH07XG4gIH1cblxuICAvLyBlbGVtZW50LW11dGF0aW5nIG1ldGhvZHNcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgc3RhdGljIG5vcm1hbGl6ZVBvaW50cyhlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50Pikge1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgTGluZWFyRWxlbWVudEVkaXRvci5nZXROb3JtYWxpemVkUG9pbnRzKGVsZW1lbnQpKTtcbiAgfVxuXG4gIHN0YXRpYyBkdXBsaWNhdGVTZWxlY3RlZFBvaW50cyhhcHBTdGF0ZTogQXBwU3RhdGUpIHtcbiAgICBpZiAoIWFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzZWxlY3RlZFBvaW50c0luZGljZXMsIGVsZW1lbnRJZCB9ID0gYXBwU3RhdGUuZWRpdGluZ0xpbmVhckVsZW1lbnQ7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFbGVtZW50KGVsZW1lbnRJZCk7XG5cbiAgICBpZiAoIWVsZW1lbnQgfHwgc2VsZWN0ZWRQb2ludHNJbmRpY2VzID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgeyBwb2ludHMgfSA9IGVsZW1lbnQ7XG5cbiAgICBjb25zdCBuZXh0U2VsZWN0ZWRJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHBvaW50QWRkZWRUb0VuZCA9IGZhbHNlO1xuICAgIGxldCBpbmRleEN1cnNvciA9IC0xO1xuICAgIGNvbnN0IG5leHRQb2ludHMgPSBwb2ludHMucmVkdWNlKChhY2M6IFBvaW50W10sIHBvaW50LCBpbmRleCkgPT4ge1xuICAgICAgKytpbmRleEN1cnNvcjtcbiAgICAgIGFjYy5wdXNoKHBvaW50KTtcblxuICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IHNlbGVjdGVkUG9pbnRzSW5kaWNlcy5pbmNsdWRlcyhpbmRleCk7XG4gICAgICBpZiAoaXNTZWxlY3RlZCkge1xuICAgICAgICBjb25zdCBuZXh0UG9pbnQgPSBwb2ludHNbaW5kZXggKyAxXTtcblxuICAgICAgICBpZiAoIW5leHRQb2ludCkge1xuICAgICAgICAgIHBvaW50QWRkZWRUb0VuZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgYWNjLnB1c2goXG4gICAgICAgICAgbmV4dFBvaW50XG4gICAgICAgICAgICA/IFsocG9pbnRbMF0gKyBuZXh0UG9pbnRbMF0pIC8gMiwgKHBvaW50WzFdICsgbmV4dFBvaW50WzFdKSAvIDJdXG4gICAgICAgICAgICA6IFtwb2ludFswXSwgcG9pbnRbMV1dLFxuICAgICAgICApO1xuXG4gICAgICAgIG5leHRTZWxlY3RlZEluZGljZXMucHVzaChpbmRleEN1cnNvciArIDEpO1xuICAgICAgICArK2luZGV4Q3Vyc29yO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcblxuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwgeyBwb2ludHM6IG5leHRQb2ludHMgfSk7XG5cbiAgICAvLyB0ZW1wIGhhY2sgdG8gZW5zdXJlIHRoZSBsaW5lIGRvZXNuJ3QgbW92ZSB3aGVuIGFkZGluZyBwb2ludCB0byB0aGUgZW5kLFxuICAgIC8vIHBvdGVudGlhbGx5IGV4cGFuZGluZyB0aGUgYm91bmRpbmcgYm94XG4gICAgaWYgKHBvaW50QWRkZWRUb0VuZCkge1xuICAgICAgY29uc3QgbGFzdFBvaW50ID0gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV07XG4gICAgICBMaW5lYXJFbGVtZW50RWRpdG9yLm1vdmVQb2ludHMoZWxlbWVudCwgW1xuICAgICAgICB7XG4gICAgICAgICAgaW5kZXg6IGVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDEsXG4gICAgICAgICAgcG9pbnQ6IFtsYXN0UG9pbnRbMF0gKyAzMCwgbGFzdFBvaW50WzFdICsgMzBdLFxuICAgICAgICB9LFxuICAgICAgXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlOiB7XG4gICAgICAgIC4uLmFwcFN0YXRlLFxuICAgICAgICBlZGl0aW5nTGluZWFyRWxlbWVudDoge1xuICAgICAgICAgIC4uLmFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlczogbmV4dFNlbGVjdGVkSW5kaWNlcyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBkZWxldGVQb2ludHMoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgcG9pbnRJbmRpY2VzOiByZWFkb25seSBudW1iZXJbXSxcbiAgKSB7XG4gICAgbGV0IG9mZnNldFggPSAwO1xuICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgIGNvbnN0IGlzRGVsZXRpbmdPcmlnaW5Qb2ludCA9IHBvaW50SW5kaWNlcy5pbmNsdWRlcygwKTtcblxuICAgIC8vIGlmIGRlbGV0aW5nIGZpcnN0IHBvaW50LCBtYWtlIHRoZSBuZXh0IHRvIGJlIFswLDBdIGFuZCByZWNhbGN1bGF0ZVxuICAgIC8vIHBvc2l0aW9ucyBvZiB0aGUgcmVzdCB3aXRoIHJlc3BlY3QgdG8gaXRcbiAgICBpZiAoaXNEZWxldGluZ09yaWdpblBvaW50KSB7XG4gICAgICBjb25zdCBmaXJzdE5vbkRlbGV0ZWRQb2ludCA9IGVsZW1lbnQucG9pbnRzLmZpbmQoKHBvaW50LCBpZHgpID0+IHtcbiAgICAgICAgcmV0dXJuICFwb2ludEluZGljZXMuaW5jbHVkZXMoaWR4KTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpcnN0Tm9uRGVsZXRlZFBvaW50KSB7XG4gICAgICAgIG9mZnNldFggPSBmaXJzdE5vbkRlbGV0ZWRQb2ludFswXTtcbiAgICAgICAgb2Zmc2V0WSA9IGZpcnN0Tm9uRGVsZXRlZFBvaW50WzFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG5leHRQb2ludHMgPSBlbGVtZW50LnBvaW50cy5yZWR1Y2UoKGFjYzogUG9pbnRbXSwgcG9pbnQsIGlkeCkgPT4ge1xuICAgICAgaWYgKCFwb2ludEluZGljZXMuaW5jbHVkZXMoaWR4KSkge1xuICAgICAgICBhY2MucHVzaChcbiAgICAgICAgICAhYWNjLmxlbmd0aCA/IFswLCAwXSA6IFtwb2ludFswXSAtIG9mZnNldFgsIHBvaW50WzFdIC0gb2Zmc2V0WV0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdKTtcblxuICAgIExpbmVhckVsZW1lbnRFZGl0b3IuX3VwZGF0ZVBvaW50cyhlbGVtZW50LCBuZXh0UG9pbnRzLCBvZmZzZXRYLCBvZmZzZXRZKTtcbiAgfVxuXG4gIHN0YXRpYyBhZGRQb2ludHMoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIHRhcmdldFBvaW50czogeyBwb2ludDogUG9pbnQgfVtdLFxuICApIHtcbiAgICBjb25zdCBvZmZzZXRYID0gMDtcbiAgICBjb25zdCBvZmZzZXRZID0gMDtcblxuICAgIGNvbnN0IG5leHRQb2ludHMgPSBbLi4uZWxlbWVudC5wb2ludHMsIC4uLnRhcmdldFBvaW50cy5tYXAoKHgpID0+IHgucG9pbnQpXTtcbiAgICBMaW5lYXJFbGVtZW50RWRpdG9yLl91cGRhdGVQb2ludHMoZWxlbWVudCwgbmV4dFBvaW50cywgb2Zmc2V0WCwgb2Zmc2V0WSk7XG4gIH1cblxuICBzdGF0aWMgbW92ZVBvaW50cyhcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICB0YXJnZXRQb2ludHM6IHsgaW5kZXg6IG51bWJlcjsgcG9pbnQ6IFBvaW50OyBpc0RyYWdnaW5nPzogYm9vbGVhbiB9W10sXG4gICAgb3RoZXJVcGRhdGVzPzogeyBzdGFydEJpbmRpbmc/OiBQb2ludEJpbmRpbmc7IGVuZEJpbmRpbmc/OiBQb2ludEJpbmRpbmcgfSxcbiAgKSB7XG4gICAgY29uc3QgeyBwb2ludHMgfSA9IGVsZW1lbnQ7XG5cbiAgICAvLyBpbiBjYXNlIHdlJ3JlIG1vdmluZyBzdGFydCBwb2ludCwgaW5zdGVhZCBvZiBtb2RpZnlpbmcgaXRzIHBvc2l0aW9uXG4gICAgLy8gd2hpY2ggd291bGQgYnJlYWsgdGhlIGludmFyaWFudCBvZiBpdCBiZWluZyBhdCBbMCwwXSwgd2UgbW92ZVxuICAgIC8vIGFsbCB0aGUgb3RoZXIgcG9pbnRzIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24gYnkgZGVsdGEgdG9cbiAgICAvLyBvZmZzZXQgaXQuIFdlIGRvIHRoZSBzYW1lIHdpdGggYWN0dWFsIGVsZW1lbnQueC95IHBvc2l0aW9uLCBzb1xuICAgIC8vIHRoaXMgaGFja3MgYXJlIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdGhlIHVzZXIuXG4gICAgbGV0IG9mZnNldFggPSAwO1xuICAgIGxldCBvZmZzZXRZID0gMDtcblxuICAgIGNvbnN0IHNlbGVjdGVkT3JpZ2luUG9pbnQgPSB0YXJnZXRQb2ludHMuZmluZCgoeyBpbmRleCB9KSA9PiBpbmRleCA9PT0gMCk7XG5cbiAgICBpZiAoc2VsZWN0ZWRPcmlnaW5Qb2ludCkge1xuICAgICAgb2Zmc2V0WCA9XG4gICAgICAgIHNlbGVjdGVkT3JpZ2luUG9pbnQucG9pbnRbMF0gKyBwb2ludHNbc2VsZWN0ZWRPcmlnaW5Qb2ludC5pbmRleF1bMF07XG4gICAgICBvZmZzZXRZID1cbiAgICAgICAgc2VsZWN0ZWRPcmlnaW5Qb2ludC5wb2ludFsxXSArIHBvaW50c1tzZWxlY3RlZE9yaWdpblBvaW50LmluZGV4XVsxXTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXh0UG9pbnRzID0gcG9pbnRzLm1hcCgocG9pbnQsIGlkeCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZWN0ZWRQb2ludERhdGEgPSB0YXJnZXRQb2ludHMuZmluZCgocCkgPT4gcC5pbmRleCA9PT0gaWR4KTtcbiAgICAgIGlmIChzZWxlY3RlZFBvaW50RGF0YSkge1xuICAgICAgICBpZiAoc2VsZWN0ZWRPcmlnaW5Qb2ludCkge1xuICAgICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlbHRhWCA9XG4gICAgICAgICAgc2VsZWN0ZWRQb2ludERhdGEucG9pbnRbMF0gLSBwb2ludHNbc2VsZWN0ZWRQb2ludERhdGEuaW5kZXhdWzBdO1xuICAgICAgICBjb25zdCBkZWx0YVkgPVxuICAgICAgICAgIHNlbGVjdGVkUG9pbnREYXRhLnBvaW50WzFdIC0gcG9pbnRzW3NlbGVjdGVkUG9pbnREYXRhLmluZGV4XVsxXTtcblxuICAgICAgICByZXR1cm4gW3BvaW50WzBdICsgZGVsdGFYLCBwb2ludFsxXSArIGRlbHRhWV0gYXMgY29uc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2Zmc2V0WCB8fCBvZmZzZXRZXG4gICAgICAgID8gKFtwb2ludFswXSAtIG9mZnNldFgsIHBvaW50WzFdIC0gb2Zmc2V0WV0gYXMgY29uc3QpXG4gICAgICAgIDogcG9pbnQ7XG4gICAgfSk7XG5cbiAgICBMaW5lYXJFbGVtZW50RWRpdG9yLl91cGRhdGVQb2ludHMoXG4gICAgICBlbGVtZW50LFxuICAgICAgbmV4dFBvaW50cyxcbiAgICAgIG9mZnNldFgsXG4gICAgICBvZmZzZXRZLFxuICAgICAgb3RoZXJVcGRhdGVzLFxuICAgICk7XG4gIH1cblxuICBzdGF0aWMgc2hvdWxkQWRkTWlkcG9pbnQoXG4gICAgbGluZWFyRWxlbWVudEVkaXRvcjogTGluZWFyRWxlbWVudEVkaXRvcixcbiAgICBwb2ludGVyQ29vcmRzOiBQb2ludGVyQ29vcmRzLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IuZWxlbWVudElkLFxuICAgICk7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCB7IHNlZ21lbnRNaWRwb2ludCB9ID0gbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlO1xuXG4gICAgaWYgKFxuICAgICAgc2VnbWVudE1pZHBvaW50LmFkZGVkIHx8XG4gICAgICBzZWdtZW50TWlkcG9pbnQudmFsdWUgPT09IG51bGwgfHxcbiAgICAgIHNlZ21lbnRNaWRwb2ludC5pbmRleCA9PT0gbnVsbCB8fFxuICAgICAgbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlLm9yaWdpbiA9PT0gbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbiA9IGxpbmVhckVsZW1lbnRFZGl0b3IucG9pbnRlckRvd25TdGF0ZS5vcmlnaW4hO1xuICAgIGNvbnN0IGRpc3QgPSBkaXN0YW5jZTJkKFxuICAgICAgb3JpZ2luLngsXG4gICAgICBvcmlnaW4ueSxcbiAgICAgIHBvaW50ZXJDb29yZHMueCxcbiAgICAgIHBvaW50ZXJDb29yZHMueSxcbiAgICApO1xuICAgIGlmIChcbiAgICAgICFhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCAmJlxuICAgICAgZGlzdCA8IERSQUdHSU5HX1RIUkVTSE9MRCAvIGFwcFN0YXRlLnpvb20udmFsdWVcbiAgICApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0aWMgYWRkTWlkcG9pbnQoXG4gICAgbGluZWFyRWxlbWVudEVkaXRvcjogTGluZWFyRWxlbWVudEVkaXRvcixcbiAgICBwb2ludGVyQ29vcmRzOiBQb2ludGVyQ29vcmRzLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudChcbiAgICAgIGxpbmVhckVsZW1lbnRFZGl0b3IuZWxlbWVudElkLFxuICAgICk7XG4gICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHsgc2VnbWVudE1pZHBvaW50IH0gPSBsaW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJEb3duU3RhdGU7XG4gICAgY29uc3QgcmV0OiB7XG4gICAgICBwb2ludGVyRG93blN0YXRlOiBMaW5lYXJFbGVtZW50RWRpdG9yW1wicG9pbnRlckRvd25TdGF0ZVwiXTtcbiAgICAgIHNlbGVjdGVkUG9pbnRzSW5kaWNlczogTGluZWFyRWxlbWVudEVkaXRvcltcInNlbGVjdGVkUG9pbnRzSW5kaWNlc1wiXTtcbiAgICB9ID0ge1xuICAgICAgcG9pbnRlckRvd25TdGF0ZTogbGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlLFxuICAgICAgc2VsZWN0ZWRQb2ludHNJbmRpY2VzOiBsaW5lYXJFbGVtZW50RWRpdG9yLnNlbGVjdGVkUG9pbnRzSW5kaWNlcyxcbiAgICB9O1xuXG4gICAgY29uc3QgbWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmNyZWF0ZVBvaW50QXQoXG4gICAgICBlbGVtZW50LFxuICAgICAgcG9pbnRlckNvb3Jkcy54LFxuICAgICAgcG9pbnRlckNvb3Jkcy55LFxuICAgICAgYXBwU3RhdGUuZ3JpZFNpemUsXG4gICAgKTtcbiAgICBjb25zdCBwb2ludHMgPSBbXG4gICAgICAuLi5lbGVtZW50LnBvaW50cy5zbGljZSgwLCBzZWdtZW50TWlkcG9pbnQuaW5kZXghKSxcbiAgICAgIG1pZHBvaW50LFxuICAgICAgLi4uZWxlbWVudC5wb2ludHMuc2xpY2Uoc2VnbWVudE1pZHBvaW50LmluZGV4ISksXG4gICAgXTtcblxuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgcG9pbnRzLFxuICAgIH0pO1xuXG4gICAgcmV0LnBvaW50ZXJEb3duU3RhdGUgPSB7XG4gICAgICAuLi5saW5lYXJFbGVtZW50RWRpdG9yLnBvaW50ZXJEb3duU3RhdGUsXG4gICAgICBzZWdtZW50TWlkcG9pbnQ6IHtcbiAgICAgICAgLi4ubGluZWFyRWxlbWVudEVkaXRvci5wb2ludGVyRG93blN0YXRlLnNlZ21lbnRNaWRwb2ludCxcbiAgICAgICAgYWRkZWQ6IHRydWUsXG4gICAgICB9LFxuICAgICAgbGFzdENsaWNrZWRQb2ludDogc2VnbWVudE1pZHBvaW50LmluZGV4ISxcbiAgICB9O1xuICAgIHJldC5zZWxlY3RlZFBvaW50c0luZGljZXMgPSBbc2VnbWVudE1pZHBvaW50LmluZGV4IV07XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF91cGRhdGVQb2ludHMoXG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gICAgbmV4dFBvaW50czogcmVhZG9ubHkgUG9pbnRbXSxcbiAgICBvZmZzZXRYOiBudW1iZXIsXG4gICAgb2Zmc2V0WTogbnVtYmVyLFxuICAgIG90aGVyVXBkYXRlcz86IHsgc3RhcnRCaW5kaW5nPzogUG9pbnRCaW5kaW5nOyBlbmRCaW5kaW5nPzogUG9pbnRCaW5kaW5nIH0sXG4gICkge1xuICAgIGNvbnN0IG5leHRDb29yZHMgPSBnZXRFbGVtZW50UG9pbnRzQ29vcmRzKGVsZW1lbnQsIG5leHRQb2ludHMpO1xuICAgIGNvbnN0IHByZXZDb29yZHMgPSBnZXRFbGVtZW50UG9pbnRzQ29vcmRzKGVsZW1lbnQsIGVsZW1lbnQucG9pbnRzKTtcbiAgICBjb25zdCBuZXh0Q2VudGVyWCA9IChuZXh0Q29vcmRzWzBdICsgbmV4dENvb3Jkc1syXSkgLyAyO1xuICAgIGNvbnN0IG5leHRDZW50ZXJZID0gKG5leHRDb29yZHNbMV0gKyBuZXh0Q29vcmRzWzNdKSAvIDI7XG4gICAgY29uc3QgcHJldkNlbnRlclggPSAocHJldkNvb3Jkc1swXSArIHByZXZDb29yZHNbMl0pIC8gMjtcbiAgICBjb25zdCBwcmV2Q2VudGVyWSA9IChwcmV2Q29vcmRzWzFdICsgcHJldkNvb3Jkc1szXSkgLyAyO1xuICAgIGNvbnN0IGRYID0gcHJldkNlbnRlclggLSBuZXh0Q2VudGVyWDtcbiAgICBjb25zdCBkWSA9IHByZXZDZW50ZXJZIC0gbmV4dENlbnRlclk7XG4gICAgY29uc3Qgcm90YXRlZCA9IHJvdGF0ZShvZmZzZXRYLCBvZmZzZXRZLCBkWCwgZFksIGVsZW1lbnQuYW5nbGUpO1xuICAgIG11dGF0ZUVsZW1lbnQoZWxlbWVudCwge1xuICAgICAgLi4ub3RoZXJVcGRhdGVzLFxuICAgICAgcG9pbnRzOiBuZXh0UG9pbnRzLFxuICAgICAgeDogZWxlbWVudC54ICsgcm90YXRlZFswXSxcbiAgICAgIHk6IGVsZW1lbnQueSArIHJvdGF0ZWRbMV0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfZ2V0U2hpZnRMb2NrZWREZWx0YShcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgICByZWZlcmVuY2VQb2ludDogUG9pbnQsXG4gICAgc2NlbmVQb2ludGVyOiBQb2ludCxcbiAgICBncmlkU2l6ZTogbnVtYmVyIHwgbnVsbCxcbiAgKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlUG9pbnRDb29yZHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50R2xvYmFsQ29vcmRpbmF0ZXMoXG4gICAgICBlbGVtZW50LFxuICAgICAgcmVmZXJlbmNlUG9pbnQsXG4gICAgKTtcblxuICAgIGNvbnN0IFtncmlkWCwgZ3JpZFldID0gZ2V0R3JpZFBvaW50KFxuICAgICAgc2NlbmVQb2ludGVyWzBdLFxuICAgICAgc2NlbmVQb2ludGVyWzFdLFxuICAgICAgZ3JpZFNpemUsXG4gICAgKTtcblxuICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gZ2V0TG9ja2VkTGluZWFyQ3Vyc29yQWxpZ25TaXplKFxuICAgICAgcmVmZXJlbmNlUG9pbnRDb29yZHNbMF0sXG4gICAgICByZWZlcmVuY2VQb2ludENvb3Jkc1sxXSxcbiAgICAgIGdyaWRYLFxuICAgICAgZ3JpZFksXG4gICAgKTtcblxuICAgIHJldHVybiByb3RhdGVQb2ludChbd2lkdGgsIGhlaWdodF0sIFswLCAwXSwgLWVsZW1lbnQuYW5nbGUpO1xuICB9XG5cbiAgc3RhdGljIGdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbiA9IChcbiAgICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICApOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gPT4ge1xuICAgIGNvbnN0IHBvaW50cyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRzR2xvYmFsQ29vcmRpbmF0ZXMoZWxlbWVudCk7XG4gICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQsIHsgaXNEZWxldGVkOiB0cnVlIH0pO1xuICAgIH1cbiAgICBsZXQgeCA9IDA7XG4gICAgbGV0IHkgPSAwO1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoZWxlbWVudC5wb2ludHMubGVuZ3RoIC8gMik7XG4gICAgICBjb25zdCBtaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgICAgZWxlbWVudCxcbiAgICAgICAgZWxlbWVudC5wb2ludHNbaW5kZXhdLFxuICAgICAgKTtcbiAgICAgIHggPSBtaWRQb2ludFswXSAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyO1xuICAgICAgeSA9IG1pZFBvaW50WzFdIC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQgLyAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBpbmRleCA9IGVsZW1lbnQucG9pbnRzLmxlbmd0aCAvIDIgLSAxO1xuXG4gICAgICBsZXQgbWlkU2VnbWVudE1pZHBvaW50ID0gZWRpdG9yTWlkUG9pbnRzQ2FjaGUucG9pbnRzW2luZGV4XTtcbiAgICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgbWlkU2VnbWVudE1pZHBvaW50ID0gY2VudGVyUG9pbnQocG9pbnRzWzBdLCBwb2ludHNbMV0pO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhbWlkU2VnbWVudE1pZHBvaW50IHx8XG4gICAgICAgIGVkaXRvck1pZFBvaW50c0NhY2hlLnZlcnNpb24gIT09IGVsZW1lbnQudmVyc2lvblxuICAgICAgKSB7XG4gICAgICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgICAgIGVsZW1lbnQsXG4gICAgICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgICAgICBpbmRleCArIDEsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB4ID0gbWlkU2VnbWVudE1pZHBvaW50WzBdIC0gYm91bmRUZXh0RWxlbWVudC53aWR0aCAvIDI7XG4gICAgICB5ID0gbWlkU2VnbWVudE1pZHBvaW50WzFdIC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQgLyAyO1xuICAgIH1cbiAgICByZXR1cm4geyB4LCB5IH07XG4gIH07XG5cbiAgc3RhdGljIGdldE1pbk1heFhZV2l0aEJvdW5kVGV4dCA9IChcbiAgICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICBlbGVtZW50Qm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICApOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICAgIGxldCBbeDEsIHkxLCB4MiwgeTJdID0gZWxlbWVudEJvdW5kcztcbiAgICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gICAgY29uc3QgY3kgPSAoeTEgKyB5MikgLyAyO1xuICAgIGNvbnN0IHsgeDogYm91bmRUZXh0WDEsIHk6IGJvdW5kVGV4dFkxIH0gPVxuICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgICApO1xuICAgIGNvbnN0IGJvdW5kVGV4dFgyID0gYm91bmRUZXh0WDEgKyBib3VuZFRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGJvdW5kVGV4dFkyID0gYm91bmRUZXh0WTEgKyBib3VuZFRleHRFbGVtZW50LmhlaWdodDtcblxuICAgIGNvbnN0IHRvcExlZnRSb3RhdGVkUG9pbnQgPSByb3RhdGVQb2ludChbeDEsIHkxXSwgW2N4LCBjeV0sIGVsZW1lbnQuYW5nbGUpO1xuICAgIGNvbnN0IHRvcFJpZ2h0Um90YXRlZFBvaW50ID0gcm90YXRlUG9pbnQoW3gyLCB5MV0sIFtjeCwgY3ldLCBlbGVtZW50LmFuZ2xlKTtcblxuICAgIGNvbnN0IGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BMZWZ0ID0gcm90YXRlUG9pbnQoXG4gICAgICBbYm91bmRUZXh0WDEsIGJvdW5kVGV4dFkxXSxcblxuICAgICAgW2N4LCBjeV0sXG5cbiAgICAgIC1lbGVtZW50LmFuZ2xlLFxuICAgICk7XG4gICAgY29uc3QgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcFJpZ2h0ID0gcm90YXRlUG9pbnQoXG4gICAgICBbYm91bmRUZXh0WDIsIGJvdW5kVGV4dFkxXSxcblxuICAgICAgW2N4LCBjeV0sXG5cbiAgICAgIC1lbGVtZW50LmFuZ2xlLFxuICAgICk7XG4gICAgY29uc3QgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbUxlZnQgPSByb3RhdGVQb2ludChcbiAgICAgIFtib3VuZFRleHRYMSwgYm91bmRUZXh0WTJdLFxuXG4gICAgICBbY3gsIGN5XSxcblxuICAgICAgLWVsZW1lbnQuYW5nbGUsXG4gICAgKTtcbiAgICBjb25zdCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tUmlnaHQgPSByb3RhdGVQb2ludChcbiAgICAgIFtib3VuZFRleHRYMiwgYm91bmRUZXh0WTJdLFxuXG4gICAgICBbY3gsIGN5XSxcblxuICAgICAgLWVsZW1lbnQuYW5nbGUsXG4gICAgKTtcblxuICAgIGlmIChcbiAgICAgIHRvcExlZnRSb3RhdGVkUG9pbnRbMF0gPCB0b3BSaWdodFJvdGF0ZWRQb2ludFswXSAmJlxuICAgICAgdG9wTGVmdFJvdGF0ZWRQb2ludFsxXSA+PSB0b3BSaWdodFJvdGF0ZWRQb2ludFsxXVxuICAgICkge1xuICAgICAgeDEgPSBNYXRoLm1pbih4MSwgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbUxlZnRbMF0pO1xuICAgICAgeDIgPSBNYXRoLm1heChcbiAgICAgICAgeDIsXG4gICAgICAgIE1hdGgubWF4KFxuICAgICAgICAgIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodFswXSxcbiAgICAgICAgICBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tUmlnaHRbMF0sXG4gICAgICAgICksXG4gICAgICApO1xuICAgICAgeTEgPSBNYXRoLm1pbih5MSwgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcExlZnRbMV0pO1xuXG4gICAgICB5MiA9IE1hdGgubWF4KHkyLCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tUmlnaHRbMV0pO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0b3BMZWZ0Um90YXRlZFBvaW50WzBdID49IHRvcFJpZ2h0Um90YXRlZFBvaW50WzBdICYmXG4gICAgICB0b3BMZWZ0Um90YXRlZFBvaW50WzFdID4gdG9wUmlnaHRSb3RhdGVkUG9pbnRbMV1cbiAgICApIHtcbiAgICAgIHgxID0gTWF0aC5taW4oeDEsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRCb3R0b21SaWdodFswXSk7XG4gICAgICB4MiA9IE1hdGgubWF4KFxuICAgICAgICB4MixcbiAgICAgICAgTWF0aC5tYXgoXG4gICAgICAgICAgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcExlZnRbMF0sXG4gICAgICAgICAgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcFJpZ2h0WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRCb3R0b21MZWZ0WzFdKTtcblxuICAgICAgeTIgPSBNYXRoLm1heCh5MiwgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcFJpZ2h0WzFdKTtcbiAgICB9IGVsc2UgaWYgKHRvcExlZnRSb3RhdGVkUG9pbnRbMF0gPj0gdG9wUmlnaHRSb3RhdGVkUG9pbnRbMF0pIHtcbiAgICAgIHgxID0gTWF0aC5taW4oeDEsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodFswXSk7XG4gICAgICB4MiA9IE1hdGgubWF4KHgyLCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tTGVmdFswXSk7XG4gICAgICB5MSA9IE1hdGgubWluKHkxLCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tUmlnaHRbMV0pO1xuXG4gICAgICB5MiA9IE1hdGgubWF4KHkyLCBjb3VudGVyUm90YXRlQm91bmRUZXh0VG9wTGVmdFsxXSk7XG4gICAgfSBlbHNlIGlmICh0b3BMZWZ0Um90YXRlZFBvaW50WzFdIDw9IHRvcFJpZ2h0Um90YXRlZFBvaW50WzFdKSB7XG4gICAgICB4MSA9IE1hdGgubWluKFxuICAgICAgICB4MSxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgY291bnRlclJvdGF0ZUJvdW5kVGV4dFRvcFJpZ2h0WzBdLFxuICAgICAgICAgIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BMZWZ0WzBdLFxuICAgICAgICApLFxuICAgICAgKTtcblxuICAgICAgeDIgPSBNYXRoLm1heCh4MiwgY291bnRlclJvdGF0ZUJvdW5kVGV4dEJvdHRvbVJpZ2h0WzBdKTtcbiAgICAgIHkxID0gTWF0aC5taW4oeTEsIGNvdW50ZXJSb3RhdGVCb3VuZFRleHRUb3BSaWdodFsxXSk7XG4gICAgICB5MiA9IE1hdGgubWF4KHkyLCBjb3VudGVyUm90YXRlQm91bmRUZXh0Qm90dG9tTGVmdFsxXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiwgY3gsIGN5XTtcbiAgfTtcblxuICBzdGF0aWMgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICAgIGVsZW1lbnQ6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICAgIGluY2x1ZGVCb3VuZFRleHQ6IGJvb2xlYW4gPSBmYWxzZSxcbiAgKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgICBsZXQgY29vcmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gICAgbGV0IHgxO1xuICAgIGxldCB5MTtcbiAgICBsZXQgeDI7XG4gICAgbGV0IHkyO1xuICAgIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8ICFnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgIC8vIFhYWCB0aGlzIGlzIGp1c3QgYSBwb29yIGVzdGltYXRlIGFuZCBub3QgdmVyeSB1c2VmdWxcbiAgICAgIGNvbnN0IHsgbWluWCwgbWluWSwgbWF4WCwgbWF4WSB9ID0gZWxlbWVudC5wb2ludHMucmVkdWNlKFxuICAgICAgICAobGltaXRzLCBbeCwgeV0pID0+IHtcbiAgICAgICAgICBsaW1pdHMubWluWSA9IE1hdGgubWluKGxpbWl0cy5taW5ZLCB5KTtcbiAgICAgICAgICBsaW1pdHMubWluWCA9IE1hdGgubWluKGxpbWl0cy5taW5YLCB4KTtcblxuICAgICAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIHgpO1xuICAgICAgICAgIGxpbWl0cy5tYXhZID0gTWF0aC5tYXgobGltaXRzLm1heFksIHkpO1xuXG4gICAgICAgICAgcmV0dXJuIGxpbWl0cztcbiAgICAgICAgfSxcbiAgICAgICAgeyBtaW5YOiBJbmZpbml0eSwgbWluWTogSW5maW5pdHksIG1heFg6IC1JbmZpbml0eSwgbWF4WTogLUluZmluaXR5IH0sXG4gICAgICApO1xuICAgICAgeDEgPSBtaW5YICsgZWxlbWVudC54O1xuICAgICAgeTEgPSBtaW5ZICsgZWxlbWVudC55O1xuICAgICAgeDIgPSBtYXhYICsgZWxlbWVudC54O1xuICAgICAgeTIgPSBtYXhZICsgZWxlbWVudC55O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSE7XG5cbiAgICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICAgICAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlWzBdKTtcblxuICAgICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gICAgICB4MSA9IG1pblggKyBlbGVtZW50Lng7XG4gICAgICB5MSA9IG1pblkgKyBlbGVtZW50Lnk7XG4gICAgICB4MiA9IG1heFggKyBlbGVtZW50Lng7XG4gICAgICB5MiA9IG1heFkgKyBlbGVtZW50Lnk7XG4gICAgfVxuICAgIGNvbnN0IGN4ID0gKHgxICsgeDIpIC8gMjtcbiAgICBjb25zdCBjeSA9ICh5MSArIHkyKSAvIDI7XG4gICAgY29vcmRzID0gW3gxLCB5MSwgeDIsIHkyLCBjeCwgY3ldO1xuXG4gICAgaWYgKCFpbmNsdWRlQm91bmRUZXh0KSB7XG4gICAgICByZXR1cm4gY29vcmRzO1xuICAgIH1cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgY29vcmRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRNaW5NYXhYWVdpdGhCb3VuZFRleHQoXG4gICAgICAgIGVsZW1lbnQsXG4gICAgICAgIFt4MSwgeTEsIHgyLCB5Ml0sXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBjb29yZHM7XG4gIH07XG59XG5cbmNvbnN0IG5vcm1hbGl6ZVNlbGVjdGVkUG9pbnRzID0gKFxuICBwb2ludHM6IChudW1iZXIgfCBudWxsKVtdLFxuKTogbnVtYmVyW10gfCBudWxsID0+IHtcbiAgbGV0IG5leHRQb2ludHMgPSBbXG4gICAgLi4ubmV3IFNldChwb2ludHMuZmlsdGVyKChwKSA9PiBwICE9PSBudWxsICYmIHAgIT09IC0xKSksXG4gIF0gYXMgbnVtYmVyW107XG4gIG5leHRQb2ludHMgPSBuZXh0UG9pbnRzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgcmV0dXJuIG5leHRQb2ludHMubGVuZ3RoID8gbmV4dFBvaW50cyA6IG51bGw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/linearElementEditor.ts\n");
|
|
3453
3453
|
|
|
3454
3454
|
/***/ }),
|
|
3455
3455
|
|
|
@@ -3460,7 +3460,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3460
3460
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3461
3461
|
|
|
3462
3462
|
"use strict";
|
|
3463
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bumpVersion\": () => (/* binding */ bumpVersion),\n/* harmony export */ \"mutateElement\": () => (/* binding */ mutateElement),\n/* harmony export */ \"newElementWith\": () => (/* binding */ newElementWith)\n/* harmony export */ });\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n\n\n\n\n\n// This function tracks updates of text elements for the purposes for collaboration.\n// The version is used to compare updates when more than one user is working in\n// the same drawing. Note: this will trigger the component to update. Make sure you\n// are calling it either from a React event handler or within unstable_batchedUpdates().\nconst mutateElement = (element, updates, informMutation = true) => {\n var _a;\n let didChange = false;\n // casting to any because can't use `in` operator\n // (see https://github.com/microsoft/TypeScript/issues/21732)\n const { points, fileId } = updates;\n if (typeof points !== \"undefined\") {\n updates = Object.assign(Object.assign({}, (0,_points__WEBPACK_IMPORTED_MODULE_2__.getSizeFromPoints)(points)), updates);\n }\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (element[key] === value &&\n // if object, always update because its attrs could have changed\n // (except for specific keys we handle below)\n (typeof value !== \"object\" ||\n value === null ||\n key === \"groupIds\" ||\n key === \"scale\")) {\n continue;\n }\n if (key === \"scale\") {\n const prevScale = element[key];\n const nextScale = value;\n if (prevScale[0] === nextScale[0] && prevScale[1] === nextScale[1]) {\n continue;\n }\n }\n else if (key === \"points\") {\n const prevPoints = element[key];\n const nextPoints = value;\n if (prevPoints.length === nextPoints.length) {\n let didChangePoints = false;\n let index = prevPoints.length;\n while (--index) {\n const prevPoint = prevPoints[index];\n const nextPoint = nextPoints[index];\n if (prevPoint[0] !== nextPoint[0] ||\n prevPoint[1] !== nextPoint[1]) {\n didChangePoints = true;\n break;\n }\n }\n if (!didChangePoints) {\n continue;\n }\n }\n }\n element[key] = value;\n didChange = true;\n }\n }\n if (!didChange) {\n return element;\n }\n if (typeof updates.height !== \"undefined\" ||\n typeof updates.width !== \"undefined\" ||\n typeof fileId != \"undefined\" ||\n typeof points !== \"undefined\") {\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_0__.invalidateShapeForElement)(element);\n }\n element.version++;\n element.versionNonce = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)();\n element.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getUpdatedTimestamp)();\n if (informMutation) {\n (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.informMutation();\n }\n return element;\n};\nconst newElementWith = (element, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (element[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return element;\n }\n return Object.assign(Object.assign(Object.assign({}, element), updates), { updated: (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getUpdatedTimestamp)(), version: element.version + 1, versionNonce: (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)() });\n};\n/**\n * Mutates element, bumping `version`, `versionNonce`, and `updated`.\n *\n * NOTE: does not trigger re-render.\n */\nconst bumpVersion = (element, version) => {\n element.version = (version !== null && version !== void 0 ? version : element.version) + 1;\n element.versionNonce = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)();\n element.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getUpdatedTimestamp)();\n return element;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3pCLE9BQW1DLEVBQ25DLE9BQXNDLEVBQ3RDLEVBQUU7SUFDRixPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxPQUFPLENBQUMsWUFBWSxHQUFHLHNEQUFhLEVBQUUsQ0FBQztJQUN2QyxPQUFPLENBQUMsT0FBTyxHQUFHLDJEQUFtQixFQUFFLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudC50cz9jNmQ3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgZ2V0U2l6ZUZyb21Qb2ludHMgfSBmcm9tIFwiLi4vcG9pbnRzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFVwZGF0ZWRUaW1lc3RhbXAgfSBmcm9tIFwiLi4vdXRpbHNcIjtcblxudHlwZSBFbGVtZW50VXBkYXRlPFRFbGVtZW50IGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+ID0gT21pdDxcbiAgUGFydGlhbDxURWxlbWVudD4sXG4gIFwiaWRcIiB8IFwidmVyc2lvblwiIHwgXCJ2ZXJzaW9uTm9uY2VcIlxuPjtcblxuLy8gVGhpcyBmdW5jdGlvbiB0cmFja3MgdXBkYXRlcyBvZiB0ZXh0IGVsZW1lbnRzIGZvciB0aGUgcHVycG9zZXMgZm9yIGNvbGxhYm9yYXRpb24uXG4vLyBUaGUgdmVyc2lvbiBpcyB1c2VkIHRvIGNvbXBhcmUgdXBkYXRlcyB3aGVuIG1vcmUgdGhhbiBvbmUgdXNlciBpcyB3b3JraW5nIGluXG4vLyB0aGUgc2FtZSBkcmF3aW5nLiBOb3RlOiB0aGlzIHdpbGwgdHJpZ2dlciB0aGUgY29tcG9uZW50IHRvIHVwZGF0ZS4gTWFrZSBzdXJlIHlvdVxuLy8gYXJlIGNhbGxpbmcgaXQgZWl0aGVyIGZyb20gYSBSZWFjdCBldmVudCBoYW5kbGVyIG9yIHdpdGhpbiB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcygpLlxuZXhwb3J0IGNvbnN0IG11dGF0ZUVsZW1lbnQgPSA8VEVsZW1lbnQgZXh0ZW5kcyBNdXRhYmxlPEV4Y2FsaWRyYXdFbGVtZW50Pj4oXG4gIGVsZW1lbnQ6IFRFbGVtZW50LFxuICB1cGRhdGVzOiBFbGVtZW50VXBkYXRlPFRFbGVtZW50PixcbiAgaW5mb3JtTXV0YXRpb24gPSB0cnVlLFxuKTogVEVsZW1lbnQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG5cbiAgLy8gY2FzdGluZyB0byBhbnkgYmVjYXVzZSBjYW4ndCB1c2UgYGluYCBvcGVyYXRvclxuICAvLyAoc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMjE3MzIpXG4gIGNvbnN0IHsgcG9pbnRzLCBmaWxlSWQgfSA9IHVwZGF0ZXMgYXMgYW55O1xuXG4gIGlmICh0eXBlb2YgcG9pbnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdXBkYXRlcyA9IHsgLi4uZ2V0U2l6ZUZyb21Qb2ludHMocG9pbnRzKSwgLi4udXBkYXRlcyB9O1xuICB9XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgIGNvbnN0IHZhbHVlID0gKHVwZGF0ZXMgYXMgYW55KVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKGVsZW1lbnQgYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIC8vIChleGNlcHQgZm9yIHNwZWNpZmljIGtleXMgd2UgaGFuZGxlIGJlbG93KVxuICAgICAgICAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICAgdmFsdWUgPT09IG51bGwgfHxcbiAgICAgICAgICBrZXkgPT09IFwiZ3JvdXBJZHNcIiB8fFxuICAgICAgICAgIGtleSA9PT0gXCJzY2FsZVwiKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoa2V5ID09PSBcInNjYWxlXCIpIHtcbiAgICAgICAgY29uc3QgcHJldlNjYWxlID0gKGVsZW1lbnQgYXMgYW55KVtrZXldO1xuICAgICAgICBjb25zdCBuZXh0U2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHByZXZTY2FsZVswXSA9PT0gbmV4dFNjYWxlWzBdICYmIHByZXZTY2FsZVsxXSA9PT0gbmV4dFNjYWxlWzFdKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInBvaW50c1wiKSB7XG4gICAgICAgIGNvbnN0IHByZXZQb2ludHMgPSAoZWxlbWVudCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IG5leHRQb2ludHMgPSB2YWx1ZTtcbiAgICAgICAgaWYgKHByZXZQb2ludHMubGVuZ3RoID09PSBuZXh0UG9pbnRzLmxlbmd0aCkge1xuICAgICAgICAgIGxldCBkaWRDaGFuZ2VQb2ludHMgPSBmYWxzZTtcbiAgICAgICAgICBsZXQgaW5kZXggPSBwcmV2UG9pbnRzLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoLS1pbmRleCkge1xuICAgICAgICAgICAgY29uc3QgcHJldlBvaW50OiBQb2ludCA9IHByZXZQb2ludHNbaW5kZXhdO1xuICAgICAgICAgICAgY29uc3QgbmV4dFBvaW50OiBQb2ludCA9IG5leHRQb2ludHNbaW5kZXhdO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBwcmV2UG9pbnRbMF0gIT09IG5leHRQb2ludFswXSB8fFxuICAgICAgICAgICAgICBwcmV2UG9pbnRbMV0gIT09IG5leHRQb2ludFsxXVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIGRpZENoYW5nZVBvaW50cyA9IHRydWU7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWRpZENoYW5nZVBvaW50cykge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIChlbGVtZW50IGFzIGFueSlba2V5XSA9IHZhbHVlO1xuICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2YgdXBkYXRlcy5oZWlnaHQgIT09IFwidW5kZWZpbmVkXCIgfHxcbiAgICB0eXBlb2YgdXBkYXRlcy53aWR0aCAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIHR5cGVvZiBmaWxlSWQgIT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIHR5cGVvZiBwb2ludHMgIT09IFwidW5kZWZpbmVkXCJcbiAgKSB7XG4gICAgaW52YWxpZGF0ZVNoYXBlRm9yRWxlbWVudChlbGVtZW50KTtcbiAgfVxuXG4gIGVsZW1lbnQudmVyc2lvbisrO1xuICBlbGVtZW50LnZlcnNpb25Ob25jZSA9IHJhbmRvbUludGVnZXIoKTtcbiAgZWxlbWVudC51cGRhdGVkID0gZ2V0VXBkYXRlZFRpbWVzdGFtcCgpO1xuXG4gIGlmIChpbmZvcm1NdXRhdGlvbikge1xuICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5pbmZvcm1NdXRhdGlvbigpO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudFdpdGggPSA8VEVsZW1lbnQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4oXG4gIGVsZW1lbnQ6IFRFbGVtZW50LFxuICB1cGRhdGVzOiBFbGVtZW50VXBkYXRlPFRFbGVtZW50Pixcbik6IFRFbGVtZW50ID0+IHtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBpbiB1cGRhdGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSAodXBkYXRlcyBhcyBhbnkpW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKFxuICAgICAgICAoZWxlbWVudCBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uZWxlbWVudCxcbiAgICAuLi51cGRhdGVzLFxuICAgIHVwZGF0ZWQ6IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICB2ZXJzaW9uOiBlbGVtZW50LnZlcnNpb24gKyAxLFxuICAgIHZlcnNpb25Ob25jZTogcmFuZG9tSW50ZWdlcigpLFxuICB9O1xufTtcblxuLyoqXG4gKiBNdXRhdGVzIGVsZW1lbnQsIGJ1bXBpbmcgYHZlcnNpb25gLCBgdmVyc2lvbk5vbmNlYCwgYW5kIGB1cGRhdGVkYC5cbiAqXG4gKiBOT1RFOiBkb2VzIG5vdCB0cmlnZ2VyIHJlLXJlbmRlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGJ1bXBWZXJzaW9uID0gKFxuICBlbGVtZW50OiBNdXRhYmxlPEV4Y2FsaWRyYXdFbGVtZW50PixcbiAgdmVyc2lvbj86IEV4Y2FsaWRyYXdFbGVtZW50W1widmVyc2lvblwiXSxcbikgPT4ge1xuICBlbGVtZW50LnZlcnNpb24gPSAodmVyc2lvbiA/PyBlbGVtZW50LnZlcnNpb24pICsgMTtcbiAgZWxlbWVudC52ZXJzaW9uTm9uY2UgPSByYW5kb21JbnRlZ2VyKCk7XG4gIGVsZW1lbnQudXBkYXRlZCA9IGdldFVwZGF0ZWRUaW1lc3RhbXAoKTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/mutateElement.ts\n");
|
|
3463
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bumpVersion\": () => (/* binding */ bumpVersion),\n/* harmony export */ \"mutateElement\": () => (/* binding */ mutateElement),\n/* harmony export */ \"newElementWith\": () => (/* binding */ newElementWith)\n/* harmony export */ });\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n\n\n\n\n\n// This function tracks updates of text elements for the purposes for collaboration.\n// The version is used to compare updates when more than one user is working in\n// the same drawing. Note: this will trigger the component to update. Make sure you\n// are calling it either from a React event handler or within unstable_batchedUpdates().\nconst mutateElement = (element, updates, informMutation = true) => {\n var _a;\n let didChange = false;\n // casting to any because can't use `in` operator\n // (see https://github.com/microsoft/TypeScript/issues/21732)\n const { points, fileId } = updates;\n if (typeof points !== \"undefined\") {\n updates = Object.assign(Object.assign({}, (0,_points__WEBPACK_IMPORTED_MODULE_2__.getSizeFromPoints)(points)), updates);\n }\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (element[key] === value &&\n // if object, always update because its attrs could have changed\n // (except for specific keys we handle below)\n (typeof value !== \"object\" ||\n value === null ||\n key === \"groupIds\" ||\n key === \"scale\")) {\n continue;\n }\n if (key === \"scale\") {\n const prevScale = element[key];\n const nextScale = value;\n if (prevScale[0] === nextScale[0] && prevScale[1] === nextScale[1]) {\n continue;\n }\n }\n else if (key === \"points\") {\n const prevPoints = element[key];\n const nextPoints = value;\n if (prevPoints.length === nextPoints.length) {\n let didChangePoints = false;\n let index = prevPoints.length;\n while (--index) {\n const prevPoint = prevPoints[index];\n const nextPoint = nextPoints[index];\n if (prevPoint[0] !== nextPoint[0] ||\n prevPoint[1] !== nextPoint[1]) {\n didChangePoints = true;\n break;\n }\n }\n if (!didChangePoints) {\n continue;\n }\n }\n }\n element[key] = value;\n didChange = true;\n }\n }\n if (!didChange) {\n return element;\n }\n if (typeof updates.height !== \"undefined\" ||\n typeof updates.width !== \"undefined\" ||\n typeof fileId != \"undefined\" ||\n typeof points !== \"undefined\") {\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_0__.invalidateShapeForElement)(element);\n }\n element.version++;\n element.versionNonce = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)();\n element.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getUpdatedTimestamp)();\n if (informMutation) {\n (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_1__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.informMutation();\n }\n return element;\n};\nconst newElementWith = (element, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (element[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return element;\n }\n return Object.assign(Object.assign(Object.assign({}, element), updates), { updated: (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getUpdatedTimestamp)(), version: element.version + 1, versionNonce: (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)() });\n};\n/**\n * Mutates element, bumping `version`, `versionNonce`, and `updated`.\n *\n * NOTE: does not trigger re-render.\n */\nconst bumpVersion = (element, version) => {\n element.version = (version !== null && version !== void 0 ? version : element.version) + 1;\n element.versionNonce = (0,_random__WEBPACK_IMPORTED_MODULE_3__.randomInteger)();\n element.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_4__.getUpdatedTimestamp)();\n return element;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q3pCLE9BQW1DLEVBQ25DLE9BQXNDLEVBQ3RDLEVBQUU7SUFDRixPQUFPLENBQUMsT0FBTyxHQUFHLENBQUMsT0FBTyxhQUFQLE9BQU8sY0FBUCxPQUFPLEdBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNuRCxPQUFPLENBQUMsWUFBWSxHQUFHLHNEQUFhLEVBQUUsQ0FBQztJQUN2QyxPQUFPLENBQUMsT0FBTyxHQUFHLDJEQUFtQixFQUFFLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudC50cz9jNmQ3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGludmFsaWRhdGVTaGFwZUZvckVsZW1lbnQgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgZ2V0U2l6ZUZyb21Qb2ludHMgfSBmcm9tIFwiLi4vcG9pbnRzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldFVwZGF0ZWRUaW1lc3RhbXAgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tIFwiLi4vdXRpbGl0eS10eXBlc1wiO1xuXG50eXBlIEVsZW1lbnRVcGRhdGU8VEVsZW1lbnQgZXh0ZW5kcyBFeGNhbGlkcmF3RWxlbWVudD4gPSBPbWl0PFxuICBQYXJ0aWFsPFRFbGVtZW50PixcbiAgXCJpZFwiIHwgXCJ2ZXJzaW9uXCIgfCBcInZlcnNpb25Ob25jZVwiXG4+O1xuXG4vLyBUaGlzIGZ1bmN0aW9uIHRyYWNrcyB1cGRhdGVzIG9mIHRleHQgZWxlbWVudHMgZm9yIHRoZSBwdXJwb3NlcyBmb3IgY29sbGFib3JhdGlvbi5cbi8vIFRoZSB2ZXJzaW9uIGlzIHVzZWQgdG8gY29tcGFyZSB1cGRhdGVzIHdoZW4gbW9yZSB0aGFuIG9uZSB1c2VyIGlzIHdvcmtpbmcgaW5cbi8vIHRoZSBzYW1lIGRyYXdpbmcuIE5vdGU6IHRoaXMgd2lsbCB0cmlnZ2VyIHRoZSBjb21wb25lbnQgdG8gdXBkYXRlLiBNYWtlIHN1cmUgeW91XG4vLyBhcmUgY2FsbGluZyBpdCBlaXRoZXIgZnJvbSBhIFJlYWN0IGV2ZW50IGhhbmRsZXIgb3Igd2l0aGluIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKCkuXG5leHBvcnQgY29uc3QgbXV0YXRlRWxlbWVudCA9IDxURWxlbWVudCBleHRlbmRzIE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+PihcbiAgZWxlbWVudDogVEVsZW1lbnQsXG4gIHVwZGF0ZXM6IEVsZW1lbnRVcGRhdGU8VEVsZW1lbnQ+LFxuICBpbmZvcm1NdXRhdGlvbiA9IHRydWUsXG4pOiBURWxlbWVudCA9PiB7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcblxuICAvLyBjYXN0aW5nIHRvIGFueSBiZWNhdXNlIGNhbid0IHVzZSBgaW5gIG9wZXJhdG9yXG4gIC8vIChzZWUgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8yMTczMilcbiAgY29uc3QgeyBwb2ludHMsIGZpbGVJZCB9ID0gdXBkYXRlcyBhcyBhbnk7XG5cbiAgaWYgKHR5cGVvZiBwb2ludHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB1cGRhdGVzID0geyAuLi5nZXRTaXplRnJvbVBvaW50cyhwb2ludHMpLCAuLi51cGRhdGVzIH07XG4gIH1cblxuICBmb3IgKGNvbnN0IGtleSBpbiB1cGRhdGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSAodXBkYXRlcyBhcyBhbnkpW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKFxuICAgICAgICAoZWxlbWVudCBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgLy8gKGV4Y2VwdCBmb3Igc3BlY2lmaWMga2V5cyB3ZSBoYW5kbGUgYmVsb3cpXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHxcbiAgICAgICAgICB2YWx1ZSA9PT0gbnVsbCB8fFxuICAgICAgICAgIGtleSA9PT0gXCJncm91cElkc1wiIHx8XG4gICAgICAgICAga2V5ID09PSBcInNjYWxlXCIpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChrZXkgPT09IFwic2NhbGVcIikge1xuICAgICAgICBjb25zdCBwcmV2U2NhbGUgPSAoZWxlbWVudCBhcyBhbnkpW2tleV07XG4gICAgICAgIGNvbnN0IG5leHRTY2FsZSA9IHZhbHVlO1xuICAgICAgICBpZiAocHJldlNjYWxlWzBdID09PSBuZXh0U2NhbGVbMF0gJiYgcHJldlNjYWxlWzFdID09PSBuZXh0U2NhbGVbMV0pIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwicG9pbnRzXCIpIHtcbiAgICAgICAgY29uc3QgcHJldlBvaW50cyA9IChlbGVtZW50IGFzIGFueSlba2V5XTtcbiAgICAgICAgY29uc3QgbmV4dFBvaW50cyA9IHZhbHVlO1xuICAgICAgICBpZiAocHJldlBvaW50cy5sZW5ndGggPT09IG5leHRQb2ludHMubGVuZ3RoKSB7XG4gICAgICAgICAgbGV0IGRpZENoYW5nZVBvaW50cyA9IGZhbHNlO1xuICAgICAgICAgIGxldCBpbmRleCA9IHByZXZQb2ludHMubGVuZ3RoO1xuICAgICAgICAgIHdoaWxlICgtLWluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBwcmV2UG9pbnQ6IFBvaW50ID0gcHJldlBvaW50c1tpbmRleF07XG4gICAgICAgICAgICBjb25zdCBuZXh0UG9pbnQ6IFBvaW50ID0gbmV4dFBvaW50c1tpbmRleF07XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHByZXZQb2ludFswXSAhPT0gbmV4dFBvaW50WzBdIHx8XG4gICAgICAgICAgICAgIHByZXZQb2ludFsxXSAhPT0gbmV4dFBvaW50WzFdXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZGlkQ2hhbmdlUG9pbnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghZGlkQ2hhbmdlUG9pbnRzKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgKGVsZW1lbnQgYXMgYW55KVtrZXldID0gdmFsdWU7XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuICBpZiAoIWRpZENoYW5nZSkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiB1cGRhdGVzLmhlaWdodCAhPT0gXCJ1bmRlZmluZWRcIiB8fFxuICAgIHR5cGVvZiB1cGRhdGVzLndpZHRoICE9PSBcInVuZGVmaW5lZFwiIHx8XG4gICAgdHlwZW9mIGZpbGVJZCAhPSBcInVuZGVmaW5lZFwiIHx8XG4gICAgdHlwZW9mIHBvaW50cyAhPT0gXCJ1bmRlZmluZWRcIlxuICApIHtcbiAgICBpbnZhbGlkYXRlU2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpO1xuICB9XG5cbiAgZWxlbWVudC52ZXJzaW9uKys7XG4gIGVsZW1lbnQudmVyc2lvbk5vbmNlID0gcmFuZG9tSW50ZWdlcigpO1xuICBlbGVtZW50LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG5cbiAgaWYgKGluZm9ybU11dGF0aW9uKSB7XG4gICAgU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmluZm9ybU11dGF0aW9uKCk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBuZXdFbGVtZW50V2l0aCA9IDxURWxlbWVudCBleHRlbmRzIEV4Y2FsaWRyYXdFbGVtZW50PihcbiAgZWxlbWVudDogVEVsZW1lbnQsXG4gIHVwZGF0ZXM6IEVsZW1lbnRVcGRhdGU8VEVsZW1lbnQ+LFxuKTogVEVsZW1lbnQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChlbGVtZW50IGFzIGFueSlba2V5XSA9PT0gdmFsdWUgJiZcbiAgICAgICAgLy8gaWYgb2JqZWN0LCBhbHdheXMgdXBkYXRlIGJlY2F1c2UgaXRzIGF0dHJzIGNvdWxkIGhhdmUgY2hhbmdlZFxuICAgICAgICAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWRpZENoYW5nZSkge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5lbGVtZW50LFxuICAgIC4uLnVwZGF0ZXMsXG4gICAgdXBkYXRlZDogZ2V0VXBkYXRlZFRpbWVzdGFtcCgpLFxuICAgIHZlcnNpb246IGVsZW1lbnQudmVyc2lvbiArIDEsXG4gICAgdmVyc2lvbk5vbmNlOiByYW5kb21JbnRlZ2VyKCksXG4gIH07XG59O1xuXG4vKipcbiAqIE11dGF0ZXMgZWxlbWVudCwgYnVtcGluZyBgdmVyc2lvbmAsIGB2ZXJzaW9uTm9uY2VgLCBhbmQgYHVwZGF0ZWRgLlxuICpcbiAqIE5PVEU6IGRvZXMgbm90IHRyaWdnZXIgcmUtcmVuZGVyLlxuICovXG5leHBvcnQgY29uc3QgYnVtcFZlcnNpb24gPSAoXG4gIGVsZW1lbnQ6IE11dGFibGU8RXhjYWxpZHJhd0VsZW1lbnQ+LFxuICB2ZXJzaW9uPzogRXhjYWxpZHJhd0VsZW1lbnRbXCJ2ZXJzaW9uXCJdLFxuKSA9PiB7XG4gIGVsZW1lbnQudmVyc2lvbiA9ICh2ZXJzaW9uID8/IGVsZW1lbnQudmVyc2lvbikgKyAxO1xuICBlbGVtZW50LnZlcnNpb25Ob25jZSA9IHJhbmRvbUludGVnZXIoKTtcbiAgZWxlbWVudC51cGRhdGVkID0gZ2V0VXBkYXRlZFRpbWVzdGFtcCgpO1xuICByZXR1cm4gZWxlbWVudDtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/mutateElement.ts\n");
|
|
3464
3464
|
|
|
3465
3465
|
/***/ }),
|
|
3466
3466
|
|
|
@@ -3471,7 +3471,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3471
3471
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3472
3472
|
|
|
3473
3473
|
"use strict";
|
|
3474
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n var { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], roundness = null, boundElements = null, link = null, locked } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"roundness\", \"boundElements\", \"link\", \"locked\"]);\n // assign type to guard against excess properties\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n };\n return element;\n};\nconst newElement = (opts) => _newElementBase(opts.type, opts);\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\nconst newTextElement = (opts) => {\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(opts));\n const offsets = getTextElementPositionOffsets(opts, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text, fontSize: opts.fontSize, fontFamily: opts.fontFamily, textAlign: opts.textAlign, verticalAlign: opts.verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, containerId: opts.containerId || null, originalText: text }), {});\n return textElement;\n};\nconst getAdjustedDimensions = (element, nextText) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(element);\n const { width: nextWidth, height: nextHeight } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\n const { textAlign, verticalAlign } = element;\n let x;\n let y;\n if (textAlign === \"center\" &&\n verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE &&\n !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n }\n else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n const boundTextElementPadding = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextElementOffset)(element);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerDims)(container);\n let height = containerDims.height;\n let width = containerDims.width;\n if (nextHeight > height - boundTextElementPadding * 2) {\n height = nextHeight + boundTextElementPadding * 2;\n }\n if (nextWidth > width - boundTextElementPadding * 2) {\n width = nextWidth + boundTextElementPadding * 2;\n }\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isArrowElement)(container) &&\n (height !== containerDims.height || width !== containerDims.width)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getMaxContainerWidth)(container));\n }\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({ text }, dimensions);\n};\nconst updateTextElement = (textElement, { text, isDeleted, originalText, }) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({ originalText, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\n};\nconst newLinearElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\n};\nconst newImageElement = (opts) => {\n var _a, _b, _c;\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), { \n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\", status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\", fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null, scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1] });\n};\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\n//\n// Adapted from https://github.com/lukeed/klona\nconst deepCopyElement = (val, depth = 0) => {\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n return val;\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n var _a, _b;\n let copy = deepCopyElement(element);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n copy.id = `${copy.id}_copy`;\n // `window.h` may not be defined in some unit tests\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find((el) => el.id === copy.id)) {\n copy.id += \"_copy\";\n }\n }\n else {\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n }\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)());\n }\n return groupIdMapForOperation.get(groupId);\n });\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUM7UUFDNUIsbURBQW1EO1FBQ25ELElBQ0Usa0JBQU0sQ0FBQyxDQUFDLDBDQUFFLEdBQUcsMENBQ1QsZ0NBQWdDLEdBQ2pDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQ2xDO1lBQ0EsSUFBSSxDQUFDLEVBQUUsSUFBSSxPQUFPLENBQUM7U0FDcEI7S0FDRjtTQUFNO1FBQ0wsSUFBSSxDQUFDLEVBQUUsR0FBRyxpREFBUSxFQUFFLENBQUM7S0FDdEI7SUFDRCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztJQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLDJEQUFtQixFQUFFLENBQUM7SUFDckMsSUFBSSxDQUFDLElBQUksR0FBRyxzREFBYSxFQUFFLENBQUM7SUFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxxRUFBNEIsQ0FDMUMsSUFBSSxDQUFDLFFBQVEsRUFDYixjQUFjLEVBQ2QsQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNWLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDeEMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxpREFBUSxFQUFFLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBRSxDQUFDO0lBQzlDLENBQUMsQ0FDRixDQUFDO0lBQ0YsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDdkM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L25ld0VsZW1lbnQudHM/MTI1MyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBOb25EZWxldGVkLFxuICBUZXh0QWxpZ24sXG4gIEdyb3VwSWQsXG4gIFZlcnRpY2FsQWxpZ24sXG4gIEFycm93aGVhZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nLCBnZXRVcGRhdGVkVGltZXN0YW1wLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHJhbmRvbUludGVnZXIsIHJhbmRvbUlkIH0gZnJvbSBcIi4uL3JhbmRvbVwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCwgbmV3RWxlbWVudFdpdGggfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBnZXROZXdHcm91cElkc0ZvckR1cGxpY2F0aW9uIH0gZnJvbSBcIi4uL2dyb3Vwc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBhZGp1c3RYWVdpdGhSb3RhdGlvbiB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4vYm91bmRzXCI7XG5pbXBvcnQge1xuICBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0LFxuICBnZXRDb250YWluZXJEaW1zLFxuICBnZXRDb250YWluZXJFbGVtZW50LFxuICBtZWFzdXJlVGV4dCxcbiAgbm9ybWFsaXplVGV4dCxcbiAgd3JhcFRleHQsXG4gIGdldE1heENvbnRhaW5lcldpZHRoLFxufSBmcm9tIFwiLi90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHsgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBpc0Fycm93RWxlbWVudCB9IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcblxudHlwZSBFbGVtZW50Q29uc3RydWN0b3JPcHRzID0gTWFya09wdGlvbmFsPFxuICBPbWl0PEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgXCJpZFwiIHwgXCJ0eXBlXCIgfCBcImlzRGVsZXRlZFwiIHwgXCJ1cGRhdGVkXCI+LFxuICB8IFwid2lkdGhcIlxuICB8IFwiaGVpZ2h0XCJcbiAgfCBcImFuZ2xlXCJcbiAgfCBcImdyb3VwSWRzXCJcbiAgfCBcImJvdW5kRWxlbWVudHNcIlxuICB8IFwic2VlZFwiXG4gIHwgXCJ2ZXJzaW9uXCJcbiAgfCBcInZlcnNpb25Ob25jZVwiXG4gIHwgXCJsaW5rXCJcbj47XG5cbmNvbnN0IF9uZXdFbGVtZW50QmFzZSA9IDxUIGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+KFxuICB0eXBlOiBUW1widHlwZVwiXSxcbiAge1xuICAgIHgsXG4gICAgeSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHJvdW5kbmVzcyA9IG51bGwsXG4gICAgYm91bmRFbGVtZW50cyA9IG51bGwsXG4gICAgbGluayA9IG51bGwsXG4gICAgbG9ja2VkLFxuICAgIC4uLnJlc3RcbiAgfTogRWxlbWVudENvbnN0cnVjdG9yT3B0cyAmIE9taXQ8UGFydGlhbDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+LCBcInR5cGVcIj4sXG4pID0+IHtcbiAgLy8gYXNzaWduIHR5cGUgdG8gZ3VhcmQgYWdhaW5zdCBleGNlc3MgcHJvcGVydGllc1xuICBjb25zdCBlbGVtZW50OiBNZXJnZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsIHsgdHlwZTogVFtcInR5cGVcIl0gfT4gPSB7XG4gICAgaWQ6IHJlc3QuaWQgfHwgcmFuZG9tSWQoKSxcbiAgICB0eXBlLFxuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYW5nbGUsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MsXG4gICAgb3BhY2l0eSxcbiAgICBncm91cElkcyxcbiAgICByb3VuZG5lc3MsXG4gICAgc2VlZDogcmVzdC5zZWVkID8/IHJhbmRvbUludGVnZXIoKSxcbiAgICB2ZXJzaW9uOiByZXN0LnZlcnNpb24gfHwgMSxcbiAgICB2ZXJzaW9uTm9uY2U6IHJlc3QudmVyc2lvbk5vbmNlID8/IDAsXG4gICAgaXNEZWxldGVkOiBmYWxzZSBhcyBmYWxzZSxcbiAgICBib3VuZEVsZW1lbnRzLFxuICAgIHVwZGF0ZWQ6IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rLFxuICAgIGxvY2tlZCxcbiAgfTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+ID0+XG4gIF9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyk7XG5cbi8qKiBjb21wdXRlcyBlbGVtZW50IHgveSBvZmZzZXQgYmFzZWQgb24gdGV4dEFsaWduL3ZlcnRpY2FsQWxpZ24gKi9cbmNvbnN0IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dEFsaWduOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJ0ZXh0QWxpZ25cIl07XG4gICAgdmVydGljYWxBbGlnbjogRXhjYWxpZHJhd1RleHRFbGVtZW50W1widmVydGljYWxBbGlnblwiXTtcbiAgfSxcbiAgbWV0cmljczoge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICB4OlxuICAgICAgb3B0cy50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoIC8gMlxuICAgICAgICA6IG9wdHMudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoXG4gICAgICAgIDogMCxcbiAgICB5OiBvcHRzLnZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIgPyBtZXRyaWNzLmhlaWdodCAvIDIgOiAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld1RleHRFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbiAgICB0ZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgICB2ZXJ0aWNhbEFsaWduOiBWZXJ0aWNhbEFsaWduO1xuICAgIGNvbnRhaW5lcklkPzogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gPT4ge1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChvcHRzLnRleHQpO1xuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQodGV4dCwgZ2V0Rm9udFN0cmluZyhvcHRzKSk7XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhvcHRzLCBtZXRyaWNzKTtcbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICB7XG4gICAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd1RleHRFbGVtZW50PihcInRleHRcIiwgb3B0cyksXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemU6IG9wdHMuZm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBvcHRzLmZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IG9wdHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogb3B0cy52ZXJ0aWNhbEFsaWduLFxuICAgICAgeDogb3B0cy54IC0gb2Zmc2V0cy54LFxuICAgICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICAgIG9yaWdpbmFsVGV4dDogdGV4dCxcbiAgICB9LFxuICAgIHt9LFxuICApO1xuICByZXR1cm4gdGV4dEVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBZGp1c3RlZERpbWVuc2lvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgbmV4dFRleHQ6IHN0cmluZyxcbik6IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG5cbiAgY29uc3QgeyB3aWR0aDogbmV4dFdpZHRoLCBoZWlnaHQ6IG5leHRIZWlnaHQgfSA9IG1lYXN1cmVUZXh0KFxuICAgIG5leHRUZXh0LFxuICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICk7XG4gIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSBlbGVtZW50O1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBpZiAoXG4gICAgdGV4dEFsaWduID09PSBcImNlbnRlclwiICYmXG4gICAgdmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFICYmXG4gICAgIWVsZW1lbnQuY29udGFpbmVySWRcbiAgKSB7XG4gICAgY29uc3QgcHJldk1ldHJpY3MgPSBtZWFzdXJlVGV4dChlbGVtZW50LnRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuICAgIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbmV4dFdpZHRoIC0gcHJldk1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQgLSBwcmV2TWV0cmljcy5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICB4ID0gZWxlbWVudC54IC0gb2Zmc2V0cy54O1xuICAgIHkgPSBlbGVtZW50LnkgLSBvZmZzZXRzLnk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAgIGNvbnN0IFtuZXh0WDEsIG5leHRZMSwgbmV4dFgyLCBuZXh0WTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBuZXh0V2lkdGgsXG4gICAgICBuZXh0SGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVgxID0gKHgxIC0gbmV4dFgxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMSA9ICh5MSAtIG5leHRZMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWDIgPSAoeDIgLSBuZXh0WDIpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkyID0gKHkyIC0gbmV4dFkyKSAvIDI7XG5cbiAgICBbeCwgeV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICAgIHtcbiAgICAgICAgczogdHJ1ZSxcbiAgICAgICAgZTogdGV4dEFsaWduID09PSBcImNlbnRlclwiIHx8IHRleHRBbGlnbiA9PT0gXCJsZWZ0XCIsXG4gICAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIixcbiAgICAgIH0sXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgZGVsdGFYMSxcbiAgICAgIGRlbHRhWTEsXG4gICAgICBkZWx0YVgyLFxuICAgICAgZGVsdGFZMixcbiAgICApO1xuICB9XG5cbiAgLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBkaW1lbnNpb25zIGFyZSBzZXQgcHJvcGVybHkgd2hlblxuICAvLyB0ZXh0IGVkaXRvciBvdmVyZmxvd3MgYmV5b25kIHZpZXdwb3J0IGRpbWVuc2lvbnNcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nID0gZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldChlbGVtZW50KTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgbGV0IGhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGxldCB3aWR0aCA9IGNvbnRhaW5lckRpbXMud2lkdGg7XG4gICAgaWYgKG5leHRIZWlnaHQgPiBoZWlnaHQgLSBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDIpIHtcbiAgICAgIGhlaWdodCA9IG5leHRIZWlnaHQgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgfVxuICAgIGlmIChuZXh0V2lkdGggPiB3aWR0aCAtIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nICogMikge1xuICAgICAgd2lkdGggPSBuZXh0V2lkdGggKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAoaGVpZ2h0ICE9PSBjb250YWluZXJEaW1zLmhlaWdodCB8fCB3aWR0aCAhPT0gY29udGFpbmVyRGltcy53aWR0aClcbiAgICApIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodCwgd2lkdGggfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgeDogTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IGVsZW1lbnQueCxcbiAgICB5OiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogZWxlbWVudC55LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hUZXh0RGltZW5zaW9ucyA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgdGV4dCA9IHRleHRFbGVtZW50LnRleHQsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0LFxuICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGltZW5zaW9ucyA9IGdldEFkanVzdGVkRGltZW5zaW9ucyh0ZXh0RWxlbWVudCwgdGV4dCk7XG4gIHJldHVybiB7IHRleHQsIC4uLmRpbWVuc2lvbnMgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUZXh0RWxlbWVudCA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAge1xuICAgIHRleHQsXG4gICAgaXNEZWxldGVkLFxuICAgIG9yaWdpbmFsVGV4dCxcbiAgfToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBpc0RlbGV0ZWQ/OiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9LFxuKTogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0+IHtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKHRleHRFbGVtZW50LCB7XG4gICAgb3JpZ2luYWxUZXh0LFxuICAgIGlzRGVsZXRlZDogaXNEZWxldGVkID8/IHRleHRFbGVtZW50LmlzRGVsZXRlZCxcbiAgICAuLi5yZWZyZXNoVGV4dERpbWVuc2lvbnModGV4dEVsZW1lbnQsIG9yaWdpbmFsVGV4dCksXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0ZyZWVEcmF3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IFwiZnJlZWRyYXdcIjtcbiAgICBwb2ludHM/OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50W1wicG9pbnRzXCJdO1xuICAgIHNpbXVsYXRlUHJlc3N1cmU6IGJvb2xlYW47XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50PiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyksXG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBwcmVzc3VyZXM6IFtdLFxuICAgIHNpbXVsYXRlUHJlc3N1cmU6IG9wdHMuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3TGluZWFyRWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1widHlwZVwiXTtcbiAgICBzdGFydEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBlbmRBcnJvd2hlYWQ6IEFycm93aGVhZCB8IG51bGw7XG4gICAgcG9pbnRzPzogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJwb2ludHNcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICBzdGFydEJpbmRpbmc6IG51bGwsXG4gICAgZW5kQmluZGluZzogbnVsbCxcbiAgICBzdGFydEFycm93aGVhZDogb3B0cy5zdGFydEFycm93aGVhZCxcbiAgICBlbmRBcnJvd2hlYWQ6IG9wdHMuZW5kQXJyb3doZWFkLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0ltYWdlRWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXR1cz86IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJzdGF0dXNcIl07XG4gICAgZmlsZUlkPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcImZpbGVJZFwiXTtcbiAgICBzY2FsZT86IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJzY2FsZVwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ltYWdlRWxlbWVudD4oXCJpbWFnZVwiLCBvcHRzKSxcbiAgICAvLyBpbiB0aGUgZnV0dXJlIHdlJ2xsIHN1cHBvcnQgY2hhbmdpbmcgc3Ryb2tlIGNvbG9yIGZvciBzb21lIFNWRyBlbGVtZW50cyxcbiAgICAvLyBhbmQgYHRyYW5zcGFyZW50YCB3aWxsIGxpa2VseSBtZWFuIFwidXNlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgaW1hZ2VcIlxuICAgIHN0cm9rZUNvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgc3RhdHVzOiBvcHRzLnN0YXR1cyA/PyBcInBlbmRpbmdcIixcbiAgICBmaWxlSWQ6IG9wdHMuZmlsZUlkID8/IG51bGwsXG4gICAgc2NhbGU6IG9wdHMuc2NhbGUgPz8gWzEsIDFdLFxuICB9O1xufTtcblxuLy8gU2ltcGxpZmllZCBkZWVwIGNsb25lIGZvciB0aGUgcHVycG9zZSBvZiBjbG9uaW5nIEV4Y2FsaWRyYXdFbGVtZW50IG9ubHlcbi8vIChkb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsIFR5cGVkIGFycmF5cyBldGMuKVxuLy9cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL2tsb25hXG5leHBvcnQgY29uc3QgZGVlcENvcHlFbGVtZW50ID0gKHZhbDogYW55LCBkZXB0aDogbnVtYmVyID0gMCkgPT4ge1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICBjb25zdCB0bXAgPVxuICAgICAgdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKSlcbiAgICAgICAgOiB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBkb24ndCBjb3B5IG5vbi1zZXJpYWxpemFibGUgb2JqZWN0cyBsaWtlIHRoZXNlIGNhY2hlcy4gVGhleSdsbCBiZVxuICAgICAgICAvLyBwb3B1bGF0ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC5cbiAgICAgICAgaWYgKGRlcHRoID09PSAwICYmIChrZXkgPT09IFwic2hhcGVcIiB8fCBrZXkgPT09IFwiY2FudmFzXCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdG1wW2tleV0gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcbiAgICB3aGlsZSAoay0tKSB7XG4gICAgICBhcnJba10gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tdLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gPFRFbGVtZW50IGV4dGVuZHMgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+KFxuICBlZGl0aW5nR3JvdXBJZDogQXBwU3RhdGVbXCJlZGl0aW5nR3JvdXBJZFwiXSxcbiAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbjogTWFwPEdyb3VwSWQsIEdyb3VwSWQ+LFxuICBlbGVtZW50OiBURWxlbWVudCxcbiAgb3ZlcnJpZGVzPzogUGFydGlhbDxURWxlbWVudD4sXG4pOiBURWxlbWVudCA9PiB7XG4gIGxldCBjb3B5OiBURWxlbWVudCA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICBjb3B5LmlkID0gYCR7Y29weS5pZH1fY29weWA7XG4gICAgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG4gICAgaWYgKFxuICAgICAgd2luZG93Lmg/LmFwcFxuICAgICAgICA/LmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbmQoKGVsKSA9PiBlbC5pZCA9PT0gY29weS5pZClcbiAgICApIHtcbiAgICAgIGNvcHkuaWQgKz0gXCJfY29weVwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb3B5LmlkID0gcmFuZG9tSWQoKTtcbiAgfVxuICBjb3B5LmJvdW5kRWxlbWVudHMgPSBudWxsO1xuICBjb3B5LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oXG4gICAgY29weS5ncm91cElkcyxcbiAgICBlZGl0aW5nR3JvdXBJZCxcbiAgICAoZ3JvdXBJZCkgPT4ge1xuICAgICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByYW5kb21JZCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBncm91cElkTWFwRm9yT3BlcmF0aW9uLmdldChncm91cElkKSE7XG4gICAgfSxcbiAgKTtcbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvcHkgPSBPYmplY3QuYXNzaWduKGNvcHksIG92ZXJyaWRlcyk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
|
|
3474
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"deepCopyElement\": () => (/* binding */ deepCopyElement),\n/* harmony export */ \"duplicateElement\": () => (/* binding */ duplicateElement),\n/* harmony export */ \"newElement\": () => (/* binding */ newElement),\n/* harmony export */ \"newFreeDrawElement\": () => (/* binding */ newFreeDrawElement),\n/* harmony export */ \"newImageElement\": () => (/* binding */ newImageElement),\n/* harmony export */ \"newLinearElement\": () => (/* binding */ newLinearElement),\n/* harmony export */ \"newTextElement\": () => (/* binding */ newTextElement),\n/* harmony export */ \"refreshTextDimensions\": () => (/* binding */ refreshTextDimensions),\n/* harmony export */ \"updateTextElement\": () => (/* binding */ updateTextElement)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _random__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../random */ \"../../random.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _groups__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../groups */ \"../../groups.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! . */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _bounds__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\nvar __rest = (undefined && undefined.__rest) || function (s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n};\n\n\n\n\n\n\n\n\n\n\nconst _newElementBase = (type, _a) => {\n var _b, _c;\n var { x, y, strokeColor, backgroundColor, fillStyle, strokeWidth, strokeStyle, roughness, opacity, width = 0, height = 0, angle = 0, groupIds = [], roundness = null, boundElements = null, link = null, locked } = _a, rest = __rest(_a, [\"x\", \"y\", \"strokeColor\", \"backgroundColor\", \"fillStyle\", \"strokeWidth\", \"strokeStyle\", \"roughness\", \"opacity\", \"width\", \"height\", \"angle\", \"groupIds\", \"roundness\", \"boundElements\", \"link\", \"locked\"]);\n // assign type to guard against excess properties\n const element = {\n id: rest.id || (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)(),\n type,\n x,\n y,\n width,\n height,\n angle,\n strokeColor,\n backgroundColor,\n fillStyle,\n strokeWidth,\n strokeStyle,\n roughness,\n opacity,\n groupIds,\n roundness,\n seed: (_b = rest.seed) !== null && _b !== void 0 ? _b : (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)(),\n version: rest.version || 1,\n versionNonce: (_c = rest.versionNonce) !== null && _c !== void 0 ? _c : 0,\n isDeleted: false,\n boundElements,\n updated: (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)(),\n link,\n locked,\n };\n return element;\n};\nconst newElement = (opts) => _newElementBase(opts.type, opts);\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (opts, metrics) => {\n return {\n x: opts.textAlign === \"center\"\n ? metrics.width / 2\n : opts.textAlign === \"right\"\n ? metrics.width\n : 0,\n y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n };\n};\nconst newTextElement = (opts) => {\n const text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.normalizeText)(opts.text);\n const metrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(opts));\n const offsets = getTextElementPositionOffsets(opts, metrics);\n const textElement = (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(Object.assign(Object.assign({}, _newElementBase(\"text\", opts)), { text, fontSize: opts.fontSize, fontFamily: opts.fontFamily, textAlign: opts.textAlign, verticalAlign: opts.verticalAlign, x: opts.x - offsets.x, y: opts.y - offsets.y, width: metrics.width, height: metrics.height, containerId: opts.containerId || null, originalText: text }), {});\n return textElement;\n};\nconst getAdjustedDimensions = (element, nextText) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(element);\n const { width: nextWidth, height: nextHeight } = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(nextText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\n const { textAlign, verticalAlign } = element;\n let x;\n let y;\n if (textAlign === \"center\" &&\n verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_8__.VERTICAL_ALIGN.MIDDLE &&\n !element.containerId) {\n const prevMetrics = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.measureText)(element.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(element));\n const offsets = getTextElementPositionOffsets(element, {\n width: nextWidth - prevMetrics.width,\n height: nextHeight - prevMetrics.height,\n });\n x = element.x - offsets.x;\n y = element.y - offsets.y;\n }\n else {\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(element);\n const [nextX1, nextY1, nextX2, nextY2] = (0,_bounds__WEBPACK_IMPORTED_MODULE_6__.getResizedElementAbsoluteCoords)(element, nextWidth, nextHeight, false);\n const deltaX1 = (x1 - nextX1) / 2;\n const deltaY1 = (y1 - nextY1) / 2;\n const deltaX2 = (x2 - nextX2) / 2;\n const deltaY2 = (y2 - nextY2) / 2;\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_5__.adjustXYWithRotation)({\n s: true,\n e: textAlign === \"center\" || textAlign === \"left\",\n w: textAlign === \"center\" || textAlign === \"right\",\n }, element.x, element.y, element.angle, deltaX1, deltaY1, deltaX2, deltaY2);\n }\n // make sure container dimensions are set properly when\n // text editor overflows beyond viewport dimensions\n if (container) {\n const boundTextElementPadding = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getBoundTextElementOffset)(element);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerDims)(container);\n let height = containerDims.height;\n let width = containerDims.width;\n if (nextHeight > height - boundTextElementPadding * 2) {\n height = nextHeight + boundTextElementPadding * 2;\n }\n if (nextWidth > width - boundTextElementPadding * 2) {\n width = nextWidth + boundTextElementPadding * 2;\n }\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_9__.isArrowElement)(container) &&\n (height !== containerDims.height || width !== containerDims.width)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, { height, width });\n }\n }\n return {\n width: nextWidth,\n height: nextHeight,\n x: Number.isFinite(x) ? x : element.x,\n y: Number.isFinite(y) ? y : element.y,\n };\n};\nconst refreshTextDimensions = (textElement, text = textElement.text) => {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getContainerElement)(textElement);\n if (container) {\n text = (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.wrapText)(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), (0,_textElement__WEBPACK_IMPORTED_MODULE_7__.getMaxContainerWidth)(container));\n }\n const dimensions = getAdjustedDimensions(textElement, text);\n return Object.assign({ text }, dimensions);\n};\nconst updateTextElement = (textElement, { text, isDeleted, originalText, }) => {\n return (0,_mutateElement__WEBPACK_IMPORTED_MODULE_2__.newElementWith)(textElement, Object.assign({ originalText, isDeleted: isDeleted !== null && isDeleted !== void 0 ? isDeleted : textElement.isDeleted }, refreshTextDimensions(textElement, originalText)));\n};\nconst newFreeDrawElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], pressures: [], simulatePressure: opts.simulatePressure, lastCommittedPoint: null });\n};\nconst newLinearElement = (opts) => {\n return Object.assign(Object.assign({}, _newElementBase(opts.type, opts)), { points: opts.points || [], lastCommittedPoint: null, startBinding: null, endBinding: null, startArrowhead: opts.startArrowhead, endArrowhead: opts.endArrowhead });\n};\nconst newImageElement = (opts) => {\n var _a, _b, _c;\n return Object.assign(Object.assign({}, _newElementBase(\"image\", opts)), { \n // in the future we'll support changing stroke color for some SVG elements,\n // and `transparent` will likely mean \"use original colors of the image\"\n strokeColor: \"transparent\", status: (_a = opts.status) !== null && _a !== void 0 ? _a : \"pending\", fileId: (_b = opts.fileId) !== null && _b !== void 0 ? _b : null, scale: (_c = opts.scale) !== null && _c !== void 0 ? _c : [1, 1] });\n};\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\n//\n// Adapted from https://github.com/lukeed/klona\nconst deepCopyElement = (val, depth = 0) => {\n if (val == null || typeof val !== \"object\") {\n return val;\n }\n if (Object.prototype.toString.call(val) === \"[object Object]\") {\n const tmp = typeof val.constructor === \"function\"\n ? Object.create(Object.getPrototypeOf(val))\n : {};\n for (const key in val) {\n if (val.hasOwnProperty(key)) {\n // don't copy non-serializable objects like these caches. They'll be\n // populated when the element is rendered.\n if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n continue;\n }\n tmp[key] = deepCopyElement(val[key], depth + 1);\n }\n }\n return tmp;\n }\n if (Array.isArray(val)) {\n let k = val.length;\n const arr = new Array(k);\n while (k--) {\n arr[k] = deepCopyElement(val[k], depth + 1);\n }\n return arr;\n }\n return val;\n};\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n * element will inherit this group and its\n * parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n * duplicated ones. If you are duplicating\n * multiple elements at once, share this map\n * amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nconst duplicateElement = (editingGroupId, groupIdMapForOperation, element, overrides) => {\n var _a, _b;\n let copy = deepCopyElement(element);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n copy.id = `${copy.id}_copy`;\n // `window.h` may not be defined in some unit tests\n if ((_b = (_a = window.h) === null || _a === void 0 ? void 0 : _a.app) === null || _b === void 0 ? void 0 : _b.getSceneElementsIncludingDeleted().find((el) => el.id === copy.id)) {\n copy.id += \"_copy\";\n }\n }\n else {\n copy.id = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)();\n }\n copy.boundElements = null;\n copy.updated = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getUpdatedTimestamp)();\n copy.seed = (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomInteger)();\n copy.groupIds = (0,_groups__WEBPACK_IMPORTED_MODULE_3__.getNewGroupIdsForDuplication)(copy.groupIds, editingGroupId, (groupId) => {\n if (!groupIdMapForOperation.has(groupId)) {\n groupIdMapForOperation.set(groupId, (0,_random__WEBPACK_IMPORTED_MODULE_1__.randomId)());\n }\n return groupIdMapForOperation.get(groupId);\n });\n if (overrides) {\n copy = Object.assign(copy, overrides);\n }\n return copy;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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ZixJQUFJLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQzVCLG1EQUFtRDtRQUNuRCxJQUNFLGtCQUFNLENBQUMsQ0FBQywwQ0FBRSxHQUFHLDBDQUNULGdDQUFnQyxHQUNqQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUNsQztZQUNBLElBQUksQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDO1NBQ3BCO0tBQ0Y7U0FBTTtRQUNMLElBQUksQ0FBQyxFQUFFLEdBQUcsaURBQVEsRUFBRSxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFDMUIsSUFBSSxDQUFDLE9BQU8sR0FBRywyREFBbUIsRUFBRSxDQUFDO0lBQ3JDLElBQUksQ0FBQyxJQUFJLEdBQUcsc0RBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksQ0FBQyxRQUFRLEdBQUcscUVBQTRCLENBQzFDLElBQUksQ0FBQyxRQUFRLEVBQ2IsY0FBYyxFQUNkLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDVixJQUFJLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3hDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsaURBQVEsRUFBRSxDQUFDLENBQUM7U0FDakQ7UUFDRCxPQUFPLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUUsQ0FBQztJQUM5QyxDQUFDLENBQ0YsQ0FBQztJQUNGLElBQUksU0FBUyxFQUFFO1FBQ2IsSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ3ZDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9uZXdFbGVtZW50LnRzPzEyNTMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBHcm91cElkLFxuICBWZXJ0aWNhbEFsaWduLFxuICBBcnJvd2hlYWQsXG4gIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxufSBmcm9tIFwiLi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgZ2V0VXBkYXRlZFRpbWVzdGFtcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByYW5kb21JbnRlZ2VyLCByYW5kb21JZCB9IGZyb20gXCIuLi9yYW5kb21cIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQsIG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0TmV3R3JvdXBJZHNGb3JEdXBsaWNhdGlvbiB9IGZyb20gXCIuLi9ncm91cHNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgYWRqdXN0WFlXaXRoUm90YXRpb24gfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyB9IGZyb20gXCIuL2JvdW5kc1wiO1xuaW1wb3J0IHtcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgbWVhc3VyZVRleHQsXG4gIG5vcm1hbGl6ZVRleHQsXG4gIHdyYXBUZXh0LFxuICBnZXRNYXhDb250YWluZXJXaWR0aCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7IFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBNYXJrT3B0aW9uYWwsIE1lcmdlLCBNdXRhYmxlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcblxudHlwZSBFbGVtZW50Q29uc3RydWN0b3JPcHRzID0gTWFya09wdGlvbmFsPFxuICBPbWl0PEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCwgXCJpZFwiIHwgXCJ0eXBlXCIgfCBcImlzRGVsZXRlZFwiIHwgXCJ1cGRhdGVkXCI+LFxuICB8IFwid2lkdGhcIlxuICB8IFwiaGVpZ2h0XCJcbiAgfCBcImFuZ2xlXCJcbiAgfCBcImdyb3VwSWRzXCJcbiAgfCBcImJvdW5kRWxlbWVudHNcIlxuICB8IFwic2VlZFwiXG4gIHwgXCJ2ZXJzaW9uXCJcbiAgfCBcInZlcnNpb25Ob25jZVwiXG4gIHwgXCJsaW5rXCJcbj47XG5cbmNvbnN0IF9uZXdFbGVtZW50QmFzZSA9IDxUIGV4dGVuZHMgRXhjYWxpZHJhd0VsZW1lbnQ+KFxuICB0eXBlOiBUW1widHlwZVwiXSxcbiAge1xuICAgIHgsXG4gICAgeSxcbiAgICBzdHJva2VDb2xvcixcbiAgICBiYWNrZ3JvdW5kQ29sb3IsXG4gICAgZmlsbFN0eWxlLFxuICAgIHN0cm9rZVdpZHRoLFxuICAgIHN0cm9rZVN0eWxlLFxuICAgIHJvdWdobmVzcyxcbiAgICBvcGFjaXR5LFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGFuZ2xlID0gMCxcbiAgICBncm91cElkcyA9IFtdLFxuICAgIHJvdW5kbmVzcyA9IG51bGwsXG4gICAgYm91bmRFbGVtZW50cyA9IG51bGwsXG4gICAgbGluayA9IG51bGwsXG4gICAgbG9ja2VkLFxuICAgIC4uLnJlc3RcbiAgfTogRWxlbWVudENvbnN0cnVjdG9yT3B0cyAmIE9taXQ8UGFydGlhbDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+LCBcInR5cGVcIj4sXG4pID0+IHtcbiAgLy8gYXNzaWduIHR5cGUgdG8gZ3VhcmQgYWdhaW5zdCBleGNlc3MgcHJvcGVydGllc1xuICBjb25zdCBlbGVtZW50OiBNZXJnZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsIHsgdHlwZTogVFtcInR5cGVcIl0gfT4gPSB7XG4gICAgaWQ6IHJlc3QuaWQgfHwgcmFuZG9tSWQoKSxcbiAgICB0eXBlLFxuICAgIHgsXG4gICAgeSxcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYW5nbGUsXG4gICAgc3Ryb2tlQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIGZpbGxTdHlsZSxcbiAgICBzdHJva2VXaWR0aCxcbiAgICBzdHJva2VTdHlsZSxcbiAgICByb3VnaG5lc3MsXG4gICAgb3BhY2l0eSxcbiAgICBncm91cElkcyxcbiAgICByb3VuZG5lc3MsXG4gICAgc2VlZDogcmVzdC5zZWVkID8/IHJhbmRvbUludGVnZXIoKSxcbiAgICB2ZXJzaW9uOiByZXN0LnZlcnNpb24gfHwgMSxcbiAgICB2ZXJzaW9uTm9uY2U6IHJlc3QudmVyc2lvbk5vbmNlID8/IDAsXG4gICAgaXNEZWxldGVkOiBmYWxzZSBhcyBmYWxzZSxcbiAgICBib3VuZEVsZW1lbnRzLFxuICAgIHVwZGF0ZWQ6IGdldFVwZGF0ZWRUaW1lc3RhbXAoKSxcbiAgICBsaW5rLFxuICAgIGxvY2tlZCxcbiAgfTtcbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5leHBvcnQgY29uc3QgbmV3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudFtcInR5cGVcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+ID0+XG4gIF9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyk7XG5cbi8qKiBjb21wdXRlcyBlbGVtZW50IHgveSBvZmZzZXQgYmFzZWQgb24gdGV4dEFsaWduL3ZlcnRpY2FsQWxpZ24gKi9cbmNvbnN0IGdldFRleHRFbGVtZW50UG9zaXRpb25PZmZzZXRzID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dEFsaWduOiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJ0ZXh0QWxpZ25cIl07XG4gICAgdmVydGljYWxBbGlnbjogRXhjYWxpZHJhd1RleHRFbGVtZW50W1widmVydGljYWxBbGlnblwiXTtcbiAgfSxcbiAgbWV0cmljczoge1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgaGVpZ2h0OiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgcmV0dXJuIHtcbiAgICB4OlxuICAgICAgb3B0cy50ZXh0QWxpZ24gPT09IFwiY2VudGVyXCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoIC8gMlxuICAgICAgICA6IG9wdHMudGV4dEFsaWduID09PSBcInJpZ2h0XCJcbiAgICAgICAgPyBtZXRyaWNzLndpZHRoXG4gICAgICAgIDogMCxcbiAgICB5OiBvcHRzLnZlcnRpY2FsQWxpZ24gPT09IFwibWlkZGxlXCIgPyBtZXRyaWNzLmhlaWdodCAvIDIgOiAwLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld1RleHRFbGVtZW50ID0gKFxuICBvcHRzOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIGZvbnRTaXplOiBudW1iZXI7XG4gICAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbiAgICB0ZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgICB2ZXJ0aWNhbEFsaWduOiBWZXJ0aWNhbEFsaWduO1xuICAgIGNvbnRhaW5lcklkPzogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4gPT4ge1xuICBjb25zdCB0ZXh0ID0gbm9ybWFsaXplVGV4dChvcHRzLnRleHQpO1xuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQodGV4dCwgZ2V0Rm9udFN0cmluZyhvcHRzKSk7XG4gIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhvcHRzLCBtZXRyaWNzKTtcbiAgY29uc3QgdGV4dEVsZW1lbnQgPSBuZXdFbGVtZW50V2l0aChcbiAgICB7XG4gICAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd1RleHRFbGVtZW50PihcInRleHRcIiwgb3B0cyksXG4gICAgICB0ZXh0LFxuICAgICAgZm9udFNpemU6IG9wdHMuZm9udFNpemUsXG4gICAgICBmb250RmFtaWx5OiBvcHRzLmZvbnRGYW1pbHksXG4gICAgICB0ZXh0QWxpZ246IG9wdHMudGV4dEFsaWduLFxuICAgICAgdmVydGljYWxBbGlnbjogb3B0cy52ZXJ0aWNhbEFsaWduLFxuICAgICAgeDogb3B0cy54IC0gb2Zmc2V0cy54LFxuICAgICAgeTogb3B0cy55IC0gb2Zmc2V0cy55LFxuICAgICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG1ldHJpY3MuaGVpZ2h0LFxuICAgICAgY29udGFpbmVySWQ6IG9wdHMuY29udGFpbmVySWQgfHwgbnVsbCxcbiAgICAgIG9yaWdpbmFsVGV4dDogdGV4dCxcbiAgICB9LFxuICAgIHt9LFxuICApO1xuICByZXR1cm4gdGV4dEVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBZGp1c3RlZERpbWVuc2lvbnMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgbmV4dFRleHQ6IHN0cmluZyxcbik6IHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG5cbiAgY29uc3QgeyB3aWR0aDogbmV4dFdpZHRoLCBoZWlnaHQ6IG5leHRIZWlnaHQgfSA9IG1lYXN1cmVUZXh0KFxuICAgIG5leHRUZXh0LFxuICAgIGdldEZvbnRTdHJpbmcoZWxlbWVudCksXG4gICk7XG4gIGNvbnN0IHsgdGV4dEFsaWduLCB2ZXJ0aWNhbEFsaWduIH0gPSBlbGVtZW50O1xuICBsZXQgeDogbnVtYmVyO1xuICBsZXQgeTogbnVtYmVyO1xuICBpZiAoXG4gICAgdGV4dEFsaWduID09PSBcImNlbnRlclwiICYmXG4gICAgdmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFICYmXG4gICAgIWVsZW1lbnQuY29udGFpbmVySWRcbiAgKSB7XG4gICAgY29uc3QgcHJldk1ldHJpY3MgPSBtZWFzdXJlVGV4dChlbGVtZW50LnRleHQsIGdldEZvbnRTdHJpbmcoZWxlbWVudCkpO1xuICAgIGNvbnN0IG9mZnNldHMgPSBnZXRUZXh0RWxlbWVudFBvc2l0aW9uT2Zmc2V0cyhlbGVtZW50LCB7XG4gICAgICB3aWR0aDogbmV4dFdpZHRoIC0gcHJldk1ldHJpY3Mud2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQgLSBwcmV2TWV0cmljcy5oZWlnaHQsXG4gICAgfSk7XG5cbiAgICB4ID0gZWxlbWVudC54IC0gb2Zmc2V0cy54O1xuICAgIHkgPSBlbGVtZW50LnkgLSBvZmZzZXRzLnk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcblxuICAgIGNvbnN0IFtuZXh0WDEsIG5leHRZMSwgbmV4dFgyLCBuZXh0WTJdID0gZ2V0UmVzaXplZEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhcbiAgICAgIGVsZW1lbnQsXG4gICAgICBuZXh0V2lkdGgsXG4gICAgICBuZXh0SGVpZ2h0LFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgICBjb25zdCBkZWx0YVgxID0gKHgxIC0gbmV4dFgxKSAvIDI7XG4gICAgY29uc3QgZGVsdGFZMSA9ICh5MSAtIG5leHRZMSkgLyAyO1xuICAgIGNvbnN0IGRlbHRhWDIgPSAoeDIgLSBuZXh0WDIpIC8gMjtcbiAgICBjb25zdCBkZWx0YVkyID0gKHkyIC0gbmV4dFkyKSAvIDI7XG5cbiAgICBbeCwgeV0gPSBhZGp1c3RYWVdpdGhSb3RhdGlvbihcbiAgICAgIHtcbiAgICAgICAgczogdHJ1ZSxcbiAgICAgICAgZTogdGV4dEFsaWduID09PSBcImNlbnRlclwiIHx8IHRleHRBbGlnbiA9PT0gXCJsZWZ0XCIsXG4gICAgICAgIHc6IHRleHRBbGlnbiA9PT0gXCJjZW50ZXJcIiB8fCB0ZXh0QWxpZ24gPT09IFwicmlnaHRcIixcbiAgICAgIH0sXG4gICAgICBlbGVtZW50LngsXG4gICAgICBlbGVtZW50LnksXG4gICAgICBlbGVtZW50LmFuZ2xlLFxuICAgICAgZGVsdGFYMSxcbiAgICAgIGRlbHRhWTEsXG4gICAgICBkZWx0YVgyLFxuICAgICAgZGVsdGFZMixcbiAgICApO1xuICB9XG5cbiAgLy8gbWFrZSBzdXJlIGNvbnRhaW5lciBkaW1lbnNpb25zIGFyZSBzZXQgcHJvcGVybHkgd2hlblxuICAvLyB0ZXh0IGVkaXRvciBvdmVyZmxvd3MgYmV5b25kIHZpZXdwb3J0IGRpbWVuc2lvbnNcbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nID0gZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldChlbGVtZW50KTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgbGV0IGhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGxldCB3aWR0aCA9IGNvbnRhaW5lckRpbXMud2lkdGg7XG4gICAgaWYgKG5leHRIZWlnaHQgPiBoZWlnaHQgLSBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDIpIHtcbiAgICAgIGhlaWdodCA9IG5leHRIZWlnaHQgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgfVxuICAgIGlmIChuZXh0V2lkdGggPiB3aWR0aCAtIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nICogMikge1xuICAgICAgd2lkdGggPSBuZXh0V2lkdGggKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAoaGVpZ2h0ICE9PSBjb250YWluZXJEaW1zLmhlaWdodCB8fCB3aWR0aCAhPT0gY29udGFpbmVyRGltcy53aWR0aClcbiAgICApIHtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodCwgd2lkdGggfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgeDogTnVtYmVyLmlzRmluaXRlKHgpID8geCA6IGVsZW1lbnQueCxcbiAgICB5OiBOdW1iZXIuaXNGaW5pdGUoeSkgPyB5IDogZWxlbWVudC55LFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hUZXh0RGltZW5zaW9ucyA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgdGV4dCA9IHRleHRFbGVtZW50LnRleHQsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0LFxuICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGltZW5zaW9ucyA9IGdldEFkanVzdGVkRGltZW5zaW9ucyh0ZXh0RWxlbWVudCwgdGV4dCk7XG4gIHJldHVybiB7IHRleHQsIC4uLmRpbWVuc2lvbnMgfTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVUZXh0RWxlbWVudCA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAge1xuICAgIHRleHQsXG4gICAgaXNEZWxldGVkLFxuICAgIG9yaWdpbmFsVGV4dCxcbiAgfToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICBpc0RlbGV0ZWQ/OiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9LFxuKTogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0+IHtcbiAgcmV0dXJuIG5ld0VsZW1lbnRXaXRoKHRleHRFbGVtZW50LCB7XG4gICAgb3JpZ2luYWxUZXh0LFxuICAgIGlzRGVsZXRlZDogaXNEZWxldGVkID8/IHRleHRFbGVtZW50LmlzRGVsZXRlZCxcbiAgICAuLi5yZWZyZXNoVGV4dERpbWVuc2lvbnModGV4dEVsZW1lbnQsIG9yaWdpbmFsVGV4dCksXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0ZyZWVEcmF3RWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IFwiZnJlZWRyYXdcIjtcbiAgICBwb2ludHM/OiBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50W1wicG9pbnRzXCJdO1xuICAgIHNpbXVsYXRlUHJlc3N1cmU6IGJvb2xlYW47XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50PiA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uX25ld0VsZW1lbnRCYXNlPEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQ+KG9wdHMudHlwZSwgb3B0cyksXG4gICAgcG9pbnRzOiBvcHRzLnBvaW50cyB8fCBbXSxcbiAgICBwcmVzc3VyZXM6IFtdLFxuICAgIHNpbXVsYXRlUHJlc3N1cmU6IG9wdHMuc2ltdWxhdGVQcmVzc3VyZSxcbiAgICBsYXN0Q29tbWl0dGVkUG9pbnQ6IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgbmV3TGluZWFyRWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1widHlwZVwiXTtcbiAgICBzdGFydEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgICBlbmRBcnJvd2hlYWQ6IEFycm93aGVhZCB8IG51bGw7XG4gICAgcG9pbnRzPzogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJwb2ludHNcIl07XG4gIH0gJiBFbGVtZW50Q29uc3RydWN0b3JPcHRzLFxuKTogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4gPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLl9uZXdFbGVtZW50QmFzZTxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4ob3B0cy50eXBlLCBvcHRzKSxcbiAgICBwb2ludHM6IG9wdHMucG9pbnRzIHx8IFtdLFxuICAgIGxhc3RDb21taXR0ZWRQb2ludDogbnVsbCxcbiAgICBzdGFydEJpbmRpbmc6IG51bGwsXG4gICAgZW5kQmluZGluZzogbnVsbCxcbiAgICBzdGFydEFycm93aGVhZDogb3B0cy5zdGFydEFycm93aGVhZCxcbiAgICBlbmRBcnJvd2hlYWQ6IG9wdHMuZW5kQXJyb3doZWFkLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG5ld0ltYWdlRWxlbWVudCA9IChcbiAgb3B0czoge1xuICAgIHR5cGU6IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJ0eXBlXCJdO1xuICAgIHN0YXR1cz86IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJzdGF0dXNcIl07XG4gICAgZmlsZUlkPzogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcImZpbGVJZFwiXTtcbiAgICBzY2FsZT86IEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnRbXCJzY2FsZVwiXTtcbiAgfSAmIEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsXG4pOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQ+ID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5fbmV3RWxlbWVudEJhc2U8RXhjYWxpZHJhd0ltYWdlRWxlbWVudD4oXCJpbWFnZVwiLCBvcHRzKSxcbiAgICAvLyBpbiB0aGUgZnV0dXJlIHdlJ2xsIHN1cHBvcnQgY2hhbmdpbmcgc3Ryb2tlIGNvbG9yIGZvciBzb21lIFNWRyBlbGVtZW50cyxcbiAgICAvLyBhbmQgYHRyYW5zcGFyZW50YCB3aWxsIGxpa2VseSBtZWFuIFwidXNlIG9yaWdpbmFsIGNvbG9ycyBvZiB0aGUgaW1hZ2VcIlxuICAgIHN0cm9rZUNvbG9yOiBcInRyYW5zcGFyZW50XCIsXG4gICAgc3RhdHVzOiBvcHRzLnN0YXR1cyA/PyBcInBlbmRpbmdcIixcbiAgICBmaWxlSWQ6IG9wdHMuZmlsZUlkID8/IG51bGwsXG4gICAgc2NhbGU6IG9wdHMuc2NhbGUgPz8gWzEsIDFdLFxuICB9O1xufTtcblxuLy8gU2ltcGxpZmllZCBkZWVwIGNsb25lIGZvciB0aGUgcHVycG9zZSBvZiBjbG9uaW5nIEV4Y2FsaWRyYXdFbGVtZW50IG9ubHlcbi8vIChkb2Vzbid0IGNsb25lIERhdGUsIFJlZ0V4cCwgTWFwLCBTZXQsIFR5cGVkIGFycmF5cyBldGMuKVxuLy9cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vbHVrZWVkL2tsb25hXG5leHBvcnQgY29uc3QgZGVlcENvcHlFbGVtZW50ID0gKHZhbDogYW55LCBkZXB0aDogbnVtYmVyID0gMCkgPT4ge1xuICBpZiAodmFsID09IG51bGwgfHwgdHlwZW9mIHZhbCAhPT0gXCJvYmplY3RcIikge1xuICAgIHJldHVybiB2YWw7XG4gIH1cblxuICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbCkgPT09IFwiW29iamVjdCBPYmplY3RdXCIpIHtcbiAgICBjb25zdCB0bXAgPVxuICAgICAgdHlwZW9mIHZhbC5jb25zdHJ1Y3RvciA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gT2JqZWN0LmNyZWF0ZShPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsKSlcbiAgICAgICAgOiB7fTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB2YWwpIHtcbiAgICAgIGlmICh2YWwuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgICAvLyBkb24ndCBjb3B5IG5vbi1zZXJpYWxpemFibGUgb2JqZWN0cyBsaWtlIHRoZXNlIGNhY2hlcy4gVGhleSdsbCBiZVxuICAgICAgICAvLyBwb3B1bGF0ZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC5cbiAgICAgICAgaWYgKGRlcHRoID09PSAwICYmIChrZXkgPT09IFwic2hhcGVcIiB8fCBrZXkgPT09IFwiY2FudmFzXCIpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdG1wW2tleV0gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tleV0sIGRlcHRoICsgMSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0bXA7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB7XG4gICAgbGV0IGsgPSB2YWwubGVuZ3RoO1xuICAgIGNvbnN0IGFyciA9IG5ldyBBcnJheShrKTtcbiAgICB3aGlsZSAoay0tKSB7XG4gICAgICBhcnJba10gPSBkZWVwQ29weUVsZW1lbnQodmFsW2tdLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgICByZXR1cm4gYXJyO1xuICB9XG5cbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogRHVwbGljYXRlIGFuIGVsZW1lbnQsIG9mdGVuIHVzZWQgaW4gdGhlIGFsdC1kcmFnIG9wZXJhdGlvbi5cbiAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBoYXMgZ290dGVuIGEgYml0IGNvbXBsaWNhdGVkIHNpbmNlIHRoZVxuICogaW50cm9kdWN0aW9uIG9mIGdydW9waW5nL3VuZ3JvdXBpbmcgZWxlbWVudHMuXG4gKiBAcGFyYW0gZWRpdGluZ0dyb3VwSWQgVGhlIGN1cnJlbnQgZ3JvdXAgYmVpbmcgZWRpdGVkLiBUaGUgbmV3XG4gKiAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCB3aWxsIGluaGVyaXQgdGhpcyBncm91cCBhbmQgaXRzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5cbiAqIEBwYXJhbSBncm91cElkTWFwRm9yT3BlcmF0aW9uIEEgTWFwIHRoYXQgbWFwcyBvbGQgZ3JvdXAgSURzIHRvXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVkIG9uZXMuIElmIHlvdSBhcmUgZHVwbGljYXRpbmdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlIGVsZW1lbnRzIGF0IG9uY2UsIHNoYXJlIHRoaXMgbWFwXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbW9uZ3N0IGFsbCBvZiB0aGVtXG4gKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGR1cGxpY2F0ZVxuICogQHBhcmFtIG92ZXJyaWRlcyBBbnkgZWxlbWVudCBwcm9wZXJ0aWVzIHRvIG92ZXJyaWRlXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVFbGVtZW50ID0gPFRFbGVtZW50IGV4dGVuZHMgTXV0YWJsZTxFeGNhbGlkcmF3RWxlbWVudD4+KFxuICBlZGl0aW5nR3JvdXBJZDogQXBwU3RhdGVbXCJlZGl0aW5nR3JvdXBJZFwiXSxcbiAgZ3JvdXBJZE1hcEZvck9wZXJhdGlvbjogTWFwPEdyb3VwSWQsIEdyb3VwSWQ+LFxuICBlbGVtZW50OiBURWxlbWVudCxcbiAgb3ZlcnJpZGVzPzogUGFydGlhbDxURWxlbWVudD4sXG4pOiBURWxlbWVudCA9PiB7XG4gIGxldCBjb3B5OiBURWxlbWVudCA9IGRlZXBDb3B5RWxlbWVudChlbGVtZW50KTtcblxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICBjb3B5LmlkID0gYCR7Y29weS5pZH1fY29weWA7XG4gICAgLy8gYHdpbmRvdy5oYCBtYXkgbm90IGJlIGRlZmluZWQgaW4gc29tZSB1bml0IHRlc3RzXG4gICAgaWYgKFxuICAgICAgd2luZG93Lmg/LmFwcFxuICAgICAgICA/LmdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkKClcbiAgICAgICAgLmZpbmQoKGVsKSA9PiBlbC5pZCA9PT0gY29weS5pZClcbiAgICApIHtcbiAgICAgIGNvcHkuaWQgKz0gXCJfY29weVwiO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb3B5LmlkID0gcmFuZG9tSWQoKTtcbiAgfVxuICBjb3B5LmJvdW5kRWxlbWVudHMgPSBudWxsO1xuICBjb3B5LnVwZGF0ZWQgPSBnZXRVcGRhdGVkVGltZXN0YW1wKCk7XG4gIGNvcHkuc2VlZCA9IHJhbmRvbUludGVnZXIoKTtcbiAgY29weS5ncm91cElkcyA9IGdldE5ld0dyb3VwSWRzRm9yRHVwbGljYXRpb24oXG4gICAgY29weS5ncm91cElkcyxcbiAgICBlZGl0aW5nR3JvdXBJZCxcbiAgICAoZ3JvdXBJZCkgPT4ge1xuICAgICAgaWYgKCFncm91cElkTWFwRm9yT3BlcmF0aW9uLmhhcyhncm91cElkKSkge1xuICAgICAgICBncm91cElkTWFwRm9yT3BlcmF0aW9uLnNldChncm91cElkLCByYW5kb21JZCgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBncm91cElkTWFwRm9yT3BlcmF0aW9uLmdldChncm91cElkKSE7XG4gICAgfSxcbiAgKTtcbiAgaWYgKG92ZXJyaWRlcykge1xuICAgIGNvcHkgPSBPYmplY3QuYXNzaWduKGNvcHksIG92ZXJyaWRlcyk7XG4gIH1cbiAgcmV0dXJuIGNvcHk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/newElement.ts\n");
|
|
3475
3475
|
|
|
3476
3476
|
/***/ }),
|
|
3477
3477
|
|
|
@@ -3537,7 +3537,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3537
3537
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3538
3538
|
|
|
3539
3539
|
"use strict";
|
|
3540
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMaxContainerHeight\": () => (/* binding */ getMaxContainerHeight),\n/* harmony export */ \"getMaxContainerWidth\": () => (/* binding */ getMaxContainerWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getMaxContainerWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement));\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n if (container) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const centerX = textElement.x + textElement.width / 2;\n const centerY = textElement.y + textElement.height / 2;\n const diffWidth = metrics.width - textElement.width;\n const diffHeight = metrics.height - textElement.height;\n boundTextUpdates.x = centerY - (textElement.height + diffHeight) / 2;\n boundTextUpdates.y = centerX - (textElement.width + diffWidth) / 2;\n }\n else {\n const containerDims = getContainerDims(container);\n let maxContainerHeight = getMaxContainerHeight(container);\n let nextHeight = containerDims.height;\n if (metrics.height > maxContainerHeight) {\n nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n maxContainerHeight = getMaxContainerHeight(container);\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getMaxContainerWidth(container);\n const maxHeight = getMaxContainerHeight(container);\n let containerHeight = containerDims.height;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement));\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getMaxContainerHeight(container);\n const maxContainerWidth = getMaxContainerWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const height = getTextHeight(text, font);\n const width = getTextWidth(text, font);\n return { width, height };\n};\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight = {};\nconst getApproxLineHeight = (font) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n const fontSize = parseInt(font);\n // Calculate line height relative to font size\n cacheApproxLineHeight[font] = fontSize * 1.2;\n return cacheApproxLineHeight[font];\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, font) => {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeight = getApproxLineHeight(font);\n return lineHeight * lines.length;\n};\nconst wrapText = (text, font, maxWidth) => {\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n originalLines.forEach((originalLine) => {\n const words = originalLine.split(\" \");\n // This means its newline so push it\n if (words.length === 1 && words[0] === \"\") {\n lines.push(words[0]);\n return; // continue\n }\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n currentLineWidthTillNow = 0;\n currentLine = \"\";\n break;\n }\n index++;\n currentLine += `${word} `;\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n const word = currentLine.slice(0, -1);\n push(word);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n break;\n }\n }\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n }\n if (currentLine) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst getApproxMinLineWidth = (font) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getApproxMinLineHeight = (font) => {\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n const boundTextElement = getBoundTextElement(element);\n if (boundTextElement) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getMaxContainerWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerWidth = width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerWidth <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.width;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return containerWidth;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMaxContainerHeight = (container) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.height;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUM7S0FDekU7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ2hDLG9FQUFvRTtRQUNwRSw4RUFBOEU7UUFDOUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRywwREFBa0IsR0FBRyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxPQUFPLE1BQU0sR0FBRywwREFBa0IsR0FBRyxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HLCBURVhUX0FMSUdOLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc0Fycm93RWxlbWVudCB9IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXh0QmluZGFibGVDb250YWluZXIgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi9jb2xsaXNpb25cIjtcbmltcG9ydCB7XG4gIHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSxcbiAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZSxcbn0gZnJvbSBcIi4vdGV4dFd5c2l3eWdcIjtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdGV4dFxuICAgICAgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpXG4gICAgICAvLyBub3JtYWxpemUgbmV3bGluZXNcbiAgICAgIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZHJhd1RleHRCb3VuZGluZ0JveCA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pID0+IHtcbiAgbGV0IG1heFdpZHRoID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICB9O1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0LFxuICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICApO1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMud2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICBib3VuZFRleHRVcGRhdGVzLmhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgY29uc3QgY2VudGVyWCA9IHRleHRFbGVtZW50LnggKyB0ZXh0RWxlbWVudC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBjZW50ZXJZID0gdGV4dEVsZW1lbnQueSArIHRleHRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaWZmV2lkdGggPSBtZXRyaWNzLndpZHRoIC0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICBjb25zdCBkaWZmSGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgLSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBib3VuZFRleHRVcGRhdGVzLnggPSBjZW50ZXJZIC0gKHRleHRFbGVtZW50LmhlaWdodCArIGRpZmZIZWlnaHQpIC8gMjtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IGNlbnRlclggLSAodGV4dEVsZW1lbnQud2lkdGggKyBkaWZmV2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICAgIGxldCBtYXhDb250YWluZXJIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcblxuICAgICAgbGV0IG5leHRIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IG1heENvbnRhaW5lckhlaWdodCkge1xuICAgICAgICBuZXh0SGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgICBtZXRyaWNzLmhlaWdodCxcbiAgICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICAgKTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgICBtYXhDb250YWluZXJIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcbiAgICAgICAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQsIG5leHRIZWlnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID0ge1xuICAgICAgICAuLi50ZXh0RWxlbWVudCxcbiAgICAgICAgLi4uYm91bmRUZXh0VXBkYXRlcyxcbiAgICAgIH0gYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcjtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKGNvbnRhaW5lciwgdXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueCA9IHg7XG4gICAgICBib3VuZFRleHRVcGRhdGVzLnkgPSB5O1xuICAgIH1cbiAgfVxuXG4gIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIGJvdW5kVGV4dFVwZGF0ZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24gPSAoXG4gIHNjZW5lRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRJZFRvRHVwbGljYXRlZElkOiBNYXA8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSwgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXT4sXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2NlbmVFbGVtZW50TWFwID0gYXJyYXlUb01hcChzY2VuZUVsZW1lbnRzKSBhcyBNYXA8XG4gICAgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFxuICA+O1xuICBvbGRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgbmV3RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoZWxlbWVudC5pZCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgICAgaWYgKG5ld1RleHRFbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdDb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChlbGVtZW50LmJvdW5kRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGJvdW5kRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gbmV3VGV4dEVsZW1lbnRJZCAmJlxuICAgICAgICAgICAgICAgICAgYm91bmRFbGVtZW50LmlkICE9PSBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50ID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld1RleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQobmV3VGV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdUZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgY29udGFpbmVySWQ6IG5ld0NvbnRhaW5lciA/IG5ld0VsZW1lbnRJZCA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBjb250YWluZXI6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuKSA9PiB7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoY29udGFpbmVyLmlkKTtcbiAgbGV0IHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBpZiAodGV4dEVsZW1lbnQgJiYgdGV4dEVsZW1lbnQudGV4dCkge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShjb250YWluZXIpIS5nZXRFbGVtZW50KFxuICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICBsZXQgbmV4dEhlaWdodCA9IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICBsZXQgbmV4dFdpZHRoID0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gICAgbGV0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcIm5cIiAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInNcIikge1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBtZWFzdXJlVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSk7XG4gICAgICBuZXh0SGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICBuZXh0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuICAgIH1cbiAgICAvLyBpbmNyZWFzZSBoZWlnaHQgaW4gY2FzZSB0ZXh0IGVsZW1lbnQgaGVpZ2h0IGV4Y2VlZHNcbiAgICBpZiAobmV4dEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgbmV4dEhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaWZmID0gY29udGFpbmVySGVpZ2h0IC0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgICAvLyBmaXggdGhlIHkgY29vcmQgd2hlbiByZXNpemluZyBmcm9tIG5lL253L25cbiAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwiblwiKVxuICAgICAgICAgID8gY29udGFpbmVyLnkgLSBkaWZmXG4gICAgICAgICAgOiBjb250YWluZXIueTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIHRleHQsXG4gICAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNvbXB1dGVCb3VuZFRleHRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBjb250YWluZXJDb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoY29udGFpbmVyKTtcbiAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcblxuICBsZXQgeDtcbiAgbGV0IHk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLlRPUCkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueTtcbiAgfSBlbHNlIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueSArIChtYXhDb250YWluZXJIZWlnaHQgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgeSA9XG4gICAgICBjb250YWluZXJDb29yZHMueSArXG4gICAgICAobWF4Q29udGFpbmVySGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMik7XG4gIH1cbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLkxFRlQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLng7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLnggKyAobWF4Q29udGFpbmVyV2lkdGggLSBib3VuZFRleHRFbGVtZW50LndpZHRoKTtcbiAgfSBlbHNlIHtcbiAgICB4ID1cbiAgICAgIGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyKTtcbiAgfVxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICB0ZXh0ID0gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC8vIHJlcGxhY2UgZW1wdHkgbGluZXMgd2l0aCBzaW5nbGUgc3BhY2UgYmVjYXVzZSBsZWFkaW5nL3RyYWlsaW5nIGVtcHR5XG4gICAgLy8gbGluZXMgd291bGQgYmUgc3RyaXBwZWQgZnJvbSBjb21wdXRhdGlvblxuICAgIC5tYXAoKHgpID0+IHggfHwgXCIgXCIpXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3QgaGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBmb250KTtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7XG5cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xufTtcblxuY29uc3QgRFVNTVlfVEVYVCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XCIudG9Mb2NhbGVVcHBlckNhc2UoKTtcbmNvbnN0IGNhY2hlQXBwcm94TGluZUhlaWdodDogeyBba2V5OiBGb250U3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveExpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdKSB7XG4gICAgcmV0dXJuIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XTtcbiAgfVxuICBjb25zdCBmb250U2l6ZSA9IHBhcnNlSW50KGZvbnQpO1xuXG4gIC8vIENhbGN1bGF0ZSBsaW5lIGhlaWdodCByZWxhdGl2ZSB0byBmb250IHNpemVcbiAgY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdID0gZm9udFNpemUgKiAxLjI7XG4gIHJldHVybiBjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF07XG59O1xuXG5sZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0TGluZVdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcbiAgY29uc3Qgd2lkdGggPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG5cbiAgLy8gc2luY2UgaW4gdGVzdCBlbnYgdGhlIGNhbnZhcyBtZWFzdXJlVGV4dCBhbGdvXG4gIC8vIGRvZXNuJ3QgbWVhc3VyZSB0ZXh0IGFuZCBpbnN0ZWFkIGp1c3QgcmV0dXJucyBudW1iZXIgb2ZcbiAgLy8gY2hhcmFjdGVycyBoZW5jZSB3ZSBhc3N1bWUgdGhhdCBlYWNoIGxldHRlcmlzIDEwcHhcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIHdpZHRoICogMTA7XG4gIH1cbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRIZWlnaHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChmb250KTtcbiAgcmV0dXJuIGxpbmVIZWlnaHQgKiBsaW5lcy5sZW5ndGg7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGxpbmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbnN0IG9yaWdpbmFsTGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBzcGFjZVdpZHRoID0gZ2V0TGluZVdpZHRoKFwiIFwiLCBmb250KTtcbiAgY29uc3QgcHVzaCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgIGlmIChzdHIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgfVxuICB9O1xuICBvcmlnaW5hbExpbmVzLmZvckVhY2goKG9yaWdpbmFsTGluZSkgPT4ge1xuICAgIGNvbnN0IHdvcmRzID0gb3JpZ2luYWxMaW5lLnNwbGl0KFwiIFwiKTtcbiAgICAvLyBUaGlzIG1lYW5zIGl0cyBuZXdsaW5lIHNvIHB1c2ggaXRcbiAgICBpZiAod29yZHMubGVuZ3RoID09PSAxICYmIHdvcmRzWzBdID09PSBcIlwiKSB7XG4gICAgICBsaW5lcy5wdXNoKHdvcmRzWzBdKTtcbiAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldExpbmVXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdoZW4gc2luZ2xlIHdvcmQgdGFrZXMgZW50aXJlIHdpZHRoXG4gICAgICBpZiAoY3VycmVudFdvcmRXaWR0aCA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgcHVzaCh3b3Jkc1tpbmRleF0pO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFydCBicmVha2luZyBsb25nZXIgd29yZHMgZXhjZWVkaW5nIG1heCB3aWR0aFxuICAgICAgZWxzZSBpZiAoY3VycmVudFdvcmRXaWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIHNpbmNlIHRoZSBjdXJyZW50IHdvcmQgZXhjZWVkcyB0aGUgbWF4IHdpZHRoXG4gICAgICAgIC8vIHNvIHdpbGwgYmUgYXBwZW5kZWQgaW4gbmV4dCBsaW5lXG4gICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICAgICAgICB3aGlsZSAod29yZHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgICAgd29yZHNbaW5kZXhdLmNvZGVQb2ludEF0KDApISxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2hhcldpZHRoLmNhbGN1bGF0ZShjdXJyZW50Q2hhciwgZm9udCk7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gd2lkdGg7XG4gICAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZHNbaW5kZXhdLnNsaWNlKGN1cnJlbnRDaGFyLmxlbmd0aCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lXG4gICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB3b3JkID0gd29yZHNbaW5kZXhdO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0TGluZVdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPiBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAke3dvcmR9IGA7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB3b3JkIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICBwdXNoKHdvcmQpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyZW50TGluZSkge1xuICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGFyV2lkdGggPSAoKCkgPT4ge1xuICBjb25zdCBjYWNoZWRDaGFyV2lkdGg6IHsgW2tleTogRm9udFN0cmluZ106IEFycmF5PG51bWJlcj4gfSA9IHt9O1xuXG4gIGNvbnN0IGNhbGN1bGF0ZSA9IChjaGFyOiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICBjb25zdCBhc2NpaSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XSkge1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdID0gW107XG4gICAgfVxuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSkge1xuICAgICAgY29uc3Qgd2lkdGggPSBnZXRMaW5lV2lkdGgoY2hhciwgZm9udCk7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q2FjaGUgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF07XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlLFxuICAgIGdldENhY2hlLFxuICB9O1xufSkoKTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1heENoYXJXaWR0aCA9IGdldE1heENoYXJXaWR0aChmb250KTtcbiAgaWYgKG1heENoYXJXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBtZWFzdXJlVGV4dChEVU1NWV9URVhULnNwbGl0KFwiXCIpLmpvaW4oXCJcXG5cIiksIGZvbnQpLndpZHRoICtcbiAgICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICApO1xuICB9XG4gIHJldHVybiBtYXhDaGFyV2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIE1hdGgubWF4KC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0TGluZVdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8ubGVuZ3RoXG4gICAgPyBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZCB8fFxuICAgICAgICBudWxsXG4gICAgOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcikgfHwgbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRWxlbWVudCA9IChcbiAgZWxlbWVudDpcbiAgICB8IChFeGNhbGlkcmF3RWxlbWVudCAmIHtcbiAgICAgICAgY29udGFpbmVySWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gfCBudWxsO1xuICAgICAgfSlcbiAgICB8IG51bGwsXG4pID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5jb250YWluZXJJZCkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJEaW1zID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IE1JTl9XSURUSCA9IDMwMDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChlbGVtZW50LndpZHRoLCBNSU5fV0lEVEgpO1xuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuICByZXR1cm4geyB3aWR0aDogZWxlbWVudC53aWR0aCwgaGVpZ2h0OiBlbGVtZW50LmhlaWdodCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckNlbnRlciA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjb250YWluZXIueCArIGNvbnRhaW5lci53aWR0aCAvIDIsXG4gICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhjb250YWluZXIpO1xuICBpZiAocG9pbnRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY29udGFpbmVyLnBvaW50cy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBtaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGNvbnRhaW5lci5wb2ludHNbaW5kZXhdLFxuICAgICk7XG4gICAgcmV0dXJuIHsgeDogbWlkUG9pbnRbMF0sIHk6IG1pZFBvaW50WzFdIH07XG4gIH1cbiAgY29uc3QgaW5kZXggPSBjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIgLSAxO1xuICBsZXQgbWlkU2VnbWVudE1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoXG4gICAgY29udGFpbmVyLFxuICAgIGFwcFN0YXRlLFxuICApW2luZGV4XTtcbiAgaWYgKCFtaWRTZWdtZW50TWlkcG9pbnQpIHtcbiAgICBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBvaW50c1tpbmRleF0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgIGluZGV4ICsgMSxcbiAgICApO1xuICB9XG4gIHJldHVybiB7IHg6IG1pZFNlZ21lbnRNaWRwb2ludFswXSwgeTogbWlkU2VnbWVudE1pZHBvaW50WzFdIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ29vcmRzID0gKGNvbnRhaW5lcjogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGxldCBvZmZzZXRYID0gQk9VTkRfVEVYVF9QQURESU5HO1xuICBsZXQgb2Zmc2V0WSA9IEJPVU5EX1RFWFRfUEFERElORztcblxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgLy8gVGhlIGRlcml2YXRpb24gb2YgY29vcmRpbmF0ZXMgaXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MTcyXG4gICAgb2Zmc2V0WCArPSAoY29udGFpbmVyLndpZHRoIC8gMikgKiAoMSAtIE1hdGguc3FydCgyKSAvIDIpO1xuICAgIG9mZnNldFkgKz0gKGNvbnRhaW5lci5oZWlnaHQgLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gIH1cbiAgLy8gVGhlIGRlcml2YXRpb24gb2YgY29vcmRpbmF0ZXMgaXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MjY1XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICBvZmZzZXRYICs9IGNvbnRhaW5lci53aWR0aCAvIDQ7XG4gICAgb2Zmc2V0WSArPSBjb250YWluZXIuaGVpZ2h0IC8gNDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IGNvbnRhaW5lci54ICsgb2Zmc2V0WCxcbiAgICB5OiBjb250YWluZXIueSArIG9mZnNldFksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEVsZW1lbnRBbmdsZSA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHRleHRFbGVtZW50LmFuZ2xlO1xuICB9XG4gIHJldHVybiBjb250YWluZXIuYW5nbGU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCA9IChcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCAhYm91bmRUZXh0RWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORyAqIDg7XG4gIH1cblxuICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFsbG93VmVydGljYWxBbGlnbiA9IChcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGhhc0JvdW5kQ29udGFpbmVyID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIGlmIChoYXNCb3VuZENvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbiA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lciB8IG51bGwgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSwgZmFsc2UpXG4gICAgICA/IHNlbGVjdGVkRWxlbWVudHNbMF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBsZXQgaGl0RWxlbWVudCA9IG51bGw7XG4gIC8vIFdlIG5lZWQgdG8gdG8gaGl0IHRlc3RpbmcgZnJvbSBmcm9udCAoZW5kIG9mIHRoZSBhcnJheSkgdG8gYmFjayAoYmVnaW5uaW5nIG9mIHRoZSBhcnJheSlcbiAgZm9yIChsZXQgaW5kZXggPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KSB7XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XS5pc0RlbGV0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnRzW2luZGV4XSk7XG4gICAgaWYgKFxuICAgICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudHNbaW5kZXhdKSAmJlxuICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudHNbaW5kZXhdLCBhcHBTdGF0ZSwgW1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHgxIDwgeCAmJiB4IDwgeDIgJiYgeTEgPCB5ICYmIHkgPCB5Mikge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihoaXRFbGVtZW50LCBmYWxzZSkgPyBoaXRFbGVtZW50IDogbnVsbDtcbn07XG5cbmNvbnN0IFZBTElEX0NPTlRBSU5FUl9UWVBFUyA9IG5ldyBTZXQoW1xuICBcInJlY3RhbmdsZVwiLFxuICBcImVsbGlwc2VcIixcbiAgXCJkaWFtb25kXCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJhcnJvd1wiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGV4dENvbnRhaW5lciA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgVkFMSURfQ09OVEFJTkVSX1RZUEVTLmhhcyhlbGVtZW50LnR5cGUpO1xuXG5leHBvcnQgY29uc3QgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCA9IChcbiAgZGltZW5zaW9uOiBudW1iZXIsXG4gIGNvbnRhaW5lclR5cGU6IEV4dHJhY3RTZXRUeXBlPHR5cGVvZiBWQUxJRF9DT05UQUlORVJfVFlQRVM+LFxuKSA9PiB7XG4gIGRpbWVuc2lvbiA9IE1hdGguY2VpbChkaW1lbnNpb24pO1xuICBjb25zdCBwYWRkaW5nID0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoKGRpbWVuc2lvbiArIHBhZGRpbmcpIC8gTWF0aC5zcXJ0KDIpKSAqIDIpO1xuICB9XG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZyAqIDg7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgcmV0dXJuIDIgKiAoZGltZW5zaW9uICsgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIGRpbWVuc2lvbiArIHBhZGRpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q29udGFpbmVyV2lkdGggPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS53aWR0aDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHdpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoIDw9IDApIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kVGV4dC53aWR0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpZHRoO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhbiBlbGxpcHNlIGlzXG4gICAgLy8gTWF0aC5yb3VuZCgoZWxsaXBzZS53aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC1odHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKCh3aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIHJldHVybiB3aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q29udGFpbmVySGVpZ2h0ID0gKGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgaGVpZ2h0ID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpLmhlaWdodDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBoZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICBpZiAoY29udGFpbmVySGVpZ2h0IDw9IDApIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kVGV4dC5oZWlnaHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgfVxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2UuaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIHdoaWNoIGlzIGRlcml2ZWQgZnJvbVxuICAgIC8vIGVxdWF0aW9uIG9mIGFuIGVsbGlwc2UgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKChoZWlnaHQgLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGEgcmhvbWJ1cyBpc1xuICAgIC8vIE1hdGgucm91bmQoaGVpZ2h0IC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3540
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\n/* harmony export */ \"getApproxLineHeight\": () => (/* binding */ getApproxLineHeight),\n/* harmony export */ \"getApproxMinLineHeight\": () => (/* binding */ getApproxMinLineHeight),\n/* harmony export */ \"getApproxMinLineWidth\": () => (/* binding */ getApproxMinLineWidth),\n/* harmony export */ \"getBoundTextElement\": () => (/* binding */ getBoundTextElement),\n/* harmony export */ \"getBoundTextElementId\": () => (/* binding */ getBoundTextElementId),\n/* harmony export */ \"getBoundTextElementOffset\": () => (/* binding */ getBoundTextElementOffset),\n/* harmony export */ \"getBoundTextElementPosition\": () => (/* binding */ getBoundTextElementPosition),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMaxContainerHeight\": () => (/* binding */ getMaxContainerHeight),\n/* harmony export */ \"getMaxContainerWidth\": () => (/* binding */ getMaxContainerWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\n/* harmony export */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\n\n\n\n\n\n\n\n\n\n\n\nconst normalizeText = (text) => {\n return (text\n // replace tabs with spaces so they render and measure correctly\n .replace(/\\t/g, \" \")\n // normalize newlines\n .replace(/\\r?\\n|\\r/g, \"\\n\"));\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getMaxContainerWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement));\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n if (container) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const centerX = textElement.x + textElement.width / 2;\n const centerY = textElement.y + textElement.height / 2;\n const diffWidth = metrics.width - textElement.width;\n const diffHeight = metrics.height - textElement.height;\n boundTextUpdates.x = centerY - (textElement.height + diffHeight) / 2;\n boundTextUpdates.y = centerX - (textElement.width + diffWidth) / 2;\n }\n else {\n const containerDims = getContainerDims(container);\n let maxContainerHeight = getMaxContainerHeight(container);\n let nextHeight = containerDims.height;\n if (metrics.height > maxContainerHeight) {\n nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n maxContainerHeight = getMaxContainerHeight(container);\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getMaxContainerWidth(container);\n const maxHeight = getMaxContainerHeight(container);\n let containerHeight = containerDims.height;\n if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n if (text) {\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const dimensions = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement));\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getMaxContainerHeight(container);\n const maxContainerWidth = getMaxContainerWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font) => {\n text = text\n .split(\"\\n\")\n // replace empty lines with single space because leading/trailing empty\n // lines would be stripped from computation\n .map((x) => x || \" \")\n .join(\"\\n\");\n const height = getTextHeight(text, font);\n const width = getTextWidth(text, font);\n return { width, height };\n};\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight = {};\nconst getApproxLineHeight = (font) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n const fontSize = parseInt(font);\n // Calculate line height relative to font size\n cacheApproxLineHeight[font] = fontSize * 1.2;\n return cacheApproxLineHeight[font];\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, font) => {\n const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n const lineHeight = getApproxLineHeight(font);\n return lineHeight * lines.length;\n};\nconst wrapText = (text, font, maxWidth) => {\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n originalLines.forEach((originalLine) => {\n const words = originalLine.split(\" \");\n // This means its newline so push it\n if (words.length === 1 && words[0] === \"\") {\n lines.push(words[0]);\n return; // continue\n }\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n else {\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n currentLineWidthTillNow = 0;\n currentLine = \"\";\n break;\n }\n index++;\n currentLine += `${word} `;\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n const word = currentLine.slice(0, -1);\n push(word);\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n break;\n }\n }\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n }\n if (currentLine) {\n // only remove last trailing space which we have added when joining words\n if (currentLine.slice(-1) === \" \") {\n currentLine = currentLine.slice(0, -1);\n }\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst getApproxMinLineWidth = (font) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\n _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2);\n }\n return maxCharWidth + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getApproxMinLineHeight = (font) => {\n return getApproxLineHeight(font) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n const boundTextElement = getBoundTextElement(element);\n if (boundTextElement) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getMaxContainerWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerWidth = width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerWidth <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.width;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return containerWidth;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getMaxContainerHeight = (container) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n const boundText = getBoundTextElement(container);\n if (boundText) {\n return boundText.height;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUM7S0FDekU7SUFDRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFO1FBQ2hDLG9FQUFvRTtRQUNwRSw4RUFBOEU7UUFDOUUsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRywwREFBa0IsR0FBRyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxPQUFPLE1BQU0sR0FBRywwREFBa0IsR0FBRyxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HLCBURVhUX0FMSUdOLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgaXNCb3VuZFRvQ29udGFpbmVyLCBpc0Fycm93RWxlbWVudCB9IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXh0QmluZGFibGVDb250YWluZXIgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi9jb2xsaXNpb25cIjtcbmltcG9ydCB7XG4gIHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSxcbiAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZSxcbn0gZnJvbSBcIi4vdGV4dFd5c2l3eWdcIjtcbmltcG9ydCB7IEV4dHJhY3RTZXRUeXBlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdGV4dFxuICAgICAgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpXG4gICAgICAvLyBub3JtYWxpemUgbmV3bGluZXNcbiAgICAgIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZHJhd1RleHRCb3VuZGluZ0JveCA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pID0+IHtcbiAgbGV0IG1heFdpZHRoID0gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICB9O1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG5cbiAgaWYgKGNvbnRhaW5lcikge1xuICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0LFxuICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICApO1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMud2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICBib3VuZFRleHRVcGRhdGVzLmhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgY29uc3QgY2VudGVyWCA9IHRleHRFbGVtZW50LnggKyB0ZXh0RWxlbWVudC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBjZW50ZXJZID0gdGV4dEVsZW1lbnQueSArIHRleHRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaWZmV2lkdGggPSBtZXRyaWNzLndpZHRoIC0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICBjb25zdCBkaWZmSGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgLSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBib3VuZFRleHRVcGRhdGVzLnggPSBjZW50ZXJZIC0gKHRleHRFbGVtZW50LmhlaWdodCArIGRpZmZIZWlnaHQpIC8gMjtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IGNlbnRlclggLSAodGV4dEVsZW1lbnQud2lkdGggKyBkaWZmV2lkdGgpIC8gMjtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICAgIGxldCBtYXhDb250YWluZXJIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcblxuICAgICAgbGV0IG5leHRIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIGlmIChtZXRyaWNzLmhlaWdodCA+IG1heENvbnRhaW5lckhlaWdodCkge1xuICAgICAgICBuZXh0SGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgICBtZXRyaWNzLmhlaWdodCxcbiAgICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICAgKTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgICBtYXhDb250YWluZXJIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcbiAgICAgICAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQsIG5leHRIZWlnaHQpO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID0ge1xuICAgICAgICAuLi50ZXh0RWxlbWVudCxcbiAgICAgICAgLi4uYm91bmRUZXh0VXBkYXRlcyxcbiAgICAgIH0gYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcjtcbiAgICAgIGNvbnN0IHsgeCwgeSB9ID0gY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKGNvbnRhaW5lciwgdXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIGJvdW5kVGV4dFVwZGF0ZXMueCA9IHg7XG4gICAgICBib3VuZFRleHRVcGRhdGVzLnkgPSB5O1xuICAgIH1cbiAgfVxuXG4gIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIGJvdW5kVGV4dFVwZGF0ZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24gPSAoXG4gIHNjZW5lRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRJZFRvRHVwbGljYXRlZElkOiBNYXA8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSwgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXT4sXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2NlbmVFbGVtZW50TWFwID0gYXJyYXlUb01hcChzY2VuZUVsZW1lbnRzKSBhcyBNYXA8XG4gICAgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFxuICA+O1xuICBvbGRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgbmV3RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoZWxlbWVudC5pZCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgICAgaWYgKG5ld1RleHRFbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdDb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChlbGVtZW50LmJvdW5kRWxlbWVudHMgfHwgW10pXG4gICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGJvdW5kRWxlbWVudCkgPT5cbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gbmV3VGV4dEVsZW1lbnRJZCAmJlxuICAgICAgICAgICAgICAgICAgYm91bmRFbGVtZW50LmlkICE9PSBib3VuZFRleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgLmNvbmNhdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgICAgaWQ6IG5ld1RleHRFbGVtZW50SWQsXG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50ID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld1RleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQobmV3VGV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdUZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgY29udGFpbmVySWQ6IG5ld0NvbnRhaW5lciA/IG5ld0VsZW1lbnRJZCA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBjb250YWluZXI6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuKSA9PiB7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoY29udGFpbmVyLmlkKTtcbiAgbGV0IHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBpZiAodGV4dEVsZW1lbnQgJiYgdGV4dEVsZW1lbnQudGV4dCkge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShjb250YWluZXIpIS5nZXRFbGVtZW50KFxuICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICBsZXQgbmV4dEhlaWdodCA9IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICBsZXQgbmV4dFdpZHRoID0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gICAgbGV0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcIm5cIiAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInNcIikge1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRpbWVuc2lvbnMgPSBtZWFzdXJlVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSk7XG4gICAgICBuZXh0SGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICBuZXh0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuICAgIH1cbiAgICAvLyBpbmNyZWFzZSBoZWlnaHQgaW4gY2FzZSB0ZXh0IGVsZW1lbnQgaGVpZ2h0IGV4Y2VlZHNcbiAgICBpZiAobmV4dEhlaWdodCA+IG1heEhlaWdodCkge1xuICAgICAgY29udGFpbmVySGVpZ2h0ID0gY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dChcbiAgICAgICAgbmV4dEhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuXG4gICAgICBjb25zdCBkaWZmID0gY29udGFpbmVySGVpZ2h0IC0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgICAvLyBmaXggdGhlIHkgY29vcmQgd2hlbiByZXNpemluZyBmcm9tIG5lL253L25cbiAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwiblwiKVxuICAgICAgICAgID8gY29udGFpbmVyLnkgLSBkaWZmXG4gICAgICAgICAgOiBjb250YWluZXIueTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIHRleHQsXG4gICAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbmNvbnN0IGNvbXB1dGVCb3VuZFRleHRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBjb250YWluZXJDb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoY29udGFpbmVyKTtcbiAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcblxuICBsZXQgeDtcbiAgbGV0IHk7XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLlRPUCkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueTtcbiAgfSBlbHNlIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgIHkgPSBjb250YWluZXJDb29yZHMueSArIChtYXhDb250YWluZXJIZWlnaHQgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCk7XG4gIH0gZWxzZSB7XG4gICAgeSA9XG4gICAgICBjb250YWluZXJDb29yZHMueSArXG4gICAgICAobWF4Q29udGFpbmVySGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMik7XG4gIH1cbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLkxFRlQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLng7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFQpIHtcbiAgICB4ID0gY29udGFpbmVyQ29vcmRzLnggKyAobWF4Q29udGFpbmVyV2lkdGggLSBib3VuZFRleHRFbGVtZW50LndpZHRoKTtcbiAgfSBlbHNlIHtcbiAgICB4ID1cbiAgICAgIGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyKTtcbiAgfVxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICB0ZXh0ID0gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC8vIHJlcGxhY2UgZW1wdHkgbGluZXMgd2l0aCBzaW5nbGUgc3BhY2UgYmVjYXVzZSBsZWFkaW5nL3RyYWlsaW5nIGVtcHR5XG4gICAgLy8gbGluZXMgd291bGQgYmUgc3RyaXBwZWQgZnJvbSBjb21wdXRhdGlvblxuICAgIC5tYXAoKHgpID0+IHggfHwgXCIgXCIpXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgY29uc3QgaGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBmb250KTtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7XG5cbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xufTtcblxuY29uc3QgRFVNTVlfVEVYVCA9IFwiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVowMTIzNDU2Nzg5XCIudG9Mb2NhbGVVcHBlckNhc2UoKTtcbmNvbnN0IGNhY2hlQXBwcm94TGluZUhlaWdodDogeyBba2V5OiBGb250U3RyaW5nXTogbnVtYmVyIH0gPSB7fTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveExpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdKSB7XG4gICAgcmV0dXJuIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XTtcbiAgfVxuICBjb25zdCBmb250U2l6ZSA9IHBhcnNlSW50KGZvbnQpO1xuXG4gIC8vIENhbGN1bGF0ZSBsaW5lIGhlaWdodCByZWxhdGl2ZSB0byBmb250IHNpemVcbiAgY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdID0gZm9udFNpemUgKiAxLjI7XG4gIHJldHVybiBjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF07XG59O1xuXG5sZXQgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IHVuZGVmaW5lZDtcblxuY29uc3QgZ2V0TGluZVdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcbiAgY29uc3Qgd2lkdGggPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCkud2lkdGg7XG5cbiAgLy8gc2luY2UgaW4gdGVzdCBlbnYgdGhlIGNhbnZhcyBtZWFzdXJlVGV4dCBhbGdvXG4gIC8vIGRvZXNuJ3QgbWVhc3VyZSB0ZXh0IGFuZCBpbnN0ZWFkIGp1c3QgcmV0dXJucyBudW1iZXIgb2ZcbiAgLy8gY2hhcmFjdGVycyBoZW5jZSB3ZSBhc3N1bWUgdGhhdCBlYWNoIGxldHRlcmlzIDEwcHhcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIHdpZHRoICogMTA7XG4gIH1cbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgbGluZXMgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbj8vZywgXCJcXG5cIikuc3BsaXQoXCJcXG5cIik7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRIZWlnaHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gdGV4dC5yZXBsYWNlKC9cXHJcXG4/L2csIFwiXFxuXCIpLnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBsaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChmb250KTtcbiAgcmV0dXJuIGxpbmVIZWlnaHQgKiBsaW5lcy5sZW5ndGg7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGxpbmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbnN0IG9yaWdpbmFsTGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBzcGFjZVdpZHRoID0gZ2V0TGluZVdpZHRoKFwiIFwiLCBmb250KTtcbiAgY29uc3QgcHVzaCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgIGlmIChzdHIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgfVxuICB9O1xuICBvcmlnaW5hbExpbmVzLmZvckVhY2goKG9yaWdpbmFsTGluZSkgPT4ge1xuICAgIGNvbnN0IHdvcmRzID0gb3JpZ2luYWxMaW5lLnNwbGl0KFwiIFwiKTtcbiAgICAvLyBUaGlzIG1lYW5zIGl0cyBuZXdsaW5lIHNvIHB1c2ggaXRcbiAgICBpZiAod29yZHMubGVuZ3RoID09PSAxICYmIHdvcmRzWzBdID09PSBcIlwiKSB7XG4gICAgICBsaW5lcy5wdXNoKHdvcmRzWzBdKTtcbiAgICAgIHJldHVybjsgLy8gY29udGludWVcbiAgICB9XG4gICAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBsZXQgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldExpbmVXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuICAgICAgLy8gVGhpcyB3aWxsIG9ubHkgaGFwcGVuIHdoZW4gc2luZ2xlIHdvcmQgdGFrZXMgZW50aXJlIHdpZHRoXG4gICAgICBpZiAoY3VycmVudFdvcmRXaWR0aCA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgcHVzaCh3b3Jkc1tpbmRleF0pO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuXG4gICAgICAvLyBTdGFydCBicmVha2luZyBsb25nZXIgd29yZHMgZXhjZWVkaW5nIG1heCB3aWR0aFxuICAgICAgZWxzZSBpZiAoY3VycmVudFdvcmRXaWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIHNpbmNlIHRoZSBjdXJyZW50IHdvcmQgZXhjZWVkcyB0aGUgbWF4IHdpZHRoXG4gICAgICAgIC8vIHNvIHdpbGwgYmUgYXBwZW5kZWQgaW4gbmV4dCBsaW5lXG4gICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICAgICAgICB3aGlsZSAod29yZHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhciA9IFN0cmluZy5mcm9tQ29kZVBvaW50KFxuICAgICAgICAgICAgd29yZHNbaW5kZXhdLmNvZGVQb2ludEF0KDApISxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2hhcldpZHRoLmNhbGN1bGF0ZShjdXJyZW50Q2hhciwgZm9udCk7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gd2lkdGg7XG4gICAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZHNbaW5kZXhdLnNsaWNlKGN1cnJlbnRDaGFyLmxlbmd0aCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgICAgICAgIGlmIChjdXJyZW50TGluZS5zbGljZSgtMSkgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lXG4gICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTdGFydCBhcHBlbmRpbmcgd29yZHMgaW4gYSBsaW5lIHRpbGwgbWF4IHdpZHRoIHJlYWNoZWRcbiAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCB3b3JkID0gd29yZHNbaW5kZXhdO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gZ2V0TGluZVdpZHRoKGN1cnJlbnRMaW5lICsgd29yZCwgZm9udCk7XG5cbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPiBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAke3dvcmR9IGA7XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB3b3JkIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICBwdXNoKHdvcmQpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9PT0gbWF4V2lkdGgpIHtcbiAgICAgICAgICBjdXJyZW50TGluZSA9IFwiXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjdXJyZW50TGluZSkge1xuICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICB9XG4gICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGFyV2lkdGggPSAoKCkgPT4ge1xuICBjb25zdCBjYWNoZWRDaGFyV2lkdGg6IHsgW2tleTogRm9udFN0cmluZ106IEFycmF5PG51bWJlcj4gfSA9IHt9O1xuXG4gIGNvbnN0IGNhbGN1bGF0ZSA9IChjaGFyOiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICBjb25zdCBhc2NpaSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XSkge1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdID0gW107XG4gICAgfVxuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSkge1xuICAgICAgY29uc3Qgd2lkdGggPSBnZXRMaW5lV2lkdGgoY2hhciwgZm9udCk7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q2FjaGUgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF07XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlLFxuICAgIGdldENhY2hlLFxuICB9O1xufSkoKTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IG1heENoYXJXaWR0aCA9IGdldE1heENoYXJXaWR0aChmb250KTtcbiAgaWYgKG1heENoYXJXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBtZWFzdXJlVGV4dChEVU1NWV9URVhULnNwbGl0KFwiXCIpLmpvaW4oXCJcXG5cIiksIGZvbnQpLndpZHRoICtcbiAgICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICApO1xuICB9XG4gIHJldHVybiBtYXhDaGFyV2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIE1hdGgubWF4KC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0TGluZVdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8ubGVuZ3RoXG4gICAgPyBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZCB8fFxuICAgICAgICBudWxsXG4gICAgOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcikgfHwgbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRWxlbWVudCA9IChcbiAgZWxlbWVudDpcbiAgICB8IChFeGNhbGlkcmF3RWxlbWVudCAmIHtcbiAgICAgICAgY29udGFpbmVySWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gfCBudWxsO1xuICAgICAgfSlcbiAgICB8IG51bGwsXG4pID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5jb250YWluZXJJZCkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJEaW1zID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IE1JTl9XSURUSCA9IDMwMDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChlbGVtZW50LndpZHRoLCBNSU5fV0lEVEgpO1xuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuICByZXR1cm4geyB3aWR0aDogZWxlbWVudC53aWR0aCwgaGVpZ2h0OiBlbGVtZW50LmhlaWdodCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckNlbnRlciA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjb250YWluZXIueCArIGNvbnRhaW5lci53aWR0aCAvIDIsXG4gICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhjb250YWluZXIpO1xuICBpZiAocG9pbnRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY29udGFpbmVyLnBvaW50cy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBtaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGNvbnRhaW5lci5wb2ludHNbaW5kZXhdLFxuICAgICk7XG4gICAgcmV0dXJuIHsgeDogbWlkUG9pbnRbMF0sIHk6IG1pZFBvaW50WzFdIH07XG4gIH1cbiAgY29uc3QgaW5kZXggPSBjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIgLSAxO1xuICBsZXQgbWlkU2VnbWVudE1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoXG4gICAgY29udGFpbmVyLFxuICAgIGFwcFN0YXRlLFxuICApW2luZGV4XTtcbiAgaWYgKCFtaWRTZWdtZW50TWlkcG9pbnQpIHtcbiAgICBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBvaW50c1tpbmRleF0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgIGluZGV4ICsgMSxcbiAgICApO1xuICB9XG4gIHJldHVybiB7IHg6IG1pZFNlZ21lbnRNaWRwb2ludFswXSwgeTogbWlkU2VnbWVudE1pZHBvaW50WzFdIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ29vcmRzID0gKGNvbnRhaW5lcjogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGxldCBvZmZzZXRYID0gQk9VTkRfVEVYVF9QQURESU5HO1xuICBsZXQgb2Zmc2V0WSA9IEJPVU5EX1RFWFRfUEFERElORztcblxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgLy8gVGhlIGRlcml2YXRpb24gb2YgY29vcmRpbmF0ZXMgaXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MTcyXG4gICAgb2Zmc2V0WCArPSAoY29udGFpbmVyLndpZHRoIC8gMikgKiAoMSAtIE1hdGguc3FydCgyKSAvIDIpO1xuICAgIG9mZnNldFkgKz0gKGNvbnRhaW5lci5oZWlnaHQgLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gIH1cbiAgLy8gVGhlIGRlcml2YXRpb24gb2YgY29vcmRpbmF0ZXMgaXMgZXhwbGFpbmVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MjY1XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICBvZmZzZXRYICs9IGNvbnRhaW5lci53aWR0aCAvIDQ7XG4gICAgb2Zmc2V0WSArPSBjb250YWluZXIuaGVpZ2h0IC8gNDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6IGNvbnRhaW5lci54ICsgb2Zmc2V0WCxcbiAgICB5OiBjb250YWluZXIueSArIG9mZnNldFksXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEVsZW1lbnRBbmdsZSA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHRleHRFbGVtZW50LmFuZ2xlO1xuICB9XG4gIHJldHVybiBjb250YWluZXIuYW5nbGU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCA9IChcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCAhYm91bmRUZXh0RWxlbWVudCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORyAqIDg7XG4gIH1cblxuICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEJvdW5kVGV4dEVsZW1lbnRQb3NpdGlvbihcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQsXG4gICAgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHNob3VsZEFsbG93VmVydGljYWxBbGlnbiA9IChcbiAgc2VsZWN0ZWRFbGVtZW50czogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pID0+IHtcbiAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IGhhc0JvdW5kQ29udGFpbmVyID0gaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpO1xuICAgIGlmIChoYXNCb3VuZENvbnRhaW5lcikge1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgIGlmIChpc1RleHRFbGVtZW50KGVsZW1lbnQpICYmIGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuICAgIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEJpbmRhYmxlQ29udGFpbmVyQXRQb3NpdGlvbiA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4pOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lciB8IG51bGwgPT4ge1xuICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSwgZmFsc2UpXG4gICAgICA/IHNlbGVjdGVkRWxlbWVudHNbMF1cbiAgICAgIDogbnVsbDtcbiAgfVxuICBsZXQgaGl0RWxlbWVudCA9IG51bGw7XG4gIC8vIFdlIG5lZWQgdG8gdG8gaGl0IHRlc3RpbmcgZnJvbSBmcm9udCAoZW5kIG9mIHRoZSBhcnJheSkgdG8gYmFjayAoYmVnaW5uaW5nIG9mIHRoZSBhcnJheSlcbiAgZm9yIChsZXQgaW5kZXggPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpbmRleCA+PSAwOyAtLWluZGV4KSB7XG4gICAgaWYgKGVsZW1lbnRzW2luZGV4XS5pc0RlbGV0ZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnRzW2luZGV4XSk7XG4gICAgaWYgKFxuICAgICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudHNbaW5kZXhdKSAmJlxuICAgICAgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3goZWxlbWVudHNbaW5kZXhdLCBhcHBTdGF0ZSwgW1xuICAgICAgICB4LFxuICAgICAgICB5LFxuICAgICAgXSlcbiAgICApIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9IGVsc2UgaWYgKHgxIDwgeCAmJiB4IDwgeDIgJiYgeTEgPCB5ICYmIHkgPCB5Mikge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihoaXRFbGVtZW50LCBmYWxzZSkgPyBoaXRFbGVtZW50IDogbnVsbDtcbn07XG5cbmNvbnN0IFZBTElEX0NPTlRBSU5FUl9UWVBFUyA9IG5ldyBTZXQoW1xuICBcInJlY3RhbmdsZVwiLFxuICBcImVsbGlwc2VcIixcbiAgXCJkaWFtb25kXCIsXG4gIFwiaW1hZ2VcIixcbiAgXCJhcnJvd1wiLFxuXSk7XG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkVGV4dENvbnRhaW5lciA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT5cbiAgVkFMSURfQ09OVEFJTkVSX1RZUEVTLmhhcyhlbGVtZW50LnR5cGUpO1xuXG5leHBvcnQgY29uc3QgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCA9IChcbiAgZGltZW5zaW9uOiBudW1iZXIsXG4gIGNvbnRhaW5lclR5cGU6IEV4dHJhY3RTZXRUeXBlPHR5cGVvZiBWQUxJRF9DT05UQUlORVJfVFlQRVM+LFxuKSA9PiB7XG4gIGRpbWVuc2lvbiA9IE1hdGguY2VpbChkaW1lbnNpb24pO1xuICBjb25zdCBwYWRkaW5nID0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoKGRpbWVuc2lvbiArIHBhZGRpbmcpIC8gTWF0aC5zcXJ0KDIpKSAqIDIpO1xuICB9XG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZyAqIDg7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgcmV0dXJuIDIgKiAoZGltZW5zaW9uICsgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIGRpbWVuc2lvbiArIHBhZGRpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q29udGFpbmVyV2lkdGggPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS53aWR0aDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHdpZHRoIC0gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgaWYgKGNvbnRhaW5lcldpZHRoIDw9IDApIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kVGV4dC53aWR0aDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRhaW5lcldpZHRoO1xuICB9XG5cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhbiBlbGxpcHNlIGlzXG4gICAgLy8gTWF0aC5yb3VuZCgoZWxsaXBzZS53aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC1odHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKCh3aWR0aCAvIDIpICogTWF0aC5zcXJ0KDIpKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIC8vIFRoZSB3aWR0aCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHdpZHRoIC8gMikgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIHJldHVybiB3aWR0aCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWF4Q29udGFpbmVySGVpZ2h0ID0gKGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgaGVpZ2h0ID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpLmhlaWdodDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICBjb25zdCBjb250YWluZXJIZWlnaHQgPSBoZWlnaHQgLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgICBpZiAoY29udGFpbmVySGVpZ2h0IDw9IDApIHtcbiAgICAgIGNvbnN0IGJvdW5kVGV4dCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoY29udGFpbmVyKTtcbiAgICAgIGlmIChib3VuZFRleHQpIHtcbiAgICAgICAgcmV0dXJuIGJvdW5kVGV4dC5oZWlnaHQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogOCAqIDI7XG4gICAgfVxuICAgIHJldHVybiBoZWlnaHQ7XG4gIH1cbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIC8vIFRoZSBoZWlnaHQgb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2UuaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIHdoaWNoIGlzIGRlcml2ZWQgZnJvbVxuICAgIC8vIGVxdWF0aW9uIG9mIGFuIGVsbGlwc2UgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjE3MlxuICAgIHJldHVybiBNYXRoLnJvdW5kKChoZWlnaHQgLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGEgcmhvbWJ1cyBpc1xuICAgIC8vIE1hdGgucm91bmQoaGVpZ2h0IC8gMikgLSBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L3B1bGwvNjI2NVxuICAgIHJldHVybiBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gaGVpZ2h0IC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3541
3541
|
|
|
3542
3542
|
/***/ }),
|
|
3543
3543
|
|
|
@@ -3548,7 +3548,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3548
3548
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3549
3549
|
|
|
3550
3550
|
"use strict";
|
|
3551
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getOriginalContainerHeightFromCache\": () => (/* binding */ getOriginalContainerHeightFromCache),\n/* harmony export */ \"resetOriginalContainerCache\": () => (/* binding */ resetOriginalContainerCache),\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg),\n/* harmony export */ \"updateOriginalContainerCache\": () => (/* binding */ updateOriginalContainerCache)\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/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\n const { zoom } = appState;\n const degree = (180 * angle) / Math.PI;\n let translateX = (width * (zoom.value - 1)) / 2;\n let translateY = (height * (zoom.value - 1)) / 2;\n if (width > maxWidth && zoom.value !== 1) {\n translateX = (maxWidth * (zoom.value - 1)) / 2;\n }\n if (height > maxHeight && zoom.value !== 1) {\n translateY = (maxHeight * (zoom.value - 1)) / 2;\n }\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\nconst originalContainerCache = {};\nconst updateOriginalContainerCache = (id, height) => {\n const data = originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\nconst resetOriginalContainerCache = (id) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\nconst getOriginalContainerHeightFromCache = (id) => {\n var _a, _b;\n return (_b = (_a = originalContainerCache[id]) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : null;\n};\nconst textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\n if (!editable.style.fontFamily || !editable.style.fontSize) {\n return false;\n }\n const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedTextElement.fontFamily }) !==\n currentFont) {\n return true;\n }\n if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n return true;\n }\n return false;\n };\n const updateWysiwygStyle = () => {\n var _a;\n const appState = app.state;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n if (!updatedTextElement) {\n return;\n }\n const { textAlign, verticalAlign } = updatedTextElement;\n const approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement));\n if (updatedTextElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedTextElement)) {\n let coordX = updatedTextElement.x;\n let coordY = updatedTextElement.y;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedTextElement);\n let maxWidth = updatedTextElement.width;\n let maxHeight = updatedTextElement.height;\n let textElementWidth = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let textElementHeight = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, updatedTextElement);\n coordX = boundTextCoords.x;\n coordY = boundTextCoords.y;\n }\n const propertiesUpdated = textPropertiesUpdated(updatedTextElement, editable);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerDims)(container);\n // using editor.style.height to get the accurate height of text editor\n const editorHeight = Number(editable.style.height.slice(0, -2));\n if (editorHeight > 0) {\n textElementHeight = editorHeight;\n }\n if (propertiesUpdated) {\n // update height of the editor after properties updated\n textElementHeight = updatedTextElement.height;\n }\n let originalContainerData;\n if (propertiesUpdated) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n else {\n originalContainerData = originalContainerCache[container.id];\n if (!originalContainerData) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n }\n maxWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container);\n maxHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && textElementHeight > maxHeight) {\n const diff = Math.min(textElementHeight - maxHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height + diff });\n return;\n }\n else if (\n // autoshrink container height until original container height\n // is reached when text is removed\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) &&\n containerDims.height > originalContainerData.height &&\n textElementHeight < maxHeight) {\n const diff = Math.min(maxHeight - textElementHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height - diff });\n }\n // Start pushing text upward until a diff of 30px (padding)\n // is reached\n else {\n const containerCoords = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerCoords)(container);\n // vertically center align the text\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.MIDDLE) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n coordY =\n containerCoords.y + maxHeight / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY = containerCoords.y + (maxHeight - textElementHeight);\n }\n }\n }\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n const initialSelectionStart = editable.selectionStart;\n const initialSelectionEnd = editable.selectionEnd;\n const initialLength = editable.value.length;\n editable.value = updatedTextElement.originalText;\n // restore cursor position after value updated so it doesn't\n // go to the end of text when container auto expanded\n if (initialSelectionStart === initialSelectionEnd &&\n initialSelectionEnd !== initialLength) {\n // get diff between length and selection end and shift\n // the cursor by \"diff\" times to position correctly\n const diff = initialLength - initialSelectionEnd;\n editable.selectionStart = editable.value.length - diff;\n editable.selectionEnd = editable.value.length - diff;\n }\n const lines = updatedTextElement.originalText.split(\"\\n\");\n const lineHeight = updatedTextElement.containerId\n ? approxLineHeight\n : updatedTextElement.height / lines.length;\n if (!container) {\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n textElementWidth = Math.min(textElementWidth, maxWidth);\n }\n else if (_constants__WEBPACK_IMPORTED_MODULE_4__.isFirefox || _constants__WEBPACK_IMPORTED_MODULE_4__.isSafari) {\n // As firefox, Safari needs little higher dimensions on DOM\n textElementWidth += 0.5;\n }\n // Make sure text editor height doesn't go beyond viewport\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\n Object.assign(editable.style, {\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement),\n // must be defined *after* font ¯\\_(ツ)_/¯\n lineHeight: `${lineHeight}px`,\n width: `${textElementWidth}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(textElementWidth, textElementHeight, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextElementAngle)(updatedTextElement), appState, maxWidth, editorMaxHeight),\n textAlign,\n verticalAlign,\n color: updatedTextElement.strokeColor,\n opacity: updatedTextElement.opacity / 100,\n filter: \"var(--theme-filter)\",\n maxHeight: `${editorMaxHeight}px`,\n });\n // For some reason updating font attribute doesn't set font family\n // hence updating font family explicitly for test environment\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedTextElement);\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedTextElement, { x: coordX, y: coordY });\n }\n };\n const editable = document.createElement(\"textarea\");\n editable.dir = \"auto\";\n editable.tabIndex = 0;\n editable.dataset.type = \"wysiwyg\";\n // prevent line wrapping on Safari\n editable.wrap = \"off\";\n editable.classList.add(\"excalidraw-wysiwyg\");\n let whiteSpace = \"pre\";\n let wordBreak = \"normal\";\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n whiteSpace = \"pre-wrap\";\n wordBreak = \"break-word\";\n }\n Object.assign(editable.style, {\n position: \"absolute\",\n display: \"inline-block\",\n minHeight: \"1em\",\n backfaceVisibility: \"hidden\",\n margin: 0,\n padding: 0,\n border: 0,\n outline: 0,\n resize: \"none\",\n background: \"transparent\",\n overflow: \"hidden\",\n // must be specified because in dark mode canvas creates a stacking context\n zIndex: \"var(--zIndex-wysiwyg)\",\n wordBreak,\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n whiteSpace,\n overflowWrap: \"break-word\",\n boxSizing: \"content-box\",\n });\n updateWysiwygStyle();\n if (onChange) {\n editable.onpaste = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const clipboardData = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event, true);\n if (!clipboardData.text) {\n return;\n }\n const data = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(clipboardData.text);\n if (!data) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)({\n fontSize: app.state.currentItemFontSize,\n fontFamily: app.state.currentItemFontFamily,\n });\n if (container) {\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(`${editable.value}${data}`, font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n }\n });\n editable.oninput = () => {\n var _a;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value), font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const { width, height } = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.measureText)(wrappedText, font);\n editable.style.width = `${width}px`;\n editable.style.height = `${height}px`;\n }\n onChange((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value));\n };\n }\n editable.onkeydown = (event) => {\n if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn);\n updateWysiwygStyle();\n }\n else if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut);\n updateWysiwygStyle();\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\n event.preventDefault();\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\n event.preventDefault();\n if (event.isComposing || event.keyCode === 229) {\n return;\n }\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\n event.preventDefault();\n if (event.isComposing) {\n return;\n }\n else if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\n outdent();\n }\n else {\n indent();\n }\n // We must send an input event to resize the element\n editable.dispatchEvent(new Event(\"input\"));\n }\n };\n const TAB_SIZE = 4;\n const TAB = \" \".repeat(TAB_SIZE);\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n const indent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex);\n value = `${startValue}${TAB}${endValue}`;\n });\n editable.value = value;\n editable.selectionStart = selectionStart + TAB_SIZE;\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n };\n const outdent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n const removedTabs = [];\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const tabMatch = value\n .slice(startIndex, startIndex + TAB_SIZE)\n .match(RE_LEADING_TAB);\n if (tabMatch) {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex + tabMatch[0].length);\n // Delete a tab from the line\n value = `${startValue}${endValue}`;\n removedTabs.push(startIndex);\n }\n });\n editable.value = value;\n if (removedTabs.length) {\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\n }\n else {\n // If the cursor is before the first tab removed, ex:\n // Line| #1\n // Line #2\n // Lin|e #3\n // we should reset the selectionStart to his initial value.\n editable.selectionStart = selectionStart;\n }\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\n }\n };\n /**\n * @returns indices of start positions of selected lines, in reverse order\n */\n const getSelectedLinesStartIndices = () => {\n let { selectionStart, selectionEnd, value } = editable;\n // chars before selectionStart on the same line\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\n .length;\n // put caret at the start of the line\n selectionStart = selectionStart - startOffset;\n const selected = value.slice(selectionStart, selectionEnd);\n return selected\n .split(\"\\n\")\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\n ? // curr line index is prev line's start + prev line's length + \\n\n startIndices[idx - 1] + lines[idx - 1].length + 1\n : // first selected line\n selectionStart), [])\n .reverse();\n };\n const stopEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n // using a state variable instead of passing it to the handleSubmit callback\n // so that we don't need to create separate a callback for event handlers\n let submittedViaKeyboard = false;\n const handleSubmit = () => {\n var _a, _b;\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n // wysiwyg on update\n cleanup();\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\n if (!updateElement) {\n return;\n }\n let text = editable.value;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\n if (container) {\n text = updateElement.text;\n if (editable.value.trim()) {\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\n if (!boundTextElementId || boundTextElementId !== element.id) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: element.id,\n }),\n });\n }\n }\n else {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\n });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(updateElement, container);\n }\n onSubmit({\n text,\n viaKeyboard: submittedViaKeyboard,\n originalText: editable.value,\n });\n };\n const cleanup = () => {\n if (isDestroyed) {\n return;\n }\n isDestroyed = true;\n // remove events to ensure they don't late-fire\n editable.onblur = null;\n editable.oninput = null;\n editable.onkeydown = null;\n if (observer) {\n observer.disconnect();\n }\n window.removeEventListener(\"resize\", updateWysiwygStyle);\n window.removeEventListener(\"wheel\", stopEvent, true);\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n window.removeEventListener(\"blur\", handleSubmit);\n unbindUpdate();\n editable.remove();\n };\n const bindBlurEvent = (event) => {\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n // trigger the blur on ensuing pointerup.\n // Also to handle cases such as picking a color which would trigger a blur\n // in that same tick.\n const target = event === null || event === void 0 ? void 0 : event.target;\n const isTargetColorPicker = target instanceof HTMLInputElement &&\n target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\n setTimeout(() => {\n editable.onblur = handleSubmit;\n if (target && isTargetColorPicker) {\n target.onblur = () => {\n editable.focus();\n };\n }\n // case: clicking on the same property → no change → no update → no focus\n if (!isTargetColorPicker) {\n editable.focus();\n }\n });\n };\n // prevent blur when changing properties from the menu\n const onPointerDown = (event) => {\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\n event.target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\n if (((event.target instanceof HTMLElement ||\n event.target instanceof SVGElement) &&\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\n isTargetColorPicker) {\n editable.onblur = null;\n window.addEventListener(\"pointerup\", bindBlurEvent);\n // handle edge-case where pointerup doesn't fire e.g. due to user\n // alt-tabbing away\n window.addEventListener(\"blur\", handleSubmit);\n }\n };\n // handle updates of textElement properties of editing element\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\n var _a;\n updateWysiwygStyle();\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\n if (!isColorPickerActive) {\n editable.focus();\n }\n });\n // ---------------------------------------------------------------------------\n let isDestroyed = false;\n // select on init (focusing is done separately inside the bindBlurEvent()\n // because we need it to happen *after* the blur event from `pointerdown`)\n editable.select();\n bindBlurEvent();\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n // is preferred so we catch changes from host, where window may not resize.\n let observer = null;\n if (canvas && \"ResizeObserver\" in window) {\n observer = new window.ResizeObserver(() => {\n updateWysiwygStyle();\n });\n observer.observe(canvas);\n }\n else {\n window.addEventListener(\"resize\", updateWysiwygStyle);\n }\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"wheel\", stopEvent, {\n passive: false,\n capture: true,\n });\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUEwRTtJQUMxRSxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDbEIsYUFBYSxFQUFFLENBQUM7SUFFaEIsd0VBQXdFO0lBQ3hFLDJFQUEyRTtJQUMzRSxJQUFJLFFBQVEsR0FBMEIsSUFBSSxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLGdCQUFnQixJQUFJLE1BQU0sRUFBRTtRQUN4QyxRQUFRLEdBQUcsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRTtZQUN4QyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMxQjtTQUFNO1FBQ0wsTUFBTSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN0RCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRTtRQUMxQyxPQUFPLEVBQUUsS0FBSztRQUNkLE9BQU8sRUFBRSxJQUFJO0tBQ2QsQ0FBQyxDQUFDO0lBQ0gsbUJBQW1CLGFBQW5CLG1CQUFtQix1QkFBbkIsbUJBQW1CLENBQ2YsYUFBYSxDQUFDLGlDQUFpQyxFQUNoRCxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dFd5c2l3eWcudHN4PzhmNGQiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ09ERVMsIEtFWVMgfSBmcm9tIFwiLi4va2V5c1wiO1xuaW1wb3J0IHtcbiAgaXNXcml0YWJsZUVsZW1lbnQsXG4gIGdldEZvbnRTdHJpbmcsXG4gIGdldEZvbnRGYW1pbHlTdHJpbmcsXG4gIGlzVGVzdEVudixcbn0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5pbXBvcnQge1xuICBpc0Fycm93RWxlbWVudCxcbiAgaXNCb3VuZFRvQ29udGFpbmVyLFxuICBpc1RleHRFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBDTEFTU0VTLCBpc0ZpcmVmb3gsIGlzU2FmYXJpLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgZ2V0QXBwcm94TGluZUhlaWdodCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudElkLFxuICBnZXRDb250YWluZXJDb29yZHMsXG4gIGdldENvbnRhaW5lckRpbXMsXG4gIGdldENvbnRhaW5lckVsZW1lbnQsXG4gIGdldFRleHRFbGVtZW50QW5nbGUsXG4gIGdldFRleHRXaWR0aCxcbiAgbWVhc3VyZVRleHQsXG4gIG5vcm1hbGl6ZVRleHQsXG4gIHJlZHJhd1RleHRCb3VuZGluZ0JveCxcbiAgd3JhcFRleHQsXG4gIGdldE1heENvbnRhaW5lckhlaWdodCxcbiAgZ2V0TWF4Q29udGFpbmVyV2lkdGgsXG59IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBhY3Rpb25EZWNyZWFzZUZvbnRTaXplLFxuICBhY3Rpb25JbmNyZWFzZUZvbnRTaXplLFxufSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBhY3Rpb25ab29tSW4sIGFjdGlvblpvb21PdXQgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25DYW52YXNcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgcGFyc2VDbGlwYm9hcmQgfSBmcm9tIFwiLi4vY2xpcGJvYXJkXCI7XG5cbmNvbnN0IGdldFRyYW5zZm9ybSA9IChcbiAgd2lkdGg6IG51bWJlcixcbiAgaGVpZ2h0OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgbWF4V2lkdGg6IG51bWJlcixcbiAgbWF4SGVpZ2h0OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgeyB6b29tIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3QgZGVncmVlID0gKDE4MCAqIGFuZ2xlKSAvIE1hdGguUEk7XG4gIGxldCB0cmFuc2xhdGVYID0gKHdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICBsZXQgdHJhbnNsYXRlWSA9IChoZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGlmICh3aWR0aCA+IG1heFdpZHRoICYmIHpvb20udmFsdWUgIT09IDEpIHtcbiAgICB0cmFuc2xhdGVYID0gKG1heFdpZHRoICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQgJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVkgPSAobWF4SGVpZ2h0ICogKHpvb20udmFsdWUgLSAxKSkgLyAyO1xuICB9XG4gIHJldHVybiBgdHJhbnNsYXRlKCR7dHJhbnNsYXRlWH1weCwgJHt0cmFuc2xhdGVZfXB4KSBzY2FsZSgke3pvb20udmFsdWV9KSByb3RhdGUoJHtkZWdyZWV9ZGVnKWA7XG59O1xuXG5jb25zdCBvcmlnaW5hbENvbnRhaW5lckNhY2hlOiB7XG4gIFtpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXV06XG4gICAgfCB7XG4gICAgICAgIGhlaWdodDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJoZWlnaHRcIl07XG4gICAgICB9XG4gICAgfCB1bmRlZmluZWQ7XG59ID0ge307XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbiAgaGVpZ2h0OiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBkYXRhID1cbiAgICBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSB8fCAob3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0gPSB7IGhlaWdodCB9KTtcbiAgZGF0YS5oZWlnaHQgPSBoZWlnaHQ7XG4gIHJldHVybiBkYXRhO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4pID0+IHtcbiAgaWYgKG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdKSB7XG4gICAgZGVsZXRlIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0T3JpZ2luYWxDb250YWluZXJIZWlnaHRGcm9tQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuKSA9PiB7XG4gIHJldHVybiBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXT8uaGVpZ2h0ID8/IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgdGV4dFd5c2l3eWcgPSAoe1xuICBpZCxcbiAgb25DaGFuZ2UsXG4gIG9uU3VibWl0LFxuICBnZXRWaWV3cG9ydENvb3JkcyxcbiAgZWxlbWVudCxcbiAgY2FudmFzLFxuICBleGNhbGlkcmF3Q29udGFpbmVyLFxuICBhcHAsXG59OiB7XG4gIGlkOiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdO1xuICBvbkNoYW5nZT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gIG9uU3VibWl0OiAoZGF0YToge1xuICAgIHRleHQ6IHN0cmluZztcbiAgICB2aWFLZXlib2FyZDogYm9vbGVhbjtcbiAgICBvcmlnaW5hbFRleHQ6IHN0cmluZztcbiAgfSkgPT4gdm9pZDtcbiAgZ2V0Vmlld3BvcnRDb29yZHM6ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gW251bWJlciwgbnVtYmVyXTtcbiAgZWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQgfCBudWxsO1xuICBhcHA6IEFwcDtcbn0pID0+IHtcbiAgY29uc3QgdGV4dFByb3BlcnRpZXNVcGRhdGVkID0gKFxuICAgIHVwZGF0ZWRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICAgIGVkaXRhYmxlOiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICApID0+IHtcbiAgICBpZiAoIWVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkgfHwgIWVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZFRleHRFbGVtZW50LmZvbnRGYW1pbHkgfSkgIT09XG4gICAgICBjdXJyZW50Rm9udFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChgJHt1cGRhdGVkVGV4dEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICBjb25zdCB1cGRhdGVXeXNpd3lnU3R5bGUgPSAoKSA9PiB7XG4gICAgY29uc3QgYXBwU3RhdGUgPSBhcHAuc3RhdGU7XG4gICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID1cbiAgICAgIFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50PEV4Y2FsaWRyYXdUZXh0RWxlbWVudD4oaWQpO1xuXG4gICAgaWYgKCF1cGRhdGVkVGV4dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0QWxpZ24sIHZlcnRpY2FsQWxpZ24gfSA9IHVwZGF0ZWRUZXh0RWxlbWVudDtcbiAgICBjb25zdCBhcHByb3hMaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChcbiAgICAgIGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KSxcbiAgICApO1xuICAgIGlmICh1cGRhdGVkVGV4dEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQpKSB7XG4gICAgICBsZXQgY29vcmRYID0gdXBkYXRlZFRleHRFbGVtZW50Lng7XG4gICAgICBsZXQgY29vcmRZID0gdXBkYXRlZFRleHRFbGVtZW50Lnk7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBsZXQgbWF4V2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG5cbiAgICAgIGxldCBtYXhIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgICAgbGV0IHRleHRFbGVtZW50V2lkdGggPSB1cGRhdGVkVGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICAvLyBTZXQgdG8gZWxlbWVudCBoZWlnaHQgYnkgZGVmYXVsdCBzaW5jZSB0aGF0J3NcbiAgICAgIC8vIHdoYXQgaXMgZ29pbmcgdG8gYmUgdXNlZCBmb3IgdW5ib3VuZGVkIHRleHRcbiAgICAgIGxldCB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG5cbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID1cbiAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb29yZFggPSBib3VuZFRleHRDb29yZHMueDtcbiAgICAgICAgICBjb29yZFkgPSBib3VuZFRleHRDb29yZHMueTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQsXG4gICAgICAgICAgZWRpdGFibGUsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICAgIC8vIHVzaW5nIGVkaXRvci5zdHlsZS5oZWlnaHQgdG8gZ2V0IHRoZSBhY2N1cmF0ZSBoZWlnaHQgb2YgdGV4dCBlZGl0b3JcbiAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0ID0gZWRpdG9ySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luYWxDb250YWluZXJEYXRhO1xuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKFxuICAgICAgICAgICAgY29udGFpbmVyLmlkLFxuICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2NvbnRhaW5lci5pZF07XG4gICAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckRhdGEpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVyRGF0YSA9IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoXG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICAgICAgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gYXV0b2dyb3cgY29udGFpbmVyIGhlaWdodCBpZiB0ZXh0IGV4Y2VlZHNcbiAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmIHRleHRFbGVtZW50SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgLSBtYXhIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXJEaW1zLmhlaWdodCArIGRpZmYgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIC8vIGF1dG9zaHJpbmsgY29udGFpbmVyIGhlaWdodCB1bnRpbCBvcmlnaW5hbCBjb250YWluZXIgaGVpZ2h0XG4gICAgICAgICAgLy8gaXMgcmVhY2hlZCB3aGVuIHRleHQgaXMgcmVtb3ZlZFxuICAgICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQgPiBvcmlnaW5hbENvbnRhaW5lckRhdGEuaGVpZ2h0ICYmXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgPCBtYXhIZWlnaHRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGgubWluKFxuICAgICAgICAgICAgbWF4SGVpZ2h0IC0gdGV4dEVsZW1lbnRIZWlnaHQsXG4gICAgICAgICAgICBhcHByb3hMaW5lSGVpZ2h0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBjb250YWluZXJEaW1zLmhlaWdodCAtIGRpZmYgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU3RhcnQgcHVzaGluZyB0ZXh0IHVwd2FyZCB1bnRpbCBhIGRpZmYgb2YgMzBweCAocGFkZGluZylcbiAgICAgICAgLy8gaXMgcmVhY2hlZFxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBjb25zdCBjb250YWluZXJDb29yZHMgPSBnZXRDb250YWluZXJDb29yZHMoY29udGFpbmVyKTtcblxuICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gICAgICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSkge1xuICAgICAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgICAgICAgY29udGFpbmVyQ29vcmRzLnkgKyBtYXhIZWlnaHQgLyAyIC0gdGV4dEVsZW1lbnRIZWlnaHQgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgICAgICBjb29yZFkgPSBjb250YWluZXJDb29yZHMueSArIChtYXhIZWlnaHQgLSB0ZXh0RWxlbWVudEhlaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBbdmlld3BvcnRYLCB2aWV3cG9ydFldID0gZ2V0Vmlld3BvcnRDb29yZHMoY29vcmRYLCBjb29yZFkpO1xuICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQ7XG4gICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uRW5kID0gZWRpdGFibGUuc2VsZWN0aW9uRW5kO1xuICAgICAgY29uc3QgaW5pdGlhbExlbmd0aCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aDtcbiAgICAgIGVkaXRhYmxlLnZhbHVlID0gdXBkYXRlZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dDtcblxuICAgICAgLy8gcmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgdmFsdWUgdXBkYXRlZCBzbyBpdCBkb2Vzbid0XG4gICAgICAvLyBnbyB0byB0aGUgZW5kIG9mIHRleHQgd2hlbiBjb250YWluZXIgYXV0byBleHBhbmRlZFxuICAgICAgaWYgKFxuICAgICAgICBpbml0aWFsU2VsZWN0aW9uU3RhcnQgPT09IGluaXRpYWxTZWxlY3Rpb25FbmQgJiZcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvbkVuZCAhPT0gaW5pdGlhbExlbmd0aFxuICAgICAgKSB7XG4gICAgICAgIC8vIGdldCBkaWZmIGJldHdlZW4gbGVuZ3RoIGFuZCBzZWxlY3Rpb24gZW5kIGFuZCBzaGlmdFxuICAgICAgICAvLyB0aGUgY3Vyc29yIGJ5IFwiZGlmZlwiIHRpbWVzIHRvIHBvc2l0aW9uIGNvcnJlY3RseVxuICAgICAgICBjb25zdCBkaWZmID0gaW5pdGlhbExlbmd0aCAtIGluaXRpYWxTZWxlY3Rpb25FbmQ7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gZWRpdGFibGUudmFsdWUubGVuZ3RoIC0gZGlmZjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbGluZXMgPSB1cGRhdGVkVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LnNwbGl0KFwiXFxuXCIpO1xuICAgICAgY29uc3QgbGluZUhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5jb250YWluZXJJZFxuICAgICAgICA/IGFwcHJveExpbmVIZWlnaHRcbiAgICAgICAgOiB1cGRhdGVkVGV4dEVsZW1lbnQuaGVpZ2h0IC8gbGluZXMubGVuZ3RoO1xuICAgICAgaWYgKCFjb250YWluZXIpIHtcbiAgICAgICAgbWF4V2lkdGggPSAoYXBwU3RhdGUud2lkdGggLSA4IC0gdmlld3BvcnRYKSAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG4gICAgICAgIHRleHRFbGVtZW50V2lkdGggPSBNYXRoLm1pbih0ZXh0RWxlbWVudFdpZHRoLCBtYXhXaWR0aCk7XG4gICAgICB9IGVsc2UgaWYgKGlzRmlyZWZveCB8fCBpc1NhZmFyaSkge1xuICAgICAgICAvLyBBcyBmaXJlZm94LCBTYWZhcmkgbmVlZHMgbGl0dGxlIGhpZ2hlciBkaW1lbnNpb25zIG9uIERPTVxuICAgICAgICB0ZXh0RWxlbWVudFdpZHRoICs9IDAuNTtcbiAgICAgIH1cbiAgICAgIC8vIE1ha2Ugc3VyZSB0ZXh0IGVkaXRvciBoZWlnaHQgZG9lc24ndCBnbyBiZXlvbmQgdmlld3BvcnRcbiAgICAgIGNvbnN0IGVkaXRvck1heEhlaWdodCA9XG4gICAgICAgIChhcHBTdGF0ZS5oZWlnaHQgLSB2aWV3cG9ydFkpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7dGV4dEVsZW1lbnRXaWR0aH1weGAsXG4gICAgICAgIGhlaWdodDogYCR7dGV4dEVsZW1lbnRIZWlnaHR9cHhgLFxuICAgICAgICBsZWZ0OiBgJHt2aWV3cG9ydFh9cHhgLFxuICAgICAgICB0b3A6IGAke3ZpZXdwb3J0WX1weGAsXG4gICAgICAgIHRyYW5zZm9ybTogZ2V0VHJhbnNmb3JtKFxuICAgICAgICAgIHRleHRFbGVtZW50V2lkdGgsXG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQsXG4gICAgICAgICAgZ2V0VGV4dEVsZW1lbnRBbmdsZSh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgIGVkaXRvck1heEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZFRleHRFbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICBvcGFjaXR5OiB1cGRhdGVkVGV4dEVsZW1lbnQub3BhY2l0eSAvIDEwMCxcbiAgICAgICAgZmlsdGVyOiBcInZhcigtLXRoZW1lLWZpbHRlcilcIixcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtlZGl0b3JNYXhIZWlnaHR9cHhgLFxuICAgICAgfSk7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gdXBkYXRpbmcgZm9udCBhdHRyaWJ1dGUgZG9lc24ndCBzZXQgZm9udCBmYW1pbHlcbiAgICAgIC8vIGhlbmNlIHVwZGF0aW5nIGZvbnQgZmFtaWx5IGV4cGxpY2l0bHkgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseVN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQsIHsgeDogY29vcmRYLCB5OiBjb29yZFkgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgIHBvc2l0aW9uOiBcImFic29sdXRlXCIsXG4gICAgZGlzcGxheTogXCJpbmxpbmUtYmxvY2tcIixcbiAgICBtaW5IZWlnaHQ6IFwiMWVtXCIsXG4gICAgYmFja2ZhY2VWaXNpYmlsaXR5OiBcImhpZGRlblwiLFxuICAgIG1hcmdpbjogMCxcbiAgICBwYWRkaW5nOiAwLFxuICAgIGJvcmRlcjogMCxcbiAgICBvdXRsaW5lOiAwLFxuICAgIHJlc2l6ZTogXCJub25lXCIsXG4gICAgYmFja2dyb3VuZDogXCJ0cmFuc3BhcmVudFwiLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICAgIGJveFNpemluZzogXCJjb250ZW50LWJveFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25wYXN0ZSA9IGFzeW5jIChldmVudCkgPT4ge1xuICAgICAgY29uc3QgY2xpcGJvYXJkRGF0YSA9IGF3YWl0IHBhcnNlQ2xpcGJvYXJkKGV2ZW50LCB0cnVlKTtcbiAgICAgIGlmICghY2xpcGJvYXJkRGF0YS50ZXh0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGEgPSBub3JtYWxpemVUZXh0KGNsaXBib2FyZERhdGEudGV4dCk7XG4gICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgY29uc3QgZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgICAgICBmb250U2l6ZTogYXBwLnN0YXRlLmN1cnJlbnRJdGVtRm9udFNpemUsXG4gICAgICAgIGZvbnRGYW1pbHk6IGFwcC5zdGF0ZS5jdXJyZW50SXRlbUZvbnRGYW1pbHksXG4gICAgICB9KTtcbiAgICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBgJHtlZGl0YWJsZS52YWx1ZX0ke2RhdGF9YCxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciksXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gZ2V0VGV4dFdpZHRoKHdyYXBwZWRUZXh0LCBmb250KTtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSAoKSA9PiB7XG4gICAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgaWQsXG4gICAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnN0IGZvbnQgPSBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHdyYXBwZWRUZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgbm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSksXG4gICAgICAgICAgZm9udCxcbiAgICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIhKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBtZWFzdXJlVGV4dCh3cmFwcGVkVGV4dCwgZm9udCk7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLndpZHRoID0gYCR7d2lkdGh9cHhgO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBgJHtoZWlnaHR9cHhgO1xuICAgICAgfVxuICAgICAgb25DaGFuZ2Uobm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSkpO1xuICAgIH07XG4gIH1cblxuICBlZGl0YWJsZS5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGFjdGlvblpvb21Jbi5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uWm9vbUluKTtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGFjdGlvblpvb21PdXQua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblpvb21PdXQpO1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb25EZWNyZWFzZUZvbnRTaXplLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlY3JlYXNlRm9udFNpemUpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uSW5jcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25JbmNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUiAmJiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHxcbiAgICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgICAoZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUIHx8XG4gICAgICAgICAgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9SSUdIVCkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUKSB7XG4gICAgICAgIG91dGRlbnQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGVudCgpO1xuICAgICAgfVxuICAgICAgLy8gV2UgbXVzdCBzZW5kIGFuIGlucHV0IGV2ZW50IHRvIHJlc2l6ZSB0aGUgZWxlbWVudFxuICAgICAgZWRpdGFibGUuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoXCJpbnB1dFwiKSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IFRBQl9TSVpFID0gNDtcbiAgY29uc3QgVEFCID0gXCIgXCIucmVwZWF0KFRBQl9TSVpFKTtcbiAgY29uc3QgUkVfTEVBRElOR19UQUIgPSBuZXcgUmVnRXhwKGBeIHsxLCR7VEFCX1NJWkV9fWApO1xuICBjb25zdCBpbmRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4KTtcblxuICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7VEFCfSR7ZW5kVmFsdWV9YDtcbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0ICsgVEFCX1NJWkU7XG4gICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gc2VsZWN0aW9uRW5kICsgVEFCX1NJWkUgKiBsaW5lc1N0YXJ0SW5kaWNlcy5sZW5ndGg7XG4gIH07XG5cbiAgY29uc3Qgb3V0ZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuICAgIGNvbnN0IHJlbW92ZWRUYWJzOiBudW1iZXJbXSA9IFtdO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleCkgPT4ge1xuICAgICAgY29uc3QgdGFiTWF0Y2ggPSB2YWx1ZVxuICAgICAgICAuc2xpY2Uoc3RhcnRJbmRleCwgc3RhcnRJbmRleCArIFRBQl9TSVpFKVxuICAgICAgICAubWF0Y2goUkVfTEVBRElOR19UQUIpO1xuXG4gICAgICBpZiAodGFiTWF0Y2gpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRWYWx1ZSA9IHZhbHVlLnNsaWNlKDAsIHN0YXJ0SW5kZXgpO1xuICAgICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXggKyB0YWJNYXRjaFswXS5sZW5ndGgpO1xuXG4gICAgICAgIC8vIERlbGV0ZSBhIHRhYiBmcm9tIHRoZSBsaW5lXG4gICAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke2VuZFZhbHVlfWA7XG4gICAgICAgIHJlbW92ZWRUYWJzLnB1c2goc3RhcnRJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHJlbW92ZWRUYWJzLmxlbmd0aCkge1xuICAgICAgaWYgKHNlbGVjdGlvblN0YXJ0ID4gcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBNYXRoLm1heChcbiAgICAgICAgICBzZWxlY3Rpb25TdGFydCAtIFRBQl9TSVpFLFxuICAgICAgICAgIHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdLFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSWYgdGhlIGN1cnNvciBpcyBiZWZvcmUgdGhlIGZpcnN0IHRhYiByZW1vdmVkLCBleDpcbiAgICAgICAgLy8gTGluZXwgIzFcbiAgICAgICAgLy8gICAgIExpbmUgIzJcbiAgICAgICAgLy8gTGlufGUgIzNcbiAgICAgICAgLy8gd2Ugc2hvdWxkIHJlc2V0IHRoZSBzZWxlY3Rpb25TdGFydCB0byBoaXMgaW5pdGlhbCB2YWx1ZS5cbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydDtcbiAgICAgIH1cbiAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IE1hdGgubWF4KFxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCxcbiAgICAgICAgc2VsZWN0aW9uRW5kIC0gVEFCX1NJWkUgKiByZW1vdmVkVGFicy5sZW5ndGgsXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAgICogQHJldHVybnMgaW5kaWNlcyBvZiBzdGFydCBwb3NpdGlvbnMgb2Ygc2VsZWN0ZWQgbGluZXMsIGluIHJldmVyc2Ugb3JkZXJcbiAgICovXG4gIGNvbnN0IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMgPSAoKSA9PiB7XG4gICAgbGV0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCwgdmFsdWUgfSA9IGVkaXRhYmxlO1xuXG4gICAgLy8gY2hhcnMgYmVmb3JlIHNlbGVjdGlvblN0YXJ0IG9uIHRoZSBzYW1lIGxpbmVcbiAgICBjb25zdCBzdGFydE9mZnNldCA9IHZhbHVlLnNsaWNlKDAsIHNlbGVjdGlvblN0YXJ0KS5tYXRjaCgvW15cXG5dKiQvKSFbMF1cbiAgICAgIC5sZW5ndGg7XG4gICAgLy8gcHV0IGNhcmV0IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZVxuICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgLSBzdGFydE9mZnNldDtcblxuICAgIGNvbnN0IHNlbGVjdGVkID0gdmFsdWUuc2xpY2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7XG5cbiAgICByZXR1cm4gc2VsZWN0ZWRcbiAgICAgIC5zcGxpdChcIlxcblwiKVxuICAgICAgLnJlZHVjZShcbiAgICAgICAgKHN0YXJ0SW5kaWNlcywgbGluZSwgaWR4LCBsaW5lcykgPT5cbiAgICAgICAgICBzdGFydEluZGljZXMuY29uY2F0KFxuICAgICAgICAgICAgaWR4XG4gICAgICAgICAgICAgID8gLy8gY3VyciBsaW5lIGluZGV4IGlzIHByZXYgbGluZSdzIHN0YXJ0ICsgcHJldiBsaW5lJ3MgbGVuZ3RoICsgXFxuXG4gICAgICAgICAgICAgICAgc3RhcnRJbmRpY2VzW2lkeCAtIDFdICsgbGluZXNbaWR4IC0gMV0ubGVuZ3RoICsgMVxuICAgICAgICAgICAgICA6IC8vIGZpcnN0IHNlbGVjdGVkIGxpbmVcbiAgICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCxcbiAgICAgICAgICApLFxuICAgICAgICBbXSBhcyBudW1iZXJbXSxcbiAgICAgIClcbiAgICAgIC5yZXZlcnNlKCk7XG4gIH07XG5cbiAgY29uc3Qgc3RvcEV2ZW50ID0gKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gIH07XG5cbiAgLy8gdXNpbmcgYSBzdGF0ZSB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhc3NpbmcgaXQgdG8gdGhlIGhhbmRsZVN1Ym1pdCBjYWxsYmFja1xuICAvLyBzbyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY3JlYXRlIHNlcGFyYXRlIGEgY2FsbGJhY2sgZm9yIGV2ZW50IGhhbmRsZXJzXG4gIGxldCBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IGZhbHNlO1xuICBjb25zdCBoYW5kbGVTdWJtaXQgPSAoKSA9PiB7XG4gICAgLy8gY2xlYW51cCBtdXN0IGJlIHJ1biBiZWZvcmUgb25TdWJtaXQgb3RoZXJ3aXNlIHdoZW4gYXBwIGJsdXJzIHRoZSB3eXNpd3lnXG4gICAgLy8gaXQnZCBnZXQgc3R1Y2sgaW4gYW4gaW5maW5pdGUgbG9vcCBvZiBibHVy4oaSb25TdWJtaXQgYWZ0ZXIgd2UgcmUtZm9jdXMgdGhlXG4gICAgLy8gd3lzaXd5ZyBvbiB1cGRhdGVcbiAgICBjbGVhbnVwKCk7XG4gICAgY29uc3QgdXBkYXRlRWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgZWxlbWVudC5pZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBpZiAoIXVwZGF0ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGV0IHRleHQgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KHVwZGF0ZUVsZW1lbnQpO1xuXG4gICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgdGV4dCA9IHVwZGF0ZUVsZW1lbnQudGV4dDtcbiAgICAgIGlmIChlZGl0YWJsZS52YWx1ZS50cmltKCkpIHtcbiAgICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gICAgICAgIGlmICghYm91bmRUZXh0RWxlbWVudElkIHx8IGJvdW5kVGV4dEVsZW1lbnRJZCAhPT0gZWxlbWVudC5pZCkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgIGJvdW5kRWxlbWVudHM6IGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PlxuICAgICAgICAgICAgICAhaXNUZXh0RWxlbWVudChcbiAgICAgICAgICAgICAgICBlbGUgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3godXBkYXRlRWxlbWVudCwgY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0LFxuICAgICAgdmlhS2V5Ym9hcmQ6IHN1Ym1pdHRlZFZpYUtleWJvYXJkLFxuICAgICAgb3JpZ2luYWxUZXh0OiBlZGl0YWJsZS52YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcbiAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9ua2V5ZG93biA9IG51bGw7XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB0cnVlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuXG4gICAgdW5iaW5kVXBkYXRlKCk7XG5cbiAgICBlZGl0YWJsZS5yZW1vdmUoKTtcbiAgfTtcblxuICBjb25zdCBiaW5kQmx1ckV2ZW50ID0gKGV2ZW50PzogTW91c2VFdmVudCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIC8vIERlZmVycmVkIHNvIHRoYXQgdGhlIHBvaW50ZXJkb3duIHRoYXQgaW5pdGlhdGVzIHRoZSB3eXNpd3lnIGRvZXNuJ3RcbiAgICAvLyB0cmlnZ2VyIHRoZSBibHVyIG9uIGVuc3VpbmcgcG9pbnRlcnVwLlxuICAgIC8vIEFsc28gdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMgcGlja2luZyBhIGNvbG9yIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBibHVyXG4gICAgLy8gaW4gdGhhdCBzYW1lIHRpY2suXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcblxuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBoYW5kbGVTdWJtaXQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgdGFyZ2V0Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuICAgICAgaWYgKCFpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gcHJldmVudCBibHVyIHdoZW4gY2hhbmdpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBtZW51XG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICBpZiAoXG4gICAgICAoKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpICYmXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KGAuJHtDTEFTU0VTLlNIQVBFX0FDVElPTlNfTUVOVX1gKSAmJlxuICAgICAgICAhaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkgfHxcbiAgICAgIGlzVGFyZ2V0Q29sb3JQaWNrZXJcbiAgICApIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAgIC8vIGhhbmRsZSBlZGdlLWNhc2Ugd2hlcmUgcG9pbnRlcnVwIGRvZXNuJ3QgZmlyZSBlLmcuIGR1ZSB0byB1c2VyXG4gICAgICAvLyBhbHQtdGFiYmluZyBhd2F5XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaGFuZGxlIHVwZGF0ZXMgb2YgdGV4dEVsZW1lbnQgcHJvcGVydGllcyBvZiBlZGl0aW5nIGVsZW1lbnRcbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkhLmFkZENhbGxiYWNrKCgpID0+IHtcbiAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICBjb25zdCBpc0NvbG9yUGlja2VyQWN0aXZlID0gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KFxuICAgICAgXCIuY29sb3ItcGlja2VyLWlucHV0XCIsXG4gICAgKTtcbiAgICBpZiAoIWlzQ29sb3JQaWNrZXJBY3RpdmUpIHtcbiAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsZXQgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG4gIGVkaXRhYmxlLnNlbGVjdCgpO1xuICBiaW5kQmx1ckV2ZW50KCk7XG5cbiAgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuICBsZXQgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChjYW52YXMgJiYgXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdykge1xuICAgIG9ic2VydmVyID0gbmV3IHdpbmRvdy5SZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNhbnZhcyk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB7XG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgfSk7XG4gIGV4Y2FsaWRyYXdDb250YWluZXJcbiAgICA/LnF1ZXJ5U2VsZWN0b3IoXCIuZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIpIVxuICAgIC5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
3551
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getOriginalContainerHeightFromCache\": () => (/* binding */ getOriginalContainerHeightFromCache),\n/* harmony export */ \"resetOriginalContainerCache\": () => (/* binding */ resetOriginalContainerCache),\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg),\n/* harmony export */ \"updateOriginalContainerCache\": () => (/* binding */ updateOriginalContainerCache)\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/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _clipboard__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../clipboard */ \"../../clipboard.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\nconst getTransform = (width, height, angle, appState, maxWidth, maxHeight) => {\n const { zoom } = appState;\n const degree = (180 * angle) / Math.PI;\n let translateX = (width * (zoom.value - 1)) / 2;\n let translateY = (height * (zoom.value - 1)) / 2;\n if (width > maxWidth && zoom.value !== 1) {\n translateX = (maxWidth * (zoom.value - 1)) / 2;\n }\n if (height > maxHeight && zoom.value !== 1) {\n translateY = (maxHeight * (zoom.value - 1)) / 2;\n }\n return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\nconst originalContainerCache = {};\nconst updateOriginalContainerCache = (id, height) => {\n const data = originalContainerCache[id] || (originalContainerCache[id] = { height });\n data.height = height;\n return data;\n};\nconst resetOriginalContainerCache = (id) => {\n if (originalContainerCache[id]) {\n delete originalContainerCache[id];\n }\n};\nconst getOriginalContainerHeightFromCache = (id) => {\n var _a, _b;\n return (_b = (_a = originalContainerCache[id]) === null || _a === void 0 ? void 0 : _a.height) !== null && _b !== void 0 ? _b : null;\n};\nconst textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\n if (!editable.style.fontFamily || !editable.style.fontSize) {\n return false;\n }\n const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)({ fontFamily: updatedTextElement.fontFamily }) !==\n currentFont) {\n return true;\n }\n if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n return true;\n }\n return false;\n };\n const updateWysiwygStyle = () => {\n var _a;\n const appState = app.state;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n if (!updatedTextElement) {\n return;\n }\n const { textAlign, verticalAlign } = updatedTextElement;\n const approxLineHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)((0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement));\n if (updatedTextElement && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(updatedTextElement)) {\n let coordX = updatedTextElement.x;\n let coordY = updatedTextElement.y;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updatedTextElement);\n let maxWidth = updatedTextElement.width;\n let maxHeight = updatedTextElement.height;\n let textElementWidth = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let textElementHeight = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_9__.LinearElementEditor.getBoundTextElementPosition(container, updatedTextElement);\n coordX = boundTextCoords.x;\n coordY = boundTextCoords.y;\n }\n const propertiesUpdated = textPropertiesUpdated(updatedTextElement, editable);\n const containerDims = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerDims)(container);\n // using editor.style.height to get the accurate height of text editor\n const editorHeight = Number(editable.style.height.slice(0, -2));\n if (editorHeight > 0) {\n textElementHeight = editorHeight;\n }\n if (propertiesUpdated) {\n // update height of the editor after properties updated\n textElementHeight = updatedTextElement.height;\n }\n let originalContainerData;\n if (propertiesUpdated) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n else {\n originalContainerData = originalContainerCache[container.id];\n if (!originalContainerData) {\n originalContainerData = updateOriginalContainerCache(container.id, containerDims.height);\n }\n }\n maxWidth = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container);\n maxHeight = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && textElementHeight > maxHeight) {\n const diff = Math.min(textElementHeight - maxHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height + diff });\n return;\n }\n else if (\n // autoshrink container height until original container height\n // is reached when text is removed\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) &&\n containerDims.height > originalContainerData.height &&\n textElementHeight < maxHeight) {\n const diff = Math.min(maxHeight - textElementHeight, approxLineHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, { height: containerDims.height - diff });\n }\n // Start pushing text upward until a diff of 30px (padding)\n // is reached\n else {\n const containerCoords = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerCoords)(container);\n // vertically center align the text\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.MIDDLE) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n coordY =\n containerCoords.y + maxHeight / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY = containerCoords.y + (maxHeight - textElementHeight);\n }\n }\n }\n const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n const initialSelectionStart = editable.selectionStart;\n const initialSelectionEnd = editable.selectionEnd;\n const initialLength = editable.value.length;\n editable.value = updatedTextElement.originalText;\n // restore cursor position after value updated so it doesn't\n // go to the end of text when container auto expanded\n if (initialSelectionStart === initialSelectionEnd &&\n initialSelectionEnd !== initialLength) {\n // get diff between length and selection end and shift\n // the cursor by \"diff\" times to position correctly\n const diff = initialLength - initialSelectionEnd;\n editable.selectionStart = editable.value.length - diff;\n editable.selectionEnd = editable.value.length - diff;\n }\n const lines = updatedTextElement.originalText.split(\"\\n\");\n const lineHeight = updatedTextElement.containerId\n ? approxLineHeight\n : updatedTextElement.height / lines.length;\n if (!container) {\n maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n textElementWidth = Math.min(textElementWidth, maxWidth);\n }\n else {\n textElementWidth += 0.5;\n }\n // Make sure text editor height doesn't go beyond viewport\n const editorMaxHeight = (appState.height - viewportY) / appState.zoom.value;\n Object.assign(editable.style, {\n font: (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement),\n // must be defined *after* font ¯\\_(ツ)_/¯\n lineHeight: `${lineHeight}px`,\n width: `${textElementWidth}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(textElementWidth, textElementHeight, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextElementAngle)(updatedTextElement), appState, maxWidth, editorMaxHeight),\n textAlign,\n verticalAlign,\n color: updatedTextElement.strokeColor,\n opacity: updatedTextElement.opacity / 100,\n filter: \"var(--theme-filter)\",\n maxHeight: `${editorMaxHeight}px`,\n });\n // For some reason updating font attribute doesn't set font family\n // hence updating font family explicitly for test environment\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_1__.isTestEnv)()) {\n editable.style.fontFamily = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontFamilyString)(updatedTextElement);\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(updatedTextElement, { x: coordX, y: coordY });\n }\n };\n const editable = document.createElement(\"textarea\");\n editable.dir = \"auto\";\n editable.tabIndex = 0;\n editable.dataset.type = \"wysiwyg\";\n // prevent line wrapping on Safari\n editable.wrap = \"off\";\n editable.classList.add(\"excalidraw-wysiwyg\");\n let whiteSpace = \"pre\";\n let wordBreak = \"normal\";\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n whiteSpace = \"pre-wrap\";\n wordBreak = \"break-word\";\n }\n Object.assign(editable.style, {\n position: \"absolute\",\n display: \"inline-block\",\n minHeight: \"1em\",\n backfaceVisibility: \"hidden\",\n margin: 0,\n padding: 0,\n border: 0,\n outline: 0,\n resize: \"none\",\n background: \"transparent\",\n overflow: \"hidden\",\n // must be specified because in dark mode canvas creates a stacking context\n zIndex: \"var(--zIndex-wysiwyg)\",\n wordBreak,\n // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n whiteSpace,\n overflowWrap: \"break-word\",\n boxSizing: \"content-box\",\n });\n updateWysiwygStyle();\n if (onChange) {\n editable.onpaste = (event) => __awaiter(void 0, void 0, void 0, function* () {\n const clipboardData = yield (0,_clipboard__WEBPACK_IMPORTED_MODULE_10__.parseClipboard)(event, true);\n if (!clipboardData.text) {\n return;\n }\n const data = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(clipboardData.text);\n if (!data) {\n return;\n }\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)({\n fontSize: app.state.currentItemFontSize,\n fontFamily: app.state.currentItemFontFamily,\n });\n if (container) {\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(`${editable.value}${data}`, font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const width = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getTextWidth)(wrappedText, font);\n editable.style.width = `${width}px`;\n }\n });\n editable.oninput = () => {\n var _a;\n const updatedTextElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(id);\n const font = (0,_utils__WEBPACK_IMPORTED_MODULE_1__.getFontString)(updatedTextElement);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const wrappedText = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value), font, (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getMaxContainerWidth)(container));\n const { width, height } = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.measureText)(wrappedText, font);\n editable.style.width = `${width}px`;\n editable.style.height = `${height}px`;\n }\n onChange((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.normalizeText)(editable.value));\n };\n }\n editable.onkeydown = (event) => {\n if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomIn);\n updateWysiwygStyle();\n }\n else if (!event.shiftKey && _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut.keyTest(event)) {\n event.preventDefault();\n app.actionManager.executeAction(_actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__.actionZoomOut);\n updateWysiwygStyle();\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionDecreaseFontSize);\n }\n else if (_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize.keyTest(event)) {\n app.actionManager.executeAction(_actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__.actionIncreaseFontSize);\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ESCAPE) {\n event.preventDefault();\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.ENTER && event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD]) {\n event.preventDefault();\n if (event.isComposing || event.keyCode === 229) {\n return;\n }\n submittedViaKeyboard = true;\n handleSubmit();\n }\n else if (event.key === _keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.TAB ||\n (event[_keys__WEBPACK_IMPORTED_MODULE_0__.KEYS.CTRL_OR_CMD] &&\n (event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT ||\n event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_RIGHT))) {\n event.preventDefault();\n if (event.isComposing) {\n return;\n }\n else if (event.shiftKey || event.code === _keys__WEBPACK_IMPORTED_MODULE_0__.CODES.BRACKET_LEFT) {\n outdent();\n }\n else {\n indent();\n }\n // We must send an input event to resize the element\n editable.dispatchEvent(new Event(\"input\"));\n }\n };\n const TAB_SIZE = 4;\n const TAB = \" \".repeat(TAB_SIZE);\n const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n const indent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex);\n value = `${startValue}${TAB}${endValue}`;\n });\n editable.value = value;\n editable.selectionStart = selectionStart + TAB_SIZE;\n editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n };\n const outdent = () => {\n const { selectionStart, selectionEnd } = editable;\n const linesStartIndices = getSelectedLinesStartIndices();\n const removedTabs = [];\n let value = editable.value;\n linesStartIndices.forEach((startIndex) => {\n const tabMatch = value\n .slice(startIndex, startIndex + TAB_SIZE)\n .match(RE_LEADING_TAB);\n if (tabMatch) {\n const startValue = value.slice(0, startIndex);\n const endValue = value.slice(startIndex + tabMatch[0].length);\n // Delete a tab from the line\n value = `${startValue}${endValue}`;\n removedTabs.push(startIndex);\n }\n });\n editable.value = value;\n if (removedTabs.length) {\n if (selectionStart > removedTabs[removedTabs.length - 1]) {\n editable.selectionStart = Math.max(selectionStart - TAB_SIZE, removedTabs[removedTabs.length - 1]);\n }\n else {\n // If the cursor is before the first tab removed, ex:\n // Line| #1\n // Line #2\n // Lin|e #3\n // we should reset the selectionStart to his initial value.\n editable.selectionStart = selectionStart;\n }\n editable.selectionEnd = Math.max(editable.selectionStart, selectionEnd - TAB_SIZE * removedTabs.length);\n }\n };\n /**\n * @returns indices of start positions of selected lines, in reverse order\n */\n const getSelectedLinesStartIndices = () => {\n let { selectionStart, selectionEnd, value } = editable;\n // chars before selectionStart on the same line\n const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)[0]\n .length;\n // put caret at the start of the line\n selectionStart = selectionStart - startOffset;\n const selected = value.slice(selectionStart, selectionEnd);\n return selected\n .split(\"\\n\")\n .reduce((startIndices, line, idx, lines) => startIndices.concat(idx\n ? // curr line index is prev line's start + prev line's length + \\n\n startIndices[idx - 1] + lines[idx - 1].length + 1\n : // first selected line\n selectionStart), [])\n .reverse();\n };\n const stopEvent = (event) => {\n event.preventDefault();\n event.stopPropagation();\n };\n // using a state variable instead of passing it to the handleSubmit callback\n // so that we don't need to create separate a callback for event handlers\n let submittedViaKeyboard = false;\n const handleSubmit = () => {\n var _a, _b;\n // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n // wysiwyg on update\n cleanup();\n const updateElement = (_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.id);\n if (!updateElement) {\n return;\n }\n let text = editable.value;\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(updateElement);\n if (container) {\n text = updateElement.text;\n if (editable.value.trim()) {\n const boundTextElementId = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementId)(container);\n if (!boundTextElementId || boundTextElementId !== element.id) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: element.id,\n }),\n });\n }\n }\n else {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_5__.mutateElement)(container, {\n boundElements: (_b = container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(ele)),\n });\n }\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.redrawTextBoundingBox)(updateElement, container);\n }\n onSubmit({\n text,\n viaKeyboard: submittedViaKeyboard,\n originalText: editable.value,\n });\n };\n const cleanup = () => {\n if (isDestroyed) {\n return;\n }\n isDestroyed = true;\n // remove events to ensure they don't late-fire\n editable.onblur = null;\n editable.oninput = null;\n editable.onkeydown = null;\n if (observer) {\n observer.disconnect();\n }\n window.removeEventListener(\"resize\", updateWysiwygStyle);\n window.removeEventListener(\"wheel\", stopEvent, true);\n window.removeEventListener(\"pointerdown\", onPointerDown);\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n window.removeEventListener(\"blur\", handleSubmit);\n unbindUpdate();\n editable.remove();\n };\n const bindBlurEvent = (event) => {\n window.removeEventListener(\"pointerup\", bindBlurEvent);\n // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n // trigger the blur on ensuing pointerup.\n // Also to handle cases such as picking a color which would trigger a blur\n // in that same tick.\n const target = event === null || event === void 0 ? void 0 : event.target;\n const isTargetColorPicker = target instanceof HTMLInputElement &&\n target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(target);\n setTimeout(() => {\n editable.onblur = handleSubmit;\n if (target && isTargetColorPicker) {\n target.onblur = () => {\n editable.focus();\n };\n }\n // case: clicking on the same property → no change → no update → no focus\n if (!isTargetColorPicker) {\n editable.focus();\n }\n });\n };\n // prevent blur when changing properties from the menu\n const onPointerDown = (event) => {\n const isTargetColorPicker = event.target instanceof HTMLInputElement &&\n event.target.closest(\".color-picker-input\") &&\n (0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target);\n if (((event.target instanceof HTMLElement ||\n event.target instanceof SVGElement) &&\n event.target.closest(`.${_constants__WEBPACK_IMPORTED_MODULE_4__.CLASSES.SHAPE_ACTIONS_MENU}`) &&\n !(0,_utils__WEBPACK_IMPORTED_MODULE_1__.isWritableElement)(event.target)) ||\n isTargetColorPicker) {\n editable.onblur = null;\n window.addEventListener(\"pointerup\", bindBlurEvent);\n // handle edge-case where pointerup doesn't fire e.g. due to user\n // alt-tabbing away\n window.addEventListener(\"blur\", handleSubmit);\n }\n };\n // handle updates of textElement properties of editing element\n const unbindUpdate = _scene_Scene__WEBPACK_IMPORTED_MODULE_2__[\"default\"].getScene(element).addCallback(() => {\n var _a;\n updateWysiwygStyle();\n const isColorPickerActive = !!((_a = document.activeElement) === null || _a === void 0 ? void 0 : _a.closest(\".color-picker-input\"));\n if (!isColorPickerActive) {\n editable.focus();\n }\n });\n // ---------------------------------------------------------------------------\n let isDestroyed = false;\n // select on init (focusing is done separately inside the bindBlurEvent()\n // because we need it to happen *after* the blur event from `pointerdown`)\n editable.select();\n bindBlurEvent();\n // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n // is preferred so we catch changes from host, where window may not resize.\n let observer = null;\n if (canvas && \"ResizeObserver\" in window) {\n observer = new window.ResizeObserver(() => {\n updateWysiwygStyle();\n });\n observer.observe(canvas);\n }\n else {\n window.addEventListener(\"resize\", updateWysiwygStyle);\n }\n window.addEventListener(\"pointerdown\", onPointerDown);\n window.addEventListener(\"wheel\", stopEvent, {\n passive: false,\n capture: true,\n });\n excalidrawContainer === null || excalidrawContainer === void 0 ? void 0 : excalidrawContainer.querySelector(\".excalidraw-textEditorContainer\").appendChild(editable);\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFhLEVBQUUsQ0FBQztJQUVoQix3RUFBd0U7SUFDeEUsMkVBQTJFO0lBQzNFLElBQUksUUFBUSxHQUEwQixJQUFJLENBQUM7SUFDM0MsSUFBSSxNQUFNLElBQUksZ0JBQWdCLElBQUksTUFBTSxFQUFFO1FBQ3hDLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ3hDLGtCQUFrQixFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCO1NBQU07UUFDTCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7S0FDdkQ7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO1FBQzFDLE9BQU8sRUFBRSxLQUFLO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDLENBQUM7SUFDSCxtQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FDZixhQUFhLENBQUMsaUNBQWlDLEVBQ2hELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3g/OGY0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQge1xuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0Rm9udEZhbWlseVN0cmluZyxcbiAgaXNUZXN0RW52LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7XG4gIGlzQXJyb3dFbGVtZW50LFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IENMQVNTRVMsIFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQge1xuICBnZXRBcHByb3hMaW5lSGVpZ2h0LFxuICBnZXRCb3VuZFRleHRFbGVtZW50SWQsXG4gIGdldENvbnRhaW5lckNvb3JkcyxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgZ2V0VGV4dEVsZW1lbnRBbmdsZSxcbiAgZ2V0VGV4dFdpZHRoLFxuICBtZWFzdXJlVGV4dCxcbiAgbm9ybWFsaXplVGV4dCxcbiAgcmVkcmF3VGV4dEJvdW5kaW5nQm94LFxuICB3cmFwVGV4dCxcbiAgZ2V0TWF4Q29udGFpbmVySGVpZ2h0LFxuICBnZXRNYXhDb250YWluZXJXaWR0aCxcbn0gZnJvbSBcIi4vdGV4dEVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGFjdGlvbkRlY3JlYXNlRm9udFNpemUsXG4gIGFjdGlvbkluY3JlYXNlRm9udFNpemUsXG59IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvblByb3BlcnRpZXNcIjtcbmltcG9ydCB7IGFjdGlvblpvb21JbiwgYWN0aW9uWm9vbU91dCB9IGZyb20gXCIuLi9hY3Rpb25zL2FjdGlvbkNhbnZhc1wiO1xuaW1wb3J0IEFwcCBmcm9tIFwiLi4vY29tcG9uZW50cy9BcHBcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBwYXJzZUNsaXBib2FyZCB9IGZyb20gXCIuLi9jbGlwYm9hcmRcIjtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBtYXhXaWR0aDogbnVtYmVyLFxuICBtYXhIZWlnaHQ6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCB7IHpvb20gfSA9IGFwcFN0YXRlO1xuICBjb25zdCBkZWdyZWUgPSAoMTgwICogYW5nbGUpIC8gTWF0aC5QSTtcbiAgbGV0IHRyYW5zbGF0ZVggPSAod2lkdGggKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGxldCB0cmFuc2xhdGVZID0gKGhlaWdodCAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgaWYgKHdpZHRoID4gbWF4V2lkdGggJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVggPSAobWF4V2lkdGggKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1heEhlaWdodCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWSA9IChtYXhIZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgcmV0dXJuIGB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpIHNjYWxlKCR7em9vbS52YWx1ZX0pIHJvdGF0ZSgke2RlZ3JlZX1kZWcpYDtcbn07XG5cbmNvbnN0IG9yaWdpbmFsQ29udGFpbmVyQ2FjaGU6IHtcbiAgW2lkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdXTpcbiAgICB8IHtcbiAgICAgICAgaGVpZ2h0OiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImhlaWdodFwiXTtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZDtcbn0gPSB7fTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuICBoZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaGVpZ2h0XCJdLFxuKSA9PiB7XG4gIGNvbnN0IGRhdGEgPVxuICAgIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdIHx8IChvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSA9IHsgaGVpZ2h0IH0pO1xuICBkYXRhLmhlaWdodCA9IGhlaWdodDtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbikgPT4ge1xuICBpZiAob3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0pIHtcbiAgICBkZWxldGUgb3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPcmlnaW5hbENvbnRhaW5lckhlaWdodEZyb21DYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdPy5oZWlnaHQgPz8gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB0ZXh0V3lzaXd5ZyA9ICh7XG4gIGlkLFxuICBvbkNoYW5nZSxcbiAgb25TdWJtaXQsXG4gIGdldFZpZXdwb3J0Q29vcmRzLFxuICBlbGVtZW50LFxuICBjYW52YXMsXG4gIGV4Y2FsaWRyYXdDb250YWluZXIsXG4gIGFwcCxcbn06IHtcbiAgaWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl07XG4gIG9uQ2hhbmdlPzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25TdWJtaXQ6IChkYXRhOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHZpYUtleWJvYXJkOiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9KSA9PiB2b2lkO1xuICBnZXRWaWV3cG9ydENvb3JkczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBleGNhbGlkcmF3Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gIGFwcDogQXBwO1xufSkgPT4ge1xuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSAoXG4gICAgdXBkYXRlZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgZWRpdGFibGU6IEhUTUxUZXh0QXJlYUVsZW1lbnQsXG4gICkgPT4ge1xuICAgIGlmICghZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSB8fCAhZWRpdGFibGUuc3R5bGUuZm9udFNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoL1wiL2csIFwiXCIpO1xuICAgIGlmIChcbiAgICAgIGdldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5OiB1cGRhdGVkVGV4dEVsZW1lbnQuZm9udEZhbWlseSB9KSAhPT1cbiAgICAgIGN1cnJlbnRGb250XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGAke3VwZGF0ZWRUZXh0RWxlbWVudC5mb250U2l6ZX1weGAgIT09IGVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9ICgpID0+IHtcbiAgICBjb25zdCBhcHBTdGF0ZSA9IGFwcC5zdGF0ZTtcbiAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPVxuICAgICAgU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PihpZCk7XG5cbiAgICBpZiAoIXVwZGF0ZWRUZXh0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRleHRBbGlnbiwgdmVydGljYWxBbGlnbiB9ID0gdXBkYXRlZFRleHRFbGVtZW50O1xuICAgIGNvbnN0IGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KFxuICAgICAgZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICk7XG4gICAgaWYgKHVwZGF0ZWRUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCkpIHtcbiAgICAgIGxldCBjb29yZFggPSB1cGRhdGVkVGV4dEVsZW1lbnQueDtcbiAgICAgIGxldCBjb29yZFkgPSB1cGRhdGVkVGV4dEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIGxldCBtYXhXaWR0aCA9IHVwZGF0ZWRUZXh0RWxlbWVudC53aWR0aDtcblxuICAgICAgbGV0IG1heEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBsZXQgdGV4dEVsZW1lbnRXaWR0aCA9IHVwZGF0ZWRUZXh0RWxlbWVudC53aWR0aDtcbiAgICAgIC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXQnc1xuICAgICAgLy8gd2hhdCBpcyBnb2luZyB0byBiZSB1c2VkIGZvciB1bmJvdW5kZWQgdGV4dFxuICAgICAgbGV0IHRleHRFbGVtZW50SGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodDtcblxuICAgICAgaWYgKGNvbnRhaW5lciAmJiB1cGRhdGVkVGV4dEVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBjb25zdCBib3VuZFRleHRDb29yZHMgPVxuICAgICAgICAgICAgTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICAgICAgdXBkYXRlZFRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIGNvb3JkWCA9IGJvdW5kVGV4dENvb3Jkcy54O1xuICAgICAgICAgIGNvb3JkWSA9IGJvdW5kVGV4dENvb3Jkcy55O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXNVcGRhdGVkID0gdGV4dFByb3BlcnRpZXNVcGRhdGVkKFxuICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudCxcbiAgICAgICAgICBlZGl0YWJsZSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICAgICAgLy8gdXNpbmcgZWRpdG9yLnN0eWxlLmhlaWdodCB0byBnZXQgdGhlIGFjY3VyYXRlIGhlaWdodCBvZiB0ZXh0IGVkaXRvclxuICAgICAgICBjb25zdCBlZGl0b3JIZWlnaHQgPSBOdW1iZXIoZWRpdGFibGUuc3R5bGUuaGVpZ2h0LnNsaWNlKDAsIC0yKSk7XG4gICAgICAgIGlmIChlZGl0b3JIZWlnaHQgPiAwKSB7XG4gICAgICAgICAgdGV4dEVsZW1lbnRIZWlnaHQgPSBlZGl0b3JIZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnRpZXNVcGRhdGVkKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIGhlaWdodCBvZiB0aGUgZWRpdG9yIGFmdGVyIHByb3BlcnRpZXMgdXBkYXRlZFxuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmlnaW5hbENvbnRhaW5lckRhdGE7XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVyRGF0YSA9IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoXG4gICAgICAgICAgICBjb250YWluZXIuaWQsXG4gICAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCxcbiAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVyRGF0YSA9IG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbY29udGFpbmVyLmlkXTtcbiAgICAgICAgICBpZiAoIW9yaWdpbmFsQ29udGFpbmVyRGF0YSkge1xuICAgICAgICAgICAgb3JpZ2luYWxDb250YWluZXJEYXRhID0gdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShcbiAgICAgICAgICAgICAgY29udGFpbmVyLmlkLFxuICAgICAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgICAgICBtYXhIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcblxuICAgICAgICAvLyBhdXRvZ3JvdyBjb250YWluZXIgaGVpZ2h0IGlmIHRleHQgZXhjZWVkc1xuICAgICAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiYgdGV4dEVsZW1lbnRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCAtIG1heEhlaWdodCxcbiAgICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lckRpbXMuaGVpZ2h0ICsgZGlmZiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gYXV0b3NocmluayBjb250YWluZXIgaGVpZ2h0IHVudGlsIG9yaWdpbmFsIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCA+IG9yaWdpbmFsQ29udGFpbmVyRGF0YS5oZWlnaHQgJiZcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA8IG1heEhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oXG4gICAgICAgICAgICBtYXhIZWlnaHQgLSB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lckRpbXMuaGVpZ2h0IC0gZGlmZiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFydCBwdXNoaW5nIHRleHQgdXB3YXJkIHVudGlsIGEgZGlmZiBvZiAzMHB4IChwYWRkaW5nKVxuICAgICAgICAvLyBpcyByZWFjaGVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNvb3JkcyA9IGdldENvbnRhaW5lckNvb3Jkcyhjb250YWluZXIpO1xuXG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFKSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgY29vcmRZID1cbiAgICAgICAgICAgICAgICBjb250YWluZXJDb29yZHMueSArIG1heEhlaWdodCAvIDIgLSB0ZXh0RWxlbWVudEhlaWdodCAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICAgICAgICAgIGNvb3JkWSA9IGNvbnRhaW5lckNvb3Jkcy55ICsgKG1heEhlaWdodCAtIHRleHRFbGVtZW50SGVpZ2h0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFt2aWV3cG9ydFgsIHZpZXdwb3J0WV0gPSBnZXRWaWV3cG9ydENvb3Jkcyhjb29yZFgsIGNvb3JkWSk7XG4gICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uU3RhcnQgPSBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydDtcbiAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb25FbmQgPSBlZGl0YWJsZS5zZWxlY3Rpb25FbmQ7XG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gZWRpdGFibGUudmFsdWUubGVuZ3RoO1xuICAgICAgZWRpdGFibGUudmFsdWUgPSB1cGRhdGVkVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0O1xuXG4gICAgICAvLyByZXN0b3JlIGN1cnNvciBwb3NpdGlvbiBhZnRlciB2YWx1ZSB1cGRhdGVkIHNvIGl0IGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRvIHRoZSBlbmQgb2YgdGV4dCB3aGVuIGNvbnRhaW5lciBhdXRvIGV4cGFuZGVkXG4gICAgICBpZiAoXG4gICAgICAgIGluaXRpYWxTZWxlY3Rpb25TdGFydCA9PT0gaW5pdGlhbFNlbGVjdGlvbkVuZCAmJlxuICAgICAgICBpbml0aWFsU2VsZWN0aW9uRW5kICE9PSBpbml0aWFsTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgLy8gZ2V0IGRpZmYgYmV0d2VlbiBsZW5ndGggYW5kIHNlbGVjdGlvbiBlbmQgYW5kIHNoaWZ0XG4gICAgICAgIC8vIHRoZSBjdXJzb3IgYnkgXCJkaWZmXCIgdGltZXMgdG8gcG9zaXRpb24gY29ycmVjdGx5XG4gICAgICAgIGNvbnN0IGRpZmYgPSBpbml0aWFsTGVuZ3RoIC0gaW5pdGlhbFNlbGVjdGlvbkVuZDtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBlZGl0YWJsZS52YWx1ZS5sZW5ndGggLSBkaWZmO1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBlZGl0YWJsZS52YWx1ZS5sZW5ndGggLSBkaWZmO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lcyA9IHVwZGF0ZWRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkXG4gICAgICAgID8gYXBwcm94TGluZUhlaWdodFxuICAgICAgICA6IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9IChhcHBTdGF0ZS53aWR0aCAtIDggLSB2aWV3cG9ydFgpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgICAgdGV4dEVsZW1lbnRXaWR0aCA9IE1hdGgubWluKHRleHRFbGVtZW50V2lkdGgsIG1heFdpZHRoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRleHRFbGVtZW50V2lkdGggKz0gMC41O1xuICAgICAgfVxuICAgICAgLy8gTWFrZSBzdXJlIHRleHQgZWRpdG9yIGhlaWdodCBkb2Vzbid0IGdvIGJleW9uZCB2aWV3cG9ydFxuICAgICAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID1cbiAgICAgICAgKGFwcFN0YXRlLmhlaWdodCAtIHZpZXdwb3J0WSkgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgT2JqZWN0LmFzc2lnbihlZGl0YWJsZS5zdHlsZSwge1xuICAgICAgICBmb250OiBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgICAgIC8vIG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIGZvbnQgwq9cXF8o44OEKV8vwq9cbiAgICAgICAgbGluZUhlaWdodDogYCR7bGluZUhlaWdodH1weGAsXG4gICAgICAgIHdpZHRoOiBgJHt0ZXh0RWxlbWVudFdpZHRofXB4YCxcbiAgICAgICAgaGVpZ2h0OiBgJHt0ZXh0RWxlbWVudEhlaWdodH1weGAsXG4gICAgICAgIGxlZnQ6IGAke3ZpZXdwb3J0WH1weGAsXG4gICAgICAgIHRvcDogYCR7dmlld3BvcnRZfXB4YCxcbiAgICAgICAgdHJhbnNmb3JtOiBnZXRUcmFuc2Zvcm0oXG4gICAgICAgICAgdGV4dEVsZW1lbnRXaWR0aCxcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICBnZXRUZXh0RWxlbWVudEFuZ2xlKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIHZlcnRpY2FsQWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkVGV4dEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRUZXh0RWxlbWVudC5vcGFjaXR5IC8gMTAwLFxuICAgICAgICBmaWx0ZXI6IFwidmFyKC0tdGhlbWUtZmlsdGVyKVwiLFxuICAgICAgICBtYXhIZWlnaHQ6IGAke2VkaXRvck1heEhlaWdodH1weGAsXG4gICAgICB9KTtcbiAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB1cGRhdGluZyBmb250IGF0dHJpYnV0ZSBkb2Vzbid0IHNldCBmb250IGZhbWlseVxuICAgICAgLy8gaGVuY2UgdXBkYXRpbmcgZm9udCBmYW1pbHkgZXhwbGljaXRseSBmb3IgdGVzdCBlbnZpcm9ubWVudFxuICAgICAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkgPSBnZXRGb250RmFtaWx5U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICB9XG4gICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCwgeyB4OiBjb29yZFgsIHk6IGNvb3JkWSB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG5cbiAgZWRpdGFibGUuZGlyID0gXCJhdXRvXCI7XG4gIGVkaXRhYmxlLnRhYkluZGV4ID0gMDtcbiAgZWRpdGFibGUuZGF0YXNldC50eXBlID0gXCJ3eXNpd3lnXCI7XG4gIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyBvbiBTYWZhcmlcbiAgZWRpdGFibGUud3JhcCA9IFwib2ZmXCI7XG4gIGVkaXRhYmxlLmNsYXNzTGlzdC5hZGQoXCJleGNhbGlkcmF3LXd5c2l3eWdcIik7XG5cbiAgbGV0IHdoaXRlU3BhY2UgPSBcInByZVwiO1xuICBsZXQgd29yZEJyZWFrID0gXCJub3JtYWxcIjtcblxuICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgd2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgICB3b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgfVxuICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIG1pbkhlaWdodDogXCIxZW1cIixcbiAgICBiYWNrZmFjZVZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIG91dGxpbmU6IDAsXG4gICAgcmVzaXplOiBcIm5vbmVcIixcbiAgICBiYWNrZ3JvdW5kOiBcInRyYW5zcGFyZW50XCIsXG4gICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgLy8gbXVzdCBiZSBzcGVjaWZpZWQgYmVjYXVzZSBpbiBkYXJrIG1vZGUgY2FudmFzIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0XG4gICAgekluZGV4OiBcInZhcigtLXpJbmRleC13eXNpd3lnKVwiLFxuICAgIHdvcmRCcmVhayxcbiAgICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgKGB3aGl0ZXNwYWNlOiBub3dyYXBgIGRvZXNuJ3Qgd29yayBvbiBGRilcbiAgICB3aGl0ZVNwYWNlLFxuICAgIG92ZXJmbG93V3JhcDogXCJicmVhay13b3JkXCIsXG4gICAgYm94U2l6aW5nOiBcImNvbnRlbnQtYm94XCIsXG4gIH0pO1xuICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcblxuICBpZiAob25DaGFuZ2UpIHtcbiAgICBlZGl0YWJsZS5vbnBhc3RlID0gYXN5bmMgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBjbGlwYm9hcmREYXRhID0gYXdhaXQgcGFyc2VDbGlwYm9hcmQoZXZlbnQsIHRydWUpO1xuICAgICAgaWYgKCFjbGlwYm9hcmREYXRhLnRleHQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZGF0YSA9IG5vcm1hbGl6ZVRleHQoY2xpcGJvYXJkRGF0YS50ZXh0KTtcbiAgICAgIGlmICghZGF0YSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBmb250ID0gZ2V0Rm9udFN0cmluZyh7XG4gICAgICAgIGZvbnRTaXplOiBhcHAuc3RhdGUuY3VycmVudEl0ZW1Gb250U2l6ZSxcbiAgICAgICAgZm9udEZhbWlseTogYXBwLnN0YXRlLmN1cnJlbnRJdGVtRm9udEZhbWlseSxcbiAgICAgIH0pO1xuICAgICAgaWYgKGNvbnRhaW5lcikge1xuICAgICAgICBjb25zdCB3cmFwcGVkVGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIGAke2VkaXRhYmxlLnZhbHVlfSR7ZGF0YX1gLFxuICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKSxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgod3JhcHBlZFRleHQsIGZvbnQpO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS53aWR0aCA9IGAke3dpZHRofXB4YDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZWRpdGFibGUub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgICBpZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgICAgY29uc3QgZm9udCA9IGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIGlmIChpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgY29uc3Qgd3JhcHBlZFRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICBub3JtYWxpemVUZXh0KGVkaXRhYmxlLnZhbHVlKSxcbiAgICAgICAgICBmb250LFxuICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciEpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQgfSA9IG1lYXN1cmVUZXh0KHdyYXBwZWRUZXh0LCBmb250KTtcbiAgICAgICAgZWRpdGFibGUuc3R5bGUud2lkdGggPSBgJHt3aWR0aH1weGA7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2hlaWdodH1weGA7XG4gICAgICB9XG4gICAgICBvbkNoYW5nZShub3JtYWxpemVUZXh0KGVkaXRhYmxlLnZhbHVlKSk7XG4gICAgfTtcbiAgfVxuXG4gIGVkaXRhYmxlLm9ua2V5ZG93biA9IChldmVudCkgPT4ge1xuICAgIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgYWN0aW9uWm9vbUluLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25ab29tSW4pO1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSBlbHNlIGlmICghZXZlbnQuc2hpZnRLZXkgJiYgYWN0aW9uWm9vbU91dC5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uWm9vbU91dCk7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkRlY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uRGVjcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb25JbmNyZWFzZUZvbnRTaXplLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkluY3JlYXNlRm9udFNpemUpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVTQ0FQRSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoZXZlbnQua2V5ID09PSBLRVlTLkVOVEVSICYmIGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LmlzQ29tcG9zaW5nIHx8IGV2ZW50LmtleUNvZGUgPT09IDIyOSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgZXZlbnQua2V5ID09PSBLRVlTLlRBQiB8fFxuICAgICAgKGV2ZW50W0tFWVMuQ1RSTF9PUl9DTURdICYmXG4gICAgICAgIChldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQgfHxcbiAgICAgICAgICBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX1JJR0hUKSlcbiAgICApIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfSBlbHNlIGlmIChldmVudC5zaGlmdEtleSB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQpIHtcbiAgICAgICAgb3V0ZGVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXZSBtdXN0IHNlbmQgYW4gaW5wdXQgZXZlbnQgdG8gcmVzaXplIHRoZSBlbGVtZW50XG4gICAgICBlZGl0YWJsZS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgVEFCX1NJWkUgPSA0O1xuICBjb25zdCBUQUIgPSBcIiBcIi5yZXBlYXQoVEFCX1NJWkUpO1xuICBjb25zdCBSRV9MRUFESU5HX1RBQiA9IG5ldyBSZWdFeHAoYF4gezEsJHtUQUJfU0laRX19YCk7XG4gIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXgpO1xuXG4gICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtUQUJ9JHtlbmRWYWx1ZX1gO1xuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgKyBUQUJfU0laRTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQgKyBUQUJfU0laRSAqIGxpbmVzU3RhcnRJbmRpY2VzLmxlbmd0aDtcbiAgfTtcblxuICBjb25zdCBvdXRkZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgY29uc3QgcmVtb3ZlZFRhYnM6IG51bWJlcltdID0gW107XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0YWJNYXRjaCA9IHZhbHVlXG4gICAgICAgIC5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgVEFCX1NJWkUpXG4gICAgICAgIC5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gRGVsZXRlIGEgdGFiIGZyb20gdGhlIGxpbmVcbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAocmVtb3ZlZFRhYnMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSkge1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0IC0gVEFCX1NJWkUsXG4gICAgICAgICAgcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gTWF0aC5tYXgoXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBzZWxlY3Rpb25FbmQgLSBUQUJfU0laRSAqIHJlbW92ZWRUYWJzLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbmRpY2VzIG9mIHN0YXJ0IHBvc2l0aW9ucyBvZiBzZWxlY3RlZCBsaW5lcywgaW4gcmV2ZXJzZSBvcmRlclxuICAgKi9cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9ICgpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kLCB2YWx1ZSB9ID0gZWRpdGFibGU7XG5cbiAgICAvLyBjaGFycyBiZWZvcmUgc2VsZWN0aW9uU3RhcnQgb24gdGhlIHNhbWUgbGluZVxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pIVswXVxuICAgICAgLmxlbmd0aDtcbiAgICAvLyBwdXQgY2FyZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB2YWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSA9PlxuICAgICAgICAgIHN0YXJ0SW5kaWNlcy5jb25jYXQoXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICAgICAgPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgICAgICAgICAgICBzdGFydEluZGljZXNbaWR4IC0gMV0gKyBsaW5lc1tpZHggLSAxXS5sZW5ndGggKyAxXG4gICAgICAgICAgICAgIDogLy8gZmlyc3Qgc2VsZWN0ZWQgbGluZVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICksXG4gICAgICAgIFtdIGFzIG51bWJlcltdLFxuICAgICAgKVxuICAgICAgLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfTtcblxuICAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcbiAgbGV0IHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gZmFsc2U7XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICBlbGVtZW50LmlkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuICAgICAgaWYgKGVkaXRhYmxlLnZhbHVlLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+XG4gICAgICAgICAgICAgICFpc1RleHRFbGVtZW50KFxuICAgICAgICAgICAgICAgIGVsZSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveCh1cGRhdGVFbGVtZW50LCBjb250YWluZXIpO1xuICAgIH1cblxuICAgIG9uU3VibWl0KHtcbiAgICAgIHRleHQsXG4gICAgICB2aWFLZXlib2FyZDogc3VibWl0dGVkVmlhS2V5Ym9hcmQsXG4gICAgICBvcmlnaW5hbFRleHQ6IGVkaXRhYmxlLnZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgZXZlbnRzIHRvIGVuc3VyZSB0aGV5IGRvbid0IGxhdGUtZmlyZVxuICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IG51bGw7XG4gICAgZWRpdGFibGUub25rZXlkb3duID0gbnVsbDtcblxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG5cbiAgICB1bmJpbmRVcGRhdGUoKTtcblxuICAgIGVkaXRhYmxlLnJlbW92ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGJpbmRCbHVyRXZlbnQgPSAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgLy8gRGVmZXJyZWQgc28gdGhhdCB0aGUgcG9pbnRlcmRvd24gdGhhdCBpbml0aWF0ZXMgdGhlIHd5c2l3eWcgZG9lc24ndFxuICAgIC8vIHRyaWdnZXIgdGhlIGJsdXIgb24gZW5zdWluZyBwb2ludGVydXAuXG4gICAgLy8gQWxzbyB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcyBwaWNraW5nIGEgY29sb3Igd2hpY2ggd291bGQgdHJpZ2dlciBhIGJsdXJcbiAgICAvLyBpbiB0aGF0IHNhbWUgdGljay5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudD8udGFyZ2V0O1xuXG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICB0YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KHRhcmdldCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IGhhbmRsZVN1Ym1pdDtcbiAgICAgIGlmICh0YXJnZXQgJiYgaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICB0YXJnZXQub25ibHVyID0gKCkgPT4ge1xuICAgICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBjYXNlOiBjbGlja2luZyBvbiB0aGUgc2FtZSBwcm9wZXJ0eSDihpIgbm8gY2hhbmdlIOKGkiBubyB1cGRhdGUg4oaSIG5vIGZvY3VzXG4gICAgICBpZiAoIWlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBwcmV2ZW50IGJsdXIgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1lbnVcbiAgY29uc3Qgb25Qb2ludGVyRG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIGlmIChcbiAgICAgICgoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgJiZcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke0NMQVNTRVMuU0hBUEVfQUNUSU9OU19NRU5VfWApICYmXG4gICAgICAgICFpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB8fFxuICAgICAgaXNUYXJnZXRDb2xvclBpY2tlclxuICAgICkge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgICAgLy8gaGFuZGxlIGVkZ2UtY2FzZSB3aGVyZSBwb2ludGVydXAgZG9lc24ndCBmaXJlIGUuZy4gZHVlIHRvIHVzZXJcbiAgICAgIC8vIGFsdC10YWJiaW5nIGF3YXlcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBoYW5kbGUgdXBkYXRlcyBvZiB0ZXh0RWxlbWVudCBwcm9wZXJ0aWVzIG9mIGVkaXRpbmcgZWxlbWVudFxuICBjb25zdCB1bmJpbmRVcGRhdGUgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuYWRkQ2FsbGJhY2soKCkgPT4ge1xuICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIGNvbnN0IGlzQ29sb3JQaWNrZXJBY3RpdmUgPSAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoXG4gICAgICBcIi5jb2xvci1waWNrZXItaW5wdXRcIixcbiAgICApO1xuICAgIGlmICghaXNDb2xvclBpY2tlckFjdGl2ZSkge1xuICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNlbGVjdCBvbiBpbml0IChmb2N1c2luZyBpcyBkb25lIHNlcGFyYXRlbHkgaW5zaWRlIHRoZSBiaW5kQmx1ckV2ZW50KClcbiAgLy8gYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGhhcHBlbiAqYWZ0ZXIqIHRoZSBibHVyIGV2ZW50IGZyb20gYHBvaW50ZXJkb3duYClcbiAgZWRpdGFibGUuc2VsZWN0KCk7XG4gIGJpbmRCbHVyRXZlbnQoKTtcblxuICAvLyByZXBvc2l0aW9uIHd5c2l3eWcgaW4gY2FzZSBvZiBjYW52YXMgaXMgcmVzaXplZC4gVXNpbmcgUmVzaXplT2JzZXJ2ZXJcbiAgLy8gaXMgcHJlZmVycmVkIHNvIHdlIGNhdGNoIGNoYW5nZXMgZnJvbSBob3N0LCB3aGVyZSB3aW5kb3cgbWF5IG5vdCByZXNpemUuXG4gIGxldCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgaWYgKGNhbnZhcyAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY2FudmFzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlOiB0cnVlLFxuICB9KTtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lclxuICAgID8ucXVlcnlTZWxlY3RvcihcIi5leGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIikhXG4gICAgLmFwcGVuZENoaWxkKGVkaXRhYmxlKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
3552
3552
|
|
|
3553
3553
|
/***/ }),
|
|
3554
3554
|
|
|
@@ -3570,7 +3570,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3570
3570
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3571
3571
|
|
|
3572
3572
|
"use strict";
|
|
3573
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"canApplyRoundnessTypeToElement\": () => (/* binding */ canApplyRoundnessTypeToElement),\n/* harmony export */ \"getDefaultRoundnessTypeForElement\": () => (/* binding */ getDefaultRoundnessTypeForElement),\n/* harmony export */ \"hasBoundTextElement\": () => (/* binding */ hasBoundTextElement),\n/* harmony export */ \"isArrowElement\": () => (/* binding */ isArrowElement),\n/* harmony export */ \"isBindableElement\": () => (/* binding */ isBindableElement),\n/* harmony export */ \"isBindingElement\": () => (/* binding */ isBindingElement),\n/* harmony export */ \"isBindingElementType\": () => (/* binding */ isBindingElementType),\n/* harmony export */ \"isBoundToContainer\": () => (/* binding */ isBoundToContainer),\n/* harmony export */ \"isExcalidrawElement\": () => (/* binding */ isExcalidrawElement),\n/* harmony export */ \"isFreeDrawElement\": () => (/* binding */ isFreeDrawElement),\n/* harmony export */ \"isFreeDrawElementType\": () => (/* binding */ isFreeDrawElementType),\n/* harmony export */ \"isGenericElement\": () => (/* binding */ isGenericElement),\n/* harmony export */ \"isImageElement\": () => (/* binding */ isImageElement),\n/* harmony export */ \"isInitializedImageElement\": () => (/* binding */ isInitializedImageElement),\n/* harmony export */ \"isLinearElement\": () => (/* binding */ isLinearElement),\n/* harmony export */ \"isLinearElementType\": () => (/* binding */ isLinearElementType),\n/* harmony export */ \"isTextBindableContainer\": () => (/* binding */ isTextBindableContainer),\n/* harmony export */ \"isTextElement\": () => (/* binding */ isTextElement),\n/* harmony export */ \"isUsingAdaptiveRadius\": () => (/* binding */ isUsingAdaptiveRadius),\n/* harmony export */ \"isUsingProportionalRadius\": () => (/* binding */ isUsingProportionalRadius)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\nconst isGenericElement = (element) => {\n return (element != null &&\n (element.type === \"selection\" ||\n element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\"));\n};\nconst isInitializedImageElement = (element) => {\n return !!element && element.type === \"image\" && !!element.fileId;\n};\nconst isImageElement = (element) => {\n return !!element && element.type === \"image\";\n};\nconst isTextElement = (element) => {\n return element != null && element.type === \"text\";\n};\nconst isFreeDrawElement = (element) => {\n return element != null && isFreeDrawElementType(element.type);\n};\nconst isFreeDrawElementType = (elementType) => {\n return elementType === \"freedraw\";\n};\nconst isLinearElement = (element) => {\n return element != null && isLinearElementType(element.type);\n};\nconst isArrowElement = (element) => {\n return element != null && element.type === \"arrow\";\n};\nconst isLinearElementType = (elementType) => {\n return (elementType === \"arrow\" || elementType === \"line\" // || elementType === \"freedraw\"\n );\n};\nconst isBindingElement = (element, includeLocked = true) => {\n return (element != null &&\n (!element.locked || includeLocked === true) &&\n isBindingElementType(element.type));\n};\nconst isBindingElementType = (elementType) => {\n return elementType === \"arrow\";\n};\nconst isBindableElement = (element, includeLocked = true) => {\n return (element != null &&\n (!element.locked || includeLocked === true) &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\" ||\n (element.type === \"text\" && !element.containerId)));\n};\nconst isTextBindableContainer = (element, includeLocked = true) => {\n return (element != null &&\n (!element.locked || includeLocked === true) &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\" ||\n isArrowElement(element)));\n};\nconst isExcalidrawElement = (element) => {\n return ((element === null || element === void 0 ? void 0 : element.type) === \"text\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"diamond\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"rectangle\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"ellipse\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"arrow\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"freedraw\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"line\");\n};\nconst hasBoundTextElement = (element) => {\n var _a;\n return (isTextBindableContainer(element) &&\n !!((_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.some(({ type }) => type === \"text\")));\n};\nconst isBoundToContainer = (element) => {\n return (element !== null &&\n \"containerId\" in element &&\n element.containerId !== null &&\n isTextElement(element));\n};\nconst isUsingAdaptiveRadius = (type) => type === \"rectangle\";\nconst isUsingProportionalRadius = (type) => type === \"line\" || type === \"arrow\" || type === \"diamond\";\nconst canApplyRoundnessTypeToElement = (roundnessType, element) => {\n if ((roundnessType === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS ||\n // if legacy roundness, it can be applied to elements that currently\n // use adaptive radius\n roundnessType === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.LEGACY) &&\n isUsingAdaptiveRadius(element.type)) {\n return true;\n }\n if (roundnessType === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS &&\n isUsingProportionalRadius(element.type)) {\n return true;\n }\n return false;\n};\nconst getDefaultRoundnessTypeForElement = (element) => {\n if (element.type === \"arrow\" ||\n element.type === \"line\" ||\n element.type === \"diamond\") {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS,\n };\n }\n if (element.type === \"rectangle\") {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS,\n };\n }\n return null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDdkM7UUFDQSxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFSyxNQUFNLGlDQUFpQyxHQUFHLENBQy9DLE9BQTBCLEVBQzFCLEVBQUU7SUFDRixJQUNFLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTztRQUN4QixPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU07UUFDdkIsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQzFCO1FBQ0EsT0FBTztZQUNMLElBQUksRUFBRSxxRUFBNkI7U0FDcEMsQ0FBQztLQUNIO0lBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUNoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLGlFQUF5QjtTQUNoQyxDQUFDO0tBQ0g7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3R5cGVDaGVja3MudHM/NzNjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBST1VORE5FU1MgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdCaW5kYWJsZUVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgSW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgUm91bmRuZXNzVHlwZSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcblxuZXhwb3J0IGNvbnN0IGlzR2VuZXJpY0VsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50ICE9IG51bGwgJiZcbiAgICAoZWxlbWVudC50eXBlID09PSBcInNlbGVjdGlvblwiIHx8XG4gICAgICBlbGVtZW50LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIgfHxcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIgfHxcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJbml0aWFsaXplZEltYWdlRWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKTogZWxlbWVudCBpcyBJbml0aWFsaXplZEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQgPT4ge1xuICByZXR1cm4gISFlbGVtZW50ICYmIGVsZW1lbnQudHlwZSA9PT0gXCJpbWFnZVwiICYmICEhZWxlbWVudC5maWxlSWQ7XG59O1xuXG5leHBvcnQgY29uc3QgaXNJbWFnZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCA9PiB7XG4gIHJldHVybiAhIWVsZW1lbnQgJiYgZWxlbWVudC50eXBlID09PSBcImltYWdlXCI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXh0RWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKTogZWxlbWVudCBpcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgPT4ge1xuICByZXR1cm4gZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQudHlwZSA9PT0gXCJ0ZXh0XCI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNGcmVlRHJhd0VsZW1lbnQgPSAoXG4gIGVsZW1lbnQ/OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQgPT4ge1xuICByZXR1cm4gZWxlbWVudCAhPSBudWxsICYmIGlzRnJlZURyYXdFbGVtZW50VHlwZShlbGVtZW50LnR5cGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRnJlZURyYXdFbGVtZW50VHlwZSA9IChcbiAgZWxlbWVudFR5cGU6IEV4Y2FsaWRyYXdFbGVtZW50W1widHlwZVwiXSxcbik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZWxlbWVudFR5cGUgPT09IFwiZnJlZWRyYXdcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0xpbmVhckVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ/OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0+IHtcbiAgcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCAmJiBpc0xpbmVhckVsZW1lbnRUeXBlKGVsZW1lbnQudHlwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNBcnJvd0VsZW1lbnQgPSAoXG4gIGVsZW1lbnQ/OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0+IHtcbiAgcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0xpbmVhckVsZW1lbnRUeXBlID0gKFxuICBlbGVtZW50VHlwZTogQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdW1widHlwZVwiXSxcbik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnRUeXBlID09PSBcImFycm93XCIgfHwgZWxlbWVudFR5cGUgPT09IFwibGluZVwiIC8vIHx8IGVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCJcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0JpbmRpbmdFbGVtZW50ID0gKFxuICBlbGVtZW50PzogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuICBpbmNsdWRlTG9ja2VkID0gdHJ1ZSxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQgPT4ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICghZWxlbWVudC5sb2NrZWQgfHwgaW5jbHVkZUxvY2tlZCA9PT0gdHJ1ZSkgJiZcbiAgICBpc0JpbmRpbmdFbGVtZW50VHlwZShlbGVtZW50LnR5cGUpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNCaW5kaW5nRWxlbWVudFR5cGUgPSAoXG4gIGVsZW1lbnRUeXBlOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl1bXCJ0eXBlXCJdLFxuKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQmluZGFibGVFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4gIGluY2x1ZGVMb2NrZWQgPSB0cnVlLFxuKTogZWxlbWVudCBpcyBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50ICE9IG51bGwgJiZcbiAgICAoIWVsZW1lbnQubG9ja2VkIHx8IGluY2x1ZGVMb2NrZWQgPT09IHRydWUpICYmXG4gICAgKGVsZW1lbnQudHlwZSA9PT0gXCJyZWN0YW5nbGVcIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcImltYWdlXCIgfHxcbiAgICAgIChlbGVtZW50LnR5cGUgPT09IFwidGV4dFwiICYmICFlbGVtZW50LmNvbnRhaW5lcklkKSlcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1RleHRCaW5kYWJsZUNvbnRhaW5lciA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuICBpbmNsdWRlTG9ja2VkID0gdHJ1ZSxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd1RleHRDb250YWluZXIgPT4ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnQgIT0gbnVsbCAmJlxuICAgICghZWxlbWVudC5sb2NrZWQgfHwgaW5jbHVkZUxvY2tlZCA9PT0gdHJ1ZSkgJiZcbiAgICAoZWxlbWVudC50eXBlID09PSBcInJlY3RhbmdsZVwiIHx8XG4gICAgICBlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiIHx8XG4gICAgICBlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiIHx8XG4gICAgICBlbGVtZW50LnR5cGUgPT09IFwiaW1hZ2VcIiB8fFxuICAgICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNFeGNhbGlkcmF3RWxlbWVudCA9IChlbGVtZW50OiBhbnkpOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50Py50eXBlID09PSBcInRleHRcIiB8fFxuICAgIGVsZW1lbnQ/LnR5cGUgPT09IFwiZGlhbW9uZFwiIHx8XG4gICAgZWxlbWVudD8udHlwZSA9PT0gXCJyZWN0YW5nbGVcIiB8fFxuICAgIGVsZW1lbnQ/LnR5cGUgPT09IFwiZWxsaXBzZVwiIHx8XG4gICAgZWxlbWVudD8udHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgZWxlbWVudD8udHlwZSA9PT0gXCJmcmVlZHJhd1wiIHx8XG4gICAgZWxlbWVudD8udHlwZSA9PT0gXCJsaW5lXCJcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYXNCb3VuZFRleHRFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIE1hcmtOb25OdWxsYWJsZTxFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LCBcImJvdW5kRWxlbWVudHNcIj4gPT4ge1xuICByZXR1cm4gKFxuICAgIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKGVsZW1lbnQpICYmXG4gICAgISFlbGVtZW50LmJvdW5kRWxlbWVudHM/LnNvbWUoKHsgdHlwZSB9KSA9PiB0eXBlID09PSBcInRleHRcIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0JvdW5kVG9Db250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lciA9PiB7XG4gIHJldHVybiAoXG4gICAgZWxlbWVudCAhPT0gbnVsbCAmJlxuICAgIFwiY29udGFpbmVySWRcIiBpbiBlbGVtZW50ICYmXG4gICAgZWxlbWVudC5jb250YWluZXJJZCAhPT0gbnVsbCAmJlxuICAgIGlzVGV4dEVsZW1lbnQoZWxlbWVudClcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1VzaW5nQWRhcHRpdmVSYWRpdXMgPSAodHlwZTogc3RyaW5nKSA9PiB0eXBlID09PSBcInJlY3RhbmdsZVwiO1xuXG5leHBvcnQgY29uc3QgaXNVc2luZ1Byb3BvcnRpb25hbFJhZGl1cyA9ICh0eXBlOiBzdHJpbmcpID0+XG4gIHR5cGUgPT09IFwibGluZVwiIHx8IHR5cGUgPT09IFwiYXJyb3dcIiB8fCB0eXBlID09PSBcImRpYW1vbmRcIjtcblxuZXhwb3J0IGNvbnN0IGNhbkFwcGx5Um91bmRuZXNzVHlwZVRvRWxlbWVudCA9IChcbiAgcm91bmRuZXNzVHlwZTogUm91bmRuZXNzVHlwZSxcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4pID0+IHtcbiAgaWYgKFxuICAgIChyb3VuZG5lc3NUeXBlID09PSBST1VORE5FU1MuQURBUFRJVkVfUkFESVVTIHx8XG4gICAgICAvLyBpZiBsZWdhY3kgcm91bmRuZXNzLCBpdCBjYW4gYmUgYXBwbGllZCB0byBlbGVtZW50cyB0aGF0IGN1cnJlbnRseVxuICAgICAgLy8gdXNlIGFkYXB0aXZlIHJhZGl1c1xuICAgICAgcm91bmRuZXNzVHlwZSA9PT0gUk9VTkRORVNTLkxFR0FDWSkgJiZcbiAgICBpc1VzaW5nQWRhcHRpdmVSYWRpdXMoZWxlbWVudC50eXBlKVxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoXG4gICAgcm91bmRuZXNzVHlwZSA9PT0gUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMgJiZcbiAgICBpc1VzaW5nUHJvcG9ydGlvbmFsUmFkaXVzKGVsZW1lbnQudHlwZSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGVmYXVsdFJvdW5kbmVzc1R5cGVGb3JFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbikgPT4ge1xuICBpZiAoXG4gICAgZWxlbWVudC50eXBlID09PSBcImFycm93XCIgfHxcbiAgICBlbGVtZW50LnR5cGUgPT09IFwibGluZVwiIHx8XG4gICAgZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIlxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChlbGVtZW50LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIpIHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogUk9VTkRORVNTLkFEQVBUSVZFX1JBRElVUyxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/typeChecks.ts\n");
|
|
3573
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"canApplyRoundnessTypeToElement\": () => (/* binding */ canApplyRoundnessTypeToElement),\n/* harmony export */ \"getDefaultRoundnessTypeForElement\": () => (/* binding */ getDefaultRoundnessTypeForElement),\n/* harmony export */ \"hasBoundTextElement\": () => (/* binding */ hasBoundTextElement),\n/* harmony export */ \"isArrowElement\": () => (/* binding */ isArrowElement),\n/* harmony export */ \"isBindableElement\": () => (/* binding */ isBindableElement),\n/* harmony export */ \"isBindingElement\": () => (/* binding */ isBindingElement),\n/* harmony export */ \"isBindingElementType\": () => (/* binding */ isBindingElementType),\n/* harmony export */ \"isBoundToContainer\": () => (/* binding */ isBoundToContainer),\n/* harmony export */ \"isExcalidrawElement\": () => (/* binding */ isExcalidrawElement),\n/* harmony export */ \"isFreeDrawElement\": () => (/* binding */ isFreeDrawElement),\n/* harmony export */ \"isFreeDrawElementType\": () => (/* binding */ isFreeDrawElementType),\n/* harmony export */ \"isGenericElement\": () => (/* binding */ isGenericElement),\n/* harmony export */ \"isImageElement\": () => (/* binding */ isImageElement),\n/* harmony export */ \"isInitializedImageElement\": () => (/* binding */ isInitializedImageElement),\n/* harmony export */ \"isLinearElement\": () => (/* binding */ isLinearElement),\n/* harmony export */ \"isLinearElementType\": () => (/* binding */ isLinearElementType),\n/* harmony export */ \"isTextBindableContainer\": () => (/* binding */ isTextBindableContainer),\n/* harmony export */ \"isTextElement\": () => (/* binding */ isTextElement),\n/* harmony export */ \"isUsingAdaptiveRadius\": () => (/* binding */ isUsingAdaptiveRadius),\n/* harmony export */ \"isUsingProportionalRadius\": () => (/* binding */ isUsingProportionalRadius)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n\nconst isGenericElement = (element) => {\n return (element != null &&\n (element.type === \"selection\" ||\n element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\"));\n};\nconst isInitializedImageElement = (element) => {\n return !!element && element.type === \"image\" && !!element.fileId;\n};\nconst isImageElement = (element) => {\n return !!element && element.type === \"image\";\n};\nconst isTextElement = (element) => {\n return element != null && element.type === \"text\";\n};\nconst isFreeDrawElement = (element) => {\n return element != null && isFreeDrawElementType(element.type);\n};\nconst isFreeDrawElementType = (elementType) => {\n return elementType === \"freedraw\";\n};\nconst isLinearElement = (element) => {\n return element != null && isLinearElementType(element.type);\n};\nconst isArrowElement = (element) => {\n return element != null && element.type === \"arrow\";\n};\nconst isLinearElementType = (elementType) => {\n return (elementType === \"arrow\" || elementType === \"line\" // || elementType === \"freedraw\"\n );\n};\nconst isBindingElement = (element, includeLocked = true) => {\n return (element != null &&\n (!element.locked || includeLocked === true) &&\n isBindingElementType(element.type));\n};\nconst isBindingElementType = (elementType) => {\n return elementType === \"arrow\";\n};\nconst isBindableElement = (element, includeLocked = true) => {\n return (element != null &&\n (!element.locked || includeLocked === true) &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\" ||\n (element.type === \"text\" && !element.containerId)));\n};\nconst isTextBindableContainer = (element, includeLocked = true) => {\n return (element != null &&\n (!element.locked || includeLocked === true) &&\n (element.type === \"rectangle\" ||\n element.type === \"diamond\" ||\n element.type === \"ellipse\" ||\n element.type === \"image\" ||\n isArrowElement(element)));\n};\nconst isExcalidrawElement = (element) => {\n return ((element === null || element === void 0 ? void 0 : element.type) === \"text\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"diamond\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"rectangle\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"ellipse\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"arrow\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"freedraw\" ||\n (element === null || element === void 0 ? void 0 : element.type) === \"line\");\n};\nconst hasBoundTextElement = (element) => {\n var _a;\n return (isTextBindableContainer(element) &&\n !!((_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.some(({ type }) => type === \"text\")));\n};\nconst isBoundToContainer = (element) => {\n return (element !== null &&\n \"containerId\" in element &&\n element.containerId !== null &&\n isTextElement(element));\n};\nconst isUsingAdaptiveRadius = (type) => type === \"rectangle\";\nconst isUsingProportionalRadius = (type) => type === \"line\" || type === \"arrow\" || type === \"diamond\";\nconst canApplyRoundnessTypeToElement = (roundnessType, element) => {\n if ((roundnessType === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS ||\n // if legacy roundness, it can be applied to elements that currently\n // use adaptive radius\n roundnessType === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.LEGACY) &&\n isUsingAdaptiveRadius(element.type)) {\n return true;\n }\n if (roundnessType === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS &&\n isUsingProportionalRadius(element.type)) {\n return true;\n }\n return false;\n};\nconst getDefaultRoundnessTypeForElement = (element) => {\n if (element.type === \"arrow\" ||\n element.type === \"line\" ||\n element.type === \"diamond\") {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS,\n };\n }\n if (element.type === \"rectangle\") {\n return {\n type: _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS,\n };\n }\n return null;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFDdkM7UUFDQSxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7QUFFSyxNQUFNLGlDQUFpQyxHQUFHLENBQy9DLE9BQTBCLEVBQzFCLEVBQUU7SUFDRixJQUNFLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTztRQUN4QixPQUFPLENBQUMsSUFBSSxLQUFLLE1BQU07UUFDdkIsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQzFCO1FBQ0EsT0FBTztZQUNMLElBQUksRUFBRSxxRUFBNkI7U0FDcEMsQ0FBQztLQUNIO0lBRUQsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVcsRUFBRTtRQUNoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLGlFQUF5QjtTQUNoQyxDQUFDO0tBQ0g7SUFFRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3R5cGVDaGVja3MudHM/NzNjYyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBST1VORE5FU1MgfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgTWFya05vbk51bGxhYmxlIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50LFxuICBFeGNhbGlkcmF3R2VuZXJpY0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4gIEluaXRpYWxpemVkRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIFJvdW5kbmVzc1R5cGUsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5cbmV4cG9ydCBjb25zdCBpc0dlbmVyaWNFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdHZW5lcmljRWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgZWxlbWVudCAhPSBudWxsICYmXG4gICAgKGVsZW1lbnQudHlwZSA9PT0gXCJzZWxlY3Rpb25cIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcInJlY3RhbmdsZVwiIHx8XG4gICAgICBlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiIHx8XG4gICAgICBlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbik6IGVsZW1lbnQgaXMgSW5pdGlhbGl6ZWRFeGNhbGlkcmF3SW1hZ2VFbGVtZW50ID0+IHtcbiAgcmV0dXJuICEhZWxlbWVudCAmJiBlbGVtZW50LnR5cGUgPT09IFwiaW1hZ2VcIiAmJiAhIWVsZW1lbnQuZmlsZUlkO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSW1hZ2VFbGVtZW50ID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdJbWFnZUVsZW1lbnQgPT4ge1xuICByZXR1cm4gISFlbGVtZW50ICYmIGVsZW1lbnQudHlwZSA9PT0gXCJpbWFnZVwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVGV4dEVsZW1lbnQgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd1RleHRFbGVtZW50ID0+IHtcbiAgcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LnR5cGUgPT09IFwidGV4dFwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRnJlZURyYXdFbGVtZW50ID0gKFxuICBlbGVtZW50PzogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKTogZWxlbWVudCBpcyBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50ID0+IHtcbiAgcmV0dXJuIGVsZW1lbnQgIT0gbnVsbCAmJiBpc0ZyZWVEcmF3RWxlbWVudFR5cGUoZWxlbWVudC50eXBlKTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0ZyZWVEcmF3RWxlbWVudFR5cGUgPSAoXG4gIGVsZW1lbnRUeXBlOiBFeGNhbGlkcmF3RWxlbWVudFtcInR5cGVcIl0sXG4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIGVsZW1lbnRUeXBlID09PSBcImZyZWVkcmF3XCI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNMaW5lYXJFbGVtZW50ID0gKFxuICBlbGVtZW50PzogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKTogZWxlbWVudCBpcyBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCA9PiB7XG4gIHJldHVybiBlbGVtZW50ICE9IG51bGwgJiYgaXNMaW5lYXJFbGVtZW50VHlwZShlbGVtZW50LnR5cGUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQXJyb3dFbGVtZW50ID0gKFxuICBlbGVtZW50PzogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKTogZWxlbWVudCBpcyBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCA9PiB7XG4gIHJldHVybiBlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC50eXBlID09PSBcImFycm93XCI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNMaW5lYXJFbGVtZW50VHlwZSA9IChcbiAgZWxlbWVudFR5cGU6IEFwcFN0YXRlW1wiYWN0aXZlVG9vbFwiXVtcInR5cGVcIl0sXG4pOiBib29sZWFuID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50VHlwZSA9PT0gXCJhcnJvd1wiIHx8IGVsZW1lbnRUeXBlID09PSBcImxpbmVcIiAvLyB8fCBlbGVtZW50VHlwZSA9PT0gXCJmcmVlZHJhd1wiXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNCaW5kaW5nRWxlbWVudCA9IChcbiAgZWxlbWVudD86IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbiAgaW5jbHVkZUxvY2tlZCA9IHRydWUsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50ID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50ICE9IG51bGwgJiZcbiAgICAoIWVsZW1lbnQubG9ja2VkIHx8IGluY2x1ZGVMb2NrZWQgPT09IHRydWUpICYmXG4gICAgaXNCaW5kaW5nRWxlbWVudFR5cGUoZWxlbWVudC50eXBlKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQmluZGluZ0VsZW1lbnRUeXBlID0gKFxuICBlbGVtZW50VHlwZTogQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdW1widHlwZVwiXSxcbik6IGJvb2xlYW4gPT4ge1xuICByZXR1cm4gZWxlbWVudFR5cGUgPT09IFwiYXJyb3dcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0JpbmRhYmxlRWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuICBpbmNsdWRlTG9ja2VkID0gdHJ1ZSxcbik6IGVsZW1lbnQgaXMgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCA9PiB7XG4gIHJldHVybiAoXG4gICAgZWxlbWVudCAhPSBudWxsICYmXG4gICAgKCFlbGVtZW50LmxvY2tlZCB8fCBpbmNsdWRlTG9ja2VkID09PSB0cnVlKSAmJlxuICAgIChlbGVtZW50LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIgfHxcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIgfHxcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIgfHxcbiAgICAgIGVsZW1lbnQudHlwZSA9PT0gXCJpbWFnZVwiIHx8XG4gICAgICAoZWxlbWVudC50eXBlID09PSBcInRleHRcIiAmJiAhZWxlbWVudC5jb250YWluZXJJZCkpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXh0QmluZGFibGVDb250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbiAgaW5jbHVkZUxvY2tlZCA9IHRydWUsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50ICE9IG51bGwgJiZcbiAgICAoIWVsZW1lbnQubG9ja2VkIHx8IGluY2x1ZGVMb2NrZWQgPT09IHRydWUpICYmXG4gICAgKGVsZW1lbnQudHlwZSA9PT0gXCJyZWN0YW5nbGVcIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIiB8fFxuICAgICAgZWxlbWVudC50eXBlID09PSBcImltYWdlXCIgfHxcbiAgICAgIGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzRXhjYWxpZHJhd0VsZW1lbnQgPSAoZWxlbWVudDogYW55KTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiAoXG4gICAgZWxlbWVudD8udHlwZSA9PT0gXCJ0ZXh0XCIgfHxcbiAgICBlbGVtZW50Py50eXBlID09PSBcImRpYW1vbmRcIiB8fFxuICAgIGVsZW1lbnQ/LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIgfHxcbiAgICBlbGVtZW50Py50eXBlID09PSBcImVsbGlwc2VcIiB8fFxuICAgIGVsZW1lbnQ/LnR5cGUgPT09IFwiYXJyb3dcIiB8fFxuICAgIGVsZW1lbnQ/LnR5cGUgPT09IFwiZnJlZWRyYXdcIiB8fFxuICAgIGVsZW1lbnQ/LnR5cGUgPT09IFwibGluZVwiXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFzQm91bmRUZXh0RWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKTogZWxlbWVudCBpcyBNYXJrTm9uTnVsbGFibGU8RXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCwgXCJib3VuZEVsZW1lbnRzXCI+ID0+IHtcbiAgcmV0dXJuIChcbiAgICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihlbGVtZW50KSAmJlxuICAgICEhZWxlbWVudC5ib3VuZEVsZW1lbnRzPy5zb21lKCh7IHR5cGUgfSkgPT4gdHlwZSA9PT0gXCJ0ZXh0XCIpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNCb3VuZFRvQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pOiBlbGVtZW50IGlzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIgPT4ge1xuICByZXR1cm4gKFxuICAgIGVsZW1lbnQgIT09IG51bGwgJiZcbiAgICBcImNvbnRhaW5lcklkXCIgaW4gZWxlbWVudCAmJlxuICAgIGVsZW1lbnQuY29udGFpbmVySWQgIT09IG51bGwgJiZcbiAgICBpc1RleHRFbGVtZW50KGVsZW1lbnQpXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNVc2luZ0FkYXB0aXZlUmFkaXVzID0gKHR5cGU6IHN0cmluZykgPT4gdHlwZSA9PT0gXCJyZWN0YW5nbGVcIjtcblxuZXhwb3J0IGNvbnN0IGlzVXNpbmdQcm9wb3J0aW9uYWxSYWRpdXMgPSAodHlwZTogc3RyaW5nKSA9PlxuICB0eXBlID09PSBcImxpbmVcIiB8fCB0eXBlID09PSBcImFycm93XCIgfHwgdHlwZSA9PT0gXCJkaWFtb25kXCI7XG5cbmV4cG9ydCBjb25zdCBjYW5BcHBseVJvdW5kbmVzc1R5cGVUb0VsZW1lbnQgPSAoXG4gIHJvdW5kbmVzc1R5cGU6IFJvdW5kbmVzc1R5cGUsXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuKSA9PiB7XG4gIGlmIChcbiAgICAocm91bmRuZXNzVHlwZSA9PT0gUk9VTkRORVNTLkFEQVBUSVZFX1JBRElVUyB8fFxuICAgICAgLy8gaWYgbGVnYWN5IHJvdW5kbmVzcywgaXQgY2FuIGJlIGFwcGxpZWQgdG8gZWxlbWVudHMgdGhhdCBjdXJyZW50bHlcbiAgICAgIC8vIHVzZSBhZGFwdGl2ZSByYWRpdXNcbiAgICAgIHJvdW5kbmVzc1R5cGUgPT09IFJPVU5ETkVTUy5MRUdBQ1kpICYmXG4gICAgaXNVc2luZ0FkYXB0aXZlUmFkaXVzKGVsZW1lbnQudHlwZSlcbiAgKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKFxuICAgIHJvdW5kbmVzc1R5cGUgPT09IFJPVU5ETkVTUy5QUk9QT1JUSU9OQUxfUkFESVVTICYmXG4gICAgaXNVc2luZ1Byb3BvcnRpb25hbFJhZGl1cyhlbGVtZW50LnR5cGUpXG4gICkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERlZmF1bHRSb3VuZG5lc3NUeXBlRm9yRWxlbWVudCA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4pID0+IHtcbiAgaWYgKFxuICAgIGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiIHx8XG4gICAgZWxlbWVudC50eXBlID09PSBcImxpbmVcIiB8fFxuICAgIGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCJcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFJPVU5ETkVTUy5QUk9QT1JUSU9OQUxfUkFESVVTLFxuICAgIH07XG4gIH1cblxuICBpZiAoZWxlbWVudC50eXBlID09PSBcInJlY3RhbmdsZVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IFJPVU5ETkVTUy5BREFQVElWRV9SQURJVVMsXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/typeChecks.ts\n");
|
|
3574
3574
|
|
|
3575
3575
|
/***/ }),
|
|
3576
3576
|
|
|
@@ -3669,7 +3669,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3669
3669
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3670
3670
|
|
|
3671
3671
|
"use strict";
|
|
3672
|
-
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 _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./element/newElement */ \"../../element/newElement.ts\");\n\n\nconst clearAppStatePropertiesForHistory = (appState) => {\n return {\n selectedElementIds: appState.selectedElementIds,\n selectedGroupIds: appState.selectedGroupIds,\n viewBackgroundColor: appState.viewBackgroundColor,\n editingLinearElement: appState.editingLinearElement,\n editingGroupId: appState.editingGroupId,\n name: appState.name,\n };\n};\nclass History {\n constructor() {\n this.elementCache = new Map();\n this.recording = true;\n this.stateHistory = [];\n this.redoStack = [];\n this.lastEntry = null;\n this.generateEntry = (appState, elements) => this.dehydrateHistoryEntry({\n appState: clearAppStatePropertiesForHistory(appState),\n elements: elements.reduce((elements, element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) &&\n appState.multiElement &&\n appState.multiElement.id === element.id) {\n // don't store multi-point arrow if still has only one point\n if (appState.multiElement &&\n appState.multiElement.id === element.id &&\n element.points.length < 2) {\n return elements;\n }\n elements.push(Object.assign(Object.assign({}, element), { \n // don't store last point if not committed\n points: element.lastCommittedPoint !==\n element.points[element.points.length - 1]\n ? element.points.slice(0, -1)\n : element.points }));\n }\n else {\n elements.push(element);\n }\n return elements;\n }, []),\n });\n }\n hydrateHistoryEntry({ appState, elements, }) {\n return {\n appState: JSON.parse(appState),\n elements: elements.map((dehydratedExcalidrawElement) => {\n var _a;\n const element = (_a = this.elementCache\n .get(dehydratedExcalidrawElement.id)) === null || _a === void 0 ? void 0 : _a.get(dehydratedExcalidrawElement.versionNonce);\n if (!element) {\n throw new Error(`Element not found: ${dehydratedExcalidrawElement.id}:${dehydratedExcalidrawElement.versionNonce}`);\n }\n return element;\n }),\n };\n }\n dehydrateHistoryEntry({ appState, elements, }) {\n return {\n appState: JSON.stringify(appState),\n elements: elements.map((element) => {\n if (!this.elementCache.has(element.id)) {\n this.elementCache.set(element.id, new Map());\n }\n const versions = this.elementCache.get(element.id);\n if (!versions.has(element.versionNonce)) {\n versions.set(element.versionNonce, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_1__.deepCopyElement)(element));\n }\n return {\n id: element.id,\n versionNonce: element.versionNonce,\n };\n }),\n };\n }\n getSnapshotForTest() {\n return {\n recording: this.recording,\n stateHistory: this.stateHistory.map((dehydratedHistoryEntry) => this.hydrateHistoryEntry(dehydratedHistoryEntry)),\n redoStack: this.redoStack.map((dehydratedHistoryEntry) => this.hydrateHistoryEntry(dehydratedHistoryEntry)),\n };\n }\n clear() {\n this.stateHistory.length = 0;\n this.redoStack.length = 0;\n this.lastEntry = null;\n this.elementCache.clear();\n }\n shouldCreateEntry(nextEntry) {\n var _a, _b;\n const { lastEntry } = this;\n if (!lastEntry) {\n return true;\n }\n if (nextEntry.elements.length !== lastEntry.elements.length) {\n return true;\n }\n // loop from right to left as changes are likelier to happen on new elements\n for (let i = nextEntry.elements.length - 1; i > -1; i--) {\n const prev = nextEntry.elements[i];\n const next = lastEntry.elements[i];\n if (!prev ||\n !next ||\n prev.id !== next.id ||\n prev.versionNonce !== next.versionNonce) {\n return true;\n }\n }\n // note: this is safe because entry's appState is guaranteed no excess props\n let key;\n for (key in nextEntry.appState) {\n if (key === \"editingLinearElement\") {\n if (((_a = nextEntry.appState[key]) === null || _a === void 0 ? void 0 : _a.elementId) ===\n ((_b = lastEntry.appState[key]) === null || _b === void 0 ? void 0 : _b.elementId)) {\n continue;\n }\n }\n if (key === \"selectedElementIds\" || key === \"selectedGroupIds\") {\n continue;\n }\n if (nextEntry.appState[key] !== lastEntry.appState[key]) {\n return true;\n }\n }\n return false;\n }\n pushEntry(appState, elements) {\n const newEntryDehydrated = this.generateEntry(appState, elements);\n const newEntry = this.hydrateHistoryEntry(newEntryDehydrated);\n if (newEntry) {\n if (!this.shouldCreateEntry(newEntry)) {\n return;\n }\n this.stateHistory.push(newEntryDehydrated);\n this.lastEntry = newEntry;\n // As a new entry was pushed, we invalidate the redo stack\n this.clearRedoStack();\n }\n }\n clearRedoStack() {\n this.redoStack.splice(0, this.redoStack.length);\n }\n redoOnce() {\n if (this.redoStack.length === 0) {\n return null;\n }\n const entryToRestore = this.redoStack.pop();\n if (entryToRestore !== undefined) {\n this.stateHistory.push(entryToRestore);\n return this.hydrateHistoryEntry(entryToRestore);\n }\n return null;\n }\n undoOnce() {\n if (this.stateHistory.length === 1) {\n return null;\n }\n const currentEntry = this.stateHistory.pop();\n const entryToRestore = this.stateHistory[this.stateHistory.length - 1];\n if (currentEntry !== undefined) {\n this.redoStack.push(currentEntry);\n return this.hydrateHistoryEntry(entryToRestore);\n }\n return null;\n }\n /**\n * Updates history's `lastEntry` to latest app state. This is necessary\n * when doing undo/redo which itself doesn't commit to history, but updates\n * app state in a way that would break `shouldCreateEntry` which relies on\n * `lastEntry` to reflect last comittable history state.\n * We can't update `lastEntry` from within history when calling undo/redo\n * because the action potentially mutates appState/elements before storing\n * it.\n */\n setCurrentState(appState, elements) {\n this.lastEntry = this.hydrateHistoryEntry(this.generateEntry(appState, elements));\n }\n // Suspicious that this is called so many places. Seems error-prone.\n resumeRecording() {\n this.recording = true;\n }\n record(state, elements) {\n if (this.recording) {\n this.pushEntry(state, elements);\n this.recording = false;\n }\n }\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (History);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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b0VBQW9FO0lBQ3BFLGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWUsRUFBRSxRQUFzQztRQUM1RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDeEI7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxpRUFBZSxPQUFPLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vaGlzdG9yeS50cz83YmYyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBkZWVwQ29weUVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50L25ld0VsZW1lbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBIaXN0b3J5RW50cnkge1xuICBhcHBTdGF0ZTogUmV0dXJuVHlwZTx0eXBlb2YgY2xlYXJBcHBTdGF0ZVByb3BlcnRpZXNGb3JIaXN0b3J5PjtcbiAgZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W107XG59XG5cbmludGVyZmFjZSBEZWh5ZHJhdGVkRXhjYWxpZHJhd0VsZW1lbnQge1xuICBpZDogc3RyaW5nO1xuICB2ZXJzaW9uTm9uY2U6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIERlaHlkcmF0ZWRIaXN0b3J5RW50cnkge1xuICBhcHBTdGF0ZTogc3RyaW5nO1xuICBlbGVtZW50czogRGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50W107XG59XG5cbmNvbnN0IGNsZWFyQXBwU3RhdGVQcm9wZXJ0aWVzRm9ySGlzdG9yeSA9IChhcHBTdGF0ZTogQXBwU3RhdGUpID0+IHtcbiAgcmV0dXJuIHtcbiAgICBzZWxlY3RlZEVsZW1lbnRJZHM6IGFwcFN0YXRlLnNlbGVjdGVkRWxlbWVudElkcyxcbiAgICBzZWxlY3RlZEdyb3VwSWRzOiBhcHBTdGF0ZS5zZWxlY3RlZEdyb3VwSWRzLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGFwcFN0YXRlLnZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IGFwcFN0YXRlLmVkaXRpbmdMaW5lYXJFbGVtZW50LFxuICAgIGVkaXRpbmdHcm91cElkOiBhcHBTdGF0ZS5lZGl0aW5nR3JvdXBJZCxcbiAgICBuYW1lOiBhcHBTdGF0ZS5uYW1lLFxuICB9O1xufTtcblxuY2xhc3MgSGlzdG9yeSB7XG4gIHByaXZhdGUgZWxlbWVudENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxudW1iZXIsIEV4Y2FsaWRyYXdFbGVtZW50Pj4oKTtcbiAgcHJpdmF0ZSByZWNvcmRpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIHN0YXRlSGlzdG9yeTogRGVoeWRyYXRlZEhpc3RvcnlFbnRyeVtdID0gW107XG4gIHByaXZhdGUgcmVkb1N0YWNrOiBEZWh5ZHJhdGVkSGlzdG9yeUVudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBsYXN0RW50cnk6IEhpc3RvcnlFbnRyeSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgaHlkcmF0ZUhpc3RvcnlFbnRyeSh7XG4gICAgYXBwU3RhdGUsXG4gICAgZWxlbWVudHMsXG4gIH06IERlaHlkcmF0ZWRIaXN0b3J5RW50cnkpOiBIaXN0b3J5RW50cnkge1xuICAgIHJldHVybiB7XG4gICAgICBhcHBTdGF0ZTogSlNPTi5wYXJzZShhcHBTdGF0ZSksXG4gICAgICBlbGVtZW50czogZWxlbWVudHMubWFwKChkZWh5ZHJhdGVkRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuZWxlbWVudENhY2hlXG4gICAgICAgICAgLmdldChkZWh5ZHJhdGVkRXhjYWxpZHJhd0VsZW1lbnQuaWQpXG4gICAgICAgICAgPy5nZXQoZGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50LnZlcnNpb25Ob25jZSk7XG4gICAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBFbGVtZW50IG5vdCBmb3VuZDogJHtkZWh5ZHJhdGVkRXhjYWxpZHJhd0VsZW1lbnQuaWR9OiR7ZGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50LnZlcnNpb25Ob25jZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnQ7XG4gICAgICB9KSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBkZWh5ZHJhdGVIaXN0b3J5RW50cnkoe1xuICAgIGFwcFN0YXRlLFxuICAgIGVsZW1lbnRzLFxuICB9OiBIaXN0b3J5RW50cnkpOiBEZWh5ZHJhdGVkSGlzdG9yeUVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IEpTT04uc3RyaW5naWZ5KGFwcFN0YXRlKSxcbiAgICAgIGVsZW1lbnRzOiBlbGVtZW50cy5tYXAoKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gICAgICAgIGlmICghdGhpcy5lbGVtZW50Q2FjaGUuaGFzKGVsZW1lbnQuaWQpKSB7XG4gICAgICAgICAgdGhpcy5lbGVtZW50Q2FjaGUuc2V0KGVsZW1lbnQuaWQsIG5ldyBNYXAoKSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmVyc2lvbnMgPSB0aGlzLmVsZW1lbnRDYWNoZS5nZXQoZWxlbWVudC5pZCkhO1xuICAgICAgICBpZiAoIXZlcnNpb25zLmhhcyhlbGVtZW50LnZlcnNpb25Ob25jZSkpIHtcbiAgICAgICAgICB2ZXJzaW9ucy5zZXQoZWxlbWVudC52ZXJzaW9uTm9uY2UsIGRlZXBDb3B5RWxlbWVudChlbGVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBpZDogZWxlbWVudC5pZCxcbiAgICAgICAgICB2ZXJzaW9uTm9uY2U6IGVsZW1lbnQudmVyc2lvbk5vbmNlLFxuICAgICAgICB9O1xuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIGdldFNuYXBzaG90Rm9yVGVzdCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgcmVjb3JkaW5nOiB0aGlzLnJlY29yZGluZyxcbiAgICAgIHN0YXRlSGlzdG9yeTogdGhpcy5zdGF0ZUhpc3RvcnkubWFwKChkZWh5ZHJhdGVkSGlzdG9yeUVudHJ5KSA9PlxuICAgICAgICB0aGlzLmh5ZHJhdGVIaXN0b3J5RW50cnkoZGVoeWRyYXRlZEhpc3RvcnlFbnRyeSksXG4gICAgICApLFxuICAgICAgcmVkb1N0YWNrOiB0aGlzLnJlZG9TdGFjay5tYXAoKGRlaHlkcmF0ZWRIaXN0b3J5RW50cnkpID0+XG4gICAgICAgIHRoaXMuaHlkcmF0ZUhpc3RvcnlFbnRyeShkZWh5ZHJhdGVkSGlzdG9yeUVudHJ5KSxcbiAgICAgICksXG4gICAgfTtcbiAgfVxuXG4gIGNsZWFyKCkge1xuICAgIHRoaXMuc3RhdGVIaXN0b3J5Lmxlbmd0aCA9IDA7XG4gICAgdGhpcy5yZWRvU3RhY2subGVuZ3RoID0gMDtcbiAgICB0aGlzLmxhc3RFbnRyeSA9IG51bGw7XG4gICAgdGhpcy5lbGVtZW50Q2FjaGUuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVFbnRyeSA9IChcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICk6IERlaHlkcmF0ZWRIaXN0b3J5RW50cnkgPT5cbiAgICB0aGlzLmRlaHlkcmF0ZUhpc3RvcnlFbnRyeSh7XG4gICAgICBhcHBTdGF0ZTogY2xlYXJBcHBTdGF0ZVByb3BlcnRpZXNGb3JIaXN0b3J5KGFwcFN0YXRlKSxcbiAgICAgIGVsZW1lbnRzOiBlbGVtZW50cy5yZWR1Y2UoKGVsZW1lbnRzLCBlbGVtZW50KSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgJiZcbiAgICAgICAgICBhcHBTdGF0ZS5tdWx0aUVsZW1lbnQgJiZcbiAgICAgICAgICBhcHBTdGF0ZS5tdWx0aUVsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgLy8gZG9uJ3Qgc3RvcmUgbXVsdGktcG9pbnQgYXJyb3cgaWYgc3RpbGwgaGFzIG9ubHkgb25lIHBvaW50XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYXBwU3RhdGUubXVsdGlFbGVtZW50ICYmXG4gICAgICAgICAgICBhcHBTdGF0ZS5tdWx0aUVsZW1lbnQuaWQgPT09IGVsZW1lbnQuaWQgJiZcbiAgICAgICAgICAgIGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDJcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbGVtZW50cy5wdXNoKHtcbiAgICAgICAgICAgIC4uLmVsZW1lbnQsXG4gICAgICAgICAgICAvLyBkb24ndCBzdG9yZSBsYXN0IHBvaW50IGlmIG5vdCBjb21taXR0ZWRcbiAgICAgICAgICAgIHBvaW50czpcbiAgICAgICAgICAgICAgZWxlbWVudC5sYXN0Q29tbWl0dGVkUG9pbnQgIT09XG4gICAgICAgICAgICAgIGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgICAgPyBlbGVtZW50LnBvaW50cy5zbGljZSgwLCAtMSlcbiAgICAgICAgICAgICAgICA6IGVsZW1lbnQucG9pbnRzLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzO1xuICAgICAgfSwgW10gYXMgTXV0YWJsZTx0eXBlb2YgZWxlbWVudHM+KSxcbiAgICB9KTtcblxuICBzaG91bGRDcmVhdGVFbnRyeShuZXh0RW50cnk6IEhpc3RvcnlFbnRyeSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgbGFzdEVudHJ5IH0gPSB0aGlzO1xuXG4gICAgaWYgKCFsYXN0RW50cnkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChuZXh0RW50cnkuZWxlbWVudHMubGVuZ3RoICE9PSBsYXN0RW50cnkuZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBsb29wIGZyb20gcmlnaHQgdG8gbGVmdCBhcyBjaGFuZ2VzIGFyZSBsaWtlbGllciB0byBoYXBwZW4gb24gbmV3IGVsZW1lbnRzXG4gICAgZm9yIChsZXQgaSA9IG5leHRFbnRyeS5lbGVtZW50cy5sZW5ndGggLSAxOyBpID4gLTE7IGktLSkge1xuICAgICAgY29uc3QgcHJldiA9IG5leHRFbnRyeS5lbGVtZW50c1tpXTtcbiAgICAgIGNvbnN0IG5leHQgPSBsYXN0RW50cnkuZWxlbWVudHNbaV07XG4gICAgICBpZiAoXG4gICAgICAgICFwcmV2IHx8XG4gICAgICAgICFuZXh0IHx8XG4gICAgICAgIHByZXYuaWQgIT09IG5leHQuaWQgfHxcbiAgICAgICAgcHJldi52ZXJzaW9uTm9uY2UgIT09IG5leHQudmVyc2lvbk5vbmNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm90ZTogdGhpcyBpcyBzYWZlIGJlY2F1c2UgZW50cnkncyBhcHBTdGF0ZSBpcyBndWFyYW50ZWVkIG5vIGV4Y2VzcyBwcm9wc1xuICAgIGxldCBrZXk6IGtleW9mIHR5cGVvZiBuZXh0RW50cnkuYXBwU3RhdGU7XG4gICAgZm9yIChrZXkgaW4gbmV4dEVudHJ5LmFwcFN0YXRlKSB7XG4gICAgICBpZiAoa2V5ID09PSBcImVkaXRpbmdMaW5lYXJFbGVtZW50XCIpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRFbnRyeS5hcHBTdGF0ZVtrZXldPy5lbGVtZW50SWQgPT09XG4gICAgICAgICAgbGFzdEVudHJ5LmFwcFN0YXRlW2tleV0/LmVsZW1lbnRJZFxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGtleSA9PT0gXCJzZWxlY3RlZEVsZW1lbnRJZHNcIiB8fCBrZXkgPT09IFwic2VsZWN0ZWRHcm91cElkc1wiKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKG5leHRFbnRyeS5hcHBTdGF0ZVtrZXldICE9PSBsYXN0RW50cnkuYXBwU3RhdGVba2V5XSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwdXNoRW50cnkoYXBwU3RhdGU6IEFwcFN0YXRlLCBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSkge1xuICAgIGNvbnN0IG5ld0VudHJ5RGVoeWRyYXRlZCA9IHRoaXMuZ2VuZXJhdGVFbnRyeShhcHBTdGF0ZSwgZWxlbWVudHMpO1xuICAgIGNvbnN0IG5ld0VudHJ5OiBIaXN0b3J5RW50cnkgPSB0aGlzLmh5ZHJhdGVIaXN0b3J5RW50cnkobmV3RW50cnlEZWh5ZHJhdGVkKTtcblxuICAgIGlmIChuZXdFbnRyeSkge1xuICAgICAgaWYgKCF0aGlzLnNob3VsZENyZWF0ZUVudHJ5KG5ld0VudHJ5KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhdGVIaXN0b3J5LnB1c2gobmV3RW50cnlEZWh5ZHJhdGVkKTtcbiAgICAgIHRoaXMubGFzdEVudHJ5ID0gbmV3RW50cnk7XG4gICAgICAvLyBBcyBhIG5ldyBlbnRyeSB3YXMgcHVzaGVkLCB3ZSBpbnZhbGlkYXRlIHRoZSByZWRvIHN0YWNrXG4gICAgICB0aGlzLmNsZWFyUmVkb1N0YWNrKCk7XG4gICAgfVxuICB9XG5cbiAgY2xlYXJSZWRvU3RhY2soKSB7XG4gICAgdGhpcy5yZWRvU3RhY2suc3BsaWNlKDAsIHRoaXMucmVkb1N0YWNrLmxlbmd0aCk7XG4gIH1cblxuICByZWRvT25jZSgpOiBIaXN0b3J5RW50cnkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5yZWRvU3RhY2subGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBlbnRyeVRvUmVzdG9yZSA9IHRoaXMucmVkb1N0YWNrLnBvcCgpO1xuXG4gICAgaWYgKGVudHJ5VG9SZXN0b3JlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhdGVIaXN0b3J5LnB1c2goZW50cnlUb1Jlc3RvcmUpO1xuICAgICAgcmV0dXJuIHRoaXMuaHlkcmF0ZUhpc3RvcnlFbnRyeShlbnRyeVRvUmVzdG9yZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB1bmRvT25jZSgpOiBIaXN0b3J5RW50cnkgfCBudWxsIHtcbiAgICBpZiAodGhpcy5zdGF0ZUhpc3RvcnkubGVuZ3RoID09PSAxKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBjdXJyZW50RW50cnkgPSB0aGlzLnN0YXRlSGlzdG9yeS5wb3AoKTtcblxuICAgIGNvbnN0IGVudHJ5VG9SZXN0b3JlID0gdGhpcy5zdGF0ZUhpc3RvcnlbdGhpcy5zdGF0ZUhpc3RvcnkubGVuZ3RoIC0gMV07XG5cbiAgICBpZiAoY3VycmVudEVudHJ5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMucmVkb1N0YWNrLnB1c2goY3VycmVudEVudHJ5KTtcbiAgICAgIHJldHVybiB0aGlzLmh5ZHJhdGVIaXN0b3J5RW50cnkoZW50cnlUb1Jlc3RvcmUpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgaGlzdG9yeSdzIGBsYXN0RW50cnlgIHRvIGxhdGVzdCBhcHAgc3RhdGUuIFRoaXMgaXMgbmVjZXNzYXJ5XG4gICAqICB3aGVuIGRvaW5nIHVuZG8vcmVkbyB3aGljaCBpdHNlbGYgZG9lc24ndCBjb21taXQgdG8gaGlzdG9yeSwgYnV0IHVwZGF0ZXNcbiAgICogIGFwcCBzdGF0ZSBpbiBhIHdheSB0aGF0IHdvdWxkIGJyZWFrIGBzaG91bGRDcmVhdGVFbnRyeWAgd2hpY2ggcmVsaWVzIG9uXG4gICAqICBgbGFzdEVudHJ5YCB0byByZWZsZWN0IGxhc3QgY29taXR0YWJsZSBoaXN0b3J5IHN0YXRlLlxuICAgKiBXZSBjYW4ndCB1cGRhdGUgYGxhc3RFbnRyeWAgZnJvbSB3aXRoaW4gaGlzdG9yeSB3aGVuIGNhbGxpbmcgdW5kby9yZWRvXG4gICAqICBiZWNhdXNlIHRoZSBhY3Rpb24gcG90ZW50aWFsbHkgbXV0YXRlcyBhcHBTdGF0ZS9lbGVtZW50cyBiZWZvcmUgc3RvcmluZ1xuICAgKiAgaXQuXG4gICAqL1xuICBzZXRDdXJyZW50U3RhdGUoYXBwU3RhdGU6IEFwcFN0YXRlLCBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSkge1xuICAgIHRoaXMubGFzdEVudHJ5ID0gdGhpcy5oeWRyYXRlSGlzdG9yeUVudHJ5KFxuICAgICAgdGhpcy5nZW5lcmF0ZUVudHJ5KGFwcFN0YXRlLCBlbGVtZW50cyksXG4gICAgKTtcbiAgfVxuXG4gIC8vIFN1c3BpY2lvdXMgdGhhdCB0aGlzIGlzIGNhbGxlZCBzbyBtYW55IHBsYWNlcy4gU2VlbXMgZXJyb3ItcHJvbmUuXG4gIHJlc3VtZVJlY29yZGluZygpIHtcbiAgICB0aGlzLnJlY29yZGluZyA9IHRydWU7XG4gIH1cblxuICByZWNvcmQoc3RhdGU6IEFwcFN0YXRlLCBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSkge1xuICAgIGlmICh0aGlzLnJlY29yZGluZykge1xuICAgICAgdGhpcy5wdXNoRW50cnkoc3RhdGUsIGVsZW1lbnRzKTtcbiAgICAgIHRoaXMucmVjb3JkaW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhpc3Rvcnk7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../history.ts\n");
|
|
3672
|
+
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 _element_typeChecks__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _element_newElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./element/newElement */ \"../../element/newElement.ts\");\n\n\nconst clearAppStatePropertiesForHistory = (appState) => {\n return {\n selectedElementIds: appState.selectedElementIds,\n selectedGroupIds: appState.selectedGroupIds,\n viewBackgroundColor: appState.viewBackgroundColor,\n editingLinearElement: appState.editingLinearElement,\n editingGroupId: appState.editingGroupId,\n name: appState.name,\n };\n};\nclass History {\n constructor() {\n this.elementCache = new Map();\n this.recording = true;\n this.stateHistory = [];\n this.redoStack = [];\n this.lastEntry = null;\n this.generateEntry = (appState, elements) => this.dehydrateHistoryEntry({\n appState: clearAppStatePropertiesForHistory(appState),\n elements: elements.reduce((elements, element) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_0__.isLinearElement)(element) &&\n appState.multiElement &&\n appState.multiElement.id === element.id) {\n // don't store multi-point arrow if still has only one point\n if (appState.multiElement &&\n appState.multiElement.id === element.id &&\n element.points.length < 2) {\n return elements;\n }\n elements.push(Object.assign(Object.assign({}, element), { \n // don't store last point if not committed\n points: element.lastCommittedPoint !==\n element.points[element.points.length - 1]\n ? element.points.slice(0, -1)\n : element.points }));\n }\n else {\n elements.push(element);\n }\n return elements;\n }, []),\n });\n }\n hydrateHistoryEntry({ appState, elements, }) {\n return {\n appState: JSON.parse(appState),\n elements: elements.map((dehydratedExcalidrawElement) => {\n var _a;\n const element = (_a = this.elementCache\n .get(dehydratedExcalidrawElement.id)) === null || _a === void 0 ? void 0 : _a.get(dehydratedExcalidrawElement.versionNonce);\n if (!element) {\n throw new Error(`Element not found: ${dehydratedExcalidrawElement.id}:${dehydratedExcalidrawElement.versionNonce}`);\n }\n return element;\n }),\n };\n }\n dehydrateHistoryEntry({ appState, elements, }) {\n return {\n appState: JSON.stringify(appState),\n elements: elements.map((element) => {\n if (!this.elementCache.has(element.id)) {\n this.elementCache.set(element.id, new Map());\n }\n const versions = this.elementCache.get(element.id);\n if (!versions.has(element.versionNonce)) {\n versions.set(element.versionNonce, (0,_element_newElement__WEBPACK_IMPORTED_MODULE_1__.deepCopyElement)(element));\n }\n return {\n id: element.id,\n versionNonce: element.versionNonce,\n };\n }),\n };\n }\n getSnapshotForTest() {\n return {\n recording: this.recording,\n stateHistory: this.stateHistory.map((dehydratedHistoryEntry) => this.hydrateHistoryEntry(dehydratedHistoryEntry)),\n redoStack: this.redoStack.map((dehydratedHistoryEntry) => this.hydrateHistoryEntry(dehydratedHistoryEntry)),\n };\n }\n clear() {\n this.stateHistory.length = 0;\n this.redoStack.length = 0;\n this.lastEntry = null;\n this.elementCache.clear();\n }\n shouldCreateEntry(nextEntry) {\n var _a, _b;\n const { lastEntry } = this;\n if (!lastEntry) {\n return true;\n }\n if (nextEntry.elements.length !== lastEntry.elements.length) {\n return true;\n }\n // loop from right to left as changes are likelier to happen on new elements\n for (let i = nextEntry.elements.length - 1; i > -1; i--) {\n const prev = nextEntry.elements[i];\n const next = lastEntry.elements[i];\n if (!prev ||\n !next ||\n prev.id !== next.id ||\n prev.versionNonce !== next.versionNonce) {\n return true;\n }\n }\n // note: this is safe because entry's appState is guaranteed no excess props\n let key;\n for (key in nextEntry.appState) {\n if (key === \"editingLinearElement\") {\n if (((_a = nextEntry.appState[key]) === null || _a === void 0 ? void 0 : _a.elementId) ===\n ((_b = lastEntry.appState[key]) === null || _b === void 0 ? void 0 : _b.elementId)) {\n continue;\n }\n }\n if (key === \"selectedElementIds\" || key === \"selectedGroupIds\") {\n continue;\n }\n if (nextEntry.appState[key] !== lastEntry.appState[key]) {\n return true;\n }\n }\n return false;\n }\n pushEntry(appState, elements) {\n const newEntryDehydrated = this.generateEntry(appState, elements);\n const newEntry = this.hydrateHistoryEntry(newEntryDehydrated);\n if (newEntry) {\n if (!this.shouldCreateEntry(newEntry)) {\n return;\n }\n this.stateHistory.push(newEntryDehydrated);\n this.lastEntry = newEntry;\n // As a new entry was pushed, we invalidate the redo stack\n this.clearRedoStack();\n }\n }\n clearRedoStack() {\n this.redoStack.splice(0, this.redoStack.length);\n }\n redoOnce() {\n if (this.redoStack.length === 0) {\n return null;\n }\n const entryToRestore = this.redoStack.pop();\n if (entryToRestore !== undefined) {\n this.stateHistory.push(entryToRestore);\n return this.hydrateHistoryEntry(entryToRestore);\n }\n return null;\n }\n undoOnce() {\n if (this.stateHistory.length === 1) {\n return null;\n }\n const currentEntry = this.stateHistory.pop();\n const entryToRestore = this.stateHistory[this.stateHistory.length - 1];\n if (currentEntry !== undefined) {\n this.redoStack.push(currentEntry);\n return this.hydrateHistoryEntry(entryToRestore);\n }\n return null;\n }\n /**\n * Updates history's `lastEntry` to latest app state. This is necessary\n * when doing undo/redo which itself doesn't commit to history, but updates\n * app state in a way that would break `shouldCreateEntry` which relies on\n * `lastEntry` to reflect last comittable history state.\n * We can't update `lastEntry` from within history when calling undo/redo\n * because the action potentially mutates appState/elements before storing\n * it.\n */\n setCurrentState(appState, elements) {\n this.lastEntry = this.hydrateHistoryEntry(this.generateEntry(appState, elements));\n }\n // Suspicious that this is called so many places. Seems error-prone.\n resumeRecording() {\n this.recording = true;\n }\n record(state, elements) {\n if (this.recording) {\n this.pushEntry(state, elements);\n this.recording = false;\n }\n }\n}\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (History);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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b0VBQW9FO0lBQ3BFLGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztJQUN4QixDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQWUsRUFBRSxRQUFzQztRQUM1RCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7U0FDeEI7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxpRUFBZSxPQUFPLEVBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vaGlzdG9yeS50cz83YmYyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcFN0YXRlIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBkZWVwQ29weUVsZW1lbnQgfSBmcm9tIFwiLi9lbGVtZW50L25ld0VsZW1lbnRcIjtcbmltcG9ydCB7IE11dGFibGUgfSBmcm9tIFwiLi91dGlsaXR5LXR5cGVzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yeUVudHJ5IHtcbiAgYXBwU3RhdGU6IFJldHVyblR5cGU8dHlwZW9mIGNsZWFyQXBwU3RhdGVQcm9wZXJ0aWVzRm9ySGlzdG9yeT47XG4gIGVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdO1xufVxuXG5pbnRlcmZhY2UgRGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50IHtcbiAgaWQ6IHN0cmluZztcbiAgdmVyc2lvbk5vbmNlOiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBEZWh5ZHJhdGVkSGlzdG9yeUVudHJ5IHtcbiAgYXBwU3RhdGU6IHN0cmluZztcbiAgZWxlbWVudHM6IERlaHlkcmF0ZWRFeGNhbGlkcmF3RWxlbWVudFtdO1xufVxuXG5jb25zdCBjbGVhckFwcFN0YXRlUHJvcGVydGllc0Zvckhpc3RvcnkgPSAoYXBwU3RhdGU6IEFwcFN0YXRlKSA9PiB7XG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRFbGVtZW50SWRzOiBhcHBTdGF0ZS5zZWxlY3RlZEVsZW1lbnRJZHMsXG4gICAgc2VsZWN0ZWRHcm91cElkczogYXBwU3RhdGUuc2VsZWN0ZWRHcm91cElkcyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yOiBhcHBTdGF0ZS52aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGVkaXRpbmdMaW5lYXJFbGVtZW50OiBhcHBTdGF0ZS5lZGl0aW5nTGluZWFyRWxlbWVudCxcbiAgICBlZGl0aW5nR3JvdXBJZDogYXBwU3RhdGUuZWRpdGluZ0dyb3VwSWQsXG4gICAgbmFtZTogYXBwU3RhdGUubmFtZSxcbiAgfTtcbn07XG5cbmNsYXNzIEhpc3Rvcnkge1xuICBwcml2YXRlIGVsZW1lbnRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8bnVtYmVyLCBFeGNhbGlkcmF3RWxlbWVudD4+KCk7XG4gIHByaXZhdGUgcmVjb3JkaW5nOiBib29sZWFuID0gdHJ1ZTtcbiAgcHJpdmF0ZSBzdGF0ZUhpc3Rvcnk6IERlaHlkcmF0ZWRIaXN0b3J5RW50cnlbXSA9IFtdO1xuICBwcml2YXRlIHJlZG9TdGFjazogRGVoeWRyYXRlZEhpc3RvcnlFbnRyeVtdID0gW107XG4gIHByaXZhdGUgbGFzdEVudHJ5OiBIaXN0b3J5RW50cnkgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIGh5ZHJhdGVIaXN0b3J5RW50cnkoe1xuICAgIGFwcFN0YXRlLFxuICAgIGVsZW1lbnRzLFxuICB9OiBEZWh5ZHJhdGVkSGlzdG9yeUVudHJ5KTogSGlzdG9yeUVudHJ5IHtcbiAgICByZXR1cm4ge1xuICAgICAgYXBwU3RhdGU6IEpTT04ucGFyc2UoYXBwU3RhdGUpLFxuICAgICAgZWxlbWVudHM6IGVsZW1lbnRzLm1hcCgoZGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsZW1lbnRDYWNoZVxuICAgICAgICAgIC5nZXQoZGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50LmlkKVxuICAgICAgICAgID8uZ2V0KGRlaHlkcmF0ZWRFeGNhbGlkcmF3RWxlbWVudC52ZXJzaW9uTm9uY2UpO1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRWxlbWVudCBub3QgZm91bmQ6ICR7ZGVoeWRyYXRlZEV4Y2FsaWRyYXdFbGVtZW50LmlkfToke2RlaHlkcmF0ZWRFeGNhbGlkcmF3RWxlbWVudC52ZXJzaW9uTm9uY2V9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZGVoeWRyYXRlSGlzdG9yeUVudHJ5KHtcbiAgICBhcHBTdGF0ZSxcbiAgICBlbGVtZW50cyxcbiAgfTogSGlzdG9yeUVudHJ5KTogRGVoeWRyYXRlZEhpc3RvcnlFbnRyeSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFwcFN0YXRlOiBKU09OLnN0cmluZ2lmeShhcHBTdGF0ZSksXG4gICAgICBlbGVtZW50czogZWxlbWVudHMubWFwKChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuZWxlbWVudENhY2hlLmhhcyhlbGVtZW50LmlkKSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudENhY2hlLnNldChlbGVtZW50LmlkLCBuZXcgTWFwKCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcnNpb25zID0gdGhpcy5lbGVtZW50Q2FjaGUuZ2V0KGVsZW1lbnQuaWQpITtcbiAgICAgICAgaWYgKCF2ZXJzaW9ucy5oYXMoZWxlbWVudC52ZXJzaW9uTm9uY2UpKSB7XG4gICAgICAgICAgdmVyc2lvbnMuc2V0KGVsZW1lbnQudmVyc2lvbk5vbmNlLCBkZWVwQ29weUVsZW1lbnQoZWxlbWVudCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgdmVyc2lvbk5vbmNlOiBlbGVtZW50LnZlcnNpb25Ob25jZSxcbiAgICAgICAgfTtcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICBnZXRTbmFwc2hvdEZvclRlc3QoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlY29yZGluZzogdGhpcy5yZWNvcmRpbmcsXG4gICAgICBzdGF0ZUhpc3Rvcnk6IHRoaXMuc3RhdGVIaXN0b3J5Lm1hcCgoZGVoeWRyYXRlZEhpc3RvcnlFbnRyeSkgPT5cbiAgICAgICAgdGhpcy5oeWRyYXRlSGlzdG9yeUVudHJ5KGRlaHlkcmF0ZWRIaXN0b3J5RW50cnkpLFxuICAgICAgKSxcbiAgICAgIHJlZG9TdGFjazogdGhpcy5yZWRvU3RhY2subWFwKChkZWh5ZHJhdGVkSGlzdG9yeUVudHJ5KSA9PlxuICAgICAgICB0aGlzLmh5ZHJhdGVIaXN0b3J5RW50cnkoZGVoeWRyYXRlZEhpc3RvcnlFbnRyeSksXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBjbGVhcigpIHtcbiAgICB0aGlzLnN0YXRlSGlzdG9yeS5sZW5ndGggPSAwO1xuICAgIHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9IDA7XG4gICAgdGhpcy5sYXN0RW50cnkgPSBudWxsO1xuICAgIHRoaXMuZWxlbWVudENhY2hlLmNsZWFyKCk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlRW50cnkgPSAoXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICApOiBEZWh5ZHJhdGVkSGlzdG9yeUVudHJ5ID0+XG4gICAgdGhpcy5kZWh5ZHJhdGVIaXN0b3J5RW50cnkoe1xuICAgICAgYXBwU3RhdGU6IGNsZWFyQXBwU3RhdGVQcm9wZXJ0aWVzRm9ySGlzdG9yeShhcHBTdGF0ZSksXG4gICAgICBlbGVtZW50czogZWxlbWVudHMucmVkdWNlKChlbGVtZW50cywgZWxlbWVudCkgPT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpICYmXG4gICAgICAgICAgYXBwU3RhdGUubXVsdGlFbGVtZW50ICYmXG4gICAgICAgICAgYXBwU3RhdGUubXVsdGlFbGVtZW50LmlkID09PSBlbGVtZW50LmlkXG4gICAgICAgICkge1xuICAgICAgICAgIC8vIGRvbid0IHN0b3JlIG11bHRpLXBvaW50IGFycm93IGlmIHN0aWxsIGhhcyBvbmx5IG9uZSBwb2ludFxuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGFwcFN0YXRlLm11bHRpRWxlbWVudCAmJlxuICAgICAgICAgICAgYXBwU3RhdGUubXVsdGlFbGVtZW50LmlkID09PSBlbGVtZW50LmlkICYmXG4gICAgICAgICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZWxlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAuLi5lbGVtZW50LFxuICAgICAgICAgICAgLy8gZG9uJ3Qgc3RvcmUgbGFzdCBwb2ludCBpZiBub3QgY29tbWl0dGVkXG4gICAgICAgICAgICBwb2ludHM6XG4gICAgICAgICAgICAgIGVsZW1lbnQubGFzdENvbW1pdHRlZFBvaW50ICE9PVxuICAgICAgICAgICAgICBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgID8gZWxlbWVudC5wb2ludHMuc2xpY2UoMCwgLTEpXG4gICAgICAgICAgICAgICAgOiBlbGVtZW50LnBvaW50cyxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50cztcbiAgICAgIH0sIFtdIGFzIE11dGFibGU8dHlwZW9mIGVsZW1lbnRzPiksXG4gICAgfSk7XG5cbiAgc2hvdWxkQ3JlYXRlRW50cnkobmV4dEVudHJ5OiBIaXN0b3J5RW50cnkpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxhc3RFbnRyeSB9ID0gdGhpcztcblxuICAgIGlmICghbGFzdEVudHJ5KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAobmV4dEVudHJ5LmVsZW1lbnRzLmxlbmd0aCAhPT0gbGFzdEVudHJ5LmVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gbG9vcCBmcm9tIHJpZ2h0IHRvIGxlZnQgYXMgY2hhbmdlcyBhcmUgbGlrZWxpZXIgdG8gaGFwcGVuIG9uIG5ldyBlbGVtZW50c1xuICAgIGZvciAobGV0IGkgPSBuZXh0RW50cnkuZWxlbWVudHMubGVuZ3RoIC0gMTsgaSA+IC0xOyBpLS0pIHtcbiAgICAgIGNvbnN0IHByZXYgPSBuZXh0RW50cnkuZWxlbWVudHNbaV07XG4gICAgICBjb25zdCBuZXh0ID0gbGFzdEVudHJ5LmVsZW1lbnRzW2ldO1xuICAgICAgaWYgKFxuICAgICAgICAhcHJldiB8fFxuICAgICAgICAhbmV4dCB8fFxuICAgICAgICBwcmV2LmlkICE9PSBuZXh0LmlkIHx8XG4gICAgICAgIHByZXYudmVyc2lvbk5vbmNlICE9PSBuZXh0LnZlcnNpb25Ob25jZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIG5vdGU6IHRoaXMgaXMgc2FmZSBiZWNhdXNlIGVudHJ5J3MgYXBwU3RhdGUgaXMgZ3VhcmFudGVlZCBubyBleGNlc3MgcHJvcHNcbiAgICBsZXQga2V5OiBrZXlvZiB0eXBlb2YgbmV4dEVudHJ5LmFwcFN0YXRlO1xuICAgIGZvciAoa2V5IGluIG5leHRFbnRyeS5hcHBTdGF0ZSkge1xuICAgICAgaWYgKGtleSA9PT0gXCJlZGl0aW5nTGluZWFyRWxlbWVudFwiKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZXh0RW50cnkuYXBwU3RhdGVba2V5XT8uZWxlbWVudElkID09PVxuICAgICAgICAgIGxhc3RFbnRyeS5hcHBTdGF0ZVtrZXldPy5lbGVtZW50SWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09IFwic2VsZWN0ZWRFbGVtZW50SWRzXCIgfHwga2V5ID09PSBcInNlbGVjdGVkR3JvdXBJZHNcIikge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmIChuZXh0RW50cnkuYXBwU3RhdGVba2V5XSAhPT0gbGFzdEVudHJ5LmFwcFN0YXRlW2tleV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVzaEVudHJ5KGFwcFN0YXRlOiBBcHBTdGF0ZSwgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICBjb25zdCBuZXdFbnRyeURlaHlkcmF0ZWQgPSB0aGlzLmdlbmVyYXRlRW50cnkoYXBwU3RhdGUsIGVsZW1lbnRzKTtcbiAgICBjb25zdCBuZXdFbnRyeTogSGlzdG9yeUVudHJ5ID0gdGhpcy5oeWRyYXRlSGlzdG9yeUVudHJ5KG5ld0VudHJ5RGVoeWRyYXRlZCk7XG5cbiAgICBpZiAobmV3RW50cnkpIHtcbiAgICAgIGlmICghdGhpcy5zaG91bGRDcmVhdGVFbnRyeShuZXdFbnRyeSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN0YXRlSGlzdG9yeS5wdXNoKG5ld0VudHJ5RGVoeWRyYXRlZCk7XG4gICAgICB0aGlzLmxhc3RFbnRyeSA9IG5ld0VudHJ5O1xuICAgICAgLy8gQXMgYSBuZXcgZW50cnkgd2FzIHB1c2hlZCwgd2UgaW52YWxpZGF0ZSB0aGUgcmVkbyBzdGFja1xuICAgICAgdGhpcy5jbGVhclJlZG9TdGFjaygpO1xuICAgIH1cbiAgfVxuXG4gIGNsZWFyUmVkb1N0YWNrKCkge1xuICAgIHRoaXMucmVkb1N0YWNrLnNwbGljZSgwLCB0aGlzLnJlZG9TdGFjay5sZW5ndGgpO1xuICB9XG5cbiAgcmVkb09uY2UoKTogSGlzdG9yeUVudHJ5IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMucmVkb1N0YWNrLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgZW50cnlUb1Jlc3RvcmUgPSB0aGlzLnJlZG9TdGFjay5wb3AoKTtcblxuICAgIGlmIChlbnRyeVRvUmVzdG9yZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnN0YXRlSGlzdG9yeS5wdXNoKGVudHJ5VG9SZXN0b3JlKTtcbiAgICAgIHJldHVybiB0aGlzLmh5ZHJhdGVIaXN0b3J5RW50cnkoZW50cnlUb1Jlc3RvcmUpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdW5kb09uY2UoKTogSGlzdG9yeUVudHJ5IHwgbnVsbCB7XG4gICAgaWYgKHRoaXMuc3RhdGVIaXN0b3J5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudEVudHJ5ID0gdGhpcy5zdGF0ZUhpc3RvcnkucG9wKCk7XG5cbiAgICBjb25zdCBlbnRyeVRvUmVzdG9yZSA9IHRoaXMuc3RhdGVIaXN0b3J5W3RoaXMuc3RhdGVIaXN0b3J5Lmxlbmd0aCAtIDFdO1xuXG4gICAgaWYgKGN1cnJlbnRFbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJlZG9TdGFjay5wdXNoKGN1cnJlbnRFbnRyeSk7XG4gICAgICByZXR1cm4gdGhpcy5oeWRyYXRlSGlzdG9yeUVudHJ5KGVudHJ5VG9SZXN0b3JlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGVzIGhpc3RvcnkncyBgbGFzdEVudHJ5YCB0byBsYXRlc3QgYXBwIHN0YXRlLiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiAgd2hlbiBkb2luZyB1bmRvL3JlZG8gd2hpY2ggaXRzZWxmIGRvZXNuJ3QgY29tbWl0IHRvIGhpc3RvcnksIGJ1dCB1cGRhdGVzXG4gICAqICBhcHAgc3RhdGUgaW4gYSB3YXkgdGhhdCB3b3VsZCBicmVhayBgc2hvdWxkQ3JlYXRlRW50cnlgIHdoaWNoIHJlbGllcyBvblxuICAgKiAgYGxhc3RFbnRyeWAgdG8gcmVmbGVjdCBsYXN0IGNvbWl0dGFibGUgaGlzdG9yeSBzdGF0ZS5cbiAgICogV2UgY2FuJ3QgdXBkYXRlIGBsYXN0RW50cnlgIGZyb20gd2l0aGluIGhpc3Rvcnkgd2hlbiBjYWxsaW5nIHVuZG8vcmVkb1xuICAgKiAgYmVjYXVzZSB0aGUgYWN0aW9uIHBvdGVudGlhbGx5IG11dGF0ZXMgYXBwU3RhdGUvZWxlbWVudHMgYmVmb3JlIHN0b3JpbmdcbiAgICogIGl0LlxuICAgKi9cbiAgc2V0Q3VycmVudFN0YXRlKGFwcFN0YXRlOiBBcHBTdGF0ZSwgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICB0aGlzLmxhc3RFbnRyeSA9IHRoaXMuaHlkcmF0ZUhpc3RvcnlFbnRyeShcbiAgICAgIHRoaXMuZ2VuZXJhdGVFbnRyeShhcHBTdGF0ZSwgZWxlbWVudHMpLFxuICAgICk7XG4gIH1cblxuICAvLyBTdXNwaWNpb3VzIHRoYXQgdGhpcyBpcyBjYWxsZWQgc28gbWFueSBwbGFjZXMuIFNlZW1zIGVycm9yLXByb25lLlxuICByZXN1bWVSZWNvcmRpbmcoKSB7XG4gICAgdGhpcy5yZWNvcmRpbmcgPSB0cnVlO1xuICB9XG5cbiAgcmVjb3JkKHN0YXRlOiBBcHBTdGF0ZSwgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10pIHtcbiAgICBpZiAodGhpcy5yZWNvcmRpbmcpIHtcbiAgICAgIHRoaXMucHVzaEVudHJ5KHN0YXRlLCBlbGVtZW50cyk7XG4gICAgICB0aGlzLnJlY29yZGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIaXN0b3J5O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../history.ts\n");
|
|
3673
3673
|
|
|
3674
3674
|
/***/ }),
|
|
3675
3675
|
|
|
@@ -3735,7 +3735,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3735
3735
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3736
3736
|
|
|
3737
3737
|
"use strict";
|
|
3738
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"adjustXYWithRotation\": () => (/* binding */ adjustXYWithRotation),\n/* harmony export */ \"arePointsEqual\": () => (/* binding */ arePointsEqual),\n/* harmony export */ \"centerPoint\": () => (/* binding */ centerPoint),\n/* harmony export */ \"distance2d\": () => (/* binding */ distance2d),\n/* harmony export */ \"getBezierCurveArcLengths\": () => (/* binding */ getBezierCurveArcLengths),\n/* harmony export */ \"getBezierCurveLength\": () => (/* binding */ getBezierCurveLength),\n/* harmony export */ \"getBezierXY\": () => (/* binding */ getBezierXY),\n/* harmony export */ \"getControlPointsForBezierCurve\": () => (/* binding */ getControlPointsForBezierCurve),\n/* harmony export */ \"getCornerRadius\": () => (/* binding */ getCornerRadius),\n/* harmony export */ \"getGridPoint\": () => (/* binding */ getGridPoint),\n/* harmony export */ \"getPointOnAPath\": () => (/* binding */ getPointOnAPath),\n/* harmony export */ \"getPointsInBezierCurve\": () => (/* binding */ getPointsInBezierCurve),\n/* harmony export */ \"isPathALoop\": () => (/* binding */ isPathALoop),\n/* harmony export */ \"isPointInPolygon\": () => (/* binding */ isPointInPolygon),\n/* harmony export */ \"isRightAngle\": () => (/* binding */ isRightAngle),\n/* harmony export */ \"mapIntervalToBezierT\": () => (/* binding */ mapIntervalToBezierT),\n/* harmony export */ \"rotate\": () => (/* binding */ rotate),\n/* harmony export */ \"rotatePoint\": () => (/* binding */ rotatePoint)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element/bounds */ \"../../element/bounds.ts\");\n\n\n\nconst rotate = (x1, y1, x2, y2, angle) => \n// 𝑎′𝑥=(𝑎𝑥−𝑐𝑥)cos𝜃−(𝑎𝑦−𝑐𝑦)sin𝜃+𝑐𝑥\n// 𝑎′𝑦=(𝑎𝑥−𝑐𝑥)sin𝜃+(𝑎𝑦−𝑐𝑦)cos𝜃+𝑐𝑦.\n// https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line\n[\n (x1 - x2) * Math.cos(angle) - (y1 - y2) * Math.sin(angle) + x2,\n (x1 - x2) * Math.sin(angle) + (y1 - y2) * Math.cos(angle) + y2,\n];\nconst rotatePoint = (point, center, angle) => rotate(point[0], point[1], center[0], center[1], angle);\nconst adjustXYWithRotation = (sides, x, y, angle, deltaX1, deltaY1, deltaX2, deltaY2) => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n if (sides.e && sides.w) {\n x += deltaX1 + deltaX2;\n }\n else if (sides.e) {\n x += deltaX1 * (1 + cos);\n y += deltaX1 * sin;\n x += deltaX2 * (1 - cos);\n y += deltaX2 * -sin;\n }\n else if (sides.w) {\n x += deltaX1 * (1 - cos);\n y += deltaX1 * -sin;\n x += deltaX2 * (1 + cos);\n y += deltaX2 * sin;\n }\n if (sides.n && sides.s) {\n y += deltaY1 + deltaY2;\n }\n else if (sides.n) {\n x += deltaY1 * sin;\n y += deltaY1 * (1 - cos);\n x += deltaY2 * -sin;\n y += deltaY2 * (1 + cos);\n }\n else if (sides.s) {\n x += deltaY1 * -sin;\n y += deltaY1 * (1 + cos);\n x += deltaY2 * sin;\n y += deltaY2 * (1 - cos);\n }\n return [x, y];\n};\nconst getPointOnAPath = (point, path) => {\n const [px, py] = point;\n const [start, ...other] = path;\n let [lastX, lastY] = start;\n let kLine = 0;\n let idx = 0;\n // if any item in the array is true, it means that a point is\n // on some segment of a line based path\n const retVal = other.some(([x2, y2], i) => {\n // we always take a line when dealing with line segments\n const x1 = lastX;\n const y1 = lastY;\n lastX = x2;\n lastY = y2;\n // if a point is not within the domain of the line segment\n // it is not on the line segment\n if (px < x1 || px > x2) {\n return false;\n }\n // check if all points lie on the same line\n // y1 = kx1 + b, y2 = kx2 + b\n // y2 - y1 = k(x2 - x2) -> k = (y2 - y1) / (x2 - x1)\n // coefficient for the line (p0, p1)\n const kL = (y2 - y1) / (x2 - x1);\n // coefficient for the line segment (p0, point)\n const kP1 = (py - y1) / (px - x1);\n // coefficient for the line segment (point, p1)\n const kP2 = (py - y2) / (px - x2);\n // because we are basing both lines from the same starting point\n // the only option for collinearity is having same coefficients\n // using it for floating point comparisons\n const epsilon = 0.3;\n // if coefficient is more than an arbitrary epsilon,\n // these lines are nor collinear\n if (Math.abs(kP1 - kL) > epsilon && Math.abs(kP2 - kL) > epsilon) {\n return false;\n }\n // store the coefficient because we are goint to need it\n kLine = kL;\n idx = i;\n return true;\n });\n // Return a coordinate that is always on the line segment\n if (retVal === true) {\n return { x: point[0], y: kLine * point[0], segment: idx };\n }\n return null;\n};\nconst distance2d = (x1, y1, x2, y2) => {\n const xd = x2 - x1;\n const yd = y2 - y1;\n return Math.hypot(xd, yd);\n};\nconst centerPoint = (a, b) => {\n return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n};\n// Checks if the first and last point are close enough\n// to be considered a loop\nconst isPathALoop = (points, \n/** supply if you want the loop detection to account for current zoom */\nzoomValue = 1) => {\n if (points.length >= 3) {\n const [first, last] = [points[0], points[points.length - 1]];\n const distance = distance2d(first[0], first[1], last[0], last[1]);\n // Adjusting LINE_CONFIRM_THRESHOLD to current zoom so that when zoomed in\n // really close we make the threshold smaller, and vice versa.\n return distance <= _constants__WEBPACK_IMPORTED_MODULE_0__.LINE_CONFIRM_THRESHOLD / zoomValue;\n }\n return false;\n};\n// Draw a line from the point to the right till infiinty\n// Check how many lines of the polygon does this infinite line intersects with\n// If the number of intersections is odd, point is in the polygon\nconst isPointInPolygon = (points, x, y) => {\n const vertices = points.length;\n // There must be at least 3 vertices in polygon\n if (vertices < 3) {\n return false;\n }\n const extreme = [Number.MAX_SAFE_INTEGER, y];\n const p = [x, y];\n let count = 0;\n for (let i = 0; i < vertices; i++) {\n const current = points[i];\n const next = points[(i + 1) % vertices];\n if (doSegmentsIntersect(current, next, p, extreme)) {\n if (orderedColinearOrientation(current, p, next) === 0) {\n return isPointWithinBounds(current, p, next);\n }\n count++;\n }\n }\n // true if count is off\n return count % 2 === 1;\n};\n// Returns whether `q` lies inside the segment/rectangle defined by `p` and `r`.\n// This is an approximation to \"does `q` lie on a segment `pr`\" check.\nconst isPointWithinBounds = (p, q, r) => {\n return (q[0] <= Math.max(p[0], r[0]) &&\n q[0] >= Math.min(p[0], r[0]) &&\n q[1] <= Math.max(p[1], r[1]) &&\n q[1] >= Math.min(p[1], r[1]));\n};\n// For the ordered points p, q, r, return\n// 0 if p, q, r are colinear\n// 1 if Clockwise\n// 2 if counterclickwise\nconst orderedColinearOrientation = (p, q, r) => {\n const val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]);\n if (val === 0) {\n return 0;\n }\n return val > 0 ? 1 : 2;\n};\n// Check is p1q1 intersects with p2q2\nconst doSegmentsIntersect = (p1, q1, p2, q2) => {\n const o1 = orderedColinearOrientation(p1, q1, p2);\n const o2 = orderedColinearOrientation(p1, q1, q2);\n const o3 = orderedColinearOrientation(p2, q2, p1);\n const o4 = orderedColinearOrientation(p2, q2, q1);\n if (o1 !== o2 && o3 !== o4) {\n return true;\n }\n // p1, q1 and p2 are colinear and p2 lies on segment p1q1\n if (o1 === 0 && isPointWithinBounds(p1, p2, q1)) {\n return true;\n }\n // p1, q1 and p2 are colinear and q2 lies on segment p1q1\n if (o2 === 0 && isPointWithinBounds(p1, q2, q1)) {\n return true;\n }\n // p2, q2 and p1 are colinear and p1 lies on segment p2q2\n if (o3 === 0 && isPointWithinBounds(p2, p1, q2)) {\n return true;\n }\n // p2, q2 and q1 are colinear and q1 lies on segment p2q2\n if (o4 === 0 && isPointWithinBounds(p2, q1, q2)) {\n return true;\n }\n return false;\n};\n// TODO: Rounding this point causes some shake when free drawing\nconst getGridPoint = (x, y, gridSize) => {\n if (gridSize) {\n return [\n Math.round(x / gridSize) * gridSize,\n Math.round(y / gridSize) * gridSize,\n ];\n }\n return [x, y];\n};\nconst getCornerRadius = (x, element) => {\n var _a, _b, _c, _d, _e;\n if (((_a = element.roundness) === null || _a === void 0 ? void 0 : _a.type) === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS ||\n ((_b = element.roundness) === null || _b === void 0 ? void 0 : _b.type) === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.LEGACY) {\n return x * _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_PROPORTIONAL_RADIUS;\n }\n if (((_c = element.roundness) === null || _c === void 0 ? void 0 : _c.type) === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS) {\n const fixedRadiusSize = (_e = (_d = element.roundness) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_ADAPTIVE_RADIUS;\n const CUTOFF_SIZE = fixedRadiusSize / _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_PROPORTIONAL_RADIUS;\n if (x <= CUTOFF_SIZE) {\n return x * _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_PROPORTIONAL_RADIUS;\n }\n return fixedRadiusSize;\n }\n return 0;\n};\nconst getControlPointsForBezierCurve = (element, endPoint) => {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_1__.getShapeForElement)(element);\n if (!shape) {\n return null;\n }\n const ops = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_2__.getCurvePathOps)(shape[0]);\n let currentP = [0, 0];\n let index = 0;\n let minDistance = Infinity;\n let controlPoints = null;\n while (index < ops.length) {\n const { op, data } = ops[index];\n if (op === \"move\") {\n currentP = data;\n }\n if (op === \"bcurveTo\") {\n const p0 = currentP;\n const p1 = [data[0], data[1]];\n const p2 = [data[2], data[3]];\n const p3 = [data[4], data[5]];\n const distance = distance2d(p3[0], p3[1], endPoint[0], endPoint[1]);\n if (distance < minDistance) {\n minDistance = distance;\n controlPoints = [p0, p1, p2, p3];\n }\n currentP = p3;\n }\n index++;\n }\n return controlPoints;\n};\nconst getBezierXY = (p0, p1, p2, p3, t) => {\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n return [tx, ty];\n};\nconst getPointsInBezierCurve = (element, endPoint) => {\n const controlPoints = getControlPointsForBezierCurve(element, endPoint);\n if (!controlPoints) {\n return [];\n }\n const pointsOnCurve = [];\n let t = 1;\n // Take 20 points on curve for better accuracy\n while (t > 0) {\n const point = getBezierXY(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3], t);\n pointsOnCurve.push([point[0], point[1]]);\n t -= 0.05;\n }\n if (pointsOnCurve.length) {\n if (arePointsEqual(pointsOnCurve.at(-1), endPoint)) {\n pointsOnCurve.push([endPoint[0], endPoint[1]]);\n }\n }\n return pointsOnCurve;\n};\nconst getBezierCurveArcLengths = (element, endPoint) => {\n const arcLengths = [];\n arcLengths[0] = 0;\n const points = getPointsInBezierCurve(element, endPoint);\n let index = 0;\n let distance = 0;\n while (index < points.length - 1) {\n const segmentDistance = distance2d(points[index][0], points[index][1], points[index + 1][0], points[index + 1][1]);\n distance += segmentDistance;\n arcLengths.push(distance);\n index++;\n }\n return arcLengths;\n};\nconst getBezierCurveLength = (element, endPoint) => {\n const arcLengths = getBezierCurveArcLengths(element, endPoint);\n return arcLengths.at(-1);\n};\n// This maps interval to actual interval t on the curve so that when t = 0.5, its actually the point at 50% of the length\nconst mapIntervalToBezierT = (element, endPoint, interval) => {\n const arcLengths = getBezierCurveArcLengths(element, endPoint);\n const pointsCount = arcLengths.length - 1;\n const curveLength = arcLengths.at(-1);\n const targetLength = interval * curveLength;\n let low = 0;\n let high = pointsCount;\n let index = 0;\n // Doing a binary search to find the largest length that is less than the target length\n while (low < high) {\n index = Math.floor(low + (high - low) / 2);\n if (arcLengths[index] < targetLength) {\n low = index + 1;\n }\n else {\n high = index;\n }\n }\n if (arcLengths[index] > targetLength) {\n index--;\n }\n if (arcLengths[index] === targetLength) {\n return index / pointsCount;\n }\n return (1 -\n (index +\n (targetLength - arcLengths[index]) /\n (arcLengths[index + 1] - arcLengths[index])) /\n pointsCount);\n};\nconst arePointsEqual = (p1, p2) => {\n return p1[0] === p2[0] && p1[1] === p2[1];\n};\nconst isRightAngle = (angle) => {\n // if our angles were mathematically accurate, we could just check\n //\n // angle % (Math.PI / 2) === 0\n //\n // but since we're in floating point land, we need to round.\n //\n // Below, after dividing by Math.PI, a multiple of 0.5 indicates a right\n // angle, which we can check with modulo after rounding.\n return Math.round((angle / Math.PI) * 10000) % 5000 === 0;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFTLEVBQUUsRUFBUyxFQUFFLEVBQUU7SUFDckQsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUssTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUM1QyxrRUFBa0U7SUFDbEUsRUFBRTtJQUNGLGlDQUFpQztJQUNqQyxFQUFFO0lBQ0YsNERBQTREO0lBQzVELEVBQUU7SUFDRix3RUFBd0U7SUFDeEUsd0RBQXdEO0lBQ3hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztBQUM1RCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vbWF0aC50cz9kNTZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vcm1hbGl6ZWRab29tVmFsdWUsIFBvaW50LCBab29tIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfQURBUFRJVkVfUkFESVVTLFxuICBMSU5FX0NPTkZJUk1fVEhSRVNIT0xELFxuICBERUZBVUxUX1BST1BPUlRJT05BTF9SQURJVVMsXG4gIFJPVU5ETkVTUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG59IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldFNoYXBlRm9yRWxlbWVudCB9IGZyb20gXCIuL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEN1cnZlUGF0aE9wcyB9IGZyb20gXCIuL2VsZW1lbnQvYm91bmRzXCI7XG5cbmV4cG9ydCBjb25zdCByb3RhdGUgPSAoXG4gIHgxOiBudW1iZXIsXG4gIHkxOiBudW1iZXIsXG4gIHgyOiBudW1iZXIsXG4gIHkyOiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+XG4gIC8vIPCdkY7igLLwnZGlPSjwnZGO8J2RpeKIkvCdkZDwnZGlKWNvc/CdnIPiiJIo8J2RjvCdkabiiJLwnZGQ8J2RpilzaW7wnZyDK/CdkZDwnZGlXG4gIC8vIPCdkY7igLLwnZGmPSjwnZGO8J2RpeKIkvCdkZDwnZGlKXNpbvCdnIMrKPCdkY7wnZGm4oiS8J2RkPCdkaYpY29z8J2cgyvwnZGQ8J2Rpi5cbiAgLy8gaHR0cHM6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8yMjA0NTIwL2hvdy1kby1pLXJvdGF0ZS1hLWxpbmUtc2VnbWVudC1pbi1hLXNwZWNpZmljLXBvaW50LW9uLXRoZS1saW5lXG4gIFtcbiAgICAoeDEgLSB4MikgKiBNYXRoLmNvcyhhbmdsZSkgLSAoeTEgLSB5MikgKiBNYXRoLnNpbihhbmdsZSkgKyB4MixcbiAgICAoeDEgLSB4MikgKiBNYXRoLnNpbihhbmdsZSkgKyAoeTEgLSB5MikgKiBNYXRoLmNvcyhhbmdsZSkgKyB5MixcbiAgXTtcblxuZXhwb3J0IGNvbnN0IHJvdGF0ZVBvaW50ID0gKFxuICBwb2ludDogUG9pbnQsXG4gIGNlbnRlcjogUG9pbnQsXG4gIGFuZ2xlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHJvdGF0ZShwb2ludFswXSwgcG9pbnRbMV0sIGNlbnRlclswXSwgY2VudGVyWzFdLCBhbmdsZSk7XG5cbmV4cG9ydCBjb25zdCBhZGp1c3RYWVdpdGhSb3RhdGlvbiA9IChcbiAgc2lkZXM6IHtcbiAgICBuPzogYm9vbGVhbjtcbiAgICBlPzogYm9vbGVhbjtcbiAgICBzPzogYm9vbGVhbjtcbiAgICB3PzogYm9vbGVhbjtcbiAgfSxcbiAgeDogbnVtYmVyLFxuICB5OiBudW1iZXIsXG4gIGFuZ2xlOiBudW1iZXIsXG4gIGRlbHRhWDE6IG51bWJlcixcbiAgZGVsdGFZMTogbnVtYmVyLFxuICBkZWx0YVgyOiBudW1iZXIsXG4gIGRlbHRhWTI6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlcl0gPT4ge1xuICBjb25zdCBjb3MgPSBNYXRoLmNvcyhhbmdsZSk7XG4gIGNvbnN0IHNpbiA9IE1hdGguc2luKGFuZ2xlKTtcbiAgaWYgKHNpZGVzLmUgJiYgc2lkZXMudykge1xuICAgIHggKz0gZGVsdGFYMSArIGRlbHRhWDI7XG4gIH0gZWxzZSBpZiAoc2lkZXMuZSkge1xuICAgIHggKz0gZGVsdGFYMSAqICgxICsgY29zKTtcbiAgICB5ICs9IGRlbHRhWDEgKiBzaW47XG4gICAgeCArPSBkZWx0YVgyICogKDEgLSBjb3MpO1xuICAgIHkgKz0gZGVsdGFYMiAqIC1zaW47XG4gIH0gZWxzZSBpZiAoc2lkZXMudykge1xuICAgIHggKz0gZGVsdGFYMSAqICgxIC0gY29zKTtcbiAgICB5ICs9IGRlbHRhWDEgKiAtc2luO1xuICAgIHggKz0gZGVsdGFYMiAqICgxICsgY29zKTtcbiAgICB5ICs9IGRlbHRhWDIgKiBzaW47XG4gIH1cblxuICBpZiAoc2lkZXMubiAmJiBzaWRlcy5zKSB7XG4gICAgeSArPSBkZWx0YVkxICsgZGVsdGFZMjtcbiAgfSBlbHNlIGlmIChzaWRlcy5uKSB7XG4gICAgeCArPSBkZWx0YVkxICogc2luO1xuICAgIHkgKz0gZGVsdGFZMSAqICgxIC0gY29zKTtcbiAgICB4ICs9IGRlbHRhWTIgKiAtc2luO1xuICAgIHkgKz0gZGVsdGFZMiAqICgxICsgY29zKTtcbiAgfSBlbHNlIGlmIChzaWRlcy5zKSB7XG4gICAgeCArPSBkZWx0YVkxICogLXNpbjtcbiAgICB5ICs9IGRlbHRhWTEgKiAoMSArIGNvcyk7XG4gICAgeCArPSBkZWx0YVkyICogc2luO1xuICAgIHkgKz0gZGVsdGFZMiAqICgxIC0gY29zKTtcbiAgfVxuICByZXR1cm4gW3gsIHldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvaW50T25BUGF0aCA9IChwb2ludDogUG9pbnQsIHBhdGg6IFBvaW50W10pID0+IHtcbiAgY29uc3QgW3B4LCBweV0gPSBwb2ludDtcbiAgY29uc3QgW3N0YXJ0LCAuLi5vdGhlcl0gPSBwYXRoO1xuICBsZXQgW2xhc3RYLCBsYXN0WV0gPSBzdGFydDtcbiAgbGV0IGtMaW5lOiBudW1iZXIgPSAwO1xuICBsZXQgaWR4OiBudW1iZXIgPSAwO1xuXG4gIC8vIGlmIGFueSBpdGVtIGluIHRoZSBhcnJheSBpcyB0cnVlLCBpdCBtZWFucyB0aGF0IGEgcG9pbnQgaXNcbiAgLy8gb24gc29tZSBzZWdtZW50IG9mIGEgbGluZSBiYXNlZCBwYXRoXG4gIGNvbnN0IHJldFZhbCA9IG90aGVyLnNvbWUoKFt4MiwgeTJdLCBpKSA9PiB7XG4gICAgLy8gd2UgYWx3YXlzIHRha2UgYSBsaW5lIHdoZW4gZGVhbGluZyB3aXRoIGxpbmUgc2VnbWVudHNcbiAgICBjb25zdCB4MSA9IGxhc3RYO1xuICAgIGNvbnN0IHkxID0gbGFzdFk7XG5cbiAgICBsYXN0WCA9IHgyO1xuICAgIGxhc3RZID0geTI7XG5cbiAgICAvLyBpZiBhIHBvaW50IGlzIG5vdCB3aXRoaW4gdGhlIGRvbWFpbiBvZiB0aGUgbGluZSBzZWdtZW50XG4gICAgLy8gaXQgaXMgbm90IG9uIHRoZSBsaW5lIHNlZ21lbnRcbiAgICBpZiAocHggPCB4MSB8fCBweCA+IHgyKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgYWxsIHBvaW50cyBsaWUgb24gdGhlIHNhbWUgbGluZVxuICAgIC8vIHkxID0ga3gxICsgYiwgeTIgPSBreDIgKyBiXG4gICAgLy8geTIgLSB5MSA9IGsoeDIgLSB4MikgLT4gayA9ICh5MiAtIHkxKSAvICh4MiAtIHgxKVxuXG4gICAgLy8gY29lZmZpY2llbnQgZm9yIHRoZSBsaW5lIChwMCwgcDEpXG4gICAgY29uc3Qga0wgPSAoeTIgLSB5MSkgLyAoeDIgLSB4MSk7XG5cbiAgICAvLyBjb2VmZmljaWVudCBmb3IgdGhlIGxpbmUgc2VnbWVudCAocDAsIHBvaW50KVxuICAgIGNvbnN0IGtQMSA9IChweSAtIHkxKSAvIChweCAtIHgxKTtcblxuICAgIC8vIGNvZWZmaWNpZW50IGZvciB0aGUgbGluZSBzZWdtZW50IChwb2ludCwgcDEpXG4gICAgY29uc3Qga1AyID0gKHB5IC0geTIpIC8gKHB4IC0geDIpO1xuXG4gICAgLy8gYmVjYXVzZSB3ZSBhcmUgYmFzaW5nIGJvdGggbGluZXMgZnJvbSB0aGUgc2FtZSBzdGFydGluZyBwb2ludFxuICAgIC8vIHRoZSBvbmx5IG9wdGlvbiBmb3IgY29sbGluZWFyaXR5IGlzIGhhdmluZyBzYW1lIGNvZWZmaWNpZW50c1xuXG4gICAgLy8gdXNpbmcgaXQgZm9yIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb25zXG4gICAgY29uc3QgZXBzaWxvbiA9IDAuMztcblxuICAgIC8vIGlmIGNvZWZmaWNpZW50IGlzIG1vcmUgdGhhbiBhbiBhcmJpdHJhcnkgZXBzaWxvbixcbiAgICAvLyB0aGVzZSBsaW5lcyBhcmUgbm9yIGNvbGxpbmVhclxuICAgIGlmIChNYXRoLmFicyhrUDEgLSBrTCkgPiBlcHNpbG9uICYmIE1hdGguYWJzKGtQMiAtIGtMKSA+IGVwc2lsb24pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBzdG9yZSB0aGUgY29lZmZpY2llbnQgYmVjYXVzZSB3ZSBhcmUgZ29pbnQgdG8gbmVlZCBpdFxuICAgIGtMaW5lID0ga0w7XG4gICAgaWR4ID0gaTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9KTtcblxuICAvLyBSZXR1cm4gYSBjb29yZGluYXRlIHRoYXQgaXMgYWx3YXlzIG9uIHRoZSBsaW5lIHNlZ21lbnRcbiAgaWYgKHJldFZhbCA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7IHg6IHBvaW50WzBdLCB5OiBrTGluZSAqIHBvaW50WzBdLCBzZWdtZW50OiBpZHggfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlMmQgPSAoeDE6IG51bWJlciwgeTE6IG51bWJlciwgeDI6IG51bWJlciwgeTI6IG51bWJlcikgPT4ge1xuICBjb25zdCB4ZCA9IHgyIC0geDE7XG4gIGNvbnN0IHlkID0geTIgLSB5MTtcbiAgcmV0dXJuIE1hdGguaHlwb3QoeGQsIHlkKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjZW50ZXJQb2ludCA9IChhOiBQb2ludCwgYjogUG9pbnQpOiBQb2ludCA9PiB7XG4gIHJldHVybiBbKGFbMF0gKyBiWzBdKSAvIDIsIChhWzFdICsgYlsxXSkgLyAyXTtcbn07XG5cbi8vIENoZWNrcyBpZiB0aGUgZmlyc3QgYW5kIGxhc3QgcG9pbnQgYXJlIGNsb3NlIGVub3VnaFxuLy8gdG8gYmUgY29uc2lkZXJlZCBhIGxvb3BcbmV4cG9ydCBjb25zdCBpc1BhdGhBTG9vcCA9IChcbiAgcG9pbnRzOiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudFtcInBvaW50c1wiXSxcbiAgLyoqIHN1cHBseSBpZiB5b3Ugd2FudCB0aGUgbG9vcCBkZXRlY3Rpb24gdG8gYWNjb3VudCBmb3IgY3VycmVudCB6b29tICovXG4gIHpvb21WYWx1ZTogWm9vbVtcInZhbHVlXCJdID0gMSBhcyBOb3JtYWxpemVkWm9vbVZhbHVlLFxuKTogYm9vbGVhbiA9PiB7XG4gIGlmIChwb2ludHMubGVuZ3RoID49IDMpIHtcbiAgICBjb25zdCBbZmlyc3QsIGxhc3RdID0gW3BvaW50c1swXSwgcG9pbnRzW3BvaW50cy5sZW5ndGggLSAxXV07XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKGZpcnN0WzBdLCBmaXJzdFsxXSwgbGFzdFswXSwgbGFzdFsxXSk7XG5cbiAgICAvLyBBZGp1c3RpbmcgTElORV9DT05GSVJNX1RIUkVTSE9MRCB0byBjdXJyZW50IHpvb20gc28gdGhhdCB3aGVuIHpvb21lZCBpblxuICAgIC8vIHJlYWxseSBjbG9zZSB3ZSBtYWtlIHRoZSB0aHJlc2hvbGQgc21hbGxlciwgYW5kIHZpY2UgdmVyc2EuXG4gICAgcmV0dXJuIGRpc3RhbmNlIDw9IExJTkVfQ09ORklSTV9USFJFU0hPTEQgLyB6b29tVmFsdWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuLy8gRHJhdyBhIGxpbmUgZnJvbSB0aGUgcG9pbnQgdG8gdGhlIHJpZ2h0IHRpbGwgaW5maWludHlcbi8vIENoZWNrIGhvdyBtYW55IGxpbmVzIG9mIHRoZSBwb2x5Z29uIGRvZXMgdGhpcyBpbmZpbml0ZSBsaW5lIGludGVyc2VjdHMgd2l0aFxuLy8gSWYgdGhlIG51bWJlciBvZiBpbnRlcnNlY3Rpb25zIGlzIG9kZCwgcG9pbnQgaXMgaW4gdGhlIHBvbHlnb25cbmV4cG9ydCBjb25zdCBpc1BvaW50SW5Qb2x5Z29uID0gKFxuICBwb2ludHM6IFBvaW50W10sXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogYm9vbGVhbiA9PiB7XG4gIGNvbnN0IHZlcnRpY2VzID0gcG9pbnRzLmxlbmd0aDtcblxuICAvLyBUaGVyZSBtdXN0IGJlIGF0IGxlYXN0IDMgdmVydGljZXMgaW4gcG9seWdvblxuICBpZiAodmVydGljZXMgPCAzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGV4dHJlbWU6IFBvaW50ID0gW051bWJlci5NQVhfU0FGRV9JTlRFR0VSLCB5XTtcbiAgY29uc3QgcDogUG9pbnQgPSBbeCwgeV07XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmVydGljZXM7IGkrKykge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBwb2ludHNbaV07XG4gICAgY29uc3QgbmV4dCA9IHBvaW50c1soaSArIDEpICUgdmVydGljZXNdO1xuICAgIGlmIChkb1NlZ21lbnRzSW50ZXJzZWN0KGN1cnJlbnQsIG5leHQsIHAsIGV4dHJlbWUpKSB7XG4gICAgICBpZiAob3JkZXJlZENvbGluZWFyT3JpZW50YXRpb24oY3VycmVudCwgcCwgbmV4dCkgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGlzUG9pbnRXaXRoaW5Cb3VuZHMoY3VycmVudCwgcCwgbmV4dCk7XG4gICAgICB9XG4gICAgICBjb3VudCsrO1xuICAgIH1cbiAgfVxuICAvLyB0cnVlIGlmIGNvdW50IGlzIG9mZlxuICByZXR1cm4gY291bnQgJSAyID09PSAxO1xufTtcblxuLy8gUmV0dXJucyB3aGV0aGVyIGBxYCBsaWVzIGluc2lkZSB0aGUgc2VnbWVudC9yZWN0YW5nbGUgZGVmaW5lZCBieSBgcGAgYW5kIGByYC5cbi8vIFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiB0byBcImRvZXMgYHFgIGxpZSBvbiBhIHNlZ21lbnQgYHByYFwiIGNoZWNrLlxuY29uc3QgaXNQb2ludFdpdGhpbkJvdW5kcyA9IChwOiBQb2ludCwgcTogUG9pbnQsIHI6IFBvaW50KSA9PiB7XG4gIHJldHVybiAoXG4gICAgcVswXSA8PSBNYXRoLm1heChwWzBdLCByWzBdKSAmJlxuICAgIHFbMF0gPj0gTWF0aC5taW4ocFswXSwgclswXSkgJiZcbiAgICBxWzFdIDw9IE1hdGgubWF4KHBbMV0sIHJbMV0pICYmXG4gICAgcVsxXSA+PSBNYXRoLm1pbihwWzFdLCByWzFdKVxuICApO1xufTtcblxuLy8gRm9yIHRoZSBvcmRlcmVkIHBvaW50cyBwLCBxLCByLCByZXR1cm5cbi8vIDAgaWYgcCwgcSwgciBhcmUgY29saW5lYXJcbi8vIDEgaWYgQ2xvY2t3aXNlXG4vLyAyIGlmIGNvdW50ZXJjbGlja3dpc2VcbmNvbnN0IG9yZGVyZWRDb2xpbmVhck9yaWVudGF0aW9uID0gKHA6IFBvaW50LCBxOiBQb2ludCwgcjogUG9pbnQpID0+IHtcbiAgY29uc3QgdmFsID0gKHFbMV0gLSBwWzFdKSAqIChyWzBdIC0gcVswXSkgLSAocVswXSAtIHBbMF0pICogKHJbMV0gLSBxWzFdKTtcbiAgaWYgKHZhbCA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiB2YWwgPiAwID8gMSA6IDI7XG59O1xuXG4vLyBDaGVjayBpcyBwMXExIGludGVyc2VjdHMgd2l0aCBwMnEyXG5jb25zdCBkb1NlZ21lbnRzSW50ZXJzZWN0ID0gKHAxOiBQb2ludCwgcTE6IFBvaW50LCBwMjogUG9pbnQsIHEyOiBQb2ludCkgPT4ge1xuICBjb25zdCBvMSA9IG9yZGVyZWRDb2xpbmVhck9yaWVudGF0aW9uKHAxLCBxMSwgcDIpO1xuICBjb25zdCBvMiA9IG9yZGVyZWRDb2xpbmVhck9yaWVudGF0aW9uKHAxLCBxMSwgcTIpO1xuICBjb25zdCBvMyA9IG9yZGVyZWRDb2xpbmVhck9yaWVudGF0aW9uKHAyLCBxMiwgcDEpO1xuICBjb25zdCBvNCA9IG9yZGVyZWRDb2xpbmVhck9yaWVudGF0aW9uKHAyLCBxMiwgcTEpO1xuXG4gIGlmIChvMSAhPT0gbzIgJiYgbzMgIT09IG80KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xpbmVhciBhbmQgcDIgbGllcyBvbiBzZWdtZW50IHAxcTFcbiAgaWYgKG8xID09PSAwICYmIGlzUG9pbnRXaXRoaW5Cb3VuZHMocDEsIHAyLCBxMSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHAxLCBxMSBhbmQgcDIgYXJlIGNvbGluZWFyIGFuZCBxMiBsaWVzIG9uIHNlZ21lbnQgcDFxMVxuICBpZiAobzIgPT09IDAgJiYgaXNQb2ludFdpdGhpbkJvdW5kcyhwMSwgcTIsIHExKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gcDIsIHEyIGFuZCBwMSBhcmUgY29saW5lYXIgYW5kIHAxIGxpZXMgb24gc2VnbWVudCBwMnEyXG4gIGlmIChvMyA9PT0gMCAmJiBpc1BvaW50V2l0aGluQm91bmRzKHAyLCBwMSwgcTIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBwMiwgcTIgYW5kIHExIGFyZSBjb2xpbmVhciBhbmQgcTEgbGllcyBvbiBzZWdtZW50IHAycTJcbiAgaWYgKG80ID09PSAwICYmIGlzUG9pbnRXaXRoaW5Cb3VuZHMocDIsIHExLCBxMikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIFRPRE86IFJvdW5kaW5nIHRoaXMgcG9pbnQgY2F1c2VzIHNvbWUgc2hha2Ugd2hlbiBmcmVlIGRyYXdpbmdcbmV4cG9ydCBjb25zdCBnZXRHcmlkUG9pbnQgPSAoXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBncmlkU2l6ZTogbnVtYmVyIHwgbnVsbCxcbik6IFtudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoZ3JpZFNpemUpIHtcbiAgICByZXR1cm4gW1xuICAgICAgTWF0aC5yb3VuZCh4IC8gZ3JpZFNpemUpICogZ3JpZFNpemUsXG4gICAgICBNYXRoLnJvdW5kKHkgLyBncmlkU2l6ZSkgKiBncmlkU2l6ZSxcbiAgICBdO1xuICB9XG4gIHJldHVybiBbeCwgeV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29ybmVyUmFkaXVzID0gKHg6IG51bWJlciwgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgaWYgKFxuICAgIGVsZW1lbnQucm91bmRuZXNzPy50eXBlID09PSBST1VORE5FU1MuUFJPUE9SVElPTkFMX1JBRElVUyB8fFxuICAgIGVsZW1lbnQucm91bmRuZXNzPy50eXBlID09PSBST1VORE5FU1MuTEVHQUNZXG4gICkge1xuICAgIHJldHVybiB4ICogREVGQVVMVF9QUk9QT1JUSU9OQUxfUkFESVVTO1xuICB9XG5cbiAgaWYgKGVsZW1lbnQucm91bmRuZXNzPy50eXBlID09PSBST1VORE5FU1MuQURBUFRJVkVfUkFESVVTKSB7XG4gICAgY29uc3QgZml4ZWRSYWRpdXNTaXplID0gZWxlbWVudC5yb3VuZG5lc3M/LnZhbHVlID8/IERFRkFVTFRfQURBUFRJVkVfUkFESVVTO1xuXG4gICAgY29uc3QgQ1VUT0ZGX1NJWkUgPSBmaXhlZFJhZGl1c1NpemUgLyBERUZBVUxUX1BST1BPUlRJT05BTF9SQURJVVM7XG5cbiAgICBpZiAoeCA8PSBDVVRPRkZfU0laRSkge1xuICAgICAgcmV0dXJuIHggKiBERUZBVUxUX1BST1BPUlRJT05BTF9SQURJVVM7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZpeGVkUmFkaXVzU2l6ZTtcbiAgfVxuXG4gIHJldHVybiAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRyb2xQb2ludHNGb3JCZXppZXJDdXJ2ZSA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gIGVuZFBvaW50OiBQb2ludCxcbikgPT4ge1xuICBjb25zdCBzaGFwZSA9IGdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50IGFzIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50KTtcbiAgaWYgKCFzaGFwZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlWzBdKTtcbiAgbGV0IGN1cnJlbnRQOiBNdXRhYmxlPFBvaW50PiA9IFswLCAwXTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gIGxldCBjb250cm9sUG9pbnRzOiBNdXRhYmxlPFBvaW50PltdIHwgbnVsbCA9IG51bGw7XG5cbiAgd2hpbGUgKGluZGV4IDwgb3BzLmxlbmd0aCkge1xuICAgIGNvbnN0IHsgb3AsIGRhdGEgfSA9IG9wc1tpbmRleF07XG4gICAgaWYgKG9wID09PSBcIm1vdmVcIikge1xuICAgICAgY3VycmVudFAgPSBkYXRhIGFzIHVua25vd24gYXMgTXV0YWJsZTxQb2ludD47XG4gICAgfVxuICAgIGlmIChvcCA9PT0gXCJiY3VydmVUb1wiKSB7XG4gICAgICBjb25zdCBwMCA9IGN1cnJlbnRQO1xuICAgICAgY29uc3QgcDEgPSBbZGF0YVswXSwgZGF0YVsxXV0gYXMgTXV0YWJsZTxQb2ludD47XG4gICAgICBjb25zdCBwMiA9IFtkYXRhWzJdLCBkYXRhWzNdXSBhcyBNdXRhYmxlPFBvaW50PjtcbiAgICAgIGNvbnN0IHAzID0gW2RhdGFbNF0sIGRhdGFbNV1dIGFzIE11dGFibGU8UG9pbnQ+O1xuICAgICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKHAzWzBdLCBwM1sxXSwgZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdKTtcbiAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgIGNvbnRyb2xQb2ludHMgPSBbcDAsIHAxLCBwMiwgcDNdO1xuICAgICAgfVxuICAgICAgY3VycmVudFAgPSBwMztcbiAgICB9XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiBjb250cm9sUG9pbnRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJlemllclhZID0gKFxuICBwMDogUG9pbnQsXG4gIHAxOiBQb2ludCxcbiAgcDI6IFBvaW50LFxuICBwMzogUG9pbnQsXG4gIHQ6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBlcXVhdGlvbiA9ICh0OiBudW1iZXIsIGlkeDogbnVtYmVyKSA9PlxuICAgIE1hdGgucG93KDEgLSB0LCAzKSAqIHAzW2lkeF0gK1xuICAgIDMgKiB0ICogTWF0aC5wb3coMSAtIHQsIDIpICogcDJbaWR4XSArXG4gICAgMyAqIE1hdGgucG93KHQsIDIpICogKDEgLSB0KSAqIHAxW2lkeF0gK1xuICAgIHAwW2lkeF0gKiBNYXRoLnBvdyh0LCAzKTtcbiAgY29uc3QgdHggPSBlcXVhdGlvbih0LCAwKTtcbiAgY29uc3QgdHkgPSBlcXVhdGlvbih0LCAxKTtcbiAgcmV0dXJuIFt0eCwgdHldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFBvaW50c0luQmV6aWVyQ3VydmUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICBlbmRQb2ludDogUG9pbnQsXG4pID0+IHtcbiAgY29uc3QgY29udHJvbFBvaW50czogTXV0YWJsZTxQb2ludD5bXSA9IGdldENvbnRyb2xQb2ludHNGb3JCZXppZXJDdXJ2ZShcbiAgICBlbGVtZW50LFxuICAgIGVuZFBvaW50LFxuICApITtcbiAgaWYgKCFjb250cm9sUG9pbnRzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHBvaW50c09uQ3VydmU6IE11dGFibGU8UG9pbnQ+W10gPSBbXTtcbiAgbGV0IHQgPSAxO1xuICAvLyBUYWtlIDIwIHBvaW50cyBvbiBjdXJ2ZSBmb3IgYmV0dGVyIGFjY3VyYWN5XG4gIHdoaWxlICh0ID4gMCkge1xuICAgIGNvbnN0IHBvaW50ID0gZ2V0QmV6aWVyWFkoXG4gICAgICBjb250cm9sUG9pbnRzWzBdLFxuICAgICAgY29udHJvbFBvaW50c1sxXSxcbiAgICAgIGNvbnRyb2xQb2ludHNbMl0sXG4gICAgICBjb250cm9sUG9pbnRzWzNdLFxuICAgICAgdCxcbiAgICApO1xuICAgIHBvaW50c09uQ3VydmUucHVzaChbcG9pbnRbMF0sIHBvaW50WzFdXSk7XG4gICAgdCAtPSAwLjA1O1xuICB9XG4gIGlmIChwb2ludHNPbkN1cnZlLmxlbmd0aCkge1xuICAgIGlmIChhcmVQb2ludHNFcXVhbChwb2ludHNPbkN1cnZlLmF0KC0xKSEsIGVuZFBvaW50KSkge1xuICAgICAgcG9pbnRzT25DdXJ2ZS5wdXNoKFtlbmRQb2ludFswXSwgZW5kUG9pbnRbMV1dKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHBvaW50c09uQ3VydmU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QmV6aWVyQ3VydmVBcmNMZW5ndGhzID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgZW5kUG9pbnQ6IFBvaW50LFxuKSA9PiB7XG4gIGNvbnN0IGFyY0xlbmd0aHM6IG51bWJlcltdID0gW107XG4gIGFyY0xlbmd0aHNbMF0gPSAwO1xuICBjb25zdCBwb2ludHMgPSBnZXRQb2ludHNJbkJlemllckN1cnZlKGVsZW1lbnQsIGVuZFBvaW50KTtcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IGRpc3RhbmNlID0gMDtcbiAgd2hpbGUgKGluZGV4IDwgcG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICBjb25zdCBzZWdtZW50RGlzdGFuY2UgPSBkaXN0YW5jZTJkKFxuICAgICAgcG9pbnRzW2luZGV4XVswXSxcbiAgICAgIHBvaW50c1tpbmRleF1bMV0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXVswXSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdWzFdLFxuICAgICk7XG4gICAgZGlzdGFuY2UgKz0gc2VnbWVudERpc3RhbmNlO1xuICAgIGFyY0xlbmd0aHMucHVzaChkaXN0YW5jZSk7XG4gICAgaW5kZXgrKztcbiAgfVxuXG4gIHJldHVybiBhcmNMZW5ndGhzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJlemllckN1cnZlTGVuZ3RoID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgZW5kUG9pbnQ6IFBvaW50LFxuKSA9PiB7XG4gIGNvbnN0IGFyY0xlbmd0aHMgPSBnZXRCZXppZXJDdXJ2ZUFyY0xlbmd0aHMoZWxlbWVudCwgZW5kUG9pbnQpO1xuICByZXR1cm4gYXJjTGVuZ3Rocy5hdCgtMSkgYXMgbnVtYmVyO1xufTtcblxuLy8gVGhpcyBtYXBzIGludGVydmFsIHRvIGFjdHVhbCBpbnRlcnZhbCB0IG9uIHRoZSBjdXJ2ZSBzbyB0aGF0IHdoZW4gdCA9IDAuNSwgaXRzIGFjdHVhbGx5IHRoZSBwb2ludCBhdCA1MCUgb2YgdGhlIGxlbmd0aFxuZXhwb3J0IGNvbnN0IG1hcEludGVydmFsVG9CZXppZXJUID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgZW5kUG9pbnQ6IFBvaW50LFxuICBpbnRlcnZhbDogbnVtYmVyLCAvLyBUaGUgaW50ZXJ2YWwgYmV0d2VlbiAwIHRvIDEgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGZpbmQgdGhlIHBvaW50IG9uIHRoZSBjdXJ2ZSxcbikgPT4ge1xuICBjb25zdCBhcmNMZW5ndGhzID0gZ2V0QmV6aWVyQ3VydmVBcmNMZW5ndGhzKGVsZW1lbnQsIGVuZFBvaW50KTtcbiAgY29uc3QgcG9pbnRzQ291bnQgPSBhcmNMZW5ndGhzLmxlbmd0aCAtIDE7XG4gIGNvbnN0IGN1cnZlTGVuZ3RoID0gYXJjTGVuZ3Rocy5hdCgtMSkgYXMgbnVtYmVyO1xuICBjb25zdCB0YXJnZXRMZW5ndGggPSBpbnRlcnZhbCAqIGN1cnZlTGVuZ3RoO1xuICBsZXQgbG93ID0gMDtcbiAgbGV0IGhpZ2ggPSBwb2ludHNDb3VudDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgLy8gRG9pbmcgYSBiaW5hcnkgc2VhcmNoIHRvIGZpbmQgdGhlIGxhcmdlc3QgbGVuZ3RoIHRoYXQgaXMgbGVzcyB0aGFuIHRoZSB0YXJnZXQgbGVuZ3RoXG4gIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgaW5kZXggPSBNYXRoLmZsb29yKGxvdyArIChoaWdoIC0gbG93KSAvIDIpO1xuICAgIGlmIChhcmNMZW5ndGhzW2luZGV4XSA8IHRhcmdldExlbmd0aCkge1xuICAgICAgbG93ID0gaW5kZXggKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBoaWdoID0gaW5kZXg7XG4gICAgfVxuICB9XG4gIGlmIChhcmNMZW5ndGhzW2luZGV4XSA+IHRhcmdldExlbmd0aCkge1xuICAgIGluZGV4LS07XG4gIH1cbiAgaWYgKGFyY0xlbmd0aHNbaW5kZXhdID09PSB0YXJnZXRMZW5ndGgpIHtcbiAgICByZXR1cm4gaW5kZXggLyBwb2ludHNDb3VudDtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgMSAtXG4gICAgKGluZGV4ICtcbiAgICAgICh0YXJnZXRMZW5ndGggLSBhcmNMZW5ndGhzW2luZGV4XSkgL1xuICAgICAgICAoYXJjTGVuZ3Roc1tpbmRleCArIDFdIC0gYXJjTGVuZ3Roc1tpbmRleF0pKSAvXG4gICAgICBwb2ludHNDb3VudFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGFyZVBvaW50c0VxdWFsID0gKHAxOiBQb2ludCwgcDI6IFBvaW50KSA9PiB7XG4gIHJldHVybiBwMVswXSA9PT0gcDJbMF0gJiYgcDFbMV0gPT09IHAyWzFdO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUmlnaHRBbmdsZSA9IChhbmdsZTogbnVtYmVyKSA9PiB7XG4gIC8vIGlmIG91ciBhbmdsZXMgd2VyZSBtYXRoZW1hdGljYWxseSBhY2N1cmF0ZSwgd2UgY291bGQganVzdCBjaGVja1xuICAvL1xuICAvLyAgICBhbmdsZSAlIChNYXRoLlBJIC8gMikgPT09IDBcbiAgLy9cbiAgLy8gYnV0IHNpbmNlIHdlJ3JlIGluIGZsb2F0aW5nIHBvaW50IGxhbmQsIHdlIG5lZWQgdG8gcm91bmQuXG4gIC8vXG4gIC8vIEJlbG93LCBhZnRlciBkaXZpZGluZyBieSBNYXRoLlBJLCBhIG11bHRpcGxlIG9mIDAuNSBpbmRpY2F0ZXMgYSByaWdodFxuICAvLyBhbmdsZSwgd2hpY2ggd2UgY2FuIGNoZWNrIHdpdGggbW9kdWxvIGFmdGVyIHJvdW5kaW5nLlxuICByZXR1cm4gTWF0aC5yb3VuZCgoYW5nbGUgLyBNYXRoLlBJKSAqIDEwMDAwKSAlIDUwMDAgPT09IDA7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../math.ts\n");
|
|
3738
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"adjustXYWithRotation\": () => (/* binding */ adjustXYWithRotation),\n/* harmony export */ \"arePointsEqual\": () => (/* binding */ arePointsEqual),\n/* harmony export */ \"centerPoint\": () => (/* binding */ centerPoint),\n/* harmony export */ \"distance2d\": () => (/* binding */ distance2d),\n/* harmony export */ \"getBezierCurveArcLengths\": () => (/* binding */ getBezierCurveArcLengths),\n/* harmony export */ \"getBezierCurveLength\": () => (/* binding */ getBezierCurveLength),\n/* harmony export */ \"getBezierXY\": () => (/* binding */ getBezierXY),\n/* harmony export */ \"getControlPointsForBezierCurve\": () => (/* binding */ getControlPointsForBezierCurve),\n/* harmony export */ \"getCornerRadius\": () => (/* binding */ getCornerRadius),\n/* harmony export */ \"getGridPoint\": () => (/* binding */ getGridPoint),\n/* harmony export */ \"getPointOnAPath\": () => (/* binding */ getPointOnAPath),\n/* harmony export */ \"getPointsInBezierCurve\": () => (/* binding */ getPointsInBezierCurve),\n/* harmony export */ \"isPathALoop\": () => (/* binding */ isPathALoop),\n/* harmony export */ \"isPointInPolygon\": () => (/* binding */ isPointInPolygon),\n/* harmony export */ \"isRightAngle\": () => (/* binding */ isRightAngle),\n/* harmony export */ \"mapIntervalToBezierT\": () => (/* binding */ mapIntervalToBezierT),\n/* harmony export */ \"rotate\": () => (/* binding */ rotate),\n/* harmony export */ \"rotatePoint\": () => (/* binding */ rotatePoint)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./element/bounds */ \"../../element/bounds.ts\");\n\n\n\nconst rotate = (x1, y1, x2, y2, angle) => \n// 𝑎′𝑥=(𝑎𝑥−𝑐𝑥)cos𝜃−(𝑎𝑦−𝑐𝑦)sin𝜃+𝑐𝑥\n// 𝑎′𝑦=(𝑎𝑥−𝑐𝑥)sin𝜃+(𝑎𝑦−𝑐𝑦)cos𝜃+𝑐𝑦.\n// https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line\n[\n (x1 - x2) * Math.cos(angle) - (y1 - y2) * Math.sin(angle) + x2,\n (x1 - x2) * Math.sin(angle) + (y1 - y2) * Math.cos(angle) + y2,\n];\nconst rotatePoint = (point, center, angle) => rotate(point[0], point[1], center[0], center[1], angle);\nconst adjustXYWithRotation = (sides, x, y, angle, deltaX1, deltaY1, deltaX2, deltaY2) => {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n if (sides.e && sides.w) {\n x += deltaX1 + deltaX2;\n }\n else if (sides.e) {\n x += deltaX1 * (1 + cos);\n y += deltaX1 * sin;\n x += deltaX2 * (1 - cos);\n y += deltaX2 * -sin;\n }\n else if (sides.w) {\n x += deltaX1 * (1 - cos);\n y += deltaX1 * -sin;\n x += deltaX2 * (1 + cos);\n y += deltaX2 * sin;\n }\n if (sides.n && sides.s) {\n y += deltaY1 + deltaY2;\n }\n else if (sides.n) {\n x += deltaY1 * sin;\n y += deltaY1 * (1 - cos);\n x += deltaY2 * -sin;\n y += deltaY2 * (1 + cos);\n }\n else if (sides.s) {\n x += deltaY1 * -sin;\n y += deltaY1 * (1 + cos);\n x += deltaY2 * sin;\n y += deltaY2 * (1 - cos);\n }\n return [x, y];\n};\nconst getPointOnAPath = (point, path) => {\n const [px, py] = point;\n const [start, ...other] = path;\n let [lastX, lastY] = start;\n let kLine = 0;\n let idx = 0;\n // if any item in the array is true, it means that a point is\n // on some segment of a line based path\n const retVal = other.some(([x2, y2], i) => {\n // we always take a line when dealing with line segments\n const x1 = lastX;\n const y1 = lastY;\n lastX = x2;\n lastY = y2;\n // if a point is not within the domain of the line segment\n // it is not on the line segment\n if (px < x1 || px > x2) {\n return false;\n }\n // check if all points lie on the same line\n // y1 = kx1 + b, y2 = kx2 + b\n // y2 - y1 = k(x2 - x2) -> k = (y2 - y1) / (x2 - x1)\n // coefficient for the line (p0, p1)\n const kL = (y2 - y1) / (x2 - x1);\n // coefficient for the line segment (p0, point)\n const kP1 = (py - y1) / (px - x1);\n // coefficient for the line segment (point, p1)\n const kP2 = (py - y2) / (px - x2);\n // because we are basing both lines from the same starting point\n // the only option for collinearity is having same coefficients\n // using it for floating point comparisons\n const epsilon = 0.3;\n // if coefficient is more than an arbitrary epsilon,\n // these lines are nor collinear\n if (Math.abs(kP1 - kL) > epsilon && Math.abs(kP2 - kL) > epsilon) {\n return false;\n }\n // store the coefficient because we are goint to need it\n kLine = kL;\n idx = i;\n return true;\n });\n // Return a coordinate that is always on the line segment\n if (retVal === true) {\n return { x: point[0], y: kLine * point[0], segment: idx };\n }\n return null;\n};\nconst distance2d = (x1, y1, x2, y2) => {\n const xd = x2 - x1;\n const yd = y2 - y1;\n return Math.hypot(xd, yd);\n};\nconst centerPoint = (a, b) => {\n return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n};\n// Checks if the first and last point are close enough\n// to be considered a loop\nconst isPathALoop = (points, \n/** supply if you want the loop detection to account for current zoom */\nzoomValue = 1) => {\n if (points.length >= 3) {\n const [first, last] = [points[0], points[points.length - 1]];\n const distance = distance2d(first[0], first[1], last[0], last[1]);\n // Adjusting LINE_CONFIRM_THRESHOLD to current zoom so that when zoomed in\n // really close we make the threshold smaller, and vice versa.\n return distance <= _constants__WEBPACK_IMPORTED_MODULE_0__.LINE_CONFIRM_THRESHOLD / zoomValue;\n }\n return false;\n};\n// Draw a line from the point to the right till infiinty\n// Check how many lines of the polygon does this infinite line intersects with\n// If the number of intersections is odd, point is in the polygon\nconst isPointInPolygon = (points, x, y) => {\n const vertices = points.length;\n // There must be at least 3 vertices in polygon\n if (vertices < 3) {\n return false;\n }\n const extreme = [Number.MAX_SAFE_INTEGER, y];\n const p = [x, y];\n let count = 0;\n for (let i = 0; i < vertices; i++) {\n const current = points[i];\n const next = points[(i + 1) % vertices];\n if (doSegmentsIntersect(current, next, p, extreme)) {\n if (orderedColinearOrientation(current, p, next) === 0) {\n return isPointWithinBounds(current, p, next);\n }\n count++;\n }\n }\n // true if count is off\n return count % 2 === 1;\n};\n// Returns whether `q` lies inside the segment/rectangle defined by `p` and `r`.\n// This is an approximation to \"does `q` lie on a segment `pr`\" check.\nconst isPointWithinBounds = (p, q, r) => {\n return (q[0] <= Math.max(p[0], r[0]) &&\n q[0] >= Math.min(p[0], r[0]) &&\n q[1] <= Math.max(p[1], r[1]) &&\n q[1] >= Math.min(p[1], r[1]));\n};\n// For the ordered points p, q, r, return\n// 0 if p, q, r are colinear\n// 1 if Clockwise\n// 2 if counterclickwise\nconst orderedColinearOrientation = (p, q, r) => {\n const val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]);\n if (val === 0) {\n return 0;\n }\n return val > 0 ? 1 : 2;\n};\n// Check is p1q1 intersects with p2q2\nconst doSegmentsIntersect = (p1, q1, p2, q2) => {\n const o1 = orderedColinearOrientation(p1, q1, p2);\n const o2 = orderedColinearOrientation(p1, q1, q2);\n const o3 = orderedColinearOrientation(p2, q2, p1);\n const o4 = orderedColinearOrientation(p2, q2, q1);\n if (o1 !== o2 && o3 !== o4) {\n return true;\n }\n // p1, q1 and p2 are colinear and p2 lies on segment p1q1\n if (o1 === 0 && isPointWithinBounds(p1, p2, q1)) {\n return true;\n }\n // p1, q1 and p2 are colinear and q2 lies on segment p1q1\n if (o2 === 0 && isPointWithinBounds(p1, q2, q1)) {\n return true;\n }\n // p2, q2 and p1 are colinear and p1 lies on segment p2q2\n if (o3 === 0 && isPointWithinBounds(p2, p1, q2)) {\n return true;\n }\n // p2, q2 and q1 are colinear and q1 lies on segment p2q2\n if (o4 === 0 && isPointWithinBounds(p2, q1, q2)) {\n return true;\n }\n return false;\n};\n// TODO: Rounding this point causes some shake when free drawing\nconst getGridPoint = (x, y, gridSize) => {\n if (gridSize) {\n return [\n Math.round(x / gridSize) * gridSize,\n Math.round(y / gridSize) * gridSize,\n ];\n }\n return [x, y];\n};\nconst getCornerRadius = (x, element) => {\n var _a, _b, _c, _d, _e;\n if (((_a = element.roundness) === null || _a === void 0 ? void 0 : _a.type) === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.PROPORTIONAL_RADIUS ||\n ((_b = element.roundness) === null || _b === void 0 ? void 0 : _b.type) === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.LEGACY) {\n return x * _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_PROPORTIONAL_RADIUS;\n }\n if (((_c = element.roundness) === null || _c === void 0 ? void 0 : _c.type) === _constants__WEBPACK_IMPORTED_MODULE_0__.ROUNDNESS.ADAPTIVE_RADIUS) {\n const fixedRadiusSize = (_e = (_d = element.roundness) === null || _d === void 0 ? void 0 : _d.value) !== null && _e !== void 0 ? _e : _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_ADAPTIVE_RADIUS;\n const CUTOFF_SIZE = fixedRadiusSize / _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_PROPORTIONAL_RADIUS;\n if (x <= CUTOFF_SIZE) {\n return x * _constants__WEBPACK_IMPORTED_MODULE_0__.DEFAULT_PROPORTIONAL_RADIUS;\n }\n return fixedRadiusSize;\n }\n return 0;\n};\nconst getControlPointsForBezierCurve = (element, endPoint) => {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_1__.getShapeForElement)(element);\n if (!shape) {\n return null;\n }\n const ops = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_2__.getCurvePathOps)(shape[0]);\n let currentP = [0, 0];\n let index = 0;\n let minDistance = Infinity;\n let controlPoints = null;\n while (index < ops.length) {\n const { op, data } = ops[index];\n if (op === \"move\") {\n currentP = data;\n }\n if (op === \"bcurveTo\") {\n const p0 = currentP;\n const p1 = [data[0], data[1]];\n const p2 = [data[2], data[3]];\n const p3 = [data[4], data[5]];\n const distance = distance2d(p3[0], p3[1], endPoint[0], endPoint[1]);\n if (distance < minDistance) {\n minDistance = distance;\n controlPoints = [p0, p1, p2, p3];\n }\n currentP = p3;\n }\n index++;\n }\n return controlPoints;\n};\nconst getBezierXY = (p0, p1, p2, p3, t) => {\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n const tx = equation(t, 0);\n const ty = equation(t, 1);\n return [tx, ty];\n};\nconst getPointsInBezierCurve = (element, endPoint) => {\n const controlPoints = getControlPointsForBezierCurve(element, endPoint);\n if (!controlPoints) {\n return [];\n }\n const pointsOnCurve = [];\n let t = 1;\n // Take 20 points on curve for better accuracy\n while (t > 0) {\n const point = getBezierXY(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3], t);\n pointsOnCurve.push([point[0], point[1]]);\n t -= 0.05;\n }\n if (pointsOnCurve.length) {\n if (arePointsEqual(pointsOnCurve.at(-1), endPoint)) {\n pointsOnCurve.push([endPoint[0], endPoint[1]]);\n }\n }\n return pointsOnCurve;\n};\nconst getBezierCurveArcLengths = (element, endPoint) => {\n const arcLengths = [];\n arcLengths[0] = 0;\n const points = getPointsInBezierCurve(element, endPoint);\n let index = 0;\n let distance = 0;\n while (index < points.length - 1) {\n const segmentDistance = distance2d(points[index][0], points[index][1], points[index + 1][0], points[index + 1][1]);\n distance += segmentDistance;\n arcLengths.push(distance);\n index++;\n }\n return arcLengths;\n};\nconst getBezierCurveLength = (element, endPoint) => {\n const arcLengths = getBezierCurveArcLengths(element, endPoint);\n return arcLengths.at(-1);\n};\n// This maps interval to actual interval t on the curve so that when t = 0.5, its actually the point at 50% of the length\nconst mapIntervalToBezierT = (element, endPoint, interval) => {\n const arcLengths = getBezierCurveArcLengths(element, endPoint);\n const pointsCount = arcLengths.length - 1;\n const curveLength = arcLengths.at(-1);\n const targetLength = interval * curveLength;\n let low = 0;\n let high = pointsCount;\n let index = 0;\n // Doing a binary search to find the largest length that is less than the target length\n while (low < high) {\n index = Math.floor(low + (high - low) / 2);\n if (arcLengths[index] < targetLength) {\n low = index + 1;\n }\n else {\n high = index;\n }\n }\n if (arcLengths[index] > targetLength) {\n index--;\n }\n if (arcLengths[index] === targetLength) {\n return index / pointsCount;\n }\n return (1 -\n (index +\n (targetLength - arcLengths[index]) /\n (arcLengths[index + 1] - arcLengths[index])) /\n pointsCount);\n};\nconst arePointsEqual = (p1, p2) => {\n return p1[0] === p2[0] && p1[1] === p2[1];\n};\nconst isRightAngle = (angle) => {\n // if our angles were mathematically accurate, we could just check\n //\n // angle % (Math.PI / 2) === 0\n //\n // but since we're in floating point land, we need to round.\n //\n // Below, after dividing by Math.PI, a multiple of 0.5 indicates a right\n // angle, which we can check with modulo after rounding.\n return Math.round((angle / Math.PI) * 10000) % 5000 === 0;\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFTLEVBQUUsRUFBUyxFQUFFLEVBQUU7SUFDckQsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDO0FBRUssTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQUUsRUFBRTtJQUM1QyxrRUFBa0U7SUFDbEUsRUFBRTtJQUNGLGlDQUFpQztJQUNqQyxFQUFFO0lBQ0YsNERBQTREO0lBQzVELEVBQUU7SUFDRix3RUFBd0U7SUFDeEUsd0RBQXdEO0lBQ3hELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsQ0FBQztBQUM1RCxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vbWF0aC50cz9kNTZjIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5vcm1hbGl6ZWRab29tVmFsdWUsIFBvaW50LCBab29tIH0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIERFRkFVTFRfQURBUFRJVkVfUkFESVVTLFxuICBMSU5FX0NPTkZJUk1fVEhSRVNIT0xELFxuICBERUZBVUxUX1BST1BPUlRJT05BTF9SQURJVVMsXG4gIFJPVU5ETkVTUyxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWQsXG59IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldFNoYXBlRm9yRWxlbWVudCB9IGZyb20gXCIuL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGdldEN1cnZlUGF0aE9wcyB9IGZyb20gXCIuL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSBcIi4vdXRpbGl0eS10eXBlc1wiO1xuXG5leHBvcnQgY29uc3Qgcm90YXRlID0gKFxuICB4MTogbnVtYmVyLFxuICB5MTogbnVtYmVyLFxuICB4MjogbnVtYmVyLFxuICB5MjogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PlxuICAvLyDwnZGO4oCy8J2RpT0o8J2RjvCdkaXiiJLwnZGQ8J2RpSljb3PwnZyD4oiSKPCdkY7wnZGm4oiS8J2RkPCdkaYpc2lu8J2cgyvwnZGQ8J2RpVxuICAvLyDwnZGO4oCy8J2Rpj0o8J2RjvCdkaXiiJLwnZGQ8J2RpSlzaW7wnZyDKyjwnZGO8J2RpuKIkvCdkZDwnZGmKWNvc/CdnIMr8J2RkPCdkaYuXG4gIC8vIGh0dHBzOi8vbWF0aC5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMjIwNDUyMC9ob3ctZG8taS1yb3RhdGUtYS1saW5lLXNlZ21lbnQtaW4tYS1zcGVjaWZpYy1wb2ludC1vbi10aGUtbGluZVxuICBbXG4gICAgKHgxIC0geDIpICogTWF0aC5jb3MoYW5nbGUpIC0gKHkxIC0geTIpICogTWF0aC5zaW4oYW5nbGUpICsgeDIsXG4gICAgKHgxIC0geDIpICogTWF0aC5zaW4oYW5nbGUpICsgKHkxIC0geTIpICogTWF0aC5jb3MoYW5nbGUpICsgeTIsXG4gIF07XG5cbmV4cG9ydCBjb25zdCByb3RhdGVQb2ludCA9IChcbiAgcG9pbnQ6IFBvaW50LFxuICBjZW50ZXI6IFBvaW50LFxuICBhbmdsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiByb3RhdGUocG9pbnRbMF0sIHBvaW50WzFdLCBjZW50ZXJbMF0sIGNlbnRlclsxXSwgYW5nbGUpO1xuXG5leHBvcnQgY29uc3QgYWRqdXN0WFlXaXRoUm90YXRpb24gPSAoXG4gIHNpZGVzOiB7XG4gICAgbj86IGJvb2xlYW47XG4gICAgZT86IGJvb2xlYW47XG4gICAgcz86IGJvb2xlYW47XG4gICAgdz86IGJvb2xlYW47XG4gIH0sXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuICBhbmdsZTogbnVtYmVyLFxuICBkZWx0YVgxOiBudW1iZXIsXG4gIGRlbHRhWTE6IG51bWJlcixcbiAgZGVsdGFYMjogbnVtYmVyLFxuICBkZWx0YVkyOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgY29zID0gTWF0aC5jb3MoYW5nbGUpO1xuICBjb25zdCBzaW4gPSBNYXRoLnNpbihhbmdsZSk7XG4gIGlmIChzaWRlcy5lICYmIHNpZGVzLncpIHtcbiAgICB4ICs9IGRlbHRhWDEgKyBkZWx0YVgyO1xuICB9IGVsc2UgaWYgKHNpZGVzLmUpIHtcbiAgICB4ICs9IGRlbHRhWDEgKiAoMSArIGNvcyk7XG4gICAgeSArPSBkZWx0YVgxICogc2luO1xuICAgIHggKz0gZGVsdGFYMiAqICgxIC0gY29zKTtcbiAgICB5ICs9IGRlbHRhWDIgKiAtc2luO1xuICB9IGVsc2UgaWYgKHNpZGVzLncpIHtcbiAgICB4ICs9IGRlbHRhWDEgKiAoMSAtIGNvcyk7XG4gICAgeSArPSBkZWx0YVgxICogLXNpbjtcbiAgICB4ICs9IGRlbHRhWDIgKiAoMSArIGNvcyk7XG4gICAgeSArPSBkZWx0YVgyICogc2luO1xuICB9XG5cbiAgaWYgKHNpZGVzLm4gJiYgc2lkZXMucykge1xuICAgIHkgKz0gZGVsdGFZMSArIGRlbHRhWTI7XG4gIH0gZWxzZSBpZiAoc2lkZXMubikge1xuICAgIHggKz0gZGVsdGFZMSAqIHNpbjtcbiAgICB5ICs9IGRlbHRhWTEgKiAoMSAtIGNvcyk7XG4gICAgeCArPSBkZWx0YVkyICogLXNpbjtcbiAgICB5ICs9IGRlbHRhWTIgKiAoMSArIGNvcyk7XG4gIH0gZWxzZSBpZiAoc2lkZXMucykge1xuICAgIHggKz0gZGVsdGFZMSAqIC1zaW47XG4gICAgeSArPSBkZWx0YVkxICogKDEgKyBjb3MpO1xuICAgIHggKz0gZGVsdGFZMiAqIHNpbjtcbiAgICB5ICs9IGRlbHRhWTIgKiAoMSAtIGNvcyk7XG4gIH1cbiAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb2ludE9uQVBhdGggPSAocG9pbnQ6IFBvaW50LCBwYXRoOiBQb2ludFtdKSA9PiB7XG4gIGNvbnN0IFtweCwgcHldID0gcG9pbnQ7XG4gIGNvbnN0IFtzdGFydCwgLi4ub3RoZXJdID0gcGF0aDtcbiAgbGV0IFtsYXN0WCwgbGFzdFldID0gc3RhcnQ7XG4gIGxldCBrTGluZTogbnVtYmVyID0gMDtcbiAgbGV0IGlkeDogbnVtYmVyID0gMDtcblxuICAvLyBpZiBhbnkgaXRlbSBpbiB0aGUgYXJyYXkgaXMgdHJ1ZSwgaXQgbWVhbnMgdGhhdCBhIHBvaW50IGlzXG4gIC8vIG9uIHNvbWUgc2VnbWVudCBvZiBhIGxpbmUgYmFzZWQgcGF0aFxuICBjb25zdCByZXRWYWwgPSBvdGhlci5zb21lKChbeDIsIHkyXSwgaSkgPT4ge1xuICAgIC8vIHdlIGFsd2F5cyB0YWtlIGEgbGluZSB3aGVuIGRlYWxpbmcgd2l0aCBsaW5lIHNlZ21lbnRzXG4gICAgY29uc3QgeDEgPSBsYXN0WDtcbiAgICBjb25zdCB5MSA9IGxhc3RZO1xuXG4gICAgbGFzdFggPSB4MjtcbiAgICBsYXN0WSA9IHkyO1xuXG4gICAgLy8gaWYgYSBwb2ludCBpcyBub3Qgd2l0aGluIHRoZSBkb21haW4gb2YgdGhlIGxpbmUgc2VnbWVudFxuICAgIC8vIGl0IGlzIG5vdCBvbiB0aGUgbGluZSBzZWdtZW50XG4gICAgaWYgKHB4IDwgeDEgfHwgcHggPiB4Mikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGNoZWNrIGlmIGFsbCBwb2ludHMgbGllIG9uIHRoZSBzYW1lIGxpbmVcbiAgICAvLyB5MSA9IGt4MSArIGIsIHkyID0ga3gyICsgYlxuICAgIC8vIHkyIC0geTEgPSBrKHgyIC0geDIpIC0+IGsgPSAoeTIgLSB5MSkgLyAoeDIgLSB4MSlcblxuICAgIC8vIGNvZWZmaWNpZW50IGZvciB0aGUgbGluZSAocDAsIHAxKVxuICAgIGNvbnN0IGtMID0gKHkyIC0geTEpIC8gKHgyIC0geDEpO1xuXG4gICAgLy8gY29lZmZpY2llbnQgZm9yIHRoZSBsaW5lIHNlZ21lbnQgKHAwLCBwb2ludClcbiAgICBjb25zdCBrUDEgPSAocHkgLSB5MSkgLyAocHggLSB4MSk7XG5cbiAgICAvLyBjb2VmZmljaWVudCBmb3IgdGhlIGxpbmUgc2VnbWVudCAocG9pbnQsIHAxKVxuICAgIGNvbnN0IGtQMiA9IChweSAtIHkyKSAvIChweCAtIHgyKTtcblxuICAgIC8vIGJlY2F1c2Ugd2UgYXJlIGJhc2luZyBib3RoIGxpbmVzIGZyb20gdGhlIHNhbWUgc3RhcnRpbmcgcG9pbnRcbiAgICAvLyB0aGUgb25seSBvcHRpb24gZm9yIGNvbGxpbmVhcml0eSBpcyBoYXZpbmcgc2FtZSBjb2VmZmljaWVudHNcblxuICAgIC8vIHVzaW5nIGl0IGZvciBmbG9hdGluZyBwb2ludCBjb21wYXJpc29uc1xuICAgIGNvbnN0IGVwc2lsb24gPSAwLjM7XG5cbiAgICAvLyBpZiBjb2VmZmljaWVudCBpcyBtb3JlIHRoYW4gYW4gYXJiaXRyYXJ5IGVwc2lsb24sXG4gICAgLy8gdGhlc2UgbGluZXMgYXJlIG5vciBjb2xsaW5lYXJcbiAgICBpZiAoTWF0aC5hYnMoa1AxIC0ga0wpID4gZXBzaWxvbiAmJiBNYXRoLmFicyhrUDIgLSBrTCkgPiBlcHNpbG9uKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gc3RvcmUgdGhlIGNvZWZmaWNpZW50IGJlY2F1c2Ugd2UgYXJlIGdvaW50IHRvIG5lZWQgaXRcbiAgICBrTGluZSA9IGtMO1xuICAgIGlkeCA9IGk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfSk7XG5cbiAgLy8gUmV0dXJuIGEgY29vcmRpbmF0ZSB0aGF0IGlzIGFsd2F5cyBvbiB0aGUgbGluZSBzZWdtZW50XG4gIGlmIChyZXRWYWwgPT09IHRydWUpIHtcbiAgICByZXR1cm4geyB4OiBwb2ludFswXSwgeToga0xpbmUgKiBwb2ludFswXSwgc2VnbWVudDogaWR4IH07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZTJkID0gKHgxOiBudW1iZXIsIHkxOiBudW1iZXIsIHgyOiBudW1iZXIsIHkyOiBudW1iZXIpID0+IHtcbiAgY29uc3QgeGQgPSB4MiAtIHgxO1xuICBjb25zdCB5ZCA9IHkyIC0geTE7XG4gIHJldHVybiBNYXRoLmh5cG90KHhkLCB5ZCk7XG59O1xuXG5leHBvcnQgY29uc3QgY2VudGVyUG9pbnQgPSAoYTogUG9pbnQsIGI6IFBvaW50KTogUG9pbnQgPT4ge1xuICByZXR1cm4gWyhhWzBdICsgYlswXSkgLyAyLCAoYVsxXSArIGJbMV0pIC8gMl07XG59O1xuXG4vLyBDaGVja3MgaWYgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50IGFyZSBjbG9zZSBlbm91Z2hcbi8vIHRvIGJlIGNvbnNpZGVyZWQgYSBsb29wXG5leHBvcnQgY29uc3QgaXNQYXRoQUxvb3AgPSAoXG4gIHBvaW50czogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnRbXCJwb2ludHNcIl0sXG4gIC8qKiBzdXBwbHkgaWYgeW91IHdhbnQgdGhlIGxvb3AgZGV0ZWN0aW9uIHRvIGFjY291bnQgZm9yIGN1cnJlbnQgem9vbSAqL1xuICB6b29tVmFsdWU6IFpvb21bXCJ2YWx1ZVwiXSA9IDEgYXMgTm9ybWFsaXplZFpvb21WYWx1ZSxcbik6IGJvb2xlYW4gPT4ge1xuICBpZiAocG9pbnRzLmxlbmd0aCA+PSAzKSB7XG4gICAgY29uc3QgW2ZpcnN0LCBsYXN0XSA9IFtwb2ludHNbMF0sIHBvaW50c1twb2ludHMubGVuZ3RoIC0gMV1dO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChmaXJzdFswXSwgZmlyc3RbMV0sIGxhc3RbMF0sIGxhc3RbMV0pO1xuXG4gICAgLy8gQWRqdXN0aW5nIExJTkVfQ09ORklSTV9USFJFU0hPTEQgdG8gY3VycmVudCB6b29tIHNvIHRoYXQgd2hlbiB6b29tZWQgaW5cbiAgICAvLyByZWFsbHkgY2xvc2Ugd2UgbWFrZSB0aGUgdGhyZXNob2xkIHNtYWxsZXIsIGFuZCB2aWNlIHZlcnNhLlxuICAgIHJldHVybiBkaXN0YW5jZSA8PSBMSU5FX0NPTkZJUk1fVEhSRVNIT0xEIC8gem9vbVZhbHVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8vIERyYXcgYSBsaW5lIGZyb20gdGhlIHBvaW50IHRvIHRoZSByaWdodCB0aWxsIGluZmlpbnR5XG4vLyBDaGVjayBob3cgbWFueSBsaW5lcyBvZiB0aGUgcG9seWdvbiBkb2VzIHRoaXMgaW5maW5pdGUgbGluZSBpbnRlcnNlY3RzIHdpdGhcbi8vIElmIHRoZSBudW1iZXIgb2YgaW50ZXJzZWN0aW9ucyBpcyBvZGQsIHBvaW50IGlzIGluIHRoZSBwb2x5Z29uXG5leHBvcnQgY29uc3QgaXNQb2ludEluUG9seWdvbiA9IChcbiAgcG9pbnRzOiBQb2ludFtdLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IGJvb2xlYW4gPT4ge1xuICBjb25zdCB2ZXJ0aWNlcyA9IHBvaW50cy5sZW5ndGg7XG5cbiAgLy8gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCAzIHZlcnRpY2VzIGluIHBvbHlnb25cbiAgaWYgKHZlcnRpY2VzIDwgMykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBleHRyZW1lOiBQb2ludCA9IFtOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgeV07XG4gIGNvbnN0IHA6IFBvaW50ID0gW3gsIHldO1xuICBsZXQgY291bnQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZlcnRpY2VzOyBpKyspIHtcbiAgICBjb25zdCBjdXJyZW50ID0gcG9pbnRzW2ldO1xuICAgIGNvbnN0IG5leHQgPSBwb2ludHNbKGkgKyAxKSAlIHZlcnRpY2VzXTtcbiAgICBpZiAoZG9TZWdtZW50c0ludGVyc2VjdChjdXJyZW50LCBuZXh0LCBwLCBleHRyZW1lKSkge1xuICAgICAgaWYgKG9yZGVyZWRDb2xpbmVhck9yaWVudGF0aW9uKGN1cnJlbnQsIHAsIG5leHQpID09PSAwKSB7XG4gICAgICAgIHJldHVybiBpc1BvaW50V2l0aGluQm91bmRzKGN1cnJlbnQsIHAsIG5leHQpO1xuICAgICAgfVxuICAgICAgY291bnQrKztcbiAgICB9XG4gIH1cbiAgLy8gdHJ1ZSBpZiBjb3VudCBpcyBvZmZcbiAgcmV0dXJuIGNvdW50ICUgMiA9PT0gMTtcbn07XG5cbi8vIFJldHVybnMgd2hldGhlciBgcWAgbGllcyBpbnNpZGUgdGhlIHNlZ21lbnQvcmVjdGFuZ2xlIGRlZmluZWQgYnkgYHBgIGFuZCBgcmAuXG4vLyBUaGlzIGlzIGFuIGFwcHJveGltYXRpb24gdG8gXCJkb2VzIGBxYCBsaWUgb24gYSBzZWdtZW50IGBwcmBcIiBjaGVjay5cbmNvbnN0IGlzUG9pbnRXaXRoaW5Cb3VuZHMgPSAocDogUG9pbnQsIHE6IFBvaW50LCByOiBQb2ludCkgPT4ge1xuICByZXR1cm4gKFxuICAgIHFbMF0gPD0gTWF0aC5tYXgocFswXSwgclswXSkgJiZcbiAgICBxWzBdID49IE1hdGgubWluKHBbMF0sIHJbMF0pICYmXG4gICAgcVsxXSA8PSBNYXRoLm1heChwWzFdLCByWzFdKSAmJlxuICAgIHFbMV0gPj0gTWF0aC5taW4ocFsxXSwgclsxXSlcbiAgKTtcbn07XG5cbi8vIEZvciB0aGUgb3JkZXJlZCBwb2ludHMgcCwgcSwgciwgcmV0dXJuXG4vLyAwIGlmIHAsIHEsIHIgYXJlIGNvbGluZWFyXG4vLyAxIGlmIENsb2Nrd2lzZVxuLy8gMiBpZiBjb3VudGVyY2xpY2t3aXNlXG5jb25zdCBvcmRlcmVkQ29saW5lYXJPcmllbnRhdGlvbiA9IChwOiBQb2ludCwgcTogUG9pbnQsIHI6IFBvaW50KSA9PiB7XG4gIGNvbnN0IHZhbCA9IChxWzFdIC0gcFsxXSkgKiAoclswXSAtIHFbMF0pIC0gKHFbMF0gLSBwWzBdKSAqIChyWzFdIC0gcVsxXSk7XG4gIGlmICh2YWwgPT09IDApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICByZXR1cm4gdmFsID4gMCA/IDEgOiAyO1xufTtcblxuLy8gQ2hlY2sgaXMgcDFxMSBpbnRlcnNlY3RzIHdpdGggcDJxMlxuY29uc3QgZG9TZWdtZW50c0ludGVyc2VjdCA9IChwMTogUG9pbnQsIHExOiBQb2ludCwgcDI6IFBvaW50LCBxMjogUG9pbnQpID0+IHtcbiAgY29uc3QgbzEgPSBvcmRlcmVkQ29saW5lYXJPcmllbnRhdGlvbihwMSwgcTEsIHAyKTtcbiAgY29uc3QgbzIgPSBvcmRlcmVkQ29saW5lYXJPcmllbnRhdGlvbihwMSwgcTEsIHEyKTtcbiAgY29uc3QgbzMgPSBvcmRlcmVkQ29saW5lYXJPcmllbnRhdGlvbihwMiwgcTIsIHAxKTtcbiAgY29uc3QgbzQgPSBvcmRlcmVkQ29saW5lYXJPcmllbnRhdGlvbihwMiwgcTIsIHExKTtcblxuICBpZiAobzEgIT09IG8yICYmIG8zICE9PSBvNCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gcDEsIHExIGFuZCBwMiBhcmUgY29saW5lYXIgYW5kIHAyIGxpZXMgb24gc2VnbWVudCBwMXExXG4gIGlmIChvMSA9PT0gMCAmJiBpc1BvaW50V2l0aGluQm91bmRzKHAxLCBwMiwgcTEpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBwMSwgcTEgYW5kIHAyIGFyZSBjb2xpbmVhciBhbmQgcTIgbGllcyBvbiBzZWdtZW50IHAxcTFcbiAgaWYgKG8yID09PSAwICYmIGlzUG9pbnRXaXRoaW5Cb3VuZHMocDEsIHEyLCBxMSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIHAyLCBxMiBhbmQgcDEgYXJlIGNvbGluZWFyIGFuZCBwMSBsaWVzIG9uIHNlZ21lbnQgcDJxMlxuICBpZiAobzMgPT09IDAgJiYgaXNQb2ludFdpdGhpbkJvdW5kcyhwMiwgcDEsIHEyKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gcDIsIHEyIGFuZCBxMSBhcmUgY29saW5lYXIgYW5kIHExIGxpZXMgb24gc2VnbWVudCBwMnEyXG4gIGlmIChvNCA9PT0gMCAmJiBpc1BvaW50V2l0aGluQm91bmRzKHAyLCBxMSwgcTIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59O1xuXG4vLyBUT0RPOiBSb3VuZGluZyB0aGlzIHBvaW50IGNhdXNlcyBzb21lIHNoYWtlIHdoZW4gZnJlZSBkcmF3aW5nXG5leHBvcnQgY29uc3QgZ2V0R3JpZFBvaW50ID0gKFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbiAgZ3JpZFNpemU6IG51bWJlciB8IG51bGwsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKGdyaWRTaXplKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIE1hdGgucm91bmQoeCAvIGdyaWRTaXplKSAqIGdyaWRTaXplLFxuICAgICAgTWF0aC5yb3VuZCh5IC8gZ3JpZFNpemUpICogZ3JpZFNpemUsXG4gICAgXTtcbiAgfVxuICByZXR1cm4gW3gsIHldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvcm5lclJhZGl1cyA9ICh4OiBudW1iZXIsIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGlmIChcbiAgICBlbGVtZW50LnJvdW5kbmVzcz8udHlwZSA9PT0gUk9VTkRORVNTLlBST1BPUlRJT05BTF9SQURJVVMgfHxcbiAgICBlbGVtZW50LnJvdW5kbmVzcz8udHlwZSA9PT0gUk9VTkRORVNTLkxFR0FDWVxuICApIHtcbiAgICByZXR1cm4geCAqIERFRkFVTFRfUFJPUE9SVElPTkFMX1JBRElVUztcbiAgfVxuXG4gIGlmIChlbGVtZW50LnJvdW5kbmVzcz8udHlwZSA9PT0gUk9VTkRORVNTLkFEQVBUSVZFX1JBRElVUykge1xuICAgIGNvbnN0IGZpeGVkUmFkaXVzU2l6ZSA9IGVsZW1lbnQucm91bmRuZXNzPy52YWx1ZSA/PyBERUZBVUxUX0FEQVBUSVZFX1JBRElVUztcblxuICAgIGNvbnN0IENVVE9GRl9TSVpFID0gZml4ZWRSYWRpdXNTaXplIC8gREVGQVVMVF9QUk9QT1JUSU9OQUxfUkFESVVTO1xuXG4gICAgaWYgKHggPD0gQ1VUT0ZGX1NJWkUpIHtcbiAgICAgIHJldHVybiB4ICogREVGQVVMVF9QUk9QT1JUSU9OQUxfUkFESVVTO1xuICAgIH1cblxuICAgIHJldHVybiBmaXhlZFJhZGl1c1NpemU7XG4gIH1cblxuICByZXR1cm4gMDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250cm9sUG9pbnRzRm9yQmV6aWVyQ3VydmUgPSAoXG4gIGVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+LFxuICBlbmRQb2ludDogUG9pbnQsXG4pID0+IHtcbiAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCBhcyBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCk7XG4gIGlmICghc2hhcGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZVswXSk7XG4gIGxldCBjdXJyZW50UDogTXV0YWJsZTxQb2ludD4gPSBbMCwgMF07XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuICBsZXQgY29udHJvbFBvaW50czogTXV0YWJsZTxQb2ludD5bXSB8IG51bGwgPSBudWxsO1xuXG4gIHdoaWxlIChpbmRleCA8IG9wcy5sZW5ndGgpIHtcbiAgICBjb25zdCB7IG9wLCBkYXRhIH0gPSBvcHNbaW5kZXhdO1xuICAgIGlmIChvcCA9PT0gXCJtb3ZlXCIpIHtcbiAgICAgIGN1cnJlbnRQID0gZGF0YSBhcyB1bmtub3duIGFzIE11dGFibGU8UG9pbnQ+O1xuICAgIH1cbiAgICBpZiAob3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgICAgY29uc3QgcDAgPSBjdXJyZW50UDtcbiAgICAgIGNvbnN0IHAxID0gW2RhdGFbMF0sIGRhdGFbMV1dIGFzIE11dGFibGU8UG9pbnQ+O1xuICAgICAgY29uc3QgcDIgPSBbZGF0YVsyXSwgZGF0YVszXV0gYXMgTXV0YWJsZTxQb2ludD47XG4gICAgICBjb25zdCBwMyA9IFtkYXRhWzRdLCBkYXRhWzVdXSBhcyBNdXRhYmxlPFBvaW50PjtcbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZChwM1swXSwgcDNbMV0sIGVuZFBvaW50WzBdLCBlbmRQb2ludFsxXSk7XG4gICAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgICBjb250cm9sUG9pbnRzID0gW3AwLCBwMSwgcDIsIHAzXTtcbiAgICAgIH1cbiAgICAgIGN1cnJlbnRQID0gcDM7XG4gICAgfVxuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gY29udHJvbFBvaW50cztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCZXppZXJYWSA9IChcbiAgcDA6IFBvaW50LFxuICBwMTogUG9pbnQsXG4gIHAyOiBQb2ludCxcbiAgcDM6IFBvaW50LFxuICB0OiBudW1iZXIsXG4pID0+IHtcbiAgY29uc3QgZXF1YXRpb24gPSAodDogbnVtYmVyLCBpZHg6IG51bWJlcikgPT5cbiAgICBNYXRoLnBvdygxIC0gdCwgMykgKiBwM1tpZHhdICtcbiAgICAzICogdCAqIE1hdGgucG93KDEgLSB0LCAyKSAqIHAyW2lkeF0gK1xuICAgIDMgKiBNYXRoLnBvdyh0LCAyKSAqICgxIC0gdCkgKiBwMVtpZHhdICtcbiAgICBwMFtpZHhdICogTWF0aC5wb3codCwgMyk7XG4gIGNvbnN0IHR4ID0gZXF1YXRpb24odCwgMCk7XG4gIGNvbnN0IHR5ID0gZXF1YXRpb24odCwgMSk7XG4gIHJldHVybiBbdHgsIHR5XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRQb2ludHNJbkJlemllckN1cnZlID0gKFxuICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50PixcbiAgZW5kUG9pbnQ6IFBvaW50LFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRyb2xQb2ludHM6IE11dGFibGU8UG9pbnQ+W10gPSBnZXRDb250cm9sUG9pbnRzRm9yQmV6aWVyQ3VydmUoXG4gICAgZWxlbWVudCxcbiAgICBlbmRQb2ludCxcbiAgKSE7XG4gIGlmICghY29udHJvbFBvaW50cykge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBjb25zdCBwb2ludHNPbkN1cnZlOiBNdXRhYmxlPFBvaW50PltdID0gW107XG4gIGxldCB0ID0gMTtcbiAgLy8gVGFrZSAyMCBwb2ludHMgb24gY3VydmUgZm9yIGJldHRlciBhY2N1cmFjeVxuICB3aGlsZSAodCA+IDApIHtcbiAgICBjb25zdCBwb2ludCA9IGdldEJlemllclhZKFxuICAgICAgY29udHJvbFBvaW50c1swXSxcbiAgICAgIGNvbnRyb2xQb2ludHNbMV0sXG4gICAgICBjb250cm9sUG9pbnRzWzJdLFxuICAgICAgY29udHJvbFBvaW50c1szXSxcbiAgICAgIHQsXG4gICAgKTtcbiAgICBwb2ludHNPbkN1cnZlLnB1c2goW3BvaW50WzBdLCBwb2ludFsxXV0pO1xuICAgIHQgLT0gMC4wNTtcbiAgfVxuICBpZiAocG9pbnRzT25DdXJ2ZS5sZW5ndGgpIHtcbiAgICBpZiAoYXJlUG9pbnRzRXF1YWwocG9pbnRzT25DdXJ2ZS5hdCgtMSkhLCBlbmRQb2ludCkpIHtcbiAgICAgIHBvaW50c09uQ3VydmUucHVzaChbZW5kUG9pbnRbMF0sIGVuZFBvaW50WzFdXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwb2ludHNPbkN1cnZlO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJlemllckN1cnZlQXJjTGVuZ3RocyA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gIGVuZFBvaW50OiBQb2ludCxcbikgPT4ge1xuICBjb25zdCBhcmNMZW5ndGhzOiBudW1iZXJbXSA9IFtdO1xuICBhcmNMZW5ndGhzWzBdID0gMDtcbiAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzSW5CZXppZXJDdXJ2ZShlbGVtZW50LCBlbmRQb2ludCk7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCBkaXN0YW5jZSA9IDA7XG4gIHdoaWxlIChpbmRleCA8IHBvaW50cy5sZW5ndGggLSAxKSB7XG4gICAgY29uc3Qgc2VnbWVudERpc3RhbmNlID0gZGlzdGFuY2UyZChcbiAgICAgIHBvaW50c1tpbmRleF1bMF0sXG4gICAgICBwb2ludHNbaW5kZXhdWzFdLFxuICAgICAgcG9pbnRzW2luZGV4ICsgMV1bMF0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXVsxXSxcbiAgICApO1xuICAgIGRpc3RhbmNlICs9IHNlZ21lbnREaXN0YW5jZTtcbiAgICBhcmNMZW5ndGhzLnB1c2goZGlzdGFuY2UpO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gYXJjTGVuZ3Rocztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCZXppZXJDdXJ2ZUxlbmd0aCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gIGVuZFBvaW50OiBQb2ludCxcbikgPT4ge1xuICBjb25zdCBhcmNMZW5ndGhzID0gZ2V0QmV6aWVyQ3VydmVBcmNMZW5ndGhzKGVsZW1lbnQsIGVuZFBvaW50KTtcbiAgcmV0dXJuIGFyY0xlbmd0aHMuYXQoLTEpIGFzIG51bWJlcjtcbn07XG5cbi8vIFRoaXMgbWFwcyBpbnRlcnZhbCB0byBhY3R1YWwgaW50ZXJ2YWwgdCBvbiB0aGUgY3VydmUgc28gdGhhdCB3aGVuIHQgPSAwLjUsIGl0cyBhY3R1YWxseSB0aGUgcG9pbnQgYXQgNTAlIG9mIHRoZSBsZW5ndGhcbmV4cG9ydCBjb25zdCBtYXBJbnRlcnZhbFRvQmV6aWVyVCA9IChcbiAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4sXG4gIGVuZFBvaW50OiBQb2ludCxcbiAgaW50ZXJ2YWw6IG51bWJlciwgLy8gVGhlIGludGVydmFsIGJldHdlZW4gMCB0byAxIGZvciB3aGljaCB5b3Ugd2FudCB0byBmaW5kIHRoZSBwb2ludCBvbiB0aGUgY3VydmUsXG4pID0+IHtcbiAgY29uc3QgYXJjTGVuZ3RocyA9IGdldEJlemllckN1cnZlQXJjTGVuZ3RocyhlbGVtZW50LCBlbmRQb2ludCk7XG4gIGNvbnN0IHBvaW50c0NvdW50ID0gYXJjTGVuZ3Rocy5sZW5ndGggLSAxO1xuICBjb25zdCBjdXJ2ZUxlbmd0aCA9IGFyY0xlbmd0aHMuYXQoLTEpIGFzIG51bWJlcjtcbiAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gaW50ZXJ2YWwgKiBjdXJ2ZUxlbmd0aDtcbiAgbGV0IGxvdyA9IDA7XG4gIGxldCBoaWdoID0gcG9pbnRzQ291bnQ7XG4gIGxldCBpbmRleCA9IDA7XG4gIC8vIERvaW5nIGEgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBsYXJnZXN0IGxlbmd0aCB0aGF0IGlzIGxlc3MgdGhhbiB0aGUgdGFyZ2V0IGxlbmd0aFxuICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgIGluZGV4ID0gTWF0aC5mbG9vcihsb3cgKyAoaGlnaCAtIGxvdykgLyAyKTtcbiAgICBpZiAoYXJjTGVuZ3Roc1tpbmRleF0gPCB0YXJnZXRMZW5ndGgpIHtcbiAgICAgIGxvdyA9IGluZGV4ICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgaGlnaCA9IGluZGV4O1xuICAgIH1cbiAgfVxuICBpZiAoYXJjTGVuZ3Roc1tpbmRleF0gPiB0YXJnZXRMZW5ndGgpIHtcbiAgICBpbmRleC0tO1xuICB9XG4gIGlmIChhcmNMZW5ndGhzW2luZGV4XSA9PT0gdGFyZ2V0TGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluZGV4IC8gcG9pbnRzQ291bnQ7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDEgLVxuICAgIChpbmRleCArXG4gICAgICAodGFyZ2V0TGVuZ3RoIC0gYXJjTGVuZ3Roc1tpbmRleF0pIC9cbiAgICAgICAgKGFyY0xlbmd0aHNbaW5kZXggKyAxXSAtIGFyY0xlbmd0aHNbaW5kZXhdKSkgL1xuICAgICAgcG9pbnRzQ291bnRcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhcmVQb2ludHNFcXVhbCA9IChwMTogUG9pbnQsIHAyOiBQb2ludCkgPT4ge1xuICByZXR1cm4gcDFbMF0gPT09IHAyWzBdICYmIHAxWzFdID09PSBwMlsxXTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1JpZ2h0QW5nbGUgPSAoYW5nbGU6IG51bWJlcikgPT4ge1xuICAvLyBpZiBvdXIgYW5nbGVzIHdlcmUgbWF0aGVtYXRpY2FsbHkgYWNjdXJhdGUsIHdlIGNvdWxkIGp1c3QgY2hlY2tcbiAgLy9cbiAgLy8gICAgYW5nbGUgJSAoTWF0aC5QSSAvIDIpID09PSAwXG4gIC8vXG4gIC8vIGJ1dCBzaW5jZSB3ZSdyZSBpbiBmbG9hdGluZyBwb2ludCBsYW5kLCB3ZSBuZWVkIHRvIHJvdW5kLlxuICAvL1xuICAvLyBCZWxvdywgYWZ0ZXIgZGl2aWRpbmcgYnkgTWF0aC5QSSwgYSBtdWx0aXBsZSBvZiAwLjUgaW5kaWNhdGVzIGEgcmlnaHRcbiAgLy8gYW5nbGUsIHdoaWNoIHdlIGNhbiBjaGVjayB3aXRoIG1vZHVsbyBhZnRlciByb3VuZGluZy5cbiAgcmV0dXJuIE1hdGgucm91bmQoKGFuZ2xlIC8gTWF0aC5QSSkgKiAxMDAwMCkgJSA1MDAwID09PSAwO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../math.ts\n");
|
|
3739
3739
|
|
|
3740
3740
|
/***/ }),
|
|
3741
3741
|
|
|
@@ -3768,7 +3768,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3768
3768
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3769
3769
|
|
|
3770
3770
|
"use strict";
|
|
3771
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.2-
|
|
3771
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.2-dd4c333\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3772
3772
|
|
|
3773
3773
|
/***/ }),
|
|
3774
3774
|
|
|
@@ -3889,7 +3889,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3889
3889
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3890
3890
|
|
|
3891
3891
|
"use strict";
|
|
3892
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.2-cef6094\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3892
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.14.2-dd4c333\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlIGNsYXNzPVwic3R5bGUtZm9udHNcIj5cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJWaXJnaWxcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1WaXJnaWwud29mZjJcIik7XG4gICAgICB9XG4gICAgICBAZm9udC1mYWNlIHtcbiAgICAgICAgZm9udC1mYW1pbHk6IFwiQ2FzY2FkaWFcIjtcbiAgICAgICAgc3JjOiB1cmwoXCIke2Fzc2V0UGF0aH1DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3893
3893
|
|
|
3894
3894
|
/***/ }),
|
|
3895
3895
|
|
|
@@ -3966,7 +3966,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3966
3966
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3967
3967
|
|
|
3968
3968
|
"use strict";
|
|
3969
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserIdleState\": () => (/* binding */ UserIdleState)\n/* harmony export */ });\nvar UserIdleState;\n(function (UserIdleState) {\n UserIdleState[\"ACTIVE\"] = \"active\";\n UserIdleState[\"AWAY\"] = \"away\";\n UserIdleState[\"IDLE\"] = \"idle\";\n})(UserIdleState || (UserIdleState = {}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdHlwZXMudHMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQTZWQSxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCO0lBQ2pCLDhCQUFhO0lBQ2IsOEJBQWE7QUFDZixDQUFDLEVBSlcsYUFBYSxLQUFiLGFBQWEsUUFJeEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdHlwZXMudHM/MDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQb2ludGVyVHlwZSxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBDaGFydFR5cGUsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEZpbGVJZCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgVGhlbWUsXG4gIFN0cm9rZVJvdW5kbmVzcyxcbn0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBQb2ludCBhcyBSb3VnaFBvaW50IH0gZnJvbSBcInJvdWdoanMvYmluL2dlb21ldHJ5XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZWRCaW5kaW5nIH0gZnJvbSBcIi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL2RhdGEvdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlUHJvbWlzZSwgdGhyb3R0bGVSQUYgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgU3ByZWFkc2hlZXQgfSBmcm9tIFwiLi9jaGFydHNcIjtcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSBcIi4vaTE4blwiO1xuaW1wb3J0IHsgQ2xpcGJvYXJkRGF0YSB9IGZyb20gXCIuL2NsaXBib2FyZFwiO1xuaW1wb3J0IHsgaXNPdmVyU2Nyb2xsQmFycyB9IGZyb20gXCIuL3NjZW5lXCI7XG5pbXBvcnQgeyBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUgfSBmcm9tIFwiLi9lbGVtZW50L3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuL2RhdGEvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3lzdGVtSGFuZGxlIH0gZnJvbSBcIi4vZGF0YS9maWxlc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFUywgTUlNRV9UWVBFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVJdGVtcyB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGV4dE1lbnVcIjtcblxuZXhwb3J0IHR5cGUgUG9pbnQgPSBSZWFkb25seTxSb3VnaFBvaW50PjtcblxuZXhwb3J0IHR5cGUgQ29sbGFib3JhdG9yID0ge1xuICBwb2ludGVyPzoge1xuICAgIHg6IG51bWJlcjtcbiAgICB5OiBudW1iZXI7XG4gIH07XG4gIGJ1dHRvbj86IFwidXBcIiB8IFwiZG93blwiO1xuICBzZWxlY3RlZEVsZW1lbnRJZHM/OiBBcHBTdGF0ZVtcInNlbGVjdGVkRWxlbWVudElkc1wiXTtcbiAgdXNlcm5hbWU/OiBzdHJpbmcgfCBudWxsO1xuICB1c2VyU3RhdGU/OiBVc2VySWRsZVN0YXRlO1xuICBjb2xvcj86IHtcbiAgICBiYWNrZ3JvdW5kOiBzdHJpbmc7XG4gICAgc3Ryb2tlOiBzdHJpbmc7XG4gIH07XG4gIC8vIFRoZSB1cmwgb2YgdGhlIGNvbGxhYm9yYXRvcidzIGF2YXRhciwgZGVmYXVsdHMgdG8gdXNlcm5hbWUgaW50aWFsc1xuICAvLyBpZiBub3QgcHJlc2VudFxuICBhdmF0YXJVcmw/OiBzdHJpbmc7XG4gIC8vIHVzZXIgaWQuIElmIHN1cHBsaWVkLCB3ZSdsbCBmaWx0ZXIgb3V0IGR1cGxpY2F0ZXMgd2hlbiByZW5kZXJpbmcgdXNlciBhdmF0YXJzLlxuICBpZD86IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIERhdGFVUkwgPSBzdHJpbmcgJiB7IF9icmFuZDogXCJEYXRhVVJMXCIgfTtcblxuZXhwb3J0IHR5cGUgQmluYXJ5RmlsZURhdGEgPSB7XG4gIG1pbWVUeXBlOlxuICAgIHwgdHlwZW9mIEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFU1tudW1iZXJdXG4gICAgLy8gZnV0dXJlIHVzZXIgb3IgdW5rbm93biBmaWxlIHR5cGVcbiAgICB8IHR5cGVvZiBNSU1FX1RZUEVTLmJpbmFyeTtcbiAgaWQ6IEZpbGVJZDtcbiAgZGF0YVVSTDogRGF0YVVSTDtcbiAgLyoqXG4gICAqIEVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHNcbiAgICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGVuIHRoZSBmaWxlIHdhcyBsYXN0IHJldHJpZXZlZCBmcm9tIHN0b3JhZ2UgdG8gYmUgbG9hZGVkXG4gICAqIG9udG8gdGhlIHNjZW5lLiBXZSB1c2UgdGhpcyBmbGFnIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGRlbGV0ZSB1bnVzZWRcbiAgICogZmlsZXMgZnJvbSBzdG9yYWdlLlxuICAgKlxuICAgKiBFcG9jaCB0aW1lc3RhbXAgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgbGFzdFJldHJpZXZlZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEJpbmFyeUZpbGVNZXRhZGF0YSA9IE9taXQ8QmluYXJ5RmlsZURhdGEsIFwiZGF0YVVSTFwiPjtcblxuZXhwb3J0IHR5cGUgQmluYXJ5RmlsZXMgPSBSZWNvcmQ8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSwgQmluYXJ5RmlsZURhdGE+O1xuXG5leHBvcnQgdHlwZSBMYXN0QWN0aXZlVG9vbCA9XG4gIHwge1xuICAgICAgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIHwgXCJoYW5kXCI7XG4gICAgICBjdXN0b21UeXBlOiBudWxsO1xuICAgIH1cbiAgfCB7XG4gICAgICB0eXBlOiBcImN1c3RvbVwiO1xuICAgICAgY3VzdG9tVHlwZTogc3RyaW5nO1xuICAgIH1cbiAgfCBudWxsO1xuXG5leHBvcnQgdHlwZSBBcHBTdGF0ZSA9IHtcbiAgY29udGV4dE1lbnU6IHtcbiAgICBpdGVtczogQ29udGV4dE1lbnVJdGVtcztcbiAgICB0b3A6IG51bWJlcjtcbiAgICBsZWZ0OiBudW1iZXI7XG4gIH0gfCBudWxsO1xuICBzaG93V2VsY29tZVNjcmVlbjogYm9vbGVhbjtcbiAgaXNMb2FkaW5nOiBib29sZWFuO1xuICBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gIGRyYWdnaW5nRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgcmVzaXppbmdFbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsO1xuICBtdWx0aUVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0xpbmVhckVsZW1lbnQ+IHwgbnVsbDtcbiAgc2VsZWN0aW9uRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgaXNCaW5kaW5nRW5hYmxlZDogYm9vbGVhbjtcbiAgc3RhcnRCb3VuZEVsZW1lbnQ6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudD4gfCBudWxsO1xuICBzdWdnZXN0ZWRCaW5kaW5nczogU3VnZ2VzdGVkQmluZGluZ1tdO1xuICAvLyBlbGVtZW50IGJlaW5nIGVkaXRlZCwgYnV0IG5vdCBuZWNlc3NhcmlseSBhZGRlZCB0byBlbGVtZW50cyBhcnJheSB5ZXRcbiAgLy8gKGUuZy4gdGV4dCBlbGVtZW50IHdoZW4gdHlwaW5nIGludG8gdGhlIGlucHV0KVxuICBlZGl0aW5nRWxlbWVudDogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbDtcbiAgZWRpdGluZ0xpbmVhckVsZW1lbnQ6IExpbmVhckVsZW1lbnRFZGl0b3IgfCBudWxsO1xuICBhY3RpdmVUb29sOiB7XG4gICAgLyoqXG4gICAgICogaW5kaWNhdGVzIGEgcHJldmlvdXMgdG9vbCB3ZSBzaG91bGQgcmV2ZXJ0IGJhY2sgdG8gaWYgd2UgZGVzZWxlY3QgdGhlXG4gICAgICogY3VycmVudGx5IGFjdGl2ZSB0b29sLiBBdCB0aGUgbW9tZW50IGFwcGxpZXMgdG8gYGVyYXNlcmAgYW5kIGBoYW5kYCB0b29sLlxuICAgICAqL1xuICAgIGxhc3RBY3RpdmVUb29sOiBMYXN0QWN0aXZlVG9vbDtcbiAgICBsb2NrZWQ6IGJvb2xlYW47XG4gIH0gJiAoXG4gICAgfCB7XG4gICAgICAgIHR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdIHwgXCJlcmFzZXJcIiB8IFwiaGFuZFwiO1xuICAgICAgICBjdXN0b21UeXBlOiBudWxsO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiBcImN1c3RvbVwiO1xuICAgICAgICBjdXN0b21UeXBlOiBzdHJpbmc7XG4gICAgICB9XG4gICk7XG4gIHBlbk1vZGU6IGJvb2xlYW47XG4gIHBlbkRldGVjdGVkOiBib29sZWFuO1xuICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICBleHBvcnRFbWJlZFNjZW5lOiBib29sZWFuO1xuICBleHBvcnRXaXRoRGFya01vZGU6IGJvb2xlYW47XG4gIGV4cG9ydFNjYWxlOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1CYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgY3VycmVudEl0ZW1GaWxsU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wiZmlsbFN0eWxlXCJdO1xuICBjdXJyZW50SXRlbVN0cm9rZVdpZHRoOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtU3Ryb2tlU3R5bGU6IEV4Y2FsaWRyYXdFbGVtZW50W1wic3Ryb2tlU3R5bGVcIl07XG4gIGN1cnJlbnRJdGVtUm91Z2huZXNzOiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtT3BhY2l0eTogbnVtYmVyO1xuICBjdXJyZW50SXRlbUZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG4gIGN1cnJlbnRJdGVtRm9udFNpemU6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1UZXh0QWxpZ246IFRleHRBbGlnbjtcbiAgY3VycmVudEl0ZW1TdGFydEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgY3VycmVudEl0ZW1FbmRBcnJvd2hlYWQ6IEFycm93aGVhZCB8IG51bGw7XG4gIGN1cnJlbnRJdGVtUm91bmRuZXNzOiBTdHJva2VSb3VuZG5lc3M7XG4gIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgc2Nyb2xsWDogbnVtYmVyO1xuICBzY3JvbGxZOiBudW1iZXI7XG4gIGN1cnNvckJ1dHRvbjogXCJ1cFwiIHwgXCJkb3duXCI7XG4gIHNjcm9sbGVkT3V0c2lkZTogYm9vbGVhbjtcbiAgbmFtZTogc3RyaW5nO1xuICBpc1Jlc2l6aW5nOiBib29sZWFuO1xuICBpc1JvdGF0aW5nOiBib29sZWFuO1xuICB6b29tOiBab29tO1xuICAvLyBtb2JpbGUtb25seVxuICBvcGVuTWVudTogXCJjYW52YXNcIiB8IFwic2hhcGVcIiB8IG51bGw7XG4gIG9wZW5Qb3B1cDpcbiAgICB8IFwiY2FudmFzQ29sb3JQaWNrZXJcIlxuICAgIHwgXCJiYWNrZ3JvdW5kQ29sb3JQaWNrZXJcIlxuICAgIHwgXCJzdHJva2VDb2xvclBpY2tlclwiXG4gICAgfCBudWxsO1xuICBvcGVuU2lkZWJhcjogXCJsaWJyYXJ5XCIgfCBcImN1c3RvbVNpZGViYXJcIiB8IG51bGw7XG4gIG9wZW5EaWFsb2c6IFwiaW1hZ2VFeHBvcnRcIiB8IFwiaGVscFwiIHwgXCJqc29uRXhwb3J0XCIgfCBudWxsO1xuICBpc1NpZGViYXJEb2NrZWQ6IGJvb2xlYW47XG5cbiAgbGFzdFBvaW50ZXJEb3duV2l0aDogUG9pbnRlclR5cGU7XG4gIHNlbGVjdGVkRWxlbWVudElkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgcHJldmlvdXNTZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuIH07XG4gIHNob3VsZENhY2hlSWdub3JlWm9vbTogYm9vbGVhbjtcbiAgdG9hc3Q6IHsgbWVzc2FnZTogc3RyaW5nOyBjbG9zYWJsZT86IGJvb2xlYW47IGR1cmF0aW9uPzogbnVtYmVyIH0gfCBudWxsO1xuICB6ZW5Nb2RlRW5hYmxlZDogYm9vbGVhbjtcbiAgdGhlbWU6IFRoZW1lO1xuICBncmlkU2l6ZTogbnVtYmVyIHwgbnVsbDtcbiAgdmlld01vZGVFbmFibGVkOiBib29sZWFuO1xuXG4gIC8qKiB0b3AtbW9zdCBzZWxlY3RlZCBncm91cHMgKGkuZS4gZG9lcyBub3QgaW5jbHVkZSBuZXN0ZWQgZ3JvdXBzKSAqL1xuICBzZWxlY3RlZEdyb3VwSWRzOiB7IFtncm91cElkOiBzdHJpbmddOiBib29sZWFuIH07XG4gIC8qKiBncm91cCBiZWluZyBlZGl0ZWQgd2hlbiB5b3UgZHJpbGwgZG93biB0byBpdHMgY29uc3RpdHVlbnQgZWxlbWVudFxuICAgIChlLmcuIHdoZW4geW91IGRvdWJsZS1jbGljayBvbiBhIGdyb3VwJ3MgZWxlbWVudCkgKi9cbiAgZWRpdGluZ0dyb3VwSWQ6IEdyb3VwSWQgfCBudWxsO1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgb2Zmc2V0VG9wOiBudW1iZXI7XG4gIG9mZnNldExlZnQ6IG51bWJlcjtcblxuICBmaWxlSGFuZGxlOiBGaWxlU3lzdGVtSGFuZGxlIHwgbnVsbDtcbiAgY29sbGFib3JhdG9yczogTWFwPHN0cmluZywgQ29sbGFib3JhdG9yPjtcbiAgc2hvd1N0YXRzOiBib29sZWFuO1xuICBjdXJyZW50Q2hhcnRUeXBlOiBDaGFydFR5cGU7XG4gIHBhc3RlRGlhbG9nOlxuICAgIHwge1xuICAgICAgICBzaG93bjogZmFsc2U7XG4gICAgICAgIGRhdGE6IG51bGw7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHNob3duOiB0cnVlO1xuICAgICAgICBkYXRhOiBTcHJlYWRzaGVldDtcbiAgICAgIH07XG4gIC8qKiBpbWFnZUVsZW1lbnQgd2FpdGluZyB0byBiZSBwbGFjZWQgb24gY2FudmFzICovXG4gIHBlbmRpbmdJbWFnZUVsZW1lbnRJZDogRXhjYWxpZHJhd0ltYWdlRWxlbWVudFtcImlkXCJdIHwgbnVsbDtcbiAgc2hvd0h5cGVybGlua1BvcHVwOiBmYWxzZSB8IFwiaW5mb1wiIHwgXCJlZGl0b3JcIjtcbiAgc2VsZWN0ZWRMaW5lYXJFbGVtZW50OiBMaW5lYXJFbGVtZW50RWRpdG9yIHwgbnVsbDtcbn07XG5cbmV4cG9ydCB0eXBlIE5vcm1hbGl6ZWRab29tVmFsdWUgPSBudW1iZXIgJiB7IF9icmFuZDogXCJub3JtYWxpemVkWm9vbVwiIH07XG5cbmV4cG9ydCB0eXBlIFpvb20gPSBSZWFkb25seTx7XG4gIHZhbHVlOiBOb3JtYWxpemVkWm9vbVZhbHVlO1xufT47XG5cbmV4cG9ydCB0eXBlIFBvaW50ZXJDb29yZHMgPSBSZWFkb25seTx7XG4gIHg6IG51bWJlcjtcbiAgeTogbnVtYmVyO1xufT47XG5cbmV4cG9ydCB0eXBlIEdlc3R1cmUgPSB7XG4gIHBvaW50ZXJzOiBNYXA8bnVtYmVyLCBQb2ludGVyQ29vcmRzPjtcbiAgbGFzdENlbnRlcjogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgaW5pdGlhbERpc3RhbmNlOiBudW1iZXIgfCBudWxsO1xuICBpbml0aWFsU2NhbGU6IG51bWJlciB8IG51bGw7XG59O1xuXG5leHBvcnQgZGVjbGFyZSBjbGFzcyBHZXN0dXJlRXZlbnQgZXh0ZW5kcyBVSUV2ZW50IHtcbiAgcmVhZG9ubHkgcm90YXRpb246IG51bWJlcjtcbiAgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbn1cblxuLy8gbGlicmFyaWVzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLyoqIEBkZXByZWNhdGVkIGxlZ2FjeTogZG8gbm90IHVzZSBvdXRzaWRlIG9mIG1pZ3JhdGlvbiBwYXRocyAqL1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1fdjEgPSByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuLyoqIEBkZXByZWNhdGVkIGxlZ2FjeTogZG8gbm90IHVzZSBvdXRzaWRlIG9mIG1pZ3JhdGlvbiBwYXRocyAqL1xudHlwZSBMaWJyYXJ5SXRlbXNfdjEgPSByZWFkb25seSBMaWJyYXJ5SXRlbV92MVtdO1xuXG4vKiogdjIgbGlicmFyeSBpdGVtICovXG5leHBvcnQgdHlwZSBMaWJyYXJ5SXRlbSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgc3RhdHVzOiBcInB1Ymxpc2hlZFwiIHwgXCJ1bnB1Ymxpc2hlZFwiO1xuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD5bXTtcbiAgLyoqIHRpbWVzdGFtcCBpbiBlcG9jaCAobXMpICovXG4gIGNyZWF0ZWQ6IG51bWJlcjtcbiAgbmFtZT86IHN0cmluZztcbiAgZXJyb3I/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1zID0gcmVhZG9ubHkgTGlicmFyeUl0ZW1bXTtcbmV4cG9ydCB0eXBlIExpYnJhcnlJdGVtc19hbnlWZXJzaW9uID0gTGlicmFyeUl0ZW1zIHwgTGlicmFyeUl0ZW1zX3YxO1xuXG5leHBvcnQgdHlwZSBMaWJyYXJ5SXRlbXNTb3VyY2UgPVxuICB8ICgoXG4gICAgICBjdXJyZW50TGlicmFyeUl0ZW1zOiBMaWJyYXJ5SXRlbXMsXG4gICAgKSA9PlxuICAgICAgfCBCbG9iXG4gICAgICB8IExpYnJhcnlJdGVtc19hbnlWZXJzaW9uXG4gICAgICB8IFByb21pc2U8TGlicmFyeUl0ZW1zX2FueVZlcnNpb24gfCBCbG9iPilcbiAgfCBCbG9iXG4gIHwgTGlicmFyeUl0ZW1zX2FueVZlcnNpb25cbiAgfCBQcm9taXNlPExpYnJhcnlJdGVtc19hbnlWZXJzaW9uIHwgQmxvYj47XG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vLyBOT1RFIHJlYWR5L3JlYWR5UHJvbWlzZSBwcm9wcyBhcmUgb3B0aW9uYWwgZm9yIGhvc3QgYXBwcycgc2FrZSAob3VyIG93blxuLy8gaW1wbGVtIGd1YXJhbnRlZXMgZXhpc3RlbmNlKVxuZXhwb3J0IHR5cGUgRXhjYWxpZHJhd0FQSVJlZlZhbHVlID1cbiAgfCBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSVxuICB8IHtcbiAgICAgIHJlYWR5UHJvbWlzZT86IFJlc29sdmFibGVQcm9taXNlPEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJPjtcbiAgICAgIHJlYWR5PzogZmFsc2U7XG4gICAgfTtcblxuZXhwb3J0IHR5cGUgRXhjYWxpZHJhd0luaXRpYWxEYXRhU3RhdGUgPSBNZXJnZTxcbiAgSW1wb3J0ZWREYXRhU3RhdGUsXG4gIHtcbiAgICBsaWJyYXJ5SXRlbXM/OlxuICAgICAgfCBSZXF1aXJlZDxJbXBvcnRlZERhdGFTdGF0ZT5bXCJsaWJyYXJ5SXRlbXNcIl1cbiAgICAgIHwgUHJvbWlzZTxSZXF1aXJlZDxJbXBvcnRlZERhdGFTdGF0ZT5bXCJsaWJyYXJ5SXRlbXNcIl0+O1xuICB9XG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4Y2FsaWRyYXdQcm9wcyB7XG4gIG9uQ2hhbmdlPzogKFxuICAgIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBmaWxlczogQmluYXJ5RmlsZXMsXG4gICkgPT4gdm9pZDtcbiAgaW5pdGlhbERhdGE/OlxuICAgIHwgRXhjYWxpZHJhd0luaXRpYWxEYXRhU3RhdGVcbiAgICB8IG51bGxcbiAgICB8IFByb21pc2U8RXhjYWxpZHJhd0luaXRpYWxEYXRhU3RhdGUgfCBudWxsPjtcbiAgZXhjYWxpZHJhd1JlZj86IEZvcndhcmRSZWY8RXhjYWxpZHJhd0FQSVJlZlZhbHVlPjtcbiAgaXNDb2xsYWJvcmF0aW5nPzogYm9vbGVhbjtcbiAgb25Qb2ludGVyVXBkYXRlPzogKHBheWxvYWQ6IHtcbiAgICBwb2ludGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgYnV0dG9uOiBcImRvd25cIiB8IFwidXBcIjtcbiAgICBwb2ludGVyc01hcDogR2VzdHVyZVtcInBvaW50ZXJzXCJdO1xuICB9KSA9PiB2b2lkO1xuICBvblBhc3RlPzogKFxuICAgIGRhdGE6IENsaXBib2FyZERhdGEsXG4gICAgZXZlbnQ6IENsaXBib2FyZEV2ZW50IHwgbnVsbCxcbiAgKSA9PiBQcm9taXNlPGJvb2xlYW4+IHwgYm9vbGVhbjtcbiAgcmVuZGVyVG9wUmlnaHRVST86IChcbiAgICBpc01vYmlsZTogYm9vbGVhbixcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkgPT4gSlNYLkVsZW1lbnQgfCBudWxsO1xuICBsYW5nQ29kZT86IExhbmd1YWdlW1wiY29kZVwiXTtcbiAgdmlld01vZGVFbmFibGVkPzogYm9vbGVhbjtcbiAgemVuTW9kZUVuYWJsZWQ/OiBib29sZWFuO1xuICBncmlkTW9kZUVuYWJsZWQ/OiBib29sZWFuO1xuICBsaWJyYXJ5UmV0dXJuVXJsPzogc3RyaW5nO1xuICB0aGVtZT86IFRoZW1lO1xuICBuYW1lPzogc3RyaW5nO1xuICByZW5kZXJDdXN0b21TdGF0cz86IChcbiAgICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICApID0+IEpTWC5FbGVtZW50O1xuICBVSU9wdGlvbnM/OiBQYXJ0aWFsPFVJT3B0aW9ucz47XG4gIGRldGVjdFNjcm9sbD86IGJvb2xlYW47XG4gIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk/OiBib29sZWFuO1xuICBvbkxpYnJhcnlDaGFuZ2U/OiAobGlicmFyeUl0ZW1zOiBMaWJyYXJ5SXRlbXMpID0+IHZvaWQgfCBQcm9taXNlPGFueT47XG4gIGF1dG9Gb2N1cz86IGJvb2xlYW47XG4gIGdlbmVyYXRlSWRGb3JGaWxlPzogKGZpbGU6IEZpbGUpID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgb25MaW5rT3Blbj86IChcbiAgICBlbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gICAgZXZlbnQ6IEN1c3RvbUV2ZW50PHtcbiAgICAgIG5hdGl2ZUV2ZW50OiBNb3VzZUV2ZW50IHwgUmVhY3QuUG9pbnRlckV2ZW50PEhUTUxDYW52YXNFbGVtZW50PjtcbiAgICB9PixcbiAgKSA9PiB2b2lkO1xuICBvblBvaW50ZXJEb3duPzogKFxuICAgIGFjdGl2ZVRvb2w6IEFwcFN0YXRlW1wiYWN0aXZlVG9vbFwiXSxcbiAgICBwb2ludGVyRG93blN0YXRlOiBQb2ludGVyRG93blN0YXRlLFxuICApID0+IHZvaWQ7XG4gIG9uU2Nyb2xsQ2hhbmdlPzogKHNjcm9sbFg6IG51bWJlciwgc2Nyb2xsWTogbnVtYmVyKSA9PiB2b2lkO1xuICAvKipcbiAgICogUmVuZGVyIGZ1bmN0aW9uIHRoYXQgcmVuZGVycyBjdXN0b20gPFNpZGViYXIgLz4gY29tcG9uZW50LlxuICAgKi9cbiAgcmVuZGVyU2lkZWJhcj86ICgpID0+IEpTWC5FbGVtZW50IHwgbnVsbDtcbiAgY2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGU7XG59XG5cbmV4cG9ydCB0eXBlIFNjZW5lRGF0YSA9IHtcbiAgZWxlbWVudHM/OiBJbXBvcnRlZERhdGFTdGF0ZVtcImVsZW1lbnRzXCJdO1xuICBhcHBTdGF0ZT86IEltcG9ydGVkRGF0YVN0YXRlW1wiYXBwU3RhdGVcIl07XG4gIGNvbGxhYm9yYXRvcnM/OiBNYXA8c3RyaW5nLCBDb2xsYWJvcmF0b3I+O1xuICBjb21taXRUb0hpc3Rvcnk/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IGVudW0gVXNlcklkbGVTdGF0ZSB7XG4gIEFDVElWRSA9IFwiYWN0aXZlXCIsXG4gIEFXQVkgPSBcImF3YXlcIixcbiAgSURMRSA9IFwiaWRsZVwiLFxufVxuXG5leHBvcnQgdHlwZSBFeHBvcnRPcHRzID0ge1xuICBzYXZlRmlsZVRvRGlzaz86IGJvb2xlYW47XG4gIG9uRXhwb3J0VG9CYWNrZW5kPzogKFxuICAgIGV4cG9ydGVkRWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgICBmaWxlczogQmluYXJ5RmlsZXMsXG4gICAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gICkgPT4gdm9pZDtcbiAgcmVuZGVyQ3VzdG9tVUk/OiAoXG4gICAgZXhwb3J0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgKSA9PiBKU1guRWxlbWVudDtcbn07XG5cbi8vIE5PVEUgYXQgdGhlIG1vbWVudCwgaWYgYWN0aW9uIG5hbWUgY29yZXNzcG9uZHMgdG8gY2FudmFzQWN0aW9uIHByb3AsIGl0c1xuLy8gdHJ1dGhpbmVzcyB2YWx1ZSB3aWxsIGRldGVybWluZSB3aGV0aGVyIHRoZSBhY3Rpb24gaXMgcmVuZGVyZWQgb3Igbm90XG4vLyAoc2VlIG1hbmFnZXIgcmVuZGVyQWN0aW9uKS4gV2UgYWxzbyBvdmVycmlkZSBjYW52YXNBY3Rpb24gdmFsdWVzIGluXG4vLyBleGNhbGlkcmF3IHBhY2thZ2UgaW5kZXgudHN4LlxudHlwZSBDYW52YXNBY3Rpb25zID0gUGFydGlhbDx7XG4gIGNoYW5nZVZpZXdCYWNrZ3JvdW5kQ29sb3I6IGJvb2xlYW47XG4gIGNsZWFyQ2FudmFzOiBib29sZWFuO1xuICBleHBvcnQ6IGZhbHNlIHwgRXhwb3J0T3B0cztcbiAgbG9hZFNjZW5lOiBib29sZWFuO1xuICBzYXZlVG9BY3RpdmVGaWxlOiBib29sZWFuO1xuICB0b2dnbGVUaGVtZTogYm9vbGVhbiB8IG51bGw7XG4gIHNhdmVBc0ltYWdlOiBib29sZWFuO1xufT47XG5cbnR5cGUgVUlPcHRpb25zID0gUGFydGlhbDx7XG4gIGRvY2tlZFNpZGViYXJCcmVha3BvaW50OiBudW1iZXI7XG4gIGNhbnZhc0FjdGlvbnM6IENhbnZhc0FjdGlvbnM7XG4gIC8qKiBAZGVwcmVjYXRlZCBkb2VzIG5vdGhpbmcuIFdpbGwgYmUgcmVtb3ZlZCBpbiAwLjE1ICovXG4gIHdlbGNvbWVTY3JlZW4/OiBib29sZWFuO1xufT47XG5cbmV4cG9ydCB0eXBlIEFwcFByb3BzID0gTWVyZ2U8XG4gIEV4Y2FsaWRyYXdQcm9wcyxcbiAge1xuICAgIFVJT3B0aW9uczogTWVyZ2U8XG4gICAgICBVSU9wdGlvbnMsXG4gICAgICB7XG4gICAgICAgIGNhbnZhc0FjdGlvbnM6IFJlcXVpcmVkPENhbnZhc0FjdGlvbnM+ICYgeyBleHBvcnQ6IEV4cG9ydE9wdHMgfTtcbiAgICAgIH1cbiAgICA+O1xuICAgIGRldGVjdFNjcm9sbDogYm9vbGVhbjtcbiAgICBoYW5kbGVLZXlib2FyZEdsb2JhbGx5OiBib29sZWFuO1xuICAgIGlzQ29sbGFib3JhdGluZzogYm9vbGVhbjtcbiAgICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgfVxuPjtcblxuLyoqIEEgc3Vic2V0IG9mIEFwcCBjbGFzcyBwcm9wZXJ0aWVzIHRoYXQgd2UgbmVlZCB0byB1c2UgZWxzZXdoZXJlXG4gKiBpbiB0aGUgYXBwLCBlZyBNYW5hZ2VyLiBGYWN0b3JlZCBvdXQgaW50byBhIHNlcGFyYXRlIHR5cGUgdG8ga2VlcCBEUlkuICovXG5leHBvcnQgdHlwZSBBcHBDbGFzc1Byb3BlcnRpZXMgPSB7XG4gIHByb3BzOiBBcHBQcm9wcztcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGw7XG4gIGZvY3VzQ29udGFpbmVyKCk6IHZvaWQ7XG4gIGxpYnJhcnk6IExpYnJhcnk7XG4gIGltYWdlQ2FjaGU6IE1hcDxcbiAgICBGaWxlSWQsXG4gICAge1xuICAgICAgaW1hZ2U6IEhUTUxJbWFnZUVsZW1lbnQgfCBQcm9taXNlPEhUTUxJbWFnZUVsZW1lbnQ+O1xuICAgICAgbWltZVR5cGU6IHR5cGVvZiBBTExPV0VEX0lNQUdFX01JTUVfVFlQRVNbbnVtYmVyXTtcbiAgICB9XG4gID47XG4gIGZpbGVzOiBCaW5hcnlGaWxlcztcbiAgZGV2aWNlOiBBcHBbXCJkZXZpY2VcIl07XG4gIHNjZW5lOiBBcHBbXCJzY2VuZVwiXTtcbiAgcGFzdGVGcm9tQ2xpcGJvYXJkOiBBcHBbXCJwYXN0ZUZyb21DbGlwYm9hcmRcIl07XG59O1xuXG5leHBvcnQgdHlwZSBQb2ludGVyRG93blN0YXRlID0gUmVhZG9ubHk8e1xuICAvLyBUaGUgZmlyc3QgcG9zaXRpb24gYXQgd2hpY2ggcG9pbnRlckRvd24gaGFwcGVuZWRcbiAgb3JpZ2luOiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+O1xuICAvLyBTYW1lIGFzIFwib3JpZ2luXCIgYnV0IHNuYXBwZWQgdG8gdGhlIGdyaWQsIGlmIGdyaWQgaXMgb25cbiAgb3JpZ2luSW5HcmlkOiBSZWFkb25seTx7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0+O1xuICAvLyBTY3JvbGxiYXIgY2hlY2tzXG4gIHNjcm9sbGJhcnM6IFJldHVyblR5cGU8dHlwZW9mIGlzT3ZlclNjcm9sbEJhcnM+O1xuICAvLyBUaGUgcHJldmlvdXMgcG9pbnRlciBwb3NpdGlvblxuICBsYXN0Q29vcmRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIC8vIG1hcCBvZiBvcmlnaW5hbCBlbGVtZW50cyBkYXRhXG4gIG9yaWdpbmFsRWxlbWVudHM6IE1hcDxzdHJpbmcsIE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+PjtcbiAgcmVzaXplOiB7XG4gICAgLy8gSGFuZGxlIHdoZW4gcmVzaXppbmcsIG1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgICBoYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGU7XG4gICAgLy8gVGhpcyBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIGlzUmVzaXppbmc6IGJvb2xlYW47XG4gICAgLy8gVGhpcyBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9mZnNldDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9O1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBhcnJvd0RpcmVjdGlvbjogXCJvcmlnaW5cIiB8IFwiZW5kXCI7XG4gICAgLy8gVGhpcyBpcyBhIGNlbnRlciBwb2ludCBvZiBzZWxlY3RlZCBlbGVtZW50cyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudCAoZm9yIHJvdGF0aW9uIG9ubHkpXG4gICAgY2VudGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gIH07XG4gIGhpdDoge1xuICAgIC8vIFRoZSBlbGVtZW50IHRoZSBwb2ludGVyIGlzIFwiaGl0dGluZ1wiLCBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsXG4gICAgLy8gcG9pbnRlciBkb3duIGV2ZW50XG4gICAgZWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD4gfCBudWxsO1xuICAgIC8vIFRoZSBlbGVtZW50cyB0aGUgcG9pbnRlciBpcyBcImhpdHRpbmdcIiwgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbFxuICAgIC8vIHBvaW50ZXIgZG93biBldmVudFxuICAgIGFsbEhpdEVsZW1lbnRzOiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuICAgIC8vIFRoaXMgaXMgZGV0ZXJtaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICB3YXNBZGRlZFRvU2VsZWN0aW9uOiBib29sZWFuO1xuICAgIC8vIFdoZXRoZXIgc2VsZWN0ZWQgZWxlbWVudChzKSB3ZXJlIGR1cGxpY2F0ZWQsIG1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlXG4gICAgLy8gcG9pbnRlciBpbnRlcmFjdGlvblxuICAgIGhhc0JlZW5EdXBsaWNhdGVkOiBib29sZWFuO1xuICAgIGhhc0hpdENvbW1vbkJvdW5kaW5nQm94T2ZTZWxlY3RlZEVsZW1lbnRzOiBib29sZWFuO1xuICB9O1xuICB3aXRoQ21kT3JDdHJsOiBib29sZWFuO1xuICBkcmFnOiB7XG4gICAgLy8gTWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICAgIGhhc09jY3VycmVkOiBib29sZWFuO1xuICAgIC8vIE1pZ2h0IGNoYW5nZSBkdXJpbmcgdGhlIHBvaW50ZXIgaW50ZXJhY3Rpb25cbiAgICBvZmZzZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSB8IG51bGw7XG4gIH07XG4gIC8vIFdlIG5lZWQgdG8gaGF2ZSB0aGVzZSBpbiB0aGUgc3RhdGUgc28gdGhhdCB3ZSBjYW4gdW5zdWJzY3JpYmUgdGhlbVxuICBldmVudExpc3RlbmVyczoge1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbk1vdmU6IG51bGwgfCBSZXR1cm5UeXBlPHR5cGVvZiB0aHJvdHRsZVJBRj47XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uVXA6IG51bGwgfCAoKGV2ZW50OiBQb2ludGVyRXZlbnQpID0+IHZvaWQpO1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbktleURvd246IG51bGwgfCAoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkKTtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25LZXlVcDogbnVsbCB8ICgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpO1xuICB9O1xuICBib3hTZWxlY3Rpb246IHtcbiAgICBoYXNPY2N1cnJlZDogYm9vbGVhbjtcbiAgfTtcbiAgZWxlbWVudElkc1RvRXJhc2U6IHtcbiAgICBba2V5OiBFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdXToge1xuICAgICAgb3BhY2l0eTogRXhjYWxpZHJhd0VsZW1lbnRbXCJvcGFjaXR5XCJdO1xuICAgICAgZXJhc2U6IGJvb2xlYW47XG4gICAgfTtcbiAgfTtcbn0+O1xuXG5leHBvcnQgdHlwZSBFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQSSA9IHtcbiAgdXBkYXRlU2NlbmU6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInVwZGF0ZVNjZW5lXCJdO1xuICB1cGRhdGVMaWJyYXJ5OiBJbnN0YW5jZVR5cGU8dHlwZW9mIExpYnJhcnk+W1widXBkYXRlTGlicmFyeVwiXTtcbiAgcmVzZXRTY2VuZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wicmVzZXRTY2VuZVwiXTtcbiAgZ2V0U2NlbmVFbGVtZW50c0luY2x1ZGluZ0RlbGV0ZWQ6IEluc3RhbmNlVHlwZTxcbiAgICB0eXBlb2YgQXBwXG4gID5bXCJnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZFwiXTtcbiAgaGlzdG9yeToge1xuICAgIGNsZWFyOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZXNldEhpc3RvcnlcIl07XG4gIH07XG4gIHNjcm9sbFRvQ29udGVudDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wic2Nyb2xsVG9Db250ZW50XCJdO1xuICBnZXRTY2VuZUVsZW1lbnRzOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJnZXRTY2VuZUVsZW1lbnRzXCJdO1xuICBnZXRBcHBTdGF0ZTogKCkgPT4gSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wic3RhdGVcIl07XG4gIGdldEZpbGVzOiAoKSA9PiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJmaWxlc1wiXTtcbiAgcmVmcmVzaDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wicmVmcmVzaFwiXTtcbiAgc2V0VG9hc3Q6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInNldFRvYXN0XCJdO1xuICBhZGRGaWxlczogKGRhdGE6IEJpbmFyeUZpbGVEYXRhW10pID0+IHZvaWQ7XG4gIHJlYWR5UHJvbWlzZTogUmVzb2x2YWJsZVByb21pc2U8RXhjYWxpZHJhd0ltcGVyYXRpdmVBUEk+O1xuICByZWFkeTogdHJ1ZTtcbiAgaWQ6IHN0cmluZztcbiAgc2V0QWN0aXZlVG9vbDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wic2V0QWN0aXZlVG9vbFwiXTtcbiAgc2V0Q3Vyc29yOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzZXRDdXJzb3JcIl07XG4gIHJlc2V0Q3Vyc29yOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZXNldEN1cnNvclwiXTtcbiAgdG9nZ2xlTWVudTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1widG9nZ2xlTWVudVwiXTtcbn07XG5cbmV4cG9ydCB0eXBlIERldmljZSA9IFJlYWRvbmx5PHtcbiAgaXNTbVNjcmVlbjogYm9vbGVhbjtcbiAgaXNNb2JpbGU6IGJvb2xlYW47XG4gIGlzVG91Y2hTY3JlZW46IGJvb2xlYW47XG4gIGNhbkRldmljZUZpdFNpZGViYXI6IGJvb2xlYW47XG59PjtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../types.ts\n");
|
|
3969
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"UserIdleState\": () => (/* binding */ UserIdleState)\n/* harmony export */ });\nvar UserIdleState;\n(function (UserIdleState) {\n UserIdleState[\"ACTIVE\"] = \"active\";\n UserIdleState[\"AWAY\"] = \"away\";\n UserIdleState[\"IDLE\"] = \"idle\";\n})(UserIdleState || (UserIdleState = {}));\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vdHlwZXMudHMuanMiLCJtYXBwaW5ncyI6Ijs7OztBQThWQSxJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsa0NBQWlCO0lBQ2pCLDhCQUFhO0lBQ2IsOEJBQWE7QUFDZixDQUFDLEVBSlcsYUFBYSxLQUFiLGFBQWEsUUFJeEIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vdHlwZXMudHM/MDI0NiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBQb2ludGVyVHlwZSxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbiAgVGV4dEFsaWduLFxuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgR3JvdXBJZCxcbiAgRXhjYWxpZHJhd0JpbmRhYmxlRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBDaGFydFR5cGUsXG4gIEZvbnRGYW1pbHlWYWx1ZXMsXG4gIEZpbGVJZCxcbiAgRXhjYWxpZHJhd0ltYWdlRWxlbWVudCxcbiAgVGhlbWUsXG4gIFN0cm9rZVJvdW5kbmVzcyxcbn0gZnJvbSBcIi4vZWxlbWVudC90eXBlc1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5pbXBvcnQgeyBQb2ludCBhcyBSb3VnaFBvaW50IH0gZnJvbSBcInJvdWdoanMvYmluL2dlb21ldHJ5XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vZWxlbWVudC9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBTdWdnZXN0ZWRCaW5kaW5nIH0gZnJvbSBcIi4vZWxlbWVudC9iaW5kaW5nXCI7XG5pbXBvcnQgeyBJbXBvcnRlZERhdGFTdGF0ZSB9IGZyb20gXCIuL2RhdGEvdHlwZXNcIjtcbmltcG9ydCB0eXBlIEFwcCBmcm9tIFwiLi9jb21wb25lbnRzL0FwcFwiO1xuaW1wb3J0IHR5cGUgeyBSZXNvbHZhYmxlUHJvbWlzZSwgdGhyb3R0bGVSQUYgfSBmcm9tIFwiLi91dGlsc1wiO1xuaW1wb3J0IHsgU3ByZWFkc2hlZXQgfSBmcm9tIFwiLi9jaGFydHNcIjtcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSBcIi4vaTE4blwiO1xuaW1wb3J0IHsgQ2xpcGJvYXJkRGF0YSB9IGZyb20gXCIuL2NsaXBib2FyZFwiO1xuaW1wb3J0IHsgaXNPdmVyU2Nyb2xsQmFycyB9IGZyb20gXCIuL3NjZW5lXCI7XG5pbXBvcnQgeyBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUgfSBmcm9tIFwiLi9lbGVtZW50L3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBMaWJyYXJ5IGZyb20gXCIuL2RhdGEvbGlicmFyeVwiO1xuaW1wb3J0IHR5cGUgeyBGaWxlU3lzdGVtSGFuZGxlIH0gZnJvbSBcIi4vZGF0YS9maWxlc3lzdGVtXCI7XG5pbXBvcnQgdHlwZSB7IEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFUywgTUlNRV9UWVBFUyB9IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgQ29udGV4dE1lbnVJdGVtcyB9IGZyb20gXCIuL2NvbXBvbmVudHMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IE1lcmdlLCBGb3J3YXJkUmVmIH0gZnJvbSBcIi4vdXRpbGl0eS10eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBQb2ludCA9IFJlYWRvbmx5PFJvdWdoUG9pbnQ+O1xuXG5leHBvcnQgdHlwZSBDb2xsYWJvcmF0b3IgPSB7XG4gIHBvaW50ZXI/OiB7XG4gICAgeDogbnVtYmVyO1xuICAgIHk6IG51bWJlcjtcbiAgfTtcbiAgYnV0dG9uPzogXCJ1cFwiIHwgXCJkb3duXCI7XG4gIHNlbGVjdGVkRWxlbWVudElkcz86IEFwcFN0YXRlW1wic2VsZWN0ZWRFbGVtZW50SWRzXCJdO1xuICB1c2VybmFtZT86IHN0cmluZyB8IG51bGw7XG4gIHVzZXJTdGF0ZT86IFVzZXJJZGxlU3RhdGU7XG4gIGNvbG9yPzoge1xuICAgIGJhY2tncm91bmQ6IHN0cmluZztcbiAgICBzdHJva2U6IHN0cmluZztcbiAgfTtcbiAgLy8gVGhlIHVybCBvZiB0aGUgY29sbGFib3JhdG9yJ3MgYXZhdGFyLCBkZWZhdWx0cyB0byB1c2VybmFtZSBpbnRpYWxzXG4gIC8vIGlmIG5vdCBwcmVzZW50XG4gIGF2YXRhclVybD86IHN0cmluZztcbiAgLy8gdXNlciBpZC4gSWYgc3VwcGxpZWQsIHdlJ2xsIGZpbHRlciBvdXQgZHVwbGljYXRlcyB3aGVuIHJlbmRlcmluZyB1c2VyIGF2YXRhcnMuXG4gIGlkPzogc3RyaW5nO1xufTtcblxuZXhwb3J0IHR5cGUgRGF0YVVSTCA9IHN0cmluZyAmIHsgX2JyYW5kOiBcIkRhdGFVUkxcIiB9O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlRGF0YSA9IHtcbiAgbWltZVR5cGU6XG4gICAgfCB0eXBlb2YgQUxMT1dFRF9JTUFHRV9NSU1FX1RZUEVTW251bWJlcl1cbiAgICAvLyBmdXR1cmUgdXNlciBvciB1bmtub3duIGZpbGUgdHlwZVxuICAgIHwgdHlwZW9mIE1JTUVfVFlQRVMuYmluYXJ5O1xuICBpZDogRmlsZUlkO1xuICBkYXRhVVJMOiBEYXRhVVJMO1xuICAvKipcbiAgICogRXBvY2ggdGltZXN0YW1wIGluIG1pbGxpc2Vjb25kc1xuICAgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZW4gdGhlIGZpbGUgd2FzIGxhc3QgcmV0cmlldmVkIGZyb20gc3RvcmFnZSB0byBiZSBsb2FkZWRcbiAgICogb250byB0aGUgc2NlbmUuIFdlIHVzZSB0aGlzIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gZGVsZXRlIHVudXNlZFxuICAgKiBmaWxlcyBmcm9tIHN0b3JhZ2UuXG4gICAqXG4gICAqIEVwb2NoIHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICBsYXN0UmV0cmlldmVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgQmluYXJ5RmlsZU1ldGFkYXRhID0gT21pdDxCaW5hcnlGaWxlRGF0YSwgXCJkYXRhVVJMXCI+O1xuXG5leHBvcnQgdHlwZSBCaW5hcnlGaWxlcyA9IFJlY29yZDxFeGNhbGlkcmF3RWxlbWVudFtcImlkXCJdLCBCaW5hcnlGaWxlRGF0YT47XG5cbmV4cG9ydCB0eXBlIExhc3RBY3RpdmVUb29sID1cbiAgfCB7XG4gICAgICB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfCBcImhhbmRcIjtcbiAgICAgIGN1c3RvbVR5cGU6IG51bGw7XG4gICAgfVxuICB8IHtcbiAgICAgIHR5cGU6IFwiY3VzdG9tXCI7XG4gICAgICBjdXN0b21UeXBlOiBzdHJpbmc7XG4gICAgfVxuICB8IG51bGw7XG5cbmV4cG9ydCB0eXBlIEFwcFN0YXRlID0ge1xuICBjb250ZXh0TWVudToge1xuICAgIGl0ZW1zOiBDb250ZXh0TWVudUl0ZW1zO1xuICAgIHRvcDogbnVtYmVyO1xuICAgIGxlZnQ6IG51bWJlcjtcbiAgfSB8IG51bGw7XG4gIHNob3dXZWxjb21lU2NyZWVuOiBib29sZWFuO1xuICBpc0xvYWRpbmc6IGJvb2xlYW47XG4gIGVycm9yTWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgZHJhZ2dpbmdFbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsO1xuICByZXNpemluZ0VsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB8IG51bGw7XG4gIG11bHRpRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3TGluZWFyRWxlbWVudD4gfCBudWxsO1xuICBzZWxlY3Rpb25FbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsO1xuICBpc0JpbmRpbmdFbmFibGVkOiBib29sZWFuO1xuICBzdGFydEJvdW5kRWxlbWVudDogTm9uRGVsZXRlZDxFeGNhbGlkcmF3QmluZGFibGVFbGVtZW50PiB8IG51bGw7XG4gIHN1Z2dlc3RlZEJpbmRpbmdzOiBTdWdnZXN0ZWRCaW5kaW5nW107XG4gIC8vIGVsZW1lbnQgYmVpbmcgZWRpdGVkLCBidXQgbm90IG5lY2Vzc2FyaWx5IGFkZGVkIHRvIGVsZW1lbnRzIGFycmF5IHlldFxuICAvLyAoZS5nLiB0ZXh0IGVsZW1lbnQgd2hlbiB0eXBpbmcgaW50byB0aGUgaW5wdXQpXG4gIGVkaXRpbmdFbGVtZW50OiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsO1xuICBlZGl0aW5nTGluZWFyRWxlbWVudDogTGluZWFyRWxlbWVudEVkaXRvciB8IG51bGw7XG4gIGFjdGl2ZVRvb2w6IHtcbiAgICAvKipcbiAgICAgKiBpbmRpY2F0ZXMgYSBwcmV2aW91cyB0b29sIHdlIHNob3VsZCByZXZlcnQgYmFjayB0byBpZiB3ZSBkZXNlbGVjdCB0aGVcbiAgICAgKiBjdXJyZW50bHkgYWN0aXZlIHRvb2wuIEF0IHRoZSBtb21lbnQgYXBwbGllcyB0byBgZXJhc2VyYCBhbmQgYGhhbmRgIHRvb2wuXG4gICAgICovXG4gICAgbGFzdEFjdGl2ZVRvb2w6IExhc3RBY3RpdmVUb29sO1xuICAgIGxvY2tlZDogYm9vbGVhbjtcbiAgfSAmIChcbiAgICB8IHtcbiAgICAgICAgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIHwgXCJoYW5kXCI7XG4gICAgICAgIGN1c3RvbVR5cGU6IG51bGw7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6IFwiY3VzdG9tXCI7XG4gICAgICAgIGN1c3RvbVR5cGU6IHN0cmluZztcbiAgICAgIH1cbiAgKTtcbiAgcGVuTW9kZTogYm9vbGVhbjtcbiAgcGVuRGV0ZWN0ZWQ6IGJvb2xlYW47XG4gIGV4cG9ydEJhY2tncm91bmQ6IGJvb2xlYW47XG4gIGV4cG9ydEVtYmVkU2NlbmU6IGJvb2xlYW47XG4gIGV4cG9ydFdpdGhEYXJrTW9kZTogYm9vbGVhbjtcbiAgZXhwb3J0U2NhbGU6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1TdHJva2VDb2xvcjogc3RyaW5nO1xuICBjdXJyZW50SXRlbUJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICBjdXJyZW50SXRlbUZpbGxTdHlsZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJmaWxsU3R5bGVcIl07XG4gIGN1cnJlbnRJdGVtU3Ryb2tlV2lkdGg6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1TdHJva2VTdHlsZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJzdHJva2VTdHlsZVwiXTtcbiAgY3VycmVudEl0ZW1Sb3VnaG5lc3M6IG51bWJlcjtcbiAgY3VycmVudEl0ZW1PcGFjaXR5OiBudW1iZXI7XG4gIGN1cnJlbnRJdGVtRm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbiAgY3VycmVudEl0ZW1Gb250U2l6ZTogbnVtYmVyO1xuICBjdXJyZW50SXRlbVRleHRBbGlnbjogVGV4dEFsaWduO1xuICBjdXJyZW50SXRlbVN0YXJ0QXJyb3doZWFkOiBBcnJvd2hlYWQgfCBudWxsO1xuICBjdXJyZW50SXRlbUVuZEFycm93aGVhZDogQXJyb3doZWFkIHwgbnVsbDtcbiAgY3VycmVudEl0ZW1Sb3VuZG5lc3M6IFN0cm9rZVJvdW5kbmVzcztcbiAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICBzY3JvbGxYOiBudW1iZXI7XG4gIHNjcm9sbFk6IG51bWJlcjtcbiAgY3Vyc29yQnV0dG9uOiBcInVwXCIgfCBcImRvd25cIjtcbiAgc2Nyb2xsZWRPdXRzaWRlOiBib29sZWFuO1xuICBuYW1lOiBzdHJpbmc7XG4gIGlzUmVzaXppbmc6IGJvb2xlYW47XG4gIGlzUm90YXRpbmc6IGJvb2xlYW47XG4gIHpvb206IFpvb207XG4gIC8vIG1vYmlsZS1vbmx5XG4gIG9wZW5NZW51OiBcImNhbnZhc1wiIHwgXCJzaGFwZVwiIHwgbnVsbDtcbiAgb3BlblBvcHVwOlxuICAgIHwgXCJjYW52YXNDb2xvclBpY2tlclwiXG4gICAgfCBcImJhY2tncm91bmRDb2xvclBpY2tlclwiXG4gICAgfCBcInN0cm9rZUNvbG9yUGlja2VyXCJcbiAgICB8IG51bGw7XG4gIG9wZW5TaWRlYmFyOiBcImxpYnJhcnlcIiB8IFwiY3VzdG9tU2lkZWJhclwiIHwgbnVsbDtcbiAgb3BlbkRpYWxvZzogXCJpbWFnZUV4cG9ydFwiIHwgXCJoZWxwXCIgfCBcImpzb25FeHBvcnRcIiB8IG51bGw7XG4gIGlzU2lkZWJhckRvY2tlZDogYm9vbGVhbjtcblxuICBsYXN0UG9pbnRlckRvd25XaXRoOiBQb2ludGVyVHlwZTtcbiAgc2VsZWN0ZWRFbGVtZW50SWRzOiB7IFtpZDogc3RyaW5nXTogYm9vbGVhbiB9O1xuICBwcmV2aW91c1NlbGVjdGVkRWxlbWVudElkczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgc2hvdWxkQ2FjaGVJZ25vcmVab29tOiBib29sZWFuO1xuICB0b2FzdDogeyBtZXNzYWdlOiBzdHJpbmc7IGNsb3NhYmxlPzogYm9vbGVhbjsgZHVyYXRpb24/OiBudW1iZXIgfSB8IG51bGw7XG4gIHplbk1vZGVFbmFibGVkOiBib29sZWFuO1xuICB0aGVtZTogVGhlbWU7XG4gIGdyaWRTaXplOiBudW1iZXIgfCBudWxsO1xuICB2aWV3TW9kZUVuYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIHRvcC1tb3N0IHNlbGVjdGVkIGdyb3VwcyAoaS5lLiBkb2VzIG5vdCBpbmNsdWRlIG5lc3RlZCBncm91cHMpICovXG4gIHNlbGVjdGVkR3JvdXBJZHM6IHsgW2dyb3VwSWQ6IHN0cmluZ106IGJvb2xlYW4gfTtcbiAgLyoqIGdyb3VwIGJlaW5nIGVkaXRlZCB3aGVuIHlvdSBkcmlsbCBkb3duIHRvIGl0cyBjb25zdGl0dWVudCBlbGVtZW50XG4gICAgKGUuZy4gd2hlbiB5b3UgZG91YmxlLWNsaWNrIG9uIGEgZ3JvdXAncyBlbGVtZW50KSAqL1xuICBlZGl0aW5nR3JvdXBJZDogR3JvdXBJZCB8IG51bGw7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuXG4gIGZpbGVIYW5kbGU6IEZpbGVTeXN0ZW1IYW5kbGUgfCBudWxsO1xuICBjb2xsYWJvcmF0b3JzOiBNYXA8c3RyaW5nLCBDb2xsYWJvcmF0b3I+O1xuICBzaG93U3RhdHM6IGJvb2xlYW47XG4gIGN1cnJlbnRDaGFydFR5cGU6IENoYXJ0VHlwZTtcbiAgcGFzdGVEaWFsb2c6XG4gICAgfCB7XG4gICAgICAgIHNob3duOiBmYWxzZTtcbiAgICAgICAgZGF0YTogbnVsbDtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgc2hvd246IHRydWU7XG4gICAgICAgIGRhdGE6IFNwcmVhZHNoZWV0O1xuICAgICAgfTtcbiAgLyoqIGltYWdlRWxlbWVudCB3YWl0aW5nIHRvIGJlIHBsYWNlZCBvbiBjYW52YXMgKi9cbiAgcGVuZGluZ0ltYWdlRWxlbWVudElkOiBFeGNhbGlkcmF3SW1hZ2VFbGVtZW50W1wiaWRcIl0gfCBudWxsO1xuICBzaG93SHlwZXJsaW5rUG9wdXA6IGZhbHNlIHwgXCJpbmZvXCIgfCBcImVkaXRvclwiO1xuICBzZWxlY3RlZExpbmVhckVsZW1lbnQ6IExpbmVhckVsZW1lbnRFZGl0b3IgfCBudWxsO1xufTtcblxuZXhwb3J0IHR5cGUgTm9ybWFsaXplZFpvb21WYWx1ZSA9IG51bWJlciAmIHsgX2JyYW5kOiBcIm5vcm1hbGl6ZWRab29tXCIgfTtcblxuZXhwb3J0IHR5cGUgWm9vbSA9IFJlYWRvbmx5PHtcbiAgdmFsdWU6IE5vcm1hbGl6ZWRab29tVmFsdWU7XG59PjtcblxuZXhwb3J0IHR5cGUgUG9pbnRlckNvb3JkcyA9IFJlYWRvbmx5PHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59PjtcblxuZXhwb3J0IHR5cGUgR2VzdHVyZSA9IHtcbiAgcG9pbnRlcnM6IE1hcDxudW1iZXIsIFBvaW50ZXJDb29yZHM+O1xuICBsYXN0Q2VudGVyOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0gfCBudWxsO1xuICBpbml0aWFsRGlzdGFuY2U6IG51bWJlciB8IG51bGw7XG4gIGluaXRpYWxTY2FsZTogbnVtYmVyIHwgbnVsbDtcbn07XG5cbmV4cG9ydCBkZWNsYXJlIGNsYXNzIEdlc3R1cmVFdmVudCBleHRlbmRzIFVJRXZlbnQge1xuICByZWFkb25seSByb3RhdGlvbjogbnVtYmVyO1xuICByZWFkb25seSBzY2FsZTogbnVtYmVyO1xufVxuXG4vLyBsaWJyYXJpZXNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vKiogQGRlcHJlY2F0ZWQgbGVnYWN5OiBkbyBub3QgdXNlIG91dHNpZGUgb2YgbWlncmF0aW9uIHBhdGhzICovXG5leHBvcnQgdHlwZSBMaWJyYXJ5SXRlbV92MSA9IHJlYWRvbmx5IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W107XG4vKiogQGRlcHJlY2F0ZWQgbGVnYWN5OiBkbyBub3QgdXNlIG91dHNpZGUgb2YgbWlncmF0aW9uIHBhdGhzICovXG50eXBlIExpYnJhcnlJdGVtc192MSA9IHJlYWRvbmx5IExpYnJhcnlJdGVtX3YxW107XG5cbi8qKiB2MiBsaWJyYXJ5IGl0ZW0gKi9cbmV4cG9ydCB0eXBlIExpYnJhcnlJdGVtID0ge1xuICBpZDogc3RyaW5nO1xuICBzdGF0dXM6IFwicHVibGlzaGVkXCIgfCBcInVucHVibGlzaGVkXCI7XG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdO1xuICAvKiogdGltZXN0YW1wIGluIGVwb2NoIChtcykgKi9cbiAgY3JlYXRlZDogbnVtYmVyO1xuICBuYW1lPzogc3RyaW5nO1xuICBlcnJvcj86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBMaWJyYXJ5SXRlbXMgPSByZWFkb25seSBMaWJyYXJ5SXRlbVtdO1xuZXhwb3J0IHR5cGUgTGlicmFyeUl0ZW1zX2FueVZlcnNpb24gPSBMaWJyYXJ5SXRlbXMgfCBMaWJyYXJ5SXRlbXNfdjE7XG5cbmV4cG9ydCB0eXBlIExpYnJhcnlJdGVtc1NvdXJjZSA9XG4gIHwgKChcbiAgICAgIGN1cnJlbnRMaWJyYXJ5SXRlbXM6IExpYnJhcnlJdGVtcyxcbiAgICApID0+XG4gICAgICB8IEJsb2JcbiAgICAgIHwgTGlicmFyeUl0ZW1zX2FueVZlcnNpb25cbiAgICAgIHwgUHJvbWlzZTxMaWJyYXJ5SXRlbXNfYW55VmVyc2lvbiB8IEJsb2I+KVxuICB8IEJsb2JcbiAgfCBMaWJyYXJ5SXRlbXNfYW55VmVyc2lvblxuICB8IFByb21pc2U8TGlicmFyeUl0ZW1zX2FueVZlcnNpb24gfCBCbG9iPjtcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8vIE5PVEUgcmVhZHkvcmVhZHlQcm9taXNlIHByb3BzIGFyZSBvcHRpb25hbCBmb3IgaG9zdCBhcHBzJyBzYWtlIChvdXIgb3duXG4vLyBpbXBsZW0gZ3VhcmFudGVlcyBleGlzdGVuY2UpXG5leHBvcnQgdHlwZSBFeGNhbGlkcmF3QVBJUmVmVmFsdWUgPVxuICB8IEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJXG4gIHwge1xuICAgICAgcmVhZHlQcm9taXNlPzogUmVzb2x2YWJsZVByb21pc2U8RXhjYWxpZHJhd0ltcGVyYXRpdmVBUEk+O1xuICAgICAgcmVhZHk/OiBmYWxzZTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBFeGNhbGlkcmF3SW5pdGlhbERhdGFTdGF0ZSA9IE1lcmdlPFxuICBJbXBvcnRlZERhdGFTdGF0ZSxcbiAge1xuICAgIGxpYnJhcnlJdGVtcz86XG4gICAgICB8IFJlcXVpcmVkPEltcG9ydGVkRGF0YVN0YXRlPltcImxpYnJhcnlJdGVtc1wiXVxuICAgICAgfCBQcm9taXNlPFJlcXVpcmVkPEltcG9ydGVkRGF0YVN0YXRlPltcImxpYnJhcnlJdGVtc1wiXT47XG4gIH1cbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhjYWxpZHJhd1Byb3BzIHtcbiAgb25DaGFuZ2U/OiAoXG4gICAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgKSA9PiB2b2lkO1xuICBpbml0aWFsRGF0YT86XG4gICAgfCBFeGNhbGlkcmF3SW5pdGlhbERhdGFTdGF0ZVxuICAgIHwgbnVsbFxuICAgIHwgUHJvbWlzZTxFeGNhbGlkcmF3SW5pdGlhbERhdGFTdGF0ZSB8IG51bGw+O1xuICBleGNhbGlkcmF3UmVmPzogRm9yd2FyZFJlZjxFeGNhbGlkcmF3QVBJUmVmVmFsdWU+O1xuICBpc0NvbGxhYm9yYXRpbmc/OiBib29sZWFuO1xuICBvblBvaW50ZXJVcGRhdGU/OiAocGF5bG9hZDoge1xuICAgIHBvaW50ZXI6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgICBidXR0b246IFwiZG93blwiIHwgXCJ1cFwiO1xuICAgIHBvaW50ZXJzTWFwOiBHZXN0dXJlW1wicG9pbnRlcnNcIl07XG4gIH0pID0+IHZvaWQ7XG4gIG9uUGFzdGU/OiAoXG4gICAgZGF0YTogQ2xpcGJvYXJkRGF0YSxcbiAgICBldmVudDogQ2xpcGJvYXJkRXZlbnQgfCBudWxsLFxuICApID0+IFByb21pc2U8Ym9vbGVhbj4gfCBib29sZWFuO1xuICByZW5kZXJUb3BSaWdodFVJPzogKFxuICAgIGlzTW9iaWxlOiBib29sZWFuLFxuICAgIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgKSA9PiBKU1guRWxlbWVudCB8IG51bGw7XG4gIGxhbmdDb2RlPzogTGFuZ3VhZ2VbXCJjb2RlXCJdO1xuICB2aWV3TW9kZUVuYWJsZWQ/OiBib29sZWFuO1xuICB6ZW5Nb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIGdyaWRNb2RlRW5hYmxlZD86IGJvb2xlYW47XG4gIGxpYnJhcnlSZXR1cm5Vcmw/OiBzdHJpbmc7XG4gIHRoZW1lPzogVGhlbWU7XG4gIG5hbWU/OiBzdHJpbmc7XG4gIHJlbmRlckN1c3RvbVN0YXRzPzogKFxuICAgIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICkgPT4gSlNYLkVsZW1lbnQ7XG4gIFVJT3B0aW9ucz86IFBhcnRpYWw8VUlPcHRpb25zPjtcbiAgZGV0ZWN0U2Nyb2xsPzogYm9vbGVhbjtcbiAgaGFuZGxlS2V5Ym9hcmRHbG9iYWxseT86IGJvb2xlYW47XG4gIG9uTGlicmFyeUNoYW5nZT86IChsaWJyYXJ5SXRlbXM6IExpYnJhcnlJdGVtcykgPT4gdm9pZCB8IFByb21pc2U8YW55PjtcbiAgYXV0b0ZvY3VzPzogYm9vbGVhbjtcbiAgZ2VuZXJhdGVJZEZvckZpbGU/OiAoZmlsZTogRmlsZSkgPT4gc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+O1xuICBvbkxpbmtPcGVuPzogKFxuICAgIGVsZW1lbnQ6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgICBldmVudDogQ3VzdG9tRXZlbnQ8e1xuICAgICAgbmF0aXZlRXZlbnQ6IE1vdXNlRXZlbnQgfCBSZWFjdC5Qb2ludGVyRXZlbnQ8SFRNTENhbnZhc0VsZW1lbnQ+O1xuICAgIH0+LFxuICApID0+IHZvaWQ7XG4gIG9uUG9pbnRlckRvd24/OiAoXG4gICAgYWN0aXZlVG9vbDogQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdLFxuICAgIHBvaW50ZXJEb3duU3RhdGU6IFBvaW50ZXJEb3duU3RhdGUsXG4gICkgPT4gdm9pZDtcbiAgb25TY3JvbGxDaGFuZ2U/OiAoc2Nyb2xsWDogbnVtYmVyLCBzY3JvbGxZOiBudW1iZXIpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBSZW5kZXIgZnVuY3Rpb24gdGhhdCByZW5kZXJzIGN1c3RvbSA8U2lkZWJhciAvPiBjb21wb25lbnQuXG4gICAqL1xuICByZW5kZXJTaWRlYmFyPzogKCkgPT4gSlNYLkVsZW1lbnQgfCBudWxsO1xuICBjaGlsZHJlbj86IFJlYWN0LlJlYWN0Tm9kZTtcbn1cblxuZXhwb3J0IHR5cGUgU2NlbmVEYXRhID0ge1xuICBlbGVtZW50cz86IEltcG9ydGVkRGF0YVN0YXRlW1wiZWxlbWVudHNcIl07XG4gIGFwcFN0YXRlPzogSW1wb3J0ZWREYXRhU3RhdGVbXCJhcHBTdGF0ZVwiXTtcbiAgY29sbGFib3JhdG9ycz86IE1hcDxzdHJpbmcsIENvbGxhYm9yYXRvcj47XG4gIGNvbW1pdFRvSGlzdG9yeT86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgZW51bSBVc2VySWRsZVN0YXRlIHtcbiAgQUNUSVZFID0gXCJhY3RpdmVcIixcbiAgQVdBWSA9IFwiYXdheVwiLFxuICBJRExFID0gXCJpZGxlXCIsXG59XG5cbmV4cG9ydCB0eXBlIEV4cG9ydE9wdHMgPSB7XG4gIHNhdmVGaWxlVG9EaXNrPzogYm9vbGVhbjtcbiAgb25FeHBvcnRUb0JhY2tlbmQ/OiAoXG4gICAgZXhwb3J0ZWRFbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gICAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICAgIGZpbGVzOiBCaW5hcnlGaWxlcyxcbiAgICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgKSA9PiB2b2lkO1xuICByZW5kZXJDdXN0b21VST86IChcbiAgICBleHBvcnRlZEVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gICAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICAgIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICApID0+IEpTWC5FbGVtZW50O1xufTtcblxuLy8gTk9URSBhdCB0aGUgbW9tZW50LCBpZiBhY3Rpb24gbmFtZSBjb3Jlc3Nwb25kcyB0byBjYW52YXNBY3Rpb24gcHJvcCwgaXRzXG4vLyB0cnV0aGluZXNzIHZhbHVlIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFjdGlvbiBpcyByZW5kZXJlZCBvciBub3Rcbi8vIChzZWUgbWFuYWdlciByZW5kZXJBY3Rpb24pLiBXZSBhbHNvIG92ZXJyaWRlIGNhbnZhc0FjdGlvbiB2YWx1ZXMgaW5cbi8vIGV4Y2FsaWRyYXcgcGFja2FnZSBpbmRleC50c3guXG50eXBlIENhbnZhc0FjdGlvbnMgPSBQYXJ0aWFsPHtcbiAgY2hhbmdlVmlld0JhY2tncm91bmRDb2xvcjogYm9vbGVhbjtcbiAgY2xlYXJDYW52YXM6IGJvb2xlYW47XG4gIGV4cG9ydDogZmFsc2UgfCBFeHBvcnRPcHRzO1xuICBsb2FkU2NlbmU6IGJvb2xlYW47XG4gIHNhdmVUb0FjdGl2ZUZpbGU6IGJvb2xlYW47XG4gIHRvZ2dsZVRoZW1lOiBib29sZWFuIHwgbnVsbDtcbiAgc2F2ZUFzSW1hZ2U6IGJvb2xlYW47XG59PjtcblxudHlwZSBVSU9wdGlvbnMgPSBQYXJ0aWFsPHtcbiAgZG9ja2VkU2lkZWJhckJyZWFrcG9pbnQ6IG51bWJlcjtcbiAgY2FudmFzQWN0aW9uczogQ2FudmFzQWN0aW9ucztcbiAgLyoqIEBkZXByZWNhdGVkIGRvZXMgbm90aGluZy4gV2lsbCBiZSByZW1vdmVkIGluIDAuMTUgKi9cbiAgd2VsY29tZVNjcmVlbj86IGJvb2xlYW47XG59PjtcblxuZXhwb3J0IHR5cGUgQXBwUHJvcHMgPSBNZXJnZTxcbiAgRXhjYWxpZHJhd1Byb3BzLFxuICB7XG4gICAgVUlPcHRpb25zOiBNZXJnZTxcbiAgICAgIFVJT3B0aW9ucyxcbiAgICAgIHtcbiAgICAgICAgY2FudmFzQWN0aW9uczogUmVxdWlyZWQ8Q2FudmFzQWN0aW9ucz4gJiB7IGV4cG9ydDogRXhwb3J0T3B0cyB9O1xuICAgICAgfVxuICAgID47XG4gICAgZGV0ZWN0U2Nyb2xsOiBib29sZWFuO1xuICAgIGhhbmRsZUtleWJvYXJkR2xvYmFsbHk6IGJvb2xlYW47XG4gICAgaXNDb2xsYWJvcmF0aW5nOiBib29sZWFuO1xuICAgIGNoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlO1xuICB9XG4+O1xuXG4vKiogQSBzdWJzZXQgb2YgQXBwIGNsYXNzIHByb3BlcnRpZXMgdGhhdCB3ZSBuZWVkIHRvIHVzZSBlbHNld2hlcmVcbiAqIGluIHRoZSBhcHAsIGVnIE1hbmFnZXIuIEZhY3RvcmVkIG91dCBpbnRvIGEgc2VwYXJhdGUgdHlwZSB0byBrZWVwIERSWS4gKi9cbmV4cG9ydCB0eXBlIEFwcENsYXNzUHJvcGVydGllcyA9IHtcbiAgcHJvcHM6IEFwcFByb3BzO1xuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbDtcbiAgZm9jdXNDb250YWluZXIoKTogdm9pZDtcbiAgbGlicmFyeTogTGlicmFyeTtcbiAgaW1hZ2VDYWNoZTogTWFwPFxuICAgIEZpbGVJZCxcbiAgICB7XG4gICAgICBpbWFnZTogSFRNTEltYWdlRWxlbWVudCB8IFByb21pc2U8SFRNTEltYWdlRWxlbWVudD47XG4gICAgICBtaW1lVHlwZTogdHlwZW9mIEFMTE9XRURfSU1BR0VfTUlNRV9UWVBFU1tudW1iZXJdO1xuICAgIH1cbiAgPjtcbiAgZmlsZXM6IEJpbmFyeUZpbGVzO1xuICBkZXZpY2U6IEFwcFtcImRldmljZVwiXTtcbiAgc2NlbmU6IEFwcFtcInNjZW5lXCJdO1xuICBwYXN0ZUZyb21DbGlwYm9hcmQ6IEFwcFtcInBhc3RlRnJvbUNsaXBib2FyZFwiXTtcbn07XG5cbmV4cG9ydCB0eXBlIFBvaW50ZXJEb3duU3RhdGUgPSBSZWFkb25seTx7XG4gIC8vIFRoZSBmaXJzdCBwb3NpdGlvbiBhdCB3aGljaCBwb2ludGVyRG93biBoYXBwZW5lZFxuICBvcmlnaW46IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT47XG4gIC8vIFNhbWUgYXMgXCJvcmlnaW5cIiBidXQgc25hcHBlZCB0byB0aGUgZ3JpZCwgaWYgZ3JpZCBpcyBvblxuICBvcmlnaW5JbkdyaWQ6IFJlYWRvbmx5PHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfT47XG4gIC8vIFNjcm9sbGJhciBjaGVja3NcbiAgc2Nyb2xsYmFyczogUmV0dXJuVHlwZTx0eXBlb2YgaXNPdmVyU2Nyb2xsQmFycz47XG4gIC8vIFRoZSBwcmV2aW91cyBwb2ludGVyIHBvc2l0aW9uXG4gIGxhc3RDb29yZHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgLy8gbWFwIG9mIG9yaWdpbmFsIGVsZW1lbnRzIGRhdGFcbiAgb3JpZ2luYWxFbGVtZW50czogTWFwPHN0cmluZywgTm9uRGVsZXRlZDxFeGNhbGlkcmF3RWxlbWVudD4+O1xuICByZXNpemU6IHtcbiAgICAvLyBIYW5kbGUgd2hlbiByZXNpemluZywgbWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICAgIGhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZTtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgaXNSZXNpemluZzogYm9vbGVhbjtcbiAgICAvLyBUaGlzIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb2Zmc2V0OiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH07XG4gICAgLy8gVGhpcyBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIGFycm93RGlyZWN0aW9uOiBcIm9yaWdpblwiIHwgXCJlbmRcIjtcbiAgICAvLyBUaGlzIGlzIGEgY2VudGVyIHBvaW50IG9mIHNlbGVjdGVkIGVsZW1lbnRzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50IChmb3Igcm90YXRpb24gb25seSlcbiAgICBjZW50ZXI6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfTtcbiAgfTtcbiAgaGl0OiB7XG4gICAgLy8gVGhlIGVsZW1lbnQgdGhlIHBvaW50ZXIgaXMgXCJoaXR0aW5nXCIsIGlzIGRldGVybWluZWQgb24gdGhlIGluaXRpYWxcbiAgICAvLyBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBlbGVtZW50OiBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PiB8IG51bGw7XG4gICAgLy8gVGhlIGVsZW1lbnRzIHRoZSBwb2ludGVyIGlzIFwiaGl0dGluZ1wiLCBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsXG4gICAgLy8gcG9pbnRlciBkb3duIGV2ZW50XG4gICAgYWxsSGl0RWxlbWVudHM6IE5vbkRlbGV0ZWQ8RXhjYWxpZHJhd0VsZW1lbnQ+W107XG4gICAgLy8gVGhpcyBpcyBkZXRlcm1pbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIHdhc0FkZGVkVG9TZWxlY3Rpb246IGJvb2xlYW47XG4gICAgLy8gV2hldGhlciBzZWxlY3RlZCBlbGVtZW50KHMpIHdlcmUgZHVwbGljYXRlZCwgbWlnaHQgY2hhbmdlIGR1cmluZyB0aGVcbiAgICAvLyBwb2ludGVyIGludGVyYWN0aW9uXG4gICAgaGFzQmVlbkR1cGxpY2F0ZWQ6IGJvb2xlYW47XG4gICAgaGFzSGl0Q29tbW9uQm91bmRpbmdCb3hPZlNlbGVjdGVkRWxlbWVudHM6IGJvb2xlYW47XG4gIH07XG4gIHdpdGhDbWRPckN0cmw6IGJvb2xlYW47XG4gIGRyYWc6IHtcbiAgICAvLyBNaWdodCBjaGFuZ2UgZHVyaW5nIHRoZSBwb2ludGVyIGludGVyYWN0aW9uXG4gICAgaGFzT2NjdXJyZWQ6IGJvb2xlYW47XG4gICAgLy8gTWlnaHQgY2hhbmdlIGR1cmluZyB0aGUgcG9pbnRlciBpbnRlcmFjdGlvblxuICAgIG9mZnNldDogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9IHwgbnVsbDtcbiAgfTtcbiAgLy8gV2UgbmVlZCB0byBoYXZlIHRoZXNlIGluIHRoZSBzdGF0ZSBzbyB0aGF0IHdlIGNhbiB1bnN1YnNjcmliZSB0aGVtXG4gIGV2ZW50TGlzdGVuZXJzOiB7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uTW92ZTogbnVsbCB8IFJldHVyblR5cGU8dHlwZW9mIHRocm90dGxlUkFGPjtcbiAgICAvLyBJdCdzIGRlZmluZWQgb24gdGhlIGluaXRpYWwgcG9pbnRlciBkb3duIGV2ZW50XG4gICAgb25VcDogbnVsbCB8ICgoZXZlbnQ6IFBvaW50ZXJFdmVudCkgPT4gdm9pZCk7XG4gICAgLy8gSXQncyBkZWZpbmVkIG9uIHRoZSBpbml0aWFsIHBvaW50ZXIgZG93biBldmVudFxuICAgIG9uS2V5RG93bjogbnVsbCB8ICgoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IHZvaWQpO1xuICAgIC8vIEl0J3MgZGVmaW5lZCBvbiB0aGUgaW5pdGlhbCBwb2ludGVyIGRvd24gZXZlbnRcbiAgICBvbktleVVwOiBudWxsIHwgKChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCk7XG4gIH07XG4gIGJveFNlbGVjdGlvbjoge1xuICAgIGhhc09jY3VycmVkOiBib29sZWFuO1xuICB9O1xuICBlbGVtZW50SWRzVG9FcmFzZToge1xuICAgIFtrZXk6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl1dOiB7XG4gICAgICBvcGFjaXR5OiBFeGNhbGlkcmF3RWxlbWVudFtcIm9wYWNpdHlcIl07XG4gICAgICBlcmFzZTogYm9vbGVhbjtcbiAgICB9O1xuICB9O1xufT47XG5cbmV4cG9ydCB0eXBlIEV4Y2FsaWRyYXdJbXBlcmF0aXZlQVBJID0ge1xuICB1cGRhdGVTY2VuZTogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1widXBkYXRlU2NlbmVcIl07XG4gIHVwZGF0ZUxpYnJhcnk6IEluc3RhbmNlVHlwZTx0eXBlb2YgTGlicmFyeT5bXCJ1cGRhdGVMaWJyYXJ5XCJdO1xuICByZXNldFNjZW5lOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZXNldFNjZW5lXCJdO1xuICBnZXRTY2VuZUVsZW1lbnRzSW5jbHVkaW5nRGVsZXRlZDogSW5zdGFuY2VUeXBlPFxuICAgIHR5cGVvZiBBcHBcbiAgPltcImdldFNjZW5lRWxlbWVudHNJbmNsdWRpbmdEZWxldGVkXCJdO1xuICBoaXN0b3J5OiB7XG4gICAgY2xlYXI6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInJlc2V0SGlzdG9yeVwiXTtcbiAgfTtcbiAgc2Nyb2xsVG9Db250ZW50OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzY3JvbGxUb0NvbnRlbnRcIl07XG4gIGdldFNjZW5lRWxlbWVudHM6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImdldFNjZW5lRWxlbWVudHNcIl07XG4gIGdldEFwcFN0YXRlOiAoKSA9PiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzdGF0ZVwiXTtcbiAgZ2V0RmlsZXM6ICgpID0+IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcImZpbGVzXCJdO1xuICByZWZyZXNoOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJyZWZyZXNoXCJdO1xuICBzZXRUb2FzdDogSW5zdGFuY2VUeXBlPHR5cGVvZiBBcHA+W1wic2V0VG9hc3RcIl07XG4gIGFkZEZpbGVzOiAoZGF0YTogQmluYXJ5RmlsZURhdGFbXSkgPT4gdm9pZDtcbiAgcmVhZHlQcm9taXNlOiBSZXNvbHZhYmxlUHJvbWlzZTxFeGNhbGlkcmF3SW1wZXJhdGl2ZUFQST47XG4gIHJlYWR5OiB0cnVlO1xuICBpZDogc3RyaW5nO1xuICBzZXRBY3RpdmVUb29sOiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJzZXRBY3RpdmVUb29sXCJdO1xuICBzZXRDdXJzb3I6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInNldEN1cnNvclwiXTtcbiAgcmVzZXRDdXJzb3I6IEluc3RhbmNlVHlwZTx0eXBlb2YgQXBwPltcInJlc2V0Q3Vyc29yXCJdO1xuICB0b2dnbGVNZW51OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEFwcD5bXCJ0b2dnbGVNZW51XCJdO1xufTtcblxuZXhwb3J0IHR5cGUgRGV2aWNlID0gUmVhZG9ubHk8e1xuICBpc1NtU2NyZWVuOiBib29sZWFuO1xuICBpc01vYmlsZTogYm9vbGVhbjtcbiAgaXNUb3VjaFNjcmVlbjogYm9vbGVhbjtcbiAgY2FuRGV2aWNlRml0U2lkZWJhcjogYm9vbGVhbjtcbn0+O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../types.ts\n");
|
|
3970
3970
|
|
|
3971
3971
|
/***/ }),
|
|
3972
3972
|
|
|
@@ -3977,7 +3977,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3977
3977
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3978
3978
|
|
|
3979
3979
|
"use strict";
|
|
3980
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"arrayToMapWithIndex\": () => (/* binding */ arrayToMapWithIndex),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"composeEventHandlers\": () => (/* binding */ composeEventHandlers),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isShallowEqual\": () => (/* binding */ isShallowEqual),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./appState */ \"../../appState.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveTool: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveTool\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_4__.isHandToolActive)(appState)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.GRAB;\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_4__.isEraserActive)(appState)) {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst arrayToMapWithIndex = (elements) => elements.reduce((acc, element, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n}, new Map());\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-cef6094\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-cef6094\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\nconst isShallowEqual = (objA, objB) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objA);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every((key) => objA[key] === objB[key]);\n};\n// taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n if (!checkForDefaultPrevented ||\n !event.defaultPrevented) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIGlzRGFyd2luLFxuICBNSU1FX1RZUEVTLFxuICBUSEVNRSxcbiAgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05ULFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZvbnRGYW1pbHlWYWx1ZXMsIEZvbnRTdHJpbmcgfSBmcm9tIFwiLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgRGF0YVVSTCwgTGFzdEFjdGl2ZVRvb2wsIFpvb20gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBTSEFQRVMgfSBmcm9tIFwiLi9zaGFwZXNcIjtcbmltcG9ydCB7IGlzRXJhc2VyQWN0aXZlLCBpc0hhbmRUb29sQWN0aXZlIH0gZnJvbSBcIi4vYXBwU3RhdGVcIjtcblxubGV0IG1vY2tEYXRlVGltZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbmV4cG9ydCBjb25zdCBzZXREYXRlVGltZUZvclRlc3RzID0gKGRhdGVUaW1lOiBzdHJpbmcpID0+IHtcbiAgbW9ja0RhdGVUaW1lID0gZGF0ZVRpbWU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RGF0ZVRpbWUgPSAoKSA9PiB7XG4gIGlmIChtb2NrRGF0ZVRpbWUpIHtcbiAgICByZXR1cm4gbW9ja0RhdGVUaW1lO1xuICB9XG5cbiAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gIGNvbnN0IG1vbnRoID0gYCR7ZGF0ZS5nZXRNb250aCgpICsgMX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgZGF5ID0gYCR7ZGF0ZS5nZXREYXRlKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGhyID0gYCR7ZGF0ZS5nZXRIb3VycygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBtaW4gPSBgJHtkYXRlLmdldE1pbnV0ZXMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcblxuICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9LSR7aHJ9JHttaW59YDtcbn07XG5cbmV4cG9ydCBjb25zdCBjYXBpdGFsaXplU3RyaW5nID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSk7XG5cbmV4cG9ydCBjb25zdCBpc1Rvb2xJY29uID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXMgSFRNTEVsZW1lbnQgPT5cbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmNsYXNzTmFtZS5pbmNsdWRlcyhcIlRvb2xJY29uXCIpO1xuXG5leHBvcnQgY29uc3QgaXNJbnB1dExpa2UgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTFNlbGVjdEVsZW1lbnRcbiAgfCBIVE1MQlJFbGVtZW50XG4gIHwgSFRNTERpdkVsZW1lbnQgPT5cbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiKSB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFNlbGVjdEVsZW1lbnQ7XG5cbmV4cG9ydCBjb25zdCBpc1dyaXRhYmxlRWxlbWVudCA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MQlJFbGVtZW50XG4gIHwgSFRNTERpdkVsZW1lbnQgPT5cbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5kYXRhc2V0LnR5cGUgPT09IFwid3lzaXd5Z1wiKSB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MQlJFbGVtZW50IHx8IC8vIG5ld2xpbmUgaW4gd3lzaXd5Z1xuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgKHRhcmdldC50eXBlID09PSBcInRleHRcIiB8fCB0YXJnZXQudHlwZSA9PT0gXCJudW1iZXJcIikpO1xuXG5leHBvcnQgY29uc3QgZ2V0Rm9udEZhbWlseVN0cmluZyA9ICh7XG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIGZvciAoY29uc3QgW2ZvbnRGYW1pbHlTdHJpbmcsIGlkXSBvZiBPYmplY3QuZW50cmllcyhGT05UX0ZBTUlMWSkpIHtcbiAgICBpZiAoaWQgPT09IGZvbnRGYW1pbHkpIHtcbiAgICAgIHJldHVybiBgJHtmb250RmFtaWx5U3RyaW5nfSwgJHtXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlR9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFdJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVDtcbn07XG5cbi8qKiByZXR1cm5zIGZvbnRTaXplK2ZvbnRGYW1pbHkgc3RyaW5nIGZvciBhc3NpZ25tZW50IHRvIERPTSBlbGVtZW50cyAqL1xuZXhwb3J0IGNvbnN0IGdldEZvbnRTdHJpbmcgPSAoe1xuICBmb250U2l6ZSxcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udFNpemU6IG51bWJlcjtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgcmV0dXJuIGAke2ZvbnRTaXplfXB4ICR7Z2V0Rm9udEZhbWlseVN0cmluZyh7IGZvbnRGYW1pbHkgfSl9YCBhcyBGb250U3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IGRlYm91bmNlID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgdGltZW91dDogbnVtYmVyLFxuKSA9PiB7XG4gIGxldCBoYW5kbGUgPSAwO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaGFuZGxlID0gd2luZG93LnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgfSwgdGltZW91dCk7XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGNvbnN0IF9sYXN0QXJncyA9IGxhc3RBcmdzO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgZm4oLi4uX2xhc3RBcmdzKTtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICB9O1xuICByZXR1cm4gcmV0O1xufTtcblxuLy8gdGhyb3R0bGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSBvbmNlIHBlciBhbmltYXRpb24gZnJhbWVcbmV4cG9ydCBjb25zdCB0aHJvdHRsZVJBRiA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIG9wdHM/OiB7IHRyYWlsaW5nPzogYm9vbGVhbiB9LFxuKSA9PiB7XG4gIGxldCB0aW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnc1RyYWlsaW5nOiBUIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3Qgc2NoZWR1bGVGdW5jID0gKGFyZ3M6IFQpID0+IHtcbiAgICB0aW1lcklkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgbGFzdEFyZ3MgPSBudWxsO1xuICAgICAgaWYgKGxhc3RBcmdzVHJhaWxpbmcpIHtcbiAgICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nO1xuICAgICAgICBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICAgICAgc2NoZWR1bGVGdW5jKGxhc3RBcmdzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gXCJ0ZXN0XCIpIHtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsYXN0QXJncyA9IGFyZ3M7XG4gICAgaWYgKHRpbWVySWQgPT09IG51bGwpIHtcbiAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgfSBlbHNlIGlmIChvcHRzPy50cmFpbGluZykge1xuICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IGFyZ3M7XG4gICAgfVxuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgZm4oLi4uKGxhc3RBcmdzVHJhaWxpbmcgfHwgbGFzdEFyZ3MpKTtcbiAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgaWYgKHRpbWVySWQgIT09IG51bGwpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRpbWVySWQpO1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgfVxuICB9O1xuICByZXR1cm4gcmV0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2xvZGFzaC9sb2Rhc2gvYmxvYi9lcy9jaHVuay5qc1xuZXhwb3J0IGNvbnN0IGNodW5rID0gPFQgZXh0ZW5kcyBhbnk+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBzaXplOiBudW1iZXIsXG4pOiBUW11bXSA9PiB7XG4gIGlmICghYXJyYXkubGVuZ3RoIHx8IHNpemUgPCAxKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCByZXNJbmRleCA9IDA7XG4gIGNvbnN0IHJlc3VsdCA9IEFycmF5KE1hdGguY2VpbChhcnJheS5sZW5ndGggLyBzaXplKSk7XG4gIHdoaWxlIChpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGFycmF5LnNsaWNlKGluZGV4LCAoaW5kZXggKz0gc2l6ZSkpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0Tm9kZSA9IChub2RlOiBFbGVtZW50KSA9PiB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICByYW5nZS5zZWxlY3ROb2RlQ29udGVudHMobm9kZSk7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCByZW1vdmVTZWxlY3Rpb24gPSAoKSA9PiB7XG4gIGNvbnN0IHNlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKTtcbiAgaWYgKHNlbGVjdGlvbikge1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGRpc3RhbmNlID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBNYXRoLmFicyh4IC0geSk7XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVBY3RpdmVUb29sID0gKFxuICBhcHBTdGF0ZTogUGljazxBcHBTdGF0ZSwgXCJhY3RpdmVUb29sXCI+LFxuICBkYXRhOiAoXG4gICAgfCB7IHR5cGU6IHR5cGVvZiBTSEFQRVNbbnVtYmVyXVtcInZhbHVlXCJdIHwgXCJlcmFzZXJcIiB8IFwiaGFuZFwiIH1cbiAgICB8IHsgdHlwZTogXCJjdXN0b21cIjsgY3VzdG9tVHlwZTogc3RyaW5nIH1cbiAgKSAmIHsgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI/OiBMYXN0QWN0aXZlVG9vbCB9LFxuKTogQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdID0+IHtcbiAgaWYgKGRhdGEudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIGN1c3RvbVR5cGU6IGRhdGEuY3VzdG9tVHlwZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgIGxhc3RBY3RpdmVUb29sOlxuICAgICAgZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbFxuICAgICAgICA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBcIlwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLCBjdXJzb3I6IHN0cmluZykgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgfVxufTtcblxubGV0IGVyYXNlckNhbnZhc0NhY2hlOiBhbnk7XG5sZXQgcHJldmlld0RhdGFVUkw6IHN0cmluZztcbmV4cG9ydCBjb25zdCBzZXRFcmFzZXJDdXJzb3IgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICB0aGVtZTogQXBwU3RhdGVbXCJ0aGVtZVwiXSxcbikgPT4ge1xuICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDIwO1xuXG4gIGNvbnN0IGRyYXdDYW52YXMgPSAoKSA9PiB7XG4gICAgY29uc3QgaXNEYXJrVGhlbWUgPSB0aGVtZSA9PT0gVEhFTUUuREFSSztcbiAgICBlcmFzZXJDYW52YXNDYWNoZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgPSB0aGVtZTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGNvbnN0IGNvbnRleHQgPSBlcmFzZXJDYW52YXNDYWNoZS5nZXRDb250ZXh0KFwiMmRcIikhO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuYXJjKFxuICAgICAgZXJhc2VyQ2FudmFzQ2FjaGUud2lkdGggLyAyLFxuICAgICAgZXJhc2VyQ2FudmFzQ2FjaGUuaGVpZ2h0IC8gMixcbiAgICAgIDUsXG4gICAgICAwLFxuICAgICAgMiAqIE1hdGguUEksXG4gICAgKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpIGFzIERhdGFVUkw7XG4gIH07XG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKFxuICAgIGNhbnZhcyxcbiAgICBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSAke2N1cnNvckltYWdlU2l6ZVB4IC8gMn0gJHtcbiAgICAgIGN1cnNvckltYWdlU2l6ZVB4IC8gMlxuICAgIH0sIGF1dG9gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEN1cnNvckZvclNoYXBlID0gKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICByZXNldEN1cnNvcihjYW52YXMpO1xuICB9IGVsc2UgaWYgKGlzSGFuZFRvb2xBY3RpdmUoYXBwU3RhdGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkdSQUI7XG4gIH0gZWxzZSBpZiAoaXNFcmFzZXJBY3RpdmUoYXBwU3RhdGUpKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIik7XG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9naSwgXCJDbWRcIilcbiAgICAgIC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJPcHRpb25cIik7XG4gIH1cbiAgcmV0dXJuIHNob3J0Y3V0LnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9naSwgXCJDdHJsXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHZpZXdwb3J0Q29vcmRzVG9TY2VuZUNvb3JkcyA9IChcbiAgeyBjbGllbnRYLCBjbGllbnRZIH06IHsgY2xpZW50WDogbnVtYmVyOyBjbGllbnRZOiBudW1iZXIgfSxcbiAge1xuICAgIHpvb20sXG4gICAgb2Zmc2V0TGVmdCxcbiAgICBvZmZzZXRUb3AsXG4gICAgc2Nyb2xsWCxcbiAgICBzY3JvbGxZLFxuICB9OiB7XG4gICAgem9vbTogWm9vbTtcbiAgICBvZmZzZXRMZWZ0OiBudW1iZXI7XG4gICAgb2Zmc2V0VG9wOiBudW1iZXI7XG4gICAgc2Nyb2xsWDogbnVtYmVyO1xuICAgIHNjcm9sbFk6IG51bWJlcjtcbiAgfSxcbikgPT4ge1xuICBjb25zdCB4ID0gKGNsaWVudFggLSBvZmZzZXRMZWZ0KSAvIHpvb20udmFsdWUgLSBzY3JvbGxYO1xuICBjb25zdCB5ID0gKGNsaWVudFkgLSBvZmZzZXRUb3ApIC8gem9vbS52YWx1ZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcFdpdGhJbmRleCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0+KFxuICBlbGVtZW50czogcmVhZG9ubHkgVFtdLFxuKSA9PlxuICBlbGVtZW50cy5yZWR1Y2UoKGFjYywgZWxlbWVudDogVCwgaWR4KSA9PiB7XG4gICAgYWNjLnNldChlbGVtZW50LmlkLCBbZWxlbWVudCwgaWR4XSk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcDxzdHJpbmcsIFtlbGVtZW50OiBULCBpbmRleDogbnVtYmVyXT4oKSk7XG5cbmV4cG9ydCBjb25zdCBpc1Rlc3RFbnYgPSAoKSA9PlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uTk9ERV9FTlYgPT09IFwidGVzdFwiO1xuXG5leHBvcnQgY29uc3QgaXNQcm9kRW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIjtcblxuZXhwb3J0IGNvbnN0IHdyYXBFdmVudCA9IDxUIGV4dGVuZHMgRXZlbnQ+KG5hbWU6IEVWRU5ULCBuYXRpdmVFdmVudDogVCkgPT4ge1xuICByZXR1cm4gbmV3IEN1c3RvbUV2ZW50KG5hbWUsIHtcbiAgICBkZXRhaWw6IHtcbiAgICAgIG5hdGl2ZUV2ZW50LFxuICAgIH0sXG4gICAgY2FuY2VsYWJsZTogdHJ1ZSxcbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgdXBkYXRlT2JqZWN0ID0gPFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCBhbnk+PihcbiAgb2JqOiBULFxuICB1cGRhdGVzOiBQYXJ0aWFsPFQ+LFxuKTogVCA9PiB7XG4gIGxldCBkaWRDaGFuZ2UgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBrZXkgaW4gdXBkYXRlcykge1xuICAgIGNvbnN0IHZhbHVlID0gKHVwZGF0ZXMgYXMgYW55KVtrZXldO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgIGlmIChcbiAgICAgICAgKG9iaiBhcyBhbnkpW2tleV0gPT09IHZhbHVlICYmXG4gICAgICAgIC8vIGlmIG9iamVjdCwgYWx3YXlzIHVwZGF0ZSBiZWNhdXNlIGl0cyBhdHRycyBjb3VsZCBoYXZlIGNoYW5nZWRcbiAgICAgICAgKHR5cGVvZiB2YWx1ZSAhPT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbClcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGRpZENoYW5nZSA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFkaWRDaGFuZ2UpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5vYmosXG4gICAgLi4udXBkYXRlcyxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1ByaW1pdGl2ZSA9ICh2YWw6IGFueSkgPT4ge1xuICBjb25zdCB0eXBlID0gdHlwZW9mIHZhbDtcbiAgcmV0dXJuIHZhbCA9PSBudWxsIHx8ICh0eXBlICE9PSBcIm9iamVjdFwiICYmIHR5cGUgIT09IFwiZnVuY3Rpb25cIik7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RnJhbWUgPSAoKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHdpbmRvdy5zZWxmID09PSB3aW5kb3cudG9wID8gXCJ0b3BcIiA6IFwiaWZyYW1lXCI7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIFwiaWZyYW1lXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc1Byb21pc2VMaWtlID0gKFxuICB2YWx1ZTogYW55LFxuKTogdmFsdWUgaXMgUHJvbWlzZTxSZXNvbHV0aW9uVHlwZTx0eXBlb2YgdmFsdWU+PiA9PiB7XG4gIHJldHVybiAoXG4gICAgISF2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIFwidGhlblwiIGluIHZhbHVlICYmXG4gICAgXCJjYXRjaFwiIGluIHZhbHVlICYmXG4gICAgXCJmaW5hbGx5XCIgaW4gdmFsdWVcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBxdWVyeUZvY3VzYWJsZUVsZW1lbnRzID0gKGNvbnRhaW5lcjogSFRNTEVsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGNvbnN0IGZvY3VzYWJsZUVsZW1lbnRzID0gY29udGFpbmVyPy5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihcbiAgICBcImJ1dHRvbiwgYSwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGRpdlt0YWJpbmRleF0sIGxhYmVsW3RhYmluZGV4XVwiLFxuICApO1xuXG4gIHJldHVybiBmb2N1c2FibGVFbGVtZW50c1xuICAgID8gQXJyYXkuZnJvbShmb2N1c2FibGVFbGVtZW50cykuZmlsdGVyKFxuICAgICAgICAoZWxlbWVudCkgPT5cbiAgICAgICAgICBlbGVtZW50LnRhYkluZGV4ID4gLTEgJiYgIShlbGVtZW50IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmRpc2FibGVkLFxuICAgICAgKVxuICAgIDogW107XG59O1xuXG5leHBvcnQgY29uc3QgaXNTaGFsbG93RXF1YWwgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBvYmpBOiBULFxuICBvYmpCOiBULFxuKSA9PiB7XG4gIGNvbnN0IGFLZXlzID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGNvbnN0IGJLZXlzID0gT2JqZWN0LmtleXMob2JqQSk7XG4gIGlmIChhS2V5cy5sZW5ndGggIT09IGJLZXlzLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gYUtleXMuZXZlcnkoKGtleSkgPT4gb2JqQVtrZXldID09PSBvYmpCW2tleV0pO1xufTtcblxuLy8gdGFrZW4gZnJvbSBSYWRpeCBVSVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3JhZGl4LXVpL3ByaW1pdGl2ZXMvYmxvYi9tYWluL3BhY2thZ2VzL2NvcmUvcHJpbWl0aXZlL3NyYy9wcmltaXRpdmUudHN4XG5leHBvcnQgY29uc3QgY29tcG9zZUV2ZW50SGFuZGxlcnMgPSA8RT4oXG4gIG9yaWdpbmFsRXZlbnRIYW5kbGVyPzogKGV2ZW50OiBFKSA9PiB2b2lkLFxuICBvdXJFdmVudEhhbmRsZXI/OiAoZXZlbnQ6IEUpID0+IHZvaWQsXG4gIHsgY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkID0gdHJ1ZSB9ID0ge30sXG4pID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGhhbmRsZUV2ZW50KGV2ZW50OiBFKSB7XG4gICAgb3JpZ2luYWxFdmVudEhhbmRsZXI/LihldmVudCk7XG5cbiAgICBpZiAoXG4gICAgICAhY2hlY2tGb3JEZWZhdWx0UHJldmVudGVkIHx8XG4gICAgICAhKGV2ZW50IGFzIHVua25vd24gYXMgRXZlbnQpLmRlZmF1bHRQcmV2ZW50ZWRcbiAgICApIHtcbiAgICAgIHJldHVybiBvdXJFdmVudEhhbmRsZXI/LihldmVudCk7XG4gICAgfVxuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3980
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"arrayToMapWithIndex\": () => (/* binding */ arrayToMapWithIndex),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"composeEventHandlers\": () => (/* binding */ composeEventHandlers),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isShallowEqual\": () => (/* binding */ isShallowEqual),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./appState */ \"../../appState.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveTool: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveTool\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_4__.isHandToolActive)(appState)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.GRAB;\n }\n else if ((0,_appState__WEBPACK_IMPORTED_MODULE_4__.isEraserActive)(appState)) {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (clientX - offsetLeft) / zoom.value - scrollX;\n const y = (clientY - offsetTop) / zoom.value - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst arrayToMapWithIndex = (elements) => elements.reduce((acc, element, idx) => {\n acc.set(element.id, [element, idx]);\n return acc;\n}, new Map());\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-dd4c333\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.14.2-dd4c333\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\nconst isShallowEqual = (objA, objB) => {\n const aKeys = Object.keys(objA);\n const bKeys = Object.keys(objA);\n if (aKeys.length !== bKeys.length) {\n return false;\n }\n return aKeys.every((key) => objA[key] === objB[key]);\n};\n// taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\nconst composeEventHandlers = (originalEventHandler, ourEventHandler, { checkForDefaultPrevented = true } = {}) => {\n return function handleEvent(event) {\n originalEventHandler === null || originalEventHandler === void 0 ? void 0 : originalEventHandler(event);\n if (!checkForDefaultPrevented ||\n !event.defaultPrevented) {\n return ourEventHandler === null || ourEventHandler === void 0 ? void 0 : ourEventHandler(event);\n }\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIGlzRGFyd2luLFxuICBNSU1FX1RZUEVTLFxuICBUSEVNRSxcbiAgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05ULFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZvbnRGYW1pbHlWYWx1ZXMsIEZvbnRTdHJpbmcgfSBmcm9tIFwiLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgRGF0YVVSTCwgTGFzdEFjdGl2ZVRvb2wsIFpvb20gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBTSEFQRVMgfSBmcm9tIFwiLi9zaGFwZXNcIjtcbmltcG9ydCB7IGlzRXJhc2VyQWN0aXZlLCBpc0hhbmRUb29sQWN0aXZlIH0gZnJvbSBcIi4vYXBwU3RhdGVcIjtcbmltcG9ydCB7IFJlc29sdXRpb25UeXBlIH0gZnJvbSBcIi4vdXRpbGl0eS10eXBlc1wiO1xuXG5sZXQgbW9ja0RhdGVUaW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IHNldERhdGVUaW1lRm9yVGVzdHMgPSAoZGF0ZVRpbWU6IHN0cmluZykgPT4ge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9ICgpID0+IHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtocn0ke21pbn1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSAoc3RyOiBzdHJpbmcpID0+XG4gIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblxuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpcyBIVE1MRWxlbWVudCA9PlxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG5cbmV4cG9ydCBjb25zdCBpc0lucHV0TGlrZSA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MU2VsZWN0RWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudDtcblxuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gKHtcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgZm9yIChjb25zdCBbZm9udEZhbWlseVN0cmluZywgaWRdIG9mIE9iamVjdC5lbnRyaWVzKEZPTlRfRkFNSUxZKSkge1xuICAgIGlmIChpZCA9PT0gZm9udEZhbWlseSkge1xuICAgICAgcmV0dXJuIGAke2ZvbnRGYW1pbHlTdHJpbmd9LCAke1dJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVH1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcblxuLyoqIHJldHVybnMgZm9udFNpemUrZm9udEZhbWlseSBzdHJpbmcgZm9yIGFzc2lnbm1lbnQgdG8gRE9NIGVsZW1lbnRzICovXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9ICh7XG4gIGZvbnRTaXplLFxuICBmb250RmFtaWx5LFxufToge1xuICBmb250U2l6ZTogbnVtYmVyO1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseSB9KX1gIGFzIEZvbnRTdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2UgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICB0aW1lb3V0OiBudW1iZXIsXG4pID0+IHtcbiAgbGV0IGhhbmRsZSA9IDA7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyB0aHJvdHRsZSBjYWxsYmFjayB0byBleGVjdXRlIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuZXhwb3J0IGNvbnN0IHRocm90dGxlUkFGID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgb3B0cz86IHsgdHJhaWxpbmc/OiBib29sZWFuIH0sXG4pID0+IHtcbiAgbGV0IHRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzVHJhaWxpbmc6IFQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSAoYXJnczogVCkgPT4ge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBpZiAobGFzdEFyZ3NUcmFpbGluZykge1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmc7XG4gICAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBpZiAodGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGdW5jKGxhc3RBcmdzKTtcbiAgICB9IGVsc2UgaWYgKG9wdHM/LnRyYWlsaW5nKSB7XG4gICAgICBsYXN0QXJnc1RyYWlsaW5nID0gYXJncztcbiAgICB9XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5leHBvcnQgY29uc3QgY2h1bmsgPSA8VCBleHRlbmRzIGFueT4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIHNpemU6IG51bWJlcixcbik6IFRbXVtdID0+IHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHJlc0luZGV4ID0gMDtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkoTWF0aC5jZWlsKGFycmF5Lmxlbmd0aCAvIHNpemUpKTtcbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlID0gKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNlbGVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2UgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IE1hdGguYWJzKHggLSB5KTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjdGl2ZVRvb2wgPSAoXG4gIGFwcFN0YXRlOiBQaWNrPEFwcFN0YXRlLCBcImFjdGl2ZVRvb2xcIj4sXG4gIGRhdGE6IChcbiAgICB8IHsgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIHwgXCJoYW5kXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2w6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoaXNIYW5kVG9vbEFjdGl2ZShhcHBTdGF0ZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuR1JBQjtcbiAgfSBlbHNlIGlmIChpc0VyYXNlckFjdGl2ZShhcHBTdGF0ZSkpIHtcbiAgICBzZXRFcmFzZXJDdXJzb3IoY2FudmFzLCBhcHBTdGF0ZS50aGVtZSk7XG4gICAgLy8gZG8gbm90aGluZyBpZiBpbWFnZSB0b29sIGlzIHNlbGVjdGVkIHdoaWNoIHN1Z2dlc3RzIHRoZXJlJ3NcbiAgICAvLyBhIGltYWdlLXByZXZpZXcgc2V0IGFzIHRoZSBjdXJzb3JcbiAgICAvLyBJZ25vcmUgY3VzdG9tIHR5cGUgYXMgd2VsbCBhbmQgbGV0IGhvc3QgZGVjaWRlXG4gIH0gZWxzZSBpZiAoIVtcImltYWdlXCIsIFwiY3VzdG9tXCJdLmluY2x1ZGVzKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSkpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gQ1VSU09SX1RZUEUuQ1JPU1NIQUlSO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQ/Lm5vZGVOYW1lID09PSBcIkhUTUxcIjtcblxuZXhwb3J0IGNvbnN0IGFsbG93RnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5yZXF1ZXN0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZXhpdEZ1bGxTY3JlZW4gPSAoKSA9PiBkb2N1bWVudC5leGl0RnVsbHNjcmVlbigpO1xuXG5leHBvcnQgY29uc3QgZ2V0U2hvcnRjdXRLZXkgPSAoc2hvcnRjdXQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIHNob3J0Y3V0ID0gc2hvcnRjdXRcbiAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiQWx0XCIpXG4gICAgLnJlcGxhY2UoL1xcYlNoaWZ0XFxiL2ksIFwiU2hpZnRcIilcbiAgICAucmVwbGFjZSgvXFxiKEVudGVyfFJldHVybilcXGIvaSwgXCJFbnRlclwiKTtcbiAgaWYgKGlzRGFyd2luKSB7XG4gICAgcmV0dXJuIHNob3J0Y3V0XG4gICAgICAucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2dpLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2dpLCBcIkN0cmxcIik7XG59O1xuXG5leHBvcnQgY29uc3Qgdmlld3BvcnRDb29yZHNUb1NjZW5lQ29vcmRzID0gKFxuICB7IGNsaWVudFgsIGNsaWVudFkgfTogeyBjbGllbnRYOiBudW1iZXI7IGNsaWVudFk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoY2xpZW50WCAtIG9mZnNldExlZnQpIC8gem9vbS52YWx1ZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgLyB6b29tLnZhbHVlIC0gc2Nyb2xsWTtcblxuICByZXR1cm4geyB4LCB5IH07XG59O1xuXG5leHBvcnQgY29uc3Qgc2NlbmVDb29yZHNUb1ZpZXdwb3J0Q29vcmRzID0gKFxuICB7IHNjZW5lWCwgc2NlbmVZIH06IHsgc2NlbmVYOiBudW1iZXI7IHNjZW5lWTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgeCA9IChzY2VuZVggKyBzY3JvbGxYKSAqIHpvb20udmFsdWUgKyBvZmZzZXRMZWZ0O1xuICBjb25zdCB5ID0gKHNjZW5lWSArIHNjcm9sbFkpICogem9vbS52YWx1ZSArIG9mZnNldFRvcDtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEdsb2JhbENTU1ZhcmlhYmxlID0gKG5hbWU6IHN0cmluZykgPT5cbiAgZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoYC0tJHtuYW1lfWApO1xuXG5jb25zdCBSU19MVFJfQ0hBUlMgPVxuICBcIkEtWmEtelxcdTAwQzAtXFx1MDBENlxcdTAwRDgtXFx1MDBGNlxcdTAwRjgtXFx1MDJCOFxcdTAzMDAtXFx1MDU5MFxcdTA4MDAtXFx1MUZGRlwiICtcbiAgXCJcXHUyQzAwLVxcdUZCMUNcXHVGREZFLVxcdUZFNkZcXHVGRUZELVxcdUZGRkZcIjtcbmNvbnN0IFJTX1JUTF9DSEFSUyA9IFwiXFx1MDU5MS1cXHUwN0ZGXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXCI7XG5jb25zdCBSRV9SVExfQ0hFQ0sgPSBuZXcgUmVnRXhwKGBeW14ke1JTX0xUUl9DSEFSU31dKlske1JTX1JUTF9DSEFSU31dYCk7XG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGZpcnN0IGRpcmVjdGlvbmFsIGNoYXJhY3RlciBpcyBSVEwuIE1lYW5pbmcgd2hldGhlciBpdCBzdGFydHNcbiAqICB3aXRoIFJUTCBjaGFyYWN0ZXJzLCBvciBpbmRldGVybWluYXRlIChudW1iZXJzIGV0Yy4pIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnlcbiAqICBSVEwuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzE3MjIjZGlzY3Vzc2lvbl9yNDM2MzQwMTcxXG4gKi9cbmV4cG9ydCBjb25zdCBpc1JUTCA9ICh0ZXh0OiBzdHJpbmcpID0+IFJFX1JUTF9DSEVDSy50ZXN0KHRleHQpO1xuXG5leHBvcnQgY29uc3QgdHVwbGVUb0Nvb3JzID0gKFxuICB4eVR1cGxlOiByZWFkb25seSBbbnVtYmVyLCBudW1iZXJdLFxuKTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9ID0+IHtcbiAgY29uc3QgW3gsIHldID0geHlUdXBsZTtcbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLyoqIHVzZSBhcyBhIHJlamVjdGlvbkhhbmRsZXIgdG8gbXV0ZSBmaWxlc3lzdGVtIEFib3J0IGVycm9ycyAqL1xuZXhwb3J0IGNvbnN0IG11dGVGU0Fib3J0RXJyb3IgPSAoZXJyb3I/OiBFcnJvcikgPT4ge1xuICBpZiAoZXJyb3I/Lm5hbWUgPT09IFwiQWJvcnRFcnJvclwiKSB7XG4gICAgY29uc29sZS53YXJuKGVycm9yKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgZXJyb3I7XG59O1xuXG5leHBvcnQgY29uc3QgZmluZEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gMCxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGgsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggLSAxO1xuICB3aGlsZSAoKytpbmRleCA8IGFycmF5Lmxlbmd0aCkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRMYXN0SW5kZXggPSA8VD4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIGNiOiAoZWxlbWVudDogVCwgaW5kZXg6IG51bWJlciwgYXJyYXk6IHJlYWRvbmx5IFRbXSkgPT4gYm9vbGVhbixcbiAgZnJvbUluZGV4OiBudW1iZXIgPSBhcnJheS5sZW5ndGggLSAxLFxuKSA9PiB7XG4gIGlmIChmcm9tSW5kZXggPCAwKSB7XG4gICAgZnJvbUluZGV4ID0gYXJyYXkubGVuZ3RoICsgZnJvbUluZGV4O1xuICB9XG4gIGZyb21JbmRleCA9IE1hdGgubWluKGFycmF5Lmxlbmd0aCAtIDEsIE1hdGgubWF4KGZyb21JbmRleCwgMCkpO1xuICBsZXQgaW5kZXggPSBmcm9tSW5kZXggKyAxO1xuICB3aGlsZSAoLS1pbmRleCA+IC0xKSB7XG4gICAgaWYgKGNiKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkge1xuICAgICAgcmV0dXJuIGluZGV4O1xuICAgIH1cbiAgfVxuICByZXR1cm4gLTE7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUcmFuc3BhcmVudCA9IChjb2xvcjogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGlzUkdCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDUgJiYgY29sb3Iuc3Vic3RyKDQsIDEpID09PSBcIjBcIjtcbiAgY29uc3QgaXNSUkdHQkJUcmFuc3BhcmVudCA9IGNvbG9yLmxlbmd0aCA9PT0gOSAmJiBjb2xvci5zdWJzdHIoNywgMikgPT09IFwiMDBcIjtcbiAgcmV0dXJuIChcbiAgICBpc1JHQlRyYW5zcGFyZW50IHx8XG4gICAgaXNSUkdHQkJUcmFuc3BhcmVudCB8fFxuICAgIGNvbG9yID09PSBjb2xvcnMuZWxlbWVudEJhY2tncm91bmRbMF1cbiAgKTtcbn07XG5cbmV4cG9ydCB0eXBlIFJlc29sdmFibGVQcm9taXNlPFQ+ID0gUHJvbWlzZTxUPiAmIHtcbiAgcmVzb2x2ZTogW1RdIGV4dGVuZHMgW3VuZGVmaW5lZF0gPyAodmFsdWU/OiBUKSA9PiB2b2lkIDogKHZhbHVlOiBUKSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcjogRXJyb3IpID0+IHZvaWQ7XG59O1xuZXhwb3J0IGNvbnN0IHJlc29sdmFibGVQcm9taXNlID0gPFQ+KCkgPT4ge1xuICBsZXQgcmVzb2x2ZSE6IGFueTtcbiAgbGV0IHJlamVjdCE6IGFueTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChfcmVzb2x2ZSwgX3JlamVjdCkgPT4ge1xuICAgIHJlc29sdmUgPSBfcmVzb2x2ZTtcbiAgICByZWplY3QgPSBfcmVqZWN0O1xuICB9KTtcbiAgKHByb21pc2UgYXMgYW55KS5yZXNvbHZlID0gcmVzb2x2ZTtcbiAgKHByb21pc2UgYXMgYW55KS5yZWplY3QgPSByZWplY3Q7XG4gIHJldHVybiBwcm9taXNlIGFzIFJlc29sdmFibGVQcm9taXNlPFQ+O1xufTtcblxuLyoqXG4gKiBAcGFyYW0gZnVuYyBoYW5kbGVyIHRha2luZyBhdCBtb3N0IHNpbmdsZSBwYXJhbWV0ZXIgKGV2ZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlcyA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+XG4gICgoZXZlbnQpID0+IHtcbiAgICB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyhmdW5jIGFzIFRGdW5jdGlvbiwgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb247XG5cbi8qKlxuICogYmFyY2hlcyBSZWFjdCBzdGF0ZSB1cGRhdGVzIGFuZCB0aHJvdHRsZXMgdGhlIGNhbGxzIHRvIGEgc2luZ2xlIGNhbGwgcGVyXG4gKiBhbmltYXRpb24gZnJhbWVcbiAqL1xuZXhwb3J0IGNvbnN0IHdpdGhCYXRjaGVkVXBkYXRlc1Rocm90dGxlZCA9IDxcbiAgVEZ1bmN0aW9uIGV4dGVuZHMgKChldmVudDogYW55KSA9PiB2b2lkKSB8ICgoKSA9PiB2b2lkKSxcbj4oXG4gIGZ1bmM6IFBhcmFtZXRlcnM8VEZ1bmN0aW9uPltcImxlbmd0aFwiXSBleHRlbmRzIDAgfCAxID8gVEZ1bmN0aW9uIDogbmV2ZXIsXG4pID0+IHtcbiAgLy8gQHRzLWlnbm9yZVxuICByZXR1cm4gdGhyb3R0bGVSQUY8UGFyYW1ldGVyczxURnVuY3Rpb24+PigoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYywgZXZlbnQpO1xuICB9KSBhcyBURnVuY3Rpb24pO1xufTtcblxuLy9odHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvOTQ2MjM4Mi84NDE4XG5leHBvcnQgY29uc3QgbkZvcm1hdHRlciA9IChudW06IG51bWJlciwgZGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICBjb25zdCBzaSA9IFtcbiAgICB7IHZhbHVlOiAxLCBzeW1ib2w6IFwiYlwiIH0sXG4gICAgeyB2YWx1ZTogMWUzLCBzeW1ib2w6IFwia1wiIH0sXG4gICAgeyB2YWx1ZTogMWU2LCBzeW1ib2w6IFwiTVwiIH0sXG4gICAgeyB2YWx1ZTogMWU5LCBzeW1ib2w6IFwiR1wiIH0sXG4gIF07XG4gIGNvbnN0IHJ4ID0gL1xcLjArJHwoXFwuWzAtOV0qWzEtOV0pMCskLztcbiAgbGV0IGluZGV4O1xuICBmb3IgKGluZGV4ID0gc2kubGVuZ3RoIC0gMTsgaW5kZXggPiAwOyBpbmRleC0tKSB7XG4gICAgaWYgKG51bSA+PSBzaVtpbmRleF0udmFsdWUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgIChudW0gLyBzaVtpbmRleF0udmFsdWUpLnRvRml4ZWQoZGlnaXRzKS5yZXBsYWNlKHJ4LCBcIiQxXCIpICsgc2lbaW5kZXhdLnN5bWJvbFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFZlcnNpb24gPSAoKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MTWV0YUVsZW1lbnQ+KCdtZXRhW25hbWU9XCJ2ZXJzaW9uXCJdJyk/LmNvbnRlbnQgfHxcbiAgICBERUZBVUxUX1ZFUlNJT05cbiAgKTtcbn07XG5cbi8vIEFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vTW9kZXJuaXpyL01vZGVybml6ci9ibG9iL21hc3Rlci9mZWF0dXJlLWRldGVjdHMvZW1vamkuanNcbmV4cG9ydCBjb25zdCBzdXBwb3J0c0Vtb2ppID0gKCkgPT4ge1xuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBpZiAoIWN0eCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSAxMjtcbiAgY3R4LmZpbGxTdHlsZSA9IFwiI2YwMFwiO1xuICBjdHgudGV4dEJhc2VsaW5lID0gXCJ0b3BcIjtcbiAgY3R4LmZvbnQgPSBcIjMycHggQXJpYWxcIjtcbiAgLy8gTW9kZXJuaXpyIHVzZWQg8J+QqCwgYnV0IGl0IGlzIHNvcnQgb2Ygc3VwcG9ydGVkIG9uIFdpbmRvd3MgNy5cbiAgLy8gTHVja2lseSDwn5iAIGlzbid0IHN1cHBvcnRlZC5cbiAgY3R4LmZpbGxUZXh0KFwi8J+YgFwiLCAwLCAwKTtcbiAgcmV0dXJuIGN0eC5nZXRJbWFnZURhdGEob2Zmc2V0LCBvZmZzZXQsIDEsIDEpLmRhdGFbMF0gIT09IDA7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TmVhcmVzdFNjcm9sbGFibGVDb250YWluZXIgPSAoXG4gIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuKTogSFRNTEVsZW1lbnQgfCBEb2N1bWVudCA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50ID09PSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQ7XG4gICAgfVxuICAgIGNvbnN0IHsgb3ZlcmZsb3dZIH0gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgIGNvbnN0IGhhc1Njcm9sbGFibGVDb250ZW50ID0gcGFyZW50LnNjcm9sbEhlaWdodCA+IHBhcmVudC5jbGllbnRIZWlnaHQ7XG4gICAgaWYgKFxuICAgICAgaGFzU2Nyb2xsYWJsZUNvbnRlbnQgJiZcbiAgICAgIChvdmVyZmxvd1kgPT09IFwiYXV0b1wiIHx8XG4gICAgICAgIG92ZXJmbG93WSA9PT0gXCJzY3JvbGxcIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwib3ZlcmxheVwiKVxuICAgICkge1xuICAgICAgcmV0dXJuIHBhcmVudDtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbiAgcmV0dXJuIGRvY3VtZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IGZvY3VzTmVhcmVzdFBhcmVudCA9IChlbGVtZW50OiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gIGxldCBwYXJlbnQgPSBlbGVtZW50LnBhcmVudEVsZW1lbnQ7XG4gIHdoaWxlIChwYXJlbnQpIHtcbiAgICBpZiAocGFyZW50LnRhYkluZGV4ID4gLTEpIHtcbiAgICAgIHBhcmVudC5mb2N1cygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwYXJlbnQgPSBwYXJlbnQucGFyZW50RWxlbWVudDtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHByZXZlbnRVbmxvYWQgPSAoZXZlbnQ6IEJlZm9yZVVubG9hZEV2ZW50KSA9PiB7XG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIC8vIE5PVEU6IG1vZGVybiBicm93c2VycyBubyBsb25nZXIgYWxsb3cgc2hvd2luZyBhIGN1c3RvbSBtZXNzYWdlIGhlcmVcbiAgZXZlbnQucmV0dXJuVmFsdWUgPSBcIlwiO1xufTtcblxuZXhwb3J0IGNvbnN0IGJ5dGVzVG9IZXhTdHJpbmcgPSAoYnl0ZXM6IFVpbnQ4QXJyYXkpID0+IHtcbiAgcmV0dXJuIEFycmF5LmZyb20oYnl0ZXMpXG4gICAgLm1hcCgoYnl0ZSkgPT4gYDAke2J5dGUudG9TdHJpbmcoMTYpfWAuc2xpY2UoLTIpKVxuICAgIC5qb2luKFwiXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFVwZGF0ZWRUaW1lc3RhbXAgPSAoKSA9PiAoaXNUZXN0RW52KCkgPyAxIDogRGF0ZS5ub3coKSk7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhcnJheSBvZiBvYmplY3RzIGNvbnRhaW5pbmcgYGlkYCBhdHRyaWJ1dGUsXG4gKiBvciBhcnJheSBvZiBpZHMgKHN0cmluZ3MpLCBpbnRvIGEgTWFwLCBrZXlkIGJ5IGBpZGAuXG4gKi9cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwID0gPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfSB8IHN0cmluZz4oXG4gIGl0ZW1zOiByZWFkb25seSBUW10sXG4pID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoYWNjOiBNYXA8c3RyaW5nLCBUPiwgZWxlbWVudCkgPT4ge1xuICAgIGFjYy5zZXQodHlwZW9mIGVsZW1lbnQgPT09IFwic3RyaW5nXCIgPyBlbGVtZW50IDogZWxlbWVudC5pZCwgZWxlbWVudCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwgbmV3IE1hcCgpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBhcnJheVRvTWFwV2l0aEluZGV4ID0gPFQgZXh0ZW5kcyB7IGlkOiBzdHJpbmcgfT4oXG4gIGVsZW1lbnRzOiByZWFkb25seSBUW10sXG4pID0+XG4gIGVsZW1lbnRzLnJlZHVjZSgoYWNjLCBlbGVtZW50OiBULCBpZHgpID0+IHtcbiAgICBhY2Muc2V0KGVsZW1lbnQuaWQsIFtlbGVtZW50LCBpZHhdKTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCBuZXcgTWFwPHN0cmluZywgW2VsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXJdPigpKTtcblxuZXhwb3J0IGNvbnN0IGlzVGVzdEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJ0ZXN0XCI7XG5cbmV4cG9ydCBjb25zdCBpc1Byb2RFbnYgPSAoKSA9PlxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiO1xuXG5leHBvcnQgY29uc3Qgd3JhcEV2ZW50ID0gPFQgZXh0ZW5kcyBFdmVudD4obmFtZTogRVZFTlQsIG5hdGl2ZUV2ZW50OiBUKSA9PiB7XG4gIHJldHVybiBuZXcgQ3VzdG9tRXZlbnQobmFtZSwge1xuICAgIGRldGFpbDoge1xuICAgICAgbmF0aXZlRXZlbnQsXG4gICAgfSxcbiAgICBjYW5jZWxhYmxlOiB0cnVlLFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCB1cGRhdGVPYmplY3QgPSA8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuICBvYmo6IFQsXG4gIHVwZGF0ZXM6IFBhcnRpYWw8VD4sXG4pOiBUID0+IHtcbiAgbGV0IGRpZENoYW5nZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGtleSBpbiB1cGRhdGVzKSB7XG4gICAgY29uc3QgdmFsdWUgPSAodXBkYXRlcyBhcyBhbnkpW2tleV07XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgaWYgKFxuICAgICAgICAob2JqIGFzIGFueSlba2V5XSA9PT0gdmFsdWUgJiZcbiAgICAgICAgLy8gaWYgb2JqZWN0LCBhbHdheXMgdXBkYXRlIGJlY2F1c2UgaXRzIGF0dHJzIGNvdWxkIGhhdmUgY2hhbmdlZFxuICAgICAgICAodHlwZW9mIHZhbHVlICE9PSBcIm9iamVjdFwiIHx8IHZhbHVlID09PSBudWxsKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZGlkQ2hhbmdlID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWRpZENoYW5nZSkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm9iaixcbiAgICAuLi51cGRhdGVzLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGlzUHJpbWl0aXZlID0gKHZhbDogYW55KSA9PiB7XG4gIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsO1xuICByZXR1cm4gdmFsID09IG51bGwgfHwgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRGcmFtZSA9ICgpID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gd2luZG93LnNlbGYgPT09IHdpbmRvdy50b3AgPyBcInRvcFwiIDogXCJpZnJhbWVcIjtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gXCJpZnJhbWVcIjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzUHJvbWlzZUxpa2UgPSAoXG4gIHZhbHVlOiBhbnksXG4pOiB2YWx1ZSBpcyBQcm9taXNlPFJlc29sdXRpb25UeXBlPHR5cGVvZiB2YWx1ZT4+ID0+IHtcbiAgcmV0dXJuIChcbiAgICAhIXZhbHVlICYmXG4gICAgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmXG4gICAgXCJ0aGVuXCIgaW4gdmFsdWUgJiZcbiAgICBcImNhdGNoXCIgaW4gdmFsdWUgJiZcbiAgICBcImZpbmFsbHlcIiBpbiB2YWx1ZVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHF1ZXJ5Rm9jdXNhYmxlRWxlbWVudHMgPSAoY29udGFpbmVyOiBIVE1MRWxlbWVudCB8IG51bGwpID0+IHtcbiAgY29uc3QgZm9jdXNhYmxlRWxlbWVudHMgPSBjb250YWluZXI/LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KFxuICAgIFwiYnV0dG9uLCBhLCBpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgZGl2W3RhYmluZGV4XSwgbGFiZWxbdGFiaW5kZXhdXCIsXG4gICk7XG5cbiAgcmV0dXJuIGZvY3VzYWJsZUVsZW1lbnRzXG4gICAgPyBBcnJheS5mcm9tKGZvY3VzYWJsZUVsZW1lbnRzKS5maWx0ZXIoXG4gICAgICAgIChlbGVtZW50KSA9PlxuICAgICAgICAgIGVsZW1lbnQudGFiSW5kZXggPiAtMSAmJiAhKGVsZW1lbnQgYXMgSFRNTElucHV0RWxlbWVudCkuZGlzYWJsZWQsXG4gICAgICApXG4gICAgOiBbXTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc1NoYWxsb3dFcXVhbCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iakE6IFQsXG4gIG9iakI6IFQsXG4pID0+IHtcbiAgY29uc3QgYUtleXMgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgY29uc3QgYktleXMgPSBPYmplY3Qua2V5cyhvYmpBKTtcbiAgaWYgKGFLZXlzLmxlbmd0aCAhPT0gYktleXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBhS2V5cy5ldmVyeSgoa2V5KSA9PiBvYmpBW2tleV0gPT09IG9iakJba2V5XSk7XG59O1xuXG4vLyB0YWtlbiBmcm9tIFJhZGl4IFVJXG4vLyBodHRwczovL2dpdGh1Yi5jb20vcmFkaXgtdWkvcHJpbWl0aXZlcy9ibG9iL21haW4vcGFja2FnZXMvY29yZS9wcmltaXRpdmUvc3JjL3ByaW1pdGl2ZS50c3hcbmV4cG9ydCBjb25zdCBjb21wb3NlRXZlbnRIYW5kbGVycyA9IDxFPihcbiAgb3JpZ2luYWxFdmVudEhhbmRsZXI/OiAoZXZlbnQ6IEUpID0+IHZvaWQsXG4gIG91ckV2ZW50SGFuZGxlcj86IChldmVudDogRSkgPT4gdm9pZCxcbiAgeyBjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlIH0gPSB7fSxcbikgPT4ge1xuICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlRXZlbnQoZXZlbnQ6IEUpIHtcbiAgICBvcmlnaW5hbEV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcblxuICAgIGlmIChcbiAgICAgICFjaGVja0ZvckRlZmF1bHRQcmV2ZW50ZWQgfHxcbiAgICAgICEoZXZlbnQgYXMgdW5rbm93biBhcyBFdmVudCkuZGVmYXVsdFByZXZlbnRlZFxuICAgICkge1xuICAgICAgcmV0dXJuIG91ckV2ZW50SGFuZGxlcj8uKGV2ZW50KTtcbiAgICB9XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3981
3981
|
|
|
3982
3982
|
/***/ }),
|
|
3983
3983
|
|