@excalidraw/excalidraw 0.12.0-32d8221 → 0.12.0-33300d1

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.
@@ -2029,7 +2029,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2029
2029
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2030
2030
 
2031
2031
  "use strict";
2032
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-32d8221\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-32d8221\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsaTRCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksaTRCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2032
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"trackEvent\": () => (/* binding */ trackEvent)\n/* harmony export */ });\nvar _a, _b;\nconst trackEvent = typeof process !== \"undefined\" &&\n ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-33300d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.REACT_APP_GOOGLE_ANALYTICS_ID) &&\n typeof window !== \"undefined\" &&\n window.gtag\n ? (category, action, label, value) => {\n try {\n window.gtag(\"event\", action, {\n event_category: category,\n event_label: label,\n value,\n });\n }\n catch (error) {\n console.error(\"error logging to ga\", error);\n }\n }\n : typeof process !== \"undefined\" && ((_b = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-33300d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _b === void 0 ? void 0 : _b.JEST_WORKER_ID)\n ? (category, action, label, value) => { }\n : (category, action, label, value) => {\n // Uncomment the next line to track locally\n // console.log(\"Track Event\", { category, action, label, value });\n };\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vLi4vYW5hbHl0aWNzLnRzLmpzIiwibWFwcGluZ3MiOiI7Ozs7O0FBQU8sTUFBTSxVQUFVLEdBQ3JCLE9BQU8sT0FBTyxLQUFLLFdBQVc7S0FDOUIsaTRCQUFXLDBDQUFFLDZCQUE2QjtJQUMxQyxPQUFPLE1BQU0sS0FBSyxXQUFXO0lBQzdCLE1BQU0sQ0FBQyxJQUFJO0lBQ1QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFO1FBQ25FLElBQUk7WUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUU7Z0JBQzNCLGNBQWMsRUFBRSxRQUFRO2dCQUN4QixXQUFXLEVBQUUsS0FBSztnQkFDbEIsS0FBSzthQUNOLENBQUMsQ0FBQztTQUNKO1FBQUMsT0FBTyxLQUFLLEVBQUU7WUFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdDO0lBQ0gsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLEtBQUksaTRCQUFXLDBDQUFFLGNBQWM7UUFDL0QsQ0FBQyxDQUFDLENBQUMsUUFBZ0IsRUFBRSxNQUFjLEVBQUUsS0FBYyxFQUFFLEtBQWMsRUFBRSxFQUFFLEdBQUUsQ0FBQztRQUMxRSxDQUFDLENBQUMsQ0FBQyxRQUFnQixFQUFFLE1BQWMsRUFBRSxLQUFjLEVBQUUsS0FBYyxFQUFFLEVBQUU7WUFDbkUsMkNBQTJDO1lBQzNDLGtFQUFrRTtRQUNwRSxDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vYW5hbHl0aWNzLnRzPzVmMGMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IHRyYWNrRXZlbnQgPVxuICB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICBwcm9jZXNzLmVudj8uUkVBQ1RfQVBQX0dPT0dMRV9BTkFMWVRJQ1NfSUQgJiZcbiAgdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiAmJlxuICB3aW5kb3cuZ3RhZ1xuICAgID8gKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB3aW5kb3cuZ3RhZyhcImV2ZW50XCIsIGFjdGlvbiwge1xuICAgICAgICAgICAgZXZlbnRfY2F0ZWdvcnk6IGNhdGVnb3J5LFxuICAgICAgICAgICAgZXZlbnRfbGFiZWw6IGxhYmVsLFxuICAgICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcImVycm9yIGxvZ2dpbmcgdG8gZ2FcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudj8uSkVTVF9XT1JLRVJfSURcbiAgICA/IChjYXRlZ29yeTogc3RyaW5nLCBhY3Rpb246IHN0cmluZywgbGFiZWw/OiBzdHJpbmcsIHZhbHVlPzogbnVtYmVyKSA9PiB7fVxuICAgIDogKGNhdGVnb3J5OiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nLCBsYWJlbD86IHN0cmluZywgdmFsdWU/OiBudW1iZXIpID0+IHtcbiAgICAgICAgLy8gVW5jb21tZW50IHRoZSBuZXh0IGxpbmUgdG8gdHJhY2sgbG9jYWxseVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlRyYWNrIEV2ZW50XCIsIHsgY2F0ZWdvcnksIGFjdGlvbiwgbGFiZWwsIHZhbHVlIH0pO1xuICAgICAgfTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../analytics.ts\n");
2033
2033
 
2034
2034
  /***/ }),
2035
2035
 
@@ -2810,7 +2810,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
2810
2810
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
2811
2811
 
2812
2812
  "use strict";
2813
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n\n\n\n\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nconst getElementAbsoluteCoords = (element) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return getLinearElementAbsoluteCoords(element);\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n ];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = (element) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = (shape) => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return (Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3);\n};\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n if (!hasSolution) {\n return false;\n }\n const t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n const t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n let s1 = null;\n let s2 = null;\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n return [s1, s2];\n};\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n if (solX) {\n const xs = solX.filter((x) => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce((limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n const _p1 = [data[0], data[1]];\n const _p2 = [data[2], data[3]];\n const _p3 = [data[4], data[5]];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n }\n else if (op === \"lineTo\") {\n // TODO: Implement this\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = (points) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getFreeDrawElementAbsoluteCoords = (element) => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getLinearElementAbsoluteCoords = (element) => {\n let coords;\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n return coords;\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]];\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n }\n else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n let length = 0;\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] = element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n }\n else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n // Return points\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n }\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n return getMinMaxXYFromCurvePathOps(ops, transformXY);\n};\n// We could cache this stuff\nconst getElementBounds = (element) => {\n let bounds;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n }\n else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n }\n else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n return bounds;\n};\nconst getCommonBounds = (elements) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n }\n else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.strokeSharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getElementPointsCoords = (element, points, sharpness) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = sharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = (elements) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Q0FBQyxDQUFDO0lBRWxDLElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBYSxDQUFDO1FBQ3RELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzdCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBRUQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEMsSUFBSSxJQUFJLEVBQUU7UUFDUixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFhLENBQUM7UUFDdEQsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFDRCxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDO0FBRUYsTUFBTSwyQkFBMkIsR0FBRyxDQUNsQyxHQUFTLEVBQ1QsV0FBd0QsRUFDdEIsRUFBRTtJQUNwQyxJQUFJLFFBQVEsR0FBVSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3QixNQUFNLEVBQUUsSUFB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QUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3pEO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUNyQyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO1NBQU0sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtRQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUN4QyxNQUFNLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7S0FDL0M7U0FBTTtRQUNMLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsNkNBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsNkNBQU0sQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFD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QUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFFLElBQUksUUFBUSxHQUFHLFdBQVcsRUFBRTtZQUMxQixXQUFXLEdBQUcsUUFBUSxDQUFDO1lBQ3ZCLGNBQWMsR0FBRyxPQUFPLENBQUM7U0FDMUI7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sZ0JBQWdCLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDMUMsQ0FBQyxDQUFDO0FBYUssTUFBTSxvQkFBb0IsR0FBRyxDQUNsQyxRQUF3RSxFQUNuRSxFQUFFO0lBQ1AsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzRCxPQUFPO1FBQ0wsSUFBSTtRQUNKLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLEtBQUssRUFBRSxJQUFJLEdBQUcsSUFBSTtRQUNsQixNQUFNLEVBQUUsSUFBSSxHQUFHLElBQUk7UUFDbkIsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDdkIsSUFBSSxFQUFFLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uLi8uLi9lbGVtZW50L2JvdW5kcy50cz84YmUyIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEV4Y2FsaWRyYXdFbGVtZW50LFxuICBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgQXJyb3doZWFkLFxuICBFeGNhbGlkcmF3RnJlZURyYXdFbGVtZW50LFxuICBOb25EZWxldGVkLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgZGlzdGFuY2UyZCwgcm90YXRlIH0gZnJvbSBcIi4uL21hdGhcIjtcbmltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IERyYXdhYmxlLCBPcCB9IGZyb20gXCJyb3VnaGpzL2Jpbi9jb3JlXCI7XG5pbXBvcnQgeyBQb2ludCB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHtcbiAgZ2V0U2hhcGVGb3JFbGVtZW50LFxuICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyxcbn0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlckVsZW1lbnRcIjtcbmltcG9ydCB7IGlzRnJlZURyYXdFbGVtZW50LCBpc0xpbmVhckVsZW1lbnQgfSBmcm9tIFwiLi90eXBlQ2hlY2tzXCI7XG5pbXBvcnQgeyByZXNjYWxlUG9pbnRzIH0gZnJvbSBcIi4uL3BvaW50c1wiO1xuXG4vLyB4IGFuZCB5IHBvc2l0aW9uIG9mIHRvcCBsZWZ0IGNvcm5lciwgeCBhbmQgeSBwb3NpdGlvbiBvZiBib3R0b20gcmlnaHQgY29ybmVyXG5leHBvcnQgdHlwZSBCb3VuZHMgPSByZWFkb25seSBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbnR5cGUgTWF5YmVRdWFkcmF0aWNTb2x1dGlvbiA9IFtudW1iZXIgfCBudWxsLCBudW1iZXIgfCBudWxsXSB8IGZhbHNlO1xuXG4vLyBJZiB0aGUgZWxlbWVudCBpcyBjcmVhdGVkIGZyb20gcmlnaHQgdG8gbGVmdCwgdGhlIHdpZHRoIGlzIGdvaW5nIHRvIGJlIG5lZ2F0aXZlXG4vLyBUaGlzIHNldCBvZiBmdW5jdGlvbnMgcmV0cmlldmVzIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgNCBwb2ludHMuXG5leHBvcnQgY29uc3QgZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbik6IEJvdW5kcyA9PiB7XG4gIGlmIChpc0ZyZWVEcmF3RWxlbWVudChlbGVtZW50KSkge1xuICAgIHJldHVybiBnZXRGcmVlRHJhd0VsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgfSBlbHNlIGlmIChpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0TGluZWFyRWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICB9XG4gIHJldHVybiBbXG4gICAgZWxlbWVudC54LFxuICAgIGVsZW1lbnQueSxcbiAgICBlbGVtZW50LnggKyBlbGVtZW50LndpZHRoLFxuICAgIGVsZW1lbnQueSArIGVsZW1lbnQuaGVpZ2h0LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IHBvaW50UmVsYXRpdmVUbyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4gIGFic29sdXRlQ29vcmRzOiBQb2ludCxcbik6IFBvaW50ID0+IHtcbiAgcmV0dXJuIFthYnNvbHV0ZUNvb3Jkc1swXSAtIGVsZW1lbnQueCwgYWJzb2x1dGVDb29yZHNbMV0gLSBlbGVtZW50LnldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERpYW1vbmRQb2ludHMgPSAoZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQpID0+IHtcbiAgLy8gSGVyZSB3ZSBhZGQgKzEgdG8gYXZvaWQgdGhlc2UgbnVtYmVycyB0byBiZSAwXG4gIC8vIG90aGVyd2lzZSByb3VnaC5qcyB3aWxsIHRocm93IGFuIGVycm9yIGNvbXBsYWluaW5nIGFib3V0IGl0XG4gIGNvbnN0IHRvcFggPSBNYXRoLmZsb29yKGVsZW1lbnQud2lkdGggLyAyKSArIDE7XG4gIGNvbnN0IHRvcFkgPSAwO1xuICBjb25zdCByaWdodFggPSBlbGVtZW50LndpZHRoO1xuICBjb25zdCByaWdodFkgPSBNYXRoLmZsb29yKGVsZW1lbnQuaGVpZ2h0IC8gMikgKyAxO1xuICBjb25zdCBib3R0b21YID0gdG9wWDtcbiAgY29uc3QgYm90dG9tWSA9IGVsZW1lbnQuaGVpZ2h0O1xuICBjb25zdCBsZWZ0WCA9IDA7XG4gIGNvbnN0IGxlZnRZID0gcmlnaHRZO1xuXG4gIHJldHVybiBbdG9wWCwgdG9wWSwgcmlnaHRYLCByaWdodFksIGJvdHRvbVgsIGJvdHRvbVksIGxlZnRYLCBsZWZ0WV07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0Q3VydmVQYXRoT3BzID0gKHNoYXBlOiBEcmF3YWJsZSk6IE9wW10gPT4ge1xuICBmb3IgKGNvbnN0IHNldCBvZiBzaGFwZS5zZXRzKSB7XG4gICAgaWYgKHNldC50eXBlID09PSBcInBhdGhcIikge1xuICAgICAgcmV0dXJuIHNldC5vcHM7XG4gICAgfVxuICB9XG4gIHJldHVybiBzaGFwZS5zZXRzWzBdLm9wcztcbn07XG5cbi8vIHJlZmVyZW5jZTogaHR0cHM6Ly9lbGlvdC1qb25lcy5jb20vMjAxOS8xMi9jdWJpYy1iZXppZXItY3VydmUtYm91bmRpbmctYm94ZXNcbmNvbnN0IGdldEJlemllclZhbHVlRm9yVCA9IChcbiAgdDogbnVtYmVyLFxuICBwMDogbnVtYmVyLFxuICBwMTogbnVtYmVyLFxuICBwMjogbnVtYmVyLFxuICBwMzogbnVtYmVyLFxuKSA9PiB7XG4gIGNvbnN0IG9uZU1pbnVzVCA9IDEgLSB0O1xuICByZXR1cm4gKFxuICAgIE1hdGgucG93KG9uZU1pbnVzVCwgMykgKiBwMCArXG4gICAgMyAqIE1hdGgucG93KG9uZU1pbnVzVCwgMikgKiB0ICogcDEgK1xuICAgIDMgKiBvbmVNaW51c1QgKiBNYXRoLnBvdyh0LCAyKSAqIHAyICtcbiAgICBNYXRoLnBvdyh0LCAzKSAqIHAzXG4gICk7XG59O1xuXG5jb25zdCBzb2x2ZVF1YWRyYXRpYyA9IChcbiAgcDA6IG51bWJlcixcbiAgcDE6IG51bWJlcixcbiAgcDI6IG51bWJlcixcbiAgcDM6IG51bWJlcixcbik6IE1heWJlUXVhZHJhdGljU29sdXRpb24gPT4ge1xuICBjb25zdCBpID0gcDEgLSBwMDtcbiAgY29uc3QgaiA9IHAyIC0gcDE7XG4gIGNvbnN0IGsgPSBwMyAtIHAyO1xuXG4gIGNvbnN0IGEgPSAzICogaSAtIDYgKiBqICsgMyAqIGs7XG4gIGNvbnN0IGIgPSA2ICogaiAtIDYgKiBpO1xuICBjb25zdCBjID0gMyAqIGk7XG5cbiAgY29uc3Qgc3FydFBhcnQgPSBiICogYiAtIDQgKiBhICogYztcbiAgY29uc3QgaGFzU29sdXRpb24gPSBzcXJ0UGFydCA+PSAwO1xuXG4gIGlmICghaGFzU29sdXRpb24pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCB0MSA9ICgtYiArIE1hdGguc3FydChzcXJ0UGFydCkpIC8gKDIgKiBhKTtcbiAgY29uc3QgdDIgPSAoLWIgLSBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG5cbiAgbGV0IHMxID0gbnVsbDtcbiAgbGV0IHMyID0gbnVsbDtcblxuICBpZiAodDEgPj0gMCAmJiB0MSA8PSAxKSB7XG4gICAgczEgPSBnZXRCZXppZXJWYWx1ZUZvclQodDEsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIGlmICh0MiA+PSAwICYmIHQyIDw9IDEpIHtcbiAgICBzMiA9IGdldEJlemllclZhbHVlRm9yVCh0MiwgcDAsIHAxLCBwMiwgcDMpO1xuICB9XG5cbiAgcmV0dXJuIFtzMSwgczJdO1xufTtcblxuY29uc3QgZ2V0Q3ViaWNCZXppZXJDdXJ2ZUJvdW5kID0gKFxuICBwMDogUG9pbnQsXG4gIHAxOiBQb2ludCxcbiAgcDI6IFBvaW50LFxuICBwMzogUG9pbnQsXG4pOiBCb3VuZHMgPT4ge1xuICBjb25zdCBzb2xYID0gc29sdmVRdWFkcmF0aWMocDBbMF0sIHAxWzBdLCBwMlswXSwgcDNbMF0pO1xuICBjb25zdCBzb2xZID0gc29sdmVRdWFkcmF0aWMocDBbMV0sIHAxWzFdLCBwMlsxXSwgcDNbMV0pO1xuXG4gIGxldCBtaW5YID0gTWF0aC5taW4ocDBbMF0sIHAzWzBdKTtcbiAgbGV0IG1heFggPSBNYXRoLm1heChwMFswXSwgcDNbMF0pO1xuXG4gIGlmIChzb2xYKSB7XG4gICAgY29uc3QgeHMgPSBzb2xYLmZpbHRlcigoeCkgPT4geCAhPT0gbnVsbCkgYXMgbnVtYmVyW107XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIC4uLnhzKTtcbiAgICBtYXhYID0gTWF0aC5tYXgobWF4WCwgLi4ueHMpO1xuICB9XG5cbiAgbGV0IG1pblkgPSBNYXRoLm1pbihwMFsxXSwgcDNbMV0pO1xuICBsZXQgbWF4WSA9IE1hdGgubWF4KHAwWzFdLCBwM1sxXSk7XG4gIGlmIChzb2xZKSB7XG4gICAgY29uc3QgeXMgPSBzb2xZLmZpbHRlcigoeSkgPT4geSAhPT0gbnVsbCkgYXMgbnVtYmVyW107XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIC4uLnlzKTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgLi4ueXMpO1xuICB9XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5jb25zdCBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMgPSAoXG4gIG9wczogT3BbXSxcbiAgdHJhbnNmb3JtWFk/OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBjdXJyZW50UDogUG9pbnQgPSBbMCwgMF07XG5cbiAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBvcHMucmVkdWNlKFxuICAgIChsaW1pdHMsIHsgb3AsIGRhdGEgfSkgPT4ge1xuICAgICAgLy8gVGhlcmUgYXJlIG9ubHkgZm91ciBvcGVyYXRpb24gdHlwZXM6XG4gICAgICAvLyBtb3ZlLCBiY3VydmVUbywgbGluZVRvLCBhbmQgY3VydmVUb1xuICAgICAgaWYgKG9wID09PSBcIm1vdmVcIikge1xuICAgICAgICAvLyBjaGFuZ2Ugc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgY3VycmVudFAgPSBkYXRhIGFzIHVua25vd24gYXMgUG9pbnQ7XG4gICAgICAgIC8vIG1vdmUgb3BlcmF0aW9uIGRvZXMgbm90IGRyYXcgYW55dGhpbmc7IHNvLCBpdCBhbHdheXNcbiAgICAgICAgLy8gcmV0dXJucyBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJiY3VydmVUb1wiKSB7XG4gICAgICAgIGNvbnN0IF9wMSA9IFtkYXRhWzBdLCBkYXRhWzFdXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgX3AyID0gW2RhdGFbMl0sIGRhdGFbM11dIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBfcDMgPSBbZGF0YVs0XSwgZGF0YVs1XV0gYXMgUG9pbnQ7XG5cbiAgICAgICAgY29uc3QgcDEgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMSkgOiBfcDE7XG4gICAgICAgIGNvbnN0IHAyID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDIpIDogX3AyO1xuICAgICAgICBjb25zdCBwMyA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AzKSA6IF9wMztcblxuICAgICAgICBjb25zdCBwMCA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uY3VycmVudFApIDogY3VycmVudFA7XG4gICAgICAgIGN1cnJlbnRQID0gX3AzO1xuXG4gICAgICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEN1YmljQmV6aWVyQ3VydmVCb3VuZChcbiAgICAgICAgICBwMCxcbiAgICAgICAgICBwMSxcbiAgICAgICAgICBwMixcbiAgICAgICAgICBwMyxcbiAgICAgICAgKTtcblxuICAgICAgICBsaW1pdHMubWluWCA9IE1hdGgubWluKGxpbWl0cy5taW5YLCBtaW5YKTtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgbWluWSk7XG5cbiAgICAgICAgbGltaXRzLm1heFggPSBNYXRoLm1heChsaW1pdHMubWF4WCwgbWF4WCk7XG4gICAgICAgIGxpbWl0cy5tYXhZID0gTWF0aC5tYXgobGltaXRzLm1heFksIG1heFkpO1xuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJsaW5lVG9cIikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJxY3VydmVUb1wiKSB7XG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICB9XG4gICAgICByZXR1cm4gbGltaXRzO1xuICAgIH0sXG4gICAgeyBtaW5YOiBJbmZpbml0eSwgbWluWTogSW5maW5pdHksIG1heFg6IC1JbmZpbml0eSwgbWF4WTogLUluZmluaXR5IH0sXG4gICk7XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5jb25zdCBnZXRCb3VuZHNGcm9tUG9pbnRzID0gKFxuICBwb2ludHM6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwb2ludHMpIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEJvdW5kc0Zyb21Qb2ludHMoZWxlbWVudC5wb2ludHMpO1xuXG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBjb29yZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8ICFnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBYWFggdGhpcyBpcyBqdXN0IGEgcG9vciBlc3RpbWF0ZSBhbmQgbm90IHZlcnkgdXNlZnVsXG4gICAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBlbGVtZW50LnBvaW50cy5yZWR1Y2UoXG4gICAgICAobGltaXRzLCBbeCwgeV0pID0+IHtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgeSk7XG4gICAgICAgIGxpbWl0cy5taW5YID0gTWF0aC5taW4obGltaXRzLm1pblgsIHgpO1xuXG4gICAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIHgpO1xuICAgICAgICBsaW1pdHMubWF4WSA9IE1hdGgubWF4KGxpbWl0cy5tYXhZLCB5KTtcblxuICAgICAgICByZXR1cm4gbGltaXRzO1xuICAgICAgfSxcbiAgICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICAgICk7XG4gICAgY29vcmRzID0gW1xuICAgICAgbWluWCArIGVsZW1lbnQueCxcbiAgICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgICBtYXhYICsgZWxlbWVudC54LFxuICAgICAgbWF4WSArIGVsZW1lbnQueSxcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpITtcblxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZVswXSk7XG5cbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcblxuICAgIGNvb3JkcyA9IFtcbiAgICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICAgIG1heFkgKyBlbGVtZW50LnksXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBjb29yZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkUG9pbnRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgc2hhcGU6IERyYXdhYmxlW10sXG4gIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbikgPT4ge1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuICBpZiAob3BzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpbmRleCBvZiB0aGUgYkN1cnZlIG9wZXJhdGlvbiB0byBleGFtaW5lLlxuICBjb25zdCBpbmRleCA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyAxIDogb3BzLmxlbmd0aCAtIDE7XG5cbiAgY29uc3QgZGF0YSA9IG9wc1tpbmRleF0uZGF0YTtcbiAgY29uc3QgcDMgPSBbZGF0YVs0XSwgZGF0YVs1XV0gYXMgUG9pbnQ7XG4gIGNvbnN0IHAyID0gW2RhdGFbMl0sIGRhdGFbM11dIGFzIFBvaW50O1xuICBjb25zdCBwMSA9IFtkYXRhWzBdLCBkYXRhWzFdXSBhcyBQb2ludDtcblxuICAvLyBXZSBuZWVkIHRvIGZpbmQgcDAgb2YgdGhlIGJlemllciBjdXJ2ZS5cbiAgLy8gSXQgaXMgdHlwaWNhbGx5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBwcmV2aW91c1xuICAvLyBjdXJ2ZTsgaXQgY2FuIGFsc28gYmUgdGhlIHBvc2l0aW9uIG9mIG1vdmVUbyBvcGVyYXRpb24uXG4gIGNvbnN0IHByZXZPcCA9IG9wc1tpbmRleCAtIDFdO1xuICBsZXQgcDA6IFBvaW50ID0gWzAsIDBdO1xuICBpZiAocHJldk9wLm9wID09PSBcIm1vdmVcIikge1xuICAgIHAwID0gcHJldk9wLmRhdGEgYXMgdW5rbm93biBhcyBQb2ludDtcbiAgfSBlbHNlIGlmIChwcmV2T3Aub3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgIHAwID0gW3ByZXZPcC5kYXRhWzRdLCBwcmV2T3AuZGF0YVs1XV07XG4gIH1cblxuICAvLyBCKHQpID0gcDAgKiAoMS10KV4zICsgM3AxICogdCAqICgxLXQpXjIgKyAzcDIgKiB0XjIgKiAoMS10KSArIHAzICogdF4zXG4gIGNvbnN0IGVxdWF0aW9uID0gKHQ6IG51bWJlciwgaWR4OiBudW1iZXIpID0+XG4gICAgTWF0aC5wb3coMSAtIHQsIDMpICogcDNbaWR4XSArXG4gICAgMyAqIHQgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBwMltpZHhdICtcbiAgICAzICogTWF0aC5wb3codCwgMikgKiAoMSAtIHQpICogcDFbaWR4XSArXG4gICAgcDBbaWR4XSAqIE1hdGgucG93KHQsIDMpO1xuXG4gIC8vIEVlIGtub3cgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGFycm93IChvciB0aGUgZmlyc3QsIGlmIHN0YXJ0IGFycm93aGVhZCkuXG4gIGNvbnN0IFt4MiwgeTJdID0gcG9zaXRpb24gPT09IFwic3RhcnRcIiA/IHAwIDogcDM7XG5cbiAgLy8gQnkgdXNpbmcgY3ViaWMgYmV6aWVyIGVxdWF0aW9uIChCKHQpKSBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMsXG4gIC8vIHdlIGNhbGN1bGF0ZSBhIHBvaW50IHRoYXQgaXMgY2xvc2VyIHRvIHRoZSBsYXN0IHBvaW50LlxuICAvLyBUaGUgdmFsdWUgMC4zIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhbmQgaXQgd29ya3MgYmVzdCBmb3IgYWxsXG4gIC8vIHRoZSB0ZXN0ZWQgY2FzZXMuXG4gIGNvbnN0IFt4MSwgeTFdID0gW2VxdWF0aW9uKDAuMywgMCksIGVxdWF0aW9uKDAuMywgMSldO1xuXG4gIC8vIEZpbmQgdGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGVcbiAgLy8gcHJldmlvdXNseSBjYWxjdWxhdGVkIHBvaW50cy5cbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmh5cG90KHgyIC0geDEsIHkyIC0geTEpO1xuICBjb25zdCBueCA9ICh4MiAtIHgxKSAvIGRpc3RhbmNlO1xuICBjb25zdCBueSA9ICh5MiAtIHkxKSAvIGRpc3RhbmNlO1xuXG4gIGNvbnN0IHNpemUgPSB7XG4gICAgYXJyb3c6IDMwLFxuICAgIGJhcjogMTUsXG4gICAgZG90OiAxNSxcbiAgICB0cmlhbmdsZTogMTUsXG4gIH1bYXJyb3doZWFkXTsgLy8gcGl4ZWxzICh3aWxsIGRpZmZlciBmb3IgZWFjaCBhcnJvd2hlYWQpXG5cbiAgbGV0IGxlbmd0aCA9IDA7XG5cbiAgaWYgKGFycm93aGVhZCA9PT0gXCJhcnJvd1wiKSB7XG4gICAgLy8gTGVuZ3RoIGZvciAtPiBhcnJvd3MgaXMgYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBzZWN0aW9uXG4gICAgY29uc3QgW2N4LCBjeV0gPSBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBbcHgsIHB5XSA9XG4gICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxXG4gICAgICAgID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBbMCwgMF07XG5cbiAgICBsZW5ndGggPSBNYXRoLmh5cG90KGN4IC0gcHgsIGN5IC0gcHkpO1xuICB9IGVsc2Uge1xuICAgIC8vIExlbmd0aCBmb3Igb3RoZXIgYXJyb3doZWFkIHR5cGVzIGlzIGJhc2VkIG9uIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGxpbmVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzW2kgLSAxXSB8fCBbMCwgMF07XG4gICAgICBjb25zdCBbY3gsIGN5XSA9IGVsZW1lbnQucG9pbnRzW2ldO1xuICAgICAgbGVuZ3RoICs9IE1hdGguaHlwb3QoY3ggLSBweCwgY3kgLSBweSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2NhbGUgZG93biB0aGUgYXJyb3doZWFkIHVudGlsIHdlIGhpdCBhIGNlcnRhaW4gc2l6ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbG9vayB3ZWlyZC5cbiAgLy8gVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCBieSBtaW5pbWl6aW5nIGEgbWluaW11bSBzaXplIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgYXJyb3doZWFkXG4gIGNvbnN0IG1pblNpemUgPSBNYXRoLm1pbihzaXplLCBsZW5ndGggLyAyKTtcbiAgY29uc3QgeHMgPSB4MiAtIG54ICogbWluU2l6ZTtcbiAgY29uc3QgeXMgPSB5MiAtIG55ICogbWluU2l6ZTtcblxuICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgY29uc3QgciA9IE1hdGguaHlwb3QoeXMgLSB5MiwgeHMgLSB4MikgKyBlbGVtZW50LnN0cm9rZVdpZHRoO1xuICAgIHJldHVybiBbeDIsIHkyLCByXTtcbiAgfVxuXG4gIGNvbnN0IGFuZ2xlID0ge1xuICAgIGFycm93OiAyMCxcbiAgICBiYXI6IDkwLFxuICAgIHRyaWFuZ2xlOiAyNSxcbiAgfVthcnJvd2hlYWRdOyAvLyBkZWdyZWVzXG5cbiAgLy8gUmV0dXJuIHBvaW50c1xuICBjb25zdCBbeDMsIHkzXSA9IHJvdGF0ZSh4cywgeXMsIHgyLCB5MiwgKC1hbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgY29uc3QgW3g0LCB5NF0gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgcmV0dXJuIFt4MiwgeTIsIHgzLCB5MywgeDQsIHk0XTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRSb3RhdGVkQm91bmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgY3g6IG51bWJlcixcbiAgY3k6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDIgfHwgIWdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIFhYWCB0aGlzIGlzIGp1c3QgYSBwb29yIGVzdGltYXRlIGFuZCBub3QgdmVyeSB1c2VmdWxcbiAgICBjb25zdCB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfSA9IGVsZW1lbnQucG9pbnRzLnJlZHVjZShcbiAgICAgIChsaW1pdHMsIFt4LCB5XSkgPT4ge1xuICAgICAgICBbeCwgeV0gPSByb3RhdGUoZWxlbWVudC54ICsgeCwgZWxlbWVudC55ICsgeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgeSk7XG4gICAgICAgIGxpbWl0cy5taW5YID0gTWF0aC5taW4obGltaXRzLm1pblgsIHgpO1xuICAgICAgICBsaW1pdHMubWF4WCA9IE1hdGgubWF4KGxpbWl0cy5tYXhYLCB4KTtcbiAgICAgICAgbGltaXRzLm1heFkgPSBNYXRoLm1heChsaW1pdHMubWF4WSwgeSk7XG4gICAgICAgIHJldHVybiBsaW1pdHM7XG4gICAgICB9LFxuICAgICAgeyBtaW5YOiBJbmZpbml0eSwgbWluWTogSW5maW5pdHksIG1heFg6IC1JbmZpbml0eSwgbWF4WTogLUluZmluaXR5IH0sXG4gICAgKTtcbiAgICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9XG5cbiAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhO1xuXG4gIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuXG4gIGNvbnN0IHRyYW5zZm9ybVhZID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgIHJvdGF0ZShlbGVtZW50LnggKyB4LCBlbGVtZW50LnkgKyB5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICByZXR1cm4gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcywgdHJhbnNmb3JtWFkpO1xufTtcblxuLy8gV2UgY291bGQgY2FjaGUgdGhpcyBzdHVmZlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCb3VuZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhcbiAgICAgIGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldKSA9PlxuICAgICAgICByb3RhdGUoeCwgeSwgY3ggLSBlbGVtZW50LngsIGN5IC0gZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBbXG4gICAgICBtaW5YICsgZWxlbWVudC54LFxuICAgICAgbWluWSArIGVsZW1lbnQueSxcbiAgICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgICBtYXhZICsgZWxlbWVudC55LFxuICAgIF07XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgYm91bmRzID0gZ2V0TGluZWFyRWxlbWVudFJvdGF0ZWRCb3VuZHMoZWxlbWVudCwgY3gsIGN5KTtcbiAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZShjeCwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZShjeCwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMiwgeTIyXSA9IHJvdGF0ZSh4MSwgY3ksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgY3ksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICBjb25zdCB3ID0gKHgyIC0geDEpIC8gMjtcbiAgICBjb25zdCBoID0gKHkyIC0geTEpIC8gMjtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCB3dyA9IE1hdGguaHlwb3QodyAqIGNvcywgaCAqIHNpbik7XG4gICAgY29uc3QgaGggPSBNYXRoLmh5cG90KGggKiBjb3MsIHcgKiBzaW4pO1xuICAgIGJvdW5kcyA9IFtjeCAtIHd3LCBjeSAtIGhoLCBjeCArIHd3LCBjeSArIGhoXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbeDExLCB5MTFdID0gcm90YXRlKHgxLCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDEyLCB5MTJdID0gcm90YXRlKHgxLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIyLCB5MjJdID0gcm90YXRlKHgyLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIxLCB5MjFdID0gcm90YXRlKHgyLCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gIH1cblxuICByZXR1cm4gYm91bmRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbW1vbkJvdW5kcyA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgxKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeTEpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4Mik7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4gIG5leHRIZWlnaHQ6IG51bWJlcixcbiAgbm9ybWFsaXplUG9pbnRzOiBib29sZWFuLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIShpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVsZW1lbnQueCxcbiAgICAgIGVsZW1lbnQueSxcbiAgICAgIGVsZW1lbnQueCArIG5leHRXaWR0aCxcbiAgICAgIGVsZW1lbnQueSArIG5leHRIZWlnaHQsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IHBvaW50cyA9IHJlc2NhbGVQb2ludHMoXG4gICAgMCxcbiAgICBuZXh0V2lkdGgsXG4gICAgcmVzY2FsZVBvaW50cygxLCBuZXh0SGVpZ2h0LCBlbGVtZW50LnBvaW50cywgbm9ybWFsaXplUG9pbnRzKSxcbiAgICBub3JtYWxpemVQb2ludHMsXG4gICk7XG5cbiAgbGV0IGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gRnJlZSBEcmF3XG4gICAgYm91bmRzID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhwb2ludHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExpbmVcbiAgICBjb25zdCBnZW4gPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgICBjb25zdCBjdXJ2ZSA9XG4gICAgICBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJzaGFycFwiXG4gICAgICAgID8gZ2VuLmxpbmVhclBhdGgoXG4gICAgICAgICAgICBwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKVxuICAgICAgICA6IGdlbi5jdXJ2ZShcbiAgICAgICAgICAgIHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgICApO1xuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gICAgYm91bmRzID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIH1cblxuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBib3VuZHM7XG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50UG9pbnRzQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgcG9pbnRzOiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSlbXSxcbiAgc2hhcnBuZXNzOiBFeGNhbGlkcmF3RWxlbWVudFtcInN0cm9rZVNoYXJwbmVzc1wiXSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgLy8gVGhpcyBtaWdodCBiZSBjb21wdXRhdGlvbmFsbHkgaGVhdmV5XG4gIGNvbnN0IGdlbiA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICBjb25zdCBjdXJ2ZSA9XG4gICAgc2hhcnBuZXNzID09PSBcInNoYXJwXCJcbiAgICAgID8gZ2VuLmxpbmVhclBhdGgoXG4gICAgICAgICAgcG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSxcbiAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgKVxuICAgICAgOiBnZW4uY3VydmUocG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCkpO1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoY3VydmUpO1xuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcbiAgcmV0dXJuIFtcbiAgICBtaW5YICsgZWxlbWVudC54LFxuICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICBtYXhZICsgZWxlbWVudC55LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENsb3Nlc3RFbGVtZW50Qm91bmRzID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZnJvbTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gIH1cblxuICBsZXQgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgbGV0IGNsb3Nlc3RFbGVtZW50ID0gZWxlbWVudHNbMF07XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50Qm91bmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZCgoeDEgKyB4MikgLyAyLCAoeTEgKyB5MikgLyAyLCBmcm9tLngsIGZyb20ueSk7XG5cbiAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIGNsb3Nlc3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBnZXRFbGVtZW50Qm91bmRzKGNsb3Nlc3RFbGVtZW50KTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94IHtcbiAgbWluWDogbnVtYmVyO1xuICBtaW5ZOiBudW1iZXI7XG4gIG1heFg6IG51bWJlcjtcbiAgbWF4WTogbnVtYmVyO1xuICBtaWRYOiBudW1iZXI7XG4gIG1pZFk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDb21tb25Cb3VuZGluZ0JveCA9IChcbiAgZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10gfCByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuKTogQm94ID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHtcbiAgICBtaW5YLFxuICAgIG1pblksXG4gICAgbWF4WCxcbiAgICBtYXhZLFxuICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgIG1pZFg6IChtaW5YICsgbWF4WCkgLyAyLFxuICAgIG1pZFk6IChtaW5ZICsgbWF4WSkgLyAyLFxuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
2813
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"getArrowheadPoints\": () => (/* binding */ getArrowheadPoints),\n/* harmony export */ \"getClosestElementBounds\": () => (/* binding */ getClosestElementBounds),\n/* harmony export */ \"getCommonBoundingBox\": () => (/* binding */ getCommonBoundingBox),\n/* harmony export */ \"getCommonBounds\": () => (/* binding */ getCommonBounds),\n/* harmony export */ \"getCurvePathOps\": () => (/* binding */ getCurvePathOps),\n/* harmony export */ \"getDiamondPoints\": () => (/* binding */ getDiamondPoints),\n/* harmony export */ \"getElementAbsoluteCoords\": () => (/* binding */ getElementAbsoluteCoords),\n/* harmony export */ \"getElementBounds\": () => (/* binding */ getElementBounds),\n/* harmony export */ \"getElementPointsCoords\": () => (/* binding */ getElementPointsCoords),\n/* harmony export */ \"getResizedElementAbsoluteCoords\": () => (/* binding */ getResizedElementAbsoluteCoords),\n/* harmony export */ \"pointRelativeTo\": () => (/* binding */ pointRelativeTo)\n/* harmony export */ });\n/* harmony import */ var _math__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../math */ \"../../math.ts\");\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderElement */ \"../../renderer/renderElement.ts\");\n/* harmony import */ var _typeChecks__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typeChecks */ \"../../element/typeChecks.ts\");\n/* harmony import */ var _points__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../points */ \"../../points.ts\");\n\n\n\n\n\n// If the element is created from right to left, the width is going to be negative\n// This set of functions retrieves the absolute position of the 4 points.\nconst getElementAbsoluteCoords = (element) => {\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n return getFreeDrawElementAbsoluteCoords(element);\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n return getLinearElementAbsoluteCoords(element);\n }\n return [\n element.x,\n element.y,\n element.x + element.width,\n element.y + element.height,\n ];\n};\nconst pointRelativeTo = (element, absoluteCoords) => {\n return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\nconst getDiamondPoints = (element) => {\n // Here we add +1 to avoid these numbers to be 0\n // otherwise rough.js will throw an error complaining about it\n const topX = Math.floor(element.width / 2) + 1;\n const topY = 0;\n const rightX = element.width;\n const rightY = Math.floor(element.height / 2) + 1;\n const bottomX = topX;\n const bottomY = element.height;\n const leftX = 0;\n const leftY = rightY;\n return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\nconst getCurvePathOps = (shape) => {\n for (const set of shape.sets) {\n if (set.type === \"path\") {\n return set.ops;\n }\n }\n return shape.sets[0].ops;\n};\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (t, p0, p1, p2, p3) => {\n const oneMinusT = 1 - t;\n return (Math.pow(oneMinusT, 3) * p0 +\n 3 * Math.pow(oneMinusT, 2) * t * p1 +\n 3 * oneMinusT * Math.pow(t, 2) * p2 +\n Math.pow(t, 3) * p3);\n};\nconst solveQuadratic = (p0, p1, p2, p3) => {\n const i = p1 - p0;\n const j = p2 - p1;\n const k = p3 - p2;\n const a = 3 * i - 6 * j + 3 * k;\n const b = 6 * j - 6 * i;\n const c = 3 * i;\n const sqrtPart = b * b - 4 * a * c;\n const hasSolution = sqrtPart >= 0;\n if (!hasSolution) {\n return false;\n }\n const t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n const t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n let s1 = null;\n let s2 = null;\n if (t1 >= 0 && t1 <= 1) {\n s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n }\n if (t2 >= 0 && t2 <= 1) {\n s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n }\n return [s1, s2];\n};\nconst getCubicBezierCurveBound = (p0, p1, p2, p3) => {\n const solX = solveQuadratic(p0[0], p1[0], p2[0], p3[0]);\n const solY = solveQuadratic(p0[1], p1[1], p2[1], p3[1]);\n let minX = Math.min(p0[0], p3[0]);\n let maxX = Math.max(p0[0], p3[0]);\n if (solX) {\n const xs = solX.filter((x) => x !== null);\n minX = Math.min(minX, ...xs);\n maxX = Math.max(maxX, ...xs);\n }\n let minY = Math.min(p0[1], p3[1]);\n let maxY = Math.max(p0[1], p3[1]);\n if (solY) {\n const ys = solY.filter((y) => y !== null);\n minY = Math.min(minY, ...ys);\n maxY = Math.max(maxY, ...ys);\n }\n return [minX, minY, maxX, maxY];\n};\n// TODO: https://github.com/excalidraw/excalidraw/issues/5617\nconst getRandomOffset = () => {\n return Math.random() / 1000000;\n};\nconst getMinMaxXYFromCurvePathOps = (ops, transformXY) => {\n let currentP = [0, 0];\n const { minX, minY, maxX, maxY } = ops.reduce((limits, { op, data }) => {\n // There are only four operation types:\n // move, bcurveTo, lineTo, and curveTo\n if (op === \"move\") {\n // change starting point\n currentP = data;\n // move operation does not draw anything; so, it always\n // returns false\n }\n else if (op === \"bcurveTo\") {\n // random offset is needed to fix https://github.com/excalidraw/excalidraw/issues/5585\n const _p1 = [\n data[0] + getRandomOffset(),\n data[1] + getRandomOffset(),\n ];\n const _p2 = [\n data[2] + getRandomOffset(),\n data[3] + getRandomOffset(),\n ];\n const _p3 = [\n data[4] + getRandomOffset(),\n data[5] + getRandomOffset(),\n ];\n const p1 = transformXY ? transformXY(..._p1) : _p1;\n const p2 = transformXY ? transformXY(..._p2) : _p2;\n const p3 = transformXY ? transformXY(..._p3) : _p3;\n const p0 = transformXY ? transformXY(...currentP) : currentP;\n currentP = _p3;\n const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(p0, p1, p2, p3);\n limits.minX = Math.min(limits.minX, minX);\n limits.minY = Math.min(limits.minY, minY);\n limits.maxX = Math.max(limits.maxX, maxX);\n limits.maxY = Math.max(limits.maxY, maxY);\n }\n else if (op === \"lineTo\") {\n // TODO: Implement this\n }\n else if (op === \"qcurveTo\") {\n // TODO: Implement this\n }\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n};\nconst getBoundsFromPoints = (points) => {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const [x, y] of points) {\n minX = Math.min(minX, x);\n minY = Math.min(minY, y);\n maxX = Math.max(maxX, x);\n maxY = Math.max(maxY, y);\n }\n return [minX, minY, maxX, maxY];\n};\nconst getFreeDrawElementAbsoluteCoords = (element) => {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getLinearElementAbsoluteCoords = (element) => {\n let coords;\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else {\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n coords = [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n return coords;\n};\nconst getArrowheadPoints = (element, shape, position, arrowhead) => {\n const ops = getCurvePathOps(shape[0]);\n if (ops.length < 1) {\n return null;\n }\n // The index of the bCurve operation to examine.\n const index = position === \"start\" ? 1 : ops.length - 1;\n const data = ops[index].data;\n const p3 = [data[4], data[5]];\n const p2 = [data[2], data[3]];\n const p1 = [data[0], data[1]];\n // We need to find p0 of the bezier curve.\n // It is typically the last point of the previous\n // curve; it can also be the position of moveTo operation.\n const prevOp = ops[index - 1];\n let p0 = [0, 0];\n if (prevOp.op === \"move\") {\n p0 = prevOp.data;\n }\n else if (prevOp.op === \"bcurveTo\") {\n p0 = [prevOp.data[4], prevOp.data[5]];\n }\n // B(t) = p0 * (1-t)^3 + 3p1 * t * (1-t)^2 + 3p2 * t^2 * (1-t) + p3 * t^3\n const equation = (t, idx) => Math.pow(1 - t, 3) * p3[idx] +\n 3 * t * Math.pow(1 - t, 2) * p2[idx] +\n 3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n p0[idx] * Math.pow(t, 3);\n // Ee know the last point of the arrow (or the first, if start arrowhead).\n const [x2, y2] = position === \"start\" ? p0 : p3;\n // By using cubic bezier equation (B(t)) and the given parameters,\n // we calculate a point that is closer to the last point.\n // The value 0.3 is chosen arbitrarily and it works best for all\n // the tested cases.\n const [x1, y1] = [equation(0.3, 0), equation(0.3, 1)];\n // Find the normalized direction vector based on the\n // previously calculated points.\n const distance = Math.hypot(x2 - x1, y2 - y1);\n const nx = (x2 - x1) / distance;\n const ny = (y2 - y1) / distance;\n const size = {\n arrow: 30,\n bar: 15,\n dot: 15,\n triangle: 15,\n }[arrowhead]; // pixels (will differ for each arrowhead)\n let length = 0;\n if (arrowhead === \"arrow\") {\n // Length for -> arrows is based on the length of the last section\n const [cx, cy] = element.points[element.points.length - 1];\n const [px, py] = element.points.length > 1\n ? element.points[element.points.length - 2]\n : [0, 0];\n length = Math.hypot(cx - px, cy - py);\n }\n else {\n // Length for other arrowhead types is based on the total length of the line\n for (let i = 0; i < element.points.length; i++) {\n const [px, py] = element.points[i - 1] || [0, 0];\n const [cx, cy] = element.points[i];\n length += Math.hypot(cx - px, cy - py);\n }\n }\n // Scale down the arrowhead until we hit a certain size so that it doesn't look weird.\n // This value is selected by minimizing a minimum size with the last segment of the arrowhead\n const minSize = Math.min(size, length / 2);\n const xs = x2 - nx * minSize;\n const ys = y2 - ny * minSize;\n if (arrowhead === \"dot\") {\n const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n return [x2, y2, r];\n }\n const angle = {\n arrow: 20,\n bar: 90,\n triangle: 25,\n }[arrowhead]; // degrees\n // Return points\n const [x3, y3] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n const [x4, y4] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(xs, ys, x2, y2, (angle * Math.PI) / 180);\n return [x2, y2, x3, y3, x4, y4];\n};\nconst getLinearElementRotatedBounds = (element, cx, cy) => {\n if (element.points.length < 2 || !(0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element)) {\n // XXX this is just a poor estimate and not very useful\n const { minX, minY, maxX, maxY } = element.points.reduce((limits, [x, y]) => {\n [x, y] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n limits.minY = Math.min(limits.minY, y);\n limits.minX = Math.min(limits.minX, x);\n limits.maxX = Math.max(limits.maxX, x);\n limits.maxY = Math.max(limits.maxY, y);\n return limits;\n }, { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity });\n return [minX, minY, maxX, maxY];\n }\n const shape = (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.getShapeForElement)(element);\n // first element is always the curve\n const ops = getCurvePathOps(shape[0]);\n const transformXY = (x, y) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(element.x + x, element.y + y, cx, cy, element.angle);\n return getMinMaxXYFromCurvePathOps(ops, transformXY);\n};\n// We could cache this stuff\nconst getElementBounds = (element) => {\n let bounds;\n const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n const cx = (x1 + x2) / 2;\n const cy = (y1 + y2) / 2;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points.map(([x, y]) => (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x, y, cx - element.x, cy - element.y, element.angle)));\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n }\n else if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element)) {\n bounds = getLinearElementRotatedBounds(element, cx, cy);\n }\n else if (element.type === \"diamond\") {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(cx, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, cy, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, cy, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n else if (element.type === \"ellipse\") {\n const w = (x2 - x1) / 2;\n const h = (y2 - y1) / 2;\n const cos = Math.cos(element.angle);\n const sin = Math.sin(element.angle);\n const ww = Math.hypot(w * cos, h * sin);\n const hh = Math.hypot(h * cos, w * sin);\n bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n }\n else {\n const [x11, y11] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y1, cx, cy, element.angle);\n const [x12, y12] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x1, y2, cx, cy, element.angle);\n const [x22, y22] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y2, cx, cy, element.angle);\n const [x21, y21] = (0,_math__WEBPACK_IMPORTED_MODULE_0__.rotate)(x2, y1, cx, cy, element.angle);\n const minX = Math.min(x11, x12, x22, x21);\n const minY = Math.min(y11, y12, y22, y21);\n const maxX = Math.max(x11, x12, x22, x21);\n const maxY = Math.max(y11, y12, y22, y21);\n bounds = [minX, minY, maxX, maxY];\n }\n return bounds;\n};\nconst getCommonBounds = (elements) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minX = Infinity;\n let maxX = -Infinity;\n let minY = Infinity;\n let maxY = -Infinity;\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n minX = Math.min(minX, x1);\n minY = Math.min(minY, y1);\n maxX = Math.max(maxX, x2);\n maxY = Math.max(maxY, y2);\n });\n return [minX, minY, maxX, maxY];\n};\nconst getResizedElementAbsoluteCoords = (element, nextWidth, nextHeight, normalizePoints) => {\n if (!((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isLinearElement)(element) || (0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element))) {\n return [\n element.x,\n element.y,\n element.x + nextWidth,\n element.y + nextHeight,\n ];\n }\n const points = (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(0, nextWidth, (0,_points__WEBPACK_IMPORTED_MODULE_4__.rescalePoints)(1, nextHeight, element.points, normalizePoints), normalizePoints);\n let bounds;\n if ((0,_typeChecks__WEBPACK_IMPORTED_MODULE_3__.isFreeDrawElement)(element)) {\n // Free Draw\n bounds = getBoundsFromPoints(points);\n }\n else {\n // Line\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = element.strokeSharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n bounds = getMinMaxXYFromCurvePathOps(ops);\n }\n const [minX, minY, maxX, maxY] = bounds;\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getElementPointsCoords = (element, points, sharpness) => {\n // This might be computationally heavey\n const gen = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_1__[\"default\"].generator();\n const curve = sharpness === \"sharp\"\n ? gen.linearPath(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element))\n : gen.curve(points, (0,_renderer_renderElement__WEBPACK_IMPORTED_MODULE_2__.generateRoughOptions)(element));\n const ops = getCurvePathOps(curve);\n const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n return [\n minX + element.x,\n minY + element.y,\n maxX + element.x,\n maxY + element.y,\n ];\n};\nconst getClosestElementBounds = (elements, from) => {\n if (!elements.length) {\n return [0, 0, 0, 0];\n }\n let minDistance = Infinity;\n let closestElement = elements[0];\n elements.forEach((element) => {\n const [x1, y1, x2, y2] = getElementBounds(element);\n const distance = (0,_math__WEBPACK_IMPORTED_MODULE_0__.distance2d)((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n if (distance < minDistance) {\n minDistance = distance;\n closestElement = element;\n }\n });\n return getElementBounds(closestElement);\n};\nconst getCommonBoundingBox = (elements) => {\n const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n return {\n minX,\n minY,\n maxX,\n maxY,\n width: maxX - minX,\n height: maxY - minY,\n midX: (minX + maxX) / 2,\n midY: (minY + maxY) / 2,\n };\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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RyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNuQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDckMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0tBQy9DO1NBQU07UUFDTCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLDZDQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ25DO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUssTUFBTSxlQUFlLEdBQUcsQ0FDN0IsUUFBc0Ms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LENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELE1BQU0sUUFBUSxHQUFHLGlEQUFVLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUxRSxJQUFJLFFBQVEsR0FBRyxXQUFXLEVBQUU7WUFDMUIsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUN2QixjQUFjLEdBQUcsT0FBTyxDQUFDO1NBQzFCO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzFDLENBQUMsQ0FBQztBQWFLLE1BQU0sb0JBQW9CLEdBQUcsQ0FDbEMsUUFBd0UsRUFDbkUsRUFBRTtJQUNQLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDM0QsT0FBTztRQUNMLElBQUk7UUFDSixJQUFJO1FBQ0osSUFBSTtRQUNKLElBQUk7UUFDSixLQUFLLEVBQUUsSUFBSSxHQUFHLElBQUk7UUFDbEIsTUFBTSxFQUFFLElBQUksR0FBRyxJQUFJO1FBQ25CLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ3ZCLElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi4vLi4vZWxlbWVudC9ib3VuZHMudHM/OGJlMiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBFeGNhbGlkcmF3RWxlbWVudCxcbiAgRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4gIEFycm93aGVhZCxcbiAgRXhjYWxpZHJhd0ZyZWVEcmF3RWxlbWVudCxcbiAgTm9uRGVsZXRlZCxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IGRpc3RhbmNlMmQsIHJvdGF0ZSB9IGZyb20gXCIuLi9tYXRoXCI7XG5pbXBvcnQgcm91Z2ggZnJvbSBcInJvdWdoanMvYmluL3JvdWdoXCI7XG5pbXBvcnQgeyBEcmF3YWJsZSwgT3AgfSBmcm9tIFwicm91Z2hqcy9iaW4vY29yZVwiO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tIFwiLi4vdHlwZXNcIjtcbmltcG9ydCB7XG4gIGdldFNoYXBlRm9yRWxlbWVudCxcbiAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMsXG59IGZyb20gXCIuLi9yZW5kZXJlci9yZW5kZXJFbGVtZW50XCI7XG5pbXBvcnQgeyBpc0ZyZWVEcmF3RWxlbWVudCwgaXNMaW5lYXJFbGVtZW50IH0gZnJvbSBcIi4vdHlwZUNoZWNrc1wiO1xuaW1wb3J0IHsgcmVzY2FsZVBvaW50cyB9IGZyb20gXCIuLi9wb2ludHNcIjtcblxuLy8geCBhbmQgeSBwb3NpdGlvbiBvZiB0b3AgbGVmdCBjb3JuZXIsIHggYW5kIHkgcG9zaXRpb24gb2YgYm90dG9tIHJpZ2h0IGNvcm5lclxuZXhwb3J0IHR5cGUgQm91bmRzID0gcmVhZG9ubHkgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG50eXBlIE1heWJlUXVhZHJhdGljU29sdXRpb24gPSBbbnVtYmVyIHwgbnVsbCwgbnVtYmVyIHwgbnVsbF0gfCBmYWxzZTtcblxuLy8gSWYgdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBmcm9tIHJpZ2h0IHRvIGxlZnQsIHRoZSB3aWR0aCBpcyBnb2luZyB0byBiZSBuZWdhdGl2ZVxuLy8gVGhpcyBzZXQgb2YgZnVuY3Rpb25zIHJldHJpZXZlcyB0aGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIDQgcG9pbnRzLlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0VsZW1lbnQsXG4pOiBCb3VuZHMgPT4ge1xuICBpZiAoaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpIHtcbiAgICByZXR1cm4gZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMoZWxlbWVudCk7XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgcmV0dXJuIGdldExpbmVhckVsZW1lbnRBYnNvbHV0ZUNvb3JkcyhlbGVtZW50KTtcbiAgfVxuICByZXR1cm4gW1xuICAgIGVsZW1lbnQueCxcbiAgICBlbGVtZW50LnksXG4gICAgZWxlbWVudC54ICsgZWxlbWVudC53aWR0aCxcbiAgICBlbGVtZW50LnkgKyBlbGVtZW50LmhlaWdodCxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBwb2ludFJlbGF0aXZlVG8gPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuICBhYnNvbHV0ZUNvb3JkczogUG9pbnQsXG4pOiBQb2ludCA9PiB7XG4gIHJldHVybiBbYWJzb2x1dGVDb29yZHNbMF0gLSBlbGVtZW50LngsIGFic29sdXRlQ29vcmRzWzFdIC0gZWxlbWVudC55XTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXREaWFtb25kUG9pbnRzID0gKGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50KSA9PiB7XG4gIC8vIEhlcmUgd2UgYWRkICsxIHRvIGF2b2lkIHRoZXNlIG51bWJlcnMgdG8gYmUgMFxuICAvLyBvdGhlcndpc2Ugcm91Z2guanMgd2lsbCB0aHJvdyBhbiBlcnJvciBjb21wbGFpbmluZyBhYm91dCBpdFxuICBjb25zdCB0b3BYID0gTWF0aC5mbG9vcihlbGVtZW50LndpZHRoIC8gMikgKyAxO1xuICBjb25zdCB0b3BZID0gMDtcbiAgY29uc3QgcmlnaHRYID0gZWxlbWVudC53aWR0aDtcbiAgY29uc3QgcmlnaHRZID0gTWF0aC5mbG9vcihlbGVtZW50LmhlaWdodCAvIDIpICsgMTtcbiAgY29uc3QgYm90dG9tWCA9IHRvcFg7XG4gIGNvbnN0IGJvdHRvbVkgPSBlbGVtZW50LmhlaWdodDtcbiAgY29uc3QgbGVmdFggPSAwO1xuICBjb25zdCBsZWZ0WSA9IHJpZ2h0WTtcblxuICByZXR1cm4gW3RvcFgsIHRvcFksIHJpZ2h0WCwgcmlnaHRZLCBib3R0b21YLCBib3R0b21ZLCBsZWZ0WCwgbGVmdFldO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEN1cnZlUGF0aE9wcyA9IChzaGFwZTogRHJhd2FibGUpOiBPcFtdID0+IHtcbiAgZm9yIChjb25zdCBzZXQgb2Ygc2hhcGUuc2V0cykge1xuICAgIGlmIChzZXQudHlwZSA9PT0gXCJwYXRoXCIpIHtcbiAgICAgIHJldHVybiBzZXQub3BzO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2hhcGUuc2V0c1swXS5vcHM7XG59O1xuXG4vLyByZWZlcmVuY2U6IGh0dHBzOi8vZWxpb3Qtam9uZXMuY29tLzIwMTkvMTIvY3ViaWMtYmV6aWVyLWN1cnZlLWJvdW5kaW5nLWJveGVzXG5jb25zdCBnZXRCZXppZXJWYWx1ZUZvclQgPSAoXG4gIHQ6IG51bWJlcixcbiAgcDA6IG51bWJlcixcbiAgcDE6IG51bWJlcixcbiAgcDI6IG51bWJlcixcbiAgcDM6IG51bWJlcixcbikgPT4ge1xuICBjb25zdCBvbmVNaW51c1QgPSAxIC0gdDtcbiAgcmV0dXJuIChcbiAgICBNYXRoLnBvdyhvbmVNaW51c1QsIDMpICogcDAgK1xuICAgIDMgKiBNYXRoLnBvdyhvbmVNaW51c1QsIDIpICogdCAqIHAxICtcbiAgICAzICogb25lTWludXNUICogTWF0aC5wb3codCwgMikgKiBwMiArXG4gICAgTWF0aC5wb3codCwgMykgKiBwM1xuICApO1xufTtcblxuY29uc3Qgc29sdmVRdWFkcmF0aWMgPSAoXG4gIHAwOiBudW1iZXIsXG4gIHAxOiBudW1iZXIsXG4gIHAyOiBudW1iZXIsXG4gIHAzOiBudW1iZXIsXG4pOiBNYXliZVF1YWRyYXRpY1NvbHV0aW9uID0+IHtcbiAgY29uc3QgaSA9IHAxIC0gcDA7XG4gIGNvbnN0IGogPSBwMiAtIHAxO1xuICBjb25zdCBrID0gcDMgLSBwMjtcblxuICBjb25zdCBhID0gMyAqIGkgLSA2ICogaiArIDMgKiBrO1xuICBjb25zdCBiID0gNiAqIGogLSA2ICogaTtcbiAgY29uc3QgYyA9IDMgKiBpO1xuXG4gIGNvbnN0IHNxcnRQYXJ0ID0gYiAqIGIgLSA0ICogYSAqIGM7XG4gIGNvbnN0IGhhc1NvbHV0aW9uID0gc3FydFBhcnQgPj0gMDtcblxuICBpZiAoIWhhc1NvbHV0aW9uKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdDEgPSAoLWIgKyBNYXRoLnNxcnQoc3FydFBhcnQpKSAvICgyICogYSk7XG4gIGNvbnN0IHQyID0gKC1iIC0gTWF0aC5zcXJ0KHNxcnRQYXJ0KSkgLyAoMiAqIGEpO1xuXG4gIGxldCBzMSA9IG51bGw7XG4gIGxldCBzMiA9IG51bGw7XG5cbiAgaWYgKHQxID49IDAgJiYgdDEgPD0gMSkge1xuICAgIHMxID0gZ2V0QmV6aWVyVmFsdWVGb3JUKHQxLCBwMCwgcDEsIHAyLCBwMyk7XG4gIH1cblxuICBpZiAodDIgPj0gMCAmJiB0MiA8PSAxKSB7XG4gICAgczIgPSBnZXRCZXppZXJWYWx1ZUZvclQodDIsIHAwLCBwMSwgcDIsIHAzKTtcbiAgfVxuXG4gIHJldHVybiBbczEsIHMyXTtcbn07XG5cbmNvbnN0IGdldEN1YmljQmV6aWVyQ3VydmVCb3VuZCA9IChcbiAgcDA6IFBvaW50LFxuICBwMTogUG9pbnQsXG4gIHAyOiBQb2ludCxcbiAgcDM6IFBvaW50LFxuKTogQm91bmRzID0+IHtcbiAgY29uc3Qgc29sWCA9IHNvbHZlUXVhZHJhdGljKHAwWzBdLCBwMVswXSwgcDJbMF0sIHAzWzBdKTtcbiAgY29uc3Qgc29sWSA9IHNvbHZlUXVhZHJhdGljKHAwWzFdLCBwMVsxXSwgcDJbMV0sIHAzWzFdKTtcblxuICBsZXQgbWluWCA9IE1hdGgubWluKHAwWzBdLCBwM1swXSk7XG4gIGxldCBtYXhYID0gTWF0aC5tYXgocDBbMF0sIHAzWzBdKTtcblxuICBpZiAoc29sWCkge1xuICAgIGNvbnN0IHhzID0gc29sWC5maWx0ZXIoKHgpID0+IHggIT09IG51bGwpIGFzIG51bWJlcltdO1xuICAgIG1pblggPSBNYXRoLm1pbihtaW5YLCAuLi54cyk7XG4gICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIC4uLnhzKTtcbiAgfVxuXG4gIGxldCBtaW5ZID0gTWF0aC5taW4ocDBbMV0sIHAzWzFdKTtcbiAgbGV0IG1heFkgPSBNYXRoLm1heChwMFsxXSwgcDNbMV0pO1xuICBpZiAoc29sWSkge1xuICAgIGNvbnN0IHlzID0gc29sWS5maWx0ZXIoKHkpID0+IHkgIT09IG51bGwpIGFzIG51bWJlcltdO1xuICAgIG1pblkgPSBNYXRoLm1pbihtaW5ZLCAuLi55cyk7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIC4uLnlzKTtcbiAgfVxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuLy8gVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL2V4Y2FsaWRyYXcvZXhjYWxpZHJhdy9pc3N1ZXMvNTYxN1xuY29uc3QgZ2V0UmFuZG9tT2Zmc2V0ID0gKCkgPT4ge1xuICByZXR1cm4gTWF0aC5yYW5kb20oKSAvIDEwMDAwMDA7XG59O1xuXG5jb25zdCBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMgPSAoXG4gIG9wczogT3BbXSxcbiAgdHJhbnNmb3JtWFk/OiAoeDogbnVtYmVyLCB5OiBudW1iZXIpID0+IFtudW1iZXIsIG51bWJlcl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBjdXJyZW50UDogUG9pbnQgPSBbMCwgMF07XG5cbiAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBvcHMucmVkdWNlKFxuICAgIChsaW1pdHMsIHsgb3AsIGRhdGEgfSkgPT4ge1xuICAgICAgLy8gVGhlcmUgYXJlIG9ubHkgZm91ciBvcGVyYXRpb24gdHlwZXM6XG4gICAgICAvLyBtb3ZlLCBiY3VydmVUbywgbGluZVRvLCBhbmQgY3VydmVUb1xuICAgICAgaWYgKG9wID09PSBcIm1vdmVcIikge1xuICAgICAgICAvLyBjaGFuZ2Ugc3RhcnRpbmcgcG9pbnRcbiAgICAgICAgY3VycmVudFAgPSBkYXRhIGFzIHVua25vd24gYXMgUG9pbnQ7XG4gICAgICAgIC8vIG1vdmUgb3BlcmF0aW9uIGRvZXMgbm90IGRyYXcgYW55dGhpbmc7IHNvLCBpdCBhbHdheXNcbiAgICAgICAgLy8gcmV0dXJucyBmYWxzZVxuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJiY3VydmVUb1wiKSB7XG4gICAgICAgIC8vIHJhbmRvbSBvZmZzZXQgaXMgbmVlZGVkIHRvIGZpeCBodHRwczovL2dpdGh1Yi5jb20vZXhjYWxpZHJhdy9leGNhbGlkcmF3L2lzc3Vlcy81NTg1XG4gICAgICAgIGNvbnN0IF9wMSA9IFtcbiAgICAgICAgICBkYXRhWzBdICsgZ2V0UmFuZG9tT2Zmc2V0KCksXG4gICAgICAgICAgZGF0YVsxXSArIGdldFJhbmRvbU9mZnNldCgpLFxuICAgICAgICBdIGFzIFBvaW50O1xuICAgICAgICBjb25zdCBfcDIgPSBbXG4gICAgICAgICAgZGF0YVsyXSArIGdldFJhbmRvbU9mZnNldCgpLFxuICAgICAgICAgIGRhdGFbM10gKyBnZXRSYW5kb21PZmZzZXQoKSxcbiAgICAgICAgXSBhcyBQb2ludDtcbiAgICAgICAgY29uc3QgX3AzID0gW1xuICAgICAgICAgIGRhdGFbNF0gKyBnZXRSYW5kb21PZmZzZXQoKSxcbiAgICAgICAgICBkYXRhWzVdICsgZ2V0UmFuZG9tT2Zmc2V0KCksXG4gICAgICAgIF0gYXMgUG9pbnQ7XG5cbiAgICAgICAgY29uc3QgcDEgPSB0cmFuc2Zvcm1YWSA/IHRyYW5zZm9ybVhZKC4uLl9wMSkgOiBfcDE7XG4gICAgICAgIGNvbnN0IHAyID0gdHJhbnNmb3JtWFkgPyB0cmFuc2Zvcm1YWSguLi5fcDIpIDogX3AyO1xuICAgICAgICBjb25zdCBwMyA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uX3AzKSA6IF9wMztcblxuICAgICAgICBjb25zdCBwMCA9IHRyYW5zZm9ybVhZID8gdHJhbnNmb3JtWFkoLi4uY3VycmVudFApIDogY3VycmVudFA7XG4gICAgICAgIGN1cnJlbnRQID0gX3AzO1xuXG4gICAgICAgIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEN1YmljQmV6aWVyQ3VydmVCb3VuZChcbiAgICAgICAgICBwMCxcbiAgICAgICAgICBwMSxcbiAgICAgICAgICBwMixcbiAgICAgICAgICBwMyxcbiAgICAgICAgKTtcblxuICAgICAgICBsaW1pdHMubWluWCA9IE1hdGgubWluKGxpbWl0cy5taW5YLCBtaW5YKTtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgbWluWSk7XG5cbiAgICAgICAgbGltaXRzLm1heFggPSBNYXRoLm1heChsaW1pdHMubWF4WCwgbWF4WCk7XG4gICAgICAgIGxpbWl0cy5tYXhZID0gTWF0aC5tYXgobGltaXRzLm1heFksIG1heFkpO1xuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJsaW5lVG9cIikge1xuICAgICAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpc1xuICAgICAgfSBlbHNlIGlmIChvcCA9PT0gXCJxY3VydmVUb1wiKSB7XG4gICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzXG4gICAgICB9XG4gICAgICByZXR1cm4gbGltaXRzO1xuICAgIH0sXG4gICAgeyBtaW5YOiBJbmZpbml0eSwgbWluWTogSW5maW5pdHksIG1heFg6IC1JbmZpbml0eSwgbWF4WTogLUluZmluaXR5IH0sXG4gICk7XG4gIHJldHVybiBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG59O1xuXG5jb25zdCBnZXRCb3VuZHNGcm9tUG9pbnRzID0gKFxuICBwb2ludHM6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnRbXCJwb2ludHNcIl0sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtaW5ZID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBmb3IgKGNvbnN0IFt4LCB5XSBvZiBwb2ludHMpIHtcbiAgICBtaW5YID0gTWF0aC5taW4obWluWCwgeCk7XG4gICAgbWluWSA9IE1hdGgubWluKG1pblksIHkpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4KTtcbiAgICBtYXhZID0gTWF0aC5tYXgobWF4WSwgeSk7XG4gIH1cblxuICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xufTtcblxuY29uc3QgZ2V0RnJlZURyYXdFbGVtZW50QWJzb2x1dGVDb29yZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdGcmVlRHJhd0VsZW1lbnQsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSA9IGdldEJvdW5kc0Zyb21Qb2ludHMoZWxlbWVudC5wb2ludHMpO1xuXG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRBYnNvbHV0ZUNvb3JkcyA9IChcbiAgZWxlbWVudDogRXhjYWxpZHJhd0xpbmVhckVsZW1lbnQsXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGxldCBjb29yZHM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIGlmIChlbGVtZW50LnBvaW50cy5sZW5ndGggPCAyIHx8ICFnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkpIHtcbiAgICAvLyBYWFggdGhpcyBpcyBqdXN0IGEgcG9vciBlc3RpbWF0ZSBhbmQgbm90IHZlcnkgdXNlZnVsXG4gICAgY29uc3QgeyBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZIH0gPSBlbGVtZW50LnBvaW50cy5yZWR1Y2UoXG4gICAgICAobGltaXRzLCBbeCwgeV0pID0+IHtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgeSk7XG4gICAgICAgIGxpbWl0cy5taW5YID0gTWF0aC5taW4obGltaXRzLm1pblgsIHgpO1xuXG4gICAgICAgIGxpbWl0cy5tYXhYID0gTWF0aC5tYXgobGltaXRzLm1heFgsIHgpO1xuICAgICAgICBsaW1pdHMubWF4WSA9IE1hdGgubWF4KGxpbWl0cy5tYXhZLCB5KTtcblxuICAgICAgICByZXR1cm4gbGltaXRzO1xuICAgICAgfSxcbiAgICAgIHsgbWluWDogSW5maW5pdHksIG1pblk6IEluZmluaXR5LCBtYXhYOiAtSW5maW5pdHksIG1heFk6IC1JbmZpbml0eSB9LFxuICAgICk7XG4gICAgY29vcmRzID0gW1xuICAgICAgbWluWCArIGVsZW1lbnQueCxcbiAgICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgICBtYXhYICsgZWxlbWVudC54LFxuICAgICAgbWF4WSArIGVsZW1lbnQueSxcbiAgICBdO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNoYXBlID0gZ2V0U2hhcGVGb3JFbGVtZW50KGVsZW1lbnQpITtcblxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhzaGFwZVswXSk7XG5cbiAgICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcblxuICAgIGNvb3JkcyA9IFtcbiAgICAgIG1pblggKyBlbGVtZW50LngsXG4gICAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICAgIG1heFkgKyBlbGVtZW50LnksXG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBjb29yZHM7XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0QXJyb3doZWFkUG9pbnRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgc2hhcGU6IERyYXdhYmxlW10sXG4gIHBvc2l0aW9uOiBcInN0YXJ0XCIgfCBcImVuZFwiLFxuICBhcnJvd2hlYWQ6IEFycm93aGVhZCxcbikgPT4ge1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuICBpZiAob3BzLmxlbmd0aCA8IDEpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIC8vIFRoZSBpbmRleCBvZiB0aGUgYkN1cnZlIG9wZXJhdGlvbiB0byBleGFtaW5lLlxuICBjb25zdCBpbmRleCA9IHBvc2l0aW9uID09PSBcInN0YXJ0XCIgPyAxIDogb3BzLmxlbmd0aCAtIDE7XG5cbiAgY29uc3QgZGF0YSA9IG9wc1tpbmRleF0uZGF0YTtcbiAgY29uc3QgcDMgPSBbZGF0YVs0XSwgZGF0YVs1XV0gYXMgUG9pbnQ7XG4gIGNvbnN0IHAyID0gW2RhdGFbMl0sIGRhdGFbM11dIGFzIFBvaW50O1xuICBjb25zdCBwMSA9IFtkYXRhWzBdLCBkYXRhWzFdXSBhcyBQb2ludDtcblxuICAvLyBXZSBuZWVkIHRvIGZpbmQgcDAgb2YgdGhlIGJlemllciBjdXJ2ZS5cbiAgLy8gSXQgaXMgdHlwaWNhbGx5IHRoZSBsYXN0IHBvaW50IG9mIHRoZSBwcmV2aW91c1xuICAvLyBjdXJ2ZTsgaXQgY2FuIGFsc28gYmUgdGhlIHBvc2l0aW9uIG9mIG1vdmVUbyBvcGVyYXRpb24uXG4gIGNvbnN0IHByZXZPcCA9IG9wc1tpbmRleCAtIDFdO1xuICBsZXQgcDA6IFBvaW50ID0gWzAsIDBdO1xuICBpZiAocHJldk9wLm9wID09PSBcIm1vdmVcIikge1xuICAgIHAwID0gcHJldk9wLmRhdGEgYXMgdW5rbm93biBhcyBQb2ludDtcbiAgfSBlbHNlIGlmIChwcmV2T3Aub3AgPT09IFwiYmN1cnZlVG9cIikge1xuICAgIHAwID0gW3ByZXZPcC5kYXRhWzRdLCBwcmV2T3AuZGF0YVs1XV07XG4gIH1cblxuICAvLyBCKHQpID0gcDAgKiAoMS10KV4zICsgM3AxICogdCAqICgxLXQpXjIgKyAzcDIgKiB0XjIgKiAoMS10KSArIHAzICogdF4zXG4gIGNvbnN0IGVxdWF0aW9uID0gKHQ6IG51bWJlciwgaWR4OiBudW1iZXIpID0+XG4gICAgTWF0aC5wb3coMSAtIHQsIDMpICogcDNbaWR4XSArXG4gICAgMyAqIHQgKiBNYXRoLnBvdygxIC0gdCwgMikgKiBwMltpZHhdICtcbiAgICAzICogTWF0aC5wb3codCwgMikgKiAoMSAtIHQpICogcDFbaWR4XSArXG4gICAgcDBbaWR4XSAqIE1hdGgucG93KHQsIDMpO1xuXG4gIC8vIEVlIGtub3cgdGhlIGxhc3QgcG9pbnQgb2YgdGhlIGFycm93IChvciB0aGUgZmlyc3QsIGlmIHN0YXJ0IGFycm93aGVhZCkuXG4gIGNvbnN0IFt4MiwgeTJdID0gcG9zaXRpb24gPT09IFwic3RhcnRcIiA/IHAwIDogcDM7XG5cbiAgLy8gQnkgdXNpbmcgY3ViaWMgYmV6aWVyIGVxdWF0aW9uIChCKHQpKSBhbmQgdGhlIGdpdmVuIHBhcmFtZXRlcnMsXG4gIC8vIHdlIGNhbGN1bGF0ZSBhIHBvaW50IHRoYXQgaXMgY2xvc2VyIHRvIHRoZSBsYXN0IHBvaW50LlxuICAvLyBUaGUgdmFsdWUgMC4zIGlzIGNob3NlbiBhcmJpdHJhcmlseSBhbmQgaXQgd29ya3MgYmVzdCBmb3IgYWxsXG4gIC8vIHRoZSB0ZXN0ZWQgY2FzZXMuXG4gIGNvbnN0IFt4MSwgeTFdID0gW2VxdWF0aW9uKDAuMywgMCksIGVxdWF0aW9uKDAuMywgMSldO1xuXG4gIC8vIEZpbmQgdGhlIG5vcm1hbGl6ZWQgZGlyZWN0aW9uIHZlY3RvciBiYXNlZCBvbiB0aGVcbiAgLy8gcHJldmlvdXNseSBjYWxjdWxhdGVkIHBvaW50cy5cbiAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLmh5cG90KHgyIC0geDEsIHkyIC0geTEpO1xuICBjb25zdCBueCA9ICh4MiAtIHgxKSAvIGRpc3RhbmNlO1xuICBjb25zdCBueSA9ICh5MiAtIHkxKSAvIGRpc3RhbmNlO1xuXG4gIGNvbnN0IHNpemUgPSB7XG4gICAgYXJyb3c6IDMwLFxuICAgIGJhcjogMTUsXG4gICAgZG90OiAxNSxcbiAgICB0cmlhbmdsZTogMTUsXG4gIH1bYXJyb3doZWFkXTsgLy8gcGl4ZWxzICh3aWxsIGRpZmZlciBmb3IgZWFjaCBhcnJvd2hlYWQpXG5cbiAgbGV0IGxlbmd0aCA9IDA7XG5cbiAgaWYgKGFycm93aGVhZCA9PT0gXCJhcnJvd1wiKSB7XG4gICAgLy8gTGVuZ3RoIGZvciAtPiBhcnJvd3MgaXMgYmFzZWQgb24gdGhlIGxlbmd0aCBvZiB0aGUgbGFzdCBzZWN0aW9uXG4gICAgY29uc3QgW2N4LCBjeV0gPSBlbGVtZW50LnBvaW50c1tlbGVtZW50LnBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBbcHgsIHB5XSA9XG4gICAgICBlbGVtZW50LnBvaW50cy5sZW5ndGggPiAxXG4gICAgICAgID8gZWxlbWVudC5wb2ludHNbZWxlbWVudC5wb2ludHMubGVuZ3RoIC0gMl1cbiAgICAgICAgOiBbMCwgMF07XG5cbiAgICBsZW5ndGggPSBNYXRoLmh5cG90KGN4IC0gcHgsIGN5IC0gcHkpO1xuICB9IGVsc2Uge1xuICAgIC8vIExlbmd0aCBmb3Igb3RoZXIgYXJyb3doZWFkIHR5cGVzIGlzIGJhc2VkIG9uIHRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGxpbmVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1lbnQucG9pbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBbcHgsIHB5XSA9IGVsZW1lbnQucG9pbnRzW2kgLSAxXSB8fCBbMCwgMF07XG4gICAgICBjb25zdCBbY3gsIGN5XSA9IGVsZW1lbnQucG9pbnRzW2ldO1xuICAgICAgbGVuZ3RoICs9IE1hdGguaHlwb3QoY3ggLSBweCwgY3kgLSBweSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU2NhbGUgZG93biB0aGUgYXJyb3doZWFkIHVudGlsIHdlIGhpdCBhIGNlcnRhaW4gc2l6ZSBzbyB0aGF0IGl0IGRvZXNuJ3QgbG9vayB3ZWlyZC5cbiAgLy8gVGhpcyB2YWx1ZSBpcyBzZWxlY3RlZCBieSBtaW5pbWl6aW5nIGEgbWluaW11bSBzaXplIHdpdGggdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgYXJyb3doZWFkXG4gIGNvbnN0IG1pblNpemUgPSBNYXRoLm1pbihzaXplLCBsZW5ndGggLyAyKTtcbiAgY29uc3QgeHMgPSB4MiAtIG54ICogbWluU2l6ZTtcbiAgY29uc3QgeXMgPSB5MiAtIG55ICogbWluU2l6ZTtcblxuICBpZiAoYXJyb3doZWFkID09PSBcImRvdFwiKSB7XG4gICAgY29uc3QgciA9IE1hdGguaHlwb3QoeXMgLSB5MiwgeHMgLSB4MikgKyBlbGVtZW50LnN0cm9rZVdpZHRoO1xuICAgIHJldHVybiBbeDIsIHkyLCByXTtcbiAgfVxuXG4gIGNvbnN0IGFuZ2xlID0ge1xuICAgIGFycm93OiAyMCxcbiAgICBiYXI6IDkwLFxuICAgIHRyaWFuZ2xlOiAyNSxcbiAgfVthcnJvd2hlYWRdOyAvLyBkZWdyZWVzXG5cbiAgLy8gUmV0dXJuIHBvaW50c1xuICBjb25zdCBbeDMsIHkzXSA9IHJvdGF0ZSh4cywgeXMsIHgyLCB5MiwgKC1hbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgY29uc3QgW3g0LCB5NF0gPSByb3RhdGUoeHMsIHlzLCB4MiwgeTIsIChhbmdsZSAqIE1hdGguUEkpIC8gMTgwKTtcbiAgcmV0dXJuIFt4MiwgeTIsIHgzLCB5MywgeDQsIHk0XTtcbn07XG5cbmNvbnN0IGdldExpbmVhckVsZW1lbnRSb3RhdGVkQm91bmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgY3g6IG51bWJlcixcbiAgY3k6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgaWYgKGVsZW1lbnQucG9pbnRzLmxlbmd0aCA8IDIgfHwgIWdldFNoYXBlRm9yRWxlbWVudChlbGVtZW50KSkge1xuICAgIC8vIFhYWCB0aGlzIGlzIGp1c3QgYSBwb29yIGVzdGltYXRlIGFuZCBub3QgdmVyeSB1c2VmdWxcbiAgICBjb25zdCB7IG1pblgsIG1pblksIG1heFgsIG1heFkgfSA9IGVsZW1lbnQucG9pbnRzLnJlZHVjZShcbiAgICAgIChsaW1pdHMsIFt4LCB5XSkgPT4ge1xuICAgICAgICBbeCwgeV0gPSByb3RhdGUoZWxlbWVudC54ICsgeCwgZWxlbWVudC55ICsgeSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICAgICAgbGltaXRzLm1pblkgPSBNYXRoLm1pbihsaW1pdHMubWluWSwgeSk7XG4gICAgICAgIGxpbWl0cy5taW5YID0gTWF0aC5taW4obGltaXRzLm1pblgsIHgpO1xuICAgICAgICBsaW1pdHMubWF4WCA9IE1hdGgubWF4KGxpbWl0cy5tYXhYLCB4KTtcbiAgICAgICAgbGltaXRzLm1heFkgPSBNYXRoLm1heChsaW1pdHMubWF4WSwgeSk7XG4gICAgICAgIHJldHVybiBsaW1pdHM7XG4gICAgICB9LFxuICAgICAgeyBtaW5YOiBJbmZpbml0eSwgbWluWTogSW5maW5pdHksIG1heFg6IC1JbmZpbml0eSwgbWF4WTogLUluZmluaXR5IH0sXG4gICAgKTtcbiAgICByZXR1cm4gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9XG5cbiAgY29uc3Qgc2hhcGUgPSBnZXRTaGFwZUZvckVsZW1lbnQoZWxlbWVudCkhO1xuXG4gIC8vIGZpcnN0IGVsZW1lbnQgaXMgYWx3YXlzIHRoZSBjdXJ2ZVxuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoc2hhcGVbMF0pO1xuXG4gIGNvbnN0IHRyYW5zZm9ybVhZID0gKHg6IG51bWJlciwgeTogbnVtYmVyKSA9PlxuICAgIHJvdGF0ZShlbGVtZW50LnggKyB4LCBlbGVtZW50LnkgKyB5LCBjeCwgY3ksIGVsZW1lbnQuYW5nbGUpO1xuICByZXR1cm4gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcywgdHJhbnNmb3JtWFkpO1xufTtcblxuLy8gV2UgY291bGQgY2FjaGUgdGhpcyBzdHVmZlxuZXhwb3J0IGNvbnN0IGdldEVsZW1lbnRCb3VuZHMgPSAoXG4gIGVsZW1lbnQ6IEV4Y2FsaWRyYXdFbGVtZW50LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBsZXQgYm91bmRzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBbeDEsIHkxLCB4MiwgeTJdID0gZ2V0RWxlbWVudEFic29sdXRlQ29vcmRzKGVsZW1lbnQpO1xuICBjb25zdCBjeCA9ICh4MSArIHgyKSAvIDI7XG4gIGNvbnN0IGN5ID0gKHkxICsgeTIpIC8gMjtcbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhcbiAgICAgIGVsZW1lbnQucG9pbnRzLm1hcCgoW3gsIHldKSA9PlxuICAgICAgICByb3RhdGUoeCwgeSwgY3ggLSBlbGVtZW50LngsIGN5IC0gZWxlbWVudC55LCBlbGVtZW50LmFuZ2xlKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIHJldHVybiBbXG4gICAgICBtaW5YICsgZWxlbWVudC54LFxuICAgICAgbWluWSArIGVsZW1lbnQueSxcbiAgICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgICBtYXhZICsgZWxlbWVudC55LFxuICAgIF07XG4gIH0gZWxzZSBpZiAoaXNMaW5lYXJFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgYm91bmRzID0gZ2V0TGluZWFyRWxlbWVudFJvdGF0ZWRCb3VuZHMoZWxlbWVudCwgY3gsIGN5KTtcbiAgfSBlbHNlIGlmIChlbGVtZW50LnR5cGUgPT09IFwiZGlhbW9uZFwiKSB7XG4gICAgY29uc3QgW3gxMSwgeTExXSA9IHJvdGF0ZShjeCwgeTEsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gxMiwgeTEyXSA9IHJvdGF0ZShjeCwgeTIsIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMiwgeTIyXSA9IHJvdGF0ZSh4MSwgY3ksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgW3gyMSwgeTIxXSA9IHJvdGF0ZSh4MiwgY3ksIGN4LCBjeSwgZWxlbWVudC5hbmdsZSk7XG4gICAgY29uc3QgbWluWCA9IE1hdGgubWluKHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWluWSA9IE1hdGgubWluKHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgY29uc3QgbWF4WCA9IE1hdGgubWF4KHgxMSwgeDEyLCB4MjIsIHgyMSk7XG4gICAgY29uc3QgbWF4WSA9IE1hdGgubWF4KHkxMSwgeTEyLCB5MjIsIHkyMSk7XG4gICAgYm91bmRzID0gW21pblgsIG1pblksIG1heFgsIG1heFldO1xuICB9IGVsc2UgaWYgKGVsZW1lbnQudHlwZSA9PT0gXCJlbGxpcHNlXCIpIHtcbiAgICBjb25zdCB3ID0gKHgyIC0geDEpIC8gMjtcbiAgICBjb25zdCBoID0gKHkyIC0geTEpIC8gMjtcbiAgICBjb25zdCBjb3MgPSBNYXRoLmNvcyhlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBzaW4gPSBNYXRoLnNpbihlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCB3dyA9IE1hdGguaHlwb3QodyAqIGNvcywgaCAqIHNpbik7XG4gICAgY29uc3QgaGggPSBNYXRoLmh5cG90KGggKiBjb3MsIHcgKiBzaW4pO1xuICAgIGJvdW5kcyA9IFtjeCAtIHd3LCBjeSAtIGhoLCBjeCArIHd3LCBjeSArIGhoXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbeDExLCB5MTFdID0gcm90YXRlKHgxLCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDEyLCB5MTJdID0gcm90YXRlKHgxLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIyLCB5MjJdID0gcm90YXRlKHgyLCB5MiwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBbeDIxLCB5MjFdID0gcm90YXRlKHgyLCB5MSwgY3gsIGN5LCBlbGVtZW50LmFuZ2xlKTtcbiAgICBjb25zdCBtaW5YID0gTWF0aC5taW4oeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtaW5ZID0gTWF0aC5taW4oeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBjb25zdCBtYXhYID0gTWF0aC5tYXgoeDExLCB4MTIsIHgyMiwgeDIxKTtcbiAgICBjb25zdCBtYXhZID0gTWF0aC5tYXgoeTExLCB5MTIsIHkyMiwgeTIxKTtcbiAgICBib3VuZHMgPSBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV07XG4gIH1cblxuICByZXR1cm4gYm91bmRzO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENvbW1vbkJvdW5kcyA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IEV4Y2FsaWRyYXdFbGVtZW50W10sXG4pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9PiB7XG4gIGlmICghZWxlbWVudHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIFswLCAwLCAwLCAwXTtcbiAgfVxuXG4gIGxldCBtaW5YID0gSW5maW5pdHk7XG4gIGxldCBtYXhYID0gLUluZmluaXR5O1xuICBsZXQgbWluWSA9IEluZmluaXR5O1xuICBsZXQgbWF4WSA9IC1JbmZpbml0eTtcblxuICBlbGVtZW50cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgY29uc3QgW3gxLCB5MSwgeDIsIHkyXSA9IGdldEVsZW1lbnRCb3VuZHMoZWxlbWVudCk7XG4gICAgbWluWCA9IE1hdGgubWluKG1pblgsIHgxKTtcbiAgICBtaW5ZID0gTWF0aC5taW4obWluWSwgeTEpO1xuICAgIG1heFggPSBNYXRoLm1heChtYXhYLCB4Mik7XG4gICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkyKTtcbiAgfSk7XG5cbiAgcmV0dXJuIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRSZXNpemVkRWxlbWVudEFic29sdXRlQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3RWxlbWVudCxcbiAgbmV4dFdpZHRoOiBudW1iZXIsXG4gIG5leHRIZWlnaHQ6IG51bWJlcixcbiAgbm9ybWFsaXplUG9pbnRzOiBib29sZWFuLFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIShpc0xpbmVhckVsZW1lbnQoZWxlbWVudCkgfHwgaXNGcmVlRHJhd0VsZW1lbnQoZWxlbWVudCkpKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGVsZW1lbnQueCxcbiAgICAgIGVsZW1lbnQueSxcbiAgICAgIGVsZW1lbnQueCArIG5leHRXaWR0aCxcbiAgICAgIGVsZW1lbnQueSArIG5leHRIZWlnaHQsXG4gICAgXTtcbiAgfVxuXG4gIGNvbnN0IHBvaW50cyA9IHJlc2NhbGVQb2ludHMoXG4gICAgMCxcbiAgICBuZXh0V2lkdGgsXG4gICAgcmVzY2FsZVBvaW50cygxLCBuZXh0SGVpZ2h0LCBlbGVtZW50LnBvaW50cywgbm9ybWFsaXplUG9pbnRzKSxcbiAgICBub3JtYWxpemVQb2ludHMsXG4gICk7XG5cbiAgbGV0IGJvdW5kczogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG5cbiAgaWYgKGlzRnJlZURyYXdFbGVtZW50KGVsZW1lbnQpKSB7XG4gICAgLy8gRnJlZSBEcmF3XG4gICAgYm91bmRzID0gZ2V0Qm91bmRzRnJvbVBvaW50cyhwb2ludHMpO1xuICB9IGVsc2Uge1xuICAgIC8vIExpbmVcbiAgICBjb25zdCBnZW4gPSByb3VnaC5nZW5lcmF0b3IoKTtcbiAgICBjb25zdCBjdXJ2ZSA9XG4gICAgICBlbGVtZW50LnN0cm9rZVNoYXJwbmVzcyA9PT0gXCJzaGFycFwiXG4gICAgICAgID8gZ2VuLmxpbmVhclBhdGgoXG4gICAgICAgICAgICBwb2ludHMgYXMgW251bWJlciwgbnVtYmVyXVtdLFxuICAgICAgICAgICAgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCksXG4gICAgICAgICAgKVxuICAgICAgICA6IGdlbi5jdXJ2ZShcbiAgICAgICAgICAgIHBvaW50cyBhcyBbbnVtYmVyLCBudW1iZXJdW10sXG4gICAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgICApO1xuICAgIGNvbnN0IG9wcyA9IGdldEN1cnZlUGF0aE9wcyhjdXJ2ZSk7XG4gICAgYm91bmRzID0gZ2V0TWluTWF4WFlGcm9tQ3VydmVQYXRoT3BzKG9wcyk7XG4gIH1cblxuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBib3VuZHM7XG4gIHJldHVybiBbXG4gICAgbWluWCArIGVsZW1lbnQueCxcbiAgICBtaW5ZICsgZWxlbWVudC55LFxuICAgIG1heFggKyBlbGVtZW50LngsXG4gICAgbWF4WSArIGVsZW1lbnQueSxcbiAgXTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRFbGVtZW50UG9pbnRzQ29vcmRzID0gKFxuICBlbGVtZW50OiBFeGNhbGlkcmF3TGluZWFyRWxlbWVudCxcbiAgcG9pbnRzOiByZWFkb25seSAocmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSlbXSxcbiAgc2hhcnBuZXNzOiBFeGNhbGlkcmF3RWxlbWVudFtcInN0cm9rZVNoYXJwbmVzc1wiXSxcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgLy8gVGhpcyBtaWdodCBiZSBjb21wdXRhdGlvbmFsbHkgaGVhdmV5XG4gIGNvbnN0IGdlbiA9IHJvdWdoLmdlbmVyYXRvcigpO1xuICBjb25zdCBjdXJ2ZSA9XG4gICAgc2hhcnBuZXNzID09PSBcInNoYXJwXCJcbiAgICAgID8gZ2VuLmxpbmVhclBhdGgoXG4gICAgICAgICAgcG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSxcbiAgICAgICAgICBnZW5lcmF0ZVJvdWdoT3B0aW9ucyhlbGVtZW50KSxcbiAgICAgICAgKVxuICAgICAgOiBnZW4uY3VydmUocG9pbnRzIGFzIFtudW1iZXIsIG51bWJlcl1bXSwgZ2VuZXJhdGVSb3VnaE9wdGlvbnMoZWxlbWVudCkpO1xuICBjb25zdCBvcHMgPSBnZXRDdXJ2ZVBhdGhPcHMoY3VydmUpO1xuICBjb25zdCBbbWluWCwgbWluWSwgbWF4WCwgbWF4WV0gPSBnZXRNaW5NYXhYWUZyb21DdXJ2ZVBhdGhPcHMob3BzKTtcbiAgcmV0dXJuIFtcbiAgICBtaW5YICsgZWxlbWVudC54LFxuICAgIG1pblkgKyBlbGVtZW50LnksXG4gICAgbWF4WCArIGVsZW1lbnQueCxcbiAgICBtYXhZICsgZWxlbWVudC55LFxuICBdO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENsb3Nlc3RFbGVtZW50Qm91bmRzID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgRXhjYWxpZHJhd0VsZW1lbnRbXSxcbiAgZnJvbTogeyB4OiBudW1iZXI7IHk6IG51bWJlciB9LFxuKTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPT4ge1xuICBpZiAoIWVsZW1lbnRzLmxlbmd0aCkge1xuICAgIHJldHVybiBbMCwgMCwgMCwgMF07XG4gIH1cblxuICBsZXQgbWluRGlzdGFuY2UgPSBJbmZpbml0eTtcbiAgbGV0IGNsb3Nlc3RFbGVtZW50ID0gZWxlbWVudHNbMF07XG5cbiAgZWxlbWVudHMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IFt4MSwgeTEsIHgyLCB5Ml0gPSBnZXRFbGVtZW50Qm91bmRzKGVsZW1lbnQpO1xuICAgIGNvbnN0IGRpc3RhbmNlID0gZGlzdGFuY2UyZCgoeDEgKyB4MikgLyAyLCAoeTEgKyB5MikgLyAyLCBmcm9tLngsIGZyb20ueSk7XG5cbiAgICBpZiAoZGlzdGFuY2UgPCBtaW5EaXN0YW5jZSkge1xuICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgIGNsb3Nlc3RFbGVtZW50ID0gZWxlbWVudDtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBnZXRFbGVtZW50Qm91bmRzKGNsb3Nlc3RFbGVtZW50KTtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm94IHtcbiAgbWluWDogbnVtYmVyO1xuICBtaW5ZOiBudW1iZXI7XG4gIG1heFg6IG51bWJlcjtcbiAgbWF4WTogbnVtYmVyO1xuICBtaWRYOiBudW1iZXI7XG4gIG1pZFk6IG51bWJlcjtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBnZXRDb21tb25Cb3VuZGluZ0JveCA9IChcbiAgZWxlbWVudHM6IEV4Y2FsaWRyYXdFbGVtZW50W10gfCByZWFkb25seSBOb25EZWxldGVkPEV4Y2FsaWRyYXdFbGVtZW50PltdLFxuKTogQm94ID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIHtcbiAgICBtaW5YLFxuICAgIG1pblksXG4gICAgbWF4WCxcbiAgICBtYXhZLFxuICAgIHdpZHRoOiBtYXhYIC0gbWluWCxcbiAgICBoZWlnaHQ6IG1heFkgLSBtaW5ZLFxuICAgIG1pZFg6IChtaW5YICsgbWF4WCkgLyAyLFxuICAgIG1pZFk6IChtaW5ZICsgbWF4WSkgLyAyLFxuICB9O1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../element/bounds.ts\n");
2814
2814
 
2815
2815
  /***/ }),
2816
2816
 
@@ -3162,7 +3162,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3162
3162
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3163
3163
 
3164
3164
  "use strict";
3165
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-32d8221\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
3165
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../constants */ \"../../constants.ts\");\n\nif (\"development\" !== _constants__WEBPACK_IMPORTED_MODULE_0__.ENV.TEST) {\n /* eslint-disable */\n /* global __webpack_public_path__:writable */\n __webpack_require__.p =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-33300d1\"}/dist/`;\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9wdWJsaWNQYXRoLmpzLmpzIiwibWFwcGluZ3MiOiI7O0FBQXNDO0FBQ3RDLElBQUksYUFBb0IsS0FBSyxnREFBUSxFQUFFO0lBQ3JDLG9CQUFvQjtJQUNwQiw2Q0FBNkM7SUFDN0MscUJBQXVCO1FBQ3JCLE1BQU0sQ0FBQyxxQkFBcUI7WUFDNUIscUJBQXFCLHdCQUFvQixJQUFJLGdCQUF1QixRQUFRLENBQUM7Q0FDaEYiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9wdWJsaWNQYXRoLmpzP2E4N2QiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5WIH0gZnJvbSBcIi4uLy4uL2NvbnN0YW50c1wiO1xuaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WICE9PSBFTlYuVEVTVCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSAqL1xuICAvKiBnbG9iYWwgX193ZWJwYWNrX3B1YmxpY19wYXRoX186d3JpdGFibGUgKi9cbiAgX193ZWJwYWNrX3B1YmxpY19wYXRoX18gPVxuICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICBgaHR0cHM6Ly91bnBrZy5jb20vJHtwcm9jZXNzLmVudi5QS0dfTkFNRX1AJHtwcm9jZXNzLmVudi5QS0dfVkVSU0lPTn0vZGlzdC9gO1xufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./publicPath.js\n");
3166
3166
 
3167
3167
  /***/ }),
3168
3168
 
@@ -3272,7 +3272,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3272
3272
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3273
3273
 
3274
3274
  "use strict";
3275
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-32d8221\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style>\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
3275
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SVG_EXPORT_TAG\": () => (/* binding */ SVG_EXPORT_TAG),\n/* harmony export */ \"exportToCanvas\": () => (/* binding */ exportToCanvas),\n/* harmony export */ \"exportToSvg\": () => (/* binding */ exportToSvg),\n/* harmony export */ \"getExportSize\": () => (/* binding */ getExportSize)\n/* harmony export */ });\n/* harmony import */ var roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! roughjs/bin/rough */ \"../../../node_modules/roughjs/bin/rough.js\");\n/* harmony import */ var _element_bounds__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../element/bounds */ \"../../element/bounds.ts\");\n/* harmony import */ var _renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../renderer/renderScene */ \"../../renderer/renderScene.ts\");\n/* harmony import */ var _utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../utils */ \"../../utils.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../constants */ \"../../constants.ts\");\n/* harmony import */ var _appState__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../appState */ \"../../appState.ts\");\n/* harmony import */ var _data_json__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../data/json */ \"../../data/json.ts\");\n/* harmony import */ var _element_image__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ../element/image */ \"../../element/image.ts\");\nvar __awaiter = (undefined && undefined.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\n\n\n\n\n\n\n\n\nconst SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\nconst exportToCanvas = (elements, appState, files, { exportBackground, exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, }, createCanvas = (width, height) => {\n const canvas = document.createElement(\"canvas\");\n canvas.width = width * appState.exportScale;\n canvas.height = height * appState.exportScale;\n return { canvas, scale: appState.exportScale };\n}) => __awaiter(void 0, void 0, void 0, function* () {\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n const { canvas, scale = 1 } = createCanvas(width, height);\n const defaultAppState = (0,_appState__WEBPACK_IMPORTED_MODULE_5__.getDefaultAppState)();\n const { imageCache } = yield (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.updateImageCache)({\n imageCache: new Map(),\n fileIds: (0,_element_image__WEBPACK_IMPORTED_MODULE_7__.getInitializedImageElements)(elements).map((element) => element.fileId),\n files,\n });\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderScene)({\n elements,\n appState,\n scale,\n rc: roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].canvas(canvas),\n canvas,\n renderConfig: {\n viewBackgroundColor: exportBackground ? viewBackgroundColor : null,\n scrollX: -minX + exportPadding,\n scrollY: -minY + exportPadding,\n zoom: defaultAppState.zoom,\n remotePointerViewportCoords: {},\n remoteSelectedElementIds: {},\n shouldCacheIgnoreZoom: false,\n remotePointerUsernames: {},\n remotePointerUserStates: {},\n theme: appState.exportWithDarkMode ? \"dark\" : \"light\",\n imageCache,\n renderScrollbars: false,\n renderSelection: false,\n renderGrid: false,\n isExporting: true,\n },\n });\n return canvas;\n});\nconst exportToSvg = (elements, appState, files) => __awaiter(void 0, void 0, void 0, function* () {\n const { exportPadding = _constants__WEBPACK_IMPORTED_MODULE_4__.DEFAULT_EXPORT_PADDING, viewBackgroundColor, exportScale = 1, exportEmbedScene, } = appState;\n let metadata = \"\";\n if (exportEmbedScene) {\n try {\n metadata = yield (yield Promise.resolve(/*! import() */).then(__webpack_require__.bind(__webpack_require__, /*! ../../src/data/image */ \"../../data/image.ts\"))).encodeSvgMetadata({\n text: (0,_data_json__WEBPACK_IMPORTED_MODULE_6__.serializeAsJSON)(elements, appState, files || {}, \"local\"),\n });\n }\n catch (error) {\n console.error(error);\n }\n }\n const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n // initialize SVG root\n const svgRoot = document.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"svg\");\n svgRoot.setAttribute(\"version\", \"1.1\");\n svgRoot.setAttribute(\"xmlns\", _constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS);\n svgRoot.setAttribute(\"viewBox\", `0 0 ${width} ${height}`);\n svgRoot.setAttribute(\"width\", `${width * exportScale}`);\n svgRoot.setAttribute(\"height\", `${height * exportScale}`);\n if (appState.exportWithDarkMode) {\n svgRoot.setAttribute(\"filter\", _constants__WEBPACK_IMPORTED_MODULE_4__.THEME_FILTER);\n }\n let assetPath = \"https://excalidraw.com/\";\n // Asset path needs to be determined only when using package\n if (true) {\n assetPath =\n window.EXCALIDRAW_ASSET_PATH ||\n `https://unpkg.com/${\"@excalidraw/excalidraw\"}@${\"0.12.0-33300d1\"}`;\n if (assetPath === null || assetPath === void 0 ? void 0 : assetPath.startsWith(\"/\")) {\n assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n }\n assetPath = `${assetPath}/dist/excalidraw-assets/`;\n }\n svgRoot.innerHTML = `\n ${SVG_EXPORT_TAG}\n ${metadata}\n <defs>\n <style>\n @font-face {\n font-family: \"Virgil\";\n src: url(\"${assetPath}Virgil.woff2\");\n }\n @font-face {\n font-family: \"Cascadia\";\n src: url(\"${assetPath}Cascadia.woff2\");\n }\n </style>\n </defs>\n `;\n // render background rect\n if (appState.exportBackground && viewBackgroundColor) {\n const rect = svgRoot.ownerDocument.createElementNS(_constants__WEBPACK_IMPORTED_MODULE_4__.SVG_NS, \"rect\");\n rect.setAttribute(\"x\", \"0\");\n rect.setAttribute(\"y\", \"0\");\n rect.setAttribute(\"width\", `${width}`);\n rect.setAttribute(\"height\", `${height}`);\n rect.setAttribute(\"fill\", viewBackgroundColor);\n svgRoot.appendChild(rect);\n }\n const rsvg = roughjs_bin_rough__WEBPACK_IMPORTED_MODULE_0__[\"default\"].svg(svgRoot);\n (0,_renderer_renderScene__WEBPACK_IMPORTED_MODULE_2__.renderSceneToSvg)(elements, rsvg, svgRoot, files || {}, {\n offsetX: -minX + exportPadding,\n offsetY: -minY + exportPadding,\n exportWithDarkMode: appState.exportWithDarkMode,\n });\n return svgRoot;\n});\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (elements, exportPadding) => {\n const [minX, minY, maxX, maxY] = (0,_element_bounds__WEBPACK_IMPORTED_MODULE_1__.getCommonBounds)(elements);\n const width = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minX, maxX) + exportPadding * 2;\n const height = (0,_utils__WEBPACK_IMPORTED_MODULE_3__.distance)(minY, maxY) + exportPadding + exportPadding;\n return [minX, minY, width, height];\n};\nconst getExportSize = (elements, exportPadding, scale) => {\n const [, , width, height] = getCanvasSize(elements, exportPadding).map((dimension) => Math.trunc(dimension * scale));\n return [width, height];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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Iiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3NjZW5lL2V4cG9ydC50cz85YmY3Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByb3VnaCBmcm9tIFwicm91Z2hqcy9iaW4vcm91Z2hcIjtcbmltcG9ydCB7IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudCB9IGZyb20gXCIuLi9lbGVtZW50L3R5cGVzXCI7XG5pbXBvcnQgeyBnZXRDb21tb25Cb3VuZHMgfSBmcm9tIFwiLi4vZWxlbWVudC9ib3VuZHNcIjtcbmltcG9ydCB7IHJlbmRlclNjZW5lLCByZW5kZXJTY2VuZVRvU3ZnIH0gZnJvbSBcIi4uL3JlbmRlcmVyL3JlbmRlclNjZW5lXCI7XG5pbXBvcnQgeyBkaXN0YW5jZSB9IGZyb20gXCIuLi91dGlsc1wiO1xuaW1wb3J0IHsgQXBwU3RhdGUsIEJpbmFyeUZpbGVzIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBERUZBVUxUX0VYUE9SVF9QQURESU5HLCBTVkdfTlMsIFRIRU1FX0ZJTFRFUiB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGdldERlZmF1bHRBcHBTdGF0ZSB9IGZyb20gXCIuLi9hcHBTdGF0ZVwiO1xuaW1wb3J0IHsgc2VyaWFsaXplQXNKU09OIH0gZnJvbSBcIi4uL2RhdGEvanNvblwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5pdGlhbGl6ZWRJbWFnZUVsZW1lbnRzLFxuICB1cGRhdGVJbWFnZUNhY2hlLFxufSBmcm9tIFwiLi4vZWxlbWVudC9pbWFnZVwiO1xuXG5leHBvcnQgY29uc3QgU1ZHX0VYUE9SVF9UQUcgPSBgPCEtLSBzdmctc291cmNlOmV4Y2FsaWRyYXcgLS0+YDtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvQ2FudmFzID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiBBcHBTdGF0ZSxcbiAgZmlsZXM6IEJpbmFyeUZpbGVzLFxuICB7XG4gICAgZXhwb3J0QmFja2dyb3VuZCxcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICB9OiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgfSxcbiAgY3JlYXRlQ2FudmFzOiAoXG4gICAgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlcixcbiAgKSA9PiB7IGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQ7IHNjYWxlOiBudW1iZXIgfSA9ICh3aWR0aCwgaGVpZ2h0KSA9PiB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBjYW52YXMud2lkdGggPSB3aWR0aCAqIGFwcFN0YXRlLmV4cG9ydFNjYWxlO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQgKiBhcHBTdGF0ZS5leHBvcnRTY2FsZTtcbiAgICByZXR1cm4geyBjYW52YXMsIHNjYWxlOiBhcHBTdGF0ZS5leHBvcnRTY2FsZSB9O1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IFttaW5YLCBtaW5ZLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpO1xuXG4gIGNvbnN0IHsgY2FudmFzLCBzY2FsZSA9IDEgfSA9IGNyZWF0ZUNhbnZhcyh3aWR0aCwgaGVpZ2h0KTtcblxuICBjb25zdCBkZWZhdWx0QXBwU3RhdGUgPSBnZXREZWZhdWx0QXBwU3RhdGUoKTtcblxuICBjb25zdCB7IGltYWdlQ2FjaGUgfSA9IGF3YWl0IHVwZGF0ZUltYWdlQ2FjaGUoe1xuICAgIGltYWdlQ2FjaGU6IG5ldyBNYXAoKSxcbiAgICBmaWxlSWRzOiBnZXRJbml0aWFsaXplZEltYWdlRWxlbWVudHMoZWxlbWVudHMpLm1hcChcbiAgICAgIChlbGVtZW50KSA9PiBlbGVtZW50LmZpbGVJZCxcbiAgICApLFxuICAgIGZpbGVzLFxuICB9KTtcblxuICByZW5kZXJTY2VuZSh7XG4gICAgZWxlbWVudHMsXG4gICAgYXBwU3RhdGUsXG4gICAgc2NhbGUsXG4gICAgcmM6IHJvdWdoLmNhbnZhcyhjYW52YXMpLFxuICAgIGNhbnZhcyxcbiAgICByZW5kZXJDb25maWc6IHtcbiAgICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IGV4cG9ydEJhY2tncm91bmQgPyB2aWV3QmFja2dyb3VuZENvbG9yIDogbnVsbCxcbiAgICAgIHNjcm9sbFg6IC1taW5YICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHNjcm9sbFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICAgIHpvb206IGRlZmF1bHRBcHBTdGF0ZS56b29tLFxuICAgICAgcmVtb3RlUG9pbnRlclZpZXdwb3J0Q29vcmRzOiB7fSxcbiAgICAgIHJlbW90ZVNlbGVjdGVkRWxlbWVudElkczoge30sXG4gICAgICBzaG91bGRDYWNoZUlnbm9yZVpvb206IGZhbHNlLFxuICAgICAgcmVtb3RlUG9pbnRlclVzZXJuYW1lczoge30sXG4gICAgICByZW1vdGVQb2ludGVyVXNlclN0YXRlczoge30sXG4gICAgICB0aGVtZTogYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlID8gXCJkYXJrXCIgOiBcImxpZ2h0XCIsXG4gICAgICBpbWFnZUNhY2hlLFxuICAgICAgcmVuZGVyU2Nyb2xsYmFyczogZmFsc2UsXG4gICAgICByZW5kZXJTZWxlY3Rpb246IGZhbHNlLFxuICAgICAgcmVuZGVyR3JpZDogZmFsc2UsXG4gICAgICBpc0V4cG9ydGluZzogdHJ1ZSxcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gY2FudmFzO1xufTtcblxuZXhwb3J0IGNvbnN0IGV4cG9ydFRvU3ZnID0gYXN5bmMgKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGFwcFN0YXRlOiB7XG4gICAgZXhwb3J0QmFja2dyb3VuZDogYm9vbGVhbjtcbiAgICBleHBvcnRQYWRkaW5nPzogbnVtYmVyO1xuICAgIGV4cG9ydFNjYWxlPzogbnVtYmVyO1xuICAgIHZpZXdCYWNrZ3JvdW5kQ29sb3I6IHN0cmluZztcbiAgICBleHBvcnRXaXRoRGFya01vZGU/OiBib29sZWFuO1xuICAgIGV4cG9ydEVtYmVkU2NlbmU/OiBib29sZWFuO1xuICB9LFxuICBmaWxlczogQmluYXJ5RmlsZXMgfCBudWxsLFxuKTogUHJvbWlzZTxTVkdTVkdFbGVtZW50PiA9PiB7XG4gIGNvbnN0IHtcbiAgICBleHBvcnRQYWRkaW5nID0gREVGQVVMVF9FWFBPUlRfUEFERElORyxcbiAgICB2aWV3QmFja2dyb3VuZENvbG9yLFxuICAgIGV4cG9ydFNjYWxlID0gMSxcbiAgICBleHBvcnRFbWJlZFNjZW5lLFxuICB9ID0gYXBwU3RhdGU7XG4gIGxldCBtZXRhZGF0YSA9IFwiXCI7XG4gIGlmIChleHBvcnRFbWJlZFNjZW5lKSB7XG4gICAgdHJ5IHtcbiAgICAgIG1ldGFkYXRhID0gYXdhaXQgKFxuICAgICAgICBhd2FpdCBpbXBvcnQoLyogd2VicGFja0NodW5rTmFtZTogXCJpbWFnZVwiICovIFwiLi4vLi4vc3JjL2RhdGEvaW1hZ2VcIilcbiAgICAgICkuZW5jb2RlU3ZnTWV0YWRhdGEoe1xuICAgICAgICB0ZXh0OiBzZXJpYWxpemVBc0pTT04oZWxlbWVudHMsIGFwcFN0YXRlLCBmaWxlcyB8fCB7fSwgXCJsb2NhbFwiKSxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfVxuICBjb25zdCBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF0gPSBnZXRDYW52YXNTaXplKGVsZW1lbnRzLCBleHBvcnRQYWRkaW5nKTtcblxuICAvLyBpbml0aWFsaXplIFNWRyByb290XG4gIGNvbnN0IHN2Z1Jvb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05TLCBcInN2Z1wiKTtcbiAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJ2ZXJzaW9uXCIsIFwiMS4xXCIpO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcInhtbG5zXCIsIFNWR19OUyk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCBgMCAwICR7d2lkdGh9ICR7aGVpZ2h0fWApO1xuICBzdmdSb290LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRoICogZXhwb3J0U2NhbGV9YCk7XG4gIHN2Z1Jvb3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodCAqIGV4cG9ydFNjYWxlfWApO1xuICBpZiAoYXBwU3RhdGUuZXhwb3J0V2l0aERhcmtNb2RlKSB7XG4gICAgc3ZnUm9vdC5zZXRBdHRyaWJ1dGUoXCJmaWx0ZXJcIiwgVEhFTUVfRklMVEVSKTtcbiAgfVxuXG4gIGxldCBhc3NldFBhdGggPSBcImh0dHBzOi8vZXhjYWxpZHJhdy5jb20vXCI7XG5cbiAgLy8gQXNzZXQgcGF0aCBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIG9ubHkgd2hlbiB1c2luZyBwYWNrYWdlXG4gIGlmIChwcm9jZXNzLmVudi5JU19FWENBTElEUkFXX05QTV9QQUNLQUdFKSB7XG4gICAgYXNzZXRQYXRoID1cbiAgICAgIHdpbmRvdy5FWENBTElEUkFXX0FTU0VUX1BBVEggfHxcbiAgICAgIGBodHRwczovL3VucGtnLmNvbS8ke3Byb2Nlc3MuZW52LlBLR19OQU1FfUAke3Byb2Nlc3MuZW52LlBLR19WRVJTSU9OfWA7XG5cbiAgICBpZiAoYXNzZXRQYXRoPy5zdGFydHNXaXRoKFwiL1wiKSkge1xuICAgICAgYXNzZXRQYXRoID0gYXNzZXRQYXRoLnJlcGxhY2UoXCIvXCIsIGAke3dpbmRvdy5sb2NhdGlvbi5vcmlnaW59L2ApO1xuICAgIH1cbiAgICBhc3NldFBhdGggPSBgJHthc3NldFBhdGh9L2Rpc3QvZXhjYWxpZHJhdy1hc3NldHMvYDtcbiAgfVxuICBzdmdSb290LmlubmVySFRNTCA9IGBcbiAgJHtTVkdfRVhQT1JUX1RBR31cbiAgJHttZXRhZGF0YX1cbiAgPGRlZnM+XG4gICAgPHN0eWxlPlxuICAgICAgQGZvbnQtZmFjZSB7XG4gICAgICAgIGZvbnQtZmFtaWx5OiBcIlZpcmdpbFwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofVZpcmdpbC53b2ZmMlwiKTtcbiAgICAgIH1cbiAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICBmb250LWZhbWlseTogXCJDYXNjYWRpYVwiO1xuICAgICAgICBzcmM6IHVybChcIiR7YXNzZXRQYXRofUNhc2NhZGlhLndvZmYyXCIpO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvZGVmcz5cbiAgYDtcbiAgLy8gcmVuZGVyIGJhY2tncm91bmQgcmVjdFxuICBpZiAoYXBwU3RhdGUuZXhwb3J0QmFja2dyb3VuZCAmJiB2aWV3QmFja2dyb3VuZENvbG9yKSB7XG4gICAgY29uc3QgcmVjdCA9IHN2Z1Jvb3Qub3duZXJEb2N1bWVudCEuY3JlYXRlRWxlbWVudE5TKFNWR19OUywgXCJyZWN0XCIpO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwieFwiLCBcIjBcIik7XG4gICAgcmVjdC5zZXRBdHRyaWJ1dGUoXCJ5XCIsIFwiMFwiKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcIndpZHRoXCIsIGAke3dpZHRofWApO1xuICAgIHJlY3Quc2V0QXR0cmlidXRlKFwiaGVpZ2h0XCIsIGAke2hlaWdodH1gKTtcbiAgICByZWN0LnNldEF0dHJpYnV0ZShcImZpbGxcIiwgdmlld0JhY2tncm91bmRDb2xvcik7XG4gICAgc3ZnUm9vdC5hcHBlbmRDaGlsZChyZWN0KTtcbiAgfVxuXG4gIGNvbnN0IHJzdmcgPSByb3VnaC5zdmcoc3ZnUm9vdCk7XG4gIHJlbmRlclNjZW5lVG9TdmcoZWxlbWVudHMsIHJzdmcsIHN2Z1Jvb3QsIGZpbGVzIHx8IHt9LCB7XG4gICAgb2Zmc2V0WDogLW1pblggKyBleHBvcnRQYWRkaW5nLFxuICAgIG9mZnNldFk6IC1taW5ZICsgZXhwb3J0UGFkZGluZyxcbiAgICBleHBvcnRXaXRoRGFya01vZGU6IGFwcFN0YXRlLmV4cG9ydFdpdGhEYXJrTW9kZSxcbiAgfSk7XG5cbiAgcmV0dXJuIHN2Z1Jvb3Q7XG59O1xuXG4vLyBjYWxjdWxhdGUgc21hbGxlc3QgYXJlYSB0byBmaXQgdGhlIGNvbnRlbnRzIGluXG5jb25zdCBnZXRDYW52YXNTaXplID0gKFxuICBlbGVtZW50czogcmVhZG9ubHkgTm9uRGVsZXRlZEV4Y2FsaWRyYXdFbGVtZW50W10sXG4gIGV4cG9ydFBhZGRpbmc6IG51bWJlcixcbik6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgW21pblgsIG1pblksIG1heFgsIG1heFldID0gZ2V0Q29tbW9uQm91bmRzKGVsZW1lbnRzKTtcbiAgY29uc3Qgd2lkdGggPSBkaXN0YW5jZShtaW5YLCBtYXhYKSArIGV4cG9ydFBhZGRpbmcgKiAyO1xuICBjb25zdCBoZWlnaHQgPSBkaXN0YW5jZShtaW5ZLCBtYXhZKSArIGV4cG9ydFBhZGRpbmcgKyBleHBvcnRQYWRkaW5nO1xuXG4gIHJldHVybiBbbWluWCwgbWluWSwgd2lkdGgsIGhlaWdodF07XG59O1xuXG5leHBvcnQgY29uc3QgZ2V0RXhwb3J0U2l6ZSA9IChcbiAgZWxlbWVudHM6IHJlYWRvbmx5IE5vbkRlbGV0ZWRFeGNhbGlkcmF3RWxlbWVudFtdLFxuICBleHBvcnRQYWRkaW5nOiBudW1iZXIsXG4gIHNjYWxlOiBudW1iZXIsXG4pOiBbbnVtYmVyLCBudW1iZXJdID0+IHtcbiAgY29uc3QgWywgLCB3aWR0aCwgaGVpZ2h0XSA9IGdldENhbnZhc1NpemUoZWxlbWVudHMsIGV4cG9ydFBhZGRpbmcpLm1hcChcbiAgICAoZGltZW5zaW9uKSA9PiBNYXRoLnRydW5jKGRpbWVuc2lvbiAqIHNjYWxlKSxcbiAgKTtcblxuICByZXR1cm4gW3dpZHRoLCBoZWlnaHRdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../scene/export.ts\n");
3276
3276
 
3277
3277
  /***/ }),
3278
3278
 
@@ -3360,7 +3360,7 @@ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpac
3360
3360
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
3361
3361
 
3362
3362
  "use strict";
3363
- eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if (appState.activeTool.type === \"eraser\") {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-32d8221\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-32d8221\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBVSxFQUNzQyxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSztRQUNQLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFPLElBQUksS0FBSztRQUNoQixTQUFTLElBQUksS0FBSyxDQUNuQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGlCQUFpQixHQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxnQkFBZ0IsQ0FDbkQsb0VBQW9FLENBQ3JFLENBQUM7SUFFRixPQUFPLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxPQUE0QixDQUFDLFFBQVEsQ0FDbkU7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5cbmxldCBtb2NrRGF0ZVRpbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IChkYXRlVGltZTogc3RyaW5nKSA9PiB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGVUaW1lID0gKCkgPT4ge1xuICBpZiAobW9ja0RhdGVUaW1lKSB7XG4gICAgcmV0dXJuIG1vY2tEYXRlVGltZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IGAke2RhdGUuZ2V0TW9udGgoKSArIDF9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZ2V0RGF0ZSgpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBociA9IGAke2RhdGUuZ2V0SG91cnMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgbWluID0gYCR7ZGF0ZS5nZXRNaW51dGVzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzIEhUTUxFbGVtZW50ID0+XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxTZWxlY3RFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xuXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZUVsZW1lbnQgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldEZvbnRGYW1pbHlTdHJpbmcgPSAoe1xuICBmb250RmFtaWx5LFxufToge1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQ7XG59O1xuXG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBnZXRGb250U3RyaW5nID0gKHtcbiAgZm9udFNpemUsXG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIHJldHVybiBgJHtmb250U2l6ZX1weCAke2dldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5IH0pfWAgYXMgRm9udFN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIHRpbWVvdXQ6IG51bWJlcixcbikgPT4ge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBjb25zdCBfbGFzdEFyZ3MgPSBsYXN0QXJncztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLl9sYXN0QXJncyk7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5leHBvcnQgY29uc3QgdGhyb3R0bGVSQUYgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICBvcHRzPzogeyB0cmFpbGluZz86IGJvb2xlYW4gfSxcbikgPT4ge1xuICBsZXQgdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3NUcmFpbGluZzogVCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNjaGVkdWxlRnVuYyA9IChhcmdzOiBUKSA9PiB7XG4gICAgdGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGZuKC4uLihsYXN0QXJnc1RyYWlsaW5nIHx8IGxhc3RBcmdzKSk7XG4gICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvZXMvY2h1bmsuanNcbmV4cG9ydCBjb25zdCBjaHVuayA9IDxUIGV4dGVuZHMgYW55PihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgc2l6ZTogbnVtYmVyLFxuKTogVFtdW10gPT4ge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuICB3aGlsZSAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBhcnJheS5zbGljZShpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSAobm9kZTogRWxlbWVudCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IChcbiAgYXBwU3RhdGU6IFBpY2s8QXBwU3RhdGUsIFwiYWN0aXZlVG9vbFwiPixcbiAgZGF0YTogKFxuICAgIHwgeyB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIilcbiAgICAucmVwbGFjZSgvXFxiRGVsXFxiL2ksIFwiRGVsZXRlXCIpO1xuXG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
3363
+ eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"allowFullScreen\": () => (/* binding */ allowFullScreen),\n/* harmony export */ \"arrayToMap\": () => (/* binding */ arrayToMap),\n/* harmony export */ \"bytesToHexString\": () => (/* binding */ bytesToHexString),\n/* harmony export */ \"capitalizeString\": () => (/* binding */ capitalizeString),\n/* harmony export */ \"chunk\": () => (/* binding */ chunk),\n/* harmony export */ \"debounce\": () => (/* binding */ debounce),\n/* harmony export */ \"distance\": () => (/* binding */ distance),\n/* harmony export */ \"exitFullScreen\": () => (/* binding */ exitFullScreen),\n/* harmony export */ \"findIndex\": () => (/* binding */ findIndex),\n/* harmony export */ \"findLastIndex\": () => (/* binding */ findLastIndex),\n/* harmony export */ \"focusNearestParent\": () => (/* binding */ focusNearestParent),\n/* harmony export */ \"getDateTime\": () => (/* binding */ getDateTime),\n/* harmony export */ \"getFontFamilyString\": () => (/* binding */ getFontFamilyString),\n/* harmony export */ \"getFontString\": () => (/* binding */ getFontString),\n/* harmony export */ \"getFrame\": () => (/* binding */ getFrame),\n/* harmony export */ \"getGlobalCSSVariable\": () => (/* binding */ getGlobalCSSVariable),\n/* harmony export */ \"getNearestScrollableContainer\": () => (/* binding */ getNearestScrollableContainer),\n/* harmony export */ \"getShortcutKey\": () => (/* binding */ getShortcutKey),\n/* harmony export */ \"getUpdatedTimestamp\": () => (/* binding */ getUpdatedTimestamp),\n/* harmony export */ \"getVersion\": () => (/* binding */ getVersion),\n/* harmony export */ \"isFullScreen\": () => (/* binding */ isFullScreen),\n/* harmony export */ \"isInputLike\": () => (/* binding */ isInputLike),\n/* harmony export */ \"isPrimitive\": () => (/* binding */ isPrimitive),\n/* harmony export */ \"isProdEnv\": () => (/* binding */ isProdEnv),\n/* harmony export */ \"isPromiseLike\": () => (/* binding */ isPromiseLike),\n/* harmony export */ \"isRTL\": () => (/* binding */ isRTL),\n/* harmony export */ \"isTestEnv\": () => (/* binding */ isTestEnv),\n/* harmony export */ \"isToolIcon\": () => (/* binding */ isToolIcon),\n/* harmony export */ \"isTransparent\": () => (/* binding */ isTransparent),\n/* harmony export */ \"isWritableElement\": () => (/* binding */ isWritableElement),\n/* harmony export */ \"muteFSAbortError\": () => (/* binding */ muteFSAbortError),\n/* harmony export */ \"nFormatter\": () => (/* binding */ nFormatter),\n/* harmony export */ \"preventUnload\": () => (/* binding */ preventUnload),\n/* harmony export */ \"queryFocusableElements\": () => (/* binding */ queryFocusableElements),\n/* harmony export */ \"removeSelection\": () => (/* binding */ removeSelection),\n/* harmony export */ \"resetCursor\": () => (/* binding */ resetCursor),\n/* harmony export */ \"resolvablePromise\": () => (/* binding */ resolvablePromise),\n/* harmony export */ \"sceneCoordsToViewportCoords\": () => (/* binding */ sceneCoordsToViewportCoords),\n/* harmony export */ \"selectNode\": () => (/* binding */ selectNode),\n/* harmony export */ \"setCursor\": () => (/* binding */ setCursor),\n/* harmony export */ \"setCursorForShape\": () => (/* binding */ setCursorForShape),\n/* harmony export */ \"setDateTimeForTests\": () => (/* binding */ setDateTimeForTests),\n/* harmony export */ \"setEraserCursor\": () => (/* binding */ setEraserCursor),\n/* harmony export */ \"supportsEmoji\": () => (/* binding */ supportsEmoji),\n/* harmony export */ \"throttleRAF\": () => (/* binding */ throttleRAF),\n/* harmony export */ \"tupleToCoors\": () => (/* binding */ tupleToCoors),\n/* harmony export */ \"updateActiveTool\": () => (/* binding */ updateActiveTool),\n/* harmony export */ \"updateObject\": () => (/* binding */ updateObject),\n/* harmony export */ \"viewportCoordsToSceneCoords\": () => (/* binding */ viewportCoordsToSceneCoords),\n/* harmony export */ \"withBatchedUpdates\": () => (/* binding */ withBatchedUpdates),\n/* harmony export */ \"withBatchedUpdatesThrottled\": () => (/* binding */ withBatchedUpdatesThrottled),\n/* harmony export */ \"wrapEvent\": () => (/* binding */ wrapEvent)\n/* harmony export */ });\n/* harmony import */ var open_color__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! open-color */ \"../../../node_modules/open-color/open-color.json\");\n/* harmony import */ var _colors__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./colors */ \"../../colors.ts\");\n/* harmony import */ var _constants__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./constants */ \"../../constants.ts\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react-dom */ \"react-dom\");\n/* harmony import */ var react_dom__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(react_dom__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _keys__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./keys */ \"../../keys.ts\");\n\n\n\n\n\nlet mockDateTime = null;\nconst setDateTimeForTests = (dateTime) => {\n mockDateTime = dateTime;\n};\nconst getDateTime = () => {\n if (mockDateTime) {\n return mockDateTime;\n }\n const date = new Date();\n const year = date.getFullYear();\n const month = `${date.getMonth() + 1}`.padStart(2, \"0\");\n const day = `${date.getDate()}`.padStart(2, \"0\");\n const hr = `${date.getHours()}`.padStart(2, \"0\");\n const min = `${date.getMinutes()}`.padStart(2, \"0\");\n return `${year}-${month}-${day}-${hr}${min}`;\n};\nconst capitalizeString = (str) => str.charAt(0).toUpperCase() + str.slice(1);\nconst isToolIcon = (target) => target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\nconst isInputLike = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLInputElement ||\n target instanceof HTMLTextAreaElement ||\n target instanceof HTMLSelectElement;\nconst isWritableElement = (target) => (target instanceof HTMLElement && target.dataset.type === \"wysiwyg\") ||\n target instanceof HTMLBRElement || // newline in wysiwyg\n target instanceof HTMLTextAreaElement ||\n (target instanceof HTMLInputElement &&\n (target.type === \"text\" || target.type === \"number\"));\nconst getFontFamilyString = ({ fontFamily, }) => {\n for (const [fontFamilyString, id] of Object.entries(_constants__WEBPACK_IMPORTED_MODULE_2__.FONT_FAMILY)) {\n if (id === fontFamily) {\n return `${fontFamilyString}, ${_constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT}`;\n }\n }\n return _constants__WEBPACK_IMPORTED_MODULE_2__.WINDOWS_EMOJI_FALLBACK_FONT;\n};\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nconst getFontString = ({ fontSize, fontFamily, }) => {\n return `${fontSize}px ${getFontFamilyString({ fontFamily })}`;\n};\nconst debounce = (fn, timeout) => {\n let handle = 0;\n let lastArgs = null;\n const ret = (...args) => {\n lastArgs = args;\n clearTimeout(handle);\n handle = window.setTimeout(() => {\n lastArgs = null;\n fn(...args);\n }, timeout);\n };\n ret.flush = () => {\n clearTimeout(handle);\n if (lastArgs) {\n const _lastArgs = lastArgs;\n lastArgs = null;\n fn(..._lastArgs);\n }\n };\n ret.cancel = () => {\n lastArgs = null;\n clearTimeout(handle);\n };\n return ret;\n};\n// throttle callback to execute once per animation frame\nconst throttleRAF = (fn, opts) => {\n let timerId = null;\n let lastArgs = null;\n let lastArgsTrailing = null;\n const scheduleFunc = (args) => {\n timerId = window.requestAnimationFrame(() => {\n timerId = null;\n fn(...args);\n lastArgs = null;\n if (lastArgsTrailing) {\n lastArgs = lastArgsTrailing;\n lastArgsTrailing = null;\n scheduleFunc(lastArgs);\n }\n });\n };\n const ret = (...args) => {\n if (false) {}\n lastArgs = args;\n if (timerId === null) {\n scheduleFunc(lastArgs);\n }\n else if (opts === null || opts === void 0 ? void 0 : opts.trailing) {\n lastArgsTrailing = args;\n }\n };\n ret.flush = () => {\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n if (lastArgs) {\n fn(...(lastArgsTrailing || lastArgs));\n lastArgs = lastArgsTrailing = null;\n }\n };\n ret.cancel = () => {\n lastArgs = lastArgsTrailing = null;\n if (timerId !== null) {\n cancelAnimationFrame(timerId);\n timerId = null;\n }\n };\n return ret;\n};\n// https://github.com/lodash/lodash/blob/es/chunk.js\nconst chunk = (array, size) => {\n if (!array.length || size < 1) {\n return [];\n }\n let index = 0;\n let resIndex = 0;\n const result = Array(Math.ceil(array.length / size));\n while (index < array.length) {\n result[resIndex++] = array.slice(index, (index += size));\n }\n return result;\n};\nconst selectNode = (node) => {\n const selection = window.getSelection();\n if (selection) {\n const range = document.createRange();\n range.selectNodeContents(node);\n selection.removeAllRanges();\n selection.addRange(range);\n }\n};\nconst removeSelection = () => {\n const selection = window.getSelection();\n if (selection) {\n selection.removeAllRanges();\n }\n};\nconst distance = (x, y) => Math.abs(x - y);\nconst updateActiveTool = (appState, data) => {\n if (data.type === \"custom\") {\n return Object.assign(Object.assign({}, appState.activeTool), { type: \"custom\", customType: data.customType });\n }\n return Object.assign(Object.assign({}, appState.activeTool), { lastActiveToolBeforeEraser: data.lastActiveToolBeforeEraser === undefined\n ? appState.activeTool.lastActiveToolBeforeEraser\n : data.lastActiveToolBeforeEraser, type: data.type, customType: null });\n};\nconst resetCursor = (canvas) => {\n if (canvas) {\n canvas.style.cursor = \"\";\n }\n};\nconst setCursor = (canvas, cursor) => {\n if (canvas) {\n canvas.style.cursor = cursor;\n }\n};\nlet eraserCanvasCache;\nlet previewDataURL;\nconst setEraserCursor = (canvas, theme) => {\n const cursorImageSizePx = 20;\n const drawCanvas = () => {\n const isDarkTheme = theme === _constants__WEBPACK_IMPORTED_MODULE_2__.THEME.DARK;\n eraserCanvasCache = document.createElement(\"canvas\");\n eraserCanvasCache.theme = theme;\n eraserCanvasCache.height = cursorImageSizePx;\n eraserCanvasCache.width = cursorImageSizePx;\n const context = eraserCanvasCache.getContext(\"2d\");\n context.lineWidth = 1;\n context.beginPath();\n context.arc(eraserCanvasCache.width / 2, eraserCanvasCache.height / 2, 5, 0, 2 * Math.PI);\n context.fillStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.black : open_color__WEBPACK_IMPORTED_MODULE_0__.white;\n context.fill();\n context.strokeStyle = isDarkTheme ? open_color__WEBPACK_IMPORTED_MODULE_0__.white : open_color__WEBPACK_IMPORTED_MODULE_0__.black;\n context.stroke();\n previewDataURL = eraserCanvasCache.toDataURL(_constants__WEBPACK_IMPORTED_MODULE_2__.MIME_TYPES.svg);\n };\n if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n drawCanvas();\n }\n setCursor(canvas, `url(${previewDataURL}) ${cursorImageSizePx / 2} ${cursorImageSizePx / 2}, auto`);\n};\nconst setCursorForShape = (canvas, appState) => {\n if (!canvas) {\n return;\n }\n if (appState.activeTool.type === \"selection\") {\n resetCursor(canvas);\n }\n else if (appState.activeTool.type === \"eraser\") {\n setEraserCursor(canvas, appState.theme);\n // do nothing if image tool is selected which suggests there's\n // a image-preview set as the cursor\n // Ignore custom type as well and let host decide\n }\n else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n canvas.style.cursor = _constants__WEBPACK_IMPORTED_MODULE_2__.CURSOR_TYPE.CROSSHAIR;\n }\n};\nconst isFullScreen = () => { var _a; return ((_a = document.fullscreenElement) === null || _a === void 0 ? void 0 : _a.nodeName) === \"HTML\"; };\nconst allowFullScreen = () => document.documentElement.requestFullscreen();\nconst exitFullScreen = () => document.exitFullscreen();\nconst getShortcutKey = (shortcut) => {\n shortcut = shortcut\n .replace(/\\bAlt\\b/i, \"Alt\")\n .replace(/\\bShift\\b/i, \"Shift\")\n .replace(/\\b(Enter|Return)\\b/i, \"Enter\")\n .replace(/\\bDel\\b/i, \"Delete\");\n if (_keys__WEBPACK_IMPORTED_MODULE_4__.isDarwin) {\n return shortcut\n .replace(/\\bCtrlOrCmd\\b/i, \"Cmd\")\n .replace(/\\bAlt\\b/i, \"Option\");\n }\n return shortcut.replace(/\\bCtrlOrCmd\\b/i, \"Ctrl\");\n};\nconst viewportCoordsToSceneCoords = ({ clientX, clientY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const invScale = 1 / zoom.value;\n const x = (clientX - offsetLeft) * invScale - scrollX;\n const y = (clientY - offsetTop) * invScale - scrollY;\n return { x, y };\n};\nconst sceneCoordsToViewportCoords = ({ sceneX, sceneY }, { zoom, offsetLeft, offsetTop, scrollX, scrollY, }) => {\n const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n const y = (sceneY + scrollY) * zoom.value + offsetTop;\n return { x, y };\n};\nconst getGlobalCSSVariable = (name) => getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\nconst RS_LTR_CHARS = \"A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0800-\\u1FFF\" +\n \"\\u2C00-\\uFB1C\\uFDFE-\\uFE6F\\uFEFD-\\uFFFF\";\nconst RS_RTL_CHARS = \"\\u0591-\\u07FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFC\";\nconst RE_RTL_CHECK = new RegExp(`^[^${RS_LTR_CHARS}]*[${RS_RTL_CHARS}]`);\n/**\n * Checks whether first directional character is RTL. Meaning whether it starts\n * with RTL characters, or indeterminate (numbers etc.) characters followed by\n * RTL.\n * See https://github.com/excalidraw/excalidraw/pull/1722#discussion_r436340171\n */\nconst isRTL = (text) => RE_RTL_CHECK.test(text);\nconst tupleToCoors = (xyTuple) => {\n const [x, y] = xyTuple;\n return { x, y };\n};\n/** use as a rejectionHandler to mute filesystem Abort errors */\nconst muteFSAbortError = (error) => {\n if ((error === null || error === void 0 ? void 0 : error.name) === \"AbortError\") {\n console.warn(error);\n return;\n }\n throw error;\n};\nconst findIndex = (array, cb, fromIndex = 0) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length, Math.max(fromIndex, 0));\n let index = fromIndex - 1;\n while (++index < array.length) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst findLastIndex = (array, cb, fromIndex = array.length - 1) => {\n if (fromIndex < 0) {\n fromIndex = array.length + fromIndex;\n }\n fromIndex = Math.min(array.length - 1, Math.max(fromIndex, 0));\n let index = fromIndex + 1;\n while (--index > -1) {\n if (cb(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n};\nconst isTransparent = (color) => {\n const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n return (isRGBTransparent ||\n isRRGGBBTransparent ||\n color === _colors__WEBPACK_IMPORTED_MODULE_1__[\"default\"].elementBackground[0]);\n};\nconst resolvablePromise = () => {\n let resolve;\n let reject;\n const promise = new Promise((_resolve, _reject) => {\n resolve = _resolve;\n reject = _reject;\n });\n promise.resolve = resolve;\n promise.reject = reject;\n return promise;\n};\n/**\n * @param func handler taking at most single parameter (event).\n */\nconst withBatchedUpdates = (func) => ((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n});\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nconst withBatchedUpdatesThrottled = (func) => {\n // @ts-ignore\n return throttleRAF(((event) => {\n (0,react_dom__WEBPACK_IMPORTED_MODULE_3__.unstable_batchedUpdates)(func, event);\n }));\n};\n//https://stackoverflow.com/a/9462382/8418\nconst nFormatter = (num, digits) => {\n const si = [\n { value: 1, symbol: \"b\" },\n { value: 1e3, symbol: \"k\" },\n { value: 1e6, symbol: \"M\" },\n { value: 1e9, symbol: \"G\" },\n ];\n const rx = /\\.0+$|(\\.[0-9]*[1-9])0+$/;\n let index;\n for (index = si.length - 1; index > 0; index--) {\n if (num >= si[index].value) {\n break;\n }\n }\n return ((num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol);\n};\nconst getVersion = () => {\n var _a;\n return (((_a = document.querySelector('meta[name=\"version\"]')) === null || _a === void 0 ? void 0 : _a.content) ||\n _constants__WEBPACK_IMPORTED_MODULE_2__.DEFAULT_VERSION);\n};\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nconst supportsEmoji = () => {\n const canvas = document.createElement(\"canvas\");\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n return false;\n }\n const offset = 12;\n ctx.fillStyle = \"#f00\";\n ctx.textBaseline = \"top\";\n ctx.font = \"32px Arial\";\n // Modernizr used 🐨, but it is sort of supported on Windows 7.\n // Luckily 😀 isn't supported.\n ctx.fillText(\"😀\", 0, 0);\n return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;\n};\nconst getNearestScrollableContainer = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent === document.body) {\n return document;\n }\n const { overflowY } = window.getComputedStyle(parent);\n const hasScrollableContent = parent.scrollHeight > parent.clientHeight;\n if (hasScrollableContent &&\n (overflowY === \"auto\" ||\n overflowY === \"scroll\" ||\n overflowY === \"overlay\")) {\n return parent;\n }\n parent = parent.parentElement;\n }\n return document;\n};\nconst focusNearestParent = (element) => {\n let parent = element.parentElement;\n while (parent) {\n if (parent.tabIndex > -1) {\n parent.focus();\n return;\n }\n parent = parent.parentElement;\n }\n};\nconst preventUnload = (event) => {\n event.preventDefault();\n // NOTE: modern browsers no longer allow showing a custom message here\n event.returnValue = \"\";\n};\nconst bytesToHexString = (bytes) => {\n return Array.from(bytes)\n .map((byte) => `0${byte.toString(16)}`.slice(-2))\n .join(\"\");\n};\nconst getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nconst arrayToMap = (items) => {\n return items.reduce((acc, element) => {\n acc.set(typeof element === \"string\" ? element : element.id, element);\n return acc;\n }, new Map());\n};\nconst isTestEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-33300d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"test\"; };\nconst isProdEnv = () => { var _a; return typeof process !== \"undefined\" && ((_a = ({\"REACT_APP_BACKEND_V2_GET_URL\":\"https://json-dev.excalidraw.com/api/v2/\",\"REACT_APP_BACKEND_V2_POST_URL\":\"https://json-dev.excalidraw.com/api/v2/post/\",\"REACT_APP_LIBRARY_URL\":\"https://libraries.excalidraw.com\",\"REACT_APP_LIBRARY_BACKEND\":\"https://us-central1-excalidraw-room-persistence.cloudfunctions.net/libraries\",\"REACT_APP_WS_SERVER_URL\":\"http://localhost:3002\",\"REACT_APP_PORTAL_URL\":\"\",\"REACT_APP_FIREBASE_CONFIG\":\"{\\\"apiKey\\\":\\\"AIzaSyCMkxA60XIW8KbqMYL7edC4qT5l4qHX2h8\\\",\\\"authDomain\\\":\\\"excalidraw-oss-dev.firebaseapp.com\\\",\\\"projectId\\\":\\\"excalidraw-oss-dev\\\",\\\"storageBucket\\\":\\\"excalidraw-oss-dev.appspot.com\\\",\\\"messagingSenderId\\\":\\\"664559512677\\\",\\\"appId\\\":\\\"1:664559512677:web:a385181f2928d328a7aa8c\\\"}\",\"REACT_APP_DEV_ENABLE_SW\":\"\",\"REACT_APP_DEV_DISABLE_LIVE_RELOAD\":\"\",\"PKG_NAME\":\"@excalidraw/excalidraw\",\"PKG_VERSION\":\"0.12.0-33300d1\",\"IS_EXCALIDRAW_NPM_PACKAGE\":true})) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === \"production\"; };\nconst wrapEvent = (name, nativeEvent) => {\n return new CustomEvent(name, {\n detail: {\n nativeEvent,\n },\n cancelable: true,\n });\n};\nconst updateObject = (obj, updates) => {\n let didChange = false;\n for (const key in updates) {\n const value = updates[key];\n if (typeof value !== \"undefined\") {\n if (obj[key] === value &&\n // if object, always update because its attrs could have changed\n (typeof value !== \"object\" || value === null)) {\n continue;\n }\n didChange = true;\n }\n }\n if (!didChange) {\n return obj;\n }\n return Object.assign(Object.assign({}, obj), updates);\n};\nconst isPrimitive = (val) => {\n const type = typeof val;\n return val == null || (type !== \"object\" && type !== \"function\");\n};\nconst getFrame = () => {\n try {\n return window.self === window.top ? \"top\" : \"iframe\";\n }\n catch (error) {\n return \"iframe\";\n }\n};\nconst isPromiseLike = (value) => {\n return (!!value &&\n typeof value === \"object\" &&\n \"then\" in value &&\n \"catch\" in value &&\n \"finally\" in value);\n};\nconst queryFocusableElements = (container) => {\n const focusableElements = container === null || container === void 0 ? void 0 : container.querySelectorAll(\"button, a, input, select, textarea, div[tabindex], label[tabindex]\");\n return focusableElements\n ? Array.from(focusableElements).filter((element) => element.tabIndex > -1 && !element.disabled)\n : [];\n};\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUM7QUFDbkUsQ0FBQyxDQUFDO0FBRUssTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO0lBQzNCLElBQUk7UUFDRixPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7S0FDdEQ7SUFBQyxPQUFPLEtBQUssRUFBRTtRQUNkLE9BQU8sUUFBUSxDQUFDO0tBQ2pCO0FBQ0gsQ0FBQyxDQUFDO0FBRUssTUFBTSxhQUFhLEdBQUcsQ0FDM0IsS0FBVSxFQUNzQyxFQUFFO0lBQ2xELE9BQU8sQ0FDTCxDQUFDLENBQUMsS0FBSztRQUNQLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsTUFBTSxJQUFJLEtBQUs7UUFDZixPQUFPLElBQUksS0FBSztRQUNoQixTQUFTLElBQUksS0FBSyxDQUNuQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUssTUFBTSxzQkFBc0IsR0FBRyxDQUFDLFNBQTZCLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGlCQUFpQixHQUFHLFNBQVMsYUFBVCxTQUFTLHVCQUFULFNBQVMsQ0FBRSxnQkFBZ0IsQ0FDbkQsb0VBQW9FLENBQ3JFLENBQUM7SUFFRixPQUFPLGlCQUFpQjtRQUN0QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FDbEMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUNWLE9BQU8sQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBRSxPQUE0QixDQUFDLFFBQVEsQ0FDbkU7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQ1QsQ0FBQyxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uLy4uL3V0aWxzLnRzPzc2M2EiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG9jIGZyb20gXCJvcGVuLWNvbG9yXCI7XG5cbmltcG9ydCBjb2xvcnMgZnJvbSBcIi4vY29sb3JzXCI7XG5pbXBvcnQge1xuICBDVVJTT1JfVFlQRSxcbiAgREVGQVVMVF9WRVJTSU9OLFxuICBFVkVOVCxcbiAgRk9OVF9GQU1JTFksXG4gIE1JTUVfVFlQRVMsXG4gIFRIRU1FLFxuICBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQsXG59IGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgRm9udEZhbWlseVZhbHVlcywgRm9udFN0cmluZyB9IGZyb20gXCIuL2VsZW1lbnQvdHlwZXNcIjtcbmltcG9ydCB7IEFwcFN0YXRlLCBEYXRhVVJMLCBMYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlciwgWm9vbSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyB1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyB9IGZyb20gXCJyZWFjdC1kb21cIjtcbmltcG9ydCB7IGlzRGFyd2luIH0gZnJvbSBcIi4va2V5c1wiO1xuaW1wb3J0IHsgU0hBUEVTIH0gZnJvbSBcIi4vc2hhcGVzXCI7XG5cbmxldCBtb2NrRGF0ZVRpbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5leHBvcnQgY29uc3Qgc2V0RGF0ZVRpbWVGb3JUZXN0cyA9IChkYXRlVGltZTogc3RyaW5nKSA9PiB7XG4gIG1vY2tEYXRlVGltZSA9IGRhdGVUaW1lO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldERhdGVUaW1lID0gKCkgPT4ge1xuICBpZiAobW9ja0RhdGVUaW1lKSB7XG4gICAgcmV0dXJuIG1vY2tEYXRlVGltZTtcbiAgfVxuXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuICBjb25zdCB5ZWFyID0gZGF0ZS5nZXRGdWxsWWVhcigpO1xuICBjb25zdCBtb250aCA9IGAke2RhdGUuZ2V0TW9udGgoKSArIDF9YC5wYWRTdGFydCgyLCBcIjBcIik7XG4gIGNvbnN0IGRheSA9IGAke2RhdGUuZ2V0RGF0ZSgpfWAucGFkU3RhcnQoMiwgXCIwXCIpO1xuICBjb25zdCBociA9IGAke2RhdGUuZ2V0SG91cnMoKX1gLnBhZFN0YXJ0KDIsIFwiMFwiKTtcbiAgY29uc3QgbWluID0gYCR7ZGF0ZS5nZXRNaW51dGVzKCl9YC5wYWRTdGFydCgyLCBcIjBcIik7XG5cbiAgcmV0dXJuIGAke3llYXJ9LSR7bW9udGh9LSR7ZGF5fS0ke2hyfSR7bWlufWA7XG59O1xuXG5leHBvcnQgY29uc3QgY2FwaXRhbGl6ZVN0cmluZyA9IChzdHI6IHN0cmluZykgPT5cbiAgc3RyLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgc3RyLnNsaWNlKDEpO1xuXG5leHBvcnQgY29uc3QgaXNUb29sSWNvbiA9IChcbiAgdGFyZ2V0OiBFbGVtZW50IHwgRXZlbnRUYXJnZXQgfCBudWxsLFxuKTogdGFyZ2V0IGlzIEhUTUxFbGVtZW50ID0+XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ICYmIHRhcmdldC5jbGFzc05hbWUuaW5jbHVkZXMoXCJUb29sSWNvblwiKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5wdXRMaWtlID0gKFxuICB0YXJnZXQ6IEVsZW1lbnQgfCBFdmVudFRhcmdldCB8IG51bGwsXG4pOiB0YXJnZXQgaXNcbiAgfCBIVE1MSW5wdXRFbGVtZW50XG4gIHwgSFRNTFRleHRBcmVhRWxlbWVudFxuICB8IEhUTUxTZWxlY3RFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCB8fFxuICB0YXJnZXQgaW5zdGFuY2VvZiBIVE1MVGV4dEFyZWFFbGVtZW50IHx8XG4gIHRhcmdldCBpbnN0YW5jZW9mIEhUTUxTZWxlY3RFbGVtZW50O1xuXG5leHBvcnQgY29uc3QgaXNXcml0YWJsZUVsZW1lbnQgPSAoXG4gIHRhcmdldDogRWxlbWVudCB8IEV2ZW50VGFyZ2V0IHwgbnVsbCxcbik6IHRhcmdldCBpc1xuICB8IEhUTUxJbnB1dEVsZW1lbnRcbiAgfCBIVE1MVGV4dEFyZWFFbGVtZW50XG4gIHwgSFRNTEJSRWxlbWVudFxuICB8IEhUTUxEaXZFbGVtZW50ID0+XG4gICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiB0YXJnZXQuZGF0YXNldC50eXBlID09PSBcInd5c2l3eWdcIikgfHxcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTEJSRWxlbWVudCB8fCAvLyBuZXdsaW5lIGluIHd5c2l3eWdcbiAgdGFyZ2V0IGluc3RhbmNlb2YgSFRNTFRleHRBcmVhRWxlbWVudCB8fFxuICAodGFyZ2V0IGluc3RhbmNlb2YgSFRNTElucHV0RWxlbWVudCAmJlxuICAgICh0YXJnZXQudHlwZSA9PT0gXCJ0ZXh0XCIgfHwgdGFyZ2V0LnR5cGUgPT09IFwibnVtYmVyXCIpKTtcblxuZXhwb3J0IGNvbnN0IGdldEZvbnRGYW1pbHlTdHJpbmcgPSAoe1xuICBmb250RmFtaWx5LFxufToge1xuICBmb250RmFtaWx5OiBGb250RmFtaWx5VmFsdWVzO1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IFtmb250RmFtaWx5U3RyaW5nLCBpZF0gb2YgT2JqZWN0LmVudHJpZXMoRk9OVF9GQU1JTFkpKSB7XG4gICAgaWYgKGlkID09PSBmb250RmFtaWx5KSB7XG4gICAgICByZXR1cm4gYCR7Zm9udEZhbWlseVN0cmluZ30sICR7V0lORE9XU19FTU9KSV9GQUxMQkFDS19GT05UfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBXSU5ET1dTX0VNT0pJX0ZBTExCQUNLX0ZPTlQ7XG59O1xuXG4vKiogcmV0dXJucyBmb250U2l6ZStmb250RmFtaWx5IHN0cmluZyBmb3IgYXNzaWdubWVudCB0byBET00gZWxlbWVudHMgKi9cbmV4cG9ydCBjb25zdCBnZXRGb250U3RyaW5nID0gKHtcbiAgZm9udFNpemUsXG4gIGZvbnRGYW1pbHksXG59OiB7XG4gIGZvbnRTaXplOiBudW1iZXI7XG4gIGZvbnRGYW1pbHk6IEZvbnRGYW1pbHlWYWx1ZXM7XG59KSA9PiB7XG4gIHJldHVybiBgJHtmb250U2l6ZX1weCAke2dldEZvbnRGYW1pbHlTdHJpbmcoeyBmb250RmFtaWx5IH0pfWAgYXMgRm9udFN0cmluZztcbn07XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IDxUIGV4dGVuZHMgYW55W10+KFxuICBmbjogKC4uLmFyZ3M6IFQpID0+IHZvaWQsXG4gIHRpbWVvdXQ6IG51bWJlcixcbikgPT4ge1xuICBsZXQgaGFuZGxlID0gMDtcbiAgbGV0IGxhc3RBcmdzOiBUIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IHJldCA9ICguLi5hcmdzOiBUKSA9PiB7XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgIGhhbmRsZSA9IHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLmFyZ3MpO1xuICAgIH0sIHRpbWVvdXQpO1xuICB9O1xuICByZXQuZmx1c2ggPSAoKSA9PiB7XG4gICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgaWYgKGxhc3RBcmdzKSB7XG4gICAgICBjb25zdCBfbGFzdEFyZ3MgPSBsYXN0QXJncztcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGZuKC4uLl9sYXN0QXJncyk7XG4gICAgfVxuICB9O1xuICByZXQuY2FuY2VsID0gKCkgPT4ge1xuICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICBjbGVhclRpbWVvdXQoaGFuZGxlKTtcbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIHRocm90dGxlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgb25jZSBwZXIgYW5pbWF0aW9uIGZyYW1lXG5leHBvcnQgY29uc3QgdGhyb3R0bGVSQUYgPSA8VCBleHRlbmRzIGFueVtdPihcbiAgZm46ICguLi5hcmdzOiBUKSA9PiB2b2lkLFxuICBvcHRzPzogeyB0cmFpbGluZz86IGJvb2xlYW4gfSxcbikgPT4ge1xuICBsZXQgdGltZXJJZDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG4gIGxldCBsYXN0QXJnczogVCB8IG51bGwgPSBudWxsO1xuICBsZXQgbGFzdEFyZ3NUcmFpbGluZzogVCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNjaGVkdWxlRnVuYyA9IChhcmdzOiBUKSA9PiB7XG4gICAgdGltZXJJZCA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgdGltZXJJZCA9IG51bGw7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIGxhc3RBcmdzID0gbnVsbDtcbiAgICAgIGlmIChsYXN0QXJnc1RyYWlsaW5nKSB7XG4gICAgICAgIGxhc3RBcmdzID0gbGFzdEFyZ3NUcmFpbGluZztcbiAgICAgICAgbGFzdEFyZ3NUcmFpbGluZyA9IG51bGw7XG4gICAgICAgIHNjaGVkdWxlRnVuYyhsYXN0QXJncyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcmV0ID0gKC4uLmFyZ3M6IFQpID0+IHtcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBmbiguLi5hcmdzKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgbGFzdEFyZ3MgPSBhcmdzO1xuICAgIGlmICh0aW1lcklkID09PSBudWxsKSB7XG4gICAgICBzY2hlZHVsZUZ1bmMobGFzdEFyZ3MpO1xuICAgIH0gZWxzZSBpZiAob3B0cz8udHJhaWxpbmcpIHtcbiAgICAgIGxhc3RBcmdzVHJhaWxpbmcgPSBhcmdzO1xuICAgIH1cbiAgfTtcbiAgcmV0LmZsdXNoID0gKCkgPT4ge1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAobGFzdEFyZ3MpIHtcbiAgICAgIGZuKC4uLihsYXN0QXJnc1RyYWlsaW5nIHx8IGxhc3RBcmdzKSk7XG4gICAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0LmNhbmNlbCA9ICgpID0+IHtcbiAgICBsYXN0QXJncyA9IGxhc3RBcmdzVHJhaWxpbmcgPSBudWxsO1xuICAgIGlmICh0aW1lcklkICE9PSBudWxsKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aW1lcklkKTtcbiAgICAgIHRpbWVySWQgPSBudWxsO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJldDtcbn07XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9sb2Rhc2gvbG9kYXNoL2Jsb2IvZXMvY2h1bmsuanNcbmV4cG9ydCBjb25zdCBjaHVuayA9IDxUIGV4dGVuZHMgYW55PihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgc2l6ZTogbnVtYmVyLFxuKTogVFtdW10gPT4ge1xuICBpZiAoIWFycmF5Lmxlbmd0aCB8fCBzaXplIDwgMSkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcmVzSW5kZXggPSAwO1xuICBjb25zdCByZXN1bHQgPSBBcnJheShNYXRoLmNlaWwoYXJyYXkubGVuZ3RoIC8gc2l6ZSkpO1xuICB3aGlsZSAoaW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICByZXN1bHRbcmVzSW5kZXgrK10gPSBhcnJheS5zbGljZShpbmRleCwgKGluZGV4ICs9IHNpemUpKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IGNvbnN0IHNlbGVjdE5vZGUgPSAobm9kZTogRWxlbWVudCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKG5vZGUpO1xuICAgIHNlbGVjdGlvbi5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgcmVtb3ZlU2VsZWN0aW9uID0gKCkgPT4ge1xuICBjb25zdCBzZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCk7XG4gIGlmIChzZWxlY3Rpb24pIHtcbiAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBkaXN0YW5jZSA9ICh4OiBudW1iZXIsIHk6IG51bWJlcikgPT4gTWF0aC5hYnMoeCAtIHkpO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlQWN0aXZlVG9vbCA9IChcbiAgYXBwU3RhdGU6IFBpY2s8QXBwU3RhdGUsIFwiYWN0aXZlVG9vbFwiPixcbiAgZGF0YTogKFxuICAgIHwgeyB0eXBlOiB0eXBlb2YgU0hBUEVTW251bWJlcl1bXCJ2YWx1ZVwiXSB8IFwiZXJhc2VyXCIgfVxuICAgIHwgeyB0eXBlOiBcImN1c3RvbVwiOyBjdXN0b21UeXBlOiBzdHJpbmcgfVxuICApICYgeyBsYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcj86IExhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyIH0sXG4pOiBBcHBTdGF0ZVtcImFjdGl2ZVRvb2xcIl0gPT4ge1xuICBpZiAoZGF0YS50eXBlID09PSBcImN1c3RvbVwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgICB0eXBlOiBcImN1c3RvbVwiLFxuICAgICAgY3VzdG9tVHlwZTogZGF0YS5jdXN0b21UeXBlLFxuICAgIH07XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLmFwcFN0YXRlLmFjdGl2ZVRvb2wsXG4gICAgbGFzdEFjdGl2ZVRvb2xCZWZvcmVFcmFzZXI6XG4gICAgICBkYXRhLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBhcHBTdGF0ZS5hY3RpdmVUb29sLmxhc3RBY3RpdmVUb29sQmVmb3JlRXJhc2VyXG4gICAgICAgIDogZGF0YS5sYXN0QWN0aXZlVG9vbEJlZm9yZUVyYXNlcixcbiAgICB0eXBlOiBkYXRhLnR5cGUsXG4gICAgY3VzdG9tVHlwZTogbnVsbCxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCByZXNldEN1cnNvciA9IChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBpZiAoY2FudmFzKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IFwiXCI7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzZXRDdXJzb3IgPSAoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsIGN1cnNvcjogc3RyaW5nKSA9PiB7XG4gIGlmIChjYW52YXMpIHtcbiAgICBjYW52YXMuc3R5bGUuY3Vyc29yID0gY3Vyc29yO1xuICB9XG59O1xuXG5sZXQgZXJhc2VyQ2FudmFzQ2FjaGU6IGFueTtcbmxldCBwcmV2aWV3RGF0YVVSTDogc3RyaW5nO1xuZXhwb3J0IGNvbnN0IHNldEVyYXNlckN1cnNvciA9IChcbiAgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCB8IG51bGwsXG4gIHRoZW1lOiBBcHBTdGF0ZVtcInRoZW1lXCJdLFxuKSA9PiB7XG4gIGNvbnN0IGN1cnNvckltYWdlU2l6ZVB4ID0gMjA7XG5cbiAgY29uc3QgZHJhd0NhbnZhcyA9ICgpID0+IHtcbiAgICBjb25zdCBpc0RhcmtUaGVtZSA9IHRoZW1lID09PSBUSEVNRS5EQVJLO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgICBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSA9IHRoZW1lO1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLmhlaWdodCA9IGN1cnNvckltYWdlU2l6ZVB4O1xuICAgIGVyYXNlckNhbnZhc0NhY2hlLndpZHRoID0gY3Vyc29ySW1hZ2VTaXplUHg7XG4gICAgY29uc3QgY29udGV4dCA9IGVyYXNlckNhbnZhc0NhY2hlLmdldENvbnRleHQoXCIyZFwiKSE7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSAxO1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5hcmMoXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS53aWR0aCAvIDIsXG4gICAgICBlcmFzZXJDYW52YXNDYWNoZS5oZWlnaHQgLyAyLFxuICAgICAgNSxcbiAgICAgIDAsXG4gICAgICAyICogTWF0aC5QSSxcbiAgICApO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gaXNEYXJrVGhlbWUgPyBvYy5ibGFjayA6IG9jLndoaXRlO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBpc0RhcmtUaGVtZSA/IG9jLndoaXRlIDogb2MuYmxhY2s7XG4gICAgY29udGV4dC5zdHJva2UoKTtcbiAgICBwcmV2aWV3RGF0YVVSTCA9IGVyYXNlckNhbnZhc0NhY2hlLnRvRGF0YVVSTChNSU1FX1RZUEVTLnN2ZykgYXMgRGF0YVVSTDtcbiAgfTtcbiAgaWYgKCFlcmFzZXJDYW52YXNDYWNoZSB8fCBlcmFzZXJDYW52YXNDYWNoZS50aGVtZSAhPT0gdGhlbWUpIHtcbiAgICBkcmF3Q2FudmFzKCk7XG4gIH1cblxuICBzZXRDdXJzb3IoXG4gICAgY2FudmFzLFxuICAgIGB1cmwoJHtwcmV2aWV3RGF0YVVSTH0pICR7Y3Vyc29ySW1hZ2VTaXplUHggLyAyfSAke1xuICAgICAgY3Vyc29ySW1hZ2VTaXplUHggLyAyXG4gICAgfSwgYXV0b2AsXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Q3Vyc29yRm9yU2hhcGUgPSAoXG4gIGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQgfCBudWxsLFxuICBhcHBTdGF0ZTogQXBwU3RhdGUsXG4pID0+IHtcbiAgaWYgKCFjYW52YXMpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGFwcFN0YXRlLmFjdGl2ZVRvb2wudHlwZSA9PT0gXCJzZWxlY3Rpb25cIikge1xuICAgIHJlc2V0Q3Vyc29yKGNhbnZhcyk7XG4gIH0gZWxzZSBpZiAoYXBwU3RhdGUuYWN0aXZlVG9vbC50eXBlID09PSBcImVyYXNlclwiKSB7XG4gICAgc2V0RXJhc2VyQ3Vyc29yKGNhbnZhcywgYXBwU3RhdGUudGhlbWUpO1xuICAgIC8vIGRvIG5vdGhpbmcgaWYgaW1hZ2UgdG9vbCBpcyBzZWxlY3RlZCB3aGljaCBzdWdnZXN0cyB0aGVyZSdzXG4gICAgLy8gYSBpbWFnZS1wcmV2aWV3IHNldCBhcyB0aGUgY3Vyc29yXG4gICAgLy8gSWdub3JlIGN1c3RvbSB0eXBlIGFzIHdlbGwgYW5kIGxldCBob3N0IGRlY2lkZVxuICB9IGVsc2UgaWYgKCFbXCJpbWFnZVwiLCBcImN1c3RvbVwiXS5pbmNsdWRlcyhhcHBTdGF0ZS5hY3RpdmVUb29sLnR5cGUpKSB7XG4gICAgY2FudmFzLnN0eWxlLmN1cnNvciA9IENVUlNPUl9UWVBFLkNST1NTSEFJUjtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGlzRnVsbFNjcmVlbiA9ICgpID0+XG4gIGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50Py5ub2RlTmFtZSA9PT0gXCJIVE1MXCI7XG5cbmV4cG9ydCBjb25zdCBhbGxvd0Z1bGxTY3JlZW4gPSAoKSA9PlxuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGV4aXRGdWxsU2NyZWVuID0gKCkgPT4gZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcblxuZXhwb3J0IGNvbnN0IGdldFNob3J0Y3V0S2V5ID0gKHNob3J0Y3V0OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICBzaG9ydGN1dCA9IHNob3J0Y3V0XG4gICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIkFsdFwiKVxuICAgIC5yZXBsYWNlKC9cXGJTaGlmdFxcYi9pLCBcIlNoaWZ0XCIpXG4gICAgLnJlcGxhY2UoL1xcYihFbnRlcnxSZXR1cm4pXFxiL2ksIFwiRW50ZXJcIilcbiAgICAucmVwbGFjZSgvXFxiRGVsXFxiL2ksIFwiRGVsZXRlXCIpO1xuXG4gIGlmIChpc0Rhcndpbikge1xuICAgIHJldHVybiBzaG9ydGN1dFxuICAgICAgLnJlcGxhY2UoL1xcYkN0cmxPckNtZFxcYi9pLCBcIkNtZFwiKVxuICAgICAgLnJlcGxhY2UoL1xcYkFsdFxcYi9pLCBcIk9wdGlvblwiKTtcbiAgfVxuICByZXR1cm4gc2hvcnRjdXQucmVwbGFjZSgvXFxiQ3RybE9yQ21kXFxiL2ksIFwiQ3RybFwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCB2aWV3cG9ydENvb3Jkc1RvU2NlbmVDb29yZHMgPSAoXG4gIHsgY2xpZW50WCwgY2xpZW50WSB9OiB7IGNsaWVudFg6IG51bWJlcjsgY2xpZW50WTogbnVtYmVyIH0sXG4gIHtcbiAgICB6b29tLFxuICAgIG9mZnNldExlZnQsXG4gICAgb2Zmc2V0VG9wLFxuICAgIHNjcm9sbFgsXG4gICAgc2Nyb2xsWSxcbiAgfToge1xuICAgIHpvb206IFpvb207XG4gICAgb2Zmc2V0TGVmdDogbnVtYmVyO1xuICAgIG9mZnNldFRvcDogbnVtYmVyO1xuICAgIHNjcm9sbFg6IG51bWJlcjtcbiAgICBzY3JvbGxZOiBudW1iZXI7XG4gIH0sXG4pID0+IHtcbiAgY29uc3QgaW52U2NhbGUgPSAxIC8gem9vbS52YWx1ZTtcbiAgY29uc3QgeCA9IChjbGllbnRYIC0gb2Zmc2V0TGVmdCkgKiBpbnZTY2FsZSAtIHNjcm9sbFg7XG4gIGNvbnN0IHkgPSAoY2xpZW50WSAtIG9mZnNldFRvcCkgKiBpbnZTY2FsZSAtIHNjcm9sbFk7XG5cbiAgcmV0dXJuIHsgeCwgeSB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHNjZW5lQ29vcmRzVG9WaWV3cG9ydENvb3JkcyA9IChcbiAgeyBzY2VuZVgsIHNjZW5lWSB9OiB7IHNjZW5lWDogbnVtYmVyOyBzY2VuZVk6IG51bWJlciB9LFxuICB7XG4gICAgem9vbSxcbiAgICBvZmZzZXRMZWZ0LFxuICAgIG9mZnNldFRvcCxcbiAgICBzY3JvbGxYLFxuICAgIHNjcm9sbFksXG4gIH06IHtcbiAgICB6b29tOiBab29tO1xuICAgIG9mZnNldExlZnQ6IG51bWJlcjtcbiAgICBvZmZzZXRUb3A6IG51bWJlcjtcbiAgICBzY3JvbGxYOiBudW1iZXI7XG4gICAgc2Nyb2xsWTogbnVtYmVyO1xuICB9LFxuKSA9PiB7XG4gIGNvbnN0IHggPSAoc2NlbmVYICsgc2Nyb2xsWCkgKiB6b29tLnZhbHVlICsgb2Zmc2V0TGVmdDtcbiAgY29uc3QgeSA9IChzY2VuZVkgKyBzY3JvbGxZKSAqIHpvb20udmFsdWUgKyBvZmZzZXRUb3A7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRHbG9iYWxDU1NWYXJpYWJsZSA9IChuYW1lOiBzdHJpbmcpID0+XG4gIGdldENvbXB1dGVkU3R5bGUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKGAtLSR7bmFtZX1gKTtcblxuY29uc3QgUlNfTFRSX0NIQVJTID1cbiAgXCJBLVphLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyQjhcXHUwMzAwLVxcdTA1OTBcXHUwODAwLVxcdTFGRkZcIiArXG4gIFwiXFx1MkMwMC1cXHVGQjFDXFx1RkRGRS1cXHVGRTZGXFx1RkVGRC1cXHVGRkZGXCI7XG5jb25zdCBSU19SVExfQ0hBUlMgPSBcIlxcdTA1OTEtXFx1MDdGRlxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ1wiO1xuY29uc3QgUkVfUlRMX0NIRUNLID0gbmV3IFJlZ0V4cChgXlteJHtSU19MVFJfQ0hBUlN9XSpbJHtSU19SVExfQ0hBUlN9XWApO1xuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBmaXJzdCBkaXJlY3Rpb25hbCBjaGFyYWN0ZXIgaXMgUlRMLiBNZWFuaW5nIHdoZXRoZXIgaXQgc3RhcnRzXG4gKiAgd2l0aCBSVEwgY2hhcmFjdGVycywgb3IgaW5kZXRlcm1pbmF0ZSAobnVtYmVycyBldGMuKSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5XG4gKiAgUlRMLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9leGNhbGlkcmF3L2V4Y2FsaWRyYXcvcHVsbC8xNzIyI2Rpc2N1c3Npb25fcjQzNjM0MDE3MVxuICovXG5leHBvcnQgY29uc3QgaXNSVEwgPSAodGV4dDogc3RyaW5nKSA9PiBSRV9SVExfQ0hFQ0sudGVzdCh0ZXh0KTtcblxuZXhwb3J0IGNvbnN0IHR1cGxlVG9Db29ycyA9IChcbiAgeHlUdXBsZTogcmVhZG9ubHkgW251bWJlciwgbnVtYmVyXSxcbik6IHsgeDogbnVtYmVyOyB5OiBudW1iZXIgfSA9PiB7XG4gIGNvbnN0IFt4LCB5XSA9IHh5VHVwbGU7XG4gIHJldHVybiB7IHgsIHkgfTtcbn07XG5cbi8qKiB1c2UgYXMgYSByZWplY3Rpb25IYW5kbGVyIHRvIG11dGUgZmlsZXN5c3RlbSBBYm9ydCBlcnJvcnMgKi9cbmV4cG9ydCBjb25zdCBtdXRlRlNBYm9ydEVycm9yID0gKGVycm9yPzogRXJyb3IpID0+IHtcbiAgaWYgKGVycm9yPy5uYW1lID09PSBcIkFib3J0RXJyb3JcIikge1xuICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRocm93IGVycm9yO1xufTtcblxuZXhwb3J0IGNvbnN0IGZpbmRJbmRleCA9IDxUPihcbiAgYXJyYXk6IHJlYWRvbmx5IFRbXSxcbiAgY2I6IChlbGVtZW50OiBULCBpbmRleDogbnVtYmVyLCBhcnJheTogcmVhZG9ubHkgVFtdKSA9PiBib29sZWFuLFxuICBmcm9tSW5kZXg6IG51bWJlciA9IDAsXG4pID0+IHtcbiAgaWYgKGZyb21JbmRleCA8IDApIHtcbiAgICBmcm9tSW5kZXggPSBhcnJheS5sZW5ndGggKyBmcm9tSW5kZXg7XG4gIH1cbiAgZnJvbUluZGV4ID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4IC0gMTtcbiAgd2hpbGUgKCsraW5kZXggPCBhcnJheS5sZW5ndGgpIHtcbiAgICBpZiAoY2IoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7XG4gICAgICByZXR1cm4gaW5kZXg7XG4gICAgfVxuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kTGFzdEluZGV4ID0gPFQ+KFxuICBhcnJheTogcmVhZG9ubHkgVFtdLFxuICBjYjogKGVsZW1lbnQ6IFQsIGluZGV4OiBudW1iZXIsIGFycmF5OiByZWFkb25seSBUW10pID0+IGJvb2xlYW4sXG4gIGZyb21JbmRleDogbnVtYmVyID0gYXJyYXkubGVuZ3RoIC0gMSxcbikgPT4ge1xuICBpZiAoZnJvbUluZGV4IDwgMCkge1xuICAgIGZyb21JbmRleCA9IGFycmF5Lmxlbmd0aCArIGZyb21JbmRleDtcbiAgfVxuICBmcm9tSW5kZXggPSBNYXRoLm1pbihhcnJheS5sZW5ndGggLSAxLCBNYXRoLm1heChmcm9tSW5kZXgsIDApKTtcbiAgbGV0IGluZGV4ID0gZnJvbUluZGV4ICsgMTtcbiAgd2hpbGUgKC0taW5kZXggPiAtMSkge1xuICAgIGlmIChjYihhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHtcbiAgICAgIHJldHVybiBpbmRleDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIC0xO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzVHJhbnNwYXJlbnQgPSAoY29sb3I6IHN0cmluZykgPT4ge1xuICBjb25zdCBpc1JHQlRyYW5zcGFyZW50ID0gY29sb3IubGVuZ3RoID09PSA1ICYmIGNvbG9yLnN1YnN0cig0LCAxKSA9PT0gXCIwXCI7XG4gIGNvbnN0IGlzUlJHR0JCVHJhbnNwYXJlbnQgPSBjb2xvci5sZW5ndGggPT09IDkgJiYgY29sb3Iuc3Vic3RyKDcsIDIpID09PSBcIjAwXCI7XG4gIHJldHVybiAoXG4gICAgaXNSR0JUcmFuc3BhcmVudCB8fFxuICAgIGlzUlJHR0JCVHJhbnNwYXJlbnQgfHxcbiAgICBjb2xvciA9PT0gY29sb3JzLmVsZW1lbnRCYWNrZ3JvdW5kWzBdXG4gICk7XG59O1xuXG5leHBvcnQgdHlwZSBSZXNvbHZhYmxlUHJvbWlzZTxUPiA9IFByb21pc2U8VD4gJiB7XG4gIHJlc29sdmU6IFtUXSBleHRlbmRzIFt1bmRlZmluZWRdID8gKHZhbHVlPzogVCkgPT4gdm9pZCA6ICh2YWx1ZTogVCkgPT4gdm9pZDtcbiAgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkO1xufTtcbmV4cG9ydCBjb25zdCByZXNvbHZhYmxlUHJvbWlzZSA9IDxUPigpID0+IHtcbiAgbGV0IHJlc29sdmUhOiBhbnk7XG4gIGxldCByZWplY3QhOiBhbnk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgoX3Jlc29sdmUsIF9yZWplY3QpID0+IHtcbiAgICByZXNvbHZlID0gX3Jlc29sdmU7XG4gICAgcmVqZWN0ID0gX3JlamVjdDtcbiAgfSk7XG4gIChwcm9taXNlIGFzIGFueSkucmVzb2x2ZSA9IHJlc29sdmU7XG4gIChwcm9taXNlIGFzIGFueSkucmVqZWN0ID0gcmVqZWN0O1xuICByZXR1cm4gcHJvbWlzZSBhcyBSZXNvbHZhYmxlUHJvbWlzZTxUPjtcbn07XG5cbi8qKlxuICogQHBhcmFtIGZ1bmMgaGFuZGxlciB0YWtpbmcgYXQgbW9zdCBzaW5nbGUgcGFyYW1ldGVyIChldmVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXMgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PlxuICAoKGV2ZW50KSA9PiB7XG4gICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoZnVuYyBhcyBURnVuY3Rpb24sIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uO1xuXG4vKipcbiAqIGJhcmNoZXMgUmVhY3Qgc3RhdGUgdXBkYXRlcyBhbmQgdGhyb3R0bGVzIHRoZSBjYWxscyB0byBhIHNpbmdsZSBjYWxsIHBlclxuICogYW5pbWF0aW9uIGZyYW1lXG4gKi9cbmV4cG9ydCBjb25zdCB3aXRoQmF0Y2hlZFVwZGF0ZXNUaHJvdHRsZWQgPSA8XG4gIFRGdW5jdGlvbiBleHRlbmRzICgoZXZlbnQ6IGFueSkgPT4gdm9pZCkgfCAoKCkgPT4gdm9pZCksXG4+KFxuICBmdW5jOiBQYXJhbWV0ZXJzPFRGdW5jdGlvbj5bXCJsZW5ndGhcIl0gZXh0ZW5kcyAwIHwgMSA/IFRGdW5jdGlvbiA6IG5ldmVyLFxuKSA9PiB7XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIHRocm90dGxlUkFGPFBhcmFtZXRlcnM8VEZ1bmN0aW9uPj4oKChldmVudCkgPT4ge1xuICAgIHVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzKGZ1bmMsIGV2ZW50KTtcbiAgfSkgYXMgVEZ1bmN0aW9uKTtcbn07XG5cbi8vaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzk0NjIzODIvODQxOFxuZXhwb3J0IGNvbnN0IG5Gb3JtYXR0ZXIgPSAobnVtOiBudW1iZXIsIGRpZ2l0czogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgY29uc3Qgc2kgPSBbXG4gICAgeyB2YWx1ZTogMSwgc3ltYm9sOiBcImJcIiB9LFxuICAgIHsgdmFsdWU6IDFlMywgc3ltYm9sOiBcImtcIiB9LFxuICAgIHsgdmFsdWU6IDFlNiwgc3ltYm9sOiBcIk1cIiB9LFxuICAgIHsgdmFsdWU6IDFlOSwgc3ltYm9sOiBcIkdcIiB9LFxuICBdO1xuICBjb25zdCByeCA9IC9cXC4wKyR8KFxcLlswLTldKlsxLTldKTArJC87XG4gIGxldCBpbmRleDtcbiAgZm9yIChpbmRleCA9IHNpLmxlbmd0aCAtIDE7IGluZGV4ID4gMDsgaW5kZXgtLSkge1xuICAgIGlmIChudW0gPj0gc2lbaW5kZXhdLnZhbHVlKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAobnVtIC8gc2lbaW5kZXhdLnZhbHVlKS50b0ZpeGVkKGRpZ2l0cykucmVwbGFjZShyeCwgXCIkMVwiKSArIHNpW2luZGV4XS5zeW1ib2xcbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRWZXJzaW9uID0gKCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTE1ldGFFbGVtZW50PignbWV0YVtuYW1lPVwidmVyc2lvblwiXScpPy5jb250ZW50IHx8XG4gICAgREVGQVVMVF9WRVJTSU9OXG4gICk7XG59O1xuXG4vLyBBZGFwdGVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01vZGVybml6ci9Nb2Rlcm5penIvYmxvYi9tYXN0ZXIvZmVhdHVyZS1kZXRlY3RzL2Vtb2ppLmpzXG5leHBvcnQgY29uc3Qgc3VwcG9ydHNFbW9qaSA9ICgpID0+IHtcbiAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcbiAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcbiAgaWYgKCFjdHgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qgb2Zmc2V0ID0gMTI7XG4gIGN0eC5maWxsU3R5bGUgPSBcIiNmMDBcIjtcbiAgY3R4LnRleHRCYXNlbGluZSA9IFwidG9wXCI7XG4gIGN0eC5mb250ID0gXCIzMnB4IEFyaWFsXCI7XG4gIC8vIE1vZGVybml6ciB1c2VkIPCfkKgsIGJ1dCBpdCBpcyBzb3J0IG9mIHN1cHBvcnRlZCBvbiBXaW5kb3dzIDcuXG4gIC8vIEx1Y2tpbHkg8J+YgCBpc24ndCBzdXBwb3J0ZWQuXG4gIGN0eC5maWxsVGV4dChcIvCfmIBcIiwgMCwgMCk7XG4gIHJldHVybiBjdHguZ2V0SW1hZ2VEYXRhKG9mZnNldCwgb2Zmc2V0LCAxLCAxKS5kYXRhWzBdICE9PSAwO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldE5lYXJlc3RTY3JvbGxhYmxlQ29udGFpbmVyID0gKFxuICBlbGVtZW50OiBIVE1MRWxlbWVudCxcbik6IEhUTUxFbGVtZW50IHwgRG9jdW1lbnQgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudCA9PT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgcmV0dXJuIGRvY3VtZW50O1xuICAgIH1cbiAgICBjb25zdCB7IG92ZXJmbG93WSB9ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUocGFyZW50KTtcbiAgICBjb25zdCBoYXNTY3JvbGxhYmxlQ29udGVudCA9IHBhcmVudC5zY3JvbGxIZWlnaHQgPiBwYXJlbnQuY2xpZW50SGVpZ2h0O1xuICAgIGlmIChcbiAgICAgIGhhc1Njcm9sbGFibGVDb250ZW50ICYmXG4gICAgICAob3ZlcmZsb3dZID09PSBcImF1dG9cIiB8fFxuICAgICAgICBvdmVyZmxvd1kgPT09IFwic2Nyb2xsXCIgfHxcbiAgICAgICAgb3ZlcmZsb3dZID09PSBcIm92ZXJsYXlcIilcbiAgICApIHtcbiAgICAgIHJldHVybiBwYXJlbnQ7XG4gICAgfVxuICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnRFbGVtZW50O1xuICB9XG4gIHJldHVybiBkb2N1bWVudDtcbn07XG5cbmV4cG9ydCBjb25zdCBmb2N1c05lYXJlc3RQYXJlbnQgPSAoZWxlbWVudDogSFRNTElucHV0RWxlbWVudCkgPT4ge1xuICBsZXQgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICB3aGlsZSAocGFyZW50KSB7XG4gICAgaWYgKHBhcmVudC50YWJJbmRleCA+IC0xKSB7XG4gICAgICBwYXJlbnQuZm9jdXMoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBwcmV2ZW50VW5sb2FkID0gKGV2ZW50OiBCZWZvcmVVbmxvYWRFdmVudCkgPT4ge1xuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAvLyBOT1RFOiBtb2Rlcm4gYnJvd3NlcnMgbm8gbG9uZ2VyIGFsbG93IHNob3dpbmcgYSBjdXN0b20gbWVzc2FnZSBoZXJlXG4gIGV2ZW50LnJldHVyblZhbHVlID0gXCJcIjtcbn07XG5cbmV4cG9ydCBjb25zdCBieXRlc1RvSGV4U3RyaW5nID0gKGJ5dGVzOiBVaW50OEFycmF5KSA9PiB7XG4gIHJldHVybiBBcnJheS5mcm9tKGJ5dGVzKVxuICAgIC5tYXAoKGJ5dGUpID0+IGAwJHtieXRlLnRvU3RyaW5nKDE2KX1gLnNsaWNlKC0yKSlcbiAgICAuam9pbihcIlwiKTtcbn07XG5cbmV4cG9ydCBjb25zdCBnZXRVcGRhdGVkVGltZXN0YW1wID0gKCkgPT4gKGlzVGVzdEVudigpID8gMSA6IERhdGUubm93KCkpO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYXJyYXkgb2Ygb2JqZWN0cyBjb250YWluaW5nIGBpZGAgYXR0cmlidXRlLFxuICogb3IgYXJyYXkgb2YgaWRzIChzdHJpbmdzKSwgaW50byBhIE1hcCwga2V5ZCBieSBgaWRgLlxuICovXG5leHBvcnQgY29uc3QgYXJyYXlUb01hcCA9IDxUIGV4dGVuZHMgeyBpZDogc3RyaW5nIH0gfCBzdHJpbmc+KFxuICBpdGVtczogcmVhZG9ubHkgVFtdLFxuKSA9PiB7XG4gIHJldHVybiBpdGVtcy5yZWR1Y2UoKGFjYzogTWFwPHN0cmluZywgVD4sIGVsZW1lbnQpID0+IHtcbiAgICBhY2Muc2V0KHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiID8gZWxlbWVudCA6IGVsZW1lbnQuaWQsIGVsZW1lbnQpO1xuICAgIHJldHVybiBhY2M7XG4gIH0sIG5ldyBNYXAoKSk7XG59O1xuXG5leHBvcnQgY29uc3QgaXNUZXN0RW52ID0gKCkgPT5cbiAgdHlwZW9mIHByb2Nlc3MgIT09IFwidW5kZWZpbmVkXCIgJiYgcHJvY2Vzcy5lbnY/Lk5PREVfRU5WID09PSBcInRlc3RcIjtcblxuZXhwb3J0IGNvbnN0IGlzUHJvZEVudiA9ICgpID0+XG4gIHR5cGVvZiBwcm9jZXNzICE9PSBcInVuZGVmaW5lZFwiICYmIHByb2Nlc3MuZW52Py5OT0RFX0VOViA9PT0gXCJwcm9kdWN0aW9uXCI7XG5cbmV4cG9ydCBjb25zdCB3cmFwRXZlbnQgPSA8VCBleHRlbmRzIEV2ZW50PihuYW1lOiBFVkVOVCwgbmF0aXZlRXZlbnQ6IFQpID0+IHtcbiAgcmV0dXJuIG5ldyBDdXN0b21FdmVudChuYW1lLCB7XG4gICAgZGV0YWlsOiB7XG4gICAgICBuYXRpdmVFdmVudCxcbiAgICB9LFxuICAgIGNhbmNlbGFibGU6IHRydWUsXG4gIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZU9iamVjdCA9IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgYW55Pj4oXG4gIG9iajogVCxcbiAgdXBkYXRlczogUGFydGlhbDxUPixcbik6IFQgPT4ge1xuICBsZXQgZGlkQ2hhbmdlID0gZmFsc2U7XG4gIGZvciAoY29uc3Qga2V5IGluIHVwZGF0ZXMpIHtcbiAgICBjb25zdCB2YWx1ZSA9ICh1cGRhdGVzIGFzIGFueSlba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICBpZiAoXG4gICAgICAgIChvYmogYXMgYW55KVtrZXldID09PSB2YWx1ZSAmJlxuICAgICAgICAvLyBpZiBvYmplY3QsIGFsd2F5cyB1cGRhdGUgYmVjYXVzZSBpdHMgYXR0cnMgY291bGQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpXG4gICAgICApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBkaWRDaGFuZ2UgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGlmICghZGlkQ2hhbmdlKSB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ub2JqLFxuICAgIC4uLnVwZGF0ZXMsXG4gIH07XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcmltaXRpdmUgPSAodmFsOiBhbnkpID0+IHtcbiAgY29uc3QgdHlwZSA9IHR5cGVvZiB2YWw7XG4gIHJldHVybiB2YWwgPT0gbnVsbCB8fCAodHlwZSAhPT0gXCJvYmplY3RcIiAmJiB0eXBlICE9PSBcImZ1bmN0aW9uXCIpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldEZyYW1lID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiB3aW5kb3cuc2VsZiA9PT0gd2luZG93LnRvcCA/IFwidG9wXCIgOiBcImlmcmFtZVwiO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBcImlmcmFtZVwiO1xuICB9XG59O1xuXG5leHBvcnQgY29uc3QgaXNQcm9taXNlTGlrZSA9IChcbiAgdmFsdWU6IGFueSxcbik6IHZhbHVlIGlzIFByb21pc2U8UmVzb2x1dGlvblR5cGU8dHlwZW9mIHZhbHVlPj4gPT4ge1xuICByZXR1cm4gKFxuICAgICEhdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICBcInRoZW5cIiBpbiB2YWx1ZSAmJlxuICAgIFwiY2F0Y2hcIiBpbiB2YWx1ZSAmJlxuICAgIFwiZmluYWxseVwiIGluIHZhbHVlXG4gICk7XG59O1xuXG5leHBvcnQgY29uc3QgcXVlcnlGb2N1c2FibGVFbGVtZW50cyA9IChjb250YWluZXI6IEhUTUxFbGVtZW50IHwgbnVsbCkgPT4ge1xuICBjb25zdCBmb2N1c2FibGVFbGVtZW50cyA9IGNvbnRhaW5lcj8ucXVlcnlTZWxlY3RvckFsbDxIVE1MRWxlbWVudD4oXG4gICAgXCJidXR0b24sIGEsIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBkaXZbdGFiaW5kZXhdLCBsYWJlbFt0YWJpbmRleF1cIixcbiAgKTtcblxuICByZXR1cm4gZm9jdXNhYmxlRWxlbWVudHNcbiAgICA/IEFycmF5LmZyb20oZm9jdXNhYmxlRWxlbWVudHMpLmZpbHRlcihcbiAgICAgICAgKGVsZW1lbnQpID0+XG4gICAgICAgICAgZWxlbWVudC50YWJJbmRleCA+IC0xICYmICEoZWxlbWVudCBhcyBIVE1MSW5wdXRFbGVtZW50KS5kaXNhYmxlZCxcbiAgICAgIClcbiAgICA6IFtdO1xufTtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///../../utils.ts\n");
3364
3364
 
3365
3365
  /***/ }),
3366
3366