@excalidraw/excalidraw 0.15.2-6546-9e30320 → 0.15.2-6546-81bee8a
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.
|
@@ -2482,7 +2482,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
2482
2482
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
2483
2483
|
|
|
2484
2484
|
"use strict";
|
|
2485
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n if (typeof window === \"undefined\" || ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.15.2-6546-
|
|
2485
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nconst trackEvent = (category, action, label, value) => {\n try {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n if (typeof window === \"undefined\" || ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.15.2-6546-81bee8a\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true}).JEST_WORKER_ID) {\n return;\n }\n if (({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"FAST_REFRESH\":\"false\",\"REACT_APP_MATOMO_URL\":\"\",\"REACT_APP_CDN_MATOMO_TRACKER_URL\":\"\",\"REACT_APP_MATOMO_SITE_ID\":\"\",\"REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.15.2-6546-81bee8a\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true}).REACT_APP_GOOGLE_ANALYTICS_ID && window.gtag) {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value,\n });\n }\n if (window.fathom) {\n window.fathom.trackEvent(action, {\n category,\n label,\n value,\n });\n }\n }\n catch (error) {\n console.error(\"error during analytics\", error);\n }\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBTyxNQUFNLFVBQVUsR0FBRyxDQUN4QixRQUFnQixFQUNoQixNQUFjLEVBQ2QsS0FBYyxFQUNkLEtBQWMsRUFDZCxFQUFFO0lBQ0YsSUFBSTtRQUNGLDJDQUEyQztRQUMzQyxrRUFBa0U7UUFFbEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLElBQUksNmlDQUFXLENBQUMsY0FBYyxFQUFFO1lBQy9ELE9BQU87U0FDUjtRQUVELElBQUksNmlDQUFXLENBQUMsNkJBQTZCLElBQUksTUFBTSxDQUFDLElBQUksRUFBRTtZQUM1RCxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO1lBQ25CLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN0QixRQUFRO2dCQUNSLEtBQUs7Z0JBQ0wsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBRUQsSUFBSSxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQ2pCLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtnQkFDL0IsUUFBUTtnQkFDUixLQUFLO2dCQUNMLEtBQUs7YUFDTixDQUFDLENBQUM7U0FDSjtLQUNGO0lBQUMsT0FBTyxLQUFLLEVBQUU7UUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ2hEO0FBQ0gsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81ZjBjIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0cmFja0V2ZW50ID0gKFxuICBjYXRlZ29yeTogc3RyaW5nLFxuICBhY3Rpb246IHN0cmluZyxcbiAgbGFiZWw/OiBzdHJpbmcsXG4gIHZhbHVlPzogbnVtYmVyLFxuKSA9PiB7XG4gIHRyeSB7XG4gICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgIC8vIGNvbnNvbGUubG9nKFwiVHJhY2sgRXZlbnRcIiwgeyBjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUgfSk7XG5cbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCBwcm9jZXNzLmVudi5KRVNUX1dPUktFUl9JRCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9jZXNzLmVudi5SRUFDVF9BUFBfR09PR0xFX0FOQUxZVElDU19JRCAmJiB3aW5kb3cuZ3RhZykge1xuICAgICAgd2luZG93Lmd0YWcoXCJldmVudFwiLCBhY3Rpb24sIHtcbiAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICBldmVudF9sYWJlbDogbGFiZWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5mYXRob20pIHtcbiAgICAgIHdpbmRvdy5mYXRob20udHJhY2tFdmVudChhY3Rpb24sIHtcbiAgICAgICAgY2F0ZWdvcnksXG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBjb25zb2xlLmVycm9yKFwiZXJyb3IgZHVyaW5nIGFuYWx5dGljc1wiLCBlcnJvcik7XG4gIH1cbn07XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
|
|
2486
2486
|
|
|
2487
2487
|
/***/ }),
|
|
2488
2488
|
|
|
@@ -3758,7 +3758,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3758
3758
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3759
3759
|
|
|
3760
3760
|
"use strict";
|
|
3761
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToContainer\": () => (/* binding */ bindTextToContainer),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeBoundTextPosition\": () => (/* binding */ computeBoundTextPosition),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"detectLineHeight\": () => (/* binding */ detectLineHeight),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\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 */ \"getBoundTextMaxHeight\": () => (/* binding */ getBoundTextMaxHeight),\n/* harmony export */ \"getBoundTextMaxWidth\": () => (/* binding */ getBoundTextMaxWidth),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getDefaultLineHeight\": () => (/* binding */ getDefaultLineHeight),\n/* harmony export */ \"getLineHeightInPx\": () => (/* binding */ getLineHeightInPx),\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 */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isMeasureTextSupported\": () => (/* binding */ isMeasureTextSupported),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureBaseline\": () => (/* binding */ measureBaseline),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"parseTokens\": () => (/* binding */ parseTokens),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"splitIntoLines\": () => (/* binding */ splitIntoLines),\n/* harmony export */ \"suppportsHorizontalAlign\": () => (/* binding */ suppportsHorizontalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\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 splitIntoLines = (text) => {\n return normalizeText(text).split(\"\\n\");\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n baseline: textElement.baseline,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getBoundTextMaxWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n boundTextUpdates.baseline = metrics.baseline;\n if (container) {\n const maxContainerHeight = getBoundTextMaxHeight(container, textElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n console.log(metrics, maxContainerWidth, container);\n if (metrics.height > maxContainerHeight) {\n const nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n if (metrics.width > maxContainerWidth) {\n const nextWidth = computeContainerDimensionForBoundText(metrics.width, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { width: nextWidth });\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getBoundTextMaxWidth(container);\n const maxHeight = getBoundTextMaxHeight(container, textElement);\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 metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n nextHeight = metrics.height;\n nextWidth = metrics.width;\n nextBaseLine = metrics.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getBoundTextMaxHeight(container, boundTextElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, lineHeight) => {\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 fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n const baseline = measureBaseline(text, font, lineHeight);\n return { width, height, baseline };\n};\nconst measureBaseline = (text, font, lineHeight, wrapInContainer) => {\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 (wrapInContainer) {\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.whiteSpace = \"pre-wrap\";\n }\n container.style.lineHeight = String(lineHeight);\n container.innerText = text;\n // Baseline is important for positioning text on canvas\n document.body.appendChild(container);\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 let baseline = span.offsetTop + span.offsetHeight;\n const height = container.offsetHeight;\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isSafari) {\n const canvasHeight = getTextHeight(text, parseFloat(font), lineHeight);\n const fontSize = parseFloat(font);\n // In Safari the font size gets rounded off when rendering hence calculating the safari height and shifting the baseline if it differs\n // from the actual canvas height\n const domHeight = getTextHeight(text, Math.round(fontSize), lineHeight);\n if (canvasHeight > height) {\n baseline += canvasHeight - domHeight;\n }\n if (height > canvasHeight) {\n baseline -= domHeight - canvasHeight;\n }\n }\n document.body.removeChild(container);\n return baseline;\n};\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nconst detectLineHeight = (textElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize);\n};\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nconst getLineHeightInPx = (fontSize, lineHeight) => {\n return fontSize * lineHeight;\n};\n// FIXME rename to getApproxMinContainerHeight\nconst getApproxMinLineHeight = (fontSize, lineHeight) => {\n return getLineHeightInPx(fontSize, lineHeight) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, fontSize, lineHeight) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\nconst parseTokens = (text) => {\n // Splitting words containing \"-\" as those are treated as separate words\n // by css wrapping algorithm eg non-profit => non-, profit\n const words = text.split(\"-\");\n if (words.length > 1) {\n // non-proft org => ['non-', 'profit org']\n words.forEach((word, index) => {\n if (index !== words.length - 1) {\n words[index] = word += \"-\";\n }\n });\n }\n // Joining the words with space and splitting them again with space to get the\n // final list of tokens\n // ['non-', 'profit org'] =>,'non- proft org' => ['non-','profit','org']\n return words.join(\" \").split(\" \");\n};\nconst wrapText = (text, font, maxWidth) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n // Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n const words = parseTokens(originalLine);\n resetParams();\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n resetParams();\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line unless the line ends with hyphen to sync\n // with css word-wrap\n }\n else if (!currentLine.endsWith(\"-\")) {\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n break;\n }\n index++;\n // if word ends with \"-\" then we don't need to add space\n // to sync with css word-wrap\n const shouldAppendSpace = !word.endsWith(\"-\");\n currentLine += word;\n if (shouldAppendSpace) {\n currentLine += \" \";\n }\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n if (shouldAppendSpace) {\n lines.push(currentLine.slice(0, -1));\n }\n else {\n lines.push(currentLine);\n }\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n// FIXME rename to getApproxMinContainerWidth\nconst getApproxMinLineWidth = (font, lineHeight) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).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 getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst suppportsHorizontalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element);\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getBoundTextMaxWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getBoundTextMaxHeight = (container, boundTextElement) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n return boundTextElement.height;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst isMeasureTextSupported = () => {\n const width = getTextWidth(DUMMY_TEXT, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_SIZE,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY,\n }));\n return width > 0;\n};\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Virgil]: 1.25,\n // ~1.15 is the average for Virgil in WebKit and Blink.\n // Gecko if all over the place.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Helvetica]: 1.15,\n // ~1.2 is the average for Virgil in WebKit and Blink, and kinda Gecko too\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Cascadia]: 1.2,\n};\nconst getDefaultLineHeight = (fontFamily) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY];\n};\nconst bindTextToContainer = (containerProps, textProps) => {\n let container;\n if (containerProps.type === \"arrow\") {\n container = (0,_newElement__WEBPACK_IMPORTED_MODULE_10__.newLinearElement)(Object.assign({ \n //@ts-ignore\n x: 0, \n //@ts-ignore\n y: 0, \n //@ts-ignore\n type: containerProps.type, \n //@ts-ignore,\n endArrowhead: containerProps.type === \"arrow\" ? \"arrow\" : null, \n //@ts-ignore\n points: [\n [0, 0],\n [300, 0],\n ] }, containerProps));\n }\n else {\n //@ts-ignore\n container = (0,___WEBPACK_IMPORTED_MODULE_4__.newElement)(Object.assign({ x: 0, y: 0 }, containerProps));\n }\n const textElement = (0,___WEBPACK_IMPORTED_MODULE_4__.newTextElement)(Object.assign(Object.assign({ x: 0, y: 0 }, textProps), { containerId: container.id, textAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.CENTER, verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.MIDDLE }));\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n redrawTextBoundingBox(textElement, container);\n return [container, textElement];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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U0FBUyxHQUFHLDZDQUFVLGlCQUNwQixDQUFDLEVBQUUsQ0FBQyxFQUNKLENBQUMsRUFBRSxDQUFDLElBQ0QsY0FBYyxFQUNqQixDQUFDO0tBQ0o7SUFDRCxNQUFNLFdBQVcsR0FBMEIsaURBQWMsK0JBQ3ZELENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxFQUFFLENBQUMsSUFDRCxTQUFTLEtBQ1osV0FBVyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQ3pCLFNBQVMsRUFBRSx5REFBaUIsRUFDNUIsYUFBYSxFQUFFLDZEQUFxQixJQUNwQyxDQUFDO0lBRUgsNkRBQWEsQ0FBQyxTQUFTLEVBQUU7UUFDdkIsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDcEQsSUFBSSxFQUFFLE1BQU07WUFDWixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7U0FDbkIsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILHFCQUFxQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRFbGVtZW50LnRzPzQyZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgYXJyYXlUb01hcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRm9udFN0cmluZyxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIEJPVU5EX1RFWFRfUEFERElORyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxuICBpc1NhZmFyaSxcbiAgVEVYVF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIG5ld0VsZW1lbnQsIG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzQm91bmRUb0NvbnRhaW5lciwgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5pbXBvcnQgeyBFeHRyYWN0U2V0VHlwZSwgTWFya09wdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsIG5ld0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEludG9MaW5lcyA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodGV4dCkuc3BsaXQoXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBsZXQgbWF4V2lkdGggPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiB0ZXh0RWxlbWVudC5iYXNlbGluZSxcbiAgfTtcblxuICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBtYXhXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIG1heFdpZHRoLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICB0ZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICApO1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMud2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICBib3VuZFRleHRVcGRhdGVzLmhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICBib3VuZFRleHRVcGRhdGVzLmJhc2VsaW5lID0gbWV0cmljcy5iYXNlbGluZTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICApO1xuICAgIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0Qm91bmRUZXh0TWF4V2lkdGgoY29udGFpbmVyKTtcbiAgICBjb25zb2xlLmxvZyhtZXRyaWNzLCBtYXhDb250YWluZXJXaWR0aCwgY29udGFpbmVyKTtcbiAgICBpZiAobWV0cmljcy5oZWlnaHQgPiBtYXhDb250YWluZXJIZWlnaHQpIHtcbiAgICAgIGNvbnN0IG5leHRIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBtZXRyaWNzLmhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQsIG5leHRIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAobWV0cmljcy53aWR0aCA+IG1heENvbnRhaW5lcldpZHRoKSB7XG4gICAgICBjb25zdCBuZXh0V2lkdGggPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBtZXRyaWNzLndpZHRoLFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyB3aWR0aDogbmV4dFdpZHRoIH0pO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSB7XG4gICAgICAuLi50ZXh0RWxlbWVudCxcbiAgICAgIC4uLmJvdW5kVGV4dFVwZGF0ZXMsXG4gICAgfSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKGNvbnRhaW5lciwgdXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnggPSB4O1xuICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IHk7XG4gIH1cblxuICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCBib3VuZFRleHRVcGRhdGVzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uID0gKFxuICBzY2VuZUVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkSWRUb0R1cGxpY2F0ZWRJZDogTWFwPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjZW5lRWxlbWVudE1hcCA9IGFycmF5VG9NYXAoc2NlbmVFbGVtZW50cykgYXMgTWFwPFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sXG4gICAgRXhjYWxpZHJhd0VsZW1lbnRcbiAgPjtcbiAgb2xkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpIGFzIHN0cmluZztcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCBuZXdUZXh0RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIGlmIChuZXdUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld0NvbnRhaW5lcikge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3Q29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoZWxlbWVudC5ib3VuZEVsZW1lbnRzIHx8IFtdKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChib3VuZEVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQuaWQgIT09IG5ld1RleHRFbGVtZW50SWQgJiZcbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5jb25jYXQoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGlkOiBuZXdUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUZXh0RWxlbWVudCA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KG5ld1RleHRFbGVtZW50KSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBuZXdDb250YWluZXIgPyBuZXdFbGVtZW50SWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCk7XG4gIGxldCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgYm91bmRUZXh0RWxlbWVudElkLFxuICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgbGV0IG5leHRXaWR0aCA9IHRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4V2lkdGggPSBnZXRCb3VuZFRleHRNYXhXaWR0aChjb250YWluZXIpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IGdldEJvdW5kVGV4dE1heEhlaWdodChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgKTtcbiAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgbGV0IG5leHRCYXNlTGluZSA9IHRleHRFbGVtZW50LmJhc2VsaW5lO1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcIm5cIiAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInNcIikge1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgIHRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICApO1xuICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICAgICAgbmV4dFdpZHRoID0gbWV0cmljcy53aWR0aDtcbiAgICAgIG5leHRCYXNlTGluZSA9IG1ldHJpY3MuYmFzZWxpbmU7XG4gICAgfVxuICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBuZXh0SGVpZ2h0LFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpZmYgPSBjb250YWluZXJIZWlnaHQgLSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIC8vIGZpeCB0aGUgeSBjb29yZCB3aGVuIHJlc2l6aW5nIGZyb20gbmUvbncvblxuICAgICAgY29uc3QgdXBkYXRlZFkgPVxuICAgICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuZVwiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuXCIpXG4gICAgICAgICAgPyBjb250YWluZXIueSAtIGRpZmZcbiAgICAgICAgICA6IGNvbnRhaW5lci55O1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gICAgICAgIHk6IHVwZGF0ZWRZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwge1xuICAgICAgdGV4dCxcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgICBiYXNlbGluZTogbmV4dEJhc2VMaW5lLFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICBjb250YWluZXIsXG4gICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICk7XG4gIH1cbiAgY29uc3QgY29udGFpbmVyQ29vcmRzID0gZ2V0Q29udGFpbmVyQ29vcmRzKGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lckhlaWdodCA9IGdldEJvdW5kVGV4dE1heEhlaWdodChjb250YWluZXIsIGJvdW5kVGV4dEVsZW1lbnQpO1xuICBjb25zdCBtYXhDb250YWluZXJXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG5cbiAgbGV0IHg7XG4gIGxldCB5O1xuICBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnk7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnkgKyAobWF4Q29udGFpbmVySGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHkgPVxuICAgICAgY29udGFpbmVyQ29vcmRzLnkgK1xuICAgICAgKG1heENvbnRhaW5lckhlaWdodCAvIDIgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIpO1xuICB9XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54O1xuICB9IGVsc2UgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLlJJR0hUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC0gYm91bmRUZXh0RWxlbWVudC53aWR0aCk7XG4gIH0gZWxzZSB7XG4gICAgeCA9XG4gICAgICBjb250YWluZXJDb29yZHMueCArIChtYXhDb250YWluZXJXaWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMik7XG4gIH1cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dyYXNzYXRvci9jYW52YXMtdGV4dC1lZGl0b3IvYmxvYi9tYXN0ZXIvbGliL0ZvbnRNZXRyaWNzLmpzXG5cbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHRleHQgPSB0ZXh0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBsaW5lcyB3aXRoIHNpbmdsZSBzcGFjZSBiZWNhdXNlIGxlYWRpbmcvdHJhaWxpbmcgZW1wdHlcbiAgICAvLyBsaW5lcyB3b3VsZCBiZSBzdHJpcHBlZCBmcm9tIGNvbXB1dGF0aW9uXG4gICAgLm1hcCgoeCkgPT4geCB8fCBcIiBcIilcbiAgICAuam9pbihcIlxcblwiKTtcbiAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGZvbnQpO1xuICBjb25zdCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KHRleHQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7XG4gIGNvbnN0IGJhc2VsaW5lID0gbWVhc3VyZUJhc2VsaW5lKHRleHQsIGZvbnQsIGxpbmVIZWlnaHQpO1xuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBiYXNlbGluZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVCYXNlbGluZSA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICB3cmFwSW5Db250YWluZXI/OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuICBpZiAod3JhcEluQ29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb250YWluZXIuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gIH1cblxuICBjb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IFN0cmluZyhsaW5lSGVpZ2h0KTtcblxuICBjb250YWluZXIuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAvLyBCYXNlbGluZSBpcyBpbXBvcnRhbnQgZm9yIHBvc2l0aW9uaW5nIHRleHQgb24gY2FudmFzXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gIHNwYW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICBzcGFuLnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIGxldCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKGlzU2FmYXJpKSB7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBwYXJzZUZsb2F0KGZvbnQpLCBsaW5lSGVpZ2h0KTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udCk7XG4gICAgLy8gSW4gU2FmYXJpIHRoZSBmb250IHNpemUgZ2V0cyByb3VuZGVkIG9mZiB3aGVuIHJlbmRlcmluZyBoZW5jZSBjYWxjdWxhdGluZyB0aGUgc2FmYXJpIGhlaWdodCBhbmQgc2hpZnRpbmcgdGhlIGJhc2VsaW5lIGlmIGl0IGRpZmZlcnNcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgY2FudmFzIGhlaWdodFxuICAgIGNvbnN0IGRvbUhlaWdodCA9IGdldFRleHRIZWlnaHQodGV4dCwgTWF0aC5yb3VuZChmb250U2l6ZSksIGxpbmVIZWlnaHQpO1xuICAgIGlmIChjYW52YXNIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgIGJhc2VsaW5lICs9IGNhbnZhc0hlaWdodCAtIGRvbUhlaWdodDtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0ID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICBiYXNlbGluZSAtPSBkb21IZWlnaHQgLSBjYW52YXNIZWlnaHQ7XG4gICAgfVxuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgcmV0dXJuIGJhc2VsaW5lO1xufTtcblxuLyoqXG4gKiBUbyBnZXQgdW5pdGxlc3MgbGluZS1oZWlnaHQgKGlmIHVua25vd24pIHdlIGNhbiBjYWxjdWxhdGUgaXQgYnkgZGl2aWRpbmdcbiAqIGhlaWdodC1wZXItbGluZSBieSBmb250U2l6ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVjdExpbmVIZWlnaHQgPSAodGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCkgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0RWxlbWVudC50ZXh0KS5sZW5ndGg7XG4gIHJldHVybiAodGV4dEVsZW1lbnQuaGVpZ2h0IC9cbiAgICBsaW5lQ291bnQgL1xuICAgIHRleHRFbGVtZW50LmZvbnRTaXplKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdO1xufTtcblxuLyoqXG4gKiBXZSBjYWxjdWxhdGUgdGhlIGxpbmUgaGVpZ2h0IGZyb20gdGhlIGZvbnQgc2l6ZSBhbmQgdGhlIHVuaXRsZXNzIGxpbmUgaGVpZ2h0LFxuICogYWxpZ25pbmcgd2l0aCB0aGUgVzNDIHNwZWMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGVpZ2h0SW5QeCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBmb250U2l6ZSAqIGxpbmVIZWlnaHQ7XG59O1xuXG4vLyBGSVhNRSByZW5hbWUgdG8gZ2V0QXBwcm94TWluQ29udGFpbmVySGVpZ2h0XG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IGdldExpbmVXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICB9XG4gIGNvbnN0IGNhbnZhczJkQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjYW52YXMyZENvbnRleHQuZm9udCA9IGZvbnQ7XG4gIGNvbnN0IHdpZHRoID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoO1xuXG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiB3aWR0aCAqIDEwO1xuICB9XG4gIHJldHVybiB3aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gc3BsaXRJbnRvTGluZXModGV4dCk7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRIZWlnaHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udFNpemU6IG51bWJlcixcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0KS5sZW5ndGg7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKiBsaW5lQ291bnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VUb2tlbnMgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIC8vIFNwbGl0dGluZyB3b3JkcyBjb250YWluaW5nIFwiLVwiIGFzIHRob3NlIGFyZSB0cmVhdGVkIGFzIHNlcGFyYXRlIHdvcmRzXG4gIC8vIGJ5IGNzcyB3cmFwcGluZyBhbGdvcml0aG0gZWcgbm9uLXByb2ZpdCA9PiBub24tLCBwcm9maXRcbiAgY29uc3Qgd29yZHMgPSB0ZXh0LnNwbGl0KFwiLVwiKTtcbiAgaWYgKHdvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBub24tcHJvZnQgb3JnID0+IFsnbm9uLScsICdwcm9maXQgb3JnJ11cbiAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ICE9PSB3b3Jkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHdvcmRzW2luZGV4XSA9IHdvcmQgKz0gXCItXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gSm9pbmluZyB0aGUgd29yZHMgd2l0aCBzcGFjZSBhbmQgc3BsaXR0aW5nIHRoZW0gYWdhaW4gd2l0aCBzcGFjZSB0byBnZXQgdGhlXG4gIC8vIGZpbmFsIGxpc3Qgb2YgdG9rZW5zXG4gIC8vIFsnbm9uLScsICdwcm9maXQgb3JnJ10gPT4sJ25vbi0gcHJvZnQgb3JnJyA9PiBbJ25vbi0nLCdwcm9maXQnLCdvcmcnXVxuICByZXR1cm4gd29yZHMuam9pbihcIiBcIikuc3BsaXQoXCIgXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHdyYXBUZXh0ID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZywgbWF4V2lkdGg6IG51bWJlcikgPT4ge1xuICAvLyBpZiBtYXhXaWR0aCBpcyBub3QgZmluaXRlIG9yIE5hTiB3aGljaCBjYW4gaGFwcGVuIGluIGNhc2Ugb2YgYnVncyBpblxuICAvLyBjb21wdXRhdGlvbiwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY29udGludWUgYXMgd2UnbGwgZW5kIHVwXG4gIC8vIGluIGFuIGluZmluaXRlIGxvb3BcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobWF4V2lkdGgpIHx8IG1heFdpZHRoIDwgMCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgbGluZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgY29uc3Qgb3JpZ2luYWxMaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSBnZXRMaW5lV2lkdGgoXCIgXCIsIGZvbnQpO1xuXG4gIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG4gIGxldCBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG5cbiAgY29uc3QgcHVzaCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgIGlmIChzdHIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlc2V0UGFyYW1zID0gKCkgPT4ge1xuICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gIH07XG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3QgY3VycmVudExpbmVXaWR0aCA9IGdldFRleHRXaWR0aChvcmlnaW5hbExpbmUsIGZvbnQpO1xuXG4gICAgLy8gUHVzaCB0aGUgbGluZSBpZiBpdHMgPD0gbWF4V2lkdGhcbiAgICBpZiAoY3VycmVudExpbmVXaWR0aCA8PSBtYXhXaWR0aCkge1xuICAgICAgbGluZXMucHVzaChvcmlnaW5hbExpbmUpO1xuICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHdvcmRzID0gcGFyc2VUb2tlbnMob3JpZ2luYWxMaW5lKTtcbiAgICByZXNldFBhcmFtcygpO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldExpbmVXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuXG4gICAgICAvLyBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2hlbiBzaW5nbGUgd29yZCB0YWtlcyBlbnRpcmUgd2lkdGhcbiAgICAgIGlmIChjdXJyZW50V29yZFdpZHRoID09PSBtYXhXaWR0aCkge1xuICAgICAgICBwdXNoKHdvcmRzW2luZGV4XSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IGJyZWFraW5nIGxvbmdlciB3b3JkcyBleGNlZWRpbmcgbWF4IHdpZHRoXG4gICAgICBlbHNlIGlmIChjdXJyZW50V29yZFdpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgc2luY2UgdGhlIGN1cnJlbnQgd29yZCBleGNlZWRzIHRoZSBtYXggd2lkdGhcbiAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcblxuICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcblxuICAgICAgICByZXNldFBhcmFtcygpO1xuXG4gICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoXG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0uY29kZVBvaW50QXQoMCkhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSB3aWR0aDtcbiAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoY3VycmVudENoYXIubGVuZ3RoKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgcmVzZXRQYXJhbXMoKTtcbiAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lIHVubGVzcyB0aGUgbGluZSBlbmRzIHdpdGggaHlwaGVuIHRvIHN5bmNcbiAgICAgICAgICAvLyB3aXRoIGNzcyB3b3JkLXdyYXBcbiAgICAgICAgfSBlbHNlIGlmICghY3VycmVudExpbmUuZW5kc1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgIHdoaWxlIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA8IG1heFdpZHRoICYmIGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID4gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgcmVzZXRQYXJhbXMoKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAvLyBpZiB3b3JkIGVuZHMgd2l0aCBcIi1cIiB0aGVuIHdlIGRvbid0IG5lZWQgdG8gYWRkIHNwYWNlXG4gICAgICAgICAgLy8gdG8gc3luYyB3aXRoIGNzcyB3b3JkLXdyYXBcbiAgICAgICAgICBjb25zdCBzaG91bGRBcHBlbmRTcGFjZSA9ICF3b3JkLmVuZHNXaXRoKFwiLVwiKTtcbiAgICAgICAgICBjdXJyZW50TGluZSArPSB3b3JkO1xuXG4gICAgICAgICAgaWYgKHNob3VsZEFwcGVuZFNwYWNlKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB3b3JkIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRTcGFjZSkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc2V0UGFyYW1zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hhcldpZHRoID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGVkQ2hhcldpZHRoOiB7IFtrZXk6IEZvbnRTdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB7fTtcblxuICBjb25zdCBjYWxjdWxhdGUgPSAoY2hhcjogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXNjaWkgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF0pIHtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKGNoYXIsIGZvbnQpO1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSA9IHdpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldO1xuICB9O1xuXG4gIGNvbnN0IGdldENhY2hlID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGNhbGN1bGF0ZSxcbiAgICBnZXRDYWNoZSxcbiAgfTtcbn0pKCk7XG5cbmNvbnN0IERVTU1ZX1RFWFQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OVwiLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG5cbi8vIEZJWE1FIHJlbmFtZSB0byBnZXRBcHByb3hNaW5Db250YWluZXJXaWR0aFxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChcbiAgZm9udDogRm9udFN0cmluZyxcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBtYXhDaGFyV2lkdGggPSBnZXRNYXhDaGFyV2lkdGgoZm9udCk7XG4gIGlmIChtYXhDaGFyV2lkdGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgbWVhc3VyZVRleHQoRFVNTVlfVEVYVC5zcGxpdChcIlwiKS5qb2luKFwiXFxuXCIpLCBmb250LCBsaW5lSGVpZ2h0KS53aWR0aCArXG4gICAgICBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbWF4Q2hhcldpZHRoICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYge1xuICAgICAgICBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGw7XG4gICAgICB9KVxuICAgIHwgbnVsbCxcbikgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmNvbnRhaW5lcklkKSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckRpbXMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgTUlOX1dJRFRIID0gMzAwO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KGVsZW1lbnQud2lkdGgsIE1JTl9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoOiBlbGVtZW50LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ2VudGVyID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNvbnRhaW5lci54ICsgY29udGFpbmVyLndpZHRoIC8gMixcbiAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGNvbnRhaW5lcik7XG4gIGlmIChwb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IG1pZFBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyLnBvaW50c1tpbmRleF0sXG4gICAgKTtcbiAgICByZXR1cm4geyB4OiBtaWRQb2ludFswXSwgeTogbWlkUG9pbnRbMV0gfTtcbiAgfVxuICBjb25zdCBpbmRleCA9IGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMiAtIDE7XG4gIGxldCBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhcbiAgICBjb250YWluZXIsXG4gICAgYXBwU3RhdGUsXG4gIClbaW5kZXhdO1xuICBpZiAoIW1pZFNlZ21lbnRNaWRwb2ludCkge1xuICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdLFxuICAgICAgaW5kZXggKyAxLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgeDogbWlkU2VnbWVudE1pZHBvaW50WzBdLCB5OiBtaWRTZWdtZW50TWlkcG9pbnRbMV0gfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJDb29yZHMgPSAoY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgbGV0IG9mZnNldFggPSBCT1VORF9URVhUX1BBRERJTkc7XG4gIGxldCBvZmZzZXRZID0gQk9VTkRfVEVYVF9QQURESU5HO1xuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICBvZmZzZXRYICs9IChjb250YWluZXIud2lkdGggLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gICAgb2Zmc2V0WSArPSAoY29udGFpbmVyLmhlaWdodCAvIDIpICogKDEgLSBNYXRoLnNxcnQoMikgLyAyKTtcbiAgfVxuICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIG9mZnNldFggKz0gY29udGFpbmVyLndpZHRoIC8gNDtcbiAgICBvZmZzZXRZICs9IGNvbnRhaW5lci5oZWlnaHQgLyA0O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogY29udGFpbmVyLnggKyBvZmZzZXRYLFxuICAgIHk6IGNvbnRhaW5lci55ICsgb2Zmc2V0WSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWxlbWVudEFuZ2xlID0gKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8IGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gdGV4dEVsZW1lbnQuYW5nbGU7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5hbmdsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0ID0gKFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8ICFib3VuZFRleHRFbGVtZW50KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogODtcbiAgfVxuXG4gIHJldHVybiBCT1VORF9URVhUX1BBRERJTkc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuKSA9PiB7XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYm91bmRUZXh0RWxlbWVudCxcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQWxsb3dWZXJ0aWNhbEFsaWduID0gKFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbikgPT4ge1xuICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaGFzQm91bmRDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gICAgaWYgKGhhc0JvdW5kQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzdXBwcG9ydHNIb3Jpem9udGFsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpc1RleHRFbGVtZW50KGVsZW1lbnQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSlcbiAgICAgID8gc2VsZWN0ZWRFbGVtZW50c1swXVxuICAgICAgOiBudWxsO1xuICB9XG4gIGxldCBoaXRFbGVtZW50ID0gbnVsbDtcbiAgLy8gV2UgbmVlZCB0byB0byBoaXQgdGVzdGluZyBmcm9tIGZyb250IChlbmQgb2YgdGhlIGFycmF5KSB0byBiYWNrIChiZWdpbm5pbmcgb2YgdGhlIGFycmF5KVxuICBmb3IgKGxldCBpbmRleCA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IC0taW5kZXgpIHtcbiAgICBpZiAoZWxlbWVudHNbaW5kZXhdLmlzRGVsZXRlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudHNbaW5kZXhdKTtcbiAgICBpZiAoXG4gICAgICBpc0Fycm93RWxlbWVudChlbGVtZW50c1tpbmRleF0pICYmXG4gICAgICBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50c1tpbmRleF0sIGFwcFN0YXRlLCBbXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICBdKVxuICAgICkge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoeDEgPCB4ICYmIHggPCB4MiAmJiB5MSA8IHkgJiYgeSA8IHkyKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKGhpdEVsZW1lbnQsIGZhbHNlKSA/IGhpdEVsZW1lbnQgOiBudWxsO1xufTtcblxuY29uc3QgVkFMSURfQ09OVEFJTkVSX1RZUEVTID0gbmV3IFNldChbXG4gIFwicmVjdGFuZ2xlXCIsXG4gIFwiZWxsaXBzZVwiLFxuICBcImRpYW1vbmRcIixcbiAgXCJpbWFnZVwiLFxuICBcImFycm93XCIsXG5dKTtcblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRUZXh0Q29udGFpbmVyID0gKGVsZW1lbnQ6IHtcbiAgdHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdO1xufSkgPT4gVkFMSURfQ09OVEFJTkVSX1RZUEVTLmhhcyhlbGVtZW50LnR5cGUpO1xuXG5leHBvcnQgY29uc3QgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCA9IChcbiAgZGltZW5zaW9uOiBudW1iZXIsXG4gIGNvbnRhaW5lclR5cGU6IEV4dHJhY3RTZXRUeXBlPHR5cGVvZiBWQUxJRF9DT05UQUlORVJfVFlQRVM+LFxuKSA9PiB7XG4gIGRpbWVuc2lvbiA9IE1hdGguY2VpbChkaW1lbnNpb24pO1xuICBjb25zdCBwYWRkaW5nID0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoKGRpbWVuc2lvbiArIHBhZGRpbmcpIC8gTWF0aC5zcXJ0KDIpKSAqIDIpO1xuICB9XG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZyAqIDg7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgcmV0dXJuIDIgKiAoZGltZW5zaW9uICsgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIGRpbWVuc2lvbiArIHBhZGRpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0TWF4V2lkdGggPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS53aWR0aDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgfVxuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2Uud2lkdGggLyAyKSAqIE1hdGguc3FydCgyKSkgd2hpY2ggaXMgZGVyaXZlZCBmcm9tXG4gICAgLy8gZXF1YXRpb24gb2YgYW4gZWxsaXBzZSAtaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgod2lkdGggLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYSByaG9tYnVzIGlzXG4gICAgLy8gTWF0aC5yb3VuZCh3aWR0aCAvIDIpIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh3aWR0aCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dE1heEhlaWdodCA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBoZWlnaHQgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcikuaGVpZ2h0O1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDggKiAyO1xuICAgIGlmIChjb250YWluZXJIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGFuIGVsbGlwc2UgaXNcbiAgICAvLyBNYXRoLnJvdW5kKChlbGxpcHNlLmhlaWdodCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgLyAyKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgcmV0dXJuIGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNNZWFzdXJlVGV4dFN1cHBvcnRlZCA9ICgpID0+IHtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgRFVNTVlfVEVYVCxcbiAgICBnZXRGb250U3RyaW5nKHtcbiAgICAgIGZvbnRTaXplOiBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICAgIGZvbnRGYW1pbHk6IERFRkFVTFRfRk9OVF9GQU1JTFksXG4gICAgfSksXG4gICk7XG4gIHJldHVybiB3aWR0aCA+IDA7XG59O1xuXG4vKipcbiAqIFVuaXRsZXNzIGxpbmUgaGVpZ2h0XG4gKlxuICogSW4gcHJldmlvdXMgdmVyc2lvbnMgd2UgdXNlZCBgbm9ybWFsYCBsaW5lIGhlaWdodCwgd2hpY2ggYnJvd3NlcnMgaW50ZXJwcmV0XG4gKiBkaWZmZXJlbnRseSwgYW5kIGJhc2VkIG9uIGZvbnQtZmFtaWx5IGFuZCBmb250LXNpemUuXG4gKlxuICogVG8gbWFrZSBsaW5lIGhlaWdodHMgY29uc2lzdGVudCBhY3Jvc3MgYnJvd3NlcnMgd2UgaGFyZGNvZGUgdGhlIHZhbHVlcyBmb3JcbiAqIGVhY2ggb2Ygb3VyIGZvbnRzIGJhc2VkIG9uIG1vc3QgY29tbW9uIGF2ZXJhZ2UgbGluZS1oZWlnaHRzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MzYwI2lzc3VlY29tbWVudC0xNDc3NjM1OTcxXG4gKiB3aGVyZSB0aGUgdmFsdWVzIGNvbWUgZnJvbS5cbiAqL1xuY29uc3QgREVGQVVMVF9MSU5FX0hFSUdIVCA9IHtcbiAgLy8gfjEuMjUgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLlxuICAvLyBHZWNrbyAoRkYpIHVzZXMgfjEuMjguXG4gIFtGT05UX0ZBTUlMWS5WaXJnaWxdOiAxLjI1IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4gIC8vIH4xLjE1IGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluay5cbiAgLy8gR2Vja28gaWYgYWxsIG92ZXIgdGhlIHBsYWNlLlxuICBbRk9OVF9GQU1JTFkuSGVsdmV0aWNhXTogMS4xNSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICAvLyB+MS4yIGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluaywgYW5kIGtpbmRhIEdlY2tvIHRvb1xuICBbRk9OVF9GQU1JTFkuQ2FzY2FkaWFdOiAxLjIgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0TGluZUhlaWdodCA9IChmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzKSA9PiB7XG4gIGlmIChmb250RmFtaWx5IGluIERFRkFVTFRfTElORV9IRUlHSFQpIHtcbiAgICByZXR1cm4gREVGQVVMVF9MSU5FX0hFSUdIVFtmb250RmFtaWx5XTtcbiAgfVxuICByZXR1cm4gREVGQVVMVF9MSU5FX0hFSUdIVFtERUZBVUxUX0ZPTlRfRkFNSUxZXTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvQ29udGFpbmVyID0gKFxuICBjb250YWluZXJQcm9wczpcbiAgICB8IHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICB8IEV4Y2x1ZGU8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50W1widHlwZVwiXSwgXCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1widHlwZVwiXTtcbiAgICAgIH0gJiBNYXJrT3B0aW9uYWw8RWxlbWVudENvbnN0cnVjdG9yT3B0cywgXCJ4XCIgfCBcInlcIj4sXG4gIHRleHRQcm9wczogeyB0ZXh0OiBzdHJpbmcgfSAmIE1hcmtPcHRpb25hbDxFbGVtZW50Q29uc3RydWN0b3JPcHRzLCBcInhcIiB8IFwieVwiPixcbikgPT4ge1xuICBsZXQgY29udGFpbmVyO1xuICBpZiAoY29udGFpbmVyUHJvcHMudHlwZSA9PT0gXCJhcnJvd1wiKSB7XG4gICAgY29udGFpbmVyID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHg6IDAsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHk6IDAsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHR5cGU6IGNvbnRhaW5lclByb3BzLnR5cGUsXG4gICAgICAvL0B0cy1pZ25vcmUsXG4gICAgICBlbmRBcnJvd2hlYWQ6IGNvbnRhaW5lclByb3BzLnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHBvaW50czogW1xuICAgICAgICBbMCwgMF0sXG4gICAgICAgIFszMDAsIDBdLFxuICAgICAgXSxcbiAgICAgIC4uLmNvbnRhaW5lclByb3BzLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnRhaW5lciA9IG5ld0VsZW1lbnQoe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICAuLi5jb250YWluZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBjb25zdCB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICAuLi50ZXh0UHJvcHMsXG4gICAgY29udGFpbmVySWQ6IGNvbnRhaW5lci5pZCxcbiAgICB0ZXh0QWxpZ246IFRFWFRfQUxJR04uQ0VOVEVSLFxuICAgIHZlcnRpY2FsQWxpZ246IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSxcbiAgfSk7XG5cbiAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIGlkOiB0ZXh0RWxlbWVudC5pZCxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KHRleHRFbGVtZW50LCBjb250YWluZXIpO1xuXG4gIHJldHVybiBbY29udGFpbmVyLCB0ZXh0RWxlbWVudF07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3761
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"bindTextToContainer\": () => (/* binding */ bindTextToContainer),\n/* harmony export */ \"bindTextToShapeAfterDuplication\": () => (/* binding */ bindTextToShapeAfterDuplication),\n/* harmony export */ \"charWidth\": () => (/* binding */ charWidth),\n/* harmony export */ \"computeBoundTextPosition\": () => (/* binding */ computeBoundTextPosition),\n/* harmony export */ \"computeContainerDimensionForBoundText\": () => (/* binding */ computeContainerDimensionForBoundText),\n/* harmony export */ \"detectLineHeight\": () => (/* binding */ detectLineHeight),\n/* harmony export */ \"getApproxCharsToFitInWidth\": () => (/* binding */ getApproxCharsToFitInWidth),\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 */ \"getBoundTextMaxHeight\": () => (/* binding */ getBoundTextMaxHeight),\n/* harmony export */ \"getBoundTextMaxWidth\": () => (/* binding */ getBoundTextMaxWidth),\n/* harmony export */ \"getContainerCenter\": () => (/* binding */ getContainerCenter),\n/* harmony export */ \"getContainerCoords\": () => (/* binding */ getContainerCoords),\n/* harmony export */ \"getContainerDims\": () => (/* binding */ getContainerDims),\n/* harmony export */ \"getContainerElement\": () => (/* binding */ getContainerElement),\n/* harmony export */ \"getDefaultLineHeight\": () => (/* binding */ getDefaultLineHeight),\n/* harmony export */ \"getLineHeightInPx\": () => (/* binding */ getLineHeightInPx),\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 */ \"getTextHeight\": () => (/* binding */ getTextHeight),\n/* harmony export */ \"getTextWidth\": () => (/* binding */ getTextWidth),\n/* harmony export */ \"handleBindTextResize\": () => (/* binding */ handleBindTextResize),\n/* harmony export */ \"isMeasureTextSupported\": () => (/* binding */ isMeasureTextSupported),\n/* harmony export */ \"isValidTextContainer\": () => (/* binding */ isValidTextContainer),\n/* harmony export */ \"measureBaseline\": () => (/* binding */ measureBaseline),\n/* harmony export */ \"measureText\": () => (/* binding */ measureText),\n/* harmony export */ \"normalizeText\": () => (/* binding */ normalizeText),\n/* harmony export */ \"parseTokens\": () => (/* binding */ parseTokens),\n/* harmony export */ \"redrawTextBoundingBox\": () => (/* binding */ redrawTextBoundingBox),\n/* harmony export */ \"shouldAllowVerticalAlign\": () => (/* binding */ shouldAllowVerticalAlign),\n/* harmony export */ \"splitIntoLines\": () => (/* binding */ splitIntoLines),\n/* harmony export */ \"suppportsHorizontalAlign\": () => (/* binding */ suppportsHorizontalAlign),\n/* harmony export */ \"wrapText\": () => (/* binding */ wrapText)\n/* harmony export */ });\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _mutateElement__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var ___WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene */ \"../../scene/index.ts\");\n/* harmony import */ var _collision__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./collision */ \"../../element/collision.ts\");\n/* harmony import */ var _textWysiwyg__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./textWysiwyg */ \"../../element/textWysiwyg.tsx\");\n/* harmony import */ var _newElement__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ./newElement */ \"../../element/newElement.ts\");\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 splitIntoLines = (text) => {\n return normalizeText(text).split(\"\\n\");\n};\nconst redrawTextBoundingBox = (textElement, container) => {\n let maxWidth = undefined;\n const boundTextUpdates = {\n x: textElement.x,\n y: textElement.y,\n text: textElement.text,\n width: textElement.width,\n height: textElement.height,\n baseline: textElement.baseline,\n };\n boundTextUpdates.text = textElement.text;\n if (container) {\n maxWidth = getBoundTextMaxWidth(container);\n boundTextUpdates.text = wrapText(textElement.originalText, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), maxWidth);\n }\n const metrics = measureText(boundTextUpdates.text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n boundTextUpdates.width = metrics.width;\n boundTextUpdates.height = metrics.height;\n boundTextUpdates.baseline = metrics.baseline;\n if (container) {\n const maxContainerHeight = getBoundTextMaxHeight(container, textElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n console.log(metrics, maxContainerWidth, container);\n if (metrics.height > maxContainerHeight) {\n const nextHeight = computeContainerDimensionForBoundText(metrics.height, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { height: nextHeight });\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.updateOriginalContainerCache)(container.id, nextHeight);\n }\n if (metrics.width > maxContainerWidth) {\n const nextWidth = computeContainerDimensionForBoundText(metrics.width, container.type);\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, { width: nextWidth });\n }\n const updatedTextElement = Object.assign(Object.assign({}, textElement), boundTextUpdates);\n const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n boundTextUpdates.x = x;\n boundTextUpdates.y = y;\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, boundTextUpdates);\n};\nconst bindTextToShapeAfterDuplication = (sceneElements, oldElements, oldIdToDuplicatedId) => {\n const sceneElementMap = (0,_utils__WEBPACK_IMPORTED_MODULE_0__.arrayToMap)(sceneElements);\n oldElements.forEach((element) => {\n const newElementId = oldIdToDuplicatedId.get(element.id);\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n if (newTextElementId) {\n const newContainer = sceneElementMap.get(newElementId);\n if (newContainer) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newContainer, {\n boundElements: (element.boundElements || [])\n .filter((boundElement) => boundElement.id !== newTextElementId &&\n boundElement.id !== boundTextElementId)\n .concat({\n type: \"text\",\n id: newTextElementId,\n }),\n });\n }\n const newTextElement = sceneElementMap.get(newTextElementId);\n if (newTextElement && (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(newTextElement)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(newTextElement, {\n containerId: newContainer ? newElementId : null,\n });\n }\n }\n }\n });\n};\nconst handleBindTextResize = (container, transformHandleType) => {\n const boundTextElementId = getBoundTextElementId(container);\n if (!boundTextElementId) {\n return;\n }\n (0,_textWysiwyg__WEBPACK_IMPORTED_MODULE_9__.resetOriginalContainerCache)(container.id);\n let textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n if (textElement && textElement.text) {\n if (!container) {\n return;\n }\n textElement = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(container).getElement(boundTextElementId);\n let text = textElement.text;\n let nextHeight = textElement.height;\n let nextWidth = textElement.width;\n const containerDims = getContainerDims(container);\n const maxWidth = getBoundTextMaxWidth(container);\n const maxHeight = getBoundTextMaxHeight(container, textElement);\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 metrics = measureText(text, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)(textElement), textElement.lineHeight);\n nextHeight = metrics.height;\n nextWidth = metrics.width;\n nextBaseLine = metrics.baseline;\n }\n // increase height in case text element height exceeds\n if (nextHeight > maxHeight) {\n containerHeight = computeContainerDimensionForBoundText(nextHeight, container.type);\n const diff = containerHeight - containerDims.height;\n // fix the y coord when resizing from ne/nw/n\n const updatedY = !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container) &&\n (transformHandleType === \"ne\" ||\n transformHandleType === \"nw\" ||\n transformHandleType === \"n\")\n ? container.y - diff\n : container.y;\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n height: containerHeight,\n y: updatedY,\n });\n }\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, {\n text,\n width: nextWidth,\n height: nextHeight,\n baseline: nextBaseLine,\n });\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(textElement, computeBoundTextPosition(container, textElement));\n }\n }\n};\nconst computeBoundTextPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n const containerCoords = getContainerCoords(container);\n const maxContainerHeight = getBoundTextMaxHeight(container, boundTextElement);\n const maxContainerWidth = getBoundTextMaxWidth(container);\n let x;\n let y;\n if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.TOP) {\n y = containerCoords.y;\n }\n else if (boundTextElement.verticalAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.BOTTOM) {\n y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n }\n else {\n y =\n containerCoords.y +\n (maxContainerHeight / 2 - boundTextElement.height / 2);\n }\n if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.LEFT) {\n x = containerCoords.x;\n }\n else if (boundTextElement.textAlign === _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.RIGHT) {\n x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n }\n else {\n x =\n containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n }\n return { x, y };\n};\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\nconst measureText = (text, font, lineHeight) => {\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 fontSize = parseFloat(font);\n const height = getTextHeight(text, fontSize, lineHeight);\n const width = getTextWidth(text, font);\n const baseline = measureBaseline(text, font, lineHeight);\n return { width, height, baseline };\n};\nconst measureBaseline = (text, font, lineHeight, wrapInContainer) => {\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 (wrapInContainer) {\n container.style.overflow = \"hidden\";\n container.style.wordBreak = \"break-word\";\n container.style.whiteSpace = \"pre-wrap\";\n }\n container.style.lineHeight = String(lineHeight);\n container.innerText = text;\n // Baseline is important for positioning text on canvas\n document.body.appendChild(container);\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 let baseline = span.offsetTop + span.offsetHeight;\n const height = container.offsetHeight;\n if (_constants__WEBPACK_IMPORTED_MODULE_2__.isSafari) {\n const canvasHeight = getTextHeight(text, parseFloat(font), lineHeight);\n const fontSize = parseFloat(font);\n // In Safari the font size gets rounded off when rendering hence calculating the safari height and shifting the baseline if it differs\n // from the actual canvas height\n const domHeight = getTextHeight(text, Math.round(fontSize), lineHeight);\n if (canvasHeight > height) {\n baseline += canvasHeight - domHeight;\n }\n if (height > canvasHeight) {\n baseline -= domHeight - canvasHeight;\n }\n }\n document.body.removeChild(container);\n return baseline;\n};\n/**\n * To get unitless line-height (if unknown) we can calculate it by dividing\n * height-per-line by fontSize.\n */\nconst detectLineHeight = (textElement) => {\n const lineCount = splitIntoLines(textElement.text).length;\n return (textElement.height /\n lineCount /\n textElement.fontSize);\n};\n/**\n * We calculate the line height from the font size and the unitless line height,\n * aligning with the W3C spec.\n */\nconst getLineHeightInPx = (fontSize, lineHeight) => {\n return fontSize * lineHeight;\n};\n// FIXME rename to getApproxMinContainerHeight\nconst getApproxMinLineHeight = (fontSize, lineHeight) => {\n return getLineHeightInPx(fontSize, lineHeight) + _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nlet canvas;\nconst getLineWidth = (text, font) => {\n if (!canvas) {\n canvas = document.createElement(\"canvas\");\n }\n const canvas2dContext = canvas.getContext(\"2d\");\n canvas2dContext.font = font;\n const width = canvas2dContext.measureText(text).width;\n // since in test env the canvas measureText algo\n // doesn't measure text and instead just returns number of\n // characters hence we assume that each letteris 10px\n if ((0,_utils__WEBPACK_IMPORTED_MODULE_0__.isTestEnv)()) {\n return width * 10;\n }\n return width;\n};\nconst getTextWidth = (text, font) => {\n const lines = splitIntoLines(text);\n let width = 0;\n lines.forEach((line) => {\n width = Math.max(width, getLineWidth(line, font));\n });\n return width;\n};\nconst getTextHeight = (text, fontSize, lineHeight) => {\n const lineCount = splitIntoLines(text).length;\n return getLineHeightInPx(fontSize, lineHeight) * lineCount;\n};\nconst parseTokens = (text) => {\n // Splitting words containing \"-\" as those are treated as separate words\n // by css wrapping algorithm eg non-profit => non-, profit\n const words = text.split(\"-\");\n if (words.length > 1) {\n // non-proft org => ['non-', 'profit org']\n words.forEach((word, index) => {\n if (index !== words.length - 1) {\n words[index] = word += \"-\";\n }\n });\n }\n // Joining the words with space and splitting them again with space to get the\n // final list of tokens\n // ['non-', 'profit org'] =>,'non- proft org' => ['non-','profit','org']\n return words.join(\" \").split(\" \");\n};\nconst wrapText = (text, font, maxWidth) => {\n // if maxWidth is not finite or NaN which can happen in case of bugs in\n // computation, we need to make sure we don't continue as we'll end up\n // in an infinite loop\n if (!Number.isFinite(maxWidth) || maxWidth < 0) {\n return text;\n }\n const lines = [];\n const originalLines = text.split(\"\\n\");\n const spaceWidth = getLineWidth(\" \", font);\n let currentLine = \"\";\n let currentLineWidthTillNow = 0;\n const push = (str) => {\n if (str.trim()) {\n lines.push(str);\n }\n };\n const resetParams = () => {\n currentLine = \"\";\n currentLineWidthTillNow = 0;\n };\n originalLines.forEach((originalLine) => {\n const currentLineWidth = getTextWidth(originalLine, font);\n // Push the line if its <= maxWidth\n if (currentLineWidth <= maxWidth) {\n lines.push(originalLine);\n return; // continue\n }\n const words = parseTokens(originalLine);\n resetParams();\n let index = 0;\n while (index < words.length) {\n const currentWordWidth = getLineWidth(words[index], font);\n // This will only happen when single word takes entire width\n if (currentWordWidth === maxWidth) {\n push(words[index]);\n index++;\n }\n // Start breaking longer words exceeding max width\n else if (currentWordWidth > maxWidth) {\n // push current line since the current word exceeds the max width\n // so will be appended in next line\n push(currentLine);\n resetParams();\n while (words[index].length > 0) {\n const currentChar = String.fromCodePoint(words[index].codePointAt(0));\n const width = charWidth.calculate(currentChar, font);\n currentLineWidthTillNow += width;\n words[index] = words[index].slice(currentChar.length);\n if (currentLineWidthTillNow >= maxWidth) {\n push(currentLine);\n currentLine = currentChar;\n currentLineWidthTillNow = width;\n }\n else {\n currentLine += currentChar;\n }\n }\n // push current line if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n push(currentLine);\n resetParams();\n // space needs to be appended before next word\n // as currentLine contains chars which couldn't be appended\n // to previous line unless the line ends with hyphen to sync\n // with css word-wrap\n }\n else if (!currentLine.endsWith(\"-\")) {\n currentLine += \" \";\n currentLineWidthTillNow += spaceWidth;\n }\n index++;\n }\n else {\n // Start appending words in a line till max width reached\n while (currentLineWidthTillNow < maxWidth && index < words.length) {\n const word = words[index];\n currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n if (currentLineWidthTillNow > maxWidth) {\n push(currentLine);\n resetParams();\n break;\n }\n index++;\n // if word ends with \"-\" then we don't need to add space\n // to sync with css word-wrap\n const shouldAppendSpace = !word.endsWith(\"-\");\n currentLine += word;\n if (shouldAppendSpace) {\n currentLine += \" \";\n }\n // Push the word if appending space exceeds max width\n if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n if (shouldAppendSpace) {\n lines.push(currentLine.slice(0, -1));\n }\n else {\n lines.push(currentLine);\n }\n resetParams();\n break;\n }\n }\n }\n }\n if (currentLine.slice(-1) === \" \") {\n // only remove last trailing space which we have added when joining words\n currentLine = currentLine.slice(0, -1);\n push(currentLine);\n }\n });\n return lines.join(\"\\n\");\n};\nconst charWidth = (() => {\n const cachedCharWidth = {};\n const calculate = (char, font) => {\n const ascii = char.charCodeAt(0);\n if (!cachedCharWidth[font]) {\n cachedCharWidth[font] = [];\n }\n if (!cachedCharWidth[font][ascii]) {\n const width = getLineWidth(char, font);\n cachedCharWidth[font][ascii] = width;\n }\n return cachedCharWidth[font][ascii];\n };\n const getCache = (font) => {\n return cachedCharWidth[font];\n };\n return {\n calculate,\n getCache,\n };\n})();\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\n// FIXME rename to getApproxMinContainerWidth\nconst getApproxMinLineWidth = (font, lineHeight) => {\n const maxCharWidth = getMaxCharWidth(font);\n if (maxCharWidth === 0) {\n return (measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font, lineHeight).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 getMinCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.min(...cacheWithOutEmpty);\n};\nconst getMaxCharWidth = (font) => {\n const cache = charWidth.getCache(font);\n if (!cache) {\n return 0;\n }\n const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n return Math.max(...cacheWithOutEmpty);\n};\nconst getApproxCharsToFitInWidth = (font, width) => {\n // Generally lower case is used so converting to lower case\n const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n const batchLength = 6;\n let index = 0;\n let widthTillNow = 0;\n let str = \"\";\n while (widthTillNow <= width) {\n const batch = dummyText.substr(index, index + batchLength);\n str += batch;\n widthTillNow += getLineWidth(str, font);\n if (index === dummyText.length - 1) {\n index = 0;\n }\n index = index + batchLength;\n }\n while (widthTillNow > width) {\n str = str.substr(0, str.length - 1);\n widthTillNow = getLineWidth(str, font);\n }\n return str.length;\n};\nconst getBoundTextElementId = (container) => {\n var _a, _b, _c;\n return ((_a = container === null || container === void 0 ? void 0 : container.boundElements) === null || _a === void 0 ? void 0 : _a.length)\n ? ((_c = (_b = container === null || container === void 0 ? void 0 : container.boundElements) === null || _b === void 0 ? void 0 : _b.filter((ele) => ele.type === \"text\")[0]) === null || _c === void 0 ? void 0 : _c.id) ||\n null\n : null;\n};\nconst getBoundTextElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n const boundTextElementId = getBoundTextElementId(element);\n if (boundTextElementId) {\n return (((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(boundTextElementId)) || null);\n }\n return null;\n};\nconst getContainerElement = (element) => {\n var _a;\n if (!element) {\n return null;\n }\n if (element.containerId) {\n return ((_a = _scene_Scene__WEBPACK_IMPORTED_MODULE_3__[\"default\"].getScene(element)) === null || _a === void 0 ? void 0 : _a.getElement(element.containerId)) || null;\n }\n return null;\n};\nconst getContainerDims = (element) => {\n const MIN_WIDTH = 300;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(element)) {\n const width = Math.max(element.width, MIN_WIDTH);\n const height = element.height;\n return { width, height };\n }\n return { width: element.width, height: element.height };\n};\nconst getContainerCenter = (container, appState) => {\n if (!(0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return {\n x: container.x + container.width / 2,\n y: container.y + container.height / 2,\n };\n }\n const points = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointsGlobalCoordinates(container);\n if (points.length % 2 === 1) {\n const index = Math.floor(container.points.length / 2);\n const midPoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getPointGlobalCoordinates(container, container.points[index]);\n return { x: midPoint[0], y: midPoint[1] };\n }\n const index = container.points.length / 2 - 1;\n let midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getEditorMidPoints(container, appState)[index];\n if (!midSegmentMidpoint) {\n midSegmentMidpoint = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getSegmentMidPoint(container, points[index], points[index + 1], index + 1);\n }\n return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\nconst getContainerCoords = (container) => {\n let offsetX = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n let offsetY = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n if (container.type === \"ellipse\") {\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n }\n // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n if (container.type === \"diamond\") {\n offsetX += container.width / 4;\n offsetY += container.height / 4;\n }\n return {\n x: container.x + offsetX,\n y: container.y + offsetY,\n };\n};\nconst getTextElementAngle = (textElement) => {\n const container = getContainerElement(textElement);\n if (!container || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return textElement.angle;\n }\n return container.angle;\n};\nconst getBoundTextElementOffset = (boundTextElement) => {\n const container = getContainerElement(boundTextElement);\n if (!container || !boundTextElement) {\n return 0;\n }\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8;\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING;\n};\nconst getBoundTextElementPosition = (container, boundTextElement) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, boundTextElement);\n }\n};\nconst shouldAllowVerticalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return false;\n });\n};\nconst suppportsHorizontalAlign = (selectedElements) => {\n return selectedElements.some((element) => {\n const hasBoundContainer = (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isBoundToContainer)(element);\n if (hasBoundContainer) {\n const container = getContainerElement(element);\n if ((0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element) && (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return false;\n }\n return true;\n }\n return (0,___WEBPACK_IMPORTED_MODULE_4__.isTextElement)(element);\n });\n};\nconst getTextBindableContainerAtPosition = (elements, appState, x, y) => {\n const selectedElements = (0,_scene__WEBPACK_IMPORTED_MODULE_7__.getSelectedElements)(elements, appState);\n if (selectedElements.length === 1) {\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(selectedElements[0], false)\n ? selectedElements[0]\n : null;\n }\n let hitElement = null;\n // We need to to hit testing from front (end of the array) to back (beginning of the array)\n for (let index = elements.length - 1; index >= 0; --index) {\n if (elements[index].isDeleted) {\n continue;\n }\n const [x1, y1, x2, y2] = (0,___WEBPACK_IMPORTED_MODULE_4__.getElementAbsoluteCoords)(elements[index]);\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(elements[index]) &&\n (0,_collision__WEBPACK_IMPORTED_MODULE_8__.isHittingElementNotConsideringBoundingBox)(elements[index], appState, [\n x,\n y,\n ])) {\n hitElement = elements[index];\n break;\n }\n else if (x1 < x && x < x2 && y1 < y && y < y2) {\n hitElement = elements[index];\n break;\n }\n }\n return (0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isTextBindableContainer)(hitElement, false) ? hitElement : null;\n};\nconst VALID_CONTAINER_TYPES = new Set([\n \"rectangle\",\n \"ellipse\",\n \"diamond\",\n \"image\",\n \"arrow\",\n]);\nconst isValidTextContainer = (element) => VALID_CONTAINER_TYPES.has(element.type);\nconst computeContainerDimensionForBoundText = (dimension, containerType) => {\n dimension = Math.ceil(dimension);\n const padding = _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n if (containerType === \"ellipse\") {\n return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n }\n if (containerType === \"arrow\") {\n return dimension + padding * 8;\n }\n if (containerType === \"diamond\") {\n return 2 * (dimension + padding);\n }\n return dimension + padding;\n};\nconst getBoundTextMaxWidth = (container) => {\n const width = getContainerDims(container).width;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n }\n if (container.type === \"ellipse\") {\n // The width of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((width / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The width of the largest rectangle inscribed inside a rhombus is\n // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(width / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return width - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst getBoundTextMaxHeight = (container, boundTextElement) => {\n const height = getContainerDims(container).height;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_5__.isArrowElement)(container)) {\n const containerHeight = height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 8 * 2;\n if (containerHeight <= 0) {\n return boundTextElement.height;\n }\n return height;\n }\n if (container.type === \"ellipse\") {\n // The height of the largest rectangle inscribed inside an ellipse is\n // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n return Math.round((height / 2) * Math.sqrt(2)) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n if (container.type === \"diamond\") {\n // The height of the largest rectangle inscribed inside a rhombus is\n // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n return Math.round(height / 2) - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n }\n return height - _constants__WEBPACK_IMPORTED_MODULE_2__.BOUND_TEXT_PADDING * 2;\n};\nconst isMeasureTextSupported = () => {\n const width = getTextWidth(DUMMY_TEXT, (0,_utils__WEBPACK_IMPORTED_MODULE_0__.getFontString)({\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_SIZE,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY,\n }));\n return width > 0;\n};\n/**\n * Unitless line height\n *\n * In previous versions we used `normal` line height, which browsers interpret\n * differently, and based on font-family and font-size.\n *\n * To make line heights consistent across browsers we hardcode the values for\n * each of our fonts based on most common average line-heights.\n * See https://github.com/excalidraw/excalidraw/pull/6360#issuecomment-1477635971\n * where the values come from.\n */\nconst DEFAULT_LINE_HEIGHT = {\n // ~1.25 is the average for Virgil in WebKit and Blink.\n // Gecko (FF) uses ~1.28.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Virgil]: 1.25,\n // ~1.15 is the average for Virgil in WebKit and Blink.\n // Gecko if all over the place.\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Helvetica]: 1.15,\n // ~1.2 is the average for Virgil in WebKit and Blink, and kinda Gecko too\n [_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY.Cascadia]: 1.2,\n};\nconst getDefaultLineHeight = (fontFamily) => {\n if (fontFamily in DEFAULT_LINE_HEIGHT) {\n return DEFAULT_LINE_HEIGHT[fontFamily];\n }\n return DEFAULT_LINE_HEIGHT[_constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_FONT_FAMILY];\n};\nconst bindTextToContainer = (containerProps, textProps) => {\n let container;\n if (containerProps.type === \"arrow\") {\n container = (0,_newElement__WEBPACK_IMPORTED_MODULE_10__.newLinearElement)(Object.assign({ \n //@ts-ignore\n x: 0, \n //@ts-ignore\n y: 0, \n //@ts-ignore\n type: containerProps.type, \n //@ts-ignore,\n endArrowhead: containerProps.type === \"arrow\" ? \"arrow\" : null, \n //@ts-ignore\n points: [\n [0, 0],\n [300, 0],\n ] }, containerProps));\n }\n else {\n //@ts-ignore\n container = (0,___WEBPACK_IMPORTED_MODULE_4__.newElement)(Object.assign({ x: 0, y: 0 }, containerProps));\n }\n const textElement = (0,___WEBPACK_IMPORTED_MODULE_4__.newTextElement)(Object.assign(Object.assign({ x: 0, y: 0, textAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.TEXT_ALIGN.CENTER, verticalAlign: _constants__WEBPACK_IMPORTED_MODULE_2__.VERTICAL_ALIGN.MIDDLE }, textProps), { containerId: container.id }));\n (0,_mutateElement__WEBPACK_IMPORTED_MODULE_1__.mutateElement)(container, {\n boundElements: (container.boundElements || []).concat({\n type: \"text\",\n id: textElement.id,\n }),\n });\n redrawTextBoundingBox(textElement, container);\n return [container, textElement];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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U0FBUyxHQUFHLDZDQUFVLGlCQUNwQixDQUFDLEVBQUUsQ0FBQyxFQUNKLENBQUMsRUFBRSxDQUFDLElBQ0QsY0FBYyxFQUNqQixDQUFDO0tBQ0o7SUFDRCxNQUFNLFdBQVcsR0FBMEIsaURBQWMsK0JBQ3ZELENBQUMsRUFBRSxDQUFDLEVBQ0osQ0FBQyxFQUFFLENBQUMsRUFDSixTQUFTLEVBQUUseURBQWlCLEVBQzVCLGFBQWEsRUFBRSw2REFBcUIsSUFDakMsU0FBUyxLQUNaLFdBQVcsRUFBRSxTQUFTLENBQUMsRUFBRSxJQUN6QixDQUFDO0lBRUgsNkRBQWEsQ0FBQyxTQUFTLEVBQUU7UUFDdkIsYUFBYSxFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDcEQsSUFBSSxFQUFFLE1BQU07WUFDWixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7U0FDbkIsQ0FBQztLQUNILENBQUMsQ0FBQztJQUVILHFCQUFxQixDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU5QyxPQUFPLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L3RleHRFbGVtZW50LnRzPzQyZDIiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0Rm9udFN0cmluZywgYXJyYXlUb01hcCwgaXNUZXN0RW52IH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRDb250YWluZXIsXG4gIEV4Y2FsaWRyYXdUZXh0RWxlbWVudCxcbiAgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgRm9udEZhbWlseVZhbHVlcyxcbiAgRm9udFN0cmluZyxcbiAgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50LFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgbXV0YXRlRWxlbWVudCB9IGZyb20gXCIuL211dGF0ZUVsZW1lbnRcIjtcbmltcG9ydCB7XG4gIEJPVU5EX1RFWFRfUEFERElORyxcbiAgREVGQVVMVF9GT05UX0ZBTUlMWSxcbiAgREVGQVVMVF9GT05UX1NJWkUsXG4gIEZPTlRfRkFNSUxZLFxuICBpc1NhZmFyaSxcbiAgVEVYVF9BTElHTixcbiAgVkVSVElDQUxfQUxJR04sXG59IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSB9IGZyb20gXCIuL3RyYW5zZm9ybUhhbmRsZXNcIjtcbmltcG9ydCBTY2VuZSBmcm9tIFwiLi4vc2NlbmUvU2NlbmVcIjtcbmltcG9ydCB7IGlzVGV4dEVsZW1lbnQsIG5ld0VsZW1lbnQsIG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi5cIjtcbmltcG9ydCB7IGlzQm91bmRUb0NvbnRhaW5lciwgaXNBcnJvd0VsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgQXBwU3RhdGUgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyIH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGdldFNlbGVjdGVkRWxlbWVudHMgfSBmcm9tIFwiLi4vc2NlbmVcIjtcbmltcG9ydCB7IGlzSGl0dGluZ0VsZW1lbnROb3RDb25zaWRlcmluZ0JvdW5kaW5nQm94IH0gZnJvbSBcIi4vY29sbGlzaW9uXCI7XG5pbXBvcnQge1xuICByZXNldE9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG4gIHVwZGF0ZU9yaWdpbmFsQ29udGFpbmVyQ2FjaGUsXG59IGZyb20gXCIuL3RleHRXeXNpd3lnXCI7XG5pbXBvcnQgeyBFeHRyYWN0U2V0VHlwZSwgTWFya09wdGlvbmFsIH0gZnJvbSBcIi4uL3V0aWxpdHktdHlwZXNcIjtcbmltcG9ydCB7IEVsZW1lbnRDb25zdHJ1Y3Rvck9wdHMsIG5ld0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi9uZXdFbGVtZW50XCI7XG5cbmV4cG9ydCBjb25zdCBub3JtYWxpemVUZXh0ID0gKHRleHQ6IHN0cmluZykgPT4ge1xuICByZXR1cm4gKFxuICAgIHRleHRcbiAgICAgIC8vIHJlcGxhY2UgdGFicyB3aXRoIHNwYWNlcyBzbyB0aGV5IHJlbmRlciBhbmQgbWVhc3VyZSBjb3JyZWN0bHlcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgXCIgICAgICAgIFwiKVxuICAgICAgLy8gbm9ybWFsaXplIG5ld2xpbmVzXG4gICAgICAucmVwbGFjZSgvXFxyP1xcbnxcXHIvZywgXCJcXG5cIilcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBzcGxpdEludG9MaW5lcyA9ICh0ZXh0OiBzdHJpbmcpID0+IHtcbiAgcmV0dXJuIG5vcm1hbGl6ZVRleHQodGV4dCkuc3BsaXQoXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgcmVkcmF3VGV4dEJvdW5kaW5nQm94ID0gKFxuICB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50LFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCxcbikgPT4ge1xuICBsZXQgbWF4V2lkdGggPSB1bmRlZmluZWQ7XG4gIGNvbnN0IGJvdW5kVGV4dFVwZGF0ZXMgPSB7XG4gICAgeDogdGV4dEVsZW1lbnQueCxcbiAgICB5OiB0ZXh0RWxlbWVudC55LFxuICAgIHRleHQ6IHRleHRFbGVtZW50LnRleHQsXG4gICAgd2lkdGg6IHRleHRFbGVtZW50LndpZHRoLFxuICAgIGhlaWdodDogdGV4dEVsZW1lbnQuaGVpZ2h0LFxuICAgIGJhc2VsaW5lOiB0ZXh0RWxlbWVudC5iYXNlbGluZSxcbiAgfTtcblxuICBib3VuZFRleHRVcGRhdGVzLnRleHQgPSB0ZXh0RWxlbWVudC50ZXh0O1xuXG4gIGlmIChjb250YWluZXIpIHtcbiAgICBtYXhXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG4gICAgYm91bmRUZXh0VXBkYXRlcy50ZXh0ID0gd3JhcFRleHQoXG4gICAgICB0ZXh0RWxlbWVudC5vcmlnaW5hbFRleHQsXG4gICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgIG1heFdpZHRoLFxuICAgICk7XG4gIH1cbiAgY29uc3QgbWV0cmljcyA9IG1lYXN1cmVUZXh0KFxuICAgIGJvdW5kVGV4dFVwZGF0ZXMudGV4dCxcbiAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICB0ZXh0RWxlbWVudC5saW5lSGVpZ2h0LFxuICApO1xuXG4gIGJvdW5kVGV4dFVwZGF0ZXMud2lkdGggPSBtZXRyaWNzLndpZHRoO1xuICBib3VuZFRleHRVcGRhdGVzLmhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICBib3VuZFRleHRVcGRhdGVzLmJhc2VsaW5lID0gbWV0cmljcy5iYXNlbGluZTtcblxuICBpZiAoY29udGFpbmVyKSB7XG4gICAgY29uc3QgbWF4Q29udGFpbmVySGVpZ2h0ID0gZ2V0Qm91bmRUZXh0TWF4SGVpZ2h0KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgdGV4dEVsZW1lbnQgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbiAgICApO1xuICAgIGNvbnN0IG1heENvbnRhaW5lcldpZHRoID0gZ2V0Qm91bmRUZXh0TWF4V2lkdGgoY29udGFpbmVyKTtcbiAgICBjb25zb2xlLmxvZyhtZXRyaWNzLCBtYXhDb250YWluZXJXaWR0aCwgY29udGFpbmVyKTtcbiAgICBpZiAobWV0cmljcy5oZWlnaHQgPiBtYXhDb250YWluZXJIZWlnaHQpIHtcbiAgICAgIGNvbnN0IG5leHRIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBtZXRyaWNzLmhlaWdodCxcbiAgICAgICAgY29udGFpbmVyLnR5cGUsXG4gICAgICApO1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHsgaGVpZ2h0OiBuZXh0SGVpZ2h0IH0pO1xuICAgICAgdXBkYXRlT3JpZ2luYWxDb250YWluZXJDYWNoZShjb250YWluZXIuaWQsIG5leHRIZWlnaHQpO1xuICAgIH1cbiAgICBpZiAobWV0cmljcy53aWR0aCA+IG1heENvbnRhaW5lcldpZHRoKSB7XG4gICAgICBjb25zdCBuZXh0V2lkdGggPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBtZXRyaWNzLndpZHRoLFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG4gICAgICBtdXRhdGVFbGVtZW50KGNvbnRhaW5lciwgeyB3aWR0aDogbmV4dFdpZHRoIH0pO1xuICAgIH1cbiAgICBjb25zdCB1cGRhdGVkVGV4dEVsZW1lbnQgPSB7XG4gICAgICAuLi50ZXh0RWxlbWVudCxcbiAgICAgIC4uLmJvdW5kVGV4dFVwZGF0ZXMsXG4gICAgfSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyO1xuICAgIGNvbnN0IHsgeCwgeSB9ID0gY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKGNvbnRhaW5lciwgdXBkYXRlZFRleHRFbGVtZW50KTtcbiAgICBib3VuZFRleHRVcGRhdGVzLnggPSB4O1xuICAgIGJvdW5kVGV4dFVwZGF0ZXMueSA9IHk7XG4gIH1cblxuICBtdXRhdGVFbGVtZW50KHRleHRFbGVtZW50LCBib3VuZFRleHRVcGRhdGVzKTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvU2hhcGVBZnRlckR1cGxpY2F0aW9uID0gKFxuICBzY2VuZUVsZW1lbnRzOiBFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBvbGRFbGVtZW50czogRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgb2xkSWRUb0R1cGxpY2F0ZWRJZDogTWFwPEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0+LFxuKTogdm9pZCA9PiB7XG4gIGNvbnN0IHNjZW5lRWxlbWVudE1hcCA9IGFycmF5VG9NYXAoc2NlbmVFbGVtZW50cykgYXMgTWFwPFxuICAgIEV4Y2FsaWRyYXdFbGVtZW50W1wiaWRcIl0sXG4gICAgRXhjYWxpZHJhd0VsZW1lbnRcbiAgPjtcbiAgb2xkRWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IG5ld0VsZW1lbnRJZCA9IG9sZElkVG9EdXBsaWNhdGVkSWQuZ2V0KGVsZW1lbnQuaWQpIGFzIHN0cmluZztcbiAgICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgICBjb25zdCBuZXdUZXh0RWxlbWVudElkID0gb2xkSWRUb0R1cGxpY2F0ZWRJZC5nZXQoYm91bmRUZXh0RWxlbWVudElkKTtcbiAgICAgIGlmIChuZXdUZXh0RWxlbWVudElkKSB7XG4gICAgICAgIGNvbnN0IG5ld0NvbnRhaW5lciA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3RWxlbWVudElkKTtcbiAgICAgICAgaWYgKG5ld0NvbnRhaW5lcikge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3Q29udGFpbmVyLCB7XG4gICAgICAgICAgICBib3VuZEVsZW1lbnRzOiAoZWxlbWVudC5ib3VuZEVsZW1lbnRzIHx8IFtdKVxuICAgICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIChib3VuZEVsZW1lbnQpID0+XG4gICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnQuaWQgIT09IG5ld1RleHRFbGVtZW50SWQgJiZcbiAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudC5pZCAhPT0gYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIC5jb25jYXQoe1xuICAgICAgICAgICAgICAgIHR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgICAgIGlkOiBuZXdUZXh0RWxlbWVudElkLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdUZXh0RWxlbWVudCA9IHNjZW5lRWxlbWVudE1hcC5nZXQobmV3VGV4dEVsZW1lbnRJZCk7XG4gICAgICAgIGlmIChuZXdUZXh0RWxlbWVudCAmJiBpc1RleHRFbGVtZW50KG5ld1RleHRFbGVtZW50KSkge1xuICAgICAgICAgIG11dGF0ZUVsZW1lbnQobmV3VGV4dEVsZW1lbnQsIHtcbiAgICAgICAgICAgIGNvbnRhaW5lcklkOiBuZXdDb250YWluZXIgPyBuZXdFbGVtZW50SWQgOiBudWxsLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBoYW5kbGVCaW5kVGV4dFJlc2l6ZSA9IChcbiAgY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQsXG4gIHRyYW5zZm9ybUhhbmRsZVR5cGU6IE1heWJlVHJhbnNmb3JtSGFuZGxlVHlwZSxcbikgPT4ge1xuICBjb25zdCBib3VuZFRleHRFbGVtZW50SWQgPSBnZXRCb3VuZFRleHRFbGVtZW50SWQoY29udGFpbmVyKTtcbiAgaWYgKCFib3VuZFRleHRFbGVtZW50SWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgcmVzZXRPcmlnaW5hbENvbnRhaW5lckNhY2hlKGNvbnRhaW5lci5pZCk7XG4gIGxldCB0ZXh0RWxlbWVudCA9IFNjZW5lLmdldFNjZW5lKGNvbnRhaW5lcikhLmdldEVsZW1lbnQoXG4gICAgYm91bmRUZXh0RWxlbWVudElkLFxuICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgaWYgKHRleHRFbGVtZW50ICYmIHRleHRFbGVtZW50LnRleHQpIHtcbiAgICBpZiAoIWNvbnRhaW5lcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRleHRFbGVtZW50ID0gU2NlbmUuZ2V0U2NlbmUoY29udGFpbmVyKSEuZ2V0RWxlbWVudChcbiAgICAgIGJvdW5kVGV4dEVsZW1lbnRJZCxcbiAgICApIGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudDtcbiAgICBsZXQgdGV4dCA9IHRleHRFbGVtZW50LnRleHQ7XG4gICAgbGV0IG5leHRIZWlnaHQgPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgbGV0IG5leHRXaWR0aCA9IHRleHRFbGVtZW50LndpZHRoO1xuICAgIGNvbnN0IGNvbnRhaW5lckRpbXMgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcik7XG4gICAgY29uc3QgbWF4V2lkdGggPSBnZXRCb3VuZFRleHRNYXhXaWR0aChjb250YWluZXIpO1xuICAgIGNvbnN0IG1heEhlaWdodCA9IGdldEJvdW5kVGV4dE1heEhlaWdodChcbiAgICAgIGNvbnRhaW5lcixcbiAgICAgIHRleHRFbGVtZW50IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4gICAgKTtcbiAgICBsZXQgY29udGFpbmVySGVpZ2h0ID0gY29udGFpbmVyRGltcy5oZWlnaHQ7XG4gICAgbGV0IG5leHRCYXNlTGluZSA9IHRleHRFbGVtZW50LmJhc2VsaW5lO1xuICAgIGlmICh0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcIm5cIiAmJiB0cmFuc2Zvcm1IYW5kbGVUeXBlICE9PSBcInNcIikge1xuICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgdGV4dCA9IHdyYXBUZXh0KFxuICAgICAgICAgIHRleHRFbGVtZW50Lm9yaWdpbmFsVGV4dCxcbiAgICAgICAgICBnZXRGb250U3RyaW5nKHRleHRFbGVtZW50KSxcbiAgICAgICAgICBtYXhXaWR0aCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBtZWFzdXJlVGV4dChcbiAgICAgICAgdGV4dCxcbiAgICAgICAgZ2V0Rm9udFN0cmluZyh0ZXh0RWxlbWVudCksXG4gICAgICAgIHRleHRFbGVtZW50LmxpbmVIZWlnaHQsXG4gICAgICApO1xuICAgICAgbmV4dEhlaWdodCA9IG1ldHJpY3MuaGVpZ2h0O1xuICAgICAgbmV4dFdpZHRoID0gbWV0cmljcy53aWR0aDtcbiAgICAgIG5leHRCYXNlTGluZSA9IG1ldHJpY3MuYmFzZWxpbmU7XG4gICAgfVxuICAgIC8vIGluY3JlYXNlIGhlaWdodCBpbiBjYXNlIHRleHQgZWxlbWVudCBoZWlnaHQgZXhjZWVkc1xuICAgIGlmIChuZXh0SGVpZ2h0ID4gbWF4SGVpZ2h0KSB7XG4gICAgICBjb250YWluZXJIZWlnaHQgPSBjb21wdXRlQ29udGFpbmVyRGltZW5zaW9uRm9yQm91bmRUZXh0KFxuICAgICAgICBuZXh0SGVpZ2h0LFxuICAgICAgICBjb250YWluZXIudHlwZSxcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRpZmYgPSBjb250YWluZXJIZWlnaHQgLSBjb250YWluZXJEaW1zLmhlaWdodDtcbiAgICAgIC8vIGZpeCB0aGUgeSBjb29yZCB3aGVuIHJlc2l6aW5nIGZyb20gbmUvbncvblxuICAgICAgY29uc3QgdXBkYXRlZFkgPVxuICAgICAgICAhaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSAmJlxuICAgICAgICAodHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuZVwiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJud1wiIHx8XG4gICAgICAgICAgdHJhbnNmb3JtSGFuZGxlVHlwZSA9PT0gXCJuXCIpXG4gICAgICAgICAgPyBjb250YWluZXIueSAtIGRpZmZcbiAgICAgICAgICA6IGNvbnRhaW5lci55O1xuICAgICAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICAgICAgaGVpZ2h0OiBjb250YWluZXJIZWlnaHQsXG4gICAgICAgIHk6IHVwZGF0ZWRZLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbXV0YXRlRWxlbWVudCh0ZXh0RWxlbWVudCwge1xuICAgICAgdGV4dCxcbiAgICAgIHdpZHRoOiBuZXh0V2lkdGgsXG4gICAgICBoZWlnaHQ6IG5leHRIZWlnaHQsXG4gICAgICBiYXNlbGluZTogbmV4dEJhc2VMaW5lLFxuICAgIH0pO1xuXG4gICAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICBtdXRhdGVFbGVtZW50KFxuICAgICAgICB0ZXh0RWxlbWVudCxcbiAgICAgICAgY29tcHV0ZUJvdW5kVGV4dFBvc2l0aW9uKFxuICAgICAgICAgIGNvbnRhaW5lcixcbiAgICAgICAgICB0ZXh0RWxlbWVudCBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBjb21wdXRlQm91bmRUZXh0UG9zaXRpb24gPSAoXG4gIGNvbnRhaW5lcjogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGJvdW5kVGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFdpdGhDb250YWluZXIsXG4pID0+IHtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gTGluZWFyRWxlbWVudEVkaXRvci5nZXRCb3VuZFRleHRFbGVtZW50UG9zaXRpb24oXG4gICAgICBjb250YWluZXIsXG4gICAgICBib3VuZFRleHRFbGVtZW50LFxuICAgICk7XG4gIH1cbiAgY29uc3QgY29udGFpbmVyQ29vcmRzID0gZ2V0Q29udGFpbmVyQ29vcmRzKGNvbnRhaW5lcik7XG4gIGNvbnN0IG1heENvbnRhaW5lckhlaWdodCA9IGdldEJvdW5kVGV4dE1heEhlaWdodChjb250YWluZXIsIGJvdW5kVGV4dEVsZW1lbnQpO1xuICBjb25zdCBtYXhDb250YWluZXJXaWR0aCA9IGdldEJvdW5kVGV4dE1heFdpZHRoKGNvbnRhaW5lcik7XG5cbiAgbGV0IHg7XG4gIGxldCB5O1xuICBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5UT1ApIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnk7XG4gIH0gZWxzZSBpZiAoYm91bmRUZXh0RWxlbWVudC52ZXJ0aWNhbEFsaWduID09PSBWRVJUSUNBTF9BTElHTi5CT1RUT00pIHtcbiAgICB5ID0gY29udGFpbmVyQ29vcmRzLnkgKyAobWF4Q29udGFpbmVySGVpZ2h0IC0gYm91bmRUZXh0RWxlbWVudC5oZWlnaHQpO1xuICB9IGVsc2Uge1xuICAgIHkgPVxuICAgICAgY29udGFpbmVyQ29vcmRzLnkgK1xuICAgICAgKG1heENvbnRhaW5lckhlaWdodCAvIDIgLSBib3VuZFRleHRFbGVtZW50LmhlaWdodCAvIDIpO1xuICB9XG4gIGlmIChib3VuZFRleHRFbGVtZW50LnRleHRBbGlnbiA9PT0gVEVYVF9BTElHTi5MRUZUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54O1xuICB9IGVsc2UgaWYgKGJvdW5kVGV4dEVsZW1lbnQudGV4dEFsaWduID09PSBURVhUX0FMSUdOLlJJR0hUKSB7XG4gICAgeCA9IGNvbnRhaW5lckNvb3Jkcy54ICsgKG1heENvbnRhaW5lcldpZHRoIC0gYm91bmRUZXh0RWxlbWVudC53aWR0aCk7XG4gIH0gZWxzZSB7XG4gICAgeCA9XG4gICAgICBjb250YWluZXJDb29yZHMueCArIChtYXhDb250YWluZXJXaWR0aCAvIDIgLSBib3VuZFRleHRFbGVtZW50LndpZHRoIC8gMik7XG4gIH1cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2dyYXNzYXRvci9jYW52YXMtdGV4dC1lZGl0b3IvYmxvYi9tYXN0ZXIvbGliL0ZvbnRNZXRyaWNzLmpzXG5cbmV4cG9ydCBjb25zdCBtZWFzdXJlVGV4dCA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHRleHQgPSB0ZXh0XG4gICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgLy8gcmVwbGFjZSBlbXB0eSBsaW5lcyB3aXRoIHNpbmdsZSBzcGFjZSBiZWNhdXNlIGxlYWRpbmcvdHJhaWxpbmcgZW1wdHlcbiAgICAvLyBsaW5lcyB3b3VsZCBiZSBzdHJpcHBlZCBmcm9tIGNvbXB1dGF0aW9uXG4gICAgLm1hcCgoeCkgPT4geCB8fCBcIiBcIilcbiAgICAuam9pbihcIlxcblwiKTtcbiAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGZvbnQpO1xuICBjb25zdCBoZWlnaHQgPSBnZXRUZXh0SGVpZ2h0KHRleHQsIGZvbnRTaXplLCBsaW5lSGVpZ2h0KTtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgodGV4dCwgZm9udCk7XG4gIGNvbnN0IGJhc2VsaW5lID0gbWVhc3VyZUJhc2VsaW5lKHRleHQsIGZvbnQsIGxpbmVIZWlnaHQpO1xuICByZXR1cm4geyB3aWR0aCwgaGVpZ2h0LCBiYXNlbGluZSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG1lYXN1cmVCYXNlbGluZSA9IChcbiAgdGV4dDogc3RyaW5nLFxuICBmb250OiBGb250U3RyaW5nLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICB3cmFwSW5Db250YWluZXI/OiBib29sZWFuLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gIGNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZVwiO1xuICBjb250YWluZXIuc3R5bGUuZm9udCA9IGZvbnQ7XG4gIGNvbnRhaW5lci5zdHlsZS5taW5IZWlnaHQgPSBcIjFlbVwiO1xuICBpZiAod3JhcEluQ29udGFpbmVyKSB7XG4gICAgY29udGFpbmVyLnN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICBjb250YWluZXIuc3R5bGUud29yZEJyZWFrID0gXCJicmVhay13b3JkXCI7XG4gICAgY29udGFpbmVyLnN0eWxlLndoaXRlU3BhY2UgPSBcInByZS13cmFwXCI7XG4gIH1cblxuICBjb250YWluZXIuc3R5bGUubGluZUhlaWdodCA9IFN0cmluZyhsaW5lSGVpZ2h0KTtcblxuICBjb250YWluZXIuaW5uZXJUZXh0ID0gdGV4dDtcblxuICAvLyBCYXNlbGluZSBpcyBpbXBvcnRhbnQgZm9yIHBvc2l0aW9uaW5nIHRleHQgb24gY2FudmFzXG4gIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoY29udGFpbmVyKTtcblxuICBjb25zdCBzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG4gIHNwYW4uc3R5bGUuZGlzcGxheSA9IFwiaW5saW5lLWJsb2NrXCI7XG4gIHNwYW4uc3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuICBzcGFuLnN0eWxlLndpZHRoID0gXCIxcHhcIjtcbiAgc3Bhbi5zdHlsZS5oZWlnaHQgPSBcIjFweFwiO1xuICBjb250YWluZXIuYXBwZW5kQ2hpbGQoc3Bhbik7XG4gIGxldCBiYXNlbGluZSA9IHNwYW4ub2Zmc2V0VG9wICsgc3Bhbi5vZmZzZXRIZWlnaHQ7XG4gIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5vZmZzZXRIZWlnaHQ7XG5cbiAgaWYgKGlzU2FmYXJpKSB7XG4gICAgY29uc3QgY2FudmFzSGVpZ2h0ID0gZ2V0VGV4dEhlaWdodCh0ZXh0LCBwYXJzZUZsb2F0KGZvbnQpLCBsaW5lSGVpZ2h0KTtcbiAgICBjb25zdCBmb250U2l6ZSA9IHBhcnNlRmxvYXQoZm9udCk7XG4gICAgLy8gSW4gU2FmYXJpIHRoZSBmb250IHNpemUgZ2V0cyByb3VuZGVkIG9mZiB3aGVuIHJlbmRlcmluZyBoZW5jZSBjYWxjdWxhdGluZyB0aGUgc2FmYXJpIGhlaWdodCBhbmQgc2hpZnRpbmcgdGhlIGJhc2VsaW5lIGlmIGl0IGRpZmZlcnNcbiAgICAvLyBmcm9tIHRoZSBhY3R1YWwgY2FudmFzIGhlaWdodFxuICAgIGNvbnN0IGRvbUhlaWdodCA9IGdldFRleHRIZWlnaHQodGV4dCwgTWF0aC5yb3VuZChmb250U2l6ZSksIGxpbmVIZWlnaHQpO1xuICAgIGlmIChjYW52YXNIZWlnaHQgPiBoZWlnaHQpIHtcbiAgICAgIGJhc2VsaW5lICs9IGNhbnZhc0hlaWdodCAtIGRvbUhlaWdodDtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0ID4gY2FudmFzSGVpZ2h0KSB7XG4gICAgICBiYXNlbGluZSAtPSBkb21IZWlnaHQgLSBjYW52YXNIZWlnaHQ7XG4gICAgfVxuICB9XG4gIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTtcbiAgcmV0dXJuIGJhc2VsaW5lO1xufTtcblxuLyoqXG4gKiBUbyBnZXQgdW5pdGxlc3MgbGluZS1oZWlnaHQgKGlmIHVua25vd24pIHdlIGNhbiBjYWxjdWxhdGUgaXQgYnkgZGl2aWRpbmdcbiAqIGhlaWdodC1wZXItbGluZSBieSBmb250U2l6ZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVjdExpbmVIZWlnaHQgPSAodGV4dEVsZW1lbnQ6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudCkgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0RWxlbWVudC50ZXh0KS5sZW5ndGg7XG4gIHJldHVybiAodGV4dEVsZW1lbnQuaGVpZ2h0IC9cbiAgICBsaW5lQ291bnQgL1xuICAgIHRleHRFbGVtZW50LmZvbnRTaXplKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdO1xufTtcblxuLyoqXG4gKiBXZSBjYWxjdWxhdGUgdGhlIGxpbmUgaGVpZ2h0IGZyb20gdGhlIGZvbnQgc2l6ZSBhbmQgdGhlIHVuaXRsZXNzIGxpbmUgaGVpZ2h0LFxuICogYWxpZ25pbmcgd2l0aCB0aGUgVzNDIHNwZWMuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRMaW5lSGVpZ2h0SW5QeCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBmb250U2l6ZSAqIGxpbmVIZWlnaHQ7XG59O1xuXG4vLyBGSVhNRSByZW5hbWUgdG8gZ2V0QXBwcm94TWluQ29udGFpbmVySGVpZ2h0XG5leHBvcnQgY29uc3QgZ2V0QXBwcm94TWluTGluZUhlaWdodCA9IChcbiAgZm9udFNpemU6IEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImZvbnRTaXplXCJdLFxuICBsaW5lSGVpZ2h0OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuKSA9PiB7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKyBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxubGV0IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCB1bmRlZmluZWQ7XG5cbmNvbnN0IGdldExpbmVXaWR0aCA9ICh0ZXh0OiBzdHJpbmcsIGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICB9XG4gIGNvbnN0IGNhbnZhczJkQ29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIikhO1xuICBjYW52YXMyZENvbnRleHQuZm9udCA9IGZvbnQ7XG4gIGNvbnN0IHdpZHRoID0gY2FudmFzMmRDb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoO1xuXG4gIC8vIHNpbmNlIGluIHRlc3QgZW52IHRoZSBjYW52YXMgbWVhc3VyZVRleHQgYWxnb1xuICAvLyBkb2Vzbid0IG1lYXN1cmUgdGV4dCBhbmQgaW5zdGVhZCBqdXN0IHJldHVybnMgbnVtYmVyIG9mXG4gIC8vIGNoYXJhY3RlcnMgaGVuY2Ugd2UgYXNzdW1lIHRoYXQgZWFjaCBsZXR0ZXJpcyAxMHB4XG4gIGlmIChpc1Rlc3RFbnYoKSkge1xuICAgIHJldHVybiB3aWR0aCAqIDEwO1xuICB9XG4gIHJldHVybiB3aWR0aDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0V2lkdGggPSAodGV4dDogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGxpbmVzID0gc3BsaXRJbnRvTGluZXModGV4dCk7XG4gIGxldCB3aWR0aCA9IDA7XG4gIGxpbmVzLmZvckVhY2goKGxpbmUpID0+IHtcbiAgICB3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBnZXRMaW5lV2lkdGgobGluZSwgZm9udCkpO1xuICB9KTtcbiAgcmV0dXJuIHdpZHRoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldFRleHRIZWlnaHQgPSAoXG4gIHRleHQ6IHN0cmluZyxcbiAgZm9udFNpemU6IG51bWJlcixcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBsaW5lQ291bnQgPSBzcGxpdEludG9MaW5lcyh0ZXh0KS5sZW5ndGg7XG4gIHJldHVybiBnZXRMaW5lSGVpZ2h0SW5QeChmb250U2l6ZSwgbGluZUhlaWdodCkgKiBsaW5lQ291bnQ7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyc2VUb2tlbnMgPSAodGV4dDogc3RyaW5nKSA9PiB7XG4gIC8vIFNwbGl0dGluZyB3b3JkcyBjb250YWluaW5nIFwiLVwiIGFzIHRob3NlIGFyZSB0cmVhdGVkIGFzIHNlcGFyYXRlIHdvcmRzXG4gIC8vIGJ5IGNzcyB3cmFwcGluZyBhbGdvcml0aG0gZWcgbm9uLXByb2ZpdCA9PiBub24tLCBwcm9maXRcbiAgY29uc3Qgd29yZHMgPSB0ZXh0LnNwbGl0KFwiLVwiKTtcbiAgaWYgKHdvcmRzLmxlbmd0aCA+IDEpIHtcbiAgICAvLyBub24tcHJvZnQgb3JnID0+IFsnbm9uLScsICdwcm9maXQgb3JnJ11cbiAgICB3b3Jkcy5mb3JFYWNoKCh3b3JkLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGluZGV4ICE9PSB3b3Jkcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIHdvcmRzW2luZGV4XSA9IHdvcmQgKz0gXCItXCI7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgLy8gSm9pbmluZyB0aGUgd29yZHMgd2l0aCBzcGFjZSBhbmQgc3BsaXR0aW5nIHRoZW0gYWdhaW4gd2l0aCBzcGFjZSB0byBnZXQgdGhlXG4gIC8vIGZpbmFsIGxpc3Qgb2YgdG9rZW5zXG4gIC8vIFsnbm9uLScsICdwcm9maXQgb3JnJ10gPT4sJ25vbi0gcHJvZnQgb3JnJyA9PiBbJ25vbi0nLCdwcm9maXQnLCdvcmcnXVxuICByZXR1cm4gd29yZHMuam9pbihcIiBcIikuc3BsaXQoXCIgXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IHdyYXBUZXh0ID0gKHRleHQ6IHN0cmluZywgZm9udDogRm9udFN0cmluZywgbWF4V2lkdGg6IG51bWJlcikgPT4ge1xuICAvLyBpZiBtYXhXaWR0aCBpcyBub3QgZmluaXRlIG9yIE5hTiB3aGljaCBjYW4gaGFwcGVuIGluIGNhc2Ugb2YgYnVncyBpblxuICAvLyBjb21wdXRhdGlvbiwgd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgY29udGludWUgYXMgd2UnbGwgZW5kIHVwXG4gIC8vIGluIGFuIGluZmluaXRlIGxvb3BcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobWF4V2lkdGgpIHx8IG1heFdpZHRoIDwgMCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3QgbGluZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgY29uc3Qgb3JpZ2luYWxMaW5lcyA9IHRleHQuc3BsaXQoXCJcXG5cIik7XG4gIGNvbnN0IHNwYWNlV2lkdGggPSBnZXRMaW5lV2lkdGgoXCIgXCIsIGZvbnQpO1xuXG4gIGxldCBjdXJyZW50TGluZSA9IFwiXCI7XG4gIGxldCBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG5cbiAgY29uc3QgcHVzaCA9IChzdHI6IHN0cmluZykgPT4ge1xuICAgIGlmIChzdHIudHJpbSgpKSB7XG4gICAgICBsaW5lcy5wdXNoKHN0cik7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlc2V0UGFyYW1zID0gKCkgPT4ge1xuICAgIGN1cnJlbnRMaW5lID0gXCJcIjtcbiAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IDA7XG4gIH07XG4gIG9yaWdpbmFsTGluZXMuZm9yRWFjaCgob3JpZ2luYWxMaW5lKSA9PiB7XG4gICAgY29uc3QgY3VycmVudExpbmVXaWR0aCA9IGdldFRleHRXaWR0aChvcmlnaW5hbExpbmUsIGZvbnQpO1xuXG4gICAgLy8gUHVzaCB0aGUgbGluZSBpZiBpdHMgPD0gbWF4V2lkdGhcbiAgICBpZiAoY3VycmVudExpbmVXaWR0aCA8PSBtYXhXaWR0aCkge1xuICAgICAgbGluZXMucHVzaChvcmlnaW5hbExpbmUpO1xuICAgICAgcmV0dXJuOyAvLyBjb250aW51ZVxuICAgIH1cblxuICAgIGNvbnN0IHdvcmRzID0gcGFyc2VUb2tlbnMob3JpZ2luYWxMaW5lKTtcbiAgICByZXNldFBhcmFtcygpO1xuXG4gICAgbGV0IGluZGV4ID0gMDtcblxuICAgIHdoaWxlIChpbmRleCA8IHdvcmRzLmxlbmd0aCkge1xuICAgICAgY29uc3QgY3VycmVudFdvcmRXaWR0aCA9IGdldExpbmVXaWR0aCh3b3Jkc1tpbmRleF0sIGZvbnQpO1xuXG4gICAgICAvLyBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2hlbiBzaW5nbGUgd29yZCB0YWtlcyBlbnRpcmUgd2lkdGhcbiAgICAgIGlmIChjdXJyZW50V29yZFdpZHRoID09PSBtYXhXaWR0aCkge1xuICAgICAgICBwdXNoKHdvcmRzW2luZGV4XSk7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG5cbiAgICAgIC8vIFN0YXJ0IGJyZWFraW5nIGxvbmdlciB3b3JkcyBleGNlZWRpbmcgbWF4IHdpZHRoXG4gICAgICBlbHNlIGlmIChjdXJyZW50V29yZFdpZHRoID4gbWF4V2lkdGgpIHtcbiAgICAgICAgLy8gcHVzaCBjdXJyZW50IGxpbmUgc2luY2UgdGhlIGN1cnJlbnQgd29yZCBleGNlZWRzIHRoZSBtYXggd2lkdGhcbiAgICAgICAgLy8gc28gd2lsbCBiZSBhcHBlbmRlZCBpbiBuZXh0IGxpbmVcblxuICAgICAgICBwdXNoKGN1cnJlbnRMaW5lKTtcblxuICAgICAgICByZXNldFBhcmFtcygpO1xuXG4gICAgICAgIHdoaWxlICh3b3Jkc1tpbmRleF0ubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRDaGFyID0gU3RyaW5nLmZyb21Db2RlUG9pbnQoXG4gICAgICAgICAgICB3b3Jkc1tpbmRleF0uY29kZVBvaW50QXQoMCkhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3Qgd2lkdGggPSBjaGFyV2lkdGguY2FsY3VsYXRlKGN1cnJlbnRDaGFyLCBmb250KTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArPSB3aWR0aDtcbiAgICAgICAgICB3b3Jkc1tpbmRleF0gPSB3b3Jkc1tpbmRleF0uc2xpY2UoY3VycmVudENoYXIubGVuZ3RoKTtcblxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA+PSBtYXhXaWR0aCkge1xuICAgICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgICBjdXJyZW50TGluZSA9IGN1cnJlbnRDaGFyO1xuICAgICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgPSB3aWR0aDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExpbmUgKz0gY3VycmVudENoYXI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIHB1c2ggY3VycmVudCBsaW5lIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICBpZiAoY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKyBzcGFjZVdpZHRoID49IG1heFdpZHRoKSB7XG4gICAgICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgICAgICAgcmVzZXRQYXJhbXMoKTtcbiAgICAgICAgICAvLyBzcGFjZSBuZWVkcyB0byBiZSBhcHBlbmRlZCBiZWZvcmUgbmV4dCB3b3JkXG4gICAgICAgICAgLy8gYXMgY3VycmVudExpbmUgY29udGFpbnMgY2hhcnMgd2hpY2ggY291bGRuJ3QgYmUgYXBwZW5kZWRcbiAgICAgICAgICAvLyB0byBwcmV2aW91cyBsaW5lIHVubGVzcyB0aGUgbGluZSBlbmRzIHdpdGggaHlwaGVuIHRvIHN5bmNcbiAgICAgICAgICAvLyB3aXRoIGNzcyB3b3JkLXdyYXBcbiAgICAgICAgfSBlbHNlIGlmICghY3VycmVudExpbmUuZW5kc1dpdGgoXCItXCIpKSB7XG4gICAgICAgICAgY3VycmVudExpbmUgKz0gXCIgXCI7XG4gICAgICAgICAgY3VycmVudExpbmVXaWR0aFRpbGxOb3cgKz0gc3BhY2VXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICBpbmRleCsrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gU3RhcnQgYXBwZW5kaW5nIHdvcmRzIGluIGEgbGluZSB0aWxsIG1heCB3aWR0aCByZWFjaGVkXG4gICAgICAgIHdoaWxlIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA8IG1heFdpZHRoICYmIGluZGV4IDwgd29yZHMubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3Qgd29yZCA9IHdvcmRzW2luZGV4XTtcbiAgICAgICAgICBjdXJyZW50TGluZVdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChjdXJyZW50TGluZSArIHdvcmQsIGZvbnQpO1xuXG4gICAgICAgICAgaWYgKGN1cnJlbnRMaW5lV2lkdGhUaWxsTm93ID4gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIHB1c2goY3VycmVudExpbmUpO1xuICAgICAgICAgICAgcmVzZXRQYXJhbXMoKTtcblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluZGV4Kys7XG5cbiAgICAgICAgICAvLyBpZiB3b3JkIGVuZHMgd2l0aCBcIi1cIiB0aGVuIHdlIGRvbid0IG5lZWQgdG8gYWRkIHNwYWNlXG4gICAgICAgICAgLy8gdG8gc3luYyB3aXRoIGNzcyB3b3JkLXdyYXBcbiAgICAgICAgICBjb25zdCBzaG91bGRBcHBlbmRTcGFjZSA9ICF3b3JkLmVuZHNXaXRoKFwiLVwiKTtcbiAgICAgICAgICBjdXJyZW50TGluZSArPSB3b3JkO1xuXG4gICAgICAgICAgaWYgKHNob3VsZEFwcGVuZFNwYWNlKSB7XG4gICAgICAgICAgICBjdXJyZW50TGluZSArPSBcIiBcIjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQdXNoIHRoZSB3b3JkIGlmIGFwcGVuZGluZyBzcGFjZSBleGNlZWRzIG1heCB3aWR0aFxuICAgICAgICAgIGlmIChjdXJyZW50TGluZVdpZHRoVGlsbE5vdyArIHNwYWNlV2lkdGggPj0gbWF4V2lkdGgpIHtcbiAgICAgICAgICAgIGlmIChzaG91bGRBcHBlbmRTcGFjZSkge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lLnNsaWNlKDAsIC0xKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBsaW5lcy5wdXNoKGN1cnJlbnRMaW5lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlc2V0UGFyYW1zKCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGN1cnJlbnRMaW5lLnNsaWNlKC0xKSA9PT0gXCIgXCIpIHtcbiAgICAgIC8vIG9ubHkgcmVtb3ZlIGxhc3QgdHJhaWxpbmcgc3BhY2Ugd2hpY2ggd2UgaGF2ZSBhZGRlZCB3aGVuIGpvaW5pbmcgd29yZHNcbiAgICAgIGN1cnJlbnRMaW5lID0gY3VycmVudExpbmUuc2xpY2UoMCwgLTEpO1xuICAgICAgcHVzaChjdXJyZW50TGluZSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oXCJcXG5cIik7XG59O1xuXG5leHBvcnQgY29uc3QgY2hhcldpZHRoID0gKCgpID0+IHtcbiAgY29uc3QgY2FjaGVkQ2hhcldpZHRoOiB7IFtrZXk6IEZvbnRTdHJpbmddOiBBcnJheTxudW1iZXI+IH0gPSB7fTtcblxuICBjb25zdCBjYWxjdWxhdGUgPSAoY2hhcjogc3RyaW5nLCBmb250OiBGb250U3RyaW5nKSA9PiB7XG4gICAgY29uc3QgYXNjaWkgPSBjaGFyLmNoYXJDb2RlQXQoMCk7XG4gICAgaWYgKCFjYWNoZWRDaGFyV2lkdGhbZm9udF0pIHtcbiAgICAgIGNhY2hlZENoYXJXaWR0aFtmb250XSA9IFtdO1xuICAgIH1cbiAgICBpZiAoIWNhY2hlZENoYXJXaWR0aFtmb250XVthc2NpaV0pIHtcbiAgICAgIGNvbnN0IHdpZHRoID0gZ2V0TGluZVdpZHRoKGNoYXIsIGZvbnQpO1xuICAgICAgY2FjaGVkQ2hhcldpZHRoW2ZvbnRdW2FzY2lpXSA9IHdpZHRoO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZWRDaGFyV2lkdGhbZm9udF1bYXNjaWldO1xuICB9O1xuXG4gIGNvbnN0IGdldENhY2hlID0gKGZvbnQ6IEZvbnRTdHJpbmcpID0+IHtcbiAgICByZXR1cm4gY2FjaGVkQ2hhcldpZHRoW2ZvbnRdO1xuICB9O1xuICByZXR1cm4ge1xuICAgIGNhbGN1bGF0ZSxcbiAgICBnZXRDYWNoZSxcbiAgfTtcbn0pKCk7XG5cbmNvbnN0IERVTU1ZX1RFWFQgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OVwiLnRvTG9jYWxlVXBwZXJDYXNlKCk7XG5cbi8vIEZJWE1FIHJlbmFtZSB0byBnZXRBcHByb3hNaW5Db250YWluZXJXaWR0aFxuZXhwb3J0IGNvbnN0IGdldEFwcHJveE1pbkxpbmVXaWR0aCA9IChcbiAgZm9udDogRm9udFN0cmluZyxcbiAgbGluZUhlaWdodDogRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbikgPT4ge1xuICBjb25zdCBtYXhDaGFyV2lkdGggPSBnZXRNYXhDaGFyV2lkdGgoZm9udCk7XG4gIGlmIChtYXhDaGFyV2lkdGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgbWVhc3VyZVRleHQoRFVNTVlfVEVYVC5zcGxpdChcIlwiKS5qb2luKFwiXFxuXCIpLCBmb250LCBsaW5lSGVpZ2h0KS53aWR0aCArXG4gICAgICBCT1VORF9URVhUX1BBRERJTkcgKiAyXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbWF4Q2hhcldpZHRoICsgQk9VTkRfVEVYVF9QQURESU5HICogMjtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRNaW5DaGFyV2lkdGggPSAoZm9udDogRm9udFN0cmluZykgPT4ge1xuICBjb25zdCBjYWNoZSA9IGNoYXJXaWR0aC5nZXRDYWNoZShmb250KTtcbiAgaWYgKCFjYWNoZSkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGNvbnN0IGNhY2hlV2l0aE91dEVtcHR5ID0gY2FjaGUuZmlsdGVyKCh2YWwpID0+IHZhbCAhPT0gdW5kZWZpbmVkKTtcblxuICByZXR1cm4gTWF0aC5taW4oLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE1heENoYXJXaWR0aCA9IChmb250OiBGb250U3RyaW5nKSA9PiB7XG4gIGNvbnN0IGNhY2hlID0gY2hhcldpZHRoLmdldENhY2hlKGZvbnQpO1xuICBpZiAoIWNhY2hlKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgY29uc3QgY2FjaGVXaXRoT3V0RW1wdHkgPSBjYWNoZS5maWx0ZXIoKHZhbCkgPT4gdmFsICE9PSB1bmRlZmluZWQpO1xuICByZXR1cm4gTWF0aC5tYXgoLi4uY2FjaGVXaXRoT3V0RW1wdHkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEFwcHJveENoYXJzVG9GaXRJbldpZHRoID0gKGZvbnQ6IEZvbnRTdHJpbmcsIHdpZHRoOiBudW1iZXIpID0+IHtcbiAgLy8gR2VuZXJhbGx5IGxvd2VyIGNhc2UgaXMgdXNlZCBzbyBjb252ZXJ0aW5nIHRvIGxvd2VyIGNhc2VcbiAgY29uc3QgZHVtbXlUZXh0ID0gRFVNTVlfVEVYVC50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICBjb25zdCBiYXRjaExlbmd0aCA9IDY7XG4gIGxldCBpbmRleCA9IDA7XG4gIGxldCB3aWR0aFRpbGxOb3cgPSAwO1xuICBsZXQgc3RyID0gXCJcIjtcbiAgd2hpbGUgKHdpZHRoVGlsbE5vdyA8PSB3aWR0aCkge1xuICAgIGNvbnN0IGJhdGNoID0gZHVtbXlUZXh0LnN1YnN0cihpbmRleCwgaW5kZXggKyBiYXRjaExlbmd0aCk7XG4gICAgc3RyICs9IGJhdGNoO1xuICAgIHdpZHRoVGlsbE5vdyArPSBnZXRMaW5lV2lkdGgoc3RyLCBmb250KTtcbiAgICBpZiAoaW5kZXggPT09IGR1bW15VGV4dC5sZW5ndGggLSAxKSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgfVxuICAgIGluZGV4ID0gaW5kZXggKyBiYXRjaExlbmd0aDtcbiAgfVxuXG4gIHdoaWxlICh3aWR0aFRpbGxOb3cgPiB3aWR0aCkge1xuICAgIHN0ciA9IHN0ci5zdWJzdHIoMCwgc3RyLmxlbmd0aCAtIDEpO1xuICAgIHdpZHRoVGlsbE5vdyA9IGdldExpbmVXaWR0aChzdHIsIGZvbnQpO1xuICB9XG4gIHJldHVybiBzdHIubGVuZ3RoO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dEVsZW1lbnRJZCA9IChjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50IHwgbnVsbCkgPT4ge1xuICByZXR1cm4gY29udGFpbmVyPy5ib3VuZEVsZW1lbnRzPy5sZW5ndGhcbiAgICA/IGNvbnRhaW5lcj8uYm91bmRFbGVtZW50cz8uZmlsdGVyKChlbGUpID0+IGVsZS50eXBlID09PSBcInRleHRcIilbMF0/LmlkIHx8XG4gICAgICAgIG51bGxcbiAgICA6IG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudCA9IChlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCB8IG51bGwpID0+IHtcbiAgaWYgKCFlbGVtZW50KSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudElkID0gZ2V0Qm91bmRUZXh0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoYm91bmRUZXh0RWxlbWVudElkKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIChTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChcbiAgICAgICAgYm91bmRUZXh0RWxlbWVudElkLFxuICAgICAgKSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyKSB8fCBudWxsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJFbGVtZW50ID0gKFxuICBlbGVtZW50OlxuICAgIHwgKEV4Y2FsaWRyYXdFbGVtZW50ICYge1xuICAgICAgICBjb250YWluZXJJZDogRXhjYWxpZHJhd0VsZW1lbnRbXCJpZFwiXSB8IG51bGw7XG4gICAgICB9KVxuICAgIHwgbnVsbCxcbikgPT4ge1xuICBpZiAoIWVsZW1lbnQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBpZiAoZWxlbWVudC5jb250YWluZXJJZCkge1xuICAgIHJldHVybiBTY2VuZS5nZXRTY2VuZShlbGVtZW50KT8uZ2V0RWxlbWVudChlbGVtZW50LmNvbnRhaW5lcklkKSB8fCBudWxsO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbnRhaW5lckRpbXMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgY29uc3QgTUlOX1dJRFRIID0gMzAwO1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCB3aWR0aCA9IE1hdGgubWF4KGVsZW1lbnQud2lkdGgsIE1JTl9XSURUSCk7XG4gICAgY29uc3QgaGVpZ2h0ID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgcmV0dXJuIHsgd2lkdGgsIGhlaWdodCB9O1xuICB9XG4gIHJldHVybiB7IHdpZHRoOiBlbGVtZW50LndpZHRoLCBoZWlnaHQ6IGVsZW1lbnQuaGVpZ2h0IH07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q29udGFpbmVyQ2VudGVyID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGNvbnRhaW5lci54ICsgY29udGFpbmVyLndpZHRoIC8gMixcbiAgICAgIHk6IGNvbnRhaW5lci55ICsgY29udGFpbmVyLmhlaWdodCAvIDIsXG4gICAgfTtcbiAgfVxuICBjb25zdCBwb2ludHMgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldFBvaW50c0dsb2JhbENvb3JkaW5hdGVzKGNvbnRhaW5lcik7XG4gIGlmIChwb2ludHMubGVuZ3RoICUgMiA9PT0gMSkge1xuICAgIGNvbnN0IGluZGV4ID0gTWF0aC5mbG9vcihjb250YWluZXIucG9pbnRzLmxlbmd0aCAvIDIpO1xuICAgIGNvbnN0IG1pZFBvaW50ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRQb2ludEdsb2JhbENvb3JkaW5hdGVzKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgY29udGFpbmVyLnBvaW50c1tpbmRleF0sXG4gICAgKTtcbiAgICByZXR1cm4geyB4OiBtaWRQb2ludFswXSwgeTogbWlkUG9pbnRbMV0gfTtcbiAgfVxuICBjb25zdCBpbmRleCA9IGNvbnRhaW5lci5wb2ludHMubGVuZ3RoIC8gMiAtIDE7XG4gIGxldCBtaWRTZWdtZW50TWlkcG9pbnQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldEVkaXRvck1pZFBvaW50cyhcbiAgICBjb250YWluZXIsXG4gICAgYXBwU3RhdGUsXG4gIClbaW5kZXhdO1xuICBpZiAoIW1pZFNlZ21lbnRNaWRwb2ludCkge1xuICAgIG1pZFNlZ21lbnRNaWRwb2ludCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0U2VnbWVudE1pZFBvaW50KFxuICAgICAgY29udGFpbmVyLFxuICAgICAgcG9pbnRzW2luZGV4XSxcbiAgICAgIHBvaW50c1tpbmRleCArIDFdLFxuICAgICAgaW5kZXggKyAxLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgeDogbWlkU2VnbWVudE1pZHBvaW50WzBdLCB5OiBtaWRTZWdtZW50TWlkcG9pbnRbMV0gfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRDb250YWluZXJDb29yZHMgPSAoY29udGFpbmVyOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgbGV0IG9mZnNldFggPSBCT1VORF9URVhUX1BBRERJTkc7XG4gIGxldCBvZmZzZXRZID0gQk9VTkRfVEVYVF9QQURESU5HO1xuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICBvZmZzZXRYICs9IChjb250YWluZXIud2lkdGggLyAyKSAqICgxIC0gTWF0aC5zcXJ0KDIpIC8gMik7XG4gICAgb2Zmc2V0WSArPSAoY29udGFpbmVyLmhlaWdodCAvIDIpICogKDEgLSBNYXRoLnNxcnQoMikgLyAyKTtcbiAgfVxuICAvLyBUaGUgZGVyaXZhdGlvbiBvZiBjb29yZGluYXRlcyBpcyBleHBsYWluZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgaWYgKGNvbnRhaW5lci50eXBlID09PSBcImRpYW1vbmRcIikge1xuICAgIG9mZnNldFggKz0gY29udGFpbmVyLndpZHRoIC8gNDtcbiAgICBvZmZzZXRZICs9IGNvbnRhaW5lci5oZWlnaHQgLyA0O1xuICB9XG4gIHJldHVybiB7XG4gICAgeDogY29udGFpbmVyLnggKyBvZmZzZXRYLFxuICAgIHk6IGNvbnRhaW5lci55ICsgb2Zmc2V0WSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0RWxlbWVudEFuZ2xlID0gKHRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQpID0+IHtcbiAgY29uc3QgY29udGFpbmVyID0gZ2V0Q29udGFpbmVyRWxlbWVudCh0ZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8IGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gdGV4dEVsZW1lbnQuYW5nbGU7XG4gIH1cbiAgcmV0dXJuIGNvbnRhaW5lci5hbmdsZTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRCb3VuZFRleHRFbGVtZW50T2Zmc2V0ID0gKFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnQgfCBudWxsLFxuKSA9PiB7XG4gIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoYm91bmRUZXh0RWxlbWVudCk7XG4gIGlmICghY29udGFpbmVyIHx8ICFib3VuZFRleHRFbGVtZW50KSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gQk9VTkRfVEVYVF9QQURESU5HICogODtcbiAgfVxuXG4gIHJldHVybiBCT1VORF9URVhUX1BBRERJTkc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uID0gKFxuICBjb250YWluZXI6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBib3VuZFRleHRFbGVtZW50OiBFeGNhbGlkcmF3VGV4dEVsZW1lbnRXaXRoQ29udGFpbmVyLFxuKSA9PiB7XG4gIGlmIChpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKFxuICAgICAgY29udGFpbmVyLFxuICAgICAgYm91bmRUZXh0RWxlbWVudCxcbiAgICApO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2hvdWxkQWxsb3dWZXJ0aWNhbEFsaWduID0gKFxuICBzZWxlY3RlZEVsZW1lbnRzOiBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbikgPT4ge1xuICByZXR1cm4gc2VsZWN0ZWRFbGVtZW50cy5zb21lKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgaGFzQm91bmRDb250YWluZXIgPSBpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCk7XG4gICAgaWYgKGhhc0JvdW5kQ29udGFpbmVyKSB7XG4gICAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkgJiYgaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBzdXBwcG9ydHNIb3Jpem9udGFsQWxpZ24gPSAoXG4gIHNlbGVjdGVkRWxlbWVudHM6IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuKSA9PiB7XG4gIHJldHVybiBzZWxlY3RlZEVsZW1lbnRzLnNvbWUoKGVsZW1lbnQpID0+IHtcbiAgICBjb25zdCBoYXNCb3VuZENvbnRhaW5lciA9IGlzQm91bmRUb0NvbnRhaW5lcihlbGVtZW50KTtcbiAgICBpZiAoaGFzQm91bmRDb250YWluZXIpIHtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IGdldENvbnRhaW5lckVsZW1lbnQoZWxlbWVudCk7XG4gICAgICBpZiAoaXNUZXh0RWxlbWVudChlbGVtZW50KSAmJiBpc0Fycm93RWxlbWVudChjb250YWluZXIpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBpc1RleHRFbGVtZW50KGVsZW1lbnQpO1xuICB9KTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRUZXh0QmluZGFibGVDb250YWluZXJBdFBvc2l0aW9uID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICB4OiBudW1iZXIsXG4gIHk6IG51bWJlcixcbik6IEV4Y2FsaWRyYXdUZXh0Q29udGFpbmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHNlbGVjdGVkRWxlbWVudHMgPSBnZXRTZWxlY3RlZEVsZW1lbnRzKGVsZW1lbnRzLCBhcHBTdGF0ZSk7XG4gIGlmIChzZWxlY3RlZEVsZW1lbnRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpc1RleHRCaW5kYWJsZUNvbnRhaW5lcihzZWxlY3RlZEVsZW1lbnRzWzBdLCBmYWxzZSlcbiAgICAgID8gc2VsZWN0ZWRFbGVtZW50c1swXVxuICAgICAgOiBudWxsO1xuICB9XG4gIGxldCBoaXRFbGVtZW50ID0gbnVsbDtcbiAgLy8gV2UgbmVlZCB0byB0byBoaXQgdGVzdGluZyBmcm9tIGZyb250IChlbmQgb2YgdGhlIGFycmF5KSB0byBiYWNrIChiZWdpbm5pbmcgb2YgdGhlIGFycmF5KVxuICBmb3IgKGxldCBpbmRleCA9IGVsZW1lbnRzLmxlbmd0aCAtIDE7IGluZGV4ID49IDA7IC0taW5kZXgpIHtcbiAgICBpZiAoZWxlbWVudHNbaW5kZXhdLmlzRGVsZXRlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudHNbaW5kZXhdKTtcbiAgICBpZiAoXG4gICAgICBpc0Fycm93RWxlbWVudChlbGVtZW50c1tpbmRleF0pICYmXG4gICAgICBpc0hpdHRpbmdFbGVtZW50Tm90Q29uc2lkZXJpbmdCb3VuZGluZ0JveChlbGVtZW50c1tpbmRleF0sIGFwcFN0YXRlLCBbXG4gICAgICAgIHgsXG4gICAgICAgIHksXG4gICAgICBdKVxuICAgICkge1xuICAgICAgaGl0RWxlbWVudCA9IGVsZW1lbnRzW2luZGV4XTtcbiAgICAgIGJyZWFrO1xuICAgIH0gZWxzZSBpZiAoeDEgPCB4ICYmIHggPCB4MiAmJiB5MSA8IHkgJiYgeSA8IHkyKSB7XG4gICAgICBoaXRFbGVtZW50ID0gZWxlbWVudHNbaW5kZXhdO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGlzVGV4dEJpbmRhYmxlQ29udGFpbmVyKGhpdEVsZW1lbnQsIGZhbHNlKSA/IGhpdEVsZW1lbnQgOiBudWxsO1xufTtcblxuY29uc3QgVkFMSURfQ09OVEFJTkVSX1RZUEVTID0gbmV3IFNldChbXG4gIFwicmVjdGFuZ2xlXCIsXG4gIFwiZWxsaXBzZVwiLFxuICBcImRpYW1vbmRcIixcbiAgXCJpbWFnZVwiLFxuICBcImFycm93XCIsXG5dKTtcblxuZXhwb3J0IGNvbnN0IGlzVmFsaWRUZXh0Q29udGFpbmVyID0gKGVsZW1lbnQ6IHtcbiAgdHlwZTogRXhjYWxpZHJhd0VsZW1lbnRbXCJ0eXBlXCJdO1xufSkgPT4gVkFMSURfQ09OVEFJTkVSX1RZUEVTLmhhcyhlbGVtZW50LnR5cGUpO1xuXG5leHBvcnQgY29uc3QgY29tcHV0ZUNvbnRhaW5lckRpbWVuc2lvbkZvckJvdW5kVGV4dCA9IChcbiAgZGltZW5zaW9uOiBudW1iZXIsXG4gIGNvbnRhaW5lclR5cGU6IEV4dHJhY3RTZXRUeXBlPHR5cGVvZiBWQUxJRF9DT05UQUlORVJfVFlQRVM+LFxuKSA9PiB7XG4gIGRpbWVuc2lvbiA9IE1hdGguY2VpbChkaW1lbnNpb24pO1xuICBjb25zdCBwYWRkaW5nID0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcblxuICBpZiAoY29udGFpbmVyVHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoKGRpbWVuc2lvbiArIHBhZGRpbmcpIC8gTWF0aC5zcXJ0KDIpKSAqIDIpO1xuICB9XG4gIGlmIChjb250YWluZXJUeXBlID09PSBcImFycm93XCIpIHtcbiAgICByZXR1cm4gZGltZW5zaW9uICsgcGFkZGluZyAqIDg7XG4gIH1cbiAgaWYgKGNvbnRhaW5lclR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgcmV0dXJuIDIgKiAoZGltZW5zaW9uICsgcGFkZGluZyk7XG4gIH1cbiAgcmV0dXJuIGRpbWVuc2lvbiArIHBhZGRpbmc7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Qm91bmRUZXh0TWF4V2lkdGggPSAoY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldENvbnRhaW5lckRpbXMoY29udGFpbmVyKS53aWR0aDtcbiAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiA4ICogMjtcbiAgfVxuXG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYW4gZWxsaXBzZSBpc1xuICAgIC8vIE1hdGgucm91bmQoKGVsbGlwc2Uud2lkdGggLyAyKSAqIE1hdGguc3FydCgyKSkgd2hpY2ggaXMgZGVyaXZlZCBmcm9tXG4gICAgLy8gZXF1YXRpb24gb2YgYW4gZWxsaXBzZSAtaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgod2lkdGggLyAyKSAqIE1hdGguc3FydCgyKSkgLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAvLyBUaGUgd2lkdGggb2YgdGhlIGxhcmdlc3QgcmVjdGFuZ2xlIGluc2NyaWJlZCBpbnNpZGUgYSByaG9tYnVzIGlzXG4gICAgLy8gTWF0aC5yb3VuZCh3aWR0aCAvIDIpIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgICByZXR1cm4gTWF0aC5yb3VuZCh3aWR0aCAvIDIpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICByZXR1cm4gd2lkdGggLSBCT1VORF9URVhUX1BBRERJTkcgKiAyO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEJvdW5kVGV4dE1heEhlaWdodCA9IChcbiAgY29udGFpbmVyOiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgYm91bmRUZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50V2l0aENvbnRhaW5lcixcbikgPT4ge1xuICBjb25zdCBoZWlnaHQgPSBnZXRDb250YWluZXJEaW1zKGNvbnRhaW5lcikuaGVpZ2h0O1xuICBpZiAoaXNBcnJvd0VsZW1lbnQoY29udGFpbmVyKSkge1xuICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDggKiAyO1xuICAgIGlmIChjb250YWluZXJIZWlnaHQgPD0gMCkge1xuICAgICAgcmV0dXJuIGJvdW5kVGV4dEVsZW1lbnQuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gaGVpZ2h0O1xuICB9XG4gIGlmIChjb250YWluZXIudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSBsYXJnZXN0IHJlY3RhbmdsZSBpbnNjcmliZWQgaW5zaWRlIGFuIGVsbGlwc2UgaXNcbiAgICAvLyBNYXRoLnJvdW5kKChlbGxpcHNlLmhlaWdodCAvIDIpICogTWF0aC5zcXJ0KDIpKSB3aGljaCBpcyBkZXJpdmVkIGZyb21cbiAgICAvLyBlcXVhdGlvbiBvZiBhbiBlbGxpcHNlIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYxNzJcbiAgICByZXR1cm4gTWF0aC5yb3VuZCgoaGVpZ2h0IC8gMikgKiBNYXRoLnNxcnQoMikpIC0gQk9VTkRfVEVYVF9QQURESU5HICogMjtcbiAgfVxuICBpZiAoY29udGFpbmVyLnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgLy8gVGhlIGhlaWdodCBvZiB0aGUgbGFyZ2VzdCByZWN0YW5nbGUgaW5zY3JpYmVkIGluc2lkZSBhIHJob21idXMgaXNcbiAgICAvLyBNYXRoLnJvdW5kKGhlaWdodCAvIDIpIC0gaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9wdWxsLzYyNjVcbiAgICByZXR1cm4gTWF0aC5yb3VuZChoZWlnaHQgLyAyKSAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG4gIH1cbiAgcmV0dXJuIGhlaWdodCAtIEJPVU5EX1RFWFRfUEFERElORyAqIDI7XG59O1xuXG5leHBvcnQgY29uc3QgaXNNZWFzdXJlVGV4dFN1cHBvcnRlZCA9ICgpID0+IHtcbiAgY29uc3Qgd2lkdGggPSBnZXRUZXh0V2lkdGgoXG4gICAgRFVNTVlfVEVYVCxcbiAgICBnZXRGb250U3RyaW5nKHtcbiAgICAgIGZvbnRTaXplOiBERUZBVUxUX0ZPTlRfU0laRSxcbiAgICAgIGZvbnRGYW1pbHk6IERFRkFVTFRfRk9OVF9GQU1JTFksXG4gICAgfSksXG4gICk7XG4gIHJldHVybiB3aWR0aCA+IDA7XG59O1xuXG4vKipcbiAqIFVuaXRsZXNzIGxpbmUgaGVpZ2h0XG4gKlxuICogSW4gcHJldmlvdXMgdmVyc2lvbnMgd2UgdXNlZCBgbm9ybWFsYCBsaW5lIGhlaWdodCwgd2hpY2ggYnJvd3NlcnMgaW50ZXJwcmV0XG4gKiBkaWZmZXJlbnRseSwgYW5kIGJhc2VkIG9uIGZvbnQtZmFtaWx5IGFuZCBmb250LXNpemUuXG4gKlxuICogVG8gbWFrZSBsaW5lIGhlaWdodHMgY29uc2lzdGVudCBhY3Jvc3MgYnJvd3NlcnMgd2UgaGFyZGNvZGUgdGhlIHZhbHVlcyBmb3JcbiAqIGVhY2ggb2Ygb3VyIGZvbnRzIGJhc2VkIG9uIG1vc3QgY29tbW9uIGF2ZXJhZ2UgbGluZS1oZWlnaHRzLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC82MzYwI2lzc3VlY29tbWVudC0xNDc3NjM1OTcxXG4gKiB3aGVyZSB0aGUgdmFsdWVzIGNvbWUgZnJvbS5cbiAqL1xuY29uc3QgREVGQVVMVF9MSU5FX0hFSUdIVCA9IHtcbiAgLy8gfjEuMjUgaXMgdGhlIGF2ZXJhZ2UgZm9yIFZpcmdpbCBpbiBXZWJLaXQgYW5kIEJsaW5rLlxuICAvLyBHZWNrbyAoRkYpIHVzZXMgfjEuMjguXG4gIFtGT05UX0ZBTUlMWS5WaXJnaWxdOiAxLjI1IGFzIEV4Y2FsaWRyYXdUZXh0RWxlbWVudFtcImxpbmVIZWlnaHRcIl0sXG4gIC8vIH4xLjE1IGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluay5cbiAgLy8gR2Vja28gaWYgYWxsIG92ZXIgdGhlIHBsYWNlLlxuICBbRk9OVF9GQU1JTFkuSGVsdmV0aWNhXTogMS4xNSBhcyBFeGNhbGlkcmF3VGV4dEVsZW1lbnRbXCJsaW5lSGVpZ2h0XCJdLFxuICAvLyB+MS4yIGlzIHRoZSBhdmVyYWdlIGZvciBWaXJnaWwgaW4gV2ViS2l0IGFuZCBCbGluaywgYW5kIGtpbmRhIEdlY2tvIHRvb1xuICBbRk9OVF9GQU1JTFkuQ2FzY2FkaWFdOiAxLjIgYXMgRXhjYWxpZHJhd1RleHRFbGVtZW50W1wibGluZUhlaWdodFwiXSxcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREZWZhdWx0TGluZUhlaWdodCA9IChmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzKSA9PiB7XG4gIGlmIChmb250RmFtaWx5IGluIERFRkFVTFRfTElORV9IRUlHSFQpIHtcbiAgICByZXR1cm4gREVGQVVMVF9MSU5FX0hFSUdIVFtmb250RmFtaWx5XTtcbiAgfVxuICByZXR1cm4gREVGQVVMVF9MSU5FX0hFSUdIVFtERUZBVUxUX0ZPTlRfRkFNSUxZXTtcbn07XG5cbmV4cG9ydCBjb25zdCBiaW5kVGV4dFRvQ29udGFpbmVyID0gKFxuICBjb250YWluZXJQcm9wczpcbiAgICB8IHtcbiAgICAgICAgdHlwZTpcbiAgICAgICAgICB8IEV4Y2x1ZGU8RXhjYWxpZHJhd0dlbmVyaWNFbGVtZW50W1widHlwZVwiXSwgXCJzZWxlY3Rpb25cIj5cbiAgICAgICAgICB8IEV4Y2FsaWRyYXdMaW5lYXJFbGVtZW50W1widHlwZVwiXTtcbiAgICAgIH0gJiBNYXJrT3B0aW9uYWw8RWxlbWVudENvbnN0cnVjdG9yT3B0cywgXCJ4XCIgfCBcInlcIj4sXG4gIHRleHRQcm9wczogeyB0ZXh0OiBzdHJpbmcgfSAmIE1hcmtPcHRpb25hbDxFbGVtZW50Q29uc3RydWN0b3JPcHRzLCBcInhcIiB8IFwieVwiPixcbikgPT4ge1xuICBsZXQgY29udGFpbmVyO1xuICBpZiAoY29udGFpbmVyUHJvcHMudHlwZSA9PT0gXCJhcnJvd1wiKSB7XG4gICAgY29udGFpbmVyID0gbmV3TGluZWFyRWxlbWVudCh7XG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHg6IDAsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHk6IDAsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHR5cGU6IGNvbnRhaW5lclByb3BzLnR5cGUsXG4gICAgICAvL0B0cy1pZ25vcmUsXG4gICAgICBlbmRBcnJvd2hlYWQ6IGNvbnRhaW5lclByb3BzLnR5cGUgPT09IFwiYXJyb3dcIiA/IFwiYXJyb3dcIiA6IG51bGwsXG4gICAgICAvL0B0cy1pZ25vcmVcbiAgICAgIHBvaW50czogW1xuICAgICAgICBbMCwgMF0sXG4gICAgICAgIFszMDAsIDBdLFxuICAgICAgXSxcbiAgICAgIC4uLmNvbnRhaW5lclByb3BzLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vQHRzLWlnbm9yZVxuICAgIGNvbnRhaW5lciA9IG5ld0VsZW1lbnQoe1xuICAgICAgeDogMCxcbiAgICAgIHk6IDAsXG4gICAgICAuLi5jb250YWluZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxuICBjb25zdCB0ZXh0RWxlbWVudDogRXhjYWxpZHJhd1RleHRFbGVtZW50ID0gbmV3VGV4dEVsZW1lbnQoe1xuICAgIHg6IDAsXG4gICAgeTogMCxcbiAgICB0ZXh0QWxpZ246IFRFWFRfQUxJR04uQ0VOVEVSLFxuICAgIHZlcnRpY2FsQWxpZ246IFZFUlRJQ0FMX0FMSUdOLk1JRERMRSxcbiAgICAuLi50ZXh0UHJvcHMsXG4gICAgY29udGFpbmVySWQ6IGNvbnRhaW5lci5pZCxcbiAgfSk7XG5cbiAgbXV0YXRlRWxlbWVudChjb250YWluZXIsIHtcbiAgICBib3VuZEVsZW1lbnRzOiAoY29udGFpbmVyLmJvdW5kRWxlbWVudHMgfHwgW10pLmNvbmNhdCh7XG4gICAgICB0eXBlOiBcInRleHRcIixcbiAgICAgIGlkOiB0ZXh0RWxlbWVudC5pZCxcbiAgICB9KSxcbiAgfSk7XG5cbiAgcmVkcmF3VGV4dEJvdW5kaW5nQm94KHRleHRFbGVtZW50LCBjb250YWluZXIpO1xuXG4gIHJldHVybiBbY29udGFpbmVyLCB0ZXh0RWxlbWVudF07XG59O1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../element/textElement.ts\n");
|
|
3762
3762
|
|
|
3763
3763
|
/***/ }),
|
|
3764
3764
|
|
|
@@ -3989,7 +3989,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
3989
3989
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
3990
3990
|
|
|
3991
3991
|
"use strict";
|
|
3992
|
-
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.15.2-6546-
|
|
3992
|
+
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.15.2-6546-81bee8a\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLHFCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
|
|
3993
3993
|
|
|
3994
3994
|
/***/ }),
|
|
3995
3995
|
|
|
@@ -4110,7 +4110,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
|
|
|
4110
4110
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
4111
4111
|
|
|
4112
4112
|
"use strict";
|
|
4113
|
-
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, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\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: (opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON)\n ? (_a = opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) === null || _a === void 0 ? void 0 : _a.call(opts)\n : (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.15.2-6546-9e30320\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICBzY2FsZSxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4gIG9wdHM/OiB7XG4gICAgc2VyaWFsaXplQXNKU09OPzogKCkgPT4gc3RyaW5nO1xuICB9LFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBvcHRzPy5zZXJpYWxpemVBc0pTT05cbiAgICAgICAgICA/IG9wdHM/LnNlcmlhbGl6ZUFzSlNPTj8uKClcbiAgICAgICAgICA6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
4113
|
+
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, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\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: (opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON)\n ? (_a = opts === null || opts === void 0 ? void 0 : opts.serializeAsJSON) === null || _a === void 0 ? void 0 : _a.call(opts)\n : (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.15.2-6546-81bee8a\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFTLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUM3QyxDQUFDO0lBRUYsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvZXhwb3J0LnRzPzliZjciXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcyB9IGZyb20gXCIuLi9lbGVtZW50L2JvdW5kc1wiO1xuaW1wb3J0IHsgcmVuZGVyU2NlbmUsIHJlbmRlclNjZW5lVG9TdmcgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyU2NlbmVcIjtcbmltcG9ydCB7IGRpc3RhbmNlIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBBcHBTdGF0ZSwgQmluYXJ5RmlsZXMgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7IERFRkFVTFRfRVhQT1JUX1BBRERJTkcsIFNWR19OUywgVEhFTUVfRklMVEVSIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdEFwcFN0YXRlIH0gZnJvbSBcIi4uL2FwcFN0YXRlXCI7XG5pbXBvcnQgeyBzZXJpYWxpemVBc0pTT04gfSBmcm9tIFwiLi4vZGF0YS9qc29uXCI7XG5pbXBvcnQge1xuICBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMsXG4gIHVwZGF0ZUltYWdlQ2FjaGUsXG59IGZyb20gXCIuLi9lbGVtZW50L2ltYWdlXCI7XG5cbmV4cG9ydCBjb25zdCBTVkdfRVhQT1JUX1RBRyA9IGA8IS0tIHN2Zy1zb3VyY2U6ZXhjYWxpZHJhdyAtLT5gO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9DYW52YXMgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IEFwcFN0YXRlLFxuICBmaWxlczogQmluYXJ5RmlsZXMsXG4gIHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kLFxuICAgIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gIH06IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICB9LFxuICBjcmVhdGVDYW52YXM6IChcbiAgICB3aWR0aDogbnVtYmVyLFxuICAgIGhlaWdodDogbnVtYmVyLFxuICApID0+IHsgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudDsgc2NhbGU6IG51bWJlciB9ID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoICogYXBwU3RhdGUuZXhwb3J0U2NhbGU7XG4gICAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIHJldHVybiB7IGNhbnZhcywgc2NhbGU6IGFwcFN0YXRlLmV4cG9ydFNjYWxlIH07XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIHdpZHRoLCBoZWlnaHRdID0gZ2V0Q2FudmFzU2l6ZShlbGVtZW50cywgZXhwb3J0UGFkZGluZyk7XG5cbiAgY29uc3QgeyBjYW52YXMsIHNjYWxlID0gMSB9ID0gY3JlYXRlQ2FudmFzKHdpZHRoLCBoZWlnaHQpO1xuXG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuXG4gIGNvbnN0IHsgaW1hZ2VDYWNoZSB9ID0gYXdhaXQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50cykubWFwKFxuICAgICAgKGVsZW1lbnQpID0+IGVsZW1lbnQuZmlsZUlkLFxuICAgICksXG4gICAgZmlsZXMsXG4gIH0pO1xuXG4gIHJlbmRlclNjZW5lKHtcbiAgICBlbGVtZW50cyxcbiAgICBhcHBTdGF0ZSxcbiAgICBzY2FsZSxcbiAgICByYzogcm91Z2guY2FudmFzKGNhbnZhcyksXG4gICAgY2FudmFzLFxuICAgIHJlbmRlckNvbmZpZzoge1xuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICByZW1vdGVQb2ludGVyVmlld3BvcnRDb29yZHM6IHt9LFxuICAgICAgcmVtb3RlU2VsZWN0ZWRFbGVtZW50SWRzOiB7fSxcbiAgICAgIHNob3VsZENhY2hlSWdub3JlWm9vbTogZmFsc2UsXG4gICAgICByZW1vdGVQb2ludGVyVXNlcm5hbWVzOiB7fSxcbiAgICAgIHJlbW90ZVBvaW50ZXJVc2VyU3RhdGVzOiB7fSxcbiAgICAgIHRoZW1lOiBhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUgPyBcImRhcmtcIiA6IFwibGlnaHRcIixcbiAgICAgIGltYWdlQ2FjaGUsXG4gICAgICByZW5kZXJTY3JvbGxiYXJzOiBmYWxzZSxcbiAgICAgIHJlbmRlclNlbGVjdGlvbjogZmFsc2UsXG4gICAgICByZW5kZXJHcmlkOiBmYWxzZSxcbiAgICAgIGlzRXhwb3J0aW5nOiB0cnVlLFxuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBjYW52YXM7XG59O1xuXG5leHBvcnQgY29uc3QgZXhwb3J0VG9TdmcgPSBhc3luYyAoXG4gIGVsZW1lbnRzOiByZWFkb25seSBOb25EZWxldGVkRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgYXBwU3RhdGU6IHtcbiAgICBleHBvcnRCYWNrZ3JvdW5kOiBib29sZWFuO1xuICAgIGV4cG9ydFBhZGRpbmc/OiBudW1iZXI7XG4gICAgZXhwb3J0U2NhbGU/OiBudW1iZXI7XG4gICAgdmlld0JhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICAgIGV4cG9ydFdpdGhEYXJrTW9kZT86IGJvb2xlYW47XG4gICAgZXhwb3J0RW1iZWRTY2VuZT86IGJvb2xlYW47XG4gIH0sXG4gIGZpbGVzOiBCaW5hcnlGaWxlcyB8IG51bGwsXG4gIG9wdHM/OiB7XG4gICAgc2VyaWFsaXplQXNKU09OPzogKCkgPT4gc3RyaW5nO1xuICB9LFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBvcHRzPy5zZXJpYWxpemVBc0pTT05cbiAgICAgICAgICA/IG9wdHM/LnNlcmlhbGl6ZUFzSlNPTj8uKClcbiAgICAgICAgICA6IHNlcmlhbGl6ZUFzSlNPTihlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzIHx8IHt9LCBcImxvY2FsXCIpLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIC8vIGluaXRpYWxpemUgU1ZHIHJvb3RcbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG4gIGlmIChhcHBTdGF0ZS5leHBvcnRXaXRoRGFya01vZGUpIHtcbiAgICBzdmdSb290LnNldEF0dHJpYnV0ZShcImZpbHRlclwiLCBUSEVNRV9GSUxURVIpO1xuICB9XG5cbiAgbGV0IGFzc2V0UGF0aCA9IFwiaHR0cHM6Ly9leGNhbGlkcmF3LmNvbS9cIjtcblxuICAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcbiAgaWYgKHByb2Nlc3MuZW52LklTX0VYQ0FMSURSQVdfTlBNX1BBQ0tBR0UpIHtcbiAgICBhc3NldFBhdGggPVxuICAgICAgd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fFxuICAgICAgYGh0dHBzOi8vdW5wa2cuY29tLyR7cHJvY2Vzcy5lbnYuUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuUEtHX1ZFUlNJT059YDtcblxuICAgIGlmIChhc3NldFBhdGg/LnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuICAgIGFzc2V0UGF0aCA9IGAke2Fzc2V0UGF0aH0vZGlzdC9leGNhbGlkcmF3LWFzc2V0cy9gO1xuICB9XG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
|
|
4114
4114
|
|
|
4115
4115
|
/***/ }),
|
|
4116
4116
|
|