@dwelle/excalidraw 0.4.0-904c06a → 0.4.0-989b1cf
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.
|
@@ -1679,7 +1679,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1679
1679
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1680
1680
|
|
|
1681
1681
|
"use strict";
|
|
1682
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionBindText\": () => (/* binding */ actionBindText),\n/* harmony export */ \"actionUnbindText\": () => (/* binding */ actionUnbindText)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.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 _register__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\n\n\n\n\n\n\n\nconst actionUnbindText = (0,_register__WEBPACK_IMPORTED_MODULE_7__.register)({\n name: \"unbindText\",\n contextItemLabel: \"labels.unbindText\",\n trackEvent: { category: \"element\" },\n contextItemPredicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)(elements, appState);\n return selectedElements.some((element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.hasBoundTextElement)(element));\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n selectedElements.forEach((element) => {\n var _a;\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(element);\n if (boundTextElement) {\n const { width, height, baseline } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.measureText)(boundTextElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_6__.getFontString)(boundTextElement));\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(boundTextElement, {\n containerId: null,\n width,\n height,\n baseline,\n text: boundTextElement.originalText,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.id !== boundTextElement.id),\n });\n }\n });\n return {\n elements,\n appState,\n commitToHistory: true,\n };\n },\n});\nconst actionBindText = (0,_register__WEBPACK_IMPORTED_MODULE_7__.register)({\n name: \"bindText\",\n contextItemLabel: \"labels.bindText\",\n trackEvent: { category: \"element\" },\n contextItemPredicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 2) {\n const textElement = (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) ||\n (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[1]);\n let bindingContainer;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextBindableContainer)(selectedElements[0])) {\n bindingContainer = selectedElements[0];\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextBindableContainer)(selectedElements[1])) {\n bindingContainer = selectedElements[1];\n }\n if (textElement &&\n bindingContainer &&\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(bindingContainer) === null) {\n return true;\n }\n }\n return false;\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_5__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n let textElement;\n let container;\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_4__.isTextBindableContainer)(selectedElements[1])) {\n textElement = selectedElements[0];\n container = selectedElements[1];\n }\n else {\n textElement = selectedElements[1];\n container = selectedElements[0];\n }\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\n containerId: container.id,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\n const updatedElements = elements.slice();\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\n updatedElements.splice(textElementIndex, 1);\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\n updatedElements.splice(containerIndex + 1, 0, textElement);\n return {\n elements: updatedElements,\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: { [container.id]: true } }),\n commitToHistory: true,\n };\n },\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDO1FBQ0gsMkVBQXFCLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QyxNQUFNLGdCQUFnQixHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQ2hELENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLFdBQVcsQ0FBQyxFQUFFLENBQ25DLENBQUM7UUFDRixlQUFlLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxTQUFTLENBQzlDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLFNBQVMsQ0FBQyxFQUFFLENBQ2pDLENBQUM7UUFDRixlQUFlLENBQUMsTUFBTSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQzNELE9BQU87WUFDTCxRQUFRLEVBQUUsZUFBZTtZQUN6QixRQUFRLGtDQUFPLFFBQVEsS0FBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFFO1lBQ3ZFLGVBQWUsRUFBRSxJQUFJO1NBQ3RCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FjdGlvbnMvYWN0aW9uQm91bmRUZXh0LnRzeD80YmZmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0Tm9uRGVsZXRlZEVsZW1lbnRzLCBpc1RleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQge1xuICBnZXRCb3VuZFRleHRFbGVtZW50LFxuICBtZWFzdXJlVGV4dCxcbiAgcmVkcmF3VGV4dEJvdW5kaW5nQm94LFxufSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaGFzQm91bmRUZXh0RWxlbWVudCxcbiAgaXNUZXh0QmluZGFibGVDb250YWluZXIsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gXCIuL3JlZ2lzdGVyXCI7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25VbmJpbmRUZXh0ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcInVuYmluZFRleHRcIixcbiAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMudW5iaW5kVGV4dFwiLFxuICB0cmFja0V2ZW50OiB7IGNhdGVnb3J5OiBcImVsZW1lbnRcIiB9LFxuICBjb250ZXh0SXRlbVByZWRpY2F0ZTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KSk7XG4gIH0sXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyksXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH0gPSBtZWFzdXJlVGV4dChcbiAgICAgICAgICBib3VuZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKGJvdW5kVGV4dEVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50LCB7XG4gICAgICAgICAgY29udGFpbmVySWQ6IG51bGwsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGJhc2VsaW5lLFxuICAgICAgICAgIHRleHQ6IGJvdW5kVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogZWxlbWVudC5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PiBlbGUuaWQgIT09IGJvdW5kVGV4dEVsZW1lbnQuaWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGVsZW1lbnRzLFxuICAgICAgYXBwU3RhdGUsXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbn0pO1xuXG5leHBvcnQgY29uc3QgYWN0aW9uQmluZFRleHQgPSByZWdpc3Rlcih7XG4gIG5hbWU6IFwiYmluZFRleHRcIixcbiAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMuYmluZFRleHRcIixcbiAgdHJhY2tFdmVudDogeyBjYXRlZ29yeTogXCJlbGVtZW50XCIgfSxcbiAgY29udGV4dEl0ZW1QcmVkaWNhdGU6IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhlbGVtZW50cywgYXBwU3RhdGUpO1xuXG4gICAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAyKSB7XG4gICAgICBjb25zdCB0ZXh0RWxlbWVudCA9XG4gICAgICAgIGlzVGV4dEVsZW1lbnQoc2VsZWN0ZWRFbGVtZW50c1swXSkgfHxcbiAgICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzFdKTtcblxuICAgICAgbGV0IGJpbmRpbmdDb250YWluZXI7XG4gICAgICBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1swXSkpIHtcbiAgICAgICAgYmluZGluZ0NvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMF07XG4gICAgICB9IGVsc2UgaWYgKGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKHNlbGVjdGVkRWxlbWVudHNbMV0pKSB7XG4gICAgICAgIGJpbmRpbmdDb250YWluZXIgPSBzZWxlY3RlZEVsZW1lbnRzWzFdO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICB0ZXh0RWxlbWVudCAmJlxuICAgICAgICBiaW5kaW5nQ29udGFpbmVyICYmXG4gICAgICAgIGdldEJvdW5kVGV4dEVsZW1lbnQoYmluZGluZ0NvbnRhaW5lcikgPT09IG51bGxcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBwZXJmb3JtOiAoZWxlbWVudHMsIGFwcFN0YXRlKSA9PiB7XG4gICAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoXG4gICAgICBnZXROb25EZWxldGVkRWxlbWVudHMoZWxlbWVudHMpLFxuICAgICAgYXBwU3RhdGUsXG4gICAgKTtcblxuICAgIGxldCB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCBjb250YWluZXI6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyO1xuXG4gICAgaWYgKFxuICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSAmJlxuICAgICAgaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1sxXSlcbiAgICApIHtcbiAgICAgIHRleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIGNvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRleHRFbGVtZW50ID0gc2VsZWN0ZWRFbGVtZW50c1sxXSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgICBjb250YWluZXIgPSBzZWxlY3RlZEVsZW1lbnRzWzBdIGFzIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyO1xuICAgIH1cbiAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICBjb250YWluZXJJZDogY29udGFpbmVyLmlkLFxuICAgICAgdmVydGljYWxBbGlnbjogVkVSVElDQUxfQUxJR04uTUlERExFLFxuICAgIH0pO1xuICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICBpZDogdGV4dEVsZW1lbnQuaWQsXG4gICAgICB9KSxcbiAgICB9KTtcbiAgICByZWRyYXdUZXh0Qm91bmRpbmdCb3godGV4dEVsZW1lbnQsIGNvbnRhaW5lcik7XG4gICAgY29uc3QgdXBkYXRlZEVsZW1lbnRzID0gZWxlbWVudHMuc2xpY2UoKTtcbiAgICBjb25zdCB0ZXh0RWxlbWVudEluZGV4ID0gdXBkYXRlZEVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAgIChlbGUpID0+IGVsZS5pZCA9PT0gdGV4dEVsZW1lbnQuaWQsXG4gICAgKTtcbiAgICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKHRleHRFbGVtZW50SW5kZXgsIDEpO1xuICAgIGNvbnN0IGNvbnRhaW5lckluZGV4ID0gdXBkYXRlZEVsZW1lbnRzLmZpbmRJbmRleChcbiAgICAgIChlbGUpID0+IGVsZS5pZCA9PT0gY29udGFpbmVyLmlkLFxuICAgICk7XG4gICAgdXBkYXRlZEVsZW1lbnRzLnNwbGljZShjb250YWluZXJJbmRleCArIDEsIDAsIHRleHRFbGVtZW50KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHM6IHVwZGF0ZWRFbGVtZW50cyxcbiAgICAgIGFwcFN0YXRlOiB7IC4uLmFwcFN0YXRlLCBzZWxlY3RlZEVsZW1lbnRJZHM6IHsgW2NvbnRhaW5lci5pZF06IHRydWUgfSB9LFxuICAgICAgY29tbWl0VG9IaXN0b3J5OiB0cnVlLFxuICAgIH07XG4gIH0sXG59KTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../actions/actionBoundText.tsx\n");
|
|
1682
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"actionBindText\": () => (/* binding */ actionBindText),\n/* harmony export */ \"actionUnbindText\": () => (/* binding */ actionUnbindText)\n/* harmony export */ });\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _element_textElement__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../element/textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element/textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _register__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./register */ \"../../actions/register.ts\");\n\n\n\n\n\n\n\n\n\nconst actionUnbindText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"unbindText\",\n contextItemLabel: \"labels.unbindText\",\n trackEvent: { category: \"element\" },\n contextItemPredicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n return selectedElements.some((element) => (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.hasBoundTextElement)(element));\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n selectedElements.forEach((element) => {\n var _a;\n const boundTextElement = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(element);\n if (boundTextElement) {\n const { width, height, baseline } = (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.measureText)(boundTextElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_7__.getFontString)(boundTextElement));\n const originalContainerHeight = (0,_element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__.getOriginalContainerHeightFromCache)(element.id);\n (0,_element_textWysiwyg__WEBPACK_IMPORTED_MODULE_4__.resetOriginalContainerCache)(element.id);\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(boundTextElement, {\n containerId: null,\n width,\n height,\n baseline,\n text: boundTextElement.originalText,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(element, {\n boundElements: (_a = element.boundElements) === null || _a === void 0 ? void 0 : _a.filter((ele) => ele.id !== boundTextElement.id),\n height: originalContainerHeight\n ? originalContainerHeight\n : element.height,\n });\n }\n });\n return {\n elements,\n appState,\n commitToHistory: true,\n };\n },\n});\nconst actionBindText = (0,_register__WEBPACK_IMPORTED_MODULE_8__.register)({\n name: \"bindText\",\n contextItemLabel: \"labels.bindText\",\n trackEvent: { category: \"element\" },\n contextItemPredicate: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 2) {\n const textElement = (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) ||\n (0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[1]);\n let bindingContainer;\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0])) {\n bindingContainer = selectedElements[0];\n }\n else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[1])) {\n bindingContainer = selectedElements[1];\n }\n if (textElement &&\n bindingContainer &&\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.getBoundTextElement)(bindingContainer) === null) {\n return true;\n }\n }\n return false;\n },\n perform: (elements, appState) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_6__.getSelectedElements)((0,_element__WEBPACK_IMPORTED_MODULE_1__.getNonDeletedElements)(elements), appState);\n let textElement;\n let container;\n if ((0,_element__WEBPACK_IMPORTED_MODULE_1__.isTextElement)(selectedElements[0]) &&\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[1])) {\n textElement = selectedElements[0];\n container = selectedElements[1];\n }\n else {\n textElement = selectedElements[1];\n container = selectedElements[0];\n }\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(textElement, {\n containerId: container.id,\n verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_0__.VERTICAL_ALIGN.MIDDLE,\n });\n (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_2__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n (0,_element_textElement__WEBPACK_IMPORTED_MODULE_3__.redrawTextBoundingBox)(textElement, container);\n const updatedElements = elements.slice();\n const textElementIndex = updatedElements.findIndex((ele) => ele.id === textElement.id);\n updatedElements.splice(textElementIndex, 1);\n const containerIndex = updatedElements.findIndex((ele) => ele.id === container.id);\n updatedElements.splice(containerIndex + 1, 0, textElement);\n return {\n elements: updatedElements,\n appState: Object.assign(Object.assign({}, appState), { selectedElementIds: { [container.id]: true } }),\n commitToHistory: true,\n };\n },\n});\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDZEQUFxQjtTQUNyQyxDQUFDLENBQUM7UUFDSCxxRUFBYSxDQUFDLFNBQVMsRUFBRTtZQUN2QixhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQztnQkFDcEQsSUFBSSxFQUFFLE1BQU07Z0JBQ1osRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFO2FBQ25CLENBQUM7U0FDSCxDQUFDLENBQUM7UUFDSCwyRUFBcUIsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FDaEQsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssV0FBVyxDQUFDLEVBQUUsQ0FDbkMsQ0FBQztRQUNGLGVBQWUsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUMsTUFBTSxjQUFjLEdBQUcsZUFBZSxDQUFDLFNBQVMsQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLEVBQUUsQ0FDakMsQ0FBQztRQUNGLGVBQWUsQ0FBQyxNQUFNLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDM0QsT0FBTztZQUNMLFFBQVEsRUFBRSxlQUFlO1lBQ3pCLFFBQVEsa0NBQU8sUUFBUSxLQUFFLGtCQUFrQixFQUFFLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUU7WUFDdkUsZUFBZSxFQUFFLElBQUk7U0FDdEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYWN0aW9ucy9hY3Rpb25Cb3VuZFRleHQudHN4PzRiZmYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBnZXROb25EZWxldGVkRWxlbWVudHMsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEJvdW5kVGV4dEVsZW1lbnQsXG4gIG1lYXN1cmVUZXh0LFxuICByZWRyYXdUZXh0Qm91bmRpbmdCb3gsXG59IGZyb20gXCIuLi9lbGVtZW50L3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBnZXRPcmlnaW5hbENvbnRhaW5lckhlaWdodEZyb21DYWNoZSxcbiAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC90ZXh0V3lzaXd5Z1wiO1xuaW1wb3J0IHtcbiAgaGFzQm91bmRUZXh0RWxlbWVudCxcbiAgaXNUZXh0QmluZGFibGVDb250YWluZXIsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVDaGVja3NcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG59IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRTZWxlY3RlZEVsZW1lbnRzIH0gZnJvbSBcIi4uL3NjZW5lXCI7XG5pbXBvcnQgeyBnZXRGb250U3RyaW5nIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyByZWdpc3RlciB9IGZyb20gXCIuL3JlZ2lzdGVyXCI7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25VbmJpbmRUZXh0ID0gcmVnaXN0ZXIoe1xuICBuYW1lOiBcInVuYmluZFRleHRcIixcbiAgY29udGV4dEl0ZW1MYWJlbDogXCJsYWJlbHMudW5iaW5kVGV4dFwiLFxuICB0cmFja0V2ZW50OiB7IGNhdGVnb3J5OiBcImVsZW1lbnRcIiB9LFxuICBjb250ZXh0SXRlbVByZWRpY2F0ZTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkRWxlbWVudHMuc29tZSgoZWxlbWVudCkgPT4gaGFzQm91bmRUZXh0RWxlbWVudChlbGVtZW50KSk7XG4gIH0sXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyksXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuICAgIHNlbGVjdGVkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH0gPSBtZWFzdXJlVGV4dChcbiAgICAgICAgICBib3VuZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKGJvdW5kVGV4dEVsZW1lbnQpLFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGdldE9yaWdpbmFsQ29udGFpbmVySGVpZ2h0RnJvbUNhY2hlKFxuICAgICAgICAgIGVsZW1lbnQuaWQsXG4gICAgICAgICk7XG4gICAgICAgIHJlc2V0T3JpZ2luYWxDb250YWluZXJDYWNoZShlbGVtZW50LmlkKTtcblxuICAgICAgICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50LCB7XG4gICAgICAgICAgY29udGFpbmVySWQ6IG51bGwsXG4gICAgICAgICAgd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgIGJhc2VsaW5lLFxuICAgICAgICAgIHRleHQ6IGJvdW5kVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICB9KTtcbiAgICAgICAgbXV0YXRlRWxlbWVudChlbGVtZW50LCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogZWxlbWVudC5ib3VuZEVsZW1lbnRzPy5maWx0ZXIoXG4gICAgICAgICAgICAoZWxlKSA9PiBlbGUuaWQgIT09IGJvdW5kVGV4dEVsZW1lbnQuaWQsXG4gICAgICAgICAgKSxcbiAgICAgICAgICBoZWlnaHQ6IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0XG4gICAgICAgICAgICA/IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0XG4gICAgICAgICAgICA6IGVsZW1lbnQuaGVpZ2h0LFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgZWxlbWVudHMsXG4gICAgICBhcHBTdGF0ZSxcbiAgICAgIGNvbW1pdFRvSGlzdG9yeTogdHJ1ZSxcbiAgICB9O1xuICB9LFxufSk7XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25CaW5kVGV4dCA9IHJlZ2lzdGVyKHtcbiAgbmFtZTogXCJiaW5kVGV4dFwiLFxuICBjb250ZXh0SXRlbUxhYmVsOiBcImxhYmVscy5iaW5kVGV4dFwiLFxuICB0cmFja0V2ZW50OiB7IGNhdGVnb3J5OiBcImVsZW1lbnRcIiB9LFxuICBjb250ZXh0SXRlbVByZWRpY2F0ZTogKGVsZW1lbnRzLCBhcHBTdGF0ZSkgPT4ge1xuICAgIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG5cbiAgICBpZiAoc2VsZWN0ZWRFbGVtZW50cy5sZW5ndGggPT09IDIpIHtcbiAgICAgIGNvbnN0IHRleHRFbGVtZW50ID1cbiAgICAgICAgaXNUZXh0RWxlbWVudChzZWxlY3RlZEVsZW1lbnRzWzBdKSB8fFxuICAgICAgICBpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMV0pO1xuXG4gICAgICBsZXQgYmluZGluZ0NvbnRhaW5lcjtcbiAgICAgIGlmIChpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdKSkge1xuICAgICAgICBiaW5kaW5nQ29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1swXTtcbiAgICAgIH0gZWxzZSBpZiAoaXNUZXh0QmluZGFibGVDb250YWluZXIoc2VsZWN0ZWRFbGVtZW50c1sxXSkpIHtcbiAgICAgICAgYmluZGluZ0NvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMV07XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHRleHRFbGVtZW50ICYmXG4gICAgICAgIGJpbmRpbmdDb250YWluZXIgJiZcbiAgICAgICAgZ2V0Qm91bmRUZXh0RWxlbWVudChiaW5kaW5nQ29udGFpbmVyKSA9PT0gbnVsbFxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHBlcmZvcm06IChlbGVtZW50cywgYXBwU3RhdGUpID0+IHtcbiAgICBjb25zdCBzZWxlY3RlZEVsZW1lbnRzID0gZ2V0U2VsZWN0ZWRFbGVtZW50cyhcbiAgICAgIGdldE5vbkRlbGV0ZWRFbGVtZW50cyhlbGVtZW50cyksXG4gICAgICBhcHBTdGF0ZSxcbiAgICApO1xuXG4gICAgbGV0IHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgbGV0IGNvbnRhaW5lcjogRXhjYWxpZHJhd1RleHRDb250YWluZXI7XG5cbiAgICBpZiAoXG4gICAgICBpc1RleHRFbGVtZW50KHNlbGVjdGVkRWxlbWVudHNbMF0pICYmXG4gICAgICBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzFdKVxuICAgICkge1xuICAgICAgdGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzBdO1xuICAgICAgY29udGFpbmVyID0gc2VsZWN0ZWRFbGVtZW50c1sxXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dEVsZW1lbnQgPSBzZWxlY3RlZEVsZW1lbnRzWzFdIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICAgIGNvbnRhaW5lciA9IHNlbGVjdGVkRWxlbWVudHNbMF0gYXMgRXhjYWxpZHJhd1RleHRDb250YWluZXI7XG4gICAgfVxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIGNvbnRhaW5lcklkOiBjb250YWluZXIuaWQsXG4gICAgICB2ZXJ0aWNhbEFsaWduOiBWRVJUSUNBTF9BTElHTi5NSURETEUsXG4gICAgfSk7XG4gICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgIGlkOiB0ZXh0RWxlbWVudC5pZCxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIHJlZHJhd1RleHRCb3VuZGluZ0JveCh0ZXh0RWxlbWVudCwgY29udGFpbmVyKTtcbiAgICBjb25zdCB1cGRhdGVkRWxlbWVudHMgPSBlbGVtZW50cy5zbGljZSgpO1xuICAgIGNvbnN0IHRleHRFbGVtZW50SW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgICAgKGVsZSkgPT4gZWxlLmlkID09PSB0ZXh0RWxlbWVudC5pZCxcbiAgICApO1xuICAgIHVwZGF0ZWRFbGVtZW50cy5zcGxpY2UodGV4dEVsZW1lbnRJbmRleCwgMSk7XG4gICAgY29uc3QgY29udGFpbmVySW5kZXggPSB1cGRhdGVkRWxlbWVudHMuZmluZEluZGV4KFxuICAgICAgKGVsZSkgPT4gZWxlLmlkID09PSBjb250YWluZXIuaWQsXG4gICAgKTtcbiAgICB1cGRhdGVkRWxlbWVudHMuc3BsaWNlKGNvbnRhaW5lckluZGV4ICsgMSwgMCwgdGV4dEVsZW1lbnQpO1xuICAgIHJldHVybiB7XG4gICAgICBlbGVtZW50czogdXBkYXRlZEVsZW1lbnRzLFxuICAgICAgYXBwU3RhdGU6IHsgLi4uYXBwU3RhdGUsIHNlbGVjdGVkRWxlbWVudElkczogeyBbY29udGFpbmVyLmlkXTogdHJ1ZSB9IH0sXG4gICAgICBjb21taXRUb0hpc3Rvcnk6IHRydWUsXG4gICAgfTtcbiAgfSxcbn0pO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../actions/actionBoundText.tsx\n");
|
|
1683
1683
|
|
|
1684
1684
|
/***/ }),
|
|
1685
1685
|
|
|
@@ -1987,7 +1987,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
1987
1987
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
1988
1988
|
|
|
1989
1989
|
"use strict";
|
|
1990
|
-
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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-
|
|
1990
|
+
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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-989b1cf\",\"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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-989b1cf\",\"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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsbTVCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksbTVCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
1991
1991
|
|
|
1992
1992
|
/***/ }),
|
|
1993
1993
|
|
|
@@ -3010,7 +3010,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3010
3010
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3011
3011
|
|
|
3012
3012
|
"use strict";
|
|
3013
|
-
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 */ \"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 */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\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 _newElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\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 let text = textElement.text;\n if (container) {\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n let coordY = textElement.y;\n let coordX = textElement.x;\n // Resize container and vertically center align the text\n if (container) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n const containerDims = getContainerDims(container);\n let nextHeight = containerDims.height;\n const boundTextElementPadding = getBoundTextElementOffset(textElement);\n if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n coordY = container.y + boundTextElementPadding;\n }\n else if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n metrics.height -\n boundTextElementPadding;\n }\n else {\n coordY = container.y + containerDims.height / 2 - metrics.height / 2;\n if (metrics.height > (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container)) {\n nextHeight = metrics.height + boundTextElementPadding * 2;\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\n }\n }\n if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n coordX = container.x + boundTextElementPadding;\n }\n else if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n coordX =\n container.x +\n containerDims.width -\n metrics.width -\n boundTextElementPadding;\n }\n else {\n coordX = container.x + containerDims.width / 2 - metrics.width / 2;\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n }\n else {\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 coordY = centerY - (textElement.height + diffHeight) / 2;\n coordX = centerX - (textElement.width + diffWidth) / 2;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n y: coordY,\n x: coordX,\n text,\n });\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: (newContainer.boundElements || []).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 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 = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n const maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\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), maxWidth);\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n nextBaseLine = dimensions.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = nextHeight + getBoundTextElementOffset(textElement) * 2;\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_6__.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 baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n updateBoundTextPosition(container, textElement);\n }\n }\n};\nconst updateBoundTextPosition = (container, boundTextElement) => {\n const containerDims = getContainerDims(container);\n const boundTextElementPadding = getBoundTextElementOffset(boundTextElement);\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = container.y + boundTextElementPadding;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y =\n container.y +\n containerDims.height -\n boundTextElement.height -\n boundTextElementPadding;\n }\n else {\n y = container.y + containerDims.height / 2 - boundTextElement.height / 2;\n }\n const x = boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT\n ? container.x + boundTextElementPadding\n : boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT\n ? container.x +\n containerDims.width -\n boundTextElement.width -\n boundTextElementPadding\n : container.x + containerDims.width / 2 - boundTextElement.width / 2;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(boundTextElement, { x, y });\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, maxWidth) => {\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 container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (maxWidth) {\n const lineHeight = getApproxLineHeight(font);\n container.style.width = `${String(maxWidth + 1)}px`;\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.lineHeight = `${String(lineHeight)}px`;\n container.style.whiteSpace = \"pre-wrap\";\n }\n document.body.appendChild(container);\n container.innerText = text;\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n // Baseline is important for positioning text on canvas\n const baseline = span.offsetTop + span.offsetHeight;\n // Since span adds 1px extra width to the container\n const width = container.offsetWidth - 1;\n const height = container.offsetHeight;\n document.body.removeChild(container);\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return { width, height, baseline, container };\n }\n return { width, height, baseline };\n};\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight = {};\nconst getApproxLineHeight = (font) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\n return cacheApproxLineHeight[font];\n};\nlet canvas;\nconst getTextWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const metrics = canvas2dContext.measureText(text);\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 metrics.width * 10;\n }\n return metrics.width;\n};\nconst wrapText = (text, font, maxWidth) => {\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getTextWidth(\" \", 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 }\n else {\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getTextWidth(words[index], font);\n // Start breaking longer words exceeding max width\n 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 = words[index][0];\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(1);\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 if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\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 = getTextWidth(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 });\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 = getTextWidth(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 += getTextWidth(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 = getTextWidth(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_6__.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_6__.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_7__.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_7__.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_7__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.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_6__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.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_6__.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_8__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.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_6__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_9__.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_6__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst isValidTextContainer = (element) => {\n return (element.type === \"rectangle\" ||\n element.type === \"ellipse\" ||\n element.type === \"diamond\" ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isImageElement)(element) ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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ZWxlbWVudC90ZXh0RWxlbWVudC50cz80MmQyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdldEZvbnRTdHJpbmcsIGFycmF5VG9NYXAsIGlzVGVzdEVudiB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gIEZvbnRTdHJpbmcsXG4gIE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IG11dGF0ZUVsZW1lbnQgfSBmcm9tIFwiLi9tdXRhdGVFbGVtZW50XCI7XG5pbXBvcnQgeyBCT1VORF9URVhUX1BBRERJTkcsIFRFWFRfQUxJR04sIFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlIH0gZnJvbSBcIi4vdHJhbnNmb3JtSGFuZGxlc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHsgaXNUZXh0RWxlbWVudCB9IGZyb20gXCIuXCI7XG5pbXBvcnQgeyBnZXRNYXhDb250YWluZXJIZWlnaHQsIGdldE1heENvbnRhaW5lcldpZHRoIH0gZnJvbSBcIi4vbmV3RWxlbWVudFwiO1xuaW1wb3J0IHtcbiAgaXNCb3VuZFRvQ29udGFpbmVyLFxuICBpc0ltYWdlRWxlbWVudCxcbiAgaXNBcnJvd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IExpbmVhckVsZW1lbnRFZGl0b3IgfSBmcm9tIFwiLi9saW5lYXJFbGVtZW50RWRpdG9yXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgaXNUZXh0QmluZGFibGVDb250YWluZXIgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgZ2V0U2VsZWN0ZWRFbGVtZW50cyB9IGZyb20gXCIuLi9zY2VuZVwiO1xuaW1wb3J0IHsgaXNIaXR0aW5nRWxlbWVudE5vdENvbnNpZGVyaW5nQm91bmRpbmdCb3ggfSBmcm9tIFwiLi9jb2xsaXNpb25cIjtcblxuZXhwb3J0IGNvbnN0IG5vcm1hbGl6ZVRleHQgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIHJldHVybiAoXG4gICAgdGV4dFxuICAgICAgLy8gcmVwbGFjZSB0YWJzIHdpdGggc3BhY2VzIHNvIHRoZXkgcmVuZGVyIGFuZCBtZWFzdXJlIGNvcnJlY3RseVxuICAgICAgLnJlcGxhY2UoL1xcdC9nLCBcIiAgICAgICAgXCIpXG4gICAgICAvLyBub3JtYWxpemUgbmV3bGluZXNcbiAgICAgIC5yZXBsYWNlKC9cXHI/XFxufFxcci9nLCBcIlxcblwiKVxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHJlZHJhd1RleHRCb3VuZGluZ0JveCA9IChcbiAgdGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwsXG4pID0+IHtcbiAgbGV0IG1heFdpZHRoID0gdW5kZWZpbmVkO1xuICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICBtYXhXaWR0aCxcbiAgICApO1xuICB9XG4gIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dCh0ZXh0LCBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSwgbWF4V2lkdGgpO1xuICBsZXQgY29vcmRZID0gdGV4dEVsZW1lbnQueTtcbiAgbGV0IGNvb3JkWCA9IHRleHRFbGVtZW50Lng7XG4gIC8vIFJlc2l6ZSBjb250YWluZXIgYW5kIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICBsZXQgbmV4dEhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgPSBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KHRleHRFbGVtZW50KTtcbiAgICAgIGlmICh0ZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZztcbiAgICAgIH0gZWxzZSBpZiAodGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgY29udGFpbmVyLnkgK1xuICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgICAgICBtZXRyaWNzLmhlaWdodCAtXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICAgICAgaWYgKG1ldHJpY3MuaGVpZ2h0ID4gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBuZXh0SGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBuZXh0SGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUKSB7XG4gICAgICAgIGNvb3JkWCA9IGNvbnRhaW5lci54ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2UgaWYgKHRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5SSUdIVCkge1xuICAgICAgICBjb29yZFggPVxuICAgICAgICAgIGNvbnRhaW5lci54ICtcbiAgICAgICAgICBjb250YWluZXJEaW1zLndpZHRoIC1cbiAgICAgICAgICBtZXRyaWNzLndpZHRoIC1cbiAgICAgICAgICBib3VuZFRleHRFbGVtZW50UGFkZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvb3JkWCA9IGNvbnRhaW5lci54ICsgY29udGFpbmVyRGltcy53aWR0aCAvIDIgLSBtZXRyaWNzLndpZHRoIC8gMjtcbiAgICAgIH1cblxuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjZW50ZXJYID0gdGV4dEVsZW1lbnQueCArIHRleHRFbGVtZW50LndpZHRoIC8gMjtcbiAgICAgIGNvbnN0IGNlbnRlclkgPSB0ZXh0RWxlbWVudC55ICsgdGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgICAgIGNvbnN0IGRpZmZXaWR0aCA9IG1ldHJpY3Mud2lkdGggLSB0ZXh0RWxlbWVudC53aWR0aDtcbiAgICAgIGNvbnN0IGRpZmZIZWlnaHQgPSBtZXRyaWNzLmhlaWdodCAtIHRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIGNvb3JkWSA9IGNlbnRlclkgLSAodGV4dEVsZW1lbnQuaGVpZ2h0ICsgZGlmZkhlaWdodCkgLyAyO1xuICAgICAgY29vcmRYID0gY2VudGVyWCAtICh0ZXh0RWxlbWVudC53aWR0aCArIGRpZmZXaWR0aCkgLyAyO1xuICAgIH1cbiAgfVxuICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgd2lkdGg6IG1ldHJpY3Mud2lkdGgsXG4gICAgaGVpZ2h0OiBtZXRyaWNzLmhlaWdodCxcbiAgICBiYXNlbGluZTogbWV0cmljcy5iYXNlbGluZSxcbiAgICB5OiBjb29yZFksXG4gICAgeDogY29vcmRYLFxuICAgIHRleHQsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGJpbmRUZXh0VG9TaGFwZUFmdGVyRHVwbGljYXRpb24gPSAoXG4gIHNjZW5lRWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIG9sZEVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRJZFRvRHVwbGljYXRlZElkOiBNYXA8RXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSwgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXT4sXG4pOiB2b2lkID0+IHtcbiAgY29uc3Qgc2NlbmVFbGVtZW50TWFwID0gYXJyYXlUb01hcChzY2VuZUVsZW1lbnRzKSBhcyBNYXA8XG4gICAgRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSxcbiAgICBFeGNhbGlkcmF3RWxlbWVudFxuICA+O1xuICBvbGRFbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgbmV3RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoZWxlbWVudC5pZCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcblxuICAgIGlmIChib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50SWQgPSBvbGRJZFRvRHVwbGljYXRlZElkLmdldChib3VuZFRleHRFbGVtZW50SWQpO1xuICAgICAgaWYgKG5ld1RleHRFbGVtZW50SWQpIHtcbiAgICAgICAgY29uc3QgbmV3Q29udGFpbmVyID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3Q29udGFpbmVyKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdDb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChuZXdDb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBuZXdUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3VGV4dEVsZW1lbnQgPSBzY2VuZUVsZW1lbnRNYXAuZ2V0KG5ld1RleHRFbGVtZW50SWQpO1xuICAgICAgICBpZiAobmV3VGV4dEVsZW1lbnQgJiYgaXNUZXh0RWxlbWVudChuZXdUZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KG5ld1RleHRFbGVtZW50LCB7XG4gICAgICAgICAgICBjb250YWluZXJJZDogbmV3Q29udGFpbmVyID8gbmV3RWxlbWVudElkIDogbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgaGFuZGxlQmluZFRleHRSZXNpemUgPSAoXG4gIGNvbnRhaW5lcjogTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxuICB0cmFuc2Zvcm1IYW5kbGVUeXBlOiBNYXliZVRyYW5zZm9ybUhhbmRsZVR5cGUsXG4pID0+IHtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGNvbnRhaW5lcik7XG4gIGlmICghYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgYm91bmRUZXh0RWxlbWVudElkLFxuICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgbGV0IG5leHRXaWR0aCA9IHRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IGdldE1heENvbnRhaW5lckhlaWdodChjb250YWluZXIpO1xuICAgIGxldCBjb250YWluZXJIZWlnaHQgPSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICBsZXQgbmV4dEJhc2VMaW5lID0gdGV4dEVsZW1lbnQuYmFzZWxpbmU7XG4gICAgaWYgKHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwiblwiICYmIHRyYW5zZm9ybUhhbmRsZVR5cGUgIT09IFwic1wiKSB7XG4gICAgICBpZiAodGV4dCkge1xuICAgICAgICB0ZXh0ID0gd3JhcFRleHQoXG4gICAgICAgICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgZGltZW5zaW9ucyA9IG1lYXN1cmVUZXh0KFxuICAgICAgICB0ZXh0LFxuICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgbWF4V2lkdGgsXG4gICAgICApO1xuICAgICAgbmV4dEhlaWdodCA9IGRpbWVuc2lvbnMuaGVpZ2h0O1xuICAgICAgbmV4dFdpZHRoID0gZGltZW5zaW9ucy53aWR0aDtcbiAgICAgIG5leHRCYXNlTGluZSA9IGRpbWVuc2lvbnMuYmFzZWxpbmU7XG4gICAgfVxuICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBuZXh0SGVpZ2h0ICsgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCh0ZXh0RWxlbWVudCkgKiAyO1xuICAgICAgY29uc3QgZGlmZiA9IGNvbnRhaW5lckhlaWdodCAtIGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgLy8gZml4IHRoZSB5IGNvb3JkIHdoZW4gcmVzaXppbmcgZnJvbSBuZS9udy9uXG4gICAgICBjb25zdCB1cGRhdGVkWSA9XG4gICAgICAgICFpc0Fycm93RWxlbWVudChjb250YWluZXIpICYmXG4gICAgICAgICh0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5lXCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm53XCIgfHxcbiAgICAgICAgICB0cmFuc2Zvcm1IYW5kbGVUeXBlID09PSBcIm5cIilcbiAgICAgICAgICA/IGNvbnRhaW5lci55IC0gZGlmZlxuICAgICAgICAgIDogY29udGFpbmVyLnk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICBoZWlnaHQ6IGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgeTogdXBkYXRlZFksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCB7XG4gICAgICB0ZXh0LFxuICAgICAgd2lkdGg6IG5leHRXaWR0aCxcbiAgICAgIGhlaWdodDogbmV4dEhlaWdodCxcblxuICAgICAgYmFzZWxpbmU6IG5leHRCYXNlTGluZSxcbiAgICB9KTtcbiAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIHVwZGF0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICBjb250YWluZXIsXG4gICAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgICApO1xuICAgIH1cbiAgfVxufTtcblxuY29uc3QgdXBkYXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgPSBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBsZXQgeTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uVE9QKSB7XG4gICAgeSA9IGNvbnRhaW5lci55ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID1cbiAgICAgIGNvbnRhaW5lci55ICtcbiAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC1cbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nO1xuICB9IGVsc2Uge1xuICAgIHkgPSBjb250YWluZXIueSArIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0IC8gMjtcbiAgfVxuICBjb25zdCB4ID1cbiAgICBib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUXG4gICAgICA/IGNvbnRhaW5lci54ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmdcbiAgICAgIDogYm91bmRUZXh0RWxlbWVudC50ZXh0QWxpZ24gPT09IFRFWFRfQUxJR04uUklHSFRcbiAgICAgID8gY29udGFpbmVyLnggK1xuICAgICAgICBjb250YWluZXJEaW1zLndpZHRoIC1cbiAgICAgICAgYm91bmRUZXh0RWxlbWVudC53aWR0aCAtXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRQYWRkaW5nXG4gICAgICA6IGNvbnRhaW5lci54ICsgY29udGFpbmVyRGltcy53aWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMjtcblxuICBtdXRhdGVFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQsIHsgeCwgeSB9KTtcbn07XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ3Jhc3NhdG9yL2NhbnZhcy10ZXh0LWVkaXRvci9ibG9iL21hc3Rlci9saWIvRm9udE1ldHJpY3MuanNcbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBtYXhXaWR0aD86IG51bWJlciB8IG51bGwsXG4pID0+IHtcbiAgdGV4dCA9IHRleHRcbiAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAvLyByZXBsYWNlIGVtcHR5IGxpbmVzIHdpdGggc2luZ2xlIHNwYWNlIGJlY2F1c2UgbGVhZGluZy90cmFpbGluZyBlbXB0eVxuICAgIC8vIGxpbmVzIHdvdWxkIGJlIHN0cmlwcGVkIGZyb20gY29tcHV0YXRpb25cbiAgICAubWFwKCh4KSA9PiB4IHx8IFwiIFwiKVxuICAgIC5qb2luKFwiXFxuXCIpO1xuICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICBjb250YWluZXIuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG4gIGNvbnRhaW5lci5zdHlsZS53aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgY29udGFpbmVyLnN0eWxlLmZvbnQgPSBmb250O1xuICBjb250YWluZXIuc3R5bGUubWluSGVpZ2h0ID0gXCIxZW1cIjtcbiAgaWYgKG1heFdpZHRoKSB7XG4gICAgY29uc3QgbGluZUhlaWdodCA9IGdldEFwcHJveExpbmVIZWlnaHQoZm9udCk7XG4gICAgY29udGFpbmVyLnN0eWxlLndpZHRoID0gYCR7U3RyaW5nKG1heFdpZHRoICsgMSl9cHhgO1xuICAgIGNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndvcmRCcmVhayA9IFwiYnJlYWstd29yZFwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS5saW5lSGVpZ2h0ID0gYCR7U3RyaW5nKGxpbmVIZWlnaHQpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUud2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgfVxuICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG4gIGNvbnRhaW5lci5pbm5lclRleHQgPSB0ZXh0O1xuXG4gIGNvbnN0IHNwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTtcbiAgc3Bhbi5zdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcbiAgc3Bhbi5zdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG4gIHNwYW4uc3R5bGUud2lkdGggPSBcIjFweFwiO1xuICBzcGFuLnN0eWxlLmhlaWdodCA9IFwiMXB4XCI7XG4gIGNvbnRhaW5lci5hcHBlbmRDaGlsZChzcGFuKTtcbiAgLy8gQmFzZWxpbmUgaXMgaW1wb3J0YW50IGZvciBwb3NpdGlvbmluZyB0ZXh0IG9uIGNhbnZhc1xuICBjb25zdCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIC8vIFNpbmNlIHNwYW4gYWRkcyAxcHggZXh0cmEgd2lkdGggdG8gdGhlIGNvbnRhaW5lclxuICBjb25zdCB3aWR0aCA9IGNvbnRhaW5lci5vZmZzZXRXaWR0aCAtIDE7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUsIGNvbnRhaW5lciB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoLCBoZWlnaHQsIGJhc2VsaW5lIH07XG59O1xuXG5jb25zdCBEVU1NWV9URVhUID0gXCJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODlcIi50b0xvY2FsZVVwcGVyQ2FzZSgpO1xuY29uc3QgY2FjaGVBcHByb3hMaW5lSGVpZ2h0OiB7IFtrZXk6IEZvbnRTdHJpbmddOiBudW1iZXIgfSA9IHt9O1xuXG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TGluZUhlaWdodCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGlmIChjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF0pIHtcbiAgICByZXR1cm4gY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdO1xuICB9XG4gIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XSA9IG1lYXN1cmVUZXh0KERVTU1ZX1RFWFQsIGZvbnQsIG51bGwpLmhlaWdodDtcbiAgcmV0dXJuIGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XTtcbn07XG5cbmxldCBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgdW5kZWZpbmVkO1xuY29uc3QgZ2V0VGV4dFdpZHRoID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZykgPT4ge1xuICBpZiAoIWNhbnZhcykge1xuICAgIGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gIH1cbiAgY29uc3QgY2FudmFzMmRDb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKSE7XG4gIGNhbnZhczJkQ29udGV4dC5mb250ID0gZm9udDtcblxuICBjb25zdCBtZXRyaWNzID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpO1xuICAvLyBzaW5jZSBpbiB0ZXN0IGVudiB0aGUgY2FudmFzIG1lYXN1cmVUZXh0IGFsZ29cbiAgLy8gZG9lc24ndCBtZWFzdXJlIHRleHQgYW5kIGluc3RlYWQganVzdCByZXR1cm5zIG51bWJlciBvZlxuICAvLyBjaGFyYWN0ZXJzIGhlbmNlIHdlIGFzc3VtZSB0aGF0IGVhY2ggbGV0dGVyaXMgMTBweFxuICBpZiAoaXNUZXN0RW52KCkpIHtcbiAgICByZXR1cm4gbWV0cmljcy53aWR0aCAqIDEwO1xuICB9XG5cbiAgcmV0dXJuIG1ldHJpY3Mud2lkdGg7XG59O1xuXG5leHBvcnQgY29uc3Qgd3JhcFRleHQgPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nLCBtYXhXaWR0aDogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGxpbmVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gIGNvbnN0IG9yaWdpbmFsTGluZXMgPSB0ZXh0LnNwbGl0KFwiXFxuXCIpO1xuICBjb25zdCBzcGFjZVdpZHRoID0gZ2V0VGV4dFdpZHRoKFwiIFwiLCBmb250KTtcblxuICBjb25zdCBwdXNoID0gKHN0cjogc3RyaW5nKSA9PiB7XG4gICAgaWYgKHN0ci50cmltKCkpIHtcbiAgICAgIGxpbmVzLnB1c2goc3RyKTtcbiAgICB9XG4gIH07XG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3Qgd29yZHMgPSBvcmlnaW5hbExpbmUuc3BsaXQoXCIgXCIpO1xuICAgIC8vIFRoaXMgbWVhbnMgaXRzIG5ld2xpbmUgc28gcHVzaCBpdFxuICAgIGlmICh3b3Jkcy5sZW5ndGggPT09IDEgJiYgd29yZHNbMF0gPT09IFwiXCIpIHtcbiAgICAgIGxpbmVzLnB1c2god29yZHNbMF0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgbGV0IGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcblxuICAgICAgbGV0IGluZGV4ID0gMDtcbiAgICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBjdXJyZW50V29yZFdpZHRoID0gZ2V0VGV4dFdpZHRoKHdvcmRzW2luZGV4XSwgZm9udCk7XG5cbiAgICAgICAgLy8gU3RhcnQgYnJlYWtpbmcgbG9uZ2VyIHdvcmRzIGV4Y2VlZGluZyBtYXggd2lkdGhcbiAgICAgICAgaWYgKGN1cnJlbnRXb3JkV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBzaW5jZSB0aGUgY3VycmVudCB3b3JkIGV4Y2VlZHMgdGhlIG1heCB3aWR0aFxuICAgICAgICAgIC8vIHNvIHdpbGwgYmUgYXBwZW5kZWQgaW4gbmV4dCBsaW5lXG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICB3aGlsZSAod29yZHNbaW5kZXhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gd29yZHNbaW5kZXhdWzBdO1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICs9IHdpZHRoO1xuICAgICAgICAgICAgd29yZHNbaW5kZXhdID0gd29yZHNbaW5kZXhdLnNsaWNlKDEpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gb25seSByZW1vdmUgbGFzdCB0cmFpbGluZyBzcGFjZSB3aGljaCB3ZSBoYXZlIGFkZGVkIHdoZW4gam9pbmluZyB3b3Jkc1xuICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmUuc2xpY2UoLTEpID09PSBcIiBcIikge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IHdpZHRoO1xuICAgICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPT09IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgICAvLyBhcyBjdXJyZW50TGluZSBjb250YWlucyBjaGFycyB3aGljaCBjb3VsZG4ndCBiZSBhcHBlbmRlZFxuICAgICAgICAgICAgLy8gdG8gcHJldmlvdXMgbGluZVxuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSBzcGFjZVdpZHRoO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgICAgd2hpbGUgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93IDwgbWF4V2lkdGggJiYgaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSB3b3Jkc1tpbmRleF07XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldFRleHRXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuXG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW5kZXgrKztcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGAke3dvcmR9IGA7XG5cbiAgICAgICAgICAgIC8vIFB1c2ggdGhlIHdvcmQgaWYgYXBwZW5kaW5nIHNwYWNlIGV4Y2VlZHMgbWF4IHdpZHRoXG4gICAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBjdXJyZW50TGluZS5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICAgIHB1c2god29yZCk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID09PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRMaW5lKSB7XG4gICAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGFyV2lkdGggPSAoKCkgPT4ge1xuICBjb25zdCBjYWNoZWRDaGFyV2lkdGg6IHsgW2tleTogRm9udFN0cmluZ106IEFycmF5PG51bWJlcj4gfSA9IHt9O1xuXG4gIGNvbnN0IGNhbGN1bGF0ZSA9IChjaGFyOiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICBjb25zdCBhc2NpaSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XSkge1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdID0gW107XG4gICAgfVxuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSkge1xuICAgICAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgoY2hhciwgZm9udCk7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q2FjaGUgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF07XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlLFxuICAgIGdldENhY2hlLFxuICB9O1xufSkoKTtcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBtYXhDaGFyV2lkdGggPSBnZXRNYXhDaGFyV2lkdGgoZm9udCk7XG5cbiAgaWYgKG1heENoYXJXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBtZWFzdXJlVGV4dChEVU1NWV9URVhULnNwbGl0KFwiXCIpLmpvaW4oXCJcXG5cIiksIGZvbnQpLndpZHRoICtcbiAgICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICApO1xuICB9XG4gIHJldHVybiBtYXhDaGFyV2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIE1hdGgubWF4KC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0VGV4dFdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRUZXh0V2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8ubGVuZ3RoXG4gICAgPyBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZCB8fFxuICAgICAgICBudWxsXG4gICAgOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcikgfHwgbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRWxlbWVudCA9IChcbiAgZWxlbWVudDpcbiAgICB8IChFeGNhbGlkcmF3RWxlbWVudCAmIHtcbiAgICAgICAgY29udGFpbmVySWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gfCBudWxsO1xuICAgICAgfSlcbiAgICB8IG51bGwsXG4pID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5jb250YWluZXJJZCkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJEaW1zID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IE1JTl9XSURUSCA9IDMwMDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChlbGVtZW50LndpZHRoLCBNSU5fV0lEVEgpO1xuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuICByZXR1cm4geyB3aWR0aDogZWxlbWVudC53aWR0aCwgaGVpZ2h0OiBlbGVtZW50LmhlaWdodCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckNlbnRlciA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjb250YWluZXIueCArIGNvbnRhaW5lci53aWR0aCAvIDIsXG4gICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhjb250YWluZXIpO1xuICBpZiAocG9pbnRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY29udGFpbmVyLnBvaW50cy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBtaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGNvbnRhaW5lci5wb2ludHNbaW5kZXhdLFxuICAgICk7XG4gICAgcmV0dXJuIHsgeDogbWlkUG9pbnRbMF0sIHk6IG1pZFBvaW50WzFdIH07XG4gIH1cbiAgY29uc3QgaW5kZXggPSBjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIgLSAxO1xuICBsZXQgbWlkU2VnbWVudE1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoXG4gICAgY29udGFpbmVyLFxuICAgIGFwcFN0YXRlLFxuICApW2luZGV4XTtcbiAgaWYgKCFtaWRTZWdtZW50TWlkcG9pbnQpIHtcbiAgICBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBvaW50c1tpbmRleF0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgIGluZGV4ICsgMSxcbiAgICApO1xuICB9XG4gIHJldHVybiB7IHg6IG1pZFNlZ21lbnRNaWRwb2ludFswXSwgeTogbWlkU2VnbWVudE1pZHBvaW50WzFdIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEVsZW1lbnRBbmdsZSA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHRleHRFbGVtZW50LmFuZ2xlO1xuICB9XG4gIHJldHVybiBjb250YWluZXIuYW5nbGU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCA9IChcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORyAqIDg7XG4gIH1cbiAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICBjb250YWluZXIsXG4gICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG91bGRBbGxvd1ZlcnRpY2FsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRCaW5kYWJsZUNvbnRhaW5lckF0UG9zaXRpb24gPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogRXhjYWxpZHJhd1RleHRDb250YWluZXIgfCBudWxsID0+IHtcbiAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKHNlbGVjdGVkRWxlbWVudHNbMF0sIGZhbHNlKVxuICAgICAgPyBzZWxlY3RlZEVsZW1lbnRzWzBdXG4gICAgICA6IG51bGw7XG4gIH1cbiAgbGV0IGhpdEVsZW1lbnQgPSBudWxsO1xuICAvLyBXZSBuZWVkIHRvIHRvIGhpdCB0ZXN0aW5nIGZyb20gZnJvbnQgKGVuZCBvZiB0aGUgYXJyYXkpIHRvIGJhY2sgKGJlZ2lubmluZyBvZiB0aGUgYXJyYXkpXG4gIGZvciAobGV0IGluZGV4ID0gZWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgLS1pbmRleCkge1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0uaXNEZWxldGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50c1tpbmRleF0pO1xuICAgIGlmIChcbiAgICAgIGlzQXJyb3dFbGVtZW50KGVsZW1lbnRzW2luZGV4XSkgJiZcbiAgICAgIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnRzW2luZGV4XSwgYXBwU3RhdGUsIFtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIF0pXG4gICAgKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh4MSA8IHggJiYgeCA8IHgyICYmIHkxIDwgeSAmJiB5IDwgeTIpIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoaGl0RWxlbWVudCwgZmFsc2UpID8gaGl0RWxlbWVudCA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZFRleHRDb250YWluZXIgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIgfHxcbiAgICBlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiIHx8XG4gICAgZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIiB8fFxuICAgIGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpIHx8XG4gICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudClcbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3013
|
+
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 */ \"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 */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getMaxCharWidth\": () => (/* binding */ getMaxCharWidth),\n/* harmony export */ \"getMinCharWidth\": () => (/* binding */ getMinCharWidth),\n/* harmony export */ \"getTextBindableContainerAtPosition\": () => (/* binding */ getTextBindableContainerAtPosition),\n/* harmony export */ \"getTextElementAngle\": () => (/* binding */ getTextElementAngle),\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 _newElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n\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 let text = textElement.text;\n if (container) {\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n let coordY = textElement.y;\n let coordX = textElement.x;\n // Resize container and vertically center align the text\n if (container) {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n const containerDims = getContainerDims(container);\n let nextHeight = containerDims.height;\n const boundTextElementPadding = getBoundTextElementOffset(textElement);\n if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n coordY = container.y + boundTextElementPadding;\n }\n else if (textElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n metrics.height -\n boundTextElementPadding;\n }\n else {\n coordY = container.y + containerDims.height / 2 - metrics.height / 2;\n if (metrics.height > (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container)) {\n nextHeight = metrics.height + boundTextElementPadding * 2;\n coordY = container.y + nextHeight / 2 - metrics.height / 2;\n }\n }\n if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n coordX = container.x + boundTextElementPadding;\n }\n else if (textElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n coordX =\n container.x +\n containerDims.width -\n metrics.width -\n boundTextElementPadding;\n }\n else {\n coordX = container.x + containerDims.width / 2 - metrics.width / 2;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_10__.updateOriginalContainerCache)(container.id, nextHeight);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n }\n else {\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 coordY = centerY - (textElement.height + diffHeight) / 2;\n coordX = centerX - (textElement.width + diffWidth) / 2;\n }\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n width: metrics.width,\n height: metrics.height,\n baseline: metrics.baseline,\n y: coordY,\n x: coordX,\n text,\n });\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: (newContainer.boundElements || []).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_10__.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 = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerWidth)(container);\n const maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_5__.getMaxContainerHeight)(container);\n let containerHeight = containerDims.height;\n let nextBaseLine = textElement.baseline;\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), maxWidth);\n nextHeight = dimensions.height;\n nextWidth = dimensions.width;\n nextBaseLine = dimensions.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = nextHeight + getBoundTextElementOffset(textElement) * 2;\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_6__.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 baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n updateBoundTextPosition(container, textElement);\n }\n }\n};\nconst updateBoundTextPosition = (container, boundTextElement) => {\n const containerDims = getContainerDims(container);\n const boundTextElementPadding = getBoundTextElementOffset(boundTextElement);\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = container.y + boundTextElementPadding;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y =\n container.y +\n containerDims.height -\n boundTextElement.height -\n boundTextElementPadding;\n }\n else {\n y = container.y + containerDims.height / 2 - boundTextElement.height / 2;\n }\n const x = boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT\n ? container.x + boundTextElementPadding\n : boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT\n ? container.x +\n containerDims.width -\n boundTextElement.width -\n boundTextElementPadding\n : container.x + containerDims.width / 2 - boundTextElement.width / 2;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(boundTextElement, { x, y });\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, maxWidth) => {\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 container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.whiteSpace = \"pre\";\n container.style.font = font;\n container.style.minHeight = \"1em\";\n if (maxWidth) {\n const lineHeight = getApproxLineHeight(font);\n container.style.maxWidth = `${String(maxWidth)}px`;\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.lineHeight = `${String(lineHeight)}px`;\n container.style.whiteSpace = \"pre-wrap\";\n }\n document.body.appendChild(container);\n container.innerText = text;\n const span = document.createElement(\"span\");\n span.style.display = \"inline-block\";\n span.style.overflow = \"hidden\";\n span.style.width = \"1px\";\n span.style.height = \"1px\";\n container.appendChild(span);\n // Baseline is important for positioning text on canvas\n const baseline = span.offsetTop + span.offsetHeight;\n // Since span adds 1px extra width to the container\n const width = container.offsetWidth + 1;\n const height = container.offsetHeight;\n document.body.removeChild(container);\n return { width, height, baseline };\n};\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight = {};\nconst getApproxLineHeight = (font) => {\n if (cacheApproxLineHeight[font]) {\n return cacheApproxLineHeight[font];\n }\n cacheApproxLineHeight[font] = measureText(DUMMY_TEXT, font, null).height;\n return cacheApproxLineHeight[font];\n};\nlet canvas;\nconst getTextWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const metrics = canvas2dContext.measureText(text);\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 metrics.width * 10;\n }\n return metrics.width;\n};\nconst wrapText = (text, font, maxWidth) => {\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getTextWidth(\" \", font);\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 }\n else {\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getTextWidth(words[index], font);\n // Start breaking longer words exceeding max width\n if (currentWordWidth >= maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n if (currentLine) {\n lines.push(currentLine);\n }\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n while (words[index].length > 0) {\n const currentChar = words[index][0];\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(1);\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 lines.push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n if (currentLineWidthTillNow === maxWidth) {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n }\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n lines.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 = getTextWidth(currentLine + word, font);\n if (currentLineWidthTillNow >= maxWidth) {\n lines.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 lines.push(currentLine.slice(0, -1));\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 lines.push(currentLine);\n }\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 = getTextWidth(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 += getTextWidth(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 = getTextWidth(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_6__.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_6__.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_7__.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_7__.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_7__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.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_6__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_7__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.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_6__.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_8__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.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_6__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_9__.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_6__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst isValidTextContainer = (element) => {\n return (element.type === \"rectangle\" ||\n element.type === \"ellipse\" ||\n element.type === \"diamond\" ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isImageElement)(element) ||\n (0,_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isArrowElement)(element));\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFTLEVBQUU7WUFDN0IsU0FBUztTQUNWO1FBQ0QsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLDJEQUF3QixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQ0UsMkRBQWMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDL0IscUZBQXlDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRTtnQkFDbkUsQ0FBQztnQkFDRCxDQUFDO2FBQ0YsQ0FBQyxFQUNGO1lBQ0EsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixNQUFNO1NBQ1A7YUFBTSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDL0MsVUFBVSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM3QixNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU8sb0VBQXVCLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUN4RSxDQUFDLENBQUM7QUFFSyxNQUFNLG9CQUFvQixHQUFHLENBQUMsT0FBMEIsRUFBRSxFQUFFO0lBQ2pFLE9BQU8sQ0FDTCxPQUFPLENBQUMsSUFBSSxLQUFLLFdBQVc7UUFDNUIsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO1FBQzFCLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUztRQUMxQiwyREFBYyxDQUFDLE9BQU8sQ0FBQztRQUN2QiwyREFBYyxDQUFDLE9BQU8sQ0FBQyxDQUN4QixDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2VsZW1lbnQvdGV4dEVsZW1lbnQudHM/NDJkMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRGb250U3RyaW5nLCBhcnJheVRvTWFwLCBpc1Rlc3RFbnYgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcixcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBGb250U3RyaW5nLFxuICBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBtdXRhdGVFbGVtZW50IH0gZnJvbSBcIi4vbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IHsgQk9VTkRfVEVYVF9QQURESU5HLCBURVhUX0FMSUdOLCBWRVJUSUNBTF9BTElHTiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLlwiO1xuaW1wb3J0IHsgZ2V0TWF4Q29udGFpbmVySGVpZ2h0LCBnZXRNYXhDb250YWluZXJXaWR0aCB9IGZyb20gXCIuL25ld0VsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNJbWFnZUVsZW1lbnQsXG4gIGlzQXJyb3dFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCByZWRyYXdUZXh0Qm91bmRpbmdCb3ggPSAoXG4gIHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGxldCBtYXhXaWR0aCA9IHVuZGVmaW5lZDtcbiAgbGV0IHRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuICBpZiAoY29udGFpbmVyKSB7XG4gICAgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgbWF4V2lkdGgsXG4gICAgKTtcbiAgfVxuICBjb25zdCBtZXRyaWNzID0gbWVhc3VyZVRleHQoXG4gICAgdGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0LFxuICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgIG1heFdpZHRoLFxuICApO1xuICBsZXQgY29vcmRZID0gdGV4dEVsZW1lbnQueTtcbiAgbGV0IGNvb3JkWCA9IHRleHRFbGVtZW50Lng7XG4gIC8vIFJlc2l6ZSBjb250YWluZXIgYW5kIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gIGlmIChjb250YWluZXIpIHtcbiAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICBsZXQgbmV4dEhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgICAgY29uc3QgYm91bmRUZXh0RWxlbWVudFBhZGRpbmcgPSBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KHRleHRFbGVtZW50KTtcbiAgICAgIGlmICh0ZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZztcbiAgICAgIH0gZWxzZSBpZiAodGV4dEVsZW1lbnQudmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgY29udGFpbmVyLnkgK1xuICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgICAgICBtZXRyaWNzLmhlaWdodCAtXG4gICAgICAgICAgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb29yZFkgPSBjb250YWluZXIueSArIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICAgICAgaWYgKG1ldHJpY3MuaGVpZ2h0ID4gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICBuZXh0SGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZyAqIDI7XG4gICAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBuZXh0SGVpZ2h0IC8gMiAtIG1ldHJpY3MuaGVpZ2h0IC8gMjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUKSB7XG4gICAgICAgIGNvb3JkWCA9IGNvbnRhaW5lci54ICsgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gICAgICB9IGVsc2UgaWYgKHRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5SSUdIVCkge1xuICAgICAgICBjb29yZFggPVxuICAgICAgICAgIGNvbnRhaW5lci54ICtcbiAgICAgICAgICBjb250YWluZXJEaW1zLndpZHRoIC1cbiAgICAgICAgICBtZXRyaWNzLndpZHRoIC1cbiAgICAgICAgICBib3VuZFRleHRFbGVtZW50UGFkZGluZztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvb3JkWCA9IGNvbnRhaW5lci54ICsgY29udGFpbmVyRGltcy53aWR0aCAvIDIgLSBtZXRyaWNzLndpZHRoIC8gMjtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoY29udGFpbmVyLmlkLCBuZXh0SGVpZ2h0KTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogbmV4dEhlaWdodCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY2VudGVyWCA9IHRleHRFbGVtZW50LnggKyB0ZXh0RWxlbWVudC53aWR0aCAvIDI7XG4gICAgICBjb25zdCBjZW50ZXJZID0gdGV4dEVsZW1lbnQueSArIHRleHRFbGVtZW50LmhlaWdodCAvIDI7XG4gICAgICBjb25zdCBkaWZmV2lkdGggPSBtZXRyaWNzLndpZHRoIC0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgICBjb25zdCBkaWZmSGVpZ2h0ID0gbWV0cmljcy5oZWlnaHQgLSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBjb29yZFkgPSBjZW50ZXJZIC0gKHRleHRFbGVtZW50LmhlaWdodCArIGRpZmZIZWlnaHQpIC8gMjtcbiAgICAgIGNvb3JkWCA9IGNlbnRlclggLSAodGV4dEVsZW1lbnQud2lkdGggKyBkaWZmV2lkdGgpIC8gMjtcbiAgICB9XG4gIH1cbiAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwge1xuICAgIHdpZHRoOiBtZXRyaWNzLndpZHRoLFxuICAgIGhlaWdodDogbWV0cmljcy5oZWlnaHQsXG4gICAgYmFzZWxpbmU6IG1ldHJpY3MuYmFzZWxpbmUsXG4gICAgeTogY29vcmRZLFxuICAgIHg6IGNvb3JkWCxcbiAgICB0ZXh0LFxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uID0gKFxuICBzY2VuZUVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkSWRUb0R1cGxpY2F0ZWRJZDogTWFwPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjZW5lRWxlbWVudE1hcCA9IGFycmF5VG9NYXAoc2NlbmVFbGVtZW50cykgYXMgTWFwPFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sXG4gICAgRXhjYWxpZHJhd0VsZW1lbnRcbiAgPjtcbiAgb2xkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpIGFzIHN0cmluZztcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCBuZXdUZXh0RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIGlmIChuZXdUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld0NvbnRhaW5lcikge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3Q29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAobmV3Q29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICBpZDogbmV3VGV4dEVsZW1lbnRJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1RleHRFbGVtZW50ID0gc2NlbmVFbGVtZW50TWFwLmdldChuZXdUZXh0RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld1RleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQobmV3VGV4dEVsZW1lbnQpKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChuZXdUZXh0RWxlbWVudCwge1xuICAgICAgICAgICAgY29udGFpbmVySWQ6IG5ld0NvbnRhaW5lciA/IG5ld0VsZW1lbnRJZCA6IG51bGwsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGhhbmRsZUJpbmRUZXh0UmVzaXplID0gKFxuICBjb250YWluZXI6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCxcbiAgdHJhbnNmb3JtSGFuZGxlVHlwZTogTWF5YmVUcmFuc2Zvcm1IYW5kbGVUeXBlLFxuKSA9PiB7XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybjtcbiAgfVxuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoY29udGFpbmVyLmlkKTtcbiAgbGV0IHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICBib3VuZFRleHRFbGVtZW50SWQsXG4gICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICBpZiAodGV4dEVsZW1lbnQgJiYgdGV4dEVsZW1lbnQudGV4dCkge1xuICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGV4dEVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShjb250YWluZXIpIS5nZXRFbGVtZW50KFxuICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGxldCB0ZXh0ID0gdGV4dEVsZW1lbnQudGV4dDtcbiAgICBsZXQgbmV4dEhlaWdodCA9IHRleHRFbGVtZW50LmhlaWdodDtcbiAgICBsZXQgbmV4dFdpZHRoID0gdGV4dEVsZW1lbnQud2lkdGg7XG4gICAgY29uc3QgY29udGFpbmVyRGltcyA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKTtcbiAgICBjb25zdCBtYXhXaWR0aCA9IGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG4gICAgbGV0IGNvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuICAgIGxldCBuZXh0QmFzZUxpbmUgPSB0ZXh0RWxlbWVudC5iYXNlbGluZTtcbiAgICBpZiAodHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJuXCIgJiYgdHJhbnNmb3JtSGFuZGxlVHlwZSAhPT0gXCJzXCIpIHtcbiAgICAgIGlmICh0ZXh0KSB7XG4gICAgICAgIHRleHQgPSB3cmFwVGV4dChcbiAgICAgICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBkaW1lbnNpb25zID0gbWVhc3VyZVRleHQoXG4gICAgICAgIHRleHQsXG4gICAgICAgIGdldEZvbnRTdHJpbmcodGV4dEVsZW1lbnQpLFxuICAgICAgICBtYXhXaWR0aCxcbiAgICAgICk7XG4gICAgICBuZXh0SGVpZ2h0ID0gZGltZW5zaW9ucy5oZWlnaHQ7XG4gICAgICBuZXh0V2lkdGggPSBkaW1lbnNpb25zLndpZHRoO1xuICAgICAgbmV4dEJhc2VMaW5lID0gZGltZW5zaW9ucy5iYXNlbGluZTtcbiAgICB9XG4gICAgLy8gaW5jcmVhc2UgaGVpZ2h0IGluIGNhc2UgdGV4dCBlbGVtZW50IGhlaWdodCBleGNlZWRzXG4gICAgaWYgKG5leHRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgIGNvbnRhaW5lckhlaWdodCA9IG5leHRIZWlnaHQgKyBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0KHRleHRFbGVtZW50KSAqIDI7XG4gICAgICBjb25zdCBkaWZmID0gY29udGFpbmVySGVpZ2h0IC0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgICAvLyBmaXggdGhlIHkgY29vcmQgd2hlbiByZXNpemluZyBmcm9tIG5lL253L25cbiAgICAgIGNvbnN0IHVwZGF0ZWRZID1cbiAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgKHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibmVcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwibndcIiB8fFxuICAgICAgICAgIHRyYW5zZm9ybUhhbmRsZVR5cGUgPT09IFwiblwiKVxuICAgICAgICAgID8gY29udGFpbmVyLnkgLSBkaWZmXG4gICAgICAgICAgOiBjb250YWluZXIueTtcbiAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgIGhlaWdodDogY29udGFpbmVySGVpZ2h0LFxuICAgICAgICB5OiB1cGRhdGVkWSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIG11dGF0ZUVsZW1lbnQodGV4dEVsZW1lbnQsIHtcbiAgICAgIHRleHQsXG4gICAgICB3aWR0aDogbmV4dFdpZHRoLFxuICAgICAgaGVpZ2h0OiBuZXh0SGVpZ2h0LFxuXG4gICAgICBiYXNlbGluZTogbmV4dEJhc2VMaW5lLFxuICAgIH0pO1xuICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgdXBkYXRlQm91bmRUZXh0UG9zaXRpb24oXG4gICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCB1cGRhdGVCb3VuZFRleHRQb3NpdGlvbiA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBjb250YWluZXJEaW1zID0gZ2V0Q29udGFpbmVyRGltcyhjb250YWluZXIpO1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50UGFkZGluZyA9IGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGxldCB5O1xuICBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICB5ID0gY29udGFpbmVyLnkgKyBib3VuZFRleHRFbGVtZW50UGFkZGluZztcbiAgfSBlbHNlIGlmIChib3VuZFRleHRFbGVtZW50LnZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLkJPVFRPTSkge1xuICAgIHkgPVxuICAgICAgY29udGFpbmVyLnkgK1xuICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQgLVxuICAgICAgYm91bmRUZXh0RWxlbWVudC5oZWlnaHQgLVxuICAgICAgYm91bmRUZXh0RWxlbWVudFBhZGRpbmc7XG4gIH0gZWxzZSB7XG4gICAgeSA9IGNvbnRhaW5lci55ICsgY29udGFpbmVyRGltcy5oZWlnaHQgLyAyIC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQgLyAyO1xuICB9XG4gIGNvbnN0IHggPVxuICAgIGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLkxFRlRcbiAgICAgID8gY29udGFpbmVyLnggKyBib3VuZFRleHRFbGVtZW50UGFkZGluZ1xuICAgICAgOiBib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5SSUdIVFxuICAgICAgPyBjb250YWluZXIueCArXG4gICAgICAgIGNvbnRhaW5lckRpbXMud2lkdGggLVxuICAgICAgICBib3VuZFRleHRFbGVtZW50LndpZHRoIC1cbiAgICAgICAgYm91bmRUZXh0RWxlbWVudFBhZGRpbmdcbiAgICAgIDogY29udGFpbmVyLnggKyBjb250YWluZXJEaW1zLndpZHRoIC8gMiAtIGJvdW5kVGV4dEVsZW1lbnQud2lkdGggLyAyO1xuXG4gIG11dGF0ZUVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCwgeyB4LCB5IH0pO1xufTtcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ncmFzc2F0b3IvY2FudmFzLXRleHQtZWRpdG9yL2Jsb2IvbWFzdGVyL2xpYi9Gb250TWV0cmljcy5qc1xuZXhwb3J0IGNvbnN0IG1lYXN1cmVUZXh0ID0gKFxuICB0ZXh0OiBzdHJpbmcsXG4gIGZvbnQ6IEZvbnRTdHJpbmcsXG4gIG1heFdpZHRoPzogbnVtYmVyIHwgbnVsbCxcbikgPT4ge1xuICB0ZXh0ID0gdGV4dFxuICAgIC5zcGxpdChcIlxcblwiKVxuICAgIC8vIHJlcGxhY2UgZW1wdHkgbGluZXMgd2l0aCBzaW5nbGUgc3BhY2UgYmVjYXVzZSBsZWFkaW5nL3RyYWlsaW5nIGVtcHR5XG4gICAgLy8gbGluZXMgd291bGQgYmUgc3RyaXBwZWQgZnJvbSBjb21wdXRhdGlvblxuICAgIC5tYXAoKHgpID0+IHggfHwgXCIgXCIpXG4gICAgLmpvaW4oXCJcXG5cIik7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuICBpZiAobWF4V2lkdGgpIHtcbiAgICBjb25zdCBsaW5lSGVpZ2h0ID0gZ2V0QXBwcm94TGluZUhlaWdodChmb250KTtcbiAgICBjb250YWluZXIuc3R5bGUubWF4V2lkdGggPSBgJHtTdHJpbmcobWF4V2lkdGgpfXB4YDtcbiAgICBjb250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICAgIGNvbnRhaW5lci5zdHlsZS53b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgICBjb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IGAke1N0cmluZyhsaW5lSGVpZ2h0KX1weGA7XG4gICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gIH1cbiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpO1xuICBjb250YWluZXIuaW5uZXJUZXh0ID0gdGV4dDtcblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gIHNwYW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICBzcGFuLnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIC8vIEJhc2VsaW5lIGlzIGltcG9ydGFudCBmb3IgcG9zaXRpb25pbmcgdGV4dCBvbiBjYW52YXNcbiAgY29uc3QgYmFzZWxpbmUgPSBzcGFuLm9mZnNldFRvcCArIHNwYW4ub2Zmc2V0SGVpZ2h0O1xuICAvLyBTaW5jZSBzcGFuIGFkZHMgMXB4IGV4dHJhIHdpZHRoIHRvIHRoZSBjb250YWluZXJcbiAgY29uc3Qgd2lkdGggPSBjb250YWluZXIub2Zmc2V0V2lkdGggKyAxO1xuICBjb25zdCBoZWlnaHQgPSBjb250YWluZXIub2Zmc2V0SGVpZ2h0O1xuXG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCwgYmFzZWxpbmUgfTtcbn07XG5cbmNvbnN0IERVTU1ZX1RFWFQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OVwiLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG5jb25zdCBjYWNoZUFwcHJveExpbmVIZWlnaHQ6IHsgW2tleTogRm9udFN0cmluZ106IG51bWJlciB9ID0ge307XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hMaW5lSGVpZ2h0ID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKGNhY2hlQXBwcm94TGluZUhlaWdodFtmb250XSkge1xuICAgIHJldHVybiBjYWNoZUFwcHJveExpbmVIZWlnaHRbZm9udF07XG4gIH1cbiAgY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdID0gbWVhc3VyZVRleHQoRFVNTVlfVEVYVCwgZm9udCwgbnVsbCkuaGVpZ2h0O1xuICByZXR1cm4gY2FjaGVBcHByb3hMaW5lSGVpZ2h0W2ZvbnRdO1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5jb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgfVxuICBjb25zdCBjYW52YXMyZENvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpITtcbiAgY2FudmFzMmRDb250ZXh0LmZvbnQgPSBmb250O1xuXG4gIGNvbnN0IG1ldHJpY3MgPSBjYW52YXMyZENvbnRleHQubWVhc3VyZVRleHQodGV4dCk7XG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiBtZXRyaWNzLndpZHRoICogMTA7XG4gIH1cblxuICByZXR1cm4gbWV0cmljcy53aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCB3cmFwVGV4dCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcsIG1heFdpZHRoOiBudW1iZXIpID0+IHtcbiAgY29uc3QgbGluZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgY29uc3Qgb3JpZ2luYWxMaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSBnZXRUZXh0V2lkdGgoXCIgXCIsIGZvbnQpO1xuICBvcmlnaW5hbExpbmVzLmZvckVhY2goKG9yaWdpbmFsTGluZSkgPT4ge1xuICAgIGNvbnN0IHdvcmRzID0gb3JpZ2luYWxMaW5lLnNwbGl0KFwiIFwiKTtcbiAgICAvLyBUaGlzIG1lYW5zIGl0cyBuZXdsaW5lIHNvIHB1c2ggaXRcbiAgICBpZiAod29yZHMubGVuZ3RoID09PSAxICYmIHdvcmRzWzBdID09PSBcIlwiKSB7XG4gICAgICBsaW5lcy5wdXNoKHdvcmRzWzBdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgIGxldCBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG5cbiAgICAgIGxldCBpbmRleCA9IDA7XG4gICAgICB3aGlsZSAoaW5kZXggPCB3b3Jkcy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldFRleHRXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuXG4gICAgICAgIC8vIFN0YXJ0IGJyZWFraW5nIGxvbmdlciB3b3JkcyBleGNlZWRpbmcgbWF4IHdpZHRoXG4gICAgICAgIGlmIChjdXJyZW50V29yZFdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgc2luY2UgdGhlIGN1cnJlbnQgd29yZCBleGNlZWRzIHRoZSBtYXggd2lkdGhcbiAgICAgICAgICAvLyBzbyB3aWxsIGJlIGFwcGVuZGVkIGluIG5leHQgbGluZVxuICAgICAgICAgIGlmIChjdXJyZW50TGluZSkge1xuICAgICAgICAgICAgbGluZXMucHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgd2hpbGUgKHdvcmRzW2luZGV4XS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50Q2hhciA9IHdvcmRzW2luZGV4XVswXTtcbiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gY2hhcldpZHRoLmNhbGN1bGF0ZShjdXJyZW50Q2hhciwgZm9udCk7XG4gICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSB3aWR0aDtcbiAgICAgICAgICAgIHdvcmRzW2luZGV4XSA9IHdvcmRzW2luZGV4XS5zbGljZSgxKTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgICAgY3VycmVudExpbmUgPSBjdXJyZW50Q2hhcjtcbiAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID09PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBwdXNoIGN1cnJlbnQgbGluZSBpZiBhcHBlbmRpbmcgc3BhY2UgZXhjZWVkcyBtYXggd2lkdGhcbiAgICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID0gMDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc3BhY2UgbmVlZHMgdG8gYmUgYXBwZW5kZWQgYmVmb3JlIG5leHQgd29yZFxuICAgICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAgIC8vIHRvIHByZXZpb3VzIGxpbmVcbiAgICAgICAgICAgIGN1cnJlbnRMaW5lICs9IFwiIFwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpbmRleCsrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFN0YXJ0IGFwcGVuZGluZyB3b3JkcyBpbiBhIGxpbmUgdGlsbCBtYXggd2lkdGggcmVhY2hlZFxuICAgICAgICAgIHdoaWxlIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA8IG1heFdpZHRoICYmIGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gd29yZHNbaW5kZXhdO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSBnZXRUZXh0V2lkdGgoY3VycmVudExpbmUgKyB3b3JkLCBmb250KTtcblxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgICAgIGxpbmVzLnB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGluZGV4Kys7XG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBgJHt3b3JkfSBgO1xuXG4gICAgICAgICAgICAvLyBQdXNoIHRoZSB3b3JkIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ICsgc3BhY2VXaWR0aCA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKSk7XG4gICAgICAgICAgICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID09PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgY3VycmVudExpbmUgPSBcIlwiO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSAwO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGN1cnJlbnRMaW5lKSB7XG4gICAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKTtcbiAgICAgICAgfVxuICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICByZXR1cm4gbGluZXMuam9pbihcIlxcblwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjaGFyV2lkdGggPSAoKCkgPT4ge1xuICBjb25zdCBjYWNoZWRDaGFyV2lkdGg6IHsgW2tleTogRm9udFN0cmluZ106IEFycmF5PG51bWJlcj4gfSA9IHt9O1xuXG4gIGNvbnN0IGNhbGN1bGF0ZSA9IChjaGFyOiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICBjb25zdCBhc2NpaSA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XSkge1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdID0gW107XG4gICAgfVxuICAgIGlmICghY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSkge1xuICAgICAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgoY2hhciwgZm9udCk7XG4gICAgICBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldID0gd2lkdGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV07XG4gIH07XG5cbiAgY29uc3QgZ2V0Q2FjaGUgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF07XG4gIH07XG4gIHJldHVybiB7XG4gICAgY2FsY3VsYXRlLFxuICAgIGdldENhY2hlLFxuICB9O1xufSkoKTtcbmV4cG9ydCBjb25zdCBnZXRBcHByb3hNaW5MaW5lV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBtYXhDaGFyV2lkdGggPSBnZXRNYXhDaGFyV2lkdGgoZm9udCk7XG5cbiAgaWYgKG1heENoYXJXaWR0aCA9PT0gMCkge1xuICAgIHJldHVybiAoXG4gICAgICBtZWFzdXJlVGV4dChEVU1NWV9URVhULnNwbGl0KFwiXCIpLmpvaW4oXCJcXG5cIiksIGZvbnQpLndpZHRoICtcbiAgICAgIEJPVU5EX1RFWFRfUEFERElORyAqIDJcbiAgICApO1xuICB9XG4gIHJldHVybiBtYXhDaGFyV2lkdGggKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVIZWlnaHQgPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICByZXR1cm4gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSArIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluQ2hhcldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgY29uc3QgY2FjaGUgPSBjaGFyV2lkdGguZ2V0Q2FjaGUoZm9udCk7XG4gIGlmICghY2FjaGUpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBjb25zdCBjYWNoZVdpdGhPdXRFbXB0eSA9IGNhY2hlLmZpbHRlcigodmFsKSA9PiB2YWwgIT09IHVuZGVmaW5lZCk7XG5cbiAgcmV0dXJuIE1hdGgubWluKC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNYXhDaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIE1hdGgubWF4KC4uLmNhY2hlV2l0aE91dEVtcHR5KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRBcHByb3hDaGFyc1RvRml0SW5XaWR0aCA9IChmb250OiBGb250U3RyaW5nLCB3aWR0aDogbnVtYmVyKSA9PiB7XG4gIC8vIEdlbmVyYWxseSBsb3dlciBjYXNlIGlzIHVzZWQgc28gY29udmVydGluZyB0byBsb3dlciBjYXNlXG4gIGNvbnN0IGR1bW15VGV4dCA9IERVTU1ZX1RFWFQudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgY29uc3QgYmF0Y2hMZW5ndGggPSA2O1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgd2lkdGhUaWxsTm93ID0gMDtcbiAgbGV0IHN0ciA9IFwiXCI7XG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPD0gd2lkdGgpIHtcbiAgICBjb25zdCBiYXRjaCA9IGR1bW15VGV4dC5zdWJzdHIoaW5kZXgsIGluZGV4ICsgYmF0Y2hMZW5ndGgpO1xuICAgIHN0ciArPSBiYXRjaDtcbiAgICB3aWR0aFRpbGxOb3cgKz0gZ2V0VGV4dFdpZHRoKHN0ciwgZm9udCk7XG4gICAgaWYgKGluZGV4ID09PSBkdW1teVRleHQubGVuZ3RoIC0gMSkge1xuICAgICAgaW5kZXggPSAwO1xuICAgIH1cbiAgICBpbmRleCA9IGluZGV4ICsgYmF0Y2hMZW5ndGg7XG4gIH1cblxuICB3aGlsZSAod2lkdGhUaWxsTm93ID4gd2lkdGgpIHtcbiAgICBzdHIgPSBzdHIuc3Vic3RyKDAsIHN0ci5sZW5ndGggLSAxKTtcbiAgICB3aWR0aFRpbGxOb3cgPSBnZXRUZXh0V2lkdGgoc3RyLCBmb250KTtcbiAgfVxuICByZXR1cm4gc3RyLmxlbmd0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50SWQgPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgcmV0dXJuIGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8ubGVuZ3RoXG4gICAgPyBjb250YWluZXI/LmJvdW5kRWxlbWVudHM/LmZpbHRlcigoZWxlKSA9PiBlbGUudHlwZSA9PT0gXCJ0ZXh0XCIpWzBdPy5pZCB8fFxuICAgICAgICBudWxsXG4gICAgOiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnQgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQgfCBudWxsKSA9PiB7XG4gIGlmICghZWxlbWVudCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChlbGVtZW50KTtcbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnRJZCkge1xuICAgIHJldHVybiAoXG4gICAgICAoU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcikgfHwgbnVsbFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyRWxlbWVudCA9IChcbiAgZWxlbWVudDpcbiAgICB8IChFeGNhbGlkcmF3RWxlbWVudCAmIHtcbiAgICAgICAgY29udGFpbmVySWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0gfCBudWxsO1xuICAgICAgfSlcbiAgICB8IG51bGwsXG4pID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKGVsZW1lbnQuY29udGFpbmVySWQpIHtcbiAgICByZXR1cm4gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoZWxlbWVudC5jb250YWluZXJJZCkgfHwgbnVsbDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJEaW1zID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIGNvbnN0IE1JTl9XSURUSCA9IDMwMDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgd2lkdGggPSBNYXRoLm1heChlbGVtZW50LndpZHRoLCBNSU5fV0lEVEgpO1xuICAgIGNvbnN0IGhlaWdodCA9IGVsZW1lbnQuaGVpZ2h0O1xuICAgIHJldHVybiB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgfVxuICByZXR1cm4geyB3aWR0aDogZWxlbWVudC53aWR0aCwgaGVpZ2h0OiBlbGVtZW50LmhlaWdodCB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckNlbnRlciA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIHJldHVybiB7XG4gICAgICB4OiBjb250YWluZXIueCArIGNvbnRhaW5lci53aWR0aCAvIDIsXG4gICAgICB5OiBjb250YWluZXIueSArIGNvbnRhaW5lci5oZWlnaHQgLyAyLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9pbnRzID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludHNHbG9iYWxDb29yZGluYXRlcyhjb250YWluZXIpO1xuICBpZiAocG9pbnRzLmxlbmd0aCAlIDIgPT09IDEpIHtcbiAgICBjb25zdCBpbmRleCA9IE1hdGguZmxvb3IoY29udGFpbmVyLnBvaW50cy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBtaWRQb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0UG9pbnRHbG9iYWxDb29yZGluYXRlcyhcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIGNvbnRhaW5lci5wb2ludHNbaW5kZXhdLFxuICAgICk7XG4gICAgcmV0dXJuIHsgeDogbWlkUG9pbnRbMF0sIHk6IG1pZFBvaW50WzFdIH07XG4gIH1cbiAgY29uc3QgaW5kZXggPSBjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIgLSAxO1xuICBsZXQgbWlkU2VnbWVudE1pZHBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRFZGl0b3JNaWRQb2ludHMoXG4gICAgY29udGFpbmVyLFxuICAgIGFwcFN0YXRlLFxuICApW2luZGV4XTtcbiAgaWYgKCFtaWRTZWdtZW50TWlkcG9pbnQpIHtcbiAgICBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFNlZ21lbnRNaWRQb2ludChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHBvaW50c1tpbmRleF0sXG4gICAgICBwb2ludHNbaW5kZXggKyAxXSxcbiAgICAgIGluZGV4ICsgMSxcbiAgICApO1xuICB9XG4gIHJldHVybiB7IHg6IG1pZFNlZ21lbnRNaWRwb2ludFswXSwgeTogbWlkU2VnbWVudE1pZHBvaW50WzFdIH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0VGV4dEVsZW1lbnRBbmdsZSA9ICh0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50KSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lciB8fCBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHRleHRFbGVtZW50LmFuZ2xlO1xuICB9XG4gIHJldHVybiBjb250YWluZXIuYW5nbGU7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCA9IChcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGJvdW5kVGV4dEVsZW1lbnQpO1xuICBpZiAoIWNvbnRhaW5lcikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORyAqIDg7XG4gIH1cbiAgcmV0dXJuIEJPVU5EX1RFWFRfUEFERElORztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICBjb250YWluZXIsXG4gICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaG91bGRBbGxvd1ZlcnRpY2FsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50ID0gZ2V0Qm91bmRUZXh0RWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgaWYgKGlzQXJyb3dFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRCaW5kYWJsZUNvbnRhaW5lckF0UG9zaXRpb24gPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4gIHg6IG51bWJlcixcbiAgeTogbnVtYmVyLFxuKTogRXhjYWxpZHJhd1RleHRDb250YWluZXIgfCBudWxsID0+IHtcbiAgY29uc3Qgc2VsZWN0ZWRFbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoZWxlbWVudHMsIGFwcFN0YXRlKTtcbiAgaWYgKHNlbGVjdGVkRWxlbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKHNlbGVjdGVkRWxlbWVudHNbMF0sIGZhbHNlKVxuICAgICAgPyBzZWxlY3RlZEVsZW1lbnRzWzBdXG4gICAgICA6IG51bGw7XG4gIH1cbiAgbGV0IGhpdEVsZW1lbnQgPSBudWxsO1xuICAvLyBXZSBuZWVkIHRvIHRvIGhpdCB0ZXN0aW5nIGZyb20gZnJvbnQgKGVuZCBvZiB0aGUgYXJyYXkpIHRvIGJhY2sgKGJlZ2lubmluZyBvZiB0aGUgYXJyYXkpXG4gIGZvciAobGV0IGluZGV4ID0gZWxlbWVudHMubGVuZ3RoIC0gMTsgaW5kZXggPj0gMDsgLS1pbmRleCkge1xuICAgIGlmIChlbGVtZW50c1tpbmRleF0uaXNEZWxldGVkKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50c1tpbmRleF0pO1xuICAgIGlmIChcbiAgICAgIGlzQXJyb3dFbGVtZW50KGVsZW1lbnRzW2luZGV4XSkgJiZcbiAgICAgIGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94KGVsZW1lbnRzW2luZGV4XSwgYXBwU3RhdGUsIFtcbiAgICAgICAgeCxcbiAgICAgICAgeSxcbiAgICAgIF0pXG4gICAgKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfSBlbHNlIGlmICh4MSA8IHggJiYgeCA8IHgyICYmIHkxIDwgeSAmJiB5IDwgeTIpIHtcbiAgICAgIGhpdEVsZW1lbnQgPSBlbGVtZW50c1tpbmRleF07XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gaXNUZXh0QmluZGFibGVDb250YWluZXIoaGl0RWxlbWVudCwgZmFsc2UpID8gaGl0RWxlbWVudCA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgaXNWYWxpZFRleHRDb250YWluZXIgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBlbGVtZW50LnR5cGUgPT09IFwicmVjdGFuZ2xlXCIgfHxcbiAgICBlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiIHx8XG4gICAgZWxlbWVudC50eXBlID09PSBcImRpYW1vbmRcIiB8fFxuICAgIGlzSW1hZ2VFbGVtZW50KGVsZW1lbnQpIHx8XG4gICAgaXNBcnJvd0VsZW1lbnQoZWxlbWVudClcbiAgKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3014
3014
|
|
|
3015
3015
|
/***/ }),
|
|
3016
3016
|
|
|
@@ -3021,7 +3021,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3021
3021
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3022
3022
|
|
|
3023
3023
|
"use strict";
|
|
3024
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"textWysiwyg\": () => (/* binding */ textWysiwyg)\n/* harmony export */ });\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../keys */ \"../../keys.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _actions_actionProperties__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../actions/actionProperties */ \"../../actions/actionProperties.tsx\");\n/* harmony import */ var _actions_actionCanvas__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../actions/actionCanvas */ \"../../actions/actionCanvas.tsx\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\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 textWysiwyg = ({ id, onChange, onSubmit, getViewportCoords, element, canvas, excalidrawContainer, app, }) => {\n const textPropertiesUpdated = (updatedTextElement, editable) => {\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 let originalContainerHeight;\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 const width = updatedTextElement.width;\n // Set to element height by default since that's\n // what is going to be used for unbounded text\n let height = updatedTextElement.height;\n if (container && updatedTextElement.containerId) {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const boundTextCoords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__.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 height = editorHeight;\n }\n if (propertiesUpdated) {\n originalContainerHeight = containerDims.height;\n // update height of the editor after properties updated\n height = updatedTextElement.height;\n }\n if (!originalContainerHeight) {\n originalContainerHeight = containerDims.height;\n }\n maxWidth = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container);\n maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerHeight)(container);\n // autogrow container height if text exceeds\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container) && height > maxHeight) {\n const diff = Math.min(height - 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 > originalContainerHeight &&\n height < maxHeight) {\n const diff = Math.min(maxHeight - height, 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 // 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 = container.y + containerDims.height / 2 - height / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n height -\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementOffset)(updatedTextElement);\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 }\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: `${Math.min(width, maxWidth)}px`,\n height: `${height}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(width, height, (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 const isContainerArrow = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element));\n const background = isContainerArrow ? \"#fff\" : \"transparent\";\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,\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.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 // using scrollHeight here since we need to calculate\n // number of lines so cannot use editable.style.height\n // as that gets updated below\n // Rounding here so that the lines calculated is more accurate in all browsers.\n // The scrollHeight and approxLineHeight differs in diff browsers\n // eg it gives 1.05 in firefox for handewritten small font due to which\n // height gets updated as lines > 1 and leads to jumping text for first line in bound container\n // hence rounding here to avoid that\n const lines = Math.round(editable.scrollHeight / (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)(font));\n // auto increase height only when lines > 1 so its\n // measured correctly and vertically aligns for\n // first line as well as setting height to \"auto\"\n // doubles the height as soon as user starts typing\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\n let height = \"auto\";\n editable.style.height = \"0px\";\n let heightSet = false;\n if (lines === 2) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container)).split(\"\\n\").length;\n // This is browser behaviour when setting height to \"auto\"\n // It sets the height needed for 2 lines even if actual\n // line count is 1 as mentioned above as well\n // hence reducing the height by half if actual line count is 1\n // so single line aligns vertically when deleting\n if (actualLineCount === 1) {\n height = `${editable.scrollHeight / 2}px`;\n editable.style.height = height;\n heightSet = true;\n }\n }\n if (!heightSet) {\n editable.style.height = `${editable.scrollHeight}px`;\n }\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.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 }\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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LE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ3hDLGtCQUFrQixFQUFFLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDSCxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCO1NBQU07UUFDTCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLGtCQUFrQixDQUFDLENBQUM7S0FDdkQ7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFO1FBQzFDLE9BQU8sRUFBRSxLQUFLO1FBQ2QsT0FBTyxFQUFFLElBQUk7S0FDZCxDQUFDLENBQUM7SUFDSCxtQkFBbUIsYUFBbkIsbUJBQW1CLHVCQUFuQixtQkFBbUIsQ0FDZixhQUFhLENBQUMsaUNBQWlDLEVBQ2hELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC90ZXh0V3lzaXd5Zy50c3g/OGY0ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDT0RFUywgS0VZUyB9IGZyb20gXCIuLi9rZXlzXCI7XG5pbXBvcnQge1xuICBpc1dyaXRhYmxlRWxlbWVudCxcbiAgZ2V0Rm9udFN0cmluZyxcbiAgZ2V0Rm9udEZhbWlseVN0cmluZyxcbiAgaXNUZXN0RW52LFxufSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7XG4gIGlzQXJyb3dFbGVtZW50LFxuICBpc0JvdW5kVG9Db250YWluZXIsXG4gIGlzVGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVDaGVja3NcIjtcbmltcG9ydCB7IENMQVNTRVMsIFZFUlRJQ0FMX0FMSUdOIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgRXhjYWxpZHJhd0VsZW1lbnQsXG4gIEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEFwcHJveExpbmVIZWlnaHQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgZ2V0VGV4dEVsZW1lbnRBbmdsZSxcbiAgbm9ybWFsaXplVGV4dCxcbiAgd3JhcFRleHQsXG59IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBhY3Rpb25EZWNyZWFzZUZvbnRTaXplLFxuICBhY3Rpb25JbmNyZWFzZUZvbnRTaXplLFxufSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBhY3Rpb25ab29tSW4sIGFjdGlvblpvb21PdXQgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25DYW52YXNcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBnZXRNYXhDb250YWluZXJIZWlnaHQsIGdldE1heENvbnRhaW5lcldpZHRoIH0gZnJvbSBcIi4vbmV3RWxlbWVudFwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuL2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBtYXhXaWR0aDogbnVtYmVyLFxuICBtYXhIZWlnaHQ6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCB7IHpvb20gfSA9IGFwcFN0YXRlO1xuICBjb25zdCBkZWdyZWUgPSAoMTgwICogYW5nbGUpIC8gTWF0aC5QSTtcbiAgbGV0IHRyYW5zbGF0ZVggPSAod2lkdGggKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGxldCB0cmFuc2xhdGVZID0gKGhlaWdodCAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgaWYgKHdpZHRoID4gbWF4V2lkdGggJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVggPSAobWF4V2lkdGggKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1heEhlaWdodCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWSA9IChtYXhIZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgcmV0dXJuIGB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpIHNjYWxlKCR7em9vbS52YWx1ZX0pIHJvdGF0ZSgke2RlZ3JlZX1kZWcpYDtcbn07XG5cbmV4cG9ydCBjb25zdCB0ZXh0V3lzaXd5ZyA9ICh7XG4gIGlkLFxuICBvbkNoYW5nZSxcbiAgb25TdWJtaXQsXG4gIGdldFZpZXdwb3J0Q29vcmRzLFxuICBlbGVtZW50LFxuICBjYW52YXMsXG4gIGV4Y2FsaWRyYXdDb250YWluZXIsXG4gIGFwcCxcbn06IHtcbiAgaWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl07XG4gIG9uQ2hhbmdlPzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25TdWJtaXQ6IChkYXRhOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHZpYUtleWJvYXJkOiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9KSA9PiB2b2lkO1xuICBnZXRWaWV3cG9ydENvb3JkczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBleGNhbGlkcmF3Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gIGFwcDogQXBwO1xufSkgPT4ge1xuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSAoXG4gICAgdXBkYXRlZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgZWRpdGFibGU6IEhUTUxUZXh0QXJlYUVsZW1lbnQsXG4gICkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRGb250ID0gZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseS5yZXBsYWNlKC9cIi9nLCBcIlwiKTtcbiAgICBpZiAoXG4gICAgICBnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseTogdXBkYXRlZFRleHRFbGVtZW50LmZvbnRGYW1pbHkgfSkgIT09XG4gICAgICBjdXJyZW50Rm9udFxuICAgICkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChgJHt1cGRhdGVkVGV4dEVsZW1lbnQuZm9udFNpemV9cHhgICE9PSBlZGl0YWJsZS5zdHlsZS5mb250U2l6ZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgbGV0IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0OiBudW1iZXI7XG5cbiAgY29uc3QgdXBkYXRlV3lzaXd5Z1N0eWxlID0gKCkgPT4ge1xuICAgIGNvbnN0IGFwcFN0YXRlID0gYXBwLnN0YXRlO1xuICAgIGNvbnN0IHVwZGF0ZWRUZXh0RWxlbWVudCA9XG4gICAgICBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudDxFeGNhbGlkcmF3VGV4dEVsZW1lbnQ+KGlkKTtcbiAgICBpZiAoIXVwZGF0ZWRUZXh0RWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB7IHRleHRBbGlnbiwgdmVydGljYWxBbGlnbiB9ID0gdXBkYXRlZFRleHRFbGVtZW50O1xuXG4gICAgY29uc3QgYXBwcm94TGluZUhlaWdodCA9IGdldEFwcHJveExpbmVIZWlnaHQoXG4gICAgICBnZXRGb250U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgKTtcbiAgICBpZiAodXBkYXRlZFRleHRFbGVtZW50ICYmIGlzVGV4dEVsZW1lbnQodXBkYXRlZFRleHRFbGVtZW50KSkge1xuICAgICAgbGV0IGNvb3JkWCA9IHVwZGF0ZWRUZXh0RWxlbWVudC54O1xuICAgICAgbGV0IGNvb3JkWSA9IHVwZGF0ZWRUZXh0RWxlbWVudC55O1xuICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgbGV0IG1heFdpZHRoID0gdXBkYXRlZFRleHRFbGVtZW50LndpZHRoO1xuXG4gICAgICBsZXQgbWF4SGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIGNvbnN0IHdpZHRoID0gdXBkYXRlZFRleHRFbGVtZW50LndpZHRoO1xuICAgICAgLy8gU2V0IHRvIGVsZW1lbnQgaGVpZ2h0IGJ5IGRlZmF1bHQgc2luY2UgdGhhdCdzXG4gICAgICAvLyB3aGF0IGlzIGdvaW5nIHRvIGJlIHVzZWQgZm9yIHVuYm91bmRlZCB0ZXh0XG4gICAgICBsZXQgaGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID1cbiAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb29yZFggPSBib3VuZFRleHRDb29yZHMueDtcbiAgICAgICAgICBjb29yZFkgPSBib3VuZFRleHRDb29yZHMueTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQsXG4gICAgICAgICAgZWRpdGFibGUsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICAgIC8vIHVzaW5nIGVkaXRvci5zdHlsZS5oZWlnaHQgdG8gZ2V0IHRoZSBhY2N1cmF0ZSBoZWlnaHQgb2YgdGV4dCBlZGl0b3JcbiAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIGhlaWdodCA9IGVkaXRvckhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckhlaWdodCA9IGNvbnRhaW5lckRpbXMuaGVpZ2h0O1xuXG4gICAgICAgICAgLy8gdXBkYXRlIGhlaWdodCBvZiB0aGUgZWRpdG9yIGFmdGVyIHByb3BlcnRpZXMgdXBkYXRlZFxuICAgICAgICAgIGhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckhlaWdodCkge1xuICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgbWF4V2lkdGggPSBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIpO1xuICAgICAgICBtYXhIZWlnaHQgPSBnZXRNYXhDb250YWluZXJIZWlnaHQoY29udGFpbmVyKTtcblxuICAgICAgICAvLyBhdXRvZ3JvdyBjb250YWluZXIgaGVpZ2h0IGlmIHRleHQgZXhjZWVkc1xuXG4gICAgICAgIGlmICghaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJiBoZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oaGVpZ2h0IC0gbWF4SGVpZ2h0LCBhcHByb3hMaW5lSGVpZ2h0KTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lckRpbXMuaGVpZ2h0ICsgZGlmZiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gYXV0b3NocmluayBjb250YWluZXIgaGVpZ2h0IHVudGlsIG9yaWdpbmFsIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCA+IG9yaWdpbmFsQ29udGFpbmVySGVpZ2h0ICYmXG4gICAgICAgICAgaGVpZ2h0IDwgbWF4SGVpZ2h0XG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IGRpZmYgPSBNYXRoLm1pbihtYXhIZWlnaHQgLSBoZWlnaHQsIGFwcHJveExpbmVIZWlnaHQpO1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7IGhlaWdodDogY29udGFpbmVyRGltcy5oZWlnaHQgLSBkaWZmIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFN0YXJ0IHB1c2hpbmcgdGV4dCB1cHdhcmQgdW50aWwgYSBkaWZmIG9mIDMwcHggKHBhZGRpbmcpXG4gICAgICAgIC8vIGlzIHJlYWNoZWRcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgLy8gdmVydGljYWxseSBjZW50ZXIgYWxpZ24gdGhlIHRleHRcbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uTUlERExFKSB7XG4gICAgICAgICAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgICAgICAgY29vcmRZID0gY29udGFpbmVyLnkgKyBjb250YWluZXJEaW1zLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVydGljYWxBbGlnbiA9PT0gVkVSVElDQUxfQUxJR04uQk9UVE9NKSB7XG4gICAgICAgICAgICBjb29yZFkgPVxuICAgICAgICAgICAgICBjb250YWluZXIueSArXG4gICAgICAgICAgICAgIGNvbnRhaW5lckRpbXMuaGVpZ2h0IC1cbiAgICAgICAgICAgICAgaGVpZ2h0IC1cbiAgICAgICAgICAgICAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgW3ZpZXdwb3J0WCwgdmlld3BvcnRZXSA9IGdldFZpZXdwb3J0Q29vcmRzKGNvb3JkWCwgY29vcmRZKTtcbiAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb25TdGFydCA9IGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0O1xuICAgICAgY29uc3QgaW5pdGlhbFNlbGVjdGlvbkVuZCA9IGVkaXRhYmxlLnNlbGVjdGlvbkVuZDtcbiAgICAgIGNvbnN0IGluaXRpYWxMZW5ndGggPSBlZGl0YWJsZS52YWx1ZS5sZW5ndGg7XG4gICAgICBlZGl0YWJsZS52YWx1ZSA9IHVwZGF0ZWRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQ7XG5cbiAgICAgIC8vIHJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uIGFmdGVyIHZhbHVlIHVwZGF0ZWQgc28gaXQgZG9lc24ndFxuICAgICAgLy8gZ28gdG8gdGhlIGVuZCBvZiB0ZXh0IHdoZW4gY29udGFpbmVyIGF1dG8gZXhwYW5kZWRcbiAgICAgIGlmIChcbiAgICAgICAgaW5pdGlhbFNlbGVjdGlvblN0YXJ0ID09PSBpbml0aWFsU2VsZWN0aW9uRW5kICYmXG4gICAgICAgIGluaXRpYWxTZWxlY3Rpb25FbmQgIT09IGluaXRpYWxMZW5ndGhcbiAgICAgICkge1xuICAgICAgICAvLyBnZXQgZGlmZiBiZXR3ZWVuIGxlbmd0aCBhbmQgc2VsZWN0aW9uIGVuZCBhbmQgc2hpZnRcbiAgICAgICAgLy8gdGhlIGN1cnNvciBieSBcImRpZmZcIiB0aW1lcyB0byBwb3NpdGlvbiBjb3JyZWN0bHlcbiAgICAgICAgY29uc3QgZGlmZiA9IGluaXRpYWxMZW5ndGggLSBpbml0aWFsU2VsZWN0aW9uRW5kO1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aCAtIGRpZmY7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IGVkaXRhYmxlLnZhbHVlLmxlbmd0aCAtIGRpZmY7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGxpbmVzID0gdXBkYXRlZFRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dC5zcGxpdChcIlxcblwiKTtcbiAgICAgIGNvbnN0IGxpbmVIZWlnaHQgPSB1cGRhdGVkVGV4dEVsZW1lbnQuY29udGFpbmVySWRcbiAgICAgICAgPyBhcHByb3hMaW5lSGVpZ2h0XG4gICAgICAgIDogdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodCAvIGxpbmVzLmxlbmd0aDtcbiAgICAgIGlmICghY29udGFpbmVyKSB7XG4gICAgICAgIG1heFdpZHRoID0gKGFwcFN0YXRlLndpZHRoIC0gOCAtIHZpZXdwb3J0WCkgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuICAgICAgfVxuXG4gICAgICAvLyBNYWtlIHN1cmUgdGV4dCBlZGl0b3IgaGVpZ2h0IGRvZXNuJ3QgZ28gYmV5b25kIHZpZXdwb3J0XG4gICAgICBjb25zdCBlZGl0b3JNYXhIZWlnaHQgPVxuICAgICAgICAoYXBwU3RhdGUuaGVpZ2h0IC0gdmlld3BvcnRZKSAvIGFwcFN0YXRlLnpvb20udmFsdWU7XG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICAgICAgZm9udDogZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAvLyBtdXN0IGJlIGRlZmluZWQgKmFmdGVyKiBmb250IMKvXFxfKOODhClfL8KvXG4gICAgICAgIGxpbmVIZWlnaHQ6IGAke2xpbmVIZWlnaHR9cHhgLFxuICAgICAgICB3aWR0aDogYCR7TWF0aC5taW4od2lkdGgsIG1heFdpZHRoKX1weGAsXG4gICAgICAgIGhlaWdodDogYCR7aGVpZ2h0fXB4YCxcbiAgICAgICAgbGVmdDogYCR7dmlld3BvcnRYfXB4YCxcbiAgICAgICAgdG9wOiBgJHt2aWV3cG9ydFl9cHhgLFxuICAgICAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybShcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQsXG4gICAgICAgICAgZ2V0VGV4dEVsZW1lbnRBbmdsZSh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICAgICAgIGFwcFN0YXRlLFxuICAgICAgICAgIG1heFdpZHRoLFxuICAgICAgICAgIGVkaXRvck1heEhlaWdodCxcbiAgICAgICAgKSxcbiAgICAgICAgdGV4dEFsaWduLFxuICAgICAgICB2ZXJ0aWNhbEFsaWduLFxuICAgICAgICBjb2xvcjogdXBkYXRlZFRleHRFbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICBvcGFjaXR5OiB1cGRhdGVkVGV4dEVsZW1lbnQub3BhY2l0eSAvIDEwMCxcbiAgICAgICAgZmlsdGVyOiBcInZhcigtLXRoZW1lLWZpbHRlcilcIixcbiAgICAgICAgbWF4SGVpZ2h0OiBgJHtlZGl0b3JNYXhIZWlnaHR9cHhgLFxuICAgICAgfSk7XG4gICAgICAvLyBGb3Igc29tZSByZWFzb24gdXBkYXRpbmcgZm9udCBhdHRyaWJ1dGUgZG9lc24ndCBzZXQgZm9udCBmYW1pbHlcbiAgICAgIC8vIGhlbmNlIHVwZGF0aW5nIGZvbnQgZmFtaWx5IGV4cGxpY2l0bHkgZm9yIHRlc3QgZW52aXJvbm1lbnRcbiAgICAgIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5ID0gZ2V0Rm9udEZhbWlseVN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgfVxuICAgICAgbXV0YXRlRWxlbWVudCh1cGRhdGVkVGV4dEVsZW1lbnQsIHsgeDogY29vcmRYLCB5OiBjb29yZFkgfSk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGVkaXRhYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInRleHRhcmVhXCIpO1xuXG4gIGVkaXRhYmxlLmRpciA9IFwiYXV0b1wiO1xuICBlZGl0YWJsZS50YWJJbmRleCA9IDA7XG4gIGVkaXRhYmxlLmRhdGFzZXQudHlwZSA9IFwid3lzaXd5Z1wiO1xuICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgb24gU2FmYXJpXG4gIGVkaXRhYmxlLndyYXAgPSBcIm9mZlwiO1xuICBlZGl0YWJsZS5jbGFzc0xpc3QuYWRkKFwiZXhjYWxpZHJhdy13eXNpd3lnXCIpO1xuXG4gIGxldCB3aGl0ZVNwYWNlID0gXCJwcmVcIjtcbiAgbGV0IHdvcmRCcmVhayA9IFwibm9ybWFsXCI7XG5cbiAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSkge1xuICAgIHdoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gICAgd29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gIH1cbiAgY29uc3QgaXNDb250YWluZXJBcnJvdyA9IGlzQXJyb3dFbGVtZW50KGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCkpO1xuICBjb25zdCBiYWNrZ3JvdW5kID0gaXNDb250YWluZXJBcnJvdyA/IFwiI2ZmZlwiIDogXCJ0cmFuc3BhcmVudFwiO1xuICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgcG9zaXRpb246IFwiYWJzb2x1dGVcIixcbiAgICBkaXNwbGF5OiBcImlubGluZS1ibG9ja1wiLFxuICAgIG1pbkhlaWdodDogXCIxZW1cIixcbiAgICBiYWNrZmFjZVZpc2liaWxpdHk6IFwiaGlkZGVuXCIsXG4gICAgbWFyZ2luOiAwLFxuICAgIHBhZGRpbmc6IDAsXG4gICAgYm9yZGVyOiAwLFxuICAgIG91dGxpbmU6IDAsXG4gICAgcmVzaXplOiBcIm5vbmVcIixcbiAgICBiYWNrZ3JvdW5kLFxuICAgIG92ZXJmbG93OiBcImhpZGRlblwiLFxuICAgIC8vIG11c3QgYmUgc3BlY2lmaWVkIGJlY2F1c2UgaW4gZGFyayBtb2RlIGNhbnZhcyBjcmVhdGVzIGEgc3RhY2tpbmcgY29udGV4dFxuICAgIHpJbmRleDogXCJ2YXIoLS16SW5kZXgtd3lzaXd5ZylcIixcbiAgICB3b3JkQnJlYWssXG4gICAgLy8gcHJldmVudCBsaW5lIHdyYXBwaW5nIChgd2hpdGVzcGFjZTogbm93cmFwYCBkb2Vzbid0IHdvcmsgb24gRkYpXG4gICAgd2hpdGVTcGFjZSxcbiAgICBvdmVyZmxvd1dyYXA6IFwiYnJlYWstd29yZFwiLFxuICAgIGJveFNpemluZzogXCJjb250ZW50LWJveFwiLFxuICB9KTtcbiAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG5cbiAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgZWRpdGFibGUub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZWRUZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGVsZW1lbnQpPy5nZXRFbGVtZW50KFxuICAgICAgICBpZCxcbiAgICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgICAgY29uc3QgZm9udCA9IGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIC8vIHVzaW5nIHNjcm9sbEhlaWdodCBoZXJlIHNpbmNlIHdlIG5lZWQgdG8gY2FsY3VsYXRlXG4gICAgICAvLyBudW1iZXIgb2YgbGluZXMgc28gY2Fubm90IHVzZSBlZGl0YWJsZS5zdHlsZS5oZWlnaHRcbiAgICAgIC8vIGFzIHRoYXQgZ2V0cyB1cGRhdGVkIGJlbG93XG4gICAgICAvLyBSb3VuZGluZyBoZXJlIHNvIHRoYXQgdGhlIGxpbmVzIGNhbGN1bGF0ZWQgaXMgbW9yZSBhY2N1cmF0ZSBpbiBhbGwgYnJvd3NlcnMuXG4gICAgICAvLyBUaGUgc2Nyb2xsSGVpZ2h0IGFuZCBhcHByb3hMaW5lSGVpZ2h0IGRpZmZlcnMgaW4gZGlmZiBicm93c2Vyc1xuICAgICAgLy8gZWcgaXQgZ2l2ZXMgMS4wNSBpbiBmaXJlZm94IGZvciBoYW5kZXdyaXR0ZW4gc21hbGwgZm9udCBkdWUgdG8gd2hpY2hcbiAgICAgIC8vIGhlaWdodCBnZXRzIHVwZGF0ZWQgYXMgbGluZXMgPiAxIGFuZCBsZWFkcyB0byBqdW1waW5nIHRleHQgZm9yIGZpcnN0IGxpbmUgaW4gYm91bmQgY29udGFpbmVyXG4gICAgICAvLyBoZW5jZSByb3VuZGluZyBoZXJlIHRvIGF2b2lkIHRoYXRcbiAgICAgIGNvbnN0IGxpbmVzID0gTWF0aC5yb3VuZChcbiAgICAgICAgZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gZ2V0QXBwcm94TGluZUhlaWdodChmb250KSxcbiAgICAgICk7XG4gICAgICAvLyBhdXRvIGluY3JlYXNlIGhlaWdodCBvbmx5IHdoZW4gbGluZXMgID4gMSBzbyBpdHNcbiAgICAgIC8vIG1lYXN1cmVkIGNvcnJlY3RseSBhbmQgdmVydGljYWxseSBhbGlnbnMgZm9yXG4gICAgICAvLyBmaXJzdCBsaW5lIGFzIHdlbGwgYXMgc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgIC8vIGRvdWJsZXMgdGhlIGhlaWdodCBhcyBzb29uIGFzIHVzZXIgc3RhcnRzIHR5cGluZ1xuICAgICAgaWYgKGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KSAmJiBsaW5lcyA+IDEpIHtcbiAgICAgICAgbGV0IGhlaWdodCA9IFwiYXV0b1wiO1xuICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBcIjBweFwiO1xuICAgICAgICBsZXQgaGVpZ2h0U2V0ID0gZmFsc2U7XG4gICAgICAgIGlmIChsaW5lcyA9PT0gMikge1xuICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgYWN0dWFsTGluZUNvdW50ID0gd3JhcFRleHQoXG4gICAgICAgICAgICBlZGl0YWJsZS52YWx1ZSxcbiAgICAgICAgICAgIGZvbnQsXG4gICAgICAgICAgICBnZXRNYXhDb250YWluZXJXaWR0aChjb250YWluZXIhKSxcbiAgICAgICAgICApLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcbiAgICAgICAgICAvLyBUaGlzIGlzIGJyb3dzZXIgYmVoYXZpb3VyIHdoZW4gc2V0dGluZyBoZWlnaHQgdG8gXCJhdXRvXCJcbiAgICAgICAgICAvLyBJdCBzZXRzIHRoZSBoZWlnaHQgbmVlZGVkIGZvciAyIGxpbmVzIGV2ZW4gaWYgYWN0dWFsXG4gICAgICAgICAgLy8gbGluZSBjb3VudCBpcyAxIGFzIG1lbnRpb25lZCBhYm92ZSBhcyB3ZWxsXG4gICAgICAgICAgLy8gaGVuY2UgcmVkdWNpbmcgdGhlIGhlaWdodCBieSBoYWxmIGlmIGFjdHVhbCBsaW5lIGNvdW50IGlzIDFcbiAgICAgICAgICAvLyBzbyBzaW5nbGUgbGluZSBhbGlnbnMgdmVydGljYWxseSB3aGVuIGRlbGV0aW5nXG4gICAgICAgICAgaWYgKGFjdHVhbExpbmVDb3VudCA9PT0gMSkge1xuICAgICAgICAgICAgaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0IC8gMn1weGA7XG4gICAgICAgICAgICBlZGl0YWJsZS5zdHlsZS5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgICAgICAgICBoZWlnaHRTZXQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWhlaWdodFNldCkge1xuICAgICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGAke2VkaXRhYmxlLnNjcm9sbEhlaWdodH1weGA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG9uQ2hhbmdlKG5vcm1hbGl6ZVRleHQoZWRpdGFibGUudmFsdWUpKTtcbiAgICB9O1xuICB9XG5cbiAgZWRpdGFibGUub25rZXlkb3duID0gKGV2ZW50KSA9PiB7XG4gICAgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tSW4ua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblpvb21Jbik7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9IGVsc2UgaWYgKCFldmVudC5zaGlmdEtleSAmJiBhY3Rpb25ab29tT3V0LmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25ab29tT3V0KTtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uRGVjcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25EZWNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGFjdGlvbkluY3JlYXNlRm9udFNpemUua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uSW5jcmVhc2VGb250U2l6ZSk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRVNDQVBFKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09IEtFWVMuRU5URVIgJiYgZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0pIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZXZlbnQuaXNDb21wb3NpbmcgfHwgZXZlbnQua2V5Q29kZSA9PT0gMjI5KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gdHJ1ZTtcbiAgICAgIGhhbmRsZVN1Ym1pdCgpO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBldmVudC5rZXkgPT09IEtFWVMuVEFCIHx8XG4gICAgICAoZXZlbnRbS0VZUy5DVFJMX09SX0NNRF0gJiZcbiAgICAgICAgKGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCB8fFxuICAgICAgICAgIGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfUklHSFQpKVxuICAgICkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5zaGlmdEtleSB8fCBldmVudC5jb2RlID09PSBDT0RFUy5CUkFDS0VUX0xFRlQpIHtcbiAgICAgICAgb3V0ZGVudCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5kZW50KCk7XG4gICAgICB9XG4gICAgICAvLyBXZSBtdXN0IHNlbmQgYW4gaW5wdXQgZXZlbnQgdG8gcmVzaXplIHRoZSBlbGVtZW50XG4gICAgICBlZGl0YWJsZS5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudChcImlucHV0XCIpKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgVEFCX1NJWkUgPSA0O1xuICBjb25zdCBUQUIgPSBcIiBcIi5yZXBlYXQoVEFCX1NJWkUpO1xuICBjb25zdCBSRV9MRUFESU5HX1RBQiA9IG5ldyBSZWdFeHAoYF4gezEsJHtUQUJfU0laRX19YCk7XG4gIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IGVkaXRhYmxlO1xuICAgIGNvbnN0IGxpbmVzU3RhcnRJbmRpY2VzID0gZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcygpO1xuXG4gICAgbGV0IHZhbHVlID0gZWRpdGFibGUudmFsdWU7XG4gICAgbGluZXNTdGFydEluZGljZXMuZm9yRWFjaCgoc3RhcnRJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICBjb25zdCBlbmRWYWx1ZSA9IHZhbHVlLnNsaWNlKHN0YXJ0SW5kZXgpO1xuXG4gICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtUQUJ9JHtlbmRWYWx1ZX1gO1xuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQgKyBUQUJfU0laRTtcbiAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBzZWxlY3Rpb25FbmQgKyBUQUJfU0laRSAqIGxpbmVzU3RhcnRJbmRpY2VzLmxlbmd0aDtcbiAgfTtcblxuICBjb25zdCBvdXRkZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG4gICAgY29uc3QgcmVtb3ZlZFRhYnM6IG51bWJlcltdID0gW107XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4KSA9PiB7XG4gICAgICBjb25zdCB0YWJNYXRjaCA9IHZhbHVlXG4gICAgICAgIC5zbGljZShzdGFydEluZGV4LCBzdGFydEluZGV4ICsgVEFCX1NJWkUpXG4gICAgICAgIC5tYXRjaChSRV9MRUFESU5HX1RBQik7XG5cbiAgICAgIGlmICh0YWJNYXRjaCkge1xuICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gdmFsdWUuc2xpY2UoMCwgc3RhcnRJbmRleCk7XG4gICAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCArIHRhYk1hdGNoWzBdLmxlbmd0aCk7XG5cbiAgICAgICAgLy8gRGVsZXRlIGEgdGFiIGZyb20gdGhlIGxpbmVcbiAgICAgICAgdmFsdWUgPSBgJHtzdGFydFZhbHVlfSR7ZW5kVmFsdWV9YDtcbiAgICAgICAgcmVtb3ZlZFRhYnMucHVzaChzdGFydEluZGV4KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGVkaXRhYmxlLnZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAocmVtb3ZlZFRhYnMubGVuZ3RoKSB7XG4gICAgICBpZiAoc2VsZWN0aW9uU3RhcnQgPiByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSkge1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IE1hdGgubWF4KFxuICAgICAgICAgIHNlbGVjdGlvblN0YXJ0IC0gVEFCX1NJWkUsXG4gICAgICAgICAgcmVtb3ZlZFRhYnNbcmVtb3ZlZFRhYnMubGVuZ3RoIC0gMV0sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGUgY3Vyc29yIGlzIGJlZm9yZSB0aGUgZmlyc3QgdGFiIHJlbW92ZWQsIGV4OlxuICAgICAgICAvLyBMaW5lfCAjMVxuICAgICAgICAvLyAgICAgTGluZSAjMlxuICAgICAgICAvLyBMaW58ZSAjM1xuICAgICAgICAvLyB3ZSBzaG91bGQgcmVzZXQgdGhlIHNlbGVjdGlvblN0YXJ0IHRvIGhpcyBpbml0aWFsIHZhbHVlLlxuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0O1xuICAgICAgfVxuICAgICAgZWRpdGFibGUuc2VsZWN0aW9uRW5kID0gTWF0aC5tYXgoXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0LFxuICAgICAgICBzZWxlY3Rpb25FbmQgLSBUQUJfU0laRSAqIHJlbW92ZWRUYWJzLmxlbmd0aCxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBpbmRpY2VzIG9mIHN0YXJ0IHBvc2l0aW9ucyBvZiBzZWxlY3RlZCBsaW5lcywgaW4gcmV2ZXJzZSBvcmRlclxuICAgKi9cbiAgY29uc3QgZ2V0U2VsZWN0ZWRMaW5lc1N0YXJ0SW5kaWNlcyA9ICgpID0+IHtcbiAgICBsZXQgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kLCB2YWx1ZSB9ID0gZWRpdGFibGU7XG5cbiAgICAvLyBjaGFycyBiZWZvcmUgc2VsZWN0aW9uU3RhcnQgb24gdGhlIHNhbWUgbGluZVxuICAgIGNvbnN0IHN0YXJ0T2Zmc2V0ID0gdmFsdWUuc2xpY2UoMCwgc2VsZWN0aW9uU3RhcnQpLm1hdGNoKC9bXlxcbl0qJC8pIVswXVxuICAgICAgLmxlbmd0aDtcbiAgICAvLyBwdXQgY2FyZXQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG4gICAgc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCAtIHN0YXJ0T2Zmc2V0O1xuXG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB2YWx1ZS5zbGljZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTtcblxuICAgIHJldHVybiBzZWxlY3RlZFxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAucmVkdWNlKFxuICAgICAgICAoc3RhcnRJbmRpY2VzLCBsaW5lLCBpZHgsIGxpbmVzKSA9PlxuICAgICAgICAgIHN0YXJ0SW5kaWNlcy5jb25jYXQoXG4gICAgICAgICAgICBpZHhcbiAgICAgICAgICAgICAgPyAvLyBjdXJyIGxpbmUgaW5kZXggaXMgcHJldiBsaW5lJ3Mgc3RhcnQgKyBwcmV2IGxpbmUncyBsZW5ndGggKyBcXG5cbiAgICAgICAgICAgICAgICBzdGFydEluZGljZXNbaWR4IC0gMV0gKyBsaW5lc1tpZHggLSAxXS5sZW5ndGggKyAxXG4gICAgICAgICAgICAgIDogLy8gZmlyc3Qgc2VsZWN0ZWQgbGluZVxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0LFxuICAgICAgICAgICksXG4gICAgICAgIFtdIGFzIG51bWJlcltdLFxuICAgICAgKVxuICAgICAgLnJldmVyc2UoKTtcbiAgfTtcblxuICBjb25zdCBzdG9wRXZlbnQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgfTtcblxuICAvLyB1c2luZyBhIHN0YXRlIHZhcmlhYmxlIGluc3RlYWQgb2YgcGFzc2luZyBpdCB0byB0aGUgaGFuZGxlU3VibWl0IGNhbGxiYWNrXG4gIC8vIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgc2VwYXJhdGUgYSBjYWxsYmFjayBmb3IgZXZlbnQgaGFuZGxlcnNcbiAgbGV0IHN1Ym1pdHRlZFZpYUtleWJvYXJkID0gZmFsc2U7XG4gIGNvbnN0IGhhbmRsZVN1Ym1pdCA9ICgpID0+IHtcbiAgICAvLyBjbGVhbnVwIG11c3QgYmUgcnVuIGJlZm9yZSBvblN1Ym1pdCBvdGhlcndpc2Ugd2hlbiBhcHAgYmx1cnMgdGhlIHd5c2l3eWdcbiAgICAvLyBpdCdkIGdldCBzdHVjayBpbiBhbiBpbmZpbml0ZSBsb29wIG9mIGJsdXLihpJvblN1Ym1pdCBhZnRlciB3ZSByZS1mb2N1cyB0aGVcbiAgICAvLyB3eXNpd3lnIG9uIHVwZGF0ZVxuICAgIGNsZWFudXAoKTtcbiAgICBjb25zdCB1cGRhdGVFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICBlbGVtZW50LmlkLFxuICAgICkgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50O1xuICAgIGlmICghdXBkYXRlRWxlbWVudCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsZXQgdGV4dCA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlRWxlbWVudCk7XG5cbiAgICBpZiAoY29udGFpbmVyKSB7XG4gICAgICB0ZXh0ID0gdXBkYXRlRWxlbWVudC50ZXh0O1xuICAgICAgaWYgKGVkaXRhYmxlLnZhbHVlLnRyaW0oKSkge1xuICAgICAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgICAgICAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQgfHwgYm91bmRUZXh0RWxlbWVudElkICE9PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICAgIGJvdW5kRWxlbWVudHM6IChjb250YWluZXIuYm91bmRFbGVtZW50cyB8fCBbXSkuY29uY2F0KHtcbiAgICAgICAgICAgICAgdHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICAgIGlkOiBlbGVtZW50LmlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG11dGF0ZUVsZW1lbnQoY29udGFpbmVyLCB7XG4gICAgICAgICAgYm91bmRFbGVtZW50czogY29udGFpbmVyLmJvdW5kRWxlbWVudHM/LmZpbHRlcihcbiAgICAgICAgICAgIChlbGUpID0+XG4gICAgICAgICAgICAgICFpc1RleHRFbGVtZW50KFxuICAgICAgICAgICAgICAgIGVsZSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBvblN1Ym1pdCh7XG4gICAgICB0ZXh0LFxuICAgICAgdmlhS2V5Ym9hcmQ6IHN1Ym1pdHRlZFZpYUtleWJvYXJkLFxuICAgICAgb3JpZ2luYWxUZXh0OiBlZGl0YWJsZS52YWx1ZSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgIGlmIChpc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgLy8gcmVtb3ZlIGV2ZW50cyB0byBlbnN1cmUgdGhleSBkb24ndCBsYXRlLWZpcmVcbiAgICBlZGl0YWJsZS5vbmJsdXIgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9uaW5wdXQgPSBudWxsO1xuICAgIGVkaXRhYmxlLm9ua2V5ZG93biA9IG51bGw7XG5cbiAgICBpZiAob2JzZXJ2ZXIpIHtcbiAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB0cnVlKTtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJkb3duXCIsIG9uUG9pbnRlckRvd24pO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuXG4gICAgdW5iaW5kVXBkYXRlKCk7XG5cbiAgICBlZGl0YWJsZS5yZW1vdmUoKTtcbiAgfTtcblxuICBjb25zdCBiaW5kQmx1ckV2ZW50ID0gKGV2ZW50PzogTW91c2VFdmVudCkgPT4ge1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgIC8vIERlZmVycmVkIHNvIHRoYXQgdGhlIHBvaW50ZXJkb3duIHRoYXQgaW5pdGlhdGVzIHRoZSB3eXNpd3lnIGRvZXNuJ3RcbiAgICAvLyB0cmlnZ2VyIHRoZSBibHVyIG9uIGVuc3VpbmcgcG9pbnRlcnVwLlxuICAgIC8vIEFsc28gdG8gaGFuZGxlIGNhc2VzIHN1Y2ggYXMgcGlja2luZyBhIGNvbG9yIHdoaWNoIHdvdWxkIHRyaWdnZXIgYSBibHVyXG4gICAgLy8gaW4gdGhhdCBzYW1lIHRpY2suXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQ/LnRhcmdldDtcblxuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgdGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudCh0YXJnZXQpO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBlZGl0YWJsZS5vbmJsdXIgPSBoYW5kbGVTdWJtaXQ7XG4gICAgICBpZiAodGFyZ2V0ICYmIGlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgdGFyZ2V0Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgICAgICBlZGl0YWJsZS5mb2N1cygpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgLy8gY2FzZTogY2xpY2tpbmcgb24gdGhlIHNhbWUgcHJvcGVydHkg4oaSIG5vIGNoYW5nZSDihpIgbm8gdXBkYXRlIOKGkiBubyBmb2N1c1xuICAgICAgaWYgKCFpc1RhcmdldENvbG9yUGlja2VyKSB7XG4gICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgLy8gcHJldmVudCBibHVyIHdoZW4gY2hhbmdpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBtZW51XG4gIGNvbnN0IG9uUG9pbnRlckRvd24gPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBjb25zdCBpc1RhcmdldENvbG9yUGlja2VyID1cbiAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KFwiLmNvbG9yLXBpY2tlci1pbnB1dFwiKSAmJlxuICAgICAgaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KTtcbiAgICBpZiAoXG4gICAgICAoKGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50IHx8XG4gICAgICAgIGV2ZW50LnRhcmdldCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpICYmXG4gICAgICAgIGV2ZW50LnRhcmdldC5jbG9zZXN0KGAuJHtDTEFTU0VTLlNIQVBFX0FDVElPTlNfTUVOVX1gKSAmJlxuICAgICAgICAhaXNXcml0YWJsZUVsZW1lbnQoZXZlbnQudGFyZ2V0KSkgfHxcbiAgICAgIGlzVGFyZ2V0Q29sb3JQaWNrZXJcbiAgICApIHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInBvaW50ZXJ1cFwiLCBiaW5kQmx1ckV2ZW50KTtcbiAgICAgIC8vIGhhbmRsZSBlZGdlLWNhc2Ugd2hlcmUgcG9pbnRlcnVwIGRvZXNuJ3QgZmlyZSBlLmcuIGR1ZSB0byB1c2VyXG4gICAgICAvLyBhbHQtdGFiYmluZyBhd2F5XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcImJsdXJcIiwgaGFuZGxlU3VibWl0KTtcbiAgICB9XG4gIH07XG5cbiAgLy8gaGFuZGxlIHVwZGF0ZXMgb2YgdGV4dEVsZW1lbnQgcHJvcGVydGllcyBvZiBlZGl0aW5nIGVsZW1lbnRcbiAgY29uc3QgdW5iaW5kVXBkYXRlID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCkhLmFkZENhbGxiYWNrKCgpID0+IHtcbiAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICBjb25zdCBpc0NvbG9yUGlja2VyQWN0aXZlID0gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KFxuICAgICAgXCIuY29sb3ItcGlja2VyLWlucHV0XCIsXG4gICAgKTtcbiAgICBpZiAoIWlzQ29sb3JQaWNrZXJBY3RpdmUpIHtcbiAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgfVxuICB9KTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICBsZXQgaXNEZXN0cm95ZWQgPSBmYWxzZTtcblxuICAvLyBzZWxlY3Qgb24gaW5pdCAoZm9jdXNpbmcgaXMgZG9uZSBzZXBhcmF0ZWx5IGluc2lkZSB0aGUgYmluZEJsdXJFdmVudCgpXG4gIC8vIGJlY2F1c2Ugd2UgbmVlZCBpdCB0byBoYXBwZW4gKmFmdGVyKiB0aGUgYmx1ciBldmVudCBmcm9tIGBwb2ludGVyZG93bmApXG4gIGVkaXRhYmxlLnNlbGVjdCgpO1xuICBiaW5kQmx1ckV2ZW50KCk7XG5cbiAgLy8gcmVwb3NpdGlvbiB3eXNpd3lnIGluIGNhc2Ugb2YgY2FudmFzIGlzIHJlc2l6ZWQuIFVzaW5nIFJlc2l6ZU9ic2VydmVyXG4gIC8vIGlzIHByZWZlcnJlZCBzbyB3ZSBjYXRjaCBjaGFuZ2VzIGZyb20gaG9zdCwgd2hlcmUgd2luZG93IG1heSBub3QgcmVzaXplLlxuICBsZXQgb2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyIHwgbnVsbCA9IG51bGw7XG4gIGlmIChjYW52YXMgJiYgXCJSZXNpemVPYnNlcnZlclwiIGluIHdpbmRvdykge1xuICAgIG9ic2VydmVyID0gbmV3IHdpbmRvdy5SZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcbiAgICB9KTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKGNhbnZhcyk7XG4gIH0gZWxzZSB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdXBkYXRlV3lzaXd5Z1N0eWxlKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwid2hlZWxcIiwgc3RvcEV2ZW50LCB7XG4gICAgcGFzc2l2ZTogZmFsc2UsXG4gICAgY2FwdHVyZTogdHJ1ZSxcbiAgfSk7XG4gIGV4Y2FsaWRyYXdDb250YWluZXJcbiAgICA/LnF1ZXJ5U2VsZWN0b3IoXCIuZXhjYWxpZHJhdy10ZXh0RWRpdG9yQ29udGFpbmVyXCIpIVxuICAgIC5hcHBlbmRDaGlsZChlZGl0YWJsZSk7XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
3024
|
+
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 _newElement__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\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 const width = 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_10__.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,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container);\n maxHeight = (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.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 // 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 container.y + containerDims.height / 2 - textElementHeight / 2;\n }\n }\n if (verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_4__.VERTICAL_ALIGN.BOTTOM) {\n coordY =\n container.y +\n containerDims.height -\n textElementHeight -\n (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getBoundTextElementOffset)(updatedTextElement);\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 }\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: `${Math.min(width, maxWidth)}px`,\n height: `${textElementHeight}px`,\n left: `${viewportX}px`,\n top: `${viewportY}px`,\n transform: getTransform(width, 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 const isContainerArrow = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)((0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element));\n const background = isContainerArrow ? \"#fff\" : \"transparent\";\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,\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.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 // using scrollHeight here since we need to calculate\n // number of lines so cannot use editable.style.height\n // as that gets updated below\n // Rounding here so that the lines calculated is more accurate in all browsers.\n // The scrollHeight and approxLineHeight differs in diff browsers\n // eg it gives 1.05 in firefox for handewritten small font due to which\n // height gets updated as lines > 1 and leads to jumping text for first line in bound container\n // hence rounding here to avoid that\n const lines = Math.round(editable.scrollHeight / (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getApproxLineHeight)(font));\n // auto increase height only when lines > 1 so its\n // measured correctly and vertically aligns for\n // first line as well as setting height to \"auto\"\n // doubles the height as soon as user starts typing\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element) && lines > 1) {\n let height = \"auto\";\n editable.style.height = \"0px\";\n let heightSet = false;\n if (lines === 2) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.getContainerElement)(element);\n const actualLineCount = (0,_textElement__WEBPACK_IMPORTED_MODULE_6__.wrapText)(editable.value, font, (0,_newElement__WEBPACK_IMPORTED_MODULE_9__.getMaxContainerWidth)(container)).split(\"\\n\").length;\n // This is browser behaviour when setting height to \"auto\"\n // It sets the height needed for 2 lines even if actual\n // line count is 1 as mentioned above as well\n // hence reducing the height by half if actual line count is 1\n // so single line aligns vertically when deleting\n if (actualLineCount === 1) {\n height = `${editable.scrollHeight / 2}px`;\n editable.style.height = height;\n heightSet = true;\n }\n }\n if (!heightSet) {\n editable.style.height = `${editable.scrollHeight}px`;\n }\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.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 }\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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Q0FBQztRQUN2QixDQUFDLENBQUMsQ0FBQztRQUNILFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUI7U0FBTTtRQUNMLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUN2RDtJQUVELE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDdEQsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUU7UUFDMUMsT0FBTyxFQUFFLEtBQUs7UUFDZCxPQUFPLEVBQUUsSUFBSTtLQUNkLENBQUMsQ0FBQztJQUNILG1CQUFtQixhQUFuQixtQkFBbUIsdUJBQW5CLG1CQUFtQixDQUNmLGFBQWEsQ0FBQyxpQ0FBaUMsRUFDaEQsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRXeXNpd3lnLnRzeD84ZjRkIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENPREVTLCBLRVlTIH0gZnJvbSBcIi4uL2tleXNcIjtcbmltcG9ydCB7XG4gIGlzV3JpdGFibGVFbGVtZW50LFxuICBnZXRGb250U3RyaW5nLFxuICBnZXRGb250RmFtaWx5U3RyaW5nLFxuICBpc1Rlc3RFbnYsXG59IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuLi9zY2VuZS9TY2VuZVwiO1xuaW1wb3J0IHtcbiAgaXNBcnJvd0VsZW1lbnQsXG4gIGlzQm91bmRUb0NvbnRhaW5lcixcbiAgaXNUZXh0RWxlbWVudCxcbn0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgQ0xBU1NFUywgVkVSVElDQUxfQUxJR04gfSBmcm9tIFwiLi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIGdldEFwcHJveExpbmVIZWlnaHQsXG4gIGdldEJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgZ2V0Qm91bmRUZXh0RWxlbWVudE9mZnNldCxcbiAgZ2V0Q29udGFpbmVyRGltcyxcbiAgZ2V0Q29udGFpbmVyRWxlbWVudCxcbiAgZ2V0VGV4dEVsZW1lbnRBbmdsZSxcbiAgbm9ybWFsaXplVGV4dCxcbiAgd3JhcFRleHQsXG59IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQge1xuICBhY3Rpb25EZWNyZWFzZUZvbnRTaXplLFxuICBhY3Rpb25JbmNyZWFzZUZvbnRTaXplLFxufSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25Qcm9wZXJ0aWVzXCI7XG5pbXBvcnQgeyBhY3Rpb25ab29tSW4sIGFjdGlvblpvb21PdXQgfSBmcm9tIFwiLi4vYWN0aW9ucy9hY3Rpb25DYW52YXNcIjtcbmltcG9ydCBBcHAgZnJvbSBcIi4uL2NvbXBvbmVudHMvQXBwXCI7XG5pbXBvcnQgeyBnZXRNYXhDb250YWluZXJIZWlnaHQsIGdldE1heENvbnRhaW5lcldpZHRoIH0gZnJvbSBcIi4vbmV3RWxlbWVudFwiO1xuaW1wb3J0IHsgTGluZWFyRWxlbWVudEVkaXRvciB9IGZyb20gXCIuL2xpbmVhckVsZW1lbnRFZGl0b3JcIjtcblxuY29uc3QgZ2V0VHJhbnNmb3JtID0gKFxuICB3aWR0aDogbnVtYmVyLFxuICBoZWlnaHQ6IG51bWJlcixcbiAgYW5nbGU6IG51bWJlcixcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBtYXhXaWR0aDogbnVtYmVyLFxuICBtYXhIZWlnaHQ6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCB7IHpvb20gfSA9IGFwcFN0YXRlO1xuICBjb25zdCBkZWdyZWUgPSAoMTgwICogYW5nbGUpIC8gTWF0aC5QSTtcbiAgbGV0IHRyYW5zbGF0ZVggPSAod2lkdGggKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIGxldCB0cmFuc2xhdGVZID0gKGhlaWdodCAqICh6b29tLnZhbHVlIC0gMSkpIC8gMjtcbiAgaWYgKHdpZHRoID4gbWF4V2lkdGggJiYgem9vbS52YWx1ZSAhPT0gMSkge1xuICAgIHRyYW5zbGF0ZVggPSAobWF4V2lkdGggKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgaWYgKGhlaWdodCA+IG1heEhlaWdodCAmJiB6b29tLnZhbHVlICE9PSAxKSB7XG4gICAgdHJhbnNsYXRlWSA9IChtYXhIZWlnaHQgKiAoem9vbS52YWx1ZSAtIDEpKSAvIDI7XG4gIH1cbiAgcmV0dXJuIGB0cmFuc2xhdGUoJHt0cmFuc2xhdGVYfXB4LCAke3RyYW5zbGF0ZVl9cHgpIHNjYWxlKCR7em9vbS52YWx1ZX0pIHJvdGF0ZSgke2RlZ3JlZX1kZWcpYDtcbn07XG5cbmNvbnN0IG9yaWdpbmFsQ29udGFpbmVyQ2FjaGU6IHtcbiAgW2lkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdXTpcbiAgICB8IHtcbiAgICAgICAgaGVpZ2h0OiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImhlaWdodFwiXTtcbiAgICAgIH1cbiAgICB8IHVuZGVmaW5lZDtcbn0gPSB7fTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUgPSAoXG4gIGlkOiBFeGNhbGlkcmF3VGV4dENvbnRhaW5lcltcImlkXCJdLFxuICBoZWlnaHQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaGVpZ2h0XCJdLFxuKSA9PiB7XG4gIGNvbnN0IGRhdGEgPVxuICAgIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdIHx8IChvcmlnaW5hbENvbnRhaW5lckNhY2hlW2lkXSA9IHsgaGVpZ2h0IH0pO1xuICBkYXRhLmhlaWdodCA9IGhlaWdodDtcbiAgcmV0dXJuIGRhdGE7XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlID0gKFxuICBpZDogRXhjYWxpZHJhd1RleHRDb250YWluZXJbXCJpZFwiXSxcbikgPT4ge1xuICBpZiAob3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF0pIHtcbiAgICBkZWxldGUgb3JpZ2luYWxDb250YWluZXJDYWNoZVtpZF07XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBnZXRPcmlnaW5hbENvbnRhaW5lckhlaWdodEZyb21DYWNoZSA9IChcbiAgaWQ6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyW1wiaWRcIl0sXG4pID0+IHtcbiAgcmV0dXJuIG9yaWdpbmFsQ29udGFpbmVyQ2FjaGVbaWRdPy5oZWlnaHQgPz8gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCB0ZXh0V3lzaXd5ZyA9ICh7XG4gIGlkLFxuICBvbkNoYW5nZSxcbiAgb25TdWJtaXQsXG4gIGdldFZpZXdwb3J0Q29vcmRzLFxuICBlbGVtZW50LFxuICBjYW52YXMsXG4gIGV4Y2FsaWRyYXdDb250YWluZXIsXG4gIGFwcCxcbn06IHtcbiAgaWQ6IEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl07XG4gIG9uQ2hhbmdlPzogKHRleHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgb25TdWJtaXQ6IChkYXRhOiB7XG4gICAgdGV4dDogc3RyaW5nO1xuICAgIHZpYUtleWJvYXJkOiBib29sZWFuO1xuICAgIG9yaWdpbmFsVGV4dDogc3RyaW5nO1xuICB9KSA9PiB2b2lkO1xuICBnZXRWaWV3cG9ydENvb3JkczogKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PiBbbnVtYmVyLCBudW1iZXJdO1xuICBlbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsO1xuICBleGNhbGlkcmF3Q29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGw7XG4gIGFwcDogQXBwO1xufSkgPT4ge1xuICBjb25zdCB0ZXh0UHJvcGVydGllc1VwZGF0ZWQgPSAoXG4gICAgdXBkYXRlZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQsXG4gICAgZWRpdGFibGU6IEhUTUxUZXh0QXJlYUVsZW1lbnQsXG4gICkgPT4ge1xuICAgIGlmICghZWRpdGFibGUuc3R5bGUuZm9udEZhbWlseSB8fCAhZWRpdGFibGUuc3R5bGUuZm9udFNpemUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY3VycmVudEZvbnQgPSBlZGl0YWJsZS5zdHlsZS5mb250RmFtaWx5LnJlcGxhY2UoL1wiL2csIFwiXCIpO1xuICAgIGlmIChcbiAgICAgIGdldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5OiB1cGRhdGVkVGV4dEVsZW1lbnQuZm9udEZhbWlseSB9KSAhPT1cbiAgICAgIGN1cnJlbnRGb250XG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGAke3VwZGF0ZWRUZXh0RWxlbWVudC5mb250U2l6ZX1weGAgIT09IGVkaXRhYmxlLnN0eWxlLmZvbnRTaXplKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIGNvbnN0IHVwZGF0ZVd5c2l3eWdTdHlsZSA9ICgpID0+IHtcbiAgICBjb25zdCBhcHBTdGF0ZSA9IGFwcC5zdGF0ZTtcbiAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPVxuICAgICAgU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQ8RXhjYWxpZHJhd1RleHRFbGVtZW50PihpZCk7XG4gICAgaWYgKCF1cGRhdGVkVGV4dEVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyB0ZXh0QWxpZ24sIHZlcnRpY2FsQWxpZ24gfSA9IHVwZGF0ZWRUZXh0RWxlbWVudDtcblxuICAgIGNvbnN0IGFwcHJveExpbmVIZWlnaHQgPSBnZXRBcHByb3hMaW5lSGVpZ2h0KFxuICAgICAgZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpLFxuICAgICk7XG4gICAgaWYgKHVwZGF0ZWRUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCkpIHtcbiAgICAgIGxldCBjb29yZFggPSB1cGRhdGVkVGV4dEVsZW1lbnQueDtcbiAgICAgIGxldCBjb29yZFkgPSB1cGRhdGVkVGV4dEVsZW1lbnQueTtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQodXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgIGxldCBtYXhXaWR0aCA9IHVwZGF0ZWRUZXh0RWxlbWVudC53aWR0aDtcblxuICAgICAgbGV0IG1heEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICBjb25zdCB3aWR0aCA9IHVwZGF0ZWRUZXh0RWxlbWVudC53aWR0aDtcbiAgICAgIC8vIFNldCB0byBlbGVtZW50IGhlaWdodCBieSBkZWZhdWx0IHNpbmNlIHRoYXQnc1xuICAgICAgLy8gd2hhdCBpcyBnb2luZyB0byBiZSB1c2VkIGZvciB1bmJvdW5kZWQgdGV4dFxuICAgICAgbGV0IHRleHRFbGVtZW50SGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmhlaWdodDtcbiAgICAgIGlmIChjb250YWluZXIgJiYgdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkKSB7XG4gICAgICAgIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgY29uc3QgYm91bmRUZXh0Q29vcmRzID1cbiAgICAgICAgICAgIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgICAgICAgICBjb250YWluZXIsXG4gICAgICAgICAgICAgIHVwZGF0ZWRUZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICBjb29yZFggPSBib3VuZFRleHRDb29yZHMueDtcbiAgICAgICAgICBjb29yZFkgPSBib3VuZFRleHRDb29yZHMueTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVXBkYXRlZCA9IHRleHRQcm9wZXJ0aWVzVXBkYXRlZChcbiAgICAgICAgICB1cGRhdGVkVGV4dEVsZW1lbnQsXG4gICAgICAgICAgZWRpdGFibGUsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgICAgIC8vIHVzaW5nIGVkaXRvci5zdHlsZS5oZWlnaHQgdG8gZ2V0IHRoZSBhY2N1cmF0ZSBoZWlnaHQgb2YgdGV4dCBlZGl0b3JcbiAgICAgICAgY29uc3QgZWRpdG9ySGVpZ2h0ID0gTnVtYmVyKGVkaXRhYmxlLnN0eWxlLmhlaWdodC5zbGljZSgwLCAtMikpO1xuICAgICAgICBpZiAoZWRpdG9ySGVpZ2h0ID4gMCkge1xuICAgICAgICAgIHRleHRFbGVtZW50SGVpZ2h0ID0gZWRpdG9ySGVpZ2h0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzVXBkYXRlZCkge1xuICAgICAgICAgIC8vIHVwZGF0ZSBoZWlnaHQgb2YgdGhlIGVkaXRvciBhZnRlciBwcm9wZXJ0aWVzIHVwZGF0ZWRcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA9IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3JpZ2luYWxDb250YWluZXJEYXRhO1xuICAgICAgICBpZiAocHJvcGVydGllc1VwZGF0ZWQpIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSB1cGRhdGVPcmlnaW5hbENvbnRhaW5lckNhY2hlKFxuICAgICAgICAgICAgY29udGFpbmVyLmlkLFxuICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvcmlnaW5hbENvbnRhaW5lckRhdGEgPSBvcmlnaW5hbENvbnRhaW5lckNhY2hlW2NvbnRhaW5lci5pZF07XG4gICAgICAgICAgaWYgKCFvcmlnaW5hbENvbnRhaW5lckRhdGEpIHtcbiAgICAgICAgICAgIG9yaWdpbmFsQ29udGFpbmVyRGF0YSA9IHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUoXG4gICAgICAgICAgICAgIGNvbnRhaW5lci5pZCxcbiAgICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG1heFdpZHRoID0gZ2V0TWF4Q29udGFpbmVyV2lkdGgoY29udGFpbmVyKTtcbiAgICAgICAgbWF4SGVpZ2h0ID0gZ2V0TWF4Q29udGFpbmVySGVpZ2h0KGNvbnRhaW5lcik7XG5cbiAgICAgICAgLy8gYXV0b2dyb3cgY29udGFpbmVyIGhlaWdodCBpZiB0ZXh0IGV4Y2VlZHNcblxuICAgICAgICBpZiAoIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiYgdGV4dEVsZW1lbnRIZWlnaHQgPiBtYXhIZWlnaHQpIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oXG4gICAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCAtIG1heEhlaWdodCxcbiAgICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lckRpbXMuaGVpZ2h0ICsgZGlmZiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgLy8gYXV0b3NocmluayBjb250YWluZXIgaGVpZ2h0IHVudGlsIG9yaWdpbmFsIGNvbnRhaW5lciBoZWlnaHRcbiAgICAgICAgICAvLyBpcyByZWFjaGVkIHdoZW4gdGV4dCBpcyByZW1vdmVkXG4gICAgICAgICAgIWlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikgJiZcbiAgICAgICAgICBjb250YWluZXJEaW1zLmhlaWdodCA+IG9yaWdpbmFsQ29udGFpbmVyRGF0YS5oZWlnaHQgJiZcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCA8IG1heEhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkaWZmID0gTWF0aC5taW4oXG4gICAgICAgICAgICBtYXhIZWlnaHQgLSB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICAgIGFwcHJveExpbmVIZWlnaHQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyBoZWlnaHQ6IGNvbnRhaW5lckRpbXMuaGVpZ2h0IC0gZGlmZiB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTdGFydCBwdXNoaW5nIHRleHQgdXB3YXJkIHVudGlsIGEgZGlmZiBvZiAzMHB4IChwYWRkaW5nKVxuICAgICAgICAvLyBpcyByZWFjaGVkXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIC8vIHZlcnRpY2FsbHkgY2VudGVyIGFsaWduIHRoZSB0ZXh0XG4gICAgICAgICAgaWYgKHZlcnRpY2FsQWxpZ24gPT09IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSkge1xuICAgICAgICAgICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnkgKyBjb250YWluZXJEaW1zLmhlaWdodCAvIDIgLSB0ZXh0RWxlbWVudEhlaWdodCAvIDI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh2ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICAgICAgICAgIGNvb3JkWSA9XG4gICAgICAgICAgICAgIGNvbnRhaW5lci55ICtcbiAgICAgICAgICAgICAgY29udGFpbmVyRGltcy5oZWlnaHQgLVxuICAgICAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCAtXG4gICAgICAgICAgICAgIGdldEJvdW5kVGV4dEVsZW1lbnRPZmZzZXQodXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IFt2aWV3cG9ydFgsIHZpZXdwb3J0WV0gPSBnZXRWaWV3cG9ydENvb3Jkcyhjb29yZFgsIGNvb3JkWSk7XG4gICAgICBjb25zdCBpbml0aWFsU2VsZWN0aW9uU3RhcnQgPSBlZGl0YWJsZS5zZWxlY3Rpb25TdGFydDtcbiAgICAgIGNvbnN0IGluaXRpYWxTZWxlY3Rpb25FbmQgPSBlZGl0YWJsZS5zZWxlY3Rpb25FbmQ7XG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gZWRpdGFibGUudmFsdWUubGVuZ3RoO1xuICAgICAgZWRpdGFibGUudmFsdWUgPSB1cGRhdGVkVGV4dEVsZW1lbnQub3JpZ2luYWxUZXh0O1xuXG4gICAgICAvLyByZXN0b3JlIGN1cnNvciBwb3NpdGlvbiBhZnRlciB2YWx1ZSB1cGRhdGVkIHNvIGl0IGRvZXNuJ3RcbiAgICAgIC8vIGdvIHRvIHRoZSBlbmQgb2YgdGV4dCB3aGVuIGNvbnRhaW5lciBhdXRvIGV4cGFuZGVkXG4gICAgICBpZiAoXG4gICAgICAgIGluaXRpYWxTZWxlY3Rpb25TdGFydCA9PT0gaW5pdGlhbFNlbGVjdGlvbkVuZCAmJlxuICAgICAgICBpbml0aWFsU2VsZWN0aW9uRW5kICE9PSBpbml0aWFsTGVuZ3RoXG4gICAgICApIHtcbiAgICAgICAgLy8gZ2V0IGRpZmYgYmV0d2VlbiBsZW5ndGggYW5kIHNlbGVjdGlvbiBlbmQgYW5kIHNoaWZ0XG4gICAgICAgIC8vIHRoZSBjdXJzb3IgYnkgXCJkaWZmXCIgdGltZXMgdG8gcG9zaXRpb24gY29ycmVjdGx5XG4gICAgICAgIGNvbnN0IGRpZmYgPSBpbml0aWFsTGVuZ3RoIC0gaW5pdGlhbFNlbGVjdGlvbkVuZDtcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBlZGl0YWJsZS52YWx1ZS5sZW5ndGggLSBkaWZmO1xuICAgICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBlZGl0YWJsZS52YWx1ZS5sZW5ndGggLSBkaWZmO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBsaW5lcyA9IHVwZGF0ZWRUZXh0RWxlbWVudC5vcmlnaW5hbFRleHQuc3BsaXQoXCJcXG5cIik7XG4gICAgICBjb25zdCBsaW5lSGVpZ2h0ID0gdXBkYXRlZFRleHRFbGVtZW50LmNvbnRhaW5lcklkXG4gICAgICAgID8gYXBwcm94TGluZUhlaWdodFxuICAgICAgICA6IHVwZGF0ZWRUZXh0RWxlbWVudC5oZWlnaHQgLyBsaW5lcy5sZW5ndGg7XG4gICAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgICBtYXhXaWR0aCA9IChhcHBTdGF0ZS53aWR0aCAtIDggLSB2aWV3cG9ydFgpIC8gYXBwU3RhdGUuem9vbS52YWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gTWFrZSBzdXJlIHRleHQgZWRpdG9yIGhlaWdodCBkb2Vzbid0IGdvIGJleW9uZCB2aWV3cG9ydFxuICAgICAgY29uc3QgZWRpdG9yTWF4SGVpZ2h0ID1cbiAgICAgICAgKGFwcFN0YXRlLmhlaWdodCAtIHZpZXdwb3J0WSkgLyBhcHBTdGF0ZS56b29tLnZhbHVlO1xuXG4gICAgICBPYmplY3QuYXNzaWduKGVkaXRhYmxlLnN0eWxlLCB7XG4gICAgICAgIGZvbnQ6IGdldEZvbnRTdHJpbmcodXBkYXRlZFRleHRFbGVtZW50KSxcbiAgICAgICAgLy8gbXVzdCBiZSBkZWZpbmVkICphZnRlciogZm9udCDCr1xcXyjjg4QpXy/Cr1xuICAgICAgICBsaW5lSGVpZ2h0OiBgJHtsaW5lSGVpZ2h0fXB4YCxcbiAgICAgICAgd2lkdGg6IGAke01hdGgubWluKHdpZHRoLCBtYXhXaWR0aCl9cHhgLFxuICAgICAgICBoZWlnaHQ6IGAke3RleHRFbGVtZW50SGVpZ2h0fXB4YCxcbiAgICAgICAgbGVmdDogYCR7dmlld3BvcnRYfXB4YCxcbiAgICAgICAgdG9wOiBgJHt2aWV3cG9ydFl9cHhgLFxuICAgICAgICB0cmFuc2Zvcm06IGdldFRyYW5zZm9ybShcbiAgICAgICAgICB3aWR0aCxcbiAgICAgICAgICB0ZXh0RWxlbWVudEhlaWdodCxcbiAgICAgICAgICBnZXRUZXh0RWxlbWVudEFuZ2xlKHVwZGF0ZWRUZXh0RWxlbWVudCksXG4gICAgICAgICAgYXBwU3RhdGUsXG4gICAgICAgICAgbWF4V2lkdGgsXG4gICAgICAgICAgZWRpdG9yTWF4SGVpZ2h0LFxuICAgICAgICApLFxuICAgICAgICB0ZXh0QWxpZ24sXG4gICAgICAgIHZlcnRpY2FsQWxpZ24sXG4gICAgICAgIGNvbG9yOiB1cGRhdGVkVGV4dEVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgIG9wYWNpdHk6IHVwZGF0ZWRUZXh0RWxlbWVudC5vcGFjaXR5IC8gMTAwLFxuICAgICAgICBmaWx0ZXI6IFwidmFyKC0tdGhlbWUtZmlsdGVyKVwiLFxuICAgICAgICBtYXhIZWlnaHQ6IGAke2VkaXRvck1heEhlaWdodH1weGAsXG4gICAgICB9KTtcbiAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB1cGRhdGluZyBmb250IGF0dHJpYnV0ZSBkb2Vzbid0IHNldCBmb250IGZhbWlseVxuICAgICAgLy8gaGVuY2UgdXBkYXRpbmcgZm9udCBmYW1pbHkgZXhwbGljaXRseSBmb3IgdGVzdCBlbnZpcm9ubWVudFxuICAgICAgaWYgKGlzVGVzdEVudigpKSB7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmZvbnRGYW1pbHkgPSBnZXRGb250RmFtaWx5U3RyaW5nKHVwZGF0ZWRUZXh0RWxlbWVudCk7XG4gICAgICB9XG4gICAgICBtdXRhdGVFbGVtZW50KHVwZGF0ZWRUZXh0RWxlbWVudCwgeyB4OiBjb29yZFgsIHk6IGNvb3JkWSB9KTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZWRpdGFibGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwidGV4dGFyZWFcIik7XG5cbiAgZWRpdGFibGUuZGlyID0gXCJhdXRvXCI7XG4gIGVkaXRhYmxlLnRhYkluZGV4ID0gMDtcbiAgZWRpdGFibGUuZGF0YXNldC50eXBlID0gXCJ3eXNpd3lnXCI7XG4gIC8vIHByZXZlbnQgbGluZSB3cmFwcGluZyBvbiBTYWZhcmlcbiAgZWRpdGFibGUud3JhcCA9IFwib2ZmXCI7XG4gIGVkaXRhYmxlLmNsYXNzTGlzdC5hZGQoXCJleGNhbGlkcmF3LXd5c2l3eWdcIik7XG5cbiAgbGV0IHdoaXRlU3BhY2UgPSBcInByZVwiO1xuICBsZXQgd29yZEJyZWFrID0gXCJub3JtYWxcIjtcblxuICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpKSB7XG4gICAgd2hpdGVTcGFjZSA9IFwicHJlLXdyYXBcIjtcbiAgICB3b3JkQnJlYWsgPSBcImJyZWFrLXdvcmRcIjtcbiAgfVxuICBjb25zdCBpc0NvbnRhaW5lckFycm93ID0gaXNBcnJvd0VsZW1lbnQoZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KSk7XG4gIGNvbnN0IGJhY2tncm91bmQgPSBpc0NvbnRhaW5lckFycm93ID8gXCIjZmZmXCIgOiBcInRyYW5zcGFyZW50XCI7XG4gIE9iamVjdC5hc3NpZ24oZWRpdGFibGUuc3R5bGUsIHtcbiAgICBwb3NpdGlvbjogXCJhYnNvbHV0ZVwiLFxuICAgIGRpc3BsYXk6IFwiaW5saW5lLWJsb2NrXCIsXG4gICAgbWluSGVpZ2h0OiBcIjFlbVwiLFxuICAgIGJhY2tmYWNlVmlzaWJpbGl0eTogXCJoaWRkZW5cIixcbiAgICBtYXJnaW46IDAsXG4gICAgcGFkZGluZzogMCxcbiAgICBib3JkZXI6IDAsXG4gICAgb3V0bGluZTogMCxcbiAgICByZXNpemU6IFwibm9uZVwiLFxuICAgIGJhY2tncm91bmQsXG4gICAgb3ZlcmZsb3c6IFwiaGlkZGVuXCIsXG4gICAgLy8gbXVzdCBiZSBzcGVjaWZpZWQgYmVjYXVzZSBpbiBkYXJrIG1vZGUgY2FudmFzIGNyZWF0ZXMgYSBzdGFja2luZyBjb250ZXh0XG4gICAgekluZGV4OiBcInZhcigtLXpJbmRleC13eXNpd3lnKVwiLFxuICAgIHdvcmRCcmVhayxcbiAgICAvLyBwcmV2ZW50IGxpbmUgd3JhcHBpbmcgKGB3aGl0ZXNwYWNlOiBub3dyYXBgIGRvZXNuJ3Qgd29yayBvbiBGRilcbiAgICB3aGl0ZVNwYWNlLFxuICAgIG92ZXJmbG93V3JhcDogXCJicmVhay13b3JkXCIsXG4gICAgYm94U2l6aW5nOiBcImNvbnRlbnQtYm94XCIsXG4gIH0pO1xuICB1cGRhdGVXeXNpd3lnU3R5bGUoKTtcblxuICBpZiAob25DaGFuZ2UpIHtcbiAgICBlZGl0YWJsZS5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgY29uc3QgdXBkYXRlZFRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoZWxlbWVudCk/LmdldEVsZW1lbnQoXG4gICAgICAgIGlkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgICBjb25zdCBmb250ID0gZ2V0Rm9udFN0cmluZyh1cGRhdGVkVGV4dEVsZW1lbnQpO1xuICAgICAgLy8gdXNpbmcgc2Nyb2xsSGVpZ2h0IGhlcmUgc2luY2Ugd2UgbmVlZCB0byBjYWxjdWxhdGVcbiAgICAgIC8vIG51bWJlciBvZiBsaW5lcyBzbyBjYW5ub3QgdXNlIGVkaXRhYmxlLnN0eWxlLmhlaWdodFxuICAgICAgLy8gYXMgdGhhdCBnZXRzIHVwZGF0ZWQgYmVsb3dcbiAgICAgIC8vIFJvdW5kaW5nIGhlcmUgc28gdGhhdCB0aGUgbGluZXMgY2FsY3VsYXRlZCBpcyBtb3JlIGFjY3VyYXRlIGluIGFsbCBicm93c2Vycy5cbiAgICAgIC8vIFRoZSBzY3JvbGxIZWlnaHQgYW5kIGFwcHJveExpbmVIZWlnaHQgZGlmZmVycyBpbiBkaWZmIGJyb3dzZXJzXG4gICAgICAvLyBlZyBpdCBnaXZlcyAxLjA1IGluIGZpcmVmb3ggZm9yIGhhbmRld3JpdHRlbiBzbWFsbCBmb250IGR1ZSB0byB3aGljaFxuICAgICAgLy8gaGVpZ2h0IGdldHMgdXBkYXRlZCBhcyBsaW5lcyA+IDEgYW5kIGxlYWRzIHRvIGp1bXBpbmcgdGV4dCBmb3IgZmlyc3QgbGluZSBpbiBib3VuZCBjb250YWluZXJcbiAgICAgIC8vIGhlbmNlIHJvdW5kaW5nIGhlcmUgdG8gYXZvaWQgdGhhdFxuICAgICAgY29uc3QgbGluZXMgPSBNYXRoLnJvdW5kKFxuICAgICAgICBlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyBnZXRBcHByb3hMaW5lSGVpZ2h0KGZvbnQpLFxuICAgICAgKTtcbiAgICAgIC8vIGF1dG8gaW5jcmVhc2UgaGVpZ2h0IG9ubHkgd2hlbiBsaW5lcyAgPiAxIHNvIGl0c1xuICAgICAgLy8gbWVhc3VyZWQgY29ycmVjdGx5IGFuZCB2ZXJ0aWNhbGx5IGFsaWducyBmb3JcbiAgICAgIC8vIGZpcnN0IGxpbmUgYXMgd2VsbCBhcyBzZXR0aW5nIGhlaWdodCB0byBcImF1dG9cIlxuICAgICAgLy8gZG91YmxlcyB0aGUgaGVpZ2h0IGFzIHNvb24gYXMgdXNlciBzdGFydHMgdHlwaW5nXG4gICAgICBpZiAoaXNCb3VuZFRvQ29udGFpbmVyKGVsZW1lbnQpICYmIGxpbmVzID4gMSkge1xuICAgICAgICBsZXQgaGVpZ2h0ID0gXCJhdXRvXCI7XG4gICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IFwiMHB4XCI7XG4gICAgICAgIGxldCBoZWlnaHRTZXQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGxpbmVzID09PSAyKSB7XG4gICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBhY3R1YWxMaW5lQ291bnQgPSB3cmFwVGV4dChcbiAgICAgICAgICAgIGVkaXRhYmxlLnZhbHVlLFxuICAgICAgICAgICAgZm9udCxcbiAgICAgICAgICAgIGdldE1heENvbnRhaW5lcldpZHRoKGNvbnRhaW5lciEpLFxuICAgICAgICAgICkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuICAgICAgICAgIC8vIFRoaXMgaXMgYnJvd3NlciBiZWhhdmlvdXIgd2hlbiBzZXR0aW5nIGhlaWdodCB0byBcImF1dG9cIlxuICAgICAgICAgIC8vIEl0IHNldHMgdGhlIGhlaWdodCBuZWVkZWQgZm9yIDIgbGluZXMgZXZlbiBpZiBhY3R1YWxcbiAgICAgICAgICAvLyBsaW5lIGNvdW50IGlzIDEgYXMgbWVudGlvbmVkIGFib3ZlIGFzIHdlbGxcbiAgICAgICAgICAvLyBoZW5jZSByZWR1Y2luZyB0aGUgaGVpZ2h0IGJ5IGhhbGYgaWYgYWN0dWFsIGxpbmUgY291bnQgaXMgMVxuICAgICAgICAgIC8vIHNvIHNpbmdsZSBsaW5lIGFsaWducyB2ZXJ0aWNhbGx5IHdoZW4gZGVsZXRpbmdcbiAgICAgICAgICBpZiAoYWN0dWFsTGluZUNvdW50ID09PSAxKSB7XG4gICAgICAgICAgICBoZWlnaHQgPSBgJHtlZGl0YWJsZS5zY3JvbGxIZWlnaHQgLyAyfXB4YDtcbiAgICAgICAgICAgIGVkaXRhYmxlLnN0eWxlLmhlaWdodCA9IGhlaWdodDtcbiAgICAgICAgICAgIGhlaWdodFNldCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghaGVpZ2h0U2V0KSB7XG4gICAgICAgICAgZWRpdGFibGUuc3R5bGUuaGVpZ2h0ID0gYCR7ZWRpdGFibGUuc2Nyb2xsSGVpZ2h0fXB4YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgb25DaGFuZ2Uobm9ybWFsaXplVGV4dChlZGl0YWJsZS52YWx1ZSkpO1xuICAgIH07XG4gIH1cblxuICBlZGl0YWJsZS5vbmtleWRvd24gPSAoZXZlbnQpID0+IHtcbiAgICBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGFjdGlvblpvb21Jbi5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGFwcC5hY3Rpb25NYW5hZ2VyLmV4ZWN1dGVBY3Rpb24oYWN0aW9uWm9vbUluKTtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0gZWxzZSBpZiAoIWV2ZW50LnNoaWZ0S2V5ICYmIGFjdGlvblpvb21PdXQua2V5VGVzdChldmVudCkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvblpvb21PdXQpO1xuICAgICAgdXBkYXRlV3lzaXd5Z1N0eWxlKCk7XG4gICAgfSBlbHNlIGlmIChhY3Rpb25EZWNyZWFzZUZvbnRTaXplLmtleVRlc3QoZXZlbnQpKSB7XG4gICAgICBhcHAuYWN0aW9uTWFuYWdlci5leGVjdXRlQWN0aW9uKGFjdGlvbkRlY3JlYXNlRm9udFNpemUpO1xuICAgIH0gZWxzZSBpZiAoYWN0aW9uSW5jcmVhc2VGb250U2l6ZS5rZXlUZXN0KGV2ZW50KSkge1xuICAgICAgYXBwLmFjdGlvbk1hbmFnZXIuZXhlY3V0ZUFjdGlvbihhY3Rpb25JbmNyZWFzZUZvbnRTaXplKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FU0NBUEUpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBzdWJtaXR0ZWRWaWFLZXlib2FyZCA9IHRydWU7XG4gICAgICBoYW5kbGVTdWJtaXQoKTtcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gS0VZUy5FTlRFUiAmJiBldmVudFtLRVlTLkNUUkxfT1JfQ01EXSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChldmVudC5pc0NvbXBvc2luZyB8fCBldmVudC5rZXlDb2RlID09PSAyMjkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSB0cnVlO1xuICAgICAgaGFuZGxlU3VibWl0KCk7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgIGV2ZW50LmtleSA9PT0gS0VZUy5UQUIgfHxcbiAgICAgIChldmVudFtLRVlTLkNUUkxfT1JfQ01EXSAmJlxuICAgICAgICAoZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9MRUZUIHx8XG4gICAgICAgICAgZXZlbnQuY29kZSA9PT0gQ09ERVMuQlJBQ0tFVF9SSUdIVCkpXG4gICAgKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmNvZGUgPT09IENPREVTLkJSQUNLRVRfTEVGVCkge1xuICAgICAgICBvdXRkZW50KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmRlbnQoKTtcbiAgICAgIH1cbiAgICAgIC8vIFdlIG11c3Qgc2VuZCBhbiBpbnB1dCBldmVudCB0byByZXNpemUgdGhlIGVsZW1lbnRcbiAgICAgIGVkaXRhYmxlLmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KFwiaW5wdXRcIikpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBUQUJfU0laRSA9IDQ7XG4gIGNvbnN0IFRBQiA9IFwiIFwiLnJlcGVhdChUQUJfU0laRSk7XG4gIGNvbnN0IFJFX0xFQURJTkdfVEFCID0gbmV3IFJlZ0V4cChgXiB7MSwke1RBQl9TSVpFfX1gKTtcbiAgY29uc3QgaW5kZW50ID0gKCkgPT4ge1xuICAgIGNvbnN0IHsgc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCB9ID0gZWRpdGFibGU7XG4gICAgY29uc3QgbGluZXNTdGFydEluZGljZXMgPSBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzKCk7XG5cbiAgICBsZXQgdmFsdWUgPSBlZGl0YWJsZS52YWx1ZTtcbiAgICBsaW5lc1N0YXJ0SW5kaWNlcy5mb3JFYWNoKChzdGFydEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgIGNvbnN0IGVuZFZhbHVlID0gdmFsdWUuc2xpY2Uoc3RhcnRJbmRleCk7XG5cbiAgICAgIHZhbHVlID0gYCR7c3RhcnRWYWx1ZX0ke1RBQn0ke2VuZFZhbHVlfWA7XG4gICAgfSk7XG5cbiAgICBlZGl0YWJsZS52YWx1ZSA9IHZhbHVlO1xuXG4gICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQgPSBzZWxlY3Rpb25TdGFydCArIFRBQl9TSVpFO1xuICAgIGVkaXRhYmxlLnNlbGVjdGlvbkVuZCA9IHNlbGVjdGlvbkVuZCArIFRBQl9TSVpFICogbGluZXNTdGFydEluZGljZXMubGVuZ3RoO1xuICB9O1xuXG4gIGNvbnN0IG91dGRlbnQgPSAoKSA9PiB7XG4gICAgY29uc3QgeyBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kIH0gPSBlZGl0YWJsZTtcbiAgICBjb25zdCBsaW5lc1N0YXJ0SW5kaWNlcyA9IGdldFNlbGVjdGVkTGluZXNTdGFydEluZGljZXMoKTtcbiAgICBjb25zdCByZW1vdmVkVGFiczogbnVtYmVyW10gPSBbXTtcblxuICAgIGxldCB2YWx1ZSA9IGVkaXRhYmxlLnZhbHVlO1xuICAgIGxpbmVzU3RhcnRJbmRpY2VzLmZvckVhY2goKHN0YXJ0SW5kZXgpID0+IHtcbiAgICAgIGNvbnN0IHRhYk1hdGNoID0gdmFsdWVcbiAgICAgICAgLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyBUQUJfU0laRSlcbiAgICAgICAgLm1hdGNoKFJFX0xFQURJTkdfVEFCKTtcblxuICAgICAgaWYgKHRhYk1hdGNoKSB7XG4gICAgICAgIGNvbnN0IHN0YXJ0VmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBzdGFydEluZGV4KTtcbiAgICAgICAgY29uc3QgZW5kVmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydEluZGV4ICsgdGFiTWF0Y2hbMF0ubGVuZ3RoKTtcblxuICAgICAgICAvLyBEZWxldGUgYSB0YWIgZnJvbSB0aGUgbGluZVxuICAgICAgICB2YWx1ZSA9IGAke3N0YXJ0VmFsdWV9JHtlbmRWYWx1ZX1gO1xuICAgICAgICByZW1vdmVkVGFicy5wdXNoKHN0YXJ0SW5kZXgpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgZWRpdGFibGUudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmIChyZW1vdmVkVGFicy5sZW5ndGgpIHtcbiAgICAgIGlmIChzZWxlY3Rpb25TdGFydCA+IHJlbW92ZWRUYWJzW3JlbW92ZWRUYWJzLmxlbmd0aCAtIDFdKSB7XG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gTWF0aC5tYXgoXG4gICAgICAgICAgc2VsZWN0aW9uU3RhcnQgLSBUQUJfU0laRSxcbiAgICAgICAgICByZW1vdmVkVGFic1tyZW1vdmVkVGFicy5sZW5ndGggLSAxXSxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHRoZSBjdXJzb3IgaXMgYmVmb3JlIHRoZSBmaXJzdCB0YWIgcmVtb3ZlZCwgZXg6XG4gICAgICAgIC8vIExpbmV8ICMxXG4gICAgICAgIC8vICAgICBMaW5lICMyXG4gICAgICAgIC8vIExpbnxlICMzXG4gICAgICAgIC8vIHdlIHNob3VsZCByZXNldCB0aGUgc2VsZWN0aW9uU3RhcnQgdG8gaGlzIGluaXRpYWwgdmFsdWUuXG4gICAgICAgIGVkaXRhYmxlLnNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0aW9uU3RhcnQ7XG4gICAgICB9XG4gICAgICBlZGl0YWJsZS5zZWxlY3Rpb25FbmQgPSBNYXRoLm1heChcbiAgICAgICAgZWRpdGFibGUuc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgIHNlbGVjdGlvbkVuZCAtIFRBQl9TSVpFICogcmVtb3ZlZFRhYnMubGVuZ3RoLFxuICAgICAgKTtcbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGluZGljZXMgb2Ygc3RhcnQgcG9zaXRpb25zIG9mIHNlbGVjdGVkIGxpbmVzLCBpbiByZXZlcnNlIG9yZGVyXG4gICAqL1xuICBjb25zdCBnZXRTZWxlY3RlZExpbmVzU3RhcnRJbmRpY2VzID0gKCkgPT4ge1xuICAgIGxldCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQsIHZhbHVlIH0gPSBlZGl0YWJsZTtcblxuICAgIC8vIGNoYXJzIGJlZm9yZSBzZWxlY3Rpb25TdGFydCBvbiB0aGUgc2FtZSBsaW5lXG4gICAgY29uc3Qgc3RhcnRPZmZzZXQgPSB2YWx1ZS5zbGljZSgwLCBzZWxlY3Rpb25TdGFydCkubWF0Y2goL1teXFxuXSokLykhWzBdXG4gICAgICAubGVuZ3RoO1xuICAgIC8vIHB1dCBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxpbmVcbiAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGlvblN0YXJ0IC0gc3RhcnRPZmZzZXQ7XG5cbiAgICBjb25zdCBzZWxlY3RlZCA9IHZhbHVlLnNsaWNlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpO1xuXG4gICAgcmV0dXJuIHNlbGVjdGVkXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5yZWR1Y2UoXG4gICAgICAgIChzdGFydEluZGljZXMsIGxpbmUsIGlkeCwgbGluZXMpID0+XG4gICAgICAgICAgc3RhcnRJbmRpY2VzLmNvbmNhdChcbiAgICAgICAgICAgIGlkeFxuICAgICAgICAgICAgICA/IC8vIGN1cnIgbGluZSBpbmRleCBpcyBwcmV2IGxpbmUncyBzdGFydCArIHByZXYgbGluZSdzIGxlbmd0aCArIFxcblxuICAgICAgICAgICAgICAgIHN0YXJ0SW5kaWNlc1tpZHggLSAxXSArIGxpbmVzW2lkeCAtIDFdLmxlbmd0aCArIDFcbiAgICAgICAgICAgICAgOiAvLyBmaXJzdCBzZWxlY3RlZCBsaW5lXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQsXG4gICAgICAgICAgKSxcbiAgICAgICAgW10gYXMgbnVtYmVyW10sXG4gICAgICApXG4gICAgICAucmV2ZXJzZSgpO1xuICB9O1xuXG4gIGNvbnN0IHN0b3BFdmVudCA9IChldmVudDogRXZlbnQpID0+IHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICB9O1xuXG4gIC8vIHVzaW5nIGEgc3RhdGUgdmFyaWFibGUgaW5zdGVhZCBvZiBwYXNzaW5nIGl0IHRvIHRoZSBoYW5kbGVTdWJtaXQgY2FsbGJhY2tcbiAgLy8gc28gdGhhdCB3ZSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzZXBhcmF0ZSBhIGNhbGxiYWNrIGZvciBldmVudCBoYW5kbGVyc1xuICBsZXQgc3VibWl0dGVkVmlhS2V5Ym9hcmQgPSBmYWxzZTtcbiAgY29uc3QgaGFuZGxlU3VibWl0ID0gKCkgPT4ge1xuICAgIC8vIGNsZWFudXAgbXVzdCBiZSBydW4gYmVmb3JlIG9uU3VibWl0IG90aGVyd2lzZSB3aGVuIGFwcCBibHVycyB0aGUgd3lzaXd5Z1xuICAgIC8vIGl0J2QgZ2V0IHN0dWNrIGluIGFuIGluZmluaXRlIGxvb3Agb2YgYmx1cuKGkm9uU3VibWl0IGFmdGVyIHdlIHJlLWZvY3VzIHRoZVxuICAgIC8vIHd5c2l3eWcgb24gdXBkYXRlXG4gICAgY2xlYW51cCgpO1xuICAgIGNvbnN0IHVwZGF0ZUVsZW1lbnQgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgIGVsZW1lbnQuaWQsXG4gICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnQ7XG4gICAgaWYgKCF1cGRhdGVFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCB0ZXh0ID0gZWRpdGFibGUudmFsdWU7XG4gICAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh1cGRhdGVFbGVtZW50KTtcblxuICAgIGlmIChjb250YWluZXIpIHtcbiAgICAgIHRleHQgPSB1cGRhdGVFbGVtZW50LnRleHQ7XG4gICAgICBpZiAoZWRpdGFibGUudmFsdWUudHJpbSgpKSB7XG4gICAgICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnRJZCA9IGdldEJvdW5kVGV4dEVsZW1lbnRJZChjb250YWluZXIpO1xuICAgICAgICBpZiAoIWJvdW5kVGV4dEVsZW1lbnRJZCB8fCBib3VuZFRleHRFbGVtZW50SWQgIT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwge1xuICAgICAgICAgICAgYm91bmRFbGVtZW50czogKGNvbnRhaW5lci5ib3VuZEVsZW1lbnRzIHx8IFtdKS5jb25jYXQoe1xuICAgICAgICAgICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgICAgICAgICAgaWQ6IGVsZW1lbnQuaWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgICBib3VuZEVsZW1lbnRzOiBjb250YWluZXIuYm91bmRFbGVtZW50cz8uZmlsdGVyKFxuICAgICAgICAgICAgKGVsZSkgPT5cbiAgICAgICAgICAgICAgIWlzVGV4dEVsZW1lbnQoXG4gICAgICAgICAgICAgICAgZWxlIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50LFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIG9uU3VibWl0KHtcbiAgICAgIHRleHQsXG4gICAgICB2aWFLZXlib2FyZDogc3VibWl0dGVkVmlhS2V5Ym9hcmQsXG4gICAgICBvcmlnaW5hbFRleHQ6IGVkaXRhYmxlLnZhbHVlLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IGNsZWFudXAgPSAoKSA9PiB7XG4gICAgaWYgKGlzRGVzdHJveWVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlzRGVzdHJveWVkID0gdHJ1ZTtcbiAgICAvLyByZW1vdmUgZXZlbnRzIHRvIGVuc3VyZSB0aGV5IGRvbid0IGxhdGUtZmlyZVxuICAgIGVkaXRhYmxlLm9uYmx1ciA9IG51bGw7XG4gICAgZWRpdGFibGUub25pbnB1dCA9IG51bGw7XG4gICAgZWRpdGFibGUub25rZXlkb3duID0gbnVsbDtcblxuICAgIGlmIChvYnNlcnZlcikge1xuICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHVwZGF0ZVd5c2l3eWdTdHlsZSk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHRydWUpO1xuICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicG9pbnRlcmRvd25cIiwgb25Qb2ludGVyRG93bik7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJibHVyXCIsIGhhbmRsZVN1Ym1pdCk7XG5cbiAgICB1bmJpbmRVcGRhdGUoKTtcblxuICAgIGVkaXRhYmxlLnJlbW92ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGJpbmRCbHVyRXZlbnQgPSAoZXZlbnQ/OiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJwb2ludGVydXBcIiwgYmluZEJsdXJFdmVudCk7XG4gICAgLy8gRGVmZXJyZWQgc28gdGhhdCB0aGUgcG9pbnRlcmRvd24gdGhhdCBpbml0aWF0ZXMgdGhlIHd5c2l3eWcgZG9lc24ndFxuICAgIC8vIHRyaWdnZXIgdGhlIGJsdXIgb24gZW5zdWluZyBwb2ludGVydXAuXG4gICAgLy8gQWxzbyB0byBoYW5kbGUgY2FzZXMgc3VjaCBhcyBwaWNraW5nIGEgY29sb3Igd2hpY2ggd291bGQgdHJpZ2dlciBhIGJsdXJcbiAgICAvLyBpbiB0aGF0IHNhbWUgdGljay5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudD8udGFyZ2V0O1xuXG4gICAgY29uc3QgaXNUYXJnZXRDb2xvclBpY2tlciA9XG4gICAgICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmXG4gICAgICB0YXJnZXQuY2xvc2VzdChcIi5jb2xvci1waWNrZXItaW5wdXRcIikgJiZcbiAgICAgIGlzV3JpdGFibGVFbGVtZW50KHRhcmdldCk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGVkaXRhYmxlLm9uYmx1ciA9IGhhbmRsZVN1Ym1pdDtcbiAgICAgIGlmICh0YXJnZXQgJiYgaXNUYXJnZXRDb2xvclBpY2tlcikge1xuICAgICAgICB0YXJnZXQub25ibHVyID0gKCkgPT4ge1xuICAgICAgICAgIGVkaXRhYmxlLmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICAvLyBjYXNlOiBjbGlja2luZyBvbiB0aGUgc2FtZSBwcm9wZXJ0eSDihpIgbm8gY2hhbmdlIOKGkiBubyB1cGRhdGUg4oaSIG5vIGZvY3VzXG4gICAgICBpZiAoIWlzVGFyZ2V0Q29sb3JQaWNrZXIpIHtcbiAgICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcblxuICAvLyBwcmV2ZW50IGJsdXIgd2hlbiBjaGFuZ2luZyBwcm9wZXJ0aWVzIGZyb20gdGhlIG1lbnVcbiAgY29uc3Qgb25Qb2ludGVyRG93biA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xuICAgIGNvbnN0IGlzVGFyZ2V0Q29sb3JQaWNrZXIgPVxuICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoXCIuY29sb3ItcGlja2VyLWlucHV0XCIpICYmXG4gICAgICBpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpO1xuICAgIGlmIChcbiAgICAgICgoZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgfHxcbiAgICAgICAgZXZlbnQudGFyZ2V0IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgJiZcbiAgICAgICAgZXZlbnQudGFyZ2V0LmNsb3Nlc3QoYC4ke0NMQVNTRVMuU0hBUEVfQUNUSU9OU19NRU5VfWApICYmXG4gICAgICAgICFpc1dyaXRhYmxlRWxlbWVudChldmVudC50YXJnZXQpKSB8fFxuICAgICAgaXNUYXJnZXRDb2xvclBpY2tlclxuICAgICkge1xuICAgICAgZWRpdGFibGUub25ibHVyID0gbnVsbDtcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicG9pbnRlcnVwXCIsIGJpbmRCbHVyRXZlbnQpO1xuICAgICAgLy8gaGFuZGxlIGVkZ2UtY2FzZSB3aGVyZSBwb2ludGVydXAgZG9lc24ndCBmaXJlIGUuZy4gZHVlIHRvIHVzZXJcbiAgICAgIC8vIGFsdC10YWJiaW5nIGF3YXlcbiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiYmx1clwiLCBoYW5kbGVTdWJtaXQpO1xuICAgIH1cbiAgfTtcblxuICAvLyBoYW5kbGUgdXBkYXRlcyBvZiB0ZXh0RWxlbWVudCBwcm9wZXJ0aWVzIG9mIGVkaXRpbmcgZWxlbWVudFxuICBjb25zdCB1bmJpbmRVcGRhdGUgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KSEuYWRkQ2FsbGJhY2soKCkgPT4ge1xuICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIGNvbnN0IGlzQ29sb3JQaWNrZXJBY3RpdmUgPSAhIWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ/LmNsb3Nlc3QoXG4gICAgICBcIi5jb2xvci1waWNrZXItaW5wdXRcIixcbiAgICApO1xuICAgIGlmICghaXNDb2xvclBpY2tlckFjdGl2ZSkge1xuICAgICAgZWRpdGFibGUuZm9jdXMoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGxldCBpc0Rlc3Ryb3llZCA9IGZhbHNlO1xuXG4gIC8vIHNlbGVjdCBvbiBpbml0IChmb2N1c2luZyBpcyBkb25lIHNlcGFyYXRlbHkgaW5zaWRlIHRoZSBiaW5kQmx1ckV2ZW50KClcbiAgLy8gYmVjYXVzZSB3ZSBuZWVkIGl0IHRvIGhhcHBlbiAqYWZ0ZXIqIHRoZSBibHVyIGV2ZW50IGZyb20gYHBvaW50ZXJkb3duYClcbiAgZWRpdGFibGUuc2VsZWN0KCk7XG4gIGJpbmRCbHVyRXZlbnQoKTtcblxuICAvLyByZXBvc2l0aW9uIHd5c2l3eWcgaW4gY2FzZSBvZiBjYW52YXMgaXMgcmVzaXplZC4gVXNpbmcgUmVzaXplT2JzZXJ2ZXJcbiAgLy8gaXMgcHJlZmVycmVkIHNvIHdlIGNhdGNoIGNoYW5nZXMgZnJvbSBob3N0LCB3aGVyZSB3aW5kb3cgbWF5IG5vdCByZXNpemUuXG4gIGxldCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIgfCBudWxsID0gbnVsbDtcbiAgaWYgKGNhbnZhcyAmJiBcIlJlc2l6ZU9ic2VydmVyXCIgaW4gd2luZG93KSB7XG4gICAgb2JzZXJ2ZXIgPSBuZXcgd2luZG93LlJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIHVwZGF0ZVd5c2l3eWdTdHlsZSgpO1xuICAgIH0pO1xuICAgIG9ic2VydmVyLm9ic2VydmUoY2FudmFzKTtcbiAgfSBlbHNlIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB1cGRhdGVXeXNpd3lnU3R5bGUpO1xuICB9XG5cbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJwb2ludGVyZG93blwiLCBvblBvaW50ZXJEb3duKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJ3aGVlbFwiLCBzdG9wRXZlbnQsIHtcbiAgICBwYXNzaXZlOiBmYWxzZSxcbiAgICBjYXB0dXJlOiB0cnVlLFxuICB9KTtcbiAgZXhjYWxpZHJhd0NvbnRhaW5lclxuICAgID8ucXVlcnlTZWxlY3RvcihcIi5leGNhbGlkcmF3LXRleHRFZGl0b3JDb250YWluZXJcIikhXG4gICAgLmFwcGVuZENoaWxkKGVkaXRhYmxlKTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/textWysiwyg.tsx\n");
|
|
3025
3025
|
|
|
3026
3026
|
/***/ }),
|
|
3027
3027
|
|
|
@@ -3252,7 +3252,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3252
3252
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3253
3253
|
|
|
3254
3254
|
"use strict";
|
|
3255
|
-
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/${\"@dwelle/excalidraw\"}@${\"0.4.0-
|
|
3255
|
+
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/${\"@dwelle/excalidraw\"}@${\"0.4.0-989b1cf\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLG9CQUFvQixJQUFJLGVBQXVCLFFBQVEsQ0FBQztDQUNoRiIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/YTg3ZCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5pZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09IEVOVi5URVNUKSB7XG4gIC8qIGVzbGludC1kaXNhYmxlICovXG4gIC8qIGdsb2JhbCBfX3dlYnBhY2tfcHVibGljX3BhdGhfXzp3cml0YWJsZSAqL1xuICBfX3dlYnBhY2tfcHVibGljX3BhdGhfXyA9XG4gICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfS9kaXN0L2A7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3256
3256
|
|
|
3257
3257
|
/***/ }),
|
|
3258
3258
|
|
|
@@ -3373,7 +3373,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3373
3373
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3374
3374
|
|
|
3375
3375
|
"use strict";
|
|
3376
|
-
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/${\"@dwelle/excalidraw\"}@${\"0.4.0-904c06a\"}`;\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(\"https://excalidraw.com/Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"https://excalidraw.com/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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Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICBzY2FsZSxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vVmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3376
|
+
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/${\"@dwelle/excalidraw\"}@${\"0.4.0-989b1cf\"}`;\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(\"https://excalidraw.com/Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"https://excalidraw.com/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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Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICBzY2FsZSxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4pOiBQcm9taXNlPFNWR1NWR0VsZW1lbnQ+ID0+IHtcbiAgY29uc3Qge1xuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgZXhwb3J0U2NhbGUgPSAxLFxuICAgIGV4cG9ydEVtYmVkU2NlbmUsXG4gIH0gPSBhcHBTdGF0ZTtcbiAgbGV0IG1ldGFkYXRhID0gXCJcIjtcbiAgaWYgKGV4cG9ydEVtYmVkU2NlbmUpIHtcbiAgICB0cnkge1xuICAgICAgbWV0YWRhdGEgPSBhd2FpdCAoXG4gICAgICAgIGF3YWl0IGltcG9ydCgvKiB3ZWJwYWNrQ2h1bmtOYW1lOiBcImltYWdlXCIgKi8gXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKVxuICAgICAgKS5lbmNvZGVTdmdNZXRhZGF0YSh7XG4gICAgICAgIHRleHQ6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vVmlyZ2lsLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkNhc2NhZGlhXCI7XG4gICAgICAgIHNyYzogdXJsKFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9DYXNjYWRpYS53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L2RlZnM+XG4gIGA7XG4gIC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcbiAgaWYgKGFwcFN0YXRlLmV4cG9ydEJhY2tncm91bmQgJiYgdmlld0JhY2tncm91bmRDb2xvcikge1xuICAgIGNvbnN0IHJlY3QgPSBzdmdSb290Lm93bmVyRG9jdW1lbnQhLmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwicmVjdFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInhcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieVwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBgJHt3aWR0aH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImhlaWdodFwiLCBgJHtoZWlnaHR9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJmaWxsXCIsIHZpZXdCYWNrZ3JvdW5kQ29sb3IpO1xuICAgIHN2Z1Jvb3QuYXBwZW5kQ2hpbGQocmVjdCk7XG4gIH1cblxuICBjb25zdCByc3ZnID0gcm91Z2guc3ZnKHN2Z1Jvb3QpO1xuICByZW5kZXJTY2VuZVRvU3ZnKGVsZW1lbnRzLCByc3ZnLCBzdmdSb290LCBmaWxlcyB8fCB7fSwge1xuICAgIG9mZnNldFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICBvZmZzZXRZOiAtbWluWSArIGV4cG9ydFBhZGRpbmcsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUsXG4gIH0pO1xuXG4gIHJldHVybiBzdmdSb290O1xufTtcblxuLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuY29uc3QgZ2V0Q2FudmFzU2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICsgZXhwb3J0UGFkZGluZztcblxuICByZXR1cm4gW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEV4cG9ydFNpemUgPSAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZXhwb3J0UGFkZGluZzogbnVtYmVyLFxuICBzY2FsZTogbnVtYmVyLFxuKTogW251bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFssICwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoXG4gICAgKGRpbWVuc2lvbikgPT4gTWF0aC50cnVuYyhkaW1lbnNpb24gKiBzY2FsZSksXG4gICk7XG5cbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
3377
3377
|
|
|
3378
3378
|
/***/ }),
|
|
3379
3379
|
|
|
@@ -3461,7 +3461,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3461
3461
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3462
3462
|
|
|
3463
3463
|
"use strict";
|
|
3464
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ReactChildrenToObject\": () => (/* binding */ ReactChildrenToObject),\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\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 */ \"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 _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n\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), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\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 (appState.activeTool.type === \"eraser\") {\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 (_keys__WEBPACK_IMPORTED_MODULE_4__.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 invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - 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 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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-904c06a\",\"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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-904c06a\",\"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 ReactChildrenToObject = (children) => {\n return react__WEBPACK_IMPORTED_MODULE_5___default().Children.toArray(children).reduce((acc, child) => {\n if (react__WEBPACK_IMPORTED_MODULE_5___default().isValidElement(child) &&\n typeof child.type !== \"string\" &&\n (child === null || child === void 0 ? void 0 : child.type.name)) {\n // @ts-ignore\n acc[child.type.name] = child;\n }\n return acc;\n }, {});\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMzQixPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTthQUM5QixLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsSUFBSSxDQUFDLElBQUksR0FDaEI7WUFDQSxhQUFhO1lBQ2IsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBZ0IsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi91dGlscy50cz83NjNhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuXG5pbXBvcnQgY29sb3JzIGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHtcbiAgQ1VSU09SX1RZUEUsXG4gIERFRkFVTFRfVkVSU0lPTixcbiAgRVZFTlQsXG4gIEZPTlRfRkFNSUxZLFxuICBNSU1FX1RZUEVTLFxuICBUSEVNRSxcbiAgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05ULFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZvbnRGYW1pbHlWYWx1ZXMsIEZvbnRTdHJpbmcgfSBmcm9tIFwiLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgRGF0YVVSTCwgTGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsIFpvb20gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBpc0RhcndpbiB9IGZyb20gXCIuL2tleXNcIjtcbmltcG9ydCB7IFNIQVBFUyB9IGZyb20gXCIuL3NoYXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5sZXQgbW9ja0RhdGVUaW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IHNldERhdGVUaW1lRm9yVGVzdHMgPSAoZGF0ZVRpbWU6IHN0cmluZykgPT4ge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9ICgpID0+IHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtocn0ke21pbn1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSAoc3RyOiBzdHJpbmcpID0+XG4gIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblxuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpcyBIVE1MRWxlbWVudCA9PlxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG5cbmV4cG9ydCBjb25zdCBpc0lucHV0TGlrZSA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MU2VsZWN0RWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudDtcblxuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gKHtcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgZm9yIChjb25zdCBbZm9udEZhbWlseVN0cmluZywgaWRdIG9mIE9iamVjdC5lbnRyaWVzKEZPTlRfRkFNSUxZKSkge1xuICAgIGlmIChpZCA9PT0gZm9udEZhbWlseSkge1xuICAgICAgcmV0dXJuIGAke2ZvbnRGYW1pbHlTdHJpbmd9LCAke1dJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVH1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcblxuLyoqIHJldHVybnMgZm9udFNpemUrZm9udEZhbWlseSBzdHJpbmcgZm9yIGFzc2lnbm1lbnQgdG8gRE9NIGVsZW1lbnRzICovXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9ICh7XG4gIGZvbnRTaXplLFxuICBmb250RmFtaWx5LFxufToge1xuICBmb250U2l6ZTogbnVtYmVyO1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseSB9KX1gIGFzIEZvbnRTdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2UgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICB0aW1lb3V0OiBudW1iZXIsXG4pID0+IHtcbiAgbGV0IGhhbmRsZSA9IDA7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyB0aHJvdHRsZSBjYWxsYmFjayB0byBleGVjdXRlIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuZXhwb3J0IGNvbnN0IHRocm90dGxlUkFGID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgb3B0cz86IHsgdHJhaWxpbmc/OiBib29sZWFuIH0sXG4pID0+IHtcbiAgbGV0IHRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzVHJhaWxpbmc6IFQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSAoYXJnczogVCkgPT4ge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBpZiAobGFzdEFyZ3NUcmFpbGluZykge1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmc7XG4gICAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBpZiAodGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGdW5jKGxhc3RBcmdzKTtcbiAgICB9IGVsc2UgaWYgKG9wdHM/LnRyYWlsaW5nKSB7XG4gICAgICBsYXN0QXJnc1RyYWlsaW5nID0gYXJncztcbiAgICB9XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5leHBvcnQgY29uc3QgY2h1bmsgPSA8VCBleHRlbmRzIGFueT4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIHNpemU6IG51bWJlcixcbik6IFRbXVtdID0+IHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHJlc0luZGV4ID0gMDtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkoTWF0aC5jZWlsKGFycmF5Lmxlbmd0aCAvIHNpemUpKTtcbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlID0gKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNlbGVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2UgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IE1hdGguYWJzKHggLSB5KTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjdGl2ZVRvb2wgPSAoXG4gIGFwcFN0YXRlOiBQaWNrPEFwcFN0YXRlLCBcImFjdGl2ZVRvb2xcIj4sXG4gIGRhdGE6IChcbiAgICB8IHsgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIH1cbiAgICB8IHsgdHlwZTogXCJjdXN0b21cIjsgY3VzdG9tVHlwZTogc3RyaW5nIH1cbiAgKSAmIHsgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI/OiBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciB9LFxuKTogQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdID0+IHtcbiAgaWYgKGRhdGEudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIGN1c3RvbVR5cGU6IGRhdGEuY3VzdG9tVHlwZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgIGxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyOlxuICAgICAgZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlclxuICAgICAgICA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBcIlwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLCBjdXJzb3I6IHN0cmluZykgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgfVxufTtcblxubGV0IGVyYXNlckNhbnZhc0NhY2hlOiBhbnk7XG5sZXQgcHJldmlld0RhdGFVUkw6IHN0cmluZztcbmV4cG9ydCBjb25zdCBzZXRFcmFzZXJDdXJzb3IgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICB0aGVtZTogQXBwU3RhdGVbXCJ0aGVtZVwiXSxcbikgPT4ge1xuICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDIwO1xuXG4gIGNvbnN0IGRyYXdDYW52YXMgPSAoKSA9PiB7XG4gICAgY29uc3QgaXNEYXJrVGhlbWUgPSB0aGVtZSA9PT0gVEhFTUUuREFSSztcbiAgICBlcmFzZXJDYW52YXNDYWNoZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgPSB0aGVtZTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGNvbnN0IGNvbnRleHQgPSBlcmFzZXJDYW52YXNDYWNoZS5nZXRDb250ZXh0KFwiMmRcIikhO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuYXJjKFxuICAgICAgZXJhc2VyQ2FudmFzQ2FjaGUud2lkdGggLyAyLFxuICAgICAgZXJhc2VyQ2FudmFzQ2FjaGUuaGVpZ2h0IC8gMixcbiAgICAgIDUsXG4gICAgICAwLFxuICAgICAgMiAqIE1hdGguUEksXG4gICAgKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpIGFzIERhdGFVUkw7XG4gIH07XG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKFxuICAgIGNhbnZhcyxcbiAgICBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSAke2N1cnNvckltYWdlU2l6ZVB4IC8gMn0gJHtcbiAgICAgIGN1cnNvckltYWdlU2l6ZVB4IC8gMlxuICAgIH0sIGF1dG9gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEN1cnNvckZvclNoYXBlID0gKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICByZXNldEN1cnNvcihjYW52YXMpO1xuICB9IGVsc2UgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJlcmFzZXJcIikge1xuICAgIHNldEVyYXNlckN1cnNvcihjYW52YXMsIGFwcFN0YXRlLnRoZW1lKTtcbiAgICAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICAgIC8vIElnbm9yZSBjdXN0b20gdHlwZSBhcyB3ZWxsIGFuZCBsZXQgaG9zdCBkZWNpZGVcbiAgfSBlbHNlIGlmICghW1wiaW1hZ2VcIiwgXCJjdXN0b21cIl0uaW5jbHVkZXMoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBDVVJTT1JfVFlQRS5DUk9TU0hBSVI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudD8ubm9kZU5hbWUgPT09IFwiSFRNTFwiO1xuXG5leHBvcnQgY29uc3QgYWxsb3dGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG5cbmV4cG9ydCBjb25zdCBleGl0RnVsbFNjcmVlbiA9ICgpID0+IGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRTaG9ydGN1dEtleSA9IChzaG9ydGN1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgc2hvcnRjdXQgPSBzaG9ydGN1dFxuICAgIC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJBbHRcIilcbiAgICAucmVwbGFjZSgvXFxiU2hpZnRcXGIvaSwgXCJTaGlmdFwiKVxuICAgIC5yZXBsYWNlKC9cXGIoRW50ZXJ8UmV0dXJuKVxcYi9pLCBcIkVudGVyXCIpO1xuICBpZiAoaXNEYXJ3aW4pIHtcbiAgICByZXR1cm4gc2hvcnRjdXRcbiAgICAgIC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvZ2ksIFwiQ21kXCIpXG4gICAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiT3B0aW9uXCIpO1xuICB9XG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvZ2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IFJlYWN0Q2hpbGRyZW5Ub09iamVjdCA9IDxcbiAgVCBleHRlbmRzIHtcbiAgICBbayBpbiBzdHJpbmddPzpcbiAgICAgIHwgUmVhY3QuUmVhY3RQb3J0YWxcbiAgICAgIHwgUmVhY3QuUmVhY3RFbGVtZW50PHVua25vd24sIHN0cmluZyB8IFJlYWN0LkpTWEVsZW1lbnRDb25zdHJ1Y3Rvcjxhbnk+PjtcbiAgfSxcbj4oXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUsXG4pID0+IHtcbiAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLnJlZHVjZSgoYWNjLCBjaGlsZCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJlxuICAgICAgdHlwZW9mIGNoaWxkLnR5cGUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAgIGNoaWxkPy50eXBlLm5hbWVcbiAgICApIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGFjY1tjaGlsZC50eXBlLm5hbWVdID0gY2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFBhcnRpYWw8VD4pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3464
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ReactChildrenToObject\": () => (/* binding */ ReactChildrenToObject),\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\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 */ \"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 _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react */ \"react\");\n/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_5__);\n\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), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\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 (appState.activeTool.type === \"eraser\") {\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 (_keys__WEBPACK_IMPORTED_MODULE_4__.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 invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - 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 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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-989b1cf\",\"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\",\"PKG_NAME\":\"@dwelle/excalidraw\",\"PKG_VERSION\":\"0.4.0-989b1cf\",\"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 ReactChildrenToObject = (children) => {\n return react__WEBPACK_IMPORTED_MODULE_5___default().Children.toArray(children).reduce((acc, child) => {\n if (react__WEBPACK_IMPORTED_MODULE_5___default().isValidElement(child) &&\n typeof child.type !== \"string\" &&\n (child === null || child === void 0 ? void 0 : child.type.name)) {\n // @ts-ignore\n acc[child.type.name] = child;\n }\n return acc;\n }, {});\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUMzQixPQUFPLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUTthQUM5QixLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsSUFBSSxDQUFDLElBQUksR0FDaEI7WUFDQSxhQUFhO1lBQ2IsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQzlCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQUUsRUFBZ0IsQ0FBQyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi91dGlscy50cz83NjNhIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBvYyBmcm9tIFwib3Blbi1jb2xvclwiO1xuXG5pbXBvcnQgY29sb3JzIGZyb20gXCIuL2NvbG9yc1wiO1xuaW1wb3J0IHtcbiAgQ1VSU09SX1RZUEUsXG4gIERFRkFVTFRfVkVSU0lPTixcbiAgRVZFTlQsXG4gIEZPTlRfRkFNSUxZLFxuICBNSU1FX1RZUEVTLFxuICBUSEVNRSxcbiAgV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05ULFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IEZvbnRGYW1pbHlWYWx1ZXMsIEZvbnRTdHJpbmcgfSBmcm9tIFwiLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgRGF0YVVSTCwgTGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsIFpvb20gfSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tIFwicmVhY3QtZG9tXCI7XG5pbXBvcnQgeyBpc0RhcndpbiB9IGZyb20gXCIuL2tleXNcIjtcbmltcG9ydCB7IFNIQVBFUyB9IGZyb20gXCIuL3NoYXBlc1wiO1xuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuXG5sZXQgbW9ja0RhdGVUaW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuZXhwb3J0IGNvbnN0IHNldERhdGVUaW1lRm9yVGVzdHMgPSAoZGF0ZVRpbWU6IHN0cmluZykgPT4ge1xuICBtb2NrRGF0ZVRpbWUgPSBkYXRlVGltZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREYXRlVGltZSA9ICgpID0+IHtcbiAgaWYgKG1vY2tEYXRlVGltZSkge1xuICAgIHJldHVybiBtb2NrRGF0ZVRpbWU7XG4gIH1cblxuICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcbiAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgY29uc3QgbW9udGggPSBgJHtkYXRlLmdldE1vbnRoKCkgKyAxfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBkYXkgPSBgJHtkYXRlLmdldERhdGUoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgaHIgPSBgJHtkYXRlLmdldEhvdXJzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IG1pbiA9IGAke2RhdGUuZ2V0TWludXRlcygpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuXG4gIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0tJHtocn0ke21pbn1gO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhcGl0YWxpemVTdHJpbmcgPSAoc3RyOiBzdHJpbmcpID0+XG4gIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcblxuZXhwb3J0IGNvbnN0IGlzVG9vbEljb24gPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpcyBIVE1MRWxlbWVudCA9PlxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuY2xhc3NOYW1lLmluY2x1ZGVzKFwiVG9vbEljb25cIik7XG5cbmV4cG9ydCBjb25zdCBpc0lucHV0TGlrZSA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzXG4gIHwgSFRNTElucHV0RWxlbWVudFxuICB8IEhUTUxUZXh0QXJlYUVsZW1lbnRcbiAgfCBIVE1MU2VsZWN0RWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudDtcblxuZXhwb3J0IGNvbnN0IGlzV3JpdGFibGVFbGVtZW50ID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxCUkVsZW1lbnRcbiAgfCBIVE1MRGl2RWxlbWVudCA9PlxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgdGFyZ2V0LmRhdGFzZXQudHlwZSA9PT0gXCJ3eXNpd3lnXCIpIHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxCUkVsZW1lbnQgfHwgLy8gbmV3bGluZSBpbiB3eXNpd3lnXG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxUZXh0QXJlYUVsZW1lbnQgfHxcbiAgKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgJiZcbiAgICAodGFyZ2V0LnR5cGUgPT09IFwidGV4dFwiIHx8IHRhcmdldC50eXBlID09PSBcIm51bWJlclwiKSk7XG5cbmV4cG9ydCBjb25zdCBnZXRGb250RmFtaWx5U3RyaW5nID0gKHtcbiAgZm9udEZhbWlseSxcbn06IHtcbiAgZm9udEZhbWlseTogRm9udEZhbWlseVZhbHVlcztcbn0pID0+IHtcbiAgZm9yIChjb25zdCBbZm9udEZhbWlseVN0cmluZywgaWRdIG9mIE9iamVjdC5lbnRyaWVzKEZPTlRfRkFNSUxZKSkge1xuICAgIGlmIChpZCA9PT0gZm9udEZhbWlseSkge1xuICAgICAgcmV0dXJuIGAke2ZvbnRGYW1pbHlTdHJpbmd9LCAke1dJTkRPV1NfRU1PSklfRkFMTEJBQ0tfRk9OVH1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gV0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UO1xufTtcblxuLyoqIHJldHVybnMgZm9udFNpemUrZm9udEZhbWlseSBzdHJpbmcgZm9yIGFzc2lnbm1lbnQgdG8gRE9NIGVsZW1lbnRzICovXG5leHBvcnQgY29uc3QgZ2V0Rm9udFN0cmluZyA9ICh7XG4gIGZvbnRTaXplLFxuICBmb250RmFtaWx5LFxufToge1xuICBmb250U2l6ZTogbnVtYmVyO1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICByZXR1cm4gYCR7Zm9udFNpemV9cHggJHtnZXRGb250RmFtaWx5U3RyaW5nKHsgZm9udEZhbWlseSB9KX1gIGFzIEZvbnRTdHJpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZGVib3VuY2UgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICB0aW1lb3V0OiBudW1iZXIsXG4pID0+IHtcbiAgbGV0IGhhbmRsZSA9IDA7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBjb25zdCByZXQgPSAoLi4uYXJnczogVCkgPT4ge1xuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICB9LCB0aW1lb3V0KTtcbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGlmIChsYXN0QXJncykge1xuICAgICAgY29uc3QgX2xhc3RBcmdzID0gbGFzdEFyZ3M7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBmbiguLi5fbGFzdEFyZ3MpO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyB0aHJvdHRsZSBjYWxsYmFjayB0byBleGVjdXRlIG9uY2UgcGVyIGFuaW1hdGlvbiBmcmFtZVxuZXhwb3J0IGNvbnN0IHRocm90dGxlUkFGID0gPFQgZXh0ZW5kcyBhbnlbXT4oXG4gIGZuOiAoLi4uYXJnczogVCkgPT4gdm9pZCxcbiAgb3B0cz86IHsgdHJhaWxpbmc/OiBib29sZWFuIH0sXG4pID0+IHtcbiAgbGV0IHRpbWVySWQ6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3M6IFQgfCBudWxsID0gbnVsbDtcbiAgbGV0IGxhc3RBcmdzVHJhaWxpbmc6IFQgfCBudWxsID0gbnVsbDtcblxuICBjb25zdCBzY2hlZHVsZUZ1bmMgPSAoYXJnczogVCkgPT4ge1xuICAgIHRpbWVySWQgPSB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICBsYXN0QXJncyA9IG51bGw7XG4gICAgICBpZiAobGFzdEFyZ3NUcmFpbGluZykge1xuICAgICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmc7XG4gICAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgZm4oLi4uYXJncyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxhc3RBcmdzID0gYXJncztcbiAgICBpZiAodGltZXJJZCA9PT0gbnVsbCkge1xuICAgICAgc2NoZWR1bGVGdW5jKGxhc3RBcmdzKTtcbiAgICB9IGVsc2UgaWYgKG9wdHM/LnRyYWlsaW5nKSB7XG4gICAgICBsYXN0QXJnc1RyYWlsaW5nID0gYXJncztcbiAgICB9XG4gIH07XG4gIHJldC5mbHVzaCA9ICgpID0+IHtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBmbiguLi4obGFzdEFyZ3NUcmFpbGluZyB8fCBsYXN0QXJncykpO1xuICAgICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldC5jYW5jZWwgPSAoKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBsYXN0QXJnc1RyYWlsaW5nID0gbnVsbDtcbiAgICBpZiAodGltZXJJZCAhPT0gbnVsbCkge1xuICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGltZXJJZCk7XG4gICAgICB0aW1lcklkID0gbnVsbDtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZXQ7XG59O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vbG9kYXNoL2xvZGFzaC9ibG9iL2VzL2NodW5rLmpzXG5leHBvcnQgY29uc3QgY2h1bmsgPSA8VCBleHRlbmRzIGFueT4oXG4gIGFycmF5OiByZWFkb25seSBUW10sXG4gIHNpemU6IG51bWJlcixcbik6IFRbXVtdID0+IHtcbiAgaWYgKCFhcnJheS5sZW5ndGggfHwgc2l6ZSA8IDEpIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHJlc0luZGV4ID0gMDtcbiAgY29uc3QgcmVzdWx0ID0gQXJyYXkoTWF0aC5jZWlsKGFycmF5Lmxlbmd0aCAvIHNpemUpKTtcbiAgd2hpbGUgKGluZGV4IDwgYXJyYXkubGVuZ3RoKSB7XG4gICAgcmVzdWx0W3Jlc0luZGV4KytdID0gYXJyYXkuc2xpY2UoaW5kZXgsIChpbmRleCArPSBzaXplKSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmV4cG9ydCBjb25zdCBzZWxlY3ROb2RlID0gKG5vZGU6IEVsZW1lbnQpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgY29uc3QgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgIHJhbmdlLnNlbGVjdE5vZGVDb250ZW50cyhub2RlKTtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IHJlbW92ZVNlbGVjdGlvbiA9ICgpID0+IHtcbiAgY29uc3Qgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICBpZiAoc2VsZWN0aW9uKSB7XG4gICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgZGlzdGFuY2UgPSAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IE1hdGguYWJzKHggLSB5KTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZUFjdGl2ZVRvb2wgPSAoXG4gIGFwcFN0YXRlOiBQaWNrPEFwcFN0YXRlLCBcImFjdGl2ZVRvb2xcIj4sXG4gIGRhdGE6IChcbiAgICB8IHsgdHlwZTogdHlwZW9mIFNIQVBFU1tudW1iZXJdW1widmFsdWVcIl0gfCBcImVyYXNlclwiIH1cbiAgICB8IHsgdHlwZTogXCJjdXN0b21cIjsgY3VzdG9tVHlwZTogc3RyaW5nIH1cbiAgKSAmIHsgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI/OiBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciB9LFxuKTogQXBwU3RhdGVbXCJhY3RpdmVUb29sXCJdID0+IHtcbiAgaWYgKGRhdGEudHlwZSA9PT0gXCJjdXN0b21cIikge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgICAgdHlwZTogXCJjdXN0b21cIixcbiAgICAgIGN1c3RvbVR5cGU6IGRhdGEuY3VzdG9tVHlwZSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5hcHBTdGF0ZS5hY3RpdmVUb29sLFxuICAgIGxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyOlxuICAgICAgZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciA9PT0gdW5kZWZpbmVkXG4gICAgICAgID8gYXBwU3RhdGUuYWN0aXZlVG9vbC5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlclxuICAgICAgICA6IGRhdGEubGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXIsXG4gICAgdHlwZTogZGF0YS50eXBlLFxuICAgIGN1c3RvbVR5cGU6IG51bGwsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgcmVzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKGNhbnZhcykge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBcIlwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yID0gKGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLCBjdXJzb3I6IHN0cmluZykgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IGN1cnNvcjtcbiAgfVxufTtcblxubGV0IGVyYXNlckNhbnZhc0NhY2hlOiBhbnk7XG5sZXQgcHJldmlld0RhdGFVUkw6IHN0cmluZztcbmV4cG9ydCBjb25zdCBzZXRFcmFzZXJDdXJzb3IgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICB0aGVtZTogQXBwU3RhdGVbXCJ0aGVtZVwiXSxcbikgPT4ge1xuICBjb25zdCBjdXJzb3JJbWFnZVNpemVQeCA9IDIwO1xuXG4gIGNvbnN0IGRyYXdDYW52YXMgPSAoKSA9PiB7XG4gICAgY29uc3QgaXNEYXJrVGhlbWUgPSB0aGVtZSA9PT0gVEhFTUUuREFSSztcbiAgICBlcmFzZXJDYW52YXNDYWNoZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XG4gICAgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgPSB0aGVtZTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgPSBjdXJzb3JJbWFnZVNpemVQeDtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGNvbnN0IGNvbnRleHQgPSBlcmFzZXJDYW52YXNDYWNoZS5nZXRDb250ZXh0KFwiMmRcIikhO1xuICAgIGNvbnRleHQubGluZVdpZHRoID0gMTtcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIGNvbnRleHQuYXJjKFxuICAgICAgZXJhc2VyQ2FudmFzQ2FjaGUud2lkdGggLyAyLFxuICAgICAgZXJhc2VyQ2FudmFzQ2FjaGUuaGVpZ2h0IC8gMixcbiAgICAgIDUsXG4gICAgICAwLFxuICAgICAgMiAqIE1hdGguUEksXG4gICAgKTtcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGlzRGFya1RoZW1lID8gb2MuYmxhY2sgOiBvYy53aGl0ZTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy53aGl0ZSA6IG9jLmJsYWNrO1xuICAgIGNvbnRleHQuc3Ryb2tlKCk7XG4gICAgcHJldmlld0RhdGFVUkwgPSBlcmFzZXJDYW52YXNDYWNoZS50b0RhdGFVUkwoTUlNRV9UWVBFUy5zdmcpIGFzIERhdGFVUkw7XG4gIH07XG4gIGlmICghZXJhc2VyQ2FudmFzQ2FjaGUgfHwgZXJhc2VyQ2FudmFzQ2FjaGUudGhlbWUgIT09IHRoZW1lKSB7XG4gICAgZHJhd0NhbnZhcygpO1xuICB9XG5cbiAgc2V0Q3Vyc29yKFxuICAgIGNhbnZhcyxcbiAgICBgdXJsKCR7cHJldmlld0RhdGFVUkx9KSAke2N1cnNvckltYWdlU2l6ZVB4IC8gMn0gJHtcbiAgICAgIGN1cnNvckltYWdlU2l6ZVB4IC8gMlxuICAgIH0sIGF1dG9gLFxuICApO1xufTtcblxuZXhwb3J0IGNvbnN0IHNldEN1cnNvckZvclNoYXBlID0gKFxuICBjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuKSA9PiB7XG4gIGlmICghY2FudmFzKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUgPT09IFwic2VsZWN0aW9uXCIpIHtcbiAgICByZXNldEN1cnNvcihjYW52YXMpO1xuICB9IGVsc2UgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJlcmFzZXJcIikge1xuICAgIHNldEVyYXNlckN1cnNvcihjYW52YXMsIGFwcFN0YXRlLnRoZW1lKTtcbiAgICAvLyBkbyBub3RoaW5nIGlmIGltYWdlIHRvb2wgaXMgc2VsZWN0ZWQgd2hpY2ggc3VnZ2VzdHMgdGhlcmUnc1xuICAgIC8vIGEgaW1hZ2UtcHJldmlldyBzZXQgYXMgdGhlIGN1cnNvclxuICAgIC8vIElnbm9yZSBjdXN0b20gdHlwZSBhcyB3ZWxsIGFuZCBsZXQgaG9zdCBkZWNpZGVcbiAgfSBlbHNlIGlmICghW1wiaW1hZ2VcIiwgXCJjdXN0b21cIl0uaW5jbHVkZXMoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlKSkge1xuICAgIGNhbnZhcy5zdHlsZS5jdXJzb3IgPSBDVVJTT1JfVFlQRS5DUk9TU0hBSVI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBpc0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5mdWxsc2NyZWVuRWxlbWVudD8ubm9kZU5hbWUgPT09IFwiSFRNTFwiO1xuXG5leHBvcnQgY29uc3QgYWxsb3dGdWxsU2NyZWVuID0gKCkgPT5cbiAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnJlcXVlc3RGdWxsc2NyZWVuKCk7XG5cbmV4cG9ydCBjb25zdCBleGl0RnVsbFNjcmVlbiA9ICgpID0+IGRvY3VtZW50LmV4aXRGdWxsc2NyZWVuKCk7XG5cbmV4cG9ydCBjb25zdCBnZXRTaG9ydGN1dEtleSA9IChzaG9ydGN1dDogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgc2hvcnRjdXQgPSBzaG9ydGN1dFxuICAgIC5yZXBsYWNlKC9cXGJBbHRcXGIvaSwgXCJBbHRcIilcbiAgICAucmVwbGFjZSgvXFxiU2hpZnRcXGIvaSwgXCJTaGlmdFwiKVxuICAgIC5yZXBsYWNlKC9cXGIoRW50ZXJ8UmV0dXJuKVxcYi9pLCBcIkVudGVyXCIpO1xuICBpZiAoaXNEYXJ3aW4pIHtcbiAgICByZXR1cm4gc2hvcnRjdXRcbiAgICAgIC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvZ2ksIFwiQ21kXCIpXG4gICAgICAucmVwbGFjZSgvXFxiQWx0XFxiL2ksIFwiT3B0aW9uXCIpO1xuICB9XG4gIHJldHVybiBzaG9ydGN1dC5yZXBsYWNlKC9cXGJDdHJsT3JDbWRcXGIvZ2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcblxuZXhwb3J0IGNvbnN0IFJlYWN0Q2hpbGRyZW5Ub09iamVjdCA9IDxcbiAgVCBleHRlbmRzIHtcbiAgICBbayBpbiBzdHJpbmddPzpcbiAgICAgIHwgUmVhY3QuUmVhY3RQb3J0YWxcbiAgICAgIHwgUmVhY3QuUmVhY3RFbGVtZW50PHVua25vd24sIHN0cmluZyB8IFJlYWN0LkpTWEVsZW1lbnRDb25zdHJ1Y3Rvcjxhbnk+PjtcbiAgfSxcbj4oXG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUsXG4pID0+IHtcbiAgcmV0dXJuIFJlYWN0LkNoaWxkcmVuLnRvQXJyYXkoY2hpbGRyZW4pLnJlZHVjZSgoYWNjLCBjaGlsZCkgPT4ge1xuICAgIGlmIChcbiAgICAgIFJlYWN0LmlzVmFsaWRFbGVtZW50KGNoaWxkKSAmJlxuICAgICAgdHlwZW9mIGNoaWxkLnR5cGUgIT09IFwic3RyaW5nXCIgJiZcbiAgICAgIGNoaWxkPy50eXBlLm5hbWVcbiAgICApIHtcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGFjY1tjaGlsZC50eXBlLm5hbWVdID0gY2hpbGQ7XG4gICAgfVxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9IGFzIFBhcnRpYWw8VD4pO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
|
|
3465
3465
|
|
|
3466
3466
|
/***/ }),
|
|
3467
3467
|
|