@excalidraw/excalidraw 0.17.1-7391-063c61e → 0.17.1-7391-e65bf53

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.
@@ -2485,7 +2485,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2485
2485
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2486
2486
 
2487
2487
  "use strict";
2488
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\n// place here categories that you want to track. We want to track just a\n// small subset of categories at a given time.\nconst ALLOWED_CATEGORIES_TO_TRACK = [\"ai\"];\nconst trackEvent = (category, action, label, value) => {\n try {\n // prettier-ignore\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.1-7391-063c61e\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).VITE_WORKER_ID // comment out to debug locally\n || \"development\" === \"production\") {\n return;\n }\n\n if (!ALLOWED_CATEGORIES_TO_TRACK.includes(category)) {\n return;\n }\n\n if (true) {\n console.info(\"trackEvent\", {\n category,\n action,\n label,\n value\n });\n }\n\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value\n });\n }\n } catch (error) {\n console.error(\"error during analytics\", error);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSx5Q0FBeUMsaXVDQUFXO0FBQ3BELE9BQU8sYUFBb0I7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxJQUF3QztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81NDIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHBsYWNlIGhlcmUgY2F0ZWdvcmllcyB0aGF0IHlvdSB3YW50IHRvIHRyYWNrLiBXZSB3YW50IHRvIHRyYWNrIGp1c3QgYVxuLy8gc21hbGwgc3Vic2V0IG9mIGNhdGVnb3JpZXMgYXQgYSBnaXZlbiB0aW1lLlxuY29uc3QgQUxMT1dFRF9DQVRFR09SSUVTX1RPX1RSQUNLID0gW1wiYWlcIl07XG5leHBvcnQgY29uc3QgdHJhY2tFdmVudCA9IChjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCBwcm9jZXNzLmVudi5WSVRFX1dPUktFUl9JRCAvLyBjb21tZW50IG91dCB0byBkZWJ1ZyBsb2NhbGx5XG4gICAgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFBTExPV0VEX0NBVEVHT1JJRVNfVE9fVFJBQ0suaW5jbHVkZXMoY2F0ZWdvcnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc29sZS5pbmZvKFwidHJhY2tFdmVudFwiLCB7XG4gICAgICAgIGNhdGVnb3J5LFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yIGR1cmluZyBhbmFseXRpY3NcIiwgZXJyb3IpO1xuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2488
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\n// place here categories that you want to track. We want to track just a\n// small subset of categories at a given time.\nconst ALLOWED_CATEGORIES_TO_TRACK = [\"ai\"];\nconst trackEvent = (category, action, label, value) => {\n try {\n // prettier-ignore\n if (typeof window === \"undefined\" || ({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.1-7391-e65bf53\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).VITE_WORKER_ID // comment out to debug locally\n || \"development\" === \"production\") {\n return;\n }\n\n if (!ALLOWED_CATEGORIES_TO_TRACK.includes(category)) {\n return;\n }\n\n if (true) {\n console.info(\"trackEvent\", {\n category,\n action,\n label,\n value\n });\n }\n\n if (window.sa_event) {\n window.sa_event(action, {\n category,\n label,\n value\n });\n }\n } catch (error) {\n console.error(\"error during analytics\", error);\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQSx5Q0FBeUMsaXVDQUFXO0FBQ3BELE9BQU8sYUFBb0I7QUFDM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUEsUUFBUSxJQUF3QztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQSxJQUFJO0FBQ0o7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL2FuYWx5dGljcy50cz81NDIxIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIHBsYWNlIGhlcmUgY2F0ZWdvcmllcyB0aGF0IHlvdSB3YW50IHRvIHRyYWNrLiBXZSB3YW50IHRvIHRyYWNrIGp1c3QgYVxuLy8gc21hbGwgc3Vic2V0IG9mIGNhdGVnb3JpZXMgYXQgYSBnaXZlbiB0aW1lLlxuY29uc3QgQUxMT1dFRF9DQVRFR09SSUVTX1RPX1RSQUNLID0gW1wiYWlcIl07XG5leHBvcnQgY29uc3QgdHJhY2tFdmVudCA9IChjYXRlZ29yeSwgYWN0aW9uLCBsYWJlbCwgdmFsdWUpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBwcmV0dGllci1pZ25vcmVcbiAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIiB8fCBwcm9jZXNzLmVudi5WSVRFX1dPUktFUl9JRCAvLyBjb21tZW50IG91dCB0byBkZWJ1ZyBsb2NhbGx5XG4gICAgfHwgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCFBTExPV0VEX0NBVEVHT1JJRVNfVE9fVFJBQ0suaW5jbHVkZXMoY2F0ZWdvcnkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKCEocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwicHJvZHVjdGlvblwiKSkge1xuICAgICAgY29uc29sZS5pbmZvKFwidHJhY2tFdmVudFwiLCB7XG4gICAgICAgIGNhdGVnb3J5LFxuICAgICAgICBhY3Rpb24sXG4gICAgICAgIGxhYmVsLFxuICAgICAgICB2YWx1ZVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5zYV9ldmVudCkge1xuICAgICAgd2luZG93LnNhX2V2ZW50KGFjdGlvbiwge1xuICAgICAgICBjYXRlZ29yeSxcbiAgICAgICAgbGFiZWwsXG4gICAgICAgIHZhbHVlXG4gICAgICB9KTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcImVycm9yIGR1cmluZyBhbmFseXRpY3NcIiwgZXJyb3IpO1xuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2489
2489
 
2490
2490
  /***/ }),
2491
2491
 
@@ -4157,7 +4157,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4157
4157
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4158
4158
 
4159
4159
  "use strict";
4160
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ElementBounds\": () => (/* binding */ ElementBounds),\n/* harmony export */ \"getArrowheadAngle\": () => (/* binding */ getArrowheadAngle),\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getArrowheadSize\": () => (/* binding */ getArrowheadSize),\n/* harmony export */ \"getBoundsFromPoints\": () => (/* binding */ getBoundsFromPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getDraggedElementsBounds\": () => (/* binding */ getDraggedElementsBounds),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementLineSegments\": () => (/* binding */ getElementLineSegments),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getMinMaxXYFromCurvePathOps\": () => (/* binding */ getMinMaxXYFromCurvePathOps),\n/* harmony export */ \"getRectangleBoxAbsoluteCoords\": () => (/* binding */ getRectangleBoxAbsoluteCoords),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _scene_Shape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Shape */ \"../../scene/Shape.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene_ShapeCache__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene/ShapeCache */ \"../../scene/ShapeCache.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n\n\n\n\n\n\n\n\n\nclass ElementBounds {\n static getBounds(element) {\n const cachedBounds = ElementBounds.boundsCache.get(element);\n\n if ((cachedBounds === null || cachedBounds === void 0 ? void 0 : cachedBounds.version) && cachedBounds.version === element.version && // we don't invalidate cache when we update containers and not labels,\n // which is causing problems down the line. Fix TBA.\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n return cachedBounds.bounds;\n }\n\n const bounds = ElementBounds.calculateBounds(element); // hack to ensure that downstream checks could retrieve element Scene\n // so as to have correctly calculated bounds\n // FIXME remove when we get rid of all the id:Scene / element:Scene mapping\n\n const shouldCache = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element);\n\n if (shouldCache) {\n ElementBounds.boundsCache.set(element, {\n version: element.version,\n bounds\n });\n }\n\n return bounds;\n }\n\n static calculateBounds(element) {\n let bounds;\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [minX + element.x, minY + element.y, maxX + element.x, maxY + element.y];\n } else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n } else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n } else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n } else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n\n return bounds;\n }\n\n}\nElementBounds.boundsCache = new WeakMap(); // Scene -> Scene coords, but in x1,x2,y1,y2 format.\n//\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\n\nconst getElementAbsoluteCoords = (element, includeBoundText = false) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n } else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getElementAbsoluteCoords(element, includeBoundText);\n } else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getContainerElement)(element);\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const coords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, element);\n return [coords.x, coords.y, coords.x + element.width, coords.y + element.height, coords.x + element.width / 2, coords.y + element.height / 2];\n }\n }\n\n return [element.x, element.y, element.x + element.width, element.y + element.height, element.x + element.width / 2, element.y + element.height / 2];\n};\n/*\n * for a given element, `getElementLineSegments` returns line segments\n * that can be used for visual collision detection (useful for frames)\n * as opposed to bounding box collision detection\n */\n\nconst getElementLineSegments = element => {\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n const center = [cx, cy];\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const segments = [];\n let i = 0;\n\n while (i < element.points.length - 1) {\n segments.push([(0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([element.points[i][0] + element.x, element.points[i][1] + element.y], center, element.angle), (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([element.points[i + 1][0] + element.x, element.points[i + 1][1] + element.y], center, element.angle)]);\n i++;\n }\n\n return segments;\n }\n\n const [nw, ne, sw, se, n, s, w, e] = [[x1, y1], [x2, y1], [x1, y2], [x2, y2], [cx, y1], [cx, y2], [x1, cy], [x2, cy]].map(point => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)(point, center, element.angle));\n\n if (element.type === \"diamond\") {\n return [[n, w], [n, e], [s, w], [s, e]];\n }\n\n if (element.type === \"ellipse\") {\n return [[n, w], [n, e], [s, w], [s, e], [n, w], [n, e], [s, w], [s, e]];\n }\n\n return [[nw, ne], [sw, se], [nw, sw], [ne, se], [nw, e], [sw, e], [ne, w], [se, w]];\n};\n/**\n * Scene -> Scene coords, but in x1,x2,y1,y2 format.\n *\n * Rectangle here means any rectangular frame, not an excalidraw element.\n */\n\nconst getRectangleBoxAbsoluteCoords = boxSceneCoords => {\n return [boxSceneCoords.x, boxSceneCoords.y, boxSceneCoords.x + boxSceneCoords.width, boxSceneCoords.y + boxSceneCoords.height, boxSceneCoords.x + boxSceneCoords.width / 2, boxSceneCoords.y + boxSceneCoords.height / 2];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = element => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = shape => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n\n return shape.sets[0].ops;\n}; // reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\n\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return Math.pow(oneMinusT, 3) * p0 + 3 * Math.pow(oneMinusT, 2) * t * p1 + 3 * oneMinusT * Math.pow(t, 2) * p2 + Math.pow(t, 3) * p3;\n};\n\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n\n if (!hasSolution) {\n return false;\n }\n\n let s1 = null;\n let s2 = null;\n let t1 = Infinity;\n let t2 = Infinity;\n\n if (a === 0) {\n t1 = t2 = -c / b;\n } else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n\n return [s1, s2];\n};\n\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n\n if (solX) {\n const xs = solX.filter(x => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n\n if (solY) {\n const ys = solY.filter(y => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const {\n minX,\n minY,\n maxX,\n maxY\n } = ops.reduce((limits, {\n op,\n data\n }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data; // move operation does not draw anything; so, it always\n // returns false\n } else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n } else if (op === \"lineTo\") {// TODO: Implement this\n } else if (op === \"qcurveTo\") {// TODO: Implement this\n }\n\n return limits;\n }, {\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = points => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getFreeDrawElementAbsoluteCoords = element => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n const x1 = minX + element.x;\n const y1 = minY + element.y;\n const x2 = maxX + element.x;\n const y2 = maxY + element.y;\n return [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2];\n};\n/** @returns number in pixels */\n\n\nconst getArrowheadSize = arrowhead => {\n switch (arrowhead) {\n case \"arrow\":\n case \"uml_arrow\":\n return 25;\n\n case \"uml_diamond\":\n case \"uml_diamond_filled\":\n return 12;\n\n default:\n return 15;\n }\n};\n/** @returns number in degrees */\n\nconst getArrowheadAngle = arrowhead => {\n switch (arrowhead) {\n case \"bar\":\n return 90;\n\n case \"arrow\":\n case \"uml_arrow\":\n return 20;\n\n default:\n return 25;\n }\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n\n if (ops.length < 1) {\n return null;\n } // The index of the bCurve operation to examine.\n\n\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]]; // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n } else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n } // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n\n\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] + 3 * t * Math.pow(1 - t, 2) * p2[idx] + 3 * Math.pow(t, 2) * (1 - t) * p1[idx] + p0[idx] * Math.pow(t, 3); // Ee know the last point of the arrow (or the first, if start arrowhead).\n\n\n const [x2, y2] = position === \"start\" ? p0 : p3; // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)]; // Find the normalized direction vector based on the\n // previously calculated points.\n\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = getArrowheadSize(arrowhead);\n let length = 0;\n {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = position === \"end\" ? element.points[element.points.length - 1] : element.points[0];\n const [px, py] = element.points.length > 1 ? position === \"end\" ? element.points[element.points.length - 2] : element.points[1] : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n } // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n\n const lengthMultiplier = arrowhead === \"uml_diamond\" || arrowhead === \"uml_diamond_filled\" ? 0.25 : 0.5;\n const minSize = Math.min(size, length * lengthMultiplier);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n\n const angle = getArrowheadAngle(arrowhead); // Return points\n\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, -angle * Math.PI / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, angle * Math.PI / 180);\n\n if (arrowhead === \"uml_diamond\" || arrowhead === \"uml_diamond_filled\") {\n // point opposite to the arrowhead point\n let ox;\n let oy;\n\n if (position === \"start\") {\n const [px, py] = element.points.length > 1 ? element.points[1] : [0, 0];\n [ox, oy] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2 + minSize * 2, y2, x2, y2, Math.atan2(py - y2, px - x2));\n } else {\n const [px, py] = element.points.length > 1 ? element.points[element.points.length - 2] : [0, 0];\n [ox, oy] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2 - minSize * 2, y2, x2, y2, Math.atan2(y2 - py, x2 - px));\n }\n\n return [x2, y2, x3, y3, ox, oy, x4, y4];\n }\n\n return [x2, y2, x3, y3, x4, y4];\n};\n\nconst generateLinearElementShape = element => {\n const generator = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const options = (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element);\n\n const method = (() => {\n if (element.roundness) {\n return \"curve\";\n }\n\n if (options.fill) {\n return \"polygon\";\n }\n\n return \"linearPath\";\n })();\n\n return generator[method](element.points, options);\n};\n\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n var _a;\n\n if (element.points.length < 2) {\n const [pointX, pointY] = element.points[0];\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + pointX, element.y + pointY, cx, cy, element.angle);\n let coords = [x, y, x, y];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, [x, y, x, y], boundTextElement);\n coords = [coordsWithBoundText[0], coordsWithBoundText[1], coordsWithBoundText[2], coordsWithBoundText[3]];\n }\n\n return coords;\n } // first element is always the curve\n\n\n const cachedShape = (_a = _scene_ShapeCache__WEBPACK_IMPORTED_MODULE_7__.ShapeCache.get(element)) === null || _a === void 0 ? void 0 : _a[0];\n const shape = cachedShape !== null && cachedShape !== void 0 ? cachedShape : generateLinearElementShape(element);\n const ops = getCurvePathOps(shape);\n\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n\n const res = getMinMaxXYFromCurvePathOps(ops, transformXY);\n let coords = [res[0], res[1], res[2], res[3]];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, coords, boundTextElement);\n coords = [coordsWithBoundText[0], coordsWithBoundText[1], coordsWithBoundText[2], coordsWithBoundText[3]];\n }\n\n return coords;\n};\n\nconst getElementBounds = element => {\n return ElementBounds.getBounds(element);\n};\nconst getCommonBounds = elements => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach(element => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getDraggedElementsBounds = (elements, dragOffset) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return [minX + dragOffset.x, minY + dragOffset.y, maxX + dragOffset.x, maxY + dragOffset.y];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [element.x, element.y, element.x + nextWidth, element.y + nextHeight];\n }\n\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n } else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = !element.roundness ? gen.linearPath(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element)) : gen.curve(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n\n const [minX, minY, maxX, maxY] = bounds;\n return [minX + element.x, minY + element.y, maxX + element.x, maxY + element.y];\n};\nconst getElementPointsCoords = (element, points) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.roundness == null ? gen.linearPath(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element)) : gen.curve(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [minX + element.x, minY + element.y, maxX + element.x, maxY + element.y];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach(element => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = elements => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDhGQUE0QztBQUM5RTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7O0FBR0osNEJBQTRCLDZEQUFjO0FBQzFDO0FBQ0E7O0FBRUEsZ0NBQWdDLDZDQUFNOztBQUV0QztBQUNBO0FBQ0EsMkJBQTJCLGlFQUFtQjs7QUFFOUM7QUFDQSxnQ0FBZ0MsOEZBQTRDO0FBQzVFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQLFFBQVEsNERBQWUsYUFBYSw4REFBaUI7QUFDckQ7QUFDQTs7QUFFQSxpQkFBaUIsc0RBQWEsZUFBZSxzREFBYTtBQUMxRDs7QUFFQSxNQUFNLDhEQUFpQjtBQUN2QjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsZ0JBQWdCLG1FQUFlO0FBQy9CLDhEQUE4RCxrRUFBb0IsK0JBQStCLGtFQUFvQjtBQUNySTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGNBQWMsbUVBQWU7QUFDN0IsbUVBQW1FLGtFQUFvQiwrQkFBK0Isa0VBQW9CO0FBQzFJO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaURBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2JvdW5kcy50cz9mY2EwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3RhbmNlMmQsIHJvdGF0ZSwgcm90YXRlUG9pbnQgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVSb3VnaE9wdGlvbnMgfSBmcm9tIFwiLi4vc2NlbmUvU2hhcGVcIjtcbmltcG9ydCB7IGlzQXJyb3dFbGVtZW50LCBpc0JvdW5kVG9Db250YWluZXIsIGlzRnJlZURyYXdFbGVtZW50LCBpc0xpbmVhckVsZW1lbnQsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyByZXNjYWxlUG9pbnRzIH0gZnJvbSBcIi4uL3BvaW50c1wiO1xuaW1wb3J0IHsgZ2V0Qm91bmRUZXh0RWxlbWVudCwgZ2V0Q29udGFpbmVyRWxlbWVudCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgU2hhcGVDYWNoZSB9IGZyb20gXCIuLi9zY2VuZS9TaGFwZUNhY2hlXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5leHBvcnQgY2xhc3MgRWxlbWVudEJvdW5kcyB7XG4gIHN0YXRpYyBnZXRCb3VuZHMoZWxlbWVudCkge1xuICAgIGNvbnN0IGNhY2hlZEJvdW5kcyA9IEVsZW1lbnRCb3VuZHMuYm91bmRzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xuXG4gICAgaWYgKChjYWNoZWRCb3VuZHMgPT09IG51bGwgfHwgY2FjaGVkQm91bmRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWNoZWRCb3VuZHMudmVyc2lvbikgJiYgY2FjaGVkQm91bmRzLnZlcnNpb24gPT09IGVsZW1lbnQudmVyc2lvbiAmJiAvLyB3ZSBkb24ndCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gd2UgdXBkYXRlIGNvbnRhaW5lcnMgYW5kIG5vdCBsYWJlbHMsXG4gICAgLy8gd2hpY2ggaXMgY2F1c2luZyBwcm9ibGVtcyBkb3duIHRoZSBsaW5lLiBGaXggVEJBLlxuICAgICFpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBjYWNoZWRCb3VuZHMuYm91bmRzO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kcyA9IEVsZW1lbnRCb3VuZHMuY2FsY3VsYXRlQm91bmRzKGVsZW1lbnQpOyAvLyBoYWNrIHRvIGVuc3VyZSB0aGF0IGRvd25zdHJlYW0gY2hlY2tzIGNvdWxkIHJldHJpZXZlIGVsZW1lbnQgU2NlbmVcbiAgICAvLyBzbyBhcyB0byBoYXZlIGNvcnJlY3RseSBjYWxjdWxhdGVkIGJvdW5kc1xuICAgIC8vIEZJWE1FIHJlbW92ZSB3aGVuIHdlIGdldCByaWQgb2YgYWxsIHRoZSBpZDpTY2VuZSAvIGVsZW1lbnQ6U2NlbmUgbWFwcGluZ1xuXG4gICAgY29uc3Qgc2hvdWxkQ2FjaGUgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KTtcblxuICAgIGlmIChzaG91bGRDYWNoZSkge1xuICAgICAgRWxlbWVudEJvdW5kcy5ib3VuZHNDYWNoZS5zZXQoZWxlbWVudCwge1xuICAgICAgICB2ZXJzaW9uOiBlbGVtZW50LnZlcnNpb24sXG4gICAgICAgIGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxuXG4gIHN0YXRpYyBjYWxjdWxhdGVCb3VuZHMoZWxlbWVudCkge1xuICAgIGxldCBib3VuZHM7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCBjeCwgY3ldID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuXG4gICAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRCb3VuZHNGcm9tUG9pbnRzKGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldKSA9PiByb3RhdGUoeCwgeSwgY3ggLSBlbGVtZW50LngsIGN5IC0gZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlKSkpO1xuICAgICAgcmV0dXJuIFttaW5YICsgZWxlbWVudC54LCBtaW5ZICsgZWxlbWVudC55LCBtYXhYICsgZWxlbWVudC54LCBtYXhZICsgZWxlbWVudC55XTtcbiAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgYm91bmRzID0gZ2V0TGluZWFyRWxlbWVudFJvdGF0ZWRCb3VuZHMoZWxlbWVudCwgY3gsIGN5KTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAgIGNvbnN0IFt4MTEsIHkxMV0gPSByb3RhdGUoY3gsIHkxLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZShjeCwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBbeDIyLCB5MjJdID0gcm90YXRlKHgxLCBjeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGNvbnN0IFt4MjEsIHkyMV0gPSByb3RhdGUoeDIsIGN5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgICBib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgICBjb25zdCB3ID0gKHgyIC0geDEpIC8gMjtcbiAgICAgIGNvbnN0IGggPSAoeTIgLSB5MSkgLyAyO1xuICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGNvbnN0IHd3ID0gTWF0aC5oeXBvdCh3ICogY29zLCBoICogc2luKTtcbiAgICAgIGNvbnN0IGhoID0gTWF0aC5oeXBvdChoICogY29zLCB3ICogc2luKTtcbiAgICAgIGJvdW5kcyA9IFtjeCAtIHd3LCBjeSAtIGhoLCBjeCArIHd3LCBjeSArIGhoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZSh4MSwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBbeDEyLCB5MTJdID0gcm90YXRlKHgxLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGNvbnN0IFt4MjIsIHkyMl0gPSByb3RhdGUoeDIsIHkyLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICAgIGJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmRzO1xuICB9XG5cbn1cbkVsZW1lbnRCb3VuZHMuYm91bmRzQ2FjaGUgPSBuZXcgV2Vha01hcCgpOyAvLyBTY2VuZSAtPiBTY2VuZSBjb29yZHMsIGJ1dCBpbiB4MSx4Mix5MSx5MiBmb3JtYXQuXG4vL1xuLy8gSWYgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoZSB3aWR0aCBpcyBnb2luZyB0byBiZSBuZWdhdGl2ZVxuLy8gVGhpcyBzZXQgb2YgZnVuY3Rpb25zIHJldHJpZXZlcyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIDQgcG9pbnRzLlxuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzID0gKGVsZW1lbnQsIGluY2x1ZGVCb3VuZFRleHQgPSBmYWxzZSkgPT4ge1xuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQsIGluY2x1ZGVCb3VuZFRleHQpO1xuICB9IGVsc2UgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKGNvbnRhaW5lciwgZWxlbWVudCk7XG4gICAgICByZXR1cm4gW2Nvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnggKyBlbGVtZW50LndpZHRoLCBjb29yZHMueSArIGVsZW1lbnQuaGVpZ2h0LCBjb29yZHMueCArIGVsZW1lbnQud2lkdGggLyAyLCBjb29yZHMueSArIGVsZW1lbnQuaGVpZ2h0IC8gMl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtlbGVtZW50LngsIGVsZW1lbnQueSwgZWxlbWVudC54ICsgZWxlbWVudC53aWR0aCwgZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQsIGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyLCBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCAvIDJdO1xufTtcbi8qXG4gKiBmb3IgYSBnaXZlbiBlbGVtZW50LCBgZ2V0RWxlbWVudExpbmVTZWdtZW50c2AgcmV0dXJucyBsaW5lIHNlZ21lbnRzXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2aXN1YWwgY29sbGlzaW9uIGRldGVjdGlvbiAodXNlZnVsIGZvciBmcmFtZXMpXG4gKiBhcyBvcHBvc2VkIHRvIGJvdW5kaW5nIGJveCBjb2xsaXNpb24gZGV0ZWN0aW9uXG4gKi9cblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRMaW5lU2VnbWVudHMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCBjeCwgY3ldID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjZW50ZXIgPSBbY3gsIGN5XTtcblxuICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBsZXQgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goW3JvdGF0ZVBvaW50KFtlbGVtZW50LnBvaW50c1tpXVswXSArIGVsZW1lbnQueCwgZWxlbWVudC5wb2ludHNbaV1bMV0gKyBlbGVtZW50LnldLCBjZW50ZXIsIGVsZW1lbnQuYW5nbGUpLCByb3RhdGVQb2ludChbZWxlbWVudC5wb2ludHNbaSArIDFdWzBdICsgZWxlbWVudC54LCBlbGVtZW50LnBvaW50c1tpICsgMV1bMV0gKyBlbGVtZW50LnldLCBjZW50ZXIsIGVsZW1lbnQuYW5nbGUpXSk7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgY29uc3QgW253LCBuZSwgc3csIHNlLCBuLCBzLCB3LCBlXSA9IFtbeDEsIHkxXSwgW3gyLCB5MV0sIFt4MSwgeTJdLCBbeDIsIHkyXSwgW2N4LCB5MV0sIFtjeCwgeTJdLCBbeDEsIGN5XSwgW3gyLCBjeV1dLm1hcChwb2ludCA9PiByb3RhdGVQb2ludChwb2ludCwgY2VudGVyLCBlbGVtZW50LmFuZ2xlKSk7XG5cbiAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICByZXR1cm4gW1tuLCB3XSwgW24sIGVdLCBbcywgd10sIFtzLCBlXV07XG4gIH1cblxuICBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIHJldHVybiBbW24sIHddLCBbbiwgZV0sIFtzLCB3XSwgW3MsIGVdLCBbbiwgd10sIFtuLCBlXSwgW3MsIHddLCBbcywgZV1dO1xuICB9XG5cbiAgcmV0dXJuIFtbbncsIG5lXSwgW3N3LCBzZV0sIFtudywgc3ddLCBbbmUsIHNlXSwgW253LCBlXSwgW3N3LCBlXSwgW25lLCB3XSwgW3NlLCB3XV07XG59O1xuLyoqXG4gKiBTY2VuZSAtPiBTY2VuZSBjb29yZHMsIGJ1dCBpbiB4MSx4Mix5MSx5MiBmb3JtYXQuXG4gKlxuICogUmVjdGFuZ2xlIGhlcmUgbWVhbnMgYW55IHJlY3Rhbmd1bGFyIGZyYW1lLCBub3QgYW4gZXhjYWxpZHJhdyBlbGVtZW50LlxuICovXG5cbmV4cG9ydCBjb25zdCBnZXRSZWN0YW5nbGVCb3hBYnNvbHV0ZUNvb3JkcyA9IGJveFNjZW5lQ29vcmRzID0+IHtcbiAgcmV0dXJuIFtib3hTY2VuZUNvb3Jkcy54LCBib3hTY2VuZUNvb3Jkcy55LCBib3hTY2VuZUNvb3Jkcy54ICsgYm94U2NlbmVDb29yZHMud2lkdGgsIGJveFNjZW5lQ29vcmRzLnkgKyBib3hTY2VuZUNvb3Jkcy5oZWlnaHQsIGJveFNjZW5lQ29vcmRzLnggKyBib3hTY2VuZUNvb3Jkcy53aWR0aCAvIDIsIGJveFNjZW5lQ29vcmRzLnkgKyBib3hTY2VuZUNvb3Jkcy5oZWlnaHQgLyAyXTtcbn07XG5leHBvcnQgY29uc3QgcG9pbnRSZWxhdGl2ZVRvID0gKGVsZW1lbnQsIGFic29sdXRlQ29vcmRzKSA9PiB7XG4gIHJldHVybiBbYWJzb2x1dGVDb29yZHNbMF0gLSBlbGVtZW50LngsIGFic29sdXRlQ29vcmRzWzFdIC0gZWxlbWVudC55XTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGlhbW9uZFBvaW50cyA9IGVsZW1lbnQgPT4ge1xuICAvLyBIZXJlIHdlIGFkZCArMSB0byBhdm9pZCB0aGVzZSBudW1iZXJzIHRvIGJlIDBcbiAgLy8gb3RoZXJ3aXNlIHJvdWdoLmpzIHdpbGwgdGhyb3cgYW4gZXJyb3IgY29tcGxhaW5pbmcgYWJvdXQgaXRcbiAgY29uc3QgdG9wWCA9IE1hdGguZmxvb3IoZWxlbWVudC53aWR0aCAvIDIpICsgMTtcbiAgY29uc3QgdG9wWSA9IDA7XG4gIGNvbnN0IHJpZ2h0WCA9IGVsZW1lbnQud2lkdGg7XG4gIGNvbnN0IHJpZ2h0WSA9IE1hdGguZmxvb3IoZWxlbWVudC5oZWlnaHQgLyAyKSArIDE7XG4gIGNvbnN0IGJvdHRvbVggPSB0b3BYO1xuICBjb25zdCBib3R0b21ZID0gZWxlbWVudC5oZWlnaHQ7XG4gIGNvbnN0IGxlZnRYID0gMDtcbiAgY29uc3QgbGVmdFkgPSByaWdodFk7XG4gIHJldHVybiBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV07XG59O1xuZXhwb3J0IGNvbnN0IGdldEN1cnZlUGF0aE9wcyA9IHNoYXBlID0+IHtcbiAgZm9yIChjb25zdCBzZXQgb2Ygc2hhcGUuc2V0cykge1xuICAgIGlmIChzZXQudHlwZSA9PT0gXCJwYXRoXCIpIHtcbiAgICAgIHJldHVybiBzZXQub3BzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaGFwZS5zZXRzWzBdLm9wcztcbn07IC8vIHJlZmVyZW5jZTogaHR0cHM6Ly9lbGlvdC1qb25lcy5jb20vMjAxOS8xMi9jdWJpYy1iZXppZXItY3VydmUtYm91bmRpbmctYm94ZXNcblxuY29uc3QgZ2V0QmV6aWVyVmFsdWVGb3JUID0gKHQsIHAwLCBwMSwgcDIsIHAzKSA9PiB7XG4gIGNvbnN0IG9uZU1pbnVzVCA9IDEgLSB0O1xuICByZXR1cm4gTWF0aC5wb3cob25lTWludXNULCAzKSAqIHAwICsgMyAqIE1hdGgucG93KG9uZU1pbnVzVCwgMikgKiB0ICogcDEgKyAzICogb25lTWludXNUICogTWF0aC5wb3codCwgMikgKiBwMiArIE1hdGgucG93KHQsIDMpICogcDM7XG59O1xuXG5jb25zdCBzb2x2ZVF1YWRyYXRpYyA9IChwMCwgcDEsIHAyLCBwMykgPT4ge1xuICBjb25zdCBpID0gcDEgLSBwMDtcbiAgY29uc3QgaiA9IHAyIC0gcDE7XG4gIGNvbnN0IGsgPSBwMyAtIHAyO1xuICBjb25zdCBhID0gMyAqIGkgLSA2ICogaiArIDMgKiBrO1xuICBjb25zdCBiID0gNiAqIGogLSA2ICogaTtcbiAgY29uc3QgYyA9IDMgKiBpO1xuICBjb25zdCBzcXJ0UGFydCA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBjb25zdCBoYXNTb2x1dGlvbiA9IHNxcnRQYXJ0ID49IDA7XG5cbiAgaWYgKCFoYXNTb2x1dGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBzMSA9IG51bGw7XG4gIGxldCBzMiA9IG51bGw7XG4gIGxldCB0MSA9IEluZmluaXR5O1xuICBsZXQgdDIgPSBJbmZpbml0eTtcblxuICBpZiAoYSA9PT0gMCkge1xuICAgIHQxID0gdDIgPSAtYyAvIGI7XG4gIH0gZWxzZSB7XG4gICAgdDEgPSAoLWIgKyBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gICAgdDIgPSAoLWIgLSBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gIH1cblxuICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgczEgPSBnZXRCZXppZXJWYWx1ZUZvclQodDEsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIGlmICh0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICBzMiA9IGdldEJlemllclZhbHVlRm9yVCh0MiwgcDAsIHAxLCBwMiwgcDMpO1xuICB9XG5cbiAgcmV0dXJuIFtzMSwgczJdO1xufTtcblxuY29uc3QgZ2V0Q3ViaWNCZXppZXJDdXJ2ZUJvdW5kID0gKHAwLCBwMSwgcDIsIHAzKSA9PiB7XG4gIGNvbnN0IHNvbFggPSBzb2x2ZVF1YWRyYXRpYyhwMFswXSwgcDFbMF0sIHAyWzBdLCBwM1swXSk7XG4gIGNvbnN0IHNvbFkgPSBzb2x2ZVF1YWRyYXRpYyhwMFsxXSwgcDFbMV0sIHAyWzFdLCBwM1sxXSk7XG4gIGxldCBtaW5YID0gTWF0aC5taW4ocDBbMF0sIHAzWzBdKTtcbiAgbGV0IG1heFggPSBNYXRoLm1heChwMFswXSwgcDNbMF0pO1xuXG4gIGlmIChzb2xYKSB7XG4gICAgY29uc3QgeHMgPSBzb2xYLmZpbHRlcih4ID0+IHggIT09IG51bGwpO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCAuLi54cyk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIC4uLnhzKTtcbiAgfVxuXG4gIGxldCBtaW5ZID0gTWF0aC5taW4ocDBbMV0sIHAzWzFdKTtcbiAgbGV0IG1heFkgPSBNYXRoLm1heChwMFsxXSwgcDNbMV0pO1xuXG4gIGlmIChzb2xZKSB7XG4gICAgY29uc3QgeXMgPSBzb2xZLmZpbHRlcih5ID0+IHkgIT09IG51bGwpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCAuLi55cyk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIC4uLnlzKTtcbiAgfVxuXG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzID0gKG9wcywgdHJhbnNmb3JtWFkpID0+IHtcbiAgbGV0IGN1cnJlbnRQID0gWzAsIDBdO1xuICBjb25zdCB7XG4gICAgbWluWCxcbiAgICBtaW5ZLFxuICAgIG1heFgsXG4gICAgbWF4WVxuICB9ID0gb3BzLnJlZHVjZSgobGltaXRzLCB7XG4gICAgb3AsXG4gICAgZGF0YVxuICB9KSA9PiB7XG4gICAgLy8gVGhlcmUgYXJlIG9ubHkgZm91ciBvcGVyYXRpb24gdHlwZXM6XG4gICAgLy8gbW92ZSwgYmN1cnZlVG8sIGxpbmVUbywgYW5kIGN1cnZlVG9cbiAgICBpZiAob3AgPT09IFwibW92ZVwiKSB7XG4gICAgICAvLyBjaGFuZ2Ugc3RhcnRpbmcgcG9pbnRcbiAgICAgIGN1cnJlbnRQID0gZGF0YTsgLy8gbW92ZSBvcGVyYXRpb24gZG9lcyBub3QgZHJhdyBhbnl0aGluZzsgc28sIGl0IGFsd2F5c1xuICAgICAgLy8gcmV0dXJucyBmYWxzZVxuICAgIH0gZWxzZSBpZiAob3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgICAgY29uc3QgX3AxID0gW2RhdGFbMF0sIGRhdGFbMV1dO1xuICAgICAgY29uc3QgX3AyID0gW2RhdGFbMl0sIGRhdGFbM11dO1xuICAgICAgY29uc3QgX3AzID0gW2RhdGFbNF0sIGRhdGFbNV1dO1xuICAgICAgY29uc3QgcDEgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMSkgOiBfcDE7XG4gICAgICBjb25zdCBwMiA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AyKSA6IF9wMjtcbiAgICAgIGNvbnN0IHAzID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDMpIDogX3AzO1xuICAgICAgY29uc3QgcDAgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLmN1cnJlbnRQKSA6IGN1cnJlbnRQO1xuICAgICAgY3VycmVudFAgPSBfcDM7XG4gICAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDdWJpY0JlemllckN1cnZlQm91bmQocDAsIHAxLCBwMiwgcDMpO1xuICAgICAgbGltaXRzLm1pblggPSBNYXRoLm1pbihsaW1pdHMubWluWCwgbWluWCk7XG4gICAgICBsaW1pdHMubWluWSA9IE1hdGgubWluKGxpbWl0cy5taW5ZLCBtaW5ZKTtcbiAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIG1heFgpO1xuICAgICAgbGltaXRzLm1heFkgPSBNYXRoLm1heChsaW1pdHMubWF4WSwgbWF4WSk7XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gXCJsaW5lVG9cIikgey8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgfSBlbHNlIGlmIChvcCA9PT0gXCJxY3VydmVUb1wiKSB7Ly8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gbGltaXRzO1xuICB9LCB7XG4gICAgbWluWDogSW5maW5pdHksXG4gICAgbWluWTogSW5maW5pdHksXG4gICAgbWF4WDogLUluZmluaXR5LFxuICAgIG1heFk6IC1JbmZpbml0eVxuICB9KTtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Qm91bmRzRnJvbVBvaW50cyA9IHBvaW50cyA9PiB7XG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwb2ludHMpIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gIGNvbnN0IHgxID0gbWluWCArIGVsZW1lbnQueDtcbiAgY29uc3QgeTEgPSBtaW5ZICsgZWxlbWVudC55O1xuICBjb25zdCB4MiA9IG1heFggKyBlbGVtZW50Lng7XG4gIGNvbnN0IHkyID0gbWF4WSArIGVsZW1lbnQueTtcbiAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiwgKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMl07XG59O1xuLyoqIEByZXR1cm5zIG51bWJlciBpbiBwaXhlbHMgKi9cblxuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkU2l6ZSA9IGFycm93aGVhZCA9PiB7XG4gIHN3aXRjaCAoYXJyb3doZWFkKSB7XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgY2FzZSBcInVtbF9hcnJvd1wiOlxuICAgICAgcmV0dXJuIDI1O1xuXG4gICAgY2FzZSBcInVtbF9kaWFtb25kXCI6XG4gICAgY2FzZSBcInVtbF9kaWFtb25kX2ZpbGxlZFwiOlxuICAgICAgcmV0dXJuIDEyO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAxNTtcbiAgfVxufTtcbi8qKiBAcmV0dXJucyBudW1iZXIgaW4gZGVncmVlcyAqL1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkQW5nbGUgPSBhcnJvd2hlYWQgPT4ge1xuICBzd2l0Y2ggKGFycm93aGVhZCkge1xuICAgIGNhc2UgXCJiYXJcIjpcbiAgICAgIHJldHVybiA5MDtcblxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgIGNhc2UgXCJ1bWxfYXJyb3dcIjpcbiAgICAgIHJldHVybiAyMDtcblxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gMjU7XG4gIH1cbn07XG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkUG9pbnRzID0gKGVsZW1lbnQsIHNoYXBlLCBwb3NpdGlvbiwgYXJyb3doZWFkKSA9PiB7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZVswXSk7XG5cbiAgaWYgKG9wcy5sZW5ndGggPCAxKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gLy8gVGhlIGluZGV4IG9mIHRoZSBiQ3VydmUgb3BlcmF0aW9uIHRvIGV4YW1pbmUuXG5cblxuICBjb25zdCBpbmRleCA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyAxIDogb3BzLmxlbmd0aCAtIDE7XG4gIGNvbnN0IGRhdGEgPSBvcHNbaW5kZXhdLmRhdGE7XG4gIGNvbnN0IHAzID0gW2RhdGFbNF0sIGRhdGFbNV1dO1xuICBjb25zdCBwMiA9IFtkYXRhWzJdLCBkYXRhWzNdXTtcbiAgY29uc3QgcDEgPSBbZGF0YVswXSwgZGF0YVsxXV07IC8vIFdlIG5lZWQgdG8gZmluZCBwMCBvZiB0aGUgYmV6aWVyIGN1cnZlLlxuICAvLyBJdCBpcyB0eXBpY2FsbHkgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIHByZXZpb3VzXG4gIC8vIGN1cnZlOyBpdCBjYW4gYWxzbyBiZSB0aGUgcG9zaXRpb24gb2YgbW92ZVRvIG9wZXJhdGlvbi5cblxuICBjb25zdCBwcmV2T3AgPSBvcHNbaW5kZXggLSAxXTtcbiAgbGV0IHAwID0gWzAsIDBdO1xuXG4gIGlmIChwcmV2T3Aub3AgPT09IFwibW92ZVwiKSB7XG4gICAgcDAgPSBwcmV2T3AuZGF0YTtcbiAgfSBlbHNlIGlmIChwcmV2T3Aub3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgIHAwID0gW3ByZXZPcC5kYXRhWzRdLCBwcmV2T3AuZGF0YVs1XV07XG4gIH0gLy8gQih0KSA9IHAwICogKDEtdCleMyArIDNwMSAqIHQgKiAoMS10KV4yICsgM3AyICogdF4yICogKDEtdCkgKyBwMyAqIHReM1xuXG5cbiAgY29uc3QgZXF1YXRpb24gPSAodCwgaWR4KSA9PiBNYXRoLnBvdygxIC0gdCwgMykgKiBwM1tpZHhdICsgMyAqIHQgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBwMltpZHhdICsgMyAqIE1hdGgucG93KHQsIDIpICogKDEgLSB0KSAqIHAxW2lkeF0gKyBwMFtpZHhdICogTWF0aC5wb3codCwgMyk7IC8vIEVlIGtub3cgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGFycm93IChvciB0aGUgZmlyc3QsIGlmIHN0YXJ0IGFycm93aGVhZCkuXG5cblxuICBjb25zdCBbeDIsIHkyXSA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyBwMCA6IHAzOyAvLyBCeSB1c2luZyBjdWJpYyBiZXppZXIgZXF1YXRpb24gKEIodCkpIGFuZCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyxcbiAgLy8gd2UgY2FsY3VsYXRlIGEgcG9pbnQgdGhhdCBpcyBjbG9zZXIgdG8gdGhlIGxhc3QgcG9pbnQuXG4gIC8vIFRoZSB2YWx1ZSAwLjMgaXMgY2hvc2VuIGFyYml0cmFyaWx5IGFuZCBpdCB3b3JrcyBiZXN0IGZvciBhbGxcbiAgLy8gdGhlIHRlc3RlZCBjYXNlcy5cblxuICBjb25zdCBbeDEsIHkxXSA9IFtlcXVhdGlvbigwLjMsIDApLCBlcXVhdGlvbigwLjMsIDEpXTsgLy8gRmluZCB0aGUgbm9ybWFsaXplZCBkaXJlY3Rpb24gdmVjdG9yIGJhc2VkIG9uIHRoZVxuICAvLyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgcG9pbnRzLlxuXG4gIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5oeXBvdCh4MiAtIHgxLCB5MiAtIHkxKTtcbiAgY29uc3QgbnggPSAoeDIgLSB4MSkgLyBkaXN0YW5jZTtcbiAgY29uc3QgbnkgPSAoeTIgLSB5MSkgLyBkaXN0YW5jZTtcbiAgY29uc3Qgc2l6ZSA9IGdldEFycm93aGVhZFNpemUoYXJyb3doZWFkKTtcbiAgbGV0IGxlbmd0aCA9IDA7XG4gIHtcbiAgICAvLyBMZW5ndGggZm9yIC0+IGFycm93cyBpcyBiYXNlZCBvbiB0aGUgbGVuZ3RoIG9mIHRoZSBsYXN0IHNlY3Rpb25cbiAgICBjb25zdCBbY3gsIGN5XSA9IHBvc2l0aW9uID09PSBcImVuZFwiID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMV0gOiBlbGVtZW50LnBvaW50c1swXTtcbiAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEgPyBwb3NpdGlvbiA9PT0gXCJlbmRcIiA/IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDJdIDogZWxlbWVudC5wb2ludHNbMV0gOiBbMCwgMF07XG4gICAgbGVuZ3RoID0gTWF0aC5oeXBvdChjeCAtIHB4LCBjeSAtIHB5KTtcbiAgfSAvLyBTY2FsZSBkb3duIHRoZSBhcnJvd2hlYWQgdW50aWwgd2UgaGl0IGEgY2VydGFpbiBzaXplIHNvIHRoYXQgaXQgZG9lc24ndCBsb29rIHdlaXJkLlxuICAvLyBUaGlzIHZhbHVlIGlzIHNlbGVjdGVkIGJ5IG1pbmltaXppbmcgYSBtaW5pbXVtIHNpemUgd2l0aCB0aGUgbGFzdCBzZWdtZW50IG9mIHRoZSBhcnJvd2hlYWRcblxuICBjb25zdCBsZW5ndGhNdWx0aXBsaWVyID0gYXJyb3doZWFkID09PSBcInVtbF9kaWFtb25kXCIgfHwgYXJyb3doZWFkID09PSBcInVtbF9kaWFtb25kX2ZpbGxlZFwiID8gMC4yNSA6IDAuNTtcbiAgY29uc3QgbWluU2l6ZSA9IE1hdGgubWluKHNpemUsIGxlbmd0aCAqIGxlbmd0aE11bHRpcGxpZXIpO1xuICBjb25zdCB4cyA9IHgyIC0gbnggKiBtaW5TaXplO1xuICBjb25zdCB5cyA9IHkyIC0gbnkgKiBtaW5TaXplO1xuXG4gIGlmIChhcnJvd2hlYWQgPT09IFwiZG90XCIpIHtcbiAgICBjb25zdCByID0gTWF0aC5oeXBvdCh5cyAtIHkyLCB4cyAtIHgyKSArIGVsZW1lbnQuc3Ryb2tlV2lkdGg7XG4gICAgcmV0dXJuIFt4MiwgeTIsIHJdO1xuICB9XG5cbiAgY29uc3QgYW5nbGUgPSBnZXRBcnJvd2hlYWRBbmdsZShhcnJvd2hlYWQpOyAvLyBSZXR1cm4gcG9pbnRzXG5cbiAgY29uc3QgW3gzLCB5M10gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsIC1hbmdsZSAqIE1hdGguUEkgLyAxODApO1xuICBjb25zdCBbeDQsIHk0XSA9IHJvdGF0ZSh4cywgeXMsIHgyLCB5MiwgYW5nbGUgKiBNYXRoLlBJIC8gMTgwKTtcblxuICBpZiAoYXJyb3doZWFkID09PSBcInVtbF9kaWFtb25kXCIgfHwgYXJyb3doZWFkID09PSBcInVtbF9kaWFtb25kX2ZpbGxlZFwiKSB7XG4gICAgLy8gcG9pbnQgb3Bwb3NpdGUgdG8gdGhlIGFycm93aGVhZCBwb2ludFxuICAgIGxldCBveDtcbiAgICBsZXQgb3k7XG5cbiAgICBpZiAocG9zaXRpb24gPT09IFwic3RhcnRcIikge1xuICAgICAgY29uc3QgW3B4LCBweV0gPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxID8gZWxlbWVudC5wb2ludHNbMV0gOiBbMCwgMF07XG4gICAgICBbb3gsIG95XSA9IHJvdGF0ZSh4MiArIG1pblNpemUgKiAyLCB5MiwgeDIsIHkyLCBNYXRoLmF0YW4yKHB5IC0geTIsIHB4IC0geDIpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3B4LCBweV0gPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMl0gOiBbMCwgMF07XG4gICAgICBbb3gsIG95XSA9IHJvdGF0ZSh4MiAtIG1pblNpemUgKiAyLCB5MiwgeDIsIHkyLCBNYXRoLmF0YW4yKHkyIC0gcHksIHgyIC0gcHgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gW3gyLCB5MiwgeDMsIHkzLCBveCwgb3ksIHg0LCB5NF07XG4gIH1cblxuICByZXR1cm4gW3gyLCB5MiwgeDMsIHkzLCB4NCwgeTRdO1xufTtcblxuY29uc3QgZ2VuZXJhdGVMaW5lYXJFbGVtZW50U2hhcGUgPSBlbGVtZW50ID0+IHtcbiAgY29uc3QgZ2VuZXJhdG9yID0gcm91Z2guZ2VuZXJhdG9yKCk7XG4gIGNvbnN0IG9wdGlvbnMgPSBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KTtcblxuICBjb25zdCBtZXRob2QgPSAoKCkgPT4ge1xuICAgIGlmIChlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgcmV0dXJuIFwiY3VydmVcIjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICByZXR1cm4gXCJwb2x5Z29uXCI7XG4gICAgfVxuXG4gICAgcmV0dXJuIFwibGluZWFyUGF0aFwiO1xuICB9KSgpO1xuXG4gIHJldHVybiBnZW5lcmF0b3JbbWV0aG9kXShlbGVtZW50LnBvaW50cywgb3B0aW9ucyk7XG59O1xuXG5jb25zdCBnZXRMaW5lYXJFbGVtZW50Um90YXRlZEJvdW5kcyA9IChlbGVtZW50LCBjeCwgY3kpID0+IHtcbiAgdmFyIF9hO1xuXG4gIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyKSB7XG4gICAgY29uc3QgW3BvaW50WCwgcG9pbnRZXSA9IGVsZW1lbnQucG9pbnRzWzBdO1xuICAgIGNvbnN0IFt4LCB5XSA9IHJvdGF0ZShlbGVtZW50LnggKyBwb2ludFgsIGVsZW1lbnQueSArIHBvaW50WSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBsZXQgY29vcmRzID0gW3gsIHksIHgsIHldO1xuICAgIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGNvb3Jkc1dpdGhCb3VuZFRleHQgPSBMaW5lYXJFbGVtZW50RWRpdG9yLmdldE1pbk1heFhZV2l0aEJvdW5kVGV4dChlbGVtZW50LCBbeCwgeSwgeCwgeV0sIGJvdW5kVGV4dEVsZW1lbnQpO1xuICAgICAgY29vcmRzID0gW2Nvb3Jkc1dpdGhCb3VuZFRleHRbMF0sIGNvb3Jkc1dpdGhCb3VuZFRleHRbMV0sIGNvb3Jkc1dpdGhCb3VuZFRleHRbMl0sIGNvb3Jkc1dpdGhCb3VuZFRleHRbM11dO1xuICAgIH1cblxuICAgIHJldHVybiBjb29yZHM7XG4gIH0gLy8gZmlyc3QgZWxlbWVudCBpcyBhbHdheXMgdGhlIGN1cnZlXG5cblxuICBjb25zdCBjYWNoZWRTaGFwZSA9IChfYSA9IFNoYXBlQ2FjaGUuZ2V0KGVsZW1lbnQpKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2FbMF07XG4gIGNvbnN0IHNoYXBlID0gY2FjaGVkU2hhcGUgIT09IG51bGwgJiYgY2FjaGVkU2hhcGUgIT09IHZvaWQgMCA/IGNhY2hlZFNoYXBlIDogZ2VuZXJhdGVMaW5lYXJFbGVtZW50U2hhcGUoZWxlbWVudCk7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZSk7XG5cbiAgY29uc3QgdHJhbnNmb3JtWFkgPSAoeCwgeSkgPT4gcm90YXRlKGVsZW1lbnQueCArIHgsIGVsZW1lbnQueSArIHksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG5cbiAgY29uc3QgcmVzID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcywgdHJhbnNmb3JtWFkpO1xuICBsZXQgY29vcmRzID0gW3Jlc1swXSwgcmVzWzFdLCByZXNbMl0sIHJlc1szXV07XG4gIGNvbnN0IGJvdW5kVGV4dEVsZW1lbnQgPSBnZXRCb3VuZFRleHRFbGVtZW50KGVsZW1lbnQpO1xuXG4gIGlmIChib3VuZFRleHRFbGVtZW50KSB7XG4gICAgY29uc3QgY29vcmRzV2l0aEJvdW5kVGV4dCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0TWluTWF4WFlXaXRoQm91bmRUZXh0KGVsZW1lbnQsIGNvb3JkcywgYm91bmRUZXh0RWxlbWVudCk7XG4gICAgY29vcmRzID0gW2Nvb3Jkc1dpdGhCb3VuZFRleHRbMF0sIGNvb3Jkc1dpdGhCb3VuZFRleHRbMV0sIGNvb3Jkc1dpdGhCb3VuZFRleHRbMl0sIGNvb3Jkc1dpdGhCb3VuZFRleHRbM11dO1xuICB9XG5cbiAgcmV0dXJuIGNvb3Jkcztcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50Qm91bmRzID0gZWxlbWVudCA9PiB7XG4gIHJldHVybiBFbGVtZW50Qm91bmRzLmdldEJvdW5kcyhlbGVtZW50KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29tbW9uQm91bmRzID0gZWxlbWVudHMgPT4ge1xuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gIH1cblxuICBsZXQgbWluWCA9IEluZmluaXR5O1xuICBsZXQgbWF4WCA9IC1JbmZpbml0eTtcbiAgbGV0IG1pblkgPSBJbmZpbml0eTtcbiAgbGV0IG1heFkgPSAtSW5maW5pdHk7XG4gIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgxKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeTEpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4Mik7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkyKTtcbiAgfSk7XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuZXhwb3J0IGNvbnN0IGdldERyYWdnZWRFbGVtZW50c0JvdW5kcyA9IChlbGVtZW50cywgZHJhZ09mZnNldCkgPT4ge1xuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDb21tb25Cb3VuZHMoZWxlbWVudHMpO1xuICByZXR1cm4gW21pblggKyBkcmFnT2Zmc2V0LngsIG1pblkgKyBkcmFnT2Zmc2V0LnksIG1heFggKyBkcmFnT2Zmc2V0LngsIG1heFkgKyBkcmFnT2Zmc2V0LnldO1xufTtcbmV4cG9ydCBjb25zdCBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzID0gKGVsZW1lbnQsIG5leHRXaWR0aCwgbmV4dEhlaWdodCwgbm9ybWFsaXplUG9pbnRzKSA9PiB7XG4gIGlmICghKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSB8fCBpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkpIHtcbiAgICByZXR1cm4gW2VsZW1lbnQueCwgZWxlbWVudC55LCBlbGVtZW50LnggKyBuZXh0V2lkdGgsIGVsZW1lbnQueSArIG5leHRIZWlnaHRdO1xuICB9XG5cbiAgY29uc3QgcG9pbnRzID0gcmVzY2FsZVBvaW50cygwLCBuZXh0V2lkdGgsIHJlc2NhbGVQb2ludHMoMSwgbmV4dEhlaWdodCwgZWxlbWVudC5wb2ludHMsIG5vcm1hbGl6ZVBvaW50cyksIG5vcm1hbGl6ZVBvaW50cyk7XG4gIGxldCBib3VuZHM7XG5cbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gRnJlZSBEcmF3XG4gICAgYm91bmRzID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhwb2ludHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExpbmVcbiAgICBjb25zdCBnZW4gPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgICBjb25zdCBjdXJ2ZSA9ICFlbGVtZW50LnJvdW5kbmVzcyA/IGdlbi5saW5lYXJQYXRoKHBvaW50cywgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCkpIDogZ2VuLmN1cnZlKHBvaW50cywgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCkpO1xuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gICAgYm91bmRzID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIH1cblxuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBib3VuZHM7XG4gIHJldHVybiBbbWluWCArIGVsZW1lbnQueCwgbWluWSArIGVsZW1lbnQueSwgbWF4WCArIGVsZW1lbnQueCwgbWF4WSArIGVsZW1lbnQueV07XG59O1xuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRQb2ludHNDb29yZHMgPSAoZWxlbWVudCwgcG9pbnRzKSA9PiB7XG4gIC8vIFRoaXMgbWlnaHQgYmUgY29tcHV0YXRpb25hbGx5IGhlYXZleVxuICBjb25zdCBnZW4gPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgY29uc3QgY3VydmUgPSBlbGVtZW50LnJvdW5kbmVzcyA9PSBudWxsID8gZ2VuLmxpbmVhclBhdGgocG9pbnRzLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSkgOiBnZW4uY3VydmUocG9pbnRzLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSk7XG4gIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldE1pbk1heFhZRnJvbUN1cnZlUGF0aE9wcyhvcHMpO1xuICByZXR1cm4gW21pblggKyBlbGVtZW50LngsIG1pblkgKyBlbGVtZW50LnksIG1heFggKyBlbGVtZW50LngsIG1heFkgKyBlbGVtZW50LnldO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDbG9zZXN0RWxlbWVudEJvdW5kcyA9IChlbGVtZW50cywgZnJvbSkgPT4ge1xuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gIH1cblxuICBsZXQgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgbGV0IGNsb3Nlc3RFbGVtZW50ID0gZWxlbWVudHNbMF07XG4gIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSBkaXN0YW5jZTJkKCh4MSArIHgyKSAvIDIsICh5MSArIHkyKSAvIDIsIGZyb20ueCwgZnJvbS55KTtcblxuICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICBtaW5EaXN0YW5jZSA9IGRpc3RhbmNlO1xuICAgICAgY2xvc2VzdEVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBnZXRFbGVtZW50Qm91bmRzKGNsb3Nlc3RFbGVtZW50KTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Q29tbW9uQm91bmRpbmdCb3ggPSBlbGVtZW50cyA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIHJldHVybiB7XG4gICAgbWluWCxcbiAgICBtaW5ZLFxuICAgIG1heFgsXG4gICAgbWF4WSxcbiAgICB3aWR0aDogbWF4WCAtIG1pblgsXG4gICAgaGVpZ2h0OiBtYXhZIC0gbWluWSxcbiAgICBtaWRYOiAobWluWCArIG1heFgpIC8gMixcbiAgICBtaWRZOiAobWluWSArIG1heFkpIC8gMlxuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
4160
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ElementBounds\": () => (/* binding */ ElementBounds),\n/* harmony export */ \"getArrowheadAngle\": () => (/* binding */ getArrowheadAngle),\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getArrowheadSize\": () => (/* binding */ getArrowheadSize),\n/* harmony export */ \"getBoundsFromPoints\": () => (/* binding */ getBoundsFromPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getDraggedElementsBounds\": () => (/* binding */ getDraggedElementsBounds),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementLineSegments\": () => (/* binding */ getElementLineSegments),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getMinMaxXYFromCurvePathOps\": () => (/* binding */ getMinMaxXYFromCurvePathOps),\n/* harmony export */ \"getRectangleBoxAbsoluteCoords\": () => (/* binding */ getRectangleBoxAbsoluteCoords),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _scene_Shape__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../scene/Shape */ \"../../scene/Shape.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n/* harmony import */ var _textElement__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./textElement */ \"../../element/textElement.ts\");\n/* harmony import */ var _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./linearElementEditor */ \"../../element/linearElementEditor.ts\");\n/* harmony import */ var _scene_ShapeCache__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../scene/ShapeCache */ \"../../scene/ShapeCache.ts\");\n/* harmony import */ var _scene_Scene__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../scene/Scene */ \"../../scene/Scene.ts\");\n\n\n\n\n\n\n\n\n\nclass ElementBounds {\n static getBounds(element) {\n const cachedBounds = ElementBounds.boundsCache.get(element);\n\n if ((cachedBounds === null || cachedBounds === void 0 ? void 0 : cachedBounds.version) && cachedBounds.version === element.version && // we don't invalidate cache when we update containers and not labels,\n // which is causing problems down the line. Fix TBA.\n !(0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isBoundToContainer)(element)) {\n return cachedBounds.bounds;\n }\n\n const bounds = ElementBounds.calculateBounds(element); // hack to ensure that downstream checks could retrieve element Scene\n // so as to have correctly calculated bounds\n // FIXME remove when we get rid of all the id:Scene / element:Scene mapping\n\n const shouldCache = _scene_Scene__WEBPACK_IMPORTED_MODULE_8__[\"default\"].getScene(element);\n\n if (shouldCache) {\n ElementBounds.boundsCache.set(element, {\n version: element.version,\n bounds\n });\n }\n\n return bounds;\n }\n\n static calculateBounds(element) {\n let bounds;\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [minX + element.x, minY + element.y, maxX + element.x, maxY + element.y];\n } else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n } else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n } else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n } else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n\n return bounds;\n }\n\n}\nElementBounds.boundsCache = new WeakMap(); // Scene -> Scene coords, but in x1,x2,y1,y2 format.\n//\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\n\nconst getElementAbsoluteCoords = (element, includeBoundText = false) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n } else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getElementAbsoluteCoords(element, includeBoundText);\n } else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isTextElement)(element)) {\n const container = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getContainerElement)(element);\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isArrowElement)(container)) {\n const coords = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getBoundTextElementPosition(container, element);\n return [coords.x, coords.y, coords.x + element.width, coords.y + element.height, coords.x + element.width / 2, coords.y + element.height / 2];\n }\n }\n\n return [element.x, element.y, element.x + element.width, element.y + element.height, element.x + element.width / 2, element.y + element.height / 2];\n};\n/*\n * for a given element, `getElementLineSegments` returns line segments\n * that can be used for visual collision detection (useful for frames)\n * as opposed to bounding box collision detection\n */\n\nconst getElementLineSegments = element => {\n const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n const center = [cx, cy];\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const segments = [];\n let i = 0;\n\n while (i < element.points.length - 1) {\n segments.push([(0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([element.points[i][0] + element.x, element.points[i][1] + element.y], center, element.angle), (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)([element.points[i + 1][0] + element.x, element.points[i + 1][1] + element.y], center, element.angle)]);\n i++;\n }\n\n return segments;\n }\n\n const [nw, ne, sw, se, n, s, w, e] = [[x1, y1], [x2, y1], [x1, y2], [x2, y2], [cx, y1], [cx, y2], [x1, cy], [x2, cy]].map(point => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotatePoint)(point, center, element.angle));\n\n if (element.type === \"diamond\") {\n return [[n, w], [n, e], [s, w], [s, e]];\n }\n\n if (element.type === \"ellipse\") {\n return [[n, w], [n, e], [s, w], [s, e], [n, w], [n, e], [s, w], [s, e]];\n }\n\n return [[nw, ne], [sw, se], [nw, sw], [ne, se], [nw, e], [sw, e], [ne, w], [se, w]];\n};\n/**\n * Scene -> Scene coords, but in x1,x2,y1,y2 format.\n *\n * Rectangle here means any rectangular frame, not an excalidraw element.\n */\n\nconst getRectangleBoxAbsoluteCoords = boxSceneCoords => {\n return [boxSceneCoords.x, boxSceneCoords.y, boxSceneCoords.x + boxSceneCoords.width, boxSceneCoords.y + boxSceneCoords.height, boxSceneCoords.x + boxSceneCoords.width / 2, boxSceneCoords.y + boxSceneCoords.height / 2];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = element => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = shape => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n\n return shape.sets[0].ops;\n}; // reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\n\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return Math.pow(oneMinusT, 3) * p0 + 3 * Math.pow(oneMinusT, 2) * t * p1 + 3 * oneMinusT * Math.pow(t, 2) * p2 + Math.pow(t, 3) * p3;\n};\n\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n\n if (!hasSolution) {\n return false;\n }\n\n let s1 = null;\n let s2 = null;\n let t1 = Infinity;\n let t2 = Infinity;\n\n if (a === 0) {\n t1 = t2 = -c / b;\n } else {\n t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n }\n\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n\n return [s1, s2];\n};\n\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n\n if (solX) {\n const xs = solX.filter(x => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n\n if (solY) {\n const ys = solY.filter(y => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const {\n minX,\n minY,\n maxX,\n maxY\n } = ops.reduce((limits, {\n op,\n data\n }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data; // move operation does not draw anything; so, it always\n // returns false\n } else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n } else if (op === \"lineTo\") {// TODO: Implement this\n } else if (op === \"qcurveTo\") {// TODO: Implement this\n }\n\n return limits;\n }, {\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = points => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n\n return [minX, minY, maxX, maxY];\n};\n\nconst getFreeDrawElementAbsoluteCoords = element => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n const x1 = minX + element.x;\n const y1 = minY + element.y;\n const x2 = maxX + element.x;\n const y2 = maxY + element.y;\n return [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2];\n};\n/** @returns number in pixels */\n\n\nconst getArrowheadSize = arrowhead => {\n switch (arrowhead) {\n case \"arrow\":\n case \"d_arrow\":\n return 25;\n\n case \"d_diamond\":\n case \"d_diamond_filled\":\n return 12;\n\n default:\n return 15;\n }\n};\n/** @returns number in degrees */\n\nconst getArrowheadAngle = arrowhead => {\n switch (arrowhead) {\n case \"bar\":\n return 90;\n\n case \"arrow\":\n case \"d_arrow\":\n return 20;\n\n default:\n return 25;\n }\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n\n if (ops.length < 1) {\n return null;\n } // The index of the bCurve operation to examine.\n\n\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]]; // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n } else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n } // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n\n\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] + 3 * t * Math.pow(1 - t, 2) * p2[idx] + 3 * Math.pow(t, 2) * (1 - t) * p1[idx] + p0[idx] * Math.pow(t, 3); // Ee know the last point of the arrow (or the first, if start arrowhead).\n\n\n const [x2, y2] = position === \"start\" ? p0 : p3; // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)]; // Find the normalized direction vector based on the\n // previously calculated points.\n\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = getArrowheadSize(arrowhead);\n let length = 0;\n {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = position === \"end\" ? element.points[element.points.length - 1] : element.points[0];\n const [px, py] = element.points.length > 1 ? position === \"end\" ? element.points[element.points.length - 2] : element.points[1] : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n } // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n\n const lengthMultiplier = arrowhead === \"d_diamond\" || arrowhead === \"d_diamond_filled\" ? 0.25 : 0.5;\n const minSize = Math.min(size, length * lengthMultiplier);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n\n const angle = getArrowheadAngle(arrowhead); // Return points\n\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, -angle * Math.PI / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, angle * Math.PI / 180);\n\n if (arrowhead === \"d_diamond\" || arrowhead === \"d_diamond_filled\") {\n // point opposite to the arrowhead point\n let ox;\n let oy;\n\n if (position === \"start\") {\n const [px, py] = element.points.length > 1 ? element.points[1] : [0, 0];\n [ox, oy] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2 + minSize * 2, y2, x2, y2, Math.atan2(py - y2, px - x2));\n } else {\n const [px, py] = element.points.length > 1 ? element.points[element.points.length - 2] : [0, 0];\n [ox, oy] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2 - minSize * 2, y2, x2, y2, Math.atan2(y2 - py, x2 - px));\n }\n\n return [x2, y2, x3, y3, ox, oy, x4, y4];\n }\n\n return [x2, y2, x3, y3, x4, y4];\n};\n\nconst generateLinearElementShape = element => {\n const generator = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const options = (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element);\n\n const method = (() => {\n if (element.roundness) {\n return \"curve\";\n }\n\n if (options.fill) {\n return \"polygon\";\n }\n\n return \"linearPath\";\n })();\n\n return generator[method](element.points, options);\n};\n\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n var _a;\n\n if (element.points.length < 2) {\n const [pointX, pointY] = element.points[0];\n const [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + pointX, element.y + pointY, cx, cy, element.angle);\n let coords = [x, y, x, y];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, [x, y, x, y], boundTextElement);\n coords = [coordsWithBoundText[0], coordsWithBoundText[1], coordsWithBoundText[2], coordsWithBoundText[3]];\n }\n\n return coords;\n } // first element is always the curve\n\n\n const cachedShape = (_a = _scene_ShapeCache__WEBPACK_IMPORTED_MODULE_7__.ShapeCache.get(element)) === null || _a === void 0 ? void 0 : _a[0];\n const shape = cachedShape !== null && cachedShape !== void 0 ? cachedShape : generateLinearElementShape(element);\n const ops = getCurvePathOps(shape);\n\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n\n const res = getMinMaxXYFromCurvePathOps(ops, transformXY);\n let coords = [res[0], res[1], res[2], res[3]];\n const boundTextElement = (0,_textElement__WEBPACK_IMPORTED_MODULE_5__.getBoundTextElement)(element);\n\n if (boundTextElement) {\n const coordsWithBoundText = _linearElementEditor__WEBPACK_IMPORTED_MODULE_6__.LinearElementEditor.getMinMaxXYWithBoundText(element, coords, boundTextElement);\n coords = [coordsWithBoundText[0], coordsWithBoundText[1], coordsWithBoundText[2], coordsWithBoundText[3]];\n }\n\n return coords;\n};\n\nconst getElementBounds = element => {\n return ElementBounds.getBounds(element);\n};\nconst getCommonBounds = elements => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach(element => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getDraggedElementsBounds = (elements, dragOffset) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return [minX + dragOffset.x, minY + dragOffset.y, maxX + dragOffset.x, maxY + dragOffset.y];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [element.x, element.y, element.x + nextWidth, element.y + nextHeight];\n }\n\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n } else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = !element.roundness ? gen.linearPath(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element)) : gen.curve(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n\n const [minX, minY, maxX, maxY] = bounds;\n return [minX + element.x, minY + element.y, maxX + element.x, maxY + element.y];\n};\nconst getElementPointsCoords = (element, points) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.roundness == null ? gen.linearPath(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element)) : gen.curve(points, (0,_scene_Shape__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [minX + element.x, minY + element.y, maxX + element.x, maxY + element.y];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach(element => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = elements => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LDhGQUE0QztBQUM5RTtBQUNBOztBQUVBO0FBQ0EsSUFBSTs7O0FBR0osNEJBQTRCLDZEQUFjO0FBQzFDO0FBQ0E7O0FBRUEsZ0NBQWdDLDZDQUFNOztBQUV0QztBQUNBO0FBQ0EsMkJBQTJCLGlFQUFtQjs7QUFFOUM7QUFDQSxnQ0FBZ0MsOEZBQTRDO0FBQzVFO0FBQ0E7O0FBRUE7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7QUFDTztBQUNQLFFBQVEsNERBQWUsYUFBYSw4REFBaUI7QUFDckQ7QUFDQTs7QUFFQSxpQkFBaUIsc0RBQWEsZUFBZSxzREFBYTtBQUMxRDs7QUFFQSxNQUFNLDhEQUFpQjtBQUN2QjtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0EsZ0JBQWdCLG1FQUFlO0FBQy9CLDhEQUE4RCxrRUFBb0IsK0JBQStCLGtFQUFvQjtBQUNySTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBLGNBQWMsbUVBQWU7QUFDN0IsbUVBQW1FLGtFQUFvQiwrQkFBK0Isa0VBQW9CO0FBQzFJO0FBQ0E7QUFDQTtBQUNBO0FBQ087QUFDUDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsaURBQVU7O0FBRS9CO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2JvdW5kcy50cz9mY2EwIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGRpc3RhbmNlMmQsIHJvdGF0ZSwgcm90YXRlUG9pbnQgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHJvdWdoIGZyb20gXCJyb3VnaGpzL2Jpbi9yb3VnaFwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVSb3VnaE9wdGlvbnMgfSBmcm9tIFwiLi4vc2NlbmUvU2hhcGVcIjtcbmltcG9ydCB7IGlzQXJyb3dFbGVtZW50LCBpc0JvdW5kVG9Db250YWluZXIsIGlzRnJlZURyYXdFbGVtZW50LCBpc0xpbmVhckVsZW1lbnQsIGlzVGV4dEVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyByZXNjYWxlUG9pbnRzIH0gZnJvbSBcIi4uL3BvaW50c1wiO1xuaW1wb3J0IHsgZ2V0Qm91bmRUZXh0RWxlbWVudCwgZ2V0Q29udGFpbmVyRWxlbWVudCB9IGZyb20gXCIuL3RleHRFbGVtZW50XCI7XG5pbXBvcnQgeyBMaW5lYXJFbGVtZW50RWRpdG9yIH0gZnJvbSBcIi4vbGluZWFyRWxlbWVudEVkaXRvclwiO1xuaW1wb3J0IHsgU2hhcGVDYWNoZSB9IGZyb20gXCIuLi9zY2VuZS9TaGFwZUNhY2hlXCI7XG5pbXBvcnQgU2NlbmUgZnJvbSBcIi4uL3NjZW5lL1NjZW5lXCI7XG5leHBvcnQgY2xhc3MgRWxlbWVudEJvdW5kcyB7XG4gIHN0YXRpYyBnZXRCb3VuZHMoZWxlbWVudCkge1xuICAgIGNvbnN0IGNhY2hlZEJvdW5kcyA9IEVsZW1lbnRCb3VuZHMuYm91bmRzQ2FjaGUuZ2V0KGVsZW1lbnQpO1xuXG4gICAgaWYgKChjYWNoZWRCb3VuZHMgPT09IG51bGwgfHwgY2FjaGVkQm91bmRzID09PSB2b2lkIDAgPyB2b2lkIDAgOiBjYWNoZWRCb3VuZHMudmVyc2lvbikgJiYgY2FjaGVkQm91bmRzLnZlcnNpb24gPT09IGVsZW1lbnQudmVyc2lvbiAmJiAvLyB3ZSBkb24ndCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gd2UgdXBkYXRlIGNvbnRhaW5lcnMgYW5kIG5vdCBsYWJlbHMsXG4gICAgLy8gd2hpY2ggaXMgY2F1c2luZyBwcm9ibGVtcyBkb3duIHRoZSBsaW5lLiBGaXggVEJBLlxuICAgICFpc0JvdW5kVG9Db250YWluZXIoZWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBjYWNoZWRCb3VuZHMuYm91bmRzO1xuICAgIH1cblxuICAgIGNvbnN0IGJvdW5kcyA9IEVsZW1lbnRCb3VuZHMuY2FsY3VsYXRlQm91bmRzKGVsZW1lbnQpOyAvLyBoYWNrIHRvIGVuc3VyZSB0aGF0IGRvd25zdHJlYW0gY2hlY2tzIGNvdWxkIHJldHJpZXZlIGVsZW1lbnQgU2NlbmVcbiAgICAvLyBzbyBhcyB0byBoYXZlIGNvcnJlY3RseSBjYWxjdWxhdGVkIGJvdW5kc1xuICAgIC8vIEZJWE1FIHJlbW92ZSB3aGVuIHdlIGdldCByaWQgb2YgYWxsIHRoZSBpZDpTY2VuZSAvIGVsZW1lbnQ6U2NlbmUgbWFwcGluZ1xuXG4gICAgY29uc3Qgc2hvdWxkQ2FjaGUgPSBTY2VuZS5nZXRTY2VuZShlbGVtZW50KTtcblxuICAgIGlmIChzaG91bGRDYWNoZSkge1xuICAgICAgRWxlbWVudEJvdW5kcy5ib3VuZHNDYWNoZS5zZXQoZWxlbWVudCwge1xuICAgICAgICB2ZXJzaW9uOiBlbGVtZW50LnZlcnNpb24sXG4gICAgICAgIGJvdW5kc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJvdW5kcztcbiAgfVxuXG4gIHN0YXRpYyBjYWxjdWxhdGVCb3VuZHMoZWxlbWVudCkge1xuICAgIGxldCBib3VuZHM7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCBjeCwgY3ldID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuXG4gICAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRCb3VuZHNGcm9tUG9pbnRzKGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldKSA9PiByb3RhdGUoeCwgeSwgY3ggLSBlbGVtZW50LngsIGN5IC0gZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlKSkpO1xuICAgICAgcmV0dXJuIFttaW5YICsgZWxlbWVudC54LCBtaW5ZICsgZWxlbWVudC55LCBtYXhYICsgZWxlbWVudC54LCBtYXhZICsgZWxlbWVudC55XTtcbiAgICB9IGVsc2UgaWYgKGlzTGluZWFyRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgYm91bmRzID0gZ2V0TGluZWFyRWxlbWVudFJvdGF0ZWRCb3VuZHMoZWxlbWVudCwgY3gsIGN5KTtcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICAgIGNvbnN0IFt4MTEsIHkxMV0gPSByb3RhdGUoY3gsIHkxLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZShjeCwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBbeDIyLCB5MjJdID0gcm90YXRlKHgxLCBjeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGNvbnN0IFt4MjEsIHkyMV0gPSByb3RhdGUoeDIsIGN5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICAgIGNvbnN0IG1heFggPSBNYXRoLm1heCh4MTEsIHgxMiwgeDIyLCB4MjEpO1xuICAgICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgICBib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gICAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZWxsaXBzZVwiKSB7XG4gICAgICBjb25zdCB3ID0gKHgyIC0geDEpIC8gMjtcbiAgICAgIGNvbnN0IGggPSAoeTIgLSB5MSkgLyAyO1xuICAgICAgY29uc3QgY29zID0gTWF0aC5jb3MoZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGNvbnN0IHd3ID0gTWF0aC5oeXBvdCh3ICogY29zLCBoICogc2luKTtcbiAgICAgIGNvbnN0IGhoID0gTWF0aC5oeXBvdChoICogY29zLCB3ICogc2luKTtcbiAgICAgIGJvdW5kcyA9IFtjeCAtIHd3LCBjeSAtIGhoLCBjeCArIHd3LCBjeSArIGhoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZSh4MSwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBbeDEyLCB5MTJdID0gcm90YXRlKHgxLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgIGNvbnN0IFt4MjIsIHkyMl0gPSByb3RhdGUoeDIsIHkyLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICAgIGNvbnN0IG1pblkgPSBNYXRoLm1pbih5MTEsIHkxMiwgeTIyLCB5MjEpO1xuICAgICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICAgIGJvdW5kcyA9IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYm91bmRzO1xuICB9XG5cbn1cbkVsZW1lbnRCb3VuZHMuYm91bmRzQ2FjaGUgPSBuZXcgV2Vha01hcCgpOyAvLyBTY2VuZSAtPiBTY2VuZSBjb29yZHMsIGJ1dCBpbiB4MSx4Mix5MSx5MiBmb3JtYXQuXG4vL1xuLy8gSWYgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoZSB3aWR0aCBpcyBnb2luZyB0byBiZSBuZWdhdGl2ZVxuLy8gVGhpcyBzZXQgb2YgZnVuY3Rpb25zIHJldHJpZXZlcyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIDQgcG9pbnRzLlxuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzID0gKGVsZW1lbnQsIGluY2x1ZGVCb3VuZFRleHQgPSBmYWxzZSkgPT4ge1xuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQsIGluY2x1ZGVCb3VuZFRleHQpO1xuICB9IGVsc2UgaWYgKGlzVGV4dEVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBnZXRDb250YWluZXJFbGVtZW50KGVsZW1lbnQpO1xuXG4gICAgaWYgKGlzQXJyb3dFbGVtZW50KGNvbnRhaW5lcikpIHtcbiAgICAgIGNvbnN0IGNvb3JkcyA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0Qm91bmRUZXh0RWxlbWVudFBvc2l0aW9uKGNvbnRhaW5lciwgZWxlbWVudCk7XG4gICAgICByZXR1cm4gW2Nvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnggKyBlbGVtZW50LndpZHRoLCBjb29yZHMueSArIGVsZW1lbnQuaGVpZ2h0LCBjb29yZHMueCArIGVsZW1lbnQud2lkdGggLyAyLCBjb29yZHMueSArIGVsZW1lbnQuaGVpZ2h0IC8gMl07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFtlbGVtZW50LngsIGVsZW1lbnQueSwgZWxlbWVudC54ICsgZWxlbWVudC53aWR0aCwgZWxlbWVudC55ICsgZWxlbWVudC5oZWlnaHQsIGVsZW1lbnQueCArIGVsZW1lbnQud2lkdGggLyAyLCBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCAvIDJdO1xufTtcbi8qXG4gKiBmb3IgYSBnaXZlbiBlbGVtZW50LCBgZ2V0RWxlbWVudExpbmVTZWdtZW50c2AgcmV0dXJucyBsaW5lIHNlZ21lbnRzXG4gKiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2aXN1YWwgY29sbGlzaW9uIGRldGVjdGlvbiAodXNlZnVsIGZvciBmcmFtZXMpXG4gKiBhcyBvcHBvc2VkIHRvIGJvdW5kaW5nIGJveCBjb2xsaXNpb24gZGV0ZWN0aW9uXG4gKi9cblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRMaW5lU2VnbWVudHMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3QgW3gxLCB5MSwgeDIsIHkyLCBjeCwgY3ldID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjZW50ZXIgPSBbY3gsIGN5XTtcblxuICBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3Qgc2VnbWVudHMgPSBbXTtcbiAgICBsZXQgaSA9IDA7XG5cbiAgICB3aGlsZSAoaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHNlZ21lbnRzLnB1c2goW3JvdGF0ZVBvaW50KFtlbGVtZW50LnBvaW50c1tpXVswXSArIGVsZW1lbnQueCwgZWxlbWVudC5wb2ludHNbaV1bMV0gKyBlbGVtZW50LnldLCBjZW50ZXIsIGVsZW1lbnQuYW5nbGUpLCByb3RhdGVQb2ludChbZWxlbWVudC5wb2ludHNbaSArIDFdWzBdICsgZWxlbWVudC54LCBlbGVtZW50LnBvaW50c1tpICsgMV1bMV0gKyBlbGVtZW50LnldLCBjZW50ZXIsIGVsZW1lbnQuYW5nbGUpXSk7XG4gICAgICBpKys7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgY29uc3QgW253LCBuZSwgc3csIHNlLCBuLCBzLCB3LCBlXSA9IFtbeDEsIHkxXSwgW3gyLCB5MV0sIFt4MSwgeTJdLCBbeDIsIHkyXSwgW2N4LCB5MV0sIFtjeCwgeTJdLCBbeDEsIGN5XSwgW3gyLCBjeV1dLm1hcChwb2ludCA9PiByb3RhdGVQb2ludChwb2ludCwgY2VudGVyLCBlbGVtZW50LmFuZ2xlKSk7XG5cbiAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJkaWFtb25kXCIpIHtcbiAgICByZXR1cm4gW1tuLCB3XSwgW24sIGVdLCBbcywgd10sIFtzLCBlXV07XG4gIH1cblxuICBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgIHJldHVybiBbW24sIHddLCBbbiwgZV0sIFtzLCB3XSwgW3MsIGVdLCBbbiwgd10sIFtuLCBlXSwgW3MsIHddLCBbcywgZV1dO1xuICB9XG5cbiAgcmV0dXJuIFtbbncsIG5lXSwgW3N3LCBzZV0sIFtudywgc3ddLCBbbmUsIHNlXSwgW253LCBlXSwgW3N3LCBlXSwgW25lLCB3XSwgW3NlLCB3XV07XG59O1xuLyoqXG4gKiBTY2VuZSAtPiBTY2VuZSBjb29yZHMsIGJ1dCBpbiB4MSx4Mix5MSx5MiBmb3JtYXQuXG4gKlxuICogUmVjdGFuZ2xlIGhlcmUgbWVhbnMgYW55IHJlY3Rhbmd1bGFyIGZyYW1lLCBub3QgYW4gZXhjYWxpZHJhdyBlbGVtZW50LlxuICovXG5cbmV4cG9ydCBjb25zdCBnZXRSZWN0YW5nbGVCb3hBYnNvbHV0ZUNvb3JkcyA9IGJveFNjZW5lQ29vcmRzID0+IHtcbiAgcmV0dXJuIFtib3hTY2VuZUNvb3Jkcy54LCBib3hTY2VuZUNvb3Jkcy55LCBib3hTY2VuZUNvb3Jkcy54ICsgYm94U2NlbmVDb29yZHMud2lkdGgsIGJveFNjZW5lQ29vcmRzLnkgKyBib3hTY2VuZUNvb3Jkcy5oZWlnaHQsIGJveFNjZW5lQ29vcmRzLnggKyBib3hTY2VuZUNvb3Jkcy53aWR0aCAvIDIsIGJveFNjZW5lQ29vcmRzLnkgKyBib3hTY2VuZUNvb3Jkcy5oZWlnaHQgLyAyXTtcbn07XG5leHBvcnQgY29uc3QgcG9pbnRSZWxhdGl2ZVRvID0gKGVsZW1lbnQsIGFic29sdXRlQ29vcmRzKSA9PiB7XG4gIHJldHVybiBbYWJzb2x1dGVDb29yZHNbMF0gLSBlbGVtZW50LngsIGFic29sdXRlQ29vcmRzWzFdIC0gZWxlbWVudC55XTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RGlhbW9uZFBvaW50cyA9IGVsZW1lbnQgPT4ge1xuICAvLyBIZXJlIHdlIGFkZCArMSB0byBhdm9pZCB0aGVzZSBudW1iZXJzIHRvIGJlIDBcbiAgLy8gb3RoZXJ3aXNlIHJvdWdoLmpzIHdpbGwgdGhyb3cgYW4gZXJyb3IgY29tcGxhaW5pbmcgYWJvdXQgaXRcbiAgY29uc3QgdG9wWCA9IE1hdGguZmxvb3IoZWxlbWVudC53aWR0aCAvIDIpICsgMTtcbiAgY29uc3QgdG9wWSA9IDA7XG4gIGNvbnN0IHJpZ2h0WCA9IGVsZW1lbnQud2lkdGg7XG4gIGNvbnN0IHJpZ2h0WSA9IE1hdGguZmxvb3IoZWxlbWVudC5oZWlnaHQgLyAyKSArIDE7XG4gIGNvbnN0IGJvdHRvbVggPSB0b3BYO1xuICBjb25zdCBib3R0b21ZID0gZWxlbWVudC5oZWlnaHQ7XG4gIGNvbnN0IGxlZnRYID0gMDtcbiAgY29uc3QgbGVmdFkgPSByaWdodFk7XG4gIHJldHVybiBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV07XG59O1xuZXhwb3J0IGNvbnN0IGdldEN1cnZlUGF0aE9wcyA9IHNoYXBlID0+IHtcbiAgZm9yIChjb25zdCBzZXQgb2Ygc2hhcGUuc2V0cykge1xuICAgIGlmIChzZXQudHlwZSA9PT0gXCJwYXRoXCIpIHtcbiAgICAgIHJldHVybiBzZXQub3BzO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBzaGFwZS5zZXRzWzBdLm9wcztcbn07IC8vIHJlZmVyZW5jZTogaHR0cHM6Ly9lbGlvdC1qb25lcy5jb20vMjAxOS8xMi9jdWJpYy1iZXppZXItY3VydmUtYm91bmRpbmctYm94ZXNcblxuY29uc3QgZ2V0QmV6aWVyVmFsdWVGb3JUID0gKHQsIHAwLCBwMSwgcDIsIHAzKSA9PiB7XG4gIGNvbnN0IG9uZU1pbnVzVCA9IDEgLSB0O1xuICByZXR1cm4gTWF0aC5wb3cob25lTWludXNULCAzKSAqIHAwICsgMyAqIE1hdGgucG93KG9uZU1pbnVzVCwgMikgKiB0ICogcDEgKyAzICogb25lTWludXNUICogTWF0aC5wb3codCwgMikgKiBwMiArIE1hdGgucG93KHQsIDMpICogcDM7XG59O1xuXG5jb25zdCBzb2x2ZVF1YWRyYXRpYyA9IChwMCwgcDEsIHAyLCBwMykgPT4ge1xuICBjb25zdCBpID0gcDEgLSBwMDtcbiAgY29uc3QgaiA9IHAyIC0gcDE7XG4gIGNvbnN0IGsgPSBwMyAtIHAyO1xuICBjb25zdCBhID0gMyAqIGkgLSA2ICogaiArIDMgKiBrO1xuICBjb25zdCBiID0gNiAqIGogLSA2ICogaTtcbiAgY29uc3QgYyA9IDMgKiBpO1xuICBjb25zdCBzcXJ0UGFydCA9IGIgKiBiIC0gNCAqIGEgKiBjO1xuICBjb25zdCBoYXNTb2x1dGlvbiA9IHNxcnRQYXJ0ID49IDA7XG5cbiAgaWYgKCFoYXNTb2x1dGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxldCBzMSA9IG51bGw7XG4gIGxldCBzMiA9IG51bGw7XG4gIGxldCB0MSA9IEluZmluaXR5O1xuICBsZXQgdDIgPSBJbmZpbml0eTtcblxuICBpZiAoYSA9PT0gMCkge1xuICAgIHQxID0gdDIgPSAtYyAvIGI7XG4gIH0gZWxzZSB7XG4gICAgdDEgPSAoLWIgKyBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gICAgdDIgPSAoLWIgLSBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gIH1cblxuICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgczEgPSBnZXRCZXppZXJWYWx1ZUZvclQodDEsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIGlmICh0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICBzMiA9IGdldEJlemllclZhbHVlRm9yVCh0MiwgcDAsIHAxLCBwMiwgcDMpO1xuICB9XG5cbiAgcmV0dXJuIFtzMSwgczJdO1xufTtcblxuY29uc3QgZ2V0Q3ViaWNCZXppZXJDdXJ2ZUJvdW5kID0gKHAwLCBwMSwgcDIsIHAzKSA9PiB7XG4gIGNvbnN0IHNvbFggPSBzb2x2ZVF1YWRyYXRpYyhwMFswXSwgcDFbMF0sIHAyWzBdLCBwM1swXSk7XG4gIGNvbnN0IHNvbFkgPSBzb2x2ZVF1YWRyYXRpYyhwMFsxXSwgcDFbMV0sIHAyWzFdLCBwM1sxXSk7XG4gIGxldCBtaW5YID0gTWF0aC5taW4ocDBbMF0sIHAzWzBdKTtcbiAgbGV0IG1heFggPSBNYXRoLm1heChwMFswXSwgcDNbMF0pO1xuXG4gIGlmIChzb2xYKSB7XG4gICAgY29uc3QgeHMgPSBzb2xYLmZpbHRlcih4ID0+IHggIT09IG51bGwpO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCAuLi54cyk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIC4uLnhzKTtcbiAgfVxuXG4gIGxldCBtaW5ZID0gTWF0aC5taW4ocDBbMV0sIHAzWzFdKTtcbiAgbGV0IG1heFkgPSBNYXRoLm1heChwMFsxXSwgcDNbMV0pO1xuXG4gIGlmIChzb2xZKSB7XG4gICAgY29uc3QgeXMgPSBzb2xZLmZpbHRlcih5ID0+IHkgIT09IG51bGwpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCAuLi55cyk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIC4uLnlzKTtcbiAgfVxuXG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzID0gKG9wcywgdHJhbnNmb3JtWFkpID0+IHtcbiAgbGV0IGN1cnJlbnRQID0gWzAsIDBdO1xuICBjb25zdCB7XG4gICAgbWluWCxcbiAgICBtaW5ZLFxuICAgIG1heFgsXG4gICAgbWF4WVxuICB9ID0gb3BzLnJlZHVjZSgobGltaXRzLCB7XG4gICAgb3AsXG4gICAgZGF0YVxuICB9KSA9PiB7XG4gICAgLy8gVGhlcmUgYXJlIG9ubHkgZm91ciBvcGVyYXRpb24gdHlwZXM6XG4gICAgLy8gbW92ZSwgYmN1cnZlVG8sIGxpbmVUbywgYW5kIGN1cnZlVG9cbiAgICBpZiAob3AgPT09IFwibW92ZVwiKSB7XG4gICAgICAvLyBjaGFuZ2Ugc3RhcnRpbmcgcG9pbnRcbiAgICAgIGN1cnJlbnRQID0gZGF0YTsgLy8gbW92ZSBvcGVyYXRpb24gZG9lcyBub3QgZHJhdyBhbnl0aGluZzsgc28sIGl0IGFsd2F5c1xuICAgICAgLy8gcmV0dXJucyBmYWxzZVxuICAgIH0gZWxzZSBpZiAob3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgICAgY29uc3QgX3AxID0gW2RhdGFbMF0sIGRhdGFbMV1dO1xuICAgICAgY29uc3QgX3AyID0gW2RhdGFbMl0sIGRhdGFbM11dO1xuICAgICAgY29uc3QgX3AzID0gW2RhdGFbNF0sIGRhdGFbNV1dO1xuICAgICAgY29uc3QgcDEgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMSkgOiBfcDE7XG4gICAgICBjb25zdCBwMiA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AyKSA6IF9wMjtcbiAgICAgIGNvbnN0IHAzID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDMpIDogX3AzO1xuICAgICAgY29uc3QgcDAgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLmN1cnJlbnRQKSA6IGN1cnJlbnRQO1xuICAgICAgY3VycmVudFAgPSBfcDM7XG4gICAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRDdWJpY0JlemllckN1cnZlQm91bmQocDAsIHAxLCBwMiwgcDMpO1xuICAgICAgbGltaXRzLm1pblggPSBNYXRoLm1pbihsaW1pdHMubWluWCwgbWluWCk7XG4gICAgICBsaW1pdHMubWluWSA9IE1hdGgubWluKGxpbWl0cy5taW5ZLCBtaW5ZKTtcbiAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIG1heFgpO1xuICAgICAgbGltaXRzLm1heFkgPSBNYXRoLm1heChsaW1pdHMubWF4WSwgbWF4WSk7XG4gICAgfSBlbHNlIGlmIChvcCA9PT0gXCJsaW5lVG9cIikgey8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgfSBlbHNlIGlmIChvcCA9PT0gXCJxY3VydmVUb1wiKSB7Ly8gVE9ETzogSW1wbGVtZW50IHRoaXNcbiAgICB9XG5cbiAgICByZXR1cm4gbGltaXRzO1xuICB9LCB7XG4gICAgbWluWDogSW5maW5pdHksXG4gICAgbWluWTogSW5maW5pdHksXG4gICAgbWF4WDogLUluZmluaXR5LFxuICAgIG1heFk6IC1JbmZpbml0eVxuICB9KTtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5leHBvcnQgY29uc3QgZ2V0Qm91bmRzRnJvbVBvaW50cyA9IHBvaW50cyA9PiB7XG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwb2ludHMpIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMgPSBlbGVtZW50ID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhlbGVtZW50LnBvaW50cyk7XG4gIGNvbnN0IHgxID0gbWluWCArIGVsZW1lbnQueDtcbiAgY29uc3QgeTEgPSBtaW5ZICsgZWxlbWVudC55O1xuICBjb25zdCB4MiA9IG1heFggKyBlbGVtZW50Lng7XG4gIGNvbnN0IHkyID0gbWF4WSArIGVsZW1lbnQueTtcbiAgcmV0dXJuIFt4MSwgeTEsIHgyLCB5MiwgKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMl07XG59O1xuLyoqIEByZXR1cm5zIG51bWJlciBpbiBwaXhlbHMgKi9cblxuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkU2l6ZSA9IGFycm93aGVhZCA9PiB7XG4gIHN3aXRjaCAoYXJyb3doZWFkKSB7XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgY2FzZSBcImRfYXJyb3dcIjpcbiAgICAgIHJldHVybiAyNTtcblxuICAgIGNhc2UgXCJkX2RpYW1vbmRcIjpcbiAgICBjYXNlIFwiZF9kaWFtb25kX2ZpbGxlZFwiOlxuICAgICAgcmV0dXJuIDEyO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiAxNTtcbiAgfVxufTtcbi8qKiBAcmV0dXJucyBudW1iZXIgaW4gZGVncmVlcyAqL1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkQW5nbGUgPSBhcnJvd2hlYWQgPT4ge1xuICBzd2l0Y2ggKGFycm93aGVhZCkge1xuICAgIGNhc2UgXCJiYXJcIjpcbiAgICAgIHJldHVybiA5MDtcblxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgIGNhc2UgXCJkX2Fycm93XCI6XG4gICAgICByZXR1cm4gMjA7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIDI1O1xuICB9XG59O1xuZXhwb3J0IGNvbnN0IGdldEFycm93aGVhZFBvaW50cyA9IChlbGVtZW50LCBzaGFwZSwgcG9zaXRpb24sIGFycm93aGVhZCkgPT4ge1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuXG4gIGlmIChvcHMubGVuZ3RoIDwgMSkge1xuICAgIHJldHVybiBudWxsO1xuICB9IC8vIFRoZSBpbmRleCBvZiB0aGUgYkN1cnZlIG9wZXJhdGlvbiB0byBleGFtaW5lLlxuXG5cbiAgY29uc3QgaW5kZXggPSBwb3NpdGlvbiA9PT0gXCJzdGFydFwiID8gMSA6IG9wcy5sZW5ndGggLSAxO1xuICBjb25zdCBkYXRhID0gb3BzW2luZGV4XS5kYXRhO1xuICBjb25zdCBwMyA9IFtkYXRhWzRdLCBkYXRhWzVdXTtcbiAgY29uc3QgcDIgPSBbZGF0YVsyXSwgZGF0YVszXV07XG4gIGNvbnN0IHAxID0gW2RhdGFbMF0sIGRhdGFbMV1dOyAvLyBXZSBuZWVkIHRvIGZpbmQgcDAgb2YgdGhlIGJlemllciBjdXJ2ZS5cbiAgLy8gSXQgaXMgdHlwaWNhbGx5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBwcmV2aW91c1xuICAvLyBjdXJ2ZTsgaXQgY2FuIGFsc28gYmUgdGhlIHBvc2l0aW9uIG9mIG1vdmVUbyBvcGVyYXRpb24uXG5cbiAgY29uc3QgcHJldk9wID0gb3BzW2luZGV4IC0gMV07XG4gIGxldCBwMCA9IFswLCAwXTtcblxuICBpZiAocHJldk9wLm9wID09PSBcIm1vdmVcIikge1xuICAgIHAwID0gcHJldk9wLmRhdGE7XG4gIH0gZWxzZSBpZiAocHJldk9wLm9wID09PSBcImJjdXJ2ZVRvXCIpIHtcbiAgICBwMCA9IFtwcmV2T3AuZGF0YVs0XSwgcHJldk9wLmRhdGFbNV1dO1xuICB9IC8vIEIodCkgPSBwMCAqICgxLXQpXjMgKyAzcDEgKiB0ICogKDEtdCleMiArIDNwMiAqIHReMiAqICgxLXQpICsgcDMgKiB0XjNcblxuXG4gIGNvbnN0IGVxdWF0aW9uID0gKHQsIGlkeCkgPT4gTWF0aC5wb3coMSAtIHQsIDMpICogcDNbaWR4XSArIDMgKiB0ICogTWF0aC5wb3coMSAtIHQsIDIpICogcDJbaWR4XSArIDMgKiBNYXRoLnBvdyh0LCAyKSAqICgxIC0gdCkgKiBwMVtpZHhdICsgcDBbaWR4XSAqIE1hdGgucG93KHQsIDMpOyAvLyBFZSBrbm93IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBhcnJvdyAob3IgdGhlIGZpcnN0LCBpZiBzdGFydCBhcnJvd2hlYWQpLlxuXG5cbiAgY29uc3QgW3gyLCB5Ml0gPSBwb3NpdGlvbiA9PT0gXCJzdGFydFwiID8gcDAgOiBwMzsgLy8gQnkgdXNpbmcgY3ViaWMgYmV6aWVyIGVxdWF0aW9uIChCKHQpKSBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMsXG4gIC8vIHdlIGNhbGN1bGF0ZSBhIHBvaW50IHRoYXQgaXMgY2xvc2VyIHRvIHRoZSBsYXN0IHBvaW50LlxuICAvLyBUaGUgdmFsdWUgMC4zIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhbmQgaXQgd29ya3MgYmVzdCBmb3IgYWxsXG4gIC8vIHRoZSB0ZXN0ZWQgY2FzZXMuXG5cbiAgY29uc3QgW3gxLCB5MV0gPSBbZXF1YXRpb24oMC4zLCAwKSwgZXF1YXRpb24oMC4zLCAxKV07IC8vIEZpbmQgdGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGVcbiAgLy8gcHJldmlvdXNseSBjYWxjdWxhdGVkIHBvaW50cy5cblxuICBjb25zdCBkaXN0YW5jZSA9IE1hdGguaHlwb3QoeDIgLSB4MSwgeTIgLSB5MSk7XG4gIGNvbnN0IG54ID0gKHgyIC0geDEpIC8gZGlzdGFuY2U7XG4gIGNvbnN0IG55ID0gKHkyIC0geTEpIC8gZGlzdGFuY2U7XG4gIGNvbnN0IHNpemUgPSBnZXRBcnJvd2hlYWRTaXplKGFycm93aGVhZCk7XG4gIGxldCBsZW5ndGggPSAwO1xuICB7XG4gICAgLy8gTGVuZ3RoIGZvciAtPiBhcnJvd3MgaXMgYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBzZWN0aW9uXG4gICAgY29uc3QgW2N4LCBjeV0gPSBwb3NpdGlvbiA9PT0gXCJlbmRcIiA/IGVsZW1lbnQucG9pbnRzW2VsZW1lbnQucG9pbnRzLmxlbmd0aCAtIDFdIDogZWxlbWVudC5wb2ludHNbMF07XG4gICAgY29uc3QgW3B4LCBweV0gPSBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxID8gcG9zaXRpb24gPT09IFwiZW5kXCIgPyBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAyXSA6IGVsZW1lbnQucG9pbnRzWzFdIDogWzAsIDBdO1xuICAgIGxlbmd0aCA9IE1hdGguaHlwb3QoY3ggLSBweCwgY3kgLSBweSk7XG4gIH0gLy8gU2NhbGUgZG93biB0aGUgYXJyb3doZWFkIHVudGlsIHdlIGhpdCBhIGNlcnRhaW4gc2l6ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbG9vayB3ZWlyZC5cbiAgLy8gVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCBieSBtaW5pbWl6aW5nIGEgbWluaW11bSBzaXplIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgYXJyb3doZWFkXG5cbiAgY29uc3QgbGVuZ3RoTXVsdGlwbGllciA9IGFycm93aGVhZCA9PT0gXCJkX2RpYW1vbmRcIiB8fCBhcnJvd2hlYWQgPT09IFwiZF9kaWFtb25kX2ZpbGxlZFwiID8gMC4yNSA6IDAuNTtcbiAgY29uc3QgbWluU2l6ZSA9IE1hdGgubWluKHNpemUsIGxlbmd0aCAqIGxlbmd0aE11bHRpcGxpZXIpO1xuICBjb25zdCB4cyA9IHgyIC0gbnggKiBtaW5TaXplO1xuICBjb25zdCB5cyA9IHkyIC0gbnkgKiBtaW5TaXplO1xuXG4gIGlmIChhcnJvd2hlYWQgPT09IFwiZG90XCIpIHtcbiAgICBjb25zdCByID0gTWF0aC5oeXBvdCh5cyAtIHkyLCB4cyAtIHgyKSArIGVsZW1lbnQuc3Ryb2tlV2lkdGg7XG4gICAgcmV0dXJuIFt4MiwgeTIsIHJdO1xuICB9XG5cbiAgY29uc3QgYW5nbGUgPSBnZXRBcnJvd2hlYWRBbmdsZShhcnJvd2hlYWQpOyAvLyBSZXR1cm4gcG9pbnRzXG5cbiAgY29uc3QgW3gzLCB5M10gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsIC1hbmdsZSAqIE1hdGguUEkgLyAxODApO1xuICBjb25zdCBbeDQsIHk0XSA9IHJvdGF0ZSh4cywgeXMsIHgyLCB5MiwgYW5nbGUgKiBNYXRoLlBJIC8gMTgwKTtcblxuICBpZiAoYXJyb3doZWFkID09PSBcImRfZGlhbW9uZFwiIHx8IGFycm93aGVhZCA9PT0gXCJkX2RpYW1vbmRfZmlsbGVkXCIpIHtcbiAgICAvLyBwb2ludCBvcHBvc2l0ZSB0byB0aGUgYXJyb3doZWFkIHBvaW50XG4gICAgbGV0IG94O1xuICAgIGxldCBveTtcblxuICAgIGlmIChwb3NpdGlvbiA9PT0gXCJzdGFydFwiKSB7XG4gICAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEgPyBlbGVtZW50LnBvaW50c1sxXSA6IFswLCAwXTtcbiAgICAgIFtveCwgb3ldID0gcm90YXRlKHgyICsgbWluU2l6ZSAqIDIsIHkyLCB4MiwgeTIsIE1hdGguYXRhbjIocHkgLSB5MiwgcHggLSB4MikpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA+IDEgPyBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAyXSA6IFswLCAwXTtcbiAgICAgIFtveCwgb3ldID0gcm90YXRlKHgyIC0gbWluU2l6ZSAqIDIsIHkyLCB4MiwgeTIsIE1hdGguYXRhbjIoeTIgLSBweSwgeDIgLSBweCkpO1xuICAgIH1cblxuICAgIHJldHVybiBbeDIsIHkyLCB4MywgeTMsIG94LCBveSwgeDQsIHk0XTtcbiAgfVxuXG4gIHJldHVybiBbeDIsIHkyLCB4MywgeTMsIHg0LCB5NF07XG59O1xuXG5jb25zdCBnZW5lcmF0ZUxpbmVhckVsZW1lbnRTaGFwZSA9IGVsZW1lbnQgPT4ge1xuICBjb25zdCBnZW5lcmF0b3IgPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgY29uc3Qgb3B0aW9ucyA9IGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpO1xuXG4gIGNvbnN0IG1ldGhvZCA9ICgoKSA9PiB7XG4gICAgaWYgKGVsZW1lbnQucm91bmRuZXNzKSB7XG4gICAgICByZXR1cm4gXCJjdXJ2ZVwiO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmZpbGwpIHtcbiAgICAgIHJldHVybiBcInBvbHlnb25cIjtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJsaW5lYXJQYXRoXCI7XG4gIH0pKCk7XG5cbiAgcmV0dXJuIGdlbmVyYXRvclttZXRob2RdKGVsZW1lbnQucG9pbnRzLCBvcHRpb25zKTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRSb3RhdGVkQm91bmRzID0gKGVsZW1lbnQsIGN4LCBjeSkgPT4ge1xuICB2YXIgX2E7XG5cbiAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDIpIHtcbiAgICBjb25zdCBbcG9pbnRYLCBwb2ludFldID0gZWxlbWVudC5wb2ludHNbMF07XG4gICAgY29uc3QgW3gsIHldID0gcm90YXRlKGVsZW1lbnQueCArIHBvaW50WCwgZWxlbWVudC55ICsgcG9pbnRZLCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICAgIGxldCBjb29yZHMgPSBbeCwgeSwgeCwgeV07XG4gICAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgICBpZiAoYm91bmRUZXh0RWxlbWVudCkge1xuICAgICAgY29uc3QgY29vcmRzV2l0aEJvdW5kVGV4dCA9IExpbmVhckVsZW1lbnRFZGl0b3IuZ2V0TWluTWF4WFlXaXRoQm91bmRUZXh0KGVsZW1lbnQsIFt4LCB5LCB4LCB5XSwgYm91bmRUZXh0RWxlbWVudCk7XG4gICAgICBjb29yZHMgPSBbY29vcmRzV2l0aEJvdW5kVGV4dFswXSwgY29vcmRzV2l0aEJvdW5kVGV4dFsxXSwgY29vcmRzV2l0aEJvdW5kVGV4dFsyXSwgY29vcmRzV2l0aEJvdW5kVGV4dFszXV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvb3JkcztcbiAgfSAvLyBmaXJzdCBlbGVtZW50IGlzIGFsd2F5cyB0aGUgY3VydmVcblxuXG4gIGNvbnN0IGNhY2hlZFNoYXBlID0gKF9hID0gU2hhcGVDYWNoZS5nZXQoZWxlbWVudCkpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYVswXTtcbiAgY29uc3Qgc2hhcGUgPSBjYWNoZWRTaGFwZSAhPT0gbnVsbCAmJiBjYWNoZWRTaGFwZSAhPT0gdm9pZCAwID8gY2FjaGVkU2hhcGUgOiBnZW5lcmF0ZUxpbmVhckVsZW1lbnRTaGFwZShlbGVtZW50KTtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKHNoYXBlKTtcblxuICBjb25zdCB0cmFuc2Zvcm1YWSA9ICh4LCB5KSA9PiByb3RhdGUoZWxlbWVudC54ICsgeCwgZWxlbWVudC55ICsgeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcblxuICBjb25zdCByZXMgPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzLCB0cmFuc2Zvcm1YWSk7XG4gIGxldCBjb29yZHMgPSBbcmVzWzBdLCByZXNbMV0sIHJlc1syXSwgcmVzWzNdXTtcbiAgY29uc3QgYm91bmRUZXh0RWxlbWVudCA9IGdldEJvdW5kVGV4dEVsZW1lbnQoZWxlbWVudCk7XG5cbiAgaWYgKGJvdW5kVGV4dEVsZW1lbnQpIHtcbiAgICBjb25zdCBjb29yZHNXaXRoQm91bmRUZXh0ID0gTGluZWFyRWxlbWVudEVkaXRvci5nZXRNaW5NYXhYWVdpdGhCb3VuZFRleHQoZWxlbWVudCwgY29vcmRzLCBib3VuZFRleHRFbGVtZW50KTtcbiAgICBjb29yZHMgPSBbY29vcmRzV2l0aEJvdW5kVGV4dFswXSwgY29vcmRzV2l0aEJvdW5kVGV4dFsxXSwgY29vcmRzV2l0aEJvdW5kVGV4dFsyXSwgY29vcmRzV2l0aEJvdW5kVGV4dFszXV07XG4gIH1cblxuICByZXR1cm4gY29vcmRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCb3VuZHMgPSBlbGVtZW50ID0+IHtcbiAgcmV0dXJuIEVsZW1lbnRCb3VuZHMuZ2V0Qm91bmRzKGVsZW1lbnQpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDb21tb25Cb3VuZHMgPSBlbGVtZW50cyA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcbiAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeDEpO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCB5MSk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHgyKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeTIpO1xuICB9KTtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RHJhZ2dlZEVsZW1lbnRzQm91bmRzID0gKGVsZW1lbnRzLCBkcmFnT2Zmc2V0KSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIHJldHVybiBbbWluWCArIGRyYWdPZmZzZXQueCwgbWluWSArIGRyYWdPZmZzZXQueSwgbWF4WCArIGRyYWdPZmZzZXQueCwgbWF4WSArIGRyYWdPZmZzZXQueV07XG59O1xuZXhwb3J0IGNvbnN0IGdldFJlc2l6ZWRFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoZWxlbWVudCwgbmV4dFdpZHRoLCBuZXh0SGVpZ2h0LCBub3JtYWxpemVQb2ludHMpID0+IHtcbiAgaWYgKCEoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpIHx8IGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSkge1xuICAgIHJldHVybiBbZWxlbWVudC54LCBlbGVtZW50LnksIGVsZW1lbnQueCArIG5leHRXaWR0aCwgZWxlbWVudC55ICsgbmV4dEhlaWdodF07XG4gIH1cblxuICBjb25zdCBwb2ludHMgPSByZXNjYWxlUG9pbnRzKDAsIG5leHRXaWR0aCwgcmVzY2FsZVBvaW50cygxLCBuZXh0SGVpZ2h0LCBlbGVtZW50LnBvaW50cywgbm9ybWFsaXplUG9pbnRzKSwgbm9ybWFsaXplUG9pbnRzKTtcbiAgbGV0IGJvdW5kcztcblxuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBGcmVlIERyYXdcbiAgICBib3VuZHMgPSBnZXRCb3VuZHNGcm9tUG9pbnRzKHBvaW50cyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gTGluZVxuICAgIGNvbnN0IGdlbiA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICAgIGNvbnN0IGN1cnZlID0gIWVsZW1lbnQucm91bmRuZXNzID8gZ2VuLmxpbmVhclBhdGgocG9pbnRzLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSkgOiBnZW4uY3VydmUocG9pbnRzLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSk7XG4gICAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGN1cnZlKTtcbiAgICBib3VuZHMgPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGJvdW5kcztcbiAgcmV0dXJuIFttaW5YICsgZWxlbWVudC54LCBtaW5ZICsgZWxlbWVudC55LCBtYXhYICsgZWxlbWVudC54LCBtYXhZICsgZWxlbWVudC55XTtcbn07XG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudFBvaW50c0Nvb3JkcyA9IChlbGVtZW50LCBwb2ludHMpID0+IHtcbiAgLy8gVGhpcyBtaWdodCBiZSBjb21wdXRhdGlvbmFsbHkgaGVhdmV5XG4gIGNvbnN0IGdlbiA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICBjb25zdCBjdXJ2ZSA9IGVsZW1lbnQucm91bmRuZXNzID09IG51bGwgPyBnZW4ubGluZWFyUGF0aChwb2ludHMsIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKSA6IGdlbi5jdXJ2ZShwb2ludHMsIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKTtcbiAgY29uc3Qgb3BzID0gZ2V0Q3VydmVQYXRoT3BzKGN1cnZlKTtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIHJldHVybiBbbWluWCArIGVsZW1lbnQueCwgbWluWSArIGVsZW1lbnQueSwgbWF4WCArIGVsZW1lbnQueCwgbWF4WSArIGVsZW1lbnQueV07XG59O1xuZXhwb3J0IGNvbnN0IGdldENsb3Nlc3RFbGVtZW50Qm91bmRzID0gKGVsZW1lbnRzLCBmcm9tKSA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5EaXN0YW5jZSA9IEluZmluaXR5O1xuICBsZXQgY2xvc2VzdEVsZW1lbnQgPSBlbGVtZW50c1swXTtcbiAgZWxlbWVudHMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEJvdW5kcyhlbGVtZW50KTtcbiAgICBjb25zdCBkaXN0YW5jZSA9IGRpc3RhbmNlMmQoKHgxICsgeDIpIC8gMiwgKHkxICsgeTIpIC8gMiwgZnJvbS54LCBmcm9tLnkpO1xuXG4gICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICBjbG9zZXN0RWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGdldEVsZW1lbnRCb3VuZHMoY2xvc2VzdEVsZW1lbnQpO1xufTtcbmV4cG9ydCBjb25zdCBnZXRDb21tb25Cb3VuZGluZ0JveCA9IGVsZW1lbnRzID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHtcbiAgICBtaW5YLFxuICAgIG1pblksXG4gICAgbWF4WCxcbiAgICBtYXhZLFxuICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgIG1pZFg6IChtaW5YICsgbWF4WCkgLyAyLFxuICAgIG1pZFk6IChtaW5ZICsgbWF4WSkgLyAyXG4gIH07XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
4161
4161
 
4162
4162
  /***/ }),
4163
4163
 
@@ -4630,7 +4630,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4630
4630
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4631
4631
 
4632
4632
  "use strict";
4633
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.17.1-7391-063c61e\"}/dist/`;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDOztBQUV0QyxJQUFJLGFBQW9CLEtBQUssZ0RBQVE7QUFDckM7O0FBRUE7QUFDQSxFQUFFLHFCQUF1Qix3REFBd0Qsd0JBQXlCLENBQUMsR0FBRyxxQkFBNEIsQ0FBQztBQUMzSSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/NjdmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gRU5WLlRFU1QpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuRVhDQUxJRFJBV19BU1NFVF9QQVRIIHx8IGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlZJVEVfUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuVklURV9QS0dfVkVSU0lPTn0vZGlzdC9gO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./publicPath.js\n");
4633
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n\n /* global __webpack_public_path__:writable */\n __webpack_require__.p = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.17.1-7391-e65bf53\"}/dist/`;\n}//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDOztBQUV0QyxJQUFJLGFBQW9CLEtBQUssZ0RBQVE7QUFDckM7O0FBRUE7QUFDQSxFQUFFLHFCQUF1Qix3REFBd0Qsd0JBQXlCLENBQUMsR0FBRyxxQkFBNEIsQ0FBQztBQUMzSSIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL3B1YmxpY1BhdGguanM/NjdmOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFTlYgfSBmcm9tIFwiLi4vLi4vY29uc3RhbnRzXCI7XG5cbmlmIChwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gRU5WLlRFU1QpIHtcbiAgLyogZXNsaW50LWRpc2FibGUgKi9cblxuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPSB3aW5kb3cuRVhDQUxJRFJBV19BU1NFVF9QQVRIIHx8IGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlZJVEVfUEtHX05BTUV9QCR7cHJvY2Vzcy5lbnYuVklURV9QS0dfVkVSU0lPTn0vZGlzdC9gO1xufSJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./publicPath.js\n");
4634
4634
 
4635
4635
  /***/ }),
4636
4636
 
@@ -4773,7 +4773,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4773
4773
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4774
4774
 
4775
4775
  "use strict";
4776
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"_generateElementShape\": () => (/* binding */ _generateElementShape),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var points_on_curve__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! points-on-curve */ \"../../../node_modules/points-on-curve/lib/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _comparisons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./comparisons */ \"../../scene/comparisons.ts\");\n\n\n\n\n\n\n\n\n\nconst getDashArrayDashed = strokeWidth => [8, 8 + strokeWidth];\n\nconst getDashArrayDotted = strokeWidth => [1.5, 6 + strokeWidth];\n\nfunction adjustRoughness(element) {\n const roughness = element.roughness;\n const maxSize = Math.max(element.width, element.height);\n const minSize = Math.min(element.width, element.height); // don't reduce roughness if\n\n if ( // both sides relatively big\n minSize >= 20 && maxSize >= 50 || // is round & both sides above 15px\n minSize >= 15 && !!element.roundness && (0,_comparisons__WEBPACK_IMPORTED_MODULE_7__.canChangeRoundness)(element.type) || // relatively long linear element\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isLinearElement)(element) && maxSize >= 50) {\n return roughness;\n }\n\n return Math.min(roughness / (maxSize < 10 ? 3 : 2), 2.5);\n}\n\nconst generateRoughOptions = (element, continuousPath = false) => {\n const options = {\n seed: element.seed,\n strokeLineDash: element.strokeStyle === \"dashed\" ? getDashArrayDashed(element.strokeWidth) : element.strokeStyle === \"dotted\" ? getDashArrayDotted(element.strokeWidth) : undefined,\n // for non-solid strokes, disable multiStroke because it tends to make\n // dashes/dots overlay each other\n disableMultiStroke: element.strokeStyle !== \"solid\",\n // for non-solid strokes, increase the width a bit to make it visually\n // similar to solid strokes, because we're also disabling multiStroke\n strokeWidth: element.strokeStyle !== \"solid\" ? element.strokeWidth + 0.5 : element.strokeWidth,\n // when increasing strokeWidth, we must explicitly set fillWeight and\n // hachureGap because if not specified, roughjs uses strokeWidth to\n // calculate them (and we don't want the fills to be modified)\n fillWeight: element.strokeWidth / 2,\n hachureGap: element.strokeWidth * 4,\n roughness: adjustRoughness(element),\n stroke: element.strokeColor,\n preserveVertices: continuousPath || element.roughness < _constants__WEBPACK_IMPORTED_MODULE_5__.ROUGHNESS.cartoonist\n };\n\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n case \"diamond\":\n case \"ellipse\":\n {\n options.fillStyle = element.fillStyle;\n options.fill = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.backgroundColor) ? undefined : element.backgroundColor;\n\n if (element.type === \"ellipse\") {\n options.curveFitting = 1;\n }\n\n return options;\n }\n\n case \"line\":\n case \"freedraw\":\n {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_1__.isPathALoop)(element.points)) {\n options.fillStyle = element.fillStyle;\n options.fill = element.backgroundColor === \"transparent\" ? undefined : element.backgroundColor;\n }\n\n return options;\n }\n\n case \"arrow\":\n return options;\n\n default:\n {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n\nconst modifyIframeLikeForRoughOptions = (element, isExporting) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isIframeLikeElement)(element) && (isExporting || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isEmbeddableElement)(element) && !element.validated) && (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.backgroundColor) && (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.strokeColor)) {\n return Object.assign(Object.assign({}, element), {\n roughness: 0,\n backgroundColor: \"#d3d3d3\",\n fillStyle: \"solid\"\n });\n } else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isIframeElement)(element)) {\n return Object.assign(Object.assign({}, element), {\n strokeColor: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.strokeColor) ? \"#000000\" : element.strokeColor,\n backgroundColor: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.backgroundColor) ? \"#f4f4f6\" : element.backgroundColor\n });\n }\n\n return element;\n};\n\nconst getArrowheadShapes = (element, shape, position, arrowhead, generator, options, canvasBackgroundColor) => {\n const arrowheadPoints = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getArrowheadPoints)(element, shape, position, arrowhead);\n\n if (arrowheadPoints === null) {\n return [];\n }\n\n switch (arrowhead) {\n case \"dot\":\n {\n const [x, y, r] = arrowheadPoints;\n return [generator.circle(x, y, r, Object.assign(Object.assign({}, options), {\n fill: element.strokeColor,\n fillStyle: \"solid\",\n stroke: \"none\"\n }))];\n }\n\n case \"uml_triangle\":\n case \"triangle\":\n {\n const [x, y, x2, y2, x3, y3] = arrowheadPoints; // always use solid stroke for triangle arrowhead\n\n delete options.strokeLineDash;\n return [generator.polygon([[x, y], [x2, y2], [x3, y3], [x, y]], Object.assign(Object.assign({}, options), {\n fill: element.strokeColor,\n fillStyle: \"solid\"\n }))];\n }\n\n case \"uml_diamond\":\n case \"uml_diamond_filled\":\n {\n const [x, y, x2, y2, x3, y3, x4, y4] = arrowheadPoints; // always use solid stroke for triangle arrowhead\n\n delete options.strokeLineDash;\n return [generator.polygon([[x, y], [x2, y2], [x3, y3], [x4, y4], [x, y]], Object.assign(Object.assign({}, options), {\n // fill: element.strokeColor,\n fill: arrowhead === \"uml_diamond\" ? canvasBackgroundColor : element.strokeColor,\n fillStyle: \"solid\",\n roughness: Math.min(1, options.roughness || 0)\n }))];\n }\n\n case \"bar\":\n case \"arrow\":\n case \"uml_arrow\":\n default:\n {\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n\n if (element.strokeStyle === \"dotted\") {\n // for dotted arrows caps, reduce gap to make it more legible\n const dash = getDashArrayDotted(element.strokeWidth - 1);\n options.strokeLineDash = [dash[0], dash[1] - 1];\n } else {\n // for solid/dashed, keep solid arrow cap\n delete options.strokeLineDash;\n }\n\n return [generator.line(x3, y3, x2, y2, options), generator.line(x4, y4, x2, y2, options)];\n }\n }\n};\n/**\n * Generates the roughjs shape for given element.\n *\n * Low-level. Use `ShapeCache.generateElementShape` instead.\n *\n * @private\n */\n\n\nconst _generateElementShape = (element, generator, {\n isExporting,\n canvasBackgroundColor\n}) => {\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n {\n let shape; // this is for rendering the stroke/bg of the embeddable, especially\n // when the src url is not set\n\n if (element.roundness) {\n const w = element.width;\n const h = element.height;\n const r = (0,_math__WEBPACK_IMPORTED_MODULE_1__.getCornerRadius)(Math.min(w, h), element);\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(modifyIframeLikeForRoughOptions(element, isExporting), true));\n } else {\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(modifyIframeLikeForRoughOptions(element, isExporting), false));\n }\n\n return shape;\n }\n\n case \"diamond\":\n {\n let shape;\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getDiamondPoints)(element);\n\n if (element.roundness) {\n const verticalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_1__.getCornerRadius)(Math.abs(topX - leftX), element);\n const horizontalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_1__.getCornerRadius)(Math.abs(rightY - topY), element);\n shape = generator.path(`M ${topX + verticalRadius} ${topY + horizontalRadius} L ${rightX - verticalRadius} ${rightY - horizontalRadius}\n C ${rightX} ${rightY}, ${rightX} ${rightY}, ${rightX - verticalRadius} ${rightY + horizontalRadius}\n L ${bottomX + verticalRadius} ${bottomY - horizontalRadius}\n C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${bottomX - verticalRadius} ${bottomY - horizontalRadius}\n L ${leftX + verticalRadius} ${leftY + horizontalRadius}\n C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${leftY - horizontalRadius}\n L ${topX - verticalRadius} ${topY + horizontalRadius}\n C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${topY + horizontalRadius}`, generateRoughOptions(element, true));\n } else {\n shape = generator.polygon([[topX, topY], [rightX, rightY], [bottomX, bottomY], [leftX, leftY]], generateRoughOptions(element));\n }\n\n return shape;\n }\n\n case \"ellipse\":\n {\n const shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\n return shape;\n }\n\n case \"line\":\n case \"arrow\":\n {\n let shape;\n const options = generateRoughOptions(element); // points array can be empty in the beginning, so it is important to add\n // initial position to it\n\n const points = element.points.length ? element.points : [[0, 0]]; // curve is always the first element\n // this simplifies finding the curve for an element\n\n if (!element.roundness) {\n if (options.fill) {\n shape = [generator.polygon(points, options)];\n } else {\n shape = [generator.linearPath(points, options)];\n }\n } else {\n shape = [generator.curve(points, options)];\n } // add lines only in arrow\n\n\n if (element.type === \"arrow\") {\n const {\n startArrowhead = null,\n endArrowhead = \"arrow\"\n } = element;\n\n if (startArrowhead !== null) {\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead, generator, options, canvasBackgroundColor);\n shape.push(...shapes);\n }\n\n if (endArrowhead !== null) {\n if (endArrowhead === undefined) {// Hey, we have an old arrow here!\n }\n\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead, generator, options, canvasBackgroundColor);\n shape.push(...shapes);\n }\n }\n\n return shape;\n }\n\n case \"freedraw\":\n {\n let shape;\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateFreeDrawShape)(element);\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_1__.isPathALoop)(element.points)) {\n // generate rough polygon to fill freedraw shape\n const simplifiedPoints = (0,points_on_curve__WEBPACK_IMPORTED_MODULE_4__.simplify)(element.points, 0.75);\n shape = generator.curve(simplifiedPoints, Object.assign(Object.assign({}, generateRoughOptions(element)), {\n stroke: \"none\"\n }));\n } else {\n shape = null;\n }\n\n return shape;\n }\n\n case \"frame\":\n case \"magicframe\":\n case \"text\":\n case \"image\":\n {\n const shape = null; // we return (and cache) `null` to make sure we don't regenerate\n // `element.canvas` on rerenders\n\n return shape;\n }\n\n default:\n {\n (0,_utils__WEBPACK_IMPORTED_MODULE_3__.assertNever)(element, `generateElementShape(): Unimplemented type ${element === null || element === void 0 ? void 0 : element.type}`);\n return null;\n }\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QU0sSUFBSSx3QkFBd0IsRUFBRTtBQUNoRixnQkFBZ0IsdUJBQXVCLEVBQUU7QUFDekMsZ0JBQWdCLE1BQU0sRUFBRSxLQUFLLElBQUksTUFBTSxFQUFFLEtBQUssSUFBSSx1QkFBdUIsRUFBRSx3QkFBd0I7QUFDbkcsVUFBVTtBQUNWO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVEO0FBQ3ZEOztBQUVBLDBFQUEwRTtBQUMxRTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFZO0FBQ1o7QUFDQTtBQUNBLFVBQVU7QUFDVjtBQUNBLFVBQVU7OztBQUdWO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBWTs7QUFFWjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZDQUE2QztBQUM3Qzs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFFBQVEsOEVBQXFCOztBQUU3QixZQUFZLGtEQUFXO0FBQ3ZCO0FBQ0EsbUNBQW1DLHlEQUFRO0FBQzNDLGtGQUFrRjtBQUNsRjtBQUNBLFdBQVc7QUFDWCxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw0QkFBNEI7QUFDNUI7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsUUFBUSxtREFBVyx3REFBd0QsK0RBQStEO0FBQzFJO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL1NoYXBlLnRzP2E3NGUiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0RGlhbW9uZFBvaW50cywgZ2V0QXJyb3doZWFkUG9pbnRzIH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IGlzUGF0aEFMb29wLCBnZXRDb3JuZXJSYWRpdXMgfSBmcm9tIFwiLi4vbWF0aFwiO1xuaW1wb3J0IHsgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGlzVHJhbnNwYXJlbnQsIGFzc2VydE5ldmVyIH0gZnJvbSBcIi4uL3V0aWxzXCI7XG5pbXBvcnQgeyBzaW1wbGlmeSB9IGZyb20gXCJwb2ludHMtb24tY3VydmVcIjtcbmltcG9ydCB7IFJPVUdITkVTUyB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGlzRW1iZWRkYWJsZUVsZW1lbnQsIGlzSWZyYW1lRWxlbWVudCwgaXNJZnJhbWVMaWtlRWxlbWVudCwgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgY2FuQ2hhbmdlUm91bmRuZXNzIH0gZnJvbSBcIi4vY29tcGFyaXNvbnNcIjtcblxuY29uc3QgZ2V0RGFzaEFycmF5RGFzaGVkID0gc3Ryb2tlV2lkdGggPT4gWzgsIDggKyBzdHJva2VXaWR0aF07XG5cbmNvbnN0IGdldERhc2hBcnJheURvdHRlZCA9IHN0cm9rZVdpZHRoID0+IFsxLjUsIDYgKyBzdHJva2VXaWR0aF07XG5cbmZ1bmN0aW9uIGFkanVzdFJvdWdobmVzcyhlbGVtZW50KSB7XG4gIGNvbnN0IHJvdWdobmVzcyA9IGVsZW1lbnQucm91Z2huZXNzO1xuICBjb25zdCBtYXhTaXplID0gTWF0aC5tYXgoZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHQpO1xuICBjb25zdCBtaW5TaXplID0gTWF0aC5taW4oZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHQpOyAvLyBkb24ndCByZWR1Y2Ugcm91Z2huZXNzIGlmXG5cbiAgaWYgKCAvLyBib3RoIHNpZGVzIHJlbGF0aXZlbHkgYmlnXG4gIG1pblNpemUgPj0gMjAgJiYgbWF4U2l6ZSA+PSA1MCB8fCAvLyBpcyByb3VuZCAmIGJvdGggc2lkZXMgYWJvdmUgMTVweFxuICBtaW5TaXplID49IDE1ICYmICEhZWxlbWVudC5yb3VuZG5lc3MgJiYgY2FuQ2hhbmdlUm91bmRuZXNzKGVsZW1lbnQudHlwZSkgfHwgLy8gcmVsYXRpdmVseSBsb25nIGxpbmVhciBlbGVtZW50XG4gIGlzTGluZWFyRWxlbWVudChlbGVtZW50KSAmJiBtYXhTaXplID49IDUwKSB7XG4gICAgcmV0dXJuIHJvdWdobmVzcztcbiAgfVxuXG4gIHJldHVybiBNYXRoLm1pbihyb3VnaG5lc3MgLyAobWF4U2l6ZSA8IDEwID8gMyA6IDIpLCAyLjUpO1xufVxuXG5leHBvcnQgY29uc3QgZ2VuZXJhdGVSb3VnaE9wdGlvbnMgPSAoZWxlbWVudCwgY29udGludW91c1BhdGggPSBmYWxzZSkgPT4ge1xuICBjb25zdCBvcHRpb25zID0ge1xuICAgIHNlZWQ6IGVsZW1lbnQuc2VlZCxcbiAgICBzdHJva2VMaW5lRGFzaDogZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkYXNoZWRcIiA/IGdldERhc2hBcnJheURhc2hlZChlbGVtZW50LnN0cm9rZVdpZHRoKSA6IGVsZW1lbnQuc3Ryb2tlU3R5bGUgPT09IFwiZG90dGVkXCIgPyBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aCkgOiB1bmRlZmluZWQsXG4gICAgLy8gZm9yIG5vbi1zb2xpZCBzdHJva2VzLCBkaXNhYmxlIG11bHRpU3Ryb2tlIGJlY2F1c2UgaXQgdGVuZHMgdG8gbWFrZVxuICAgIC8vIGRhc2hlcy9kb3RzIG92ZXJsYXkgZWFjaCBvdGhlclxuICAgIGRpc2FibGVNdWx0aVN0cm9rZTogZWxlbWVudC5zdHJva2VTdHlsZSAhPT0gXCJzb2xpZFwiLFxuICAgIC8vIGZvciBub24tc29saWQgc3Ryb2tlcywgaW5jcmVhc2UgdGhlIHdpZHRoIGEgYml0IHRvIG1ha2UgaXQgdmlzdWFsbHlcbiAgICAvLyBzaW1pbGFyIHRvIHNvbGlkIHN0cm9rZXMsIGJlY2F1c2Ugd2UncmUgYWxzbyBkaXNhYmxpbmcgbXVsdGlTdHJva2VcbiAgICBzdHJva2VXaWR0aDogZWxlbWVudC5zdHJva2VTdHlsZSAhPT0gXCJzb2xpZFwiID8gZWxlbWVudC5zdHJva2VXaWR0aCArIDAuNSA6IGVsZW1lbnQuc3Ryb2tlV2lkdGgsXG4gICAgLy8gd2hlbiBpbmNyZWFzaW5nIHN0cm9rZVdpZHRoLCB3ZSBtdXN0IGV4cGxpY2l0bHkgc2V0IGZpbGxXZWlnaHQgYW5kXG4gICAgLy8gaGFjaHVyZUdhcCBiZWNhdXNlIGlmIG5vdCBzcGVjaWZpZWQsIHJvdWdoanMgdXNlcyBzdHJva2VXaWR0aCB0b1xuICAgIC8vIGNhbGN1bGF0ZSB0aGVtIChhbmQgd2UgZG9uJ3Qgd2FudCB0aGUgZmlsbHMgdG8gYmUgbW9kaWZpZWQpXG4gICAgZmlsbFdlaWdodDogZWxlbWVudC5zdHJva2VXaWR0aCAvIDIsXG4gICAgaGFjaHVyZUdhcDogZWxlbWVudC5zdHJva2VXaWR0aCAqIDQsXG4gICAgcm91Z2huZXNzOiBhZGp1c3RSb3VnaG5lc3MoZWxlbWVudCksXG4gICAgc3Ryb2tlOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgIHByZXNlcnZlVmVydGljZXM6IGNvbnRpbnVvdXNQYXRoIHx8IGVsZW1lbnQucm91Z2huZXNzIDwgUk9VR0hORVNTLmNhcnRvb25pc3RcbiAgfTtcblxuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaWZyYW1lXCI6XG4gICAgY2FzZSBcImVtYmVkZGFibGVcIjpcbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICB7XG4gICAgICAgIG9wdGlvbnMuZmlsbFN0eWxlID0gZWxlbWVudC5maWxsU3R5bGU7XG4gICAgICAgIG9wdGlvbnMuZmlsbCA9IGlzVHJhbnNwYXJlbnQoZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IpID8gdW5kZWZpbmVkIDogZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3I7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICAgICAgICBvcHRpb25zLmN1cnZlRml0dGluZyA9IDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9ucztcbiAgICAgIH1cblxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImZyZWVkcmF3XCI6XG4gICAgICB7XG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykpIHtcbiAgICAgICAgICBvcHRpb25zLmZpbGxTdHlsZSA9IGVsZW1lbnQuZmlsbFN0eWxlO1xuICAgICAgICAgIG9wdGlvbnMuZmlsbCA9IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yID09PSBcInRyYW5zcGFyZW50XCIgPyB1bmRlZmluZWQgOiBlbGVtZW50LmJhY2tncm91bmRDb2xvcjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgfVxuXG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgICByZXR1cm4gb3B0aW9ucztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5pbXBsZW1lbnRlZCB0eXBlICR7ZWxlbWVudC50eXBlfWApO1xuICAgICAgfVxuICB9XG59O1xuXG5jb25zdCBtb2RpZnlJZnJhbWVMaWtlRm9yUm91Z2hPcHRpb25zID0gKGVsZW1lbnQsIGlzRXhwb3J0aW5nKSA9PiB7XG4gIGlmIChpc0lmcmFtZUxpa2VFbGVtZW50KGVsZW1lbnQpICYmIChpc0V4cG9ydGluZyB8fCBpc0VtYmVkZGFibGVFbGVtZW50KGVsZW1lbnQpICYmICFlbGVtZW50LnZhbGlkYXRlZCkgJiYgaXNUcmFuc3BhcmVudChlbGVtZW50LmJhY2tncm91bmRDb2xvcikgJiYgaXNUcmFuc3BhcmVudChlbGVtZW50LnN0cm9rZUNvbG9yKSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGVsZW1lbnQpLCB7XG4gICAgICByb3VnaG5lc3M6IDAsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IFwiI2QzZDNkM1wiLFxuICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCJcbiAgICB9KTtcbiAgfSBlbHNlIGlmIChpc0lmcmFtZUVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBlbGVtZW50KSwge1xuICAgICAgc3Ryb2tlQ29sb3I6IGlzVHJhbnNwYXJlbnQoZWxlbWVudC5zdHJva2VDb2xvcikgPyBcIiMwMDAwMDBcIiA6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGlzVHJhbnNwYXJlbnQoZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IpID8gXCIjZjRmNGY2XCIgOiBlbGVtZW50LmJhY2tncm91bmRDb2xvclxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGVsZW1lbnQ7XG59O1xuXG5jb25zdCBnZXRBcnJvd2hlYWRTaGFwZXMgPSAoZWxlbWVudCwgc2hhcGUsIHBvc2l0aW9uLCBhcnJvd2hlYWQsIGdlbmVyYXRvciwgb3B0aW9ucywgY2FudmFzQmFja2dyb3VuZENvbG9yKSA9PiB7XG4gIGNvbnN0IGFycm93aGVhZFBvaW50cyA9IGdldEFycm93aGVhZFBvaW50cyhlbGVtZW50LCBzaGFwZSwgcG9zaXRpb24sIGFycm93aGVhZCk7XG5cbiAgaWYgKGFycm93aGVhZFBvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIHN3aXRjaCAoYXJyb3doZWFkKSB7XG4gICAgY2FzZSBcImRvdFwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBbeCwgeSwgcl0gPSBhcnJvd2hlYWRQb2ludHM7XG4gICAgICAgIHJldHVybiBbZ2VuZXJhdG9yLmNpcmNsZSh4LCB5LCByLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7XG4gICAgICAgICAgZmlsbDogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICBzdHJva2U6IFwibm9uZVwiXG4gICAgICAgIH0pKV07XG4gICAgICB9XG5cbiAgICBjYXNlIFwidW1sX3RyaWFuZ2xlXCI6XG4gICAgY2FzZSBcInRyaWFuZ2xlXCI6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFt4LCB5LCB4MiwgeTIsIHgzLCB5M10gPSBhcnJvd2hlYWRQb2ludHM7IC8vIGFsd2F5cyB1c2Ugc29saWQgc3Ryb2tlIGZvciB0cmlhbmdsZSBhcnJvd2hlYWRcblxuICAgICAgICBkZWxldGUgb3B0aW9ucy5zdHJva2VMaW5lRGFzaDtcbiAgICAgICAgcmV0dXJuIFtnZW5lcmF0b3IucG9seWdvbihbW3gsIHldLCBbeDIsIHkyXSwgW3gzLCB5M10sIFt4LCB5XV0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICAgICAgICBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgIGZpbGxTdHlsZTogXCJzb2xpZFwiXG4gICAgICAgIH0pKV07XG4gICAgICB9XG5cbiAgICBjYXNlIFwidW1sX2RpYW1vbmRcIjpcbiAgICBjYXNlIFwidW1sX2RpYW1vbmRfZmlsbGVkXCI6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFt4LCB5LCB4MiwgeTIsIHgzLCB5MywgeDQsIHk0XSA9IGFycm93aGVhZFBvaW50czsgLy8gYWx3YXlzIHVzZSBzb2xpZCBzdHJva2UgZm9yIHRyaWFuZ2xlIGFycm93aGVhZFxuXG4gICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuICAgICAgICByZXR1cm4gW2dlbmVyYXRvci5wb2x5Z29uKFtbeCwgeV0sIFt4MiwgeTJdLCBbeDMsIHkzXSwgW3g0LCB5NF0sIFt4LCB5XV0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICAgICAgICAvLyBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgIGZpbGw6IGFycm93aGVhZCA9PT0gXCJ1bWxfZGlhbW9uZFwiID8gY2FudmFzQmFja2dyb3VuZENvbG9yIDogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICByb3VnaG5lc3M6IE1hdGgubWluKDEsIG9wdGlvbnMucm91Z2huZXNzIHx8IDApXG4gICAgICAgIH0pKV07XG4gICAgICB9XG5cbiAgICBjYXNlIFwiYmFyXCI6XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgY2FzZSBcInVtbF9hcnJvd1wiOlxuICAgIGRlZmF1bHQ6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFt4MiwgeTIsIHgzLCB5MywgeDQsIHk0XSA9IGFycm93aGVhZFBvaW50cztcblxuICAgICAgICBpZiAoZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkb3R0ZWRcIikge1xuICAgICAgICAgIC8vIGZvciBkb3R0ZWQgYXJyb3dzIGNhcHMsIHJlZHVjZSBnYXAgdG8gbWFrZSBpdCBtb3JlIGxlZ2libGVcbiAgICAgICAgICBjb25zdCBkYXNoID0gZ2V0RGFzaEFycmF5RG90dGVkKGVsZW1lbnQuc3Ryb2tlV2lkdGggLSAxKTtcbiAgICAgICAgICBvcHRpb25zLnN0cm9rZUxpbmVEYXNoID0gW2Rhc2hbMF0sIGRhc2hbMV0gLSAxXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBmb3Igc29saWQvZGFzaGVkLCBrZWVwIHNvbGlkIGFycm93IGNhcFxuICAgICAgICAgIGRlbGV0ZSBvcHRpb25zLnN0cm9rZUxpbmVEYXNoO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtnZW5lcmF0b3IubGluZSh4MywgeTMsIHgyLCB5Miwgb3B0aW9ucyksIGdlbmVyYXRvci5saW5lKHg0LCB5NCwgeDIsIHkyLCBvcHRpb25zKV07XG4gICAgICB9XG4gIH1cbn07XG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgcm91Z2hqcyBzaGFwZSBmb3IgZ2l2ZW4gZWxlbWVudC5cbiAqXG4gKiBMb3ctbGV2ZWwuIFVzZSBgU2hhcGVDYWNoZS5nZW5lcmF0ZUVsZW1lbnRTaGFwZWAgaW5zdGVhZC5cbiAqXG4gKiBAcHJpdmF0ZVxuICovXG5cblxuZXhwb3J0IGNvbnN0IF9nZW5lcmF0ZUVsZW1lbnRTaGFwZSA9IChlbGVtZW50LCBnZW5lcmF0b3IsIHtcbiAgaXNFeHBvcnRpbmcsXG4gIGNhbnZhc0JhY2tncm91bmRDb2xvclxufSkgPT4ge1xuICBzd2l0Y2ggKGVsZW1lbnQudHlwZSkge1xuICAgIGNhc2UgXCJyZWN0YW5nbGVcIjpcbiAgICBjYXNlIFwiaWZyYW1lXCI6XG4gICAgY2FzZSBcImVtYmVkZGFibGVcIjpcbiAgICAgIHtcbiAgICAgICAgbGV0IHNoYXBlOyAvLyB0aGlzIGlzIGZvciByZW5kZXJpbmcgdGhlIHN0cm9rZS9iZyBvZiB0aGUgZW1iZWRkYWJsZSwgZXNwZWNpYWxseVxuICAgICAgICAvLyB3aGVuIHRoZSBzcmMgdXJsIGlzIG5vdCBzZXRcblxuICAgICAgICBpZiAoZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgICAgICBjb25zdCB3ID0gZWxlbWVudC53aWR0aDtcbiAgICAgICAgICBjb25zdCBoID0gZWxlbWVudC5oZWlnaHQ7XG4gICAgICAgICAgY29uc3QgciA9IGdldENvcm5lclJhZGl1cyhNYXRoLm1pbih3LCBoKSwgZWxlbWVudCk7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChgTSAke3J9IDAgTCAke3cgLSByfSAwIFEgJHt3fSAwLCAke3d9ICR7cn0gTCAke3d9ICR7aCAtIHJ9IFEgJHt3fSAke2h9LCAke3cgLSByfSAke2h9IEwgJHtyfSAke2h9IFEgMCAke2h9LCAwICR7aCAtIHJ9IEwgMCAke3J9IFEgMCAwLCAke3J9IDBgLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhtb2RpZnlJZnJhbWVMaWtlRm9yUm91Z2hPcHRpb25zKGVsZW1lbnQsIGlzRXhwb3J0aW5nKSwgdHJ1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnJlY3RhbmdsZSgwLCAwLCBlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCwgZ2VuZXJhdGVSb3VnaE9wdGlvbnMobW9kaWZ5SWZyYW1lTGlrZUZvclJvdWdoT3B0aW9ucyhlbGVtZW50LCBpc0V4cG9ydGluZyksIGZhbHNlKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICB9XG5cbiAgICBjYXNlIFwiZGlhbW9uZFwiOlxuICAgICAge1xuICAgICAgICBsZXQgc2hhcGU7XG4gICAgICAgIGNvbnN0IFt0b3BYLCB0b3BZLCByaWdodFgsIHJpZ2h0WSwgYm90dG9tWCwgYm90dG9tWSwgbGVmdFgsIGxlZnRZXSA9IGdldERpYW1vbmRQb2ludHMoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGVsZW1lbnQucm91bmRuZXNzKSB7XG4gICAgICAgICAgY29uc3QgdmVydGljYWxSYWRpdXMgPSBnZXRDb3JuZXJSYWRpdXMoTWF0aC5hYnModG9wWCAtIGxlZnRYKSwgZWxlbWVudCk7XG4gICAgICAgICAgY29uc3QgaG9yaXpvbnRhbFJhZGl1cyA9IGdldENvcm5lclJhZGl1cyhNYXRoLmFicyhyaWdodFkgLSB0b3BZKSwgZWxlbWVudCk7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucGF0aChgTSAke3RvcFggKyB2ZXJ0aWNhbFJhZGl1c30gJHt0b3BZICsgaG9yaXpvbnRhbFJhZGl1c30gTCAke3JpZ2h0WCAtIHZlcnRpY2FsUmFkaXVzfSAke3JpZ2h0WSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBDICR7cmlnaHRYfSAke3JpZ2h0WX0sICR7cmlnaHRYfSAke3JpZ2h0WX0sICR7cmlnaHRYIC0gdmVydGljYWxSYWRpdXN9ICR7cmlnaHRZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEwgJHtib3R0b21YICsgdmVydGljYWxSYWRpdXN9ICR7Ym90dG9tWSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBDICR7Ym90dG9tWH0gJHtib3R0b21ZfSwgJHtib3R0b21YfSAke2JvdHRvbVl9LCAke2JvdHRvbVggLSB2ZXJ0aWNhbFJhZGl1c30gJHtib3R0b21ZIC0gaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEwgJHtsZWZ0WCArIHZlcnRpY2FsUmFkaXVzfSAke2xlZnRZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHtsZWZ0WH0gJHtsZWZ0WX0sICR7bGVmdFh9ICR7bGVmdFl9LCAke2xlZnRYICsgdmVydGljYWxSYWRpdXN9ICR7bGVmdFkgLSBob3Jpem9udGFsUmFkaXVzfVxuICAgICAgICAgICAgTCAke3RvcFggLSB2ZXJ0aWNhbFJhZGl1c30gJHt0b3BZICsgaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHt0b3BYfSAke3RvcFl9LCAke3RvcFh9ICR7dG9wWX0sICR7dG9wWCArIHZlcnRpY2FsUmFkaXVzfSAke3RvcFkgKyBob3Jpem9udGFsUmFkaXVzfWAsIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQsIHRydWUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wb2x5Z29uKFtbdG9wWCwgdG9wWV0sIFtyaWdodFgsIHJpZ2h0WV0sIFtib3R0b21YLCBib3R0b21ZXSwgW2xlZnRYLCBsZWZ0WV1dLCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICB9XG5cbiAgICBjYXNlIFwiZWxsaXBzZVwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBzaGFwZSA9IGdlbmVyYXRvci5lbGxpcHNlKGVsZW1lbnQud2lkdGggLyAyLCBlbGVtZW50LmhlaWdodCAvIDIsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0LCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSk7XG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgIH1cblxuICAgIGNhc2UgXCJsaW5lXCI6XG4gICAgY2FzZSBcImFycm93XCI6XG4gICAgICB7XG4gICAgICAgIGxldCBzaGFwZTtcbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpOyAvLyBwb2ludHMgYXJyYXkgY2FuIGJlIGVtcHR5IGluIHRoZSBiZWdpbm5pbmcsIHNvIGl0IGlzIGltcG9ydGFudCB0byBhZGRcbiAgICAgICAgLy8gaW5pdGlhbCBwb3NpdGlvbiB0byBpdFxuXG4gICAgICAgIGNvbnN0IHBvaW50cyA9IGVsZW1lbnQucG9pbnRzLmxlbmd0aCA/IGVsZW1lbnQucG9pbnRzIDogW1swLCAwXV07IC8vIGN1cnZlIGlzIGFsd2F5cyB0aGUgZmlyc3QgZWxlbWVudFxuICAgICAgICAvLyB0aGlzIHNpbXBsaWZpZXMgZmluZGluZyB0aGUgY3VydmUgZm9yIGFuIGVsZW1lbnRcblxuICAgICAgICBpZiAoIWVsZW1lbnQucm91bmRuZXNzKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMuZmlsbCkge1xuICAgICAgICAgICAgc2hhcGUgPSBbZ2VuZXJhdG9yLnBvbHlnb24ocG9pbnRzLCBvcHRpb25zKV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5saW5lYXJQYXRoKHBvaW50cywgb3B0aW9ucyldO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzaGFwZSA9IFtnZW5lcmF0b3IuY3VydmUocG9pbnRzLCBvcHRpb25zKV07XG4gICAgICAgIH0gLy8gYWRkIGxpbmVzIG9ubHkgaW4gYXJyb3dcblxuXG4gICAgICAgIGlmIChlbGVtZW50LnR5cGUgPT09IFwiYXJyb3dcIikge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0YXJ0QXJyb3doZWFkID0gbnVsbCxcbiAgICAgICAgICAgIGVuZEFycm93aGVhZCA9IFwiYXJyb3dcIlxuICAgICAgICAgIH0gPSBlbGVtZW50O1xuXG4gICAgICAgICAgaWYgKHN0YXJ0QXJyb3doZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBzaGFwZXMgPSBnZXRBcnJvd2hlYWRTaGFwZXMoZWxlbWVudCwgc2hhcGUsIFwic3RhcnRcIiwgc3RhcnRBcnJvd2hlYWQsIGdlbmVyYXRvciwgb3B0aW9ucywgY2FudmFzQmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIHNoYXBlLnB1c2goLi4uc2hhcGVzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZW5kQXJyb3doZWFkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZW5kQXJyb3doZWFkID09PSB1bmRlZmluZWQpIHsvLyBIZXksIHdlIGhhdmUgYW4gb2xkIGFycm93IGhlcmUhXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhlbGVtZW50LCBzaGFwZSwgXCJlbmRcIiwgZW5kQXJyb3doZWFkLCBnZW5lcmF0b3IsIG9wdGlvbnMsIGNhbnZhc0JhY2tncm91bmRDb2xvcik7XG4gICAgICAgICAgICBzaGFwZS5wdXNoKC4uLnNoYXBlcyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgfVxuXG4gICAgY2FzZSBcImZyZWVkcmF3XCI6XG4gICAgICB7XG4gICAgICAgIGxldCBzaGFwZTtcbiAgICAgICAgZ2VuZXJhdGVGcmVlRHJhd1NoYXBlKGVsZW1lbnQpO1xuXG4gICAgICAgIGlmIChpc1BhdGhBTG9vcChlbGVtZW50LnBvaW50cykpIHtcbiAgICAgICAgICAvLyBnZW5lcmF0ZSByb3VnaCBwb2x5Z29uIHRvIGZpbGwgZnJlZWRyYXcgc2hhcGVcbiAgICAgICAgICBjb25zdCBzaW1wbGlmaWVkUG9pbnRzID0gc2ltcGxpZnkoZWxlbWVudC5wb2ludHMsIDAuNzUpO1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLmN1cnZlKHNpbXBsaWZpZWRQb2ludHMsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCkpLCB7XG4gICAgICAgICAgICBzdHJva2U6IFwibm9uZVwiXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgIH1cblxuICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgIGNhc2UgXCJtYWdpY2ZyYW1lXCI6XG4gICAgY2FzZSBcInRleHRcIjpcbiAgICBjYXNlIFwiaW1hZ2VcIjpcbiAgICAgIHtcbiAgICAgICAgY29uc3Qgc2hhcGUgPSBudWxsOyAvLyB3ZSByZXR1cm4gKGFuZCBjYWNoZSkgYG51bGxgIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCByZWdlbmVyYXRlXG4gICAgICAgIC8vIGBlbGVtZW50LmNhbnZhc2Agb24gcmVyZW5kZXJzXG5cbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgfVxuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgYXNzZXJ0TmV2ZXIoZWxlbWVudCwgYGdlbmVyYXRlRWxlbWVudFNoYXBlKCk6IFVuaW1wbGVtZW50ZWQgdHlwZSAke2VsZW1lbnQgPT09IG51bGwgfHwgZWxlbWVudCA9PT0gdm9pZCAwID8gdm9pZCAwIDogZWxlbWVudC50eXBlfWApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgfVxufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///../../scene/Shape.ts\n");
4776
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"_generateElementShape\": () => (/* binding */ _generateElementShape),\n/* harmony export */ \"generateRoughOptions\": () => (/* binding */ generateRoughOptions)\n/* harmony export */ });\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var points_on_curve__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! points-on-curve */ \"../../../node_modules/points-on-curve/lib/index.js\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _comparisons__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./comparisons */ \"../../scene/comparisons.ts\");\n\n\n\n\n\n\n\n\n\nconst getDashArrayDashed = strokeWidth => [8, 8 + strokeWidth];\n\nconst getDashArrayDotted = strokeWidth => [1.5, 6 + strokeWidth];\n\nfunction adjustRoughness(element) {\n const roughness = element.roughness;\n const maxSize = Math.max(element.width, element.height);\n const minSize = Math.min(element.width, element.height); // don't reduce roughness if\n\n if ( // both sides relatively big\n minSize >= 20 && maxSize >= 50 || // is round & both sides above 15px\n minSize >= 15 && !!element.roundness && (0,_comparisons__WEBPACK_IMPORTED_MODULE_7__.canChangeRoundness)(element.type) || // relatively long linear element\n (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isLinearElement)(element) && maxSize >= 50) {\n return roughness;\n }\n\n return Math.min(roughness / (maxSize < 10 ? 3 : 2), 2.5);\n}\n\nconst generateRoughOptions = (element, continuousPath = false) => {\n const options = {\n seed: element.seed,\n strokeLineDash: element.strokeStyle === \"dashed\" ? getDashArrayDashed(element.strokeWidth) : element.strokeStyle === \"dotted\" ? getDashArrayDotted(element.strokeWidth) : undefined,\n // for non-solid strokes, disable multiStroke because it tends to make\n // dashes/dots overlay each other\n disableMultiStroke: element.strokeStyle !== \"solid\",\n // for non-solid strokes, increase the width a bit to make it visually\n // similar to solid strokes, because we're also disabling multiStroke\n strokeWidth: element.strokeStyle !== \"solid\" ? element.strokeWidth + 0.5 : element.strokeWidth,\n // when increasing strokeWidth, we must explicitly set fillWeight and\n // hachureGap because if not specified, roughjs uses strokeWidth to\n // calculate them (and we don't want the fills to be modified)\n fillWeight: element.strokeWidth / 2,\n hachureGap: element.strokeWidth * 4,\n roughness: adjustRoughness(element),\n stroke: element.strokeColor,\n preserveVertices: continuousPath || element.roughness < _constants__WEBPACK_IMPORTED_MODULE_5__.ROUGHNESS.cartoonist\n };\n\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n case \"diamond\":\n case \"ellipse\":\n {\n options.fillStyle = element.fillStyle;\n options.fill = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.backgroundColor) ? undefined : element.backgroundColor;\n\n if (element.type === \"ellipse\") {\n options.curveFitting = 1;\n }\n\n return options;\n }\n\n case \"line\":\n case \"freedraw\":\n {\n if ((0,_math__WEBPACK_IMPORTED_MODULE_1__.isPathALoop)(element.points)) {\n options.fillStyle = element.fillStyle;\n options.fill = element.backgroundColor === \"transparent\" ? undefined : element.backgroundColor;\n }\n\n return options;\n }\n\n case \"arrow\":\n return options;\n\n default:\n {\n throw new Error(`Unimplemented type ${element.type}`);\n }\n }\n};\n\nconst modifyIframeLikeForRoughOptions = (element, isExporting) => {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isIframeLikeElement)(element) && (isExporting || (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isEmbeddableElement)(element) && !element.validated) && (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.backgroundColor) && (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.strokeColor)) {\n return Object.assign(Object.assign({}, element), {\n roughness: 0,\n backgroundColor: \"#d3d3d3\",\n fillStyle: \"solid\"\n });\n } else if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_6__.isIframeElement)(element)) {\n return Object.assign(Object.assign({}, element), {\n strokeColor: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.strokeColor) ? \"#000000\" : element.strokeColor,\n backgroundColor: (0,_utils__WEBPACK_IMPORTED_MODULE_3__.isTransparent)(element.backgroundColor) ? \"#f4f4f6\" : element.backgroundColor\n });\n }\n\n return element;\n};\n\nconst getArrowheadShapes = (element, shape, position, arrowhead, generator, options, canvasBackgroundColor) => {\n const arrowheadPoints = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getArrowheadPoints)(element, shape, position, arrowhead);\n\n if (arrowheadPoints === null) {\n return [];\n }\n\n switch (arrowhead) {\n case \"dot\":\n {\n const [x, y, r] = arrowheadPoints;\n return [generator.circle(x, y, r, Object.assign(Object.assign({}, options), {\n fill: element.strokeColor,\n fillStyle: \"solid\",\n stroke: \"none\"\n }))];\n }\n\n case \"d_triangle_filled\":\n case \"d_triangle\":\n case \"triangle\":\n {\n const [x, y, x2, y2, x3, y3] = arrowheadPoints; // always use solid stroke for triangle arrowhead\n\n delete options.strokeLineDash;\n return [generator.polygon([[x, y], [x2, y2], [x3, y3], [x, y]], Object.assign(Object.assign({}, options), {\n fill: arrowhead === \"d_triangle\" ? canvasBackgroundColor : element.strokeColor,\n fillStyle: \"solid\",\n roughness: Math.min(1, options.roughness || 0)\n }))];\n }\n\n case \"d_diamond\":\n case \"d_diamond_filled\":\n {\n const [x, y, x2, y2, x3, y3, x4, y4] = arrowheadPoints; // always use solid stroke for triangle arrowhead\n\n delete options.strokeLineDash;\n return [generator.polygon([[x, y], [x2, y2], [x3, y3], [x4, y4], [x, y]], Object.assign(Object.assign({}, options), {\n fill: arrowhead === \"d_diamond\" ? canvasBackgroundColor : element.strokeColor,\n fillStyle: \"solid\",\n roughness: Math.min(1, options.roughness || 0)\n }))];\n }\n\n case \"bar\":\n case \"arrow\":\n case \"d_arrow\":\n default:\n {\n const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n\n if (element.strokeStyle === \"dotted\") {\n // for dotted arrows caps, reduce gap to make it more legible\n const dash = getDashArrayDotted(element.strokeWidth - 1);\n options.strokeLineDash = [dash[0], dash[1] - 1];\n } else {\n // for solid/dashed, keep solid arrow cap\n delete options.strokeLineDash;\n }\n\n return [generator.line(x3, y3, x2, y2, options), generator.line(x4, y4, x2, y2, options)];\n }\n }\n};\n/**\n * Generates the roughjs shape for given element.\n *\n * Low-level. Use `ShapeCache.generateElementShape` instead.\n *\n * @private\n */\n\n\nconst _generateElementShape = (element, generator, {\n isExporting,\n canvasBackgroundColor\n}) => {\n switch (element.type) {\n case \"rectangle\":\n case \"iframe\":\n case \"embeddable\":\n {\n let shape; // this is for rendering the stroke/bg of the embeddable, especially\n // when the src url is not set\n\n if (element.roundness) {\n const w = element.width;\n const h = element.height;\n const r = (0,_math__WEBPACK_IMPORTED_MODULE_1__.getCornerRadius)(Math.min(w, h), element);\n shape = generator.path(`M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${h - r} Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${h - r} L 0 ${r} Q 0 0, ${r} 0`, generateRoughOptions(modifyIframeLikeForRoughOptions(element, isExporting), true));\n } else {\n shape = generator.rectangle(0, 0, element.width, element.height, generateRoughOptions(modifyIframeLikeForRoughOptions(element, isExporting), false));\n }\n\n return shape;\n }\n\n case \"diamond\":\n {\n let shape;\n const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] = (0,_element__WEBPACK_IMPORTED_MODULE_0__.getDiamondPoints)(element);\n\n if (element.roundness) {\n const verticalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_1__.getCornerRadius)(Math.abs(topX - leftX), element);\n const horizontalRadius = (0,_math__WEBPACK_IMPORTED_MODULE_1__.getCornerRadius)(Math.abs(rightY - topY), element);\n shape = generator.path(`M ${topX + verticalRadius} ${topY + horizontalRadius} L ${rightX - verticalRadius} ${rightY - horizontalRadius}\n C ${rightX} ${rightY}, ${rightX} ${rightY}, ${rightX - verticalRadius} ${rightY + horizontalRadius}\n L ${bottomX + verticalRadius} ${bottomY - horizontalRadius}\n C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${bottomX - verticalRadius} ${bottomY - horizontalRadius}\n L ${leftX + verticalRadius} ${leftY + horizontalRadius}\n C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${leftY - horizontalRadius}\n L ${topX - verticalRadius} ${topY + horizontalRadius}\n C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${topY + horizontalRadius}`, generateRoughOptions(element, true));\n } else {\n shape = generator.polygon([[topX, topY], [rightX, rightY], [bottomX, bottomY], [leftX, leftY]], generateRoughOptions(element));\n }\n\n return shape;\n }\n\n case \"ellipse\":\n {\n const shape = generator.ellipse(element.width / 2, element.height / 2, element.width, element.height, generateRoughOptions(element));\n return shape;\n }\n\n case \"line\":\n case \"arrow\":\n {\n let shape;\n const options = generateRoughOptions(element); // points array can be empty in the beginning, so it is important to add\n // initial position to it\n\n const points = element.points.length ? element.points : [[0, 0]]; // curve is always the first element\n // this simplifies finding the curve for an element\n\n if (!element.roundness) {\n if (options.fill) {\n shape = [generator.polygon(points, options)];\n } else {\n shape = [generator.linearPath(points, options)];\n }\n } else {\n shape = [generator.curve(points, options)];\n } // add lines only in arrow\n\n\n if (element.type === \"arrow\") {\n const {\n startArrowhead = null,\n endArrowhead = \"arrow\"\n } = element;\n\n if (startArrowhead !== null) {\n const shapes = getArrowheadShapes(element, shape, \"start\", startArrowhead, generator, options, canvasBackgroundColor);\n shape.push(...shapes);\n }\n\n if (endArrowhead !== null) {\n if (endArrowhead === undefined) {// Hey, we have an old arrow here!\n }\n\n const shapes = getArrowheadShapes(element, shape, \"end\", endArrowhead, generator, options, canvasBackgroundColor);\n shape.push(...shapes);\n }\n }\n\n return shape;\n }\n\n case \"freedraw\":\n {\n let shape;\n (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateFreeDrawShape)(element);\n\n if ((0,_math__WEBPACK_IMPORTED_MODULE_1__.isPathALoop)(element.points)) {\n // generate rough polygon to fill freedraw shape\n const simplifiedPoints = (0,points_on_curve__WEBPACK_IMPORTED_MODULE_4__.simplify)(element.points, 0.75);\n shape = generator.curve(simplifiedPoints, Object.assign(Object.assign({}, generateRoughOptions(element)), {\n stroke: \"none\"\n }));\n } else {\n shape = null;\n }\n\n return shape;\n }\n\n case \"frame\":\n case \"magicframe\":\n case \"text\":\n case \"image\":\n {\n const shape = null; // we return (and cache) `null` to make sure we don't regenerate\n // `element.canvas` on rerenders\n\n return shape;\n }\n\n default:\n {\n (0,_utils__WEBPACK_IMPORTED_MODULE_3__.assertNever)(element, `generateElementShape(): Unimplemented type ${element === null || element === void 0 ? void 0 : element.type}`);\n return null;\n }\n }\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUUsTUFBTSxJQUFJLHdCQUF3QixFQUFFO0FBQ2hGLGdCQUFnQix1QkFBdUIsRUFBRTtBQUN6QyxnQkFBZ0IsTUFBTSxFQUFFLEtBQUssSUFBSSxNQUFNLEVBQUUsS0FBSyxJQUFJLHVCQUF1QixFQUFFLHdCQUF3QjtBQUNuRyxVQUFVO0FBQ1Y7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSx1REFBdUQ7QUFDdkQ7O0FBRUEsMEVBQTBFO0FBQzFFOztBQUVBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0EsVUFBVTtBQUNWO0FBQ0EsVUFBVTs7O0FBR1Y7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFZOztBQUVaO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsNkNBQTZDO0FBQzdDOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFBUSw4RUFBcUI7O0FBRTdCLFlBQVksa0RBQVc7QUFDdkI7QUFDQSxtQ0FBbUMseURBQVE7QUFDM0Msa0ZBQWtGO0FBQ2xGO0FBQ0EsV0FBVztBQUNYLFVBQVU7QUFDVjtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QjtBQUM1Qjs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxRQUFRLG1EQUFXLHdEQUF3RCwrREFBK0Q7QUFDMUk7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vc2NlbmUvU2hhcGUudHM/YTc0ZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXREaWFtb25kUG9pbnRzLCBnZXRBcnJvd2hlYWRQb2ludHMgfSBmcm9tIFwiLi4vZWxlbWVudFwiO1xuaW1wb3J0IHsgaXNQYXRoQUxvb3AsIGdldENvcm5lclJhZGl1cyB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgeyBnZW5lcmF0ZUZyZWVEcmF3U2hhcGUgfSBmcm9tIFwiLi4vcmVuZGVyZXIvcmVuZGVyRWxlbWVudFwiO1xuaW1wb3J0IHsgaXNUcmFuc3BhcmVudCwgYXNzZXJ0TmV2ZXIgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB7IHNpbXBsaWZ5IH0gZnJvbSBcInBvaW50cy1vbi1jdXJ2ZVwiO1xuaW1wb3J0IHsgUk9VR0hORVNTIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgaXNFbWJlZGRhYmxlRWxlbWVudCwgaXNJZnJhbWVFbGVtZW50LCBpc0lmcmFtZUxpa2VFbGVtZW50LCBpc0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi4vZWxlbWVudC90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyBjYW5DaGFuZ2VSb3VuZG5lc3MgfSBmcm9tIFwiLi9jb21wYXJpc29uc1wiO1xuXG5jb25zdCBnZXREYXNoQXJyYXlEYXNoZWQgPSBzdHJva2VXaWR0aCA9PiBbOCwgOCArIHN0cm9rZVdpZHRoXTtcblxuY29uc3QgZ2V0RGFzaEFycmF5RG90dGVkID0gc3Ryb2tlV2lkdGggPT4gWzEuNSwgNiArIHN0cm9rZVdpZHRoXTtcblxuZnVuY3Rpb24gYWRqdXN0Um91Z2huZXNzKGVsZW1lbnQpIHtcbiAgY29uc3Qgcm91Z2huZXNzID0gZWxlbWVudC5yb3VnaG5lc3M7XG4gIGNvbnN0IG1heFNpemUgPSBNYXRoLm1heChlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7XG4gIGNvbnN0IG1pblNpemUgPSBNYXRoLm1pbihlbGVtZW50LndpZHRoLCBlbGVtZW50LmhlaWdodCk7IC8vIGRvbid0IHJlZHVjZSByb3VnaG5lc3MgaWZcblxuICBpZiAoIC8vIGJvdGggc2lkZXMgcmVsYXRpdmVseSBiaWdcbiAgbWluU2l6ZSA+PSAyMCAmJiBtYXhTaXplID49IDUwIHx8IC8vIGlzIHJvdW5kICYgYm90aCBzaWRlcyBhYm92ZSAxNXB4XG4gIG1pblNpemUgPj0gMTUgJiYgISFlbGVtZW50LnJvdW5kbmVzcyAmJiBjYW5DaGFuZ2VSb3VuZG5lc3MoZWxlbWVudC50eXBlKSB8fCAvLyByZWxhdGl2ZWx5IGxvbmcgbGluZWFyIGVsZW1lbnRcbiAgaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpICYmIG1heFNpemUgPj0gNTApIHtcbiAgICByZXR1cm4gcm91Z2huZXNzO1xuICB9XG5cbiAgcmV0dXJuIE1hdGgubWluKHJvdWdobmVzcyAvIChtYXhTaXplIDwgMTAgPyAzIDogMiksIDIuNSk7XG59XG5cbmV4cG9ydCBjb25zdCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyA9IChlbGVtZW50LCBjb250aW51b3VzUGF0aCA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgc2VlZDogZWxlbWVudC5zZWVkLFxuICAgIHN0cm9rZUxpbmVEYXNoOiBlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRhc2hlZFwiID8gZ2V0RGFzaEFycmF5RGFzaGVkKGVsZW1lbnQuc3Ryb2tlV2lkdGgpIDogZWxlbWVudC5zdHJva2VTdHlsZSA9PT0gXCJkb3R0ZWRcIiA/IGdldERhc2hBcnJheURvdHRlZChlbGVtZW50LnN0cm9rZVdpZHRoKSA6IHVuZGVmaW5lZCxcbiAgICAvLyBmb3Igbm9uLXNvbGlkIHN0cm9rZXMsIGRpc2FibGUgbXVsdGlTdHJva2UgYmVjYXVzZSBpdCB0ZW5kcyB0byBtYWtlXG4gICAgLy8gZGFzaGVzL2RvdHMgb3ZlcmxheSBlYWNoIG90aGVyXG4gICAgZGlzYWJsZU11bHRpU3Ryb2tlOiBlbGVtZW50LnN0cm9rZVN0eWxlICE9PSBcInNvbGlkXCIsXG4gICAgLy8gZm9yIG5vbi1zb2xpZCBzdHJva2VzLCBpbmNyZWFzZSB0aGUgd2lkdGggYSBiaXQgdG8gbWFrZSBpdCB2aXN1YWxseVxuICAgIC8vIHNpbWlsYXIgdG8gc29saWQgc3Ryb2tlcywgYmVjYXVzZSB3ZSdyZSBhbHNvIGRpc2FibGluZyBtdWx0aVN0cm9rZVxuICAgIHN0cm9rZVdpZHRoOiBlbGVtZW50LnN0cm9rZVN0eWxlICE9PSBcInNvbGlkXCIgPyBlbGVtZW50LnN0cm9rZVdpZHRoICsgMC41IDogZWxlbWVudC5zdHJva2VXaWR0aCxcbiAgICAvLyB3aGVuIGluY3JlYXNpbmcgc3Ryb2tlV2lkdGgsIHdlIG11c3QgZXhwbGljaXRseSBzZXQgZmlsbFdlaWdodCBhbmRcbiAgICAvLyBoYWNodXJlR2FwIGJlY2F1c2UgaWYgbm90IHNwZWNpZmllZCwgcm91Z2hqcyB1c2VzIHN0cm9rZVdpZHRoIHRvXG4gICAgLy8gY2FsY3VsYXRlIHRoZW0gKGFuZCB3ZSBkb24ndCB3YW50IHRoZSBmaWxscyB0byBiZSBtb2RpZmllZClcbiAgICBmaWxsV2VpZ2h0OiBlbGVtZW50LnN0cm9rZVdpZHRoIC8gMixcbiAgICBoYWNodXJlR2FwOiBlbGVtZW50LnN0cm9rZVdpZHRoICogNCxcbiAgICByb3VnaG5lc3M6IGFkanVzdFJvdWdobmVzcyhlbGVtZW50KSxcbiAgICBzdHJva2U6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgcHJlc2VydmVWZXJ0aWNlczogY29udGludW91c1BhdGggfHwgZWxlbWVudC5yb3VnaG5lc3MgPCBST1VHSE5FU1MuY2FydG9vbmlzdFxuICB9O1xuXG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJpZnJhbWVcIjpcbiAgICBjYXNlIFwiZW1iZWRkYWJsZVwiOlxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgY2FzZSBcImVsbGlwc2VcIjpcbiAgICAgIHtcbiAgICAgICAgb3B0aW9ucy5maWxsU3R5bGUgPSBlbGVtZW50LmZpbGxTdHlsZTtcbiAgICAgICAgb3B0aW9ucy5maWxsID0gaXNUcmFuc3BhcmVudChlbGVtZW50LmJhY2tncm91bmRDb2xvcikgPyB1bmRlZmluZWQgOiBlbGVtZW50LmJhY2tncm91bmRDb2xvcjtcblxuICAgICAgICBpZiAoZWxlbWVudC50eXBlID09PSBcImVsbGlwc2VcIikge1xuICAgICAgICAgIG9wdGlvbnMuY3VydmVGaXR0aW5nID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgfVxuXG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiZnJlZWRyYXdcIjpcbiAgICAgIHtcbiAgICAgICAgaWYgKGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSkge1xuICAgICAgICAgIG9wdGlvbnMuZmlsbFN0eWxlID0gZWxlbWVudC5maWxsU3R5bGU7XG4gICAgICAgICAgb3B0aW9ucy5maWxsID0gZWxlbWVudC5iYWNrZ3JvdW5kQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIiA/IHVuZGVmaW5lZCA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG9wdGlvbnM7XG4gICAgICB9XG5cbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICAgIHJldHVybiBvcHRpb25zO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmltcGxlbWVudGVkIHR5cGUgJHtlbGVtZW50LnR5cGV9YCk7XG4gICAgICB9XG4gIH1cbn07XG5cbmNvbnN0IG1vZGlmeUlmcmFtZUxpa2VGb3JSb3VnaE9wdGlvbnMgPSAoZWxlbWVudCwgaXNFeHBvcnRpbmcpID0+IHtcbiAgaWYgKGlzSWZyYW1lTGlrZUVsZW1lbnQoZWxlbWVudCkgJiYgKGlzRXhwb3J0aW5nIHx8IGlzRW1iZWRkYWJsZUVsZW1lbnQoZWxlbWVudCkgJiYgIWVsZW1lbnQudmFsaWRhdGVkKSAmJiBpc1RyYW5zcGFyZW50KGVsZW1lbnQuYmFja2dyb3VuZENvbG9yKSAmJiBpc1RyYW5zcGFyZW50KGVsZW1lbnQuc3Ryb2tlQ29sb3IpKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZWxlbWVudCksIHtcbiAgICAgIHJvdWdobmVzczogMCxcbiAgICAgIGJhY2tncm91bmRDb2xvcjogXCIjZDNkM2QzXCIsXG4gICAgICBmaWxsU3R5bGU6IFwic29saWRcIlxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGlzSWZyYW1lRWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGVsZW1lbnQpLCB7XG4gICAgICBzdHJva2VDb2xvcjogaXNUcmFuc3BhcmVudChlbGVtZW50LnN0cm9rZUNvbG9yKSA/IFwiIzAwMDAwMFwiIDogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgIGJhY2tncm91bmRDb2xvcjogaXNUcmFuc3BhcmVudChlbGVtZW50LmJhY2tncm91bmRDb2xvcikgPyBcIiNmNGY0ZjZcIiA6IGVsZW1lbnQuYmFja2dyb3VuZENvbG9yXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gZWxlbWVudDtcbn07XG5cbmNvbnN0IGdldEFycm93aGVhZFNoYXBlcyA9IChlbGVtZW50LCBzaGFwZSwgcG9zaXRpb24sIGFycm93aGVhZCwgZ2VuZXJhdG9yLCBvcHRpb25zLCBjYW52YXNCYWNrZ3JvdW5kQ29sb3IpID0+IHtcbiAgY29uc3QgYXJyb3doZWFkUG9pbnRzID0gZ2V0QXJyb3doZWFkUG9pbnRzKGVsZW1lbnQsIHNoYXBlLCBwb3NpdGlvbiwgYXJyb3doZWFkKTtcblxuICBpZiAoYXJyb3doZWFkUG9pbnRzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgc3dpdGNoIChhcnJvd2hlYWQpIHtcbiAgICBjYXNlIFwiZG90XCI6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFt4LCB5LCByXSA9IGFycm93aGVhZFBvaW50cztcbiAgICAgICAgcmV0dXJuIFtnZW5lcmF0b3IuY2lyY2xlKHgsIHksIHIsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICAgICAgICBmaWxsOiBlbGVtZW50LnN0cm9rZUNvbG9yLFxuICAgICAgICAgIGZpbGxTdHlsZTogXCJzb2xpZFwiLFxuICAgICAgICAgIHN0cm9rZTogXCJub25lXCJcbiAgICAgICAgfSkpXTtcbiAgICAgIH1cblxuICAgIGNhc2UgXCJkX3RyaWFuZ2xlX2ZpbGxlZFwiOlxuICAgIGNhc2UgXCJkX3RyaWFuZ2xlXCI6XG4gICAgY2FzZSBcInRyaWFuZ2xlXCI6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IFt4LCB5LCB4MiwgeTIsIHgzLCB5M10gPSBhcnJvd2hlYWRQb2ludHM7IC8vIGFsd2F5cyB1c2Ugc29saWQgc3Ryb2tlIGZvciB0cmlhbmdsZSBhcnJvd2hlYWRcblxuICAgICAgICBkZWxldGUgb3B0aW9ucy5zdHJva2VMaW5lRGFzaDtcbiAgICAgICAgcmV0dXJuIFtnZW5lcmF0b3IucG9seWdvbihbW3gsIHldLCBbeDIsIHkyXSwgW3gzLCB5M10sIFt4LCB5XV0sIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucyksIHtcbiAgICAgICAgICBmaWxsOiBhcnJvd2hlYWQgPT09IFwiZF90cmlhbmdsZVwiID8gY2FudmFzQmFja2dyb3VuZENvbG9yIDogZWxlbWVudC5zdHJva2VDb2xvcixcbiAgICAgICAgICBmaWxsU3R5bGU6IFwic29saWRcIixcbiAgICAgICAgICByb3VnaG5lc3M6IE1hdGgubWluKDEsIG9wdGlvbnMucm91Z2huZXNzIHx8IDApXG4gICAgICAgIH0pKV07XG4gICAgICB9XG5cbiAgICBjYXNlIFwiZF9kaWFtb25kXCI6XG4gICAgY2FzZSBcImRfZGlhbW9uZF9maWxsZWRcIjpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW3gsIHksIHgyLCB5MiwgeDMsIHkzLCB4NCwgeTRdID0gYXJyb3doZWFkUG9pbnRzOyAvLyBhbHdheXMgdXNlIHNvbGlkIHN0cm9rZSBmb3IgdHJpYW5nbGUgYXJyb3doZWFkXG5cbiAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3Ryb2tlTGluZURhc2g7XG4gICAgICAgIHJldHVybiBbZ2VuZXJhdG9yLnBvbHlnb24oW1t4LCB5XSwgW3gyLCB5Ml0sIFt4MywgeTNdLCBbeDQsIHk0XSwgW3gsIHldXSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zKSwge1xuICAgICAgICAgIGZpbGw6IGFycm93aGVhZCA9PT0gXCJkX2RpYW1vbmRcIiA/IGNhbnZhc0JhY2tncm91bmRDb2xvciA6IGVsZW1lbnQuc3Ryb2tlQ29sb3IsXG4gICAgICAgICAgZmlsbFN0eWxlOiBcInNvbGlkXCIsXG4gICAgICAgICAgcm91Z2huZXNzOiBNYXRoLm1pbigxLCBvcHRpb25zLnJvdWdobmVzcyB8fCAwKVxuICAgICAgICB9KSldO1xuICAgICAgfVxuXG4gICAgY2FzZSBcImJhclwiOlxuICAgIGNhc2UgXCJhcnJvd1wiOlxuICAgIGNhc2UgXCJkX2Fycm93XCI6XG4gICAgZGVmYXVsdDpcbiAgICAgIHtcbiAgICAgICAgY29uc3QgW3gyLCB5MiwgeDMsIHkzLCB4NCwgeTRdID0gYXJyb3doZWFkUG9pbnRzO1xuXG4gICAgICAgIGlmIChlbGVtZW50LnN0cm9rZVN0eWxlID09PSBcImRvdHRlZFwiKSB7XG4gICAgICAgICAgLy8gZm9yIGRvdHRlZCBhcnJvd3MgY2FwcywgcmVkdWNlIGdhcCB0byBtYWtlIGl0IG1vcmUgbGVnaWJsZVxuICAgICAgICAgIGNvbnN0IGRhc2ggPSBnZXREYXNoQXJyYXlEb3R0ZWQoZWxlbWVudC5zdHJva2VXaWR0aCAtIDEpO1xuICAgICAgICAgIG9wdGlvbnMuc3Ryb2tlTGluZURhc2ggPSBbZGFzaFswXSwgZGFzaFsxXSAtIDFdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIGZvciBzb2xpZC9kYXNoZWQsIGtlZXAgc29saWQgYXJyb3cgY2FwXG4gICAgICAgICAgZGVsZXRlIG9wdGlvbnMuc3Ryb2tlTGluZURhc2g7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW2dlbmVyYXRvci5saW5lKHgzLCB5MywgeDIsIHkyLCBvcHRpb25zKSwgZ2VuZXJhdG9yLmxpbmUoeDQsIHk0LCB4MiwgeTIsIG9wdGlvbnMpXTtcbiAgICAgIH1cbiAgfVxufTtcbi8qKlxuICogR2VuZXJhdGVzIHRoZSByb3VnaGpzIHNoYXBlIGZvciBnaXZlbiBlbGVtZW50LlxuICpcbiAqIExvdy1sZXZlbC4gVXNlIGBTaGFwZUNhY2hlLmdlbmVyYXRlRWxlbWVudFNoYXBlYCBpbnN0ZWFkLlxuICpcbiAqIEBwcml2YXRlXG4gKi9cblxuXG5leHBvcnQgY29uc3QgX2dlbmVyYXRlRWxlbWVudFNoYXBlID0gKGVsZW1lbnQsIGdlbmVyYXRvciwge1xuICBpc0V4cG9ydGluZyxcbiAgY2FudmFzQmFja2dyb3VuZENvbG9yXG59KSA9PiB7XG4gIHN3aXRjaCAoZWxlbWVudC50eXBlKSB7XG4gICAgY2FzZSBcInJlY3RhbmdsZVwiOlxuICAgIGNhc2UgXCJpZnJhbWVcIjpcbiAgICBjYXNlIFwiZW1iZWRkYWJsZVwiOlxuICAgICAge1xuICAgICAgICBsZXQgc2hhcGU7IC8vIHRoaXMgaXMgZm9yIHJlbmRlcmluZyB0aGUgc3Ryb2tlL2JnIG9mIHRoZSBlbWJlZGRhYmxlLCBlc3BlY2lhbGx5XG4gICAgICAgIC8vIHdoZW4gdGhlIHNyYyB1cmwgaXMgbm90IHNldFxuXG4gICAgICAgIGlmIChlbGVtZW50LnJvdW5kbmVzcykge1xuICAgICAgICAgIGNvbnN0IHcgPSBlbGVtZW50LndpZHRoO1xuICAgICAgICAgIGNvbnN0IGggPSBlbGVtZW50LmhlaWdodDtcbiAgICAgICAgICBjb25zdCByID0gZ2V0Q29ybmVyUmFkaXVzKE1hdGgubWluKHcsIGgpLCBlbGVtZW50KTtcbiAgICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wYXRoKGBNICR7cn0gMCBMICR7dyAtIHJ9IDAgUSAke3d9IDAsICR7d30gJHtyfSBMICR7d30gJHtoIC0gcn0gUSAke3d9ICR7aH0sICR7dyAtIHJ9ICR7aH0gTCAke3J9ICR7aH0gUSAwICR7aH0sIDAgJHtoIC0gcn0gTCAwICR7cn0gUSAwIDAsICR7cn0gMGAsIGdlbmVyYXRlUm91Z2hPcHRpb25zKG1vZGlmeUlmcmFtZUxpa2VGb3JSb3VnaE9wdGlvbnMoZWxlbWVudCwgaXNFeHBvcnRpbmcpLCB0cnVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IucmVjdGFuZ2xlKDAsIDAsIGVsZW1lbnQud2lkdGgsIGVsZW1lbnQuaGVpZ2h0LCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhtb2RpZnlJZnJhbWVMaWtlRm9yUm91Z2hPcHRpb25zKGVsZW1lbnQsIGlzRXhwb3J0aW5nKSwgZmFsc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgIH1cblxuICAgIGNhc2UgXCJkaWFtb25kXCI6XG4gICAgICB7XG4gICAgICAgIGxldCBzaGFwZTtcbiAgICAgICAgY29uc3QgW3RvcFgsIHRvcFksIHJpZ2h0WCwgcmlnaHRZLCBib3R0b21YLCBib3R0b21ZLCBsZWZ0WCwgbGVmdFldID0gZ2V0RGlhbW9uZFBvaW50cyhlbGVtZW50KTtcblxuICAgICAgICBpZiAoZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgICAgICBjb25zdCB2ZXJ0aWNhbFJhZGl1cyA9IGdldENvcm5lclJhZGl1cyhNYXRoLmFicyh0b3BYIC0gbGVmdFgpLCBlbGVtZW50KTtcbiAgICAgICAgICBjb25zdCBob3Jpem9udGFsUmFkaXVzID0gZ2V0Q29ybmVyUmFkaXVzKE1hdGguYWJzKHJpZ2h0WSAtIHRvcFkpLCBlbGVtZW50KTtcbiAgICAgICAgICBzaGFwZSA9IGdlbmVyYXRvci5wYXRoKGBNICR7dG9wWCArIHZlcnRpY2FsUmFkaXVzfSAke3RvcFkgKyBob3Jpem9udGFsUmFkaXVzfSBMICR7cmlnaHRYIC0gdmVydGljYWxSYWRpdXN9ICR7cmlnaHRZIC0gaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHtyaWdodFh9ICR7cmlnaHRZfSwgJHtyaWdodFh9ICR7cmlnaHRZfSwgJHtyaWdodFggLSB2ZXJ0aWNhbFJhZGl1c30gJHtyaWdodFkgKyBob3Jpem9udGFsUmFkaXVzfVxuICAgICAgICAgICAgTCAke2JvdHRvbVggKyB2ZXJ0aWNhbFJhZGl1c30gJHtib3R0b21ZIC0gaG9yaXpvbnRhbFJhZGl1c31cbiAgICAgICAgICAgIEMgJHtib3R0b21YfSAke2JvdHRvbVl9LCAke2JvdHRvbVh9ICR7Ym90dG9tWX0sICR7Ym90dG9tWCAtIHZlcnRpY2FsUmFkaXVzfSAke2JvdHRvbVkgLSBob3Jpem9udGFsUmFkaXVzfVxuICAgICAgICAgICAgTCAke2xlZnRYICsgdmVydGljYWxSYWRpdXN9ICR7bGVmdFkgKyBob3Jpem9udGFsUmFkaXVzfVxuICAgICAgICAgICAgQyAke2xlZnRYfSAke2xlZnRZfSwgJHtsZWZ0WH0gJHtsZWZ0WX0sICR7bGVmdFggKyB2ZXJ0aWNhbFJhZGl1c30gJHtsZWZ0WSAtIGhvcml6b250YWxSYWRpdXN9XG4gICAgICAgICAgICBMICR7dG9wWCAtIHZlcnRpY2FsUmFkaXVzfSAke3RvcFkgKyBob3Jpem9udGFsUmFkaXVzfVxuICAgICAgICAgICAgQyAke3RvcFh9ICR7dG9wWX0sICR7dG9wWH0gJHt0b3BZfSwgJHt0b3BYICsgdmVydGljYWxSYWRpdXN9ICR7dG9wWSArIGhvcml6b250YWxSYWRpdXN9YCwgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCwgdHJ1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gZ2VuZXJhdG9yLnBvbHlnb24oW1t0b3BYLCB0b3BZXSwgW3JpZ2h0WCwgcmlnaHRZXSwgW2JvdHRvbVgsIGJvdHRvbVldLCBbbGVmdFgsIGxlZnRZXV0sIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFwZTtcbiAgICAgIH1cblxuICAgIGNhc2UgXCJlbGxpcHNlXCI6XG4gICAgICB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gZ2VuZXJhdG9yLmVsbGlwc2UoZWxlbWVudC53aWR0aCAvIDIsIGVsZW1lbnQuaGVpZ2h0IC8gMiwgZWxlbWVudC53aWR0aCwgZWxlbWVudC5oZWlnaHQsIGdlbmVyYXRlUm91Z2hPcHRpb25zKGVsZW1lbnQpKTtcbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgfVxuXG4gICAgY2FzZSBcImxpbmVcIjpcbiAgICBjYXNlIFwiYXJyb3dcIjpcbiAgICAgIHtcbiAgICAgICAgbGV0IHNoYXBlO1xuICAgICAgICBjb25zdCBvcHRpb25zID0gZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCk7IC8vIHBvaW50cyBhcnJheSBjYW4gYmUgZW1wdHkgaW4gdGhlIGJlZ2lubmluZywgc28gaXQgaXMgaW1wb3J0YW50IHRvIGFkZFxuICAgICAgICAvLyBpbml0aWFsIHBvc2l0aW9uIHRvIGl0XG5cbiAgICAgICAgY29uc3QgcG9pbnRzID0gZWxlbWVudC5wb2ludHMubGVuZ3RoID8gZWxlbWVudC5wb2ludHMgOiBbWzAsIDBdXTsgLy8gY3VydmUgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgIC8vIHRoaXMgc2ltcGxpZmllcyBmaW5kaW5nIHRoZSBjdXJ2ZSBmb3IgYW4gZWxlbWVudFxuXG4gICAgICAgIGlmICghZWxlbWVudC5yb3VuZG5lc3MpIHtcbiAgICAgICAgICBpZiAob3B0aW9ucy5maWxsKSB7XG4gICAgICAgICAgICBzaGFwZSA9IFtnZW5lcmF0b3IucG9seWdvbihwb2ludHMsIG9wdGlvbnMpXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2hhcGUgPSBbZ2VuZXJhdG9yLmxpbmVhclBhdGgocG9pbnRzLCBvcHRpb25zKV07XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNoYXBlID0gW2dlbmVyYXRvci5jdXJ2ZShwb2ludHMsIG9wdGlvbnMpXTtcbiAgICAgICAgfSAvLyBhZGQgbGluZXMgb25seSBpbiBhcnJvd1xuXG5cbiAgICAgICAgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJhcnJvd1wiKSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgc3RhcnRBcnJvd2hlYWQgPSBudWxsLFxuICAgICAgICAgICAgZW5kQXJyb3doZWFkID0gXCJhcnJvd1wiXG4gICAgICAgICAgfSA9IGVsZW1lbnQ7XG5cbiAgICAgICAgICBpZiAoc3RhcnRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoYXBlcyA9IGdldEFycm93aGVhZFNoYXBlcyhlbGVtZW50LCBzaGFwZSwgXCJzdGFydFwiLCBzdGFydEFycm93aGVhZCwgZ2VuZXJhdG9yLCBvcHRpb25zLCBjYW52YXNCYWNrZ3JvdW5kQ29sb3IpO1xuICAgICAgICAgICAgc2hhcGUucHVzaCguLi5zaGFwZXMpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChlbmRBcnJvd2hlYWQgPT09IHVuZGVmaW5lZCkgey8vIEhleSwgd2UgaGF2ZSBhbiBvbGQgYXJyb3cgaGVyZSFcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgc2hhcGVzID0gZ2V0QXJyb3doZWFkU2hhcGVzKGVsZW1lbnQsIHNoYXBlLCBcImVuZFwiLCBlbmRBcnJvd2hlYWQsIGdlbmVyYXRvciwgb3B0aW9ucywgY2FudmFzQmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIHNoYXBlLnB1c2goLi4uc2hhcGVzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICB9XG5cbiAgICBjYXNlIFwiZnJlZWRyYXdcIjpcbiAgICAgIHtcbiAgICAgICAgbGV0IHNoYXBlO1xuICAgICAgICBnZW5lcmF0ZUZyZWVEcmF3U2hhcGUoZWxlbWVudCk7XG5cbiAgICAgICAgaWYgKGlzUGF0aEFMb29wKGVsZW1lbnQucG9pbnRzKSkge1xuICAgICAgICAgIC8vIGdlbmVyYXRlIHJvdWdoIHBvbHlnb24gdG8gZmlsbCBmcmVlZHJhdyBzaGFwZVxuICAgICAgICAgIGNvbnN0IHNpbXBsaWZpZWRQb2ludHMgPSBzaW1wbGlmeShlbGVtZW50LnBvaW50cywgMC43NSk7XG4gICAgICAgICAgc2hhcGUgPSBnZW5lcmF0b3IuY3VydmUoc2ltcGxpZmllZFBvaW50cywgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSksIHtcbiAgICAgICAgICAgIHN0cm9rZTogXCJub25lXCJcbiAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2hhcGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHNoYXBlO1xuICAgICAgfVxuXG4gICAgY2FzZSBcImZyYW1lXCI6XG4gICAgY2FzZSBcIm1hZ2ljZnJhbWVcIjpcbiAgICBjYXNlIFwidGV4dFwiOlxuICAgIGNhc2UgXCJpbWFnZVwiOlxuICAgICAge1xuICAgICAgICBjb25zdCBzaGFwZSA9IG51bGw7IC8vIHdlIHJldHVybiAoYW5kIGNhY2hlKSBgbnVsbGAgdG8gbWFrZSBzdXJlIHdlIGRvbid0IHJlZ2VuZXJhdGVcbiAgICAgICAgLy8gYGVsZW1lbnQuY2FudmFzYCBvbiByZXJlbmRlcnNcblxuICAgICAgICByZXR1cm4gc2hhcGU7XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICBhc3NlcnROZXZlcihlbGVtZW50LCBgZ2VuZXJhdGVFbGVtZW50U2hhcGUoKTogVW5pbXBsZW1lbnRlZCB0eXBlICR7ZWxlbWVudCA9PT0gbnVsbCB8fCBlbGVtZW50ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbGVtZW50LnR5cGV9YCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICB9XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/Shape.ts\n");
4777
4777
 
4778
4778
  /***/ }),
4779
4779
 
@@ -4806,7 +4806,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
4806
4806
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
4807
4807
 
4808
4808
  "use strict";
4809
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../packages/withinBounds */ \"../withinBounds.ts\");\n/* harmony import */ var _frame__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../frame */ \"../../frame.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`; // getContainerElement and getBoundTextElement and potentially other helpers\n// depend on `Scene` which will not be available when these pure utils are\n// called outside initialized Excalidraw editor instance or even if called\n// from inside Excalidraw if the elements were never cached by Scene (e.g.\n// for library elements).\n//\n// As such, before passing the elements down, we need to initialize a custom\n// Scene instance and assign them to it.\n//\n// FIXME This is a super hacky workaround and we'll need to rewrite this soon.\n\nconst __createSceneForElementsHack__ = elements => {\n const scene = new _Scene__WEBPACK_IMPORTED_MODULE_12__[\"default\"](); // we can't duplicate elements to regenerate ids because we need the\n // orig ids when embedding. So we do another hack of not mapping element\n // ids to Scene instances so that we don't override the editor elements\n // mapping.\n // We still need to clone the objects themselves to regen references.\n\n scene.replaceAllElements((0,_utils__WEBPACK_IMPORTED_MODULE_3__.cloneJSON)(elements), false);\n return scene;\n};\n\nconst truncateText = (element, maxWidth) => {\n if (element.width <= maxWidth) {\n return element;\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n ctx.font = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getFontString)({\n fontFamily: element.fontFamily,\n fontSize: element.fontSize\n });\n let text = element.text;\n const metrics = ctx.measureText(text);\n\n if (metrics.width > maxWidth) {\n // we iterate from the right, removing characters one by one instead\n // of bulding the string up. This assumes that it's more likely\n // your frame names will overflow by not that many characters\n // (if ever), so it sohuld be faster this way.\n for (let i = text.length; i > 0; i--) {\n const newText = `${text.slice(0, i)}...`;\n\n if (ctx.measureText(newText).width <= maxWidth) {\n text = newText;\n break;\n }\n }\n }\n\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_11__.newElementWith)(element, {\n text,\n width: maxWidth\n });\n};\n/**\n * When exporting frames, we need to render frame labels which are currently\n * being rendered in DOM when editing. Adding the labels as regular text\n * elements seems like a simple hack. In the future we'll want to move to\n * proper canvas rendering, even within editor (instead of DOM).\n */\n\n\nconst addFrameLabelsAsTextElements = (elements, opts) => {\n const nextElements = [];\n let frameIndex = 0;\n let magicFrameIndex = 0;\n\n for (const element of elements) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isFrameLikeElement)(element)) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isFrameElement)(element)) {\n frameIndex++;\n } else {\n magicFrameIndex++;\n }\n\n let textElement = (0,_element__WEBPACK_IMPORTED_MODULE_10__.newTextElement)({\n x: element.x,\n y: element.y - _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameOffsetY,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_4__.FONT_FAMILY.Assistant,\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameFontSize,\n lineHeight: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameLineHeight,\n strokeColor: opts.exportWithDarkMode ? _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorDarkTheme : _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorLightTheme,\n text: (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getFrameLikeTitle)(element, (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isFrameElement)(element) ? frameIndex : magicFrameIndex)\n });\n textElement.y -= textElement.height;\n textElement = truncateText(textElement, element.width);\n nextElements.push(textElement);\n }\n\n nextElements.push(element);\n }\n\n return nextElements;\n};\n\nconst getFrameRenderingConfig = (exportingFrame, frameRendering) => {\n frameRendering = frameRendering || (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)().frameRendering;\n return {\n enabled: exportingFrame ? true : frameRendering.enabled,\n outline: exportingFrame ? false : frameRendering.outline,\n name: exportingFrame ? false : frameRendering.name,\n clip: exportingFrame ? true : frameRendering.clip\n };\n};\n\nconst prepareElementsForRender = ({\n elements,\n exportingFrame,\n frameRendering,\n exportWithDarkMode\n}) => {\n let nextElements;\n\n if (exportingFrame) {\n nextElements = (0,_packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__.elementsOverlappingBBox)({\n elements,\n bounds: exportingFrame,\n type: \"overlap\"\n });\n } else if (frameRendering.enabled && frameRendering.name) {\n nextElements = addFrameLabelsAsTextElements(elements, {\n exportWithDarkMode\n });\n } else {\n nextElements = elements;\n }\n\n return nextElements;\n};\n\nconst exportToCanvas = (elements, appState, files, {\n exportBackground,\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportingFrame\n}, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return {\n canvas,\n scale: appState.exportScale\n };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig(exportingFrame !== null && exportingFrame !== void 0 ? exportingFrame : null, (_a = appState.frameRendering) !== null && _a !== void 0 ? _a : null);\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode: appState.exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding);\n const {\n canvas,\n scale = 1\n } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const {\n imageCache\n } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elementsForRender).map(element => element.fileId),\n files\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderStaticScene)({\n canvas,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n elements: elementsForRender,\n visibleElements: elementsForRender,\n scale,\n appState: Object.assign(Object.assign({}, appState), {\n frameRendering,\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\"\n }),\n renderConfig: {\n canvasBackgroundColor: viewBackgroundColor,\n imageCache,\n renderGrid: false,\n isExporting: true\n }\n });\n tempScene.destroy();\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _b, _c, _d;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig((_b = opts === null || opts === void 0 ? void 0 : opts.exportingFrame) !== null && _b !== void 0 ? _b : null, (_c = appState.frameRendering) !== null && _c !== void 0 ? _c : null);\n let {\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n exportWithDarkMode = false,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene\n } = appState;\n const {\n exportingFrame = null\n } = opts || {};\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n let metadata = \"\"; // we need to serialize the \"original\" elements before we put them through\n // the tempScene hack which duplicates and regenerates ids\n\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n // when embedding scene, we want to embed the origionally supplied\n // elements which don't contain the temp frame labels.\n // But it also requires that the exportToSvg is being supplied with\n // only the elements that we're exporting, and no extra.\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\")\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding); // initialize SVG root\n\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n\n if (exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\"; // Asset path needs to be determined only when using package\n\n if (true) {\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.1-7391-063c61e\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}`;\n\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n\n const offsetX = -minX + exportPadding;\n const offsetY = -minY + exportPadding;\n const frameElements = (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getFrameLikeElements)(elements);\n let exportingFrameClipPath = \"\";\n\n for (const frame of frameElements) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(frame);\n const cx = (x2 - x1) / 2 - (frame.x - x1);\n const cy = (y2 - y1) / 2 - (frame.y - y1);\n exportingFrameClipPath += `<clipPath id=${frame.id}>\n <rect transform=\"translate(${frame.x + offsetX} ${frame.y + offsetY}) rotate(${frame.angle} ${cx} ${cy})\"\n width=\"${frame.width}\"\n height=\"${frame.height}\"\n >\n </rect>\n </clipPath>`;\n }\n\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n @font-face {\n font-family: \"Assistant\";\n src: url(\"${assetPath}Assistant-Regular.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `; // render background rect\n\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elementsForRender, rsvg, svgRoot, files || {}, {\n offsetX,\n offsetY,\n isExporting: true,\n exportWithDarkMode,\n renderEmbeddables: (_d = opts === null || opts === void 0 ? void 0 : opts.renderEmbeddables) !== null && _d !== void 0 ? _d : false,\n frameRendering,\n canvasBackgroundColor: viewBackgroundColor\n });\n tempScene.destroy();\n return svgRoot;\n}); // calculate smallest area to fit the contents in\n\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding * 2;\n return [minX, minY, width, height];\n};\n\nconst getExportSize = (elements, exportPadding, scale) => {\n const [,, width, height] = getCanvasSize(elements, exportPadding).map(dimension => Math.trunc(dimension * scale));\n return [width, height];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TTtBQUM3RDtBQUNBO0FBQ0Esa0NBQWtDLE1BQU07QUFDeEMsbUNBQW1DLE9BQU87QUFDMUM7QUFDQTtBQUNBOztBQUVBLGVBQWUsNkRBQVM7QUFDeEIsRUFBRSx1RUFBZ0IsOENBQThDO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQSxtQ0FBbUMsZ0VBQWU7QUFDbEQsZ0JBQWdCLGdEQUFRO0FBQ3hCLGlCQUFpQixnREFBUTtBQUN6QjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz9jMzczIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5cbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcywgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZVRvU3ZnLCByZW5kZXJTdGF0aWNTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgY2xvbmVKU09OLCBkaXN0YW5jZSwgZ2V0Rm9udFN0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgRk9OVF9GQU1JTFksIEZSQU1FX1NUWUxFLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLCB1cGRhdGVJbWFnZUNhY2hlIH0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB7IGVsZW1lbnRzT3ZlcmxhcHBpbmdCQm94IH0gZnJvbSBcIi4uL3BhY2thZ2VzL3dpdGhpbkJvdW5kc1wiO1xuaW1wb3J0IHsgZ2V0RnJhbWVMaWtlRWxlbWVudHMsIGdldEZyYW1lTGlrZVRpdGxlLCBnZXRSb290RWxlbWVudHMgfSBmcm9tIFwiLi4vZnJhbWVcIjtcbmltcG9ydCB7IG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuL1NjZW5lXCI7XG5pbXBvcnQgeyBpc0ZyYW1lRWxlbWVudCwgaXNGcmFtZUxpa2VFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDsgLy8gZ2V0Q29udGFpbmVyRWxlbWVudCBhbmQgZ2V0Qm91bmRUZXh0RWxlbWVudCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgaGVscGVyc1xuLy8gZGVwZW5kIG9uIGBTY2VuZWAgd2hpY2ggd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlc2UgcHVyZSB1dGlscyBhcmVcbi8vIGNhbGxlZCBvdXRzaWRlIGluaXRpYWxpemVkIEV4Y2FsaWRyYXcgZWRpdG9yIGluc3RhbmNlIG9yIGV2ZW4gaWYgY2FsbGVkXG4vLyBmcm9tIGluc2lkZSBFeGNhbGlkcmF3IGlmIHRoZSBlbGVtZW50cyB3ZXJlIG5ldmVyIGNhY2hlZCBieSBTY2VuZSAoZS5nLlxuLy8gZm9yIGxpYnJhcnkgZWxlbWVudHMpLlxuLy9cbi8vIEFzIHN1Y2gsIGJlZm9yZSBwYXNzaW5nIHRoZSBlbGVtZW50cyBkb3duLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUgYSBjdXN0b21cbi8vIFNjZW5lIGluc3RhbmNlIGFuZCBhc3NpZ24gdGhlbSB0byBpdC5cbi8vXG4vLyBGSVhNRSBUaGlzIGlzIGEgc3VwZXIgaGFja3kgd29ya2Fyb3VuZCBhbmQgd2UnbGwgbmVlZCB0byByZXdyaXRlIHRoaXMgc29vbi5cblxuY29uc3QgX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fID0gZWxlbWVudHMgPT4ge1xuICBjb25zdCBzY2VuZSA9IG5ldyBTY2VuZSgpOyAvLyB3ZSBjYW4ndCBkdXBsaWNhdGUgZWxlbWVudHMgdG8gcmVnZW5lcmF0ZSBpZHMgYmVjYXVzZSB3ZSBuZWVkIHRoZVxuICAvLyBvcmlnIGlkcyB3aGVuIGVtYmVkZGluZy4gU28gd2UgZG8gYW5vdGhlciBoYWNrIG9mIG5vdCBtYXBwaW5nIGVsZW1lbnRcbiAgLy8gaWRzIHRvIFNjZW5lIGluc3RhbmNlcyBzbyB0aGF0IHdlIGRvbid0IG92ZXJyaWRlIHRoZSBlZGl0b3IgZWxlbWVudHNcbiAgLy8gbWFwcGluZy5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBjbG9uZSB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzIHRvIHJlZ2VuIHJlZmVyZW5jZXMuXG5cbiAgc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGNsb25lSlNPTihlbGVtZW50cyksIGZhbHNlKTtcbiAgcmV0dXJuIHNjZW5lO1xufTtcblxuY29uc3QgdHJ1bmNhdGVUZXh0ID0gKGVsZW1lbnQsIG1heFdpZHRoKSA9PiB7XG4gIGlmIChlbGVtZW50LndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBjdHguZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgIGZvbnRGYW1pbHk6IGVsZW1lbnQuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogZWxlbWVudC5mb250U2l6ZVxuICB9KTtcbiAgbGV0IHRleHQgPSBlbGVtZW50LnRleHQ7XG4gIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQodGV4dCk7XG5cbiAgaWYgKG1ldHJpY3Mud2lkdGggPiBtYXhXaWR0aCkge1xuICAgIC8vIHdlIGl0ZXJhdGUgZnJvbSB0aGUgcmlnaHQsIHJlbW92aW5nIGNoYXJhY3RlcnMgb25lIGJ5IG9uZSBpbnN0ZWFkXG4gICAgLy8gb2YgYnVsZGluZyB0aGUgc3RyaW5nIHVwLiBUaGlzIGFzc3VtZXMgdGhhdCBpdCdzIG1vcmUgbGlrZWx5XG4gICAgLy8geW91ciBmcmFtZSBuYW1lcyB3aWxsIG92ZXJmbG93IGJ5IG5vdCB0aGF0IG1hbnkgY2hhcmFjdGVyc1xuICAgIC8vIChpZiBldmVyKSwgc28gaXQgc29odWxkIGJlIGZhc3RlciB0aGlzIHdheS5cbiAgICBmb3IgKGxldCBpID0gdGV4dC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5ld1RleHQgPSBgJHt0ZXh0LnNsaWNlKDAsIGkpfS4uLmA7XG5cbiAgICAgIGlmIChjdHgubWVhc3VyZVRleHQobmV3VGV4dCkud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgdGV4dCA9IG5ld1RleHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgdGV4dCxcbiAgICB3aWR0aDogbWF4V2lkdGhcbiAgfSk7XG59O1xuLyoqXG4gKiBXaGVuIGV4cG9ydGluZyBmcmFtZXMsIHdlIG5lZWQgdG8gcmVuZGVyIGZyYW1lIGxhYmVscyB3aGljaCBhcmUgY3VycmVudGx5XG4gKiBiZWluZyByZW5kZXJlZCBpbiBET00gd2hlbiBlZGl0aW5nLiBBZGRpbmcgdGhlIGxhYmVscyBhcyByZWd1bGFyIHRleHRcbiAqIGVsZW1lbnRzIHNlZW1zIGxpa2UgYSBzaW1wbGUgaGFjay4gSW4gdGhlIGZ1dHVyZSB3ZSdsbCB3YW50IHRvIG1vdmUgdG9cbiAqIHByb3BlciBjYW52YXMgcmVuZGVyaW5nLCBldmVuIHdpdGhpbiBlZGl0b3IgKGluc3RlYWQgb2YgRE9NKS5cbiAqL1xuXG5cbmNvbnN0IGFkZEZyYW1lTGFiZWxzQXNUZXh0RWxlbWVudHMgPSAoZWxlbWVudHMsIG9wdHMpID0+IHtcbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gIGxldCBmcmFtZUluZGV4ID0gMDtcbiAgbGV0IG1hZ2ljRnJhbWVJbmRleCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKGlzRnJhbWVMaWtlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgaWYgKGlzRnJhbWVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGZyYW1lSW5kZXgrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hZ2ljRnJhbWVJbmRleCsrO1xuICAgICAgfVxuXG4gICAgICBsZXQgdGV4dEVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgIHg6IGVsZW1lbnQueCxcbiAgICAgICAgeTogZWxlbWVudC55IC0gRlJBTUVfU1RZTEUubmFtZU9mZnNldFksXG4gICAgICAgIGZvbnRGYW1pbHk6IEZPTlRfRkFNSUxZLkFzc2lzdGFudCxcbiAgICAgICAgZm9udFNpemU6IEZSQU1FX1NUWUxFLm5hbWVGb250U2l6ZSxcbiAgICAgICAgbGluZUhlaWdodDogRlJBTUVfU1RZTEUubmFtZUxpbmVIZWlnaHQsXG4gICAgICAgIHN0cm9rZUNvbG9yOiBvcHRzLmV4cG9ydFdpdGhEYXJrTW9kZSA/IEZSQU1FX1NUWUxFLm5hbWVDb2xvckRhcmtUaGVtZSA6IEZSQU1FX1NUWUxFLm5hbWVDb2xvckxpZ2h0VGhlbWUsXG4gICAgICAgIHRleHQ6IGdldEZyYW1lTGlrZVRpdGxlKGVsZW1lbnQsIGlzRnJhbWVFbGVtZW50KGVsZW1lbnQpID8gZnJhbWVJbmRleCA6IG1hZ2ljRnJhbWVJbmRleClcbiAgICAgIH0pO1xuICAgICAgdGV4dEVsZW1lbnQueSAtPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICB0ZXh0RWxlbWVudCA9IHRydW5jYXRlVGV4dCh0ZXh0RWxlbWVudCwgZWxlbWVudC53aWR0aCk7XG4gICAgICBuZXh0RWxlbWVudHMucHVzaCh0ZXh0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmV4dEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gbmV4dEVsZW1lbnRzO1xufTtcblxuY29uc3QgZ2V0RnJhbWVSZW5kZXJpbmdDb25maWcgPSAoZXhwb3J0aW5nRnJhbWUsIGZyYW1lUmVuZGVyaW5nKSA9PiB7XG4gIGZyYW1lUmVuZGVyaW5nID0gZnJhbWVSZW5kZXJpbmcgfHwgZ2V0RGVmYXVsdEFwcFN0YXRlKCkuZnJhbWVSZW5kZXJpbmc7XG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogZXhwb3J0aW5nRnJhbWUgPyB0cnVlIDogZnJhbWVSZW5kZXJpbmcuZW5hYmxlZCxcbiAgICBvdXRsaW5lOiBleHBvcnRpbmdGcmFtZSA/IGZhbHNlIDogZnJhbWVSZW5kZXJpbmcub3V0bGluZSxcbiAgICBuYW1lOiBleHBvcnRpbmdGcmFtZSA/IGZhbHNlIDogZnJhbWVSZW5kZXJpbmcubmFtZSxcbiAgICBjbGlwOiBleHBvcnRpbmdGcmFtZSA/IHRydWUgOiBmcmFtZVJlbmRlcmluZy5jbGlwXG4gIH07XG59O1xuXG5jb25zdCBwcmVwYXJlRWxlbWVudHNGb3JSZW5kZXIgPSAoe1xuICBlbGVtZW50cyxcbiAgZXhwb3J0aW5nRnJhbWUsXG4gIGZyYW1lUmVuZGVyaW5nLFxuICBleHBvcnRXaXRoRGFya01vZGVcbn0pID0+IHtcbiAgbGV0IG5leHRFbGVtZW50cztcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBuZXh0RWxlbWVudHMgPSBlbGVtZW50c092ZXJsYXBwaW5nQkJveCh7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIGJvdW5kczogZXhwb3J0aW5nRnJhbWUsXG4gICAgICB0eXBlOiBcIm92ZXJsYXBcIlxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZyYW1lUmVuZGVyaW5nLmVuYWJsZWQgJiYgZnJhbWVSZW5kZXJpbmcubmFtZSkge1xuICAgIG5leHRFbGVtZW50cyA9IGFkZEZyYW1lTGFiZWxzQXNUZXh0RWxlbWVudHMoZWxlbWVudHMsIHtcbiAgICAgIGV4cG9ydFdpdGhEYXJrTW9kZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG5leHRFbGVtZW50cyA9IGVsZW1lbnRzO1xuICB9XG5cbiAgcmV0dXJuIG5leHRFbGVtZW50cztcbn07XG5cbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCB7XG4gIGV4cG9ydEJhY2tncm91bmQsXG4gIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICBleHBvcnRpbmdGcmFtZVxufSwgY3JlYXRlQ2FudmFzID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICByZXR1cm4ge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGVcbiAgfTtcbn0pID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICB2YXIgX2E7XG5cbiAgY29uc3QgdGVtcFNjZW5lID0gX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fKGVsZW1lbnRzKTtcblxuICBlbGVtZW50cyA9IHRlbXBTY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgY29uc3QgZnJhbWVSZW5kZXJpbmcgPSBnZXRGcmFtZVJlbmRlcmluZ0NvbmZpZyhleHBvcnRpbmdGcmFtZSAhPT0gbnVsbCAmJiBleHBvcnRpbmdGcmFtZSAhPT0gdm9pZCAwID8gZXhwb3J0aW5nRnJhbWUgOiBudWxsLCAoX2EgPSBhcHBTdGF0ZS5mcmFtZVJlbmRlcmluZykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbCk7XG4gIGNvbnN0IGVsZW1lbnRzRm9yUmVuZGVyID0gcHJlcGFyZUVsZW1lbnRzRm9yUmVuZGVyKHtcbiAgICBlbGVtZW50cyxcbiAgICBleHBvcnRpbmdGcmFtZSxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICBmcmFtZVJlbmRlcmluZ1xuICB9KTtcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBleHBvcnRQYWRkaW5nID0gMDtcbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZXhwb3J0aW5nRnJhbWUgPyBbZXhwb3J0aW5nRnJhbWVdIDogZ2V0Um9vdEVsZW1lbnRzKGVsZW1lbnRzRm9yUmVuZGVyKSwgZXhwb3J0UGFkZGluZyk7XG4gIGNvbnN0IHtcbiAgICBjYW52YXMsXG4gICAgc2NhbGUgPSAxXG4gIH0gPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICBjb25zdCB7XG4gICAgaW1hZ2VDYWNoZVxuICB9ID0geWllbGQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50c0ZvclJlbmRlcikubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5maWxlSWQpLFxuICAgIGZpbGVzXG4gIH0pO1xuICByZW5kZXJTdGF0aWNTY2VuZSh7XG4gICAgY2FudmFzLFxuICAgIHJjOiByb3VnaC5jYW52YXMoY2FudmFzKSxcbiAgICBlbGVtZW50czogZWxlbWVudHNGb3JSZW5kZXIsXG4gICAgdmlzaWJsZUVsZW1lbnRzOiBlbGVtZW50c0ZvclJlbmRlcixcbiAgICBzY2FsZSxcbiAgICBhcHBTdGF0ZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhcHBTdGF0ZSksIHtcbiAgICAgIGZyYW1lUmVuZGVyaW5nLFxuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgdGhlbWU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSA/IFwiZGFya1wiIDogXCJsaWdodFwiXG4gICAgfSksXG4gICAgcmVuZGVyQ29uZmlnOiB7XG4gICAgICBjYW52YXNCYWNrZ3JvdW5kQ29sb3I6IHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIHRlbXBTY2VuZS5kZXN0cm95KCk7XG4gIHJldHVybiBjYW52YXM7XG59KTtcbmV4cG9ydCBjb25zdCBleHBvcnRUb1N2ZyA9IChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCBvcHRzKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgdmFyIF9iLCBfYywgX2Q7XG5cbiAgY29uc3QgdGVtcFNjZW5lID0gX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fKGVsZW1lbnRzKTtcblxuICBlbGVtZW50cyA9IHRlbXBTY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgY29uc3QgZnJhbWVSZW5kZXJpbmcgPSBnZXRGcmFtZVJlbmRlcmluZ0NvbmZpZygoX2IgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuZXhwb3J0aW5nRnJhbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGwsIChfYyA9IGFwcFN0YXRlLmZyYW1lUmVuZGVyaW5nKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBudWxsKTtcbiAgbGV0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICBleHBvcnRXaXRoRGFya01vZGUgPSBmYWxzZSxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lXG4gIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3Qge1xuICAgIGV4cG9ydGluZ0ZyYW1lID0gbnVsbFxuICB9ID0gb3B0cyB8fCB7fTtcbiAgY29uc3QgZWxlbWVudHNGb3JSZW5kZXIgPSBwcmVwYXJlRWxlbWVudHNGb3JSZW5kZXIoe1xuICAgIGVsZW1lbnRzLFxuICAgIGV4cG9ydGluZ0ZyYW1lLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICBmcmFtZVJlbmRlcmluZ1xuICB9KTtcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBleHBvcnRQYWRkaW5nID0gMDtcbiAgfVxuXG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7IC8vIHdlIG5lZWQgdG8gc2VyaWFsaXplIHRoZSBcIm9yaWdpbmFsXCIgZWxlbWVudHMgYmVmb3JlIHdlIHB1dCB0aGVtIHRocm91Z2hcbiAgLy8gdGhlIHRlbXBTY2VuZSBoYWNrIHdoaWNoIGR1cGxpY2F0ZXMgYW5kIHJlZ2VuZXJhdGVzIGlkc1xuXG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0geWllbGQgKHlpZWxkIGltcG9ydChcbiAgICAgIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiaW1hZ2VcIiAqL1xuICAgICAgXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKSkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICAvLyB3aGVuIGVtYmVkZGluZyBzY2VuZSwgd2Ugd2FudCB0byBlbWJlZCB0aGUgb3JpZ2lvbmFsbHkgc3VwcGxpZWRcbiAgICAgICAgLy8gZWxlbWVudHMgd2hpY2ggZG9uJ3QgY29udGFpbiB0aGUgdGVtcCBmcmFtZSBsYWJlbHMuXG4gICAgICAgIC8vIEJ1dCBpdCBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlIGV4cG9ydFRvU3ZnIGlzIGJlaW5nIHN1cHBsaWVkIHdpdGhcbiAgICAgICAgLy8gb25seSB0aGUgZWxlbWVudHMgdGhhdCB3ZSdyZSBleHBvcnRpbmcsIGFuZCBubyBleHRyYS5cbiAgICAgICAgdGV4dDogc2VyaWFsaXplQXNKU09OKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMgfHwge30sIFwibG9jYWxcIilcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGV4cG9ydGluZ0ZyYW1lID8gW2V4cG9ydGluZ0ZyYW1lXSA6IGdldFJvb3RFbGVtZW50cyhlbGVtZW50c0ZvclJlbmRlciksIGV4cG9ydFBhZGRpbmcpOyAvLyBpbml0aWFsaXplIFNWRyByb290XG5cbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG5cbiAgaWYgKGV4cG9ydFdpdGhEYXJrTW9kZSkge1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gIH1cblxuICBsZXQgYXNzZXRQYXRoID0gXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL1wiOyAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcblxuICBpZiAocHJvY2Vzcy5lbnYuVklURV9JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5WSVRFX1BLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoID09PSBudWxsIHx8IGFzc2V0UGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXNzZXRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuXG4gICAgYXNzZXRQYXRoID0gYCR7YXNzZXRQYXRofS9kaXN0L2V4Y2FsaWRyYXctYXNzZXRzL2A7XG4gIH1cblxuICBjb25zdCBvZmZzZXRYID0gLW1pblggKyBleHBvcnRQYWRkaW5nO1xuICBjb25zdCBvZmZzZXRZID0gLW1pblkgKyBleHBvcnRQYWRkaW5nO1xuICBjb25zdCBmcmFtZUVsZW1lbnRzID0gZ2V0RnJhbWVMaWtlRWxlbWVudHMoZWxlbWVudHMpO1xuICBsZXQgZXhwb3J0aW5nRnJhbWVDbGlwUGF0aCA9IFwiXCI7XG5cbiAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhmcmFtZSk7XG4gICAgY29uc3QgY3ggPSAoeDIgLSB4MSkgLyAyIC0gKGZyYW1lLnggLSB4MSk7XG4gICAgY29uc3QgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGZyYW1lLnkgLSB5MSk7XG4gICAgZXhwb3J0aW5nRnJhbWVDbGlwUGF0aCArPSBgPGNsaXBQYXRoIGlkPSR7ZnJhbWUuaWR9PlxuICAgICAgICAgICAgPHJlY3QgdHJhbnNmb3JtPVwidHJhbnNsYXRlKCR7ZnJhbWUueCArIG9mZnNldFh9ICR7ZnJhbWUueSArIG9mZnNldFl9KSByb3RhdGUoJHtmcmFtZS5hbmdsZX0gJHtjeH0gJHtjeX0pXCJcbiAgICAgICAgICB3aWR0aD1cIiR7ZnJhbWUud2lkdGh9XCJcbiAgICAgICAgICBoZWlnaHQ9XCIke2ZyYW1lLmhlaWdodH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3JlY3Q+XG4gICAgICAgIDwvY2xpcFBhdGg+YDtcbiAgfVxuXG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkFzc2lzdGFudFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUFzc2lzdGFudC1SZWd1bGFyLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gICAgJHtleHBvcnRpbmdGcmFtZUNsaXBQYXRofVxuICA8L2RlZnM+XG4gIGA7IC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcblxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInJlY3RcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGh9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB2aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICBzdmdSb290LmFwcGVuZENoaWxkKHJlY3QpO1xuICB9XG5cbiAgY29uc3QgcnN2ZyA9IHJvdWdoLnN2ZyhzdmdSb290KTtcbiAgcmVuZGVyU2NlbmVUb1N2ZyhlbGVtZW50c0ZvclJlbmRlciwgcnN2Zywgc3ZnUm9vdCwgZmlsZXMgfHwge30sIHtcbiAgICBvZmZzZXRYLFxuICAgIG9mZnNldFksXG4gICAgaXNFeHBvcnRpbmc6IHRydWUsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIHJlbmRlckVtYmVkZGFibGVzOiAoX2QgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMucmVuZGVyRW1iZWRkYWJsZXMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlLFxuICAgIGZyYW1lUmVuZGVyaW5nLFxuICAgIGNhbnZhc0JhY2tncm91bmRDb2xvcjogdmlld0JhY2tncm91bmRDb2xvclxuICB9KTtcbiAgdGVtcFNjZW5lLmRlc3Ryb3koKTtcbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59KTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkgPT4ge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZGltZW5zaW9uID0+IE1hdGgudHJ1bmMoZGltZW5zaW9uICogc2NhbGUpKTtcbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
4809
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\n/* harmony import */ var _packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ../packages/withinBounds */ \"../withinBounds.ts\");\n/* harmony import */ var _frame__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ../frame */ \"../../frame.ts\");\n/* harmony import */ var _element__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(/*! ../element */ \"../../element/index.ts\");\n/* harmony import */ var _element_mutateElement__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(/*! ../element/mutateElement */ \"../../element/mutateElement.ts\");\n/* harmony import */ var _Scene__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(/*! ./Scene */ \"../../scene/Scene.ts\");\n/* harmony import */ var _element_typeChecks__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(/*! ../element/typeChecks */ \"../../element/typeChecks.ts\");\nvar __awaiter = undefined && undefined.__awaiter || function (thisArg, _arguments, P, generator) {\n function adopt(value) {\n return value instanceof P ? value : new P(function (resolve) {\n resolve(value);\n });\n }\n\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) {\n try {\n step(generator.next(value));\n } catch (e) {\n reject(e);\n }\n }\n\n function rejected(value) {\n try {\n step(generator[\"throw\"](value));\n } catch (e) {\n reject(e);\n }\n }\n\n function step(result) {\n result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);\n }\n\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`; // getContainerElement and getBoundTextElement and potentially other helpers\n// depend on `Scene` which will not be available when these pure utils are\n// called outside initialized Excalidraw editor instance or even if called\n// from inside Excalidraw if the elements were never cached by Scene (e.g.\n// for library elements).\n//\n// As such, before passing the elements down, we need to initialize a custom\n// Scene instance and assign them to it.\n//\n// FIXME This is a super hacky workaround and we'll need to rewrite this soon.\n\nconst __createSceneForElementsHack__ = elements => {\n const scene = new _Scene__WEBPACK_IMPORTED_MODULE_12__[\"default\"](); // we can't duplicate elements to regenerate ids because we need the\n // orig ids when embedding. So we do another hack of not mapping element\n // ids to Scene instances so that we don't override the editor elements\n // mapping.\n // We still need to clone the objects themselves to regen references.\n\n scene.replaceAllElements((0,_utils__WEBPACK_IMPORTED_MODULE_3__.cloneJSON)(elements), false);\n return scene;\n};\n\nconst truncateText = (element, maxWidth) => {\n if (element.width <= maxWidth) {\n return element;\n }\n\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n ctx.font = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.getFontString)({\n fontFamily: element.fontFamily,\n fontSize: element.fontSize\n });\n let text = element.text;\n const metrics = ctx.measureText(text);\n\n if (metrics.width > maxWidth) {\n // we iterate from the right, removing characters one by one instead\n // of bulding the string up. This assumes that it's more likely\n // your frame names will overflow by not that many characters\n // (if ever), so it sohuld be faster this way.\n for (let i = text.length; i > 0; i--) {\n const newText = `${text.slice(0, i)}...`;\n\n if (ctx.measureText(newText).width <= maxWidth) {\n text = newText;\n break;\n }\n }\n }\n\n return (0,_element_mutateElement__WEBPACK_IMPORTED_MODULE_11__.newElementWith)(element, {\n text,\n width: maxWidth\n });\n};\n/**\n * When exporting frames, we need to render frame labels which are currently\n * being rendered in DOM when editing. Adding the labels as regular text\n * elements seems like a simple hack. In the future we'll want to move to\n * proper canvas rendering, even within editor (instead of DOM).\n */\n\n\nconst addFrameLabelsAsTextElements = (elements, opts) => {\n const nextElements = [];\n let frameIndex = 0;\n let magicFrameIndex = 0;\n\n for (const element of elements) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isFrameLikeElement)(element)) {\n if ((0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isFrameElement)(element)) {\n frameIndex++;\n } else {\n magicFrameIndex++;\n }\n\n let textElement = (0,_element__WEBPACK_IMPORTED_MODULE_10__.newTextElement)({\n x: element.x,\n y: element.y - _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameOffsetY,\n fontFamily: _constants__WEBPACK_IMPORTED_MODULE_4__.FONT_FAMILY.Assistant,\n fontSize: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameFontSize,\n lineHeight: _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameLineHeight,\n strokeColor: opts.exportWithDarkMode ? _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorDarkTheme : _constants__WEBPACK_IMPORTED_MODULE_4__.FRAME_STYLE.nameColorLightTheme,\n text: (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getFrameLikeTitle)(element, (0,_element_typeChecks__WEBPACK_IMPORTED_MODULE_13__.isFrameElement)(element) ? frameIndex : magicFrameIndex)\n });\n textElement.y -= textElement.height;\n textElement = truncateText(textElement, element.width);\n nextElements.push(textElement);\n }\n\n nextElements.push(element);\n }\n\n return nextElements;\n};\n\nconst getFrameRenderingConfig = (exportingFrame, frameRendering) => {\n frameRendering = frameRendering || (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)().frameRendering;\n return {\n enabled: exportingFrame ? true : frameRendering.enabled,\n outline: exportingFrame ? false : frameRendering.outline,\n name: exportingFrame ? false : frameRendering.name,\n clip: exportingFrame ? true : frameRendering.clip\n };\n};\n\nconst prepareElementsForRender = ({\n elements,\n exportingFrame,\n frameRendering,\n exportWithDarkMode\n}) => {\n let nextElements;\n\n if (exportingFrame) {\n nextElements = (0,_packages_withinBounds__WEBPACK_IMPORTED_MODULE_8__.elementsOverlappingBBox)({\n elements,\n bounds: exportingFrame,\n type: \"overlap\"\n });\n } else if (frameRendering.enabled && frameRendering.name) {\n nextElements = addFrameLabelsAsTextElements(elements, {\n exportWithDarkMode\n });\n } else {\n nextElements = elements;\n }\n\n return nextElements;\n};\n\nconst exportToCanvas = (elements, appState, files, {\n exportBackground,\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n viewBackgroundColor,\n exportingFrame\n}, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return {\n canvas,\n scale: appState.exportScale\n };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n var _a;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig(exportingFrame !== null && exportingFrame !== void 0 ? exportingFrame : null, (_a = appState.frameRendering) !== null && _a !== void 0 ? _a : null);\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode: appState.exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding);\n const {\n canvas,\n scale = 1\n } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const {\n imageCache\n } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elementsForRender).map(element => element.fileId),\n files\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderStaticScene)({\n canvas,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n elements: elementsForRender,\n visibleElements: elementsForRender,\n scale,\n appState: Object.assign(Object.assign({}, appState), {\n frameRendering,\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n shouldCacheIgnoreZoom: false,\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\"\n }),\n renderConfig: {\n canvasBackgroundColor: viewBackgroundColor,\n imageCache,\n renderGrid: false,\n isExporting: true\n }\n });\n tempScene.destroy();\n return canvas;\n});\nconst exportToSvg = (elements, appState, files, opts) => __awaiter(void 0, void 0, void 0, function* () {\n var _b, _c, _d;\n\n const tempScene = __createSceneForElementsHack__(elements);\n\n elements = tempScene.getNonDeletedElements();\n const frameRendering = getFrameRenderingConfig((_b = opts === null || opts === void 0 ? void 0 : opts.exportingFrame) !== null && _b !== void 0 ? _b : null, (_c = appState.frameRendering) !== null && _c !== void 0 ? _c : null);\n let {\n exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING,\n exportWithDarkMode = false,\n viewBackgroundColor,\n exportScale = 1,\n exportEmbedScene\n } = appState;\n const {\n exportingFrame = null\n } = opts || {};\n const elementsForRender = prepareElementsForRender({\n elements,\n exportingFrame,\n exportWithDarkMode,\n frameRendering\n });\n\n if (exportingFrame) {\n exportPadding = 0;\n }\n\n let metadata = \"\"; // we need to serialize the \"original\" elements before we put them through\n // the tempScene hack which duplicates and regenerates ids\n\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n // when embedding scene, we want to embed the origionally supplied\n // elements which don't contain the temp frame labels.\n // But it also requires that the exportToSvg is being supplied with\n // only the elements that we're exporting, and no extra.\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\")\n });\n } catch (error) {\n console.error(error);\n }\n }\n\n const [minX, minY, width, height] = getCanvasSize(exportingFrame ? [exportingFrame] : (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getRootElements)(elementsForRender), exportPadding); // initialize SVG root\n\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n\n if (exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n\n let assetPath = \"https://excalidraw.com/\"; // Asset path needs to be determined only when using package\n\n if (true) {\n assetPath = window.EXCALIDRAW_ASSET_PATH || `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${({\"VITE_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"VITE_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"VITE_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"VITE_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"VITE_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"VITE_APP_PORTAL_URL\":\"\",\"VITE_APP_PLUS_LP\":\"https://plus.excalidraw.com\",\"VITE_APP_PLUS_APP\":\"https://app.excalidraw.com\",\"VITE_APP_AI_BACKEND\":\"http://localhost:3015\",\"VITE_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"VITE_APP_DEV_ENABLE_SW\":\"\",\"VITE_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"VITE_APP_DISABLE_TRACKING\":\"true\",\"FAST_REFRESH\":\"false\",\"VITE_APP_PORT\":\"3000\",\"VITE_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX\":\"\",\"VITE_APP_COLLAPSE_OVERLAY\":\"true\",\"VITE_APP_ENABLE_ESLINT\":\"true\",\"VITE_PKG_NAME\":\"@excalidraw/excalidraw\",\"VITE_PKG_VERSION\":\"0.17.1-7391-e65bf53\",\"VITE_IS_EXCALIDRAW_NPM_PACKAGE\":true}).PKG_VERSION}`;\n\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n\n const offsetX = -minX + exportPadding;\n const offsetY = -minY + exportPadding;\n const frameElements = (0,_frame__WEBPACK_IMPORTED_MODULE_9__.getFrameLikeElements)(elements);\n let exportingFrameClipPath = \"\";\n\n for (const frame of frameElements) {\n const [x1, y1, x2, y2] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getElementAbsoluteCoords)(frame);\n const cx = (x2 - x1) / 2 - (frame.x - x1);\n const cy = (y2 - y1) / 2 - (frame.y - y1);\n exportingFrameClipPath += `<clipPath id=${frame.id}>\n <rect transform=\"translate(${frame.x + offsetX} ${frame.y + offsetY}) rotate(${frame.angle} ${cx} ${cy})\"\n width=\"${frame.width}\"\n height=\"${frame.height}\"\n >\n </rect>\n </clipPath>`;\n }\n\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style class=\"style-fonts\">\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n @font-face {\n font-family: \"Assistant\";\n src: url(\"${assetPath}Assistant-Regular.woff2\");\n }\n </style>\n ${exportingFrameClipPath}\n </defs>\n `; // render background rect\n\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elementsForRender, rsvg, svgRoot, files || {}, {\n offsetX,\n offsetY,\n isExporting: true,\n exportWithDarkMode,\n renderEmbeddables: (_d = opts === null || opts === void 0 ? void 0 : opts.renderEmbeddables) !== null && _d !== void 0 ? _d : false,\n frameRendering,\n canvasBackgroundColor: viewBackgroundColor\n });\n tempScene.destroy();\n return svgRoot;\n}); // calculate smallest area to fit the contents in\n\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding * 2;\n return [minX, minY, width, height];\n};\n\nconst getExportSize = (elements, exportPadding, scale) => {\n const [,, width, height] = getCanvasSize(elements, exportPadding).map(dimension => Math.trunc(dimension * scale));\n return [width, height];\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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TTtBQUM3RDtBQUNBO0FBQ0Esa0NBQWtDLE1BQU07QUFDeEMsbUNBQW1DLE9BQU87QUFDMUM7QUFDQTtBQUNBOztBQUVBLGVBQWUsNkRBQVM7QUFDeEIsRUFBRSx1RUFBZ0IsOENBQThDO0FBQ2hFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRztBQUNIO0FBQ0E7QUFDQSxDQUFDLEdBQUc7O0FBRUo7QUFDQSxtQ0FBbUMsZ0VBQWU7QUFDbEQsZ0JBQWdCLGdEQUFRO0FBQ3hCLGlCQUFpQixnREFBUTtBQUN6QjtBQUNBOztBQUVPO0FBQ1A7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz9jMzczIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBfX2F3YWl0ZXIgPSB0aGlzICYmIHRoaXMuX19hd2FpdGVyIHx8IGZ1bmN0aW9uICh0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcbiAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgcmVzb2x2ZSh2YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzdGVwKGdlbmVyYXRvcltcInRocm93XCJdKHZhbHVlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkge1xuICAgICAgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7XG4gICAgfVxuXG4gICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xuICB9KTtcbn07XG5cbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IGdldENvbW1vbkJvdW5kcywgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzIH0gZnJvbSBcIi4uL2VsZW1lbnQvYm91bmRzXCI7XG5pbXBvcnQgeyByZW5kZXJTY2VuZVRvU3ZnLCByZW5kZXJTdGF0aWNTY2VuZSB9IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJTY2VuZVwiO1xuaW1wb3J0IHsgY2xvbmVKU09OLCBkaXN0YW5jZSwgZ2V0Rm9udFN0cmluZyB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9FWFBPUlRfUEFERElORywgRk9OVF9GQU1JTFksIEZSQU1FX1NUWUxFLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHsgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLCB1cGRhdGVJbWFnZUNhY2hlIH0gZnJvbSBcIi4uL2VsZW1lbnQvaW1hZ2VcIjtcbmltcG9ydCB7IGVsZW1lbnRzT3ZlcmxhcHBpbmdCQm94IH0gZnJvbSBcIi4uL3BhY2thZ2VzL3dpdGhpbkJvdW5kc1wiO1xuaW1wb3J0IHsgZ2V0RnJhbWVMaWtlRWxlbWVudHMsIGdldEZyYW1lTGlrZVRpdGxlLCBnZXRSb290RWxlbWVudHMgfSBmcm9tIFwiLi4vZnJhbWVcIjtcbmltcG9ydCB7IG5ld1RleHRFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRcIjtcbmltcG9ydCB7IG5ld0VsZW1lbnRXaXRoIH0gZnJvbSBcIi4uL2VsZW1lbnQvbXV0YXRlRWxlbWVudFwiO1xuaW1wb3J0IFNjZW5lIGZyb20gXCIuL1NjZW5lXCI7XG5pbXBvcnQgeyBpc0ZyYW1lRWxlbWVudCwgaXNGcmFtZUxpa2VFbGVtZW50IH0gZnJvbSBcIi4uL2VsZW1lbnQvdHlwZUNoZWNrc1wiO1xuY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDsgLy8gZ2V0Q29udGFpbmVyRWxlbWVudCBhbmQgZ2V0Qm91bmRUZXh0RWxlbWVudCBhbmQgcG90ZW50aWFsbHkgb3RoZXIgaGVscGVyc1xuLy8gZGVwZW5kIG9uIGBTY2VuZWAgd2hpY2ggd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlc2UgcHVyZSB1dGlscyBhcmVcbi8vIGNhbGxlZCBvdXRzaWRlIGluaXRpYWxpemVkIEV4Y2FsaWRyYXcgZWRpdG9yIGluc3RhbmNlIG9yIGV2ZW4gaWYgY2FsbGVkXG4vLyBmcm9tIGluc2lkZSBFeGNhbGlkcmF3IGlmIHRoZSBlbGVtZW50cyB3ZXJlIG5ldmVyIGNhY2hlZCBieSBTY2VuZSAoZS5nLlxuLy8gZm9yIGxpYnJhcnkgZWxlbWVudHMpLlxuLy9cbi8vIEFzIHN1Y2gsIGJlZm9yZSBwYXNzaW5nIHRoZSBlbGVtZW50cyBkb3duLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUgYSBjdXN0b21cbi8vIFNjZW5lIGluc3RhbmNlIGFuZCBhc3NpZ24gdGhlbSB0byBpdC5cbi8vXG4vLyBGSVhNRSBUaGlzIGlzIGEgc3VwZXIgaGFja3kgd29ya2Fyb3VuZCBhbmQgd2UnbGwgbmVlZCB0byByZXdyaXRlIHRoaXMgc29vbi5cblxuY29uc3QgX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fID0gZWxlbWVudHMgPT4ge1xuICBjb25zdCBzY2VuZSA9IG5ldyBTY2VuZSgpOyAvLyB3ZSBjYW4ndCBkdXBsaWNhdGUgZWxlbWVudHMgdG8gcmVnZW5lcmF0ZSBpZHMgYmVjYXVzZSB3ZSBuZWVkIHRoZVxuICAvLyBvcmlnIGlkcyB3aGVuIGVtYmVkZGluZy4gU28gd2UgZG8gYW5vdGhlciBoYWNrIG9mIG5vdCBtYXBwaW5nIGVsZW1lbnRcbiAgLy8gaWRzIHRvIFNjZW5lIGluc3RhbmNlcyBzbyB0aGF0IHdlIGRvbid0IG92ZXJyaWRlIHRoZSBlZGl0b3IgZWxlbWVudHNcbiAgLy8gbWFwcGluZy5cbiAgLy8gV2Ugc3RpbGwgbmVlZCB0byBjbG9uZSB0aGUgb2JqZWN0cyB0aGVtc2VsdmVzIHRvIHJlZ2VuIHJlZmVyZW5jZXMuXG5cbiAgc2NlbmUucmVwbGFjZUFsbEVsZW1lbnRzKGNsb25lSlNPTihlbGVtZW50cyksIGZhbHNlKTtcbiAgcmV0dXJuIHNjZW5lO1xufTtcblxuY29uc3QgdHJ1bmNhdGVUZXh0ID0gKGVsZW1lbnQsIG1heFdpZHRoKSA9PiB7XG4gIGlmIChlbGVtZW50LndpZHRoIDw9IG1heFdpZHRoKSB7XG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpO1xuICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO1xuICBjdHguZm9udCA9IGdldEZvbnRTdHJpbmcoe1xuICAgIGZvbnRGYW1pbHk6IGVsZW1lbnQuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogZWxlbWVudC5mb250U2l6ZVxuICB9KTtcbiAgbGV0IHRleHQgPSBlbGVtZW50LnRleHQ7XG4gIGNvbnN0IG1ldHJpY3MgPSBjdHgubWVhc3VyZVRleHQodGV4dCk7XG5cbiAgaWYgKG1ldHJpY3Mud2lkdGggPiBtYXhXaWR0aCkge1xuICAgIC8vIHdlIGl0ZXJhdGUgZnJvbSB0aGUgcmlnaHQsIHJlbW92aW5nIGNoYXJhY3RlcnMgb25lIGJ5IG9uZSBpbnN0ZWFkXG4gICAgLy8gb2YgYnVsZGluZyB0aGUgc3RyaW5nIHVwLiBUaGlzIGFzc3VtZXMgdGhhdCBpdCdzIG1vcmUgbGlrZWx5XG4gICAgLy8geW91ciBmcmFtZSBuYW1lcyB3aWxsIG92ZXJmbG93IGJ5IG5vdCB0aGF0IG1hbnkgY2hhcmFjdGVyc1xuICAgIC8vIChpZiBldmVyKSwgc28gaXQgc29odWxkIGJlIGZhc3RlciB0aGlzIHdheS5cbiAgICBmb3IgKGxldCBpID0gdGV4dC5sZW5ndGg7IGkgPiAwOyBpLS0pIHtcbiAgICAgIGNvbnN0IG5ld1RleHQgPSBgJHt0ZXh0LnNsaWNlKDAsIGkpfS4uLmA7XG5cbiAgICAgIGlmIChjdHgubWVhc3VyZVRleHQobmV3VGV4dCkud2lkdGggPD0gbWF4V2lkdGgpIHtcbiAgICAgICAgdGV4dCA9IG5ld1RleHQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXdFbGVtZW50V2l0aChlbGVtZW50LCB7XG4gICAgdGV4dCxcbiAgICB3aWR0aDogbWF4V2lkdGhcbiAgfSk7XG59O1xuLyoqXG4gKiBXaGVuIGV4cG9ydGluZyBmcmFtZXMsIHdlIG5lZWQgdG8gcmVuZGVyIGZyYW1lIGxhYmVscyB3aGljaCBhcmUgY3VycmVudGx5XG4gKiBiZWluZyByZW5kZXJlZCBpbiBET00gd2hlbiBlZGl0aW5nLiBBZGRpbmcgdGhlIGxhYmVscyBhcyByZWd1bGFyIHRleHRcbiAqIGVsZW1lbnRzIHNlZW1zIGxpa2UgYSBzaW1wbGUgaGFjay4gSW4gdGhlIGZ1dHVyZSB3ZSdsbCB3YW50IHRvIG1vdmUgdG9cbiAqIHByb3BlciBjYW52YXMgcmVuZGVyaW5nLCBldmVuIHdpdGhpbiBlZGl0b3IgKGluc3RlYWQgb2YgRE9NKS5cbiAqL1xuXG5cbmNvbnN0IGFkZEZyYW1lTGFiZWxzQXNUZXh0RWxlbWVudHMgPSAoZWxlbWVudHMsIG9wdHMpID0+IHtcbiAgY29uc3QgbmV4dEVsZW1lbnRzID0gW107XG4gIGxldCBmcmFtZUluZGV4ID0gMDtcbiAgbGV0IG1hZ2ljRnJhbWVJbmRleCA9IDA7XG5cbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgaWYgKGlzRnJhbWVMaWtlRWxlbWVudChlbGVtZW50KSkge1xuICAgICAgaWYgKGlzRnJhbWVFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgICAgIGZyYW1lSW5kZXgrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hZ2ljRnJhbWVJbmRleCsrO1xuICAgICAgfVxuXG4gICAgICBsZXQgdGV4dEVsZW1lbnQgPSBuZXdUZXh0RWxlbWVudCh7XG4gICAgICAgIHg6IGVsZW1lbnQueCxcbiAgICAgICAgeTogZWxlbWVudC55IC0gRlJBTUVfU1RZTEUubmFtZU9mZnNldFksXG4gICAgICAgIGZvbnRGYW1pbHk6IEZPTlRfRkFNSUxZLkFzc2lzdGFudCxcbiAgICAgICAgZm9udFNpemU6IEZSQU1FX1NUWUxFLm5hbWVGb250U2l6ZSxcbiAgICAgICAgbGluZUhlaWdodDogRlJBTUVfU1RZTEUubmFtZUxpbmVIZWlnaHQsXG4gICAgICAgIHN0cm9rZUNvbG9yOiBvcHRzLmV4cG9ydFdpdGhEYXJrTW9kZSA/IEZSQU1FX1NUWUxFLm5hbWVDb2xvckRhcmtUaGVtZSA6IEZSQU1FX1NUWUxFLm5hbWVDb2xvckxpZ2h0VGhlbWUsXG4gICAgICAgIHRleHQ6IGdldEZyYW1lTGlrZVRpdGxlKGVsZW1lbnQsIGlzRnJhbWVFbGVtZW50KGVsZW1lbnQpID8gZnJhbWVJbmRleCA6IG1hZ2ljRnJhbWVJbmRleClcbiAgICAgIH0pO1xuICAgICAgdGV4dEVsZW1lbnQueSAtPSB0ZXh0RWxlbWVudC5oZWlnaHQ7XG4gICAgICB0ZXh0RWxlbWVudCA9IHRydW5jYXRlVGV4dCh0ZXh0RWxlbWVudCwgZWxlbWVudC53aWR0aCk7XG4gICAgICBuZXh0RWxlbWVudHMucHVzaCh0ZXh0RWxlbWVudCk7XG4gICAgfVxuXG4gICAgbmV4dEVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gIH1cblxuICByZXR1cm4gbmV4dEVsZW1lbnRzO1xufTtcblxuY29uc3QgZ2V0RnJhbWVSZW5kZXJpbmdDb25maWcgPSAoZXhwb3J0aW5nRnJhbWUsIGZyYW1lUmVuZGVyaW5nKSA9PiB7XG4gIGZyYW1lUmVuZGVyaW5nID0gZnJhbWVSZW5kZXJpbmcgfHwgZ2V0RGVmYXVsdEFwcFN0YXRlKCkuZnJhbWVSZW5kZXJpbmc7XG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogZXhwb3J0aW5nRnJhbWUgPyB0cnVlIDogZnJhbWVSZW5kZXJpbmcuZW5hYmxlZCxcbiAgICBvdXRsaW5lOiBleHBvcnRpbmdGcmFtZSA/IGZhbHNlIDogZnJhbWVSZW5kZXJpbmcub3V0bGluZSxcbiAgICBuYW1lOiBleHBvcnRpbmdGcmFtZSA/IGZhbHNlIDogZnJhbWVSZW5kZXJpbmcubmFtZSxcbiAgICBjbGlwOiBleHBvcnRpbmdGcmFtZSA/IHRydWUgOiBmcmFtZVJlbmRlcmluZy5jbGlwXG4gIH07XG59O1xuXG5jb25zdCBwcmVwYXJlRWxlbWVudHNGb3JSZW5kZXIgPSAoe1xuICBlbGVtZW50cyxcbiAgZXhwb3J0aW5nRnJhbWUsXG4gIGZyYW1lUmVuZGVyaW5nLFxuICBleHBvcnRXaXRoRGFya01vZGVcbn0pID0+IHtcbiAgbGV0IG5leHRFbGVtZW50cztcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBuZXh0RWxlbWVudHMgPSBlbGVtZW50c092ZXJsYXBwaW5nQkJveCh7XG4gICAgICBlbGVtZW50cyxcbiAgICAgIGJvdW5kczogZXhwb3J0aW5nRnJhbWUsXG4gICAgICB0eXBlOiBcIm92ZXJsYXBcIlxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGZyYW1lUmVuZGVyaW5nLmVuYWJsZWQgJiYgZnJhbWVSZW5kZXJpbmcubmFtZSkge1xuICAgIG5leHRFbGVtZW50cyA9IGFkZEZyYW1lTGFiZWxzQXNUZXh0RWxlbWVudHMoZWxlbWVudHMsIHtcbiAgICAgIGV4cG9ydFdpdGhEYXJrTW9kZVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIG5leHRFbGVtZW50cyA9IGVsZW1lbnRzO1xuICB9XG5cbiAgcmV0dXJuIG5leHRFbGVtZW50cztcbn07XG5cbmV4cG9ydCBjb25zdCBleHBvcnRUb0NhbnZhcyA9IChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCB7XG4gIGV4cG9ydEJhY2tncm91bmQsXG4gIGV4cG9ydFBhZGRpbmcgPSBERUZBVUxUX0VYUE9SVF9QQURESU5HLFxuICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICBleHBvcnRpbmdGcmFtZVxufSwgY3JlYXRlQ2FudmFzID0gKHdpZHRoLCBoZWlnaHQpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY2FudmFzLndpZHRoID0gd2lkdGggKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgY2FudmFzLmhlaWdodCA9IGhlaWdodCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICByZXR1cm4ge1xuICAgIGNhbnZhcyxcbiAgICBzY2FsZTogYXBwU3RhdGUuZXhwb3J0U2NhbGVcbiAgfTtcbn0pID0+IF9fYXdhaXRlcih2b2lkIDAsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkge1xuICB2YXIgX2E7XG5cbiAgY29uc3QgdGVtcFNjZW5lID0gX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fKGVsZW1lbnRzKTtcblxuICBlbGVtZW50cyA9IHRlbXBTY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgY29uc3QgZnJhbWVSZW5kZXJpbmcgPSBnZXRGcmFtZVJlbmRlcmluZ0NvbmZpZyhleHBvcnRpbmdGcmFtZSAhPT0gbnVsbCAmJiBleHBvcnRpbmdGcmFtZSAhPT0gdm9pZCAwID8gZXhwb3J0aW5nRnJhbWUgOiBudWxsLCAoX2EgPSBhcHBTdGF0ZS5mcmFtZVJlbmRlcmluZykgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbCk7XG4gIGNvbnN0IGVsZW1lbnRzRm9yUmVuZGVyID0gcHJlcGFyZUVsZW1lbnRzRm9yUmVuZGVyKHtcbiAgICBlbGVtZW50cyxcbiAgICBleHBvcnRpbmdGcmFtZSxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICBmcmFtZVJlbmRlcmluZ1xuICB9KTtcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBleHBvcnRQYWRkaW5nID0gMDtcbiAgfVxuXG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZXhwb3J0aW5nRnJhbWUgPyBbZXhwb3J0aW5nRnJhbWVdIDogZ2V0Um9vdEVsZW1lbnRzKGVsZW1lbnRzRm9yUmVuZGVyKSwgZXhwb3J0UGFkZGluZyk7XG4gIGNvbnN0IHtcbiAgICBjYW52YXMsXG4gICAgc2NhbGUgPSAxXG4gIH0gPSBjcmVhdGVDYW52YXMod2lkdGgsIGhlaWdodCk7XG4gIGNvbnN0IGRlZmF1bHRBcHBTdGF0ZSA9IGdldERlZmF1bHRBcHBTdGF0ZSgpO1xuICBjb25zdCB7XG4gICAgaW1hZ2VDYWNoZVxuICB9ID0geWllbGQgdXBkYXRlSW1hZ2VDYWNoZSh7XG4gICAgaW1hZ2VDYWNoZTogbmV3IE1hcCgpLFxuICAgIGZpbGVJZHM6IGdldEluaXRpYWxpemVkSW1hZ2VFbGVtZW50cyhlbGVtZW50c0ZvclJlbmRlcikubWFwKGVsZW1lbnQgPT4gZWxlbWVudC5maWxlSWQpLFxuICAgIGZpbGVzXG4gIH0pO1xuICByZW5kZXJTdGF0aWNTY2VuZSh7XG4gICAgY2FudmFzLFxuICAgIHJjOiByb3VnaC5jYW52YXMoY2FudmFzKSxcbiAgICBlbGVtZW50czogZWxlbWVudHNGb3JSZW5kZXIsXG4gICAgdmlzaWJsZUVsZW1lbnRzOiBlbGVtZW50c0ZvclJlbmRlcixcbiAgICBzY2FsZSxcbiAgICBhcHBTdGF0ZTogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBhcHBTdGF0ZSksIHtcbiAgICAgIGZyYW1lUmVuZGVyaW5nLFxuICAgICAgdmlld0JhY2tncm91bmRDb2xvcjogZXhwb3J0QmFja2dyb3VuZCA/IHZpZXdCYWNrZ3JvdW5kQ29sb3IgOiBudWxsLFxuICAgICAgc2Nyb2xsWDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgICAgc2Nyb2xsWTogLW1pblkgKyBleHBvcnRQYWRkaW5nLFxuICAgICAgem9vbTogZGVmYXVsdEFwcFN0YXRlLnpvb20sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgdGhlbWU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSA/IFwiZGFya1wiIDogXCJsaWdodFwiXG4gICAgfSksXG4gICAgcmVuZGVyQ29uZmlnOiB7XG4gICAgICBjYW52YXNCYWNrZ3JvdW5kQ29sb3I6IHZpZXdCYWNrZ3JvdW5kQ29sb3IsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZVxuICAgIH1cbiAgfSk7XG4gIHRlbXBTY2VuZS5kZXN0cm95KCk7XG4gIHJldHVybiBjYW52YXM7XG59KTtcbmV4cG9ydCBjb25zdCBleHBvcnRUb1N2ZyA9IChlbGVtZW50cywgYXBwU3RhdGUsIGZpbGVzLCBvcHRzKSA9PiBfX2F3YWl0ZXIodm9pZCAwLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgdmFyIF9iLCBfYywgX2Q7XG5cbiAgY29uc3QgdGVtcFNjZW5lID0gX19jcmVhdGVTY2VuZUZvckVsZW1lbnRzSGFja19fKGVsZW1lbnRzKTtcblxuICBlbGVtZW50cyA9IHRlbXBTY2VuZS5nZXROb25EZWxldGVkRWxlbWVudHMoKTtcbiAgY29uc3QgZnJhbWVSZW5kZXJpbmcgPSBnZXRGcmFtZVJlbmRlcmluZ0NvbmZpZygoX2IgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMuZXhwb3J0aW5nRnJhbWUpICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IG51bGwsIChfYyA9IGFwcFN0YXRlLmZyYW1lUmVuZGVyaW5nKSAhPT0gbnVsbCAmJiBfYyAhPT0gdm9pZCAwID8gX2MgOiBudWxsKTtcbiAgbGV0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICBleHBvcnRXaXRoRGFya01vZGUgPSBmYWxzZSxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lXG4gIH0gPSBhcHBTdGF0ZTtcbiAgY29uc3Qge1xuICAgIGV4cG9ydGluZ0ZyYW1lID0gbnVsbFxuICB9ID0gb3B0cyB8fCB7fTtcbiAgY29uc3QgZWxlbWVudHNGb3JSZW5kZXIgPSBwcmVwYXJlRWxlbWVudHNGb3JSZW5kZXIoe1xuICAgIGVsZW1lbnRzLFxuICAgIGV4cG9ydGluZ0ZyYW1lLFxuICAgIGV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgICBmcmFtZVJlbmRlcmluZ1xuICB9KTtcblxuICBpZiAoZXhwb3J0aW5nRnJhbWUpIHtcbiAgICBleHBvcnRQYWRkaW5nID0gMDtcbiAgfVxuXG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7IC8vIHdlIG5lZWQgdG8gc2VyaWFsaXplIHRoZSBcIm9yaWdpbmFsXCIgZWxlbWVudHMgYmVmb3JlIHdlIHB1dCB0aGVtIHRocm91Z2hcbiAgLy8gdGhlIHRlbXBTY2VuZSBoYWNrIHdoaWNoIGR1cGxpY2F0ZXMgYW5kIHJlZ2VuZXJhdGVzIGlkc1xuXG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0geWllbGQgKHlpZWxkIGltcG9ydChcbiAgICAgIC8qIHdlYnBhY2tDaHVua05hbWU6IFwiaW1hZ2VcIiAqL1xuICAgICAgXCIuLi8uLi9zcmMvZGF0YS9pbWFnZVwiKSkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICAvLyB3aGVuIGVtYmVkZGluZyBzY2VuZSwgd2Ugd2FudCB0byBlbWJlZCB0aGUgb3JpZ2lvbmFsbHkgc3VwcGxpZWRcbiAgICAgICAgLy8gZWxlbWVudHMgd2hpY2ggZG9uJ3QgY29udGFpbiB0aGUgdGVtcCBmcmFtZSBsYWJlbHMuXG4gICAgICAgIC8vIEJ1dCBpdCBhbHNvIHJlcXVpcmVzIHRoYXQgdGhlIGV4cG9ydFRvU3ZnIGlzIGJlaW5nIHN1cHBsaWVkIHdpdGhcbiAgICAgICAgLy8gb25seSB0aGUgZWxlbWVudHMgdGhhdCB3ZSdyZSBleHBvcnRpbmcsIGFuZCBubyBleHRyYS5cbiAgICAgICAgdGV4dDogc2VyaWFsaXplQXNKU09OKGVsZW1lbnRzLCBhcHBTdGF0ZSwgZmlsZXMgfHwge30sIFwibG9jYWxcIilcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGV4cG9ydGluZ0ZyYW1lID8gW2V4cG9ydGluZ0ZyYW1lXSA6IGdldFJvb3RFbGVtZW50cyhlbGVtZW50c0ZvclJlbmRlciksIGV4cG9ydFBhZGRpbmcpOyAvLyBpbml0aWFsaXplIFNWRyByb290XG5cbiAgY29uc3Qgc3ZnUm9vdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTlMsIFwic3ZnXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInZlcnNpb25cIiwgXCIxLjFcIik7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwieG1sbnNcIiwgU1ZHX05TKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIsIGAwIDAgJHt3aWR0aH0gJHtoZWlnaHR9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGggKiBleHBvcnRTY2FsZX1gKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0ICogZXhwb3J0U2NhbGV9YCk7XG5cbiAgaWYgKGV4cG9ydFdpdGhEYXJrTW9kZSkge1xuICAgIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiZmlsdGVyXCIsIFRIRU1FX0ZJTFRFUik7XG4gIH1cblxuICBsZXQgYXNzZXRQYXRoID0gXCJodHRwczovL2V4Y2FsaWRyYXcuY29tL1wiOyAvLyBBc3NldCBwYXRoIG5lZWRzIHRvIGJlIGRldGVybWluZWQgb25seSB3aGVuIHVzaW5nIHBhY2thZ2VcblxuICBpZiAocHJvY2Vzcy5lbnYuVklURV9JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID0gd2luZG93LkVYQ0FMSURSQVdfQVNTRVRfUEFUSCB8fCBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5WSVRFX1BLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoID09PSBudWxsIHx8IGFzc2V0UGF0aCA9PT0gdm9pZCAwID8gdm9pZCAwIDogYXNzZXRQYXRoLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgICBhc3NldFBhdGggPSBhc3NldFBhdGgucmVwbGFjZShcIi9cIiwgYCR7d2luZG93LmxvY2F0aW9uLm9yaWdpbn0vYCk7XG4gICAgfVxuXG4gICAgYXNzZXRQYXRoID0gYCR7YXNzZXRQYXRofS9kaXN0L2V4Y2FsaWRyYXctYXNzZXRzL2A7XG4gIH1cblxuICBjb25zdCBvZmZzZXRYID0gLW1pblggKyBleHBvcnRQYWRkaW5nO1xuICBjb25zdCBvZmZzZXRZID0gLW1pblkgKyBleHBvcnRQYWRkaW5nO1xuICBjb25zdCBmcmFtZUVsZW1lbnRzID0gZ2V0RnJhbWVMaWtlRWxlbWVudHMoZWxlbWVudHMpO1xuICBsZXQgZXhwb3J0aW5nRnJhbWVDbGlwUGF0aCA9IFwiXCI7XG5cbiAgZm9yIChjb25zdCBmcmFtZSBvZiBmcmFtZUVsZW1lbnRzKSB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhmcmFtZSk7XG4gICAgY29uc3QgY3ggPSAoeDIgLSB4MSkgLyAyIC0gKGZyYW1lLnggLSB4MSk7XG4gICAgY29uc3QgY3kgPSAoeTIgLSB5MSkgLyAyIC0gKGZyYW1lLnkgLSB5MSk7XG4gICAgZXhwb3J0aW5nRnJhbWVDbGlwUGF0aCArPSBgPGNsaXBQYXRoIGlkPSR7ZnJhbWUuaWR9PlxuICAgICAgICAgICAgPHJlY3QgdHJhbnNmb3JtPVwidHJhbnNsYXRlKCR7ZnJhbWUueCArIG9mZnNldFh9ICR7ZnJhbWUueSArIG9mZnNldFl9KSByb3RhdGUoJHtmcmFtZS5hbmdsZX0gJHtjeH0gJHtjeX0pXCJcbiAgICAgICAgICB3aWR0aD1cIiR7ZnJhbWUud2lkdGh9XCJcbiAgICAgICAgICBoZWlnaHQ9XCIke2ZyYW1lLmhlaWdodH1cIlxuICAgICAgICAgID5cbiAgICAgICAgICA8L3JlY3Q+XG4gICAgICAgIDwvY2xpcFBhdGg+YDtcbiAgfVxuXG4gIHN2Z1Jvb3QuaW5uZXJIVE1MID0gYFxuICAke1NWR19FWFBPUlRfVEFHfVxuICAke21ldGFkYXRhfVxuICA8ZGVmcz5cbiAgICA8c3R5bGUgY2xhc3M9XCJzdHlsZS1mb250c1wiPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIkFzc2lzdGFudFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUFzc2lzdGFudC1SZWd1bGFyLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gICAgJHtleHBvcnRpbmdGcmFtZUNsaXBQYXRofVxuICA8L2RlZnM+XG4gIGA7IC8vIHJlbmRlciBiYWNrZ3JvdW5kIHJlY3RcblxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInJlY3RcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ4XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcInlcIiwgXCIwXCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYCR7d2lkdGh9YCk7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJoZWlnaHRcIiwgYCR7aGVpZ2h0fWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiZmlsbFwiLCB2aWV3QmFja2dyb3VuZENvbG9yKTtcbiAgICBzdmdSb290LmFwcGVuZENoaWxkKHJlY3QpO1xuICB9XG5cbiAgY29uc3QgcnN2ZyA9IHJvdWdoLnN2ZyhzdmdSb290KTtcbiAgcmVuZGVyU2NlbmVUb1N2ZyhlbGVtZW50c0ZvclJlbmRlciwgcnN2Zywgc3ZnUm9vdCwgZmlsZXMgfHwge30sIHtcbiAgICBvZmZzZXRYLFxuICAgIG9mZnNldFksXG4gICAgaXNFeHBvcnRpbmc6IHRydWUsXG4gICAgZXhwb3J0V2l0aERhcmtNb2RlLFxuICAgIHJlbmRlckVtYmVkZGFibGVzOiAoX2QgPSBvcHRzID09PSBudWxsIHx8IG9wdHMgPT09IHZvaWQgMCA/IHZvaWQgMCA6IG9wdHMucmVuZGVyRW1iZWRkYWJsZXMpICE9PSBudWxsICYmIF9kICE9PSB2b2lkIDAgPyBfZCA6IGZhbHNlLFxuICAgIGZyYW1lUmVuZGVyaW5nLFxuICAgIGNhbnZhc0JhY2tncm91bmRDb2xvcjogdmlld0JhY2tncm91bmRDb2xvclxuICB9KTtcbiAgdGVtcFNjZW5lLmRlc3Ryb3koKTtcbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59KTsgLy8gY2FsY3VsYXRlIHNtYWxsZXN0IGFyZWEgdG8gZml0IHRoZSBjb250ZW50cyBpblxuXG5jb25zdCBnZXRDYW52YXNTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldENvbW1vbkJvdW5kcyhlbGVtZW50cyk7XG4gIGNvbnN0IHdpZHRoID0gZGlzdGFuY2UobWluWCwgbWF4WCkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgY29uc3QgaGVpZ2h0ID0gZGlzdGFuY2UobWluWSwgbWF4WSkgKyBleHBvcnRQYWRkaW5nICogMjtcbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFeHBvcnRTaXplID0gKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nLCBzY2FsZSkgPT4ge1xuICBjb25zdCBbLCwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKS5tYXAoZGltZW5zaW9uID0+IE1hdGgudHJ1bmMoZGltZW5zaW9uICogc2NhbGUpKTtcbiAgcmV0dXJuIFt3aWR0aCwgaGVpZ2h0XTtcbn07Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
4810
4810
 
4811
4811
  /***/ }),
4812
4812
 
@@ -6012,7 +6012,7 @@ module.exports = JSON.parse('{"ar-SA":99,"az-AZ":18,"bg-BG":75,"bn-BD":55,"ca-ES
6012
6012
  /******/ // This function allow to reference async chunks
6013
6013
  /******/ __webpack_require__.u = (chunkId) => {
6014
6014
  /******/ // return url for filenames based on template
6015
- /******/ return "excalidraw-assets-dev/" + chunkId + "-" + {"locales/ar-SA-json":"f35c4f87e6e2dcf7c20a","locales/az-AZ-json":"5d70eb8bf3f20abc3bac","locales/bg-BG-json":"88cced5fd8a6d8298501","locales/bn-BD-json":"a06588c61947851c8579","locales/ca-ES-json":"9b25933a25836cc0be23","locales/cs-CZ-json":"1d6c97ea271d017058c9","locales/da-DK-json":"34a60c9843cecd71376f","locales/de-DE-json":"d13450595b795867412b","locales/el-GR-json":"c854b199f3ac07d40294","locales/es-ES-json":"6a667bfbf4ff3d0181a7","locales/eu-ES-json":"3ec11367a80491b09056","locales/fa-IR-json":"e459964936177074abe7","locales/fi-FI-json":"f7839bb6f5ad0a3c7e0d","locales/fr-FR-json":"20e8535e2675a6736c81","locales/gl-ES-json":"861f534b46c0db1fa8db","locales/he-IL-json":"504d78736487793ffccd","locales/hi-IN-json":"82d988431011c330242a","locales/hu-HU-json":"d4150250980011726fd9","locales/id-ID-json":"82e300d4fe1e87adba9b","locales/it-IT-json":"6ecc9aec005faab90f41","locales/ja-JP-json":"3c6a065f0f1303b297fa","locales/kaa-json":"983a9ccc652aa01980f3","locales/kab-KAB-json":"cac3cf66f1db5c1a6e19","locales/kk-KZ-json":"e9dd81c22419efd44478","locales/km-KH-json":"be77acee611d96d88dda","locales/ko-KR-json":"ad8e9d31d52b26f3fbc2","locales/ku-TR-json":"ed67af91ae1920f114a8","locales/lt-LT-json":"2c3d35d6fb5dbf95a27e","locales/lv-LV-json":"fa8973c231afb2ddafe9","locales/mr-IN-json":"2949146743072eb11b40","locales/my-MM-json":"4c04ffe415641f69ed75","locales/nb-NO-json":"b8d7a5b70562dacdad45","locales/nl-NL-json":"a65f82a25fe038c45d35","locales/nn-NO-json":"858fbccbc5be386977db","locales/oc-FR-json":"a68ea08272c8da3c0e3f","locales/pa-IN-json":"90a2b3775bd7d8983def","locales/pl-PL-json":"9bb55330d5aaf336646e","locales/pt-BR-json":"3635e753c1b6e5b681fa","locales/pt-PT-json":"0d3694a92e0134549086","locales/ro-RO-json":"e83fda16c860c6d0b383","locales/ru-RU-json":"ddc13261ce5d864d36a9","locales/si-LK-json":"16eb66dbfc6c55fc85b1","locales/sk-SK-json":"782ead8707f2ad0e8e4e","locales/sl-SI-json":"82e55cf7cdbdc7d7f959","locales/sv-SE-json":"2f362899d3ac4089534f","locales/ta-IN-json":"07623a485202da63a84b","locales/th-TH-json":"4e4b97f5f6e905191383","locales/tr-TR-json":"003be1cf6ebf0b787dec","locales/uk-UA-json":"ca6ea1156db2649d3e27","locales/vi-VN-json":"9a5e5fab41a1a120a916","locales/zh-CN-json":"670c28a6ae1e3ddecaa4","locales/zh-HK-json":"93b9b676d4f4b5702797","locales/zh-TW-json":"805d10b0eed9ca51b318","vendor":"8fa3eb9e8749eedafb19"}[chunkId] + ".js";
6015
+ /******/ return "excalidraw-assets-dev/" + chunkId + "-" + {"locales/ar-SA-json":"f35c4f87e6e2dcf7c20a","locales/az-AZ-json":"5d70eb8bf3f20abc3bac","locales/bg-BG-json":"88cced5fd8a6d8298501","locales/bn-BD-json":"a06588c61947851c8579","locales/ca-ES-json":"9b25933a25836cc0be23","locales/cs-CZ-json":"1d6c97ea271d017058c9","locales/da-DK-json":"34a60c9843cecd71376f","locales/de-DE-json":"d13450595b795867412b","locales/el-GR-json":"c854b199f3ac07d40294","locales/es-ES-json":"6a667bfbf4ff3d0181a7","locales/eu-ES-json":"3ec11367a80491b09056","locales/fa-IR-json":"e459964936177074abe7","locales/fi-FI-json":"f7839bb6f5ad0a3c7e0d","locales/fr-FR-json":"20e8535e2675a6736c81","locales/gl-ES-json":"861f534b46c0db1fa8db","locales/he-IL-json":"504d78736487793ffccd","locales/hi-IN-json":"82d988431011c330242a","locales/hu-HU-json":"d4150250980011726fd9","locales/id-ID-json":"82e300d4fe1e87adba9b","locales/it-IT-json":"6ecc9aec005faab90f41","locales/ja-JP-json":"3c6a065f0f1303b297fa","locales/kaa-json":"983a9ccc652aa01980f3","locales/kab-KAB-json":"cac3cf66f1db5c1a6e19","locales/kk-KZ-json":"e9dd81c22419efd44478","locales/km-KH-json":"be77acee611d96d88dda","locales/ko-KR-json":"ad8e9d31d52b26f3fbc2","locales/ku-TR-json":"ed67af91ae1920f114a8","locales/lt-LT-json":"2c3d35d6fb5dbf95a27e","locales/lv-LV-json":"fa8973c231afb2ddafe9","locales/mr-IN-json":"2949146743072eb11b40","locales/my-MM-json":"4c04ffe415641f69ed75","locales/nb-NO-json":"b8d7a5b70562dacdad45","locales/nl-NL-json":"a65f82a25fe038c45d35","locales/nn-NO-json":"858fbccbc5be386977db","locales/oc-FR-json":"a68ea08272c8da3c0e3f","locales/pa-IN-json":"90a2b3775bd7d8983def","locales/pl-PL-json":"9bb55330d5aaf336646e","locales/pt-BR-json":"3635e753c1b6e5b681fa","locales/pt-PT-json":"0d3694a92e0134549086","locales/ro-RO-json":"e83fda16c860c6d0b383","locales/ru-RU-json":"ddc13261ce5d864d36a9","locales/si-LK-json":"16eb66dbfc6c55fc85b1","locales/sk-SK-json":"782ead8707f2ad0e8e4e","locales/sl-SI-json":"82e55cf7cdbdc7d7f959","locales/sv-SE-json":"2f362899d3ac4089534f","locales/ta-IN-json":"07623a485202da63a84b","locales/th-TH-json":"4e4b97f5f6e905191383","locales/tr-TR-json":"003be1cf6ebf0b787dec","locales/uk-UA-json":"ca6ea1156db2649d3e27","locales/vi-VN-json":"9a5e5fab41a1a120a916","locales/zh-CN-json":"670c28a6ae1e3ddecaa4","locales/zh-HK-json":"93b9b676d4f4b5702797","locales/zh-TW-json":"805d10b0eed9ca51b318","vendor":"c09b2c6a1f68505f7149"}[chunkId] + ".js";
6016
6016
  /******/ };
6017
6017
  /******/ })();
6018
6018
  /******/