{"version":3,"file":"static/js/main.0a92d4b9.js","mappings":"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","sources":["actions/actionBoundText.tsx","actions/actionCanvas.tsx","actions/actionClipboard.tsx","actions/actionDeleteSelected.tsx","components/ProjectName.tsx","components/DarkModeToggle.tsx","data/resave.ts","actions/actionExport.tsx","components/ButtonIconSelect.tsx","components/IconPicker.tsx","actions/actionProperties.tsx","actions/actionToggleStats.tsx","zindex.ts","actions/actionZindex.tsx","actions/actionSelectAll.ts","element/sortElements.ts","actions/actionDuplicateSelection.tsx","actions/actionFinalize.tsx","actions/actionStyles.ts","actions/actionMenu.tsx","actions/actionGroup.tsx","components/Avatar.tsx","actions/actionNavigate.tsx","actions/actionAddToLibrary.ts","align.ts","actions/actionAlign.tsx","actions/actionDistribute.tsx","distribute.ts","actions/actionFlip.ts","actions/actionToggleGridMode.tsx","actions/actionToggleZenMode.tsx","actions/actionToggleLock.ts","actions/actionLinearEditor.ts","actions/register.ts","actions/shortcuts.ts","analytics.ts","appState.ts","charts.ts","clients.ts","clipboard.ts","colors.ts","components/ActiveConfirmDialog.tsx","actions/actionHistory.tsx","actions/manager.tsx","gesture.ts","history.ts","shapes.tsx","components/ContextMenu.tsx","components/Actions.tsx","components/ImageExportDialog.tsx","components/FixedSideContainer.tsx","components/HintViewer.tsx","components/LockButton.tsx","components/Section.tsx","components/LibraryButton.tsx","components/PenModeButton.tsx","components/Stats.tsx","components/HandButton.tsx","components/MobileMenu.tsx","components/PasteChartDialog.tsx","components/HelpDialog.tsx","components/JSONExportDialog.tsx","components/LibraryUnit.tsx","components/LibraryMenuBrowseButton.tsx","components/LibraryMenuItems.tsx","components/LibraryMenu.tsx","components/HelpButton.tsx","components/footer/Footer.tsx","components/LayerUI.tsx","components/Toast.tsx","actions/actionToggleViewMode.tsx","scene/Fonts.ts","components/App.tsx","components/Card.tsx","components/CheckboxItem.tsx","components/ColorPicker.tsx","components/ConfirmDialog.tsx","components/Modal.tsx","components/Dialog.tsx","components/DialogActionButton.tsx","components/ErrorDialog.tsx","components/Island.tsx","components/SingleLibraryItem.tsx","components/PublishLibrary.tsx","components/LibraryMenuHeaderContent.tsx","components/LoadingMessage.tsx","components/Popover.tsx","components/Sidebar/common.ts","components/Sidebar/SidebarHeader.tsx","components/hoc/withUpstreamOverride.tsx","components/Sidebar/Sidebar.tsx","components/Spinner.tsx","components/Stack.tsx","components/ToolButton.tsx","webpack://excalidraw/./src/components/Tooltip.scss?393a","components/Tooltip.tsx","components/UserList.tsx","../node_modules/zustand/esm/vanilla.mjs","../node_modules/zustand/esm/index.mjs","../node_modules/@dwelle/tunnel-rat/dist/index.js","components/context/tunnels.ts","components/dropdownMenu/DropdownMenuTrigger.tsx","components/dropdownMenu/DropdownMenuSeparator.tsx","components/dropdownMenu/DropdownMenuGroup.tsx","components/dropdownMenu/DropdownMenuContent.tsx","hooks/useOutsideClick.ts","components/dropdownMenu/DropdownMenuItemCustom.tsx","components/dropdownMenu/DropdownMenu.tsx","components/dropdownMenu/dropdownMenuUtils.ts","components/dropdownMenu/DropdownMenuItem.tsx","components/dropdownMenu/DropdownMenuItemContent.tsx","components/dropdownMenu/DropdownMenuItemLink.tsx","components/dropdownMenu/common.ts","components/icons.tsx","components/main-menu/DefaultItems.tsx","components/main-menu/MainMenu.tsx","components/hoc/withInternalFallback.tsx","webpack://excalidraw/./src/css/variables.module.scss?d9da","constants.ts","data/blob.ts","data/encode.ts","data/encryption.ts","../node_modules/browser-fs-access/dist/index.mjs","data/filesystem.ts","data/image.ts","data/index.ts","data/json.ts","data/library.ts","data/restore.ts","element/Hyperlink.tsx","element/binding.ts","element/bounds.ts","ga.ts","galines.ts","gapoints.ts","gadirections.ts","gatransforms.ts","element/collision.ts","element/image.ts","element/resizeTest.ts","element/dragElements.ts","element/showSelectedShapeActions.ts","element/index.ts","element/linearElementEditor.ts","element/mutateElement.ts","element/newElement.ts","element/resizeElements.ts","element/sizeHelpers.ts","element/textElement.ts","element/textWysiwyg.tsx","element/transformHandles.ts","element/typeChecks.ts","../node_modules/@babel/runtime/helpers/esm/construct.js","../node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js","../node_modules/@babel/runtime/helpers/esm/isNativeFunction.js","errors.ts","groups.ts","hooks/useCallbackRefState.ts","i18n.ts","jotai.ts","keys.ts","math.ts","packages/utils.ts","points.ts","random.ts","../node_modules/perfect-freehand/dist/esm/index.js","renderer/renderElement.ts","renderer/renderScene.ts","renderer/roundRect.ts","scene/Scene.ts","scene/comparisons.ts","scene/export.ts","scene/scroll.ts","scene/scrollbars.ts","scene/selection.ts","scene/zoom.ts","types.ts","utils.ts","../node_modules/@sentry/utils/src/misc.ts","../node_modules/@sentry/utils/src/node.ts","../node_modules/@sentry/utils/src/time.ts","../node_modules/clsx/dist/clsx.m.js","../node_modules/crc-32/crc32.js","../node_modules/jotai/esm/index.js","../node_modules/lodash.throttle/index.js","../node_modules/pako/index.js","../node_modules/pako/lib/deflate.js","../node_modules/pako/lib/inflate.js","../node_modules/pako/lib/utils/common.js","../node_modules/pako/lib/utils/strings.js","../node_modules/pako/lib/zlib/adler32.js","../node_modules/pako/lib/zlib/constants.js","../node_modules/pako/lib/zlib/crc32.js","../node_modules/pako/lib/zlib/deflate.js","../node_modules/pako/lib/zlib/gzheader.js","../node_modules/pako/lib/zlib/inffast.js","../node_modules/pako/lib/zlib/inflate.js","../node_modules/pako/lib/zlib/inftrees.js","../node_modules/pako/lib/zlib/messages.js","../node_modules/pako/lib/zlib/trees.js","../node_modules/pako/lib/zlib/zstream.js","../node_modules/png-chunk-text/decode.js","../node_modules/png-chunk-text/encode.js","../node_modules/png-chunk-text/index.js","../node_modules/png-chunks-encode/index.js","../node_modules/png-chunks-extract/index.js","../node_modules/points-on-curve/lib/index.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/react-dom/client.js","../node_modules/react-dom/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react.production.min.js","../node_modules/react/index.js","../node_modules/react/jsx-runtime.js","../node_modules/roughjs/bin/math.js","../node_modules/roughjs/bin/geometry.js","../node_modules/roughjs/bin/fillers/scan-line-hachure.js","../node_modules/roughjs/bin/fillers/hachure-filler.js","../node_modules/roughjs/bin/fillers/zigzag-filler.js","../node_modules/roughjs/bin/fillers/hatch-filler.js","../node_modules/roughjs/bin/fillers/dot-filler.js","../node_modules/roughjs/bin/fillers/dashed-filler.js","../node_modules/roughjs/bin/fillers/zigzag-line-filler.js","../node_modules/roughjs/bin/fillers/filler.js","../node_modules/path-data-parser/lib/parser.js","../node_modules/path-data-parser/lib/absolutize.js","../node_modules/path-data-parser/lib/normalize.js","../node_modules/roughjs/bin/renderer.js","../node_modules/points-on-curve/lib/curve-to-bezier.js","../node_modules/roughjs/bin/generator.js","../node_modules/points-on-path/lib/index.js","../node_modules/roughjs/bin/canvas.js","../node_modules/roughjs/bin/core.js","../node_modules/roughjs/bin/svg.js","../node_modules/roughjs/bin/rough.js","../node_modules/scheduler/cjs/scheduler.production.min.js","../node_modules/scheduler/index.js","../node_modules/sliced/index.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim.production.min.js","../node_modules/use-sync-external-store/cjs/use-sync-external-store-shim/with-selector.production.min.js","../node_modules/use-sync-external-store/shim/index.js","../node_modules/use-sync-external-store/shim/with-selector.js","locales|lazy|/^/.*/.json$/|chunkName: locales/[request]|groupOptions: {}|namespace object","../node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","../node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../node_modules/@babel/runtime/helpers/esm/classCallCheck.js","../node_modules/@babel/runtime/helpers/esm/createClass.js","../node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelper.js","../node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js","../node_modules/@babel/runtime/helpers/esm/createSuper.js","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/inherits.js","../node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js","../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js","../node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","../node_modules/@babel/runtime/helpers/esm/slicedToArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","../node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","../node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","../node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","../node_modules/@babel/runtime/helpers/esm/iterableToArray.js","../node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","../node_modules/nanoid/index.browser.js","../webpack/bootstrap","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/harmony module decorator","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/publicPath","../webpack/runtime/jsonp chunk loading","polyfill.ts","../node_modules/i18next-browser-languagedetector/dist/esm/i18nextBrowserLanguageDetector.js","../node_modules/tslib/tslib.es6.js","../node_modules/@sentry/types/src/session.ts","../node_modules/@sentry/utils/src/logger.ts","../node_modules/@sentry/utils/src/syncpromise.ts","../node_modules/@sentry/utils/src/is.ts","../node_modules/@sentry/hub/src/scope.ts","../node_modules/@sentry/utils/src/browser.ts","../node_modules/@sentry/utils/src/memo.ts","../node_modules/@sentry/utils/src/stacktrace.ts","../node_modules/@sentry/utils/src/string.ts","../node_modules/@sentry/utils/src/object.ts","../node_modules/@sentry/hub/src/session.ts","../node_modules/@sentry/hub/src/hub.ts","../node_modules/@sentry/minimal/src/index.ts","components/TopErrorBoundary.tsx","components/InitializeApp.tsx","components/footer/FooterCenter.tsx","components/welcome-screen/WelcomeScreen.Center.tsx","components/welcome-screen/WelcomeScreen.Hints.tsx","components/welcome-screen/WelcomeScreen.tsx","components/Button.tsx","components/live-collaboration/LiveCollaborationTrigger.tsx","packages/excalidraw/index.tsx","excalidraw-app/app_constants.ts","excalidraw-app/data/firebase.ts","excalidraw-app/data/FileManager.ts","excalidraw-app/collab/reconciliation.ts","excalidraw-app/data/index.ts","excalidraw-app/data/localStorage.ts","excalidraw-app/collab/Portal.tsx","excalidraw-app/collab/RoomDialog.tsx","excalidraw-app/data/tabSync.ts","../node_modules/safari-14-idb-fix/dist/index.js","../node_modules/idb-keyval/dist/index.js","excalidraw-app/data/Locker.ts","excalidraw-app/data/LocalData.ts","excalidraw-app/app-jotai.ts","excalidraw-app/collab/Collab.tsx","excalidraw-app/CustomStats.tsx","excalidraw-app/components/icons.tsx","excalidraw-app/components/ExportToExcalidrawPlus.tsx","excalidraw-app/components/LanguageList.tsx","excalidraw-app/components/AppMainMenu.tsx","excalidraw-app/components/AppWelcomeScreen.tsx","excalidraw-app/components/EncryptedIcon.tsx","excalidraw-app/components/ExcalidrawPlusAppLink.tsx","excalidraw-app/components/AppFooter.tsx","excalidraw-app/index.tsx","serviceWorkerRegistration.ts","excalidraw-app/pwa.ts","../node_modules/@sentry/core/src/integrations/inboundfilters.ts","../node_modules/@sentry/core/src/integrations/functiontostring.ts","../node_modules/@sentry/utils/src/supports.ts","../node_modules/@sentry/utils/src/instrument.ts","../node_modules/@sentry/core/src/version.ts","../node_modules/@sentry/utils/src/polyfill.ts","../node_modules/@sentry/utils/src/error.ts","../node_modules/@sentry/utils/src/dsn.ts","../node_modules/@sentry/core/src/integration.ts","../node_modules/@sentry/core/src/baseclient.ts","../node_modules/@sentry/types/src/status.ts","../node_modules/@sentry/core/src/transports/noop.ts","../node_modules/@sentry/types/src/severity.ts","../node_modules/@sentry/core/src/basebackend.ts","../node_modules/@sentry/browser/src/tracekit.ts","../node_modules/@sentry/browser/src/parsers.ts","../node_modules/@sentry/browser/src/eventbuilder.ts","../node_modules/@sentry/core/src/request.ts","../node_modules/@sentry/core/src/api.ts","../node_modules/@sentry/utils/src/promisebuffer.ts","../node_modules/@sentry/browser/src/transports/base.ts","../node_modules/@sentry/browser/src/transports/fetch.ts","../node_modules/@sentry/browser/src/transports/xhr.ts","../node_modules/@sentry/browser/src/backend.ts","../node_modules/@sentry/browser/src/helpers.ts","../node_modules/@sentry/browser/src/integrations/breadcrumbs.ts","../node_modules/@sentry/browser/src/client.ts","../node_modules/@sentry/browser/src/integrations/trycatch.ts","../node_modules/@sentry/browser/src/integrations/globalhandlers.ts","../node_modules/@sentry/browser/src/integrations/linkederrors.ts","../node_modules/@sentry/browser/src/integrations/useragent.ts","../node_modules/@sentry/browser/src/sdk.ts","../node_modules/@sentry/integrations/src/captureconsole.ts","excalidraw-app/sentry.ts","../node_modules/@sentry/core/src/sdk.ts","index.tsx"],"sourcesContent":["import { BOUND_TEXT_PADDING, ROUNDNESS, VERTICAL_ALIGN } from \"../constants\";\nimport { getNonDeletedElements, isTextElement, newElement } from \"../element\";\nimport { mutateElement } from \"../element/mutateElement\";\nimport {\n  computeContainerDimensionForBoundText,\n  getBoundTextElement,\n  measureText,\n  redrawTextBoundingBox,\n} from \"../element/textElement\";\nimport {\n  getOriginalContainerHeightFromCache,\n  resetOriginalContainerCache,\n} from \"../element/textWysiwyg\";\nimport {\n  hasBoundTextElement,\n  isTextBindableContainer,\n  isUsingAdaptiveRadius,\n} from \"../element/typeChecks\";\nimport {\n  ExcalidrawElement,\n  ExcalidrawLinearElement,\n  ExcalidrawTextContainer,\n  ExcalidrawTextElement,\n} from \"../element/types\";\nimport { getSelectedElements } from \"../scene\";\nimport { getFontString } from \"../utils\";\nimport { register } from \"./register\";\n\nexport const actionUnbindText = register({\n  name: \"unbindText\",\n  contextItemLabel: \"labels.unbindText\",\n  trackEvent: { category: \"element\" },\n  predicate: (elements, appState) => {\n    const selectedElements = getSelectedElements(elements, appState);\n    return selectedElements.some((element) => hasBoundTextElement(element));\n  },\n  perform: (elements, appState) => {\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n    );\n    selectedElements.forEach((element) => {\n      const boundTextElement = getBoundTextElement(element);\n      if (boundTextElement) {\n        const { width, height } = measureText(\n          boundTextElement.originalText,\n          getFontString(boundTextElement),\n        );\n        const originalContainerHeight = getOriginalContainerHeightFromCache(\n          element.id,\n        );\n        resetOriginalContainerCache(element.id);\n\n        mutateElement(boundTextElement as ExcalidrawTextElement, {\n          containerId: null,\n          width,\n          height,\n          text: boundTextElement.originalText,\n        });\n        mutateElement(element, {\n          boundElements: element.boundElements?.filter(\n            (ele) => ele.id !== boundTextElement.id,\n          ),\n          height: originalContainerHeight\n            ? originalContainerHeight\n            : element.height,\n        });\n      }\n    });\n    return {\n      elements,\n      appState,\n      commitToHistory: true,\n    };\n  },\n});\n\nexport const actionBindText = register({\n  name: \"bindText\",\n  contextItemLabel: \"labels.bindText\",\n  trackEvent: { category: \"element\" },\n  predicate: (elements, appState) => {\n    const selectedElements = getSelectedElements(elements, appState);\n\n    if (selectedElements.length === 2) {\n      const textElement =\n        isTextElement(selectedElements[0]) ||\n        isTextElement(selectedElements[1]);\n\n      let bindingContainer;\n      if (isTextBindableContainer(selectedElements[0])) {\n        bindingContainer = selectedElements[0];\n      } else if (isTextBindableContainer(selectedElements[1])) {\n        bindingContainer = selectedElements[1];\n      }\n      if (\n        textElement &&\n        bindingContainer &&\n        getBoundTextElement(bindingContainer) === null\n      ) {\n        return true;\n      }\n    }\n    return false;\n  },\n  perform: (elements, appState) => {\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n    );\n\n    let textElement: ExcalidrawTextElement;\n    let container: ExcalidrawTextContainer;\n\n    if (\n      isTextElement(selectedElements[0]) &&\n      isTextBindableContainer(selectedElements[1])\n    ) {\n      textElement = selectedElements[0];\n      container = selectedElements[1];\n    } else {\n      textElement = selectedElements[1] as ExcalidrawTextElement;\n      container = selectedElements[0] as ExcalidrawTextContainer;\n    }\n    mutateElement(textElement, {\n      containerId: container.id,\n      verticalAlign: VERTICAL_ALIGN.MIDDLE,\n    });\n    mutateElement(container, {\n      boundElements: (container.boundElements || []).concat({\n        type: \"text\",\n        id: textElement.id,\n      }),\n    });\n    redrawTextBoundingBox(textElement, container);\n\n    return {\n      elements: pushTextAboveContainer(elements, container, textElement),\n      appState: { ...appState, selectedElementIds: { [container.id]: true } },\n      commitToHistory: true,\n    };\n  },\n});\n\nconst pushTextAboveContainer = (\n  elements: readonly ExcalidrawElement[],\n  container: ExcalidrawElement,\n  textElement: ExcalidrawTextElement,\n) => {\n  const updatedElements = elements.slice();\n  const textElementIndex = updatedElements.findIndex(\n    (ele) => ele.id === textElement.id,\n  );\n  updatedElements.splice(textElementIndex, 1);\n\n  const containerIndex = updatedElements.findIndex(\n    (ele) => ele.id === container.id,\n  );\n  updatedElements.splice(containerIndex + 1, 0, textElement);\n  return updatedElements;\n};\n\nconst pushContainerBelowText = (\n  elements: readonly ExcalidrawElement[],\n  container: ExcalidrawElement,\n  textElement: ExcalidrawTextElement,\n) => {\n  const updatedElements = elements.slice();\n  const containerIndex = updatedElements.findIndex(\n    (ele) => ele.id === container.id,\n  );\n  updatedElements.splice(containerIndex, 1);\n\n  const textElementIndex = updatedElements.findIndex(\n    (ele) => ele.id === textElement.id,\n  );\n  updatedElements.splice(textElementIndex, 0, container);\n  return updatedElements;\n};\n\nexport const actionCreateContainerFromText = register({\n  name: \"createContainerFromText\",\n  contextItemLabel: \"labels.createContainerFromText\",\n  trackEvent: { category: \"element\" },\n  predicate: (elements, appState) => {\n    const selectedElements = getSelectedElements(elements, appState);\n    return selectedElements.length === 1 && isTextElement(selectedElements[0]);\n  },\n  perform: (elements, appState) => {\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n    );\n    const updatedElements = elements.slice();\n    if (selectedElements.length === 1 && isTextElement(selectedElements[0])) {\n      const textElement = selectedElements[0];\n      const container = newElement({\n        type: \"rectangle\",\n        backgroundColor: appState.currentItemBackgroundColor,\n        boundElements: [\n          ...(textElement.boundElements || []),\n          { id: textElement.id, type: \"text\" },\n        ],\n        angle: textElement.angle,\n        fillStyle: appState.currentItemFillStyle,\n        strokeColor: appState.currentItemStrokeColor,\n        roughness: appState.currentItemRoughness,\n        strokeWidth: appState.currentItemStrokeWidth,\n        strokeStyle: appState.currentItemStrokeStyle,\n        roundness:\n          appState.currentItemRoundness === \"round\"\n            ? {\n                type: isUsingAdaptiveRadius(\"rectangle\")\n                  ? ROUNDNESS.ADAPTIVE_RADIUS\n                  : ROUNDNESS.PROPORTIONAL_RADIUS,\n              }\n            : null,\n        opacity: 100,\n        locked: false,\n        x: textElement.x - BOUND_TEXT_PADDING,\n        y: textElement.y - BOUND_TEXT_PADDING,\n        width: computeContainerDimensionForBoundText(\n          textElement.width,\n          \"rectangle\",\n        ),\n        height: computeContainerDimensionForBoundText(\n          textElement.height,\n          \"rectangle\",\n        ),\n        groupIds: textElement.groupIds,\n      });\n\n      // update bindings\n      if (textElement.boundElements?.length) {\n        const linearElementIds = textElement.boundElements\n          .filter((ele) => ele.type === \"arrow\")\n          .map((el) => el.id);\n        const linearElements = updatedElements.filter((ele) =>\n          linearElementIds.includes(ele.id),\n        ) as ExcalidrawLinearElement[];\n        linearElements.forEach((ele) => {\n          let startBinding = null;\n          let endBinding = null;\n          if (ele.startBinding) {\n            startBinding = { ...ele.startBinding, elementId: container.id };\n          }\n          if (ele.endBinding) {\n            endBinding = { ...ele.endBinding, elementId: container.id };\n          }\n          mutateElement(ele, { startBinding, endBinding });\n        });\n      }\n\n      mutateElement(textElement, {\n        containerId: container.id,\n        verticalAlign: VERTICAL_ALIGN.MIDDLE,\n        boundElements: null,\n      });\n      redrawTextBoundingBox(textElement, container);\n\n      return {\n        elements: pushContainerBelowText(\n          [...elements, container],\n          container,\n          textElement,\n        ),\n        appState: {\n          ...appState,\n          selectedElementIds: {\n            [container.id]: true,\n            [textElement.id]: false,\n          },\n        },\n        commitToHistory: true,\n      };\n    }\n    return {\n      elements: updatedElements,\n      appState,\n      commitToHistory: true,\n    };\n  },\n});\n","import { ColorPicker } from \"../components/ColorPicker\";\nimport { ZoomInIcon, ZoomOutIcon } from \"../components/icons\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { CURSOR_TYPE, MIN_ZOOM, THEME, ZOOM_STEP } from \"../constants\";\nimport { getCommonBounds, getNonDeletedElements } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { CODES, KEYS } from \"../keys\";\nimport { getNormalizedZoom, getSelectedElements } from \"../scene\";\nimport { centerScrollOn } from \"../scene/scroll\";\nimport { getStateForZoom } from \"../scene/zoom\";\nimport { AppState, NormalizedZoomValue } from \"../types\";\nimport { getShortcutKey, setCursor, updateActiveTool } from \"../utils\";\nimport { register } from \"./register\";\nimport { Tooltip } from \"../components/Tooltip\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport {\n  getDefaultAppState,\n  isEraserActive,\n  isHandToolActive,\n} from \"../appState\";\n\nexport const actionChangeViewBackgroundColor = register({\n  name: \"changeViewBackgroundColor\",\n  trackEvent: false,\n  predicate: (elements, appState, props, app) => {\n    return (\n      !!app.props.UIOptions.canvasActions.changeViewBackgroundColor &&\n      !appState.viewModeEnabled\n    );\n  },\n  perform: (_, appState, value) => {\n    return {\n      appState: { ...appState, ...value },\n      commitToHistory: !!value.viewBackgroundColor,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    // FIXME move me to src/components/mainMenu/DefaultItems.tsx\n    return (\n      <div style={{ position: \"relative\" }}>\n        <ColorPicker\n          label={t(\"labels.canvasBackground\")}\n          type=\"canvasBackground\"\n          color={appState.viewBackgroundColor}\n          onChange={(color) => updateData({ viewBackgroundColor: color })}\n          isActive={appState.openPopup === \"canvasColorPicker\"}\n          setActive={(active) =>\n            updateData({ openPopup: active ? \"canvasColorPicker\" : null })\n          }\n          data-testid=\"canvas-background-picker\"\n          elements={elements}\n          appState={appState}\n        />\n      </div>\n    );\n  },\n});\n\nexport const actionClearCanvas = register({\n  name: \"clearCanvas\",\n  trackEvent: { category: \"canvas\" },\n  predicate: (elements, appState, props, app) => {\n    return (\n      !!app.props.UIOptions.canvasActions.clearCanvas &&\n      !appState.viewModeEnabled\n    );\n  },\n  perform: (elements, appState, _, app) => {\n    app.imageCache.clear();\n    return {\n      elements: elements.map((element) =>\n        newElementWith(element, { isDeleted: true }),\n      ),\n      appState: {\n        ...getDefaultAppState(),\n        files: {},\n        theme: appState.theme,\n        penMode: appState.penMode,\n        penDetected: appState.penDetected,\n        exportBackground: appState.exportBackground,\n        exportEmbedScene: appState.exportEmbedScene,\n        gridSize: appState.gridSize,\n        showStats: appState.showStats,\n        pasteDialog: appState.pasteDialog,\n        activeTool:\n          appState.activeTool.type === \"image\"\n            ? { ...appState.activeTool, type: \"selection\" }\n            : appState.activeTool,\n      },\n      commitToHistory: true,\n    };\n  },\n});\n\nexport const actionZoomIn = register({\n  name: \"zoomIn\",\n  viewMode: true,\n  trackEvent: { category: \"canvas\" },\n  perform: (_elements, appState, _, app) => {\n    return {\n      appState: {\n        ...appState,\n        ...getStateForZoom(\n          {\n            viewportX: appState.width / 2 + appState.offsetLeft,\n            viewportY: appState.height / 2 + appState.offsetTop,\n            nextZoom: getNormalizedZoom(appState.zoom.value + ZOOM_STEP),\n          },\n          appState,\n        ),\n      },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ updateData }) => (\n    <ToolButton\n      type=\"button\"\n      className=\"zoom-in-button zoom-button\"\n      icon={ZoomInIcon}\n      title={`${t(\"buttons.zoomIn\")} — ${getShortcutKey(\"CtrlOrCmd++\")}`}\n      aria-label={t(\"buttons.zoomIn\")}\n      onClick={() => {\n        updateData(null);\n      }}\n    />\n  ),\n  keyTest: (event) =>\n    (event.code === CODES.EQUAL || event.code === CODES.NUM_ADD) &&\n    (event[KEYS.CTRL_OR_CMD] || event.shiftKey),\n});\n\nexport const actionZoomOut = register({\n  name: \"zoomOut\",\n  viewMode: true,\n  trackEvent: { category: \"canvas\" },\n  perform: (_elements, appState, _, app) => {\n    return {\n      appState: {\n        ...appState,\n        ...getStateForZoom(\n          {\n            viewportX: appState.width / 2 + appState.offsetLeft,\n            viewportY: appState.height / 2 + appState.offsetTop,\n            nextZoom: getNormalizedZoom(appState.zoom.value - ZOOM_STEP),\n          },\n          appState,\n        ),\n      },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ updateData }) => (\n    <ToolButton\n      type=\"button\"\n      className=\"zoom-out-button zoom-button\"\n      icon={ZoomOutIcon}\n      title={`${t(\"buttons.zoomOut\")} — ${getShortcutKey(\"CtrlOrCmd+-\")}`}\n      aria-label={t(\"buttons.zoomOut\")}\n      onClick={() => {\n        updateData(null);\n      }}\n    />\n  ),\n  keyTest: (event) =>\n    (event.code === CODES.MINUS || event.code === CODES.NUM_SUBTRACT) &&\n    (event[KEYS.CTRL_OR_CMD] || event.shiftKey),\n});\n\nexport const actionResetZoom = register({\n  name: \"resetZoom\",\n  viewMode: true,\n  trackEvent: { category: \"canvas\" },\n  perform: (_elements, appState, _, app) => {\n    return {\n      appState: {\n        ...appState,\n        ...getStateForZoom(\n          {\n            viewportX: appState.width / 2 + appState.offsetLeft,\n            viewportY: appState.height / 2 + appState.offsetTop,\n            nextZoom: getNormalizedZoom(1),\n          },\n          appState,\n        ),\n      },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ updateData, appState }) => (\n    <Tooltip label={t(\"buttons.resetZoom\")} style={{ height: \"100%\" }}>\n      <ToolButton\n        type=\"button\"\n        className=\"reset-zoom-button zoom-button\"\n        title={t(\"buttons.resetZoom\")}\n        aria-label={t(\"buttons.resetZoom\")}\n        onClick={() => {\n          updateData(null);\n        }}\n      >\n        {(appState.zoom.value * 100).toFixed(0)}%\n      </ToolButton>\n    </Tooltip>\n  ),\n  keyTest: (event) =>\n    (event.code === CODES.ZERO || event.code === CODES.NUM_ZERO) &&\n    (event[KEYS.CTRL_OR_CMD] || event.shiftKey),\n});\n\nconst zoomValueToFitBoundsOnViewport = (\n  bounds: [number, number, number, number],\n  viewportDimensions: { width: number; height: number },\n) => {\n  const [x1, y1, x2, y2] = bounds;\n  const commonBoundsWidth = x2 - x1;\n  const zoomValueForWidth = viewportDimensions.width / commonBoundsWidth;\n  const commonBoundsHeight = y2 - y1;\n  const zoomValueForHeight = viewportDimensions.height / commonBoundsHeight;\n  const smallestZoomValue = Math.min(zoomValueForWidth, zoomValueForHeight);\n  const zoomAdjustedToSteps =\n    Math.floor(smallestZoomValue / ZOOM_STEP) * ZOOM_STEP;\n  const clampedZoomValueToFitElements = Math.min(\n    Math.max(zoomAdjustedToSteps, MIN_ZOOM),\n    1,\n  );\n  return clampedZoomValueToFitElements as NormalizedZoomValue;\n};\n\nconst zoomToFitElements = (\n  elements: readonly ExcalidrawElement[],\n  appState: Readonly<AppState>,\n  zoomToSelection: boolean,\n) => {\n  const nonDeletedElements = getNonDeletedElements(elements);\n  const selectedElements = getSelectedElements(nonDeletedElements, appState);\n\n  const commonBounds =\n    zoomToSelection && selectedElements.length > 0\n      ? getCommonBounds(selectedElements)\n      : getCommonBounds(nonDeletedElements);\n\n  const newZoom = {\n    value: zoomValueToFitBoundsOnViewport(commonBounds, {\n      width: appState.width,\n      height: appState.height,\n    }),\n  };\n\n  const [x1, y1, x2, y2] = commonBounds;\n  const centerX = (x1 + x2) / 2;\n  const centerY = (y1 + y2) / 2;\n  return {\n    appState: {\n      ...appState,\n      ...centerScrollOn({\n        scenePoint: { x: centerX, y: centerY },\n        viewportDimensions: {\n          width: appState.width,\n          height: appState.height,\n        },\n        zoom: newZoom,\n      }),\n      zoom: newZoom,\n    },\n    commitToHistory: false,\n  };\n};\n\nexport const actionZoomToSelected = register({\n  name: \"zoomToSelection\",\n  trackEvent: { category: \"canvas\" },\n  perform: (elements, appState) => zoomToFitElements(elements, appState, true),\n  keyTest: (event) =>\n    event.code === CODES.TWO &&\n    event.shiftKey &&\n    !event.altKey &&\n    !event[KEYS.CTRL_OR_CMD],\n});\n\nexport const actionZoomToFit = register({\n  name: \"zoomToFit\",\n  viewMode: true,\n  trackEvent: { category: \"canvas\" },\n  perform: (elements, appState) => zoomToFitElements(elements, appState, false),\n  keyTest: (event) =>\n    event.code === CODES.ONE &&\n    event.shiftKey &&\n    !event.altKey &&\n    !event[KEYS.CTRL_OR_CMD],\n});\n\nexport const actionToggleTheme = register({\n  name: \"toggleTheme\",\n  viewMode: true,\n  trackEvent: { category: \"canvas\" },\n  perform: (_, appState, value) => {\n    return {\n      appState: {\n        ...appState,\n        theme:\n          value || (appState.theme === THEME.LIGHT ? THEME.DARK : THEME.LIGHT),\n      },\n      commitToHistory: false,\n    };\n  },\n  keyTest: (event) => event.altKey && event.shiftKey && event.code === CODES.D,\n  predicate: (elements, appState, props, app) => {\n    return !!app.props.UIOptions.canvasActions.toggleTheme;\n  },\n});\n\nexport const actionToggleEraserTool = register({\n  name: \"toggleEraserTool\",\n  trackEvent: { category: \"toolbar\" },\n  perform: (elements, appState) => {\n    let activeTool: AppState[\"activeTool\"];\n\n    if (isEraserActive(appState)) {\n      activeTool = updateActiveTool(appState, {\n        ...(appState.activeTool.lastActiveTool || {\n          type: \"selection\",\n        }),\n        lastActiveToolBeforeEraser: null,\n      });\n    } else {\n      activeTool = updateActiveTool(appState, {\n        type: \"eraser\",\n        lastActiveToolBeforeEraser: appState.activeTool,\n      });\n    }\n\n    return {\n      appState: {\n        ...appState,\n        selectedElementIds: {},\n        selectedGroupIds: {},\n        activeTool,\n      },\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) => event.key === KEYS.E,\n});\n\nexport const actionToggleHandTool = register({\n  name: \"toggleHandTool\",\n  trackEvent: { category: \"toolbar\" },\n  perform: (elements, appState, _, app) => {\n    let activeTool: AppState[\"activeTool\"];\n\n    if (isHandToolActive(appState)) {\n      activeTool = updateActiveTool(appState, {\n        ...(appState.activeTool.lastActiveTool || {\n          type: \"selection\",\n        }),\n        lastActiveToolBeforeEraser: null,\n      });\n    } else {\n      activeTool = updateActiveTool(appState, {\n        type: \"hand\",\n        lastActiveToolBeforeEraser: appState.activeTool,\n      });\n      setCursor(app.canvas, CURSOR_TYPE.GRAB);\n    }\n\n    return {\n      appState: {\n        ...appState,\n        selectedElementIds: {},\n        selectedGroupIds: {},\n        activeTool,\n      },\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) => event.key === KEYS.H,\n});\n","import { CODES, KEYS } from \"../keys\";\nimport { register } from \"./register\";\nimport {\n  copyTextToSystemClipboard,\n  copyToClipboard,\n  probablySupportsClipboardBlob,\n  probablySupportsClipboardWriteText,\n} from \"../clipboard\";\nimport { actionDeleteSelected } from \"./actionDeleteSelected\";\nimport { getSelectedElements } from \"../scene/selection\";\nimport { exportCanvas } from \"../data/index\";\nimport { getNonDeletedElements, isTextElement } from \"../element\";\nimport { t } from \"../i18n\";\n\nexport const actionCopy = register({\n  name: \"copy\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState, _, app) => {\n    const selectedElements = getSelectedElements(elements, appState, true);\n\n    copyToClipboard(selectedElements, appState, app.files);\n\n    return {\n      commitToHistory: false,\n    };\n  },\n  predicate: (elements, appState, appProps, app) => {\n    return app.device.isMobile && !!navigator.clipboard;\n  },\n  contextItemLabel: \"labels.copy\",\n  // don't supply a shortcut since we handle this conditionally via onCopy event\n  keyTest: undefined,\n});\n\nexport const actionPaste = register({\n  name: \"paste\",\n  trackEvent: { category: \"element\" },\n  perform: (elements: any, appStates: any, data, app) => {\n    app.pasteFromClipboard(null);\n    return {\n      commitToHistory: false,\n    };\n  },\n  predicate: (elements, appState, appProps, app) => {\n    return app.device.isMobile && !!navigator.clipboard;\n  },\n  contextItemLabel: \"labels.paste\",\n  // don't supply a shortcut since we handle this conditionally via onCopy event\n  keyTest: undefined,\n});\n\nexport const actionCut = register({\n  name: \"cut\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState, data, app) => {\n    actionCopy.perform(elements, appState, data, app);\n    return actionDeleteSelected.perform(elements, appState);\n  },\n  predicate: (elements, appState, appProps, app) => {\n    return app.device.isMobile && !!navigator.clipboard;\n  },\n  contextItemLabel: \"labels.cut\",\n  keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.X,\n});\n\nexport const actionCopyAsSvg = register({\n  name: \"copyAsSvg\",\n  trackEvent: { category: \"element\" },\n  perform: async (elements, appState, _data, app) => {\n    if (!app.canvas) {\n      return {\n        commitToHistory: false,\n      };\n    }\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    );\n    try {\n      await exportCanvas(\n        \"clipboard-svg\",\n        selectedElements.length\n          ? selectedElements\n          : getNonDeletedElements(elements),\n        appState,\n        app.files,\n        appState,\n      );\n      return {\n        commitToHistory: false,\n      };\n    } catch (error: any) {\n      console.error(error);\n      return {\n        appState: {\n          ...appState,\n          errorMessage: error.message,\n        },\n        commitToHistory: false,\n      };\n    }\n  },\n  predicate: (elements) => {\n    return probablySupportsClipboardWriteText && elements.length > 0;\n  },\n  contextItemLabel: \"labels.copyAsSvg\",\n});\n\nexport const actionCopyAsPng = register({\n  name: \"copyAsPng\",\n  trackEvent: { category: \"element\" },\n  perform: async (elements, appState, _data, app) => {\n    if (!app.canvas) {\n      return {\n        commitToHistory: false,\n      };\n    }\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    );\n    try {\n      await exportCanvas(\n        \"clipboard\",\n        selectedElements.length\n          ? selectedElements\n          : getNonDeletedElements(elements),\n        appState,\n        app.files,\n        appState,\n      );\n      return {\n        appState: {\n          ...appState,\n          toast: {\n            message: t(\"toast.copyToClipboardAsPng\", {\n              exportSelection: selectedElements.length\n                ? t(\"toast.selection\")\n                : t(\"toast.canvas\"),\n              exportColorScheme: appState.exportWithDarkMode\n                ? t(\"buttons.darkMode\")\n                : t(\"buttons.lightMode\"),\n            }),\n          },\n        },\n        commitToHistory: false,\n      };\n    } catch (error: any) {\n      console.error(error);\n      return {\n        appState: {\n          ...appState,\n          errorMessage: error.message,\n        },\n        commitToHistory: false,\n      };\n    }\n  },\n  predicate: (elements) => {\n    return probablySupportsClipboardBlob && elements.length > 0;\n  },\n  contextItemLabel: \"labels.copyAsPng\",\n  keyTest: (event) => event.code === CODES.C && event.altKey && event.shiftKey,\n});\n\nexport const copyText = register({\n  name: \"copyText\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    );\n\n    const text = selectedElements\n      .reduce((acc: string[], element) => {\n        if (isTextElement(element)) {\n          acc.push(element.text);\n        }\n        return acc;\n      }, [])\n      .join(\"\\n\\n\");\n    copyTextToSystemClipboard(text);\n    return {\n      commitToHistory: false,\n    };\n  },\n  predicate: (elements, appState) => {\n    return (\n      probablySupportsClipboardWriteText &&\n      getSelectedElements(elements, appState, true).some(isTextElement)\n    );\n  },\n  contextItemLabel: \"labels.copyText\",\n});\n","import { isSomeElementSelected } from \"../scene\";\nimport { KEYS } from \"../keys\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { t } from \"../i18n\";\nimport { register } from \"./register\";\nimport { getNonDeletedElements } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppState } from \"../types\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { getElementsInGroup } from \"../groups\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { fixBindingsAfterDeletion } from \"../element/binding\";\nimport { isBoundToContainer } from \"../element/typeChecks\";\nimport { updateActiveTool } from \"../utils\";\nimport { TrashIcon } from \"../components/icons\";\n\nconst deleteSelectedElements = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  return {\n    elements: elements.map((el) => {\n      if (appState.selectedElementIds[el.id]) {\n        return newElementWith(el, { isDeleted: true });\n      }\n      if (\n        isBoundToContainer(el) &&\n        appState.selectedElementIds[el.containerId]\n      ) {\n        return newElementWith(el, { isDeleted: true });\n      }\n      return el;\n    }),\n    appState: {\n      ...appState,\n      selectedElementIds: {},\n    },\n  };\n};\n\nconst handleGroupEditingState = (\n  appState: AppState,\n  elements: readonly ExcalidrawElement[],\n): AppState => {\n  if (appState.editingGroupId) {\n    const siblingElements = getElementsInGroup(\n      getNonDeletedElements(elements),\n      appState.editingGroupId!,\n    );\n    if (siblingElements.length) {\n      return {\n        ...appState,\n        selectedElementIds: { [siblingElements[0].id]: true },\n      };\n    }\n  }\n  return appState;\n};\n\nexport const actionDeleteSelected = register({\n  name: \"deleteSelectedElements\",\n  trackEvent: { category: \"element\", action: \"delete\" },\n  perform: (elements, appState) => {\n    if (appState.editingLinearElement) {\n      const {\n        elementId,\n        selectedPointsIndices,\n        startBindingElement,\n        endBindingElement,\n      } = appState.editingLinearElement;\n      const element = LinearElementEditor.getElement(elementId);\n      if (!element) {\n        return false;\n      }\n      // case: no point selected → do nothing, as deleting the whole element\n      // is most likely a mistake, where you wanted to delete a specific point\n      // but failed to select it (or you thought it's selected, while it was\n      // only in a hover state)\n      if (selectedPointsIndices == null) {\n        return false;\n      }\n\n      // case: deleting last remaining point\n      if (element.points.length < 2) {\n        const nextElements = elements.map((el) => {\n          if (el.id === element.id) {\n            return newElementWith(el, { isDeleted: true });\n          }\n          return el;\n        });\n        const nextAppState = handleGroupEditingState(appState, nextElements);\n\n        return {\n          elements: nextElements,\n          appState: {\n            ...nextAppState,\n            editingLinearElement: null,\n          },\n          commitToHistory: false,\n        };\n      }\n\n      // We cannot do this inside `movePoint` because it is also called\n      // when deleting the uncommitted point (which hasn't caused any binding)\n      const binding = {\n        startBindingElement: selectedPointsIndices?.includes(0)\n          ? null\n          : startBindingElement,\n        endBindingElement: selectedPointsIndices?.includes(\n          element.points.length - 1,\n        )\n          ? null\n          : endBindingElement,\n      };\n\n      LinearElementEditor.deletePoints(element, selectedPointsIndices);\n\n      return {\n        elements,\n        appState: {\n          ...appState,\n          editingLinearElement: {\n            ...appState.editingLinearElement,\n            ...binding,\n            selectedPointsIndices:\n              selectedPointsIndices?.[0] > 0\n                ? [selectedPointsIndices[0] - 1]\n                : [0],\n          },\n        },\n        commitToHistory: true,\n      };\n    }\n    let { elements: nextElements, appState: nextAppState } =\n      deleteSelectedElements(elements, appState);\n    fixBindingsAfterDeletion(\n      nextElements,\n      elements.filter(({ id }) => appState.selectedElementIds[id]),\n    );\n\n    nextAppState = handleGroupEditingState(nextAppState, nextElements);\n\n    return {\n      elements: nextElements,\n      appState: {\n        ...nextAppState,\n        activeTool: updateActiveTool(appState, { type: \"selection\" }),\n        multiElement: null,\n      },\n      commitToHistory: isSomeElementSelected(\n        getNonDeletedElements(elements),\n        appState,\n      ),\n    };\n  },\n  contextItemLabel: \"labels.delete\",\n  keyTest: (event, appState, elements) =>\n    (event.key === KEYS.BACKSPACE || event.key === KEYS.DELETE) &&\n    !event[KEYS.CTRL_OR_CMD],\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      type=\"button\"\n      icon={TrashIcon}\n      title={t(\"labels.delete\")}\n      aria-label={t(\"labels.delete\")}\n      onClick={() => updateData(null)}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n","import \"./TextInput.scss\";\n\nimport React, { useState } from \"react\";\nimport { focusNearestParent } from \"../utils\";\n\nimport \"./ProjectName.scss\";\nimport { useExcalidrawContainer } from \"./App\";\n\ntype Props = {\n  value: string;\n  onChange: (value: string) => void;\n  label: string;\n  isNameEditable: boolean;\n};\n\nexport const ProjectName = (props: Props) => {\n  const { id } = useExcalidrawContainer();\n  const [fileName, setFileName] = useState<string>(props.value);\n\n  const handleBlur = (event: any) => {\n    focusNearestParent(event.target);\n    const value = event.target.value;\n    if (value !== props.value) {\n      props.onChange(value);\n    }\n  };\n\n  const handleKeyDown = (event: React.KeyboardEvent<HTMLElement>) => {\n    if (event.key === \"Enter\") {\n      event.preventDefault();\n      if (event.nativeEvent.isComposing || event.keyCode === 229) {\n        return;\n      }\n      event.currentTarget.blur();\n    }\n  };\n\n  return (\n    <div className=\"ProjectName\">\n      <label className=\"ProjectName-label\" htmlFor=\"filename\">\n        {`${props.label}${props.isNameEditable ? \"\" : \":\"}`}\n      </label>\n      {props.isNameEditable ? (\n        <input\n          type=\"text\"\n          className=\"TextInput\"\n          onBlur={handleBlur}\n          onKeyDown={handleKeyDown}\n          id={`${id}-filename`}\n          value={fileName}\n          onChange={(event) => setFileName(event.target.value)}\n        />\n      ) : (\n        <span className=\"TextInput TextInput--readonly\" id={`${id}-filename`}>\n          {props.value}\n        </span>\n      )}\n    </div>\n  );\n};\n","import \"./ToolIcon.scss\";\n\nimport { t } from \"../i18n\";\nimport { ToolButton } from \"./ToolButton\";\nimport { THEME } from \"../constants\";\nimport { Theme } from \"../element/types\";\n\n// We chose to use only explicit toggle and not a third option for system value,\n// but this could be added in the future.\nexport const DarkModeToggle = (props: {\n  value: Theme;\n  onChange: (value: Theme) => void;\n  title?: string;\n}) => {\n  const title =\n    props.title ||\n    (props.value === \"dark\" ? t(\"buttons.lightMode\") : t(\"buttons.darkMode\"));\n\n  return (\n    <ToolButton\n      type=\"icon\"\n      icon={props.value === THEME.LIGHT ? ICONS.MOON : ICONS.SUN}\n      title={title}\n      aria-label={title}\n      onClick={() =>\n        props.onChange(props.value === THEME.DARK ? THEME.LIGHT : THEME.DARK)\n      }\n      data-testid=\"toggle-dark-mode\"\n    />\n  );\n};\n\nconst ICONS = {\n  SUN: (\n    <svg width=\"512\" height=\"512\" className=\"rtl-mirror\" viewBox=\"0 0 512 512\">\n      <path\n        fill=\"currentColor\"\n        d=\"M256 160c-52.9 0-96 43.1-96 96s43.1 96 96 96 96-43.1 96-96-43.1-96-96-96zm246.4 80.5l-94.7-47.3 33.5-100.4c4.5-13.6-8.4-26.5-21.9-21.9l-100.4 33.5-47.4-94.8c-6.4-12.8-24.6-12.8-31 0l-47.3 94.7L92.7 70.8c-13.6-4.5-26.5 8.4-21.9 21.9l33.5 100.4-94.7 47.4c-12.8 6.4-12.8 24.6 0 31l94.7 47.3-33.5 100.5c-4.5 13.6 8.4 26.5 21.9 21.9l100.4-33.5 47.3 94.7c6.4 12.8 24.6 12.8 31 0l47.3-94.7 100.4 33.5c13.6 4.5 26.5-8.4 21.9-21.9l-33.5-100.4 94.7-47.3c13-6.5 13-24.7.2-31.1zm-155.9 106c-49.9 49.9-131.1 49.9-181 0-49.9-49.9-49.9-131.1 0-181 49.9-49.9 131.1-49.9 181 0 49.9 49.9 49.9 131.1 0 181z\"\n      ></path>\n    </svg>\n  ),\n  MOON: (\n    <svg width=\"512\" height=\"512\" className=\"rtl-mirror\" viewBox=\"0 0 512 512\">\n      <path\n        fill=\"currentColor\"\n        d=\"M283.211 512c78.962 0 151.079-35.925 198.857-94.792 7.068-8.708-.639-21.43-11.562-19.35-124.203 23.654-238.262-71.576-238.262-196.954 0-72.222 38.662-138.635 101.498-174.394 9.686-5.512 7.25-20.197-3.756-22.23A258.156 258.156 0 0 0 283.211 0c-141.309 0-256 114.511-256 256 0 141.309 114.511 256 256 256z\"\n      ></path>\n    </svg>\n  ),\n};\n","import { ExcalidrawElement } from \"../element/types\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { exportCanvas } from \".\";\nimport { getNonDeletedElements } from \"../element\";\nimport { getFileHandleType, isImageFileHandleType } from \"./blob\";\n\nexport const resaveAsImageWithScene = async (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles,\n) => {\n  const { exportBackground, viewBackgroundColor, name, fileHandle } = appState;\n\n  const fileHandleType = getFileHandleType(fileHandle);\n\n  if (!fileHandle || !isImageFileHandleType(fileHandleType)) {\n    throw new Error(\n      \"fileHandle should exist and should be of type svg or png when resaving\",\n    );\n  }\n  appState = {\n    ...appState,\n    exportEmbedScene: true,\n  };\n\n  await exportCanvas(\n    fileHandleType,\n    getNonDeletedElements(elements),\n    appState,\n    files,\n    {\n      exportBackground,\n      viewBackgroundColor,\n      name,\n      fileHandle,\n    },\n  );\n\n  return { fileHandle };\n};\n","import { questionCircle, saveAs } from \"../components/icons\";\nimport { ProjectName } from \"../components/ProjectName\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { Tooltip } from \"../components/Tooltip\";\nimport { DarkModeToggle } from \"../components/DarkModeToggle\";\nimport { loadFromJSON, saveAsJSON } from \"../data\";\nimport { resaveAsImageWithScene } from \"../data/resave\";\nimport { t } from \"../i18n\";\nimport { useDevice } from \"../components/App\";\nimport { KEYS } from \"../keys\";\nimport { register } from \"./register\";\nimport { CheckboxItem } from \"../components/CheckboxItem\";\nimport { getExportSize } from \"../scene/export\";\nimport { DEFAULT_EXPORT_PADDING, EXPORT_SCALES, THEME } from \"../constants\";\nimport { getSelectedElements, isSomeElementSelected } from \"../scene\";\nimport { getNonDeletedElements } from \"../element\";\nimport { isImageFileHandle } from \"../data/blob\";\nimport { nativeFileSystemSupported } from \"../data/filesystem\";\nimport { Theme } from \"../element/types\";\n\nimport \"../components/ToolIcon.scss\";\n\nexport const actionChangeProjectName = register({\n  name: \"changeProjectName\",\n  trackEvent: false,\n  perform: (_elements, appState, value) => {\n    return { appState: { ...appState, name: value }, commitToHistory: false };\n  },\n  PanelComponent: ({ appState, updateData, appProps }) => (\n    <ProjectName\n      label={t(\"labels.fileTitle\")}\n      value={appState.name || \"Unnamed\"}\n      onChange={(name: string) => updateData(name)}\n      isNameEditable={\n        typeof appProps.name === \"undefined\" && !appState.viewModeEnabled\n      }\n    />\n  ),\n});\n\nexport const actionChangeExportScale = register({\n  name: \"changeExportScale\",\n  trackEvent: { category: \"export\", action: \"scale\" },\n  perform: (_elements, appState, value) => {\n    return {\n      appState: { ...appState, exportScale: value },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ elements: allElements, appState, updateData }) => {\n    const elements = getNonDeletedElements(allElements);\n    const exportSelected = isSomeElementSelected(elements, appState);\n    const exportedElements = exportSelected\n      ? getSelectedElements(elements, appState)\n      : elements;\n\n    return (\n      <>\n        {EXPORT_SCALES.map((s) => {\n          const [width, height] = getExportSize(\n            exportedElements,\n            DEFAULT_EXPORT_PADDING,\n            s,\n          );\n\n          const scaleButtonTitle = `${t(\n            \"buttons.scale\",\n          )} ${s}x (${width}x${height})`;\n\n          return (\n            <ToolButton\n              key={s}\n              size=\"small\"\n              type=\"radio\"\n              icon={`${s}x`}\n              name=\"export-canvas-scale\"\n              title={scaleButtonTitle}\n              aria-label={scaleButtonTitle}\n              id=\"export-canvas-scale\"\n              checked={s === appState.exportScale}\n              onChange={() => updateData(s)}\n            />\n          );\n        })}\n      </>\n    );\n  },\n});\n\nexport const actionChangeExportBackground = register({\n  name: \"changeExportBackground\",\n  trackEvent: { category: \"export\", action: \"toggleBackground\" },\n  perform: (_elements, appState, value) => {\n    return {\n      appState: { ...appState, exportBackground: value },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ appState, updateData }) => (\n    <CheckboxItem\n      checked={appState.exportBackground}\n      onChange={(checked) => updateData(checked)}\n    >\n      {t(\"labels.withBackground\")}\n    </CheckboxItem>\n  ),\n});\n\nexport const actionChangeExportEmbedScene = register({\n  name: \"changeExportEmbedScene\",\n  trackEvent: { category: \"export\", action: \"embedScene\" },\n  perform: (_elements, appState, value) => {\n    return {\n      appState: { ...appState, exportEmbedScene: value },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ appState, updateData }) => (\n    <CheckboxItem\n      checked={appState.exportEmbedScene}\n      onChange={(checked) => updateData(checked)}\n    >\n      {t(\"labels.exportEmbedScene\")}\n      <Tooltip label={t(\"labels.exportEmbedScene_details\")} long={true}>\n        <div className=\"excalidraw-tooltip-icon\">{questionCircle}</div>\n      </Tooltip>\n    </CheckboxItem>\n  ),\n});\n\nexport const actionSaveToActiveFile = register({\n  name: \"saveToActiveFile\",\n  trackEvent: { category: \"export\" },\n  predicate: (elements, appState, props, app) => {\n    return (\n      !!app.props.UIOptions.canvasActions.saveToActiveFile &&\n      !!appState.fileHandle &&\n      !appState.viewModeEnabled\n    );\n  },\n  perform: async (elements, appState, value, app) => {\n    const fileHandleExists = !!appState.fileHandle;\n\n    try {\n      const { fileHandle } = isImageFileHandle(appState.fileHandle)\n        ? await resaveAsImageWithScene(elements, appState, app.files)\n        : await saveAsJSON(elements, appState, app.files);\n\n      return {\n        commitToHistory: false,\n        appState: {\n          ...appState,\n          fileHandle,\n          toast: fileHandleExists\n            ? {\n                message: fileHandle?.name\n                  ? t(\"toast.fileSavedToFilename\").replace(\n                      \"{filename}\",\n                      `\"${fileHandle.name}\"`,\n                    )\n                  : t(\"toast.fileSaved\"),\n              }\n            : null,\n        },\n      };\n    } catch (error: any) {\n      if (error?.name !== \"AbortError\") {\n        console.error(error);\n      } else {\n        console.warn(error);\n      }\n      return { commitToHistory: false };\n    }\n  },\n  keyTest: (event) =>\n    event.key === KEYS.S && event[KEYS.CTRL_OR_CMD] && !event.shiftKey,\n});\n\nexport const actionSaveFileToDisk = register({\n  name: \"saveFileToDisk\",\n  viewMode: true,\n  trackEvent: { category: \"export\" },\n  perform: async (elements, appState, value, app) => {\n    try {\n      const { fileHandle } = await saveAsJSON(\n        elements,\n        {\n          ...appState,\n          fileHandle: null,\n        },\n        app.files,\n      );\n      return { commitToHistory: false, appState: { ...appState, fileHandle } };\n    } catch (error: any) {\n      if (error?.name !== \"AbortError\") {\n        console.error(error);\n      } else {\n        console.warn(error);\n      }\n      return { commitToHistory: false };\n    }\n  },\n  keyTest: (event) =>\n    event.key === KEYS.S && event.shiftKey && event[KEYS.CTRL_OR_CMD],\n  PanelComponent: ({ updateData }) => (\n    <ToolButton\n      type=\"button\"\n      icon={saveAs}\n      title={t(\"buttons.saveAs\")}\n      aria-label={t(\"buttons.saveAs\")}\n      showAriaLabel={useDevice().isMobile}\n      hidden={!nativeFileSystemSupported}\n      onClick={() => updateData(null)}\n      data-testid=\"save-as-button\"\n    />\n  ),\n});\n\nexport const actionLoadScene = register({\n  name: \"loadScene\",\n  trackEvent: { category: \"export\" },\n  predicate: (elements, appState, props, app) => {\n    return (\n      !!app.props.UIOptions.canvasActions.loadScene && !appState.viewModeEnabled\n    );\n  },\n  perform: async (elements, appState, _, app) => {\n    try {\n      const {\n        elements: loadedElements,\n        appState: loadedAppState,\n        files,\n      } = await loadFromJSON(appState, elements);\n      return {\n        elements: loadedElements,\n        appState: loadedAppState,\n        files,\n        commitToHistory: true,\n      };\n    } catch (error: any) {\n      if (error?.name === \"AbortError\") {\n        console.warn(error);\n        return false;\n      }\n      return {\n        elements,\n        appState: { ...appState, errorMessage: error.message },\n        files: app.files,\n        commitToHistory: false,\n      };\n    }\n  },\n  keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.O,\n});\n\nexport const actionExportWithDarkMode = register({\n  name: \"exportWithDarkMode\",\n  trackEvent: { category: \"export\", action: \"toggleTheme\" },\n  perform: (_elements, appState, value) => {\n    return {\n      appState: { ...appState, exportWithDarkMode: value },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ appState, updateData }) => (\n    <div\n      style={{\n        display: \"flex\",\n        justifyContent: \"flex-end\",\n        marginTop: \"-45px\",\n        marginBottom: \"10px\",\n      }}\n    >\n      <DarkModeToggle\n        value={appState.exportWithDarkMode ? THEME.DARK : THEME.LIGHT}\n        onChange={(theme: Theme) => {\n          updateData(theme === THEME.DARK);\n        }}\n        title={t(\"labels.toggleExportColorScheme\")}\n      />\n    </div>\n  ),\n});\n","import clsx from \"clsx\";\n\n// TODO: It might be \"clever\" to add option.icon to the existing component <ButtonSelect />\nexport const ButtonIconSelect = <T extends Object>({\n  options,\n  value,\n  onChange,\n  group,\n}: {\n  options: { value: T; text: string; icon: JSX.Element; testId?: string }[];\n  value: T | null;\n  onChange: (value: T) => void;\n  group: string;\n}) => (\n  <div className=\"buttonList buttonListIcon\">\n    {options.map((option) => (\n      <label\n        key={option.text}\n        className={clsx({ active: value === option.value })}\n        title={option.text}\n      >\n        <input\n          type=\"radio\"\n          name={group}\n          onChange={() => onChange(option.value)}\n          checked={value === option.value}\n          data-testid={option.testId}\n        />\n        {option.icon}\n      </label>\n    ))}\n  </div>\n);\n","import React from \"react\";\nimport { Popover } from \"./Popover\";\n\nimport \"./IconPicker.scss\";\nimport { isArrowKey, KEYS } from \"../keys\";\nimport { getLanguage } from \"../i18n\";\nimport clsx from \"clsx\";\n\nfunction Picker<T>({\n  options,\n  value,\n  label,\n  onChange,\n  onClose,\n}: {\n  label: string;\n  value: T;\n  options: { value: T; text: string; icon: JSX.Element; keyBinding: string }[];\n  onChange: (value: T) => void;\n  onClose: () => void;\n}) {\n  const rFirstItem = React.useRef<HTMLButtonElement>();\n  const rActiveItem = React.useRef<HTMLButtonElement>();\n  const rGallery = React.useRef<HTMLDivElement>(null);\n\n  React.useEffect(() => {\n    // After the component is first mounted focus on first input\n    if (rActiveItem.current) {\n      rActiveItem.current.focus();\n    } else if (rGallery.current) {\n      rGallery.current.focus();\n    }\n  }, []);\n\n  const handleKeyDown = (event: React.KeyboardEvent) => {\n    const pressedOption = options.find(\n      (option) => option.keyBinding === event.key.toLowerCase(),\n    )!;\n\n    if (!(event.metaKey || event.altKey || event.ctrlKey) && pressedOption) {\n      // Keybinding navigation\n      const index = options.indexOf(pressedOption);\n      (rGallery!.current!.children![index] as any).focus();\n      event.preventDefault();\n    } else if (event.key === KEYS.TAB) {\n      // Tab navigation cycle through options. If the user tabs\n      // away from the picker, close the picker. We need to use\n      // a timeout here to let the stack clear before checking.\n      setTimeout(() => {\n        const active = rActiveItem.current;\n        const docActive = document.activeElement;\n        if (active !== docActive) {\n          onClose();\n        }\n      }, 0);\n    } else if (isArrowKey(event.key)) {\n      // Arrow navigation\n      const { activeElement } = document;\n      const isRTL = getLanguage().rtl;\n      const index = Array.prototype.indexOf.call(\n        rGallery!.current!.children,\n        activeElement,\n      );\n      if (index !== -1) {\n        const length = options.length;\n        let nextIndex = index;\n\n        switch (event.key) {\n          // Select the next option\n          case isRTL ? KEYS.ARROW_LEFT : KEYS.ARROW_RIGHT:\n          case KEYS.ARROW_DOWN: {\n            nextIndex = (index + 1) % length;\n            break;\n          }\n          // Select the previous option\n          case isRTL ? KEYS.ARROW_RIGHT : KEYS.ARROW_LEFT:\n          case KEYS.ARROW_UP: {\n            nextIndex = (length + index - 1) % length;\n            break;\n          }\n        }\n\n        (rGallery.current!.children![nextIndex] as any).focus();\n      }\n      event.preventDefault();\n    } else if (event.key === KEYS.ESCAPE || event.key === KEYS.ENTER) {\n      // Close on escape or enter\n      event.preventDefault();\n      onClose();\n    }\n    event.nativeEvent.stopImmediatePropagation();\n    event.stopPropagation();\n  };\n\n  return (\n    <div\n      className={`picker`}\n      role=\"dialog\"\n      aria-modal=\"true\"\n      aria-label={label}\n      onKeyDown={handleKeyDown}\n    >\n      <div className=\"picker-content\" ref={rGallery}>\n        {options.map((option, i) => (\n          <button\n            className={clsx(\"picker-option\", {\n              active: value === option.value,\n            })}\n            onClick={(event) => {\n              (event.currentTarget as HTMLButtonElement).focus();\n              onChange(option.value);\n            }}\n            title={`${option.text} — ${option.keyBinding.toUpperCase()}`}\n            aria-label={option.text || \"none\"}\n            aria-keyshortcuts={option.keyBinding}\n            key={option.text}\n            ref={(el) => {\n              if (el && i === 0) {\n                rFirstItem.current = el;\n              }\n              if (el && option.value === value) {\n                rActiveItem.current = el;\n              }\n            }}\n            onFocus={() => {\n              onChange(option.value);\n            }}\n          >\n            {option.icon}\n            <span className=\"picker-keybinding\">{option.keyBinding}</span>\n          </button>\n        ))}\n      </div>\n    </div>\n  );\n}\n\nexport function IconPicker<T>({\n  value,\n  label,\n  options,\n  onChange,\n  group = \"\",\n}: {\n  label: string;\n  value: T;\n  options: { value: T; text: string; icon: JSX.Element; keyBinding: string }[];\n  onChange: (value: T) => void;\n  group?: string;\n}) {\n  const [isActive, setActive] = React.useState(false);\n  const rPickerButton = React.useRef<any>(null);\n  const isRTL = getLanguage().rtl;\n\n  return (\n    <div>\n      <button\n        name={group}\n        className={isActive ? \"active\" : \"\"}\n        aria-label={label}\n        onClick={() => setActive(!isActive)}\n        ref={rPickerButton}\n      >\n        {options.find((option) => option.value === value)?.icon}\n      </button>\n      <React.Suspense fallback=\"\">\n        {isActive ? (\n          <>\n            <Popover\n              onCloseRequest={(event) =>\n                event.target !== rPickerButton.current && setActive(false)\n              }\n              {...(isRTL ? { right: 5.5 } : { left: -5.5 })}\n            >\n              <Picker\n                options={options}\n                value={value}\n                label={label}\n                onChange={onChange}\n                onClose={() => {\n                  setActive(false);\n                  rPickerButton.current?.focus();\n                }}\n              />\n            </Popover>\n            <div className=\"picker-triangle\" />\n          </>\n        ) : null}\n      </React.Suspense>\n    </div>\n  );\n}\n","import { AppState } from \"../../src/types\";\nimport { ButtonIconSelect } from \"../components/ButtonIconSelect\";\nimport { ColorPicker } from \"../components/ColorPicker\";\nimport { IconPicker } from \"../components/IconPicker\";\n// TODO barnabasmolnar/editor-redesign\n// TextAlignTopIcon, TextAlignBottomIcon,TextAlignMiddleIcon,\n// ArrowHead icons\nimport {\n  ArrowheadArrowIcon,\n  ArrowheadBarIcon,\n  ArrowheadDotIcon,\n  ArrowheadTriangleIcon,\n  ArrowheadNoneIcon,\n  StrokeStyleDashedIcon,\n  StrokeStyleDottedIcon,\n  TextAlignTopIcon,\n  TextAlignBottomIcon,\n  TextAlignMiddleIcon,\n  FillHachureIcon,\n  FillCrossHatchIcon,\n  FillSolidIcon,\n  SloppinessArchitectIcon,\n  SloppinessArtistIcon,\n  SloppinessCartoonistIcon,\n  StrokeWidthBaseIcon,\n  StrokeWidthBoldIcon,\n  StrokeWidthExtraBoldIcon,\n  FontSizeSmallIcon,\n  FontSizeMediumIcon,\n  FontSizeLargeIcon,\n  FontSizeExtraLargeIcon,\n  EdgeSharpIcon,\n  EdgeRoundIcon,\n  FreedrawIcon,\n  FontFamilyNormalIcon,\n  FontFamilyCodeIcon,\n  TextAlignLeftIcon,\n  TextAlignCenterIcon,\n  TextAlignRightIcon,\n} from \"../components/icons\";\nimport {\n  DEFAULT_FONT_FAMILY,\n  DEFAULT_FONT_SIZE,\n  FONT_FAMILY,\n  ROUNDNESS,\n  VERTICAL_ALIGN,\n} from \"../constants\";\nimport {\n  getNonDeletedElements,\n  isTextElement,\n  redrawTextBoundingBox,\n} from \"../element\";\nimport { mutateElement, newElementWith } from \"../element/mutateElement\";\nimport {\n  getBoundTextElement,\n  getContainerElement,\n} from \"../element/textElement\";\nimport {\n  isBoundToContainer,\n  isLinearElement,\n  isUsingAdaptiveRadius,\n} from \"../element/typeChecks\";\nimport {\n  Arrowhead,\n  ExcalidrawElement,\n  ExcalidrawLinearElement,\n  ExcalidrawTextElement,\n  FontFamilyValues,\n  TextAlign,\n  VerticalAlign,\n} from \"../element/types\";\nimport { getLanguage, t } from \"../i18n\";\nimport { KEYS } from \"../keys\";\nimport { randomInteger } from \"../random\";\nimport {\n  canChangeRoundness,\n  canHaveArrowheads,\n  getCommonAttributeOfSelectedElements,\n  getSelectedElements,\n  getTargetElements,\n  isSomeElementSelected,\n} from \"../scene\";\nimport { hasStrokeColor } from \"../scene/comparisons\";\nimport { arrayToMap } from \"../utils\";\nimport { register } from \"./register\";\n\nconst FONT_SIZE_RELATIVE_INCREASE_STEP = 0.1;\n\nconst changeProperty = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  callback: (element: ExcalidrawElement) => ExcalidrawElement,\n  includeBoundText = false,\n) => {\n  const selectedElementIds = arrayToMap(\n    getSelectedElements(elements, appState, includeBoundText),\n  );\n  return elements.map((element) => {\n    if (\n      selectedElementIds.get(element.id) ||\n      element.id === appState.editingElement?.id\n    ) {\n      return callback(element);\n    }\n    return element;\n  });\n};\n\nconst getFormValue = function <T>(\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  getAttribute: (element: ExcalidrawElement) => T,\n  defaultValue?: T,\n): T | null {\n  const editingElement = appState.editingElement;\n  const nonDeletedElements = getNonDeletedElements(elements);\n  return (\n    (editingElement && getAttribute(editingElement)) ??\n    (isSomeElementSelected(nonDeletedElements, appState)\n      ? getCommonAttributeOfSelectedElements(\n          nonDeletedElements,\n          appState,\n          getAttribute,\n        )\n      : defaultValue) ??\n    null\n  );\n};\n\nconst offsetElementAfterFontResize = (\n  prevElement: ExcalidrawTextElement,\n  nextElement: ExcalidrawTextElement,\n) => {\n  if (isBoundToContainer(nextElement)) {\n    return nextElement;\n  }\n  return mutateElement(\n    nextElement,\n    {\n      x:\n        prevElement.textAlign === \"left\"\n          ? prevElement.x\n          : prevElement.x +\n            (prevElement.width - nextElement.width) /\n              (prevElement.textAlign === \"center\" ? 2 : 1),\n      // centering vertically is non-standard, but for Excalidraw I think\n      // it makes sense\n      y: prevElement.y + (prevElement.height - nextElement.height) / 2,\n    },\n    false,\n  );\n};\n\nconst changeFontSize = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  getNewFontSize: (element: ExcalidrawTextElement) => number,\n  fallbackValue?: ExcalidrawTextElement[\"fontSize\"],\n) => {\n  const newFontSizes = new Set<number>();\n\n  return {\n    elements: changeProperty(\n      elements,\n      appState,\n      (oldElement) => {\n        if (isTextElement(oldElement)) {\n          const newFontSize = getNewFontSize(oldElement);\n          newFontSizes.add(newFontSize);\n\n          let newElement: ExcalidrawTextElement = newElementWith(oldElement, {\n            fontSize: newFontSize,\n          });\n          redrawTextBoundingBox(newElement, getContainerElement(oldElement));\n\n          newElement = offsetElementAfterFontResize(oldElement, newElement);\n\n          return newElement;\n        }\n\n        return oldElement;\n      },\n      true,\n    ),\n    appState: {\n      ...appState,\n      // update state only if we've set all select text elements to\n      // the same font size\n      currentItemFontSize:\n        newFontSizes.size === 1\n          ? [...newFontSizes][0]\n          : fallbackValue ?? appState.currentItemFontSize,\n    },\n    commitToHistory: true,\n  };\n};\n\n// -----------------------------------------------------------------------------\n\nexport const actionChangeStrokeColor = register({\n  name: \"changeStrokeColor\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      ...(value.currentItemStrokeColor && {\n        elements: changeProperty(\n          elements,\n          appState,\n          (el) => {\n            return hasStrokeColor(el.type)\n              ? newElementWith(el, {\n                  strokeColor: value.currentItemStrokeColor,\n                })\n              : el;\n          },\n          true,\n        ),\n      }),\n      appState: {\n        ...appState,\n        ...value,\n      },\n      commitToHistory: !!value.currentItemStrokeColor,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <>\n      <h3 aria-hidden=\"true\">{t(\"labels.stroke\")}</h3>\n      <ColorPicker\n        type=\"elementStroke\"\n        label={t(\"labels.stroke\")}\n        color={getFormValue(\n          elements,\n          appState,\n          (element) => element.strokeColor,\n          appState.currentItemStrokeColor,\n        )}\n        onChange={(color) => updateData({ currentItemStrokeColor: color })}\n        isActive={appState.openPopup === \"strokeColorPicker\"}\n        setActive={(active) =>\n          updateData({ openPopup: active ? \"strokeColorPicker\" : null })\n        }\n        elements={elements}\n        appState={appState}\n      />\n    </>\n  ),\n});\n\nexport const actionChangeBackgroundColor = register({\n  name: \"changeBackgroundColor\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      ...(value.currentItemBackgroundColor && {\n        elements: changeProperty(elements, appState, (el) =>\n          newElementWith(el, {\n            backgroundColor: value.currentItemBackgroundColor,\n          }),\n        ),\n      }),\n      appState: {\n        ...appState,\n        ...value,\n      },\n      commitToHistory: !!value.currentItemBackgroundColor,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <>\n      <h3 aria-hidden=\"true\">{t(\"labels.background\")}</h3>\n      <ColorPicker\n        type=\"elementBackground\"\n        label={t(\"labels.background\")}\n        color={getFormValue(\n          elements,\n          appState,\n          (element) => element.backgroundColor,\n          appState.currentItemBackgroundColor,\n        )}\n        onChange={(color) => updateData({ currentItemBackgroundColor: color })}\n        isActive={appState.openPopup === \"backgroundColorPicker\"}\n        setActive={(active) =>\n          updateData({ openPopup: active ? \"backgroundColorPicker\" : null })\n        }\n        elements={elements}\n        appState={appState}\n      />\n    </>\n  ),\n});\n\nexport const actionChangeFillStyle = register({\n  name: \"changeFillStyle\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(elements, appState, (el) =>\n        newElementWith(el, {\n          fillStyle: value,\n        }),\n      ),\n      appState: { ...appState, currentItemFillStyle: value },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <fieldset>\n      <legend>{t(\"labels.fill\")}</legend>\n      <ButtonIconSelect\n        options={[\n          {\n            value: \"hachure\",\n            text: t(\"labels.hachure\"),\n            icon: FillHachureIcon,\n          },\n          {\n            value: \"cross-hatch\",\n            text: t(\"labels.crossHatch\"),\n            icon: FillCrossHatchIcon,\n          },\n          {\n            value: \"solid\",\n            text: t(\"labels.solid\"),\n            icon: FillSolidIcon,\n          },\n        ]}\n        group=\"fill\"\n        value={getFormValue(\n          elements,\n          appState,\n          (element) => element.fillStyle,\n          appState.currentItemFillStyle,\n        )}\n        onChange={(value) => {\n          updateData(value);\n        }}\n      />\n    </fieldset>\n  ),\n});\n\nexport const actionChangeStrokeWidth = register({\n  name: \"changeStrokeWidth\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(elements, appState, (el) =>\n        newElementWith(el, {\n          strokeWidth: value,\n        }),\n      ),\n      appState: { ...appState, currentItemStrokeWidth: value },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <fieldset>\n      <legend>{t(\"labels.strokeWidth\")}</legend>\n      <ButtonIconSelect\n        group=\"stroke-width\"\n        options={[\n          {\n            value: 1,\n            text: t(\"labels.thin\"),\n            icon: StrokeWidthBaseIcon,\n          },\n          {\n            value: 2,\n            text: t(\"labels.bold\"),\n            icon: StrokeWidthBoldIcon,\n          },\n          {\n            value: 4,\n            text: t(\"labels.extraBold\"),\n            icon: StrokeWidthExtraBoldIcon,\n          },\n        ]}\n        value={getFormValue(\n          elements,\n          appState,\n          (element) => element.strokeWidth,\n          appState.currentItemStrokeWidth,\n        )}\n        onChange={(value) => updateData(value)}\n      />\n    </fieldset>\n  ),\n});\n\nexport const actionChangeSloppiness = register({\n  name: \"changeSloppiness\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(elements, appState, (el) =>\n        newElementWith(el, {\n          seed: randomInteger(),\n          roughness: value,\n        }),\n      ),\n      appState: { ...appState, currentItemRoughness: value },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <fieldset>\n      <legend>{t(\"labels.sloppiness\")}</legend>\n      <ButtonIconSelect\n        group=\"sloppiness\"\n        options={[\n          {\n            value: 0,\n            text: t(\"labels.architect\"),\n            icon: SloppinessArchitectIcon,\n          },\n          {\n            value: 1,\n            text: t(\"labels.artist\"),\n            icon: SloppinessArtistIcon,\n          },\n          {\n            value: 2,\n            text: t(\"labels.cartoonist\"),\n            icon: SloppinessCartoonistIcon,\n          },\n        ]}\n        value={getFormValue(\n          elements,\n          appState,\n          (element) => element.roughness,\n          appState.currentItemRoughness,\n        )}\n        onChange={(value) => updateData(value)}\n      />\n    </fieldset>\n  ),\n});\n\nexport const actionChangeStrokeStyle = register({\n  name: \"changeStrokeStyle\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(elements, appState, (el) =>\n        newElementWith(el, {\n          strokeStyle: value,\n        }),\n      ),\n      appState: { ...appState, currentItemStrokeStyle: value },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <fieldset>\n      <legend>{t(\"labels.strokeStyle\")}</legend>\n      <ButtonIconSelect\n        group=\"strokeStyle\"\n        options={[\n          {\n            value: \"solid\",\n            text: t(\"labels.strokeStyle_solid\"),\n            icon: StrokeWidthBaseIcon,\n          },\n          {\n            value: \"dashed\",\n            text: t(\"labels.strokeStyle_dashed\"),\n            icon: StrokeStyleDashedIcon,\n          },\n          {\n            value: \"dotted\",\n            text: t(\"labels.strokeStyle_dotted\"),\n            icon: StrokeStyleDottedIcon,\n          },\n        ]}\n        value={getFormValue(\n          elements,\n          appState,\n          (element) => element.strokeStyle,\n          appState.currentItemStrokeStyle,\n        )}\n        onChange={(value) => updateData(value)}\n      />\n    </fieldset>\n  ),\n});\n\nexport const actionChangeOpacity = register({\n  name: \"changeOpacity\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(\n        elements,\n        appState,\n        (el) =>\n          newElementWith(el, {\n            opacity: value,\n          }),\n        true,\n      ),\n      appState: { ...appState, currentItemOpacity: value },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <label className=\"control-label\">\n      {t(\"labels.opacity\")}\n      <input\n        type=\"range\"\n        min=\"0\"\n        max=\"100\"\n        step=\"10\"\n        onChange={(event) => updateData(+event.target.value)}\n        value={\n          getFormValue(\n            elements,\n            appState,\n            (element) => element.opacity,\n            appState.currentItemOpacity,\n          ) ?? undefined\n        }\n      />\n    </label>\n  ),\n});\n\nexport const actionChangeFontSize = register({\n  name: \"changeFontSize\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return changeFontSize(elements, appState, () => value, value);\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <fieldset>\n      <legend>{t(\"labels.fontSize\")}</legend>\n      <ButtonIconSelect\n        group=\"font-size\"\n        options={[\n          {\n            value: 16,\n            text: t(\"labels.small\"),\n            icon: FontSizeSmallIcon,\n            testId: \"fontSize-small\",\n          },\n          {\n            value: 20,\n            text: t(\"labels.medium\"),\n            icon: FontSizeMediumIcon,\n            testId: \"fontSize-medium\",\n          },\n          {\n            value: 28,\n            text: t(\"labels.large\"),\n            icon: FontSizeLargeIcon,\n            testId: \"fontSize-large\",\n          },\n          {\n            value: 36,\n            text: t(\"labels.veryLarge\"),\n            icon: FontSizeExtraLargeIcon,\n            testId: \"fontSize-veryLarge\",\n          },\n        ]}\n        value={getFormValue(\n          elements,\n          appState,\n          (element) => {\n            if (isTextElement(element)) {\n              return element.fontSize;\n            }\n            const boundTextElement = getBoundTextElement(element);\n            if (boundTextElement) {\n              return boundTextElement.fontSize;\n            }\n            return null;\n          },\n          appState.currentItemFontSize || DEFAULT_FONT_SIZE,\n        )}\n        onChange={(value) => updateData(value)}\n      />\n    </fieldset>\n  ),\n});\n\nexport const actionDecreaseFontSize = register({\n  name: \"decreaseFontSize\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return changeFontSize(elements, appState, (element) =>\n      Math.round(\n        // get previous value before relative increase (doesn't work fully\n        // due to rounding and float precision issues)\n        (1 / (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)) * element.fontSize,\n      ),\n    );\n  },\n  keyTest: (event) => {\n    return (\n      event[KEYS.CTRL_OR_CMD] &&\n      event.shiftKey &&\n      // KEYS.COMMA needed for MacOS\n      (event.key === KEYS.CHEVRON_LEFT || event.key === KEYS.COMMA)\n    );\n  },\n});\n\nexport const actionIncreaseFontSize = register({\n  name: \"increaseFontSize\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return changeFontSize(elements, appState, (element) =>\n      Math.round(element.fontSize * (1 + FONT_SIZE_RELATIVE_INCREASE_STEP)),\n    );\n  },\n  keyTest: (event) => {\n    return (\n      event[KEYS.CTRL_OR_CMD] &&\n      event.shiftKey &&\n      // KEYS.PERIOD needed for MacOS\n      (event.key === KEYS.CHEVRON_RIGHT || event.key === KEYS.PERIOD)\n    );\n  },\n});\n\nexport const actionChangeFontFamily = register({\n  name: \"changeFontFamily\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(\n        elements,\n        appState,\n        (oldElement) => {\n          if (isTextElement(oldElement)) {\n            const newElement: ExcalidrawTextElement = newElementWith(\n              oldElement,\n              {\n                fontFamily: value,\n              },\n            );\n            redrawTextBoundingBox(newElement, getContainerElement(oldElement));\n            return newElement;\n          }\n\n          return oldElement;\n        },\n        true,\n      ),\n      appState: {\n        ...appState,\n        currentItemFontFamily: value,\n      },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    const options: {\n      value: FontFamilyValues;\n      text: string;\n      icon: JSX.Element;\n    }[] = [\n      {\n        value: FONT_FAMILY.Virgil,\n        text: t(\"labels.handDrawn\"),\n        icon: FreedrawIcon,\n      },\n      {\n        value: FONT_FAMILY.Helvetica,\n        text: t(\"labels.normal\"),\n        icon: FontFamilyNormalIcon,\n      },\n      {\n        value: FONT_FAMILY.Cascadia,\n        text: t(\"labels.code\"),\n        icon: FontFamilyCodeIcon,\n      },\n    ];\n\n    return (\n      <fieldset>\n        <legend>{t(\"labels.fontFamily\")}</legend>\n        <ButtonIconSelect<FontFamilyValues | false>\n          group=\"font-family\"\n          options={options}\n          value={getFormValue(\n            elements,\n            appState,\n            (element) => {\n              if (isTextElement(element)) {\n                return element.fontFamily;\n              }\n              const boundTextElement = getBoundTextElement(element);\n              if (boundTextElement) {\n                return boundTextElement.fontFamily;\n              }\n              return null;\n            },\n            appState.currentItemFontFamily || DEFAULT_FONT_FAMILY,\n          )}\n          onChange={(value) => updateData(value)}\n        />\n      </fieldset>\n    );\n  },\n});\n\nexport const actionChangeTextAlign = register({\n  name: \"changeTextAlign\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(\n        elements,\n        appState,\n        (oldElement) => {\n          if (isTextElement(oldElement)) {\n            const newElement: ExcalidrawTextElement = newElementWith(\n              oldElement,\n              { textAlign: value },\n            );\n            redrawTextBoundingBox(newElement, getContainerElement(oldElement));\n            return newElement;\n          }\n\n          return oldElement;\n        },\n        true,\n      ),\n      appState: {\n        ...appState,\n        currentItemTextAlign: value,\n      },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    return (\n      <fieldset>\n        <legend>{t(\"labels.textAlign\")}</legend>\n        <ButtonIconSelect<TextAlign | false>\n          group=\"text-align\"\n          options={[\n            {\n              value: \"left\",\n              text: t(\"labels.left\"),\n              icon: TextAlignLeftIcon,\n            },\n            {\n              value: \"center\",\n              text: t(\"labels.center\"),\n              icon: TextAlignCenterIcon,\n            },\n            {\n              value: \"right\",\n              text: t(\"labels.right\"),\n              icon: TextAlignRightIcon,\n            },\n          ]}\n          value={getFormValue(\n            elements,\n            appState,\n            (element) => {\n              if (isTextElement(element)) {\n                return element.textAlign;\n              }\n              const boundTextElement = getBoundTextElement(element);\n              if (boundTextElement) {\n                return boundTextElement.textAlign;\n              }\n              return null;\n            },\n            appState.currentItemTextAlign,\n          )}\n          onChange={(value) => updateData(value)}\n        />\n      </fieldset>\n    );\n  },\n});\nexport const actionChangeVerticalAlign = register({\n  name: \"changeVerticalAlign\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(\n        elements,\n        appState,\n        (oldElement) => {\n          if (isTextElement(oldElement)) {\n            const newElement: ExcalidrawTextElement = newElementWith(\n              oldElement,\n              { verticalAlign: value },\n            );\n\n            redrawTextBoundingBox(newElement, getContainerElement(oldElement));\n            return newElement;\n          }\n\n          return oldElement;\n        },\n        true,\n      ),\n      appState: {\n        ...appState,\n      },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    return (\n      <fieldset>\n        <ButtonIconSelect<VerticalAlign | false>\n          group=\"text-align\"\n          options={[\n            {\n              value: VERTICAL_ALIGN.TOP,\n              text: t(\"labels.alignTop\"),\n              icon: <TextAlignTopIcon theme={appState.theme} />,\n              testId: \"align-top\",\n            },\n            {\n              value: VERTICAL_ALIGN.MIDDLE,\n              text: t(\"labels.centerVertically\"),\n              icon: <TextAlignMiddleIcon theme={appState.theme} />,\n              testId: \"align-middle\",\n            },\n            {\n              value: VERTICAL_ALIGN.BOTTOM,\n              text: t(\"labels.alignBottom\"),\n              icon: <TextAlignBottomIcon theme={appState.theme} />,\n              testId: \"align-bottom\",\n            },\n          ]}\n          value={getFormValue(elements, appState, (element) => {\n            if (isTextElement(element) && element.containerId) {\n              return element.verticalAlign;\n            }\n            const boundTextElement = getBoundTextElement(element);\n            if (boundTextElement) {\n              return boundTextElement.verticalAlign;\n            }\n            return null;\n          })}\n          onChange={(value) => updateData(value)}\n        />\n      </fieldset>\n    );\n  },\n});\n\nexport const actionChangeRoundness = register({\n  name: \"changeRoundness\",\n  trackEvent: false,\n  perform: (elements, appState, value) => {\n    return {\n      elements: changeProperty(elements, appState, (el) =>\n        newElementWith(el, {\n          roundness:\n            value === \"round\"\n              ? {\n                  type: isUsingAdaptiveRadius(el.type)\n                    ? ROUNDNESS.ADAPTIVE_RADIUS\n                    : ROUNDNESS.PROPORTIONAL_RADIUS,\n                }\n              : null,\n        }),\n      ),\n      appState: {\n        ...appState,\n        currentItemRoundness: value,\n      },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    const targetElements = getTargetElements(\n      getNonDeletedElements(elements),\n      appState,\n    );\n\n    const hasLegacyRoundness = targetElements.some(\n      (el) => el.roundness?.type === ROUNDNESS.LEGACY,\n    );\n\n    return (\n      <fieldset>\n        <legend>{t(\"labels.edges\")}</legend>\n        <ButtonIconSelect\n          group=\"edges\"\n          options={[\n            {\n              value: \"sharp\",\n              text: t(\"labels.sharp\"),\n              icon: EdgeSharpIcon,\n            },\n            {\n              value: \"round\",\n              text: t(\"labels.round\"),\n              icon: EdgeRoundIcon,\n            },\n          ]}\n          value={getFormValue(\n            elements,\n            appState,\n            (element) =>\n              hasLegacyRoundness ? null : element.roundness ? \"round\" : \"sharp\",\n            (canChangeRoundness(appState.activeTool.type) &&\n              appState.currentItemRoundness) ||\n              null,\n          )}\n          onChange={(value) => updateData(value)}\n        />\n      </fieldset>\n    );\n  },\n});\n\nexport const actionChangeArrowhead = register({\n  name: \"changeArrowhead\",\n  trackEvent: false,\n  perform: (\n    elements,\n    appState,\n    value: { position: \"start\" | \"end\"; type: Arrowhead },\n  ) => {\n    return {\n      elements: changeProperty(elements, appState, (el) => {\n        if (isLinearElement(el)) {\n          const { position, type } = value;\n\n          if (position === \"start\") {\n            const element: ExcalidrawLinearElement = newElementWith(el, {\n              startArrowhead: type,\n            });\n            return element;\n          } else if (position === \"end\") {\n            const element: ExcalidrawLinearElement = newElementWith(el, {\n              endArrowhead: type,\n            });\n            return element;\n          }\n        }\n\n        return el;\n      }),\n      appState: {\n        ...appState,\n        [value.position === \"start\"\n          ? \"currentItemStartArrowhead\"\n          : \"currentItemEndArrowhead\"]: value.type,\n      },\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    const isRTL = getLanguage().rtl;\n\n    return (\n      <fieldset>\n        <legend>{t(\"labels.arrowheads\")}</legend>\n        <div className=\"iconSelectList buttonList\">\n          <IconPicker\n            label=\"arrowhead_start\"\n            options={[\n              {\n                value: null,\n                text: t(\"labels.arrowhead_none\"),\n                icon: ArrowheadNoneIcon,\n                keyBinding: \"q\",\n              },\n              {\n                value: \"arrow\",\n                text: t(\"labels.arrowhead_arrow\"),\n                icon: <ArrowheadArrowIcon flip={!isRTL} />,\n                keyBinding: \"w\",\n              },\n              {\n                value: \"bar\",\n                text: t(\"labels.arrowhead_bar\"),\n                icon: <ArrowheadBarIcon flip={!isRTL} />,\n                keyBinding: \"e\",\n              },\n              {\n                value: \"dot\",\n                text: t(\"labels.arrowhead_dot\"),\n                icon: <ArrowheadDotIcon flip={!isRTL} />,\n                keyBinding: \"r\",\n              },\n              {\n                value: \"triangle\",\n                text: t(\"labels.arrowhead_triangle\"),\n                icon: <ArrowheadTriangleIcon flip={!isRTL} />,\n                keyBinding: \"t\",\n              },\n            ]}\n            value={getFormValue<Arrowhead | null>(\n              elements,\n              appState,\n              (element) =>\n                isLinearElement(element) && canHaveArrowheads(element.type)\n                  ? element.startArrowhead\n                  : appState.currentItemStartArrowhead,\n              appState.currentItemStartArrowhead,\n            )}\n            onChange={(value) => updateData({ position: \"start\", type: value })}\n          />\n          <IconPicker\n            label=\"arrowhead_end\"\n            group=\"arrowheads\"\n            options={[\n              {\n                value: null,\n                text: t(\"labels.arrowhead_none\"),\n                keyBinding: \"q\",\n                icon: ArrowheadNoneIcon,\n              },\n              {\n                value: \"arrow\",\n                text: t(\"labels.arrowhead_arrow\"),\n                keyBinding: \"w\",\n                icon: <ArrowheadArrowIcon flip={isRTL} />,\n              },\n              {\n                value: \"bar\",\n                text: t(\"labels.arrowhead_bar\"),\n                keyBinding: \"e\",\n                icon: <ArrowheadBarIcon flip={isRTL} />,\n              },\n              {\n                value: \"dot\",\n                text: t(\"labels.arrowhead_dot\"),\n                keyBinding: \"r\",\n                icon: <ArrowheadDotIcon flip={isRTL} />,\n              },\n              {\n                value: \"triangle\",\n                text: t(\"labels.arrowhead_triangle\"),\n                icon: <ArrowheadTriangleIcon flip={isRTL} />,\n                keyBinding: \"t\",\n              },\n            ]}\n            value={getFormValue<Arrowhead | null>(\n              elements,\n              appState,\n              (element) =>\n                isLinearElement(element) && canHaveArrowheads(element.type)\n                  ? element.endArrowhead\n                  : appState.currentItemEndArrowhead,\n              appState.currentItemEndArrowhead,\n            )}\n            onChange={(value) => updateData({ position: \"end\", type: value })}\n          />\n        </div>\n      </fieldset>\n    );\n  },\n});\n","import { register } from \"./register\";\nimport { CODES, KEYS } from \"../keys\";\n\nexport const actionToggleStats = register({\n  name: \"stats\",\n  viewMode: true,\n  trackEvent: { category: \"menu\" },\n  perform(elements, appState) {\n    return {\n      appState: {\n        ...appState,\n        showStats: !this.checked!(appState),\n      },\n      commitToHistory: false,\n    };\n  },\n  checked: (appState) => appState.showStats,\n  contextItemLabel: \"stats.title\",\n  keyTest: (event) =>\n    !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.SLASH,\n});\n","import { bumpVersion } from \"./element/mutateElement\";\nimport { ExcalidrawElement } from \"./element/types\";\nimport { getElementsInGroup } from \"./groups\";\nimport { getSelectedElements } from \"./scene\";\nimport Scene from \"./scene/Scene\";\nimport { AppState } from \"./types\";\nimport { arrayToMap, findIndex, findLastIndex } from \"./utils\";\n\n/**\n * Returns indices of elements to move based on selected elements.\n * Includes contiguous deleted elements that are between two selected elements,\n *  e.g.: [0 (selected), 1 (deleted), 2 (deleted), 3 (selected)]\n */\nconst getIndicesToMove = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  let selectedIndices: number[] = [];\n  let deletedIndices: number[] = [];\n  let includeDeletedIndex = null;\n  let index = -1;\n  const selectedElementIds = arrayToMap(\n    getSelectedElements(elements, appState, true),\n  );\n  while (++index < elements.length) {\n    if (selectedElementIds.get(elements[index].id)) {\n      if (deletedIndices.length) {\n        selectedIndices = selectedIndices.concat(deletedIndices);\n        deletedIndices = [];\n      }\n      selectedIndices.push(index);\n      includeDeletedIndex = index + 1;\n    } else if (elements[index].isDeleted && includeDeletedIndex === index) {\n      includeDeletedIndex = index + 1;\n      deletedIndices.push(index);\n    } else {\n      deletedIndices = [];\n    }\n  }\n  return selectedIndices;\n};\n\nconst toContiguousGroups = (array: number[]) => {\n  let cursor = 0;\n  return array.reduce((acc, value, index) => {\n    if (index > 0 && array[index - 1] !== value - 1) {\n      cursor = ++cursor;\n    }\n    (acc[cursor] || (acc[cursor] = [])).push(value);\n    return acc;\n  }, [] as number[][]);\n};\n\n/**\n * @returns index of target element, consindering tightly-bound elements\n * (currently non-linear elements bound to a container) as a one unit.\n * If no binding present, returns `undefined`.\n */\nconst getTargetIndexAccountingForBinding = (\n  nextElement: ExcalidrawElement,\n  elements: readonly ExcalidrawElement[],\n  direction: \"left\" | \"right\",\n) => {\n  if (\"containerId\" in nextElement && nextElement.containerId) {\n    if (direction === \"left\") {\n      const containerElement = Scene.getScene(nextElement)!.getElement(\n        nextElement.containerId,\n      );\n      if (containerElement) {\n        return elements.indexOf(containerElement);\n      }\n    } else {\n      return elements.indexOf(nextElement);\n    }\n  } else {\n    const boundElementId = nextElement.boundElements?.find(\n      (binding) => binding.type !== \"arrow\",\n    )?.id;\n    if (boundElementId) {\n      if (direction === \"left\") {\n        return elements.indexOf(nextElement);\n      }\n      const boundTextElement =\n        Scene.getScene(nextElement)!.getElement(boundElementId);\n\n      if (boundTextElement) {\n        return elements.indexOf(boundTextElement);\n      }\n    }\n  }\n};\n\n/**\n * Returns next candidate index that's available to be moved to. Currently that\n *  is a non-deleted element, and not inside a group (unless we're editing it).\n */\nconst getTargetIndex = (\n  appState: AppState,\n  elements: readonly ExcalidrawElement[],\n  boundaryIndex: number,\n  direction: \"left\" | \"right\",\n) => {\n  const sourceElement = elements[boundaryIndex];\n\n  const indexFilter = (element: ExcalidrawElement) => {\n    if (element.isDeleted) {\n      return false;\n    }\n    // if we're editing group, find closest sibling irrespective of whether\n    // there's a different-group element between them (for legacy reasons)\n    if (appState.editingGroupId) {\n      return element.groupIds.includes(appState.editingGroupId);\n    }\n    return true;\n  };\n\n  const candidateIndex =\n    direction === \"left\"\n      ? findLastIndex(elements, indexFilter, Math.max(0, boundaryIndex - 1))\n      : findIndex(elements, indexFilter, boundaryIndex + 1);\n\n  const nextElement = elements[candidateIndex];\n\n  if (!nextElement) {\n    return -1;\n  }\n\n  if (appState.editingGroupId) {\n    if (\n      // candidate element is a sibling in current editing group → return\n      sourceElement?.groupIds.join(\"\") === nextElement?.groupIds.join(\"\")\n    ) {\n      return (\n        getTargetIndexAccountingForBinding(nextElement, elements, direction) ??\n        candidateIndex\n      );\n    } else if (!nextElement?.groupIds.includes(appState.editingGroupId)) {\n      // candidate element is outside current editing group → prevent\n      return -1;\n    }\n  }\n\n  if (!nextElement.groupIds.length) {\n    return (\n      getTargetIndexAccountingForBinding(nextElement, elements, direction) ??\n      candidateIndex\n    );\n  }\n\n  const siblingGroupId = appState.editingGroupId\n    ? nextElement.groupIds[\n        nextElement.groupIds.indexOf(appState.editingGroupId) - 1\n      ]\n    : nextElement.groupIds[nextElement.groupIds.length - 1];\n\n  const elementsInSiblingGroup = getElementsInGroup(elements, siblingGroupId);\n\n  if (elementsInSiblingGroup.length) {\n    // assumes getElementsInGroup() returned elements are sorted\n    // by zIndex (ascending)\n    return direction === \"left\"\n      ? elements.indexOf(elementsInSiblingGroup[0])\n      : elements.indexOf(\n          elementsInSiblingGroup[elementsInSiblingGroup.length - 1],\n        );\n  }\n\n  return candidateIndex;\n};\n\nconst getTargetElementsMap = (\n  elements: readonly ExcalidrawElement[],\n  indices: number[],\n) => {\n  return indices.reduce((acc, index) => {\n    const element = elements[index];\n    acc[element.id] = element;\n    return acc;\n  }, {} as Record<string, ExcalidrawElement>);\n};\n\nconst shiftElements = (\n  appState: AppState,\n  elements: readonly ExcalidrawElement[],\n  direction: \"left\" | \"right\",\n) => {\n  const indicesToMove = getIndicesToMove(elements, appState);\n  const targetElementsMap = getTargetElementsMap(elements, indicesToMove);\n  let groupedIndices = toContiguousGroups(indicesToMove);\n\n  if (direction === \"right\") {\n    groupedIndices = groupedIndices.reverse();\n  }\n\n  groupedIndices.forEach((indices, i) => {\n    const leadingIndex = indices[0];\n    const trailingIndex = indices[indices.length - 1];\n    const boundaryIndex = direction === \"left\" ? leadingIndex : trailingIndex;\n\n    const targetIndex = getTargetIndex(\n      appState,\n      elements,\n      boundaryIndex,\n      direction,\n    );\n\n    if (targetIndex === -1 || boundaryIndex === targetIndex) {\n      return;\n    }\n\n    const leadingElements =\n      direction === \"left\"\n        ? elements.slice(0, targetIndex)\n        : elements.slice(0, leadingIndex);\n    const targetElements = elements.slice(leadingIndex, trailingIndex + 1);\n    const displacedElements =\n      direction === \"left\"\n        ? elements.slice(targetIndex, leadingIndex)\n        : elements.slice(trailingIndex + 1, targetIndex + 1);\n    const trailingElements =\n      direction === \"left\"\n        ? elements.slice(trailingIndex + 1)\n        : elements.slice(targetIndex + 1);\n\n    elements =\n      direction === \"left\"\n        ? [\n            ...leadingElements,\n            ...targetElements,\n            ...displacedElements,\n            ...trailingElements,\n          ]\n        : [\n            ...leadingElements,\n            ...displacedElements,\n            ...targetElements,\n            ...trailingElements,\n          ];\n  });\n\n  return elements.map((element) => {\n    if (targetElementsMap[element.id]) {\n      return bumpVersion(element);\n    }\n    return element;\n  });\n};\n\nconst shiftElementsToEnd = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  direction: \"left\" | \"right\",\n) => {\n  const indicesToMove = getIndicesToMove(elements, appState);\n  const targetElementsMap = getTargetElementsMap(elements, indicesToMove);\n  const displacedElements: ExcalidrawElement[] = [];\n\n  let leadingIndex: number;\n  let trailingIndex: number;\n  if (direction === \"left\") {\n    if (appState.editingGroupId) {\n      const groupElements = getElementsInGroup(\n        elements,\n        appState.editingGroupId,\n      );\n      if (!groupElements.length) {\n        return elements;\n      }\n      leadingIndex = elements.indexOf(groupElements[0]);\n    } else {\n      leadingIndex = 0;\n    }\n\n    trailingIndex = indicesToMove[indicesToMove.length - 1];\n  } else {\n    if (appState.editingGroupId) {\n      const groupElements = getElementsInGroup(\n        elements,\n        appState.editingGroupId,\n      );\n      if (!groupElements.length) {\n        return elements;\n      }\n      trailingIndex = elements.indexOf(groupElements[groupElements.length - 1]);\n    } else {\n      trailingIndex = elements.length - 1;\n    }\n\n    leadingIndex = indicesToMove[0];\n  }\n\n  for (let index = leadingIndex; index < trailingIndex + 1; index++) {\n    if (!indicesToMove.includes(index)) {\n      displacedElements.push(elements[index]);\n    }\n  }\n\n  const targetElements = Object.values(targetElementsMap).map((element) => {\n    return bumpVersion(element);\n  });\n\n  const leadingElements = elements.slice(0, leadingIndex);\n  const trailingElements = elements.slice(trailingIndex + 1);\n\n  return direction === \"left\"\n    ? [\n        ...leadingElements,\n        ...targetElements,\n        ...displacedElements,\n        ...trailingElements,\n      ]\n    : [\n        ...leadingElements,\n        ...displacedElements,\n        ...targetElements,\n        ...trailingElements,\n      ];\n};\n\n// public API\n// -----------------------------------------------------------------------------\n\nexport const moveOneLeft = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  return shiftElements(appState, elements, \"left\");\n};\n\nexport const moveOneRight = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  return shiftElements(appState, elements, \"right\");\n};\n\nexport const moveAllLeft = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  return shiftElementsToEnd(elements, appState, \"left\");\n};\n\nexport const moveAllRight = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  return shiftElementsToEnd(elements, appState, \"right\");\n};\n","import React from \"react\";\nimport {\n  moveOneLeft,\n  moveOneRight,\n  moveAllLeft,\n  moveAllRight,\n} from \"../zindex\";\nimport { KEYS, CODES } from \"../keys\";\nimport { t } from \"../i18n\";\nimport { getShortcutKey } from \"../utils\";\nimport { register } from \"./register\";\nimport {\n  BringForwardIcon,\n  BringToFrontIcon,\n  SendBackwardIcon,\n  SendToBackIcon,\n} from \"../components/icons\";\nimport { isDarwin } from \"../constants\";\n\nexport const actionSendBackward = register({\n  name: \"sendBackward\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      elements: moveOneLeft(elements, appState),\n      appState,\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.sendBackward\",\n  keyPriority: 40,\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] &&\n    !event.shiftKey &&\n    event.code === CODES.BRACKET_LEFT,\n  PanelComponent: ({ updateData, appState }) => (\n    <button\n      type=\"button\"\n      className=\"zIndexButton\"\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.sendBackward\")} — ${getShortcutKey(\"CtrlOrCmd+[\")}`}\n    >\n      {SendBackwardIcon}\n    </button>\n  ),\n});\n\nexport const actionBringForward = register({\n  name: \"bringForward\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      elements: moveOneRight(elements, appState),\n      appState,\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.bringForward\",\n  keyPriority: 40,\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] &&\n    !event.shiftKey &&\n    event.code === CODES.BRACKET_RIGHT,\n  PanelComponent: ({ updateData, appState }) => (\n    <button\n      type=\"button\"\n      className=\"zIndexButton\"\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.bringForward\")} — ${getShortcutKey(\"CtrlOrCmd+]\")}`}\n    >\n      {BringForwardIcon}\n    </button>\n  ),\n});\n\nexport const actionSendToBack = register({\n  name: \"sendToBack\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      elements: moveAllLeft(elements, appState),\n      appState,\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.sendToBack\",\n  keyTest: (event) =>\n    isDarwin\n      ? event[KEYS.CTRL_OR_CMD] &&\n        event.altKey &&\n        event.code === CODES.BRACKET_LEFT\n      : event[KEYS.CTRL_OR_CMD] &&\n        event.shiftKey &&\n        event.code === CODES.BRACKET_LEFT,\n  PanelComponent: ({ updateData, appState }) => (\n    <button\n      type=\"button\"\n      className=\"zIndexButton\"\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.sendToBack\")} — ${\n        isDarwin\n          ? getShortcutKey(\"CtrlOrCmd+Alt+[\")\n          : getShortcutKey(\"CtrlOrCmd+Shift+[\")\n      }`}\n    >\n      {SendToBackIcon}\n    </button>\n  ),\n});\n\nexport const actionBringToFront = register({\n  name: \"bringToFront\",\n  trackEvent: { category: \"element\" },\n\n  perform: (elements, appState) => {\n    return {\n      elements: moveAllRight(elements, appState),\n      appState,\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.bringToFront\",\n  keyTest: (event) =>\n    isDarwin\n      ? event[KEYS.CTRL_OR_CMD] &&\n        event.altKey &&\n        event.code === CODES.BRACKET_RIGHT\n      : event[KEYS.CTRL_OR_CMD] &&\n        event.shiftKey &&\n        event.code === CODES.BRACKET_RIGHT,\n  PanelComponent: ({ updateData, appState }) => (\n    <button\n      type=\"button\"\n      className=\"zIndexButton\"\n      onClick={(event) => updateData(null)}\n      title={`${t(\"labels.bringToFront\")} — ${\n        isDarwin\n          ? getShortcutKey(\"CtrlOrCmd+Alt+]\")\n          : getShortcutKey(\"CtrlOrCmd+Shift+]\")\n      }`}\n    >\n      {BringToFrontIcon}\n    </button>\n  ),\n});\n","import { KEYS } from \"../keys\";\nimport { register } from \"./register\";\nimport { selectGroupsForSelectedElements } from \"../groups\";\nimport { getNonDeletedElements, isTextElement } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { isLinearElement } from \"../element/typeChecks\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\n\nexport const actionSelectAll = register({\n  name: \"selectAll\",\n  trackEvent: { category: \"canvas\" },\n  perform: (elements, appState, value, app) => {\n    if (appState.editingLinearElement) {\n      return false;\n    }\n    const selectedElementIds = elements.reduce(\n      (map: Record<ExcalidrawElement[\"id\"], true>, element) => {\n        if (\n          !element.isDeleted &&\n          !(isTextElement(element) && element.containerId) &&\n          !element.locked\n        ) {\n          map[element.id] = true;\n        }\n        return map;\n      },\n      {},\n    );\n\n    return {\n      appState: selectGroupsForSelectedElements(\n        {\n          ...appState,\n          selectedLinearElement:\n            // single linear element selected\n            Object.keys(selectedElementIds).length === 1 &&\n            isLinearElement(elements[0])\n              ? new LinearElementEditor(elements[0], app.scene)\n              : null,\n          editingGroupId: null,\n          selectedElementIds,\n        },\n        getNonDeletedElements(elements),\n      ),\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.selectAll\",\n  keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.A,\n});\n","import { arrayToMapWithIndex } from \"../utils\";\nimport { ExcalidrawElement } from \"./types\";\n\nconst normalizeGroupElementOrder = (elements: readonly ExcalidrawElement[]) => {\n  const origElements: ExcalidrawElement[] = elements.slice();\n  const sortedElements = new Set<ExcalidrawElement>();\n\n  const orderInnerGroups = (\n    elements: readonly ExcalidrawElement[],\n  ): ExcalidrawElement[] => {\n    const firstGroupSig = elements[0]?.groupIds?.join(\"\");\n    const aGroup: ExcalidrawElement[] = [elements[0]];\n    const bGroup: ExcalidrawElement[] = [];\n    for (const element of elements.slice(1)) {\n      if (element.groupIds?.join(\"\") === firstGroupSig) {\n        aGroup.push(element);\n      } else {\n        bGroup.push(element);\n      }\n    }\n    return bGroup.length ? [...aGroup, ...orderInnerGroups(bGroup)] : aGroup;\n  };\n\n  const groupHandledElements = new Map<string, true>();\n\n  origElements.forEach((element, idx) => {\n    if (groupHandledElements.has(element.id)) {\n      return;\n    }\n    if (element.groupIds?.length) {\n      const topGroup = element.groupIds[element.groupIds.length - 1];\n      const groupElements = origElements.slice(idx).filter((element) => {\n        const ret = element?.groupIds?.some((id) => id === topGroup);\n        if (ret) {\n          groupHandledElements.set(element!.id, true);\n        }\n        return ret;\n      });\n\n      for (const elem of orderInnerGroups(groupElements)) {\n        sortedElements.add(elem);\n      }\n    } else {\n      sortedElements.add(element);\n    }\n  });\n\n  // if there's a bug which resulted in losing some of the elements, return\n  // original instead as that's better than losing data\n  if (sortedElements.size !== elements.length) {\n    console.error(\"normalizeGroupElementOrder: lost some elements... bailing!\");\n    return elements;\n  }\n\n  return [...sortedElements];\n};\n\n/**\n * In theory, when we have text elements bound to a container, they\n * should be right after the container element in the elements array.\n * However, this is not guaranteed due to old and potential future bugs.\n *\n * This function sorts containers and their bound texts together. It prefers\n * original z-index of container (i.e. it moves bound text elements after\n * containers).\n */\nconst normalizeBoundElementsOrder = (\n  elements: readonly ExcalidrawElement[],\n) => {\n  const elementsMap = arrayToMapWithIndex(elements);\n\n  const origElements: (ExcalidrawElement | null)[] = elements.slice();\n  const sortedElements = new Set<ExcalidrawElement>();\n\n  origElements.forEach((element, idx) => {\n    if (!element) {\n      return;\n    }\n    if (element.boundElements?.length) {\n      sortedElements.add(element);\n      origElements[idx] = null;\n      element.boundElements.forEach((boundElement) => {\n        const child = elementsMap.get(boundElement.id);\n        if (child && boundElement.type === \"text\") {\n          sortedElements.add(child[0]);\n          origElements[child[1]] = null;\n        }\n      });\n    } else if (element.type === \"text\" && element.containerId) {\n      const parent = elementsMap.get(element.containerId);\n      if (!parent?.[0].boundElements?.find((x) => x.id === element.id)) {\n        sortedElements.add(element);\n        origElements[idx] = null;\n\n        // if element has a container and container lists it, skip this element\n        // as it'll be taken care of by the container\n      }\n    } else {\n      sortedElements.add(element);\n      origElements[idx] = null;\n    }\n  });\n\n  // if there's a bug which resulted in losing some of the elements, return\n  // original instead as that's better than losing data\n  if (sortedElements.size !== elements.length) {\n    console.error(\n      \"normalizeBoundElementsOrder: lost some elements... bailing!\",\n    );\n    return elements;\n  }\n\n  return [...sortedElements];\n};\n\nexport const normalizeElementOrder = (\n  elements: readonly ExcalidrawElement[],\n) => {\n  // console.time();\n  const ret = normalizeBoundElementsOrder(normalizeGroupElementOrder(elements));\n  // console.timeEnd();\n  return ret;\n};\n","import { KEYS } from \"../keys\";\nimport { register } from \"./register\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { duplicateElement, getNonDeletedElements } from \"../element\";\nimport { getSelectedElements, isSomeElementSelected } from \"../scene\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { t } from \"../i18n\";\nimport { arrayToMap, getShortcutKey } from \"../utils\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport {\n  selectGroupsForSelectedElements,\n  getSelectedGroupForElement,\n  getElementsInGroup,\n} from \"../groups\";\nimport { AppState } from \"../types\";\nimport { fixBindingsAfterDuplication } from \"../element/binding\";\nimport { ActionResult } from \"./types\";\nimport { GRID_SIZE } from \"../constants\";\nimport {\n  bindTextToShapeAfterDuplication,\n  getBoundTextElement,\n} from \"../element/textElement\";\nimport { isBoundToContainer } from \"../element/typeChecks\";\nimport { normalizeElementOrder } from \"../element/sortElements\";\nimport { DuplicateIcon } from \"../components/icons\";\n\nexport const actionDuplicateSelection = register({\n  name: \"duplicateSelection\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    // duplicate selected point(s) if editing a line\n    if (appState.editingLinearElement) {\n      const ret = LinearElementEditor.duplicateSelectedPoints(appState);\n\n      if (!ret) {\n        return false;\n      }\n\n      return {\n        elements,\n        appState: ret.appState,\n        commitToHistory: true,\n      };\n    }\n\n    return {\n      ...duplicateElements(elements, appState),\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.duplicateSelection\",\n  keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.D,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      type=\"button\"\n      icon={DuplicateIcon}\n      title={`${t(\"labels.duplicateSelection\")} — ${getShortcutKey(\n        \"CtrlOrCmd+D\",\n      )}`}\n      aria-label={t(\"labels.duplicateSelection\")}\n      onClick={() => updateData(null)}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nconst duplicateElements = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n): Partial<ActionResult> => {\n  // ---------------------------------------------------------------------------\n\n  // step (1)\n\n  const sortedElements = normalizeElementOrder(elements);\n  const groupIdMap = new Map();\n  const newElements: ExcalidrawElement[] = [];\n  const oldElements: ExcalidrawElement[] = [];\n  const oldIdToDuplicatedId = new Map();\n\n  const duplicateAndOffsetElement = (element: ExcalidrawElement) => {\n    const newElement = duplicateElement(\n      appState.editingGroupId,\n      groupIdMap,\n      element,\n      {\n        x: element.x + GRID_SIZE / 2,\n        y: element.y + GRID_SIZE / 2,\n      },\n    );\n    oldIdToDuplicatedId.set(element.id, newElement.id);\n    oldElements.push(element);\n    newElements.push(newElement);\n    return newElement;\n  };\n\n  const selectedElementIds = arrayToMap(\n    getSelectedElements(sortedElements, appState, true),\n  );\n\n  // Ids of elements that have already been processed so we don't push them\n  // into the array twice if we end up backtracking when retrieving\n  // discontiguous group of elements (can happen due to a bug, or in edge\n  // cases such as a group containing deleted elements which were not selected).\n  //\n  // This is not enough to prevent duplicates, so we do a second loop afterwards\n  // to remove them.\n  //\n  // For convenience we mark even the newly created ones even though we don't\n  // loop over them.\n  const processedIds = new Map<ExcalidrawElement[\"id\"], true>();\n\n  const markAsProcessed = (elements: ExcalidrawElement[]) => {\n    for (const element of elements) {\n      processedIds.set(element.id, true);\n    }\n    return elements;\n  };\n\n  const elementsWithClones: ExcalidrawElement[] = [];\n\n  let index = -1;\n\n  while (++index < sortedElements.length) {\n    const element = sortedElements[index];\n\n    if (processedIds.get(element.id)) {\n      continue;\n    }\n\n    const boundTextElement = getBoundTextElement(element);\n    if (selectedElementIds.get(element.id)) {\n      // if a group or a container/bound-text, duplicate atomically\n      if (element.groupIds.length || boundTextElement) {\n        const groupId = getSelectedGroupForElement(appState, element);\n        if (groupId) {\n          const groupElements = getElementsInGroup(sortedElements, groupId);\n          elementsWithClones.push(\n            ...markAsProcessed([\n              ...groupElements,\n              ...groupElements.map((element) =>\n                duplicateAndOffsetElement(element),\n              ),\n            ]),\n          );\n          continue;\n        }\n        if (boundTextElement) {\n          elementsWithClones.push(\n            ...markAsProcessed([\n              element,\n              boundTextElement,\n              duplicateAndOffsetElement(element),\n              duplicateAndOffsetElement(boundTextElement),\n            ]),\n          );\n          continue;\n        }\n      }\n      elementsWithClones.push(\n        ...markAsProcessed([element, duplicateAndOffsetElement(element)]),\n      );\n    } else {\n      elementsWithClones.push(...markAsProcessed([element]));\n    }\n  }\n\n  // step (2)\n\n  // second pass to remove duplicates. We loop from the end as it's likelier\n  // that the last elements are in the correct order (contiguous or otherwise).\n  // Thus we need to reverse as the last step (3).\n\n  const finalElementsReversed: ExcalidrawElement[] = [];\n\n  const finalElementIds = new Map<ExcalidrawElement[\"id\"], true>();\n  index = elementsWithClones.length;\n\n  while (--index >= 0) {\n    const element = elementsWithClones[index];\n    if (!finalElementIds.get(element.id)) {\n      finalElementIds.set(element.id, true);\n      finalElementsReversed.push(element);\n    }\n  }\n\n  // step (3)\n\n  const finalElements = finalElementsReversed.reverse();\n\n  // ---------------------------------------------------------------------------\n\n  bindTextToShapeAfterDuplication(\n    elementsWithClones,\n    oldElements,\n    oldIdToDuplicatedId,\n  );\n  fixBindingsAfterDuplication(\n    elementsWithClones,\n    oldElements,\n    oldIdToDuplicatedId,\n  );\n\n  return {\n    elements: finalElements,\n    appState: selectGroupsForSelectedElements(\n      {\n        ...appState,\n        selectedGroupIds: {},\n        selectedElementIds: newElements.reduce(\n          (acc: Record<ExcalidrawElement[\"id\"], true>, element) => {\n            if (!isBoundToContainer(element)) {\n              acc[element.id] = true;\n            }\n            return acc;\n          },\n          {},\n        ),\n      },\n      getNonDeletedElements(finalElements),\n    ),\n  };\n};\n","import { KEYS } from \"../keys\";\nimport { isInvisiblySmallElement } from \"../element\";\nimport { updateActiveTool, resetCursor } from \"../utils\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { done } from \"../components/icons\";\nimport { t } from \"../i18n\";\nimport { register } from \"./register\";\nimport { mutateElement } from \"../element/mutateElement\";\nimport { isPathALoop } from \"../math\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport Scene from \"../scene/Scene\";\nimport {\n  maybeBindLinearElement,\n  bindOrUnbindLinearElement,\n} from \"../element/binding\";\nimport { isBindingElement, isLinearElement } from \"../element/typeChecks\";\nimport { AppState } from \"../types\";\n\nexport const actionFinalize = register({\n  name: \"finalize\",\n  trackEvent: false,\n  perform: (elements, appState, _, { canvas, focusContainer, scene }) => {\n    if (appState.editingLinearElement) {\n      const { elementId, startBindingElement, endBindingElement } =\n        appState.editingLinearElement;\n      const element = LinearElementEditor.getElement(elementId);\n\n      if (element) {\n        if (isBindingElement(element)) {\n          bindOrUnbindLinearElement(\n            element,\n            startBindingElement,\n            endBindingElement,\n          );\n        }\n        return {\n          elements:\n            element.points.length < 2 || isInvisiblySmallElement(element)\n              ? elements.filter((el) => el.id !== element.id)\n              : undefined,\n          appState: {\n            ...appState,\n            cursorButton: \"up\",\n            editingLinearElement: null,\n          },\n          commitToHistory: true,\n        };\n      }\n    }\n\n    let newElements = elements;\n\n    const pendingImageElement =\n      appState.pendingImageElementId &&\n      scene.getElement(appState.pendingImageElementId);\n\n    if (pendingImageElement) {\n      mutateElement(pendingImageElement, { isDeleted: true }, false);\n    }\n\n    if (window.document.activeElement instanceof HTMLElement) {\n      focusContainer();\n    }\n\n    const multiPointElement = appState.multiElement\n      ? appState.multiElement\n      : appState.editingElement?.type === \"freedraw\"\n      ? appState.editingElement\n      : null;\n\n    if (multiPointElement) {\n      // pen and mouse have hover\n      if (\n        multiPointElement.type !== \"freedraw\" &&\n        appState.lastPointerDownWith !== \"touch\"\n      ) {\n        const { points, lastCommittedPoint } = multiPointElement;\n        if (\n          !lastCommittedPoint ||\n          points[points.length - 1] !== lastCommittedPoint\n        ) {\n          mutateElement(multiPointElement, {\n            points: multiPointElement.points.slice(0, -1),\n          });\n        }\n      }\n      if (isInvisiblySmallElement(multiPointElement)) {\n        newElements = newElements.slice(0, -1);\n      }\n\n      // If the multi point line closes the loop,\n      // set the last point to first point.\n      // This ensures that loop remains closed at different scales.\n      const isLoop = isPathALoop(multiPointElement.points, appState.zoom.value);\n      if (\n        multiPointElement.type === \"line\" ||\n        multiPointElement.type === \"freedraw\"\n      ) {\n        if (isLoop) {\n          const linePoints = multiPointElement.points;\n          const firstPoint = linePoints[0];\n          mutateElement(multiPointElement, {\n            points: linePoints.map((point, index) =>\n              index === linePoints.length - 1\n                ? ([firstPoint[0], firstPoint[1]] as const)\n                : point,\n            ),\n          });\n        }\n      }\n\n      if (\n        isBindingElement(multiPointElement) &&\n        !isLoop &&\n        multiPointElement.points.length > 1\n      ) {\n        const [x, y] = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n          multiPointElement,\n          -1,\n        );\n        maybeBindLinearElement(\n          multiPointElement,\n          appState,\n          Scene.getScene(multiPointElement)!,\n          { x, y },\n        );\n      }\n\n      if (\n        !appState.activeTool.locked &&\n        appState.activeTool.type !== \"freedraw\"\n      ) {\n        appState.selectedElementIds[multiPointElement.id] = true;\n      }\n    }\n\n    if (\n      (!appState.activeTool.locked &&\n        appState.activeTool.type !== \"freedraw\") ||\n      !multiPointElement\n    ) {\n      resetCursor(canvas);\n    }\n\n    let activeTool: AppState[\"activeTool\"];\n    if (appState.activeTool.type === \"eraser\") {\n      activeTool = updateActiveTool(appState, {\n        ...(appState.activeTool.lastActiveTool || {\n          type: \"selection\",\n        }),\n        lastActiveToolBeforeEraser: null,\n      });\n    } else {\n      activeTool = updateActiveTool(appState, {\n        type: \"selection\",\n      });\n    }\n\n    return {\n      elements: newElements,\n      appState: {\n        ...appState,\n        cursorButton: \"up\",\n        activeTool:\n          (appState.activeTool.locked ||\n            appState.activeTool.type === \"freedraw\") &&\n          multiPointElement\n            ? appState.activeTool\n            : activeTool,\n        draggingElement: null,\n        multiElement: null,\n        editingElement: null,\n        startBoundElement: null,\n        suggestedBindings: [],\n        selectedElementIds:\n          multiPointElement &&\n          !appState.activeTool.locked &&\n          appState.activeTool.type !== \"freedraw\"\n            ? {\n                ...appState.selectedElementIds,\n                [multiPointElement.id]: true,\n              }\n            : appState.selectedElementIds,\n        // To select the linear element when user has finished mutipoint editing\n        selectedLinearElement:\n          multiPointElement && isLinearElement(multiPointElement)\n            ? new LinearElementEditor(multiPointElement, scene)\n            : appState.selectedLinearElement,\n        pendingImageElementId: null,\n      },\n      commitToHistory: appState.activeTool.type === \"freedraw\",\n    };\n  },\n  keyTest: (event, appState) =>\n    (event.key === KEYS.ESCAPE &&\n      (appState.editingLinearElement !== null ||\n        (!appState.draggingElement && appState.multiElement === null))) ||\n    ((event.key === KEYS.ESCAPE || event.key === KEYS.ENTER) &&\n      appState.multiElement !== null),\n  PanelComponent: ({ appState, updateData, data }) => (\n    <ToolButton\n      type=\"button\"\n      icon={done}\n      title={t(\"buttons.done\")}\n      aria-label={t(\"buttons.done\")}\n      onClick={updateData}\n      visible={appState.multiElement != null}\n      size={data?.size || \"medium\"}\n    />\n  ),\n});\n","import {\n  isTextElement,\n  isExcalidrawElement,\n  redrawTextBoundingBox,\n} from \"../element\";\nimport { CODES, KEYS } from \"../keys\";\nimport { t } from \"../i18n\";\nimport { register } from \"./register\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport {\n  DEFAULT_FONT_SIZE,\n  DEFAULT_FONT_FAMILY,\n  DEFAULT_TEXT_ALIGN,\n} from \"../constants\";\nimport { getBoundTextElement } from \"../element/textElement\";\nimport {\n  hasBoundTextElement,\n  canApplyRoundnessTypeToElement,\n  getDefaultRoundnessTypeForElement,\n} from \"../element/typeChecks\";\nimport { getSelectedElements } from \"../scene\";\n\n// `copiedStyles` is exported only for tests.\nexport let copiedStyles: string = \"{}\";\n\nexport const actionCopyStyles = register({\n  name: \"copyStyles\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    const elementsCopied = [];\n    const element = elements.find((el) => appState.selectedElementIds[el.id]);\n    elementsCopied.push(element);\n    if (element && hasBoundTextElement(element)) {\n      const boundTextElement = getBoundTextElement(element);\n      elementsCopied.push(boundTextElement);\n    }\n    if (element) {\n      copiedStyles = JSON.stringify(elementsCopied);\n    }\n    return {\n      appState: {\n        ...appState,\n        toast: { message: t(\"toast.copyStyles\") },\n      },\n      commitToHistory: false,\n    };\n  },\n  contextItemLabel: \"labels.copyStyles\",\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.C,\n});\n\nexport const actionPasteStyles = register({\n  name: \"pasteStyles\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    const elementsCopied = JSON.parse(copiedStyles);\n    const pastedElement = elementsCopied[0];\n    const boundTextElement = elementsCopied[1];\n    if (!isExcalidrawElement(pastedElement)) {\n      return { elements, commitToHistory: false };\n    }\n\n    const selectedElements = getSelectedElements(elements, appState, true);\n    const selectedElementIds = selectedElements.map((element) => element.id);\n    return {\n      elements: elements.map((element) => {\n        if (selectedElementIds.includes(element.id)) {\n          let elementStylesToCopyFrom = pastedElement;\n          if (isTextElement(element) && element.containerId) {\n            elementStylesToCopyFrom = boundTextElement;\n          }\n          if (!elementStylesToCopyFrom) {\n            return element;\n          }\n          let newElement = newElementWith(element, {\n            backgroundColor: elementStylesToCopyFrom?.backgroundColor,\n            strokeWidth: elementStylesToCopyFrom?.strokeWidth,\n            strokeColor: elementStylesToCopyFrom?.strokeColor,\n            strokeStyle: elementStylesToCopyFrom?.strokeStyle,\n            fillStyle: elementStylesToCopyFrom?.fillStyle,\n            opacity: elementStylesToCopyFrom?.opacity,\n            roughness: elementStylesToCopyFrom?.roughness,\n            roundness: elementStylesToCopyFrom.roundness\n              ? canApplyRoundnessTypeToElement(\n                  elementStylesToCopyFrom.roundness.type,\n                  element,\n                )\n                ? elementStylesToCopyFrom.roundness\n                : getDefaultRoundnessTypeForElement(element)\n              : null,\n          });\n\n          if (isTextElement(newElement)) {\n            newElement = newElementWith(newElement, {\n              fontSize: elementStylesToCopyFrom?.fontSize || DEFAULT_FONT_SIZE,\n              fontFamily:\n                elementStylesToCopyFrom?.fontFamily || DEFAULT_FONT_FAMILY,\n              textAlign:\n                elementStylesToCopyFrom?.textAlign || DEFAULT_TEXT_ALIGN,\n            });\n            let container = null;\n            if (newElement.containerId) {\n              container =\n                selectedElements.find(\n                  (element) =>\n                    isTextElement(newElement) &&\n                    element.id === newElement.containerId,\n                ) || null;\n            }\n            redrawTextBoundingBox(newElement, container);\n          }\n\n          if (newElement.type === \"arrow\") {\n            newElement = newElementWith(newElement, {\n              startArrowhead: elementStylesToCopyFrom.startArrowhead,\n              endArrowhead: elementStylesToCopyFrom.endArrowhead,\n            });\n          }\n\n          return newElement;\n        }\n        return element;\n      }),\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.pasteStyles\",\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.V,\n});\n","import { HamburgerMenuIcon, palette } from \"../components/icons\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { t } from \"../i18n\";\nimport { showSelectedShapeActions, getNonDeletedElements } from \"../element\";\nimport { register } from \"./register\";\nimport { allowFullScreen, exitFullScreen, isFullScreen } from \"../utils\";\nimport { KEYS } from \"../keys\";\n\nexport const actionToggleCanvasMenu = register({\n  name: \"toggleCanvasMenu\",\n  trackEvent: { category: \"menu\" },\n  perform: (_, appState) => ({\n    appState: {\n      ...appState,\n      openMenu: appState.openMenu === \"canvas\" ? null : \"canvas\",\n    },\n    commitToHistory: false,\n  }),\n  PanelComponent: ({ appState, updateData }) => (\n    <ToolButton\n      type=\"button\"\n      icon={HamburgerMenuIcon}\n      aria-label={t(\"buttons.menu\")}\n      onClick={updateData}\n      selected={appState.openMenu === \"canvas\"}\n    />\n  ),\n});\n\nexport const actionToggleEditMenu = register({\n  name: \"toggleEditMenu\",\n  trackEvent: { category: \"menu\" },\n  perform: (_elements, appState) => ({\n    appState: {\n      ...appState,\n      openMenu: appState.openMenu === \"shape\" ? null : \"shape\",\n    },\n    commitToHistory: false,\n  }),\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      visible={showSelectedShapeActions(\n        appState,\n        getNonDeletedElements(elements),\n      )}\n      type=\"button\"\n      icon={palette}\n      aria-label={t(\"buttons.edit\")}\n      onClick={updateData}\n      selected={appState.openMenu === \"shape\"}\n    />\n  ),\n});\n\nexport const actionFullScreen = register({\n  name: \"toggleFullScreen\",\n  viewMode: true,\n  trackEvent: { category: \"canvas\", predicate: (appState) => !isFullScreen() },\n  perform: () => {\n    if (!isFullScreen()) {\n      allowFullScreen();\n    }\n    if (isFullScreen()) {\n      exitFullScreen();\n    }\n    return {\n      commitToHistory: false,\n    };\n  },\n  keyTest: (event) => event.key === KEYS.F && !event[KEYS.CTRL_OR_CMD],\n});\n\nexport const actionShortcuts = register({\n  name: \"toggleShortcuts\",\n  viewMode: true,\n  trackEvent: { category: \"menu\", action: \"toggleHelpDialog\" },\n  perform: (_elements, appState, _, { focusContainer }) => {\n    if (appState.openDialog === \"help\") {\n      focusContainer();\n    }\n    return {\n      appState: {\n        ...appState,\n        openDialog: appState.openDialog === \"help\" ? null : \"help\",\n      },\n      commitToHistory: false,\n    };\n  },\n  keyTest: (event) => event.key === KEYS.QUESTION_MARK,\n});\n","import { KEYS } from \"../keys\";\nimport { t } from \"../i18n\";\nimport { arrayToMap, getShortcutKey } from \"../utils\";\nimport { register } from \"./register\";\nimport { UngroupIcon, GroupIcon } from \"../components/icons\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { getSelectedElements, isSomeElementSelected } from \"../scene\";\nimport {\n  getSelectedGroupIds,\n  selectGroup,\n  selectGroupsForSelectedElements,\n  getElementsInGroup,\n  addToGroup,\n  removeFromSelectedGroups,\n  isElementInGroup,\n} from \"../groups\";\nimport { getNonDeletedElements } from \"../element\";\nimport { randomId } from \"../random\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { ExcalidrawElement, ExcalidrawTextElement } from \"../element/types\";\nimport { AppState } from \"../types\";\nimport { isBoundToContainer } from \"../element/typeChecks\";\n\nconst allElementsInSameGroup = (elements: readonly ExcalidrawElement[]) => {\n  if (elements.length >= 2) {\n    const groupIds = elements[0].groupIds;\n    for (const groupId of groupIds) {\n      if (\n        elements.reduce(\n          (acc, element) => acc && isElementInGroup(element, groupId),\n          true,\n        )\n      ) {\n        return true;\n      }\n    }\n  }\n  return false;\n};\n\nconst enableActionGroup = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  const selectedElements = getSelectedElements(\n    getNonDeletedElements(elements),\n    appState,\n    true,\n  );\n  return (\n    selectedElements.length >= 2 && !allElementsInSameGroup(selectedElements)\n  );\n};\n\nexport const actionGroup = register({\n  name: \"group\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    );\n    if (selectedElements.length < 2) {\n      // nothing to group\n      return { appState, elements, commitToHistory: false };\n    }\n    // if everything is already grouped into 1 group, there is nothing to do\n    const selectedGroupIds = getSelectedGroupIds(appState);\n    if (selectedGroupIds.length === 1) {\n      const selectedGroupId = selectedGroupIds[0];\n      const elementIdsInGroup = new Set(\n        getElementsInGroup(elements, selectedGroupId).map(\n          (element) => element.id,\n        ),\n      );\n      const selectedElementIds = new Set(\n        selectedElements.map((element) => element.id),\n      );\n      const combinedSet = new Set([\n        ...Array.from(elementIdsInGroup),\n        ...Array.from(selectedElementIds),\n      ]);\n      if (combinedSet.size === elementIdsInGroup.size) {\n        // no incremental ids in the selected ids\n        return { appState, elements, commitToHistory: false };\n      }\n    }\n    const newGroupId = randomId();\n    const selectElementIds = arrayToMap(selectedElements);\n    const updatedElements = elements.map((element) => {\n      if (!selectElementIds.get(element.id)) {\n        return element;\n      }\n      return newElementWith(element, {\n        groupIds: addToGroup(\n          element.groupIds,\n          newGroupId,\n          appState.editingGroupId,\n        ),\n      });\n    });\n    // keep the z order within the group the same, but move them\n    // to the z order of the highest element in the layer stack\n    const elementsInGroup = getElementsInGroup(updatedElements, newGroupId);\n    const lastElementInGroup = elementsInGroup[elementsInGroup.length - 1];\n    const lastGroupElementIndex =\n      updatedElements.lastIndexOf(lastElementInGroup);\n    const elementsAfterGroup = updatedElements.slice(lastGroupElementIndex + 1);\n    const elementsBeforeGroup = updatedElements\n      .slice(0, lastGroupElementIndex)\n      .filter(\n        (updatedElement) => !isElementInGroup(updatedElement, newGroupId),\n      );\n    const updatedElementsInOrder = [\n      ...elementsBeforeGroup,\n      ...elementsInGroup,\n      ...elementsAfterGroup,\n    ];\n\n    return {\n      appState: selectGroup(\n        newGroupId,\n        { ...appState, selectedGroupIds: {} },\n        getNonDeletedElements(updatedElementsInOrder),\n      ),\n      elements: updatedElementsInOrder,\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: \"labels.group\",\n  predicate: (elements, appState) => enableActionGroup(elements, appState),\n  keyTest: (event) =>\n    !event.shiftKey && event[KEYS.CTRL_OR_CMD] && event.key === KEYS.G,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={<GroupIcon theme={appState.theme} />}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.group\")} — ${getShortcutKey(\"CtrlOrCmd+G\")}`}\n      aria-label={t(\"labels.group\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    ></ToolButton>\n  ),\n});\n\nexport const actionUngroup = register({\n  name: \"ungroup\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    const groupIds = getSelectedGroupIds(appState);\n    if (groupIds.length === 0) {\n      return { appState, elements, commitToHistory: false };\n    }\n\n    const boundTextElementIds: ExcalidrawTextElement[\"id\"][] = [];\n    const nextElements = elements.map((element) => {\n      if (isBoundToContainer(element)) {\n        boundTextElementIds.push(element.id);\n      }\n      const nextGroupIds = removeFromSelectedGroups(\n        element.groupIds,\n        appState.selectedGroupIds,\n      );\n      if (nextGroupIds.length === element.groupIds.length) {\n        return element;\n      }\n      return newElementWith(element, {\n        groupIds: nextGroupIds,\n      });\n    });\n\n    const updateAppState = selectGroupsForSelectedElements(\n      { ...appState, selectedGroupIds: {} },\n      getNonDeletedElements(nextElements),\n    );\n\n    // remove binded text elements from selection\n    boundTextElementIds.forEach(\n      (id) => (updateAppState.selectedElementIds[id] = false),\n    );\n    return {\n      appState: updateAppState,\n\n      elements: nextElements,\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    event.shiftKey &&\n    event[KEYS.CTRL_OR_CMD] &&\n    event.key === KEYS.G.toUpperCase(),\n  contextItemLabel: \"labels.ungroup\",\n  predicate: (elements, appState) => getSelectedGroupIds(appState).length > 0,\n\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      type=\"button\"\n      hidden={getSelectedGroupIds(appState).length === 0}\n      icon={<UngroupIcon theme={appState.theme} />}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.ungroup\")} — ${getShortcutKey(\"CtrlOrCmd+Shift+G\")}`}\n      aria-label={t(\"labels.ungroup\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    ></ToolButton>\n  ),\n});\n","import \"./Avatar.scss\";\n\nimport React, { useState } from \"react\";\nimport { getClientInitials } from \"../clients\";\n\ntype AvatarProps = {\n  onClick: (e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;\n  color: string;\n  border: string;\n  name: string;\n  src?: string;\n};\n\nexport const Avatar = ({ color, onClick, name, src }: AvatarProps) => {\n  const shortName = getClientInitials(name);\n  const [error, setError] = useState(false);\n  const loadImg = !error && src;\n  const style = loadImg ? undefined : { background: color };\n  return (\n    <div className=\"Avatar\" style={style} onClick={onClick}>\n      {loadImg ? (\n        <img\n          className=\"Avatar-img\"\n          src={src}\n          alt={shortName}\n          referrerPolicy=\"no-referrer\"\n          onError={() => setError(true)}\n        />\n      ) : (\n        shortName\n      )}\n    </div>\n  );\n};\n","import { getClientColors } from \"../clients\";\nimport { Avatar } from \"../components/Avatar\";\nimport { centerScrollOn } from \"../scene/scroll\";\nimport { Collaborator } from \"../types\";\nimport { register } from \"./register\";\n\nexport const actionGoToCollaborator = register({\n  name: \"goToCollaborator\",\n  viewMode: true,\n  trackEvent: { category: \"collab\" },\n  perform: (_elements, appState, value) => {\n    const point = value as Collaborator[\"pointer\"];\n    if (!point) {\n      return { appState, commitToHistory: false };\n    }\n\n    return {\n      appState: {\n        ...appState,\n        ...centerScrollOn({\n          scenePoint: point,\n          viewportDimensions: {\n            width: appState.width,\n            height: appState.height,\n          },\n          zoom: appState.zoom,\n        }),\n        // Close mobile menu\n        openMenu: appState.openMenu === \"canvas\" ? null : appState.openMenu,\n      },\n      commitToHistory: false,\n    };\n  },\n  PanelComponent: ({ appState, updateData, data }) => {\n    const [clientId, collaborator] = data as [string, Collaborator];\n\n    const { background, stroke } = getClientColors(clientId, appState);\n\n    return (\n      <Avatar\n        color={background}\n        border={stroke}\n        onClick={() => updateData(collaborator.pointer)}\n        name={collaborator.username || \"\"}\n        src={collaborator.avatarUrl}\n      />\n    );\n  },\n});\n","import { register } from \"./register\";\nimport { getSelectedElements } from \"../scene\";\nimport { getNonDeletedElements } from \"../element\";\nimport { deepCopyElement } from \"../element/newElement\";\nimport { randomId } from \"../random\";\nimport { t } from \"../i18n\";\n\nexport const actionAddToLibrary = register({\n  name: \"addToLibrary\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState, _, app) => {\n    const selectedElements = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    );\n    if (selectedElements.some((element) => element.type === \"image\")) {\n      return {\n        commitToHistory: false,\n        appState: {\n          ...appState,\n          errorMessage: \"Support for adding images to the library coming soon!\",\n        },\n      };\n    }\n\n    return app.library\n      .getLatestLibrary()\n      .then((items) => {\n        return app.library.setLibrary([\n          {\n            id: randomId(),\n            status: \"unpublished\",\n            elements: selectedElements.map(deepCopyElement),\n            created: Date.now(),\n          },\n          ...items,\n        ]);\n      })\n      .then(() => {\n        return {\n          commitToHistory: false,\n          appState: {\n            ...appState,\n            toast: { message: t(\"toast.addedToLibrary\") },\n          },\n        };\n      })\n      .catch((error) => {\n        return {\n          commitToHistory: false,\n          appState: {\n            ...appState,\n            errorMessage: error.message,\n          },\n        };\n      });\n  },\n  contextItemLabel: \"labels.addToLibrary\",\n});\n","import { ExcalidrawElement } from \"./element/types\";\nimport { newElementWith } from \"./element/mutateElement\";\nimport { Box, getCommonBoundingBox } from \"./element/bounds\";\nimport { getMaximumGroups } from \"./groups\";\n\nexport interface Alignment {\n  position: \"start\" | \"center\" | \"end\";\n  axis: \"x\" | \"y\";\n}\n\nexport const alignElements = (\n  selectedElements: ExcalidrawElement[],\n  alignment: Alignment,\n): ExcalidrawElement[] => {\n  const groups: ExcalidrawElement[][] = getMaximumGroups(selectedElements);\n\n  const selectionBoundingBox = getCommonBoundingBox(selectedElements);\n\n  return groups.flatMap((group) => {\n    const translation = calculateTranslation(\n      group,\n      selectionBoundingBox,\n      alignment,\n    );\n    return group.map((element) =>\n      newElementWith(element, {\n        x: element.x + translation.x,\n        y: element.y + translation.y,\n      }),\n    );\n  });\n};\n\nconst calculateTranslation = (\n  group: ExcalidrawElement[],\n  selectionBoundingBox: Box,\n  { axis, position }: Alignment,\n): { x: number; y: number } => {\n  const groupBoundingBox = getCommonBoundingBox(group);\n\n  const [min, max]: [\"minX\" | \"minY\", \"maxX\" | \"maxY\"] =\n    axis === \"x\" ? [\"minX\", \"maxX\"] : [\"minY\", \"maxY\"];\n\n  const noTranslation = { x: 0, y: 0 };\n  if (position === \"start\") {\n    return {\n      ...noTranslation,\n      [axis]: selectionBoundingBox[min] - groupBoundingBox[min],\n    };\n  } else if (position === \"end\") {\n    return {\n      ...noTranslation,\n      [axis]: selectionBoundingBox[max] - groupBoundingBox[max],\n    };\n  } // else if (position === \"center\") {\n  return {\n    ...noTranslation,\n    [axis]:\n      (selectionBoundingBox[min] + selectionBoundingBox[max]) / 2 -\n      (groupBoundingBox[min] + groupBoundingBox[max]) / 2,\n  };\n};\n","import { alignElements, Alignment } from \"../align\";\nimport {\n  AlignBottomIcon,\n  AlignLeftIcon,\n  AlignRightIcon,\n  AlignTopIcon,\n  CenterHorizontallyIcon,\n  CenterVerticallyIcon,\n} from \"../components/icons\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { getNonDeletedElements } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { KEYS } from \"../keys\";\nimport { getSelectedElements, isSomeElementSelected } from \"../scene\";\nimport { AppState } from \"../types\";\nimport { arrayToMap, getShortcutKey } from \"../utils\";\nimport { register } from \"./register\";\n\nconst enableActionGroup = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => getSelectedElements(getNonDeletedElements(elements), appState).length > 1;\n\nconst alignSelectedElements = (\n  elements: readonly ExcalidrawElement[],\n  appState: Readonly<AppState>,\n  alignment: Alignment,\n) => {\n  const selectedElements = getSelectedElements(\n    getNonDeletedElements(elements),\n    appState,\n  );\n\n  const updatedElements = alignElements(selectedElements, alignment);\n\n  const updatedElementsMap = arrayToMap(updatedElements);\n\n  return elements.map(\n    (element) => updatedElementsMap.get(element.id) || element,\n  );\n};\n\nexport const actionAlignTop = register({\n  name: \"alignTop\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: alignSelectedElements(elements, appState, {\n        position: \"start\",\n        axis: \"y\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] && event.shiftKey && event.key === KEYS.ARROW_UP,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={AlignTopIcon}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.alignTop\")} — ${getShortcutKey(\n        \"CtrlOrCmd+Shift+Up\",\n      )}`}\n      aria-label={t(\"labels.alignTop\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nexport const actionAlignBottom = register({\n  name: \"alignBottom\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: alignSelectedElements(elements, appState, {\n        position: \"end\",\n        axis: \"y\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] && event.shiftKey && event.key === KEYS.ARROW_DOWN,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={AlignBottomIcon}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.alignBottom\")} — ${getShortcutKey(\n        \"CtrlOrCmd+Shift+Down\",\n      )}`}\n      aria-label={t(\"labels.alignBottom\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nexport const actionAlignLeft = register({\n  name: \"alignLeft\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: alignSelectedElements(elements, appState, {\n        position: \"start\",\n        axis: \"x\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] && event.shiftKey && event.key === KEYS.ARROW_LEFT,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={AlignLeftIcon}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.alignLeft\")} — ${getShortcutKey(\n        \"CtrlOrCmd+Shift+Left\",\n      )}`}\n      aria-label={t(\"labels.alignLeft\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nexport const actionAlignRight = register({\n  name: \"alignRight\",\n  trackEvent: { category: \"element\" },\n\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: alignSelectedElements(elements, appState, {\n        position: \"end\",\n        axis: \"x\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] && event.shiftKey && event.key === KEYS.ARROW_RIGHT,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={AlignRightIcon}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.alignRight\")} — ${getShortcutKey(\n        \"CtrlOrCmd+Shift+Right\",\n      )}`}\n      aria-label={t(\"labels.alignRight\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nexport const actionAlignVerticallyCentered = register({\n  name: \"alignVerticallyCentered\",\n  trackEvent: { category: \"element\" },\n\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: alignSelectedElements(elements, appState, {\n        position: \"center\",\n        axis: \"y\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={CenterVerticallyIcon}\n      onClick={() => updateData(null)}\n      title={t(\"labels.centerVertically\")}\n      aria-label={t(\"labels.centerVertically\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nexport const actionAlignHorizontallyCentered = register({\n  name: \"alignHorizontallyCentered\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: alignSelectedElements(elements, appState, {\n        position: \"center\",\n        axis: \"x\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={CenterHorizontallyIcon}\n      onClick={() => updateData(null)}\n      title={t(\"labels.centerHorizontally\")}\n      aria-label={t(\"labels.centerHorizontally\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n","import {\n  DistributeHorizontallyIcon,\n  DistributeVerticallyIcon,\n} from \"../components/icons\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { distributeElements, Distribution } from \"../distribute\";\nimport { getNonDeletedElements } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { CODES, KEYS } from \"../keys\";\nimport { getSelectedElements, isSomeElementSelected } from \"../scene\";\nimport { AppState } from \"../types\";\nimport { arrayToMap, getShortcutKey } from \"../utils\";\nimport { register } from \"./register\";\n\nconst enableActionGroup = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => getSelectedElements(getNonDeletedElements(elements), appState).length > 1;\n\nconst distributeSelectedElements = (\n  elements: readonly ExcalidrawElement[],\n  appState: Readonly<AppState>,\n  distribution: Distribution,\n) => {\n  const selectedElements = getSelectedElements(\n    getNonDeletedElements(elements),\n    appState,\n  );\n\n  const updatedElements = distributeElements(selectedElements, distribution);\n\n  const updatedElementsMap = arrayToMap(updatedElements);\n\n  return elements.map(\n    (element) => updatedElementsMap.get(element.id) || element,\n  );\n};\n\nexport const distributeHorizontally = register({\n  name: \"distributeHorizontally\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: distributeSelectedElements(elements, appState, {\n        space: \"between\",\n        axis: \"x\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.H,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={DistributeHorizontallyIcon}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.distributeHorizontally\")} — ${getShortcutKey(\n        \"Alt+H\",\n      )}`}\n      aria-label={t(\"labels.distributeHorizontally\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n\nexport const distributeVertically = register({\n  name: \"distributeVertically\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      appState,\n      elements: distributeSelectedElements(elements, appState, {\n        space: \"between\",\n        axis: \"y\",\n      }),\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.V,\n  PanelComponent: ({ elements, appState, updateData }) => (\n    <ToolButton\n      hidden={!enableActionGroup(elements, appState)}\n      type=\"button\"\n      icon={DistributeVerticallyIcon}\n      onClick={() => updateData(null)}\n      title={`${t(\"labels.distributeVertically\")} — ${getShortcutKey(\"Alt+V\")}`}\n      aria-label={t(\"labels.distributeVertically\")}\n      visible={isSomeElementSelected(getNonDeletedElements(elements), appState)}\n    />\n  ),\n});\n","import { ExcalidrawElement } from \"./element/types\";\nimport { newElementWith } from \"./element/mutateElement\";\nimport { getMaximumGroups } from \"./groups\";\nimport { getCommonBoundingBox } from \"./element/bounds\";\n\nexport interface Distribution {\n  space: \"between\";\n  axis: \"x\" | \"y\";\n}\n\nexport const distributeElements = (\n  selectedElements: ExcalidrawElement[],\n  distribution: Distribution,\n): ExcalidrawElement[] => {\n  const [start, mid, end, extent] =\n    distribution.axis === \"x\"\n      ? ([\"minX\", \"midX\", \"maxX\", \"width\"] as const)\n      : ([\"minY\", \"midY\", \"maxY\", \"height\"] as const);\n\n  const bounds = getCommonBoundingBox(selectedElements);\n  const groups = getMaximumGroups(selectedElements)\n    .map((group) => [group, getCommonBoundingBox(group)] as const)\n    .sort((a, b) => a[1][mid] - b[1][mid]);\n\n  let span = 0;\n  for (const group of groups) {\n    span += group[1][extent];\n  }\n\n  const step = (bounds[extent] - span) / (groups.length - 1);\n\n  if (step < 0) {\n    // If we have a negative step, we'll need to distribute from centers\n    // rather than from gaps. Buckle up, this is a weird one.\n\n    // Get indices of boxes that define start and end of our bounding box\n    const index0 = groups.findIndex((g) => g[1][start] === bounds[start]);\n    const index1 = groups.findIndex((g) => g[1][end] === bounds[end]);\n\n    // Get our step, based on the distance between the center points of our\n    // start and end boxes\n    const step =\n      (groups[index1][1][mid] - groups[index0][1][mid]) / (groups.length - 1);\n\n    let pos = groups[index0][1][mid];\n\n    return groups.flatMap(([group, box], index) => {\n      const translation = {\n        x: 0,\n        y: 0,\n      };\n\n      // Don't move our start and end boxes\n      if (index !== index0 && index !== index1) {\n        pos += step;\n        translation[distribution.axis] = pos - box[mid];\n      }\n\n      return group.map((element) =>\n        newElementWith(element, {\n          x: element.x + translation.x,\n          y: element.y + translation.y,\n        }),\n      );\n    });\n  }\n\n  // Distribute from gaps\n\n  let pos = bounds[start];\n\n  return groups.flatMap(([group, box]) => {\n    const translation = {\n      x: 0,\n      y: 0,\n    };\n\n    translation[distribution.axis] = pos - box[start];\n\n    pos += step;\n    pos += box[extent];\n\n    return group.map((element) =>\n      newElementWith(element, {\n        x: element.x + translation.x,\n        y: element.y + translation.y,\n      }),\n    );\n  });\n};\n","import { register } from \"./register\";\nimport { getSelectedElements } from \"../scene\";\nimport { getNonDeletedElements } from \"../element\";\nimport { mutateElement } from \"../element/mutateElement\";\nimport { ExcalidrawElement, NonDeleted } from \"../element/types\";\nimport { normalizeAngle, resizeSingleElement } from \"../element/resizeElements\";\nimport { AppState } from \"../types\";\nimport { getTransformHandles } from \"../element/transformHandles\";\nimport { updateBoundElements } from \"../element/binding\";\nimport { arrayToMap } from \"../utils\";\nimport {\n  getElementAbsoluteCoords,\n  getElementPointsCoords,\n} from \"../element/bounds\";\nimport { isLinearElement } from \"../element/typeChecks\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { KEYS } from \"../keys\";\n\nconst enableActionFlipHorizontal = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  const eligibleElements = getSelectedElements(\n    getNonDeletedElements(elements),\n    appState,\n  );\n  return eligibleElements.length === 1 && eligibleElements[0].type !== \"text\";\n};\n\nconst enableActionFlipVertical = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  const eligibleElements = getSelectedElements(\n    getNonDeletedElements(elements),\n    appState,\n  );\n  return eligibleElements.length === 1;\n};\n\nexport const actionFlipHorizontal = register({\n  name: \"flipHorizontal\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      elements: flipSelectedElements(elements, appState, \"horizontal\"),\n      appState,\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) => event.shiftKey && event.code === \"KeyH\",\n  contextItemLabel: \"labels.flipHorizontal\",\n  predicate: (elements, appState) =>\n    enableActionFlipHorizontal(elements, appState),\n});\n\nexport const actionFlipVertical = register({\n  name: \"flipVertical\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    return {\n      elements: flipSelectedElements(elements, appState, \"vertical\"),\n      appState,\n      commitToHistory: true,\n    };\n  },\n  keyTest: (event) =>\n    event.shiftKey && event.code === \"KeyV\" && !event[KEYS.CTRL_OR_CMD],\n  contextItemLabel: \"labels.flipVertical\",\n  predicate: (elements, appState) =>\n    enableActionFlipVertical(elements, appState),\n});\n\nconst flipSelectedElements = (\n  elements: readonly ExcalidrawElement[],\n  appState: Readonly<AppState>,\n  flipDirection: \"horizontal\" | \"vertical\",\n) => {\n  const selectedElements = getSelectedElements(\n    getNonDeletedElements(elements),\n    appState,\n  );\n\n  // remove once we allow for groups of elements to be flipped\n  if (selectedElements.length > 1) {\n    return elements;\n  }\n\n  const updatedElements = flipElements(\n    selectedElements,\n    appState,\n    flipDirection,\n  );\n\n  const updatedElementsMap = arrayToMap(updatedElements);\n\n  return elements.map(\n    (element) => updatedElementsMap.get(element.id) || element,\n  );\n};\n\nconst flipElements = (\n  elements: NonDeleted<ExcalidrawElement>[],\n  appState: AppState,\n  flipDirection: \"horizontal\" | \"vertical\",\n): ExcalidrawElement[] => {\n  elements.forEach((element) => {\n    flipElement(element, appState);\n    // If vertical flip, rotate an extra 180\n    if (flipDirection === \"vertical\") {\n      rotateElement(element, Math.PI);\n    }\n  });\n  return elements;\n};\n\nconst flipElement = (\n  element: NonDeleted<ExcalidrawElement>,\n  appState: AppState,\n) => {\n  const originalX = element.x;\n  const originalY = element.y;\n  const width = element.width;\n  const height = element.height;\n  const originalAngle = normalizeAngle(element.angle);\n\n  // Rotate back to zero, if necessary\n  mutateElement(element, {\n    angle: normalizeAngle(0),\n  });\n  // Flip unrotated by pulling TransformHandle to opposite side\n  const transformHandles = getTransformHandles(element, appState.zoom);\n  let usingNWHandle = true;\n  let nHandle = transformHandles.nw;\n  if (!nHandle) {\n    // Use ne handle instead\n    usingNWHandle = false;\n    nHandle = transformHandles.ne;\n    if (!nHandle) {\n      mutateElement(element, {\n        angle: originalAngle,\n      });\n      return;\n    }\n  }\n\n  let finalOffsetX = 0;\n  if (isLinearElement(element) && element.points.length < 3) {\n    finalOffsetX =\n      element.points.reduce((max, point) => Math.max(max, point[0]), 0) * 2 -\n      element.width;\n  }\n\n  let initialPointsCoords;\n  if (isLinearElement(element)) {\n    initialPointsCoords = getElementPointsCoords(element, element.points);\n  }\n  const initialElementAbsoluteCoords = getElementAbsoluteCoords(element);\n\n  if (isLinearElement(element) && element.points.length < 3) {\n    for (let index = 1; index < element.points.length; index++) {\n      LinearElementEditor.movePoints(element, [\n        {\n          index,\n          point: [-element.points[index][0], element.points[index][1]],\n        },\n      ]);\n    }\n    LinearElementEditor.normalizePoints(element);\n  } else {\n    const elWidth = initialPointsCoords\n      ? initialPointsCoords[2] - initialPointsCoords[0]\n      : initialElementAbsoluteCoords[2] - initialElementAbsoluteCoords[0];\n\n    const startPoint = initialPointsCoords\n      ? [initialPointsCoords[0], initialPointsCoords[1]]\n      : [initialElementAbsoluteCoords[0], initialElementAbsoluteCoords[1]];\n\n    resizeSingleElement(\n      new Map().set(element.id, element),\n      false,\n      element,\n      usingNWHandle ? \"nw\" : \"ne\",\n      true,\n      usingNWHandle ? startPoint[0] + elWidth : startPoint[0] - elWidth,\n      startPoint[1],\n    );\n  }\n\n  // Rotate by (360 degrees - original angle)\n  let angle = normalizeAngle(2 * Math.PI - originalAngle);\n  if (angle < 0) {\n    // check, probably unnecessary\n    angle = normalizeAngle(angle + 2 * Math.PI);\n  }\n  mutateElement(element, {\n    angle,\n  });\n\n  // Move back to original spot to appear \"flipped in place\"\n  mutateElement(element, {\n    x: originalX + finalOffsetX,\n    y: originalY,\n    width,\n    height,\n  });\n\n  updateBoundElements(element);\n\n  if (initialPointsCoords && isLinearElement(element)) {\n    // Adjusting origin because when a beizer curve path exceeds min/max points it offsets the origin.\n    // There's still room for improvement since when the line roughness is > 1\n    // we still have a small offset of the origin when fliipping the element.\n    const finalPointsCoords = getElementPointsCoords(element, element.points);\n\n    const topLeftCoordsDiff = initialPointsCoords[0] - finalPointsCoords[0];\n    const topRightCoordDiff = initialPointsCoords[2] - finalPointsCoords[2];\n\n    const coordsDiff = topLeftCoordsDiff + topRightCoordDiff;\n\n    mutateElement(element, {\n      x: element.x + coordsDiff * 0.5,\n      y: element.y,\n      width,\n      height,\n    });\n  }\n};\n\nconst rotateElement = (element: ExcalidrawElement, rotationAngle: number) => {\n  const originalX = element.x;\n  const originalY = element.y;\n  let angle = normalizeAngle(element.angle + rotationAngle);\n  if (angle < 0) {\n    // check, probably unnecessary\n    angle = normalizeAngle(2 * Math.PI + angle);\n  }\n  mutateElement(element, {\n    angle,\n  });\n\n  // Move back to original spot\n  mutateElement(element, {\n    x: originalX,\n    y: originalY,\n  });\n};\n","import { CODES, KEYS } from \"../keys\";\nimport { register } from \"./register\";\nimport { GRID_SIZE } from \"../constants\";\nimport { AppState } from \"../types\";\n\nexport const actionToggleGridMode = register({\n  name: \"gridMode\",\n  viewMode: true,\n  trackEvent: {\n    category: \"canvas\",\n    predicate: (appState) => !appState.gridSize,\n  },\n  perform(elements, appState) {\n    return {\n      appState: {\n        ...appState,\n        gridSize: this.checked!(appState) ? null : GRID_SIZE,\n      },\n      commitToHistory: false,\n    };\n  },\n  checked: (appState: AppState) => appState.gridSize !== null,\n  predicate: (element, appState, props) => {\n    return typeof props.gridModeEnabled === \"undefined\";\n  },\n  contextItemLabel: \"labels.showGrid\",\n  keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.code === CODES.QUOTE,\n});\n","import { CODES, KEYS } from \"../keys\";\nimport { register } from \"./register\";\n\nexport const actionToggleZenMode = register({\n  name: \"zenMode\",\n  viewMode: true,\n  trackEvent: {\n    category: \"canvas\",\n    predicate: (appState) => !appState.zenModeEnabled,\n  },\n  perform(elements, appState) {\n    return {\n      appState: {\n        ...appState,\n        zenModeEnabled: !this.checked!(appState),\n      },\n      commitToHistory: false,\n    };\n  },\n  checked: (appState) => appState.zenModeEnabled,\n  predicate: (elements, appState, appProps) => {\n    return typeof appProps.zenModeEnabled === \"undefined\";\n  },\n  contextItemLabel: \"buttons.zenMode\",\n  keyTest: (event) =>\n    !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.Z,\n});\n","import { newElementWith } from \"../element/mutateElement\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { KEYS } from \"../keys\";\nimport { getSelectedElements } from \"../scene\";\nimport { arrayToMap } from \"../utils\";\nimport { register } from \"./register\";\n\nexport const actionToggleLock = register({\n  name: \"toggleLock\",\n  trackEvent: { category: \"element\" },\n  perform: (elements, appState) => {\n    const selectedElements = getSelectedElements(elements, appState, true);\n\n    if (!selectedElements.length) {\n      return false;\n    }\n\n    const operation = getOperation(selectedElements);\n    const selectedElementsMap = arrayToMap(selectedElements);\n    const lock = operation === \"lock\";\n    return {\n      elements: elements.map((element) => {\n        if (!selectedElementsMap.has(element.id)) {\n          return element;\n        }\n\n        return newElementWith(element, { locked: lock });\n      }),\n      appState: {\n        ...appState,\n        selectedLinearElement: lock ? null : appState.selectedLinearElement,\n      },\n      commitToHistory: true,\n    };\n  },\n  contextItemLabel: (elements, appState) => {\n    const selected = getSelectedElements(elements, appState, false);\n    if (selected.length === 1) {\n      return selected[0].locked\n        ? \"labels.elementLock.unlock\"\n        : \"labels.elementLock.lock\";\n    }\n\n    return getOperation(selected) === \"lock\"\n      ? \"labels.elementLock.lockAll\"\n      : \"labels.elementLock.unlockAll\";\n  },\n  keyTest: (event, appState, elements) => {\n    return (\n      event.key.toLocaleLowerCase() === KEYS.L &&\n      event[KEYS.CTRL_OR_CMD] &&\n      event.shiftKey &&\n      getSelectedElements(elements, appState, false).length > 0\n    );\n  },\n});\n\nconst getOperation = (\n  elements: readonly ExcalidrawElement[],\n): \"lock\" | \"unlock\" => (elements.some((el) => !el.locked) ? \"lock\" : \"unlock\");\n","import { getNonDeletedElements } from \"../element\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { isLinearElement } from \"../element/typeChecks\";\nimport { ExcalidrawLinearElement } from \"../element/types\";\nimport { getSelectedElements } from \"../scene\";\nimport { register } from \"./register\";\n\nexport const actionToggleLinearEditor = register({\n  name: \"toggleLinearEditor\",\n  trackEvent: {\n    category: \"element\",\n  },\n  predicate: (elements, appState) => {\n    const selectedElements = getSelectedElements(elements, appState);\n    if (selectedElements.length === 1 && isLinearElement(selectedElements[0])) {\n      return true;\n    }\n    return false;\n  },\n  perform(elements, appState, _, app) {\n    const selectedElement = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    )[0] as ExcalidrawLinearElement;\n\n    const editingLinearElement =\n      appState.editingLinearElement?.elementId === selectedElement.id\n        ? null\n        : new LinearElementEditor(selectedElement, app.scene);\n    return {\n      appState: {\n        ...appState,\n        editingLinearElement,\n      },\n      commitToHistory: false,\n    };\n  },\n  contextItemLabel: (elements, appState) => {\n    const selectedElement = getSelectedElements(\n      getNonDeletedElements(elements),\n      appState,\n      true,\n    )[0] as ExcalidrawLinearElement;\n    return appState.editingLinearElement?.elementId === selectedElement.id\n      ? \"labels.lineEditor.exit\"\n      : \"labels.lineEditor.edit\";\n  },\n});\n","import { Action } from \"./types\";\n\nexport let actions: readonly Action[] = [];\n\nexport const register = <T extends Action>(action: T) => {\n  actions = actions.concat(action);\n  return action as T & {\n    keyTest?: unknown extends T[\"keyTest\"] ? never : T[\"keyTest\"];\n  };\n};\n","import { isDarwin } from \"../constants\";\nimport { t } from \"../i18n\";\nimport { SubtypeOf } from \"../utility-types\";\nimport { getShortcutKey } from \"../utils\";\nimport { ActionName } from \"./types\";\n\nexport type ShortcutName =\n  | SubtypeOf<\n      ActionName,\n      | \"toggleTheme\"\n      | \"loadScene\"\n      | \"clearCanvas\"\n      | \"cut\"\n      | \"copy\"\n      | \"paste\"\n      | \"copyStyles\"\n      | \"pasteStyles\"\n      | \"selectAll\"\n      | \"deleteSelectedElements\"\n      | \"duplicateSelection\"\n      | \"sendBackward\"\n      | \"bringForward\"\n      | \"sendToBack\"\n      | \"bringToFront\"\n      | \"copyAsPng\"\n      | \"copyAsSvg\"\n      | \"group\"\n      | \"ungroup\"\n      | \"gridMode\"\n      | \"zenMode\"\n      | \"stats\"\n      | \"addToLibrary\"\n      | \"viewMode\"\n      | \"flipHorizontal\"\n      | \"flipVertical\"\n      | \"hyperlink\"\n      | \"toggleLock\"\n    >\n  | \"saveScene\"\n  | \"imageExport\";\n\nconst shortcutMap: Record<ShortcutName, string[]> = {\n  toggleTheme: [getShortcutKey(\"Shift+Alt+D\")],\n  saveScene: [getShortcutKey(\"CtrlOrCmd+S\")],\n  loadScene: [getShortcutKey(\"CtrlOrCmd+O\")],\n  clearCanvas: [getShortcutKey(\"CtrlOrCmd+Delete\")],\n  imageExport: [getShortcutKey(\"CtrlOrCmd+Shift+E\")],\n  cut: [getShortcutKey(\"CtrlOrCmd+X\")],\n  copy: [getShortcutKey(\"CtrlOrCmd+C\")],\n  paste: [getShortcutKey(\"CtrlOrCmd+V\")],\n  copyStyles: [getShortcutKey(\"CtrlOrCmd+Alt+C\")],\n  pasteStyles: [getShortcutKey(\"CtrlOrCmd+Alt+V\")],\n  selectAll: [getShortcutKey(\"CtrlOrCmd+A\")],\n  deleteSelectedElements: [getShortcutKey(\"Delete\")],\n  duplicateSelection: [\n    getShortcutKey(\"CtrlOrCmd+D\"),\n    getShortcutKey(`Alt+${t(\"helpDialog.drag\")}`),\n  ],\n  sendBackward: [getShortcutKey(\"CtrlOrCmd+[\")],\n  bringForward: [getShortcutKey(\"CtrlOrCmd+]\")],\n  sendToBack: [\n    isDarwin\n      ? getShortcutKey(\"CtrlOrCmd+Alt+[\")\n      : getShortcutKey(\"CtrlOrCmd+Shift+[\"),\n  ],\n  bringToFront: [\n    isDarwin\n      ? getShortcutKey(\"CtrlOrCmd+Alt+]\")\n      : getShortcutKey(\"CtrlOrCmd+Shift+]\"),\n  ],\n  copyAsPng: [getShortcutKey(\"Shift+Alt+C\")],\n  copyAsSvg: [],\n  group: [getShortcutKey(\"CtrlOrCmd+G\")],\n  ungroup: [getShortcutKey(\"CtrlOrCmd+Shift+G\")],\n  gridMode: [getShortcutKey(\"CtrlOrCmd+'\")],\n  zenMode: [getShortcutKey(\"Alt+Z\")],\n  stats: [getShortcutKey(\"Alt+/\")],\n  addToLibrary: [],\n  flipHorizontal: [getShortcutKey(\"Shift+H\")],\n  flipVertical: [getShortcutKey(\"Shift+V\")],\n  viewMode: [getShortcutKey(\"Alt+R\")],\n  hyperlink: [getShortcutKey(\"CtrlOrCmd+K\")],\n  toggleLock: [getShortcutKey(\"CtrlOrCmd+Shift+L\")],\n};\n\nexport const getShortcutFromShortcutName = (name: ShortcutName) => {\n  const shortcuts = shortcutMap[name];\n  // if multiple shortcuts available, take the first one\n  return shortcuts && shortcuts.length > 0 ? shortcuts[0] : \"\";\n};\n","export const trackEvent =\n  typeof process !== \"undefined\" &&\n  process.env?.REACT_APP_GOOGLE_ANALYTICS_ID &&\n  typeof window !== \"undefined\" &&\n  window.gtag\n    ? (category: string, action: string, label?: string, value?: number) => {\n        try {\n          window.gtag(\"event\", action, {\n            event_category: category,\n            event_label: label,\n            value,\n          });\n        } catch (error) {\n          console.error(\"error logging to ga\", error);\n        }\n      }\n    : typeof process !== \"undefined\" && process.env?.JEST_WORKER_ID\n    ? (category: string, action: string, label?: string, value?: number) => {}\n    : (category: string, action: string, label?: string, value?: number) => {\n        // Uncomment the next line to track locally\n        // console.log(\"Track Event\", { category, action, label, value });\n      };\n","import oc from \"open-color\";\nimport {\n  DEFAULT_FONT_FAMILY,\n  DEFAULT_FONT_SIZE,\n  DEFAULT_TEXT_ALIGN,\n  EXPORT_SCALES,\n  THEME,\n} from \"./constants\";\nimport { t } from \"./i18n\";\nimport { AppState, NormalizedZoomValue } from \"./types\";\nimport { getDateTime } from \"./utils\";\n\nconst defaultExportScale = EXPORT_SCALES.includes(devicePixelRatio)\n  ? devicePixelRatio\n  : 1;\n\nexport const getDefaultAppState = (): Omit<\n  AppState,\n  \"offsetTop\" | \"offsetLeft\" | \"width\" | \"height\"\n> => {\n  return {\n    showWelcomeScreen: false,\n    theme: THEME.LIGHT,\n    collaborators: new Map(),\n    currentChartType: \"bar\",\n    currentItemBackgroundColor: \"transparent\",\n    currentItemEndArrowhead: \"arrow\",\n    currentItemFillStyle: \"hachure\",\n    currentItemFontFamily: DEFAULT_FONT_FAMILY,\n    currentItemFontSize: DEFAULT_FONT_SIZE,\n    currentItemOpacity: 100,\n    currentItemRoughness: 1,\n    currentItemStartArrowhead: null,\n    currentItemStrokeColor: oc.black,\n    currentItemRoundness: \"round\",\n    currentItemStrokeStyle: \"solid\",\n    currentItemStrokeWidth: 1,\n    currentItemTextAlign: DEFAULT_TEXT_ALIGN,\n    cursorButton: \"up\",\n    draggingElement: null,\n    editingElement: null,\n    editingGroupId: null,\n    editingLinearElement: null,\n    activeTool: {\n      type: \"selection\",\n      customType: null,\n      locked: false,\n      lastActiveTool: null,\n    },\n    penMode: false,\n    penDetected: false,\n    errorMessage: null,\n    exportBackground: true,\n    exportScale: defaultExportScale,\n    exportEmbedScene: false,\n    exportWithDarkMode: false,\n    fileHandle: null,\n    gridSize: null,\n    isBindingEnabled: true,\n    isSidebarDocked: false,\n    isLoading: false,\n    isResizing: false,\n    isRotating: false,\n    lastPointerDownWith: \"mouse\",\n    multiElement: null,\n    name: `${t(\"labels.untitled\")}-${getDateTime()}`,\n    contextMenu: null,\n    openMenu: null,\n    openPopup: null,\n    openSidebar: null,\n    openDialog: null,\n    pasteDialog: { shown: false, data: null },\n    previousSelectedElementIds: {},\n    resizingElement: null,\n    scrolledOutside: false,\n    scrollX: 0,\n    scrollY: 0,\n    selectedElementIds: {},\n    selectedGroupIds: {},\n    selectionElement: null,\n    shouldCacheIgnoreZoom: false,\n    showStats: false,\n    startBoundElement: null,\n    suggestedBindings: [],\n    toast: null,\n    viewBackgroundColor: oc.white,\n    zenModeEnabled: false,\n    zoom: {\n      value: 1 as NormalizedZoomValue,\n    },\n    viewModeEnabled: false,\n    pendingImageElementId: null,\n    showHyperlinkPopup: false,\n    selectedLinearElement: null,\n  };\n};\n\n/**\n * Config containing all AppState keys. Used to determine whether given state\n *  prop should be stripped when exporting to given storage type.\n */\nconst APP_STATE_STORAGE_CONF = (<\n  Values extends {\n    /** whether to keep when storing to browser storage (localStorage/IDB) */\n    browser: boolean;\n    /** whether to keep when exporting to file/database */\n    export: boolean;\n    /** server (shareLink/collab/...) */\n    server: boolean;\n  },\n  T extends Record<keyof AppState, Values>,\n>(config: { [K in keyof T]: K extends keyof AppState ? T[K] : never }) =>\n  config)({\n  showWelcomeScreen: { browser: true, export: false, server: false },\n  theme: { browser: true, export: false, server: false },\n  collaborators: { browser: false, export: false, server: false },\n  currentChartType: { browser: true, export: false, server: false },\n  currentItemBackgroundColor: { browser: true, export: false, server: false },\n  currentItemEndArrowhead: { browser: true, export: false, server: false },\n  currentItemFillStyle: { browser: true, export: false, server: false },\n  currentItemFontFamily: { browser: true, export: false, server: false },\n  currentItemFontSize: { browser: true, export: false, server: false },\n  currentItemRoundness: {\n    browser: true,\n    export: false,\n    server: false,\n  },\n  currentItemOpacity: { browser: true, export: false, server: false },\n  currentItemRoughness: { browser: true, export: false, server: false },\n  currentItemStartArrowhead: { browser: true, export: false, server: false },\n  currentItemStrokeColor: { browser: true, export: false, server: false },\n  currentItemStrokeStyle: { browser: true, export: false, server: false },\n  currentItemStrokeWidth: { browser: true, export: false, server: false },\n  currentItemTextAlign: { browser: true, export: false, server: false },\n  cursorButton: { browser: true, export: false, server: false },\n  draggingElement: { browser: false, export: false, server: false },\n  editingElement: { browser: false, export: false, server: false },\n  editingGroupId: { browser: true, export: false, server: false },\n  editingLinearElement: { browser: false, export: false, server: false },\n  activeTool: { browser: true, export: false, server: false },\n  penMode: { browser: true, export: false, server: false },\n  penDetected: { browser: true, export: false, server: false },\n  errorMessage: { browser: false, export: false, server: false },\n  exportBackground: { browser: true, export: false, server: false },\n  exportEmbedScene: { browser: true, export: false, server: false },\n  exportScale: { browser: true, export: false, server: false },\n  exportWithDarkMode: { browser: true, export: false, server: false },\n  fileHandle: { browser: false, export: false, server: false },\n  gridSize: { browser: true, export: true, server: true },\n  height: { browser: false, export: false, server: false },\n  isBindingEnabled: { browser: false, export: false, server: false },\n  isSidebarDocked: { browser: true, export: false, server: false },\n  isLoading: { browser: false, export: false, server: false },\n  isResizing: { browser: false, export: false, server: false },\n  isRotating: { browser: false, export: false, server: false },\n  lastPointerDownWith: { browser: true, export: false, server: false },\n  multiElement: { browser: false, export: false, server: false },\n  name: { browser: true, export: false, server: false },\n  offsetLeft: { browser: false, export: false, server: false },\n  offsetTop: { browser: false, export: false, server: false },\n  contextMenu: { browser: false, export: false, server: false },\n  openMenu: { browser: true, export: false, server: false },\n  openPopup: { browser: false, export: false, server: false },\n  openSidebar: { browser: true, export: false, server: false },\n  openDialog: { browser: false, export: false, server: false },\n  pasteDialog: { browser: false, export: false, server: false },\n  previousSelectedElementIds: { browser: true, export: false, server: false },\n  resizingElement: { browser: false, export: false, server: false },\n  scrolledOutside: { browser: true, export: false, server: false },\n  scrollX: { browser: true, export: false, server: false },\n  scrollY: { browser: true, export: false, server: false },\n  selectedElementIds: { browser: true, export: false, server: false },\n  selectedGroupIds: { browser: true, export: false, server: false },\n  selectionElement: { browser: false, export: false, server: false },\n  shouldCacheIgnoreZoom: { browser: true, export: false, server: false },\n  showStats: { browser: true, export: false, server: false },\n  startBoundElement: { browser: false, export: false, server: false },\n  suggestedBindings: { browser: false, export: false, server: false },\n  toast: { browser: false, export: false, server: false },\n  viewBackgroundColor: { browser: true, export: true, server: true },\n  width: { browser: false, export: false, server: false },\n  zenModeEnabled: { browser: true, export: false, server: false },\n  zoom: { browser: true, export: false, server: false },\n  viewModeEnabled: { browser: false, export: false, server: false },\n  pendingImageElementId: { browser: false, export: false, server: false },\n  showHyperlinkPopup: { browser: false, export: false, server: false },\n  selectedLinearElement: { browser: true, export: false, server: false },\n});\n\nconst _clearAppStateForStorage = <\n  ExportType extends \"export\" | \"browser\" | \"server\",\n>(\n  appState: Partial<AppState>,\n  exportType: ExportType,\n) => {\n  type ExportableKeys = {\n    [K in keyof typeof APP_STATE_STORAGE_CONF]: typeof APP_STATE_STORAGE_CONF[K][ExportType] extends true\n      ? K\n      : never;\n  }[keyof typeof APP_STATE_STORAGE_CONF];\n  const stateForExport = {} as { [K in ExportableKeys]?: typeof appState[K] };\n  for (const key of Object.keys(appState) as (keyof typeof appState)[]) {\n    const propConfig = APP_STATE_STORAGE_CONF[key];\n    if (propConfig?.[exportType]) {\n      const nextValue = appState[key];\n\n      // https://github.com/microsoft/TypeScript/issues/31445\n      (stateForExport as any)[key] = nextValue;\n    }\n  }\n  return stateForExport;\n};\n\nexport const clearAppStateForLocalStorage = (appState: Partial<AppState>) => {\n  return _clearAppStateForStorage(appState, \"browser\");\n};\n\nexport const cleanAppStateForExport = (appState: Partial<AppState>) => {\n  return _clearAppStateForStorage(appState, \"export\");\n};\n\nexport const clearAppStateForDatabase = (appState: Partial<AppState>) => {\n  return _clearAppStateForStorage(appState, \"server\");\n};\n\nexport const isEraserActive = ({\n  activeTool,\n}: {\n  activeTool: AppState[\"activeTool\"];\n}) => activeTool.type === \"eraser\";\n\nexport const isHandToolActive = ({\n  activeTool,\n}: {\n  activeTool: AppState[\"activeTool\"];\n}) => {\n  return activeTool.type === \"hand\";\n};\n","import colors from \"./colors\";\nimport {\n  DEFAULT_FONT_FAMILY,\n  DEFAULT_FONT_SIZE,\n  ENV,\n  VERTICAL_ALIGN,\n} from \"./constants\";\nimport { newElement, newLinearElement, newTextElement } from \"./element\";\nimport { NonDeletedExcalidrawElement } from \"./element/types\";\nimport { randomId } from \"./random\";\n\nexport type ChartElements = readonly NonDeletedExcalidrawElement[];\n\nconst BAR_WIDTH = 32;\nconst BAR_GAP = 12;\nconst BAR_HEIGHT = 256;\nconst GRID_OPACITY = 50;\n\nexport interface Spreadsheet {\n  title: string | null;\n  labels: string[] | null;\n  values: number[];\n}\n\nexport const NOT_SPREADSHEET = \"NOT_SPREADSHEET\";\nexport const VALID_SPREADSHEET = \"VALID_SPREADSHEET\";\n\ntype ParseSpreadsheetResult =\n  | { type: typeof NOT_SPREADSHEET; reason: string }\n  | { type: typeof VALID_SPREADSHEET; spreadsheet: Spreadsheet };\n\n/**\n * @private exported for testing\n */\nexport const tryParseNumber = (s: string): number | null => {\n  const match = /^([-+]?)[$€£¥₩]?([-+]?)([\\d.,]+)[%]?$/.exec(s);\n  if (!match) {\n    return null;\n  }\n  return parseFloat(`${(match[1] || match[2]) + match[3]}`.replace(/,/g, \"\"));\n};\n\nconst isNumericColumn = (lines: string[][], columnIndex: number) =>\n  lines.slice(1).every((line) => tryParseNumber(line[columnIndex]) !== null);\n\n/**\n * @private exported for testing\n */\nexport const tryParseCells = (cells: string[][]): ParseSpreadsheetResult => {\n  const numCols = cells[0].length;\n\n  if (numCols > 2) {\n    return { type: NOT_SPREADSHEET, reason: \"More than 2 columns\" };\n  }\n\n  if (numCols === 1) {\n    if (!isNumericColumn(cells, 0)) {\n      return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\n    }\n\n    const hasHeader = tryParseNumber(cells[0][0]) === null;\n    const values = (hasHeader ? cells.slice(1) : cells).map((line) =>\n      tryParseNumber(line[0]),\n    );\n\n    if (values.length < 2) {\n      return { type: NOT_SPREADSHEET, reason: \"Less than two rows\" };\n    }\n\n    return {\n      type: VALID_SPREADSHEET,\n      spreadsheet: {\n        title: hasHeader ? cells[0][0] : null,\n        labels: null,\n        values: values as number[],\n      },\n    };\n  }\n\n  const labelColumnNumeric = isNumericColumn(cells, 0);\n  const valueColumnNumeric = isNumericColumn(cells, 1);\n\n  if (!labelColumnNumeric && !valueColumnNumeric) {\n    return { type: NOT_SPREADSHEET, reason: \"Value is not numeric\" };\n  }\n\n  const [labelColumnIndex, valueColumnIndex] = valueColumnNumeric\n    ? [0, 1]\n    : [1, 0];\n  const hasHeader = tryParseNumber(cells[0][valueColumnIndex]) === null;\n  const rows = hasHeader ? cells.slice(1) : cells;\n\n  if (rows.length < 2) {\n    return { type: NOT_SPREADSHEET, reason: \"Less than 2 rows\" };\n  }\n\n  return {\n    type: VALID_SPREADSHEET,\n    spreadsheet: {\n      title: hasHeader ? cells[0][valueColumnIndex] : null,\n      labels: rows.map((row) => row[labelColumnIndex]),\n      values: rows.map((row) => tryParseNumber(row[valueColumnIndex])!),\n    },\n  };\n};\n\nconst transposeCells = (cells: string[][]) => {\n  const nextCells: string[][] = [];\n  for (let col = 0; col < cells[0].length; col++) {\n    const nextCellRow: string[] = [];\n    for (let row = 0; row < cells.length; row++) {\n      nextCellRow.push(cells[row][col]);\n    }\n    nextCells.push(nextCellRow);\n  }\n  return nextCells;\n};\n\nexport const tryParseSpreadsheet = (text: string): ParseSpreadsheetResult => {\n  // Copy/paste from excel, spreadsheets, tsv, csv.\n  // For now we only accept 2 columns with an optional header\n\n  // Check for tab separated values\n  let lines = text\n    .trim()\n    .split(\"\\n\")\n    .map((line) => line.trim().split(\"\\t\"));\n\n  // Check for comma separated files\n  if (lines.length && lines[0].length !== 2) {\n    lines = text\n      .trim()\n      .split(\"\\n\")\n      .map((line) => line.trim().split(\",\"));\n  }\n\n  if (lines.length === 0) {\n    return { type: NOT_SPREADSHEET, reason: \"No values\" };\n  }\n\n  const numColsFirstLine = lines[0].length;\n  const isSpreadsheet = lines.every((line) => line.length === numColsFirstLine);\n\n  if (!isSpreadsheet) {\n    return {\n      type: NOT_SPREADSHEET,\n      reason: \"All rows don't have same number of columns\",\n    };\n  }\n\n  const result = tryParseCells(lines);\n  if (result.type !== VALID_SPREADSHEET) {\n    const transposedResults = tryParseCells(transposeCells(lines));\n    if (transposedResults.type === VALID_SPREADSHEET) {\n      return transposedResults;\n    }\n  }\n  return result;\n};\n\nconst bgColors = colors.elementBackground.slice(\n  2,\n  colors.elementBackground.length,\n);\n\n// Put all the common properties here so when the whole chart is selected\n// the properties dialog shows the correct selected values\nconst commonProps = {\n  fillStyle: \"hachure\",\n  fontFamily: DEFAULT_FONT_FAMILY,\n  fontSize: DEFAULT_FONT_SIZE,\n  opacity: 100,\n  roughness: 1,\n  strokeColor: colors.elementStroke[0],\n  roundness: null,\n  strokeStyle: \"solid\",\n  strokeWidth: 1,\n  verticalAlign: VERTICAL_ALIGN.MIDDLE,\n  locked: false,\n} as const;\n\nconst getChartDimentions = (spreadsheet: Spreadsheet) => {\n  const chartWidth =\n    (BAR_WIDTH + BAR_GAP) * spreadsheet.values.length + BAR_GAP;\n  const chartHeight = BAR_HEIGHT + BAR_GAP * 2;\n  return { chartWidth, chartHeight };\n};\n\nconst chartXLabels = (\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n  groupId: string,\n  backgroundColor: string,\n): ChartElements => {\n  return (\n    spreadsheet.labels?.map((label, index) => {\n      return newTextElement({\n        groupIds: [groupId],\n        backgroundColor,\n        ...commonProps,\n        text: label.length > 8 ? `${label.slice(0, 5)}...` : label,\n        x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP * 2,\n        y: y + BAR_GAP / 2,\n        width: BAR_WIDTH,\n        angle: 5.87,\n        fontSize: 16,\n        textAlign: \"center\",\n        verticalAlign: \"top\",\n      });\n    }) || []\n  );\n};\n\nconst chartYLabels = (\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n  groupId: string,\n  backgroundColor: string,\n): ChartElements => {\n  const minYLabel = newTextElement({\n    groupIds: [groupId],\n    backgroundColor,\n    ...commonProps,\n    x: x - BAR_GAP,\n    y: y - BAR_GAP,\n    text: \"0\",\n    textAlign: \"right\",\n  });\n\n  const maxYLabel = newTextElement({\n    groupIds: [groupId],\n    backgroundColor,\n    ...commonProps,\n    x: x - BAR_GAP,\n    y: y - BAR_HEIGHT - minYLabel.height / 2,\n    text: Math.max(...spreadsheet.values).toLocaleString(),\n    textAlign: \"right\",\n  });\n\n  return [minYLabel, maxYLabel];\n};\n\nconst chartLines = (\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n  groupId: string,\n  backgroundColor: string,\n): ChartElements => {\n  const { chartWidth, chartHeight } = getChartDimentions(spreadsheet);\n  const xLine = newLinearElement({\n    backgroundColor,\n    groupIds: [groupId],\n    ...commonProps,\n    type: \"line\",\n    x,\n    y,\n    startArrowhead: null,\n    endArrowhead: null,\n    width: chartWidth,\n    points: [\n      [0, 0],\n      [chartWidth, 0],\n    ],\n  });\n\n  const yLine = newLinearElement({\n    backgroundColor,\n    groupIds: [groupId],\n    ...commonProps,\n    type: \"line\",\n    x,\n    y,\n    startArrowhead: null,\n    endArrowhead: null,\n    height: chartHeight,\n    points: [\n      [0, 0],\n      [0, -chartHeight],\n    ],\n  });\n\n  const maxLine = newLinearElement({\n    backgroundColor,\n    groupIds: [groupId],\n    ...commonProps,\n    type: \"line\",\n    x,\n    y: y - BAR_HEIGHT - BAR_GAP,\n    startArrowhead: null,\n    endArrowhead: null,\n    strokeStyle: \"dotted\",\n    width: chartWidth,\n    opacity: GRID_OPACITY,\n    points: [\n      [0, 0],\n      [chartWidth, 0],\n    ],\n  });\n\n  return [xLine, yLine, maxLine];\n};\n\n// For the maths behind it https://excalidraw.com/#json=6320864370884608,O_5xfD-Agh32tytHpRJx1g\nconst chartBaseElements = (\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n  groupId: string,\n  backgroundColor: string,\n  debug?: boolean,\n): ChartElements => {\n  const { chartWidth, chartHeight } = getChartDimentions(spreadsheet);\n\n  const title = spreadsheet.title\n    ? newTextElement({\n        backgroundColor,\n        groupIds: [groupId],\n        ...commonProps,\n        text: spreadsheet.title,\n        x: x + chartWidth / 2,\n        y: y - BAR_HEIGHT - BAR_GAP * 2 - DEFAULT_FONT_SIZE,\n        roundness: null,\n        strokeStyle: \"solid\",\n        textAlign: \"center\",\n      })\n    : null;\n\n  const debugRect = debug\n    ? newElement({\n        backgroundColor,\n        groupIds: [groupId],\n        ...commonProps,\n        type: \"rectangle\",\n        x,\n        y: y - chartHeight,\n        width: chartWidth,\n        height: chartHeight,\n        strokeColor: colors.elementStroke[0],\n        fillStyle: \"solid\",\n        opacity: 6,\n      })\n    : null;\n\n  return [\n    ...(debugRect ? [debugRect] : []),\n    ...(title ? [title] : []),\n    ...chartXLabels(spreadsheet, x, y, groupId, backgroundColor),\n    ...chartYLabels(spreadsheet, x, y, groupId, backgroundColor),\n    ...chartLines(spreadsheet, x, y, groupId, backgroundColor),\n  ];\n};\n\nconst chartTypeBar = (\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n): ChartElements => {\n  const max = Math.max(...spreadsheet.values);\n  const groupId = randomId();\n  const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\n\n  const bars = spreadsheet.values.map((value, index) => {\n    const barHeight = (value / max) * BAR_HEIGHT;\n    return newElement({\n      backgroundColor,\n      groupIds: [groupId],\n      ...commonProps,\n      type: \"rectangle\",\n      x: x + index * (BAR_WIDTH + BAR_GAP) + BAR_GAP,\n      y: y - barHeight - BAR_GAP,\n      width: BAR_WIDTH,\n      height: barHeight,\n    });\n  });\n\n  return [\n    ...bars,\n    ...chartBaseElements(\n      spreadsheet,\n      x,\n      y,\n      groupId,\n      backgroundColor,\n      process.env.NODE_ENV === ENV.DEVELOPMENT,\n    ),\n  ];\n};\n\nconst chartTypeLine = (\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n): ChartElements => {\n  const max = Math.max(...spreadsheet.values);\n  const groupId = randomId();\n  const backgroundColor = bgColors[Math.floor(Math.random() * bgColors.length)];\n\n  let index = 0;\n  const points = [];\n  for (const value of spreadsheet.values) {\n    const cx = index * (BAR_WIDTH + BAR_GAP);\n    const cy = -(value / max) * BAR_HEIGHT;\n    points.push([cx, cy]);\n    index++;\n  }\n\n  const maxX = Math.max(...points.map((element) => element[0]));\n  const maxY = Math.max(...points.map((element) => element[1]));\n  const minX = Math.min(...points.map((element) => element[0]));\n  const minY = Math.min(...points.map((element) => element[1]));\n\n  const line = newLinearElement({\n    backgroundColor,\n    groupIds: [groupId],\n    ...commonProps,\n    type: \"line\",\n    x: x + BAR_GAP + BAR_WIDTH / 2,\n    y: y - BAR_GAP,\n    startArrowhead: null,\n    endArrowhead: null,\n    height: maxY - minY,\n    width: maxX - minX,\n    strokeWidth: 2,\n    points: points as any,\n  });\n\n  const dots = spreadsheet.values.map((value, index) => {\n    const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\n    const cy = -(value / max) * BAR_HEIGHT + BAR_GAP / 2;\n    return newElement({\n      backgroundColor,\n      groupIds: [groupId],\n      ...commonProps,\n      fillStyle: \"solid\",\n      strokeWidth: 2,\n      type: \"ellipse\",\n      x: x + cx + BAR_WIDTH / 2,\n      y: y + cy - BAR_GAP * 2,\n      width: BAR_GAP,\n      height: BAR_GAP,\n    });\n  });\n\n  const lines = spreadsheet.values.map((value, index) => {\n    const cx = index * (BAR_WIDTH + BAR_GAP) + BAR_GAP / 2;\n    const cy = (value / max) * BAR_HEIGHT + BAR_GAP / 2 + BAR_GAP;\n    return newLinearElement({\n      backgroundColor,\n      groupIds: [groupId],\n      ...commonProps,\n      type: \"line\",\n      x: x + cx + BAR_WIDTH / 2 + BAR_GAP / 2,\n      y: y - cy,\n      startArrowhead: null,\n      endArrowhead: null,\n      height: cy,\n      strokeStyle: \"dotted\",\n      opacity: GRID_OPACITY,\n      points: [\n        [0, 0],\n        [0, cy],\n      ],\n    });\n  });\n\n  return [\n    ...chartBaseElements(\n      spreadsheet,\n      x,\n      y,\n      groupId,\n      backgroundColor,\n      process.env.NODE_ENV === ENV.DEVELOPMENT,\n    ),\n    line,\n    ...lines,\n    ...dots,\n  ];\n};\n\nexport const renderSpreadsheet = (\n  chartType: string,\n  spreadsheet: Spreadsheet,\n  x: number,\n  y: number,\n): ChartElements => {\n  if (chartType === \"line\") {\n    return chartTypeLine(spreadsheet, x, y);\n  }\n  return chartTypeBar(spreadsheet, x, y);\n};\n","import colors from \"./colors\";\nimport { AppState } from \"./types\";\n\nexport const getClientColors = (clientId: string, appState: AppState) => {\n  if (appState?.collaborators) {\n    const currentUser = appState.collaborators.get(clientId);\n    if (currentUser?.color) {\n      return currentUser.color;\n    }\n  }\n  // Naive way of getting an integer out of the clientId\n  const sum = clientId.split(\"\").reduce((a, str) => a + str.charCodeAt(0), 0);\n\n  // Skip transparent & gray colors\n  const backgrounds = colors.elementBackground.slice(3);\n  const strokes = colors.elementStroke.slice(3);\n  return {\n    background: backgrounds[sum % backgrounds.length],\n    stroke: strokes[sum % strokes.length],\n  };\n};\n\nexport const getClientInitials = (userName?: string | null) => {\n  if (!userName?.trim()) {\n    return \"?\";\n  }\n  return userName.trim()[0].toUpperCase();\n};\n","import {\n  ExcalidrawElement,\n  NonDeletedExcalidrawElement,\n} from \"./element/types\";\nimport { AppState, BinaryFiles } from \"./types\";\nimport { SVG_EXPORT_TAG } from \"./scene/export\";\nimport { tryParseSpreadsheet, Spreadsheet, VALID_SPREADSHEET } from \"./charts\";\nimport { EXPORT_DATA_TYPES, MIME_TYPES } from \"./constants\";\nimport { isInitializedImageElement } from \"./element/typeChecks\";\nimport { isPromiseLike } from \"./utils\";\n\ntype ElementsClipboard = {\n  type: typeof EXPORT_DATA_TYPES.excalidrawClipboard;\n  elements: readonly NonDeletedExcalidrawElement[];\n  files: BinaryFiles | undefined;\n};\n\nexport interface ClipboardData {\n  spreadsheet?: Spreadsheet;\n  elements?: readonly ExcalidrawElement[];\n  files?: BinaryFiles;\n  text?: string;\n  errorMessage?: string;\n}\n\nlet CLIPBOARD = \"\";\nlet PREFER_APP_CLIPBOARD = false;\n\nexport const probablySupportsClipboardReadText =\n  \"clipboard\" in navigator && \"readText\" in navigator.clipboard;\n\nexport const probablySupportsClipboardWriteText =\n  \"clipboard\" in navigator && \"writeText\" in navigator.clipboard;\n\nexport const probablySupportsClipboardBlob =\n  \"clipboard\" in navigator &&\n  \"write\" in navigator.clipboard &&\n  \"ClipboardItem\" in window &&\n  \"toBlob\" in HTMLCanvasElement.prototype;\n\nconst clipboardContainsElements = (\n  contents: any,\n): contents is { elements: ExcalidrawElement[]; files?: BinaryFiles } => {\n  if (\n    [\n      EXPORT_DATA_TYPES.excalidraw,\n      EXPORT_DATA_TYPES.excalidrawClipboard,\n    ].includes(contents?.type) &&\n    Array.isArray(contents.elements)\n  ) {\n    return true;\n  }\n  return false;\n};\n\nexport const copyToClipboard = async (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles | null,\n) => {\n  // select binded text elements when copying\n  const contents: ElementsClipboard = {\n    type: EXPORT_DATA_TYPES.excalidrawClipboard,\n    elements,\n    files: files\n      ? elements.reduce((acc, element) => {\n          if (isInitializedImageElement(element) && files[element.fileId]) {\n            acc[element.fileId] = files[element.fileId];\n          }\n          return acc;\n        }, {} as BinaryFiles)\n      : undefined,\n  };\n  const json = JSON.stringify(contents);\n  CLIPBOARD = json;\n  try {\n    PREFER_APP_CLIPBOARD = false;\n    await copyTextToSystemClipboard(json);\n  } catch (error: any) {\n    PREFER_APP_CLIPBOARD = true;\n    console.error(error);\n  }\n};\n\nconst getAppClipboard = (): Partial<ElementsClipboard> => {\n  if (!CLIPBOARD) {\n    return {};\n  }\n\n  try {\n    return JSON.parse(CLIPBOARD);\n  } catch (error: any) {\n    console.error(error);\n    return {};\n  }\n};\n\nconst parsePotentialSpreadsheet = (\n  text: string,\n): { spreadsheet: Spreadsheet } | { errorMessage: string } | null => {\n  const result = tryParseSpreadsheet(text);\n  if (result.type === VALID_SPREADSHEET) {\n    return { spreadsheet: result.spreadsheet };\n  }\n  return null;\n};\n\n/**\n * Retrieves content from system clipboard (either from ClipboardEvent or\n *  via async clipboard API if supported)\n */\nexport const getSystemClipboard = async (\n  event: ClipboardEvent | null,\n): Promise<string> => {\n  try {\n    const text = event\n      ? event.clipboardData?.getData(\"text/plain\")\n      : probablySupportsClipboardReadText &&\n        (await navigator.clipboard.readText());\n\n    return (text || \"\").trim();\n  } catch {\n    return \"\";\n  }\n};\n\n/**\n * Attempts to parse clipboard. Prefers system clipboard.\n */\nexport const parseClipboard = async (\n  event: ClipboardEvent | null,\n  isPlainPaste = false,\n): Promise<ClipboardData> => {\n  const systemClipboard = await getSystemClipboard(event);\n\n  // if system clipboard empty, couldn't be resolved, or contains previously\n  // copied excalidraw scene as SVG, fall back to previously copied excalidraw\n  // elements\n  if (\n    !systemClipboard ||\n    (!isPlainPaste && systemClipboard.includes(SVG_EXPORT_TAG))\n  ) {\n    return getAppClipboard();\n  }\n\n  // if system clipboard contains spreadsheet, use it even though it's\n  // technically possible it's staler than in-app clipboard\n  const spreadsheetResult =\n    !isPlainPaste && parsePotentialSpreadsheet(systemClipboard);\n\n  if (spreadsheetResult) {\n    return spreadsheetResult;\n  }\n\n  const appClipboardData = getAppClipboard();\n\n  try {\n    const systemClipboardData = JSON.parse(systemClipboard);\n    if (clipboardContainsElements(systemClipboardData)) {\n      return {\n        elements: systemClipboardData.elements,\n        files: systemClipboardData.files,\n        text: isPlainPaste\n          ? JSON.stringify(systemClipboardData.elements, null, 2)\n          : undefined,\n      };\n    }\n  } catch (e) {}\n  // system clipboard doesn't contain excalidraw elements → return plaintext\n  // unless we set a flag to prefer in-app clipboard because browser didn't\n  // support storing to system clipboard on copy\n  return PREFER_APP_CLIPBOARD && appClipboardData.elements\n    ? {\n        ...appClipboardData,\n        text: isPlainPaste\n          ? JSON.stringify(appClipboardData.elements, null, 2)\n          : undefined,\n      }\n    : { text: systemClipboard };\n};\n\nexport const copyBlobToClipboardAsPng = async (blob: Blob | Promise<Blob>) => {\n  try {\n    // in Safari so far we need to construct the ClipboardItem synchronously\n    // (i.e. in the same tick) otherwise browser will complain for lack of\n    // user intent. Using a Promise ClipboardItem constructor solves this.\n    // https://bugs.webkit.org/show_bug.cgi?id=222262\n    //\n    // Note that Firefox (and potentially others) seems to support Promise\n    // ClipboardItem constructor, but throws on an unrelated MIME type error.\n    // So we need to await this and fallback to awaiting the blob if applicable.\n    await navigator.clipboard.write([\n      new window.ClipboardItem({\n        [MIME_TYPES.png]: blob,\n      }),\n    ]);\n  } catch (error: any) {\n    // if we're using a Promise ClipboardItem, let's try constructing\n    // with resolution value instead\n    if (isPromiseLike(blob)) {\n      await navigator.clipboard.write([\n        new window.ClipboardItem({\n          [MIME_TYPES.png]: await blob,\n        }),\n      ]);\n    } else {\n      throw error;\n    }\n  }\n};\n\nexport const copyTextToSystemClipboard = async (text: string | null) => {\n  let copied = false;\n  if (probablySupportsClipboardWriteText) {\n    try {\n      // NOTE: doesn't work on FF on non-HTTPS domains, or when document\n      // not focused\n      await navigator.clipboard.writeText(text || \"\");\n      copied = true;\n    } catch (error: any) {\n      console.error(error);\n    }\n  }\n\n  // Note that execCommand doesn't allow copying empty strings, so if we're\n  // clearing clipboard using this API, we must copy at least an empty char\n  if (!copied && !copyTextViaExecCommand(text || \" \")) {\n    throw new Error(\"couldn't copy\");\n  }\n};\n\n// adapted from https://github.com/zenorocha/clipboard.js/blob/ce79f170aa655c408b6aab33c9472e8e4fa52e19/src/clipboard-action.js#L48\nconst copyTextViaExecCommand = (text: string) => {\n  const isRTL = document.documentElement.getAttribute(\"dir\") === \"rtl\";\n\n  const textarea = document.createElement(\"textarea\");\n\n  textarea.style.border = \"0\";\n  textarea.style.padding = \"0\";\n  textarea.style.margin = \"0\";\n  textarea.style.position = \"absolute\";\n  textarea.style[isRTL ? \"right\" : \"left\"] = \"-9999px\";\n  const yPosition = window.pageYOffset || document.documentElement.scrollTop;\n  textarea.style.top = `${yPosition}px`;\n  // Prevent zooming on iOS\n  textarea.style.fontSize = \"12pt\";\n\n  textarea.setAttribute(\"readonly\", \"\");\n  textarea.value = text;\n\n  document.body.appendChild(textarea);\n\n  let success = false;\n\n  try {\n    textarea.select();\n    textarea.setSelectionRange(0, textarea.value.length);\n\n    success = document.execCommand(\"copy\");\n  } catch (error: any) {\n    console.error(error);\n  }\n\n  textarea.remove();\n\n  return success;\n};\n","import oc from \"open-color\";\n\nconst shades = (index: number) => [\n  oc.red[index],\n  oc.pink[index],\n  oc.grape[index],\n  oc.violet[index],\n  oc.indigo[index],\n  oc.blue[index],\n  oc.cyan[index],\n  oc.teal[index],\n  oc.green[index],\n  oc.lime[index],\n  oc.yellow[index],\n  oc.orange[index],\n];\n\nexport default {\n  canvasBackground: [oc.white, oc.gray[0], oc.gray[1], ...shades(0)],\n  elementBackground: [\"transparent\", oc.gray[4], oc.gray[6], ...shades(6)],\n  elementStroke: [oc.black, oc.gray[8], oc.gray[7], ...shades(9)],\n};\n","import { atom, useAtom } from \"jotai\";\nimport { actionClearCanvas } from \"../actions\";\nimport { t } from \"../i18n\";\nimport { jotaiScope } from \"../jotai\";\nimport { useExcalidrawActionManager } from \"./App\";\nimport ConfirmDialog from \"./ConfirmDialog\";\n\nexport const activeConfirmDialogAtom = atom<\"clearCanvas\" | null>(null);\n\nexport const ActiveConfirmDialog = () => {\n  const [activeConfirmDialog, setActiveConfirmDialog] = useAtom(\n    activeConfirmDialogAtom,\n    jotaiScope,\n  );\n  const actionManager = useExcalidrawActionManager();\n\n  if (!activeConfirmDialog) {\n    return null;\n  }\n\n  if (activeConfirmDialog === \"clearCanvas\") {\n    return (\n      <ConfirmDialog\n        onConfirm={() => {\n          actionManager.executeAction(actionClearCanvas);\n          setActiveConfirmDialog(null);\n        }}\n        onCancel={() => setActiveConfirmDialog(null)}\n        title={t(\"clearCanvasDialog.title\")}\n      >\n        <p className=\"clear-canvas__content\"> {t(\"alerts.clearReset\")}</p>\n      </ConfirmDialog>\n    );\n  }\n\n  return null;\n};\n","import { Action, ActionResult } from \"./types\";\nimport { UndoIcon, RedoIcon } from \"../components/icons\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { t } from \"../i18n\";\nimport History, { HistoryEntry } from \"../history\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppState } from \"../types\";\nimport { KEYS } from \"../keys\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { fixBindingsAfterDeletion } from \"../element/binding\";\nimport { arrayToMap } from \"../utils\";\nimport { isWindows } from \"../constants\";\n\nconst writeData = (\n  prevElements: readonly ExcalidrawElement[],\n  appState: AppState,\n  updater: () => HistoryEntry | null,\n): ActionResult => {\n  const commitToHistory = false;\n  if (\n    !appState.multiElement &&\n    !appState.resizingElement &&\n    !appState.editingElement &&\n    !appState.draggingElement\n  ) {\n    const data = updater();\n    if (data === null) {\n      return { commitToHistory };\n    }\n\n    const prevElementMap = arrayToMap(prevElements);\n    const nextElements = data.elements;\n    const nextElementMap = arrayToMap(nextElements);\n\n    const deletedElements = prevElements.filter(\n      (prevElement) => !nextElementMap.has(prevElement.id),\n    );\n    const elements = nextElements\n      .map((nextElement) =>\n        newElementWith(\n          prevElementMap.get(nextElement.id) || nextElement,\n          nextElement,\n        ),\n      )\n      .concat(\n        deletedElements.map((prevElement) =>\n          newElementWith(prevElement, { isDeleted: true }),\n        ),\n      );\n    fixBindingsAfterDeletion(elements, deletedElements);\n\n    return {\n      elements,\n      appState: { ...appState, ...data.appState },\n      commitToHistory,\n      syncHistory: true,\n    };\n  }\n  return { commitToHistory };\n};\n\ntype ActionCreator = (history: History) => Action;\n\nexport const createUndoAction: ActionCreator = (history) => ({\n  name: \"undo\",\n  trackEvent: { category: \"history\" },\n  perform: (elements, appState) =>\n    writeData(elements, appState, () => history.undoOnce()),\n  keyTest: (event) =>\n    event[KEYS.CTRL_OR_CMD] &&\n    event.key.toLowerCase() === KEYS.Z &&\n    !event.shiftKey,\n  PanelComponent: ({ updateData, data }) => (\n    <ToolButton\n      type=\"button\"\n      icon={UndoIcon}\n      aria-label={t(\"buttons.undo\")}\n      onClick={updateData}\n      size={data?.size || \"medium\"}\n    />\n  ),\n  commitToHistory: () => false,\n});\n\nexport const createRedoAction: ActionCreator = (history) => ({\n  name: \"redo\",\n  trackEvent: { category: \"history\" },\n  perform: (elements, appState) =>\n    writeData(elements, appState, () => history.redoOnce()),\n  keyTest: (event) =>\n    (event[KEYS.CTRL_OR_CMD] &&\n      event.shiftKey &&\n      event.key.toLowerCase() === KEYS.Z) ||\n    (isWindows && event.ctrlKey && !event.shiftKey && event.key === KEYS.Y),\n  PanelComponent: ({ updateData, data }) => (\n    <ToolButton\n      type=\"button\"\n      icon={RedoIcon}\n      aria-label={t(\"buttons.redo\")}\n      onClick={updateData}\n      size={data?.size || \"medium\"}\n    />\n  ),\n  commitToHistory: () => false,\n});\n","import React from \"react\";\nimport {\n  Action,\n  UpdaterFn,\n  ActionName,\n  ActionResult,\n  PanelComponentProps,\n  ActionSource,\n} from \"./types\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppClassProperties, AppState } from \"../types\";\nimport { trackEvent } from \"../analytics\";\n\nconst trackAction = (\n  action: Action,\n  source: ActionSource,\n  appState: Readonly<AppState>,\n  elements: readonly ExcalidrawElement[],\n  app: AppClassProperties,\n  value: any,\n) => {\n  if (action.trackEvent) {\n    try {\n      if (typeof action.trackEvent === \"object\") {\n        const shouldTrack = action.trackEvent.predicate\n          ? action.trackEvent.predicate(appState, elements, value)\n          : true;\n        if (shouldTrack) {\n          trackEvent(\n            action.trackEvent.category,\n            action.trackEvent.action || action.name,\n            `${source} (${app.device.isMobile ? \"mobile\" : \"desktop\"})`,\n          );\n        }\n      }\n    } catch (error) {\n      console.error(\"error while logging action:\", error);\n    }\n  }\n};\n\nexport class ActionManager {\n  actions = {} as Record<ActionName, Action>;\n\n  updater: (actionResult: ActionResult | Promise<ActionResult>) => void;\n\n  getAppState: () => Readonly<AppState>;\n  getElementsIncludingDeleted: () => readonly ExcalidrawElement[];\n  app: AppClassProperties;\n\n  constructor(\n    updater: UpdaterFn,\n    getAppState: () => AppState,\n    getElementsIncludingDeleted: () => readonly ExcalidrawElement[],\n    app: AppClassProperties,\n  ) {\n    this.updater = (actionResult) => {\n      if (actionResult && \"then\" in actionResult) {\n        actionResult.then((actionResult) => {\n          return updater(actionResult);\n        });\n      } else {\n        return updater(actionResult);\n      }\n    };\n    this.getAppState = getAppState;\n    this.getElementsIncludingDeleted = getElementsIncludingDeleted;\n    this.app = app;\n  }\n\n  registerAction(action: Action) {\n    this.actions[action.name] = action;\n  }\n\n  registerAll(actions: readonly Action[]) {\n    actions.forEach((action) => this.registerAction(action));\n  }\n\n  handleKeyDown(event: React.KeyboardEvent | KeyboardEvent) {\n    const canvasActions = this.app.props.UIOptions.canvasActions;\n    const data = Object.values(this.actions)\n      .sort((a, b) => (b.keyPriority || 0) - (a.keyPriority || 0))\n      .filter(\n        (action) =>\n          (action.name in canvasActions\n            ? canvasActions[action.name as keyof typeof canvasActions]\n            : true) &&\n          action.keyTest &&\n          action.keyTest(\n            event,\n            this.getAppState(),\n            this.getElementsIncludingDeleted(),\n          ),\n      );\n\n    if (data.length !== 1) {\n      if (data.length > 1) {\n        console.warn(\"Canceling as multiple actions match this shortcut\", data);\n      }\n      return false;\n    }\n\n    const action = data[0];\n\n    if (this.getAppState().viewModeEnabled && action.viewMode !== true) {\n      return false;\n    }\n\n    const elements = this.getElementsIncludingDeleted();\n    const appState = this.getAppState();\n    const value = null;\n\n    trackAction(action, \"keyboard\", appState, elements, this.app, null);\n\n    event.preventDefault();\n    event.stopPropagation();\n    this.updater(data[0].perform(elements, appState, value, this.app));\n    return true;\n  }\n\n  executeAction(action: Action, source: ActionSource = \"api\") {\n    const elements = this.getElementsIncludingDeleted();\n    const appState = this.getAppState();\n    const value = null;\n\n    trackAction(action, source, appState, elements, this.app, value);\n\n    this.updater(action.perform(elements, appState, value, this.app));\n  }\n\n  /**\n   * @param data additional data sent to the PanelComponent\n   */\n  renderAction = (name: ActionName, data?: PanelComponentProps[\"data\"]) => {\n    const canvasActions = this.app.props.UIOptions.canvasActions;\n\n    if (\n      this.actions[name] &&\n      \"PanelComponent\" in this.actions[name] &&\n      (name in canvasActions\n        ? canvasActions[name as keyof typeof canvasActions]\n        : true)\n    ) {\n      const action = this.actions[name];\n      const PanelComponent = action.PanelComponent!;\n      PanelComponent.displayName = \"PanelComponent\";\n      const elements = this.getElementsIncludingDeleted();\n      const appState = this.getAppState();\n      const updateData = (formState?: any) => {\n        trackAction(action, \"ui\", appState, elements, this.app, formState);\n\n        this.updater(\n          action.perform(\n            this.getElementsIncludingDeleted(),\n            this.getAppState(),\n            formState,\n            this.app,\n          ),\n        );\n      };\n\n      return (\n        <PanelComponent\n          elements={this.getElementsIncludingDeleted()}\n          appState={this.getAppState()}\n          updateData={updateData}\n          appProps={this.app.props}\n          data={data}\n        />\n      );\n    }\n\n    return null;\n  };\n\n  isActionEnabled = (action: Action) => {\n    const elements = this.getElementsIncludingDeleted();\n    const appState = this.getAppState();\n\n    return (\n      !action.predicate ||\n      action.predicate(elements, appState, this.app.props, this.app)\n    );\n  };\n}\n","import { PointerCoords } from \"./types\";\n\nexport const getCenter = (pointers: Map<number, PointerCoords>) => {\n  const allCoords = Array.from(pointers.values());\n  return {\n    x: sum(allCoords, (coords) => coords.x) / allCoords.length,\n    y: sum(allCoords, (coords) => coords.y) / allCoords.length,\n  };\n};\n\nexport const getDistance = ([a, b]: readonly PointerCoords[]) =>\n  Math.hypot(a.x - b.x, a.y - b.y);\n\nconst sum = <T>(array: readonly T[], mapper: (item: T) => number): number =>\n  array.reduce((acc, item) => acc + mapper(item), 0);\n","import { AppState } from \"./types\";\nimport { ExcalidrawElement } from \"./element/types\";\nimport { isLinearElement } from \"./element/typeChecks\";\nimport { deepCopyElement } from \"./element/newElement\";\nimport { Mutable } from \"./utility-types\";\n\nexport interface HistoryEntry {\n  appState: ReturnType<typeof clearAppStatePropertiesForHistory>;\n  elements: ExcalidrawElement[];\n}\n\ninterface DehydratedExcalidrawElement {\n  id: string;\n  versionNonce: number;\n}\n\ninterface DehydratedHistoryEntry {\n  appState: string;\n  elements: DehydratedExcalidrawElement[];\n}\n\nconst clearAppStatePropertiesForHistory = (appState: AppState) => {\n  return {\n    selectedElementIds: appState.selectedElementIds,\n    selectedGroupIds: appState.selectedGroupIds,\n    viewBackgroundColor: appState.viewBackgroundColor,\n    editingLinearElement: appState.editingLinearElement,\n    editingGroupId: appState.editingGroupId,\n    name: appState.name,\n  };\n};\n\nclass History {\n  private elementCache = new Map<string, Map<number, ExcalidrawElement>>();\n  private recording: boolean = true;\n  private stateHistory: DehydratedHistoryEntry[] = [];\n  private redoStack: DehydratedHistoryEntry[] = [];\n  private lastEntry: HistoryEntry | null = null;\n\n  private hydrateHistoryEntry({\n    appState,\n    elements,\n  }: DehydratedHistoryEntry): HistoryEntry {\n    return {\n      appState: JSON.parse(appState),\n      elements: elements.map((dehydratedExcalidrawElement) => {\n        const element = this.elementCache\n          .get(dehydratedExcalidrawElement.id)\n          ?.get(dehydratedExcalidrawElement.versionNonce);\n        if (!element) {\n          throw new Error(\n            `Element not found: ${dehydratedExcalidrawElement.id}:${dehydratedExcalidrawElement.versionNonce}`,\n          );\n        }\n        return element;\n      }),\n    };\n  }\n\n  private dehydrateHistoryEntry({\n    appState,\n    elements,\n  }: HistoryEntry): DehydratedHistoryEntry {\n    return {\n      appState: JSON.stringify(appState),\n      elements: elements.map((element: ExcalidrawElement) => {\n        if (!this.elementCache.has(element.id)) {\n          this.elementCache.set(element.id, new Map());\n        }\n        const versions = this.elementCache.get(element.id)!;\n        if (!versions.has(element.versionNonce)) {\n          versions.set(element.versionNonce, deepCopyElement(element));\n        }\n        return {\n          id: element.id,\n          versionNonce: element.versionNonce,\n        };\n      }),\n    };\n  }\n\n  getSnapshotForTest() {\n    return {\n      recording: this.recording,\n      stateHistory: this.stateHistory.map((dehydratedHistoryEntry) =>\n        this.hydrateHistoryEntry(dehydratedHistoryEntry),\n      ),\n      redoStack: this.redoStack.map((dehydratedHistoryEntry) =>\n        this.hydrateHistoryEntry(dehydratedHistoryEntry),\n      ),\n    };\n  }\n\n  clear() {\n    this.stateHistory.length = 0;\n    this.redoStack.length = 0;\n    this.lastEntry = null;\n    this.elementCache.clear();\n  }\n\n  private generateEntry = (\n    appState: AppState,\n    elements: readonly ExcalidrawElement[],\n  ): DehydratedHistoryEntry =>\n    this.dehydrateHistoryEntry({\n      appState: clearAppStatePropertiesForHistory(appState),\n      elements: elements.reduce((elements, element) => {\n        if (\n          isLinearElement(element) &&\n          appState.multiElement &&\n          appState.multiElement.id === element.id\n        ) {\n          // don't store multi-point arrow if still has only one point\n          if (\n            appState.multiElement &&\n            appState.multiElement.id === element.id &&\n            element.points.length < 2\n          ) {\n            return elements;\n          }\n\n          elements.push({\n            ...element,\n            // don't store last point if not committed\n            points:\n              element.lastCommittedPoint !==\n              element.points[element.points.length - 1]\n                ? element.points.slice(0, -1)\n                : element.points,\n          });\n        } else {\n          elements.push(element);\n        }\n        return elements;\n      }, [] as Mutable<typeof elements>),\n    });\n\n  shouldCreateEntry(nextEntry: HistoryEntry): boolean {\n    const { lastEntry } = this;\n\n    if (!lastEntry) {\n      return true;\n    }\n\n    if (nextEntry.elements.length !== lastEntry.elements.length) {\n      return true;\n    }\n\n    // loop from right to left as changes are likelier to happen on new elements\n    for (let i = nextEntry.elements.length - 1; i > -1; i--) {\n      const prev = nextEntry.elements[i];\n      const next = lastEntry.elements[i];\n      if (\n        !prev ||\n        !next ||\n        prev.id !== next.id ||\n        prev.versionNonce !== next.versionNonce\n      ) {\n        return true;\n      }\n    }\n\n    // note: this is safe because entry's appState is guaranteed no excess props\n    let key: keyof typeof nextEntry.appState;\n    for (key in nextEntry.appState) {\n      if (key === \"editingLinearElement\") {\n        if (\n          nextEntry.appState[key]?.elementId ===\n          lastEntry.appState[key]?.elementId\n        ) {\n          continue;\n        }\n      }\n      if (key === \"selectedElementIds\" || key === \"selectedGroupIds\") {\n        continue;\n      }\n      if (nextEntry.appState[key] !== lastEntry.appState[key]) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  pushEntry(appState: AppState, elements: readonly ExcalidrawElement[]) {\n    const newEntryDehydrated = this.generateEntry(appState, elements);\n    const newEntry: HistoryEntry = this.hydrateHistoryEntry(newEntryDehydrated);\n\n    if (newEntry) {\n      if (!this.shouldCreateEntry(newEntry)) {\n        return;\n      }\n\n      this.stateHistory.push(newEntryDehydrated);\n      this.lastEntry = newEntry;\n      // As a new entry was pushed, we invalidate the redo stack\n      this.clearRedoStack();\n    }\n  }\n\n  clearRedoStack() {\n    this.redoStack.splice(0, this.redoStack.length);\n  }\n\n  redoOnce(): HistoryEntry | null {\n    if (this.redoStack.length === 0) {\n      return null;\n    }\n\n    const entryToRestore = this.redoStack.pop();\n\n    if (entryToRestore !== undefined) {\n      this.stateHistory.push(entryToRestore);\n      return this.hydrateHistoryEntry(entryToRestore);\n    }\n\n    return null;\n  }\n\n  undoOnce(): HistoryEntry | null {\n    if (this.stateHistory.length === 1) {\n      return null;\n    }\n\n    const currentEntry = this.stateHistory.pop();\n\n    const entryToRestore = this.stateHistory[this.stateHistory.length - 1];\n\n    if (currentEntry !== undefined) {\n      this.redoStack.push(currentEntry);\n      return this.hydrateHistoryEntry(entryToRestore);\n    }\n\n    return null;\n  }\n\n  /**\n   * Updates history's `lastEntry` to latest app state. This is necessary\n   *  when doing undo/redo which itself doesn't commit to history, but updates\n   *  app state in a way that would break `shouldCreateEntry` which relies on\n   *  `lastEntry` to reflect last comittable history state.\n   * We can't update `lastEntry` from within history when calling undo/redo\n   *  because the action potentially mutates appState/elements before storing\n   *  it.\n   */\n  setCurrentState(appState: AppState, elements: readonly ExcalidrawElement[]) {\n    this.lastEntry = this.hydrateHistoryEntry(\n      this.generateEntry(appState, elements),\n    );\n  }\n\n  // Suspicious that this is called so many places. Seems error-prone.\n  resumeRecording() {\n    this.recording = true;\n  }\n\n  record(state: AppState, elements: readonly ExcalidrawElement[]) {\n    if (this.recording) {\n      this.pushEntry(state, elements);\n      this.recording = false;\n    }\n  }\n}\n\nexport default History;\n","import {\n  ArrowIcon,\n  DiamondIcon,\n  EllipseIcon,\n  EraserIcon,\n  FreedrawIcon,\n  ImageIcon,\n  LineIcon,\n  RectangleIcon,\n  SelectionIcon,\n  TextIcon,\n} from \"./components/icons\";\nimport { KEYS } from \"./keys\";\n\nexport const SHAPES = [\n  {\n    icon: SelectionIcon,\n    value: \"selection\",\n    key: KEYS.V,\n    numericKey: KEYS[\"1\"],\n    fillable: true,\n  },\n  {\n    icon: RectangleIcon,\n    value: \"rectangle\",\n    key: KEYS.R,\n    numericKey: KEYS[\"2\"],\n    fillable: true,\n  },\n  {\n    icon: DiamondIcon,\n    value: \"diamond\",\n    key: KEYS.D,\n    numericKey: KEYS[\"3\"],\n    fillable: true,\n  },\n  {\n    icon: EllipseIcon,\n    value: \"ellipse\",\n    key: KEYS.O,\n    numericKey: KEYS[\"4\"],\n    fillable: true,\n  },\n  {\n    icon: ArrowIcon,\n    value: \"arrow\",\n    key: KEYS.A,\n    numericKey: KEYS[\"5\"],\n    fillable: true,\n  },\n  {\n    icon: LineIcon,\n    value: \"line\",\n    key: KEYS.L,\n    numericKey: KEYS[\"6\"],\n    fillable: true,\n  },\n  {\n    icon: FreedrawIcon,\n    value: \"freedraw\",\n    key: [KEYS.P, KEYS.X],\n    numericKey: KEYS[\"7\"],\n    fillable: false,\n  },\n  {\n    icon: TextIcon,\n    value: \"text\",\n    key: KEYS.T,\n    numericKey: KEYS[\"8\"],\n    fillable: false,\n  },\n  {\n    icon: ImageIcon,\n    value: \"image\",\n    key: null,\n    numericKey: KEYS[\"9\"],\n    fillable: false,\n  },\n  {\n    icon: EraserIcon,\n    value: \"eraser\",\n    key: KEYS.E,\n    numericKey: KEYS[\"0\"],\n    fillable: false,\n  },\n] as const;\n\nexport const findShapeByKey = (key: string) => {\n  const shape = SHAPES.find((shape, index) => {\n    return (\n      (shape.numericKey != null && key === shape.numericKey.toString()) ||\n      (shape.key &&\n        (typeof shape.key === \"string\"\n          ? shape.key === key\n          : (shape.key as readonly string[]).includes(key)))\n    );\n  });\n  return shape?.value || null;\n};\n","import clsx from \"clsx\";\nimport { Popover } from \"./Popover\";\nimport { t } from \"../i18n\";\n\nimport \"./ContextMenu.scss\";\nimport {\n  getShortcutFromShortcutName,\n  ShortcutName,\n} from \"../actions/shortcuts\";\nimport { Action } from \"../actions/types\";\nimport { ActionManager } from \"../actions/manager\";\nimport {\n  useExcalidrawAppState,\n  useExcalidrawElements,\n  useExcalidrawSetAppState,\n} from \"./App\";\nimport React from \"react\";\n\nexport type ContextMenuItem = typeof CONTEXT_MENU_SEPARATOR | Action;\n\nexport type ContextMenuItems = (ContextMenuItem | false | null | undefined)[];\n\ntype ContextMenuProps = {\n  actionManager: ActionManager;\n  items: ContextMenuItems;\n  top: number;\n  left: number;\n};\n\nexport const CONTEXT_MENU_SEPARATOR = \"separator\";\n\nexport const ContextMenu = React.memo(\n  ({ actionManager, items, top, left }: ContextMenuProps) => {\n    const appState = useExcalidrawAppState();\n    const setAppState = useExcalidrawSetAppState();\n    const elements = useExcalidrawElements();\n\n    const filteredItems = items.reduce((acc: ContextMenuItem[], item) => {\n      if (\n        item &&\n        (item === CONTEXT_MENU_SEPARATOR ||\n          !item.predicate ||\n          item.predicate(\n            elements,\n            appState,\n            actionManager.app.props,\n            actionManager.app,\n          ))\n      ) {\n        acc.push(item);\n      }\n      return acc;\n    }, []);\n\n    return (\n      <Popover\n        onCloseRequest={() => setAppState({ contextMenu: null })}\n        top={top}\n        left={left}\n        fitInViewport={true}\n        offsetLeft={appState.offsetLeft}\n        offsetTop={appState.offsetTop}\n        viewportWidth={appState.width}\n        viewportHeight={appState.height}\n      >\n        <ul\n          className=\"context-menu\"\n          onContextMenu={(event) => event.preventDefault()}\n        >\n          {filteredItems.map((item, idx) => {\n            if (item === CONTEXT_MENU_SEPARATOR) {\n              if (\n                !filteredItems[idx - 1] ||\n                filteredItems[idx - 1] === CONTEXT_MENU_SEPARATOR\n              ) {\n                return null;\n              }\n              return <hr key={idx} className=\"context-menu-item-separator\" />;\n            }\n\n            const actionName = item.name;\n            let label = \"\";\n            if (item.contextItemLabel) {\n              if (typeof item.contextItemLabel === \"function\") {\n                label = t(item.contextItemLabel(elements, appState));\n              } else {\n                label = t(item.contextItemLabel);\n              }\n            }\n\n            return (\n              <li\n                key={idx}\n                data-testid={actionName}\n                onClick={() => {\n                  // we need update state before executing the action in case\n                  // the action uses the appState it's being passed (that still\n                  // contains a defined contextMenu) to return the next state.\n                  setAppState({ contextMenu: null }, () => {\n                    actionManager.executeAction(item, \"contextMenu\");\n                  });\n                }}\n              >\n                <button\n                  className={clsx(\"context-menu-item\", {\n                    dangerous: actionName === \"deleteSelectedElements\",\n                    checkmark: item.checked?.(appState),\n                  })}\n                >\n                  <div className=\"context-menu-item__label\">{label}</div>\n                  <kbd className=\"context-menu-item__shortcut\">\n                    {actionName\n                      ? getShortcutFromShortcutName(actionName as ShortcutName)\n                      : \"\"}\n                  </kbd>\n                </button>\n              </li>\n            );\n          })}\n        </ul>\n      </Popover>\n    );\n  },\n);\n","import React from \"react\";\nimport { ActionManager } from \"../actions/manager\";\nimport { getNonDeletedElements } from \"../element\";\nimport { ExcalidrawElement, PointerType } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { useDevice } from \"../components/App\";\nimport {\n  canChangeRoundness,\n  canHaveArrowheads,\n  getTargetElements,\n  hasBackground,\n  hasStrokeStyle,\n  hasStrokeWidth,\n  hasText,\n} from \"../scene\";\nimport { SHAPES } from \"../shapes\";\nimport { AppState, Zoom } from \"../types\";\nimport {\n  capitalizeString,\n  isTransparent,\n  updateActiveTool,\n  setCursorForShape,\n} from \"../utils\";\nimport Stack from \"./Stack\";\nimport { ToolButton } from \"./ToolButton\";\nimport { hasStrokeColor } from \"../scene/comparisons\";\nimport { trackEvent } from \"../analytics\";\nimport { hasBoundTextElement } from \"../element/typeChecks\";\nimport clsx from \"clsx\";\nimport { actionToggleZenMode } from \"../actions\";\nimport \"./Actions.scss\";\nimport { Tooltip } from \"./Tooltip\";\nimport { shouldAllowVerticalAlign } from \"../element/textElement\";\n\nexport const SelectedShapeActions = ({\n  appState,\n  elements,\n  renderAction,\n}: {\n  appState: AppState;\n  elements: readonly ExcalidrawElement[];\n  renderAction: ActionManager[\"renderAction\"];\n}) => {\n  const targetElements = getTargetElements(\n    getNonDeletedElements(elements),\n    appState,\n  );\n\n  let isSingleElementBoundContainer = false;\n  if (\n    targetElements.length === 2 &&\n    (hasBoundTextElement(targetElements[0]) ||\n      hasBoundTextElement(targetElements[1]))\n  ) {\n    isSingleElementBoundContainer = true;\n  }\n  const isEditing = Boolean(appState.editingElement);\n  const device = useDevice();\n  const isRTL = document.documentElement.getAttribute(\"dir\") === \"rtl\";\n\n  const showFillIcons =\n    hasBackground(appState.activeTool.type) ||\n    targetElements.some(\n      (element) =>\n        hasBackground(element.type) && !isTransparent(element.backgroundColor),\n    );\n  const showChangeBackgroundIcons =\n    hasBackground(appState.activeTool.type) ||\n    targetElements.some((element) => hasBackground(element.type));\n\n  const showLinkIcon =\n    targetElements.length === 1 || isSingleElementBoundContainer;\n\n  let commonSelectedType: string | null = targetElements[0]?.type || null;\n\n  for (const element of targetElements) {\n    if (element.type !== commonSelectedType) {\n      commonSelectedType = null;\n      break;\n    }\n  }\n\n  return (\n    <div className=\"panelColumn\">\n      <div>\n        {((hasStrokeColor(appState.activeTool.type) &&\n          appState.activeTool.type !== \"image\" &&\n          commonSelectedType !== \"image\") ||\n          targetElements.some((element) => hasStrokeColor(element.type))) &&\n          renderAction(\"changeStrokeColor\")}\n      </div>\n      {showChangeBackgroundIcons && (\n        <div>{renderAction(\"changeBackgroundColor\")}</div>\n      )}\n      {showFillIcons && renderAction(\"changeFillStyle\")}\n\n      {(hasStrokeWidth(appState.activeTool.type) ||\n        targetElements.some((element) => hasStrokeWidth(element.type))) &&\n        renderAction(\"changeStrokeWidth\")}\n\n      {(appState.activeTool.type === \"freedraw\" ||\n        targetElements.some((element) => element.type === \"freedraw\")) &&\n        renderAction(\"changeStrokeShape\")}\n\n      {(hasStrokeStyle(appState.activeTool.type) ||\n        targetElements.some((element) => hasStrokeStyle(element.type))) && (\n        <>\n          {renderAction(\"changeStrokeStyle\")}\n          {renderAction(\"changeSloppiness\")}\n        </>\n      )}\n\n      {(canChangeRoundness(appState.activeTool.type) ||\n        targetElements.some((element) => canChangeRoundness(element.type))) && (\n        <>{renderAction(\"changeRoundness\")}</>\n      )}\n\n      {(hasText(appState.activeTool.type) ||\n        targetElements.some((element) => hasText(element.type))) && (\n        <>\n          {renderAction(\"changeFontSize\")}\n\n          {renderAction(\"changeFontFamily\")}\n\n          {renderAction(\"changeTextAlign\")}\n        </>\n      )}\n\n      {shouldAllowVerticalAlign(targetElements) &&\n        renderAction(\"changeVerticalAlign\")}\n      {(canHaveArrowheads(appState.activeTool.type) ||\n        targetElements.some((element) => canHaveArrowheads(element.type))) && (\n        <>{renderAction(\"changeArrowhead\")}</>\n      )}\n\n      {renderAction(\"changeOpacity\")}\n\n      <fieldset>\n        <legend>{t(\"labels.layers\")}</legend>\n        <div className=\"buttonList\">\n          {renderAction(\"sendToBack\")}\n          {renderAction(\"sendBackward\")}\n          {renderAction(\"bringToFront\")}\n          {renderAction(\"bringForward\")}\n        </div>\n      </fieldset>\n\n      {targetElements.length > 1 && !isSingleElementBoundContainer && (\n        <fieldset>\n          <legend>{t(\"labels.align\")}</legend>\n          <div className=\"buttonList\">\n            {\n              // swap this order for RTL so the button positions always match their action\n              // (i.e. the leftmost button aligns left)\n            }\n            {isRTL ? (\n              <>\n                {renderAction(\"alignRight\")}\n                {renderAction(\"alignHorizontallyCentered\")}\n                {renderAction(\"alignLeft\")}\n              </>\n            ) : (\n              <>\n                {renderAction(\"alignLeft\")}\n                {renderAction(\"alignHorizontallyCentered\")}\n                {renderAction(\"alignRight\")}\n              </>\n            )}\n            {targetElements.length > 2 &&\n              renderAction(\"distributeHorizontally\")}\n            {/* breaks the row ˇˇ */}\n            <div style={{ flexBasis: \"100%\", height: 0 }} />\n            <div\n              style={{\n                display: \"flex\",\n                flexWrap: \"wrap\",\n                gap: \".5rem\",\n                marginTop: \"-0.5rem\",\n              }}\n            >\n              {renderAction(\"alignTop\")}\n              {renderAction(\"alignVerticallyCentered\")}\n              {renderAction(\"alignBottom\")}\n              {targetElements.length > 2 &&\n                renderAction(\"distributeVertically\")}\n            </div>\n          </div>\n        </fieldset>\n      )}\n      {!isEditing && targetElements.length > 0 && (\n        <fieldset>\n          <legend>{t(\"labels.actions\")}</legend>\n          <div className=\"buttonList\">\n            {!device.isMobile && renderAction(\"duplicateSelection\")}\n            {!device.isMobile && renderAction(\"deleteSelectedElements\")}\n            {renderAction(\"group\")}\n            {renderAction(\"ungroup\")}\n            {showLinkIcon && renderAction(\"hyperlink\")}\n          </div>\n        </fieldset>\n      )}\n    </div>\n  );\n};\n\nexport const ShapesSwitcher = ({\n  canvas,\n  activeTool,\n  setAppState,\n  onImageAction,\n  appState,\n}: {\n  canvas: HTMLCanvasElement | null;\n  activeTool: AppState[\"activeTool\"];\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  onImageAction: (data: { pointerType: PointerType | null }) => void;\n  appState: AppState;\n}) => (\n  <>\n    {SHAPES.map(({ value, icon, key, numericKey, fillable }, index) => {\n      const label = t(`toolBar.${value}`);\n      const letter =\n        key && capitalizeString(typeof key === \"string\" ? key : key[0]);\n      const shortcut = letter\n        ? `${letter} ${t(\"helpDialog.or\")} ${numericKey}`\n        : `${numericKey}`;\n      return (\n        <ToolButton\n          className={clsx(\"Shape\", { fillable })}\n          key={value}\n          type=\"radio\"\n          icon={icon}\n          checked={activeTool.type === value}\n          name=\"editor-current-shape\"\n          title={`${capitalizeString(label)} — ${shortcut}`}\n          keyBindingLabel={numericKey || letter}\n          aria-label={capitalizeString(label)}\n          aria-keyshortcuts={shortcut}\n          data-testid={`toolbar-${value}`}\n          onPointerDown={({ pointerType }) => {\n            if (!appState.penDetected && pointerType === \"pen\") {\n              setAppState({\n                penDetected: true,\n                penMode: true,\n              });\n            }\n          }}\n          onChange={({ pointerType }) => {\n            if (appState.activeTool.type !== value) {\n              trackEvent(\"toolbar\", value, \"ui\");\n            }\n            const nextActiveTool = updateActiveTool(appState, {\n              type: value,\n            });\n            setAppState({\n              activeTool: nextActiveTool,\n              multiElement: null,\n              selectedElementIds: {},\n            });\n            setCursorForShape(canvas, {\n              ...appState,\n              activeTool: nextActiveTool,\n            });\n            if (value === \"image\") {\n              onImageAction({ pointerType });\n            }\n          }}\n        />\n      );\n    })}\n  </>\n);\n\nexport const ZoomActions = ({\n  renderAction,\n  zoom,\n}: {\n  renderAction: ActionManager[\"renderAction\"];\n  zoom: Zoom;\n}) => (\n  <Stack.Col gap={1} className=\"zoom-actions\">\n    <Stack.Row align=\"center\">\n      {renderAction(\"zoomOut\")}\n      {renderAction(\"resetZoom\")}\n      {renderAction(\"zoomIn\")}\n    </Stack.Row>\n  </Stack.Col>\n);\n\nexport const UndoRedoActions = ({\n  renderAction,\n  className,\n}: {\n  renderAction: ActionManager[\"renderAction\"];\n  className?: string;\n}) => (\n  <div className={`undo-redo-buttons ${className}`}>\n    <div className=\"undo-button-container\">\n      <Tooltip label={t(\"buttons.undo\")}>{renderAction(\"undo\")}</Tooltip>\n    </div>\n    <div className=\"redo-button-container\">\n      <Tooltip label={t(\"buttons.redo\")}> {renderAction(\"redo\")}</Tooltip>\n    </div>\n  </div>\n);\n\nexport const ExitZenModeAction = ({\n  actionManager,\n  showExitZenModeBtn,\n}: {\n  actionManager: ActionManager;\n  showExitZenModeBtn: boolean;\n}) => (\n  <button\n    className={clsx(\"disable-zen-mode\", {\n      \"disable-zen-mode--visible\": showExitZenModeBtn,\n    })}\n    onClick={() => actionManager.executeAction(actionToggleZenMode)}\n  >\n    {t(\"buttons.exitZenMode\")}\n  </button>\n);\n\nexport const FinalizeAction = ({\n  renderAction,\n  className,\n}: {\n  renderAction: ActionManager[\"renderAction\"];\n  className?: string;\n}) => (\n  <div className={`finalize-button ${className}`}>\n    {renderAction(\"finalize\", { size: \"small\" })}\n  </div>\n);\n","import React, { useEffect, useRef, useState } from \"react\";\nimport { probablySupportsClipboardBlob } from \"../clipboard\";\nimport { canvasToBlob } from \"../data/blob\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { getSelectedElements, isSomeElementSelected } from \"../scene\";\nimport { exportToCanvas } from \"../scene/export\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { Dialog } from \"./Dialog\";\nimport { clipboard } from \"./icons\";\nimport Stack from \"./Stack\";\nimport \"./ExportDialog.scss\";\nimport OpenColor from \"open-color\";\nimport { CheckboxItem } from \"./CheckboxItem\";\nimport { DEFAULT_EXPORT_PADDING, isFirefox } from \"../constants\";\nimport { nativeFileSystemSupported } from \"../data/filesystem\";\nimport { ActionManager } from \"../actions/manager\";\n\nconst supportsContextFilters =\n  \"filter\" in document.createElement(\"canvas\").getContext(\"2d\")!;\n\nexport const ErrorCanvasPreview = () => {\n  return (\n    <div>\n      <h3>{t(\"canvasError.cannotShowPreview\")}</h3>\n      <p>\n        <span>{t(\"canvasError.canvasTooBig\")}</span>\n      </p>\n      <em>({t(\"canvasError.canvasTooBigTip\")})</em>\n    </div>\n  );\n};\n\nexport type ExportCB = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  scale?: number,\n) => void;\n\nconst ExportButton: React.FC<{\n  color: keyof OpenColor;\n  onClick: () => void;\n  title: string;\n  shade?: number;\n  children?: React.ReactNode;\n}> = ({ children, title, onClick, color, shade = 6 }) => {\n  return (\n    <button\n      className=\"ExportDialog-imageExportButton\"\n      style={{\n        [\"--button-color\" as any]: OpenColor[color][shade],\n        [\"--button-color-darker\" as any]: OpenColor[color][shade + 1],\n        [\"--button-color-darkest\" as any]: OpenColor[color][shade + 2],\n      }}\n      title={title}\n      aria-label={title}\n      onClick={onClick}\n    >\n      {children}\n    </button>\n  );\n};\n\nconst ImageExportModal = ({\n  elements,\n  appState,\n  files,\n  exportPadding = DEFAULT_EXPORT_PADDING,\n  actionManager,\n  onExportToPng,\n  onExportToSvg,\n  onExportToClipboard,\n}: {\n  appState: AppState;\n  elements: readonly NonDeletedExcalidrawElement[];\n  files: BinaryFiles;\n  exportPadding?: number;\n  actionManager: ActionManager;\n  onExportToPng: ExportCB;\n  onExportToSvg: ExportCB;\n  onExportToClipboard: ExportCB;\n  onCloseRequest: () => void;\n}) => {\n  const someElementIsSelected = isSomeElementSelected(elements, appState);\n  const [exportSelected, setExportSelected] = useState(someElementIsSelected);\n  const previewRef = useRef<HTMLDivElement>(null);\n  const { exportBackground, viewBackgroundColor } = appState;\n  const [renderError, setRenderError] = useState<Error | null>(null);\n\n  const exportedElements = exportSelected\n    ? getSelectedElements(elements, appState, true)\n    : elements;\n\n  useEffect(() => {\n    setExportSelected(someElementIsSelected);\n  }, [someElementIsSelected]);\n\n  useEffect(() => {\n    const previewNode = previewRef.current;\n    if (!previewNode) {\n      return;\n    }\n    exportToCanvas(exportedElements, appState, files, {\n      exportBackground,\n      viewBackgroundColor,\n      exportPadding,\n    })\n      .then((canvas) => {\n        setRenderError(null);\n        // if converting to blob fails, there's some problem that will\n        // likely prevent preview and export (e.g. canvas too big)\n        return canvasToBlob(canvas).then(() => {\n          previewNode.replaceChildren(canvas);\n        });\n      })\n      .catch((error) => {\n        console.error(error);\n        setRenderError(error);\n      });\n  }, [\n    appState,\n    files,\n    exportedElements,\n    exportBackground,\n    exportPadding,\n    viewBackgroundColor,\n  ]);\n\n  return (\n    <div className=\"ExportDialog\">\n      <div className=\"ExportDialog__preview\" ref={previewRef}>\n        {renderError && <ErrorCanvasPreview />}\n      </div>\n      {supportsContextFilters &&\n        actionManager.renderAction(\"exportWithDarkMode\")}\n      <div style={{ display: \"grid\", gridTemplateColumns: \"1fr\" }}>\n        <div\n          style={{\n            display: \"grid\",\n            gridTemplateColumns: \"repeat(auto-fit, minmax(190px, 1fr))\",\n            // dunno why this is needed, but when the items wrap it creates\n            // an overflow\n            overflow: \"hidden\",\n          }}\n        >\n          {actionManager.renderAction(\"changeExportBackground\")}\n          {someElementIsSelected && (\n            <CheckboxItem\n              checked={exportSelected}\n              onChange={(checked) => setExportSelected(checked)}\n            >\n              {t(\"labels.onlySelected\")}\n            </CheckboxItem>\n          )}\n          {actionManager.renderAction(\"changeExportEmbedScene\")}\n        </div>\n      </div>\n      <div style={{ display: \"flex\", alignItems: \"center\", marginTop: \".6em\" }}>\n        <Stack.Row gap={2}>\n          {actionManager.renderAction(\"changeExportScale\")}\n        </Stack.Row>\n        <p style={{ marginLeft: \"1em\", userSelect: \"none\" }}>\n          {t(\"buttons.scale\")}\n        </p>\n      </div>\n      <div\n        style={{\n          display: \"flex\",\n          alignItems: \"center\",\n          justifyContent: \"center\",\n          margin: \".6em 0\",\n        }}\n      >\n        {!nativeFileSystemSupported &&\n          actionManager.renderAction(\"changeProjectName\")}\n      </div>\n      <Stack.Row gap={2} justifyContent=\"center\" style={{ margin: \"2em 0\" }}>\n        <ExportButton\n          color=\"indigo\"\n          title={t(\"buttons.exportToPng\")}\n          aria-label={t(\"buttons.exportToPng\")}\n          onClick={() => onExportToPng(exportedElements)}\n        >\n          PNG\n        </ExportButton>\n        <ExportButton\n          color=\"red\"\n          title={t(\"buttons.exportToSvg\")}\n          aria-label={t(\"buttons.exportToSvg\")}\n          onClick={() => onExportToSvg(exportedElements)}\n        >\n          SVG\n        </ExportButton>\n        {/* firefox supports clipboard API under a flag,\n            so let's throw and tell people what they can do */}\n        {(probablySupportsClipboardBlob || isFirefox) && (\n          <ExportButton\n            title={t(\"buttons.copyPngToClipboard\")}\n            onClick={() => onExportToClipboard(exportedElements)}\n            color=\"gray\"\n            shade={7}\n          >\n            {clipboard}\n          </ExportButton>\n        )}\n      </Stack.Row>\n    </div>\n  );\n};\n\nexport const ImageExportDialog = ({\n  elements,\n  appState,\n  setAppState,\n  files,\n  exportPadding = DEFAULT_EXPORT_PADDING,\n  actionManager,\n  onExportToPng,\n  onExportToSvg,\n  onExportToClipboard,\n}: {\n  appState: AppState;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  elements: readonly NonDeletedExcalidrawElement[];\n  files: BinaryFiles;\n  exportPadding?: number;\n  actionManager: ActionManager;\n  onExportToPng: ExportCB;\n  onExportToSvg: ExportCB;\n  onExportToClipboard: ExportCB;\n}) => {\n  const handleClose = React.useCallback(() => {\n    setAppState({ openDialog: null });\n  }, [setAppState]);\n\n  return (\n    <>\n      {appState.openDialog === \"imageExport\" && (\n        <Dialog onCloseRequest={handleClose} title={t(\"buttons.exportImage\")}>\n          <ImageExportModal\n            elements={elements}\n            appState={appState}\n            files={files}\n            exportPadding={exportPadding}\n            actionManager={actionManager}\n            onExportToPng={onExportToPng}\n            onExportToSvg={onExportToSvg}\n            onExportToClipboard={onExportToClipboard}\n            onCloseRequest={handleClose}\n          />\n        </Dialog>\n      )}\n    </>\n  );\n};\n","import \"./FixedSideContainer.scss\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\n\ntype FixedSideContainerProps = {\n  children: React.ReactNode;\n  side: \"top\" | \"left\" | \"right\";\n  className?: string;\n};\n\nexport const FixedSideContainer = ({\n  children,\n  side,\n  className,\n}: FixedSideContainerProps) => (\n  <div\n    className={clsx(\n      \"FixedSideContainer\",\n      `FixedSideContainer_side_${side}`,\n      className,\n    )}\n  >\n    {children}\n  </div>\n);\n","import { t } from \"../i18n\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { getSelectedElements } from \"../scene\";\n\nimport \"./HintViewer.scss\";\nimport { AppState, Device } from \"../types\";\nimport {\n  isImageElement,\n  isLinearElement,\n  isTextBindableContainer,\n  isTextElement,\n} from \"../element/typeChecks\";\nimport { getShortcutKey } from \"../utils\";\nimport { isEraserActive } from \"../appState\";\n\ninterface HintViewerProps {\n  appState: AppState;\n  elements: readonly NonDeletedExcalidrawElement[];\n  isMobile: boolean;\n  device: Device;\n}\n\nconst getHints = ({\n  appState,\n  elements,\n  isMobile,\n  device,\n}: HintViewerProps) => {\n  const { activeTool, isResizing, isRotating, lastPointerDownWith } = appState;\n  const multiMode = appState.multiElement !== null;\n\n  if (appState.openSidebar === \"library\" && !device.canDeviceFitSidebar) {\n    return null;\n  }\n\n  if (isEraserActive(appState)) {\n    return t(\"hints.eraserRevert\");\n  }\n  if (activeTool.type === \"arrow\" || activeTool.type === \"line\") {\n    if (!multiMode) {\n      return t(\"hints.linearElement\");\n    }\n    return t(\"hints.linearElementMulti\");\n  }\n\n  if (activeTool.type === \"freedraw\") {\n    return t(\"hints.freeDraw\");\n  }\n\n  if (activeTool.type === \"text\") {\n    return t(\"hints.text\");\n  }\n\n  if (appState.activeTool.type === \"image\" && appState.pendingImageElementId) {\n    return t(\"hints.placeImage\");\n  }\n\n  const selectedElements = getSelectedElements(elements, appState);\n\n  if (\n    isResizing &&\n    lastPointerDownWith === \"mouse\" &&\n    selectedElements.length === 1\n  ) {\n    const targetElement = selectedElements[0];\n    if (isLinearElement(targetElement) && targetElement.points.length === 2) {\n      return t(\"hints.lockAngle\");\n    }\n    return isImageElement(targetElement)\n      ? t(\"hints.resizeImage\")\n      : t(\"hints.resize\");\n  }\n\n  if (isRotating && lastPointerDownWith === \"mouse\") {\n    return t(\"hints.rotate\");\n  }\n\n  if (selectedElements.length === 1 && isTextElement(selectedElements[0])) {\n    return t(\"hints.text_selected\");\n  }\n\n  if (appState.editingElement && isTextElement(appState.editingElement)) {\n    return t(\"hints.text_editing\");\n  }\n\n  if (activeTool.type === \"selection\") {\n    if (\n      appState.draggingElement?.type === \"selection\" &&\n      !appState.editingElement &&\n      !appState.editingLinearElement\n    ) {\n      return t(\"hints.deepBoxSelect\");\n    }\n    if (!selectedElements.length && !isMobile) {\n      return t(\"hints.canvasPanning\");\n    }\n  }\n\n  if (selectedElements.length === 1) {\n    if (isLinearElement(selectedElements[0])) {\n      if (appState.editingLinearElement) {\n        return appState.editingLinearElement.selectedPointsIndices\n          ? t(\"hints.lineEditor_pointSelected\")\n          : t(\"hints.lineEditor_nothingSelected\");\n      }\n      return t(\"hints.lineEditor_info\");\n    }\n    if (isTextBindableContainer(selectedElements[0])) {\n      return t(\"hints.bindTextToElement\");\n    }\n  }\n\n  return null;\n};\n\nexport const HintViewer = ({\n  appState,\n  elements,\n  isMobile,\n  device,\n}: HintViewerProps) => {\n  let hint = getHints({\n    appState,\n    elements,\n    isMobile,\n    device,\n  });\n  if (!hint) {\n    return null;\n  }\n\n  hint = getShortcutKey(hint);\n\n  return (\n    <div className=\"HintViewer\">\n      <span>{hint}</span>\n    </div>\n  );\n};\n","import \"./ToolIcon.scss\";\n\nimport clsx from \"clsx\";\nimport { ToolButtonSize } from \"./ToolButton\";\nimport { LockedIcon, UnlockedIcon } from \"./icons\";\n\ntype LockIconProps = {\n  title?: string;\n  name?: string;\n  checked: boolean;\n  onChange?(): void;\n  isMobile?: boolean;\n};\n\nconst DEFAULT_SIZE: ToolButtonSize = \"medium\";\n\nconst ICONS = {\n  CHECKED: LockedIcon,\n  UNCHECKED: UnlockedIcon,\n};\n\nexport const LockButton = (props: LockIconProps) => {\n  return (\n    <label\n      className={clsx(\n        \"ToolIcon ToolIcon__lock\",\n        `ToolIcon_size_${DEFAULT_SIZE}`,\n        {\n          \"is-mobile\": props.isMobile,\n        },\n      )}\n      title={`${props.title} — Q`}\n    >\n      <input\n        className=\"ToolIcon_type_checkbox\"\n        type=\"checkbox\"\n        name={props.name}\n        onChange={props.onChange}\n        checked={props.checked}\n        aria-label={props.title}\n        data-testid=\"toolbar-lock\"\n      />\n      <div className=\"ToolIcon__icon\">\n        {props.checked ? ICONS.CHECKED : ICONS.UNCHECKED}\n      </div>\n    </label>\n  );\n};\n","import React from \"react\";\nimport { t } from \"../i18n\";\nimport { useExcalidrawContainer } from \"./App\";\n\nexport const Section: React.FC<{\n  heading: string;\n  children?: React.ReactNode | ((heading: React.ReactNode) => React.ReactNode);\n  className?: string;\n}> = ({ heading, children, ...props }) => {\n  const { id } = useExcalidrawContainer();\n  const header = (\n    <h2 className=\"visually-hidden\" id={`${id}-${heading}-title`}>\n      {t(`headings.${heading}`)}\n    </h2>\n  );\n  return (\n    <section {...props} aria-labelledby={`${id}-${heading}-title`}>\n      {typeof children === \"function\" ? (\n        children(header)\n      ) : (\n        <>\n          {header}\n          {children}\n        </>\n      )}\n    </section>\n  );\n};\n","import React from \"react\";\nimport { t } from \"../i18n\";\nimport { AppState } from \"../types\";\nimport { capitalizeString } from \"../utils\";\nimport { trackEvent } from \"../analytics\";\nimport { useDevice } from \"./App\";\nimport \"./LibraryButton.scss\";\nimport { LibraryIcon } from \"./icons\";\n\nexport const LibraryButton: React.FC<{\n  appState: AppState;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  isMobile?: boolean;\n}> = ({ appState, setAppState, isMobile }) => {\n  const device = useDevice();\n  const showLabel = !isMobile;\n\n  // TODO barnabasmolnar/redesign\n  // not great, toolbar jumps in a jarring manner\n  if (appState.isSidebarDocked && appState.openSidebar === \"library\") {\n    return null;\n  }\n\n  return (\n    <label title={`${capitalizeString(t(\"toolBar.library\"))}`}>\n      <input\n        className=\"ToolIcon_type_checkbox\"\n        type=\"checkbox\"\n        name=\"editor-library\"\n        onChange={(event) => {\n          document\n            .querySelector(\".layer-ui__wrapper\")\n            ?.classList.remove(\"animate\");\n          const isOpen = event.target.checked;\n          setAppState({ openSidebar: isOpen ? \"library\" : null });\n          // track only openings\n          if (isOpen) {\n            trackEvent(\n              \"library\",\n              \"toggleLibrary (open)\",\n              `toolbar (${device.isMobile ? \"mobile\" : \"desktop\"})`,\n            );\n          }\n        }}\n        checked={appState.openSidebar === \"library\"}\n        aria-label={capitalizeString(t(\"toolBar.library\"))}\n        aria-keyshortcuts=\"0\"\n      />\n      <div className=\"library-button\">\n        <div>{LibraryIcon}</div>\n        {showLabel && (\n          <div className=\"library-button__label\">{t(\"toolBar.library\")}</div>\n        )}\n      </div>\n    </label>\n  );\n};\n","import \"./ToolIcon.scss\";\n\nimport clsx from \"clsx\";\nimport { ToolButtonSize } from \"./ToolButton\";\nimport { PenModeIcon } from \"./icons\";\n\ntype PenModeIconProps = {\n  title?: string;\n  name?: string;\n  checked: boolean;\n  onChange?(): void;\n  zenModeEnabled?: boolean;\n  isMobile?: boolean;\n  penDetected: boolean;\n};\n\nconst DEFAULT_SIZE: ToolButtonSize = \"medium\";\n\nexport const PenModeButton = (props: PenModeIconProps) => {\n  if (!props.penDetected) {\n    return null;\n  }\n\n  return (\n    <label\n      className={clsx(\n        \"ToolIcon ToolIcon__penMode\",\n        `ToolIcon_size_${DEFAULT_SIZE}`,\n        {\n          \"is-mobile\": props.isMobile,\n        },\n      )}\n      title={`${props.title}`}\n    >\n      <input\n        className=\"ToolIcon_type_checkbox\"\n        type=\"checkbox\"\n        name={props.name}\n        onChange={props.onChange}\n        checked={props.checked}\n        aria-label={props.title}\n      />\n      <div className=\"ToolIcon__icon\">{PenModeIcon}</div>\n    </label>\n  );\n};\n","import React from \"react\";\nimport { getCommonBounds } from \"../element/bounds\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { getTargetElements } from \"../scene\";\nimport { AppState, ExcalidrawProps } from \"../types\";\nimport { CloseIcon } from \"./icons\";\nimport { Island } from \"./Island\";\nimport \"./Stats.scss\";\n\nexport const Stats = (props: {\n  appState: AppState;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  elements: readonly NonDeletedExcalidrawElement[];\n  onClose: () => void;\n  renderCustomStats: ExcalidrawProps[\"renderCustomStats\"];\n}) => {\n  const boundingBox = getCommonBounds(props.elements);\n  const selectedElements = getTargetElements(props.elements, props.appState);\n  const selectedBoundingBox = getCommonBounds(selectedElements);\n\n  return (\n    <div className=\"Stats\">\n      <Island padding={2}>\n        <div className=\"close\" onClick={props.onClose}>\n          {CloseIcon}\n        </div>\n        <h3>{t(\"stats.title\")}</h3>\n        <table>\n          <tbody>\n            <tr>\n              <th colSpan={2}>{t(\"stats.scene\")}</th>\n            </tr>\n            <tr>\n              <td>{t(\"stats.elements\")}</td>\n              <td>{props.elements.length}</td>\n            </tr>\n            <tr>\n              <td>{t(\"stats.width\")}</td>\n              <td>{Math.round(boundingBox[2]) - Math.round(boundingBox[0])}</td>\n            </tr>\n            <tr>\n              <td>{t(\"stats.height\")}</td>\n              <td>{Math.round(boundingBox[3]) - Math.round(boundingBox[1])}</td>\n            </tr>\n\n            {selectedElements.length === 1 && (\n              <tr>\n                <th colSpan={2}>{t(\"stats.element\")}</th>\n              </tr>\n            )}\n\n            {selectedElements.length > 1 && (\n              <>\n                <tr>\n                  <th colSpan={2}>{t(\"stats.selected\")}</th>\n                </tr>\n                <tr>\n                  <td>{t(\"stats.elements\")}</td>\n                  <td>{selectedElements.length}</td>\n                </tr>\n              </>\n            )}\n            {selectedElements.length > 0 && (\n              <>\n                <tr>\n                  <td>{\"x\"}</td>\n                  <td>{Math.round(selectedBoundingBox[0])}</td>\n                </tr>\n                <tr>\n                  <td>{\"y\"}</td>\n                  <td>{Math.round(selectedBoundingBox[1])}</td>\n                </tr>\n                <tr>\n                  <td>{t(\"stats.width\")}</td>\n                  <td>\n                    {Math.round(\n                      selectedBoundingBox[2] - selectedBoundingBox[0],\n                    )}\n                  </td>\n                </tr>\n                <tr>\n                  <td>{t(\"stats.height\")}</td>\n                  <td>\n                    {Math.round(\n                      selectedBoundingBox[3] - selectedBoundingBox[1],\n                    )}\n                  </td>\n                </tr>\n              </>\n            )}\n            {selectedElements.length === 1 && (\n              <tr>\n                <td>{t(\"stats.angle\")}</td>\n                <td>\n                  {`${Math.round(\n                    (selectedElements[0].angle * 180) / Math.PI,\n                  )}°`}\n                </td>\n              </tr>\n            )}\n            {props.renderCustomStats?.(props.elements, props.appState)}\n          </tbody>\n        </table>\n      </Island>\n    </div>\n  );\n};\n","import \"./ToolIcon.scss\";\n\nimport clsx from \"clsx\";\nimport { ToolButton } from \"./ToolButton\";\nimport { handIcon } from \"./icons\";\nimport { KEYS } from \"../keys\";\n\ntype LockIconProps = {\n  title?: string;\n  name?: string;\n  checked: boolean;\n  onChange?(): void;\n  isMobile?: boolean;\n};\n\nexport const HandButton = (props: LockIconProps) => {\n  return (\n    <ToolButton\n      className={clsx(\"Shape\", { fillable: false })}\n      type=\"radio\"\n      icon={handIcon}\n      name=\"editor-current-shape\"\n      checked={props.checked}\n      title={`${props.title} — H`}\n      keyBindingLabel={!props.isMobile ? KEYS.H.toLocaleUpperCase() : undefined}\n      aria-label={`${props.title} — H`}\n      aria-keyshortcuts={KEYS.H}\n      data-testid={`toolbar-hand`}\n      onChange={() => props.onChange?.()}\n    />\n  );\n};\n","import React from \"react\";\nimport { AppState, Device, ExcalidrawProps } from \"../types\";\nimport { ActionManager } from \"../actions/manager\";\nimport { t } from \"../i18n\";\nimport Stack from \"./Stack\";\nimport { showSelectedShapeActions } from \"../element\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { FixedSideContainer } from \"./FixedSideContainer\";\nimport { Island } from \"./Island\";\nimport { HintViewer } from \"./HintViewer\";\nimport { calculateScrollCenter } from \"../scene\";\nimport { SelectedShapeActions, ShapesSwitcher } from \"./Actions\";\nimport { Section } from \"./Section\";\nimport { SCROLLBAR_WIDTH, SCROLLBAR_MARGIN } from \"../scene/scrollbars\";\nimport { LockButton } from \"./LockButton\";\nimport { LibraryButton } from \"./LibraryButton\";\nimport { PenModeButton } from \"./PenModeButton\";\nimport { Stats } from \"./Stats\";\nimport { actionToggleStats } from \"../actions\";\nimport { HandButton } from \"./HandButton\";\nimport { isHandToolActive } from \"../appState\";\nimport { useTunnels } from \"./context/tunnels\";\n\ntype MobileMenuProps = {\n  appState: AppState;\n  actionManager: ActionManager;\n  renderJSONExportDialog: () => React.ReactNode;\n  renderImageExportDialog: () => React.ReactNode;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  elements: readonly NonDeletedExcalidrawElement[];\n  onLockToggle: () => void;\n  onHandToolToggle: () => void;\n  onPenModeToggle: () => void;\n  canvas: HTMLCanvasElement | null;\n\n  onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;\n  renderTopRightUI?: (\n    isMobile: boolean,\n    appState: AppState,\n  ) => JSX.Element | null;\n  renderCustomStats?: ExcalidrawProps[\"renderCustomStats\"];\n  renderSidebars: () => JSX.Element | null;\n  device: Device;\n  renderWelcomeScreen: boolean;\n};\n\nexport const MobileMenu = ({\n  appState,\n  elements,\n  actionManager,\n  setAppState,\n  onLockToggle,\n  onHandToolToggle,\n  onPenModeToggle,\n  canvas,\n  onImageAction,\n  renderTopRightUI,\n  renderCustomStats,\n  renderSidebars,\n  device,\n  renderWelcomeScreen,\n}: MobileMenuProps) => {\n  const { welcomeScreenCenterTunnel, mainMenuTunnel } = useTunnels();\n  const renderToolbar = () => {\n    return (\n      <FixedSideContainer side=\"top\" className=\"App-top-bar\">\n        {renderWelcomeScreen && <welcomeScreenCenterTunnel.Out />}\n        <Section heading=\"shapes\">\n          {(heading: React.ReactNode) => (\n            <Stack.Col gap={4} align=\"center\">\n              <Stack.Row gap={1} className=\"App-toolbar-container\">\n                <Island padding={1} className=\"App-toolbar App-toolbar--mobile\">\n                  {heading}\n                  <Stack.Row gap={1}>\n                    <ShapesSwitcher\n                      appState={appState}\n                      canvas={canvas}\n                      activeTool={appState.activeTool}\n                      setAppState={setAppState}\n                      onImageAction={({ pointerType }) => {\n                        onImageAction({\n                          insertOnCanvasDirectly: pointerType !== \"mouse\",\n                        });\n                      }}\n                    />\n                  </Stack.Row>\n                </Island>\n                {renderTopRightUI && renderTopRightUI(true, appState)}\n                <div className=\"mobile-misc-tools-container\">\n                  {!appState.viewModeEnabled && (\n                    <LibraryButton\n                      appState={appState}\n                      setAppState={setAppState}\n                      isMobile\n                    />\n                  )}\n                  <PenModeButton\n                    checked={appState.penMode}\n                    onChange={onPenModeToggle}\n                    title={t(\"toolBar.penMode\")}\n                    isMobile\n                    penDetected={appState.penDetected}\n                  />\n                  <LockButton\n                    checked={appState.activeTool.locked}\n                    onChange={onLockToggle}\n                    title={t(\"toolBar.lock\")}\n                    isMobile\n                  />\n                  <HandButton\n                    checked={isHandToolActive(appState)}\n                    onChange={() => onHandToolToggle()}\n                    title={t(\"toolBar.hand\")}\n                    isMobile\n                  />\n                </div>\n              </Stack.Row>\n            </Stack.Col>\n          )}\n        </Section>\n        <HintViewer\n          appState={appState}\n          elements={elements}\n          isMobile={true}\n          device={device}\n        />\n      </FixedSideContainer>\n    );\n  };\n\n  const renderAppToolbar = () => {\n    if (appState.viewModeEnabled) {\n      return (\n        <div className=\"App-toolbar-content\">\n          <mainMenuTunnel.Out />\n        </div>\n      );\n    }\n\n    return (\n      <div className=\"App-toolbar-content\">\n        <mainMenuTunnel.Out />\n        {actionManager.renderAction(\"toggleEditMenu\")}\n        {actionManager.renderAction(\"undo\")}\n        {actionManager.renderAction(\"redo\")}\n        {actionManager.renderAction(\n          appState.multiElement ? \"finalize\" : \"duplicateSelection\",\n        )}\n        {actionManager.renderAction(\"deleteSelectedElements\")}\n      </div>\n    );\n  };\n\n  return (\n    <>\n      {renderSidebars()}\n      {!appState.viewModeEnabled && renderToolbar()}\n      {!appState.openMenu && appState.showStats && (\n        <Stats\n          appState={appState}\n          setAppState={setAppState}\n          elements={elements}\n          onClose={() => {\n            actionManager.executeAction(actionToggleStats);\n          }}\n          renderCustomStats={renderCustomStats}\n        />\n      )}\n      <div\n        className=\"App-bottom-bar\"\n        style={{\n          marginBottom: SCROLLBAR_WIDTH + SCROLLBAR_MARGIN * 2,\n          marginLeft: SCROLLBAR_WIDTH + SCROLLBAR_MARGIN * 2,\n          marginRight: SCROLLBAR_WIDTH + SCROLLBAR_MARGIN * 2,\n        }}\n      >\n        <Island padding={0}>\n          {appState.openMenu === \"shape\" &&\n          !appState.viewModeEnabled &&\n          showSelectedShapeActions(appState, elements) ? (\n            <Section className=\"App-mobile-menu\" heading=\"selectedShapeActions\">\n              <SelectedShapeActions\n                appState={appState}\n                elements={elements}\n                renderAction={actionManager.renderAction}\n              />\n            </Section>\n          ) : null}\n          <footer className=\"App-toolbar\">\n            {renderAppToolbar()}\n            {appState.scrolledOutside &&\n              !appState.openMenu &&\n              appState.openSidebar !== \"library\" && (\n                <button\n                  className=\"scroll-back-to-content\"\n                  onClick={() => {\n                    setAppState({\n                      ...calculateScrollCenter(elements, appState, canvas),\n                    });\n                  }}\n                >\n                  {t(\"buttons.scrollBackToContent\")}\n                </button>\n              )}\n          </footer>\n        </Island>\n      </div>\n    </>\n  );\n};\n","import oc from \"open-color\";\nimport React, { useLayoutEffect, useRef, useState } from \"react\";\nimport { trackEvent } from \"../analytics\";\nimport { ChartElements, renderSpreadsheet, Spreadsheet } from \"../charts\";\nimport { ChartType } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { exportToSvg } from \"../scene/export\";\nimport { AppState, LibraryItem } from \"../types\";\nimport { Dialog } from \"./Dialog\";\nimport \"./PasteChartDialog.scss\";\n\ntype OnInsertChart = (chartType: ChartType, elements: ChartElements) => void;\n\nconst ChartPreviewBtn = (props: {\n  spreadsheet: Spreadsheet | null;\n  chartType: ChartType;\n  selected: boolean;\n  onClick: OnInsertChart;\n}) => {\n  const previewRef = useRef<HTMLDivElement | null>(null);\n  const [chartElements, setChartElements] = useState<ChartElements | null>(\n    null,\n  );\n\n  useLayoutEffect(() => {\n    if (!props.spreadsheet) {\n      return;\n    }\n\n    const elements = renderSpreadsheet(\n      props.chartType,\n      props.spreadsheet,\n      0,\n      0,\n    );\n    setChartElements(elements);\n    let svg: SVGSVGElement;\n    const previewNode = previewRef.current!;\n\n    (async () => {\n      svg = await exportToSvg(\n        elements,\n        {\n          exportBackground: false,\n          viewBackgroundColor: oc.white,\n        },\n        null, // files\n      );\n      svg.querySelector(\".style-fonts\")?.remove();\n      previewNode.replaceChildren();\n      previewNode.appendChild(svg);\n\n      if (props.selected) {\n        (previewNode.parentNode as HTMLDivElement).focus();\n      }\n    })();\n\n    return () => {\n      previewNode.replaceChildren();\n    };\n  }, [props.spreadsheet, props.chartType, props.selected]);\n\n  return (\n    <button\n      className=\"ChartPreview\"\n      onClick={() => {\n        if (chartElements) {\n          props.onClick(props.chartType, chartElements);\n        }\n      }}\n    >\n      <div ref={previewRef} />\n    </button>\n  );\n};\n\nexport const PasteChartDialog = ({\n  setAppState,\n  appState,\n  onClose,\n  onInsertChart,\n}: {\n  appState: AppState;\n  onClose: () => void;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  onInsertChart: (elements: LibraryItem[\"elements\"]) => void;\n}) => {\n  const handleClose = React.useCallback(() => {\n    if (onClose) {\n      onClose();\n    }\n  }, [onClose]);\n\n  const handleChartClick = (chartType: ChartType, elements: ChartElements) => {\n    onInsertChart(elements);\n    trackEvent(\"magic\", \"chart\", chartType);\n    setAppState({\n      currentChartType: chartType,\n      pasteDialog: {\n        shown: false,\n        data: null,\n      },\n    });\n  };\n\n  return (\n    <Dialog\n      small\n      onCloseRequest={handleClose}\n      title={t(\"labels.pasteCharts\")}\n      className={\"PasteChartDialog\"}\n      autofocus={false}\n    >\n      <div className={\"container\"}>\n        <ChartPreviewBtn\n          chartType=\"bar\"\n          spreadsheet={appState.pasteDialog.data}\n          selected={appState.currentChartType === \"bar\"}\n          onClick={handleChartClick}\n        />\n        <ChartPreviewBtn\n          chartType=\"line\"\n          spreadsheet={appState.pasteDialog.data}\n          selected={appState.currentChartType === \"line\"}\n          onClick={handleChartClick}\n        />\n      </div>\n    </Dialog>\n  );\n};\n","import React from \"react\";\nimport { t } from \"../i18n\";\nimport { KEYS } from \"../keys\";\nimport { Dialog } from \"./Dialog\";\nimport { getShortcutKey } from \"../utils\";\nimport \"./HelpDialog.scss\";\nimport { ExternalLinkIcon } from \"./icons\";\nimport { probablySupportsClipboardBlob } from \"../clipboard\";\nimport { isDarwin, isFirefox, isWindows } from \"../constants\";\n\nconst Header = () => (\n  <div className=\"HelpDialog__header\">\n    <a\n      className=\"HelpDialog__btn\"\n      href=\"https://github.com/excalidraw/excalidraw#documentation\"\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n    >\n      {t(\"helpDialog.documentation\")}\n      <div className=\"HelpDialog__link-icon\">{ExternalLinkIcon}</div>\n    </a>\n    <a\n      className=\"HelpDialog__btn\"\n      href=\"https://blog.excalidraw.com\"\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n    >\n      {t(\"helpDialog.blog\")}\n      <div className=\"HelpDialog__link-icon\">{ExternalLinkIcon}</div>\n    </a>\n    <a\n      className=\"HelpDialog__btn\"\n      href=\"https://github.com/excalidraw/excalidraw/issues\"\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n    >\n      {t(\"helpDialog.github\")}\n      <div className=\"HelpDialog__link-icon\">{ExternalLinkIcon}</div>\n    </a>\n  </div>\n);\n\nconst Section = (props: { title: string; children: React.ReactNode }) => (\n  <>\n    <h3>{props.title}</h3>\n    <div className=\"HelpDialog__islands-container\">{props.children}</div>\n  </>\n);\n\nconst ShortcutIsland = (props: {\n  caption: string;\n  children: React.ReactNode;\n  className?: string;\n}) => (\n  <div className={`HelpDialog__island ${props.className}`}>\n    <h4 className=\"HelpDialog__island-title\">{props.caption}</h4>\n    <div className=\"HelpDialog__island-content\">{props.children}</div>\n  </div>\n);\n\nfunction* intersperse(as: JSX.Element[][], delim: string | null) {\n  let first = true;\n  for (const x of as) {\n    if (!first) {\n      yield delim;\n    }\n    first = false;\n    yield x;\n  }\n}\n\nconst upperCaseSingleChars = (str: string) => {\n  return str.replace(/\\b[a-z]\\b/, (c) => c.toUpperCase());\n};\n\nconst Shortcut = ({\n  label,\n  shortcuts,\n  isOr = true,\n}: {\n  label: string;\n  shortcuts: string[];\n  isOr?: boolean;\n}) => {\n  const splitShortcutKeys = shortcuts.map((shortcut) => {\n    const keys = shortcut.endsWith(\"++\")\n      ? [...shortcut.slice(0, -2).split(\"+\"), \"+\"]\n      : shortcut.split(\"+\");\n\n    return keys.map((key) => (\n      <ShortcutKey key={key}>{upperCaseSingleChars(key)}</ShortcutKey>\n    ));\n  });\n\n  return (\n    <div className=\"HelpDialog__shortcut\">\n      <div>{label}</div>\n      <div className=\"HelpDialog__key-container\">\n        {[...intersperse(splitShortcutKeys, isOr ? t(\"helpDialog.or\") : null)]}\n      </div>\n    </div>\n  );\n};\n\nconst ShortcutKey = (props: { children: React.ReactNode }) => (\n  <kbd className=\"HelpDialog__key\" {...props} />\n);\n\nexport const HelpDialog = ({ onClose }: { onClose?: () => void }) => {\n  const handleClose = React.useCallback(() => {\n    if (onClose) {\n      onClose();\n    }\n  }, [onClose]);\n\n  return (\n    <>\n      <Dialog\n        onCloseRequest={handleClose}\n        title={t(\"helpDialog.title\")}\n        className={\"HelpDialog\"}\n      >\n        <Header />\n        <Section title={t(\"helpDialog.shortcuts\")}>\n          <ShortcutIsland\n            className=\"HelpDialog__island--tools\"\n            caption={t(\"helpDialog.tools\")}\n          >\n            <Shortcut label={t(\"toolBar.hand\")} shortcuts={[KEYS.H]} />\n            <Shortcut\n              label={t(\"toolBar.selection\")}\n              shortcuts={[KEYS.V, KEYS[\"1\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.rectangle\")}\n              shortcuts={[KEYS.R, KEYS[\"2\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.diamond\")}\n              shortcuts={[KEYS.D, KEYS[\"3\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.ellipse\")}\n              shortcuts={[KEYS.O, KEYS[\"4\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.arrow\")}\n              shortcuts={[KEYS.A, KEYS[\"5\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.line\")}\n              shortcuts={[KEYS.L, KEYS[\"6\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.freedraw\")}\n              shortcuts={[KEYS.P, KEYS[\"7\"]]}\n            />\n            <Shortcut\n              label={t(\"toolBar.text\")}\n              shortcuts={[KEYS.T, KEYS[\"8\"]]}\n            />\n            <Shortcut label={t(\"toolBar.image\")} shortcuts={[KEYS[\"9\"]]} />\n            <Shortcut\n              label={t(\"toolBar.eraser\")}\n              shortcuts={[KEYS.E, KEYS[\"0\"]]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.editSelectedShape\")}\n              shortcuts={[\n                getShortcutKey(\"CtrlOrCmd+Enter\"),\n                getShortcutKey(`CtrlOrCmd + ${t(\"helpDialog.doubleClick\")}`),\n              ]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.textNewLine\")}\n              shortcuts={[\n                getShortcutKey(\"Enter\"),\n                getShortcutKey(\"Shift+Enter\"),\n              ]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.textFinish\")}\n              shortcuts={[\n                getShortcutKey(\"Esc\"),\n                getShortcutKey(\"CtrlOrCmd+Enter\"),\n              ]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.curvedArrow\")}\n              shortcuts={[\n                \"A\",\n                t(\"helpDialog.click\"),\n                t(\"helpDialog.click\"),\n                t(\"helpDialog.click\"),\n              ]}\n              isOr={false}\n            />\n            <Shortcut\n              label={t(\"helpDialog.curvedLine\")}\n              shortcuts={[\n                \"L\",\n                t(\"helpDialog.click\"),\n                t(\"helpDialog.click\"),\n                t(\"helpDialog.click\"),\n              ]}\n              isOr={false}\n            />\n            <Shortcut label={t(\"toolBar.lock\")} shortcuts={[KEYS.Q]} />\n            <Shortcut\n              label={t(\"helpDialog.preventBinding\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd\")]}\n            />\n            <Shortcut\n              label={t(\"toolBar.link\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+K\")]}\n            />\n          </ShortcutIsland>\n          <ShortcutIsland\n            className=\"HelpDialog__island--view\"\n            caption={t(\"helpDialog.view\")}\n          >\n            <Shortcut\n              label={t(\"buttons.zoomIn\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd++\")]}\n            />\n            <Shortcut\n              label={t(\"buttons.zoomOut\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+-\")]}\n            />\n            <Shortcut\n              label={t(\"buttons.resetZoom\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+0\")]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.zoomToFit\")}\n              shortcuts={[\"Shift+1\"]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.zoomToSelection\")}\n              shortcuts={[\"Shift+2\"]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.movePageUpDown\")}\n              shortcuts={[\"PgUp/PgDn\"]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.movePageLeftRight\")}\n              shortcuts={[\"Shift+PgUp/PgDn\"]}\n            />\n            <Shortcut label={t(\"buttons.fullScreen\")} shortcuts={[\"F\"]} />\n            <Shortcut\n              label={t(\"buttons.zenMode\")}\n              shortcuts={[getShortcutKey(\"Alt+Z\")]}\n            />\n            <Shortcut\n              label={t(\"labels.showGrid\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+'\")]}\n            />\n            <Shortcut\n              label={t(\"labels.viewMode\")}\n              shortcuts={[getShortcutKey(\"Alt+R\")]}\n            />\n            <Shortcut\n              label={t(\"labels.toggleTheme\")}\n              shortcuts={[getShortcutKey(\"Alt+Shift+D\")]}\n            />\n            <Shortcut\n              label={t(\"stats.title\")}\n              shortcuts={[getShortcutKey(\"Alt+/\")]}\n            />\n          </ShortcutIsland>\n          <ShortcutIsland\n            className=\"HelpDialog__island--editor\"\n            caption={t(\"helpDialog.editor\")}\n          >\n            <Shortcut\n              label={t(\"labels.moveCanvas\")}\n              shortcuts={[\n                getShortcutKey(`Space+${t(\"helpDialog.drag\")}`),\n                getShortcutKey(`Wheel+${t(\"helpDialog.drag\")}`),\n              ]}\n              isOr={true}\n            />\n            <Shortcut\n              label={t(\"buttons.clearReset\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Delete\")]}\n            />\n            <Shortcut\n              label={t(\"labels.delete\")}\n              shortcuts={[getShortcutKey(\"Delete\")]}\n            />\n            <Shortcut\n              label={t(\"labels.cut\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+X\")]}\n            />\n            <Shortcut\n              label={t(\"labels.copy\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+C\")]}\n            />\n            <Shortcut\n              label={t(\"labels.paste\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+V\")]}\n            />\n            <Shortcut\n              label={t(\"labels.pasteAsPlaintext\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+V\")]}\n            />\n            <Shortcut\n              label={t(\"labels.selectAll\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+A\")]}\n            />\n            <Shortcut\n              label={t(\"labels.multiSelect\")}\n              shortcuts={[getShortcutKey(`Shift+${t(\"helpDialog.click\")}`)]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.deepSelect\")}\n              shortcuts={[getShortcutKey(`CtrlOrCmd+${t(\"helpDialog.click\")}`)]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.deepBoxSelect\")}\n              shortcuts={[getShortcutKey(`CtrlOrCmd+${t(\"helpDialog.drag\")}`)]}\n            />\n            {/* firefox supports clipboard API under a flag, so we'll\n                show users what they can do in the error message */}\n            {(probablySupportsClipboardBlob || isFirefox) && (\n              <Shortcut\n                label={t(\"labels.copyAsPng\")}\n                shortcuts={[getShortcutKey(\"Shift+Alt+C\")]}\n              />\n            )}\n            <Shortcut\n              label={t(\"labels.copyStyles\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Alt+C\")]}\n            />\n            <Shortcut\n              label={t(\"labels.pasteStyles\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Alt+V\")]}\n            />\n            <Shortcut\n              label={t(\"labels.sendToBack\")}\n              shortcuts={[\n                isDarwin\n                  ? getShortcutKey(\"CtrlOrCmd+Alt+[\")\n                  : getShortcutKey(\"CtrlOrCmd+Shift+[\"),\n              ]}\n            />\n            <Shortcut\n              label={t(\"labels.bringToFront\")}\n              shortcuts={[\n                isDarwin\n                  ? getShortcutKey(\"CtrlOrCmd+Alt+]\")\n                  : getShortcutKey(\"CtrlOrCmd+Shift+]\"),\n              ]}\n            />\n            <Shortcut\n              label={t(\"labels.sendBackward\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+[\")]}\n            />\n            <Shortcut\n              label={t(\"labels.bringForward\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+]\")]}\n            />\n            <Shortcut\n              label={t(\"labels.alignTop\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+Up\")]}\n            />\n            <Shortcut\n              label={t(\"labels.alignBottom\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+Down\")]}\n            />\n            <Shortcut\n              label={t(\"labels.alignLeft\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+Left\")]}\n            />\n            <Shortcut\n              label={t(\"labels.alignRight\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+Right\")]}\n            />\n            <Shortcut\n              label={t(\"labels.duplicateSelection\")}\n              shortcuts={[\n                getShortcutKey(\"CtrlOrCmd+D\"),\n                getShortcutKey(`Alt+${t(\"helpDialog.drag\")}`),\n              ]}\n            />\n            <Shortcut\n              label={t(\"helpDialog.toggleElementLock\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+L\")]}\n            />\n            <Shortcut\n              label={t(\"buttons.undo\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Z\")]}\n            />\n            <Shortcut\n              label={t(\"buttons.redo\")}\n              shortcuts={\n                isWindows\n                  ? [\n                      getShortcutKey(\"CtrlOrCmd+Y\"),\n                      getShortcutKey(\"CtrlOrCmd+Shift+Z\"),\n                    ]\n                  : [getShortcutKey(\"CtrlOrCmd+Shift+Z\")]\n              }\n            />\n            <Shortcut\n              label={t(\"labels.group\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+G\")]}\n            />\n            <Shortcut\n              label={t(\"labels.ungroup\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+G\")]}\n            />\n            <Shortcut\n              label={t(\"labels.flipHorizontal\")}\n              shortcuts={[getShortcutKey(\"Shift+H\")]}\n            />\n            <Shortcut\n              label={t(\"labels.flipVertical\")}\n              shortcuts={[getShortcutKey(\"Shift+V\")]}\n            />\n            <Shortcut\n              label={t(\"labels.showStroke\")}\n              shortcuts={[getShortcutKey(\"S\")]}\n            />\n            <Shortcut\n              label={t(\"labels.showBackground\")}\n              shortcuts={[getShortcutKey(\"G\")]}\n            />\n            <Shortcut\n              label={t(\"labels.decreaseFontSize\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+<\")]}\n            />\n            <Shortcut\n              label={t(\"labels.increaseFontSize\")}\n              shortcuts={[getShortcutKey(\"CtrlOrCmd+Shift+>\")]}\n            />\n          </ShortcutIsland>\n        </Section>\n      </Dialog>\n    </>\n  );\n};\n","import React from \"react\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\n\nimport { AppState, ExportOpts, BinaryFiles } from \"../types\";\nimport { Dialog } from \"./Dialog\";\nimport { exportToFileIcon, LinkIcon } from \"./icons\";\nimport { ToolButton } from \"./ToolButton\";\nimport { actionSaveFileToDisk } from \"../actions/actionExport\";\nimport { Card } from \"./Card\";\n\nimport \"./ExportDialog.scss\";\nimport { nativeFileSystemSupported } from \"../data/filesystem\";\nimport { trackEvent } from \"../analytics\";\nimport { ActionManager } from \"../actions/manager\";\nimport { getFrame } from \"../utils\";\n\nexport type ExportCB = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  scale?: number,\n) => void;\n\nconst JSONExportModal = ({\n  elements,\n  appState,\n  files,\n  actionManager,\n  exportOpts,\n  canvas,\n}: {\n  appState: AppState;\n  files: BinaryFiles;\n  elements: readonly NonDeletedExcalidrawElement[];\n  actionManager: ActionManager;\n  onCloseRequest: () => void;\n  exportOpts: ExportOpts;\n  canvas: HTMLCanvasElement | null;\n}) => {\n  const { onExportToBackend } = exportOpts;\n  return (\n    <div className=\"ExportDialog ExportDialog--json\">\n      <div className=\"ExportDialog-cards\">\n        {exportOpts.saveFileToDisk && (\n          <Card color=\"lime\">\n            <div className=\"Card-icon\">{exportToFileIcon}</div>\n            <h2>{t(\"exportDialog.disk_title\")}</h2>\n            <div className=\"Card-details\">\n              {t(\"exportDialog.disk_details\")}\n              {!nativeFileSystemSupported &&\n                actionManager.renderAction(\"changeProjectName\")}\n            </div>\n            <ToolButton\n              className=\"Card-button\"\n              type=\"button\"\n              title={t(\"exportDialog.disk_button\")}\n              aria-label={t(\"exportDialog.disk_button\")}\n              showAriaLabel={true}\n              onClick={() => {\n                actionManager.executeAction(actionSaveFileToDisk, \"ui\");\n              }}\n            />\n          </Card>\n        )}\n        {onExportToBackend && (\n          <Card color=\"pink\">\n            <div className=\"Card-icon\">{LinkIcon}</div>\n            <h2>{t(\"exportDialog.link_title\")}</h2>\n            <div className=\"Card-details\">{t(\"exportDialog.link_details\")}</div>\n            <ToolButton\n              className=\"Card-button\"\n              type=\"button\"\n              title={t(\"exportDialog.link_button\")}\n              aria-label={t(\"exportDialog.link_button\")}\n              showAriaLabel={true}\n              onClick={() => {\n                onExportToBackend(elements, appState, files, canvas);\n                trackEvent(\"export\", \"link\", `ui (${getFrame()})`);\n              }}\n            />\n          </Card>\n        )}\n        {exportOpts.renderCustomUI &&\n          exportOpts.renderCustomUI(elements, appState, files, canvas)}\n      </div>\n    </div>\n  );\n};\n\nexport const JSONExportDialog = ({\n  elements,\n  appState,\n  files,\n  actionManager,\n  exportOpts,\n  canvas,\n  setAppState,\n}: {\n  elements: readonly NonDeletedExcalidrawElement[];\n  appState: AppState;\n  files: BinaryFiles;\n  actionManager: ActionManager;\n  exportOpts: ExportOpts;\n  canvas: HTMLCanvasElement | null;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n}) => {\n  const handleClose = React.useCallback(() => {\n    setAppState({ openDialog: null });\n  }, [setAppState]);\n\n  return (\n    <>\n      {appState.openDialog === \"jsonExport\" && (\n        <Dialog onCloseRequest={handleClose} title={t(\"buttons.export\")}>\n          <JSONExportModal\n            elements={elements}\n            appState={appState}\n            files={files}\n            actionManager={actionManager}\n            onCloseRequest={handleClose}\n            exportOpts={exportOpts}\n            canvas={canvas}\n          />\n        </Dialog>\n      )}\n    </>\n  );\n};\n","import clsx from \"clsx\";\nimport oc from \"open-color\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useDevice } from \"../components/App\";\nimport { exportToSvg } from \"../scene/export\";\nimport { LibraryItem } from \"../types\";\nimport \"./LibraryUnit.scss\";\nimport { CheckboxItem } from \"./CheckboxItem\";\nimport { PlusIcon } from \"./icons\";\n\nexport const LibraryUnit = ({\n  id,\n  elements,\n  isPending,\n  onClick,\n  selected,\n  onToggle,\n  onDrag,\n}: {\n  id: LibraryItem[\"id\"] | /** for pending item */ null;\n  elements?: LibraryItem[\"elements\"];\n  isPending?: boolean;\n  onClick: () => void;\n  selected: boolean;\n  onToggle: (id: string, event: React.MouseEvent) => void;\n  onDrag: (id: string, event: React.DragEvent) => void;\n}) => {\n  const ref = useRef<HTMLDivElement | null>(null);\n  useEffect(() => {\n    const node = ref.current;\n    if (!node) {\n      return;\n    }\n\n    (async () => {\n      if (!elements) {\n        return;\n      }\n      const svg = await exportToSvg(\n        elements,\n        {\n          exportBackground: false,\n          viewBackgroundColor: oc.white,\n        },\n        null,\n      );\n      svg.querySelector(\".style-fonts\")?.remove();\n      node.innerHTML = svg.outerHTML;\n    })();\n\n    return () => {\n      node.innerHTML = \"\";\n    };\n  }, [elements]);\n\n  const [isHovered, setIsHovered] = useState(false);\n  const isMobile = useDevice().isMobile;\n  const adder = isPending && (\n    <div className=\"library-unit__adder\">{PlusIcon}</div>\n  );\n\n  return (\n    <div\n      className={clsx(\"library-unit\", {\n        \"library-unit__active\": elements,\n        \"library-unit--hover\": elements && isHovered,\n        \"library-unit--selected\": selected,\n      })}\n      onMouseEnter={() => setIsHovered(true)}\n      onMouseLeave={() => setIsHovered(false)}\n    >\n      <div\n        className={clsx(\"library-unit__dragger\", {\n          \"library-unit__pulse\": !!isPending,\n        })}\n        ref={ref}\n        draggable={!!elements}\n        onClick={\n          !!elements || !!isPending\n            ? (event) => {\n                if (id && event.shiftKey) {\n                  onToggle(id, event);\n                } else {\n                  onClick();\n                }\n              }\n            : undefined\n        }\n        onDragStart={(event) => {\n          if (!id) {\n            event.preventDefault();\n            return;\n          }\n          setIsHovered(false);\n          onDrag(id, event);\n        }}\n      />\n      {adder}\n      {id && elements && (isHovered || isMobile || selected) && (\n        <CheckboxItem\n          checked={selected}\n          onChange={(checked, event) => onToggle(id, event)}\n          className=\"library-unit__checkbox\"\n        />\n      )}\n    </div>\n  );\n};\n","import { VERSIONS } from \"../constants\";\nimport { t } from \"../i18n\";\nimport { AppState, ExcalidrawProps } from \"../types\";\n\nconst LibraryMenuBrowseButton = ({\n  theme,\n  id,\n  libraryReturnUrl,\n}: {\n  libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n  theme: AppState[\"theme\"];\n  id: string;\n}) => {\n  const referrer =\n    libraryReturnUrl || window.location.origin + window.location.pathname;\n  return (\n    <a\n      className=\"library-menu-browse-button\"\n      href={`${process.env.REACT_APP_LIBRARY_URL}?target=${\n        window.name || \"_blank\"\n      }&referrer=${referrer}&useHash=true&token=${id}&theme=${theme}&version=${\n        VERSIONS.excalidrawLibrary\n      }`}\n      target=\"_excalidraw_libraries\"\n    >\n      {t(\"labels.libraries\")}\n    </a>\n  );\n};\n\nexport default LibraryMenuBrowseButton;\n","import React, { useState } from \"react\";\nimport { serializeLibraryAsJSON } from \"../data/json\";\nimport { ExcalidrawElement, NonDeleted } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { AppState, ExcalidrawProps, LibraryItem, LibraryItems } from \"../types\";\nimport { arrayToMap, chunk } from \"../utils\";\nimport { LibraryUnit } from \"./LibraryUnit\";\nimport Stack from \"./Stack\";\n\nimport \"./LibraryMenuItems.scss\";\nimport { MIME_TYPES } from \"../constants\";\nimport Spinner from \"./Spinner\";\nimport LibraryMenuBrowseButton from \"./LibraryMenuBrowseButton\";\nimport clsx from \"clsx\";\n\nconst CELLS_PER_ROW = 4;\n\nconst LibraryMenuItems = ({\n  isLoading,\n  libraryItems,\n  onAddToLibrary,\n  onInsertLibraryItems,\n  pendingElements,\n  selectedItems,\n  onSelectItems,\n  theme,\n  id,\n  libraryReturnUrl,\n}: {\n  isLoading: boolean;\n  libraryItems: LibraryItems;\n  pendingElements: LibraryItem[\"elements\"];\n  onInsertLibraryItems: (libraryItems: LibraryItems) => void;\n  onAddToLibrary: (elements: LibraryItem[\"elements\"]) => void;\n  selectedItems: LibraryItem[\"id\"][];\n  onSelectItems: (id: LibraryItem[\"id\"][]) => void;\n  libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n  theme: AppState[\"theme\"];\n  id: string;\n}) => {\n  const [lastSelectedItem, setLastSelectedItem] = useState<\n    LibraryItem[\"id\"] | null\n  >(null);\n\n  const onItemSelectToggle = (\n    id: LibraryItem[\"id\"],\n    event: React.MouseEvent,\n  ) => {\n    const shouldSelect = !selectedItems.includes(id);\n\n    const orderedItems = [...unpublishedItems, ...publishedItems];\n\n    if (shouldSelect) {\n      if (event.shiftKey && lastSelectedItem) {\n        const rangeStart = orderedItems.findIndex(\n          (item) => item.id === lastSelectedItem,\n        );\n        const rangeEnd = orderedItems.findIndex((item) => item.id === id);\n\n        if (rangeStart === -1 || rangeEnd === -1) {\n          onSelectItems([...selectedItems, id]);\n          return;\n        }\n\n        const selectedItemsMap = arrayToMap(selectedItems);\n        const nextSelectedIds = orderedItems.reduce(\n          (acc: LibraryItem[\"id\"][], item, idx) => {\n            if (\n              (idx >= rangeStart && idx <= rangeEnd) ||\n              selectedItemsMap.has(item.id)\n            ) {\n              acc.push(item.id);\n            }\n            return acc;\n          },\n          [],\n        );\n\n        onSelectItems(nextSelectedIds);\n      } else {\n        onSelectItems([...selectedItems, id]);\n      }\n      setLastSelectedItem(id);\n    } else {\n      setLastSelectedItem(null);\n      onSelectItems(selectedItems.filter((_id) => _id !== id));\n    }\n  };\n\n  const getInsertedElements = (id: string) => {\n    let targetElements;\n    if (selectedItems.includes(id)) {\n      targetElements = libraryItems.filter((item) =>\n        selectedItems.includes(item.id),\n      );\n    } else {\n      targetElements = libraryItems.filter((item) => item.id === id);\n    }\n    return targetElements;\n  };\n\n  const createLibraryItemCompo = (params: {\n    item:\n      | LibraryItem\n      | /* pending library item */ {\n          id: null;\n          elements: readonly NonDeleted<ExcalidrawElement>[];\n        }\n      | null;\n    onClick?: () => void;\n    key: string;\n  }) => {\n    return (\n      <Stack.Col key={params.key}>\n        <LibraryUnit\n          elements={params.item?.elements}\n          isPending={!params.item?.id && !!params.item?.elements}\n          onClick={params.onClick || (() => {})}\n          id={params.item?.id || null}\n          selected={!!params.item?.id && selectedItems.includes(params.item.id)}\n          onToggle={onItemSelectToggle}\n          onDrag={(id, event) => {\n            event.dataTransfer.setData(\n              MIME_TYPES.excalidrawlib,\n              serializeLibraryAsJSON(getInsertedElements(id)),\n            );\n          }}\n        />\n      </Stack.Col>\n    );\n  };\n\n  const renderLibrarySection = (\n    items: (\n      | LibraryItem\n      | /* pending library item */ {\n          id: null;\n          elements: readonly NonDeleted<ExcalidrawElement>[];\n        }\n    )[],\n  ) => {\n    const _items = items.map((item) => {\n      if (item.id) {\n        return createLibraryItemCompo({\n          item,\n          onClick: () => onInsertLibraryItems(getInsertedElements(item.id)),\n          key: item.id,\n        });\n      }\n      return createLibraryItemCompo({\n        key: \"__pending__item__\",\n        item,\n        onClick: () => onAddToLibrary(pendingElements),\n      });\n    });\n\n    // ensure we render all empty cells if no items are present\n    let rows = chunk(_items, CELLS_PER_ROW);\n    if (!rows.length) {\n      rows = [[]];\n    }\n\n    return rows.map((rowItems, index, rows) => {\n      if (index === rows.length - 1) {\n        // pad row with empty cells\n        rowItems = rowItems.concat(\n          new Array(CELLS_PER_ROW - rowItems.length)\n            .fill(null)\n            .map((_, index) => {\n              return createLibraryItemCompo({\n                key: `empty_${index}`,\n                item: null,\n              });\n            }),\n        );\n      }\n      return (\n        <Stack.Row\n          align=\"center\"\n          key={index}\n          className=\"library-menu-items-container__row\"\n        >\n          {rowItems}\n        </Stack.Row>\n      );\n    });\n  };\n\n  const unpublishedItems = libraryItems.filter(\n    (item) => item.status !== \"published\",\n  );\n  const publishedItems = libraryItems.filter(\n    (item) => item.status === \"published\",\n  );\n\n  const showBtn =\n    !libraryItems.length &&\n    !unpublishedItems.length &&\n    !publishedItems.length &&\n    !pendingElements.length;\n\n  return (\n    <div\n      className=\"library-menu-items-container\"\n      style={\n        pendingElements.length ||\n        unpublishedItems.length ||\n        publishedItems.length\n          ? { justifyContent: \"flex-start\" }\n          : {}\n      }\n    >\n      <Stack.Col\n        className=\"library-menu-items-container__items\"\n        align=\"start\"\n        gap={1}\n        style={{\n          flex: publishedItems.length > 0 ? 1 : \"0 1 auto\",\n          marginBottom: 0,\n        }}\n      >\n        <>\n          <div>\n            {(pendingElements.length > 0 ||\n              unpublishedItems.length > 0 ||\n              publishedItems.length > 0) && (\n              <div className=\"library-menu-items-container__header\">\n                {t(\"labels.personalLib\")}\n              </div>\n            )}\n            {isLoading && (\n              <div\n                style={{\n                  position: \"absolute\",\n                  top: \"var(--container-padding-y)\",\n                  right: \"var(--container-padding-x)\",\n                  transform: \"translateY(50%)\",\n                }}\n              >\n                <Spinner />\n              </div>\n            )}\n          </div>\n          {!pendingElements.length && !unpublishedItems.length ? (\n            <div className=\"library-menu-items__no-items\">\n              <div\n                className={clsx({\n                  \"library-menu-items__no-items__label\": showBtn,\n                })}\n              >\n                {t(\"library.noItems\")}\n              </div>\n              <div className=\"library-menu-items__no-items__hint\">\n                {publishedItems.length > 0\n                  ? t(\"library.hint_emptyPrivateLibrary\")\n                  : t(\"library.hint_emptyLibrary\")}\n              </div>\n            </div>\n          ) : (\n            renderLibrarySection([\n              // append pending library item\n              ...(pendingElements.length\n                ? [{ id: null, elements: pendingElements }]\n                : []),\n              ...unpublishedItems,\n            ])\n          )}\n        </>\n\n        <>\n          {(publishedItems.length > 0 ||\n            pendingElements.length > 0 ||\n            unpublishedItems.length > 0) && (\n            <div className=\"library-menu-items-container__header library-menu-items-container__header--excal\">\n              {t(\"labels.excalidrawLib\")}\n            </div>\n          )}\n          {publishedItems.length > 0 ? (\n            renderLibrarySection(publishedItems)\n          ) : unpublishedItems.length > 0 ? (\n            <div\n              style={{\n                margin: \"1rem 0\",\n                display: \"flex\",\n                flexDirection: \"column\",\n                alignItems: \"center\",\n                justifyContent: \"center\",\n                width: \"100%\",\n                fontSize: \".9rem\",\n              }}\n            >\n              {t(\"library.noItems\")}\n            </div>\n          ) : null}\n        </>\n\n        {showBtn && (\n          <LibraryMenuBrowseButton\n            id={id}\n            libraryReturnUrl={libraryReturnUrl}\n            theme={theme}\n          />\n        )}\n      </Stack.Col>\n    </div>\n  );\n};\n\nexport default LibraryMenuItems;\n","import {\n  useRef,\n  useState,\n  useEffect,\n  useCallback,\n  RefObject,\n  forwardRef,\n} from \"react\";\nimport Library, {\n  distributeLibraryItemsOnSquareGrid,\n  libraryItemsAtom,\n} from \"../data/library\";\nimport { t } from \"../i18n\";\nimport { randomId } from \"../random\";\nimport { LibraryItems, LibraryItem, AppState, ExcalidrawProps } from \"../types\";\n\nimport \"./LibraryMenu.scss\";\nimport LibraryMenuItems from \"./LibraryMenuItems\";\nimport { EVENT } from \"../constants\";\nimport { KEYS } from \"../keys\";\nimport { trackEvent } from \"../analytics\";\nimport { useAtom } from \"jotai\";\nimport { jotaiScope } from \"../jotai\";\nimport Spinner from \"./Spinner\";\nimport {\n  useDevice,\n  useExcalidrawElements,\n  useExcalidrawSetAppState,\n} from \"./App\";\nimport { Sidebar } from \"./Sidebar/Sidebar\";\nimport { getSelectedElements } from \"../scene\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { LibraryMenuHeader } from \"./LibraryMenuHeaderContent\";\nimport LibraryMenuBrowseButton from \"./LibraryMenuBrowseButton\";\n\nconst useOnClickOutside = (\n  ref: RefObject<HTMLElement>,\n  cb: (event: MouseEvent) => void,\n) => {\n  useEffect(() => {\n    const listener = (event: MouseEvent) => {\n      if (!ref.current) {\n        return;\n      }\n\n      if (\n        event.target instanceof Element &&\n        (ref.current.contains(event.target) ||\n          !document.body.contains(event.target))\n      ) {\n        return;\n      }\n\n      cb(event);\n    };\n    document.addEventListener(\"pointerdown\", listener, false);\n\n    return () => {\n      document.removeEventListener(\"pointerdown\", listener);\n    };\n  }, [ref, cb]);\n};\n\nconst LibraryMenuWrapper = forwardRef<\n  HTMLDivElement,\n  { children: React.ReactNode }\n>(({ children }, ref) => {\n  return (\n    <div ref={ref} className=\"layer-ui__library\">\n      {children}\n    </div>\n  );\n});\n\nexport const LibraryMenuContent = ({\n  onInsertLibraryItems,\n  pendingElements,\n  onAddToLibrary,\n  setAppState,\n  libraryReturnUrl,\n  library,\n  id,\n  appState,\n  selectedItems,\n  onSelectItems,\n}: {\n  pendingElements: LibraryItem[\"elements\"];\n  onInsertLibraryItems: (libraryItems: LibraryItems) => void;\n  onAddToLibrary: () => void;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n  library: Library;\n  id: string;\n  appState: AppState;\n  selectedItems: LibraryItem[\"id\"][];\n  onSelectItems: (id: LibraryItem[\"id\"][]) => void;\n}) => {\n  const [libraryItemsData] = useAtom(libraryItemsAtom, jotaiScope);\n\n  const addToLibrary = useCallback(\n    async (elements: LibraryItem[\"elements\"], libraryItems: LibraryItems) => {\n      trackEvent(\"element\", \"addToLibrary\", \"ui\");\n      if (elements.some((element) => element.type === \"image\")) {\n        return setAppState({\n          errorMessage: \"Support for adding images to the library coming soon!\",\n        });\n      }\n      const nextItems: LibraryItems = [\n        {\n          status: \"unpublished\",\n          elements,\n          id: randomId(),\n          created: Date.now(),\n        },\n        ...libraryItems,\n      ];\n      onAddToLibrary();\n      library.setLibrary(nextItems).catch(() => {\n        setAppState({ errorMessage: t(\"alerts.errorAddingToLibrary\") });\n      });\n    },\n    [onAddToLibrary, library, setAppState],\n  );\n\n  if (\n    libraryItemsData.status === \"loading\" &&\n    !libraryItemsData.isInitialized\n  ) {\n    return (\n      <LibraryMenuWrapper>\n        <div className=\"layer-ui__library-message\">\n          <div>\n            <Spinner size=\"2em\" />\n            <span>{t(\"labels.libraryLoadingMessage\")}</span>\n          </div>\n        </div>\n      </LibraryMenuWrapper>\n    );\n  }\n\n  const showBtn =\n    libraryItemsData.libraryItems.length > 0 || pendingElements.length > 0;\n\n  return (\n    <LibraryMenuWrapper>\n      <LibraryMenuItems\n        isLoading={libraryItemsData.status === \"loading\"}\n        libraryItems={libraryItemsData.libraryItems}\n        onAddToLibrary={(elements) =>\n          addToLibrary(elements, libraryItemsData.libraryItems)\n        }\n        onInsertLibraryItems={onInsertLibraryItems}\n        pendingElements={pendingElements}\n        selectedItems={selectedItems}\n        onSelectItems={onSelectItems}\n        id={id}\n        libraryReturnUrl={libraryReturnUrl}\n        theme={appState.theme}\n      />\n      {showBtn && (\n        <LibraryMenuBrowseButton\n          id={id}\n          libraryReturnUrl={libraryReturnUrl}\n          theme={appState.theme}\n        />\n      )}\n    </LibraryMenuWrapper>\n  );\n};\n\nexport const LibraryMenu: React.FC<{\n  appState: AppState;\n  onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void;\n  libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n  focusContainer: () => void;\n  library: Library;\n  id: string;\n}> = ({\n  appState,\n  onInsertElements,\n  libraryReturnUrl,\n  focusContainer,\n  library,\n  id,\n}) => {\n  const setAppState = useExcalidrawSetAppState();\n  const elements = useExcalidrawElements();\n  const device = useDevice();\n\n  const [selectedItems, setSelectedItems] = useState<LibraryItem[\"id\"][]>([]);\n  const [libraryItemsData] = useAtom(libraryItemsAtom, jotaiScope);\n\n  const ref = useRef<HTMLDivElement | null>(null);\n\n  const closeLibrary = useCallback(() => {\n    const isDialogOpen = !!document.querySelector(\".Dialog\");\n\n    // Prevent closing if any dialog is open\n    if (isDialogOpen) {\n      return;\n    }\n    setAppState({ openSidebar: null });\n  }, [setAppState]);\n\n  useOnClickOutside(\n    ref,\n    useCallback(\n      (event) => {\n        // If click on the library icon, do nothing so that LibraryButton\n        // can toggle library menu\n        if ((event.target as Element).closest(\".ToolIcon__library\")) {\n          return;\n        }\n        if (!appState.isSidebarDocked || !device.canDeviceFitSidebar) {\n          closeLibrary();\n        }\n      },\n      [closeLibrary, appState.isSidebarDocked, device.canDeviceFitSidebar],\n    ),\n  );\n\n  useEffect(() => {\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (\n        event.key === KEYS.ESCAPE &&\n        (!appState.isSidebarDocked || !device.canDeviceFitSidebar)\n      ) {\n        closeLibrary();\n      }\n    };\n    document.addEventListener(EVENT.KEYDOWN, handleKeyDown);\n    return () => {\n      document.removeEventListener(EVENT.KEYDOWN, handleKeyDown);\n    };\n  }, [closeLibrary, appState.isSidebarDocked, device.canDeviceFitSidebar]);\n\n  const deselectItems = useCallback(() => {\n    setAppState({\n      selectedElementIds: {},\n      selectedGroupIds: {},\n    });\n  }, [setAppState]);\n\n  const removeFromLibrary = useCallback(\n    async (libraryItems: LibraryItems) => {\n      const nextItems = libraryItems.filter(\n        (item) => !selectedItems.includes(item.id),\n      );\n      library.setLibrary(nextItems).catch(() => {\n        setAppState({ errorMessage: t(\"alerts.errorRemovingFromLibrary\") });\n      });\n      setSelectedItems([]);\n    },\n    [library, setAppState, selectedItems, setSelectedItems],\n  );\n\n  const resetLibrary = useCallback(() => {\n    library.resetLibrary();\n    focusContainer();\n  }, [library, focusContainer]);\n\n  return (\n    <Sidebar\n      __isInternal\n      // necessary to remount when switching between internal\n      // and custom (host app) sidebar, so that the `props.onClose`\n      // is colled correctly\n      key=\"library\"\n      className=\"layer-ui__library-sidebar\"\n      initialDockedState={appState.isSidebarDocked}\n      onDock={(docked) => {\n        trackEvent(\n          \"library\",\n          `toggleLibraryDock (${docked ? \"dock\" : \"undock\"})`,\n          `sidebar (${device.isMobile ? \"mobile\" : \"desktop\"})`,\n        );\n      }}\n      ref={ref}\n    >\n      <Sidebar.Header className=\"layer-ui__library-header\">\n        <LibraryMenuHeader\n          appState={appState}\n          setAppState={setAppState}\n          selectedItems={selectedItems}\n          onSelectItems={setSelectedItems}\n          library={library}\n          onRemoveFromLibrary={() =>\n            removeFromLibrary(libraryItemsData.libraryItems)\n          }\n          resetLibrary={resetLibrary}\n        />\n      </Sidebar.Header>\n      <LibraryMenuContent\n        pendingElements={getSelectedElements(elements, appState, true)}\n        onInsertLibraryItems={(libraryItems) => {\n          onInsertElements(distributeLibraryItemsOnSquareGrid(libraryItems));\n        }}\n        onAddToLibrary={deselectItems}\n        setAppState={setAppState}\n        libraryReturnUrl={libraryReturnUrl}\n        library={library}\n        id={id}\n        appState={appState}\n        selectedItems={selectedItems}\n        onSelectItems={setSelectedItems}\n      />\n    </Sidebar>\n  );\n};\n","import { t } from \"../i18n\";\nimport { HelpIcon } from \"./icons\";\n\ntype HelpButtonProps = {\n  name?: string;\n  id?: string;\n  onClick?(): void;\n};\n\nexport const HelpButton = (props: HelpButtonProps) => (\n  <button\n    className=\"help-icon\"\n    onClick={props.onClick}\n    type=\"button\"\n    title={`${t(\"helpDialog.title\")} — ?`}\n    aria-label={t(\"helpDialog.title\")}\n  >\n    {HelpIcon}\n  </button>\n);\n","import clsx from \"clsx\";\nimport { actionShortcuts } from \"../../actions\";\nimport { ActionManager } from \"../../actions/manager\";\nimport { AppState } from \"../../types\";\nimport {\n  ExitZenModeAction,\n  FinalizeAction,\n  UndoRedoActions,\n  ZoomActions,\n} from \"../Actions\";\nimport { useDevice } from \"../App\";\nimport { useTunnels } from \"../context/tunnels\";\nimport { HelpButton } from \"../HelpButton\";\nimport { Section } from \"../Section\";\nimport Stack from \"../Stack\";\n\nconst Footer = ({\n  appState,\n  actionManager,\n  showExitZenModeBtn,\n  renderWelcomeScreen,\n}: {\n  appState: AppState;\n  actionManager: ActionManager;\n  showExitZenModeBtn: boolean;\n  renderWelcomeScreen: boolean;\n}) => {\n  const { footerCenterTunnel, welcomeScreenHelpHintTunnel } = useTunnels();\n\n  const device = useDevice();\n  const showFinalize =\n    !appState.viewModeEnabled && appState.multiElement && device.isTouchScreen;\n\n  return (\n    <footer\n      role=\"contentinfo\"\n      className=\"layer-ui__wrapper__footer App-menu App-menu_bottom\"\n    >\n      <div\n        className={clsx(\"layer-ui__wrapper__footer-left zen-mode-transition\", {\n          \"layer-ui__wrapper__footer-left--transition-left\":\n            appState.zenModeEnabled,\n        })}\n      >\n        <Stack.Col gap={2}>\n          <Section heading=\"canvasActions\">\n            <ZoomActions\n              renderAction={actionManager.renderAction}\n              zoom={appState.zoom}\n            />\n\n            {!appState.viewModeEnabled && (\n              <UndoRedoActions\n                renderAction={actionManager.renderAction}\n                className={clsx(\"zen-mode-transition\", {\n                  \"layer-ui__wrapper__footer-left--transition-bottom\":\n                    appState.zenModeEnabled,\n                })}\n              />\n            )}\n            {showFinalize && (\n              <FinalizeAction\n                renderAction={actionManager.renderAction}\n                className={clsx(\"zen-mode-transition\", {\n                  \"layer-ui__wrapper__footer-left--transition-left\":\n                    appState.zenModeEnabled,\n                })}\n              />\n            )}\n          </Section>\n        </Stack.Col>\n      </div>\n      <footerCenterTunnel.Out />\n      <div\n        className={clsx(\"layer-ui__wrapper__footer-right zen-mode-transition\", {\n          \"transition-right disable-pointerEvents\": appState.zenModeEnabled,\n        })}\n      >\n        <div style={{ position: \"relative\" }}>\n          {renderWelcomeScreen && <welcomeScreenHelpHintTunnel.Out />}\n          <HelpButton\n            onClick={() => actionManager.executeAction(actionShortcuts)}\n          />\n        </div>\n      </div>\n      <ExitZenModeAction\n        actionManager={actionManager}\n        showExitZenModeBtn={showExitZenModeBtn}\n      />\n    </footer>\n  );\n};\n\nexport default Footer;\nFooter.displayName = \"Footer\";\n","import clsx from \"clsx\";\nimport React from \"react\";\nimport { ActionManager } from \"../actions/manager\";\nimport { CLASSES, LIBRARY_SIDEBAR_WIDTH } from \"../constants\";\nimport { exportCanvas } from \"../data\";\nimport { isTextElement, showSelectedShapeActions } from \"../element\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { Language, t } from \"../i18n\";\nimport { calculateScrollCenter } from \"../scene\";\nimport { ExportType } from \"../scene/types\";\nimport { AppProps, AppState, ExcalidrawProps, BinaryFiles } from \"../types\";\nimport { isShallowEqual, muteFSAbortError } from \"../utils\";\nimport { SelectedShapeActions, ShapesSwitcher } from \"./Actions\";\nimport { ErrorDialog } from \"./ErrorDialog\";\nimport { ExportCB, ImageExportDialog } from \"./ImageExportDialog\";\nimport { FixedSideContainer } from \"./FixedSideContainer\";\nimport { HintViewer } from \"./HintViewer\";\nimport { Island } from \"./Island\";\nimport { LoadingMessage } from \"./LoadingMessage\";\nimport { LockButton } from \"./LockButton\";\nimport { MobileMenu } from \"./MobileMenu\";\nimport { PasteChartDialog } from \"./PasteChartDialog\";\nimport { Section } from \"./Section\";\nimport { HelpDialog } from \"./HelpDialog\";\nimport Stack from \"./Stack\";\nimport { UserList } from \"./UserList\";\nimport Library from \"../data/library\";\nimport { JSONExportDialog } from \"./JSONExportDialog\";\nimport { LibraryButton } from \"./LibraryButton\";\nimport { isImageFileHandle } from \"../data/blob\";\nimport { LibraryMenu } from \"./LibraryMenu\";\n\nimport \"./LayerUI.scss\";\nimport \"./Toolbar.scss\";\nimport { PenModeButton } from \"./PenModeButton\";\nimport { trackEvent } from \"../analytics\";\nimport { useDevice } from \"../components/App\";\nimport { Stats } from \"./Stats\";\nimport { actionToggleStats } from \"../actions/actionToggleStats\";\nimport Footer from \"./footer/Footer\";\nimport { hostSidebarCountersAtom } from \"./Sidebar/Sidebar\";\nimport { jotaiScope } from \"../jotai\";\nimport { Provider, useAtom } from \"jotai\";\nimport MainMenu from \"./main-menu/MainMenu\";\nimport { ActiveConfirmDialog } from \"./ActiveConfirmDialog\";\nimport { HandButton } from \"./HandButton\";\nimport { isHandToolActive } from \"../appState\";\nimport { TunnelsContext, useInitializeTunnels } from \"./context/tunnels\";\n\ninterface LayerUIProps {\n  actionManager: ActionManager;\n  appState: AppState;\n  files: BinaryFiles;\n  canvas: HTMLCanvasElement | null;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  elements: readonly NonDeletedExcalidrawElement[];\n  onLockToggle: () => void;\n  onHandToolToggle: () => void;\n  onPenModeToggle: () => void;\n  onInsertElements: (elements: readonly NonDeletedExcalidrawElement[]) => void;\n  showExitZenModeBtn: boolean;\n  langCode: Language[\"code\"];\n  renderTopRightUI?: ExcalidrawProps[\"renderTopRightUI\"];\n  renderCustomStats?: ExcalidrawProps[\"renderCustomStats\"];\n  renderCustomSidebar?: ExcalidrawProps[\"renderSidebar\"];\n  libraryReturnUrl: ExcalidrawProps[\"libraryReturnUrl\"];\n  UIOptions: AppProps[\"UIOptions\"];\n  focusContainer: () => void;\n  library: Library;\n  id: string;\n  onImageAction: (data: { insertOnCanvasDirectly: boolean }) => void;\n  renderWelcomeScreen: boolean;\n  children?: React.ReactNode;\n}\n\nconst DefaultMainMenu: React.FC<{\n  UIOptions: AppProps[\"UIOptions\"];\n}> = ({ UIOptions }) => {\n  return (\n    <MainMenu __fallback>\n      <MainMenu.DefaultItems.LoadScene />\n      <MainMenu.DefaultItems.SaveToActiveFile />\n      {/* FIXME we should to test for this inside the item itself */}\n      {UIOptions.canvasActions.export && <MainMenu.DefaultItems.Export />}\n      {/* FIXME we should to test for this inside the item itself */}\n      {UIOptions.canvasActions.saveAsImage && (\n        <MainMenu.DefaultItems.SaveAsImage />\n      )}\n      <MainMenu.DefaultItems.Help />\n      <MainMenu.DefaultItems.ClearCanvas />\n      <MainMenu.Separator />\n      <MainMenu.Group title=\"Excalidraw links\">\n        <MainMenu.DefaultItems.Socials />\n      </MainMenu.Group>\n      <MainMenu.Separator />\n      <MainMenu.DefaultItems.ToggleTheme />\n      <MainMenu.DefaultItems.ChangeCanvasBackground />\n    </MainMenu>\n  );\n};\n\nconst LayerUI = ({\n  actionManager,\n  appState,\n  files,\n  setAppState,\n  elements,\n  canvas,\n  onLockToggle,\n  onHandToolToggle,\n  onPenModeToggle,\n  onInsertElements,\n  showExitZenModeBtn,\n  renderTopRightUI,\n  renderCustomStats,\n  renderCustomSidebar,\n  libraryReturnUrl,\n  UIOptions,\n  focusContainer,\n  library,\n  id,\n  onImageAction,\n  renderWelcomeScreen,\n  children,\n}: LayerUIProps) => {\n  const device = useDevice();\n  const tunnels = useInitializeTunnels();\n\n  const renderJSONExportDialog = () => {\n    if (!UIOptions.canvasActions.export) {\n      return null;\n    }\n\n    return (\n      <JSONExportDialog\n        elements={elements}\n        appState={appState}\n        files={files}\n        actionManager={actionManager}\n        exportOpts={UIOptions.canvasActions.export}\n        canvas={canvas}\n        setAppState={setAppState}\n      />\n    );\n  };\n\n  const renderImageExportDialog = () => {\n    if (!UIOptions.canvasActions.saveAsImage) {\n      return null;\n    }\n\n    const createExporter =\n      (type: ExportType): ExportCB =>\n      async (exportedElements) => {\n        trackEvent(\"export\", type, \"ui\");\n        const fileHandle = await exportCanvas(\n          type,\n          exportedElements,\n          appState,\n          files,\n          {\n            exportBackground: appState.exportBackground,\n            name: appState.name,\n            viewBackgroundColor: appState.viewBackgroundColor,\n          },\n        )\n          .catch(muteFSAbortError)\n          .catch((error) => {\n            console.error(error);\n            setAppState({ errorMessage: error.message });\n          });\n\n        if (\n          appState.exportEmbedScene &&\n          fileHandle &&\n          isImageFileHandle(fileHandle)\n        ) {\n          setAppState({ fileHandle });\n        }\n      };\n\n    return (\n      <ImageExportDialog\n        elements={elements}\n        appState={appState}\n        setAppState={setAppState}\n        files={files}\n        actionManager={actionManager}\n        onExportToPng={createExporter(\"png\")}\n        onExportToSvg={createExporter(\"svg\")}\n        onExportToClipboard={createExporter(\"clipboard\")}\n      />\n    );\n  };\n\n  const renderCanvasActions = () => (\n    <div style={{ position: \"relative\" }}>\n      {/* wrapping to Fragment stops React from occasionally complaining\n                about identical Keys */}\n      <tunnels.mainMenuTunnel.Out />\n      {renderWelcomeScreen && <tunnels.welcomeScreenMenuHintTunnel.Out />}\n    </div>\n  );\n\n  const renderSelectedShapeActions = () => (\n    <Section\n      heading=\"selectedShapeActions\"\n      className={clsx(\"selected-shape-actions zen-mode-transition\", {\n        \"transition-left\": appState.zenModeEnabled,\n      })}\n    >\n      <Island\n        className={CLASSES.SHAPE_ACTIONS_MENU}\n        padding={2}\n        style={{\n          // we want to make sure this doesn't overflow so subtracting the\n          // approximate height of hamburgerMenu + footer\n          maxHeight: `${appState.height - 166}px`,\n        }}\n      >\n        <SelectedShapeActions\n          appState={appState}\n          elements={elements}\n          renderAction={actionManager.renderAction}\n        />\n      </Island>\n    </Section>\n  );\n\n  const renderFixedSideContainer = () => {\n    const shouldRenderSelectedShapeActions = showSelectedShapeActions(\n      appState,\n      elements,\n    );\n\n    return (\n      <FixedSideContainer side=\"top\">\n        <div className=\"App-menu App-menu_top\">\n          <Stack.Col\n            gap={6}\n            className={clsx(\"App-menu_top__left\", {\n              \"disable-pointerEvents\": appState.zenModeEnabled,\n            })}\n          >\n            {renderCanvasActions()}\n            {shouldRenderSelectedShapeActions && renderSelectedShapeActions()}\n          </Stack.Col>\n          {!appState.viewModeEnabled && (\n            <Section heading=\"shapes\" className=\"shapes-section\">\n              {(heading: React.ReactNode) => (\n                <div style={{ position: \"relative\" }}>\n                  {renderWelcomeScreen && (\n                    <tunnels.welcomeScreenToolbarHintTunnel.Out />\n                  )}\n                  <Stack.Col gap={4} align=\"start\">\n                    <Stack.Row\n                      gap={1}\n                      className={clsx(\"App-toolbar-container\", {\n                        \"zen-mode\": appState.zenModeEnabled,\n                      })}\n                    >\n                      <Island\n                        padding={1}\n                        className={clsx(\"App-toolbar\", {\n                          \"zen-mode\": appState.zenModeEnabled,\n                        })}\n                      >\n                        <HintViewer\n                          appState={appState}\n                          elements={elements}\n                          isMobile={device.isMobile}\n                          device={device}\n                        />\n                        {heading}\n                        <Stack.Row gap={1}>\n                          <PenModeButton\n                            zenModeEnabled={appState.zenModeEnabled}\n                            checked={appState.penMode}\n                            onChange={onPenModeToggle}\n                            title={t(\"toolBar.penMode\")}\n                            penDetected={appState.penDetected}\n                          />\n                          <LockButton\n                            checked={appState.activeTool.locked}\n                            onChange={onLockToggle}\n                            title={t(\"toolBar.lock\")}\n                          />\n\n                          <div className=\"App-toolbar__divider\"></div>\n\n                          <HandButton\n                            checked={isHandToolActive(appState)}\n                            onChange={() => onHandToolToggle()}\n                            title={t(\"toolBar.hand\")}\n                            isMobile\n                          />\n\n                          <ShapesSwitcher\n                            appState={appState}\n                            canvas={canvas}\n                            activeTool={appState.activeTool}\n                            setAppState={setAppState}\n                            onImageAction={({ pointerType }) => {\n                              onImageAction({\n                                insertOnCanvasDirectly: pointerType !== \"mouse\",\n                              });\n                            }}\n                          />\n                        </Stack.Row>\n                      </Island>\n                    </Stack.Row>\n                  </Stack.Col>\n                </div>\n              )}\n            </Section>\n          )}\n          <div\n            className={clsx(\n              \"layer-ui__wrapper__top-right zen-mode-transition\",\n              {\n                \"transition-right\": appState.zenModeEnabled,\n              },\n            )}\n          >\n            <UserList collaborators={appState.collaborators} />\n            {renderTopRightUI?.(device.isMobile, appState)}\n            {!appState.viewModeEnabled && (\n              <LibraryButton appState={appState} setAppState={setAppState} />\n            )}\n          </div>\n        </div>\n      </FixedSideContainer>\n    );\n  };\n\n  const renderSidebars = () => {\n    return appState.openSidebar === \"customSidebar\" ? (\n      renderCustomSidebar?.() || null\n    ) : appState.openSidebar === \"library\" ? (\n      <LibraryMenu\n        appState={appState}\n        onInsertElements={onInsertElements}\n        libraryReturnUrl={libraryReturnUrl}\n        focusContainer={focusContainer}\n        library={library}\n        id={id}\n      />\n    ) : null;\n  };\n\n  const [hostSidebarCounters] = useAtom(hostSidebarCountersAtom, jotaiScope);\n\n  const layerUIJSX = (\n    <>\n      {/* ------------------------- tunneled UI ---------------------------- */}\n      {/* make sure we render host app components first so that we can detect\n          them first on initial render to optimize layout shift */}\n      {children}\n      {/* render component fallbacks. Can be rendered anywhere as they'll be\n          tunneled away. We only render tunneled components that actually\n          have defaults when host do not render anything. */}\n      <DefaultMainMenu UIOptions={UIOptions} />\n      {/* ------------------------------------------------------------------ */}\n\n      {appState.isLoading && <LoadingMessage delay={250} />}\n      {appState.errorMessage && (\n        <ErrorDialog\n          message={appState.errorMessage}\n          onClose={() => setAppState({ errorMessage: null })}\n        />\n      )}\n      {appState.openDialog === \"help\" && (\n        <HelpDialog\n          onClose={() => {\n            setAppState({ openDialog: null });\n          }}\n        />\n      )}\n      <ActiveConfirmDialog />\n      {renderImageExportDialog()}\n      {renderJSONExportDialog()}\n      {appState.pasteDialog.shown && (\n        <PasteChartDialog\n          setAppState={setAppState}\n          appState={appState}\n          onInsertChart={onInsertElements}\n          onClose={() =>\n            setAppState({\n              pasteDialog: { shown: false, data: null },\n            })\n          }\n        />\n      )}\n      {device.isMobile && (\n        <MobileMenu\n          appState={appState}\n          elements={elements}\n          actionManager={actionManager}\n          renderJSONExportDialog={renderJSONExportDialog}\n          renderImageExportDialog={renderImageExportDialog}\n          setAppState={setAppState}\n          onLockToggle={onLockToggle}\n          onHandToolToggle={onHandToolToggle}\n          onPenModeToggle={onPenModeToggle}\n          canvas={canvas}\n          onImageAction={onImageAction}\n          renderTopRightUI={renderTopRightUI}\n          renderCustomStats={renderCustomStats}\n          renderSidebars={renderSidebars}\n          device={device}\n          renderWelcomeScreen={renderWelcomeScreen}\n        />\n      )}\n\n      {!device.isMobile && (\n        <>\n          <div\n            className={clsx(\"layer-ui__wrapper\", {\n              \"disable-pointerEvents\":\n                appState.draggingElement ||\n                appState.resizingElement ||\n                (appState.editingElement &&\n                  !isTextElement(appState.editingElement)),\n            })}\n            style={\n              ((appState.openSidebar === \"library\" &&\n                appState.isSidebarDocked) ||\n                hostSidebarCounters.docked) &&\n              device.canDeviceFitSidebar\n                ? { width: `calc(100% - ${LIBRARY_SIDEBAR_WIDTH}px)` }\n                : {}\n            }\n          >\n            {renderWelcomeScreen && <tunnels.welcomeScreenCenterTunnel.Out />}\n            {renderFixedSideContainer()}\n            <Footer\n              appState={appState}\n              actionManager={actionManager}\n              showExitZenModeBtn={showExitZenModeBtn}\n              renderWelcomeScreen={renderWelcomeScreen}\n            />\n            {appState.showStats && (\n              <Stats\n                appState={appState}\n                setAppState={setAppState}\n                elements={elements}\n                onClose={() => {\n                  actionManager.executeAction(actionToggleStats);\n                }}\n                renderCustomStats={renderCustomStats}\n              />\n            )}\n            {appState.scrolledOutside && (\n              <button\n                className=\"scroll-back-to-content\"\n                onClick={() => {\n                  setAppState({\n                    ...calculateScrollCenter(elements, appState, canvas),\n                  });\n                }}\n              >\n                {t(\"buttons.scrollBackToContent\")}\n              </button>\n            )}\n          </div>\n          {renderSidebars()}\n        </>\n      )}\n    </>\n  );\n\n  return (\n    <Provider scope={tunnels.jotaiScope}>\n      <TunnelsContext.Provider value={tunnels}>\n        {layerUIJSX}\n      </TunnelsContext.Provider>\n    </Provider>\n  );\n};\n\nconst stripIrrelevantAppStateProps = (\n  appState: AppState,\n): Partial<AppState> => {\n  const { suggestedBindings, startBoundElement, cursorButton, ...ret } =\n    appState;\n  return ret;\n};\n\nconst areEqual = (prevProps: LayerUIProps, nextProps: LayerUIProps) => {\n  // short-circuit early\n  if (prevProps.children !== nextProps.children) {\n    return false;\n  }\n\n  const {\n    canvas: _prevCanvas,\n    // not stable, but shouldn't matter in our case\n    onInsertElements: _prevOnInsertElements,\n    appState: prevAppState,\n    ...prev\n  } = prevProps;\n  const {\n    canvas: _nextCanvas,\n    onInsertElements: _nextOnInsertElements,\n    appState: nextAppState,\n    ...next\n  } = nextProps;\n\n  return (\n    isShallowEqual(\n      stripIrrelevantAppStateProps(prevAppState),\n      stripIrrelevantAppStateProps(nextAppState),\n    ) && isShallowEqual(prev, next)\n  );\n};\n\nexport default React.memo(LayerUI, areEqual);\n","import { useCallback, useEffect, useRef } from \"react\";\nimport { CloseIcon } from \"./icons\";\nimport \"./Toast.scss\";\nimport { ToolButton } from \"./ToolButton\";\n\nconst DEFAULT_TOAST_TIMEOUT = 5000;\n\nexport const Toast = ({\n  message,\n  onClose,\n  closable = false,\n  // To prevent autoclose, pass duration as Infinity\n  duration = DEFAULT_TOAST_TIMEOUT,\n}: {\n  message: string;\n  onClose: () => void;\n  closable?: boolean;\n  duration?: number;\n}) => {\n  const timerRef = useRef<number>(0);\n  const shouldAutoClose = duration !== Infinity;\n  const scheduleTimeout = useCallback(() => {\n    if (!shouldAutoClose) {\n      return;\n    }\n    timerRef.current = window.setTimeout(() => onClose(), duration);\n  }, [onClose, duration, shouldAutoClose]);\n\n  useEffect(() => {\n    if (!shouldAutoClose) {\n      return;\n    }\n    scheduleTimeout();\n    return () => clearTimeout(timerRef.current);\n  }, [scheduleTimeout, message, duration, shouldAutoClose]);\n\n  const onMouseEnter = shouldAutoClose\n    ? () => clearTimeout(timerRef?.current)\n    : undefined;\n  const onMouseLeave = shouldAutoClose ? scheduleTimeout : undefined;\n  return (\n    <div\n      className=\"Toast\"\n      onMouseEnter={onMouseEnter}\n      onMouseLeave={onMouseLeave}\n    >\n      <p className=\"Toast__message\">{message}</p>\n      {closable && (\n        <ToolButton\n          icon={CloseIcon}\n          aria-label=\"close\"\n          type=\"icon\"\n          onClick={onClose}\n          className=\"close\"\n        />\n      )}\n    </div>\n  );\n};\n","import { CODES, KEYS } from \"../keys\";\nimport { register } from \"./register\";\n\nexport const actionToggleViewMode = register({\n  name: \"viewMode\",\n  viewMode: true,\n  trackEvent: {\n    category: \"canvas\",\n    predicate: (appState) => !appState.viewModeEnabled,\n  },\n  perform(elements, appState) {\n    return {\n      appState: {\n        ...appState,\n        viewModeEnabled: !this.checked!(appState),\n      },\n      commitToHistory: false,\n    };\n  },\n  checked: (appState) => appState.viewModeEnabled,\n  predicate: (elements, appState, appProps) => {\n    return typeof appProps.viewModeEnabled === \"undefined\";\n  },\n  contextItemLabel: \"labels.viewMode\",\n  keyTest: (event) =>\n    !event[KEYS.CTRL_OR_CMD] && event.altKey && event.code === CODES.R,\n});\n","import { isTextElement, refreshTextDimensions } from \"../element\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { ExcalidrawElement, ExcalidrawTextElement } from \"../element/types\";\nimport { invalidateShapeForElement } from \"../renderer/renderElement\";\nimport { getFontString } from \"../utils\";\nimport type Scene from \"./Scene\";\n\nexport class Fonts {\n  private scene: Scene;\n  private onSceneUpdated: () => void;\n\n  constructor({\n    scene,\n    onSceneUpdated,\n  }: {\n    scene: Scene;\n    onSceneUpdated: () => void;\n  }) {\n    this.scene = scene;\n    this.onSceneUpdated = onSceneUpdated;\n  }\n\n  // it's ok to track fonts across multiple instances only once, so let's use\n  // a static member to reduce memory footprint\n  private static loadedFontFaces = new Set<string>();\n\n  /**\n   * if we load a (new) font, it's likely that text elements using it have\n   * already been rendered using a fallback font. Thus, we want invalidate\n   * their shapes and rerender. See #637.\n   *\n   * Invalidates text elements and rerenders scene, provided that at least one\n   * of the supplied fontFaces has not already been processed.\n   */\n  public onFontsLoaded = (fontFaces: readonly FontFace[]) => {\n    if (\n      // bail if all fonts with have been processed. We're checking just a\n      // subset of the font properties (though it should be enough), so it\n      // can technically bail on a false positive.\n      fontFaces.every((fontFace) => {\n        const sig = `${fontFace.family}-${fontFace.style}-${fontFace.weight}`;\n        if (Fonts.loadedFontFaces.has(sig)) {\n          return true;\n        }\n        Fonts.loadedFontFaces.add(sig);\n        return false;\n      })\n    ) {\n      return false;\n    }\n\n    let didUpdate = false;\n\n    this.scene.mapElements((element) => {\n      if (isTextElement(element)) {\n        invalidateShapeForElement(element);\n        didUpdate = true;\n        return newElementWith(element, {\n          ...refreshTextDimensions(element),\n        });\n      }\n      return element;\n    });\n\n    if (didUpdate) {\n      this.onSceneUpdated();\n    }\n  };\n\n  public loadFontsForElements = async (\n    elements: readonly ExcalidrawElement[],\n  ) => {\n    const fontFaces = await Promise.all(\n      [\n        ...new Set(\n          elements\n            .filter((element) => isTextElement(element))\n            .map((element) => (element as ExcalidrawTextElement).fontFamily),\n        ),\n      ].map((fontFamily) => {\n        const fontString = getFontString({\n          fontFamily,\n          fontSize: 16,\n        });\n        if (!document.fonts?.check?.(fontString)) {\n          return document.fonts?.load?.(fontString);\n        }\n        return undefined;\n      }),\n    );\n    this.onFontsLoaded(fontFaces.flat().filter(Boolean) as FontFace[]);\n  };\n}\n","import React, { useContext } from \"react\";\nimport { flushSync } from \"react-dom\";\n\nimport { RoughCanvas } from \"roughjs/bin/canvas\";\nimport rough from \"roughjs/bin/rough\";\nimport clsx from \"clsx\";\nimport { nanoid } from \"nanoid\";\n\nimport {\n  actionAddToLibrary,\n  actionBringForward,\n  actionBringToFront,\n  actionCopy,\n  actionCopyAsPng,\n  actionCopyAsSvg,\n  copyText,\n  actionCopyStyles,\n  actionCut,\n  actionDeleteSelected,\n  actionDuplicateSelection,\n  actionFinalize,\n  actionFlipHorizontal,\n  actionFlipVertical,\n  actionGroup,\n  actionPasteStyles,\n  actionSelectAll,\n  actionSendBackward,\n  actionSendToBack,\n  actionToggleGridMode,\n  actionToggleStats,\n  actionToggleZenMode,\n  actionUnbindText,\n  actionBindText,\n  actionUngroup,\n  actionLink,\n  actionToggleLock,\n  actionToggleLinearEditor,\n} from \"../actions\";\nimport { createRedoAction, createUndoAction } from \"../actions/actionHistory\";\nimport { ActionManager } from \"../actions/manager\";\nimport { actions } from \"../actions/register\";\nimport { ActionResult } from \"../actions/types\";\nimport { trackEvent } from \"../analytics\";\nimport {\n  getDefaultAppState,\n  isEraserActive,\n  isHandToolActive,\n} from \"../appState\";\nimport { parseClipboard } from \"../clipboard\";\nimport {\n  APP_NAME,\n  CURSOR_TYPE,\n  DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\n  DEFAULT_UI_OPTIONS,\n  DEFAULT_VERTICAL_ALIGN,\n  DRAGGING_THRESHOLD,\n  ELEMENT_READY_TO_ERASE_OPACITY,\n  ELEMENT_SHIFT_TRANSLATE_AMOUNT,\n  ELEMENT_TRANSLATE_AMOUNT,\n  ENV,\n  EVENT,\n  GRID_SIZE,\n  IMAGE_RENDER_TIMEOUT,\n  isAndroid,\n  LINE_CONFIRM_THRESHOLD,\n  MAX_ALLOWED_FILE_BYTES,\n  MIME_TYPES,\n  MQ_MAX_HEIGHT_LANDSCAPE,\n  MQ_MAX_WIDTH_LANDSCAPE,\n  MQ_MAX_WIDTH_PORTRAIT,\n  MQ_RIGHT_SIDEBAR_MIN_WIDTH,\n  MQ_SM_MAX_WIDTH,\n  POINTER_BUTTON,\n  ROUNDNESS,\n  SCROLL_TIMEOUT,\n  TAP_TWICE_TIMEOUT,\n  TEXT_TO_CENTER_SNAP_THRESHOLD,\n  THEME,\n  TOUCH_CTX_MENU_TIMEOUT,\n  VERTICAL_ALIGN,\n  ZOOM_STEP,\n} from \"../constants\";\nimport { loadFromBlob } from \"../data\";\nimport Library, { distributeLibraryItemsOnSquareGrid } from \"../data/library\";\nimport { restore, restoreElements } from \"../data/restore\";\nimport {\n  dragNewElement,\n  dragSelectedElements,\n  duplicateElement,\n  getCommonBounds,\n  getCursorForResizingElement,\n  getDragOffsetXY,\n  getElementWithTransformHandleType,\n  getNormalizedDimensions,\n  getResizeArrowDirection,\n  getResizeOffsetXY,\n  getLockedLinearCursorAlignSize,\n  getTransformHandleTypeFromCoords,\n  hitTest,\n  isHittingElementBoundingBoxWithoutHittingElement,\n  isInvisiblySmallElement,\n  isNonDeletedElement,\n  isTextElement,\n  newElement,\n  newLinearElement,\n  newTextElement,\n  newImageElement,\n  textWysiwyg,\n  transformElements,\n  updateTextElement,\n  redrawTextBoundingBox,\n} from \"../element\";\nimport {\n  bindOrUnbindLinearElement,\n  bindOrUnbindSelectedElements,\n  fixBindingsAfterDeletion,\n  fixBindingsAfterDuplication,\n  getEligibleElementsForBinding,\n  getHoveredElementForBinding,\n  isBindingEnabled,\n  isLinearElementSimpleAndAlreadyBound,\n  maybeBindLinearElement,\n  shouldEnableBindingForPointerEvent,\n  unbindLinearElements,\n  updateBoundElements,\n} from \"../element/binding\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { mutateElement, newElementWith } from \"../element/mutateElement\";\nimport { deepCopyElement, newFreeDrawElement } from \"../element/newElement\";\nimport {\n  hasBoundTextElement,\n  isArrowElement,\n  isBindingElement,\n  isBindingElementType,\n  isBoundToContainer,\n  isImageElement,\n  isInitializedImageElement,\n  isLinearElement,\n  isLinearElementType,\n  isUsingAdaptiveRadius,\n} from \"../element/typeChecks\";\nimport {\n  ExcalidrawBindableElement,\n  ExcalidrawElement,\n  ExcalidrawFreeDrawElement,\n  ExcalidrawGenericElement,\n  ExcalidrawLinearElement,\n  ExcalidrawTextElement,\n  NonDeleted,\n  InitializedExcalidrawImageElement,\n  ExcalidrawImageElement,\n  FileId,\n  NonDeletedExcalidrawElement,\n  ExcalidrawTextContainer,\n} from \"../element/types\";\nimport { getCenter, getDistance } from \"../gesture\";\nimport {\n  editGroupForSelectedElement,\n  getElementsInGroup,\n  getSelectedGroupIdForElement,\n  getSelectedGroupIds,\n  isElementInGroup,\n  isSelectedViaGroup,\n  selectGroupsForSelectedElements,\n} from \"../groups\";\nimport History from \"../history\";\nimport { defaultLang, getLanguage, languages, setLanguage, t } from \"../i18n\";\nimport {\n  CODES,\n  shouldResizeFromCenter,\n  shouldMaintainAspectRatio,\n  shouldRotateWithDiscreteAngle,\n  isArrowKey,\n  KEYS,\n} from \"../keys\";\nimport { distance2d, getGridPoint, isPathALoop } from \"../math\";\nimport { renderScene } from \"../renderer/renderScene\";\nimport { invalidateShapeForElement } from \"../renderer/renderElement\";\nimport {\n  calculateScrollCenter,\n  getElementsAtPosition,\n  getElementsWithinSelection,\n  getNormalizedZoom,\n  getSelectedElements,\n  hasBackground,\n  isOverScrollBars,\n  isSomeElementSelected,\n} from \"../scene\";\nimport Scene from \"../scene/Scene\";\nimport { RenderConfig, ScrollBars } from \"../scene/types\";\nimport { getStateForZoom } from \"../scene/zoom\";\nimport { findShapeByKey, SHAPES } from \"../shapes\";\nimport {\n  AppClassProperties,\n  AppProps,\n  AppState,\n  BinaryFileData,\n  DataURL,\n  ExcalidrawImperativeAPI,\n  BinaryFiles,\n  Gesture,\n  GestureEvent,\n  LibraryItems,\n  PointerDownState,\n  SceneData,\n  Device,\n} from \"../types\";\nimport {\n  debounce,\n  distance,\n  getFontString,\n  getNearestScrollableContainer,\n  isInputLike,\n  isToolIcon,\n  isWritableElement,\n  resetCursor,\n  resolvablePromise,\n  sceneCoordsToViewportCoords,\n  setCursor,\n  setCursorForShape,\n  tupleToCoors,\n  viewportCoordsToSceneCoords,\n  withBatchedUpdates,\n  wrapEvent,\n  withBatchedUpdatesThrottled,\n  updateObject,\n  setEraserCursor,\n  updateActiveTool,\n  getShortcutKey,\n  isTransparent,\n} from \"../utils\";\nimport {\n  ContextMenu,\n  ContextMenuItems,\n  CONTEXT_MENU_SEPARATOR,\n} from \"./ContextMenu\";\nimport LayerUI from \"./LayerUI\";\nimport { Toast } from \"./Toast\";\nimport { actionToggleViewMode } from \"../actions/actionToggleViewMode\";\nimport {\n  dataURLToFile,\n  generateIdFromFile,\n  getDataURL,\n  getFileFromEvent,\n  isSupportedImageFile,\n  loadSceneOrLibraryFromBlob,\n  normalizeFile,\n  parseLibraryJSON,\n  resizeImageFile,\n  SVGStringToFile,\n} from \"../data/blob\";\nimport {\n  getInitializedImageElements,\n  loadHTMLImageElement,\n  normalizeSVG,\n  updateImageCache as _updateImageCache,\n} from \"../element/image\";\nimport throttle from \"lodash.throttle\";\nimport { fileOpen, FileSystemHandle } from \"../data/filesystem\";\nimport {\n  bindTextToShapeAfterDuplication,\n  getApproxLineHeight,\n  getApproxMinLineHeight,\n  getApproxMinLineWidth,\n  getBoundTextElement,\n  getContainerCenter,\n  getContainerDims,\n  getContainerElement,\n  getTextBindableContainerAtPosition,\n  isValidTextContainer,\n} from \"../element/textElement\";\nimport { isHittingElementNotConsideringBoundingBox } from \"../element/collision\";\nimport {\n  normalizeLink,\n  showHyperlinkTooltip,\n  hideHyperlinkToolip,\n  Hyperlink,\n  isPointHittingLinkIcon,\n  isLocalLink,\n} from \"../element/Hyperlink\";\nimport { shouldShowBoundingBox } from \"../element/transformHandles\";\nimport { Fonts } from \"../scene/Fonts\";\nimport { actionPaste } from \"../actions/actionClipboard\";\nimport { actionToggleHandTool } from \"../actions/actionCanvas\";\nimport { jotaiStore } from \"../jotai\";\nimport { activeConfirmDialogAtom } from \"./ActiveConfirmDialog\";\nimport { actionCreateContainerFromText } from \"../actions/actionBoundText\";\n\nconst deviceContextInitialValue = {\n  isSmScreen: false,\n  isMobile: false,\n  isTouchScreen: false,\n  canDeviceFitSidebar: false,\n};\nconst DeviceContext = React.createContext<Device>(deviceContextInitialValue);\nDeviceContext.displayName = \"DeviceContext\";\n\nexport const ExcalidrawContainerContext = React.createContext<{\n  container: HTMLDivElement | null;\n  id: string | null;\n}>({ container: null, id: null });\nExcalidrawContainerContext.displayName = \"ExcalidrawContainerContext\";\n\nconst ExcalidrawElementsContext = React.createContext<\n  readonly NonDeletedExcalidrawElement[]\n>([]);\nExcalidrawElementsContext.displayName = \"ExcalidrawElementsContext\";\n\nconst ExcalidrawAppStateContext = React.createContext<AppState>({\n  ...getDefaultAppState(),\n  width: 0,\n  height: 0,\n  offsetLeft: 0,\n  offsetTop: 0,\n});\nExcalidrawAppStateContext.displayName = \"ExcalidrawAppStateContext\";\n\nconst ExcalidrawSetAppStateContext = React.createContext<\n  React.Component<any, AppState>[\"setState\"]\n>(() => {\n  console.warn(\"unitialized ExcalidrawSetAppStateContext context!\");\n});\nExcalidrawSetAppStateContext.displayName = \"ExcalidrawSetAppStateContext\";\n\nconst ExcalidrawActionManagerContext = React.createContext<ActionManager>(\n  null!,\n);\nExcalidrawActionManagerContext.displayName = \"ExcalidrawActionManagerContext\";\n\nexport const useDevice = () => useContext<Device>(DeviceContext);\nexport const useExcalidrawContainer = () =>\n  useContext(ExcalidrawContainerContext);\nexport const useExcalidrawElements = () =>\n  useContext(ExcalidrawElementsContext);\nexport const useExcalidrawAppState = () =>\n  useContext(ExcalidrawAppStateContext);\nexport const useExcalidrawSetAppState = () =>\n  useContext(ExcalidrawSetAppStateContext);\nexport const useExcalidrawActionManager = () =>\n  useContext(ExcalidrawActionManagerContext);\n\nlet didTapTwice: boolean = false;\nlet tappedTwiceTimer = 0;\nlet cursorX = 0;\nlet cursorY = 0;\nlet isHoldingSpace: boolean = false;\nlet isPanning: boolean = false;\nlet isDraggingScrollBar: boolean = false;\nlet currentScrollBars: ScrollBars = { horizontal: null, vertical: null };\nlet touchTimeout = 0;\nlet invalidateContextMenu = false;\n\n// remove this hack when we can sync render & resizeObserver (state update)\n// to rAF. See #5439\nlet THROTTLE_NEXT_RENDER = true;\n\nlet IS_PLAIN_PASTE = false;\nlet IS_PLAIN_PASTE_TIMER = 0;\nlet PLAIN_PASTE_TOAST_SHOWN = false;\n\nlet lastPointerUp: ((event: any) => void) | null = null;\nconst gesture: Gesture = {\n  pointers: new Map(),\n  lastCenter: null,\n  initialDistance: null,\n  initialScale: null,\n};\n\nclass App extends React.Component<AppProps, AppState> {\n  canvas: AppClassProperties[\"canvas\"] = null;\n  rc: RoughCanvas | null = null;\n  unmounted: boolean = false;\n  actionManager: ActionManager;\n  device: Device = deviceContextInitialValue;\n  detachIsMobileMqHandler?: () => void;\n\n  private excalidrawContainerRef = React.createRef<HTMLDivElement>();\n\n  public static defaultProps: Partial<AppProps> = {\n    // needed for tests to pass since we directly render App in many tests\n    UIOptions: DEFAULT_UI_OPTIONS,\n  };\n\n  public scene: Scene;\n  private fonts: Fonts;\n  private resizeObserver: ResizeObserver | undefined;\n  private nearestScrollableContainer: HTMLElement | Document | undefined;\n  public library: AppClassProperties[\"library\"];\n  public libraryItemsFromStorage: LibraryItems | undefined;\n  private id: string;\n  private history: History;\n  private excalidrawContainerValue: {\n    container: HTMLDivElement | null;\n    id: string;\n  };\n\n  public files: BinaryFiles = {};\n  public imageCache: AppClassProperties[\"imageCache\"] = new Map();\n\n  hitLinkElement?: NonDeletedExcalidrawElement;\n  lastPointerDown: React.PointerEvent<HTMLCanvasElement> | null = null;\n  lastPointerUp: React.PointerEvent<HTMLElement> | PointerEvent | null = null;\n  lastScenePointer: { x: number; y: number } | null = null;\n\n  constructor(props: AppProps) {\n    super(props);\n    const defaultAppState = getDefaultAppState();\n    const {\n      excalidrawRef,\n      viewModeEnabled = false,\n      zenModeEnabled = false,\n      gridModeEnabled = false,\n      theme = defaultAppState.theme,\n      name = defaultAppState.name,\n    } = props;\n    this.state = {\n      ...defaultAppState,\n      theme,\n      isLoading: true,\n      ...this.getCanvasOffsets(),\n      viewModeEnabled,\n      zenModeEnabled,\n      gridSize: gridModeEnabled ? GRID_SIZE : null,\n      name,\n      width: window.innerWidth,\n      height: window.innerHeight,\n      showHyperlinkPopup: false,\n      isSidebarDocked: false,\n    };\n\n    this.id = nanoid();\n\n    this.library = new Library(this);\n    if (excalidrawRef) {\n      const readyPromise =\n        (\"current\" in excalidrawRef && excalidrawRef.current?.readyPromise) ||\n        resolvablePromise<ExcalidrawImperativeAPI>();\n\n      const api: ExcalidrawImperativeAPI = {\n        ready: true,\n        readyPromise,\n        updateScene: this.updateScene,\n        updateLibrary: this.library.updateLibrary,\n        addFiles: this.addFiles,\n        resetScene: this.resetScene,\n        getSceneElementsIncludingDeleted: this.getSceneElementsIncludingDeleted,\n        history: {\n          clear: this.resetHistory,\n        },\n        scrollToContent: this.scrollToContent,\n        getSceneElements: this.getSceneElements,\n        getAppState: () => this.state,\n        getFiles: () => this.files,\n        refresh: this.refresh,\n        setToast: this.setToast,\n        id: this.id,\n        setActiveTool: this.setActiveTool,\n        setCursor: this.setCursor,\n        resetCursor: this.resetCursor,\n        toggleMenu: this.toggleMenu,\n      } as const;\n      if (typeof excalidrawRef === \"function\") {\n        excalidrawRef(api);\n      } else {\n        excalidrawRef.current = api;\n      }\n      readyPromise.resolve(api);\n    }\n\n    this.excalidrawContainerValue = {\n      container: this.excalidrawContainerRef.current,\n      id: this.id,\n    };\n\n    this.scene = new Scene();\n    this.fonts = new Fonts({\n      scene: this.scene,\n      onSceneUpdated: this.onSceneUpdated,\n    });\n    this.history = new History();\n    this.actionManager = new ActionManager(\n      this.syncActionResult,\n      () => this.state,\n      () => this.scene.getElementsIncludingDeleted(),\n      this,\n    );\n    this.actionManager.registerAll(actions);\n\n    this.actionManager.registerAction(createUndoAction(this.history));\n    this.actionManager.registerAction(createRedoAction(this.history));\n  }\n\n  private renderCanvas() {\n    const canvasScale = window.devicePixelRatio;\n    const {\n      width: canvasDOMWidth,\n      height: canvasDOMHeight,\n      viewModeEnabled,\n    } = this.state;\n    const canvasWidth = canvasDOMWidth * canvasScale;\n    const canvasHeight = canvasDOMHeight * canvasScale;\n    if (viewModeEnabled) {\n      return (\n        <canvas\n          className=\"excalidraw__canvas\"\n          style={{\n            width: canvasDOMWidth,\n            height: canvasDOMHeight,\n            cursor: CURSOR_TYPE.GRAB,\n          }}\n          width={canvasWidth}\n          height={canvasHeight}\n          ref={this.handleCanvasRef}\n          onContextMenu={this.handleCanvasContextMenu}\n          onPointerMove={this.handleCanvasPointerMove}\n          onPointerUp={this.handleCanvasPointerUp}\n          onPointerCancel={this.removePointer}\n          onTouchMove={this.handleTouchMove}\n          onPointerDown={this.handleCanvasPointerDown}\n        >\n          {t(\"labels.drawingCanvas\")}\n        </canvas>\n      );\n    }\n    return (\n      <canvas\n        className=\"excalidraw__canvas\"\n        style={{\n          width: canvasDOMWidth,\n          height: canvasDOMHeight,\n        }}\n        width={canvasWidth}\n        height={canvasHeight}\n        ref={this.handleCanvasRef}\n        onContextMenu={this.handleCanvasContextMenu}\n        onPointerDown={this.handleCanvasPointerDown}\n        onDoubleClick={this.handleCanvasDoubleClick}\n        onPointerMove={this.handleCanvasPointerMove}\n        onPointerUp={this.handleCanvasPointerUp}\n        onPointerCancel={this.removePointer}\n        onTouchMove={this.handleTouchMove}\n      >\n        {t(\"labels.drawingCanvas\")}\n      </canvas>\n    );\n  }\n\n  public render() {\n    const selectedElement = getSelectedElements(\n      this.scene.getNonDeletedElements(),\n      this.state,\n    );\n    const { renderTopRightUI, renderCustomStats } = this.props;\n\n    return (\n      <div\n        className={clsx(\"excalidraw excalidraw-container\", {\n          \"excalidraw--view-mode\": this.state.viewModeEnabled,\n          \"excalidraw--mobile\": this.device.isMobile,\n        })}\n        ref={this.excalidrawContainerRef}\n        onDrop={this.handleAppOnDrop}\n        tabIndex={0}\n        onKeyDown={\n          this.props.handleKeyboardGlobally ? undefined : this.onKeyDown\n        }\n      >\n        <ExcalidrawContainerContext.Provider\n          value={this.excalidrawContainerValue}\n        >\n          <DeviceContext.Provider value={this.device}>\n            <ExcalidrawSetAppStateContext.Provider value={this.setAppState}>\n              <ExcalidrawAppStateContext.Provider value={this.state}>\n                <ExcalidrawElementsContext.Provider\n                  value={this.scene.getNonDeletedElements()}\n                >\n                  <ExcalidrawActionManagerContext.Provider\n                    value={this.actionManager}\n                  >\n                    <LayerUI\n                      canvas={this.canvas}\n                      appState={this.state}\n                      files={this.files}\n                      setAppState={this.setAppState}\n                      actionManager={this.actionManager}\n                      elements={this.scene.getNonDeletedElements()}\n                      onLockToggle={this.toggleLock}\n                      onPenModeToggle={this.togglePenMode}\n                      onHandToolToggle={this.onHandToolToggle}\n                      onInsertElements={(elements) =>\n                        this.addElementsFromPasteOrLibrary({\n                          elements,\n                          position: \"center\",\n                          files: null,\n                        })\n                      }\n                      langCode={getLanguage().code}\n                      renderTopRightUI={renderTopRightUI}\n                      renderCustomStats={renderCustomStats}\n                      renderCustomSidebar={this.props.renderSidebar}\n                      showExitZenModeBtn={\n                        typeof this.props?.zenModeEnabled === \"undefined\" &&\n                        this.state.zenModeEnabled\n                      }\n                      libraryReturnUrl={this.props.libraryReturnUrl}\n                      UIOptions={this.props.UIOptions}\n                      focusContainer={this.focusContainer}\n                      library={this.library}\n                      id={this.id}\n                      onImageAction={this.onImageAction}\n                      renderWelcomeScreen={\n                        !this.state.isLoading &&\n                        this.state.showWelcomeScreen &&\n                        this.state.activeTool.type === \"selection\" &&\n                        !this.scene.getElementsIncludingDeleted().length\n                      }\n                    >\n                      {this.props.children}\n                    </LayerUI>\n                    <div className=\"excalidraw-textEditorContainer\" />\n                    <div className=\"excalidraw-contextMenuContainer\" />\n                    {selectedElement.length === 1 &&\n                      !this.state.contextMenu &&\n                      this.state.showHyperlinkPopup && (\n                        <Hyperlink\n                          key={selectedElement[0].id}\n                          element={selectedElement[0]}\n                          setAppState={this.setAppState}\n                          onLinkOpen={this.props.onLinkOpen}\n                        />\n                      )}\n                    {this.state.toast !== null && (\n                      <Toast\n                        message={this.state.toast.message}\n                        onClose={() => this.setToast(null)}\n                        duration={this.state.toast.duration}\n                        closable={this.state.toast.closable}\n                      />\n                    )}\n                    {this.state.contextMenu && (\n                      <ContextMenu\n                        items={this.state.contextMenu.items}\n                        top={this.state.contextMenu.top}\n                        left={this.state.contextMenu.left}\n                        actionManager={this.actionManager}\n                      />\n                    )}\n                    <main>{this.renderCanvas()}</main>\n                  </ExcalidrawActionManagerContext.Provider>\n                </ExcalidrawElementsContext.Provider>{\" \"}\n              </ExcalidrawAppStateContext.Provider>\n            </ExcalidrawSetAppStateContext.Provider>\n          </DeviceContext.Provider>\n        </ExcalidrawContainerContext.Provider>\n      </div>\n    );\n  }\n\n  public focusContainer: AppClassProperties[\"focusContainer\"] = () => {\n    if (this.props.autoFocus) {\n      this.excalidrawContainerRef.current?.focus();\n    }\n  };\n\n  public getSceneElementsIncludingDeleted = () => {\n    return this.scene.getElementsIncludingDeleted();\n  };\n\n  public getSceneElements = () => {\n    return this.scene.getNonDeletedElements();\n  };\n\n  private syncActionResult = withBatchedUpdates(\n    (actionResult: ActionResult) => {\n      if (this.unmounted || actionResult === false) {\n        return;\n      }\n\n      let editingElement: AppState[\"editingElement\"] | null = null;\n      if (actionResult.elements) {\n        actionResult.elements.forEach((element) => {\n          if (\n            this.state.editingElement?.id === element.id &&\n            this.state.editingElement !== element &&\n            isNonDeletedElement(element)\n          ) {\n            editingElement = element;\n          }\n        });\n        this.scene.replaceAllElements(actionResult.elements);\n        if (actionResult.commitToHistory) {\n          this.history.resumeRecording();\n        }\n      }\n\n      if (actionResult.files) {\n        this.files = actionResult.replaceFiles\n          ? actionResult.files\n          : { ...this.files, ...actionResult.files };\n        this.addNewImagesToImageCache();\n      }\n\n      if (actionResult.appState || editingElement || this.state.contextMenu) {\n        if (actionResult.commitToHistory) {\n          this.history.resumeRecording();\n        }\n\n        let viewModeEnabled = actionResult?.appState?.viewModeEnabled || false;\n        let zenModeEnabled = actionResult?.appState?.zenModeEnabled || false;\n        let gridSize = actionResult?.appState?.gridSize || null;\n        const theme =\n          actionResult?.appState?.theme || this.props.theme || THEME.LIGHT;\n        let name = actionResult?.appState?.name ?? this.state.name;\n        if (typeof this.props.viewModeEnabled !== \"undefined\") {\n          viewModeEnabled = this.props.viewModeEnabled;\n        }\n\n        if (typeof this.props.zenModeEnabled !== \"undefined\") {\n          zenModeEnabled = this.props.zenModeEnabled;\n        }\n\n        if (typeof this.props.gridModeEnabled !== \"undefined\") {\n          gridSize = this.props.gridModeEnabled ? GRID_SIZE : null;\n        }\n\n        if (typeof this.props.name !== \"undefined\") {\n          name = this.props.name;\n        }\n\n        this.setState(\n          (state) => {\n            // using Object.assign instead of spread to fool TS 4.2.2+ into\n            // regarding the resulting type as not containing undefined\n            // (which the following expression will never contain)\n            return Object.assign(actionResult.appState || {}, {\n              // NOTE this will prevent opening context menu using an action\n              // or programmatically from the host, so it will need to be\n              // rewritten later\n              contextMenu: null,\n              editingElement:\n                editingElement || actionResult.appState?.editingElement || null,\n              viewModeEnabled,\n              zenModeEnabled,\n              gridSize,\n              theme,\n              name,\n            });\n          },\n          () => {\n            if (actionResult.syncHistory) {\n              this.history.setCurrentState(\n                this.state,\n                this.scene.getElementsIncludingDeleted(),\n              );\n            }\n          },\n        );\n      }\n    },\n  );\n\n  // Lifecycle\n\n  private onBlur = withBatchedUpdates(() => {\n    isHoldingSpace = false;\n    this.setState({ isBindingEnabled: true });\n  });\n\n  private onUnload = () => {\n    this.onBlur();\n  };\n\n  private disableEvent: EventListener = (event) => {\n    event.preventDefault();\n  };\n\n  private resetHistory = () => {\n    this.history.clear();\n  };\n\n  /**\n   * Resets scene & history.\n   * ! Do not use to clear scene user action !\n   */\n  private resetScene = withBatchedUpdates(\n    (opts?: { resetLoadingState: boolean }) => {\n      this.scene.replaceAllElements([]);\n      this.setState((state) => ({\n        ...getDefaultAppState(),\n        isLoading: opts?.resetLoadingState ? false : state.isLoading,\n        theme: this.state.theme,\n      }));\n      this.resetHistory();\n    },\n  );\n\n  private initializeScene = async () => {\n    if (\"launchQueue\" in window && \"LaunchParams\" in window) {\n      (window as any).launchQueue.setConsumer(\n        async (launchParams: { files: any[] }) => {\n          if (!launchParams.files.length) {\n            return;\n          }\n          const fileHandle = launchParams.files[0];\n          const blob: Blob = await fileHandle.getFile();\n          this.loadFileToCanvas(\n            new File([blob], blob.name || \"\", { type: blob.type }),\n            fileHandle,\n          );\n        },\n      );\n    }\n\n    if (this.props.theme) {\n      this.setState({ theme: this.props.theme });\n    }\n    if (!this.state.isLoading) {\n      this.setState({ isLoading: true });\n    }\n    let initialData = null;\n    try {\n      initialData = (await this.props.initialData) || null;\n      if (initialData?.libraryItems) {\n        this.library\n          .updateLibrary({\n            libraryItems: initialData.libraryItems,\n            merge: true,\n          })\n          .catch((error) => {\n            console.error(error);\n          });\n      }\n    } catch (error: any) {\n      console.error(error);\n      initialData = {\n        appState: {\n          errorMessage:\n            error.message ||\n            \"Encountered an error during importing or restoring scene data\",\n        },\n      };\n    }\n    const scene = restore(initialData, null, null, { repairBindings: true });\n    scene.appState = {\n      ...scene.appState,\n      theme: this.props.theme || scene.appState.theme,\n      // we're falling back to current (pre-init) state when deciding\n      // whether to open the library, to handle a case where we\n      // update the state outside of initialData (e.g. when loading the app\n      // with a library install link, which should auto-open the library)\n      openSidebar: scene.appState?.openSidebar || this.state.openSidebar,\n      activeTool:\n        scene.appState.activeTool.type === \"image\"\n          ? { ...scene.appState.activeTool, type: \"selection\" }\n          : scene.appState.activeTool,\n      isLoading: false,\n      toast: this.state.toast,\n    };\n    if (initialData?.scrollToContent) {\n      scene.appState = {\n        ...scene.appState,\n        ...calculateScrollCenter(\n          scene.elements,\n          {\n            ...scene.appState,\n            width: this.state.width,\n            height: this.state.height,\n            offsetTop: this.state.offsetTop,\n            offsetLeft: this.state.offsetLeft,\n          },\n          null,\n        ),\n      };\n    }\n\n    // FontFaceSet loadingdone event we listen on may not always fire\n    // (looking at you Safari), so on init we manually load fonts for current\n    // text elements on canvas, and rerender them once done. This also\n    // seems faster even in browsers that do fire the loadingdone event.\n    this.fonts.loadFontsForElements(scene.elements);\n\n    this.resetHistory();\n    this.syncActionResult({\n      ...scene,\n      commitToHistory: true,\n    });\n  };\n\n  private refreshDeviceState = (container: HTMLDivElement) => {\n    const { width, height } = container.getBoundingClientRect();\n    const sidebarBreakpoint =\n      this.props.UIOptions.dockedSidebarBreakpoint != null\n        ? this.props.UIOptions.dockedSidebarBreakpoint\n        : MQ_RIGHT_SIDEBAR_MIN_WIDTH;\n    this.device = updateObject(this.device, {\n      isSmScreen: width < MQ_SM_MAX_WIDTH,\n      isMobile:\n        width < MQ_MAX_WIDTH_PORTRAIT ||\n        (height < MQ_MAX_HEIGHT_LANDSCAPE && width < MQ_MAX_WIDTH_LANDSCAPE),\n      canDeviceFitSidebar: width > sidebarBreakpoint,\n    });\n  };\n\n  public async componentDidMount() {\n    this.unmounted = false;\n    this.excalidrawContainerValue.container =\n      this.excalidrawContainerRef.current;\n\n    if (\n      process.env.NODE_ENV === ENV.TEST ||\n      process.env.NODE_ENV === ENV.DEVELOPMENT\n    ) {\n      const setState = this.setState.bind(this);\n      Object.defineProperties(window.h, {\n        state: {\n          configurable: true,\n          get: () => {\n            return this.state;\n          },\n        },\n        setState: {\n          configurable: true,\n          value: (...args: Parameters<typeof setState>) => {\n            return this.setState(...args);\n          },\n        },\n        app: {\n          configurable: true,\n          value: this,\n        },\n        history: {\n          configurable: true,\n          value: this.history,\n        },\n      });\n    }\n\n    this.scene.addCallback(this.onSceneUpdated);\n    this.addEventListeners();\n\n    if (this.excalidrawContainerRef.current) {\n      this.focusContainer();\n    }\n\n    if (\n      this.excalidrawContainerRef.current &&\n      // bounding rects don't work in tests so updating\n      // the state on init would result in making the test enviro run\n      // in mobile breakpoint (0 width/height), making everything fail\n      process.env.NODE_ENV !== \"test\"\n    ) {\n      this.refreshDeviceState(this.excalidrawContainerRef.current);\n    }\n\n    if (\"ResizeObserver\" in window && this.excalidrawContainerRef?.current) {\n      this.resizeObserver = new ResizeObserver(() => {\n        THROTTLE_NEXT_RENDER = false;\n        // recompute device dimensions state\n        // ---------------------------------------------------------------------\n        this.refreshDeviceState(this.excalidrawContainerRef.current!);\n        // refresh offsets\n        // ---------------------------------------------------------------------\n        this.updateDOMRect();\n      });\n      this.resizeObserver?.observe(this.excalidrawContainerRef.current);\n    } else if (window.matchMedia) {\n      const mdScreenQuery = window.matchMedia(\n        `(max-width: ${MQ_MAX_WIDTH_PORTRAIT}px), (max-height: ${MQ_MAX_HEIGHT_LANDSCAPE}px) and (max-width: ${MQ_MAX_WIDTH_LANDSCAPE}px)`,\n      );\n      const smScreenQuery = window.matchMedia(\n        `(max-width: ${MQ_SM_MAX_WIDTH}px)`,\n      );\n      const canDeviceFitSidebarMediaQuery = window.matchMedia(\n        `(min-width: ${\n          // NOTE this won't update if a different breakpoint is supplied\n          // after mount\n          this.props.UIOptions.dockedSidebarBreakpoint != null\n            ? this.props.UIOptions.dockedSidebarBreakpoint\n            : MQ_RIGHT_SIDEBAR_MIN_WIDTH\n        }px)`,\n      );\n      const handler = () => {\n        this.excalidrawContainerRef.current!.getBoundingClientRect();\n        this.device = updateObject(this.device, {\n          isSmScreen: smScreenQuery.matches,\n          isMobile: mdScreenQuery.matches,\n          canDeviceFitSidebar: canDeviceFitSidebarMediaQuery.matches,\n        });\n      };\n      mdScreenQuery.addListener(handler);\n      this.detachIsMobileMqHandler = () =>\n        mdScreenQuery.removeListener(handler);\n    }\n\n    const searchParams = new URLSearchParams(window.location.search.slice(1));\n\n    if (searchParams.has(\"web-share-target\")) {\n      // Obtain a file that was shared via the Web Share Target API.\n      this.restoreFileFromShare();\n    } else {\n      this.updateDOMRect(this.initializeScene);\n    }\n  }\n\n  public componentWillUnmount() {\n    this.files = {};\n    this.imageCache.clear();\n    this.resizeObserver?.disconnect();\n    this.unmounted = true;\n    this.removeEventListeners();\n    this.scene.destroy();\n    clearTimeout(touchTimeout);\n    touchTimeout = 0;\n  }\n\n  private onResize = withBatchedUpdates(() => {\n    this.scene\n      .getElementsIncludingDeleted()\n      .forEach((element) => invalidateShapeForElement(element));\n    this.setState({});\n  });\n\n  private removeEventListeners() {\n    document.removeEventListener(EVENT.POINTER_UP, this.removePointer);\n    document.removeEventListener(EVENT.COPY, this.onCopy);\n    document.removeEventListener(EVENT.PASTE, this.pasteFromClipboard);\n    document.removeEventListener(EVENT.CUT, this.onCut);\n    this.excalidrawContainerRef.current?.removeEventListener(\n      EVENT.WHEEL,\n      this.onWheel,\n    );\n    this.nearestScrollableContainer?.removeEventListener(\n      EVENT.SCROLL,\n      this.onScroll,\n    );\n    document.removeEventListener(EVENT.KEYDOWN, this.onKeyDown, false);\n    document.removeEventListener(\n      EVENT.MOUSE_MOVE,\n      this.updateCurrentCursorPosition,\n      false,\n    );\n    document.removeEventListener(EVENT.KEYUP, this.onKeyUp);\n    window.removeEventListener(EVENT.RESIZE, this.onResize, false);\n    window.removeEventListener(EVENT.UNLOAD, this.onUnload, false);\n    window.removeEventListener(EVENT.BLUR, this.onBlur, false);\n    this.excalidrawContainerRef.current?.removeEventListener(\n      EVENT.DRAG_OVER,\n      this.disableEvent,\n      false,\n    );\n    this.excalidrawContainerRef.current?.removeEventListener(\n      EVENT.DROP,\n      this.disableEvent,\n      false,\n    );\n\n    document.removeEventListener(\n      EVENT.GESTURE_START,\n      this.onGestureStart as any,\n      false,\n    );\n    document.removeEventListener(\n      EVENT.GESTURE_CHANGE,\n      this.onGestureChange as any,\n      false,\n    );\n    document.removeEventListener(\n      EVENT.GESTURE_END,\n      this.onGestureEnd as any,\n      false,\n    );\n\n    this.detachIsMobileMqHandler?.();\n  }\n\n  private addEventListeners() {\n    this.removeEventListeners();\n    document.addEventListener(EVENT.POINTER_UP, this.removePointer); // #3553\n    document.addEventListener(EVENT.COPY, this.onCopy);\n    this.excalidrawContainerRef.current?.addEventListener(\n      EVENT.WHEEL,\n      this.onWheel,\n      { passive: false },\n    );\n\n    if (this.props.handleKeyboardGlobally) {\n      document.addEventListener(EVENT.KEYDOWN, this.onKeyDown, false);\n    }\n    document.addEventListener(EVENT.KEYUP, this.onKeyUp, { passive: true });\n    document.addEventListener(\n      EVENT.MOUSE_MOVE,\n      this.updateCurrentCursorPosition,\n    );\n    // rerender text elements on font load to fix #637 && #1553\n    document.fonts?.addEventListener?.(\"loadingdone\", (event) => {\n      const loadedFontFaces = (event as FontFaceSetLoadEvent).fontfaces;\n      this.fonts.onFontsLoaded(loadedFontFaces);\n    });\n\n    // Safari-only desktop pinch zoom\n    document.addEventListener(\n      EVENT.GESTURE_START,\n      this.onGestureStart as any,\n      false,\n    );\n    document.addEventListener(\n      EVENT.GESTURE_CHANGE,\n      this.onGestureChange as any,\n      false,\n    );\n    document.addEventListener(\n      EVENT.GESTURE_END,\n      this.onGestureEnd as any,\n      false,\n    );\n    if (this.state.viewModeEnabled) {\n      return;\n    }\n\n    document.addEventListener(EVENT.PASTE, this.pasteFromClipboard);\n    document.addEventListener(EVENT.CUT, this.onCut);\n    if (this.props.detectScroll) {\n      this.nearestScrollableContainer = getNearestScrollableContainer(\n        this.excalidrawContainerRef.current!,\n      );\n      this.nearestScrollableContainer.addEventListener(\n        EVENT.SCROLL,\n        this.onScroll,\n      );\n    }\n    window.addEventListener(EVENT.RESIZE, this.onResize, false);\n    window.addEventListener(EVENT.UNLOAD, this.onUnload, false);\n    window.addEventListener(EVENT.BLUR, this.onBlur, false);\n    this.excalidrawContainerRef.current?.addEventListener(\n      EVENT.DRAG_OVER,\n      this.disableEvent,\n      false,\n    );\n    this.excalidrawContainerRef.current?.addEventListener(\n      EVENT.DROP,\n      this.disableEvent,\n      false,\n    );\n  }\n\n  componentDidUpdate(prevProps: AppProps, prevState: AppState) {\n    if (\n      !this.state.showWelcomeScreen &&\n      !this.scene.getElementsIncludingDeleted().length\n    ) {\n      this.setState({ showWelcomeScreen: true });\n    }\n\n    if (\n      this.excalidrawContainerRef.current &&\n      prevProps.UIOptions.dockedSidebarBreakpoint !==\n        this.props.UIOptions.dockedSidebarBreakpoint\n    ) {\n      this.refreshDeviceState(this.excalidrawContainerRef.current);\n    }\n\n    if (\n      prevState.scrollX !== this.state.scrollX ||\n      prevState.scrollY !== this.state.scrollY\n    ) {\n      this.props?.onScrollChange?.(this.state.scrollX, this.state.scrollY);\n    }\n\n    if (\n      Object.keys(this.state.selectedElementIds).length &&\n      isEraserActive(this.state)\n    ) {\n      this.setState({\n        activeTool: updateActiveTool(this.state, { type: \"selection\" }),\n      });\n    }\n    if (\n      this.state.activeTool.type === \"eraser\" &&\n      prevState.theme !== this.state.theme\n    ) {\n      setEraserCursor(this.canvas, this.state.theme);\n    }\n    // Hide hyperlink popup if shown when element type is not selection\n    if (\n      prevState.activeTool.type === \"selection\" &&\n      this.state.activeTool.type !== \"selection\" &&\n      this.state.showHyperlinkPopup\n    ) {\n      this.setState({ showHyperlinkPopup: false });\n    }\n    if (prevProps.langCode !== this.props.langCode) {\n      this.updateLanguage();\n    }\n\n    if (prevProps.viewModeEnabled !== this.props.viewModeEnabled) {\n      this.setState({ viewModeEnabled: !!this.props.viewModeEnabled });\n    }\n\n    if (prevState.viewModeEnabled !== this.state.viewModeEnabled) {\n      this.addEventListeners();\n      this.deselectElements();\n    }\n\n    if (prevProps.zenModeEnabled !== this.props.zenModeEnabled) {\n      this.setState({ zenModeEnabled: !!this.props.zenModeEnabled });\n    }\n\n    if (prevProps.theme !== this.props.theme && this.props.theme) {\n      this.setState({ theme: this.props.theme });\n    }\n\n    if (prevProps.gridModeEnabled !== this.props.gridModeEnabled) {\n      this.setState({\n        gridSize: this.props.gridModeEnabled ? GRID_SIZE : null,\n      });\n    }\n\n    if (this.props.name && prevProps.name !== this.props.name) {\n      this.setState({\n        name: this.props.name,\n      });\n    }\n\n    this.excalidrawContainerRef.current?.classList.toggle(\n      \"theme--dark\",\n      this.state.theme === \"dark\",\n    );\n\n    if (\n      this.state.editingLinearElement &&\n      !this.state.selectedElementIds[this.state.editingLinearElement.elementId]\n    ) {\n      // defer so that the commitToHistory flag isn't reset via current update\n      setTimeout(() => {\n        // execute only if the condition still holds when the deferred callback\n        // executes (it can be scheduled multiple times depending on how\n        // many times the component renders)\n        this.state.editingLinearElement &&\n          this.actionManager.executeAction(actionFinalize);\n      });\n    }\n\n    if (\n      this.state.selectedLinearElement &&\n      !this.state.selectedElementIds[this.state.selectedLinearElement.elementId]\n    ) {\n      // To make sure `selectedLinearElement` is in sync with `selectedElementIds`, however this shouldn't be needed once\n      // we have a single API to update `selectedElementIds`\n      this.setState({ selectedLinearElement: null });\n    }\n\n    const { multiElement } = prevState;\n    if (\n      prevState.activeTool !== this.state.activeTool &&\n      multiElement != null &&\n      isBindingEnabled(this.state) &&\n      isBindingElement(multiElement, false)\n    ) {\n      maybeBindLinearElement(\n        multiElement,\n        this.state,\n        this.scene,\n        tupleToCoors(\n          LinearElementEditor.getPointAtIndexGlobalCoordinates(\n            multiElement,\n            -1,\n          ),\n        ),\n      );\n    }\n    this.renderScene();\n    this.history.record(this.state, this.scene.getElementsIncludingDeleted());\n\n    // Do not notify consumers if we're still loading the scene. Among other\n    // potential issues, this fixes a case where the tab isn't focused during\n    // init, which would trigger onChange with empty elements, which would then\n    // override whatever is in localStorage currently.\n    if (!this.state.isLoading) {\n      this.props.onChange?.(\n        this.scene.getElementsIncludingDeleted(),\n        this.state,\n        this.files,\n      );\n    }\n  }\n\n  private renderScene = () => {\n    const cursorButton: {\n      [id: string]: string | undefined;\n    } = {};\n    const pointerViewportCoords: RenderConfig[\"remotePointerViewportCoords\"] =\n      {};\n    const remoteSelectedElementIds: RenderConfig[\"remoteSelectedElementIds\"] =\n      {};\n    const pointerUsernames: { [id: string]: string } = {};\n    const pointerUserStates: { [id: string]: string } = {};\n    this.state.collaborators.forEach((user, socketId) => {\n      if (user.selectedElementIds) {\n        for (const id of Object.keys(user.selectedElementIds)) {\n          if (!(id in remoteSelectedElementIds)) {\n            remoteSelectedElementIds[id] = [];\n          }\n          remoteSelectedElementIds[id].push(socketId);\n        }\n      }\n      if (!user.pointer) {\n        return;\n      }\n      if (user.username) {\n        pointerUsernames[socketId] = user.username;\n      }\n      if (user.userState) {\n        pointerUserStates[socketId] = user.userState;\n      }\n      pointerViewportCoords[socketId] = sceneCoordsToViewportCoords(\n        {\n          sceneX: user.pointer.x,\n          sceneY: user.pointer.y,\n        },\n        this.state,\n      );\n      cursorButton[socketId] = user.button;\n    });\n\n    const renderingElements = this.scene\n      .getNonDeletedElements()\n      .filter((element) => {\n        if (isImageElement(element)) {\n          if (\n            // not placed on canvas yet (but in elements array)\n            this.state.pendingImageElementId === element.id\n          ) {\n            return false;\n          }\n        }\n        // don't render text element that's being currently edited (it's\n        // rendered on remote only)\n        return (\n          !this.state.editingElement ||\n          this.state.editingElement.type !== \"text\" ||\n          element.id !== this.state.editingElement.id\n        );\n      });\n\n    const selectionColor = getComputedStyle(\n      document.querySelector(\".excalidraw\")!,\n    ).getPropertyValue(\"--color-selection\");\n\n    renderScene(\n      {\n        elements: renderingElements,\n        appState: this.state,\n        scale: window.devicePixelRatio,\n        rc: this.rc!,\n        canvas: this.canvas!,\n        renderConfig: {\n          selectionColor,\n          scrollX: this.state.scrollX,\n          scrollY: this.state.scrollY,\n          viewBackgroundColor: this.state.viewBackgroundColor,\n          zoom: this.state.zoom,\n          remotePointerViewportCoords: pointerViewportCoords,\n          remotePointerButton: cursorButton,\n          remoteSelectedElementIds,\n          remotePointerUsernames: pointerUsernames,\n          remotePointerUserStates: pointerUserStates,\n          shouldCacheIgnoreZoom: this.state.shouldCacheIgnoreZoom,\n          theme: this.state.theme,\n          imageCache: this.imageCache,\n          isExporting: false,\n          renderScrollbars: !this.device.isMobile,\n        },\n        callback: ({ atLeastOneVisibleElement, scrollBars }) => {\n          if (scrollBars) {\n            currentScrollBars = scrollBars;\n          }\n          const scrolledOutside =\n            // hide when editing text\n            isTextElement(this.state.editingElement)\n              ? false\n              : !atLeastOneVisibleElement && renderingElements.length > 0;\n          if (this.state.scrolledOutside !== scrolledOutside) {\n            this.setState({ scrolledOutside });\n          }\n\n          this.scheduleImageRefresh();\n        },\n      },\n      THROTTLE_NEXT_RENDER && window.EXCALIDRAW_THROTTLE_RENDER === true,\n    );\n\n    if (!THROTTLE_NEXT_RENDER) {\n      THROTTLE_NEXT_RENDER = true;\n    }\n  };\n\n  private onScroll = debounce(() => {\n    const { offsetTop, offsetLeft } = this.getCanvasOffsets();\n    this.setState((state) => {\n      if (state.offsetLeft === offsetLeft && state.offsetTop === offsetTop) {\n        return null;\n      }\n      return { offsetTop, offsetLeft };\n    });\n  }, SCROLL_TIMEOUT);\n\n  // Copy/paste\n\n  private onCut = withBatchedUpdates((event: ClipboardEvent) => {\n    const isExcalidrawActive = this.excalidrawContainerRef.current?.contains(\n      document.activeElement,\n    );\n    if (!isExcalidrawActive || isWritableElement(event.target)) {\n      return;\n    }\n    this.cutAll();\n    event.preventDefault();\n    event.stopPropagation();\n  });\n\n  private onCopy = withBatchedUpdates((event: ClipboardEvent) => {\n    const isExcalidrawActive = this.excalidrawContainerRef.current?.contains(\n      document.activeElement,\n    );\n    if (!isExcalidrawActive || isWritableElement(event.target)) {\n      return;\n    }\n    this.copyAll();\n    event.preventDefault();\n    event.stopPropagation();\n  });\n\n  private cutAll = () => {\n    this.actionManager.executeAction(actionCut, \"keyboard\");\n  };\n\n  private copyAll = () => {\n    this.actionManager.executeAction(actionCopy, \"keyboard\");\n  };\n\n  private static resetTapTwice() {\n    didTapTwice = false;\n  }\n\n  private onTapStart = (event: TouchEvent) => {\n    // fix for Apple Pencil Scribble\n    // On Android, preventing the event would disable contextMenu on tap-hold\n    if (!isAndroid) {\n      event.preventDefault();\n    }\n\n    if (!didTapTwice) {\n      didTapTwice = true;\n      clearTimeout(tappedTwiceTimer);\n      tappedTwiceTimer = window.setTimeout(\n        App.resetTapTwice,\n        TAP_TWICE_TIMEOUT,\n      );\n      return;\n    }\n    // insert text only if we tapped twice with a single finger\n    // event.touches.length === 1 will also prevent inserting text when user's zooming\n    if (didTapTwice && event.touches.length === 1) {\n      const [touch] = event.touches;\n      // @ts-ignore\n      this.handleCanvasDoubleClick({\n        clientX: touch.clientX,\n        clientY: touch.clientY,\n      });\n      didTapTwice = false;\n      clearTimeout(tappedTwiceTimer);\n    }\n    if (isAndroid) {\n      event.preventDefault();\n    }\n\n    if (event.touches.length === 2) {\n      this.setState({\n        selectedElementIds: {},\n      });\n    }\n  };\n\n  private onTapEnd = (event: TouchEvent) => {\n    this.resetContextMenuTimer();\n    if (event.touches.length > 0) {\n      this.setState({\n        previousSelectedElementIds: {},\n        selectedElementIds: this.state.previousSelectedElementIds,\n      });\n    } else {\n      gesture.pointers.clear();\n    }\n  };\n\n  public pasteFromClipboard = withBatchedUpdates(\n    async (event: ClipboardEvent | null) => {\n      const isPlainPaste = !!(IS_PLAIN_PASTE && event);\n\n      // #686\n      const target = document.activeElement;\n      const isExcalidrawActive =\n        this.excalidrawContainerRef.current?.contains(target);\n      if (event && !isExcalidrawActive) {\n        return;\n      }\n\n      const elementUnderCursor = document.elementFromPoint(cursorX, cursorY);\n      if (\n        event &&\n        (!(elementUnderCursor instanceof HTMLCanvasElement) ||\n          isWritableElement(target))\n      ) {\n        return;\n      }\n\n      // must be called in the same frame (thus before any awaits) as the paste\n      // event else some browsers (FF...) will clear the clipboardData\n      // (something something security)\n      let file = event?.clipboardData?.files[0];\n\n      const data = await parseClipboard(event, isPlainPaste);\n\n      if (!file && data.text && !isPlainPaste) {\n        const string = data.text.trim();\n        if (string.startsWith(\"<svg\") && string.endsWith(\"</svg>\")) {\n          // ignore SVG validation/normalization which will be done during image\n          // initialization\n          file = SVGStringToFile(string);\n        }\n      }\n\n      // prefer spreadsheet data over image file (MS Office/Libre Office)\n      if (isSupportedImageFile(file) && !data.spreadsheet) {\n        const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n          { clientX: cursorX, clientY: cursorY },\n          this.state,\n        );\n\n        const imageElement = this.createImageElement({ sceneX, sceneY });\n        this.insertImageElement(imageElement, file);\n        this.initializeImageDimensions(imageElement);\n        this.setState({ selectedElementIds: { [imageElement.id]: true } });\n\n        return;\n      }\n\n      if (this.props.onPaste) {\n        try {\n          if ((await this.props.onPaste(data, event)) === false) {\n            return;\n          }\n        } catch (error: any) {\n          console.error(error);\n        }\n      }\n\n      if (data.errorMessage) {\n        this.setState({ errorMessage: data.errorMessage });\n      } else if (data.spreadsheet && !isPlainPaste) {\n        this.setState({\n          pasteDialog: {\n            data: data.spreadsheet,\n            shown: true,\n          },\n        });\n      } else if (data.elements) {\n        // TODO remove formatting from elements if isPlainPaste\n        this.addElementsFromPasteOrLibrary({\n          elements: data.elements,\n          files: data.files || null,\n          position: \"cursor\",\n        });\n      } else if (data.text) {\n        this.addTextFromPaste(data.text, isPlainPaste);\n      }\n      this.setActiveTool({ type: \"selection\" });\n      event?.preventDefault();\n    },\n  );\n\n  private addElementsFromPasteOrLibrary = (opts: {\n    elements: readonly ExcalidrawElement[];\n    files: BinaryFiles | null;\n    position: { clientX: number; clientY: number } | \"cursor\" | \"center\";\n  }) => {\n    const elements = restoreElements(opts.elements, null);\n    const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n\n    const elementsCenterX = distance(minX, maxX) / 2;\n    const elementsCenterY = distance(minY, maxY) / 2;\n\n    const clientX =\n      typeof opts.position === \"object\"\n        ? opts.position.clientX\n        : opts.position === \"cursor\"\n        ? cursorX\n        : this.state.width / 2 + this.state.offsetLeft;\n    const clientY =\n      typeof opts.position === \"object\"\n        ? opts.position.clientY\n        : opts.position === \"cursor\"\n        ? cursorY\n        : this.state.height / 2 + this.state.offsetTop;\n\n    const { x, y } = viewportCoordsToSceneCoords(\n      { clientX, clientY },\n      this.state,\n    );\n\n    const dx = x - elementsCenterX;\n    const dy = y - elementsCenterY;\n    const groupIdMap = new Map();\n\n    const [gridX, gridY] = getGridPoint(dx, dy, this.state.gridSize);\n\n    const oldIdToDuplicatedId = new Map();\n    const newElements = elements.map((element) => {\n      const newElement = duplicateElement(\n        this.state.editingGroupId,\n        groupIdMap,\n        element,\n        {\n          x: element.x + gridX - minX,\n          y: element.y + gridY - minY,\n        },\n      );\n      oldIdToDuplicatedId.set(element.id, newElement.id);\n      return newElement;\n    });\n\n    bindTextToShapeAfterDuplication(newElements, elements, oldIdToDuplicatedId);\n    const nextElements = [\n      ...this.scene.getElementsIncludingDeleted(),\n      ...newElements,\n    ];\n    fixBindingsAfterDuplication(nextElements, elements, oldIdToDuplicatedId);\n\n    if (opts.files) {\n      this.files = { ...this.files, ...opts.files };\n    }\n\n    this.scene.replaceAllElements(nextElements);\n\n    newElements.forEach((newElement) => {\n      if (isTextElement(newElement) && isBoundToContainer(newElement)) {\n        const container = getContainerElement(newElement);\n        redrawTextBoundingBox(newElement, container);\n      }\n    });\n\n    this.history.resumeRecording();\n\n    this.setState(\n      selectGroupsForSelectedElements(\n        {\n          ...this.state,\n          // keep sidebar (presumably the library) open if it's docked and\n          // can fit.\n          //\n          // Note, we should close the sidebar only if we're dropping items\n          // from library, not when pasting from clipboard. Alas.\n          openSidebar:\n            this.state.openSidebar &&\n            this.device.canDeviceFitSidebar &&\n            this.state.isSidebarDocked\n              ? this.state.openSidebar\n              : null,\n          selectedElementIds: newElements.reduce(\n            (acc: Record<ExcalidrawElement[\"id\"], true>, element) => {\n              if (!isBoundToContainer(element)) {\n                acc[element.id] = true;\n              }\n              return acc;\n            },\n            {},\n          ),\n          selectedGroupIds: {},\n        },\n        this.scene.getNonDeletedElements(),\n      ),\n      () => {\n        if (opts.files) {\n          this.addNewImagesToImageCache();\n        }\n      },\n    );\n    this.setActiveTool({ type: \"selection\" });\n  };\n\n  private addTextFromPaste(text: string, isPlainPaste = false) {\n    const { x, y } = viewportCoordsToSceneCoords(\n      { clientX: cursorX, clientY: cursorY },\n      this.state,\n    );\n\n    const textElementProps = {\n      x,\n      y,\n      strokeColor: this.state.currentItemStrokeColor,\n      backgroundColor: this.state.currentItemBackgroundColor,\n      fillStyle: this.state.currentItemFillStyle,\n      strokeWidth: this.state.currentItemStrokeWidth,\n      strokeStyle: this.state.currentItemStrokeStyle,\n      roundness: null,\n      roughness: this.state.currentItemRoughness,\n      opacity: this.state.currentItemOpacity,\n      text,\n      fontSize: this.state.currentItemFontSize,\n      fontFamily: this.state.currentItemFontFamily,\n      textAlign: this.state.currentItemTextAlign,\n      verticalAlign: DEFAULT_VERTICAL_ALIGN,\n      locked: false,\n    };\n\n    const LINE_GAP = 10;\n    let currentY = y;\n\n    const lines = isPlainPaste ? [text] : text.split(\"\\n\");\n    const textElements = lines.reduce(\n      (acc: ExcalidrawTextElement[], line, idx) => {\n        const text = line.trim();\n\n        if (text.length) {\n          const element = newTextElement({\n            ...textElementProps,\n            x,\n            y: currentY,\n            text,\n          });\n          acc.push(element);\n          currentY += element.height + LINE_GAP;\n        } else {\n          const prevLine = lines[idx - 1]?.trim();\n          // add paragraph only if previous line was not empty, IOW don't add\n          // more than one empty line\n          if (prevLine) {\n            const defaultLineHeight = getApproxLineHeight(\n              getFontString({\n                fontSize: textElementProps.fontSize,\n                fontFamily: textElementProps.fontFamily,\n              }),\n            );\n\n            currentY += defaultLineHeight + LINE_GAP;\n          }\n        }\n\n        return acc;\n      },\n      [],\n    );\n\n    if (textElements.length === 0) {\n      return;\n    }\n\n    this.scene.replaceAllElements([\n      ...this.scene.getElementsIncludingDeleted(),\n      ...textElements,\n    ]);\n\n    this.setState({\n      selectedElementIds: Object.fromEntries(\n        textElements.map((el) => [el.id, true]),\n      ),\n    });\n\n    if (\n      !isPlainPaste &&\n      textElements.length > 1 &&\n      PLAIN_PASTE_TOAST_SHOWN === false &&\n      !this.device.isMobile\n    ) {\n      this.setToast({\n        message: t(\"toast.pasteAsSingleElement\", {\n          shortcut: getShortcutKey(\"CtrlOrCmd+Shift+V\"),\n        }),\n        duration: 5000,\n      });\n      PLAIN_PASTE_TOAST_SHOWN = true;\n    }\n\n    this.history.resumeRecording();\n  }\n\n  setAppState: React.Component<any, AppState>[\"setState\"] = (\n    state,\n    callback,\n  ) => {\n    this.setState(state, callback);\n  };\n\n  removePointer = (event: React.PointerEvent<HTMLElement> | PointerEvent) => {\n    if (touchTimeout) {\n      this.resetContextMenuTimer();\n    }\n\n    gesture.pointers.delete(event.pointerId);\n  };\n\n  toggleLock = (source: \"keyboard\" | \"ui\" = \"ui\") => {\n    if (!this.state.activeTool.locked) {\n      trackEvent(\n        \"toolbar\",\n        \"toggleLock\",\n        `${source} (${this.device.isMobile ? \"mobile\" : \"desktop\"})`,\n      );\n    }\n    this.setState((prevState) => {\n      return {\n        activeTool: {\n          ...prevState.activeTool,\n          ...updateActiveTool(\n            this.state,\n            prevState.activeTool.locked\n              ? { type: \"selection\" }\n              : prevState.activeTool,\n          ),\n          locked: !prevState.activeTool.locked,\n        },\n      };\n    });\n  };\n\n  togglePenMode = () => {\n    this.setState((prevState) => {\n      return {\n        penMode: !prevState.penMode,\n      };\n    });\n  };\n\n  onHandToolToggle = () => {\n    this.actionManager.executeAction(actionToggleHandTool);\n  };\n\n  scrollToContent = (\n    target:\n      | ExcalidrawElement\n      | readonly ExcalidrawElement[] = this.scene.getNonDeletedElements(),\n  ) => {\n    this.setState({\n      ...calculateScrollCenter(\n        Array.isArray(target) ? target : [target],\n        this.state,\n        this.canvas,\n      ),\n    });\n  };\n\n  setToast = (\n    toast: {\n      message: string;\n      closable?: boolean;\n      duration?: number;\n    } | null,\n  ) => {\n    this.setState({ toast });\n  };\n\n  restoreFileFromShare = async () => {\n    try {\n      const webShareTargetCache = await caches.open(\"web-share-target\");\n\n      const response = await webShareTargetCache.match(\"shared-file\");\n      if (response) {\n        const blob = await response.blob();\n        const file = new File([blob], blob.name || \"\", { type: blob.type });\n        this.loadFileToCanvas(file, null);\n        await webShareTargetCache.delete(\"shared-file\");\n        window.history.replaceState(null, APP_NAME, window.location.pathname);\n      }\n    } catch (error: any) {\n      this.setState({ errorMessage: error.message });\n    }\n  };\n\n  /** adds supplied files to existing files in the appState */\n  public addFiles: ExcalidrawImperativeAPI[\"addFiles\"] = withBatchedUpdates(\n    (files) => {\n      const filesMap = files.reduce((acc, fileData) => {\n        acc.set(fileData.id, fileData);\n        return acc;\n      }, new Map<FileId, BinaryFileData>());\n\n      this.files = { ...this.files, ...Object.fromEntries(filesMap) };\n\n      this.scene.getNonDeletedElements().forEach((element) => {\n        if (\n          isInitializedImageElement(element) &&\n          filesMap.has(element.fileId)\n        ) {\n          this.imageCache.delete(element.fileId);\n          invalidateShapeForElement(element);\n        }\n      });\n      this.scene.informMutation();\n\n      this.addNewImagesToImageCache();\n    },\n  );\n\n  public updateScene = withBatchedUpdates(\n    <K extends keyof AppState>(sceneData: {\n      elements?: SceneData[\"elements\"];\n      appState?: Pick<AppState, K> | null;\n      collaborators?: SceneData[\"collaborators\"];\n      commitToHistory?: SceneData[\"commitToHistory\"];\n    }) => {\n      if (sceneData.commitToHistory) {\n        this.history.resumeRecording();\n      }\n\n      if (sceneData.appState) {\n        this.setState(sceneData.appState);\n      }\n\n      if (sceneData.elements) {\n        this.scene.replaceAllElements(sceneData.elements);\n      }\n\n      if (sceneData.collaborators) {\n        this.setState({ collaborators: sceneData.collaborators });\n      }\n    },\n  );\n\n  private onSceneUpdated = () => {\n    this.setState({});\n  };\n\n  /**\n   * @returns whether the menu was toggled on or off\n   */\n  public toggleMenu = (\n    type: \"library\" | \"customSidebar\",\n    force?: boolean,\n  ): boolean => {\n    if (type === \"customSidebar\" && !this.props.renderSidebar) {\n      console.warn(\n        `attempting to toggle \"customSidebar\", but no \"props.renderSidebar\" is defined`,\n      );\n      return false;\n    }\n\n    if (type === \"library\" || type === \"customSidebar\") {\n      let nextValue;\n      if (force === undefined) {\n        nextValue = this.state.openSidebar === type ? null : type;\n      } else {\n        nextValue = force ? type : null;\n      }\n      this.setState({ openSidebar: nextValue });\n\n      return !!nextValue;\n    }\n\n    return false;\n  };\n\n  private updateCurrentCursorPosition = withBatchedUpdates(\n    (event: MouseEvent) => {\n      cursorX = event.clientX;\n      cursorY = event.clientY;\n    },\n  );\n\n  // Input handling\n  private onKeyDown = withBatchedUpdates(\n    (event: React.KeyboardEvent | KeyboardEvent) => {\n      // normalize `event.key` when CapsLock is pressed #2372\n\n      if (\n        \"Proxy\" in window &&\n        ((!event.shiftKey && /^[A-Z]$/.test(event.key)) ||\n          (event.shiftKey && /^[a-z]$/.test(event.key)))\n      ) {\n        event = new Proxy(event, {\n          get(ev: any, prop) {\n            const value = ev[prop];\n            if (typeof value === \"function\") {\n              // fix for Proxies hijacking `this`\n              return value.bind(ev);\n            }\n            return prop === \"key\"\n              ? // CapsLock inverts capitalization based on ShiftKey, so invert\n                // it back\n                event.shiftKey\n                ? ev.key.toUpperCase()\n                : ev.key.toLowerCase()\n              : value;\n          },\n        });\n      }\n\n      if (event[KEYS.CTRL_OR_CMD] && event.key.toLowerCase() === KEYS.V) {\n        IS_PLAIN_PASTE = event.shiftKey;\n        clearTimeout(IS_PLAIN_PASTE_TIMER);\n        // reset (100ms to be safe that we it runs after the ensuing\n        // paste event). Though, technically unnecessary to reset since we\n        // (re)set the flag before each paste event.\n        IS_PLAIN_PASTE_TIMER = window.setTimeout(() => {\n          IS_PLAIN_PASTE = false;\n        }, 100);\n      }\n\n      // prevent browser zoom in input fields\n      if (event[KEYS.CTRL_OR_CMD] && isWritableElement(event.target)) {\n        if (event.code === CODES.MINUS || event.code === CODES.EQUAL) {\n          event.preventDefault();\n          return;\n        }\n      }\n\n      // bail if\n      if (\n        // inside an input\n        (isWritableElement(event.target) &&\n          // unless pressing escape (finalize action)\n          event.key !== KEYS.ESCAPE) ||\n        // or unless using arrows (to move between buttons)\n        (isArrowKey(event.key) && isInputLike(event.target))\n      ) {\n        return;\n      }\n\n      if (event.key === KEYS.QUESTION_MARK) {\n        this.setState({\n          openDialog: \"help\",\n        });\n        return;\n      } else if (\n        event.key.toLowerCase() === KEYS.E &&\n        event.shiftKey &&\n        event[KEYS.CTRL_OR_CMD]\n      ) {\n        this.setState({ openDialog: \"imageExport\" });\n        return;\n      }\n\n      if (event.key === KEYS.PAGE_UP || event.key === KEYS.PAGE_DOWN) {\n        let offset =\n          (event.shiftKey ? this.state.width : this.state.height) /\n          this.state.zoom.value;\n        if (event.key === KEYS.PAGE_DOWN) {\n          offset = -offset;\n        }\n        if (event.shiftKey) {\n          this.setState((state) => ({ scrollX: state.scrollX + offset }));\n        } else {\n          this.setState((state) => ({ scrollY: state.scrollY + offset }));\n        }\n      }\n\n      if (this.actionManager.handleKeyDown(event)) {\n        return;\n      }\n\n      if (this.state.viewModeEnabled) {\n        return;\n      }\n\n      if (event[KEYS.CTRL_OR_CMD] && this.state.isBindingEnabled) {\n        this.setState({ isBindingEnabled: false });\n      }\n\n      if (isArrowKey(event.key)) {\n        const step =\n          (this.state.gridSize &&\n            (event.shiftKey\n              ? ELEMENT_TRANSLATE_AMOUNT\n              : this.state.gridSize)) ||\n          (event.shiftKey\n            ? ELEMENT_SHIFT_TRANSLATE_AMOUNT\n            : ELEMENT_TRANSLATE_AMOUNT);\n\n        let offsetX = 0;\n        let offsetY = 0;\n\n        if (event.key === KEYS.ARROW_LEFT) {\n          offsetX = -step;\n        } else if (event.key === KEYS.ARROW_RIGHT) {\n          offsetX = step;\n        } else if (event.key === KEYS.ARROW_UP) {\n          offsetY = -step;\n        } else if (event.key === KEYS.ARROW_DOWN) {\n          offsetY = step;\n        }\n\n        const selectedElements = getSelectedElements(\n          this.scene.getNonDeletedElements(),\n          this.state,\n          true,\n        );\n\n        selectedElements.forEach((element) => {\n          mutateElement(element, {\n            x: element.x + offsetX,\n            y: element.y + offsetY,\n          });\n\n          updateBoundElements(element, {\n            simultaneouslyUpdated: selectedElements,\n          });\n        });\n\n        this.maybeSuggestBindingForAll(selectedElements);\n\n        event.preventDefault();\n      } else if (event.key === KEYS.ENTER) {\n        const selectedElements = getSelectedElements(\n          this.scene.getNonDeletedElements(),\n          this.state,\n        );\n        if (selectedElements.length === 1) {\n          const selectedElement = selectedElements[0];\n          if (event[KEYS.CTRL_OR_CMD]) {\n            if (isLinearElement(selectedElement)) {\n              if (\n                !this.state.editingLinearElement ||\n                this.state.editingLinearElement.elementId !==\n                  selectedElements[0].id\n              ) {\n                this.history.resumeRecording();\n                this.setState({\n                  editingLinearElement: new LinearElementEditor(\n                    selectedElement,\n                    this.scene,\n                  ),\n                });\n              }\n            }\n          } else if (\n            isTextElement(selectedElement) ||\n            isValidTextContainer(selectedElement)\n          ) {\n            let container;\n            if (!isTextElement(selectedElement)) {\n              container = selectedElement as ExcalidrawTextContainer;\n            }\n            const midPoint = getContainerCenter(selectedElement, this.state);\n            const sceneX = midPoint.x;\n            const sceneY = midPoint.y;\n            this.startTextEditing({\n              sceneX,\n              sceneY,\n              container,\n            });\n            event.preventDefault();\n            return;\n          }\n        }\n      } else if (\n        !event.ctrlKey &&\n        !event.altKey &&\n        !event.metaKey &&\n        this.state.draggingElement === null\n      ) {\n        const shape = findShapeByKey(event.key);\n        if (shape) {\n          if (this.state.activeTool.type !== shape) {\n            trackEvent(\n              \"toolbar\",\n              shape,\n              `keyboard (${this.device.isMobile ? \"mobile\" : \"desktop\"})`,\n            );\n          }\n          this.setActiveTool({ type: shape });\n          event.stopPropagation();\n        } else if (event.key === KEYS.Q) {\n          this.toggleLock(\"keyboard\");\n          event.stopPropagation();\n        }\n      }\n      if (event.key === KEYS.SPACE && gesture.pointers.size === 0) {\n        isHoldingSpace = true;\n        setCursor(this.canvas, CURSOR_TYPE.GRAB);\n        event.preventDefault();\n      }\n\n      if (\n        (event.key === KEYS.G || event.key === KEYS.S) &&\n        !event.altKey &&\n        !event[KEYS.CTRL_OR_CMD]\n      ) {\n        const selectedElements = getSelectedElements(\n          this.scene.getNonDeletedElements(),\n          this.state,\n        );\n        if (\n          this.state.activeTool.type === \"selection\" &&\n          !selectedElements.length\n        ) {\n          return;\n        }\n\n        if (\n          event.key === KEYS.G &&\n          (hasBackground(this.state.activeTool.type) ||\n            selectedElements.some((element) => hasBackground(element.type)))\n        ) {\n          this.setState({ openPopup: \"backgroundColorPicker\" });\n          event.stopPropagation();\n        }\n        if (event.key === KEYS.S) {\n          this.setState({ openPopup: \"strokeColorPicker\" });\n          event.stopPropagation();\n        }\n      }\n\n      if (\n        event[KEYS.CTRL_OR_CMD] &&\n        (event.key === KEYS.BACKSPACE || event.key === KEYS.DELETE)\n      ) {\n        jotaiStore.set(activeConfirmDialogAtom, \"clearCanvas\");\n      }\n    },\n  );\n\n  private onWheel = withBatchedUpdates((event: WheelEvent) => {\n    // prevent browser pinch zoom on DOM elements\n    if (!(event.target instanceof HTMLCanvasElement) && event.ctrlKey) {\n      event.preventDefault();\n    }\n  });\n\n  private onKeyUp = withBatchedUpdates((event: KeyboardEvent) => {\n    if (event.key === KEYS.SPACE) {\n      if (this.state.viewModeEnabled) {\n        setCursor(this.canvas, CURSOR_TYPE.GRAB);\n      } else if (this.state.activeTool.type === \"selection\") {\n        resetCursor(this.canvas);\n      } else {\n        setCursorForShape(this.canvas, this.state);\n        this.setState({\n          selectedElementIds: {},\n          selectedGroupIds: {},\n          editingGroupId: null,\n        });\n      }\n      isHoldingSpace = false;\n    }\n    if (!event[KEYS.CTRL_OR_CMD] && !this.state.isBindingEnabled) {\n      this.setState({ isBindingEnabled: true });\n    }\n    if (isArrowKey(event.key)) {\n      const selectedElements = getSelectedElements(\n        this.scene.getNonDeletedElements(),\n        this.state,\n      );\n      isBindingEnabled(this.state)\n        ? bindOrUnbindSelectedElements(selectedElements)\n        : unbindLinearElements(selectedElements);\n      this.setState({ suggestedBindings: [] });\n    }\n  });\n\n  private setActiveTool = (\n    tool:\n      | { type: typeof SHAPES[number][\"value\"] | \"eraser\" | \"hand\" }\n      | { type: \"custom\"; customType: string },\n  ) => {\n    const nextActiveTool = updateActiveTool(this.state, tool);\n    if (nextActiveTool.type === \"hand\") {\n      setCursor(this.canvas, CURSOR_TYPE.GRAB);\n    } else if (!isHoldingSpace) {\n      setCursorForShape(this.canvas, this.state);\n    }\n    if (isToolIcon(document.activeElement)) {\n      this.focusContainer();\n    }\n    if (!isLinearElementType(nextActiveTool.type)) {\n      this.setState({ suggestedBindings: [] });\n    }\n    if (nextActiveTool.type === \"image\") {\n      this.onImageAction();\n    }\n    if (nextActiveTool.type !== \"selection\") {\n      this.setState({\n        activeTool: nextActiveTool,\n        selectedElementIds: {},\n        selectedGroupIds: {},\n        editingGroupId: null,\n      });\n    } else {\n      this.setState({ activeTool: nextActiveTool });\n    }\n  };\n\n  private setCursor = (cursor: string) => {\n    setCursor(this.canvas, cursor);\n  };\n\n  private resetCursor = () => {\n    resetCursor(this.canvas);\n  };\n  /**\n   * returns whether user is making a gesture with >= 2 fingers (points)\n   * on o touch screen (not on a trackpad). Currently only relates to Darwin\n   * (iOS/iPadOS,MacOS), but may work on other devices in the future if\n   * GestureEvent is standardized.\n   */\n  private isTouchScreenMultiTouchGesture = () => {\n    // we don't want to deselect when using trackpad, and multi-point gestures\n    // only work on touch screens, so checking for >= pointers means we're on a\n    // touchscreen\n    return gesture.pointers.size >= 2;\n  };\n\n  // fires only on Safari\n  private onGestureStart = withBatchedUpdates((event: GestureEvent) => {\n    event.preventDefault();\n\n    // we only want to deselect on touch screens because user may have selected\n    // elements by mistake while zooming\n    if (this.isTouchScreenMultiTouchGesture()) {\n      this.setState({\n        selectedElementIds: {},\n      });\n    }\n    gesture.initialScale = this.state.zoom.value;\n  });\n\n  // fires only on Safari\n  private onGestureChange = withBatchedUpdates((event: GestureEvent) => {\n    event.preventDefault();\n\n    // onGestureChange only has zoom factor but not the center.\n    // If we're on iPad or iPhone, then we recognize multi-touch and will\n    // zoom in at the right location in the touchmove handler\n    // (handleCanvasPointerMove).\n    //\n    // On Macbook trackpad, we don't have those events so will zoom in at the\n    // current location instead.\n    //\n    // As such, bail from this handler on touch devices.\n    if (this.isTouchScreenMultiTouchGesture()) {\n      return;\n    }\n\n    const initialScale = gesture.initialScale;\n    if (initialScale) {\n      this.setState((state) => ({\n        ...getStateForZoom(\n          {\n            viewportX: cursorX,\n            viewportY: cursorY,\n            nextZoom: getNormalizedZoom(initialScale * event.scale),\n          },\n          state,\n        ),\n      }));\n    }\n  });\n\n  // fires only on Safari\n  private onGestureEnd = withBatchedUpdates((event: GestureEvent) => {\n    event.preventDefault();\n    // reselect elements only on touch screens (see onGestureStart)\n    if (this.isTouchScreenMultiTouchGesture()) {\n      this.setState({\n        previousSelectedElementIds: {},\n        selectedElementIds: this.state.previousSelectedElementIds,\n      });\n    }\n    gesture.initialScale = null;\n  });\n\n  private handleTextWysiwyg(\n    element: ExcalidrawTextElement,\n    {\n      isExistingElement = false,\n    }: {\n      isExistingElement?: boolean;\n    },\n  ) {\n    const updateElement = (\n      text: string,\n      originalText: string,\n      isDeleted: boolean,\n    ) => {\n      this.scene.replaceAllElements([\n        ...this.scene.getElementsIncludingDeleted().map((_element) => {\n          if (_element.id === element.id && isTextElement(_element)) {\n            return updateTextElement(_element, {\n              text,\n              isDeleted,\n              originalText,\n            });\n          }\n          return _element;\n        }),\n      ]);\n    };\n\n    textWysiwyg({\n      id: element.id,\n      canvas: this.canvas,\n      getViewportCoords: (x, y) => {\n        const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(\n          {\n            sceneX: x,\n            sceneY: y,\n          },\n          this.state,\n        );\n        return [\n          viewportX - this.state.offsetLeft,\n          viewportY - this.state.offsetTop,\n        ];\n      },\n      onChange: withBatchedUpdates((text) => {\n        updateElement(text, text, false);\n        if (isNonDeletedElement(element)) {\n          updateBoundElements(element);\n        }\n      }),\n      onSubmit: withBatchedUpdates(({ text, viaKeyboard, originalText }) => {\n        const isDeleted = !text.trim();\n        updateElement(text, originalText, isDeleted);\n        // select the created text element only if submitting via keyboard\n        // (when submitting via click it should act as signal to deselect)\n        if (!isDeleted && viaKeyboard) {\n          const elementIdToSelect = element.containerId\n            ? element.containerId\n            : element.id;\n          this.setState((prevState) => ({\n            selectedElementIds: {\n              ...prevState.selectedElementIds,\n              [elementIdToSelect]: true,\n            },\n          }));\n        }\n        if (isDeleted) {\n          fixBindingsAfterDeletion(this.scene.getNonDeletedElements(), [\n            element,\n          ]);\n        }\n        if (!isDeleted || isExistingElement) {\n          this.history.resumeRecording();\n        }\n\n        this.setState({\n          draggingElement: null,\n          editingElement: null,\n        });\n        if (this.state.activeTool.locked) {\n          setCursorForShape(this.canvas, this.state);\n        }\n\n        this.focusContainer();\n      }),\n      element,\n      excalidrawContainer: this.excalidrawContainerRef.current,\n      app: this,\n    });\n    // deselect all other elements when inserting text\n    this.deselectElements();\n\n    // do an initial update to re-initialize element position since we were\n    // modifying element's x/y for sake of editor (case: syncing to remote)\n    updateElement(element.text, element.originalText, false);\n  }\n\n  private deselectElements() {\n    this.setState({\n      selectedElementIds: {},\n      selectedGroupIds: {},\n      editingGroupId: null,\n    });\n  }\n\n  private getTextElementAtPosition(\n    x: number,\n    y: number,\n  ): NonDeleted<ExcalidrawTextElement> | null {\n    const element = this.getElementAtPosition(x, y, {\n      includeBoundTextElement: true,\n    });\n    if (element && isTextElement(element) && !element.isDeleted) {\n      return element;\n    }\n    return null;\n  }\n\n  private getElementAtPosition(\n    x: number,\n    y: number,\n    opts?: {\n      /** if true, returns the first selected element (with highest z-index)\n        of all hit elements */\n      preferSelected?: boolean;\n      includeBoundTextElement?: boolean;\n      includeLockedElements?: boolean;\n    },\n  ): NonDeleted<ExcalidrawElement> | null {\n    const allHitElements = this.getElementsAtPosition(\n      x,\n      y,\n      opts?.includeBoundTextElement,\n      opts?.includeLockedElements,\n    );\n    if (allHitElements.length > 1) {\n      if (opts?.preferSelected) {\n        for (let index = allHitElements.length - 1; index > -1; index--) {\n          if (this.state.selectedElementIds[allHitElements[index].id]) {\n            return allHitElements[index];\n          }\n        }\n      }\n      const elementWithHighestZIndex =\n        allHitElements[allHitElements.length - 1];\n      // If we're hitting element with highest z-index only on its bounding box\n      // while also hitting other element figure, the latter should be considered.\n      return isHittingElementBoundingBoxWithoutHittingElement(\n        elementWithHighestZIndex,\n        this.state,\n        x,\n        y,\n      )\n        ? allHitElements[allHitElements.length - 2]\n        : elementWithHighestZIndex;\n    }\n    if (allHitElements.length === 1) {\n      return allHitElements[0];\n    }\n    return null;\n  }\n\n  private getElementsAtPosition(\n    x: number,\n    y: number,\n    includeBoundTextElement: boolean = false,\n    includeLockedElements: boolean = false,\n  ): NonDeleted<ExcalidrawElement>[] {\n    const elements =\n      includeBoundTextElement && includeLockedElements\n        ? this.scene.getNonDeletedElements()\n        : this.scene\n            .getNonDeletedElements()\n            .filter(\n              (element) =>\n                (includeLockedElements || !element.locked) &&\n                (includeBoundTextElement ||\n                  !(isTextElement(element) && element.containerId)),\n            );\n\n    return getElementsAtPosition(elements, (element) =>\n      hitTest(element, this.state, x, y),\n    );\n  }\n\n  private startTextEditing = ({\n    sceneX,\n    sceneY,\n    insertAtParentCenter = true,\n    container,\n  }: {\n    /** X position to insert text at */\n    sceneX: number;\n    /** Y position to insert text at */\n    sceneY: number;\n    /** whether to attempt to insert at element center if applicable */\n    insertAtParentCenter?: boolean;\n    container?: ExcalidrawTextContainer | null;\n  }) => {\n    let shouldBindToContainer = false;\n\n    let parentCenterPosition =\n      insertAtParentCenter &&\n      this.getTextWysiwygSnappedToCenterPosition(\n        sceneX,\n        sceneY,\n        this.state,\n        container,\n      );\n    if (container && parentCenterPosition) {\n      shouldBindToContainer = true;\n    }\n    let existingTextElement: NonDeleted<ExcalidrawTextElement> | null = null;\n\n    const selectedElements = getSelectedElements(\n      this.scene.getNonDeletedElements(),\n      this.state,\n    );\n\n    if (selectedElements.length === 1) {\n      if (isTextElement(selectedElements[0])) {\n        existingTextElement = selectedElements[0];\n      } else if (container) {\n        existingTextElement = getBoundTextElement(selectedElements[0]);\n      } else {\n        existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\n      }\n    } else {\n      existingTextElement = this.getTextElementAtPosition(sceneX, sceneY);\n    }\n\n    if (\n      !existingTextElement &&\n      shouldBindToContainer &&\n      container &&\n      !isArrowElement(container)\n    ) {\n      const fontString = {\n        fontSize: this.state.currentItemFontSize,\n        fontFamily: this.state.currentItemFontFamily,\n      };\n      const minWidth = getApproxMinLineWidth(getFontString(fontString));\n      const minHeight = getApproxMinLineHeight(getFontString(fontString));\n      const containerDims = getContainerDims(container);\n      const newHeight = Math.max(containerDims.height, minHeight);\n      const newWidth = Math.max(containerDims.width, minWidth);\n      mutateElement(container, { height: newHeight, width: newWidth });\n      sceneX = container.x + newWidth / 2;\n      sceneY = container.y + newHeight / 2;\n      if (parentCenterPosition) {\n        parentCenterPosition = this.getTextWysiwygSnappedToCenterPosition(\n          sceneX,\n          sceneY,\n          this.state,\n          container,\n        );\n      }\n    }\n    const element = existingTextElement\n      ? existingTextElement\n      : newTextElement({\n          x: parentCenterPosition\n            ? parentCenterPosition.elementCenterX\n            : sceneX,\n          y: parentCenterPosition\n            ? parentCenterPosition.elementCenterY\n            : sceneY,\n          strokeColor: this.state.currentItemStrokeColor,\n          backgroundColor: this.state.currentItemBackgroundColor,\n          fillStyle: this.state.currentItemFillStyle,\n          strokeWidth: this.state.currentItemStrokeWidth,\n          strokeStyle: this.state.currentItemStrokeStyle,\n          roughness: this.state.currentItemRoughness,\n          opacity: this.state.currentItemOpacity,\n          roundness: null,\n          text: \"\",\n          fontSize: this.state.currentItemFontSize,\n          fontFamily: this.state.currentItemFontFamily,\n          textAlign: parentCenterPosition\n            ? \"center\"\n            : this.state.currentItemTextAlign,\n          verticalAlign: parentCenterPosition\n            ? VERTICAL_ALIGN.MIDDLE\n            : DEFAULT_VERTICAL_ALIGN,\n          containerId: shouldBindToContainer ? container?.id : undefined,\n          groupIds: container?.groupIds ?? [],\n          locked: false,\n        });\n\n    if (!existingTextElement && shouldBindToContainer && container) {\n      mutateElement(container, {\n        boundElements: (container.boundElements || []).concat({\n          type: \"text\",\n          id: element.id,\n        }),\n      });\n    }\n    this.setState({ editingElement: element });\n\n    if (!existingTextElement) {\n      if (container && shouldBindToContainer) {\n        const containerIndex = this.scene.getElementIndex(container.id);\n        this.scene.insertElementAtIndex(element, containerIndex + 1);\n      } else {\n        this.scene.replaceAllElements([\n          ...this.scene.getElementsIncludingDeleted(),\n          element,\n        ]);\n      }\n    }\n\n    this.setState({\n      editingElement: element,\n    });\n\n    this.handleTextWysiwyg(element, {\n      isExistingElement: !!existingTextElement,\n    });\n  };\n\n  private handleCanvasDoubleClick = (\n    event: React.MouseEvent<HTMLCanvasElement>,\n  ) => {\n    // case: double-clicking with arrow/line tool selected would both create\n    // text and enter multiElement mode\n    if (this.state.multiElement) {\n      return;\n    }\n    // we should only be able to double click when mode is selection\n    if (this.state.activeTool.type !== \"selection\") {\n      return;\n    }\n\n    const selectedElements = getSelectedElements(\n      this.scene.getNonDeletedElements(),\n      this.state,\n    );\n\n    if (selectedElements.length === 1 && isLinearElement(selectedElements[0])) {\n      if (\n        event[KEYS.CTRL_OR_CMD] &&\n        (!this.state.editingLinearElement ||\n          this.state.editingLinearElement.elementId !== selectedElements[0].id)\n      ) {\n        this.history.resumeRecording();\n        this.setState({\n          editingLinearElement: new LinearElementEditor(\n            selectedElements[0],\n            this.scene,\n          ),\n        });\n        return;\n      } else if (\n        this.state.editingLinearElement &&\n        this.state.editingLinearElement.elementId === selectedElements[0].id\n      ) {\n        return;\n      }\n    }\n\n    resetCursor(this.canvas);\n\n    let { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n      event,\n      this.state,\n    );\n\n    const selectedGroupIds = getSelectedGroupIds(this.state);\n\n    if (selectedGroupIds.length > 0) {\n      const hitElement = this.getElementAtPosition(sceneX, sceneY);\n\n      const selectedGroupId =\n        hitElement &&\n        getSelectedGroupIdForElement(hitElement, this.state.selectedGroupIds);\n\n      if (selectedGroupId) {\n        this.setState((prevState) =>\n          selectGroupsForSelectedElements(\n            {\n              ...prevState,\n              editingGroupId: selectedGroupId,\n              selectedElementIds: { [hitElement!.id]: true },\n              selectedGroupIds: {},\n            },\n            this.scene.getNonDeletedElements(),\n          ),\n        );\n        return;\n      }\n    }\n\n    resetCursor(this.canvas);\n    if (!event[KEYS.CTRL_OR_CMD] && !this.state.viewModeEnabled) {\n      const container = getTextBindableContainerAtPosition(\n        this.scene.getNonDeletedElements(),\n        this.state,\n        sceneX,\n        sceneY,\n      );\n      if (container) {\n        if (\n          hasBoundTextElement(container) ||\n          !isTransparent(container.backgroundColor) ||\n          isHittingElementNotConsideringBoundingBox(container, this.state, [\n            sceneX,\n            sceneY,\n          ])\n        ) {\n          const midPoint = getContainerCenter(container, this.state);\n\n          sceneX = midPoint.x;\n          sceneY = midPoint.y;\n        }\n      }\n      this.startTextEditing({\n        sceneX,\n        sceneY,\n        insertAtParentCenter: !event.altKey,\n        container,\n      });\n    }\n  };\n\n  private getElementLinkAtPosition = (\n    scenePointer: Readonly<{ x: number; y: number }>,\n    hitElement: NonDeletedExcalidrawElement | null,\n  ): ExcalidrawElement | undefined => {\n    // Reversing so we traverse the elements in decreasing order\n    // of z-index\n    const elements = this.scene.getNonDeletedElements().slice().reverse();\n    let hitElementIndex = Infinity;\n\n    return elements.find((element, index) => {\n      if (hitElement && element.id === hitElement.id) {\n        hitElementIndex = index;\n      }\n      return (\n        element.link &&\n        index <= hitElementIndex &&\n        isPointHittingLinkIcon(\n          element,\n          this.state,\n          [scenePointer.x, scenePointer.y],\n          this.device.isMobile,\n        )\n      );\n    });\n  };\n\n  private redirectToLink = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n    isTouchScreen: boolean,\n  ) => {\n    const draggedDistance = distance2d(\n      this.lastPointerDown!.clientX,\n      this.lastPointerDown!.clientY,\n      this.lastPointerUp!.clientX,\n      this.lastPointerUp!.clientY,\n    );\n    if (\n      !this.hitLinkElement ||\n      // For touch screen allow dragging threshold else strict check\n      (isTouchScreen && draggedDistance > DRAGGING_THRESHOLD) ||\n      (!isTouchScreen && draggedDistance !== 0)\n    ) {\n      return;\n    }\n    const lastPointerDownCoords = viewportCoordsToSceneCoords(\n      this.lastPointerDown!,\n      this.state,\n    );\n    const lastPointerDownHittingLinkIcon = isPointHittingLinkIcon(\n      this.hitLinkElement,\n      this.state,\n      [lastPointerDownCoords.x, lastPointerDownCoords.y],\n      this.device.isMobile,\n    );\n    const lastPointerUpCoords = viewportCoordsToSceneCoords(\n      this.lastPointerUp!,\n      this.state,\n    );\n    const lastPointerUpHittingLinkIcon = isPointHittingLinkIcon(\n      this.hitLinkElement,\n      this.state,\n      [lastPointerUpCoords.x, lastPointerUpCoords.y],\n      this.device.isMobile,\n    );\n    if (lastPointerDownHittingLinkIcon && lastPointerUpHittingLinkIcon) {\n      const url = this.hitLinkElement.link;\n      if (url) {\n        let customEvent;\n        if (this.props.onLinkOpen) {\n          customEvent = wrapEvent(EVENT.EXCALIDRAW_LINK, event.nativeEvent);\n          this.props.onLinkOpen(this.hitLinkElement, customEvent);\n        }\n        if (!customEvent?.defaultPrevented) {\n          const target = isLocalLink(url) ? \"_self\" : \"_blank\";\n          const newWindow = window.open(undefined, target);\n          // https://mathiasbynens.github.io/rel-noopener/\n          if (newWindow) {\n            newWindow.opener = null;\n            newWindow.location = normalizeLink(url);\n          }\n        }\n      }\n    }\n  };\n\n  private handleCanvasPointerMove = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ) => {\n    this.savePointer(event.clientX, event.clientY, this.state.cursorButton);\n\n    if (gesture.pointers.has(event.pointerId)) {\n      gesture.pointers.set(event.pointerId, {\n        x: event.clientX,\n        y: event.clientY,\n      });\n    }\n\n    const initialScale = gesture.initialScale;\n    if (\n      gesture.pointers.size === 2 &&\n      gesture.lastCenter &&\n      initialScale &&\n      gesture.initialDistance\n    ) {\n      const center = getCenter(gesture.pointers);\n      const deltaX = center.x - gesture.lastCenter.x;\n      const deltaY = center.y - gesture.lastCenter.y;\n      gesture.lastCenter = center;\n\n      const distance = getDistance(Array.from(gesture.pointers.values()));\n      const scaleFactor =\n        this.state.activeTool.type === \"freedraw\" && this.state.penMode\n          ? 1\n          : distance / gesture.initialDistance;\n\n      const nextZoom = scaleFactor\n        ? getNormalizedZoom(initialScale * scaleFactor)\n        : this.state.zoom.value;\n\n      this.setState((state) => {\n        const zoomState = getStateForZoom(\n          {\n            viewportX: center.x,\n            viewportY: center.y,\n            nextZoom,\n          },\n          state,\n        );\n\n        return {\n          zoom: zoomState.zoom,\n          scrollX: zoomState.scrollX + deltaX / nextZoom,\n          scrollY: zoomState.scrollY + deltaY / nextZoom,\n          shouldCacheIgnoreZoom: true,\n        };\n      });\n      this.resetShouldCacheIgnoreZoomDebounced();\n    } else {\n      gesture.lastCenter =\n        gesture.initialDistance =\n        gesture.initialScale =\n          null;\n    }\n\n    if (\n      isHoldingSpace ||\n      isPanning ||\n      isDraggingScrollBar ||\n      isHandToolActive(this.state)\n    ) {\n      return;\n    }\n\n    const isPointerOverScrollBars = isOverScrollBars(\n      currentScrollBars,\n      event.clientX - this.state.offsetLeft,\n      event.clientY - this.state.offsetTop,\n    );\n    const isOverScrollBar = isPointerOverScrollBars.isOverEither;\n    if (!this.state.draggingElement && !this.state.multiElement) {\n      if (isOverScrollBar) {\n        resetCursor(this.canvas);\n      } else {\n        setCursorForShape(this.canvas, this.state);\n      }\n    }\n\n    const scenePointer = viewportCoordsToSceneCoords(event, this.state);\n    const { x: scenePointerX, y: scenePointerY } = scenePointer;\n\n    if (\n      this.state.editingLinearElement &&\n      !this.state.editingLinearElement.isDragging\n    ) {\n      const editingLinearElement = LinearElementEditor.handlePointerMove(\n        event,\n        scenePointerX,\n        scenePointerY,\n        this.state,\n      );\n\n      if (\n        editingLinearElement &&\n        editingLinearElement !== this.state.editingLinearElement\n      ) {\n        // Since we are reading from previous state which is not possible with\n        // automatic batching in React 18 hence using flush sync to synchronously\n        // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.\n        flushSync(() => {\n          this.setState({\n            editingLinearElement,\n          });\n        });\n      }\n      if (editingLinearElement?.lastUncommittedPoint != null) {\n        this.maybeSuggestBindingAtCursor(scenePointer);\n      } else {\n        // causes stack overflow if not sync\n        flushSync(() => {\n          this.setState({ suggestedBindings: [] });\n        });\n      }\n    }\n\n    if (isBindingElementType(this.state.activeTool.type)) {\n      // Hovering with a selected tool or creating new linear element via click\n      // and point\n      const { draggingElement } = this.state;\n      if (isBindingElement(draggingElement, false)) {\n        this.maybeSuggestBindingsForLinearElementAtCoords(\n          draggingElement,\n          [scenePointer],\n          this.state.startBoundElement,\n        );\n      } else {\n        this.maybeSuggestBindingAtCursor(scenePointer);\n      }\n    }\n\n    if (this.state.multiElement) {\n      const { multiElement } = this.state;\n      const { x: rx, y: ry } = multiElement;\n\n      const { points, lastCommittedPoint } = multiElement;\n      const lastPoint = points[points.length - 1];\n\n      setCursorForShape(this.canvas, this.state);\n\n      if (lastPoint === lastCommittedPoint) {\n        // if we haven't yet created a temp point and we're beyond commit-zone\n        // threshold, add a point\n        if (\n          distance2d(\n            scenePointerX - rx,\n            scenePointerY - ry,\n            lastPoint[0],\n            lastPoint[1],\n          ) >= LINE_CONFIRM_THRESHOLD\n        ) {\n          mutateElement(multiElement, {\n            points: [...points, [scenePointerX - rx, scenePointerY - ry]],\n          });\n        } else {\n          setCursor(this.canvas, CURSOR_TYPE.POINTER);\n          // in this branch, we're inside the commit zone, and no uncommitted\n          // point exists. Thus do nothing (don't add/remove points).\n        }\n      } else if (\n        points.length > 2 &&\n        lastCommittedPoint &&\n        distance2d(\n          scenePointerX - rx,\n          scenePointerY - ry,\n          lastCommittedPoint[0],\n          lastCommittedPoint[1],\n        ) < LINE_CONFIRM_THRESHOLD\n      ) {\n        setCursor(this.canvas, CURSOR_TYPE.POINTER);\n        mutateElement(multiElement, {\n          points: points.slice(0, -1),\n        });\n      } else {\n        const [gridX, gridY] = getGridPoint(\n          scenePointerX,\n          scenePointerY,\n          this.state.gridSize,\n        );\n\n        const [lastCommittedX, lastCommittedY] =\n          multiElement?.lastCommittedPoint ?? [0, 0];\n\n        let dxFromLastCommitted = gridX - rx - lastCommittedX;\n        let dyFromLastCommitted = gridY - ry - lastCommittedY;\n\n        if (shouldRotateWithDiscreteAngle(event)) {\n          ({ width: dxFromLastCommitted, height: dyFromLastCommitted } =\n            getLockedLinearCursorAlignSize(\n              // actual coordinate of the last committed point\n              lastCommittedX + rx,\n              lastCommittedY + ry,\n              // cursor-grid coordinate\n              gridX,\n              gridY,\n            ));\n        }\n\n        if (isPathALoop(points, this.state.zoom.value)) {\n          setCursor(this.canvas, CURSOR_TYPE.POINTER);\n        }\n        // update last uncommitted point\n        mutateElement(multiElement, {\n          points: [\n            ...points.slice(0, -1),\n            [\n              lastCommittedX + dxFromLastCommitted,\n              lastCommittedY + dyFromLastCommitted,\n            ],\n          ],\n        });\n      }\n\n      return;\n    }\n\n    const hasDeselectedButton = Boolean(event.buttons);\n    if (\n      hasDeselectedButton ||\n      (this.state.activeTool.type !== \"selection\" &&\n        this.state.activeTool.type !== \"text\" &&\n        this.state.activeTool.type !== \"eraser\")\n    ) {\n      return;\n    }\n\n    const elements = this.scene.getNonDeletedElements();\n\n    const selectedElements = getSelectedElements(elements, this.state);\n    if (\n      selectedElements.length === 1 &&\n      !isOverScrollBar &&\n      !this.state.editingLinearElement\n    ) {\n      const elementWithTransformHandleType = getElementWithTransformHandleType(\n        elements,\n        this.state,\n        scenePointerX,\n        scenePointerY,\n        this.state.zoom,\n        event.pointerType,\n      );\n      if (\n        elementWithTransformHandleType &&\n        elementWithTransformHandleType.transformHandleType\n      ) {\n        setCursor(\n          this.canvas,\n          getCursorForResizingElement(elementWithTransformHandleType),\n        );\n        return;\n      }\n    } else if (selectedElements.length > 1 && !isOverScrollBar) {\n      const transformHandleType = getTransformHandleTypeFromCoords(\n        getCommonBounds(selectedElements),\n        scenePointerX,\n        scenePointerY,\n        this.state.zoom,\n        event.pointerType,\n      );\n      if (transformHandleType) {\n        setCursor(\n          this.canvas,\n          getCursorForResizingElement({\n            transformHandleType,\n          }),\n        );\n        return;\n      }\n    }\n\n    const hitElement = this.getElementAtPosition(\n      scenePointer.x,\n      scenePointer.y,\n    );\n    this.hitLinkElement = this.getElementLinkAtPosition(\n      scenePointer,\n      hitElement,\n    );\n    if (isEraserActive(this.state)) {\n      return;\n    }\n    if (\n      this.hitLinkElement &&\n      !this.state.selectedElementIds[this.hitLinkElement.id]\n    ) {\n      setCursor(this.canvas, CURSOR_TYPE.POINTER);\n      showHyperlinkTooltip(this.hitLinkElement, this.state);\n    } else {\n      hideHyperlinkToolip();\n      if (\n        hitElement &&\n        hitElement.link &&\n        this.state.selectedElementIds[hitElement.id] &&\n        !this.state.contextMenu &&\n        !this.state.showHyperlinkPopup\n      ) {\n        this.setState({ showHyperlinkPopup: \"info\" });\n      } else if (this.state.activeTool.type === \"text\") {\n        setCursor(\n          this.canvas,\n          isTextElement(hitElement) ? CURSOR_TYPE.TEXT : CURSOR_TYPE.CROSSHAIR,\n        );\n      } else if (this.state.viewModeEnabled) {\n        setCursor(this.canvas, CURSOR_TYPE.GRAB);\n      } else if (isOverScrollBar) {\n        setCursor(this.canvas, CURSOR_TYPE.AUTO);\n      } else if (this.state.selectedLinearElement) {\n        this.handleHoverSelectedLinearElement(\n          this.state.selectedLinearElement,\n          scenePointerX,\n          scenePointerY,\n        );\n      } else if (\n        // if using cmd/ctrl, we're not dragging\n        !event[KEYS.CTRL_OR_CMD]\n      ) {\n        if (\n          (hitElement ||\n            this.isHittingCommonBoundingBoxOfSelectedElements(\n              scenePointer,\n              selectedElements,\n            )) &&\n          !hitElement?.locked\n        ) {\n          setCursor(this.canvas, CURSOR_TYPE.MOVE);\n        }\n      } else {\n        setCursor(this.canvas, CURSOR_TYPE.AUTO);\n      }\n    }\n  };\n\n  private handleEraser = (\n    event: PointerEvent,\n    pointerDownState: PointerDownState,\n    scenePointer: { x: number; y: number },\n  ) => {\n    const updateElementIds = (elements: ExcalidrawElement[]) => {\n      elements.forEach((element) => {\n        if (element.locked) {\n          return;\n        }\n\n        idsToUpdate.push(element.id);\n        if (event.altKey) {\n          if (\n            pointerDownState.elementIdsToErase[element.id] &&\n            pointerDownState.elementIdsToErase[element.id].erase\n          ) {\n            pointerDownState.elementIdsToErase[element.id].erase = false;\n          }\n        } else if (!pointerDownState.elementIdsToErase[element.id]) {\n          pointerDownState.elementIdsToErase[element.id] = {\n            erase: true,\n            opacity: element.opacity,\n          };\n        }\n      });\n    };\n\n    const idsToUpdate: Array<string> = [];\n\n    const distance = distance2d(\n      pointerDownState.lastCoords.x,\n      pointerDownState.lastCoords.y,\n      scenePointer.x,\n      scenePointer.y,\n    );\n    const threshold = 10 / this.state.zoom.value;\n    const point = { ...pointerDownState.lastCoords };\n    let samplingInterval = 0;\n    while (samplingInterval <= distance) {\n      const hitElements = this.getElementsAtPosition(point.x, point.y);\n      updateElementIds(hitElements);\n\n      // Exit since we reached current point\n      if (samplingInterval === distance) {\n        break;\n      }\n\n      // Calculate next point in the line at a distance of sampling interval\n      samplingInterval = Math.min(samplingInterval + threshold, distance);\n\n      const distanceRatio = samplingInterval / distance;\n      const nextX =\n        (1 - distanceRatio) * point.x + distanceRatio * scenePointer.x;\n      const nextY =\n        (1 - distanceRatio) * point.y + distanceRatio * scenePointer.y;\n      point.x = nextX;\n      point.y = nextY;\n    }\n\n    const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n      const id =\n        isBoundToContainer(ele) && idsToUpdate.includes(ele.containerId)\n          ? ele.containerId\n          : ele.id;\n      if (idsToUpdate.includes(id)) {\n        if (event.altKey) {\n          if (\n            pointerDownState.elementIdsToErase[id] &&\n            pointerDownState.elementIdsToErase[id].erase === false\n          ) {\n            return newElementWith(ele, {\n              opacity: pointerDownState.elementIdsToErase[id].opacity,\n            });\n          }\n        } else {\n          return newElementWith(ele, {\n            opacity: ELEMENT_READY_TO_ERASE_OPACITY,\n          });\n        }\n      }\n      return ele;\n    });\n\n    this.scene.replaceAllElements(elements);\n\n    pointerDownState.lastCoords.x = scenePointer.x;\n    pointerDownState.lastCoords.y = scenePointer.y;\n  };\n  // set touch moving for mobile context menu\n  private handleTouchMove = (event: React.TouchEvent<HTMLCanvasElement>) => {\n    invalidateContextMenu = true;\n  };\n\n  handleHoverSelectedLinearElement(\n    linearElementEditor: LinearElementEditor,\n    scenePointerX: number,\n    scenePointerY: number,\n  ) {\n    const element = LinearElementEditor.getElement(\n      linearElementEditor.elementId,\n    );\n\n    const boundTextElement = getBoundTextElement(element);\n\n    if (!element) {\n      return;\n    }\n    if (this.state.selectedLinearElement) {\n      let hoverPointIndex = -1;\n      let segmentMidPointHoveredCoords = null;\n      if (\n        isHittingElementNotConsideringBoundingBox(element, this.state, [\n          scenePointerX,\n          scenePointerY,\n        ])\n      ) {\n        hoverPointIndex = LinearElementEditor.getPointIndexUnderCursor(\n          element,\n          this.state.zoom,\n          scenePointerX,\n          scenePointerY,\n        );\n        segmentMidPointHoveredCoords =\n          LinearElementEditor.getSegmentMidpointHitCoords(\n            linearElementEditor,\n            { x: scenePointerX, y: scenePointerY },\n            this.state,\n          );\n\n        if (hoverPointIndex >= 0 || segmentMidPointHoveredCoords) {\n          setCursor(this.canvas, CURSOR_TYPE.POINTER);\n        } else {\n          setCursor(this.canvas, CURSOR_TYPE.MOVE);\n        }\n      } else if (\n        shouldShowBoundingBox([element], this.state) &&\n        isHittingElementBoundingBoxWithoutHittingElement(\n          element,\n          this.state,\n          scenePointerX,\n          scenePointerY,\n        )\n      ) {\n        setCursor(this.canvas, CURSOR_TYPE.MOVE);\n      } else if (\n        boundTextElement &&\n        hitTest(boundTextElement, this.state, scenePointerX, scenePointerY)\n      ) {\n        setCursor(this.canvas, CURSOR_TYPE.MOVE);\n      }\n\n      if (\n        this.state.selectedLinearElement.hoverPointIndex !== hoverPointIndex\n      ) {\n        this.setState({\n          selectedLinearElement: {\n            ...this.state.selectedLinearElement,\n            hoverPointIndex,\n          },\n        });\n      }\n\n      if (\n        !LinearElementEditor.arePointsEqual(\n          this.state.selectedLinearElement.segmentMidPointHoveredCoords,\n          segmentMidPointHoveredCoords,\n        )\n      ) {\n        this.setState({\n          selectedLinearElement: {\n            ...this.state.selectedLinearElement,\n            segmentMidPointHoveredCoords,\n          },\n        });\n      }\n    } else {\n      setCursor(this.canvas, CURSOR_TYPE.AUTO);\n    }\n  }\n  private handleCanvasPointerDown = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ) => {\n    // since contextMenu options are potentially evaluated on each render,\n    // and an contextMenu action may depend on selection state, we must\n    // close the contextMenu before we update the selection on pointerDown\n    // (e.g. resetting selection)\n    if (this.state.contextMenu) {\n      this.setState({ contextMenu: null });\n    }\n\n    // remove any active selection when we start to interact with canvas\n    // (mainly, we care about removing selection outside the component which\n    //  would prevent our copy handling otherwise)\n    const selection = document.getSelection();\n    if (selection?.anchorNode) {\n      selection.removeAllRanges();\n    }\n    this.maybeOpenContextMenuAfterPointerDownOnTouchDevices(event);\n    this.maybeCleanupAfterMissingPointerUp(event);\n\n    //fires only once, if pen is detected, penMode is enabled\n    //the user can disable this by toggling the penMode button\n    if (!this.state.penDetected && event.pointerType === \"pen\") {\n      this.setState((prevState) => {\n        return {\n          penMode: true,\n          penDetected: true,\n        };\n      });\n    }\n\n    if (\n      !this.device.isTouchScreen &&\n      [\"pen\", \"touch\"].includes(event.pointerType)\n    ) {\n      this.device = updateObject(this.device, { isTouchScreen: true });\n    }\n\n    if (isPanning) {\n      return;\n    }\n\n    this.lastPointerDown = event;\n    this.setState({\n      lastPointerDownWith: event.pointerType,\n      cursorButton: \"down\",\n    });\n    this.savePointer(event.clientX, event.clientY, \"down\");\n\n    this.updateGestureOnPointerDown(event);\n\n    if (this.handleCanvasPanUsingWheelOrSpaceDrag(event)) {\n      return;\n    }\n\n    // only handle left mouse button or touch\n    if (\n      event.button !== POINTER_BUTTON.MAIN &&\n      event.button !== POINTER_BUTTON.TOUCH\n    ) {\n      return;\n    }\n\n    // don't select while panning\n    if (gesture.pointers.size > 1) {\n      return;\n    }\n\n    // State for the duration of a pointer interaction, which starts with a\n    // pointerDown event, ends with a pointerUp event (or another pointerDown)\n    const pointerDownState = this.initialPointerDownState(event);\n\n    if (this.handleDraggingScrollBar(event, pointerDownState)) {\n      return;\n    }\n\n    this.clearSelectionIfNotUsingSelection();\n    this.updateBindingEnabledOnPointerMove(event);\n\n    if (this.handleSelectionOnPointerDown(event, pointerDownState)) {\n      return;\n    }\n\n    const allowOnPointerDown =\n      !this.state.penMode ||\n      event.pointerType !== \"touch\" ||\n      this.state.activeTool.type === \"selection\" ||\n      this.state.activeTool.type === \"text\" ||\n      this.state.activeTool.type === \"image\";\n\n    if (!allowOnPointerDown) {\n      return;\n    }\n\n    if (this.state.activeTool.type === \"text\") {\n      this.handleTextOnPointerDown(event, pointerDownState);\n      return;\n    } else if (\n      this.state.activeTool.type === \"arrow\" ||\n      this.state.activeTool.type === \"line\"\n    ) {\n      this.handleLinearElementOnPointerDown(\n        event,\n        this.state.activeTool.type,\n        pointerDownState,\n      );\n    } else if (this.state.activeTool.type === \"image\") {\n      // reset image preview on pointerdown\n      setCursor(this.canvas, CURSOR_TYPE.CROSSHAIR);\n\n      // retrieve the latest element as the state may be stale\n      const pendingImageElement =\n        this.state.pendingImageElementId &&\n        this.scene.getElement(this.state.pendingImageElementId);\n\n      if (!pendingImageElement) {\n        return;\n      }\n\n      this.setState({\n        draggingElement: pendingImageElement,\n        editingElement: pendingImageElement,\n        pendingImageElementId: null,\n        multiElement: null,\n      });\n\n      const { x, y } = viewportCoordsToSceneCoords(event, this.state);\n      mutateElement(pendingImageElement, {\n        x,\n        y,\n      });\n    } else if (this.state.activeTool.type === \"freedraw\") {\n      this.handleFreeDrawElementOnPointerDown(\n        event,\n        this.state.activeTool.type,\n        pointerDownState,\n      );\n    } else if (this.state.activeTool.type === \"custom\") {\n      setCursor(this.canvas, CURSOR_TYPE.AUTO);\n    } else if (\n      this.state.activeTool.type !== \"eraser\" &&\n      this.state.activeTool.type !== \"hand\"\n    ) {\n      this.createGenericElementOnPointerDown(\n        this.state.activeTool.type,\n        pointerDownState,\n      );\n    }\n\n    this.props?.onPointerDown?.(this.state.activeTool, pointerDownState);\n\n    const onPointerMove =\n      this.onPointerMoveFromPointerDownHandler(pointerDownState);\n\n    const onPointerUp =\n      this.onPointerUpFromPointerDownHandler(pointerDownState);\n\n    const onKeyDown = this.onKeyDownFromPointerDownHandler(pointerDownState);\n    const onKeyUp = this.onKeyUpFromPointerDownHandler(pointerDownState);\n\n    lastPointerUp = onPointerUp;\n\n    if (!this.state.viewModeEnabled) {\n      window.addEventListener(EVENT.POINTER_MOVE, onPointerMove);\n      window.addEventListener(EVENT.POINTER_UP, onPointerUp);\n      window.addEventListener(EVENT.KEYDOWN, onKeyDown);\n      window.addEventListener(EVENT.KEYUP, onKeyUp);\n      pointerDownState.eventListeners.onMove = onPointerMove;\n      pointerDownState.eventListeners.onUp = onPointerUp;\n      pointerDownState.eventListeners.onKeyUp = onKeyUp;\n      pointerDownState.eventListeners.onKeyDown = onKeyDown;\n    }\n  };\n\n  private handleCanvasPointerUp = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ) => {\n    this.lastPointerUp = event;\n    if (this.device.isTouchScreen) {\n      const scenePointer = viewportCoordsToSceneCoords(\n        { clientX: event.clientX, clientY: event.clientY },\n        this.state,\n      );\n      const hitElement = this.getElementAtPosition(\n        scenePointer.x,\n        scenePointer.y,\n      );\n      this.hitLinkElement = this.getElementLinkAtPosition(\n        scenePointer,\n        hitElement,\n      );\n    }\n    if (\n      this.hitLinkElement &&\n      !this.state.selectedElementIds[this.hitLinkElement.id]\n    ) {\n      this.redirectToLink(event, this.device.isTouchScreen);\n    }\n\n    this.removePointer(event);\n  };\n\n  private maybeOpenContextMenuAfterPointerDownOnTouchDevices = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ): void => {\n    // deal with opening context menu on touch devices\n    if (event.pointerType === \"touch\") {\n      invalidateContextMenu = false;\n\n      if (touchTimeout) {\n        // If there's already a touchTimeout, this means that there's another\n        // touch down and we are doing another touch, so we shouldn't open the\n        // context menu.\n        invalidateContextMenu = true;\n      } else {\n        // open the context menu with the first touch's clientX and clientY\n        // if the touch is not moving\n        touchTimeout = window.setTimeout(() => {\n          touchTimeout = 0;\n          if (!invalidateContextMenu) {\n            this.handleCanvasContextMenu(event);\n          }\n        }, TOUCH_CTX_MENU_TIMEOUT);\n      }\n    }\n  };\n\n  private resetContextMenuTimer = () => {\n    clearTimeout(touchTimeout);\n    touchTimeout = 0;\n    invalidateContextMenu = false;\n  };\n\n  private maybeCleanupAfterMissingPointerUp(\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ): void {\n    if (lastPointerUp !== null) {\n      // Unfortunately, sometimes we don't get a pointerup after a pointerdown,\n      // this can happen when a contextual menu or alert is triggered. In order to avoid\n      // being in a weird state, we clean up on the next pointerdown\n      lastPointerUp(event);\n    }\n  }\n\n  // Returns whether the event is a panning\n  private handleCanvasPanUsingWheelOrSpaceDrag = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ): boolean => {\n    if (\n      !(\n        gesture.pointers.size <= 1 &&\n        (event.button === POINTER_BUTTON.WHEEL ||\n          (event.button === POINTER_BUTTON.MAIN && isHoldingSpace) ||\n          isHandToolActive(this.state) ||\n          this.state.viewModeEnabled)\n      ) ||\n      isTextElement(this.state.editingElement)\n    ) {\n      return false;\n    }\n    isPanning = true;\n    event.preventDefault();\n\n    let nextPastePrevented = false;\n    const isLinux = /Linux/.test(window.navigator.platform);\n\n    setCursor(this.canvas, CURSOR_TYPE.GRABBING);\n    let { clientX: lastX, clientY: lastY } = event;\n    const onPointerMove = withBatchedUpdatesThrottled((event: PointerEvent) => {\n      const deltaX = lastX - event.clientX;\n      const deltaY = lastY - event.clientY;\n      lastX = event.clientX;\n      lastY = event.clientY;\n\n      /*\n       * Prevent paste event if we move while middle clicking on Linux.\n       * See issue #1383.\n       */\n      if (\n        isLinux &&\n        !nextPastePrevented &&\n        (Math.abs(deltaX) > 1 || Math.abs(deltaY) > 1)\n      ) {\n        nextPastePrevented = true;\n\n        /* Prevent the next paste event */\n        const preventNextPaste = (event: ClipboardEvent) => {\n          document.body.removeEventListener(EVENT.PASTE, preventNextPaste);\n          event.stopPropagation();\n        };\n\n        /*\n         * Reenable next paste in case of disabled middle click paste for\n         * any reason:\n         * - right click paste\n         * - empty clipboard\n         */\n        const enableNextPaste = () => {\n          setTimeout(() => {\n            document.body.removeEventListener(EVENT.PASTE, preventNextPaste);\n            window.removeEventListener(EVENT.POINTER_UP, enableNextPaste);\n          }, 100);\n        };\n\n        document.body.addEventListener(EVENT.PASTE, preventNextPaste);\n        window.addEventListener(EVENT.POINTER_UP, enableNextPaste);\n      }\n\n      this.setState({\n        scrollX: this.state.scrollX - deltaX / this.state.zoom.value,\n        scrollY: this.state.scrollY - deltaY / this.state.zoom.value,\n      });\n    });\n    const teardown = withBatchedUpdates(\n      (lastPointerUp = () => {\n        lastPointerUp = null;\n        isPanning = false;\n        if (!isHoldingSpace) {\n          if (this.state.viewModeEnabled) {\n            setCursor(this.canvas, CURSOR_TYPE.GRAB);\n          } else {\n            setCursorForShape(this.canvas, this.state);\n          }\n        }\n        this.setState({\n          cursorButton: \"up\",\n        });\n        this.savePointer(event.clientX, event.clientY, \"up\");\n        window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);\n        window.removeEventListener(EVENT.POINTER_UP, teardown);\n        window.removeEventListener(EVENT.BLUR, teardown);\n        onPointerMove.flush();\n      }),\n    );\n    window.addEventListener(EVENT.BLUR, teardown);\n    window.addEventListener(EVENT.POINTER_MOVE, onPointerMove, {\n      passive: true,\n    });\n    window.addEventListener(EVENT.POINTER_UP, teardown);\n    return true;\n  };\n\n  private updateGestureOnPointerDown(\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ): void {\n    gesture.pointers.set(event.pointerId, {\n      x: event.clientX,\n      y: event.clientY,\n    });\n\n    if (gesture.pointers.size === 2) {\n      gesture.lastCenter = getCenter(gesture.pointers);\n      gesture.initialScale = this.state.zoom.value;\n      gesture.initialDistance = getDistance(\n        Array.from(gesture.pointers.values()),\n      );\n    }\n  }\n\n  private initialPointerDownState(\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ): PointerDownState {\n    const origin = viewportCoordsToSceneCoords(event, this.state);\n    const selectedElements = getSelectedElements(\n      this.scene.getNonDeletedElements(),\n      this.state,\n    );\n    const [minX, minY, maxX, maxY] = getCommonBounds(selectedElements);\n\n    return {\n      origin,\n      withCmdOrCtrl: event[KEYS.CTRL_OR_CMD],\n      originInGrid: tupleToCoors(\n        getGridPoint(origin.x, origin.y, this.state.gridSize),\n      ),\n      scrollbars: isOverScrollBars(\n        currentScrollBars,\n        event.clientX - this.state.offsetLeft,\n        event.clientY - this.state.offsetTop,\n      ),\n      // we need to duplicate because we'll be updating this state\n      lastCoords: { ...origin },\n      originalElements: this.scene\n        .getNonDeletedElements()\n        .reduce((acc, element) => {\n          acc.set(element.id, deepCopyElement(element));\n          return acc;\n        }, new Map() as PointerDownState[\"originalElements\"]),\n      resize: {\n        handleType: false,\n        isResizing: false,\n        offset: { x: 0, y: 0 },\n        arrowDirection: \"origin\",\n        center: { x: (maxX + minX) / 2, y: (maxY + minY) / 2 },\n      },\n      hit: {\n        element: null,\n        allHitElements: [],\n        wasAddedToSelection: false,\n        hasBeenDuplicated: false,\n        hasHitCommonBoundingBoxOfSelectedElements:\n          this.isHittingCommonBoundingBoxOfSelectedElements(\n            origin,\n            selectedElements,\n          ),\n      },\n      drag: {\n        hasOccurred: false,\n        offset: null,\n      },\n      eventListeners: {\n        onMove: null,\n        onUp: null,\n        onKeyUp: null,\n        onKeyDown: null,\n      },\n      boxSelection: {\n        hasOccurred: false,\n      },\n      elementIdsToErase: {},\n    };\n  }\n\n  // Returns whether the event is a dragging a scrollbar\n  private handleDraggingScrollBar(\n    event: React.PointerEvent<HTMLCanvasElement>,\n    pointerDownState: PointerDownState,\n  ): boolean {\n    if (\n      !(pointerDownState.scrollbars.isOverEither && !this.state.multiElement)\n    ) {\n      return false;\n    }\n    isDraggingScrollBar = true;\n    pointerDownState.lastCoords.x = event.clientX;\n    pointerDownState.lastCoords.y = event.clientY;\n    const onPointerMove = withBatchedUpdatesThrottled((event: PointerEvent) => {\n      const target = event.target;\n      if (!(target instanceof HTMLElement)) {\n        return;\n      }\n\n      this.handlePointerMoveOverScrollbars(event, pointerDownState);\n    });\n\n    const onPointerUp = withBatchedUpdates(() => {\n      isDraggingScrollBar = false;\n      setCursorForShape(this.canvas, this.state);\n      lastPointerUp = null;\n      this.setState({\n        cursorButton: \"up\",\n      });\n      this.savePointer(event.clientX, event.clientY, \"up\");\n      window.removeEventListener(EVENT.POINTER_MOVE, onPointerMove);\n      window.removeEventListener(EVENT.POINTER_UP, onPointerUp);\n      onPointerMove.flush();\n    });\n\n    lastPointerUp = onPointerUp;\n\n    window.addEventListener(EVENT.POINTER_MOVE, onPointerMove);\n    window.addEventListener(EVENT.POINTER_UP, onPointerUp);\n    return true;\n  }\n\n  private clearSelectionIfNotUsingSelection = (): void => {\n    if (this.state.activeTool.type !== \"selection\") {\n      this.setState({\n        selectedElementIds: {},\n        selectedGroupIds: {},\n        editingGroupId: null,\n      });\n    }\n  };\n\n  /**\n   * @returns whether the pointer event has been completely handled\n   */\n  private handleSelectionOnPointerDown = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n    pointerDownState: PointerDownState,\n  ): boolean => {\n    if (this.state.activeTool.type === \"selection\") {\n      const elements = this.scene.getNonDeletedElements();\n      const selectedElements = getSelectedElements(elements, this.state);\n      if (selectedElements.length === 1 && !this.state.editingLinearElement) {\n        const elementWithTransformHandleType =\n          getElementWithTransformHandleType(\n            elements,\n            this.state,\n            pointerDownState.origin.x,\n            pointerDownState.origin.y,\n            this.state.zoom,\n            event.pointerType,\n          );\n        if (elementWithTransformHandleType != null) {\n          this.setState({\n            resizingElement: elementWithTransformHandleType.element,\n          });\n          pointerDownState.resize.handleType =\n            elementWithTransformHandleType.transformHandleType;\n        }\n      } else if (selectedElements.length > 1) {\n        pointerDownState.resize.handleType = getTransformHandleTypeFromCoords(\n          getCommonBounds(selectedElements),\n          pointerDownState.origin.x,\n          pointerDownState.origin.y,\n          this.state.zoom,\n          event.pointerType,\n        );\n      }\n      if (pointerDownState.resize.handleType) {\n        setCursor(\n          this.canvas,\n          getCursorForResizingElement({\n            transformHandleType: pointerDownState.resize.handleType,\n          }),\n        );\n        pointerDownState.resize.isResizing = true;\n        pointerDownState.resize.offset = tupleToCoors(\n          getResizeOffsetXY(\n            pointerDownState.resize.handleType,\n            selectedElements,\n            pointerDownState.origin.x,\n            pointerDownState.origin.y,\n          ),\n        );\n        if (\n          selectedElements.length === 1 &&\n          isLinearElement(selectedElements[0]) &&\n          selectedElements[0].points.length === 2\n        ) {\n          pointerDownState.resize.arrowDirection = getResizeArrowDirection(\n            pointerDownState.resize.handleType,\n            selectedElements[0],\n          );\n        }\n      } else {\n        if (this.state.selectedLinearElement) {\n          const linearElementEditor =\n            this.state.editingLinearElement || this.state.selectedLinearElement;\n          const ret = LinearElementEditor.handlePointerDown(\n            event,\n            this.state,\n            this.history,\n            pointerDownState.origin,\n            linearElementEditor,\n          );\n          if (ret.hitElement) {\n            pointerDownState.hit.element = ret.hitElement;\n          }\n          if (ret.linearElementEditor) {\n            this.setState({ selectedLinearElement: ret.linearElementEditor });\n\n            if (this.state.editingLinearElement) {\n              this.setState({ editingLinearElement: ret.linearElementEditor });\n            }\n          }\n          if (ret.didAddPoint) {\n            return true;\n          }\n        }\n        // hitElement may already be set above, so check first\n        pointerDownState.hit.element =\n          pointerDownState.hit.element ??\n          this.getElementAtPosition(\n            pointerDownState.origin.x,\n            pointerDownState.origin.y,\n          );\n\n        if (pointerDownState.hit.element) {\n          // Early return if pointer is hitting link icon\n          const hitLinkElement = this.getElementLinkAtPosition(\n            {\n              x: pointerDownState.origin.x,\n              y: pointerDownState.origin.y,\n            },\n            pointerDownState.hit.element,\n          );\n          if (hitLinkElement) {\n            return false;\n          }\n        }\n\n        // For overlapped elements one position may hit\n        // multiple elements\n        pointerDownState.hit.allHitElements = this.getElementsAtPosition(\n          pointerDownState.origin.x,\n          pointerDownState.origin.y,\n        );\n\n        const hitElement = pointerDownState.hit.element;\n        const someHitElementIsSelected =\n          pointerDownState.hit.allHitElements.some((element) =>\n            this.isASelectedElement(element),\n          );\n        if (\n          (hitElement === null || !someHitElementIsSelected) &&\n          !event.shiftKey &&\n          !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements\n        ) {\n          this.clearSelection(hitElement);\n        }\n\n        if (this.state.editingLinearElement) {\n          this.setState({\n            selectedElementIds: {\n              [this.state.editingLinearElement.elementId]: true,\n            },\n          });\n          // If we click on something\n        } else if (hitElement != null) {\n          // on CMD/CTRL, drill down to hit element regardless of groups etc.\n          if (event[KEYS.CTRL_OR_CMD]) {\n            if (!this.state.selectedElementIds[hitElement.id]) {\n              pointerDownState.hit.wasAddedToSelection = true;\n            }\n            this.setState((prevState) => ({\n              ...editGroupForSelectedElement(prevState, hitElement),\n              previousSelectedElementIds: this.state.selectedElementIds,\n            }));\n            // mark as not completely handled so as to allow dragging etc.\n            return false;\n          }\n\n          // deselect if item is selected\n          // if shift is not clicked, this will always return true\n          // otherwise, it will trigger selection based on current\n          // state of the box\n          if (!this.state.selectedElementIds[hitElement.id]) {\n            // if we are currently editing a group, exiting editing mode and deselect the group.\n            if (\n              this.state.editingGroupId &&\n              !isElementInGroup(hitElement, this.state.editingGroupId)\n            ) {\n              this.setState({\n                selectedElementIds: {},\n                selectedGroupIds: {},\n                editingGroupId: null,\n              });\n            }\n\n            // Add hit element to selection. At this point if we're not holding\n            // SHIFT the previously selected element(s) were deselected above\n            // (make sure you use setState updater to use latest state)\n            if (\n              !someHitElementIsSelected &&\n              !pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements\n            ) {\n              this.setState((prevState) => {\n                return selectGroupsForSelectedElements(\n                  {\n                    ...prevState,\n                    selectedElementIds: {\n                      ...prevState.selectedElementIds,\n                      [hitElement.id]: true,\n                    },\n                    showHyperlinkPopup: hitElement.link ? \"info\" : false,\n                  },\n                  this.scene.getNonDeletedElements(),\n                );\n              });\n              pointerDownState.hit.wasAddedToSelection = true;\n            }\n          }\n        }\n\n        this.setState({\n          previousSelectedElementIds: this.state.selectedElementIds,\n        });\n      }\n    }\n    return false;\n  };\n\n  private isASelectedElement(hitElement: ExcalidrawElement | null): boolean {\n    return hitElement != null && this.state.selectedElementIds[hitElement.id];\n  }\n\n  private isHittingCommonBoundingBoxOfSelectedElements(\n    point: Readonly<{ x: number; y: number }>,\n    selectedElements: readonly ExcalidrawElement[],\n  ): boolean {\n    if (selectedElements.length < 2) {\n      return false;\n    }\n\n    // How many pixels off the shape boundary we still consider a hit\n    const threshold = 10 / this.state.zoom.value;\n    const [x1, y1, x2, y2] = getCommonBounds(selectedElements);\n    return (\n      point.x > x1 - threshold &&\n      point.x < x2 + threshold &&\n      point.y > y1 - threshold &&\n      point.y < y2 + threshold\n    );\n  }\n\n  private handleTextOnPointerDown = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n    pointerDownState: PointerDownState,\n  ): void => {\n    // if we're currently still editing text, clicking outside\n    // should only finalize it, not create another (irrespective\n    // of state.activeTool.locked)\n    if (isTextElement(this.state.editingElement)) {\n      return;\n    }\n    let sceneX = pointerDownState.origin.x;\n    let sceneY = pointerDownState.origin.y;\n\n    const element = this.getElementAtPosition(sceneX, sceneY, {\n      includeBoundTextElement: true,\n    });\n\n    let container = getTextBindableContainerAtPosition(\n      this.scene.getNonDeletedElements(),\n      this.state,\n      sceneX,\n      sceneY,\n    );\n\n    if (hasBoundTextElement(element)) {\n      container = element as ExcalidrawTextContainer;\n      sceneX = element.x + element.width / 2;\n      sceneY = element.y + element.height / 2;\n    }\n    this.startTextEditing({\n      sceneX,\n      sceneY,\n      insertAtParentCenter: !event.altKey,\n      container,\n    });\n\n    resetCursor(this.canvas);\n    if (!this.state.activeTool.locked) {\n      this.setState({\n        activeTool: updateActiveTool(this.state, { type: \"selection\" }),\n      });\n    }\n  };\n\n  private handleFreeDrawElementOnPointerDown = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n    elementType: ExcalidrawFreeDrawElement[\"type\"],\n    pointerDownState: PointerDownState,\n  ) => {\n    // Begin a mark capture. This does not have to update state yet.\n    const [gridX, gridY] = getGridPoint(\n      pointerDownState.origin.x,\n      pointerDownState.origin.y,\n      null,\n    );\n\n    const element = newFreeDrawElement({\n      type: elementType,\n      x: gridX,\n      y: gridY,\n      strokeColor: this.state.currentItemStrokeColor,\n      backgroundColor: this.state.currentItemBackgroundColor,\n      fillStyle: this.state.currentItemFillStyle,\n      strokeWidth: this.state.currentItemStrokeWidth,\n      strokeStyle: this.state.currentItemStrokeStyle,\n      roughness: this.state.currentItemRoughness,\n      opacity: this.state.currentItemOpacity,\n      roundness: null,\n      simulatePressure: event.pressure === 0.5,\n      locked: false,\n    });\n\n    this.setState((prevState) => ({\n      selectedElementIds: {\n        ...prevState.selectedElementIds,\n        [element.id]: false,\n      },\n    }));\n\n    const pressures = element.simulatePressure\n      ? element.pressures\n      : [...element.pressures, event.pressure];\n\n    mutateElement(element, {\n      points: [[0, 0]],\n      pressures,\n    });\n\n    const boundElement = getHoveredElementForBinding(\n      pointerDownState.origin,\n      this.scene,\n    );\n    this.scene.replaceAllElements([\n      ...this.scene.getElementsIncludingDeleted(),\n      element,\n    ]);\n    this.setState({\n      draggingElement: element,\n      editingElement: element,\n      startBoundElement: boundElement,\n      suggestedBindings: [],\n    });\n  };\n\n  private createImageElement = ({\n    sceneX,\n    sceneY,\n  }: {\n    sceneX: number;\n    sceneY: number;\n  }) => {\n    const [gridX, gridY] = getGridPoint(sceneX, sceneY, this.state.gridSize);\n\n    const element = newImageElement({\n      type: \"image\",\n      x: gridX,\n      y: gridY,\n      strokeColor: this.state.currentItemStrokeColor,\n      backgroundColor: this.state.currentItemBackgroundColor,\n      fillStyle: this.state.currentItemFillStyle,\n      strokeWidth: this.state.currentItemStrokeWidth,\n      strokeStyle: this.state.currentItemStrokeStyle,\n      roughness: this.state.currentItemRoughness,\n      roundness: null,\n      opacity: this.state.currentItemOpacity,\n      locked: false,\n    });\n\n    return element;\n  };\n\n  private handleLinearElementOnPointerDown = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n    elementType: ExcalidrawLinearElement[\"type\"],\n    pointerDownState: PointerDownState,\n  ): void => {\n    if (this.state.multiElement) {\n      const { multiElement } = this.state;\n\n      // finalize if completing a loop\n      if (\n        multiElement.type === \"line\" &&\n        isPathALoop(multiElement.points, this.state.zoom.value)\n      ) {\n        mutateElement(multiElement, {\n          lastCommittedPoint:\n            multiElement.points[multiElement.points.length - 1],\n        });\n        this.actionManager.executeAction(actionFinalize);\n        return;\n      }\n\n      const { x: rx, y: ry, lastCommittedPoint } = multiElement;\n\n      // clicking inside commit zone → finalize arrow\n      if (\n        multiElement.points.length > 1 &&\n        lastCommittedPoint &&\n        distance2d(\n          pointerDownState.origin.x - rx,\n          pointerDownState.origin.y - ry,\n          lastCommittedPoint[0],\n          lastCommittedPoint[1],\n        ) < LINE_CONFIRM_THRESHOLD\n      ) {\n        this.actionManager.executeAction(actionFinalize);\n        return;\n      }\n\n      this.setState((prevState) => ({\n        selectedElementIds: {\n          ...prevState.selectedElementIds,\n          [multiElement.id]: true,\n        },\n      }));\n      // clicking outside commit zone → update reference for last committed\n      // point\n      mutateElement(multiElement, {\n        lastCommittedPoint: multiElement.points[multiElement.points.length - 1],\n      });\n      setCursor(this.canvas, CURSOR_TYPE.POINTER);\n    } else {\n      const [gridX, gridY] = getGridPoint(\n        pointerDownState.origin.x,\n        pointerDownState.origin.y,\n        this.state.gridSize,\n      );\n\n      /* If arrow is pre-arrowheads, it will have undefined for both start and end arrowheads.\n      If so, we want it to be null for start and \"arrow\" for end. If the linear item is not\n      an arrow, we want it to be null for both. Otherwise, we want it to use the\n      values from appState. */\n\n      const { currentItemStartArrowhead, currentItemEndArrowhead } = this.state;\n      const [startArrowhead, endArrowhead] =\n        elementType === \"arrow\"\n          ? [currentItemStartArrowhead, currentItemEndArrowhead]\n          : [null, null];\n\n      const element = newLinearElement({\n        type: elementType,\n        x: gridX,\n        y: gridY,\n        strokeColor: this.state.currentItemStrokeColor,\n        backgroundColor: this.state.currentItemBackgroundColor,\n        fillStyle: this.state.currentItemFillStyle,\n        strokeWidth: this.state.currentItemStrokeWidth,\n        strokeStyle: this.state.currentItemStrokeStyle,\n        roughness: this.state.currentItemRoughness,\n        opacity: this.state.currentItemOpacity,\n        roundness:\n          this.state.currentItemRoundness === \"round\"\n            ? { type: ROUNDNESS.PROPORTIONAL_RADIUS }\n            : null,\n        startArrowhead,\n        endArrowhead,\n        locked: false,\n      });\n      this.setState((prevState) => ({\n        selectedElementIds: {\n          ...prevState.selectedElementIds,\n          [element.id]: false,\n        },\n      }));\n      mutateElement(element, {\n        points: [...element.points, [0, 0]],\n      });\n      const boundElement = getHoveredElementForBinding(\n        pointerDownState.origin,\n        this.scene,\n      );\n      this.scene.replaceAllElements([\n        ...this.scene.getElementsIncludingDeleted(),\n        element,\n      ]);\n      this.setState({\n        draggingElement: element,\n        editingElement: element,\n        startBoundElement: boundElement,\n        suggestedBindings: [],\n      });\n    }\n  };\n\n  private createGenericElementOnPointerDown = (\n    elementType: ExcalidrawGenericElement[\"type\"],\n    pointerDownState: PointerDownState,\n  ): void => {\n    const [gridX, gridY] = getGridPoint(\n      pointerDownState.origin.x,\n      pointerDownState.origin.y,\n      this.state.gridSize,\n    );\n    const element = newElement({\n      type: elementType,\n      x: gridX,\n      y: gridY,\n      strokeColor: this.state.currentItemStrokeColor,\n      backgroundColor: this.state.currentItemBackgroundColor,\n      fillStyle: this.state.currentItemFillStyle,\n      strokeWidth: this.state.currentItemStrokeWidth,\n      strokeStyle: this.state.currentItemStrokeStyle,\n      roughness: this.state.currentItemRoughness,\n      opacity: this.state.currentItemOpacity,\n      roundness:\n        this.state.currentItemRoundness === \"round\"\n          ? {\n              type: isUsingAdaptiveRadius(elementType)\n                ? ROUNDNESS.ADAPTIVE_RADIUS\n                : ROUNDNESS.PROPORTIONAL_RADIUS,\n            }\n          : null,\n      locked: false,\n    });\n\n    if (element.type === \"selection\") {\n      this.setState({\n        selectionElement: element,\n        draggingElement: element,\n      });\n    } else {\n      this.scene.replaceAllElements([\n        ...this.scene.getElementsIncludingDeleted(),\n        element,\n      ]);\n      this.setState({\n        multiElement: null,\n        draggingElement: element,\n        editingElement: element,\n      });\n    }\n  };\n\n  private onKeyDownFromPointerDownHandler(\n    pointerDownState: PointerDownState,\n  ): (event: KeyboardEvent) => void {\n    return withBatchedUpdates((event: KeyboardEvent) => {\n      if (this.maybeHandleResize(pointerDownState, event)) {\n        return;\n      }\n      this.maybeDragNewGenericElement(pointerDownState, event);\n    });\n  }\n\n  private onKeyUpFromPointerDownHandler(\n    pointerDownState: PointerDownState,\n  ): (event: KeyboardEvent) => void {\n    return withBatchedUpdates((event: KeyboardEvent) => {\n      // Prevents focus from escaping excalidraw tab\n      event.key === KEYS.ALT && event.preventDefault();\n      if (this.maybeHandleResize(pointerDownState, event)) {\n        return;\n      }\n      this.maybeDragNewGenericElement(pointerDownState, event);\n    });\n  }\n\n  private onPointerMoveFromPointerDownHandler(\n    pointerDownState: PointerDownState,\n  ) {\n    return withBatchedUpdatesThrottled((event: PointerEvent) => {\n      // We need to initialize dragOffsetXY only after we've updated\n      // `state.selectedElementIds` on pointerDown. Doing it here in pointerMove\n      // event handler should hopefully ensure we're already working with\n      // the updated state.\n      if (pointerDownState.drag.offset === null) {\n        pointerDownState.drag.offset = tupleToCoors(\n          getDragOffsetXY(\n            getSelectedElements(this.scene.getNonDeletedElements(), this.state),\n            pointerDownState.origin.x,\n            pointerDownState.origin.y,\n          ),\n        );\n      }\n      const target = event.target;\n      if (!(target instanceof HTMLElement)) {\n        return;\n      }\n\n      if (this.handlePointerMoveOverScrollbars(event, pointerDownState)) {\n        return;\n      }\n\n      const pointerCoords = viewportCoordsToSceneCoords(event, this.state);\n\n      if (isEraserActive(this.state)) {\n        this.handleEraser(event, pointerDownState, pointerCoords);\n        return;\n      }\n\n      const [gridX, gridY] = getGridPoint(\n        pointerCoords.x,\n        pointerCoords.y,\n        this.state.gridSize,\n      );\n\n      // for arrows/lines, don't start dragging until a given threshold\n      // to ensure we don't create a 2-point arrow by mistake when\n      // user clicks mouse in a way that it moves a tiny bit (thus\n      // triggering pointermove)\n      if (\n        !pointerDownState.drag.hasOccurred &&\n        (this.state.activeTool.type === \"arrow\" ||\n          this.state.activeTool.type === \"line\")\n      ) {\n        if (\n          distance2d(\n            pointerCoords.x,\n            pointerCoords.y,\n            pointerDownState.origin.x,\n            pointerDownState.origin.y,\n          ) < DRAGGING_THRESHOLD\n        ) {\n          return;\n        }\n      }\n      if (pointerDownState.resize.isResizing) {\n        pointerDownState.lastCoords.x = pointerCoords.x;\n        pointerDownState.lastCoords.y = pointerCoords.y;\n        if (this.maybeHandleResize(pointerDownState, event)) {\n          return true;\n        }\n      }\n\n      if (this.state.selectedLinearElement) {\n        const linearElementEditor =\n          this.state.editingLinearElement || this.state.selectedLinearElement;\n\n        if (\n          LinearElementEditor.shouldAddMidpoint(\n            this.state.selectedLinearElement,\n            pointerCoords,\n            this.state,\n          )\n        ) {\n          const ret = LinearElementEditor.addMidpoint(\n            this.state.selectedLinearElement,\n            pointerCoords,\n            this.state,\n          );\n          if (!ret) {\n            return;\n          }\n\n          // Since we are reading from previous state which is not possible with\n          // automatic batching in React 18 hence using flush sync to synchronously\n          // update the state. Check https://github.com/excalidraw/excalidraw/pull/5508 for more details.\n\n          flushSync(() => {\n            if (this.state.selectedLinearElement) {\n              this.setState({\n                selectedLinearElement: {\n                  ...this.state.selectedLinearElement,\n                  pointerDownState: ret.pointerDownState,\n                  selectedPointsIndices: ret.selectedPointsIndices,\n                },\n              });\n            }\n            if (this.state.editingLinearElement) {\n              this.setState({\n                editingLinearElement: {\n                  ...this.state.editingLinearElement,\n                  pointerDownState: ret.pointerDownState,\n                  selectedPointsIndices: ret.selectedPointsIndices,\n                },\n              });\n            }\n          });\n\n          return;\n        } else if (\n          linearElementEditor.pointerDownState.segmentMidpoint.value !== null &&\n          !linearElementEditor.pointerDownState.segmentMidpoint.added\n        ) {\n          return;\n        }\n\n        const didDrag = LinearElementEditor.handlePointDragging(\n          event,\n          this.state,\n          pointerCoords.x,\n          pointerCoords.y,\n          (element, pointsSceneCoords) => {\n            this.maybeSuggestBindingsForLinearElementAtCoords(\n              element,\n              pointsSceneCoords,\n            );\n          },\n          linearElementEditor,\n        );\n        if (didDrag) {\n          pointerDownState.lastCoords.x = pointerCoords.x;\n          pointerDownState.lastCoords.y = pointerCoords.y;\n          pointerDownState.drag.hasOccurred = true;\n          if (\n            this.state.editingLinearElement &&\n            !this.state.editingLinearElement.isDragging\n          ) {\n            this.setState({\n              editingLinearElement: {\n                ...this.state.editingLinearElement,\n                isDragging: true,\n              },\n            });\n          }\n          if (!this.state.selectedLinearElement.isDragging) {\n            this.setState({\n              selectedLinearElement: {\n                ...this.state.selectedLinearElement,\n                isDragging: true,\n              },\n            });\n          }\n          return;\n        }\n      }\n\n      const hasHitASelectedElement = pointerDownState.hit.allHitElements.some(\n        (element) => this.isASelectedElement(element),\n      );\n\n      const isSelectingPointsInLineEditor =\n        this.state.editingLinearElement &&\n        event.shiftKey &&\n        this.state.editingLinearElement.elementId ===\n          pointerDownState.hit.element?.id;\n      if (\n        (hasHitASelectedElement ||\n          pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements) &&\n        !isSelectingPointsInLineEditor\n      ) {\n        const selectedElements = getSelectedElements(\n          this.scene.getNonDeletedElements(),\n          this.state,\n        );\n        if (selectedElements.every((element) => element.locked)) {\n          return;\n        }\n        // Marking that click was used for dragging to check\n        // if elements should be deselected on pointerup\n        pointerDownState.drag.hasOccurred = true;\n        // prevent dragging even if we're no longer holding cmd/ctrl otherwise\n        // it would have weird results (stuff jumping all over the screen)\n        if (selectedElements.length > 0 && !pointerDownState.withCmdOrCtrl) {\n          const [dragX, dragY] = getGridPoint(\n            pointerCoords.x - pointerDownState.drag.offset.x,\n            pointerCoords.y - pointerDownState.drag.offset.y,\n            this.state.gridSize,\n          );\n\n          const [dragDistanceX, dragDistanceY] = [\n            Math.abs(pointerCoords.x - pointerDownState.origin.x),\n            Math.abs(pointerCoords.y - pointerDownState.origin.y),\n          ];\n\n          // We only drag in one direction if shift is pressed\n          const lockDirection = event.shiftKey;\n          dragSelectedElements(\n            pointerDownState,\n            selectedElements,\n            dragX,\n            dragY,\n            lockDirection,\n            dragDistanceX,\n            dragDistanceY,\n            this.state,\n          );\n          this.maybeSuggestBindingForAll(selectedElements);\n\n          // We duplicate the selected element if alt is pressed on pointer move\n          if (event.altKey && !pointerDownState.hit.hasBeenDuplicated) {\n            // Move the currently selected elements to the top of the z index stack, and\n            // put the duplicates where the selected elements used to be.\n            // (the origin point where the dragging started)\n\n            pointerDownState.hit.hasBeenDuplicated = true;\n\n            const nextElements = [];\n            const elementsToAppend = [];\n            const groupIdMap = new Map();\n            const oldIdToDuplicatedId = new Map();\n            const hitElement = pointerDownState.hit.element;\n            const elements = this.scene.getElementsIncludingDeleted();\n            const selectedElementIds: Array<ExcalidrawElement[\"id\"]> =\n              getSelectedElements(elements, this.state, true).map(\n                (element) => element.id,\n              );\n\n            for (const element of elements) {\n              if (\n                selectedElementIds.includes(element.id) ||\n                // case: the state.selectedElementIds might not have been\n                // updated yet by the time this mousemove event is fired\n                (element.id === hitElement?.id &&\n                  pointerDownState.hit.wasAddedToSelection)\n              ) {\n                const duplicatedElement = duplicateElement(\n                  this.state.editingGroupId,\n                  groupIdMap,\n                  element,\n                );\n                const [originDragX, originDragY] = getGridPoint(\n                  pointerDownState.origin.x - pointerDownState.drag.offset.x,\n                  pointerDownState.origin.y - pointerDownState.drag.offset.y,\n                  this.state.gridSize,\n                );\n                mutateElement(duplicatedElement, {\n                  x: duplicatedElement.x + (originDragX - dragX),\n                  y: duplicatedElement.y + (originDragY - dragY),\n                });\n                nextElements.push(duplicatedElement);\n                elementsToAppend.push(element);\n                oldIdToDuplicatedId.set(element.id, duplicatedElement.id);\n              } else {\n                nextElements.push(element);\n              }\n            }\n            const nextSceneElements = [...nextElements, ...elementsToAppend];\n            bindTextToShapeAfterDuplication(\n              nextElements,\n              elementsToAppend,\n              oldIdToDuplicatedId,\n            );\n            fixBindingsAfterDuplication(\n              nextSceneElements,\n              elementsToAppend,\n              oldIdToDuplicatedId,\n              \"duplicatesServeAsOld\",\n            );\n            this.scene.replaceAllElements(nextSceneElements);\n          }\n          return;\n        }\n      }\n\n      // It is very important to read this.state within each move event,\n      // otherwise we would read a stale one!\n      const draggingElement = this.state.draggingElement;\n      if (!draggingElement) {\n        return;\n      }\n\n      if (draggingElement.type === \"freedraw\") {\n        const points = draggingElement.points;\n        const dx = pointerCoords.x - draggingElement.x;\n        const dy = pointerCoords.y - draggingElement.y;\n\n        const lastPoint = points.length > 0 && points[points.length - 1];\n        const discardPoint =\n          lastPoint && lastPoint[0] === dx && lastPoint[1] === dy;\n\n        if (!discardPoint) {\n          const pressures = draggingElement.simulatePressure\n            ? draggingElement.pressures\n            : [...draggingElement.pressures, event.pressure];\n\n          mutateElement(draggingElement, {\n            points: [...points, [dx, dy]],\n            pressures,\n          });\n        }\n      } else if (isLinearElement(draggingElement)) {\n        pointerDownState.drag.hasOccurred = true;\n        const points = draggingElement.points;\n        let dx = gridX - draggingElement.x;\n        let dy = gridY - draggingElement.y;\n\n        if (shouldRotateWithDiscreteAngle(event) && points.length === 2) {\n          ({ width: dx, height: dy } = getLockedLinearCursorAlignSize(\n            draggingElement.x,\n            draggingElement.y,\n            pointerCoords.x,\n            pointerCoords.y,\n          ));\n        }\n\n        if (points.length === 1) {\n          mutateElement(draggingElement, {\n            points: [...points, [dx, dy]],\n          });\n        } else if (points.length === 2) {\n          mutateElement(draggingElement, {\n            points: [...points.slice(0, -1), [dx, dy]],\n          });\n        }\n\n        if (isBindingElement(draggingElement, false)) {\n          // When creating a linear element by dragging\n          this.maybeSuggestBindingsForLinearElementAtCoords(\n            draggingElement,\n            [pointerCoords],\n            this.state.startBoundElement,\n          );\n        }\n      } else {\n        pointerDownState.lastCoords.x = pointerCoords.x;\n        pointerDownState.lastCoords.y = pointerCoords.y;\n        this.maybeDragNewGenericElement(pointerDownState, event);\n      }\n\n      if (this.state.activeTool.type === \"selection\") {\n        pointerDownState.boxSelection.hasOccurred = true;\n\n        const elements = this.scene.getNonDeletedElements();\n        if (\n          !event.shiftKey &&\n          // allows for box-selecting points (without shift)\n          !this.state.editingLinearElement &&\n          isSomeElementSelected(elements, this.state)\n        ) {\n          if (pointerDownState.withCmdOrCtrl && pointerDownState.hit.element) {\n            this.setState((prevState) =>\n              selectGroupsForSelectedElements(\n                {\n                  ...prevState,\n                  selectedElementIds: {\n                    [pointerDownState.hit.element!.id]: true,\n                  },\n                },\n                this.scene.getNonDeletedElements(),\n              ),\n            );\n          } else {\n            this.setState({\n              selectedElementIds: {},\n              selectedGroupIds: {},\n              editingGroupId: null,\n            });\n          }\n        }\n        // box-select line editor points\n        if (this.state.editingLinearElement) {\n          LinearElementEditor.handleBoxSelection(\n            event,\n            this.state,\n            this.setState.bind(this),\n          );\n          // regular box-select\n        } else {\n          const elementsWithinSelection = getElementsWithinSelection(\n            elements,\n            draggingElement,\n          );\n          this.setState((prevState) =>\n            selectGroupsForSelectedElements(\n              {\n                ...prevState,\n                selectedElementIds: {\n                  ...prevState.selectedElementIds,\n                  ...elementsWithinSelection.reduce(\n                    (acc: Record<ExcalidrawElement[\"id\"], true>, element) => {\n                      acc[element.id] = true;\n                      return acc;\n                    },\n                    {},\n                  ),\n                  ...(pointerDownState.hit.element\n                    ? {\n                        // if using ctrl/cmd, select the hitElement only if we\n                        // haven't box-selected anything else\n                        [pointerDownState.hit.element.id]:\n                          !elementsWithinSelection.length,\n                      }\n                    : null),\n                },\n                showHyperlinkPopup:\n                  elementsWithinSelection.length === 1 &&\n                  elementsWithinSelection[0].link\n                    ? \"info\"\n                    : false,\n                // select linear element only when we haven't box-selected anything else\n                selectedLinearElement:\n                  elementsWithinSelection.length === 1 &&\n                  isLinearElement(elementsWithinSelection[0])\n                    ? new LinearElementEditor(\n                        elementsWithinSelection[0],\n                        this.scene,\n                      )\n                    : null,\n              },\n              this.scene.getNonDeletedElements(),\n            ),\n          );\n        }\n      }\n    });\n  }\n\n  // Returns whether the pointer move happened over either scrollbar\n  private handlePointerMoveOverScrollbars(\n    event: PointerEvent,\n    pointerDownState: PointerDownState,\n  ): boolean {\n    if (pointerDownState.scrollbars.isOverHorizontal) {\n      const x = event.clientX;\n      const dx = x - pointerDownState.lastCoords.x;\n      this.setState({\n        scrollX: this.state.scrollX - dx / this.state.zoom.value,\n      });\n      pointerDownState.lastCoords.x = x;\n      return true;\n    }\n\n    if (pointerDownState.scrollbars.isOverVertical) {\n      const y = event.clientY;\n      const dy = y - pointerDownState.lastCoords.y;\n      this.setState({\n        scrollY: this.state.scrollY - dy / this.state.zoom.value,\n      });\n      pointerDownState.lastCoords.y = y;\n      return true;\n    }\n    return false;\n  }\n\n  private onPointerUpFromPointerDownHandler(\n    pointerDownState: PointerDownState,\n  ): (event: PointerEvent) => void {\n    return withBatchedUpdates((childEvent: PointerEvent) => {\n      const {\n        draggingElement,\n        resizingElement,\n        multiElement,\n        activeTool,\n        isResizing,\n        isRotating,\n      } = this.state;\n      this.setState({\n        isResizing: false,\n        isRotating: false,\n        resizingElement: null,\n        selectionElement: null,\n        cursorButton: \"up\",\n        // text elements are reset on finalize, and resetting on pointerup\n        // may cause issues with double taps\n        editingElement:\n          multiElement || isTextElement(this.state.editingElement)\n            ? this.state.editingElement\n            : null,\n      });\n\n      this.savePointer(childEvent.clientX, childEvent.clientY, \"up\");\n\n      // Handle end of dragging a point of a linear element, might close a loop\n      // and sets binding element\n      if (this.state.editingLinearElement) {\n        if (\n          !pointerDownState.boxSelection.hasOccurred &&\n          pointerDownState.hit?.element?.id !==\n            this.state.editingLinearElement.elementId\n        ) {\n          this.actionManager.executeAction(actionFinalize);\n        } else {\n          const editingLinearElement = LinearElementEditor.handlePointerUp(\n            childEvent,\n            this.state.editingLinearElement,\n            this.state,\n          );\n          if (editingLinearElement !== this.state.editingLinearElement) {\n            this.setState({\n              editingLinearElement,\n              suggestedBindings: [],\n            });\n          }\n        }\n      } else if (this.state.selectedLinearElement) {\n        if (\n          pointerDownState.hit?.element?.id !==\n          this.state.selectedLinearElement.elementId\n        ) {\n          const selectedELements = getSelectedElements(\n            this.scene.getNonDeletedElements(),\n            this.state,\n          );\n          // set selectedLinearElement to null if there is more than one element selected since we don't want to show linear element handles\n          if (selectedELements.length > 1) {\n            this.setState({ selectedLinearElement: null });\n          }\n        } else {\n          const linearElementEditor = LinearElementEditor.handlePointerUp(\n            childEvent,\n            this.state.selectedLinearElement,\n            this.state,\n          );\n\n          const { startBindingElement, endBindingElement } =\n            linearElementEditor;\n          const element = this.scene.getElement(linearElementEditor.elementId);\n          if (isBindingElement(element)) {\n            bindOrUnbindLinearElement(\n              element,\n              startBindingElement,\n              endBindingElement,\n            );\n          }\n\n          if (linearElementEditor !== this.state.selectedLinearElement) {\n            this.setState({\n              selectedLinearElement: {\n                ...linearElementEditor,\n                selectedPointsIndices: null,\n              },\n              suggestedBindings: [],\n            });\n          }\n        }\n      }\n\n      lastPointerUp = null;\n\n      if (pointerDownState.eventListeners.onMove) {\n        pointerDownState.eventListeners.onMove.flush();\n      }\n\n      window.removeEventListener(\n        EVENT.POINTER_MOVE,\n        pointerDownState.eventListeners.onMove!,\n      );\n      window.removeEventListener(\n        EVENT.POINTER_UP,\n        pointerDownState.eventListeners.onUp!,\n      );\n      window.removeEventListener(\n        EVENT.KEYDOWN,\n        pointerDownState.eventListeners.onKeyDown!,\n      );\n      window.removeEventListener(\n        EVENT.KEYUP,\n        pointerDownState.eventListeners.onKeyUp!,\n      );\n\n      if (this.state.pendingImageElementId) {\n        this.setState({ pendingImageElementId: null });\n      }\n\n      if (draggingElement?.type === \"freedraw\") {\n        const pointerCoords = viewportCoordsToSceneCoords(\n          childEvent,\n          this.state,\n        );\n\n        const points = draggingElement.points;\n        let dx = pointerCoords.x - draggingElement.x;\n        let dy = pointerCoords.y - draggingElement.y;\n\n        // Allows dots to avoid being flagged as infinitely small\n        if (dx === points[0][0] && dy === points[0][1]) {\n          dy += 0.0001;\n          dx += 0.0001;\n        }\n\n        const pressures = draggingElement.simulatePressure\n          ? []\n          : [...draggingElement.pressures, childEvent.pressure];\n\n        mutateElement(draggingElement, {\n          points: [...points, [dx, dy]],\n          pressures,\n          lastCommittedPoint: [dx, dy],\n        });\n\n        this.actionManager.executeAction(actionFinalize);\n\n        return;\n      }\n      if (isImageElement(draggingElement)) {\n        const imageElement = draggingElement;\n        try {\n          this.initializeImageDimensions(imageElement);\n          this.setState(\n            { selectedElementIds: { [imageElement.id]: true } },\n            () => {\n              this.actionManager.executeAction(actionFinalize);\n            },\n          );\n        } catch (error: any) {\n          console.error(error);\n          this.scene.replaceAllElements(\n            this.scene\n              .getElementsIncludingDeleted()\n              .filter((el) => el.id !== imageElement.id),\n          );\n          this.actionManager.executeAction(actionFinalize);\n        }\n        return;\n      }\n\n      if (isLinearElement(draggingElement)) {\n        if (draggingElement!.points.length > 1) {\n          this.history.resumeRecording();\n        }\n        const pointerCoords = viewportCoordsToSceneCoords(\n          childEvent,\n          this.state,\n        );\n\n        if (\n          !pointerDownState.drag.hasOccurred &&\n          draggingElement &&\n          !multiElement\n        ) {\n          mutateElement(draggingElement, {\n            points: [\n              ...draggingElement.points,\n              [\n                pointerCoords.x - draggingElement.x,\n                pointerCoords.y - draggingElement.y,\n              ],\n            ],\n          });\n          this.setState({\n            multiElement: draggingElement,\n            editingElement: this.state.draggingElement,\n          });\n        } else if (pointerDownState.drag.hasOccurred && !multiElement) {\n          if (\n            isBindingEnabled(this.state) &&\n            isBindingElement(draggingElement, false)\n          ) {\n            maybeBindLinearElement(\n              draggingElement,\n              this.state,\n              this.scene,\n              pointerCoords,\n            );\n          }\n          this.setState({ suggestedBindings: [], startBoundElement: null });\n          if (!activeTool.locked) {\n            resetCursor(this.canvas);\n            this.setState((prevState) => ({\n              draggingElement: null,\n              activeTool: updateActiveTool(this.state, {\n                type: \"selection\",\n              }),\n              selectedElementIds: {\n                ...prevState.selectedElementIds,\n                [draggingElement.id]: true,\n              },\n              selectedLinearElement: new LinearElementEditor(\n                draggingElement,\n                this.scene,\n              ),\n            }));\n          } else {\n            this.setState((prevState) => ({\n              draggingElement: null,\n            }));\n          }\n        }\n        return;\n      }\n\n      if (\n        activeTool.type !== \"selection\" &&\n        draggingElement &&\n        isInvisiblySmallElement(draggingElement)\n      ) {\n        // remove invisible element which was added in onPointerDown\n        this.scene.replaceAllElements(\n          this.scene.getElementsIncludingDeleted().slice(0, -1),\n        );\n        this.setState({\n          draggingElement: null,\n        });\n        return;\n      }\n\n      if (draggingElement) {\n        mutateElement(\n          draggingElement,\n          getNormalizedDimensions(draggingElement),\n        );\n      }\n\n      if (resizingElement) {\n        this.history.resumeRecording();\n      }\n\n      if (resizingElement && isInvisiblySmallElement(resizingElement)) {\n        this.scene.replaceAllElements(\n          this.scene\n            .getElementsIncludingDeleted()\n            .filter((el) => el.id !== resizingElement.id),\n        );\n      }\n\n      // Code below handles selection when element(s) weren't\n      // drag or added to selection on pointer down phase.\n      const hitElement = pointerDownState.hit.element;\n      if (\n        this.state.selectedLinearElement?.elementId !== hitElement?.id &&\n        isLinearElement(hitElement)\n      ) {\n        const selectedELements = getSelectedElements(\n          this.scene.getNonDeletedElements(),\n          this.state,\n        );\n        // set selectedLinearElement when no other element selected except\n        // the one we've hit\n        if (selectedELements.length === 1) {\n          this.setState({\n            selectedLinearElement: new LinearElementEditor(\n              hitElement,\n              this.scene,\n            ),\n          });\n        }\n      }\n      if (isEraserActive(this.state)) {\n        const draggedDistance = distance2d(\n          this.lastPointerDown!.clientX,\n          this.lastPointerDown!.clientY,\n          this.lastPointerUp!.clientX,\n          this.lastPointerUp!.clientY,\n        );\n\n        if (draggedDistance === 0) {\n          const scenePointer = viewportCoordsToSceneCoords(\n            {\n              clientX: this.lastPointerUp!.clientX,\n              clientY: this.lastPointerUp!.clientY,\n            },\n            this.state,\n          );\n          const hitElements = this.getElementsAtPosition(\n            scenePointer.x,\n            scenePointer.y,\n          );\n          hitElements.forEach(\n            (hitElement) =>\n              (pointerDownState.elementIdsToErase[hitElement.id] = {\n                erase: true,\n                opacity: hitElement.opacity,\n              }),\n          );\n        }\n        this.eraseElements(pointerDownState);\n        return;\n      } else if (Object.keys(pointerDownState.elementIdsToErase).length) {\n        this.restoreReadyToEraseElements(pointerDownState);\n      }\n\n      if (\n        hitElement &&\n        !pointerDownState.drag.hasOccurred &&\n        !pointerDownState.hit.wasAddedToSelection &&\n        // if we're editing a line, pointerup shouldn't switch selection if\n        // box selected\n        (!this.state.editingLinearElement ||\n          !pointerDownState.boxSelection.hasOccurred)\n      ) {\n        // when inside line editor, shift selects points instead\n        if (childEvent.shiftKey && !this.state.editingLinearElement) {\n          if (this.state.selectedElementIds[hitElement.id]) {\n            if (isSelectedViaGroup(this.state, hitElement)) {\n              // We want to unselect all groups hitElement is part of\n              // as well as all elements that are part of the groups\n              // hitElement is part of\n              const idsOfSelectedElementsThatAreInGroups = hitElement.groupIds\n                .flatMap((groupId) =>\n                  getElementsInGroup(\n                    this.scene.getNonDeletedElements(),\n                    groupId,\n                  ),\n                )\n                .map((element) => ({ [element.id]: false }))\n                .reduce((prevId, acc) => ({ ...prevId, ...acc }), {});\n\n              this.setState((_prevState) => ({\n                selectedGroupIds: {\n                  ..._prevState.selectedElementIds,\n                  ...hitElement.groupIds\n                    .map((gId) => ({ [gId]: false }))\n                    .reduce((prev, acc) => ({ ...prev, ...acc }), {}),\n                },\n                selectedElementIds: {\n                  ..._prevState.selectedElementIds,\n                  ...idsOfSelectedElementsThatAreInGroups,\n                },\n              }));\n              // if not gragging a linear element point (outside editor)\n            } else if (!this.state.selectedLinearElement?.isDragging) {\n              // remove element from selection while\n              // keeping prev elements selected\n\n              this.setState((prevState) => {\n                const newSelectedElementIds = {\n                  ...prevState.selectedElementIds,\n                  [hitElement!.id]: false,\n                };\n                const newSelectedElements = getSelectedElements(\n                  this.scene.getNonDeletedElements(),\n                  { ...prevState, selectedElementIds: newSelectedElementIds },\n                );\n\n                return selectGroupsForSelectedElements(\n                  {\n                    ...prevState,\n                    selectedElementIds: newSelectedElementIds,\n                    // set selectedLinearElement only if thats the only element selected\n                    selectedLinearElement:\n                      newSelectedElements.length === 1 &&\n                      isLinearElement(newSelectedElements[0])\n                        ? new LinearElementEditor(\n                            newSelectedElements[0],\n                            this.scene,\n                          )\n                        : prevState.selectedLinearElement,\n                  },\n                  this.scene.getNonDeletedElements(),\n                );\n              });\n            }\n          } else {\n            // add element to selection while\n            // keeping prev elements selected\n            this.setState((_prevState) => ({\n              selectedElementIds: {\n                ..._prevState.selectedElementIds,\n                [hitElement!.id]: true,\n              },\n            }));\n          }\n        } else {\n          this.setState((prevState) => ({\n            ...selectGroupsForSelectedElements(\n              {\n                ...prevState,\n                selectedElementIds: { [hitElement.id]: true },\n                selectedLinearElement:\n                  isLinearElement(hitElement) &&\n                  // Don't set `selectedLinearElement` if its same as the hitElement, this is mainly to prevent resetting the `hoverPointIndex` to -1.\n                  // Future we should update the API to take care of setting the correct `hoverPointIndex` when initialized\n                  prevState.selectedLinearElement?.elementId !== hitElement.id\n                    ? new LinearElementEditor(hitElement, this.scene)\n                    : prevState.selectedLinearElement,\n              },\n              this.scene.getNonDeletedElements(),\n            ),\n          }));\n        }\n      }\n\n      if (\n        !pointerDownState.drag.hasOccurred &&\n        !this.state.isResizing &&\n        ((hitElement &&\n          isHittingElementBoundingBoxWithoutHittingElement(\n            hitElement,\n            this.state,\n            pointerDownState.origin.x,\n            pointerDownState.origin.y,\n          )) ||\n          (!hitElement &&\n            pointerDownState.hit.hasHitCommonBoundingBoxOfSelectedElements))\n      ) {\n        if (this.state.editingLinearElement) {\n          this.setState({ editingLinearElement: null });\n        } else {\n          // Deselect selected elements\n          this.setState({\n            selectedElementIds: {},\n            selectedGroupIds: {},\n            editingGroupId: null,\n          });\n        }\n        return;\n      }\n\n      if (\n        !activeTool.locked &&\n        activeTool.type !== \"freedraw\" &&\n        draggingElement\n      ) {\n        this.setState((prevState) => ({\n          selectedElementIds: {\n            ...prevState.selectedElementIds,\n            [draggingElement.id]: true,\n          },\n        }));\n      }\n\n      if (\n        activeTool.type !== \"selection\" ||\n        isSomeElementSelected(this.scene.getNonDeletedElements(), this.state)\n      ) {\n        this.history.resumeRecording();\n      }\n\n      if (pointerDownState.drag.hasOccurred || isResizing || isRotating) {\n        (isBindingEnabled(this.state)\n          ? bindOrUnbindSelectedElements\n          : unbindLinearElements)(\n          getSelectedElements(this.scene.getNonDeletedElements(), this.state),\n        );\n      }\n\n      if (!activeTool.locked && activeTool.type !== \"freedraw\") {\n        resetCursor(this.canvas);\n        this.setState({\n          draggingElement: null,\n          suggestedBindings: [],\n          activeTool: updateActiveTool(this.state, { type: \"selection\" }),\n        });\n      } else {\n        this.setState({\n          draggingElement: null,\n          suggestedBindings: [],\n        });\n      }\n    });\n  }\n\n  private restoreReadyToEraseElements = (\n    pointerDownState: PointerDownState,\n  ) => {\n    const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n      if (\n        pointerDownState.elementIdsToErase[ele.id] &&\n        pointerDownState.elementIdsToErase[ele.id].erase\n      ) {\n        return newElementWith(ele, {\n          opacity: pointerDownState.elementIdsToErase[ele.id].opacity,\n        });\n      } else if (\n        isBoundToContainer(ele) &&\n        pointerDownState.elementIdsToErase[ele.containerId] &&\n        pointerDownState.elementIdsToErase[ele.containerId].erase\n      ) {\n        return newElementWith(ele, {\n          opacity: pointerDownState.elementIdsToErase[ele.containerId].opacity,\n        });\n      }\n      return ele;\n    });\n\n    this.scene.replaceAllElements(elements);\n  };\n\n  private eraseElements = (pointerDownState: PointerDownState) => {\n    const elements = this.scene.getElementsIncludingDeleted().map((ele) => {\n      if (\n        pointerDownState.elementIdsToErase[ele.id] &&\n        pointerDownState.elementIdsToErase[ele.id].erase\n      ) {\n        return newElementWith(ele, { isDeleted: true });\n      } else if (\n        isBoundToContainer(ele) &&\n        pointerDownState.elementIdsToErase[ele.containerId] &&\n        pointerDownState.elementIdsToErase[ele.containerId].erase\n      ) {\n        return newElementWith(ele, { isDeleted: true });\n      }\n      return ele;\n    });\n\n    this.history.resumeRecording();\n    this.scene.replaceAllElements(elements);\n  };\n\n  private initializeImage = async ({\n    imageFile,\n    imageElement: _imageElement,\n    showCursorImagePreview = false,\n  }: {\n    imageFile: File;\n    imageElement: ExcalidrawImageElement;\n    showCursorImagePreview?: boolean;\n  }) => {\n    // at this point this should be guaranteed image file, but we do this check\n    // to satisfy TS down the line\n    if (!isSupportedImageFile(imageFile)) {\n      throw new Error(t(\"errors.unsupportedFileType\"));\n    }\n    const mimeType = imageFile.type;\n\n    setCursor(this.canvas, \"wait\");\n\n    if (mimeType === MIME_TYPES.svg) {\n      try {\n        imageFile = SVGStringToFile(\n          await normalizeSVG(await imageFile.text()),\n          imageFile.name,\n        );\n      } catch (error: any) {\n        console.warn(error);\n        throw new Error(t(\"errors.svgImageInsertError\"));\n      }\n    }\n\n    // generate image id (by default the file digest) before any\n    // resizing/compression takes place to keep it more portable\n    const fileId = await ((this.props.generateIdForFile?.(\n      imageFile,\n    ) as Promise<FileId>) || generateIdFromFile(imageFile));\n\n    if (!fileId) {\n      console.warn(\n        \"Couldn't generate file id or the supplied `generateIdForFile` didn't resolve to one.\",\n      );\n      throw new Error(t(\"errors.imageInsertError\"));\n    }\n\n    const existingFileData = this.files[fileId];\n    if (!existingFileData?.dataURL) {\n      try {\n        imageFile = await resizeImageFile(imageFile, {\n          maxWidthOrHeight: DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT,\n        });\n      } catch (error: any) {\n        console.error(\"error trying to resing image file on insertion\", error);\n      }\n\n      if (imageFile.size > MAX_ALLOWED_FILE_BYTES) {\n        throw new Error(\n          t(\"errors.fileTooBig\", {\n            maxSize: `${Math.trunc(MAX_ALLOWED_FILE_BYTES / 1024 / 1024)}MB`,\n          }),\n        );\n      }\n    }\n\n    if (showCursorImagePreview) {\n      const dataURL = this.files[fileId]?.dataURL;\n      // optimization so that we don't unnecessarily resize the original\n      // full-size file for cursor preview\n      // (it's much faster to convert the resized dataURL to File)\n      const resizedFile = dataURL && dataURLToFile(dataURL);\n\n      this.setImagePreviewCursor(resizedFile || imageFile);\n    }\n\n    const dataURL =\n      this.files[fileId]?.dataURL || (await getDataURL(imageFile));\n\n    const imageElement = mutateElement(\n      _imageElement,\n      {\n        fileId,\n      },\n      false,\n    ) as NonDeleted<InitializedExcalidrawImageElement>;\n\n    return new Promise<NonDeleted<InitializedExcalidrawImageElement>>(\n      async (resolve, reject) => {\n        try {\n          this.files = {\n            ...this.files,\n            [fileId]: {\n              mimeType,\n              id: fileId,\n              dataURL,\n              created: Date.now(),\n              lastRetrieved: Date.now(),\n            },\n          };\n          const cachedImageData = this.imageCache.get(fileId);\n          if (!cachedImageData) {\n            this.addNewImagesToImageCache();\n            await this.updateImageCache([imageElement]);\n          }\n          if (cachedImageData?.image instanceof Promise) {\n            await cachedImageData.image;\n          }\n          if (\n            this.state.pendingImageElementId !== imageElement.id &&\n            this.state.draggingElement?.id !== imageElement.id\n          ) {\n            this.initializeImageDimensions(imageElement, true);\n          }\n          resolve(imageElement);\n        } catch (error: any) {\n          console.error(error);\n          reject(new Error(t(\"errors.imageInsertError\")));\n        } finally {\n          if (!showCursorImagePreview) {\n            resetCursor(this.canvas);\n          }\n        }\n      },\n    );\n  };\n\n  /**\n   * inserts image into elements array and rerenders\n   */\n  private insertImageElement = async (\n    imageElement: ExcalidrawImageElement,\n    imageFile: File,\n    showCursorImagePreview?: boolean,\n  ) => {\n    this.scene.replaceAllElements([\n      ...this.scene.getElementsIncludingDeleted(),\n      imageElement,\n    ]);\n\n    try {\n      await this.initializeImage({\n        imageFile,\n        imageElement,\n        showCursorImagePreview,\n      });\n    } catch (error: any) {\n      mutateElement(imageElement, {\n        isDeleted: true,\n      });\n      this.actionManager.executeAction(actionFinalize);\n      this.setState({\n        errorMessage: error.message || t(\"errors.imageInsertError\"),\n      });\n    }\n  };\n\n  private setImagePreviewCursor = async (imageFile: File) => {\n    // mustn't be larger than 128 px\n    // https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Basic_User_Interface/Using_URL_values_for_the_cursor_property\n    const cursorImageSizePx = 96;\n\n    const imagePreview = await resizeImageFile(imageFile, {\n      maxWidthOrHeight: cursorImageSizePx,\n    });\n\n    let previewDataURL = await getDataURL(imagePreview);\n\n    // SVG cannot be resized via `resizeImageFile` so we resize by rendering to\n    // a small canvas\n    if (imageFile.type === MIME_TYPES.svg) {\n      const img = await loadHTMLImageElement(previewDataURL);\n\n      let height = Math.min(img.height, cursorImageSizePx);\n      let width = height * (img.width / img.height);\n\n      if (width > cursorImageSizePx) {\n        width = cursorImageSizePx;\n        height = width * (img.height / img.width);\n      }\n\n      const canvas = document.createElement(\"canvas\");\n      canvas.height = height;\n      canvas.width = width;\n      const context = canvas.getContext(\"2d\")!;\n\n      context.drawImage(img, 0, 0, width, height);\n\n      previewDataURL = canvas.toDataURL(MIME_TYPES.svg) as DataURL;\n    }\n\n    if (this.state.pendingImageElementId) {\n      setCursor(this.canvas, `url(${previewDataURL}) 4 4, auto`);\n    }\n  };\n\n  private onImageAction = async (\n    { insertOnCanvasDirectly } = { insertOnCanvasDirectly: false },\n  ) => {\n    try {\n      const clientX = this.state.width / 2 + this.state.offsetLeft;\n      const clientY = this.state.height / 2 + this.state.offsetTop;\n\n      const { x, y } = viewportCoordsToSceneCoords(\n        { clientX, clientY },\n        this.state,\n      );\n\n      const imageFile = await fileOpen({\n        description: \"Image\",\n        extensions: [\"jpg\", \"png\", \"svg\", \"gif\"],\n      });\n\n      const imageElement = this.createImageElement({\n        sceneX: x,\n        sceneY: y,\n      });\n\n      if (insertOnCanvasDirectly) {\n        this.insertImageElement(imageElement, imageFile);\n        this.initializeImageDimensions(imageElement);\n        this.setState(\n          {\n            selectedElementIds: { [imageElement.id]: true },\n          },\n          () => {\n            this.actionManager.executeAction(actionFinalize);\n          },\n        );\n      } else {\n        this.setState(\n          {\n            pendingImageElementId: imageElement.id,\n          },\n          () => {\n            this.insertImageElement(\n              imageElement,\n              imageFile,\n              /* showCursorImagePreview */ true,\n            );\n          },\n        );\n      }\n    } catch (error: any) {\n      if (error.name !== \"AbortError\") {\n        console.error(error);\n      } else {\n        console.warn(error);\n      }\n      this.setState(\n        {\n          pendingImageElementId: null,\n          editingElement: null,\n          activeTool: updateActiveTool(this.state, { type: \"selection\" }),\n        },\n        () => {\n          this.actionManager.executeAction(actionFinalize);\n        },\n      );\n    }\n  };\n\n  private initializeImageDimensions = (\n    imageElement: ExcalidrawImageElement,\n    forceNaturalSize = false,\n  ) => {\n    const image =\n      isInitializedImageElement(imageElement) &&\n      this.imageCache.get(imageElement.fileId)?.image;\n\n    if (!image || image instanceof Promise) {\n      if (\n        imageElement.width < DRAGGING_THRESHOLD / this.state.zoom.value &&\n        imageElement.height < DRAGGING_THRESHOLD / this.state.zoom.value\n      ) {\n        const placeholderSize = 100 / this.state.zoom.value;\n        mutateElement(imageElement, {\n          x: imageElement.x - placeholderSize / 2,\n          y: imageElement.y - placeholderSize / 2,\n          width: placeholderSize,\n          height: placeholderSize,\n        });\n      }\n\n      return;\n    }\n\n    if (\n      forceNaturalSize ||\n      // if user-created bounding box is below threshold, assume the\n      // intention was to click instead of drag, and use the image's\n      // intrinsic size\n      (imageElement.width < DRAGGING_THRESHOLD / this.state.zoom.value &&\n        imageElement.height < DRAGGING_THRESHOLD / this.state.zoom.value)\n    ) {\n      const minHeight = Math.max(this.state.height - 120, 160);\n      // max 65% of canvas height, clamped to <300px, vh - 120px>\n      const maxHeight = Math.min(\n        minHeight,\n        Math.floor(this.state.height * 0.5) / this.state.zoom.value,\n      );\n\n      const height = Math.min(image.naturalHeight, maxHeight);\n      const width = height * (image.naturalWidth / image.naturalHeight);\n\n      // add current imageElement width/height to account for previous centering\n      // of the placeholder image\n      const x = imageElement.x + imageElement.width / 2 - width / 2;\n      const y = imageElement.y + imageElement.height / 2 - height / 2;\n\n      mutateElement(imageElement, { x, y, width, height });\n    }\n  };\n\n  /** updates image cache, refreshing updated elements and/or setting status\n      to error for images that fail during <img> element creation */\n  private updateImageCache = async (\n    elements: readonly InitializedExcalidrawImageElement[],\n    files = this.files,\n  ) => {\n    const { updatedFiles, erroredFiles } = await _updateImageCache({\n      imageCache: this.imageCache,\n      fileIds: elements.map((element) => element.fileId),\n      files,\n    });\n    if (updatedFiles.size || erroredFiles.size) {\n      for (const element of elements) {\n        if (updatedFiles.has(element.fileId)) {\n          invalidateShapeForElement(element);\n        }\n      }\n    }\n    if (erroredFiles.size) {\n      this.scene.replaceAllElements(\n        this.scene.getElementsIncludingDeleted().map((element) => {\n          if (\n            isInitializedImageElement(element) &&\n            erroredFiles.has(element.fileId)\n          ) {\n            return newElementWith(element, {\n              status: \"error\",\n            });\n          }\n          return element;\n        }),\n      );\n    }\n\n    return { updatedFiles, erroredFiles };\n  };\n\n  /** adds new images to imageCache and re-renders if needed */\n  private addNewImagesToImageCache = async (\n    imageElements: InitializedExcalidrawImageElement[] = getInitializedImageElements(\n      this.scene.getNonDeletedElements(),\n    ),\n    files: BinaryFiles = this.files,\n  ) => {\n    const uncachedImageElements = imageElements.filter(\n      (element) => !element.isDeleted && !this.imageCache.has(element.fileId),\n    );\n\n    if (uncachedImageElements.length) {\n      const { updatedFiles } = await this.updateImageCache(\n        uncachedImageElements,\n        files,\n      );\n      if (updatedFiles.size) {\n        this.scene.informMutation();\n      }\n    }\n  };\n\n  /** generally you should use `addNewImagesToImageCache()` directly if you need\n   *  to render new images. This is just a failsafe  */\n  private scheduleImageRefresh = throttle(() => {\n    this.addNewImagesToImageCache();\n  }, IMAGE_RENDER_TIMEOUT);\n\n  private updateBindingEnabledOnPointerMove = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ) => {\n    const shouldEnableBinding = shouldEnableBindingForPointerEvent(event);\n    if (this.state.isBindingEnabled !== shouldEnableBinding) {\n      this.setState({ isBindingEnabled: shouldEnableBinding });\n    }\n  };\n\n  private maybeSuggestBindingAtCursor = (pointerCoords: {\n    x: number;\n    y: number;\n  }): void => {\n    const hoveredBindableElement = getHoveredElementForBinding(\n      pointerCoords,\n      this.scene,\n    );\n    this.setState({\n      suggestedBindings:\n        hoveredBindableElement != null ? [hoveredBindableElement] : [],\n    });\n  };\n\n  private maybeSuggestBindingsForLinearElementAtCoords = (\n    linearElement: NonDeleted<ExcalidrawLinearElement>,\n    /** scene coords */\n    pointerCoords: {\n      x: number;\n      y: number;\n    }[],\n    // During line creation the start binding hasn't been written yet\n    // into `linearElement`\n    oppositeBindingBoundElement?: ExcalidrawBindableElement | null,\n  ): void => {\n    if (!pointerCoords.length) {\n      return;\n    }\n\n    const suggestedBindings = pointerCoords.reduce(\n      (acc: NonDeleted<ExcalidrawBindableElement>[], coords) => {\n        const hoveredBindableElement = getHoveredElementForBinding(\n          coords,\n          this.scene,\n        );\n        if (\n          hoveredBindableElement != null &&\n          !isLinearElementSimpleAndAlreadyBound(\n            linearElement,\n            oppositeBindingBoundElement?.id,\n            hoveredBindableElement,\n          )\n        ) {\n          acc.push(hoveredBindableElement);\n        }\n        return acc;\n      },\n      [],\n    );\n\n    this.setState({ suggestedBindings });\n  };\n\n  private maybeSuggestBindingForAll(\n    selectedElements: NonDeleted<ExcalidrawElement>[],\n  ): void {\n    const suggestedBindings = getEligibleElementsForBinding(selectedElements);\n    this.setState({ suggestedBindings });\n  }\n\n  private clearSelection(hitElement: ExcalidrawElement | null): void {\n    this.setState((prevState) => ({\n      selectedElementIds: {},\n      selectedGroupIds: {},\n      // Continue editing the same group if the user selected a different\n      // element from it\n      editingGroupId:\n        prevState.editingGroupId &&\n        hitElement != null &&\n        isElementInGroup(hitElement, prevState.editingGroupId)\n          ? prevState.editingGroupId\n          : null,\n    }));\n    this.setState({\n      selectedElementIds: {},\n      previousSelectedElementIds: this.state.selectedElementIds,\n    });\n  }\n\n  private handleCanvasRef = (canvas: HTMLCanvasElement) => {\n    // canvas is null when unmounting\n    if (canvas !== null) {\n      this.canvas = canvas;\n      this.rc = rough.canvas(this.canvas);\n\n      this.canvas.addEventListener(EVENT.WHEEL, this.handleWheel, {\n        passive: false,\n      });\n      this.canvas.addEventListener(EVENT.TOUCH_START, this.onTapStart);\n      this.canvas.addEventListener(EVENT.TOUCH_END, this.onTapEnd);\n    } else {\n      this.canvas?.removeEventListener(EVENT.WHEEL, this.handleWheel);\n      this.canvas?.removeEventListener(EVENT.TOUCH_START, this.onTapStart);\n      this.canvas?.removeEventListener(EVENT.TOUCH_END, this.onTapEnd);\n    }\n  };\n\n  private handleAppOnDrop = async (event: React.DragEvent<HTMLDivElement>) => {\n    // must be retrieved first, in the same frame\n    const { file, fileHandle } = await getFileFromEvent(event);\n\n    try {\n      if (isSupportedImageFile(file)) {\n        // first attempt to decode scene from the image if it's embedded\n        // ---------------------------------------------------------------------\n\n        if (file?.type === MIME_TYPES.png || file?.type === MIME_TYPES.svg) {\n          try {\n            const scene = await loadFromBlob(\n              file,\n              this.state,\n              this.scene.getElementsIncludingDeleted(),\n              fileHandle,\n            );\n            this.syncActionResult({\n              ...scene,\n              appState: {\n                ...(scene.appState || this.state),\n                isLoading: false,\n              },\n              replaceFiles: true,\n              commitToHistory: true,\n            });\n            return;\n          } catch (error: any) {\n            if (error.name !== \"EncodingError\") {\n              throw error;\n            }\n          }\n        }\n\n        // if no scene is embedded or we fail for whatever reason, fall back\n        // to importing as regular image\n        // ---------------------------------------------------------------------\n\n        const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n          event,\n          this.state,\n        );\n\n        const imageElement = this.createImageElement({ sceneX, sceneY });\n        this.insertImageElement(imageElement, file);\n        this.initializeImageDimensions(imageElement);\n        this.setState({ selectedElementIds: { [imageElement.id]: true } });\n\n        return;\n      }\n    } catch (error: any) {\n      return this.setState({\n        isLoading: false,\n        errorMessage: error.message,\n      });\n    }\n\n    const libraryJSON = event.dataTransfer.getData(MIME_TYPES.excalidrawlib);\n    if (libraryJSON && typeof libraryJSON === \"string\") {\n      try {\n        const libraryItems = parseLibraryJSON(libraryJSON);\n        this.addElementsFromPasteOrLibrary({\n          elements: distributeLibraryItemsOnSquareGrid(libraryItems),\n          position: event,\n          files: null,\n        });\n      } catch (error: any) {\n        this.setState({ errorMessage: error.message });\n      }\n      return;\n    }\n\n    if (file) {\n      // atetmpt to parse an excalidraw/excalidrawlib file\n      await this.loadFileToCanvas(file, fileHandle);\n    }\n  };\n\n  loadFileToCanvas = async (\n    file: File,\n    fileHandle: FileSystemHandle | null,\n  ) => {\n    file = await normalizeFile(file);\n    try {\n      const ret = await loadSceneOrLibraryFromBlob(\n        file,\n        this.state,\n        this.scene.getElementsIncludingDeleted(),\n        fileHandle,\n      );\n      if (ret.type === MIME_TYPES.excalidraw) {\n        this.setState({ isLoading: true });\n        this.syncActionResult({\n          ...ret.data,\n          appState: {\n            ...(ret.data.appState || this.state),\n            isLoading: false,\n          },\n          replaceFiles: true,\n          commitToHistory: true,\n        });\n      } else if (ret.type === MIME_TYPES.excalidrawlib) {\n        await this.library\n          .updateLibrary({\n            libraryItems: file,\n            merge: true,\n            openLibraryMenu: true,\n          })\n          .catch((error) => {\n            console.error(error);\n            this.setState({ errorMessage: t(\"errors.importLibraryError\") });\n          });\n      }\n    } catch (error: any) {\n      this.setState({ isLoading: false, errorMessage: error.message });\n    }\n  };\n\n  private handleCanvasContextMenu = (\n    event: React.PointerEvent<HTMLCanvasElement>,\n  ) => {\n    event.preventDefault();\n\n    if (\n      (event.nativeEvent.pointerType === \"touch\" ||\n        (event.nativeEvent.pointerType === \"pen\" &&\n          // always allow if user uses a pen secondary button\n          event.button !== POINTER_BUTTON.SECONDARY)) &&\n      this.state.activeTool.type !== \"selection\"\n    ) {\n      return;\n    }\n\n    const { x, y } = viewportCoordsToSceneCoords(event, this.state);\n    const element = this.getElementAtPosition(x, y, {\n      preferSelected: true,\n      includeLockedElements: true,\n    });\n\n    const selectedElements = getSelectedElements(\n      this.scene.getNonDeletedElements(),\n      this.state,\n    );\n    const isHittignCommonBoundBox =\n      this.isHittingCommonBoundingBoxOfSelectedElements(\n        { x, y },\n        selectedElements,\n      );\n\n    const type = element || isHittignCommonBoundBox ? \"element\" : \"canvas\";\n\n    const container = this.excalidrawContainerRef.current!;\n    const { top: offsetTop, left: offsetLeft } =\n      container.getBoundingClientRect();\n    const left = event.clientX - offsetLeft;\n    const top = event.clientY - offsetTop;\n\n    trackEvent(\"contextMenu\", \"openContextMenu\", type);\n\n    this.setState(\n      {\n        ...(element && !this.state.selectedElementIds[element.id]\n          ? selectGroupsForSelectedElements(\n              {\n                ...this.state,\n                selectedElementIds: { [element.id]: true },\n                selectedLinearElement: isLinearElement(element)\n                  ? new LinearElementEditor(element, this.scene)\n                  : null,\n              },\n              this.scene.getNonDeletedElements(),\n            )\n          : this.state),\n        showHyperlinkPopup: false,\n      },\n      () => {\n        this.setState({\n          contextMenu: { top, left, items: this.getContextMenuItems(type) },\n        });\n      },\n    );\n  };\n\n  private maybeDragNewGenericElement = (\n    pointerDownState: PointerDownState,\n    event: MouseEvent | KeyboardEvent,\n  ): void => {\n    const draggingElement = this.state.draggingElement;\n    const pointerCoords = pointerDownState.lastCoords;\n    if (!draggingElement) {\n      return;\n    }\n    if (\n      draggingElement.type === \"selection\" &&\n      this.state.activeTool.type !== \"eraser\"\n    ) {\n      dragNewElement(\n        draggingElement,\n        this.state.activeTool.type,\n        pointerDownState.origin.x,\n        pointerDownState.origin.y,\n        pointerCoords.x,\n        pointerCoords.y,\n        distance(pointerDownState.origin.x, pointerCoords.x),\n        distance(pointerDownState.origin.y, pointerCoords.y),\n        shouldMaintainAspectRatio(event),\n        shouldResizeFromCenter(event),\n      );\n    } else {\n      const [gridX, gridY] = getGridPoint(\n        pointerCoords.x,\n        pointerCoords.y,\n        this.state.gridSize,\n      );\n\n      const image =\n        isInitializedImageElement(draggingElement) &&\n        this.imageCache.get(draggingElement.fileId)?.image;\n      const aspectRatio =\n        image && !(image instanceof Promise)\n          ? image.width / image.height\n          : null;\n\n      dragNewElement(\n        draggingElement,\n        this.state.activeTool.type,\n        pointerDownState.originInGrid.x,\n        pointerDownState.originInGrid.y,\n        gridX,\n        gridY,\n        distance(pointerDownState.originInGrid.x, gridX),\n        distance(pointerDownState.originInGrid.y, gridY),\n        isImageElement(draggingElement)\n          ? !shouldMaintainAspectRatio(event)\n          : shouldMaintainAspectRatio(event),\n        shouldResizeFromCenter(event),\n        aspectRatio,\n      );\n\n      this.maybeSuggestBindingForAll([draggingElement]);\n    }\n  };\n\n  private maybeHandleResize = (\n    pointerDownState: PointerDownState,\n    event: MouseEvent | KeyboardEvent,\n  ): boolean => {\n    const selectedElements = getSelectedElements(\n      this.scene.getNonDeletedElements(),\n      this.state,\n    );\n    const transformHandleType = pointerDownState.resize.handleType;\n    this.setState({\n      // TODO: rename this state field to \"isScaling\" to distinguish\n      // it from the generic \"isResizing\" which includes scaling and\n      // rotating\n      isResizing: transformHandleType && transformHandleType !== \"rotation\",\n      isRotating: transformHandleType === \"rotation\",\n    });\n    const pointerCoords = pointerDownState.lastCoords;\n    const [resizeX, resizeY] = getGridPoint(\n      pointerCoords.x - pointerDownState.resize.offset.x,\n      pointerCoords.y - pointerDownState.resize.offset.y,\n      this.state.gridSize,\n    );\n    if (\n      transformElements(\n        pointerDownState,\n        transformHandleType,\n        selectedElements,\n        pointerDownState.resize.arrowDirection,\n        shouldRotateWithDiscreteAngle(event),\n        shouldResizeFromCenter(event),\n        selectedElements.length === 1 && isImageElement(selectedElements[0])\n          ? !shouldMaintainAspectRatio(event)\n          : shouldMaintainAspectRatio(event),\n        resizeX,\n        resizeY,\n        pointerDownState.resize.center.x,\n        pointerDownState.resize.center.y,\n      )\n    ) {\n      this.maybeSuggestBindingForAll(selectedElements);\n      return true;\n    }\n    return false;\n  };\n\n  private getContextMenuItems = (\n    type: \"canvas\" | \"element\",\n  ): ContextMenuItems => {\n    const options: ContextMenuItems = [];\n\n    options.push(actionCopyAsPng, actionCopyAsSvg);\n\n    // canvas contextMenu\n    // -------------------------------------------------------------------------\n\n    if (type === \"canvas\") {\n      if (this.state.viewModeEnabled) {\n        return [\n          ...options,\n          actionToggleGridMode,\n          actionToggleZenMode,\n          actionToggleViewMode,\n          actionToggleStats,\n        ];\n      }\n\n      return [\n        actionPaste,\n        CONTEXT_MENU_SEPARATOR,\n        actionCopyAsPng,\n        actionCopyAsSvg,\n        copyText,\n        CONTEXT_MENU_SEPARATOR,\n        actionSelectAll,\n        CONTEXT_MENU_SEPARATOR,\n        actionToggleGridMode,\n        actionToggleZenMode,\n        actionToggleViewMode,\n        actionToggleStats,\n      ];\n    }\n\n    // element contextMenu\n    // -------------------------------------------------------------------------\n\n    options.push(copyText);\n\n    if (this.state.viewModeEnabled) {\n      return [actionCopy, ...options];\n    }\n\n    return [\n      actionCut,\n      actionCopy,\n      actionPaste,\n      CONTEXT_MENU_SEPARATOR,\n      ...options,\n      CONTEXT_MENU_SEPARATOR,\n      actionCopyStyles,\n      actionPasteStyles,\n      CONTEXT_MENU_SEPARATOR,\n      actionGroup,\n      actionUnbindText,\n      actionBindText,\n      actionCreateContainerFromText,\n      actionUngroup,\n      CONTEXT_MENU_SEPARATOR,\n      actionAddToLibrary,\n      CONTEXT_MENU_SEPARATOR,\n      actionSendBackward,\n      actionBringForward,\n      actionSendToBack,\n      actionBringToFront,\n      CONTEXT_MENU_SEPARATOR,\n      actionFlipHorizontal,\n      actionFlipVertical,\n      CONTEXT_MENU_SEPARATOR,\n      actionToggleLinearEditor,\n      actionLink,\n      actionDuplicateSelection,\n      actionToggleLock,\n      CONTEXT_MENU_SEPARATOR,\n      actionDeleteSelected,\n    ];\n  };\n\n  private handleWheel = withBatchedUpdates((event: WheelEvent) => {\n    event.preventDefault();\n    if (isPanning) {\n      return;\n    }\n\n    const { deltaX, deltaY } = event;\n    // note that event.ctrlKey is necessary to handle pinch zooming\n    if (event.metaKey || event.ctrlKey) {\n      const sign = Math.sign(deltaY);\n      const MAX_STEP = ZOOM_STEP * 100;\n      const absDelta = Math.abs(deltaY);\n      let delta = deltaY;\n      if (absDelta > MAX_STEP) {\n        delta = MAX_STEP * sign;\n      }\n\n      let newZoom = this.state.zoom.value - delta / 100;\n      // increase zoom steps the more zoomed-in we are (applies to >100% only)\n      newZoom +=\n        Math.log10(Math.max(1, this.state.zoom.value)) *\n        -sign *\n        // reduced amplification for small deltas (small movements on a trackpad)\n        Math.min(1, absDelta / 20);\n\n      this.setState((state) => ({\n        ...getStateForZoom(\n          {\n            viewportX: cursorX,\n            viewportY: cursorY,\n            nextZoom: getNormalizedZoom(newZoom),\n          },\n          state,\n        ),\n        shouldCacheIgnoreZoom: true,\n      }));\n      this.resetShouldCacheIgnoreZoomDebounced();\n      return;\n    }\n\n    // scroll horizontally when shift pressed\n    if (event.shiftKey) {\n      this.setState(({ zoom, scrollX }) => ({\n        // on Mac, shift+wheel tends to result in deltaX\n        scrollX: scrollX - (deltaY || deltaX) / zoom.value,\n      }));\n      return;\n    }\n\n    this.setState(({ zoom, scrollX, scrollY }) => ({\n      scrollX: scrollX - deltaX / zoom.value,\n      scrollY: scrollY - deltaY / zoom.value,\n    }));\n  });\n\n  private getTextWysiwygSnappedToCenterPosition(\n    x: number,\n    y: number,\n    appState: AppState,\n    container?: ExcalidrawTextContainer | null,\n  ) {\n    if (container) {\n      let elementCenterX = container.x + container.width / 2;\n      let elementCenterY = container.y + container.height / 2;\n\n      const elementCenter = getContainerCenter(container, appState);\n      if (elementCenter) {\n        elementCenterX = elementCenter.x;\n        elementCenterY = elementCenter.y;\n      }\n      const distanceToCenter = Math.hypot(\n        x - elementCenterX,\n        y - elementCenterY,\n      );\n      const isSnappedToCenter =\n        distanceToCenter < TEXT_TO_CENTER_SNAP_THRESHOLD;\n      if (isSnappedToCenter) {\n        const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(\n          { sceneX: elementCenterX, sceneY: elementCenterY },\n          appState,\n        );\n        return { viewportX, viewportY, elementCenterX, elementCenterY };\n      }\n    }\n  }\n\n  private savePointer = (x: number, y: number, button: \"up\" | \"down\") => {\n    if (!x || !y) {\n      return;\n    }\n    const pointer = viewportCoordsToSceneCoords(\n      { clientX: x, clientY: y },\n      this.state,\n    );\n\n    if (isNaN(pointer.x) || isNaN(pointer.y)) {\n      // sometimes the pointer goes off screen\n    }\n\n    this.props.onPointerUpdate?.({\n      pointer,\n      button,\n      pointersMap: gesture.pointers,\n    });\n  };\n\n  private resetShouldCacheIgnoreZoomDebounced = debounce(() => {\n    if (!this.unmounted) {\n      this.setState({ shouldCacheIgnoreZoom: false });\n    }\n  }, 300);\n\n  private updateDOMRect = (cb?: () => void) => {\n    if (this.excalidrawContainerRef?.current) {\n      const excalidrawContainer = this.excalidrawContainerRef.current;\n      const {\n        width,\n        height,\n        left: offsetLeft,\n        top: offsetTop,\n      } = excalidrawContainer.getBoundingClientRect();\n      const {\n        width: currentWidth,\n        height: currentHeight,\n        offsetTop: currentOffsetTop,\n        offsetLeft: currentOffsetLeft,\n      } = this.state;\n\n      if (\n        width === currentWidth &&\n        height === currentHeight &&\n        offsetLeft === currentOffsetLeft &&\n        offsetTop === currentOffsetTop\n      ) {\n        if (cb) {\n          cb();\n        }\n        return;\n      }\n\n      this.setState(\n        {\n          width,\n          height,\n          offsetLeft,\n          offsetTop,\n        },\n        () => {\n          cb && cb();\n        },\n      );\n    }\n  };\n\n  public refresh = () => {\n    this.setState({ ...this.getCanvasOffsets() });\n  };\n\n  private getCanvasOffsets(): Pick<AppState, \"offsetTop\" | \"offsetLeft\"> {\n    if (this.excalidrawContainerRef?.current) {\n      const excalidrawContainer = this.excalidrawContainerRef.current;\n      const { left, top } = excalidrawContainer.getBoundingClientRect();\n      return {\n        offsetLeft: left,\n        offsetTop: top,\n      };\n    }\n    return {\n      offsetLeft: 0,\n      offsetTop: 0,\n    };\n  }\n\n  private async updateLanguage() {\n    const currentLang =\n      languages.find((lang) => lang.code === this.props.langCode) ||\n      defaultLang;\n    await setLanguage(currentLang);\n    this.setAppState({});\n  }\n}\n\n// -----------------------------------------------------------------------------\n// TEST HOOKS\n// -----------------------------------------------------------------------------\n\ndeclare global {\n  interface Window {\n    h: {\n      elements: readonly ExcalidrawElement[];\n      state: AppState;\n      setState: React.Component<any, AppState>[\"setState\"];\n      app: InstanceType<typeof App>;\n      history: History;\n    };\n  }\n}\n\nif (\n  process.env.NODE_ENV === ENV.TEST ||\n  process.env.NODE_ENV === ENV.DEVELOPMENT\n) {\n  window.h = window.h || ({} as Window[\"h\"]);\n\n  Object.defineProperties(window.h, {\n    elements: {\n      configurable: true,\n      get() {\n        return this.app?.scene.getElementsIncludingDeleted();\n      },\n      set(elements: ExcalidrawElement[]) {\n        return this.app?.scene.replaceAllElements(elements);\n      },\n    },\n  });\n}\n\nexport default App;\n","import OpenColor from \"open-color\";\n\nimport \"./Card.scss\";\n\nexport const Card: React.FC<{\n  color: keyof OpenColor | \"primary\";\n  children?: React.ReactNode;\n}> = ({ children, color }) => {\n  return (\n    <div\n      className=\"Card\"\n      style={{\n        [\"--card-color\" as any]:\n          color === \"primary\" ? \"var(--color-primary)\" : OpenColor[color][7],\n        [\"--card-color-darker\" as any]:\n          color === \"primary\"\n            ? \"var(--color-primary-darker)\"\n            : OpenColor[color][8],\n        [\"--card-color-darkest\" as any]:\n          color === \"primary\"\n            ? \"var(--color-primary-darkest)\"\n            : OpenColor[color][9],\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n","import React from \"react\";\nimport clsx from \"clsx\";\nimport { checkIcon } from \"./icons\";\n\nimport \"./CheckboxItem.scss\";\n\nexport const CheckboxItem: React.FC<{\n  checked: boolean;\n  onChange: (checked: boolean, event: React.MouseEvent) => void;\n  className?: string;\n  children?: React.ReactNode;\n}> = ({ children, checked, onChange, className }) => {\n  return (\n    <div\n      className={clsx(\"Checkbox\", className, { \"is-checked\": checked })}\n      onClick={(event) => {\n        onChange(!checked, event);\n        (\n          (event.currentTarget as HTMLDivElement).querySelector(\n            \".Checkbox-box\",\n          ) as HTMLButtonElement\n        ).focus();\n      }}\n    >\n      <button className=\"Checkbox-box\" role=\"checkbox\" aria-checked={checked}>\n        {checkIcon}\n      </button>\n      <div className=\"Checkbox-label\">{children}</div>\n    </div>\n  );\n};\n","import React from \"react\";\nimport { Popover } from \"./Popover\";\nimport { isTransparent } from \"../utils\";\n\nimport \"./ColorPicker.scss\";\nimport { isArrowKey, KEYS } from \"../keys\";\nimport { t, getLanguage } from \"../i18n\";\nimport { isWritableElement } from \"../utils\";\nimport colors from \"../colors\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppState } from \"../types\";\n\nconst MAX_CUSTOM_COLORS = 5;\nconst MAX_DEFAULT_COLORS = 15;\n\nexport const getCustomColors = (\n  elements: readonly ExcalidrawElement[],\n  type: \"elementBackground\" | \"elementStroke\",\n) => {\n  const customColors: string[] = [];\n  const updatedElements = elements\n    .filter((element) => !element.isDeleted)\n    .sort((ele1, ele2) => ele2.updated - ele1.updated);\n\n  let index = 0;\n  const elementColorTypeMap = {\n    elementBackground: \"backgroundColor\",\n    elementStroke: \"strokeColor\",\n  };\n  const colorType = elementColorTypeMap[type] as\n    | \"backgroundColor\"\n    | \"strokeColor\";\n  while (\n    index < updatedElements.length &&\n    customColors.length < MAX_CUSTOM_COLORS\n  ) {\n    const element = updatedElements[index];\n\n    if (\n      customColors.length < MAX_CUSTOM_COLORS &&\n      isCustomColor(element[colorType], type) &&\n      !customColors.includes(element[colorType])\n    ) {\n      customColors.push(element[colorType]);\n    }\n    index++;\n  }\n  return customColors;\n};\n\nconst isCustomColor = (\n  color: string,\n  type: \"elementBackground\" | \"elementStroke\",\n) => {\n  return !colors[type].includes(color);\n};\n\nconst isValidColor = (color: string) => {\n  const style = new Option().style;\n  style.color = color;\n  return !!style.color;\n};\n\nconst getColor = (color: string): string | null => {\n  if (isTransparent(color)) {\n    return color;\n  }\n\n  // testing for `#` first fixes a bug on Electron (more specfically, an\n  // Obsidian popout window), where a hex color without `#` is (incorrectly)\n  // considered valid\n  return isValidColor(`#${color}`)\n    ? `#${color}`\n    : isValidColor(color)\n    ? color\n    : null;\n};\n\n// This is a narrow reimplementation of the awesome react-color Twitter component\n// https://github.com/casesandberg/react-color/blob/master/src/components/twitter/Twitter.js\n\n// Unfortunately, we can't detect keyboard layout in the browser. So this will\n// only work well for QWERTY but not AZERTY or others...\nconst keyBindings = [\n  [\"1\", \"2\", \"3\", \"4\", \"5\"],\n  [\"q\", \"w\", \"e\", \"r\", \"t\"],\n  [\"a\", \"s\", \"d\", \"f\", \"g\"],\n  [\"z\", \"x\", \"c\", \"v\", \"b\"],\n].flat();\n\nconst Picker = ({\n  colors,\n  color,\n  onChange,\n  onClose,\n  label,\n  showInput = true,\n  type,\n  elements,\n}: {\n  colors: string[];\n  color: string | null;\n  onChange: (color: string) => void;\n  onClose: () => void;\n  label: string;\n  showInput: boolean;\n  type: \"canvasBackground\" | \"elementBackground\" | \"elementStroke\";\n  elements: readonly ExcalidrawElement[];\n}) => {\n  const firstItem = React.useRef<HTMLButtonElement>();\n  const activeItem = React.useRef<HTMLButtonElement>();\n  const gallery = React.useRef<HTMLDivElement>();\n  const colorInput = React.useRef<HTMLInputElement>();\n\n  const [customColors] = React.useState(() => {\n    if (type === \"canvasBackground\") {\n      return [];\n    }\n    return getCustomColors(elements, type);\n  });\n\n  React.useEffect(() => {\n    // After the component is first mounted focus on first input\n    if (activeItem.current) {\n      activeItem.current.focus();\n    } else if (colorInput.current) {\n      colorInput.current.focus();\n    } else if (gallery.current) {\n      gallery.current.focus();\n    }\n  }, []);\n\n  const handleKeyDown = (event: React.KeyboardEvent) => {\n    let handled = false;\n    if (isArrowKey(event.key)) {\n      handled = true;\n      const { activeElement } = document;\n      const isRTL = getLanguage().rtl;\n      let isCustom = false;\n      let index = Array.prototype.indexOf.call(\n        gallery.current!.querySelector(\".color-picker-content--default\")\n          ?.children,\n        activeElement,\n      );\n      if (index === -1) {\n        index = Array.prototype.indexOf.call(\n          gallery.current!.querySelector(\".color-picker-content--canvas-colors\")\n            ?.children,\n          activeElement,\n        );\n        if (index !== -1) {\n          isCustom = true;\n        }\n      }\n      const parentElement = isCustom\n        ? gallery.current?.querySelector(\".color-picker-content--canvas-colors\")\n        : gallery.current?.querySelector(\".color-picker-content--default\");\n\n      if (parentElement && index !== -1) {\n        const length = parentElement.children.length - (showInput ? 1 : 0);\n        const nextIndex =\n          event.key === (isRTL ? KEYS.ARROW_LEFT : KEYS.ARROW_RIGHT)\n            ? (index + 1) % length\n            : event.key === (isRTL ? KEYS.ARROW_RIGHT : KEYS.ARROW_LEFT)\n            ? (length + index - 1) % length\n            : !isCustom && event.key === KEYS.ARROW_DOWN\n            ? (index + 5) % length\n            : !isCustom && event.key === KEYS.ARROW_UP\n            ? (length + index - 5) % length\n            : index;\n        (parentElement.children[nextIndex] as HTMLElement | undefined)?.focus();\n      }\n      event.preventDefault();\n    } else if (\n      keyBindings.includes(event.key.toLowerCase()) &&\n      !event[KEYS.CTRL_OR_CMD] &&\n      !event.altKey &&\n      !isWritableElement(event.target)\n    ) {\n      handled = true;\n      const index = keyBindings.indexOf(event.key.toLowerCase());\n      const isCustom = index >= MAX_DEFAULT_COLORS;\n      const parentElement = isCustom\n        ? gallery?.current?.querySelector(\n            \".color-picker-content--canvas-colors\",\n          )\n        : gallery?.current?.querySelector(\".color-picker-content--default\");\n      const actualIndex = isCustom ? index - MAX_DEFAULT_COLORS : index;\n      (\n        parentElement?.children[actualIndex] as HTMLElement | undefined\n      )?.focus();\n\n      event.preventDefault();\n    } else if (event.key === KEYS.ESCAPE || event.key === KEYS.ENTER) {\n      handled = true;\n      event.preventDefault();\n      onClose();\n    }\n    if (handled) {\n      event.nativeEvent.stopImmediatePropagation();\n      event.stopPropagation();\n    }\n  };\n\n  const renderColors = (colors: Array<string>, custom: boolean = false) => {\n    return colors.map((_color, i) => {\n      const _colorWithoutHash = _color.replace(\"#\", \"\");\n      const keyBinding = custom\n        ? keyBindings[i + MAX_DEFAULT_COLORS]\n        : keyBindings[i];\n      const label = custom\n        ? _colorWithoutHash\n        : t(`colors.${_colorWithoutHash}`);\n      return (\n        <button\n          className=\"color-picker-swatch\"\n          onClick={(event) => {\n            (event.currentTarget as HTMLButtonElement).focus();\n            onChange(_color);\n          }}\n          title={`${label}${\n            !isTransparent(_color) ? ` (${_color})` : \"\"\n          } — ${keyBinding.toUpperCase()}`}\n          aria-label={label}\n          aria-keyshortcuts={keyBindings[i]}\n          style={{ color: _color }}\n          key={_color}\n          ref={(el) => {\n            if (!custom && el && i === 0) {\n              firstItem.current = el;\n            }\n            if (el && _color === color) {\n              activeItem.current = el;\n            }\n          }}\n          onFocus={() => {\n            onChange(_color);\n          }}\n        >\n          {isTransparent(_color) ? (\n            <div className=\"color-picker-transparent\"></div>\n          ) : undefined}\n          <span className=\"color-picker-keybinding\">{keyBinding}</span>\n        </button>\n      );\n    });\n  };\n\n  return (\n    <div\n      className={`color-picker color-picker-type-${type}`}\n      role=\"dialog\"\n      aria-modal=\"true\"\n      aria-label={t(\"labels.colorPicker\")}\n      onKeyDown={handleKeyDown}\n    >\n      <div className=\"color-picker-triangle color-picker-triangle-shadow\"></div>\n      <div className=\"color-picker-triangle\"></div>\n      <div\n        className=\"color-picker-content\"\n        ref={(el) => {\n          if (el) {\n            gallery.current = el;\n          }\n        }}\n        // to allow focusing by clicking but not by tabbing\n        tabIndex={-1}\n      >\n        <div className=\"color-picker-content--default\">\n          {renderColors(colors)}\n        </div>\n        {!!customColors.length && (\n          <div className=\"color-picker-content--canvas\">\n            <span className=\"color-picker-content--canvas-title\">\n              {t(\"labels.canvasColors\")}\n            </span>\n            <div className=\"color-picker-content--canvas-colors\">\n              {renderColors(customColors, true)}\n            </div>\n          </div>\n        )}\n\n        {showInput && (\n          <ColorInput\n            color={color}\n            label={label}\n            onChange={(color) => {\n              onChange(color);\n            }}\n            ref={colorInput}\n          />\n        )}\n      </div>\n    </div>\n  );\n};\n\nconst ColorInput = React.forwardRef(\n  (\n    {\n      color,\n      onChange,\n      label,\n    }: {\n      color: string | null;\n      onChange: (color: string) => void;\n      label: string;\n    },\n    ref,\n  ) => {\n    const [innerValue, setInnerValue] = React.useState(color);\n    const inputRef = React.useRef(null);\n\n    React.useEffect(() => {\n      setInnerValue(color);\n    }, [color]);\n\n    React.useImperativeHandle(ref, () => inputRef.current);\n\n    const changeColor = React.useCallback(\n      (inputValue: string) => {\n        const value = inputValue.toLowerCase();\n        const color = getColor(value);\n        if (color) {\n          onChange(color);\n        }\n        setInnerValue(value);\n      },\n      [onChange],\n    );\n\n    return (\n      <label className=\"color-input-container\">\n        <div className=\"color-picker-hash\">#</div>\n        <input\n          spellCheck={false}\n          className=\"color-picker-input\"\n          aria-label={label}\n          onChange={(event) => changeColor(event.target.value)}\n          value={(innerValue || \"\").replace(/^#/, \"\")}\n          onBlur={() => setInnerValue(color)}\n          ref={inputRef}\n        />\n      </label>\n    );\n  },\n);\n\nColorInput.displayName = \"ColorInput\";\n\nexport const ColorPicker = ({\n  type,\n  color,\n  onChange,\n  label,\n  isActive,\n  setActive,\n  elements,\n  appState,\n}: {\n  type: \"canvasBackground\" | \"elementBackground\" | \"elementStroke\";\n  color: string | null;\n  onChange: (color: string) => void;\n  label: string;\n  isActive: boolean;\n  setActive: (active: boolean) => void;\n  elements: readonly ExcalidrawElement[];\n  appState: AppState;\n}) => {\n  const pickerButton = React.useRef<HTMLButtonElement>(null);\n  const coords = pickerButton.current?.getBoundingClientRect();\n\n  return (\n    <div>\n      <div className=\"color-picker-control-container\">\n        <div className=\"color-picker-label-swatch-container\">\n          <button\n            className=\"color-picker-label-swatch\"\n            aria-label={label}\n            style={color ? { \"--swatch-color\": color } : undefined}\n            onClick={() => setActive(!isActive)}\n            ref={pickerButton}\n          />\n        </div>\n        <ColorInput\n          color={color}\n          label={label}\n          onChange={(color) => {\n            onChange(color);\n          }}\n        />\n      </div>\n      <React.Suspense fallback=\"\">\n        {isActive ? (\n          <div\n            className=\"color-picker-popover-container\"\n            style={{\n              position: \"fixed\",\n              top: coords?.top,\n              left: coords?.right,\n              zIndex: 1,\n            }}\n          >\n            <Popover\n              onCloseRequest={(event) =>\n                event.target !== pickerButton.current && setActive(false)\n              }\n            >\n              <Picker\n                colors={colors[type]}\n                color={color || null}\n                onChange={(changedColor) => {\n                  onChange(changedColor);\n                }}\n                onClose={() => {\n                  setActive(false);\n                  pickerButton.current?.focus();\n                }}\n                label={label}\n                showInput={false}\n                type={type}\n                elements={elements}\n              />\n            </Popover>\n          </div>\n        ) : null}\n      </React.Suspense>\n    </div>\n  );\n};\n","import { t } from \"../i18n\";\nimport { Dialog, DialogProps } from \"./Dialog\";\n\nimport \"./ConfirmDialog.scss\";\nimport DialogActionButton from \"./DialogActionButton\";\nimport { useSetAtom } from \"jotai\";\nimport { isLibraryMenuOpenAtom } from \"./LibraryMenuHeaderContent\";\nimport { useExcalidrawSetAppState } from \"./App\";\nimport { jotaiScope } from \"../jotai\";\n\ninterface Props extends Omit<DialogProps, \"onCloseRequest\"> {\n  onConfirm: () => void;\n  onCancel: () => void;\n  confirmText?: string;\n  cancelText?: string;\n}\nconst ConfirmDialog = (props: Props) => {\n  const {\n    onConfirm,\n    onCancel,\n    children,\n    confirmText = t(\"buttons.confirm\"),\n    cancelText = t(\"buttons.cancel\"),\n    className = \"\",\n    ...rest\n  } = props;\n  const setAppState = useExcalidrawSetAppState();\n  const setIsLibraryMenuOpen = useSetAtom(isLibraryMenuOpenAtom, jotaiScope);\n\n  return (\n    <Dialog\n      onCloseRequest={onCancel}\n      small={true}\n      {...rest}\n      className={`confirm-dialog ${className}`}\n    >\n      {children}\n      <div className=\"confirm-dialog-buttons\">\n        <DialogActionButton\n          label={cancelText}\n          onClick={() => {\n            setAppState({ openMenu: null });\n            setIsLibraryMenuOpen(false);\n            onCancel();\n          }}\n        />\n        <DialogActionButton\n          label={confirmText}\n          onClick={() => {\n            setAppState({ openMenu: null });\n            setIsLibraryMenuOpen(false);\n            onConfirm();\n          }}\n          actionType=\"danger\"\n        />\n      </div>\n    </Dialog>\n  );\n};\nexport default ConfirmDialog;\n","import \"./Modal.scss\";\n\nimport React, { useState, useLayoutEffect, useRef } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport clsx from \"clsx\";\nimport { KEYS } from \"../keys\";\nimport { useExcalidrawContainer, useDevice } from \"./App\";\nimport { AppState } from \"../types\";\nimport { THEME } from \"../constants\";\n\nexport const Modal: React.FC<{\n  className?: string;\n  children: React.ReactNode;\n  maxWidth?: number;\n  onCloseRequest(): void;\n  labelledBy: string;\n  theme?: AppState[\"theme\"];\n  closeOnClickOutside?: boolean;\n}> = (props) => {\n  const { theme = THEME.LIGHT, closeOnClickOutside = true } = props;\n  const modalRoot = useBodyRoot(theme);\n\n  if (!modalRoot) {\n    return null;\n  }\n\n  const handleKeydown = (event: React.KeyboardEvent) => {\n    if (event.key === KEYS.ESCAPE) {\n      event.nativeEvent.stopImmediatePropagation();\n      event.stopPropagation();\n      props.onCloseRequest();\n    }\n  };\n\n  return createPortal(\n    <div\n      className={clsx(\"Modal\", props.className)}\n      role=\"dialog\"\n      aria-modal=\"true\"\n      onKeyDown={handleKeydown}\n      aria-labelledby={props.labelledBy}\n      data-prevent-outside-click\n    >\n      <div\n        className=\"Modal__background\"\n        onClick={closeOnClickOutside ? props.onCloseRequest : undefined}\n      ></div>\n      <div\n        className=\"Modal__content\"\n        style={{ \"--max-width\": `${props.maxWidth}px` }}\n        tabIndex={0}\n      >\n        {props.children}\n      </div>\n    </div>,\n    modalRoot,\n  );\n};\n\nconst useBodyRoot = (theme: AppState[\"theme\"]) => {\n  const [div, setDiv] = useState<HTMLDivElement | null>(null);\n\n  const device = useDevice();\n  const isMobileRef = useRef(device.isMobile);\n  isMobileRef.current = device.isMobile;\n\n  const { container: excalidrawContainer } = useExcalidrawContainer();\n\n  useLayoutEffect(() => {\n    if (div) {\n      div.classList.toggle(\"excalidraw--mobile\", device.isMobile);\n    }\n  }, [div, device.isMobile]);\n\n  useLayoutEffect(() => {\n    const isDarkTheme =\n      !!excalidrawContainer?.classList.contains(\"theme--dark\") ||\n      theme === \"dark\";\n    const div = document.createElement(\"div\");\n\n    div.classList.add(\"excalidraw\", \"excalidraw-modal-container\");\n    div.classList.toggle(\"excalidraw--mobile\", isMobileRef.current);\n\n    if (isDarkTheme) {\n      div.classList.add(\"theme--dark\");\n      div.classList.add(\"theme--dark-background-none\");\n    }\n    document.body.appendChild(div);\n\n    setDiv(div);\n\n    return () => {\n      document.body.removeChild(div);\n    };\n  }, [excalidrawContainer, theme]);\n\n  return div;\n};\n","import clsx from \"clsx\";\nimport React, { useEffect, useState } from \"react\";\nimport { useCallbackRefState } from \"../hooks/useCallbackRefState\";\nimport { t } from \"../i18n\";\nimport {\n  useExcalidrawContainer,\n  useDevice,\n  useExcalidrawSetAppState,\n} from \"../components/App\";\nimport { KEYS } from \"../keys\";\nimport \"./Dialog.scss\";\nimport { back, CloseIcon } from \"./icons\";\nimport { Island } from \"./Island\";\nimport { Modal } from \"./Modal\";\nimport { AppState } from \"../types\";\nimport { queryFocusableElements } from \"../utils\";\nimport { useSetAtom } from \"jotai\";\nimport { isLibraryMenuOpenAtom } from \"./LibraryMenuHeaderContent\";\nimport { jotaiScope } from \"../jotai\";\n\nexport interface DialogProps {\n  children: React.ReactNode;\n  className?: string;\n  small?: boolean;\n  onCloseRequest(): void;\n  title: React.ReactNode;\n  autofocus?: boolean;\n  theme?: AppState[\"theme\"];\n  closeOnClickOutside?: boolean;\n}\n\nexport const Dialog = (props: DialogProps) => {\n  const [islandNode, setIslandNode] = useCallbackRefState<HTMLDivElement>();\n  const [lastActiveElement] = useState(document.activeElement);\n  const { id } = useExcalidrawContainer();\n\n  useEffect(() => {\n    if (!islandNode) {\n      return;\n    }\n\n    const focusableElements = queryFocusableElements(islandNode);\n\n    if (focusableElements.length > 0 && props.autofocus !== false) {\n      // If there's an element other than close, focus it.\n      (focusableElements[1] || focusableElements[0]).focus();\n    }\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === KEYS.TAB) {\n        const focusableElements = queryFocusableElements(islandNode);\n        const { activeElement } = document;\n        const currentIndex = focusableElements.findIndex(\n          (element) => element === activeElement,\n        );\n\n        if (currentIndex === 0 && event.shiftKey) {\n          focusableElements[focusableElements.length - 1].focus();\n          event.preventDefault();\n        } else if (\n          currentIndex === focusableElements.length - 1 &&\n          !event.shiftKey\n        ) {\n          focusableElements[0].focus();\n          event.preventDefault();\n        }\n      }\n    };\n\n    islandNode.addEventListener(\"keydown\", handleKeyDown);\n\n    return () => islandNode.removeEventListener(\"keydown\", handleKeyDown);\n  }, [islandNode, props.autofocus]);\n\n  const setAppState = useExcalidrawSetAppState();\n  const setIsLibraryMenuOpen = useSetAtom(isLibraryMenuOpenAtom, jotaiScope);\n\n  const onClose = () => {\n    setAppState({ openMenu: null });\n    setIsLibraryMenuOpen(false);\n    (lastActiveElement as HTMLElement).focus();\n    props.onCloseRequest();\n  };\n\n  return (\n    <Modal\n      className={clsx(\"Dialog\", props.className)}\n      labelledBy=\"dialog-title\"\n      maxWidth={props.small ? 550 : 800}\n      onCloseRequest={onClose}\n      theme={props.theme}\n      closeOnClickOutside={props.closeOnClickOutside}\n    >\n      <Island ref={setIslandNode}>\n        <h2 id={`${id}-dialog-title`} className=\"Dialog__title\">\n          <span className=\"Dialog__titleContent\">{props.title}</span>\n          <button\n            className=\"Modal__close\"\n            onClick={onClose}\n            title={t(\"buttons.close\")}\n            aria-label={t(\"buttons.close\")}\n          >\n            {useDevice().isMobile ? back : CloseIcon}\n          </button>\n        </h2>\n        <div className=\"Dialog__content\">{props.children}</div>\n      </Island>\n    </Modal>\n  );\n};\n","import clsx from \"clsx\";\nimport { ReactNode } from \"react\";\nimport \"./DialogActionButton.scss\";\nimport Spinner from \"./Spinner\";\n\ninterface DialogActionButtonProps {\n  label: string;\n  children?: ReactNode;\n  actionType?: \"primary\" | \"danger\";\n  isLoading?: boolean;\n}\n\nconst DialogActionButton = ({\n  label,\n  onClick,\n  className,\n  children,\n  actionType,\n  type = \"button\",\n  isLoading,\n  ...rest\n}: DialogActionButtonProps & React.ButtonHTMLAttributes<HTMLButtonElement>) => {\n  const cs = actionType ? `Dialog__action-button--${actionType}` : \"\";\n\n  return (\n    <button\n      className={clsx(\"Dialog__action-button\", cs, className)}\n      type={type}\n      aria-label={label}\n      onClick={onClick}\n      {...rest}\n    >\n      {children && (\n        <div style={isLoading ? { visibility: \"hidden\" } : {}}>{children}</div>\n      )}\n      <div style={isLoading ? { visibility: \"hidden\" } : {}}>{label}</div>\n      {isLoading && (\n        <div style={{ position: \"absolute\", inset: 0 }}>\n          <Spinner />\n        </div>\n      )}\n    </button>\n  );\n};\n\nexport default DialogActionButton;\n","import React, { useState } from \"react\";\nimport { t } from \"../i18n\";\n\nimport { Dialog } from \"./Dialog\";\nimport { useExcalidrawContainer } from \"./App\";\n\nexport const ErrorDialog = ({\n  message,\n  onClose,\n}: {\n  message: string;\n  onClose?: () => void;\n}) => {\n  const [modalIsShown, setModalIsShown] = useState(!!message);\n  const { container: excalidrawContainer } = useExcalidrawContainer();\n\n  const handleClose = React.useCallback(() => {\n    setModalIsShown(false);\n\n    if (onClose) {\n      onClose();\n    }\n    // TODO: Fix the A11y issues so this is never needed since we should always focus on last active element\n    excalidrawContainer?.focus();\n  }, [onClose, excalidrawContainer]);\n\n  return (\n    <>\n      {modalIsShown && (\n        <Dialog\n          small\n          onCloseRequest={handleClose}\n          title={t(\"errorDialog.title\")}\n        >\n          <div style={{ whiteSpace: \"pre-wrap\" }}>{message}</div>\n        </Dialog>\n      )}\n    </>\n  );\n};\n","import \"./Island.scss\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\n\ntype IslandProps = {\n  children: React.ReactNode;\n  padding?: number;\n  className?: string | boolean;\n  style?: object;\n};\n\nexport const Island = React.forwardRef<HTMLDivElement, IslandProps>(\n  ({ children, padding, className, style }, ref) => (\n    <div\n      className={clsx(\"Island\", className)}\n      style={{ \"--padding\": padding, ...style }}\n      ref={ref}\n    >\n      {children}\n    </div>\n  ),\n);\n","import oc from \"open-color\";\nimport { useEffect, useRef } from \"react\";\nimport { t } from \"../i18n\";\nimport { exportToSvg } from \"../packages/utils\";\nimport { AppState, LibraryItem } from \"../types\";\nimport { CloseIcon } from \"./icons\";\n\nimport \"./SingleLibraryItem.scss\";\nimport { ToolButton } from \"./ToolButton\";\n\nconst SingleLibraryItem = ({\n  libItem,\n  appState,\n  index,\n  onChange,\n  onRemove,\n}: {\n  libItem: LibraryItem;\n  appState: AppState;\n  index: number;\n  onChange: (val: string, index: number) => void;\n  onRemove: (id: string) => void;\n}) => {\n  const svgRef = useRef<HTMLDivElement | null>(null);\n  const inputRef = useRef<HTMLInputElement | null>(null);\n\n  useEffect(() => {\n    const node = svgRef.current;\n    if (!node) {\n      return;\n    }\n    (async () => {\n      const svg = await exportToSvg({\n        elements: libItem.elements,\n        appState: {\n          ...appState,\n          viewBackgroundColor: oc.white,\n          exportBackground: true,\n        },\n        files: null,\n      });\n      node.innerHTML = svg.outerHTML;\n    })();\n  }, [libItem.elements, appState]);\n\n  return (\n    <div className=\"single-library-item\">\n      {libItem.status === \"published\" && (\n        <span className=\"single-library-item-status\">\n          {t(\"labels.statusPublished\")}\n        </span>\n      )}\n      <div ref={svgRef} className=\"single-library-item__svg\" />\n      <ToolButton\n        aria-label={t(\"buttons.remove\")}\n        type=\"button\"\n        icon={CloseIcon}\n        className=\"single-library-item--remove\"\n        onClick={onRemove.bind(null, libItem.id)}\n        title={t(\"buttons.remove\")}\n      />\n      <div\n        style={{\n          display: \"flex\",\n          margin: \"0.8rem 0\",\n          width: \"100%\",\n          fontSize: \"14px\",\n          fontWeight: 500,\n          flexDirection: \"column\",\n        }}\n      >\n        <label\n          style={{\n            display: \"flex\",\n            justifyContent: \"space-between\",\n            flexDirection: \"column\",\n          }}\n        >\n          <div style={{ padding: \"0.5em 0\" }}>\n            <span style={{ fontWeight: 500, color: oc.gray[6] }}>\n              {t(\"publishDialog.itemName\")}\n            </span>\n            <span aria-hidden=\"true\" className=\"required\">\n              *\n            </span>\n          </div>\n          <input\n            type=\"text\"\n            ref={inputRef}\n            style={{ width: \"80%\", padding: \"0.2rem\" }}\n            defaultValue={libItem.name}\n            placeholder=\"Item name\"\n            onChange={(event) => {\n              onChange(event.target.value, index);\n            }}\n          />\n        </label>\n        <span className=\"error\">{libItem.error}</span>\n      </div>\n    </div>\n  );\n};\n\nexport default SingleLibraryItem;\n","import { ReactNode, useCallback, useEffect, useState } from \"react\";\nimport OpenColor from \"open-color\";\n\nimport { Dialog } from \"./Dialog\";\nimport { t } from \"../i18n\";\n\nimport { AppState, LibraryItems, LibraryItem } from \"../types\";\nimport { exportToCanvas } from \"../packages/utils\";\nimport {\n  EXPORT_DATA_TYPES,\n  EXPORT_SOURCE,\n  MIME_TYPES,\n  VERSIONS,\n} from \"../constants\";\nimport { ExportedLibraryData } from \"../data/types\";\n\nimport \"./PublishLibrary.scss\";\nimport SingleLibraryItem from \"./SingleLibraryItem\";\nimport { canvasToBlob, resizeImageFile } from \"../data/blob\";\nimport { chunk } from \"../utils\";\nimport DialogActionButton from \"./DialogActionButton\";\n\ninterface PublishLibraryDataParams {\n  authorName: string;\n  githubHandle: string;\n  name: string;\n  description: string;\n  twitterHandle: string;\n  website: string;\n}\n\nconst LOCAL_STORAGE_KEY_PUBLISH_LIBRARY = \"publish-library-data\";\n\nconst savePublishLibDataToStorage = (data: PublishLibraryDataParams) => {\n  try {\n    localStorage.setItem(\n      LOCAL_STORAGE_KEY_PUBLISH_LIBRARY,\n      JSON.stringify(data),\n    );\n  } catch (error: any) {\n    // Unable to access window.localStorage\n    console.error(error);\n  }\n};\n\nconst importPublishLibDataFromStorage = () => {\n  try {\n    const data = localStorage.getItem(LOCAL_STORAGE_KEY_PUBLISH_LIBRARY);\n    if (data) {\n      return JSON.parse(data);\n    }\n  } catch (error: any) {\n    // Unable to access localStorage\n    console.error(error);\n  }\n\n  return null;\n};\n\nconst generatePreviewImage = async (libraryItems: LibraryItems) => {\n  const MAX_ITEMS_PER_ROW = 6;\n  const BOX_SIZE = 128;\n  const BOX_PADDING = Math.round(BOX_SIZE / 16);\n  const BORDER_WIDTH = Math.max(Math.round(BOX_SIZE / 64), 2);\n\n  const rows = chunk(libraryItems, MAX_ITEMS_PER_ROW);\n\n  const canvas = document.createElement(\"canvas\");\n\n  canvas.width =\n    rows[0].length * BOX_SIZE +\n    (rows[0].length + 1) * (BOX_PADDING * 2) -\n    BOX_PADDING * 2;\n  canvas.height =\n    rows.length * BOX_SIZE +\n    (rows.length + 1) * (BOX_PADDING * 2) -\n    BOX_PADDING * 2;\n\n  const ctx = canvas.getContext(\"2d\")!;\n\n  ctx.fillStyle = OpenColor.white;\n  ctx.fillRect(0, 0, canvas.width, canvas.height);\n\n  // draw items\n  // ---------------------------------------------------------------------------\n  for (const [index, item] of libraryItems.entries()) {\n    const itemCanvas = await exportToCanvas({\n      elements: item.elements,\n      files: null,\n      maxWidthOrHeight: BOX_SIZE,\n    });\n\n    const { width, height } = itemCanvas;\n\n    // draw item\n    // -------------------------------------------------------------------------\n    const rowOffset =\n      Math.floor(index / MAX_ITEMS_PER_ROW) * (BOX_SIZE + BOX_PADDING * 2);\n    const colOffset =\n      (index % MAX_ITEMS_PER_ROW) * (BOX_SIZE + BOX_PADDING * 2);\n\n    ctx.drawImage(\n      itemCanvas,\n      colOffset + (BOX_SIZE - width) / 2 + BOX_PADDING,\n      rowOffset + (BOX_SIZE - height) / 2 + BOX_PADDING,\n    );\n\n    // draw item border\n    // -------------------------------------------------------------------------\n    ctx.lineWidth = BORDER_WIDTH;\n    ctx.strokeStyle = OpenColor.gray[4];\n    ctx.strokeRect(\n      colOffset + BOX_PADDING / 2,\n      rowOffset + BOX_PADDING / 2,\n      BOX_SIZE + BOX_PADDING,\n      BOX_SIZE + BOX_PADDING,\n    );\n  }\n\n  return await resizeImageFile(\n    new File([await canvasToBlob(canvas)], \"preview\", { type: MIME_TYPES.png }),\n    {\n      outputType: MIME_TYPES.jpg,\n      maxWidthOrHeight: 5000,\n    },\n  );\n};\n\nconst PublishLibrary = ({\n  onClose,\n  libraryItems,\n  appState,\n  onSuccess,\n  onError,\n  updateItemsInStorage,\n  onRemove,\n}: {\n  onClose: () => void;\n  libraryItems: LibraryItems;\n  appState: AppState;\n  onSuccess: (data: {\n    url: string;\n    authorName: string;\n    items: LibraryItems;\n  }) => void;\n\n  onError: (error: Error) => void;\n  updateItemsInStorage: (items: LibraryItems) => void;\n  onRemove: (id: string) => void;\n}) => {\n  const [libraryData, setLibraryData] = useState<PublishLibraryDataParams>({\n    authorName: \"\",\n    githubHandle: \"\",\n    name: \"\",\n    description: \"\",\n    twitterHandle: \"\",\n    website: \"\",\n  });\n\n  const [isSubmitting, setIsSubmitting] = useState(false);\n\n  useEffect(() => {\n    const data = importPublishLibDataFromStorage();\n    if (data) {\n      setLibraryData(data);\n    }\n  }, []);\n\n  const [clonedLibItems, setClonedLibItems] = useState<LibraryItems>(\n    libraryItems.slice(),\n  );\n\n  useEffect(() => {\n    setClonedLibItems(libraryItems.slice());\n  }, [libraryItems]);\n\n  const onInputChange = (event: any) => {\n    setLibraryData({\n      ...libraryData,\n      [event.target.name]: event.target.value,\n    });\n  };\n\n  const onSubmit = async (event: React.FormEvent<HTMLFormElement>) => {\n    event.preventDefault();\n    setIsSubmitting(true);\n    const erroredLibItems: LibraryItem[] = [];\n    let isError = false;\n    clonedLibItems.forEach((libItem) => {\n      let error = \"\";\n      if (!libItem.name) {\n        error = t(\"publishDialog.errors.required\");\n        isError = true;\n      }\n      erroredLibItems.push({ ...libItem, error });\n    });\n\n    if (isError) {\n      setClonedLibItems(erroredLibItems);\n      setIsSubmitting(false);\n      return;\n    }\n\n    const previewImage = await generatePreviewImage(clonedLibItems);\n\n    const libContent: ExportedLibraryData = {\n      type: EXPORT_DATA_TYPES.excalidrawLibrary,\n      version: VERSIONS.excalidrawLibrary,\n      source: EXPORT_SOURCE,\n      libraryItems: clonedLibItems,\n    };\n    const content = JSON.stringify(libContent, null, 2);\n    const lib = new Blob([content], { type: \"application/json\" });\n\n    const formData = new FormData();\n    formData.append(\"excalidrawLib\", lib);\n    formData.append(\"previewImage\", previewImage);\n    formData.append(\"previewImageType\", previewImage.type);\n    formData.append(\"title\", libraryData.name);\n    formData.append(\"authorName\", libraryData.authorName);\n    formData.append(\"githubHandle\", libraryData.githubHandle);\n    formData.append(\"name\", libraryData.name);\n    formData.append(\"description\", libraryData.description);\n    formData.append(\"twitterHandle\", libraryData.twitterHandle);\n    formData.append(\"website\", libraryData.website);\n\n    fetch(`${process.env.REACT_APP_LIBRARY_BACKEND}/submit`, {\n      method: \"post\",\n      body: formData,\n    })\n      .then(\n        (response) => {\n          if (response.ok) {\n            return response.json().then(({ url }) => {\n              // flush data from local storage\n              localStorage.removeItem(LOCAL_STORAGE_KEY_PUBLISH_LIBRARY);\n              onSuccess({\n                url,\n                authorName: libraryData.authorName,\n                items: clonedLibItems,\n              });\n            });\n          }\n          return response\n            .json()\n            .catch(() => {\n              throw new Error(response.statusText || \"something went wrong\");\n            })\n            .then((error) => {\n              throw new Error(\n                error.message || response.statusText || \"something went wrong\",\n              );\n            });\n        },\n        (err) => {\n          console.error(err);\n          onError(err);\n          setIsSubmitting(false);\n        },\n      )\n      .catch((err) => {\n        console.error(err);\n        onError(err);\n        setIsSubmitting(false);\n      });\n  };\n\n  const renderLibraryItems = () => {\n    const items: ReactNode[] = [];\n    clonedLibItems.forEach((libItem, index) => {\n      items.push(\n        <div className=\"single-library-item-wrapper\" key={index}>\n          <SingleLibraryItem\n            libItem={libItem}\n            appState={appState}\n            index={index}\n            onChange={(val, index) => {\n              const items = clonedLibItems.slice();\n              items[index].name = val;\n              setClonedLibItems(items);\n            }}\n            onRemove={onRemove}\n          />\n        </div>,\n      );\n    });\n    return <div className=\"selected-library-items\">{items}</div>;\n  };\n\n  const onDialogClose = useCallback(() => {\n    updateItemsInStorage(clonedLibItems);\n    savePublishLibDataToStorage(libraryData);\n    onClose();\n  }, [clonedLibItems, onClose, updateItemsInStorage, libraryData]);\n\n  const shouldRenderForm = !!libraryItems.length;\n\n  const containsPublishedItems = libraryItems.some(\n    (item) => item.status === \"published\",\n  );\n\n  return (\n    <Dialog\n      onCloseRequest={onDialogClose}\n      title={t(\"publishDialog.title\")}\n      className=\"publish-library\"\n    >\n      {shouldRenderForm ? (\n        <form onSubmit={onSubmit}>\n          <div className=\"publish-library-note\">\n            {t(\"publishDialog.noteDescription.pre\")}\n            <a\n              href=\"https://libraries.excalidraw.com\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              {t(\"publishDialog.noteDescription.link\")}\n            </a>{\" \"}\n            {t(\"publishDialog.noteDescription.post\")}\n          </div>\n          <span className=\"publish-library-note\">\n            {t(\"publishDialog.noteGuidelines.pre\")}\n            <a\n              href=\"https://github.com/excalidraw/excalidraw-libraries#guidelines\"\n              target=\"_blank\"\n              rel=\"noopener noreferrer\"\n            >\n              {t(\"publishDialog.noteGuidelines.link\")}\n            </a>\n            {t(\"publishDialog.noteGuidelines.post\")}\n          </span>\n\n          <div className=\"publish-library-note\">\n            {t(\"publishDialog.noteItems\")}\n          </div>\n          {containsPublishedItems && (\n            <span className=\"publish-library-note publish-library-warning\">\n              {t(\"publishDialog.republishWarning\")}\n            </span>\n          )}\n          {renderLibraryItems()}\n          <div className=\"publish-library__fields\">\n            <label>\n              <div>\n                <span>{t(\"publishDialog.libraryName\")}</span>\n                <span aria-hidden=\"true\" className=\"required\">\n                  *\n                </span>\n              </div>\n              <input\n                type=\"text\"\n                name=\"name\"\n                required\n                value={libraryData.name}\n                onChange={onInputChange}\n                placeholder={t(\"publishDialog.placeholder.libraryName\")}\n              />\n            </label>\n            <label style={{ alignItems: \"flex-start\" }}>\n              <div>\n                <span>{t(\"publishDialog.libraryDesc\")}</span>\n                <span aria-hidden=\"true\" className=\"required\">\n                  *\n                </span>\n              </div>\n              <textarea\n                name=\"description\"\n                rows={4}\n                required\n                value={libraryData.description}\n                onChange={onInputChange}\n                placeholder={t(\"publishDialog.placeholder.libraryDesc\")}\n              />\n            </label>\n            <label>\n              <div>\n                <span>{t(\"publishDialog.authorName\")}</span>\n                <span aria-hidden=\"true\" className=\"required\">\n                  *\n                </span>\n              </div>\n              <input\n                type=\"text\"\n                name=\"authorName\"\n                required\n                value={libraryData.authorName}\n                onChange={onInputChange}\n                placeholder={t(\"publishDialog.placeholder.authorName\")}\n              />\n            </label>\n            <label>\n              <span>{t(\"publishDialog.githubUsername\")}</span>\n              <input\n                type=\"text\"\n                name=\"githubHandle\"\n                value={libraryData.githubHandle}\n                onChange={onInputChange}\n                placeholder={t(\"publishDialog.placeholder.githubHandle\")}\n              />\n            </label>\n            <label>\n              <span>{t(\"publishDialog.twitterUsername\")}</span>\n              <input\n                type=\"text\"\n                name=\"twitterHandle\"\n                value={libraryData.twitterHandle}\n                onChange={onInputChange}\n                placeholder={t(\"publishDialog.placeholder.twitterHandle\")}\n              />\n            </label>\n            <label>\n              <span>{t(\"publishDialog.website\")}</span>\n              <input\n                type=\"text\"\n                name=\"website\"\n                pattern=\"https?://.+\"\n                title={t(\"publishDialog.errors.website\")}\n                value={libraryData.website}\n                onChange={onInputChange}\n                placeholder={t(\"publishDialog.placeholder.website\")}\n              />\n            </label>\n            <span className=\"publish-library-note\">\n              {t(\"publishDialog.noteLicense.pre\")}\n              <a\n                href=\"https://github.com/excalidraw/excalidraw-libraries/blob/main/LICENSE\"\n                target=\"_blank\"\n                rel=\"noopener noreferrer\"\n              >\n                {t(\"publishDialog.noteLicense.link\")}\n              </a>\n              {t(\"publishDialog.noteLicense.post\")}\n            </span>\n          </div>\n          <div className=\"publish-library__buttons\">\n            <DialogActionButton\n              label={t(\"buttons.cancel\")}\n              onClick={onDialogClose}\n              data-testid=\"cancel-clear-canvas-button\"\n            />\n            <DialogActionButton\n              type=\"submit\"\n              label={t(\"buttons.submit\")}\n              actionType=\"primary\"\n              isLoading={isSubmitting}\n            />\n          </div>\n        </form>\n      ) : (\n        <p style={{ padding: \"1em\", textAlign: \"center\", fontWeight: 500 }}>\n          {t(\"publishDialog.atleastOneLibItem\")}\n        </p>\n      )}\n    </Dialog>\n  );\n};\n\nexport default PublishLibrary;\n","import React, { useCallback, useState } from \"react\";\nimport { saveLibraryAsJSON } from \"../data/json\";\nimport Library, { libraryItemsAtom } from \"../data/library\";\nimport { t } from \"../i18n\";\nimport { AppState, LibraryItem, LibraryItems } from \"../types\";\nimport {\n  DotsIcon,\n  ExportIcon,\n  LoadIcon,\n  publishIcon,\n  TrashIcon,\n} from \"./icons\";\nimport { ToolButton } from \"./ToolButton\";\nimport { fileOpen } from \"../data/filesystem\";\nimport { muteFSAbortError } from \"../utils\";\nimport { atom, useAtom } from \"jotai\";\nimport { jotaiScope } from \"../jotai\";\nimport ConfirmDialog from \"./ConfirmDialog\";\nimport PublishLibrary from \"./PublishLibrary\";\nimport { Dialog } from \"./Dialog\";\n\nimport DropdownMenu from \"./dropdownMenu/DropdownMenu\";\n\nexport const isLibraryMenuOpenAtom = atom(false);\n\nconst getSelectedItems = (\n  libraryItems: LibraryItems,\n  selectedItems: LibraryItem[\"id\"][],\n) => libraryItems.filter((item) => selectedItems.includes(item.id));\n\nexport const LibraryMenuHeader: React.FC<{\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  selectedItems: LibraryItem[\"id\"][];\n  library: Library;\n  onRemoveFromLibrary: () => void;\n  resetLibrary: () => void;\n  onSelectItems: (items: LibraryItem[\"id\"][]) => void;\n  appState: AppState;\n}> = ({\n  setAppState,\n  selectedItems,\n  library,\n  onRemoveFromLibrary,\n  resetLibrary,\n  onSelectItems,\n  appState,\n}) => {\n  const [libraryItemsData] = useAtom(libraryItemsAtom, jotaiScope);\n  const [isLibraryMenuOpen, setIsLibraryMenuOpen] = useAtom(\n    isLibraryMenuOpenAtom,\n    jotaiScope,\n  );\n  const renderRemoveLibAlert = useCallback(() => {\n    const content = selectedItems.length\n      ? t(\"alerts.removeItemsFromsLibrary\", { count: selectedItems.length })\n      : t(\"alerts.resetLibrary\");\n    const title = selectedItems.length\n      ? t(\"confirmDialog.removeItemsFromLib\")\n      : t(\"confirmDialog.resetLibrary\");\n    return (\n      <ConfirmDialog\n        onConfirm={() => {\n          if (selectedItems.length) {\n            onRemoveFromLibrary();\n          } else {\n            resetLibrary();\n          }\n          setShowRemoveLibAlert(false);\n        }}\n        onCancel={() => {\n          setShowRemoveLibAlert(false);\n        }}\n        title={title}\n      >\n        <p>{content}</p>\n      </ConfirmDialog>\n    );\n  }, [selectedItems, onRemoveFromLibrary, resetLibrary]);\n\n  const [showRemoveLibAlert, setShowRemoveLibAlert] = useState(false);\n\n  const itemsSelected = !!selectedItems.length;\n  const items = itemsSelected\n    ? libraryItemsData.libraryItems.filter((item) =>\n        selectedItems.includes(item.id),\n      )\n    : libraryItemsData.libraryItems;\n  const resetLabel = itemsSelected\n    ? t(\"buttons.remove\")\n    : t(\"buttons.resetLibrary\");\n\n  const [showPublishLibraryDialog, setShowPublishLibraryDialog] =\n    useState(false);\n  const [publishLibSuccess, setPublishLibSuccess] = useState<null | {\n    url: string;\n    authorName: string;\n  }>(null);\n  const renderPublishSuccess = useCallback(() => {\n    return (\n      <Dialog\n        onCloseRequest={() => setPublishLibSuccess(null)}\n        title={t(\"publishSuccessDialog.title\")}\n        className=\"publish-library-success\"\n        small={true}\n      >\n        <p>\n          {t(\"publishSuccessDialog.content\", {\n            authorName: publishLibSuccess!.authorName,\n          })}{\" \"}\n          <a\n            href={publishLibSuccess?.url}\n            target=\"_blank\"\n            rel=\"noopener noreferrer\"\n          >\n            {t(\"publishSuccessDialog.link\")}\n          </a>\n        </p>\n        <ToolButton\n          type=\"button\"\n          title={t(\"buttons.close\")}\n          aria-label={t(\"buttons.close\")}\n          label={t(\"buttons.close\")}\n          onClick={() => setPublishLibSuccess(null)}\n          data-testid=\"publish-library-success-close\"\n          className=\"publish-library-success-close\"\n        />\n      </Dialog>\n    );\n  }, [setPublishLibSuccess, publishLibSuccess]);\n\n  const onPublishLibSuccess = useCallback(\n    (data: { url: string; authorName: string }, libraryItems: LibraryItems) => {\n      setShowPublishLibraryDialog(false);\n      setPublishLibSuccess({ url: data.url, authorName: data.authorName });\n      const nextLibItems = libraryItems.slice();\n      nextLibItems.forEach((libItem) => {\n        if (selectedItems.includes(libItem.id)) {\n          libItem.status = \"published\";\n        }\n      });\n      library.setLibrary(nextLibItems);\n    },\n    [setShowPublishLibraryDialog, setPublishLibSuccess, selectedItems, library],\n  );\n\n  const onLibraryImport = async () => {\n    try {\n      await library.updateLibrary({\n        libraryItems: fileOpen({\n          description: \"Excalidraw library files\",\n          // ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442\n          // gets resolved. Else, iOS users cannot open `.excalidraw` files.\n          /*\n            extensions: [\".json\", \".excalidrawlib\"],\n            */\n        }),\n        merge: true,\n        openLibraryMenu: true,\n      });\n    } catch (error: any) {\n      if (error?.name === \"AbortError\") {\n        console.warn(error);\n        return;\n      }\n      setAppState({ errorMessage: t(\"errors.importLibraryError\") });\n    }\n  };\n\n  const onLibraryExport = async () => {\n    const libraryItems = itemsSelected\n      ? items\n      : await library.getLatestLibrary();\n    saveLibraryAsJSON(libraryItems)\n      .catch(muteFSAbortError)\n      .catch((error) => {\n        setAppState({ errorMessage: error.message });\n      });\n  };\n\n  const renderLibraryMenu = () => {\n    return (\n      <DropdownMenu open={isLibraryMenuOpen}>\n        <DropdownMenu.Trigger\n          className=\"Sidebar__dropdown-btn\"\n          onToggle={() => setIsLibraryMenuOpen(!isLibraryMenuOpen)}\n        >\n          {DotsIcon}\n        </DropdownMenu.Trigger>\n        <DropdownMenu.Content\n          onClickOutside={() => setIsLibraryMenuOpen(false)}\n          onSelect={() => setIsLibraryMenuOpen(false)}\n          className=\"library-menu\"\n        >\n          {!itemsSelected && (\n            <DropdownMenu.Item\n              onSelect={onLibraryImport}\n              icon={LoadIcon}\n              data-testid=\"lib-dropdown--load\"\n            >\n              {t(\"buttons.load\")}\n            </DropdownMenu.Item>\n          )}\n          {!!items.length && (\n            <DropdownMenu.Item\n              onSelect={onLibraryExport}\n              icon={ExportIcon}\n              data-testid=\"lib-dropdown--export\"\n            >\n              {t(\"buttons.export\")}\n            </DropdownMenu.Item>\n          )}\n          {!!items.length && (\n            <DropdownMenu.Item\n              onSelect={() => setShowRemoveLibAlert(true)}\n              icon={TrashIcon}\n            >\n              {resetLabel}\n            </DropdownMenu.Item>\n          )}\n          {itemsSelected && (\n            <DropdownMenu.Item\n              icon={publishIcon}\n              onSelect={() => setShowPublishLibraryDialog(true)}\n              data-testid=\"lib-dropdown--remove\"\n            >\n              {t(\"buttons.publishLibrary\")}\n            </DropdownMenu.Item>\n          )}\n        </DropdownMenu.Content>\n      </DropdownMenu>\n    );\n  };\n  return (\n    <div style={{ position: \"relative\" }}>\n      {renderLibraryMenu()}\n      {selectedItems.length > 0 && (\n        <div className=\"library-actions-counter\">{selectedItems.length}</div>\n      )}\n      {showRemoveLibAlert && renderRemoveLibAlert()}\n      {showPublishLibraryDialog && (\n        <PublishLibrary\n          onClose={() => setShowPublishLibraryDialog(false)}\n          libraryItems={getSelectedItems(\n            libraryItemsData.libraryItems,\n            selectedItems,\n          )}\n          appState={appState}\n          onSuccess={(data) =>\n            onPublishLibSuccess(data, libraryItemsData.libraryItems)\n          }\n          onError={(error) => window.alert(error)}\n          updateItemsInStorage={() =>\n            library.setLibrary(libraryItemsData.libraryItems)\n          }\n          onRemove={(id: string) =>\n            onSelectItems(selectedItems.filter((_id) => _id !== id))\n          }\n        />\n      )}\n      {publishLibSuccess && renderPublishSuccess()}\n    </div>\n  );\n};\n","import { t } from \"../i18n\";\nimport { useState, useEffect } from \"react\";\nimport Spinner from \"./Spinner\";\nimport clsx from \"clsx\";\nimport { THEME } from \"../constants\";\nimport { Theme } from \"../element/types\";\n\nexport const LoadingMessage: React.FC<{ delay?: number; theme?: Theme }> = ({\n  delay,\n  theme,\n}) => {\n  const [isWaiting, setIsWaiting] = useState(!!delay);\n\n  useEffect(() => {\n    if (!delay) {\n      return;\n    }\n    const timer = setTimeout(() => {\n      setIsWaiting(false);\n    }, delay);\n    return () => clearTimeout(timer);\n  }, [delay]);\n\n  if (isWaiting) {\n    return null;\n  }\n\n  return (\n    <div\n      className={clsx(\"LoadingMessage\", {\n        \"LoadingMessage--dark\": theme === THEME.DARK,\n      })}\n    >\n      <div>\n        <Spinner />\n      </div>\n      <div className=\"LoadingMessage-text\">{t(\"labels.loadingScene\")}</div>\n    </div>\n  );\n};\n","import React, { useLayoutEffect, useRef, useEffect } from \"react\";\nimport \"./Popover.scss\";\nimport { unstable_batchedUpdates } from \"react-dom\";\nimport { queryFocusableElements } from \"../utils\";\nimport { KEYS } from \"../keys\";\n\ntype Props = {\n  top?: number;\n  left?: number;\n  children?: React.ReactNode;\n  onCloseRequest?(event: PointerEvent): void;\n  fitInViewport?: boolean;\n  offsetLeft?: number;\n  offsetTop?: number;\n  viewportWidth?: number;\n  viewportHeight?: number;\n};\n\nexport const Popover = ({\n  children,\n  left,\n  top,\n  onCloseRequest,\n  fitInViewport = false,\n  offsetLeft = 0,\n  offsetTop = 0,\n  viewportWidth = window.innerWidth,\n  viewportHeight = window.innerHeight,\n}: Props) => {\n  const popoverRef = useRef<HTMLDivElement>(null);\n\n  const container = popoverRef.current;\n\n  useEffect(() => {\n    if (!container) {\n      return;\n    }\n\n    const handleKeyDown = (event: KeyboardEvent) => {\n      if (event.key === KEYS.TAB) {\n        const focusableElements = queryFocusableElements(container);\n        const { activeElement } = document;\n        const currentIndex = focusableElements.findIndex(\n          (element) => element === activeElement,\n        );\n\n        if (currentIndex === 0 && event.shiftKey) {\n          focusableElements[focusableElements.length - 1].focus();\n          event.preventDefault();\n          event.stopImmediatePropagation();\n        } else if (\n          currentIndex === focusableElements.length - 1 &&\n          !event.shiftKey\n        ) {\n          focusableElements[0].focus();\n          event.preventDefault();\n          event.stopImmediatePropagation();\n        }\n      }\n    };\n\n    container.addEventListener(\"keydown\", handleKeyDown);\n\n    return () => container.removeEventListener(\"keydown\", handleKeyDown);\n  }, [container]);\n\n  // ensure the popover doesn't overflow the viewport\n  useLayoutEffect(() => {\n    if (fitInViewport && popoverRef.current) {\n      const element = popoverRef.current;\n      const { x, y, width, height } = element.getBoundingClientRect();\n\n      //Position correctly when clicked on rightmost part or the bottom part of viewport\n      if (x + width - offsetLeft > viewportWidth) {\n        element.style.left = `${viewportWidth - width - 10}px`;\n      }\n      if (y + height - offsetTop > viewportHeight) {\n        element.style.top = `${viewportHeight - height}px`;\n      }\n\n      //Resize to fit viewport on smaller screens\n      if (height >= viewportHeight) {\n        element.style.height = `${viewportHeight - 20}px`;\n        element.style.top = \"10px\";\n        element.style.overflowY = \"scroll\";\n      }\n      if (width >= viewportWidth) {\n        element.style.width = `${viewportWidth}px`;\n        element.style.left = \"0px\";\n        element.style.overflowX = \"scroll\";\n      }\n    }\n  }, [fitInViewport, viewportWidth, viewportHeight, offsetLeft, offsetTop]);\n\n  useEffect(() => {\n    if (onCloseRequest) {\n      const handler = (event: PointerEvent) => {\n        if (!popoverRef.current?.contains(event.target as Node)) {\n          unstable_batchedUpdates(() => onCloseRequest(event));\n        }\n      };\n      document.addEventListener(\"pointerdown\", handler, false);\n      return () => document.removeEventListener(\"pointerdown\", handler, false);\n    }\n  }, [onCloseRequest]);\n\n  return (\n    <div className=\"popover\" style={{ top, left }} ref={popoverRef}>\n      {children}\n    </div>\n  );\n};\n","import React from \"react\";\n\nexport type SidebarProps<P = {}> = {\n  children: React.ReactNode;\n  /**\n   * Called on sidebar close (either by user action or by the editor).\n   */\n  onClose?: () => void | boolean;\n  /** if not supplied, sidebar won't be dockable */\n  onDock?: (docked: boolean) => void;\n  docked?: boolean;\n  initialDockedState?: boolean;\n  dockable?: boolean;\n  className?: string;\n} & P;\n\nexport type SidebarPropsContextValue = Pick<\n  SidebarProps,\n  \"onClose\" | \"onDock\" | \"docked\" | \"dockable\"\n>;\n\nexport const SidebarPropsContext =\n  React.createContext<SidebarPropsContextValue>({});\n","import clsx from \"clsx\";\nimport { useContext } from \"react\";\nimport { t } from \"../../i18n\";\nimport { useDevice } from \"../App\";\nimport { SidebarPropsContext } from \"./common\";\nimport { CloseIcon, PinIcon } from \"../icons\";\nimport { withUpstreamOverride } from \"../hoc/withUpstreamOverride\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport const SidebarDockButton = (props: {\n  checked: boolean;\n  onChange?(): void;\n}) => {\n  return (\n    <div className=\"layer-ui__sidebar-dock-button\" data-testid=\"sidebar-dock\">\n      <Tooltip label={t(\"labels.sidebarLock\")}>\n        <label\n          className={clsx(\n            \"ToolIcon ToolIcon__lock ToolIcon_type_floating\",\n            `ToolIcon_size_medium`,\n          )}\n        >\n          <input\n            className=\"ToolIcon_type_checkbox\"\n            type=\"checkbox\"\n            onChange={props.onChange}\n            checked={props.checked}\n            aria-label={t(\"labels.sidebarLock\")}\n          />{\" \"}\n          <div\n            className={clsx(\"Sidebar__pin-btn\", {\n              \"Sidebar__pin-btn--pinned\": props.checked,\n            })}\n            tabIndex={0}\n          >\n            {PinIcon}\n          </div>{\" \"}\n        </label>{\" \"}\n      </Tooltip>\n    </div>\n  );\n};\n\nconst _SidebarHeader: React.FC<{\n  children?: React.ReactNode;\n  className?: string;\n}> = ({ children, className }) => {\n  const device = useDevice();\n  const props = useContext(SidebarPropsContext);\n\n  const renderDockButton = !!(device.canDeviceFitSidebar && props.dockable);\n  const renderCloseButton = !!props.onClose;\n\n  return (\n    <div\n      className={clsx(\"layer-ui__sidebar__header\", className)}\n      data-testid=\"sidebar-header\"\n    >\n      {children}\n      {(renderDockButton || renderCloseButton) && (\n        <div className=\"layer-ui__sidebar__header__buttons\">\n          {renderDockButton && (\n            <SidebarDockButton\n              checked={!!props.docked}\n              onChange={() => {\n                props.onDock?.(!props.docked);\n              }}\n            />\n          )}\n          {renderCloseButton && (\n            <button\n              data-testid=\"sidebar-close\"\n              className=\"Sidebar__close-btn\"\n              onClick={props.onClose}\n              aria-label={t(\"buttons.close\")}\n            >\n              {CloseIcon}\n            </button>\n          )}\n        </div>\n      )}\n    </div>\n  );\n};\n\nconst [Context, Component] = withUpstreamOverride(_SidebarHeader);\n\n/** @private */\nexport const SidebarHeaderComponents = { Context, Component };\n","import React, {\n  useMemo,\n  useContext,\n  useLayoutEffect,\n  useState,\n  createContext,\n} from \"react\";\n\nexport const withUpstreamOverride = <P,>(Component: React.ComponentType<P>) => {\n  type ContextValue = [boolean, React.Dispatch<React.SetStateAction<boolean>>];\n\n  const DefaultComponentContext = createContext<ContextValue>([\n    false,\n    () => {},\n  ]);\n\n  const ComponentContext: React.FC<{ children: React.ReactNode }> = ({\n    children,\n  }) => {\n    const [isRenderedUpstream, setIsRenderedUpstream] = useState(false);\n    const contextValue: ContextValue = useMemo(\n      () => [isRenderedUpstream, setIsRenderedUpstream],\n      [isRenderedUpstream],\n    );\n\n    return (\n      <DefaultComponentContext.Provider value={contextValue}>\n        {children}\n      </DefaultComponentContext.Provider>\n    );\n  };\n\n  const DefaultComponent = (\n    props: P & {\n      // indicates whether component should render when not rendered upstream\n      /** @private internal */\n      __isFallback?: boolean;\n    },\n  ) => {\n    const [isRenderedUpstream, setIsRenderedUpstream] = useContext(\n      DefaultComponentContext,\n    );\n\n    useLayoutEffect(() => {\n      if (!props.__isFallback) {\n        setIsRenderedUpstream(true);\n        return () => setIsRenderedUpstream(false);\n      }\n    }, [props.__isFallback, setIsRenderedUpstream]);\n\n    if (props.__isFallback && isRenderedUpstream) {\n      return null;\n    }\n\n    return <Component {...props} />;\n  };\n  if (Component.name) {\n    DefaultComponent.displayName = `${Component.name}_upstreamOverrideWrapper`;\n    ComponentContext.displayName = `${Component.name}_upstreamOverrideContextWrapper`;\n  }\n\n  return [ComponentContext, DefaultComponent] as const;\n};\n","import {\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n  forwardRef,\n} from \"react\";\nimport { Island } from \".././Island\";\nimport { atom, useAtom } from \"jotai\";\nimport { jotaiScope } from \"../../jotai\";\nimport {\n  SidebarPropsContext,\n  SidebarProps,\n  SidebarPropsContextValue,\n} from \"./common\";\n\nimport { SidebarHeaderComponents } from \"./SidebarHeader\";\n\nimport \"./Sidebar.scss\";\nimport clsx from \"clsx\";\nimport { useExcalidrawSetAppState } from \"../App\";\nimport { updateObject } from \"../../utils\";\n\n/** using a counter instead of boolean to handle race conditions where\n * the host app may render (mount/unmount) multiple different sidebar */\nexport const hostSidebarCountersAtom = atom({ rendered: 0, docked: 0 });\n\nexport const Sidebar = Object.assign(\n  forwardRef(\n    (\n      {\n        children,\n        onClose,\n        onDock,\n        docked,\n        /** Undocumented, may be removed later. Generally should either be\n         * `props.docked` or `appState.isSidebarDocked`. Currently serves to\n         *  prevent unwanted animation of the shadow if initially docked. */\n        //\n        // NOTE we'll want to remove this after we sort out how to subscribe to\n        // individual appState properties\n        initialDockedState = docked,\n        dockable = true,\n        className,\n        __isInternal,\n      }: SidebarProps<{\n        // NOTE sidebars we use internally inside the editor must have this flag set.\n        // It indicates that this sidebar should have lower precedence over host\n        // sidebars, if both are open.\n        /** @private internal */\n        __isInternal?: boolean;\n      }>,\n      ref: React.ForwardedRef<HTMLDivElement>,\n    ) => {\n      const [hostSidebarCounters, setHostSidebarCounters] = useAtom(\n        hostSidebarCountersAtom,\n        jotaiScope,\n      );\n\n      const setAppState = useExcalidrawSetAppState();\n\n      const [isDockedFallback, setIsDockedFallback] = useState(\n        docked ?? initialDockedState ?? false,\n      );\n\n      useLayoutEffect(() => {\n        if (docked === undefined) {\n          // ugly hack to get initial state out of AppState without subscribing\n          // to it as a whole (once we have granular subscriptions, we'll move\n          // to that)\n          //\n          // NOTE this means that is updated `state.isSidebarDocked` changes outside\n          // of this compoent, it won't be reflected here. Currently doesn't happen.\n          setAppState((state) => {\n            setIsDockedFallback(state.isSidebarDocked);\n            // bail from update\n            return null;\n          });\n        }\n      }, [setAppState, docked]);\n\n      useLayoutEffect(() => {\n        if (!__isInternal) {\n          setHostSidebarCounters((s) => ({\n            rendered: s.rendered + 1,\n            docked: isDockedFallback ? s.docked + 1 : s.docked,\n          }));\n          return () => {\n            setHostSidebarCounters((s) => ({\n              rendered: s.rendered - 1,\n              docked: isDockedFallback ? s.docked - 1 : s.docked,\n            }));\n          };\n        }\n      }, [__isInternal, setHostSidebarCounters, isDockedFallback]);\n\n      const onCloseRef = useRef(onClose);\n      onCloseRef.current = onClose;\n\n      useEffect(() => {\n        return () => {\n          onCloseRef.current?.();\n        };\n      }, []);\n\n      const headerPropsRef = useRef<SidebarPropsContextValue>({});\n      headerPropsRef.current.onClose = () => {\n        setAppState({ openSidebar: null });\n      };\n      headerPropsRef.current.onDock = (isDocked) => {\n        if (docked === undefined) {\n          setAppState({ isSidebarDocked: isDocked });\n          setIsDockedFallback(isDocked);\n        }\n        onDock?.(isDocked);\n      };\n      // renew the ref object if the following props change since we want to\n      // rerender. We can't pass down as component props manually because\n      // the <Sidebar.Header/> can be rendered upsream.\n      headerPropsRef.current = updateObject(headerPropsRef.current, {\n        docked: docked ?? isDockedFallback,\n        dockable,\n      });\n\n      if (hostSidebarCounters.rendered > 0 && __isInternal) {\n        return null;\n      }\n\n      return (\n        <Island\n          className={clsx(\n            \"layer-ui__sidebar\",\n            { \"layer-ui__sidebar--docked\": isDockedFallback },\n            className,\n          )}\n          ref={ref}\n        >\n          <SidebarPropsContext.Provider value={headerPropsRef.current}>\n            <SidebarHeaderComponents.Context>\n              <SidebarHeaderComponents.Component __isFallback />\n              {children}\n            </SidebarHeaderComponents.Context>\n          </SidebarPropsContext.Provider>\n        </Island>\n      );\n    },\n  ),\n  {\n    Header: SidebarHeaderComponents.Component,\n  },\n);\n","import React from \"react\";\n\nimport \"./Spinner.scss\";\n\nconst Spinner = ({\n  size = \"1em\",\n  circleWidth = 8,\n}: {\n  size?: string | number;\n  circleWidth?: number;\n}) => {\n  return (\n    <div className=\"Spinner\">\n      <svg viewBox=\"0 0 100 100\" style={{ width: size, height: size }}>\n        <circle\n          cx=\"50\"\n          cy=\"50\"\n          r={50 - circleWidth / 2}\n          strokeWidth={circleWidth}\n          fill=\"none\"\n          strokeMiterlimit=\"10\"\n        />\n      </svg>\n    </div>\n  );\n};\n\nexport default Spinner;\n","import \"./Stack.scss\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\n\ntype StackProps = {\n  children: React.ReactNode;\n  gap?: number;\n  align?: \"start\" | \"center\" | \"end\" | \"baseline\";\n  justifyContent?: \"center\" | \"space-around\" | \"space-between\";\n  className?: string | boolean;\n  style?: React.CSSProperties;\n};\n\nconst RowStack = ({\n  children,\n  gap,\n  align,\n  justifyContent,\n  className,\n  style,\n}: StackProps) => {\n  return (\n    <div\n      className={clsx(\"Stack Stack_horizontal\", className)}\n      style={{\n        \"--gap\": gap,\n        alignItems: align,\n        justifyContent,\n        ...style,\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n\nconst ColStack = ({\n  children,\n  gap,\n  align,\n  justifyContent,\n  className,\n  style,\n}: StackProps) => {\n  return (\n    <div\n      className={clsx(\"Stack Stack_vertical\", className)}\n      style={{\n        \"--gap\": gap,\n        justifyItems: align,\n        justifyContent,\n        ...style,\n      }}\n    >\n      {children}\n    </div>\n  );\n};\n\nexport default {\n  Row: RowStack,\n  Col: ColStack,\n};\n","import \"./ToolIcon.scss\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport clsx from \"clsx\";\nimport { useExcalidrawContainer } from \"./App\";\nimport { AbortError } from \"../errors\";\nimport Spinner from \"./Spinner\";\nimport { PointerType } from \"../element/types\";\n\nexport type ToolButtonSize = \"small\" | \"medium\";\n\ntype ToolButtonBaseProps = {\n  icon?: React.ReactNode;\n  \"aria-label\": string;\n  \"aria-keyshortcuts\"?: string;\n  \"data-testid\"?: string;\n  label?: string;\n  title?: string;\n  name?: string;\n  id?: string;\n  size?: ToolButtonSize;\n  keyBindingLabel?: string | null;\n  showAriaLabel?: boolean;\n  hidden?: boolean;\n  visible?: boolean;\n  selected?: boolean;\n  className?: string;\n  isLoading?: boolean;\n};\n\ntype ToolButtonProps =\n  | (ToolButtonBaseProps & {\n      type: \"button\";\n      children?: React.ReactNode;\n      onClick?(event: React.MouseEvent): void;\n    })\n  | (ToolButtonBaseProps & {\n      type: \"submit\";\n      children?: React.ReactNode;\n      onClick?(event: React.MouseEvent): void;\n    })\n  | (ToolButtonBaseProps & {\n      type: \"icon\";\n      children?: React.ReactNode;\n      onClick?(): void;\n    })\n  | (ToolButtonBaseProps & {\n      type: \"radio\";\n      checked: boolean;\n      onChange?(data: { pointerType: PointerType | null }): void;\n      onPointerDown?(data: { pointerType: PointerType }): void;\n    });\n\nexport const ToolButton = React.forwardRef((props: ToolButtonProps, ref) => {\n  const { id: excalId } = useExcalidrawContainer();\n  const innerRef = React.useRef(null);\n  React.useImperativeHandle(ref, () => innerRef.current);\n  const sizeCn = `ToolIcon_size_${props.size}`;\n\n  const [isLoading, setIsLoading] = useState(false);\n\n  const isMountedRef = useRef(true);\n\n  const onClick = async (event: React.MouseEvent) => {\n    const ret = \"onClick\" in props && props.onClick?.(event);\n\n    if (ret && \"then\" in ret) {\n      try {\n        setIsLoading(true);\n        await ret;\n      } catch (error: any) {\n        if (!(error instanceof AbortError)) {\n          throw error;\n        } else {\n          console.warn(error);\n        }\n      } finally {\n        if (isMountedRef.current) {\n          setIsLoading(false);\n        }\n      }\n    }\n  };\n\n  useEffect(\n    () => () => {\n      isMountedRef.current = false;\n    },\n    [],\n  );\n\n  const lastPointerTypeRef = useRef<PointerType | null>(null);\n\n  if (\n    props.type === \"button\" ||\n    props.type === \"icon\" ||\n    props.type === \"submit\"\n  ) {\n    const type = (props.type === \"icon\" ? \"button\" : props.type) as\n      | \"button\"\n      | \"submit\";\n    return (\n      <button\n        className={clsx(\n          \"ToolIcon_type_button\",\n          sizeCn,\n          props.className,\n          props.visible && !props.hidden\n            ? \"ToolIcon_type_button--show\"\n            : \"ToolIcon_type_button--hide\",\n          {\n            ToolIcon: !props.hidden,\n            \"ToolIcon--selected\": props.selected,\n            \"ToolIcon--plain\": props.type === \"icon\",\n          },\n        )}\n        data-testid={props[\"data-testid\"]}\n        hidden={props.hidden}\n        title={props.title}\n        aria-label={props[\"aria-label\"]}\n        type={type}\n        onClick={onClick}\n        ref={innerRef}\n        disabled={isLoading || props.isLoading}\n      >\n        {(props.icon || props.label) && (\n          <div className=\"ToolIcon__icon\" aria-hidden=\"true\">\n            {props.icon || props.label}\n            {props.keyBindingLabel && (\n              <span className=\"ToolIcon__keybinding\">\n                {props.keyBindingLabel}\n              </span>\n            )}\n            {props.isLoading && <Spinner />}\n          </div>\n        )}\n        {props.showAriaLabel && (\n          <div className=\"ToolIcon__label\">\n            {props[\"aria-label\"]} {isLoading && <Spinner />}\n          </div>\n        )}\n        {props.children}\n      </button>\n    );\n  }\n\n  return (\n    <label\n      className={clsx(\"ToolIcon\", props.className)}\n      title={props.title}\n      onPointerDown={(event) => {\n        lastPointerTypeRef.current = event.pointerType || null;\n        props.onPointerDown?.({ pointerType: event.pointerType || null });\n      }}\n      onPointerUp={() => {\n        requestAnimationFrame(() => {\n          lastPointerTypeRef.current = null;\n        });\n      }}\n    >\n      <input\n        className={`ToolIcon_type_radio ${sizeCn}`}\n        type=\"radio\"\n        name={props.name}\n        aria-label={props[\"aria-label\"]}\n        aria-keyshortcuts={props[\"aria-keyshortcuts\"]}\n        data-testid={props[\"data-testid\"]}\n        id={`${excalId}-${props.id}`}\n        onChange={() => {\n          props.onChange?.({ pointerType: lastPointerTypeRef.current });\n        }}\n        checked={props.checked}\n        ref={innerRef}\n      />\n      <div className=\"ToolIcon__icon\">\n        {props.icon}\n        {props.keyBindingLabel && (\n          <span className=\"ToolIcon__keybinding\">{props.keyBindingLabel}</span>\n        )}\n      </div>\n    </label>\n  );\n});\n\nToolButton.defaultProps = {\n  visible: true,\n  className: \"\",\n  size: \"medium\",\n};\n\nToolButton.displayName = \"ToolButton\";\n","// extracted by mini-css-extract-plugin\nexport default {\"themeFilter\":\"invert(93%) hue-rotate(180deg)\",\"rightSidebarWidth\":\"302px\"};","import \"./Tooltip.scss\";\n\nimport React, { useEffect } from \"react\";\n\nexport const getTooltipDiv = () => {\n  const existingDiv = document.querySelector<HTMLDivElement>(\n    \".excalidraw-tooltip\",\n  );\n  if (existingDiv) {\n    return existingDiv;\n  }\n  const div = document.createElement(\"div\");\n  document.body.appendChild(div);\n  div.classList.add(\"excalidraw-tooltip\");\n  return div;\n};\n\nexport const updateTooltipPosition = (\n  tooltip: HTMLDivElement,\n  item: {\n    left: number;\n    top: number;\n    width: number;\n    height: number;\n  },\n  position: \"bottom\" | \"top\" = \"bottom\",\n) => {\n  const tooltipRect = tooltip.getBoundingClientRect();\n\n  const viewportWidth = window.innerWidth;\n  const viewportHeight = window.innerHeight;\n\n  const margin = 5;\n\n  let left = item.left + item.width / 2 - tooltipRect.width / 2;\n  if (left < 0) {\n    left = margin;\n  } else if (left + tooltipRect.width >= viewportWidth) {\n    left = viewportWidth - tooltipRect.width - margin;\n  }\n\n  let top: number;\n\n  if (position === \"bottom\") {\n    top = item.top + item.height + margin;\n    if (top + tooltipRect.height >= viewportHeight) {\n      top = item.top - tooltipRect.height - margin;\n    }\n  } else {\n    top = item.top - tooltipRect.height - margin;\n    if (top < 0) {\n      top = item.top + item.height + margin;\n    }\n  }\n\n  Object.assign(tooltip.style, {\n    top: `${top}px`,\n    left: `${left}px`,\n  });\n};\n\nconst updateTooltip = (\n  item: HTMLDivElement,\n  tooltip: HTMLDivElement,\n  label: string,\n  long: boolean,\n) => {\n  tooltip.classList.add(\"excalidraw-tooltip--visible\");\n  tooltip.style.minWidth = long ? \"50ch\" : \"10ch\";\n  tooltip.style.maxWidth = long ? \"50ch\" : \"15ch\";\n\n  tooltip.textContent = label;\n\n  const itemRect = item.getBoundingClientRect();\n  updateTooltipPosition(tooltip, itemRect);\n};\n\ntype TooltipProps = {\n  children: React.ReactNode;\n  label: string;\n  long?: boolean;\n  style?: React.CSSProperties;\n};\n\nexport const Tooltip = ({\n  children,\n  label,\n  long = false,\n  style,\n}: TooltipProps) => {\n  useEffect(() => {\n    return () =>\n      getTooltipDiv().classList.remove(\"excalidraw-tooltip--visible\");\n  }, []);\n  return (\n    <div\n      className=\"excalidraw-tooltip-wrapper\"\n      onPointerEnter={(event) =>\n        updateTooltip(\n          event.currentTarget as HTMLDivElement,\n          getTooltipDiv(),\n          label,\n          long,\n        )\n      }\n      onPointerLeave={() =>\n        getTooltipDiv().classList.remove(\"excalidraw-tooltip--visible\")\n      }\n      style={style}\n    >\n      {children}\n    </div>\n  );\n};\n","import \"./UserList.scss\";\n\nimport React from \"react\";\nimport clsx from \"clsx\";\nimport { AppState, Collaborator } from \"../types\";\nimport { Tooltip } from \"./Tooltip\";\nimport { useExcalidrawActionManager } from \"./App\";\n\nexport const UserList: React.FC<{\n  className?: string;\n  mobile?: boolean;\n  collaborators: AppState[\"collaborators\"];\n}> = ({ className, mobile, collaborators }) => {\n  const actionManager = useExcalidrawActionManager();\n\n  const uniqueCollaborators = new Map<string, Collaborator>();\n  collaborators.forEach((collaborator, socketId) => {\n    uniqueCollaborators.set(\n      // filter on user id, else fall back on unique socketId\n      collaborator.id || socketId,\n      collaborator,\n    );\n  });\n\n  const avatars =\n    uniqueCollaborators.size > 0 &&\n    Array.from(uniqueCollaborators)\n      .filter(([_, client]) => Object.keys(client).length !== 0)\n      .map(([clientId, collaborator]) => {\n        const avatarJSX = actionManager.renderAction(\"goToCollaborator\", [\n          clientId,\n          collaborator,\n        ]);\n\n        return mobile ? (\n          <Tooltip\n            label={collaborator.username || \"Unknown user\"}\n            key={clientId}\n          >\n            {avatarJSX}\n          </Tooltip>\n        ) : (\n          <React.Fragment key={clientId}>{avatarJSX}</React.Fragment>\n        );\n      });\n\n  return (\n    <div className={clsx(\"UserList\", className, { UserList_mobile: mobile })}>\n      {avatars}\n    </div>\n  );\n};\n","const createStoreImpl = (createState) => {\n  let state;\n  const listeners = /* @__PURE__ */ new Set();\n  const setState = (partial, replace) => {\n    const nextState = typeof partial === \"function\" ? partial(state) : partial;\n    if (!Object.is(nextState, state)) {\n      const previousState = state;\n      state = (replace != null ? replace : typeof nextState !== \"object\") ? nextState : Object.assign({}, state, nextState);\n      listeners.forEach((listener) => listener(state, previousState));\n    }\n  };\n  const getState = () => state;\n  const subscribe = (listener) => {\n    listeners.add(listener);\n    return () => listeners.delete(listener);\n  };\n  const destroy = () => {\n    if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      console.warn(\n        \"[DEPRECATED] The destroy method will be unsupported in the future version. You should use unsubscribe function returned by subscribe. Everything will be garbage collected if store is garbage collected.\"\n      );\n    }\n    listeners.clear();\n  };\n  const api = { setState, getState, subscribe, destroy };\n  state = createState(setState, getState, api);\n  return api;\n};\nconst createStore = (createState) => createState ? createStoreImpl(createState) : createStoreImpl;\nvar vanilla = (createState) => {\n  if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n    console.warn(\n      \"[DEPRECATED] default export is deprecated, instead import { createStore } ...\"\n    );\n  }\n  return createStore(createState);\n};\n\nexport { createStore, vanilla as default };\n","import { createStore } from 'zustand/vanilla';\nexport * from 'zustand/vanilla';\nimport { useDebugValue } from 'react';\nimport useSyncExternalStoreExports from 'use-sync-external-store/shim/with-selector.js';\n\nconst { useSyncExternalStoreWithSelector } = useSyncExternalStoreExports;\nfunction useStore(api, selector = api.getState, equalityFn) {\n  const slice = useSyncExternalStoreWithSelector(\n    api.subscribe,\n    api.getState,\n    api.getServerState || api.getState,\n    selector,\n    equalityFn\n  );\n  useDebugValue(slice);\n  return slice;\n}\nconst createImpl = (createState) => {\n  if ((import.meta.env && import.meta.env.MODE) !== \"production\" && typeof createState !== \"function\") {\n    console.warn(\n      '[DEPRECATED] Passing a vanilla store will be unsupported in the future version. Please use `import { useStore } from \"zustand\"` to use the vanilla store in React.'\n    );\n  }\n  const api = typeof createState === \"function\" ? createStore(createState) : createState;\n  const useBoundStore = (selector, equalityFn) => useStore(api, selector, equalityFn);\n  Object.assign(useBoundStore, api);\n  return useBoundStore;\n};\nconst create = (createState) => createState ? createImpl(createState) : createImpl;\nvar react = (createState) => {\n  if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n    console.warn(\n      \"[DEPRECATED] default export is deprecated, instead import { create } from'zustand'\"\n    );\n  }\n  return create(createState);\n};\n\nexport { create, react as default, useStore };\n","import React, { useLayoutEffect } from 'react';\nimport { create } from 'zustand';\n\nfunction tunnel() {\n  const useStore = create(set => ({\n    current: new Array(),\n    version: 0,\n    set\n  }));\n  return {\n    In: ({\n      children\n    }) => {\n      const set = useStore(state => state.set);\n      const version = useStore(state => state.version);\n      /* When this component mounts, we increase the store's version number.\n      This will cause all existing rats to re-render (just like if the Out component\n      were mapping items to a list.) The re-rendering will cause the final \n      order of rendered components to match what the user is expecting. */\n\n      useLayoutEffect(() => {\n        set(state => ({\n          version: state.version + 1\n        }));\n      }, []);\n      /* Any time the children _or_ the store's version number change, insert\n      the specified React children into the list of rats. */\n\n      useLayoutEffect(() => {\n        set(({\n          current\n        }) => ({\n          current: [...current, children]\n        }));\n        return () => set(({\n          current\n        }) => ({\n          current: current.filter(c => c !== children)\n        }));\n      }, [children, version]);\n      return null;\n    },\n    Out: () => {\n      const current = useStore(state => state.current);\n      return /*#__PURE__*/React.createElement(React.Fragment, null, current);\n    }\n  };\n}\n\nexport { tunnel as default };\n","import React from \"react\";\nimport tunnel from \"@dwelle/tunnel-rat\";\n\ntype Tunnel = ReturnType<typeof tunnel>;\n\ntype TunnelsContextValue = {\n  mainMenuTunnel: Tunnel;\n  welcomeScreenMenuHintTunnel: Tunnel;\n  welcomeScreenToolbarHintTunnel: Tunnel;\n  welcomeScreenHelpHintTunnel: Tunnel;\n  welcomeScreenCenterTunnel: Tunnel;\n  footerCenterTunnel: Tunnel;\n  jotaiScope: symbol;\n};\n\nexport const TunnelsContext = React.createContext<TunnelsContextValue>(null!);\n\nexport const useTunnels = () => React.useContext(TunnelsContext);\n\nexport const useInitializeTunnels = () => {\n  return React.useMemo((): TunnelsContextValue => {\n    return {\n      mainMenuTunnel: tunnel(),\n      welcomeScreenMenuHintTunnel: tunnel(),\n      welcomeScreenToolbarHintTunnel: tunnel(),\n      welcomeScreenHelpHintTunnel: tunnel(),\n      welcomeScreenCenterTunnel: tunnel(),\n      footerCenterTunnel: tunnel(),\n      jotaiScope: Symbol(),\n    };\n  }, []);\n};\n","import clsx from \"clsx\";\nimport { useDevice, useExcalidrawAppState } from \"../App\";\n\nconst MenuTrigger = ({\n  className = \"\",\n  children,\n  onToggle,\n}: {\n  className?: string;\n  children: React.ReactNode;\n  onToggle: () => void;\n}) => {\n  const appState = useExcalidrawAppState();\n  const device = useDevice();\n  const classNames = clsx(\n    `dropdown-menu-button ${className}`,\n    \"zen-mode-transition\",\n    {\n      \"transition-left\": appState.zenModeEnabled,\n      \"dropdown-menu-button--mobile\": device.isMobile,\n    },\n  ).trim();\n  return (\n    <button\n      data-prevent-outside-click\n      className={classNames}\n      onClick={onToggle}\n      type=\"button\"\n      data-testid=\"dropdown-menu-button\"\n    >\n      {children}\n    </button>\n  );\n};\n\nexport default MenuTrigger;\nMenuTrigger.displayName = \"DropdownMenuTrigger\";\n","import React from \"react\";\n\nconst MenuSeparator = () => (\n  <div\n    style={{\n      height: \"1px\",\n      backgroundColor: \"var(--default-border-color)\",\n      margin: \".5rem 0\",\n    }}\n  />\n);\n\nexport default MenuSeparator;\nMenuSeparator.displayName = \"DropdownMenuSeparator\";\n","import React from \"react\";\n\nconst MenuGroup = ({\n  children,\n  className = \"\",\n  style,\n  title,\n}: {\n  children: React.ReactNode;\n  className?: string;\n  style?: React.CSSProperties;\n  title?: string;\n}) => {\n  return (\n    <div className={`dropdown-menu-group ${className}`} style={style}>\n      {title && <p className=\"dropdown-menu-group-title\">{title}</p>}\n      {children}\n    </div>\n  );\n};\n\nexport default MenuGroup;\nMenuGroup.displayName = \"DropdownMenuGroup\";\n","import { useOutsideClickHook } from \"../../hooks/useOutsideClick\";\nimport { Island } from \"../Island\";\n\nimport { useDevice } from \"../App\";\nimport clsx from \"clsx\";\nimport Stack from \"../Stack\";\nimport React from \"react\";\nimport { DropdownMenuContentPropsContext } from \"./common\";\n\nconst MenuContent = ({\n  children,\n  onClickOutside,\n  className = \"\",\n  onSelect,\n  style,\n}: {\n  children?: React.ReactNode;\n  onClickOutside?: () => void;\n  className?: string;\n  /**\n   * Called when any menu item is selected (clicked on).\n   */\n  onSelect?: (event: Event) => void;\n  style?: React.CSSProperties;\n}) => {\n  const device = useDevice();\n  const menuRef = useOutsideClickHook(() => {\n    onClickOutside?.();\n  });\n\n  const classNames = clsx(`dropdown-menu ${className}`, {\n    \"dropdown-menu--mobile\": device.isMobile,\n  }).trim();\n\n  return (\n    <DropdownMenuContentPropsContext.Provider value={{ onSelect }}>\n      <div\n        ref={menuRef}\n        className={classNames}\n        style={style}\n        data-testid=\"dropdown-menu\"\n      >\n        {/* the zIndex ensures this menu has higher stacking order,\n    see https://github.com/excalidraw/excalidraw/pull/1445 */}\n        {device.isMobile ? (\n          <Stack.Col className=\"dropdown-menu-container\">{children}</Stack.Col>\n        ) : (\n          <Island\n            className=\"dropdown-menu-container\"\n            padding={2}\n            style={{ zIndex: 1 }}\n          >\n            {children}\n          </Island>\n        )}\n      </div>\n    </DropdownMenuContentPropsContext.Provider>\n  );\n};\nMenuContent.displayName = \"DropdownMenuContent\";\n\nexport default MenuContent;\n","import { useEffect, useRef } from \"react\";\n\nexport const useOutsideClickHook = (handler: (event: Event) => void) => {\n  const ref = useRef(null);\n\n  useEffect(\n    () => {\n      const listener = (event: Event) => {\n        const current = ref.current as HTMLElement | null;\n\n        // Do nothing if clicking ref's element or descendent elements\n        if (\n          !current ||\n          current.contains(event.target as Node) ||\n          [...document.querySelectorAll(\"[data-prevent-outside-click]\")].some(\n            (el) => el.contains(event.target as Node),\n          )\n        ) {\n          return;\n        }\n\n        handler(event);\n      };\n\n      document.addEventListener(\"pointerdown\", listener);\n      document.addEventListener(\"touchstart\", listener);\n      return () => {\n        document.removeEventListener(\"pointerdown\", listener);\n        document.removeEventListener(\"touchstart\", listener);\n      };\n    },\n    // Add ref and handler to effect dependencies\n    // It's worth noting that because passed in handler is a new ...\n    // ... function on every render that will cause this effect ...\n    // ... callback/cleanup to run every render. It's not a big deal ...\n    // ... but to optimize you can wrap handler in useCallback before ...\n    // ... passing it into this hook.\n    [ref, handler],\n  );\n\n  return ref;\n};\n","import React from \"react\";\n\nconst DropdownMenuItemCustom = ({\n  children,\n  className = \"\",\n  ...rest\n}: {\n  children: React.ReactNode;\n  className?: string;\n} & React.HTMLAttributes<HTMLDivElement>) => {\n  return (\n    <div\n      {...rest}\n      className={`dropdown-menu-item-base dropdown-menu-item-custom ${className}`.trim()}\n    >\n      {children}\n    </div>\n  );\n};\n\nexport default DropdownMenuItemCustom;\n","import React from \"react\";\nimport DropdownMenuTrigger from \"./DropdownMenuTrigger\";\nimport DropdownMenuItem from \"./DropdownMenuItem\";\nimport MenuSeparator from \"./DropdownMenuSeparator\";\nimport DropdownMenuGroup from \"./DropdownMenuGroup\";\nimport DropdownMenuContent from \"./DropdownMenuContent\";\nimport DropdownMenuItemLink from \"./DropdownMenuItemLink\";\nimport DropdownMenuItemCustom from \"./DropdownMenuItemCustom\";\nimport {\n  getMenuContentComponent,\n  getMenuTriggerComponent,\n} from \"./dropdownMenuUtils\";\n\nimport \"./DropdownMenu.scss\";\n\nconst DropdownMenu = ({\n  children,\n  open,\n}: {\n  children?: React.ReactNode;\n  open: boolean;\n}) => {\n  const MenuTriggerComp = getMenuTriggerComponent(children);\n  const MenuContentComp = getMenuContentComponent(children);\n  return (\n    <>\n      {MenuTriggerComp}\n      {open && MenuContentComp}\n    </>\n  );\n};\n\nDropdownMenu.Trigger = DropdownMenuTrigger;\nDropdownMenu.Content = DropdownMenuContent;\nDropdownMenu.Item = DropdownMenuItem;\nDropdownMenu.ItemLink = DropdownMenuItemLink;\nDropdownMenu.ItemCustom = DropdownMenuItemCustom;\nDropdownMenu.Group = DropdownMenuGroup;\nDropdownMenu.Separator = MenuSeparator;\n\nexport default DropdownMenu;\n\nDropdownMenu.displayName = \"DropdownMenu\";\n","import React from \"react\";\n\nexport const getMenuTriggerComponent = (children: React.ReactNode) => {\n  const comp = React.Children.toArray(children).find(\n    (child) =>\n      React.isValidElement(child) &&\n      typeof child.type !== \"string\" &&\n      //@ts-ignore\n      child?.type.displayName &&\n      //@ts-ignore\n      child.type.displayName === \"DropdownMenuTrigger\",\n  );\n  if (!comp) {\n    return null;\n  }\n  //@ts-ignore\n  return comp;\n};\n\nexport const getMenuContentComponent = (children: React.ReactNode) => {\n  const comp = React.Children.toArray(children).find(\n    (child) =>\n      React.isValidElement(child) &&\n      typeof child.type !== \"string\" &&\n      //@ts-ignore\n      child?.type.displayName &&\n      //@ts-ignore\n      child.type.displayName === \"DropdownMenuContent\",\n  );\n  if (!comp) {\n    return null;\n  }\n  //@ts-ignore\n  return comp;\n};\n","import React from \"react\";\nimport {\n  getDropdownMenuItemClassName,\n  useHandleDropdownMenuItemClick,\n} from \"./common\";\nimport MenuItemContent from \"./DropdownMenuItemContent\";\n\nconst DropdownMenuItem = ({\n  icon,\n  onSelect,\n  children,\n  shortcut,\n  className,\n  ...rest\n}: {\n  icon?: JSX.Element;\n  onSelect: (event: Event) => void;\n  children: React.ReactNode;\n  shortcut?: string;\n  className?: string;\n} & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"onSelect\">) => {\n  const handleClick = useHandleDropdownMenuItemClick(rest.onClick, onSelect);\n\n  return (\n    <button\n      {...rest}\n      onClick={handleClick}\n      type=\"button\"\n      className={getDropdownMenuItemClassName(className)}\n      title={rest.title ?? rest[\"aria-label\"]}\n    >\n      <MenuItemContent icon={icon} shortcut={shortcut}>\n        {children}\n      </MenuItemContent>\n    </button>\n  );\n};\n\nexport default DropdownMenuItem;\nDropdownMenuItem.displayName = \"DropdownMenuItem\";\n","import { useDevice } from \"../App\";\n\nconst MenuItemContent = ({\n  icon,\n  shortcut,\n  children,\n}: {\n  icon?: JSX.Element;\n  shortcut?: string;\n  children: React.ReactNode;\n}) => {\n  const device = useDevice();\n  return (\n    <>\n      <div className=\"dropdown-menu-item__icon\">{icon}</div>\n      <div className=\"dropdown-menu-item__text\">{children}</div>\n      {shortcut && !device.isMobile && (\n        <div className=\"dropdown-menu-item__shortcut\">{shortcut}</div>\n      )}\n    </>\n  );\n};\nexport default MenuItemContent;\n","import MenuItemContent from \"./DropdownMenuItemContent\";\nimport React from \"react\";\nimport {\n  getDropdownMenuItemClassName,\n  useHandleDropdownMenuItemClick,\n} from \"./common\";\n\nconst DropdownMenuItemLink = ({\n  icon,\n  shortcut,\n  href,\n  children,\n  onSelect,\n  className = \"\",\n  ...rest\n}: {\n  href: string;\n  icon?: JSX.Element;\n  children: React.ReactNode;\n  shortcut?: string;\n  className?: string;\n  onSelect?: (event: Event) => void;\n} & React.AnchorHTMLAttributes<HTMLAnchorElement>) => {\n  const handleClick = useHandleDropdownMenuItemClick(rest.onClick, onSelect);\n\n  return (\n    <a\n      {...rest}\n      href={href}\n      target=\"_blank\"\n      rel=\"noreferrer\"\n      className={getDropdownMenuItemClassName(className)}\n      title={rest.title ?? rest[\"aria-label\"]}\n      onClick={handleClick}\n    >\n      <MenuItemContent icon={icon} shortcut={shortcut}>\n        {children}\n      </MenuItemContent>\n    </a>\n  );\n};\n\nexport default DropdownMenuItemLink;\nDropdownMenuItemLink.displayName = \"DropdownMenuItemLink\";\n","import React, { useContext } from \"react\";\nimport { EVENT } from \"../../constants\";\nimport { composeEventHandlers } from \"../../utils\";\n\nexport const DropdownMenuContentPropsContext = React.createContext<{\n  onSelect?: (event: Event) => void;\n}>({});\n\nexport const getDropdownMenuItemClassName = (className = \"\") => {\n  return `dropdown-menu-item dropdown-menu-item-base ${className}`.trim();\n};\n\nexport const useHandleDropdownMenuItemClick = (\n  origOnClick:\n    | React.MouseEventHandler<HTMLAnchorElement | HTMLButtonElement>\n    | undefined,\n  onSelect: ((event: Event) => void) | undefined,\n) => {\n  const DropdownMenuContentProps = useContext(DropdownMenuContentPropsContext);\n\n  return composeEventHandlers(origOnClick, (event) => {\n    const itemSelectEvent = new CustomEvent(EVENT.MENU_ITEM_SELECT, {\n      bubbles: true,\n      cancelable: true,\n    });\n    onSelect?.(itemSelectEvent);\n    if (!itemSelectEvent.defaultPrevented) {\n      DropdownMenuContentProps.onSelect?.(itemSelectEvent);\n    }\n  });\n};\n","//\n// All icons are imported from https://fontawesome.com/icons?d=gallery\n// Icons are under the license https://fontawesome.com/license\n//\n\n// Note: when adding new icons, review https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/RTL_Guidelines\n// to determine whether or not the icons should be mirrored in right-to-left languages.\n\nimport React from \"react\";\n\nimport oc from \"open-color\";\nimport clsx from \"clsx\";\nimport { Theme } from \"../element/types\";\nimport { THEME } from \"../constants\";\n\nconst iconFillColor = (theme: Theme) => \"var(--icon-fill-color)\";\n\nconst handlerColor = (theme: Theme) =>\n  theme === THEME.LIGHT ? oc.white : \"#1e1e1e\";\n\ntype Opts = {\n  width?: number;\n  height?: number;\n  mirror?: true;\n} & React.SVGProps<SVGSVGElement>;\n\nexport const createIcon = (\n  d: string | React.ReactNode,\n  opts: number | Opts = 512,\n) => {\n  const {\n    width = 512,\n    height = width,\n    mirror,\n    style,\n    ...rest\n  } = typeof opts === \"number\" ? ({ width: opts } as Opts) : opts;\n  return (\n    <svg\n      aria-hidden=\"true\"\n      focusable=\"false\"\n      role=\"img\"\n      viewBox={`0 0 ${width} ${height}`}\n      className={clsx({ \"rtl-mirror\": mirror })}\n      style={style}\n      {...rest}\n    >\n      {typeof d === \"string\" ? <path fill=\"currentColor\" d={d} /> : d}\n    </svg>\n  );\n};\n\nconst tablerIconProps: Opts = {\n  width: 24,\n  height: 24,\n  fill: \"none\",\n  strokeWidth: 2,\n  stroke: \"currentColor\",\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\",\n} as const;\n\nconst modifiedTablerIconProps: Opts = {\n  width: 20,\n  height: 20,\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\",\n} as const;\n\n// -----------------------------------------------------------------------------\n\n// tabler-icons: present\nexport const PlusPromoIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <rect x={3} y={8} width={18} height={4} rx={1} />\n    <line x1={12} y1={8} x2={12} y2={21} />\n    <path d=\"M19 12v7a2 2 0 0 1 -2 2h-10a2 2 0 0 1 -2 -2v-7\" />\n    <path d=\"M7.5 8a2.5 2.5 0 0 1 0 -5a4.8 8 0 0 1 4.5 5a4.8 8 0 0 1 4.5 -5a2.5 2.5 0 0 1 0 5\" />\n  </g>,\n  tablerIconProps,\n);\n\n// tabler-icons: book\nexport const LibraryIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M3 19a9 9 0 0 1 9 0a9 9 0 0 1 9 0\" />\n    <path d=\"M3 6a9 9 0 0 1 9 0a9 9 0 0 1 9 0\" />\n    <line x1=\"3\" y1=\"6\" x2=\"3\" y2=\"19\" />\n    <line x1=\"12\" y1=\"6\" x2=\"12\" y2=\"19\" />\n    <line x1=\"21\" y1=\"6\" x2=\"21\" y2=\"19\" />\n  </g>,\n  tablerIconProps,\n);\n\n// tabler-icons: plus\nexport const PlusIcon = createIcon(\n  <svg strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\n    <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n  </svg>,\n  tablerIconProps,\n);\n\n// tabler-icons: dots-vertical\nexport const DotsIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <circle cx=\"12\" cy=\"12\" r=\"1\"></circle>\n    <circle cx=\"12\" cy=\"19\" r=\"1\"></circle>\n    <circle cx=\"12\" cy=\"5\" r=\"1\"></circle>\n  </g>,\n  tablerIconProps,\n);\n\n// tabler-icons: pinned\nexport const PinIcon = createIcon(\n  <svg strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <path d=\"M9 4v6l-2 4v2h10v-2l-2 -4v-6\"></path>\n    <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"21\"></line>\n    <line x1=\"8\" y1=\"4\" x2=\"16\" y2=\"4\"></line>\n  </svg>,\n  tablerIconProps,\n);\n\n// tabler-icons: lock-open (via Figma)\nexport const UnlockedIcon = createIcon(\n  <g>\n    <path\n      d=\"M13.542 8.542H6.458a2.5 2.5 0 0 0-2.5 2.5v3.75a2.5 2.5 0 0 0 2.5 2.5h7.084a2.5 2.5 0 0 0 2.5-2.5v-3.75a2.5 2.5 0 0 0-2.5-2.5Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n    />\n    <path\n      d=\"M10 13.958a1.042 1.042 0 1 0 0-2.083 1.042 1.042 0 0 0 0 2.083Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n    />\n    <mask\n      id=\"UnlockedIcon\"\n      style={{ maskType: \"alpha\" }}\n      maskUnits=\"userSpaceOnUse\"\n      x={6}\n      y={1}\n      width={9}\n      height={9}\n    >\n      <path\n        stroke=\"none\"\n        d=\"M6.399 9.561V5.175c0-.93.401-1.823 1.116-2.48a3.981 3.981 0 0 1 2.693-1.028c1.01 0 1.98.37 2.694 1.027.715.658 1.116 1.55 1.116 2.481\"\n        fill=\"#fff\"\n      />\n    </mask>\n    <g mask=\"url(#UnlockedIcon)\">\n      <path\n        stroke=\"none\"\n        d=\"M5.149 9.561v1.25h2.5v-1.25h-2.5Zm5.06-7.894V.417v1.25Zm2.559 3.508v1.25h2.5v-1.25h-2.5ZM7.648 8.51V5.175h-2.5V8.51h2.5Zm0-3.334c0-.564.243-1.128.713-1.561L6.668 1.775c-.959.883-1.52 2.104-1.52 3.4h2.5Zm.713-1.561a2.732 2.732 0 0 1 1.847-.697v-2.5c-1.31 0-2.585.478-3.54 1.358L8.36 3.614Zm1.847-.697c.71 0 1.374.26 1.847.697l1.694-1.839a5.231 5.231 0 0 0-3.54-1.358v2.5Zm1.847.697c.47.433.713.997.713 1.561h2.5c0-1.296-.56-2.517-1.52-3.4l-1.693 1.839Z\"\n        fill=\"currentColor\"\n      />\n    </g>\n  </g>,\n  modifiedTablerIconProps,\n);\n\n// tabler-icons: lock (via Figma)\nexport const LockedIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path d=\"M13.542 8.542H6.458a2.5 2.5 0 0 0-2.5 2.5v3.75a2.5 2.5 0 0 0 2.5 2.5h7.084a2.5 2.5 0 0 0 2.5-2.5v-3.75a2.5 2.5 0 0 0-2.5-2.5Z\" />\n    <path d=\"M10 13.958a1.042 1.042 0 1 0 0-2.083 1.042 1.042 0 0 0 0 2.083Z\" />\n    <path d=\"M6.667 8.333V5.417C6.667 3.806 8.159 2.5 10 2.5c1.841 0 3.333 1.306 3.333 2.917v2.916\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\n// custom\nexport const WelcomeScreenMenuArrow = createIcon(\n  <>\n    <path\n      d=\"M38.5 83.5c-14-2-17.833-10.473-21-22.5C14.333 48.984 12 22 12 12.5\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n      strokeLinecap=\"round\"\n    />\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"m12.005 10.478 7.905 14.423L6 25.75l6.005-15.273Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M12.005 10.478c1.92 3.495 3.838 7 7.905 14.423m-7.905-14.423c3.11 5.683 6.23 11.368 7.905 14.423m0 0c-3.68.226-7.35.455-13.91.85m13.91-.85c-5.279.33-10.566.647-13.91.85m0 0c1.936-4.931 3.882-9.86 6.005-15.273M6 25.75c2.069-5.257 4.135-10.505 6.005-15.272\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n      strokeLinecap=\"round\"\n    />\n  </>,\n  { width: 41, height: 94, fill: \"none\" },\n);\n\n// custom\nexport const WelcomeScreenHelpArrow = createIcon(\n  <>\n    <path\n      d=\"M18.026 1.232c-5.268 13.125-5.548 33.555 3.285 42.311 8.823 8.75 33.31 12.304 42.422 13.523\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n      strokeLinecap=\"round\"\n    />\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"m72.181 59.247-13.058-10-2.948 13.62 16.006-3.62Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M72.181 59.247c-3.163-2.429-6.337-4.856-13.058-10m13.058 10c-5.145-3.936-10.292-7.882-13.058-10m0 0c-.78 3.603-1.563 7.196-2.948 13.62m2.948-13.62c-1.126 5.168-2.24 10.346-2.948 13.62m0 0c5.168-1.166 10.334-2.343 16.006-3.62m-16.006 3.62c5.51-1.248 11.01-2.495 16.006-3.62\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n      strokeLinecap=\"round\"\n    />\n  </>,\n  { width: 85, height: 71, fill: \"none\" },\n);\n\n// custom\nexport const WelcomeScreenTopToolbarArrow = createIcon(\n  <>\n    <path\n      d=\"M1 77c14-2 31.833-11.973 35-24 3.167-12.016-6-35-9.5-43.5\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n      strokeLinecap=\"round\"\n    />\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"m24.165 1.093-2.132 16.309 13.27-4.258-11.138-12.05Z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M24.165 1.093c-.522 3.953-1.037 7.916-2.132 16.309m2.131-16.309c-.835 6.424-1.68 12.854-2.13 16.308m0 0c3.51-1.125 7.013-2.243 13.27-4.257m-13.27 4.257c5.038-1.608 10.08-3.232 13.27-4.257m0 0c-3.595-3.892-7.197-7.777-11.14-12.05m11.14 12.05c-3.837-4.148-7.667-8.287-11.14-12.05\"\n      stroke=\"currentColor\"\n      strokeWidth={2}\n      strokeLinecap=\"round\"\n    />\n  </>,\n  { width: 38, height: 78, fill: \"none\" },\n);\n\n// custom\nexport const ExcalLogo = createIcon(\n  <g fill=\"currentColor\">\n    <path d=\"M24.296 12.214c0 .112-.134.224-.291.224-.135 0-.516.629-.808 1.392-.897 2.335-9.867 20.096-9.89 19.534 0-.292-.134-.494-.359-.494-.313 0-.358.18-.224 1.055.135 1.01.045 1.236-3.14 7.432-1.793 3.525-3.722 7.208-4.282 8.196-.584 1.032-1.032 2.155-1.077 2.626-.067.809.022.92 1.973 2.605 1.122.988 2.557 2.223 3.185 2.784 2.826 2.582 4.149 3.615 4.508 3.547.538-.09 8.858-8.823 8.88-9.317 0-.225-.403-3.638-.897-7.59-.852-6.735-1.66-14.616-1.57-15.38.068-.47-.269-2.85-.516-3.884-.201-.808-.112-1.145 1.503-4.827.942-2.178 2.176-4.85 2.714-5.928.515-1.077.964-2.02.964-2.088 0-.067-.157-.112-.336-.112-.18 0-.337.09-.337.225Zm-5.158 16.772c.247 1.572.74 5.344 1.099 8.375.695 5.568 1.503 11.742 1.727 13.314.135.786.045.943-1.413 2.56-2.534 2.851-5.225 5.658-6.145 6.376l-.852.674-4.373-4.086c-4.037-3.728-4.373-4.11-4.127-4.558a5154.2 5154.2 0 0 1 2.535-4.626 727.864 727.864 0 0 0 3.678-6.78c.784-1.46 1.502-2.717 1.637-2.785.156-.09.201 2.178.156 7.006-.09 7.207-.067 7.23.651 7.072.09 0 .157-3.637.157-8.06V35.43l2.355-4.715c1.3-2.605 2.377-4.693 2.422-4.67.045.022.27 1.347.493 2.94ZM9.562 1.818C7.903 3.143 5.346 5.388 3.328 7.32L1.735 8.823l.292 1.976c.157 1.078.449 3.188.628 4.67.202 1.482.404 2.874.47 3.077.09.269 0 .404-.246.404-.426 0-.449-.113.718 3.592.286.952.577 1.903.875 2.851.044.158.224.225.425.158.202-.09.314-.27.247-.427-.067-.18.045-.36.224-.427.247-.09.225-.269-.157-.92-.605-1.01-2.152-9.633-2.242-12.416-.067-1.976-.067-1.999.762-3.121.808-1.1 2.67-2.762 5.54-4.873.807-.605 1.614-1.28 1.839-1.504.336-.404.493-.292 3.319 2.717 1.637 1.729 3.453 3.502 4.037 3.952l1.076.808-.83 1.75c-.448.944-2.265 4.581-4.059 8.04-3.745 7.274-2.983 6.578-7.333 6.645l-2.826.023-.942 1.077c-.987 1.146-1.121 1.572-.65 2.29.18.248.313.652.313.898 0 .405.157.472 1.055.517.56.023 1.076.09 1.144.157.067.068.156 1.46.224 3.098l.09 2.965-1.503 3.232C1.735 45.422.749 47.891.749 48.7c0 .427.09.786.18.786.224 0 .224-.022 9.35-19.085a4398.495 4398.495 0 0 1 8.927-18.546c.672-1.369 1.278-2.626 1.323-2.806.045-.202-1.503-1.751-3.97-3.93-2.22-1.975-4.171-3.772-4.35-3.974-.516-.628-1.279-.426-2.647.674ZM8.441 31.231c-.18.472-.65 1.46-1.031 2.2-.629 1.258-.696 1.303-.853.786-.09-.314-.157-1.235-.18-2.066-.022-1.639-.067-1.616 1.817-1.728L8.8 30.4l-.358.831Zm1.884-3.592c-1.032 1.998-1.077 2.02-3.903 2.155-2.489.135-2.533.112-2.533-.36 0-.269-.09-.628-.203-.808-.134-.202-.044-.56.27-1.055l.493-.763H6.69c1.234-.023 2.647-.113 3.14-.202.494-.09.92-.135.965-.113.045.023-.18.54-.471 1.146Zm-.09-20.477c-.404.292-.516.584-.516 1.325 0 .875.067 1.01.673 1.257.605.247.763.224 1.458-.247.92-.629.941-.786.269-1.796-.583-.876-1.166-1.033-1.884-.54Z\" />\n    <path\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n      d=\"M23.703 11.793c.166-.291.501-.514.93-.514.38 0 .698.161.82.283.161.162.225.35.225.54a.822.822 0 0 1-.056.289c-.08.218-.5 1.106-.983 2.116-.535 1.071-1.76 3.727-2.699 5.895-.79 1.802-1.209 2.784-1.404 3.416-.142.461-.132.665-.058.961.264 1.103.6 3.647.53 4.132-.088.756.727 8.547 1.57 15.21.5 3.997.903 7.45.903 7.676l-.001.033c-.004.087-.041.288-.211.54-.24.354-.914 1.143-1.8 2.119-2.004 2.21-5.107 5.423-6.463 6.653-.322.292-.566.485-.696.56a.884.884 0 0 1-.289.111c-.194.037-.579-.007-1.11-.349-.707-.453-1.981-1.522-4-3.366-.627-.561-2.061-1.794-3.176-2.776-.81-.699-1.308-1.138-1.612-1.466-.32-.343-.47-.61-.549-.87-.078-.257-.085-.515-.055-.874.05-.52.521-1.769 1.166-2.91.559-.985 2.48-4.654 4.269-8.17 1.579-3.071 2.392-4.663 2.792-5.612.32-.759.329-1 .277-1.387-.085-.553-.092-.891-.052-1.092a.942.942 0 0 1 .274-.52c.164-.157.384-.261.704-.261.094 0 .184.011.27.033 1.924-3.44 8.554-16.632 9.316-18.616.276-.724.64-1.336.848-1.556a.965.965 0 0 1 .32-.228Zm-5.399 16.402c-.49.942-.971 1.888-1.446 2.837l-2.28 4.565v7.871c0 4.023-.06 7.404-.136 8.04-.067.552-.474.691-.654.722l.075-.008c-.317.07-.574.063-.778-.023-.234-.098-.5-.297-.63-.857-.156-.681-.158-2.462-.103-6.893.019-2.022.022-3.592.008-4.725-.156.276-.315.562-.467.843a737.624 737.624 0 0 1-3.682 6.79 3618.972 3618.972 0 0 0-2.462 4.493c.062.088.169.231.289.364.55.61 1.631 1.623 3.624 3.462l3.931 3.674.377-.298c.907-.709 3.554-3.479 6.055-6.293.425-.47.73-.814.946-1.084.175-.22.28-.36.319-.501.031-.117.002-.227-.024-.379l-.004-.02c-.224-1.572-1.032-7.753-1.728-13.33-.358-3.022-.85-6.782-1.096-8.349l-.002-.01c-.042-.301-.087-.603-.132-.891ZM9.118 1.264C9.91.628 10.537.27 11.028.144c.727-.186 1.27.003 1.713.53.186.209 2.107 1.972 4.287 3.912 2.02 1.783 3.434 3.16 3.897 3.743.326.41.322.756.296.873a1.046 1.046 0 0 1-.005.018c-.047.188-.669 1.512-1.374 2.947a4348.55 4348.55 0 0 0-8.923 18.54c-7.335 15.32-8.808 18.396-9.217 19.015-.235.355-.419.404-.525.437a.815.815 0 0 1-.249.036.745.745 0 0 1-.647-.363C.176 49.67.04 49.222.04 48.7c0-.286.09-.754.316-1.434.452-1.356 1.466-3.722 3.225-7.53l1.432-3.083-.084-2.787a72.902 72.902 0 0 0-.156-2.53 7.307 7.307 0 0 0-.539-.046c-.463-.024-.764-.062-.96-.124-.304-.096-.48-.252-.598-.438-.105-.165-.17-.374-.17-.663 0-.134-.081-.348-.178-.481l-.019-.028c-.293-.448-.406-.831-.373-1.234.04-.484.34-1.052 1.08-1.91l.759-.869c-.103-.325-.471-1.513-.854-2.787-.737-2.339-1.004-3.238-1.018-3.578-.016-.393.134-.59.27-.715a.721.721 0 0 1 .192-.125 89.87 89.87 0 0 1-.414-2.782 231.651 231.651 0 0 0-.625-4.652l-.292-1.976a.71.71 0 0 1 .215-.62l1.589-1.501C4.87 4.86 7.446 2.599 9.118 1.264Zm-1.833 33.75a.819.819 0 0 1-.406.208.73.73 0 0 1-.491-.063l.048 1.618v.009l.849-1.773Zm5.874.697c-.035.087-.07.175-.107.261a20.92 20.92 0 0 1-.36.798.688.688 0 0 1 .457.007l.01.004v-1.07Zm.72-1.892-.015.018a.745.745 0 0 1-.407.236c.02.195.027.378 0 .592l.422-.846ZM7.7 31.175c-.268.027-.489.055-.6.07-.006.056-.013.13-.016.194-.005.19 0 .42.004.694.003.111.006.225.011.338.232-.471.459-.956.6-1.296Zm2.12-1.456a2.04 2.04 0 0 1-.415.31c.064.104.099.222.104.341l.132-.277.18-.374Zm-.14-2.374c-.654.079-1.882.153-2.974.173h-1.87l-.281.435c-.09.141-.17.331-.203.414.102.21.189.508.226.788h.007c.364.006.928-.023 1.805-.07 1.243-.06 1.88-.052 2.315-.291.154-.086.266-.215.387-.393.176-.261.354-.605.587-1.056Zm2.136-1.784c-.157.16-.331.3-.52.422a.631.631 0 0 1 .182.281l.337-.703Zm7.205-1.478c-.222.442-.445.883-.667 1.32a.787.787 0 0 1 .61.007c.036.018.145.07.243.2-.032-.165-.067-.33-.105-.493-.088-.351-.137-.633-.08-1.034h-.001ZM11.415 2.546c-.358.319-1.039.879-1.725 1.394C6.903 5.989 5.087 7.59 4.301 8.662c-.28.38-.458.605-.556.852-.15.38-.103.798-.068 1.824.063 1.923.833 6.669 1.493 9.686.262 1.199.483 2.11.654 2.394.25.426.364.71.398.894a.923.923 0 0 1-.184.764l1.27-.01c.863-.014 1.523.003 2.056-.019.424-.017.75-.052 1.034-.187.336-.159.596-.458.921-.955.62-.948 1.373-2.515 2.705-5.103 1.789-3.448 3.6-7.076 4.047-8.015l.582-1.227-.62-.466c-.595-.458-2.45-2.263-4.12-4.027a59.654 59.654 0 0 0-2.498-2.52ZM5.81 24.876v-.001l-.013-.03.013.031Zm-.71-.835.027-.011a.55.55 0 0 0-.028.011Zm19.904-11.777v.01-.01Zm.002-.016v-.034.034ZM9.82 6.587c-.587.424-.81.823-.81 1.9 0 .787.12 1.157.344 1.42.158.186.388.339.77.494.352.144.603.207.838.209.347.002.688-.12 1.285-.525.707-.483.98-.864 1.036-1.238.052-.352-.09-.812-.574-1.54-.412-.619-.853-.95-1.29-1.072-.489-.139-1.016-.05-1.586.342l-.013.01Zm2.015 2.028a6.288 6.288 0 0 0-.306-.52c-.19-.284-.326-.488-.531-.5-.113-.007-.224.058-.352.146-.218.159-.218.34-.218.745 0 .198.02.419.028.504.047.025.133.068.204.097.133.054.222.102.312.103.04 0 .071-.027.12-.054a4.29 4.29 0 0 0 .358-.225c.147-.1.299-.223.385-.296ZM9.12 1.263l-.002.002.002-.002Z\"\n    />\n  </g>,\n  { width: 26, height: 62, fill: \"none\" },\n);\n\n// custom\nexport const SelectionIcon = createIcon(\n  <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M6 6l4.153 11.793a0.365 .365 0 0 0 .331 .207a0.366 .366 0 0 0 .332 -.207l2.184 -4.793l4.787 -1.994a0.355 .355 0 0 0 .213 -.323a0.355 .355 0 0 0 -.213 -.323l-11.787 -4.36z\" />\n    <path d=\"M13.5 13.5l4.5 4.5\" />\n  </g>,\n  { fill: \"none\", width: 22, height: 22, strokeWidth: 1.25 },\n);\n\n// tabler-icons: square\nexport const RectangleIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\"></rect>\n  </g>,\n  tablerIconProps,\n);\n\n// tabler-icons: square-rotated\nexport const DiamondIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M10.5 20.4l-6.9 -6.9c-.781 -.781 -.781 -2.219 0 -3l6.9 -6.9c.781 -.781 2.219 -.781 3 0l6.9 6.9c.781 .781 .781 2.219 0 3l-6.9 6.9c-.781 .781 -2.219 .781 -3 0z\" />\n  </g>,\n\n  tablerIconProps,\n);\n\n// tabler-icons: circle\nexport const EllipseIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\n  </g>,\n\n  tablerIconProps,\n);\n\n// tabler-icons: arrow-narrow-right\nexport const ArrowIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n    <line x1=\"15\" y1=\"16\" x2=\"19\" y2=\"12\" />\n    <line x1=\"15\" y1=\"8\" x2=\"19\" y2=\"12\" />\n  </g>,\n  tablerIconProps,\n);\n\n// custom?\nexport const LineIcon = createIcon(\n  <path d=\"M4.167 10h11.666\" strokeWidth=\"1.5\" />,\n  modifiedTablerIconProps,\n);\n\nexport const PenModeIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <path d=\"M20 17v-12c0 -1.121 -.879 -2 -2 -2s-2 .879 -2 2v12l2 2l2 -2z\"></path>\n    <path d=\"M16 7h4\"></path>\n    <path d=\"M18 19h-13a2 2 0 1 1 0 -4h4a2 2 0 1 0 0 -4h-3\"></path>\n  </g>,\n  tablerIconProps,\n);\n\n// modified tabler-icons: pencil\nexport const FreedrawIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path\n      clipRule=\"evenodd\"\n      d=\"m7.643 15.69 7.774-7.773a2.357 2.357 0 1 0-3.334-3.334L4.31 12.357a3.333 3.333 0 0 0-.977 2.357v1.953h1.953c.884 0 1.732-.352 2.357-.977Z\"\n    />\n    <path d=\"m11.25 5.417 3.333 3.333\" />\n  </g>,\n\n  modifiedTablerIconProps,\n);\n\n// tabler-icons: typography\nexport const TextIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <line x1=\"4\" y1=\"20\" x2=\"7\" y2=\"20\" />\n    <line x1=\"14\" y1=\"20\" x2=\"21\" y2=\"20\" />\n    <line x1=\"6.9\" y1=\"15\" x2=\"13.8\" y2=\"15\" />\n    <line x1=\"10.2\" y1=\"6.3\" x2=\"16\" y2=\"20\" />\n    <polyline points=\"5 20 11 4 13 4 20 20\"></polyline>\n  </g>,\n  tablerIconProps,\n);\n\n// modified tabler-icons: photo\nexport const ImageIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path d=\"M12.5 6.667h.01\" />\n    <path d=\"M4.91 2.625h10.18a2.284 2.284 0 0 1 2.285 2.284v10.182a2.284 2.284 0 0 1-2.284 2.284H4.909a2.284 2.284 0 0 1-2.284-2.284V4.909a2.284 2.284 0 0 1 2.284-2.284Z\" />\n    <path d=\"m3.333 12.5 3.334-3.333c.773-.745 1.726-.745 2.5 0l4.166 4.166\" />\n    <path d=\"m11.667 11.667.833-.834c.774-.744 1.726-.744 2.5 0l1.667 1.667\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\n// tabler-icons: eraser\nexport const EraserIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M19 20h-10.5l-4.21 -4.3a1 1 0 0 1 0 -1.41l10 -10a1 1 0 0 1 1.41 0l5 5a1 1 0 0 1 0 1.41l-9.2 9.3\" />\n    <path d=\"M18 13.3l-6.3 -6.3\" />\n  </g>,\n  tablerIconProps,\n);\n\nexport const ZoomInIcon = createIcon(\n  <path strokeWidth=\"1.25\" d=\"M10 4.167v11.666M4.167 10h11.666\" />,\n  modifiedTablerIconProps,\n);\n\nexport const ZoomOutIcon = createIcon(\n  <path d=\"M5 10h10\" strokeWidth=\"1.25\" />,\n  modifiedTablerIconProps,\n);\n\nexport const TrashIcon = createIcon(\n  <path\n    strokeWidth=\"1.25\"\n    d=\"M3.333 5.833h13.334M8.333 9.167v5M11.667 9.167v5M4.167 5.833l.833 10c0 .92.746 1.667 1.667 1.667h6.666c.92 0 1.667-.746 1.667-1.667l.833-10M7.5 5.833v-2.5c0-.46.373-.833.833-.833h3.334c.46 0 .833.373.833.833v2.5\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const DuplicateIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path d=\"M14.375 6.458H8.958a2.5 2.5 0 0 0-2.5 2.5v5.417a2.5 2.5 0 0 0 2.5 2.5h5.417a2.5 2.5 0 0 0 2.5-2.5V8.958a2.5 2.5 0 0 0-2.5-2.5Z\" />\n    <path\n      clipRule=\"evenodd\"\n      d=\"M11.667 3.125c.517 0 .986.21 1.325.55.34.338.55.807.55 1.325v1.458H8.333c-.485 0-.927.185-1.26.487-.343.312-.57.75-.609 1.24l-.005 5.357H5a1.87 1.87 0 0 1-1.326-.55 1.87 1.87 0 0 1-.549-1.325V5c0-.518.21-.987.55-1.326.338-.34.807-.549 1.325-.549h6.667Z\"\n    />\n  </g>,\n  modifiedTablerIconProps,\n);\n\nexport const MoonIcon = createIcon(\n  <path\n    clipRule=\"evenodd\"\n    d=\"M10 2.5h.328a6.25 6.25 0 0 0 6.6 10.372A7.5 7.5 0 1 1 10 2.493V2.5Z\"\n    stroke=\"currentColor\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const SunIcon = createIcon(\n  <g\n    stroke=\"currentColor\"\n    strokeWidth=\"1.25\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <path d=\"M10 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM10 4.167V2.5M14.167 5.833l1.166-1.166M15.833 10H17.5M14.167 14.167l1.166 1.166M10 15.833V17.5M5.833 14.167l-1.166 1.166M5 10H3.333M5.833 5.833 4.667 4.667\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\nexport const HamburgerMenuIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"></line>\n    <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"></line>\n    <line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"></line>\n  </g>,\n  tablerIconProps,\n);\n\nexport const ExportIcon = createIcon(\n  <path\n    strokeWidth=\"1.25\"\n    d=\"M3.333 14.167v1.666c0 .92.747 1.667 1.667 1.667h10c.92 0 1.667-.746 1.667-1.667v-1.666M5.833 9.167 10 13.333l4.167-4.166M10 3.333v10\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const HelpIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <circle cx=\"12\" cy=\"12\" r=\"9\"></circle>\n    <line x1=\"12\" y1=\"17\" x2=\"12\" y2=\"17.01\"></line>\n    <path d=\"M12 13.5a1.5 1.5 0 0 1 1 -1.5a2.6 2.6 0 1 0 -3 -4\"></path>\n  </g>,\n  tablerIconProps,\n);\n\nexport const ExternalLinkIcon = createIcon(\n  <path\n    strokeWidth=\"1.25\"\n    d=\"M9.167 5.833H5.833c-1.254 0-2.5 1.282-2.5 2.5v5.834c0 1.283 1.252 2.5 2.5 2.5h5.834c1.251 0 2.5-1.25 2.5-2.5v-3.334M8.333 11.667l8.334-8.334M12.5 3.333h4.167V7.5\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const GithubIcon = createIcon(\n  <path\n    d=\"M7.5 15.833c-3.583 1.167-3.583-2.083-5-2.5m10 4.167v-2.917c0-.833.083-1.166-.417-1.666 2.334-.25 4.584-1.167 4.584-5a3.833 3.833 0 0 0-1.084-2.667 3.5 3.5 0 0 0-.083-2.667s-.917-.25-2.917 1.084a10.25 10.25 0 0 0-5.166 0C5.417 2.333 4.5 2.583 4.5 2.583a3.5 3.5 0 0 0-.083 2.667 3.833 3.833 0 0 0-1.084 2.667c0 3.833 2.25 4.75 4.584 5-.5.5-.5 1-.417 1.666V17.5\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const DiscordIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path d=\"M7.5 10.833a.833.833 0 1 0 0-1.666.833.833 0 0 0 0 1.666ZM12.5 10.833a.833.833 0 1 0 0-1.666.833.833 0 0 0 0 1.666ZM6.25 6.25c2.917-.833 4.583-.833 7.5 0M5.833 13.75c2.917.833 5.417.833 8.334 0\" />\n    <path d=\"M12.917 14.167c0 .833 1.25 2.5 1.666 2.5 1.25 0 2.361-1.39 2.917-2.5.556-1.39.417-4.861-1.25-9.584-1.214-.846-2.5-1.116-3.75-1.25l-.833 2.084M7.083 14.167c0 .833-1.13 2.5-1.526 2.5-1.191 0-2.249-1.39-2.778-2.5-.529-1.39-.397-4.861 1.19-9.584 1.157-.846 2.318-1.116 3.531-1.25l.833 2.084\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\nexport const TwitterIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <path d=\"M22 4.01c-1 .49 -1.98 .689 -3 .99c-1.121 -1.265 -2.783 -1.335 -4.38 -.737s-2.643 2.06 -2.62 3.737v1c-3.245 .083 -6.135 -1.395 -8 -4c0 0 -4.182 7.433 4 11c-1.872 1.247 -3.739 2.088 -6 2c3.308 1.803 6.913 2.423 10.034 1.517c3.58 -1.04 6.522 -3.723 7.651 -7.742a13.84 13.84 0 0 0 .497 -3.753c-.002 -.249 1.51 -2.772 1.818 -4.013z\"></path>\n  </g>,\n  tablerIconProps,\n);\n\nexport const checkIcon = createIcon(\n  <polyline fill=\"none\" stroke=\"currentColor\" points=\"20 6 9 17 4 12\" />,\n  {\n    width: 24,\n    height: 24,\n  },\n);\n\nexport const LinkIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path d=\"M8.333 11.667a2.917 2.917 0 0 0 4.167 0l3.333-3.334a2.946 2.946 0 1 0-4.166-4.166l-.417.416\" />\n    <path d=\"M11.667 8.333a2.917 2.917 0 0 0-4.167 0l-3.333 3.334a2.946 2.946 0 0 0 4.166 4.166l.417-.416\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\nexport const save = createIcon(\n  \"M433.941 129.941l-83.882-83.882A48 48 0 0 0 316.118 32H48C21.49 32 0 53.49 0 80v352c0 26.51 21.49 48 48 48h352c26.51 0 48-21.49 48-48V163.882a48 48 0 0 0-14.059-33.941zM224 416c-35.346 0-64-28.654-64-64 0-35.346 28.654-64 64-64s64 28.654 64 64c0 35.346-28.654 64-64 64zm96-304.52V212c0 6.627-5.373 12-12 12H76c-6.627 0-12-5.373-12-12V108c0-6.627 5.373-12 12-12h228.52c3.183 0 6.235 1.264 8.485 3.515l3.48 3.48A11.996 11.996 0 0 1 320 111.48z\",\n  { width: 448, height: 512 },\n);\n\nexport const saveAs = createIcon(\n  \"M252 54L203 8a28 27 0 00-20-8H28C12 0 0 12 0 27v195c0 15 12 26 28 26h204c15 0 28-11 28-26V73a28 27 0 00-8-19zM130 213c-21 0-37-16-37-36 0-19 16-35 37-35 20 0 37 16 37 35 0 20-17 36-37 36zm56-169v56c0 4-4 6-7 6H44c-4 0-7-2-7-6V42c0-4 3-7 7-7h133l4 2 3 2a7 7 0 012 5z M296 201l87 95-188 205-78 9c-10 1-19-8-18-20l9-84zm141-14l-41-44a31 31 0 00-46 0l-38 41 87 95 38-42c13-14 13-36 0-50z\",\n  { width: 448, height: 512 },\n);\n\n// tabler-icon: folder\nexport const LoadIcon = createIcon(\n  <path\n    d=\"m9.257 6.351.183.183H15.819c.34 0 .727.182 1.051.506.323.323.505.708.505 1.05v5.819c0 .316-.183.7-.52 1.035-.337.338-.723.522-1.037.522H4.182c-.352 0-.74-.181-1.058-.5-.318-.318-.499-.705-.499-1.057V5.182c0-.351.181-.736.5-1.054.32-.321.71-.503 1.057-.503H6.53l2.726 2.726Z\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const clipboard = createIcon(\n  \"M384 112v352c0 26.51-21.49 48-48 48H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h80c0-35.29 28.71-64 64-64s64 28.71 64 64h80c26.51 0 48 21.49 48 48zM192 40c-13.255 0-24 10.745-24 24s10.745 24 24 24 24-10.745 24-24-10.745-24-24-24m96 114v-20a6 6 0 0 0-6-6H102a6 6 0 0 0-6 6v20a6 6 0 0 0 6 6h180a6 6 0 0 0 6-6z\",\n  { width: 384, height: 512 },\n);\n\nexport const palette = createIcon(\n  \"M204.3 5C104.9 24.4 24.8 104.3 5.2 203.4c-37 187 131.7 326.4 258.8 306.7 41.2-6.4 61.4-54.6 42.5-91.7-23.1-45.4 9.9-98.4 60.9-98.4h79.7c35.8 0 64.8-29.6 64.9-65.3C511.5 97.1 368.1-26.9 204.3 5zM96 320c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm32-128c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128-64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32zm128 64c-17.7 0-32-14.3-32-32s14.3-32 32-32 32 14.3 32 32-14.3 32-32 32z\",\n);\n\nexport const ExportImageIcon = createIcon(\n  <g strokeWidth=\"1.25\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <path d=\"M15 8h.01\"></path>\n    <path d=\"M12 20h-5a3 3 0 0 1 -3 -3v-10a3 3 0 0 1 3 -3h10a3 3 0 0 1 3 3v5\"></path>\n    <path d=\"M4 15l4 -4c.928 -.893 2.072 -.893 3 0l4 4\"></path>\n    <path d=\"M14 14l1 -1c.617 -.593 1.328 -.793 2.009 -.598\"></path>\n    <path d=\"M19 16v6\"></path>\n    <path d=\"M22 19l-3 3l-3 -3\"></path>\n  </g>,\n  tablerIconProps,\n);\n\nexport const exportToFileIcon = createIcon(\n  \"M216 0h80c13.3 0 24 10.7 24 24v168h87.7c17.8 0 26.7 21.5 14.1 34.1L269.7 378.3c-7.5 7.5-19.8 7.5-27.3 0L90.1 226.1c-12.6-12.6-3.7-34.1 14.1-34.1H192V24c0-13.3 10.7-24 24-24zm296 376v112c0 13.3-10.7 24-24 24H24c-13.3 0-24-10.7-24-24V376c0-13.3 10.7-24 24-24h146.7l49 49c20.1 20.1 52.5 20.1 72.6 0l49-49H488c13.3 0 24 10.7 24 24zm-124 88c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20zm64 0c0-11-9-20-20-20s-20 9-20 20 9 20 20 20 20-9 20-20z\",\n  { width: 512, height: 512 },\n);\n\nexport const zoomIn = createIcon(\n  \"M416 208H272V64c0-17.67-14.33-32-32-32h-32c-17.67 0-32 14.33-32 32v144H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h144v144c0 17.67 14.33 32 32 32h32c17.67 0 32-14.33 32-32V304h144c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\",\n  { width: 448, height: 512 },\n);\n\nexport const zoomOut = createIcon(\n  \"M416 208H32c-17.67 0-32 14.33-32 32v32c0 17.67 14.33 32 32 32h384c17.67 0 32-14.33 32-32v-32c0-17.67-14.33-32-32-32z\",\n  { width: 448, height: 512 },\n);\n\nexport const done = createIcon(\n  \"M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z\",\n);\n\nexport const menu = createIcon(\n  \"M16 132h416c8.837 0 16-7.163 16-16V76c0-8.837-7.163-16-16-16H16C7.163 60 0 67.163 0 76v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16zm0 160h416c8.837 0 16-7.163 16-16v-40c0-8.837-7.163-16-16-16H16c-8.837 0-16 7.163-16 16v40c0 8.837 7.163 16 16 16z\",\n);\n\nexport const UndoIcon = createIcon(\n  <path\n    d=\"M7.5 10.833 4.167 7.5 7.5 4.167M4.167 7.5h9.166a3.333 3.333 0 0 1 0 6.667H12.5\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const RedoIcon = createIcon(\n  <path\n    d=\"M12.5 10.833 15.833 7.5 12.5 4.167M15.833 7.5H6.667a3.333 3.333 0 1 0 0 6.667H7.5\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const questionCircle = createIcon(\n  \"M504 256c0 136.997-111.043 248-248 248S8 392.997 8 256C8 119.083 119.043 8 256 8s248 111.083 248 248zM262.655 90c-54.497 0-89.255 22.957-116.549 63.758-3.536 5.286-2.353 12.415 2.715 16.258l34.699 26.31c5.205 3.947 12.621 3.008 16.665-2.122 17.864-22.658 30.113-35.797 57.303-35.797 20.429 0 45.698 13.148 45.698 32.958 0 14.976-12.363 22.667-32.534 33.976C247.128 238.528 216 254.941 216 296v4c0 6.627 5.373 12 12 12h56c6.627 0 12-5.373 12-12v-1.333c0-28.462 83.186-29.647 83.186-106.667 0-58.002-60.165-102-116.531-102zM256 338c-25.365 0-46 20.635-46 46 0 25.364 20.635 46 46 46s46-20.636 46-46c0-25.365-20.635-46-46-46z\",\n  { mirror: true },\n);\n\nexport const share = createIcon(\n  <path\n    d=\"M5 12.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM15 7.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM15 17.5a2.5 2.5 0 1 0 0-5 2.5 2.5 0 0 0 0 5ZM7.25 8.917l5.5-2.834M7.25 11.083l5.5 2.834\"\n    strokeWidth=\"1.5\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const shareIOS = createIcon(\n  \"M16 5l-1.42 1.42-1.59-1.59V16h-1.98V4.83L9.42 6.42 8 5l4-4 4 4zm4 5v11c0 1.1-.9 2-2 2H6c-1.11 0-2-.9-2-2V10c0-1.11.89-2 2-2h3v2H6v11h12V10h-3V8h3c1.1 0 2 .89 2 2z\",\n  { width: 24, height: 24 },\n);\n\nexport const shareWindows = createIcon(\n  <>\n    <path\n      fill=\"currentColor\"\n      d=\"M40 5.6v6.1l-4.1.7c-8.9 1.4-16.5 6.9-20.6 15C13 32 10.9 43 12.4 43c.4 0 2.4-1.3 4.4-3 5-3.9 12.1-7 18.2-7.7l5-.6v12.8l11.2-11.3L62.5 22 51.2 10.8 40-.5v6.1zm10.2 22.6L44 34.5v-6.8l-6.9.6c-3.9.3-9.8 1.7-13.2 3.1-3.5 1.4-6.5 2.4-6.7 2.2-.9-1 3-7.5 6.4-10.8C28 18.6 34.4 16 40.1 16c3.7 0 3.9-.1 3.9-3.2V9.5l6.2 6.3 6.3 6.2-6.3 6.2z\"\n    />\n    <path\n      stroke=\"currentColor\"\n      fill=\"currentColor\"\n      d=\"M0 36v20h48v-6.2c0-6 0-6.1-2-4.3-1.1 1-2 2.9-2 4.2V52H4V34c0-17.3-.1-18-2-18s-2 .7-2 20z\"\n    />\n  </>,\n  { width: 64, height: 64 },\n);\n\n// Icon imported form Storybook\n// Storybook is licensed under MIT https://github.com/storybookjs/storybook/blob/next/LICENSE\nexport const resetZoom = createIcon(\n  <path\n    stroke=\"currentColor\"\n    strokeWidth=\"40\"\n    fill=\"currentColor\"\n    d=\"M148 560a318 318 0 0 0 522 110 316 316 0 0 0 0-450 316 316 0 0 0-450 0c-11 11-21 22-30 34v4h47c25 0 46 21 46 46s-21 45-46 45H90c-13 0-25-6-33-14-9-9-14-20-14-33V156c0-25 20-45 45-45s45 20 45 45v32l1 1a401 401 0 0 1 623 509l212 212a42 42 0 0 1-59 59L698 757A401 401 0 0 1 65 570a42 42 0 0 1 83-10z\"\n  />,\n  { width: 1024 },\n);\n\nexport const BringForwardIcon = createIcon(\n  <>\n    <g\n      clipPath=\"url(#a)\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path\n        d=\"M13.889 4.167H8.333c-.767 0-1.389.622-1.389 1.389v5.555c0 .767.622 1.389 1.39 1.389h5.555c.767 0 1.389-.622 1.389-1.389V5.556c0-.767-.622-1.39-1.39-1.39Z\"\n        fill=\"currentColor\"\n      />\n      <path d=\"M12.5 12.5v1.389a1.389 1.389 0 0 1-1.389 1.389H5.556a1.389 1.389 0 0 1-1.39-1.39V8.334a1.389 1.389 0 0 1 1.39-1.389h1.388\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const SendBackwardIcon = createIcon(\n  <>\n    <g\n      clipPath=\"url(#a)\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M6.944 12.5H12.5v1.389a1.389 1.389 0 0 1-1.389 1.389H5.556a1.389 1.389 0 0 1-1.39-1.39V8.334a1.389 1.389 0 0 1 1.39-1.389h1.388\"\n        fill=\"currentColor\"\n      />\n      <path d=\"M13.889 4.167H8.333c-.767 0-1.389.621-1.389 1.389v5.555c0 .767.622 1.389 1.39 1.389h5.555c.767 0 1.389-.622 1.389-1.389V5.556c0-.768-.622-1.39-1.39-1.39Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const BringToFrontIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M8.775 6.458h2.45a2.316 2.316 0 0 1 2.317 2.316v2.452a2.316 2.316 0 0 1-2.316 2.316H8.774a2.316 2.316 0 0 1-2.317-2.316V8.774a2.316 2.316 0 0 1 2.317-2.316Z\"\n        fill=\"currentColor\"\n      />\n      <path d=\"M5.441 9.792h2.451a2.316 2.316 0 0 1 2.316 2.316v2.45a2.316 2.316 0 0 1-2.316 2.317h-2.45a2.316 2.316 0 0 1-2.317-2.316v-2.451a2.316 2.316 0 0 1 2.316-2.316ZM12.108 3.125h2.45a2.316 2.316 0 0 1 2.317 2.316v2.451a2.316 2.316 0 0 1-2.316 2.316h-2.451a2.316 2.316 0 0 1-2.316-2.316v-2.45a2.316 2.316 0 0 1 2.316-2.317Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const SendToBackIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\">\n      <path\n        d=\"M5.441 9.792h2.451a2.316 2.316 0 0 1 2.316 2.316v2.45a2.316 2.316 0 0 1-2.316 2.317h-2.45a2.316 2.316 0 0 1-2.317-2.316v-2.451a2.316 2.316 0 0 1 2.316-2.316Z\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n      />\n      <path\n        d=\"M5.441 9.792h2.451a2.316 2.316 0 0 1 2.316 2.316v2.45a2.316 2.316 0 0 1-2.316 2.317h-2.45a2.316 2.316 0 0 1-2.317-2.316v-2.451a2.316 2.316 0 0 1 2.316-2.316Z\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n      />\n      <mask id=\"SendToBackIcon\" fill=\"#fff\">\n        <path\n          fillRule=\"evenodd\"\n          clipRule=\"evenodd\"\n          d=\"M9.167 5.833v2.06a2.941 2.941 0 0 0 2.94 2.94h2.06v.393a2.941 2.941 0 0 1-2.941 2.94h-.393v-2.058a2.941 2.941 0 0 0-2.94-2.941h-2.06v-.393a2.941 2.941 0 0 1 2.942-2.94h.392Z\"\n        />\n      </mask>\n      <path\n        fillRule=\"evenodd\"\n        clipRule=\"evenodd\"\n        d=\"M9.167 5.833v2.06a2.941 2.941 0 0 0 2.94 2.94h2.06v.393a2.941 2.941 0 0 1-2.941 2.94h-.393v-2.058a2.941 2.941 0 0 0-2.94-2.941h-2.06v-.393a2.941 2.941 0 0 1 2.942-2.94h.392Z\"\n        fill=\"currentColor\"\n      />\n      <path\n        d=\"M9.167 5.833h1.25v-1.25h-1.25v1.25Zm5 5h1.25v-1.25h-1.25v1.25Zm-3.334 3.334h-1.25v1.25h1.25v-1.25Zm-5-5h-1.25v1.25h1.25v-1.25Zm2.084-3.334v2.06h2.5v-2.06h-2.5Zm0 2.06a4.191 4.191 0 0 0 4.19 4.19v-2.5a1.691 1.691 0 0 1-1.69-1.69h-2.5Zm4.19 4.19h2.06v-2.5h-2.06v2.5Zm.81-1.25v.393h2.5v-.393h-2.5Zm0 .393c0 .933-.758 1.69-1.691 1.69v2.5a4.191 4.191 0 0 0 4.19-4.19h-2.5Zm-1.691 1.69h-.393v2.5h.393v-2.5Zm.857 1.25v-2.058h-2.5v2.059h2.5Zm0-2.058a4.191 4.191 0 0 0-4.19-4.191v2.5c.933 0 1.69.757 1.69 1.69h2.5Zm-4.19-4.191h-2.06v2.5h2.06v-2.5Zm-.81 1.25v-.393h-2.5v.393h2.5Zm0-.393c0-.934.758-1.69 1.692-1.69v-2.5a4.191 4.191 0 0 0-4.192 4.19h2.5Zm1.692-1.69h.392v-2.5h-.392v2.5Z\"\n        fill=\"currentColor\"\n        mask=\"url(#SendToBackIcon)\"\n      />\n      <path\n        d=\"M12.108 3.125h2.45a2.316 2.316 0 0 1 2.317 2.316v2.451a2.316 2.316 0 0 1-2.316 2.316h-2.451a2.316 2.316 0 0 1-2.316-2.316v-2.45a2.316 2.316 0 0 1 2.316-2.317Z\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\n//\n// Align action icons created from scratch to match those of z-index actions\n// Note: vertical align icons are flipped so the larger item is always the\n// first one the user sees. Horizontal align icons should not be flipped since\n// that would make them lie about their function.\n//\nexport const AlignTopIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M3.333 3.333h13.334\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path d=\"M13.542 6.458h-.417c-.92 0-1.667.747-1.667 1.667v7.083c0 .92.746 1.667 1.667 1.667h.417c.92 0 1.666-.746 1.666-1.667V8.125c0-.92-.746-1.667-1.666-1.667ZM6.875 6.458h-.417c-.92 0-1.666.747-1.666 1.667v3.75c0 .92.746 1.667 1.666 1.667h.417c.92 0 1.667-.746 1.667-1.667v-3.75c0-.92-.747-1.667-1.667-1.667Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const AlignBottomIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M3.333 16.667h13.334\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path d=\"M6.875 3.125h-.417c-.92 0-1.666.746-1.666 1.667v7.083c0 .92.746 1.667 1.666 1.667h.417c.92 0 1.667-.746 1.667-1.667V4.792c0-.92-.747-1.667-1.667-1.667ZM13.542 5.817h-.417c-.92 0-1.667.747-1.667 1.667v4.391c0 .92.746 1.667 1.667 1.667h.417c.92 0 1.666-.746 1.666-1.667V7.484c0-.92-.746-1.667-1.666-1.667Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const AlignLeftIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M3.333 3.333v13.334\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path d=\"M15.208 4.792H8.125c-.92 0-1.667.746-1.667 1.666v.417c0 .92.747 1.667 1.667 1.667h7.083c.92 0 1.667-.747 1.667-1.667v-.417c0-.92-.746-1.666-1.667-1.666ZM12.516 11.458H8.125c-.92 0-1.667.746-1.667 1.667v.417c0 .92.747 1.666 1.667 1.666h4.391c.92 0 1.667-.746 1.667-1.666v-.417c0-.92-.746-1.667-1.667-1.667Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const AlignRightIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M16.667 3.333v13.334\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path d=\"M11.875 4.792H4.792c-.92 0-1.667.746-1.667 1.666v.417c0 .92.746 1.667 1.667 1.667h7.083c.92 0 1.667-.747 1.667-1.667v-.417c0-.92-.746-1.666-1.667-1.666ZM11.683 11.458H7.292c-.92 0-1.667.746-1.667 1.667v.417c0 .92.746 1.666 1.667 1.666h4.39c.921 0 1.667-.746 1.667-1.666v-.417c0-.92-.746-1.667-1.666-1.667Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const DistributeHorizontallyIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M16.667 3.333v13.334M3.333 3.333v13.334\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path d=\"M14.375 10.208v-.416c0-.92-.746-1.667-1.667-1.667H7.292c-.92 0-1.667.746-1.667 1.667v.416c0 .92.746 1.667 1.667 1.667h5.416c.92 0 1.667-.746 1.667-1.667Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const DistributeVerticallyIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\" stroke=\"currentColor\" strokeWidth=\"1.25\">\n      <path\n        d=\"M3.333 3.333h13.334M3.333 16.667h13.334\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n      <path d=\"M10.208 5.625h-.416c-.92 0-1.667.746-1.667 1.667v5.416c0 .92.746 1.667 1.667 1.667h.416c.92 0 1.667-.746 1.667-1.667V7.292c0-.92-.746-1.667-1.667-1.667Z\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const CenterVerticallyIcon = createIcon(\n  <g stroke=\"currentColor\" strokeWidth=\"1.25\">\n    <path d=\"M1.667 10h2.916\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M8.333 10h3.334\" strokeLinejoin=\"round\" />\n    <path d=\"M15.417 10h2.916\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M6.875 4.792h-.417c-.92 0-1.666.746-1.666 1.666v7.084c0 .92.746 1.666 1.666 1.666h.417c.92 0 1.667-.746 1.667-1.666V6.458c0-.92-.747-1.666-1.667-1.666ZM13.542 6.458h-.417c-.92 0-1.667.747-1.667 1.667v3.75c0 .92.746 1.667 1.667 1.667h.417c.92 0 1.666-.746 1.666-1.667v-3.75c0-.92-.746-1.667-1.666-1.667Z\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\nexport const CenterHorizontallyIcon = createIcon(\n  <g stroke=\"currentColor\" strokeWidth=\"1.25\">\n    <path d=\"M10 18.333v-2.916\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M10 11.667V8.333\" strokeLinejoin=\"round\" />\n    <path d=\"M10 4.583V1.667\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n    <path d=\"M4.792 13.125v.417c0 .92.746 1.666 1.666 1.666h7.084c.92 0 1.666-.746 1.666-1.666v-.417c0-.92-.746-1.667-1.666-1.667H6.458c-.92 0-1.666.746-1.666 1.667ZM6.458 6.458v.417c0 .92.747 1.667 1.667 1.667h3.75c.92 0 1.667-.747 1.667-1.667v-.417c0-.92-.746-1.666-1.667-1.666h-3.75c-.92 0-1.667.746-1.667 1.666Z\" />\n  </g>,\n  modifiedTablerIconProps,\n);\n\nexport const usersIcon = createIcon(\n  <g strokeWidth=\"1.5\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <circle cx=\"9\" cy=\"7\" r=\"4\"></circle>\n    <path d=\"M3 21v-2a4 4 0 0 1 4 -4h4a4 4 0 0 1 4 4v2\"></path>\n    <path d=\"M16 3.13a4 4 0 0 1 0 7.75\"></path>\n    <path d=\"M21 21v-2a4 4 0 0 0 -3 -3.85\"></path>\n  </g>,\n  tablerIconProps,\n);\n\n// not mirrored because it's inspired by a playback control, which is always RTL\nexport const start = createIcon(\n  \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm115.7 272l-176 101c-15.8 8.8-35.7-2.5-35.7-21V152c0-18.4 19.8-29.8 35.7-21l176 107c16.4 9.2 16.4 32.9 0 42z\",\n);\n\nexport const stop = createIcon(\n  \"M256 8C119 8 8 119 8 256s111 248 248 248 248-111 248-248S393 8 256 8zm96 328c0 8.8-7.2 16-16 16H176c-8.8 0-16-7.2-16-16V176c0-8.8 7.2-16 16-16h160c8.8 0 16 7.2 16 16v160z\",\n);\n\nexport const CloseIcon = createIcon(\n  <>\n    <g\n      clipPath=\"url(#a)\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path d=\"M15 5 5 15M5 5l10 10\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const back = createIcon(\n  \"M34.52 239.03L228.87 44.69c9.37-9.37 24.57-9.37 33.94 0l22.67 22.67c9.36 9.36 9.37 24.52.04 33.9L131.49 256l154.02 154.75c9.34 9.38 9.32 24.54-.04 33.9l-22.67 22.67c-9.37 9.37-24.57 9.37-33.94 0L34.52 272.97c-9.37-9.37-9.37-24.57 0-33.94z\",\n  { width: 320, height: 512, style: { marginLeft: \"-0.2rem\" }, mirror: true },\n);\n\nexport const clone = createIcon(\n  \"M464 0c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48H176c-26.51 0-48-21.49-48-48V48c0-26.51 21.49-48 48-48h288M176 416c-44.112 0-80-35.888-80-80V128H48c-26.51 0-48 21.49-48 48v288c0 26.51 21.49 48 48 48h288c26.51 0 48-21.49 48-48v-48H176z\",\n  { mirror: true },\n);\n\n// modified https://feathericons.com/?query=shield\nexport const shield = createIcon(\n  \"M11.553 22.894a.998.998 0 00.894 0s3.037-1.516 5.465-4.097C19.616 16.987 21 14.663 21 12V5a1 1 0 00-.649-.936l-8-3a.998.998 0 00-.702 0l-8 3A1 1 0 003 5v7c0 2.663 1.384 4.987 3.088 6.797 2.428 2.581 5.465 4.097 5.465 4.097zm-1.303-8.481l6.644-6.644a.856.856 0 111.212 1.212l-7.25 7.25a.856.856 0 01-1.212 0l-3.75-3.75a.856.856 0 111.212-1.212l3.144 3.144z\",\n  { width: 24 },\n);\n\nexport const file = createIcon(\n  \"M369.9 97.9L286 14C277 5 264.8-.1 252.1-.1H48C21.5 0 0 21.5 0 48v416c0 26.5 21.5 48 48 48h288c26.5 0 48-21.5 48-48V131.9c0-12.7-5.1-25-14.1-34zM332.1 128H256V51.9l76.1 76.1zM48 464V48h160v104c0 13.3 10.7 24 24 24h104v288H48zm32-48h224V288l-23.5-23.5c-4.7-4.7-12.3-4.7-17 0L176 352l-39.5-39.5c-4.7-4.7-12.3-4.7-17 0L80 352v64zm48-240c-26.5 0-48 21.5-48 48s21.5 48 48 48 48-21.5 48-48-21.5-48-48-48z\",\n  { width: 384, height: 512 },\n);\n\n// TODO barnabasmolnar/editor-redesign\n// couldn't find a new icon for this\nexport const GroupIcon = React.memo(({ theme }: { theme: Theme }) =>\n  createIcon(\n    <>\n      <path d=\"M25 26H111V111H25\" fill={iconFillColor(theme)} />\n      <path\n        d=\"M25 111C25 80.2068 25 49.4135 25 26M25 26C48.6174 26 72.2348 26 111 26H25ZM25 26C53.3671 26 81.7343 26 111 26H25ZM111 26C111 52.303 111 78.606 111 111V26ZM111 26C111 51.2947 111 76.5893 111 111V26ZM111 111C87.0792 111 63.1585 111 25 111H111ZM111 111C87.4646 111 63.9293 111 25 111H111ZM25 111C25 81.1514 25 51.3028 25 26V111Z\"\n        stroke={iconFillColor(theme)}\n        strokeWidth=\"2\"\n      />\n      <path d=\"M100 100H160V160H100\" fill={iconFillColor(theme)} />\n      <path\n        d=\"M100 160C100 144.106 100 128.211 100 100M100 100C117.706 100 135.412 100 160 100H100ZM100 100C114.214 100 128.428 100 160 100H100ZM160 100C160 120.184 160 140.369 160 160V100ZM160 100C160 113.219 160 126.437 160 160V100ZM160 160C145.534 160 131.068 160 100 160H160ZM160 160C143.467 160 126.934 160 100 160H160ZM100 160C100 143.661 100 127.321 100 100V160Z\"\n        stroke={iconFillColor(theme)}\n        strokeWidth=\"2\"\n      />\n      <g\n        fill={handlerColor(theme)}\n        stroke={iconFillColor(theme)}\n        strokeWidth=\"6\"\n      >\n        <rect x=\"2.5\" y=\"2.5\" width=\"30\" height=\"30\" />\n        <rect x=\"2.5\" y=\"149.5\" width=\"30\" height=\"30\" />\n        <rect x=\"147.5\" y=\"149.5\" width=\"30\" height=\"30\" />\n        <rect x=\"147.5\" y=\"2.5\" width=\"30\" height=\"30\" />\n      </g>\n    </>,\n    { width: 182, height: 182, mirror: true },\n  ),\n);\n\nexport const UngroupIcon = React.memo(({ theme }: { theme: Theme }) =>\n  createIcon(\n    <>\n      <path d=\"M25 26H111V111H25\" fill={iconFillColor(theme)} />\n      <path\n        d=\"M25 111C25 80.2068 25 49.4135 25 26M25 26C48.6174 26 72.2348 26 111 26H25ZM25 26C53.3671 26 81.7343 26 111 26H25ZM111 26C111 52.303 111 78.606 111 111V26ZM111 26C111 51.2947 111 76.5893 111 111V26ZM111 111C87.0792 111 63.1585 111 25 111H111ZM111 111C87.4646 111 63.9293 111 25 111H111ZM25 111C25 81.1514 25 51.3028 25 26V111Z\"\n        stroke={iconFillColor(theme)}\n        strokeWidth=\"2\"\n      />\n      <path d=\"M100 100H160V160H100\" fill={iconFillColor(theme)} />\n      <path\n        d=\"M100 160C100 144.106 100 128.211 100 100M100 100C117.706 100 135.412 100 160 100H100ZM100 100C114.214 100 128.428 100 160 100H100ZM160 100C160 120.184 160 140.369 160 160V100ZM160 100C160 113.219 160 126.437 160 160V100ZM160 160C145.534 160 131.068 160 100 160H160ZM160 160C143.467 160 126.934 160 100 160H160ZM100 160C100 143.661 100 127.321 100 100V160Z\"\n        stroke={iconFillColor(theme)}\n        strokeWidth=\"2\"\n      />\n      <g\n        fill={handlerColor(theme)}\n        stroke={iconFillColor(theme)}\n        strokeWidth=\"6\"\n      >\n        <rect x=\"2.5\" y=\"2.5\" width=\"30\" height=\"30\" />\n        <rect x=\"78.5\" y=\"149.5\" width=\"30\" height=\"30\" />\n        <rect x=\"147.5\" y=\"149.5\" width=\"30\" height=\"30\" />\n        <rect x=\"147.5\" y=\"78.5\" width=\"30\" height=\"30\" />\n        <rect x=\"105.5\" y=\"2.5\" width=\"30\" height=\"30\" />\n        <rect x=\"2.5\" y=\"102.5\" width=\"30\" height=\"30\" />\n      </g>\n    </>,\n    { width: 182, height: 182, mirror: true },\n  ),\n);\n\nexport const FillHachureIcon = createIcon(\n  <>\n    <path\n      d=\"M5.879 2.625h8.242a3.254 3.254 0 0 1 3.254 3.254v8.242a3.254 3.254 0 0 1-3.254 3.254H5.88a3.254 3.254 0 0 1-3.254-3.254V5.88a3.254 3.254 0 0 1 3.254-3.254Z\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n    />\n    <mask\n      id=\"FillHachureIcon\"\n      style={{ maskType: \"alpha\" }}\n      maskUnits=\"userSpaceOnUse\"\n      x={2}\n      y={2}\n      width={16}\n      height={16}\n    >\n      <path\n        d=\"M5.879 2.625h8.242a3.254 3.254 0 0 1 3.254 3.254v8.242a3.254 3.254 0 0 1-3.254 3.254H5.88a3.254 3.254 0 0 1-3.254-3.254V5.88a3.254 3.254 0 0 1 3.254-3.254Z\"\n        fill=\"currentColor\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n      />\n    </mask>\n    <g mask=\"url(#FillHachureIcon)\">\n      <path\n        d=\"M2.258 15.156 15.156 2.258M7.324 20.222 20.222 7.325m-20.444 5.35L12.675-.222m-8.157 18.34L17.416 5.22\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </g>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FillCrossHatchIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\">\n      <path\n        d=\"M5.879 2.625h8.242a3.254 3.254 0 0 1 3.254 3.254v8.242a3.254 3.254 0 0 1-3.254 3.254H5.88a3.254 3.254 0 0 1-3.254-3.254V5.88a3.254 3.254 0 0 1 3.254-3.254Z\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n      />\n      <mask\n        id=\"FillCrossHatchIcon\"\n        style={{ maskType: \"alpha\" }}\n        maskUnits=\"userSpaceOnUse\"\n        x={-1}\n        y={-1}\n        width={22}\n        height={22}\n      >\n        <path\n          d=\"M2.426 15.044 15.044 2.426M7.383 20 20 7.383M0 12.617 12.617 0m-7.98 17.941L17.256 5.324m-2.211 12.25L2.426 4.956M20 12.617 7.383 0m5.234 20L0 7.383m17.941 7.98L5.324 2.745\"\n          stroke=\"currentColor\"\n          strokeWidth=\"1.25\"\n          strokeLinecap=\"round\"\n          strokeLinejoin=\"round\"\n        />\n      </mask>\n      <g mask=\"url(#FillCrossHatchIcon)\">\n        <path\n          d=\"M14.121 2H5.88A3.879 3.879 0 0 0 2 5.879v8.242A3.879 3.879 0 0 0 5.879 18h8.242A3.879 3.879 0 0 0 18 14.121V5.88A3.879 3.879 0 0 0 14.121 2Z\"\n          fill=\"currentColor\"\n        />\n      </g>\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FillSolidIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\">\n      <path\n        d=\"M4.91 2.625h10.18a2.284 2.284 0 0 1 2.285 2.284v10.182a2.284 2.284 0 0 1-2.284 2.284H4.909a2.284 2.284 0 0 1-2.284-2.284V4.909a2.284 2.284 0 0 1 2.284-2.284Z\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  { ...modifiedTablerIconProps, fill: \"currentColor\" },\n);\n\nexport const StrokeWidthBaseIcon = createIcon(\n  <>\n    <path\n      d=\"M4.167 10h11.666\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const StrokeWidthBoldIcon = createIcon(\n  <path\n    d=\"M5 10h10\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2.5\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const StrokeWidthExtraBoldIcon = createIcon(\n  <path\n    d=\"M5 10h10\"\n    stroke=\"currentColor\"\n    strokeWidth=\"3.75\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const StrokeStyleSolidIcon = React.memo(({ theme }: { theme: Theme }) =>\n  createIcon(\n    <path\n      d=\"M6 10H34\"\n      stroke={iconFillColor(theme)}\n      strokeWidth={2}\n      fill=\"none\"\n      strokeLinecap=\"round\"\n    />,\n    {\n      width: 40,\n      height: 20,\n    },\n  ),\n);\n\nexport const StrokeStyleDashedIcon = createIcon(\n  <g strokeWidth=\"2\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M5 12h2\" />\n    <path d=\"M17 12h2\" />\n    <path d=\"M11 12h2\" />\n  </g>,\n  tablerIconProps,\n);\n\n// tabler-icons: line-dotted\nexport const StrokeStyleDottedIcon = createIcon(\n  <g strokeWidth=\"2\">\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M4 12v.01\" />\n    <path d=\"M8 12v.01\" />\n    <path d=\"M12 12v.01\" />\n    <path d=\"M16 12v.01\" />\n    <path d=\"M20 12v.01\" />\n  </g>,\n  tablerIconProps,\n);\n\nexport const SloppinessArchitectIcon = createIcon(\n  <path\n    d=\"M2.5 12.038c1.655-.885 5.9-3.292 8.568-4.354 2.668-1.063.101 2.821 1.32 3.104 1.218.283 5.112-1.814 5.112-1.814\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const SloppinessArtistIcon = createIcon(\n  <path\n    d=\"M2.5 12.563c1.655-.886 5.9-3.293 8.568-4.355 2.668-1.062.101 2.822 1.32 3.105 1.218.283 5.112-1.814 5.112-1.814m-13.469 2.23c2.963-1.586 6.13-5.62 7.468-4.998 1.338.623-1.153 4.11-.132 5.595 1.02 1.487 6.133-1.43 6.133-1.43\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const SloppinessCartoonistIcon = createIcon(\n  <path\n    d=\"M2.5 11.936c1.737-.879 8.627-5.346 10.42-5.268 1.795.078-.418 5.138.345 5.736.763.598 3.53-1.789 4.235-2.147M2.929 9.788c1.164-.519 5.47-3.28 6.987-3.114 1.519.165 1 3.827 2.121 4.109 1.122.281 3.839-2.016 4.606-2.42\"\n    strokeWidth=\"1.25\"\n  />,\n  modifiedTablerIconProps,\n);\n\nexport const EdgeSharpIcon = createIcon(\n  <svg strokeWidth=\"1.5\">\n    <path d=\"M3.33334 9.99998V6.66665C3.33334 6.04326 3.33403 4.9332 3.33539 3.33646C4.95233 3.33436 6.06276 3.33331 6.66668 3.33331H10\" />\n    <path d=\"M13.3333 3.33331V3.34331\" />\n    <path d=\"M16.6667 3.33331V3.34331\" />\n    <path d=\"M16.6667 6.66669V6.67669\" />\n    <path d=\"M16.6667 10V10.01\" />\n    <path d=\"M3.33334 13.3333V13.3433\" />\n    <path d=\"M16.6667 13.3333V13.3433\" />\n    <path d=\"M3.33334 16.6667V16.6767\" />\n    <path d=\"M6.66666 16.6667V16.6767\" />\n    <path d=\"M10 16.6667V16.6767\" />\n    <path d=\"M13.3333 16.6667V16.6767\" />\n    <path d=\"M16.6667 16.6667V16.6767\" />\n  </svg>,\n  modifiedTablerIconProps,\n);\n\n// tabler-icons: border-radius\nexport const EdgeRoundIcon = createIcon(\n  <g\n    strokeWidth=\"1.5\"\n    stroke=\"currentColor\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <path d=\"M4 12v-4a4 4 0 0 1 4 -4h4\" />\n    <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"4.01\" />\n    <line x1=\"20\" y1=\"4\" x2=\"20\" y2=\"4.01\" />\n    <line x1=\"20\" y1=\"8\" x2=\"20\" y2=\"8.01\" />\n    <line x1=\"20\" y1=\"12\" x2=\"20\" y2=\"12.01\" />\n    <line x1=\"4\" y1=\"16\" x2=\"4\" y2=\"16.01\" />\n    <line x1=\"20\" y1=\"16\" x2=\"20\" y2=\"16.01\" />\n    <line x1=\"4\" y1=\"20\" x2=\"4\" y2=\"20.01\" />\n    <line x1=\"8\" y1=\"20\" x2=\"8\" y2=\"20.01\" />\n    <line x1=\"12\" y1=\"20\" x2=\"12\" y2=\"20.01\" />\n    <line x1=\"16\" y1=\"20\" x2=\"16\" y2=\"20.01\" />\n    <line x1=\"20\" y1=\"20\" x2=\"20\" y2=\"20.01\" />\n  </g>,\n  tablerIconProps,\n);\n\nexport const ArrowheadNoneIcon = createIcon(\n  <path d=\"M6 10H34\" stroke=\"currentColor\" strokeWidth={2} fill=\"none\" />,\n  {\n    width: 40,\n    height: 20,\n  },\n);\n\nexport const ArrowheadArrowIcon = React.memo(\n  ({ flip = false }: { flip?: boolean }) =>\n    createIcon(\n      <g\n        transform={flip ? \"translate(40, 0) scale(-1, 1)\" : \"\"}\n        stroke=\"currentColor\"\n        strokeWidth={2}\n        fill=\"none\"\n      >\n        <path d=\"M34 10H6M34 10L27 5M34 10L27 15\" />\n        <path d=\"M27.5 5L34.5 10L27.5 15\" />\n      </g>,\n      { width: 40, height: 20 },\n    ),\n);\n\nexport const ArrowheadDotIcon = React.memo(\n  ({ flip = false }: { flip?: boolean }) =>\n    createIcon(\n      <g\n        stroke=\"currentColor\"\n        fill=\"currentColor\"\n        transform={flip ? \"translate(40, 0) scale(-1, 1)\" : \"\"}\n      >\n        <path d=\"M32 10L6 10\" strokeWidth={2} />\n        <circle r=\"4\" transform=\"matrix(-1 0 0 1 30 10)\" />\n      </g>,\n      { width: 40, height: 20 },\n    ),\n);\n\nexport const ArrowheadBarIcon = React.memo(\n  ({ flip = false }: { flip?: boolean }) =>\n    createIcon(\n      <g transform={flip ? \"translate(40, 0) scale(-1, 1)\" : \"\"}>\n        <path\n          d=\"M34 10H5.99996M34 10L34 5M34 10L34 15\"\n          stroke=\"currentColor\"\n          strokeWidth={2}\n          fill=\"none\"\n        />\n      </g>,\n      { width: 40, height: 20 },\n    ),\n);\n\nexport const ArrowheadTriangleIcon = React.memo(\n  ({ flip = false }: { flip?: boolean }) =>\n    createIcon(\n      <g\n        stroke=\"currentColor\"\n        fill=\"currentColor\"\n        transform={flip ? \"translate(40, 0) scale(-1, 1)\" : \"\"}\n      >\n        <path d=\"M32 10L6 10\" strokeWidth={2} />\n        <path d=\"M27.5 5.5L34.5 10L27.5 14.5L27.5 5.5\" />\n      </g>,\n      { width: 40, height: 20 },\n    ),\n);\n\nexport const FontSizeSmallIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\">\n      <path\n        d=\"M14.167 6.667a3.333 3.333 0 0 0-3.334-3.334H9.167a3.333 3.333 0 0 0 0 6.667h1.666a3.333 3.333 0 0 1 0 6.667H9.167a3.333 3.333 0 0 1-3.334-3.334\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FontSizeMediumIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\">\n      <path\n        d=\"M5 16.667V3.333L10 15l5-11.667v13.334\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FontSizeLargeIcon = createIcon(\n  <>\n    <g clipPath=\"url(#a)\">\n      <path\n        d=\"M5.833 3.333v13.334h8.334\"\n        stroke=\"currentColor\"\n        strokeWidth=\"1.25\"\n        strokeLinecap=\"round\"\n        strokeLinejoin=\"round\"\n      />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FontSizeExtraLargeIcon = createIcon(\n  <>\n    <path\n      d=\"m1.667 3.333 6.666 13.334M8.333 3.333 1.667 16.667M11.667 3.333v13.334h6.666\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    />\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FontFamilyNormalIcon = createIcon(\n  <>\n    <g\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path d=\"M5.833 16.667v-10a3.333 3.333 0 0 1 3.334-3.334h1.666a3.333 3.333 0 0 1 3.334 3.334v10M5.833 10.833h8.334\" />\n    </g>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const FontFamilyCodeIcon = createIcon(\n  <>\n    <g\n      clipPath=\"url(#a)\"\n      stroke=\"currentColor\"\n      strokeWidth=\"1.25\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path d=\"M5.833 6.667 2.5 10l3.333 3.333M14.167 6.667 17.5 10l-3.333 3.333M11.667 3.333 8.333 16.667\" />\n    </g>\n    <defs>\n      <clipPath id=\"a\">\n        <path fill=\"#fff\" d=\"M0 0h20v20H0z\" />\n      </clipPath>\n    </defs>\n  </>,\n  modifiedTablerIconProps,\n);\n\nexport const TextAlignLeftIcon = createIcon(\n  <g\n    stroke=\"currentColor\"\n    fill=\"none\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n    strokeWidth={2}\n  >\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <line x1=\"4\" y1=\"8\" x2=\"20\" y2=\"8\" />\n    <line x1=\"4\" y1=\"12\" x2=\"12\" y2=\"12\" />\n    <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"16\" />\n  </g>,\n  tablerIconProps,\n);\n\nexport const TextAlignCenterIcon = createIcon(\n  <g\n    stroke=\"currentColor\"\n    fill=\"none\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <line x1=\"4\" y1=\"8\" x2=\"20\" y2=\"8\" />\n    <line x1=\"8\" y1=\"12\" x2=\"16\" y2=\"12\" />\n    <line x1=\"6\" y1=\"16\" x2=\"18\" y2=\"16\" />\n  </g>,\n  tablerIconProps,\n);\n\nexport const TextAlignRightIcon = createIcon(\n  <g\n    stroke=\"currentColor\"\n    fill=\"none\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n    <line x1=\"4\" y1=\"8\" x2=\"20\" y2=\"8\" />\n    <line x1=\"10\" y1=\"12\" x2=\"20\" y2=\"12\" />\n    <line x1=\"8\" y1=\"16\" x2=\"20\" y2=\"16\" />\n  </g>,\n  tablerIconProps,\n);\n\n// tabler-icons: layout-align-top\nexport const TextAlignTopIcon = React.memo(({ theme }: { theme: Theme }) =>\n  createIcon(\n    <g\n      strokeWidth=\"1.5\"\n      stroke=\"currentColor\"\n      fill=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n      <line x1=\"4\" y1=\"4\" x2=\"20\" y2=\"4\" />\n      <rect x=\"9\" y=\"8\" width=\"6\" height=\"12\" rx=\"2\" />\n    </g>,\n    tablerIconProps,\n  ),\n);\n\n// tabler-icons: layout-align-bottom\nexport const TextAlignBottomIcon = React.memo(({ theme }: { theme: Theme }) =>\n  createIcon(\n    <g\n      strokeWidth=\"2\"\n      stroke=\"currentColor\"\n      fill=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n      <line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\" />\n      <rect x=\"9\" y=\"4\" width=\"6\" height=\"12\" rx=\"2\"></rect>\n    </g>,\n    tablerIconProps,\n  ),\n);\n\n// tabler-icons: layout-align-middle\nexport const TextAlignMiddleIcon = React.memo(({ theme }: { theme: Theme }) =>\n  createIcon(\n    <g\n      strokeWidth=\"1.5\"\n      stroke=\"currentColor\"\n      fill=\"none\"\n      strokeLinecap=\"round\"\n      strokeLinejoin=\"round\"\n    >\n      <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\" />\n      <line x1=\"4\" y1=\"12\" x2=\"9\" y2=\"12\" />\n      <line x1=\"15\" y1=\"12\" x2=\"20\" y2=\"12\" />\n      <rect x=\"9\" y=\"6\" width=\"6\" height=\"12\" rx=\"2\" />\n    </g>,\n    tablerIconProps,\n  ),\n);\n\nexport const publishIcon = createIcon(\n  <path\n    d=\"M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zM393.4 288H328v112c0 8.8-7.2 16-16 16h-48c-8.8 0-16-7.2-16-16V288h-65.4c-14.3 0-21.4-17.2-11.3-27.3l105.4-105.4c6.2-6.2 16.4-6.2 22.6 0l105.4 105.4c10.1 10.1 2.9 27.3-11.3 27.3z\"\n    fill=\"currentColor\"\n  />,\n  { width: 640, height: 512 },\n);\n\nexport const eraser = createIcon(\n  <path d=\"M480 416C497.7 416 512 430.3 512 448C512 465.7 497.7 480 480 480H150.6C133.7 480 117.4 473.3 105.4 461.3L25.37 381.3C.3786 356.3 .3786 315.7 25.37 290.7L258.7 57.37C283.7 32.38 324.3 32.38 349.3 57.37L486.6 194.7C511.6 219.7 511.6 260.3 486.6 285.3L355.9 416H480zM265.4 416L332.7 348.7L195.3 211.3L70.63 336L150.6 416L265.4 416z\" />,\n);\n\nexport const handIcon = createIcon(\n  <g strokeWidth={1.25}>\n    <path stroke=\"none\" d=\"M0 0h24v24H0z\" fill=\"none\"></path>\n    <path d=\"M8 13v-7.5a1.5 1.5 0 0 1 3 0v6.5\"></path>\n    <path d=\"M11 5.5v-2a1.5 1.5 0 1 1 3 0v8.5\"></path>\n    <path d=\"M14 5.5a1.5 1.5 0 0 1 3 0v6.5\"></path>\n    <path d=\"M17 7.5a1.5 1.5 0 0 1 3 0v8.5a6 6 0 0 1 -6 6h-2h.208a6 6 0 0 1 -5.012 -2.7a69.74 69.74 0 0 1 -.196 -.3c-.312 -.479 -1.407 -2.388 -3.286 -5.728a1.5 1.5 0 0 1 .536 -2.022a1.867 1.867 0 0 1 2.28 .28l1.47 1.47\"></path>\n  </g>,\n  tablerIconProps,\n);\n","import { getShortcutFromShortcutName } from \"../../actions/shortcuts\";\nimport { useI18n } from \"../../i18n\";\nimport {\n  useExcalidrawAppState,\n  useExcalidrawSetAppState,\n  useExcalidrawActionManager,\n} from \"../App\";\nimport {\n  ExportIcon,\n  ExportImageIcon,\n  HelpIcon,\n  LoadIcon,\n  MoonIcon,\n  save,\n  SunIcon,\n  TrashIcon,\n  usersIcon,\n} from \"../icons\";\nimport { GithubIcon, DiscordIcon, TwitterIcon } from \"../icons\";\nimport DropdownMenuItem from \"../dropdownMenu/DropdownMenuItem\";\nimport DropdownMenuItemLink from \"../dropdownMenu/DropdownMenuItemLink\";\nimport {\n  actionClearCanvas,\n  actionLoadScene,\n  actionSaveToActiveFile,\n  actionShortcuts,\n  actionToggleTheme,\n} from \"../../actions\";\n\nimport \"./DefaultItems.scss\";\nimport clsx from \"clsx\";\nimport { useSetAtom } from \"jotai\";\nimport { activeConfirmDialogAtom } from \"../ActiveConfirmDialog\";\nimport { jotaiScope } from \"../../jotai\";\n\nexport const LoadScene = () => {\n  const { t } = useI18n();\n  const actionManager = useExcalidrawActionManager();\n\n  if (!actionManager.isActionEnabled(actionLoadScene)) {\n    return null;\n  }\n\n  return (\n    <DropdownMenuItem\n      icon={LoadIcon}\n      onSelect={() => actionManager.executeAction(actionLoadScene)}\n      data-testid=\"load-button\"\n      shortcut={getShortcutFromShortcutName(\"loadScene\")}\n      aria-label={t(\"buttons.load\")}\n    >\n      {t(\"buttons.load\")}\n    </DropdownMenuItem>\n  );\n};\nLoadScene.displayName = \"LoadScene\";\n\nexport const SaveToActiveFile = () => {\n  const { t } = useI18n();\n  const actionManager = useExcalidrawActionManager();\n\n  if (!actionManager.isActionEnabled(actionSaveToActiveFile)) {\n    return null;\n  }\n\n  return (\n    <DropdownMenuItem\n      shortcut={getShortcutFromShortcutName(\"saveScene\")}\n      data-testid=\"save-button\"\n      onSelect={() => actionManager.executeAction(actionSaveToActiveFile)}\n      icon={save}\n      aria-label={`${t(\"buttons.save\")}`}\n    >{`${t(\"buttons.save\")}`}</DropdownMenuItem>\n  );\n};\nSaveToActiveFile.displayName = \"SaveToActiveFile\";\n\nexport const SaveAsImage = () => {\n  const setAppState = useExcalidrawSetAppState();\n  const { t } = useI18n();\n  return (\n    <DropdownMenuItem\n      icon={ExportImageIcon}\n      data-testid=\"image-export-button\"\n      onSelect={() => setAppState({ openDialog: \"imageExport\" })}\n      shortcut={getShortcutFromShortcutName(\"imageExport\")}\n      aria-label={t(\"buttons.exportImage\")}\n    >\n      {t(\"buttons.exportImage\")}\n    </DropdownMenuItem>\n  );\n};\nSaveAsImage.displayName = \"SaveAsImage\";\n\nexport const Help = () => {\n  const { t } = useI18n();\n\n  const actionManager = useExcalidrawActionManager();\n\n  return (\n    <DropdownMenuItem\n      data-testid=\"help-menu-item\"\n      icon={HelpIcon}\n      onSelect={() => actionManager.executeAction(actionShortcuts)}\n      shortcut=\"?\"\n      aria-label={t(\"helpDialog.title\")}\n    >\n      {t(\"helpDialog.title\")}\n    </DropdownMenuItem>\n  );\n};\nHelp.displayName = \"Help\";\n\nexport const ClearCanvas = () => {\n  const { t } = useI18n();\n\n  const setActiveConfirmDialog = useSetAtom(\n    activeConfirmDialogAtom,\n    jotaiScope,\n  );\n  const actionManager = useExcalidrawActionManager();\n\n  if (!actionManager.isActionEnabled(actionClearCanvas)) {\n    return null;\n  }\n\n  return (\n    <DropdownMenuItem\n      icon={TrashIcon}\n      onSelect={() => setActiveConfirmDialog(\"clearCanvas\")}\n      data-testid=\"clear-canvas-button\"\n      aria-label={t(\"buttons.clearReset\")}\n    >\n      {t(\"buttons.clearReset\")}\n    </DropdownMenuItem>\n  );\n};\nClearCanvas.displayName = \"ClearCanvas\";\n\nexport const ToggleTheme = () => {\n  const { t } = useI18n();\n  const appState = useExcalidrawAppState();\n  const actionManager = useExcalidrawActionManager();\n\n  if (!actionManager.isActionEnabled(actionToggleTheme)) {\n    return null;\n  }\n\n  return (\n    <DropdownMenuItem\n      onSelect={(event) => {\n        // do not close the menu when changing theme\n        event.preventDefault();\n        return actionManager.executeAction(actionToggleTheme);\n      }}\n      icon={appState.theme === \"dark\" ? SunIcon : MoonIcon}\n      data-testid=\"toggle-dark-mode\"\n      shortcut={getShortcutFromShortcutName(\"toggleTheme\")}\n      aria-label={\n        appState.theme === \"dark\"\n          ? t(\"buttons.lightMode\")\n          : t(\"buttons.darkMode\")\n      }\n    >\n      {appState.theme === \"dark\"\n        ? t(\"buttons.lightMode\")\n        : t(\"buttons.darkMode\")}\n    </DropdownMenuItem>\n  );\n};\nToggleTheme.displayName = \"ToggleTheme\";\n\nexport const ChangeCanvasBackground = () => {\n  const { t } = useI18n();\n  const appState = useExcalidrawAppState();\n  const actionManager = useExcalidrawActionManager();\n\n  if (appState.viewModeEnabled) {\n    return null;\n  }\n  return (\n    <div style={{ marginTop: \"0.5rem\" }}>\n      <div style={{ fontSize: \".75rem\", marginBottom: \".5rem\" }}>\n        {t(\"labels.canvasBackground\")}\n      </div>\n      <div style={{ padding: \"0 0.625rem\" }}>\n        {actionManager.renderAction(\"changeViewBackgroundColor\")}\n      </div>\n    </div>\n  );\n};\nChangeCanvasBackground.displayName = \"ChangeCanvasBackground\";\n\nexport const Export = () => {\n  const { t } = useI18n();\n  const setAppState = useExcalidrawSetAppState();\n  return (\n    <DropdownMenuItem\n      icon={ExportIcon}\n      onSelect={() => {\n        setAppState({ openDialog: \"jsonExport\" });\n      }}\n      data-testid=\"json-export-button\"\n      aria-label={t(\"buttons.export\")}\n    >\n      {t(\"buttons.export\")}\n    </DropdownMenuItem>\n  );\n};\nExport.displayName = \"Export\";\n\nexport const Socials = () => (\n  <>\n    <DropdownMenuItemLink\n      icon={GithubIcon}\n      href=\"https://github.com/excalidraw/excalidraw\"\n      aria-label=\"GitHub\"\n    >\n      GitHub\n    </DropdownMenuItemLink>\n    <DropdownMenuItemLink\n      icon={DiscordIcon}\n      href=\"https://discord.gg/UexuTaE\"\n      aria-label=\"Discord\"\n    >\n      Discord\n    </DropdownMenuItemLink>\n    <DropdownMenuItemLink\n      icon={TwitterIcon}\n      href=\"https://twitter.com/excalidraw\"\n      aria-label=\"Twitter\"\n    >\n      Twitter\n    </DropdownMenuItemLink>\n  </>\n);\nSocials.displayName = \"Socials\";\n\nexport const LiveCollaborationTrigger = ({\n  onSelect,\n  isCollaborating,\n}: {\n  onSelect: () => void;\n  isCollaborating: boolean;\n}) => {\n  const { t } = useI18n();\n  return (\n    <DropdownMenuItem\n      data-testid=\"collab-button\"\n      icon={usersIcon}\n      className={clsx({\n        \"active-collab\": isCollaborating,\n      })}\n      onSelect={onSelect}\n    >\n      {t(\"labels.liveCollaboration\")}\n    </DropdownMenuItem>\n  );\n};\n\nLiveCollaborationTrigger.displayName = \"LiveCollaborationTrigger\";\n","import React from \"react\";\nimport {\n  useDevice,\n  useExcalidrawAppState,\n  useExcalidrawSetAppState,\n} from \"../App\";\nimport DropdownMenu from \"../dropdownMenu/DropdownMenu\";\n\nimport * as DefaultItems from \"./DefaultItems\";\n\nimport { UserList } from \"../UserList\";\nimport { t } from \"../../i18n\";\nimport { HamburgerMenuIcon } from \"../icons\";\nimport { withInternalFallback } from \"../hoc/withInternalFallback\";\nimport { composeEventHandlers } from \"../../utils\";\nimport { useTunnels } from \"../context/tunnels\";\n\nconst MainMenu = Object.assign(\n  withInternalFallback(\n    \"MainMenu\",\n    ({\n      children,\n      onSelect,\n    }: {\n      children?: React.ReactNode;\n      /**\n       * Called when any menu item is selected (clicked on).\n       */\n      onSelect?: (event: Event) => void;\n    }) => {\n      const { mainMenuTunnel } = useTunnels();\n      const device = useDevice();\n      const appState = useExcalidrawAppState();\n      const setAppState = useExcalidrawSetAppState();\n      const onClickOutside = device.isMobile\n        ? undefined\n        : () => setAppState({ openMenu: null });\n\n      return (\n        <mainMenuTunnel.In>\n          <DropdownMenu open={appState.openMenu === \"canvas\"}>\n            <DropdownMenu.Trigger\n              onToggle={() => {\n                setAppState({\n                  openMenu: appState.openMenu === \"canvas\" ? null : \"canvas\",\n                });\n              }}\n            >\n              {HamburgerMenuIcon}\n            </DropdownMenu.Trigger>\n            <DropdownMenu.Content\n              onClickOutside={onClickOutside}\n              onSelect={composeEventHandlers(onSelect, () => {\n                setAppState({ openMenu: null });\n              })}\n            >\n              {children}\n              {device.isMobile && appState.collaborators.size > 0 && (\n                <fieldset className=\"UserList-Wrapper\">\n                  <legend>{t(\"labels.collaborators\")}</legend>\n                  <UserList\n                    mobile={true}\n                    collaborators={appState.collaborators}\n                  />\n                </fieldset>\n              )}\n            </DropdownMenu.Content>\n          </DropdownMenu>\n        </mainMenuTunnel.In>\n      );\n    },\n  ),\n  {\n    Trigger: DropdownMenu.Trigger,\n    Item: DropdownMenu.Item,\n    ItemLink: DropdownMenu.ItemLink,\n    ItemCustom: DropdownMenu.ItemCustom,\n    Group: DropdownMenu.Group,\n    Separator: DropdownMenu.Separator,\n    DefaultItems,\n  },\n);\n\nexport default MainMenu;\n","import { atom, useAtom } from \"jotai\";\nimport React, { useLayoutEffect } from \"react\";\nimport { useTunnels } from \"../context/tunnels\";\n\nexport const withInternalFallback = <P,>(\n  componentName: string,\n  Component: React.FC<P>,\n) => {\n  const counterAtom = atom(0);\n  // flag set on initial render to tell the fallback component to skip the\n  // render until mount counter are initialized. This is because the counter\n  // is initialized in an effect, and thus we could end rendering both\n  // components at the same time until counter is initialized.\n  let preferHost = false;\n\n  const WrapperComponent: React.FC<\n    P & {\n      __fallback?: boolean;\n    }\n  > = (props) => {\n    const { jotaiScope } = useTunnels();\n    const [counter, setCounter] = useAtom(counterAtom, jotaiScope);\n\n    useLayoutEffect(() => {\n      setCounter((counter) => counter + 1);\n      return () => {\n        setCounter((counter) => counter - 1);\n      };\n    }, [setCounter]);\n\n    if (!props.__fallback) {\n      preferHost = true;\n    }\n\n    // ensure we don't render fallback and host components at the same time\n    if (\n      // either before the counters are initialized\n      (!counter && props.__fallback && preferHost) ||\n      // or after the counters are initialized, and both are rendered\n      // (this is the default when host renders as well)\n      (counter > 1 && props.__fallback)\n    ) {\n      return null;\n    }\n\n    return <Component {...props} />;\n  };\n\n  WrapperComponent.displayName = componentName;\n\n  return WrapperComponent;\n};\n","// extracted by mini-css-extract-plugin\nexport default {\"themeFilter\":\"invert(93%) hue-rotate(180deg)\",\"rightSidebarWidth\":\"302px\"};","import cssVariables from \"./css/variables.module.scss\";\nimport { AppProps } from \"./types\";\nimport { FontFamilyValues } from \"./element/types\";\n\nexport const isDarwin = /Mac|iPod|iPhone|iPad/.test(navigator.platform);\nexport const isWindows = /^Win/.test(navigator.platform);\nexport const isAndroid = /\\b(android)\\b/i.test(navigator.userAgent);\nexport const isFirefox =\n  \"netscape\" in window &&\n  navigator.userAgent.indexOf(\"rv:\") > 1 &&\n  navigator.userAgent.indexOf(\"Gecko\") > 1;\nexport const isChrome = navigator.userAgent.indexOf(\"Chrome\") !== -1;\nexport const isSafari =\n  !isChrome && navigator.userAgent.indexOf(\"Safari\") !== -1;\n\nexport const APP_NAME = \"Excalidraw\";\n\nexport const DRAGGING_THRESHOLD = 10; // px\nexport const LINE_CONFIRM_THRESHOLD = 8; // px\nexport const ELEMENT_SHIFT_TRANSLATE_AMOUNT = 5;\nexport const ELEMENT_TRANSLATE_AMOUNT = 1;\nexport const TEXT_TO_CENTER_SNAP_THRESHOLD = 30;\nexport const SHIFT_LOCKING_ANGLE = Math.PI / 12;\nexport const CURSOR_TYPE = {\n  TEXT: \"text\",\n  CROSSHAIR: \"crosshair\",\n  GRABBING: \"grabbing\",\n  GRAB: \"grab\",\n  POINTER: \"pointer\",\n  MOVE: \"move\",\n  AUTO: \"\",\n};\nexport const POINTER_BUTTON = {\n  MAIN: 0,\n  WHEEL: 1,\n  SECONDARY: 2,\n  TOUCH: -1,\n} as const;\n\nexport enum EVENT {\n  COPY = \"copy\",\n  PASTE = \"paste\",\n  CUT = \"cut\",\n  KEYDOWN = \"keydown\",\n  KEYUP = \"keyup\",\n  MOUSE_MOVE = \"mousemove\",\n  RESIZE = \"resize\",\n  UNLOAD = \"unload\",\n  FOCUS = \"focus\",\n  BLUR = \"blur\",\n  DRAG_OVER = \"dragover\",\n  DROP = \"drop\",\n  GESTURE_END = \"gestureend\",\n  BEFORE_UNLOAD = \"beforeunload\",\n  GESTURE_START = \"gesturestart\",\n  GESTURE_CHANGE = \"gesturechange\",\n  POINTER_MOVE = \"pointermove\",\n  POINTER_UP = \"pointerup\",\n  STATE_CHANGE = \"statechange\",\n  WHEEL = \"wheel\",\n  TOUCH_START = \"touchstart\",\n  TOUCH_END = \"touchend\",\n  HASHCHANGE = \"hashchange\",\n  VISIBILITY_CHANGE = \"visibilitychange\",\n  SCROLL = \"scroll\",\n  // custom events\n  EXCALIDRAW_LINK = \"excalidraw-link\",\n  MENU_ITEM_SELECT = \"menu.itemSelect\",\n}\n\nexport const ENV = {\n  TEST: \"test\",\n  DEVELOPMENT: \"development\",\n};\n\nexport const CLASSES = {\n  SHAPE_ACTIONS_MENU: \"App-menu__left\",\n};\n\n// 1-based in case we ever do `if(element.fontFamily)`\nexport const FONT_FAMILY = {\n  Virgil: 1,\n  Helvetica: 2,\n  Cascadia: 3,\n};\n\nexport const THEME = {\n  LIGHT: \"light\",\n  DARK: \"dark\",\n};\n\nexport const WINDOWS_EMOJI_FALLBACK_FONT = \"Segoe UI Emoji\";\n\nexport const DEFAULT_FONT_SIZE = 20;\nexport const DEFAULT_FONT_FAMILY: FontFamilyValues = FONT_FAMILY.Virgil;\nexport const DEFAULT_TEXT_ALIGN = \"left\";\nexport const DEFAULT_VERTICAL_ALIGN = \"top\";\nexport const DEFAULT_VERSION = \"{version}\";\n\nexport const CANVAS_ONLY_ACTIONS = [\"selectAll\"];\n\nexport const GRID_SIZE = 20; // TODO make it configurable?\n\nexport const MIME_TYPES = {\n  excalidraw: \"application/vnd.excalidraw+json\",\n  excalidrawlib: \"application/vnd.excalidrawlib+json\",\n  json: \"application/json\",\n  svg: \"image/svg+xml\",\n  \"excalidraw.svg\": \"image/svg+xml\",\n  png: \"image/png\",\n  \"excalidraw.png\": \"image/png\",\n  jpg: \"image/jpeg\",\n  gif: \"image/gif\",\n  webp: \"image/webp\",\n  bmp: \"image/bmp\",\n  ico: \"image/x-icon\",\n  binary: \"application/octet-stream\",\n} as const;\n\nexport const EXPORT_DATA_TYPES = {\n  excalidraw: \"excalidraw\",\n  excalidrawClipboard: \"excalidraw/clipboard\",\n  excalidrawLibrary: \"excalidrawlib\",\n} as const;\n\nexport const EXPORT_SOURCE =\n  window.EXCALIDRAW_EXPORT_SOURCE || window.location.origin;\n\n// time in milliseconds\nexport const IMAGE_RENDER_TIMEOUT = 500;\nexport const TAP_TWICE_TIMEOUT = 300;\nexport const TOUCH_CTX_MENU_TIMEOUT = 500;\nexport const TITLE_TIMEOUT = 10000;\nexport const VERSION_TIMEOUT = 30000;\nexport const SCROLL_TIMEOUT = 100;\nexport const ZOOM_STEP = 0.1;\nexport const MIN_ZOOM = 0.1;\nexport const HYPERLINK_TOOLTIP_DELAY = 300;\n\n// Report a user inactive after IDLE_THRESHOLD milliseconds\nexport const IDLE_THRESHOLD = 60_000;\n// Report a user active each ACTIVE_THRESHOLD milliseconds\nexport const ACTIVE_THRESHOLD = 3_000;\n\nexport const THEME_FILTER = cssVariables.themeFilter;\n\nexport const URL_QUERY_KEYS = {\n  addLibrary: \"addLibrary\",\n} as const;\n\nexport const URL_HASH_KEYS = {\n  addLibrary: \"addLibrary\",\n} as const;\n\nexport const DEFAULT_UI_OPTIONS: AppProps[\"UIOptions\"] = {\n  canvasActions: {\n    changeViewBackgroundColor: true,\n    clearCanvas: true,\n    export: { saveFileToDisk: true },\n    loadScene: true,\n    saveToActiveFile: true,\n    toggleTheme: null,\n    saveAsImage: true,\n  },\n};\n\n// breakpoints\n// -----------------------------------------------------------------------------\n// sm screen\nexport const MQ_SM_MAX_WIDTH = 640;\n// md screen\nexport const MQ_MAX_WIDTH_PORTRAIT = 730;\nexport const MQ_MAX_WIDTH_LANDSCAPE = 1000;\nexport const MQ_MAX_HEIGHT_LANDSCAPE = 500;\n// sidebar\nexport const MQ_RIGHT_SIDEBAR_MIN_WIDTH = 1229;\n// -----------------------------------------------------------------------------\n\nexport const LIBRARY_SIDEBAR_WIDTH = parseInt(cssVariables.rightSidebarWidth);\n\nexport const MAX_DECIMALS_FOR_SVG_EXPORT = 2;\n\nexport const EXPORT_SCALES = [1, 2, 3];\nexport const DEFAULT_EXPORT_PADDING = 10; // px\n\nexport const DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT = 1440;\n\nexport const ALLOWED_IMAGE_MIME_TYPES = [\n  MIME_TYPES.png,\n  MIME_TYPES.jpg,\n  MIME_TYPES.svg,\n  MIME_TYPES.gif,\n  MIME_TYPES.webp,\n  MIME_TYPES.bmp,\n  MIME_TYPES.ico,\n] as const;\n\nexport const MAX_ALLOWED_FILE_BYTES = 2 * 1024 * 1024;\n\nexport const SVG_NS = \"http://www.w3.org/2000/svg\";\n\nexport const ENCRYPTION_KEY_BITS = 128;\n\nexport const VERSIONS = {\n  excalidraw: 2,\n  excalidrawLibrary: 2,\n} as const;\n\nexport const BOUND_TEXT_PADDING = 5;\n\nexport const VERTICAL_ALIGN = {\n  TOP: \"top\",\n  MIDDLE: \"middle\",\n  BOTTOM: \"bottom\",\n};\n\nexport const TEXT_ALIGN = {\n  LEFT: \"left\",\n  CENTER: \"center\",\n  RIGHT: \"right\",\n};\n\nexport const ELEMENT_READY_TO_ERASE_OPACITY = 20;\n\n// Radius represented as 25% of element's largest side (width/height).\n// Used for LEGACY and PROPORTIONAL_RADIUS algorithms, or when the element is\n// below the cutoff size.\nexport const DEFAULT_PROPORTIONAL_RADIUS = 0.25;\n// Fixed radius for the ADAPTIVE_RADIUS algorithm. In pixels.\nexport const DEFAULT_ADAPTIVE_RADIUS = 32;\n// roundness type (algorithm)\nexport const ROUNDNESS = {\n  // Used for legacy rounding (rectangles), which currently works the same\n  // as PROPORTIONAL_RADIUS, but we need to differentiate for UI purposes and\n  // forwards-compat.\n  LEGACY: 1,\n\n  // Used for linear elements & diamonds\n  PROPORTIONAL_RADIUS: 2,\n\n  // Current default algorithm for rectangles, using fixed pixel radius.\n  // It's working similarly to a regular border-radius, but attemps to make\n  // radius visually similar across differnt element sizes, especially\n  // very large and very small elements.\n  //\n  // NOTE right now we don't allow configuration and use a constant radius\n  // (see DEFAULT_ADAPTIVE_RADIUS constant)\n  ADAPTIVE_RADIUS: 3,\n} as const;\n\n/** key containt id of precedeing elemnt id we use in reconciliation during\n * collaboration */\nexport const PRECEDING_ELEMENT_KEY = \"__precedingElement__\";\n","import { nanoid } from \"nanoid\";\nimport { cleanAppStateForExport } from \"../appState\";\nimport { ALLOWED_IMAGE_MIME_TYPES, MIME_TYPES } from \"../constants\";\nimport { clearElementsForExport } from \"../element\";\nimport { ExcalidrawElement, FileId } from \"../element/types\";\nimport { CanvasError } from \"../errors\";\nimport { t } from \"../i18n\";\nimport { calculateScrollCenter } from \"../scene\";\nimport { AppState, DataURL, LibraryItem } from \"../types\";\nimport { ValueOf } from \"../utility-types\";\nimport { bytesToHexString } from \"../utils\";\nimport { FileSystemHandle, nativeFileSystemSupported } from \"./filesystem\";\nimport { isValidExcalidrawData, isValidLibrary } from \"./json\";\nimport { restore, restoreLibraryItems } from \"./restore\";\nimport { ImportedLibraryData } from \"./types\";\n\nconst parseFileContents = async (blob: Blob | File) => {\n  let contents: string;\n\n  if (blob.type === MIME_TYPES.png) {\n    try {\n      return await (\n        await import(/* webpackChunkName: \"image\" */ \"./image\")\n      ).decodePngMetadata(blob);\n    } catch (error: any) {\n      if (error.message === \"INVALID\") {\n        throw new DOMException(\n          t(\"alerts.imageDoesNotContainScene\"),\n          \"EncodingError\",\n        );\n      } else {\n        throw new DOMException(\n          t(\"alerts.cannotRestoreFromImage\"),\n          \"EncodingError\",\n        );\n      }\n    }\n  } else {\n    if (\"text\" in Blob) {\n      contents = await blob.text();\n    } else {\n      contents = await new Promise((resolve) => {\n        const reader = new FileReader();\n        reader.readAsText(blob, \"utf8\");\n        reader.onloadend = () => {\n          if (reader.readyState === FileReader.DONE) {\n            resolve(reader.result as string);\n          }\n        };\n      });\n    }\n    if (blob.type === MIME_TYPES.svg) {\n      try {\n        return await (\n          await import(/* webpackChunkName: \"image\" */ \"./image\")\n        ).decodeSvgMetadata({\n          svg: contents,\n        });\n      } catch (error: any) {\n        if (error.message === \"INVALID\") {\n          throw new DOMException(\n            t(\"alerts.imageDoesNotContainScene\"),\n            \"EncodingError\",\n          );\n        } else {\n          throw new DOMException(\n            t(\"alerts.cannotRestoreFromImage\"),\n            \"EncodingError\",\n          );\n        }\n      }\n    }\n  }\n  return contents;\n};\n\nexport const getMimeType = (blob: Blob | string): string => {\n  let name: string;\n  if (typeof blob === \"string\") {\n    name = blob;\n  } else {\n    if (blob.type) {\n      return blob.type;\n    }\n    name = blob.name || \"\";\n  }\n  if (/\\.(excalidraw|json)$/.test(name)) {\n    return MIME_TYPES.json;\n  } else if (/\\.png$/.test(name)) {\n    return MIME_TYPES.png;\n  } else if (/\\.jpe?g$/.test(name)) {\n    return MIME_TYPES.jpg;\n  } else if (/\\.svg$/.test(name)) {\n    return MIME_TYPES.svg;\n  }\n  return \"\";\n};\n\nexport const getFileHandleType = (handle: FileSystemHandle | null) => {\n  if (!handle) {\n    return null;\n  }\n\n  return handle.name.match(/\\.(json|excalidraw|png|svg)$/)?.[1] || null;\n};\n\nexport const isImageFileHandleType = (\n  type: string | null,\n): type is \"png\" | \"svg\" => {\n  return type === \"png\" || type === \"svg\";\n};\n\nexport const isImageFileHandle = (handle: FileSystemHandle | null) => {\n  const type = getFileHandleType(handle);\n  return type === \"png\" || type === \"svg\";\n};\n\nexport const isSupportedImageFile = (\n  blob: Blob | null | undefined,\n): blob is Blob & { type: typeof ALLOWED_IMAGE_MIME_TYPES[number] } => {\n  const { type } = blob || {};\n  return (\n    !!type && (ALLOWED_IMAGE_MIME_TYPES as readonly string[]).includes(type)\n  );\n};\n\nexport const loadSceneOrLibraryFromBlob = async (\n  blob: Blob | File,\n  /** @see restore.localAppState */\n  localAppState: AppState | null,\n  localElements: readonly ExcalidrawElement[] | null,\n  /** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\n  fileHandle?: FileSystemHandle | null,\n) => {\n  const contents = await parseFileContents(blob);\n  try {\n    const data = JSON.parse(contents);\n    if (isValidExcalidrawData(data)) {\n      return {\n        type: MIME_TYPES.excalidraw,\n        data: restore(\n          {\n            elements: clearElementsForExport(data.elements || []),\n            appState: {\n              theme: localAppState?.theme,\n              fileHandle: fileHandle || blob.handle || null,\n              ...cleanAppStateForExport(data.appState || {}),\n              ...(localAppState\n                ? calculateScrollCenter(\n                    data.elements || [],\n                    localAppState,\n                    null,\n                  )\n                : {}),\n            },\n            files: data.files,\n          },\n          localAppState,\n          localElements,\n          { repairBindings: true },\n        ),\n      };\n    } else if (isValidLibrary(data)) {\n      return {\n        type: MIME_TYPES.excalidrawlib,\n        data,\n      };\n    }\n    throw new Error(t(\"alerts.couldNotLoadInvalidFile\"));\n  } catch (error: any) {\n    console.error(error.message);\n    throw new Error(t(\"alerts.couldNotLoadInvalidFile\"));\n  }\n};\n\nexport const loadFromBlob = async (\n  blob: Blob,\n  /** @see restore.localAppState */\n  localAppState: AppState | null,\n  localElements: readonly ExcalidrawElement[] | null,\n  /** FileSystemHandle. Defaults to `blob.handle` if defined, otherwise null. */\n  fileHandle?: FileSystemHandle | null,\n) => {\n  const ret = await loadSceneOrLibraryFromBlob(\n    blob,\n    localAppState,\n    localElements,\n    fileHandle,\n  );\n  if (ret.type !== MIME_TYPES.excalidraw) {\n    throw new Error(t(\"alerts.couldNotLoadInvalidFile\"));\n  }\n  return ret.data;\n};\n\nexport const parseLibraryJSON = (\n  json: string,\n  defaultStatus: LibraryItem[\"status\"] = \"unpublished\",\n) => {\n  const data: ImportedLibraryData | undefined = JSON.parse(json);\n  if (!isValidLibrary(data)) {\n    throw new Error(\"Invalid library\");\n  }\n  const libraryItems = data.libraryItems || data.library;\n  return restoreLibraryItems(libraryItems, defaultStatus);\n};\n\nexport const loadLibraryFromBlob = async (\n  blob: Blob,\n  defaultStatus: LibraryItem[\"status\"] = \"unpublished\",\n) => {\n  return parseLibraryJSON(await parseFileContents(blob), defaultStatus);\n};\n\nexport const canvasToBlob = async (\n  canvas: HTMLCanvasElement,\n): Promise<Blob> => {\n  return new Promise((resolve, reject) => {\n    try {\n      canvas.toBlob((blob) => {\n        if (!blob) {\n          return reject(\n            new CanvasError(\n              t(\"canvasError.canvasTooBig\"),\n              \"CANVAS_POSSIBLY_TOO_BIG\",\n            ),\n          );\n        }\n        resolve(blob);\n      });\n    } catch (error: any) {\n      reject(error);\n    }\n  });\n};\n\n/** generates SHA-1 digest from supplied file (if not supported, falls back\n    to a 40-char base64 random id) */\nexport const generateIdFromFile = async (file: File): Promise<FileId> => {\n  try {\n    const hashBuffer = await window.crypto.subtle.digest(\n      \"SHA-1\",\n      await blobToArrayBuffer(file),\n    );\n    return bytesToHexString(new Uint8Array(hashBuffer)) as FileId;\n  } catch (error: any) {\n    console.error(error);\n    // length 40 to align with the HEX length of SHA-1 (which is 160 bit)\n    return nanoid(40) as FileId;\n  }\n};\n\nexport const getDataURL = async (file: Blob | File): Promise<DataURL> => {\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = () => {\n      const dataURL = reader.result as DataURL;\n      resolve(dataURL);\n    };\n    reader.onerror = (error) => reject(error);\n    reader.readAsDataURL(file);\n  });\n};\n\nexport const dataURLToFile = (dataURL: DataURL, filename = \"\") => {\n  const dataIndexStart = dataURL.indexOf(\",\");\n  const byteString = atob(dataURL.slice(dataIndexStart + 1));\n  const mimeType = dataURL.slice(0, dataIndexStart).split(\":\")[1].split(\";\")[0];\n\n  const ab = new ArrayBuffer(byteString.length);\n  const ia = new Uint8Array(ab);\n  for (let i = 0; i < byteString.length; i++) {\n    ia[i] = byteString.charCodeAt(i);\n  }\n  return new File([ab], filename, { type: mimeType });\n};\n\nexport const resizeImageFile = async (\n  file: File,\n  opts: {\n    /** undefined indicates auto */\n    outputType?: typeof MIME_TYPES[\"jpg\"];\n    maxWidthOrHeight: number;\n  },\n): Promise<File> => {\n  // SVG files shouldn't a can't be resized\n  if (file.type === MIME_TYPES.svg) {\n    return file;\n  }\n\n  const [pica, imageBlobReduce] = await Promise.all([\n    import(\"pica\").then((res) => res.default),\n    // a wrapper for pica for better API\n    import(\"image-blob-reduce\").then((res) => res.default),\n  ]);\n\n  // CRA's minification settings break pica in WebWorkers, so let's disable\n  // them for now\n  // https://github.com/nodeca/image-blob-reduce/issues/21#issuecomment-757365513\n  const reduce = imageBlobReduce({\n    pica: pica({ features: [\"js\", \"wasm\"] }),\n  });\n\n  if (opts.outputType) {\n    const { outputType } = opts;\n    reduce._create_blob = function (env) {\n      return this.pica.toBlob(env.out_canvas, outputType, 0.8).then((blob) => {\n        env.out_blob = blob;\n        return env;\n      });\n    };\n  }\n\n  if (!isSupportedImageFile(file)) {\n    throw new Error(t(\"errors.unsupportedFileType\"));\n  }\n\n  return new File(\n    [await reduce.toBlob(file, { max: opts.maxWidthOrHeight })],\n    file.name,\n    {\n      type: opts.outputType || file.type,\n    },\n  );\n};\n\nexport const SVGStringToFile = (SVGString: string, filename: string = \"\") => {\n  return new File([new TextEncoder().encode(SVGString)], filename, {\n    type: MIME_TYPES.svg,\n  }) as File & { type: typeof MIME_TYPES.svg };\n};\n\nexport const getFileFromEvent = async (\n  event: React.DragEvent<HTMLDivElement>,\n) => {\n  const file = event.dataTransfer.files.item(0);\n  const fileHandle = await getFileHandle(event);\n\n  return { file: file ? await normalizeFile(file) : null, fileHandle };\n};\n\nexport const getFileHandle = async (\n  event: React.DragEvent<HTMLDivElement>,\n): Promise<FileSystemHandle | null> => {\n  if (nativeFileSystemSupported) {\n    try {\n      const item = event.dataTransfer.items[0];\n      const handle: FileSystemHandle | null =\n        (await (item as any).getAsFileSystemHandle()) || null;\n\n      return handle;\n    } catch (error: any) {\n      console.warn(error.name, error.message);\n      return null;\n    }\n  }\n  return null;\n};\n\n/**\n * attempts to detect if a buffer is a valid image by checking its leading bytes\n */\nconst getActualMimeTypeFromImage = (buffer: ArrayBuffer) => {\n  let mimeType: ValueOf<Pick<typeof MIME_TYPES, \"png\" | \"jpg\" | \"gif\">> | null =\n    null;\n\n  const first8Bytes = `${[...new Uint8Array(buffer).slice(0, 8)].join(\" \")} `;\n\n  // uint8 leading bytes\n  const headerBytes = {\n    // https://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header\n    png: \"137 80 78 71 13 10 26 10 \",\n    // https://en.wikipedia.org/wiki/JPEG#Syntax_and_structure\n    // jpg is a bit wonky. Checking the first three bytes should be enough,\n    // but may yield false positives. (https://stackoverflow.com/a/23360709/927631)\n    jpg: \"255 216 255 \",\n    // https://en.wikipedia.org/wiki/GIF#Example_GIF_file\n    gif: \"71 73 70 56 57 97 \",\n  };\n\n  if (first8Bytes === headerBytes.png) {\n    mimeType = MIME_TYPES.png;\n  } else if (first8Bytes.startsWith(headerBytes.jpg)) {\n    mimeType = MIME_TYPES.jpg;\n  } else if (first8Bytes.startsWith(headerBytes.gif)) {\n    mimeType = MIME_TYPES.gif;\n  }\n  return mimeType;\n};\n\nexport const createFile = (\n  blob: File | Blob | ArrayBuffer,\n  mimeType: ValueOf<typeof MIME_TYPES>,\n  name: string | undefined,\n) => {\n  return new File([blob], name || \"\", {\n    type: mimeType,\n  });\n};\n\n/** attempts to detect correct mimeType if none is set, or if an image\n * has an incorrect extension.\n * Note: doesn't handle missing .excalidraw/.excalidrawlib extension  */\nexport const normalizeFile = async (file: File) => {\n  if (!file.type) {\n    if (file?.name?.endsWith(\".excalidrawlib\")) {\n      file = createFile(\n        await blobToArrayBuffer(file),\n        MIME_TYPES.excalidrawlib,\n        file.name,\n      );\n    } else if (file?.name?.endsWith(\".excalidraw\")) {\n      file = createFile(\n        await blobToArrayBuffer(file),\n        MIME_TYPES.excalidraw,\n        file.name,\n      );\n    } else {\n      const buffer = await blobToArrayBuffer(file);\n      const mimeType = getActualMimeTypeFromImage(buffer);\n      if (mimeType) {\n        file = createFile(buffer, mimeType, file.name);\n      }\n    }\n    // when the file is an image, make sure the extension corresponds to the\n    // actual mimeType (this is an edge case, but happens sometime)\n  } else if (isSupportedImageFile(file)) {\n    const buffer = await blobToArrayBuffer(file);\n    const mimeType = getActualMimeTypeFromImage(buffer);\n    if (mimeType && mimeType !== file.type) {\n      file = createFile(buffer, mimeType, file.name);\n    }\n  }\n\n  return file;\n};\n\nexport const blobToArrayBuffer = (blob: Blob): Promise<ArrayBuffer> => {\n  if (\"arrayBuffer\" in blob) {\n    return blob.arrayBuffer();\n  }\n  // Safari\n  return new Promise((resolve, reject) => {\n    const reader = new FileReader();\n    reader.onload = (event) => {\n      if (!event.target?.result) {\n        return reject(new Error(\"Couldn't convert blob to ArrayBuffer\"));\n      }\n      resolve(event.target.result as ArrayBuffer);\n    };\n    reader.readAsArrayBuffer(blob);\n  });\n};\n","import { deflate, inflate } from \"pako\";\nimport { encryptData, decryptData } from \"./encryption\";\n\n// -----------------------------------------------------------------------------\n// byte (binary) strings\n// -----------------------------------------------------------------------------\n\n// fast, Buffer-compatible implem\nexport const toByteString = (\n  data: string | Uint8Array | ArrayBuffer,\n): Promise<string> => {\n  return new Promise((resolve, reject) => {\n    const blob =\n      typeof data === \"string\"\n        ? new Blob([new TextEncoder().encode(data)])\n        : new Blob([data instanceof Uint8Array ? data : new Uint8Array(data)]);\n    const reader = new FileReader();\n    reader.onload = (event) => {\n      if (!event.target || typeof event.target.result !== \"string\") {\n        return reject(new Error(\"couldn't convert to byte string\"));\n      }\n      resolve(event.target.result);\n    };\n    reader.readAsBinaryString(blob);\n  });\n};\n\nconst byteStringToArrayBuffer = (byteString: string) => {\n  const buffer = new ArrayBuffer(byteString.length);\n  const bufferView = new Uint8Array(buffer);\n  for (let i = 0, len = byteString.length; i < len; i++) {\n    bufferView[i] = byteString.charCodeAt(i);\n  }\n  return buffer;\n};\n\nconst byteStringToString = (byteString: string) => {\n  return new TextDecoder(\"utf-8\").decode(byteStringToArrayBuffer(byteString));\n};\n\n// -----------------------------------------------------------------------------\n// base64\n// -----------------------------------------------------------------------------\n\n/**\n * @param isByteString set to true if already byte string to prevent bloat\n *  due to reencoding\n */\nexport const stringToBase64 = async (str: string, isByteString = false) => {\n  return isByteString ? window.btoa(str) : window.btoa(await toByteString(str));\n};\n\n// async to align with stringToBase64\nexport const base64ToString = async (base64: string, isByteString = false) => {\n  return isByteString\n    ? window.atob(base64)\n    : byteStringToString(window.atob(base64));\n};\n\n// -----------------------------------------------------------------------------\n// text encoding\n// -----------------------------------------------------------------------------\n\ntype EncodedData = {\n  encoded: string;\n  encoding: \"bstring\";\n  /** whether text is compressed (zlib) */\n  compressed: boolean;\n  /** version for potential migration purposes */\n  version?: string;\n};\n\n/**\n * Encodes (and potentially compresses via zlib) text to byte string\n */\nexport const encode = async ({\n  text,\n  compress,\n}: {\n  text: string;\n  /** defaults to `true`. If compression fails, falls back to bstring alone. */\n  compress?: boolean;\n}): Promise<EncodedData> => {\n  let deflated!: string;\n  if (compress !== false) {\n    try {\n      deflated = await toByteString(deflate(text));\n    } catch (error: any) {\n      console.error(\"encode: cannot deflate\", error);\n    }\n  }\n  return {\n    version: \"1\",\n    encoding: \"bstring\",\n    compressed: !!deflated,\n    encoded: deflated || (await toByteString(text)),\n  };\n};\n\nexport const decode = async (data: EncodedData): Promise<string> => {\n  let decoded: string;\n\n  switch (data.encoding) {\n    case \"bstring\":\n      // if compressed, do not double decode the bstring\n      decoded = data.compressed\n        ? data.encoded\n        : await byteStringToString(data.encoded);\n      break;\n    default:\n      throw new Error(`decode: unknown encoding \"${data.encoding}\"`);\n  }\n\n  if (data.compressed) {\n    return inflate(new Uint8Array(byteStringToArrayBuffer(decoded)), {\n      to: \"string\",\n    });\n  }\n\n  return decoded;\n};\n\n// -----------------------------------------------------------------------------\n// binary encoding\n// -----------------------------------------------------------------------------\n\ntype FileEncodingInfo = {\n  /* version 2 is the version we're shipping the initial image support with.\n    version 1 was a PR version that a lot of people were using anyway.\n    Thus, if there are issues we can check whether they're not using the\n    unoffic version */\n  version: 1 | 2;\n  compression: \"pako@1\" | null;\n  encryption: \"AES-GCM\" | null;\n};\n\n// -----------------------------------------------------------------------------\nconst CONCAT_BUFFERS_VERSION = 1;\n/** how many bytes we use to encode how many bytes the next chunk has.\n * Corresponds to DataView setter methods (setUint32, setUint16, etc).\n *\n * NOTE ! values must not be changed, which would be backwards incompatible !\n */\nconst VERSION_DATAVIEW_BYTES = 4;\nconst NEXT_CHUNK_SIZE_DATAVIEW_BYTES = 4;\n// -----------------------------------------------------------------------------\n\nconst DATA_VIEW_BITS_MAP = { 1: 8, 2: 16, 4: 32 } as const;\n\n// getter\nfunction dataView(buffer: Uint8Array, bytes: 1 | 2 | 4, offset: number): number;\n// setter\nfunction dataView(\n  buffer: Uint8Array,\n  bytes: 1 | 2 | 4,\n  offset: number,\n  value: number,\n): Uint8Array;\n/**\n * abstraction over DataView that serves as a typed getter/setter in case\n * you're using constants for the byte size and want to ensure there's no\n * discrepenancy in the encoding across refactors.\n *\n * DataView serves for an endian-agnostic handling of numbers in ArrayBuffers.\n */\nfunction dataView(\n  buffer: Uint8Array,\n  bytes: 1 | 2 | 4,\n  offset: number,\n  value?: number,\n): Uint8Array | number {\n  if (value != null) {\n    if (value > Math.pow(2, DATA_VIEW_BITS_MAP[bytes]) - 1) {\n      throw new Error(\n        `attempting to set value higher than the allocated bytes (value: ${value}, bytes: ${bytes})`,\n      );\n    }\n    const method = `setUint${DATA_VIEW_BITS_MAP[bytes]}` as const;\n    new DataView(buffer.buffer)[method](offset, value);\n    return buffer;\n  }\n  const method = `getUint${DATA_VIEW_BITS_MAP[bytes]}` as const;\n  return new DataView(buffer.buffer)[method](offset);\n}\n\n// -----------------------------------------------------------------------------\n\n/**\n * Resulting concatenated buffer has this format:\n *\n * [\n *   VERSION chunk (4 bytes)\n *   LENGTH chunk 1 (4 bytes)\n *   DATA chunk 1 (up to 2^32 bits)\n *   LENGTH chunk 2 (4 bytes)\n *   DATA chunk 2 (up to 2^32 bits)\n *   ...\n * ]\n *\n * @param buffers each buffer (chunk) must be at most 2^32 bits large (~4GB)\n */\nconst concatBuffers = (...buffers: Uint8Array[]) => {\n  const bufferView = new Uint8Array(\n    VERSION_DATAVIEW_BYTES +\n      NEXT_CHUNK_SIZE_DATAVIEW_BYTES * buffers.length +\n      buffers.reduce((acc, buffer) => acc + buffer.byteLength, 0),\n  );\n\n  let cursor = 0;\n\n  // as the first chunk we'll encode the version for backwards compatibility\n  dataView(bufferView, VERSION_DATAVIEW_BYTES, cursor, CONCAT_BUFFERS_VERSION);\n  cursor += VERSION_DATAVIEW_BYTES;\n\n  for (const buffer of buffers) {\n    dataView(\n      bufferView,\n      NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n      cursor,\n      buffer.byteLength,\n    );\n    cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\n\n    bufferView.set(buffer, cursor);\n    cursor += buffer.byteLength;\n  }\n\n  return bufferView;\n};\n\n/** can only be used on buffers created via `concatBuffers()` */\nconst splitBuffers = (concatenatedBuffer: Uint8Array) => {\n  const buffers = [];\n\n  let cursor = 0;\n\n  // first chunk is the version\n  const version = dataView(\n    concatenatedBuffer,\n    NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n    cursor,\n  );\n  // If version is outside of the supported versions, throw an error.\n  // This usually means the buffer wasn't encoded using this API, so we'd only\n  // waste compute.\n  if (version > CONCAT_BUFFERS_VERSION) {\n    throw new Error(`invalid version ${version}`);\n  }\n\n  cursor += VERSION_DATAVIEW_BYTES;\n\n  while (true) {\n    const chunkSize = dataView(\n      concatenatedBuffer,\n      NEXT_CHUNK_SIZE_DATAVIEW_BYTES,\n      cursor,\n    );\n    cursor += NEXT_CHUNK_SIZE_DATAVIEW_BYTES;\n\n    buffers.push(concatenatedBuffer.slice(cursor, cursor + chunkSize));\n    cursor += chunkSize;\n    if (cursor >= concatenatedBuffer.byteLength) {\n      break;\n    }\n  }\n\n  return buffers;\n};\n\n// helpers for (de)compressing data with JSON metadata including encryption\n// -----------------------------------------------------------------------------\n\n/** @private */\nconst _encryptAndCompress = async (\n  data: Uint8Array | string,\n  encryptionKey: string,\n) => {\n  const { encryptedBuffer, iv } = await encryptData(\n    encryptionKey,\n    deflate(data),\n  );\n\n  return { iv, buffer: new Uint8Array(encryptedBuffer) };\n};\n\n/**\n * The returned buffer has following format:\n * `[]` refers to a buffers wrapper (see `concatBuffers`)\n *\n * [\n *   encodingMetadataBuffer,\n *   iv,\n *   [\n *      contentsMetadataBuffer\n *      contentsBuffer\n *   ]\n * ]\n */\nexport const compressData = async <T extends Record<string, any> = never>(\n  dataBuffer: Uint8Array,\n  options: {\n    encryptionKey: string;\n  } & ([T] extends [never]\n    ? {\n        metadata?: T;\n      }\n    : {\n        metadata: T;\n      }),\n): Promise<Uint8Array> => {\n  const fileInfo: FileEncodingInfo = {\n    version: 2,\n    compression: \"pako@1\",\n    encryption: \"AES-GCM\",\n  };\n\n  const encodingMetadataBuffer = new TextEncoder().encode(\n    JSON.stringify(fileInfo),\n  );\n\n  const contentsMetadataBuffer = new TextEncoder().encode(\n    JSON.stringify(options.metadata || null),\n  );\n\n  const { iv, buffer } = await _encryptAndCompress(\n    concatBuffers(contentsMetadataBuffer, dataBuffer),\n    options.encryptionKey,\n  );\n\n  return concatBuffers(encodingMetadataBuffer, iv, buffer);\n};\n\n/** @private */\nconst _decryptAndDecompress = async (\n  iv: Uint8Array,\n  decryptedBuffer: Uint8Array,\n  decryptionKey: string,\n  isCompressed: boolean,\n) => {\n  decryptedBuffer = new Uint8Array(\n    await decryptData(iv, decryptedBuffer, decryptionKey),\n  );\n\n  if (isCompressed) {\n    return inflate(decryptedBuffer);\n  }\n\n  return decryptedBuffer;\n};\n\nexport const decompressData = async <T extends Record<string, any>>(\n  bufferView: Uint8Array,\n  options: { decryptionKey: string },\n) => {\n  // first chunk is encoding metadata (ignored for now)\n  const [encodingMetadataBuffer, iv, buffer] = splitBuffers(bufferView);\n\n  const encodingMetadata: FileEncodingInfo = JSON.parse(\n    new TextDecoder().decode(encodingMetadataBuffer),\n  );\n\n  try {\n    const [contentsMetadataBuffer, contentsBuffer] = splitBuffers(\n      await _decryptAndDecompress(\n        iv,\n        buffer,\n        options.decryptionKey,\n        !!encodingMetadata.compression,\n      ),\n    );\n\n    const metadata = JSON.parse(\n      new TextDecoder().decode(contentsMetadataBuffer),\n    ) as T;\n\n    return {\n      /** metadata source is always JSON so we can decode it here */\n      metadata,\n      /** data can be anything so the caller must decode it */\n      data: contentsBuffer,\n    };\n  } catch (error: any) {\n    console.error(\n      `Error during decompressing and decrypting the file.`,\n      encodingMetadata,\n    );\n    throw error;\n  }\n};\n\n// -----------------------------------------------------------------------------\n","import { ENCRYPTION_KEY_BITS } from \"../constants\";\nimport { blobToArrayBuffer } from \"./blob\";\n\nexport const IV_LENGTH_BYTES = 12;\n\nexport const createIV = () => {\n  const arr = new Uint8Array(IV_LENGTH_BYTES);\n  return window.crypto.getRandomValues(arr);\n};\n\nexport const generateEncryptionKey = async <\n  T extends \"string\" | \"cryptoKey\" = \"string\",\n>(\n  returnAs?: T,\n): Promise<T extends \"cryptoKey\" ? CryptoKey : string> => {\n  const key = await window.crypto.subtle.generateKey(\n    {\n      name: \"AES-GCM\",\n      length: ENCRYPTION_KEY_BITS,\n    },\n    true, // extractable\n    [\"encrypt\", \"decrypt\"],\n  );\n  return (\n    returnAs === \"cryptoKey\"\n      ? key\n      : (await window.crypto.subtle.exportKey(\"jwk\", key)).k\n  ) as T extends \"cryptoKey\" ? CryptoKey : string;\n};\n\nexport const getCryptoKey = (key: string, usage: KeyUsage) =>\n  window.crypto.subtle.importKey(\n    \"jwk\",\n    {\n      alg: \"A128GCM\",\n      ext: true,\n      k: key,\n      key_ops: [\"encrypt\", \"decrypt\"],\n      kty: \"oct\",\n    },\n    {\n      name: \"AES-GCM\",\n      length: ENCRYPTION_KEY_BITS,\n    },\n    false, // extractable\n    [usage],\n  );\n\nexport const encryptData = async (\n  key: string | CryptoKey,\n  data: Uint8Array | ArrayBuffer | Blob | File | string,\n): Promise<{ encryptedBuffer: ArrayBuffer; iv: Uint8Array }> => {\n  const importedKey =\n    typeof key === \"string\" ? await getCryptoKey(key, \"encrypt\") : key;\n  const iv = createIV();\n  const buffer: ArrayBuffer | Uint8Array =\n    typeof data === \"string\"\n      ? new TextEncoder().encode(data)\n      : data instanceof Uint8Array\n      ? data\n      : data instanceof Blob\n      ? await blobToArrayBuffer(data)\n      : data;\n\n  // We use symmetric encryption. AES-GCM is the recommended algorithm and\n  // includes checks that the ciphertext has not been modified by an attacker.\n  const encryptedBuffer = await window.crypto.subtle.encrypt(\n    {\n      name: \"AES-GCM\",\n      iv,\n    },\n    importedKey,\n    buffer as ArrayBuffer | Uint8Array,\n  );\n\n  return { encryptedBuffer, iv };\n};\n\nexport const decryptData = async (\n  iv: Uint8Array,\n  encrypted: Uint8Array | ArrayBuffer,\n  privateKey: string,\n): Promise<ArrayBuffer> => {\n  const key = await getCryptoKey(privateKey, \"decrypt\");\n  return window.crypto.subtle.decrypt(\n    {\n      name: \"AES-GCM\",\n      iv,\n    },\n    key,\n    encrypted,\n  );\n};\n","const e=(()=>{if(\"undefined\"==typeof self)return!1;if(\"top\"in self&&self!==top)try{top}catch(e){return!1}else if(\"showOpenFilePicker\"in self)return\"showOpenFilePicker\";return!1})(),t=e?import(\"./file-open-002ab408.js\"):import(\"./file-open-7c801643.js\");async function n(...e){return(await t).default(...e)}const i=e?import(\"./directory-open-4ed118d0.js\"):import(\"./directory-open-01563666.js\");async function r(...e){return(await i).default(...e)}const o=e?import(\"./file-save-745eba88.js\"):import(\"./file-save-3189631c.js\");async function s(...e){return(await o).default(...e)}export{r as directoryOpen,n as fileOpen,s as fileSave,e as supported};\n","import {\n  fileOpen as _fileOpen,\n  fileSave as _fileSave,\n  FileSystemHandle,\n  supported as nativeFileSystemSupported,\n} from \"browser-fs-access\";\nimport { EVENT, MIME_TYPES } from \"../constants\";\nimport { AbortError } from \"../errors\";\nimport { debounce } from \"../utils\";\n\ntype FILE_EXTENSION =\n  | \"gif\"\n  | \"jpg\"\n  | \"png\"\n  | \"excalidraw.png\"\n  | \"svg\"\n  | \"excalidraw.svg\"\n  | \"json\"\n  | \"excalidraw\"\n  | \"excalidrawlib\";\n\nconst INPUT_CHANGE_INTERVAL_MS = 500;\n\nexport const fileOpen = <M extends boolean | undefined = false>(opts: {\n  extensions?: FILE_EXTENSION[];\n  description: string;\n  multiple?: M;\n}): Promise<M extends false | undefined ? File : File[]> => {\n  // an unsafe TS hack, alas not much we can do AFAIK\n  type RetType = M extends false | undefined ? File : File[];\n\n  const mimeTypes = opts.extensions?.reduce((mimeTypes, type) => {\n    mimeTypes.push(MIME_TYPES[type]);\n\n    return mimeTypes;\n  }, [] as string[]);\n\n  const extensions = opts.extensions?.reduce((acc, ext) => {\n    if (ext === \"jpg\") {\n      return acc.concat(\".jpg\", \".jpeg\");\n    }\n    return acc.concat(`.${ext}`);\n  }, [] as string[]);\n\n  return _fileOpen({\n    description: opts.description,\n    extensions,\n    mimeTypes,\n    multiple: opts.multiple ?? false,\n    legacySetup: (resolve, reject, input) => {\n      const scheduleRejection = debounce(reject, INPUT_CHANGE_INTERVAL_MS);\n      const focusHandler = () => {\n        checkForFile();\n        document.addEventListener(EVENT.KEYUP, scheduleRejection);\n        document.addEventListener(EVENT.POINTER_UP, scheduleRejection);\n        scheduleRejection();\n      };\n      const checkForFile = () => {\n        // this hack might not work when expecting multiple files\n        if (input.files?.length) {\n          const ret = opts.multiple ? [...input.files] : input.files[0];\n          resolve(ret as RetType);\n        }\n      };\n      requestAnimationFrame(() => {\n        window.addEventListener(EVENT.FOCUS, focusHandler);\n      });\n      const interval = window.setInterval(() => {\n        checkForFile();\n      }, INPUT_CHANGE_INTERVAL_MS);\n      return (rejectPromise) => {\n        clearInterval(interval);\n        scheduleRejection.cancel();\n        window.removeEventListener(EVENT.FOCUS, focusHandler);\n        document.removeEventListener(EVENT.KEYUP, scheduleRejection);\n        document.removeEventListener(EVENT.POINTER_UP, scheduleRejection);\n        if (rejectPromise) {\n          // so that something is shown in console if we need to debug this\n          console.warn(\"Opening the file was canceled (legacy-fs).\");\n          rejectPromise(new AbortError());\n        }\n      };\n    },\n  }) as Promise<RetType>;\n};\n\nexport const fileSave = (\n  blob: Blob,\n  opts: {\n    /** supply without the extension */\n    name: string;\n    /** file extension */\n    extension: FILE_EXTENSION;\n    description: string;\n    /** existing FileSystemHandle */\n    fileHandle?: FileSystemHandle | null;\n  },\n) => {\n  return _fileSave(\n    blob,\n    {\n      fileName: `${opts.name}.${opts.extension}`,\n      description: opts.description,\n      extensions: [`.${opts.extension}`],\n    },\n    opts.fileHandle,\n  );\n};\n\nexport type { FileSystemHandle };\nexport { nativeFileSystemSupported };\n","import decodePng from \"png-chunks-extract\";\nimport tEXt from \"png-chunk-text\";\nimport encodePng from \"png-chunks-encode\";\nimport { stringToBase64, encode, decode, base64ToString } from \"./encode\";\nimport { EXPORT_DATA_TYPES, MIME_TYPES } from \"../constants\";\nimport { blobToArrayBuffer } from \"./blob\";\n\n// -----------------------------------------------------------------------------\n// PNG\n// -----------------------------------------------------------------------------\n\nexport const getTEXtChunk = async (\n  blob: Blob,\n): Promise<{ keyword: string; text: string } | null> => {\n  const chunks = decodePng(new Uint8Array(await blobToArrayBuffer(blob)));\n  const metadataChunk = chunks.find((chunk) => chunk.name === \"tEXt\");\n  if (metadataChunk) {\n    return tEXt.decode(metadataChunk.data);\n  }\n  return null;\n};\n\nexport const encodePngMetadata = async ({\n  blob,\n  metadata,\n}: {\n  blob: Blob;\n  metadata: string;\n}) => {\n  const chunks = decodePng(new Uint8Array(await blobToArrayBuffer(blob)));\n\n  const metadataChunk = tEXt.encode(\n    MIME_TYPES.excalidraw,\n    JSON.stringify(\n      await encode({\n        text: metadata,\n        compress: true,\n      }),\n    ),\n  );\n  // insert metadata before last chunk (iEND)\n  chunks.splice(-1, 0, metadataChunk);\n\n  return new Blob([encodePng(chunks)], { type: MIME_TYPES.png });\n};\n\nexport const decodePngMetadata = async (blob: Blob) => {\n  const metadata = await getTEXtChunk(blob);\n  if (metadata?.keyword === MIME_TYPES.excalidraw) {\n    try {\n      const encodedData = JSON.parse(metadata.text);\n      if (!(\"encoded\" in encodedData)) {\n        // legacy, un-encoded scene JSON\n        if (\n          \"type\" in encodedData &&\n          encodedData.type === EXPORT_DATA_TYPES.excalidraw\n        ) {\n          return metadata.text;\n        }\n        throw new Error(\"FAILED\");\n      }\n      return await decode(encodedData);\n    } catch (error: any) {\n      console.error(error);\n      throw new Error(\"FAILED\");\n    }\n  }\n  throw new Error(\"INVALID\");\n};\n\n// -----------------------------------------------------------------------------\n// SVG\n// -----------------------------------------------------------------------------\n\nexport const encodeSvgMetadata = async ({ text }: { text: string }) => {\n  const base64 = await stringToBase64(\n    JSON.stringify(await encode({ text })),\n    true /* is already byte string */,\n  );\n\n  let metadata = \"\";\n  metadata += `<!-- payload-type:${MIME_TYPES.excalidraw} -->`;\n  metadata += `<!-- payload-version:2 -->`;\n  metadata += \"<!-- payload-start -->\";\n  metadata += base64;\n  metadata += \"<!-- payload-end -->\";\n  return metadata;\n};\n\nexport const decodeSvgMetadata = async ({ svg }: { svg: string }) => {\n  if (svg.includes(`payload-type:${MIME_TYPES.excalidraw}`)) {\n    const match = svg.match(\n      /<!-- payload-start -->\\s*(.+?)\\s*<!-- payload-end -->/,\n    );\n    if (!match) {\n      throw new Error(\"INVALID\");\n    }\n    const versionMatch = svg.match(/<!-- payload-version:(\\d+) -->/);\n    const version = versionMatch?.[1] || \"1\";\n    const isByteString = version !== \"1\";\n\n    try {\n      const json = await base64ToString(match[1], isByteString);\n      const encodedData = JSON.parse(json);\n      if (!(\"encoded\" in encodedData)) {\n        // legacy, un-encoded scene JSON\n        if (\n          \"type\" in encodedData &&\n          encodedData.type === EXPORT_DATA_TYPES.excalidraw\n        ) {\n          return json;\n        }\n        throw new Error(\"FAILED\");\n      }\n      return await decode(encodedData);\n    } catch (error: any) {\n      console.error(error);\n      throw new Error(\"FAILED\");\n    }\n  }\n  throw new Error(\"INVALID\");\n};\n","import {\n  copyBlobToClipboardAsPng,\n  copyTextToSystemClipboard,\n} from \"../clipboard\";\nimport { DEFAULT_EXPORT_PADDING, isFirefox, MIME_TYPES } from \"../constants\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { t } from \"../i18n\";\nimport { exportToCanvas, exportToSvg } from \"../scene/export\";\nimport { ExportType } from \"../scene/types\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { canvasToBlob } from \"./blob\";\nimport { fileSave, FileSystemHandle } from \"./filesystem\";\nimport { serializeAsJSON } from \"./json\";\n\nexport { loadFromBlob } from \"./blob\";\nexport { loadFromJSON, saveAsJSON } from \"./json\";\n\nexport const exportCanvas = async (\n  type: Omit<ExportType, \"backend\">,\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles,\n  {\n    exportBackground,\n    exportPadding = DEFAULT_EXPORT_PADDING,\n    viewBackgroundColor,\n    name,\n    fileHandle = null,\n  }: {\n    exportBackground: boolean;\n    exportPadding?: number;\n    viewBackgroundColor: string;\n    name: string;\n    fileHandle?: FileSystemHandle | null;\n  },\n) => {\n  if (elements.length === 0) {\n    throw new Error(t(\"alerts.cannotExportEmptyCanvas\"));\n  }\n  if (type === \"svg\" || type === \"clipboard-svg\") {\n    const tempSvg = await exportToSvg(\n      elements,\n      {\n        exportBackground,\n        exportWithDarkMode: appState.exportWithDarkMode,\n        viewBackgroundColor,\n        exportPadding,\n        exportScale: appState.exportScale,\n        exportEmbedScene: appState.exportEmbedScene && type === \"svg\",\n      },\n      files,\n    );\n    if (type === \"svg\") {\n      return await fileSave(\n        new Blob([tempSvg.outerHTML], { type: MIME_TYPES.svg }),\n        {\n          description: \"Export to SVG\",\n          name,\n          extension: appState.exportEmbedScene ? \"excalidraw.svg\" : \"svg\",\n          fileHandle,\n        },\n      );\n    } else if (type === \"clipboard-svg\") {\n      await copyTextToSystemClipboard(tempSvg.outerHTML);\n      return;\n    }\n  }\n\n  const tempCanvas = await exportToCanvas(elements, appState, files, {\n    exportBackground,\n    viewBackgroundColor,\n    exportPadding,\n  });\n  tempCanvas.style.display = \"none\";\n  document.body.appendChild(tempCanvas);\n\n  if (type === \"png\") {\n    let blob = await canvasToBlob(tempCanvas);\n    tempCanvas.remove();\n    if (appState.exportEmbedScene) {\n      blob = await (\n        await import(/* webpackChunkName: \"image\" */ \"./image\")\n      ).encodePngMetadata({\n        blob,\n        metadata: serializeAsJSON(elements, appState, files, \"local\"),\n      });\n    }\n\n    return await fileSave(blob, {\n      description: \"Export to PNG\",\n      name,\n      extension: appState.exportEmbedScene ? \"excalidraw.png\" : \"png\",\n      fileHandle,\n    });\n  } else if (type === \"clipboard\") {\n    try {\n      const blob = canvasToBlob(tempCanvas);\n      await copyBlobToClipboardAsPng(blob);\n    } catch (error: any) {\n      console.warn(error);\n      if (error.name === \"CANVAS_POSSIBLY_TOO_BIG\") {\n        throw error;\n      }\n      // TypeError *probably* suggests ClipboardItem not defined, which\n      // people on Firefox can enable through a flag, so let's tell them.\n      if (isFirefox && error.name === \"TypeError\") {\n        throw new Error(\n          `${t(\"alerts.couldNotCopyToClipboard\")}\\n\\n${t(\n            \"hints.firefox_clipboard_write\",\n          )}`,\n        );\n      } else {\n        throw new Error(t(\"alerts.couldNotCopyToClipboard\"));\n      }\n    } finally {\n      tempCanvas.remove();\n    }\n  } else {\n    tempCanvas.remove();\n    // shouldn't happen\n    throw new Error(\"Unsupported export type\");\n  }\n};\n","import { fileOpen, fileSave } from \"./filesystem\";\nimport { cleanAppStateForExport, clearAppStateForDatabase } from \"../appState\";\nimport {\n  EXPORT_DATA_TYPES,\n  EXPORT_SOURCE,\n  MIME_TYPES,\n  VERSIONS,\n} from \"../constants\";\nimport { clearElementsForDatabase, clearElementsForExport } from \"../element\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { AppState, BinaryFiles, LibraryItems } from \"../types\";\nimport { isImageFileHandle, loadFromBlob, normalizeFile } from \"./blob\";\n\nimport {\n  ExportedDataState,\n  ImportedDataState,\n  ExportedLibraryData,\n  ImportedLibraryData,\n} from \"./types\";\n\n/**\n * Strips out files which are only referenced by deleted elements\n */\nconst filterOutDeletedFiles = (\n  elements: readonly ExcalidrawElement[],\n  files: BinaryFiles,\n) => {\n  const nextFiles: BinaryFiles = {};\n  for (const element of elements) {\n    if (\n      !element.isDeleted &&\n      \"fileId\" in element &&\n      element.fileId &&\n      files[element.fileId]\n    ) {\n      nextFiles[element.fileId] = files[element.fileId];\n    }\n  }\n  return nextFiles;\n};\n\nexport const serializeAsJSON = (\n  elements: readonly ExcalidrawElement[],\n  appState: Partial<AppState>,\n  files: BinaryFiles,\n  type: \"local\" | \"database\",\n): string => {\n  const data: ExportedDataState = {\n    type: EXPORT_DATA_TYPES.excalidraw,\n    version: VERSIONS.excalidraw,\n    source: EXPORT_SOURCE,\n    elements:\n      type === \"local\"\n        ? clearElementsForExport(elements)\n        : clearElementsForDatabase(elements),\n    appState:\n      type === \"local\"\n        ? cleanAppStateForExport(appState)\n        : clearAppStateForDatabase(appState),\n    files:\n      type === \"local\"\n        ? filterOutDeletedFiles(elements, files)\n        : // will be stripped from JSON\n          undefined,\n  };\n\n  return JSON.stringify(data, null, 2);\n};\n\nexport const saveAsJSON = async (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles,\n) => {\n  const serialized = serializeAsJSON(elements, appState, files, \"local\");\n  const blob = new Blob([serialized], {\n    type: MIME_TYPES.excalidraw,\n  });\n\n  const fileHandle = await fileSave(blob, {\n    name: appState.name,\n    extension: \"excalidraw\",\n    description: \"Excalidraw file\",\n    fileHandle: isImageFileHandle(appState.fileHandle)\n      ? null\n      : appState.fileHandle,\n  });\n  return { fileHandle };\n};\n\nexport const loadFromJSON = async (\n  localAppState: AppState,\n  localElements: readonly ExcalidrawElement[] | null,\n) => {\n  const file = await fileOpen({\n    description: \"Excalidraw files\",\n    // ToDo: Be over-permissive until https://bugs.webkit.org/show_bug.cgi?id=34442\n    // gets resolved. Else, iOS users cannot open `.excalidraw` files.\n    // extensions: [\"json\", \"excalidraw\", \"png\", \"svg\"],\n  });\n  return loadFromBlob(\n    await normalizeFile(file),\n    localAppState,\n    localElements,\n    file.handle,\n  );\n};\n\nexport const isValidExcalidrawData = (data?: {\n  type?: any;\n  elements?: any;\n  appState?: any;\n}): data is ImportedDataState => {\n  return (\n    data?.type === EXPORT_DATA_TYPES.excalidraw &&\n    (!data.elements ||\n      (Array.isArray(data.elements) &&\n        (!data.appState || typeof data.appState === \"object\")))\n  );\n};\n\nexport const isValidLibrary = (json: any): json is ImportedLibraryData => {\n  return (\n    typeof json === \"object\" &&\n    json &&\n    json.type === EXPORT_DATA_TYPES.excalidrawLibrary &&\n    (json.version === 1 || json.version === 2)\n  );\n};\n\nexport const serializeLibraryAsJSON = (libraryItems: LibraryItems) => {\n  const data: ExportedLibraryData = {\n    type: EXPORT_DATA_TYPES.excalidrawLibrary,\n    version: VERSIONS.excalidrawLibrary,\n    source: EXPORT_SOURCE,\n    libraryItems,\n  };\n  return JSON.stringify(data, null, 2);\n};\n\nexport const saveLibraryAsJSON = async (libraryItems: LibraryItems) => {\n  const serialized = serializeLibraryAsJSON(libraryItems);\n  await fileSave(\n    new Blob([serialized], {\n      type: MIME_TYPES.excalidrawlib,\n    }),\n    {\n      name: \"library\",\n      extension: \"excalidrawlib\",\n      description: \"Excalidraw library file\",\n    },\n  );\n};\n","import { loadLibraryFromBlob } from \"./blob\";\nimport {\n  LibraryItems,\n  LibraryItem,\n  ExcalidrawImperativeAPI,\n  LibraryItemsSource,\n} from \"../types\";\nimport { restoreLibraryItems } from \"./restore\";\nimport type App from \"../components/App\";\nimport { atom } from \"jotai\";\nimport { jotaiStore } from \"../jotai\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport { getCommonBoundingBox } from \"../element/bounds\";\nimport { AbortError } from \"../errors\";\nimport { t } from \"../i18n\";\nimport { useEffect, useRef } from \"react\";\nimport { URL_HASH_KEYS, URL_QUERY_KEYS, APP_NAME, EVENT } from \"../constants\";\n\nexport const libraryItemsAtom = atom<{\n  status: \"loading\" | \"loaded\";\n  isInitialized: boolean;\n  libraryItems: LibraryItems;\n}>({ status: \"loaded\", isInitialized: true, libraryItems: [] });\n\nconst cloneLibraryItems = (libraryItems: LibraryItems): LibraryItems =>\n  JSON.parse(JSON.stringify(libraryItems));\n\n/**\n * checks if library item does not exist already in current library\n */\nconst isUniqueItem = (\n  existingLibraryItems: LibraryItems,\n  targetLibraryItem: LibraryItem,\n) => {\n  return !existingLibraryItems.find((libraryItem) => {\n    if (libraryItem.elements.length !== targetLibraryItem.elements.length) {\n      return false;\n    }\n\n    // detect z-index difference by checking the excalidraw elements\n    // are in order\n    return libraryItem.elements.every((libItemExcalidrawItem, idx) => {\n      return (\n        libItemExcalidrawItem.id === targetLibraryItem.elements[idx].id &&\n        libItemExcalidrawItem.versionNonce ===\n          targetLibraryItem.elements[idx].versionNonce\n      );\n    });\n  });\n};\n\n/** Merges otherItems into localItems. Unique items in otherItems array are\n    sorted first. */\nexport const mergeLibraryItems = (\n  localItems: LibraryItems,\n  otherItems: LibraryItems,\n): LibraryItems => {\n  const newItems = [];\n  for (const item of otherItems) {\n    if (isUniqueItem(localItems, item)) {\n      newItems.push(item);\n    }\n  }\n\n  return [...newItems, ...localItems];\n};\n\nclass Library {\n  /** latest libraryItems */\n  private lastLibraryItems: LibraryItems = [];\n  /** indicates whether library is initialized with library items (has gone\n   * though at least one update) */\n  private isInitialized = false;\n\n  private app: App;\n\n  constructor(app: App) {\n    this.app = app;\n  }\n\n  private updateQueue: Promise<LibraryItems>[] = [];\n\n  private getLastUpdateTask = (): Promise<LibraryItems> | undefined => {\n    return this.updateQueue[this.updateQueue.length - 1];\n  };\n\n  private notifyListeners = () => {\n    if (this.updateQueue.length > 0) {\n      jotaiStore.set(libraryItemsAtom, {\n        status: \"loading\",\n        libraryItems: this.lastLibraryItems,\n        isInitialized: this.isInitialized,\n      });\n    } else {\n      this.isInitialized = true;\n      jotaiStore.set(libraryItemsAtom, {\n        status: \"loaded\",\n        libraryItems: this.lastLibraryItems,\n        isInitialized: this.isInitialized,\n      });\n      try {\n        this.app.props.onLibraryChange?.(\n          cloneLibraryItems(this.lastLibraryItems),\n        );\n      } catch (error) {\n        console.error(error);\n      }\n    }\n  };\n\n  resetLibrary = () => {\n    return this.setLibrary([]);\n  };\n\n  /**\n   * @returns latest cloned libraryItems. Awaits all in-progress updates first.\n   */\n  getLatestLibrary = (): Promise<LibraryItems> => {\n    return new Promise(async (resolve) => {\n      try {\n        const libraryItems = await (this.getLastUpdateTask() ||\n          this.lastLibraryItems);\n        if (this.updateQueue.length > 0) {\n          resolve(this.getLatestLibrary());\n        } else {\n          resolve(cloneLibraryItems(libraryItems));\n        }\n      } catch (error) {\n        return resolve(this.lastLibraryItems);\n      }\n    });\n  };\n\n  // NOTE this is a high-level public API (exposed on ExcalidrawAPI) with\n  // a slight overhead (always restoring library items). For internal use\n  // where merging isn't needed, use `library.setLibrary()` directly.\n  updateLibrary = async ({\n    libraryItems,\n    prompt = false,\n    merge = false,\n    openLibraryMenu = false,\n    defaultStatus = \"unpublished\",\n  }: {\n    libraryItems: LibraryItemsSource;\n    merge?: boolean;\n    prompt?: boolean;\n    openLibraryMenu?: boolean;\n    defaultStatus?: \"unpublished\" | \"published\";\n  }): Promise<LibraryItems> => {\n    if (openLibraryMenu) {\n      this.app.setState({ openSidebar: \"library\" });\n    }\n\n    return this.setLibrary(() => {\n      return new Promise<LibraryItems>(async (resolve, reject) => {\n        try {\n          const source = await (typeof libraryItems === \"function\" &&\n          !(libraryItems instanceof Blob)\n            ? libraryItems(this.lastLibraryItems)\n            : libraryItems);\n\n          let nextItems;\n\n          if (source instanceof Blob) {\n            nextItems = await loadLibraryFromBlob(source, defaultStatus);\n          } else {\n            nextItems = restoreLibraryItems(source, defaultStatus);\n          }\n          if (\n            !prompt ||\n            window.confirm(\n              t(\"alerts.confirmAddLibrary\", {\n                numShapes: nextItems.length,\n              }),\n            )\n          ) {\n            if (merge) {\n              resolve(mergeLibraryItems(this.lastLibraryItems, nextItems));\n            } else {\n              resolve(nextItems);\n            }\n          } else {\n            reject(new AbortError());\n          }\n        } catch (error: any) {\n          reject(error);\n        }\n      });\n    }).finally(() => {\n      this.app.focusContainer();\n    });\n  };\n\n  setLibrary = (\n    /**\n     * LibraryItems that will replace current items. Can be a function which\n     * will be invoked after all previous tasks are resolved\n     * (this is the prefered way to update the library to avoid race conditions,\n     * but you'll want to manually merge the library items in the callback\n     *  - which is what we're doing in Library.importLibrary()).\n     *\n     * If supplied promise is rejected with AbortError, we swallow it and\n     * do not update the library.\n     */\n    libraryItems:\n      | LibraryItems\n      | Promise<LibraryItems>\n      | ((\n          latestLibraryItems: LibraryItems,\n        ) => LibraryItems | Promise<LibraryItems>),\n  ): Promise<LibraryItems> => {\n    const task = new Promise<LibraryItems>(async (resolve, reject) => {\n      try {\n        await this.getLastUpdateTask();\n\n        if (typeof libraryItems === \"function\") {\n          libraryItems = libraryItems(this.lastLibraryItems);\n        }\n\n        this.lastLibraryItems = cloneLibraryItems(await libraryItems);\n\n        resolve(this.lastLibraryItems);\n      } catch (error: any) {\n        reject(error);\n      }\n    })\n      .catch((error) => {\n        if (error.name === \"AbortError\") {\n          console.warn(\"Library update aborted by user\");\n          return this.lastLibraryItems;\n        }\n        throw error;\n      })\n      .finally(() => {\n        this.updateQueue = this.updateQueue.filter((_task) => _task !== task);\n        this.notifyListeners();\n      });\n\n    this.updateQueue.push(task);\n    this.notifyListeners();\n\n    return task;\n  };\n}\n\nexport default Library;\n\nexport const distributeLibraryItemsOnSquareGrid = (\n  libraryItems: LibraryItems,\n) => {\n  const PADDING = 50;\n  const ITEMS_PER_ROW = Math.ceil(Math.sqrt(libraryItems.length));\n\n  const resElements: ExcalidrawElement[] = [];\n\n  const getMaxHeightPerRow = (row: number) => {\n    const maxHeight = libraryItems\n      .slice(row * ITEMS_PER_ROW, row * ITEMS_PER_ROW + ITEMS_PER_ROW)\n      .reduce((acc, item) => {\n        const { height } = getCommonBoundingBox(item.elements);\n        return Math.max(acc, height);\n      }, 0);\n    return maxHeight;\n  };\n\n  const getMaxWidthPerCol = (targetCol: number) => {\n    let index = 0;\n    let currCol = 0;\n    let maxWidth = 0;\n    for (const item of libraryItems) {\n      if (index % ITEMS_PER_ROW === 0) {\n        currCol = 0;\n      }\n      if (currCol === targetCol) {\n        const { width } = getCommonBoundingBox(item.elements);\n        maxWidth = Math.max(maxWidth, width);\n      }\n      index++;\n      currCol++;\n    }\n    return maxWidth;\n  };\n\n  let colOffsetX = 0;\n  let rowOffsetY = 0;\n\n  let maxHeightCurrRow = 0;\n  let maxWidthCurrCol = 0;\n\n  let index = 0;\n  let col = 0;\n  let row = 0;\n\n  for (const item of libraryItems) {\n    if (index && index % ITEMS_PER_ROW === 0) {\n      rowOffsetY += maxHeightCurrRow + PADDING;\n      colOffsetX = 0;\n      col = 0;\n      row++;\n    }\n\n    if (col === 0) {\n      maxHeightCurrRow = getMaxHeightPerRow(row);\n    }\n    maxWidthCurrCol = getMaxWidthPerCol(col);\n\n    const { minX, minY, width, height } = getCommonBoundingBox(item.elements);\n    const offsetCenterX = (maxWidthCurrCol - width) / 2;\n    const offsetCenterY = (maxHeightCurrRow - height) / 2;\n    resElements.push(\n      // eslint-disable-next-line no-loop-func\n      ...item.elements.map((element) => ({\n        ...element,\n        x:\n          element.x +\n          // offset for column\n          colOffsetX +\n          // offset to center in given square grid\n          offsetCenterX -\n          // subtract minX so that given item starts at 0 coord\n          minX,\n        y:\n          element.y +\n          // offset for row\n          rowOffsetY +\n          // offset to center in given square grid\n          offsetCenterY -\n          // subtract minY so that given item starts at 0 coord\n          minY,\n      })),\n    );\n    colOffsetX += maxWidthCurrCol + PADDING;\n    index++;\n    col++;\n  }\n\n  return resElements;\n};\n\nexport const parseLibraryTokensFromUrl = () => {\n  const libraryUrl =\n    // current\n    new URLSearchParams(window.location.hash.slice(1)).get(\n      URL_HASH_KEYS.addLibrary,\n    ) ||\n    // legacy, kept for compat reasons\n    new URLSearchParams(window.location.search).get(URL_QUERY_KEYS.addLibrary);\n  const idToken = libraryUrl\n    ? new URLSearchParams(window.location.hash.slice(1)).get(\"token\")\n    : null;\n\n  return libraryUrl ? { libraryUrl, idToken } : null;\n};\n\nexport const useHandleLibrary = ({\n  excalidrawAPI,\n  getInitialLibraryItems,\n}: {\n  excalidrawAPI: ExcalidrawImperativeAPI | null;\n  getInitialLibraryItems?: () => LibraryItemsSource;\n}) => {\n  const getInitialLibraryRef = useRef(getInitialLibraryItems);\n\n  useEffect(() => {\n    if (!excalidrawAPI) {\n      return;\n    }\n\n    const importLibraryFromURL = async ({\n      libraryUrl,\n      idToken,\n    }: {\n      libraryUrl: string;\n      idToken: string | null;\n    }) => {\n      const libraryPromise = new Promise<Blob>(async (resolve, reject) => {\n        try {\n          const request = await fetch(decodeURIComponent(libraryUrl));\n          const blob = await request.blob();\n          resolve(blob);\n        } catch (error: any) {\n          reject(error);\n        }\n      });\n\n      const shouldPrompt = idToken !== excalidrawAPI.id;\n\n      // wait for the tab to be focused before continuing in case we'll prompt\n      // for confirmation\n      await (shouldPrompt && document.hidden\n        ? new Promise<void>((resolve) => {\n            window.addEventListener(\"focus\", () => resolve(), {\n              once: true,\n            });\n          })\n        : null);\n\n      try {\n        await excalidrawAPI.updateLibrary({\n          libraryItems: libraryPromise,\n          prompt: shouldPrompt,\n          merge: true,\n          defaultStatus: \"published\",\n          openLibraryMenu: true,\n        });\n      } catch (error) {\n        throw error;\n      } finally {\n        if (window.location.hash.includes(URL_HASH_KEYS.addLibrary)) {\n          const hash = new URLSearchParams(window.location.hash.slice(1));\n          hash.delete(URL_HASH_KEYS.addLibrary);\n          window.history.replaceState({}, APP_NAME, `#${hash.toString()}`);\n        } else if (window.location.search.includes(URL_QUERY_KEYS.addLibrary)) {\n          const query = new URLSearchParams(window.location.search);\n          query.delete(URL_QUERY_KEYS.addLibrary);\n          window.history.replaceState({}, APP_NAME, `?${query.toString()}`);\n        }\n      }\n    };\n    const onHashChange = (event: HashChangeEvent) => {\n      event.preventDefault();\n      const libraryUrlTokens = parseLibraryTokensFromUrl();\n      if (libraryUrlTokens) {\n        event.stopImmediatePropagation();\n        // If hash changed and it contains library url, import it and replace\n        // the url to its previous state (important in case of collaboration\n        // and similar).\n        // Using history API won't trigger another hashchange.\n        window.history.replaceState({}, \"\", event.oldURL);\n\n        importLibraryFromURL(libraryUrlTokens);\n      }\n    };\n\n    // -------------------------------------------------------------------------\n    // ------ init load --------------------------------------------------------\n    if (getInitialLibraryRef.current) {\n      excalidrawAPI.updateLibrary({\n        libraryItems: getInitialLibraryRef.current(),\n      });\n    }\n\n    const libraryUrlTokens = parseLibraryTokensFromUrl();\n\n    if (libraryUrlTokens) {\n      importLibraryFromURL(libraryUrlTokens);\n    }\n    // --------------------------------------------------------- init load -----\n\n    window.addEventListener(EVENT.HASHCHANGE, onHashChange);\n    return () => {\n      window.removeEventListener(EVENT.HASHCHANGE, onHashChange);\n    };\n  }, [excalidrawAPI]);\n};\n","import {\n  ExcalidrawElement,\n  ExcalidrawSelectionElement,\n  ExcalidrawTextElement,\n  FontFamilyValues,\n  StrokeRoundness,\n} from \"../element/types\";\nimport {\n  AppState,\n  BinaryFiles,\n  LibraryItem,\n  NormalizedZoomValue,\n} from \"../types\";\nimport { ImportedDataState, LegacyAppState } from \"./types\";\nimport {\n  getNonDeletedElements,\n  getNormalizedDimensions,\n  isInvisiblySmallElement,\n  refreshTextDimensions,\n} from \"../element\";\nimport { isTextElement, isUsingAdaptiveRadius } from \"../element/typeChecks\";\nimport { randomId } from \"../random\";\nimport {\n  DEFAULT_FONT_FAMILY,\n  DEFAULT_TEXT_ALIGN,\n  DEFAULT_VERTICAL_ALIGN,\n  PRECEDING_ELEMENT_KEY,\n  FONT_FAMILY,\n  ROUNDNESS,\n} from \"../constants\";\nimport { getDefaultAppState } from \"../appState\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport { bumpVersion } from \"../element/mutateElement\";\nimport { getUpdatedTimestamp, updateActiveTool } from \"../utils\";\nimport { arrayToMap } from \"../utils\";\nimport oc from \"open-color\";\nimport { MarkOptional, Mutable } from \"../utility-types\";\n\ntype RestoredAppState = Omit<\n  AppState,\n  \"offsetTop\" | \"offsetLeft\" | \"width\" | \"height\"\n>;\n\nexport const AllowedExcalidrawActiveTools: Record<\n  AppState[\"activeTool\"][\"type\"],\n  boolean\n> = {\n  selection: true,\n  text: true,\n  rectangle: true,\n  diamond: true,\n  ellipse: true,\n  line: true,\n  image: true,\n  arrow: true,\n  freedraw: true,\n  eraser: false,\n  custom: true,\n  hand: true,\n};\n\nexport type RestoredDataState = {\n  elements: ExcalidrawElement[];\n  appState: RestoredAppState;\n  files: BinaryFiles;\n};\n\nconst getFontFamilyByName = (fontFamilyName: string): FontFamilyValues => {\n  if (Object.keys(FONT_FAMILY).includes(fontFamilyName)) {\n    return FONT_FAMILY[\n      fontFamilyName as keyof typeof FONT_FAMILY\n    ] as FontFamilyValues;\n  }\n  return DEFAULT_FONT_FAMILY;\n};\n\nconst restoreElementWithProperties = <\n  T extends Required<Omit<ExcalidrawElement, \"customData\">> & {\n    customData?: ExcalidrawElement[\"customData\"];\n    /** @deprecated */\n    boundElementIds?: readonly ExcalidrawElement[\"id\"][];\n    /** @deprecated */\n    strokeSharpness?: StrokeRoundness;\n    /** metadata that may be present in elements during collaboration */\n    [PRECEDING_ELEMENT_KEY]?: string;\n  },\n  K extends Pick<T, keyof Omit<Required<T>, keyof ExcalidrawElement>>,\n>(\n  element: T,\n  extra: Pick<\n    T,\n    // This extra Pick<T, keyof K> ensure no excess properties are passed.\n    // @ts-ignore TS complains here but type checks the call sites fine.\n    keyof K\n  > &\n    Partial<Pick<ExcalidrawElement, \"type\" | \"x\" | \"y\">>,\n): T => {\n  const base: Pick<T, keyof ExcalidrawElement> & {\n    [PRECEDING_ELEMENT_KEY]?: string;\n  } = {\n    type: extra.type || element.type,\n    // all elements must have version > 0 so getSceneVersion() will pick up\n    // newly added elements\n    version: element.version || 1,\n    versionNonce: element.versionNonce ?? 0,\n    isDeleted: element.isDeleted ?? false,\n    id: element.id || randomId(),\n    fillStyle: element.fillStyle || \"hachure\",\n    strokeWidth: element.strokeWidth || 1,\n    strokeStyle: element.strokeStyle ?? \"solid\",\n    roughness: element.roughness ?? 1,\n    opacity: element.opacity == null ? 100 : element.opacity,\n    angle: element.angle || 0,\n    x: extra.x ?? element.x ?? 0,\n    y: extra.y ?? element.y ?? 0,\n    strokeColor: element.strokeColor || oc.black,\n    backgroundColor: element.backgroundColor || \"transparent\",\n    width: element.width || 0,\n    height: element.height || 0,\n    seed: element.seed ?? 1,\n    groupIds: element.groupIds ?? [],\n    roundness: element.roundness\n      ? element.roundness\n      : element.strokeSharpness === \"round\"\n      ? {\n          // for old elements that would now use adaptive radius algo,\n          // use legacy algo instead\n          type: isUsingAdaptiveRadius(element.type)\n            ? ROUNDNESS.LEGACY\n            : ROUNDNESS.PROPORTIONAL_RADIUS,\n        }\n      : null,\n    boundElements: element.boundElementIds\n      ? element.boundElementIds.map((id) => ({ type: \"arrow\", id }))\n      : element.boundElements ?? [],\n    updated: element.updated ?? getUpdatedTimestamp(),\n    link: element.link ?? null,\n    locked: element.locked ?? false,\n  };\n\n  if (\"customData\" in element) {\n    base.customData = element.customData;\n  }\n\n  if (PRECEDING_ELEMENT_KEY in element) {\n    base[PRECEDING_ELEMENT_KEY] = element[PRECEDING_ELEMENT_KEY];\n  }\n\n  return {\n    ...base,\n    ...getNormalizedDimensions(base),\n    ...extra,\n  } as unknown as T;\n};\n\nconst restoreElement = (\n  element: Exclude<ExcalidrawElement, ExcalidrawSelectionElement>,\n  refreshDimensions = false,\n): typeof element | null => {\n  switch (element.type) {\n    case \"text\":\n      let fontSize = element.fontSize;\n      let fontFamily = element.fontFamily;\n      if (\"font\" in element) {\n        const [fontPx, _fontFamily]: [string, string] = (\n          element as any\n        ).font.split(\" \");\n        fontSize = parseInt(fontPx, 10);\n        fontFamily = getFontFamilyByName(_fontFamily);\n      }\n      element = restoreElementWithProperties(element, {\n        fontSize,\n        fontFamily,\n        text: element.text ?? \"\",\n        textAlign: element.textAlign || DEFAULT_TEXT_ALIGN,\n        verticalAlign: element.verticalAlign || DEFAULT_VERTICAL_ALIGN,\n        containerId: element.containerId ?? null,\n        originalText: element.originalText || element.text,\n      });\n\n      if (refreshDimensions) {\n        element = { ...element, ...refreshTextDimensions(element) };\n      }\n      return element;\n    case \"freedraw\": {\n      return restoreElementWithProperties(element, {\n        points: element.points,\n        lastCommittedPoint: null,\n        simulatePressure: element.simulatePressure,\n        pressures: element.pressures,\n      });\n    }\n    case \"image\":\n      return restoreElementWithProperties(element, {\n        status: element.status || \"pending\",\n        fileId: element.fileId,\n        scale: element.scale || [1, 1],\n      });\n    case \"line\":\n    // @ts-ignore LEGACY type\n    // eslint-disable-next-line no-fallthrough\n    case \"draw\":\n    case \"arrow\": {\n      const {\n        startArrowhead = null,\n        endArrowhead = element.type === \"arrow\" ? \"arrow\" : null,\n      } = element;\n\n      let x = element.x;\n      let y = element.y;\n      let points = // migrate old arrow model to new one\n        !Array.isArray(element.points) || element.points.length < 2\n          ? [\n              [0, 0],\n              [element.width, element.height],\n            ]\n          : element.points;\n\n      if (points[0][0] !== 0 || points[0][1] !== 0) {\n        ({ points, x, y } = LinearElementEditor.getNormalizedPoints(element));\n      }\n\n      return restoreElementWithProperties(element, {\n        type:\n          (element.type as ExcalidrawElement[\"type\"] | \"draw\") === \"draw\"\n            ? \"line\"\n            : element.type,\n        startBinding: element.startBinding,\n        endBinding: element.endBinding,\n        lastCommittedPoint: null,\n        startArrowhead,\n        endArrowhead,\n        points,\n        x,\n        y,\n      });\n    }\n\n    // generic elements\n    case \"ellipse\":\n      return restoreElementWithProperties(element, {});\n    case \"rectangle\":\n      return restoreElementWithProperties(element, {});\n    case \"diamond\":\n      return restoreElementWithProperties(element, {});\n\n    // Don't use default case so as to catch a missing an element type case.\n    // We also don't want to throw, but instead return void so we filter\n    // out these unsupported elements from the restored array.\n  }\n};\n\n/**\n * Repairs contaienr element's boundElements array by removing duplicates and\n * fixing containerId of bound elements if not present. Also removes any\n * bound elements that do not exist in the elements array.\n *\n * NOTE mutates elements.\n */\nconst repairContainerElement = (\n  container: Mutable<ExcalidrawElement>,\n  elementsMap: Map<string, Mutable<ExcalidrawElement>>,\n) => {\n  if (container.boundElements) {\n    // copy because we're not cloning on restore, and we don't want to mutate upstream\n    const boundElements = container.boundElements.slice();\n\n    // dedupe bindings & fix boundElement.containerId if not set already\n    const boundIds = new Set<ExcalidrawElement[\"id\"]>();\n    container.boundElements = boundElements.reduce(\n      (\n        acc: Mutable<NonNullable<ExcalidrawElement[\"boundElements\"]>>,\n        binding,\n      ) => {\n        const boundElement = elementsMap.get(binding.id);\n        if (boundElement && !boundIds.has(binding.id)) {\n          boundIds.add(binding.id);\n\n          if (boundElement.isDeleted) {\n            return acc;\n          }\n\n          acc.push(binding);\n\n          if (\n            isTextElement(boundElement) &&\n            // being slightly conservative here, preserving existing containerId\n            // if defined, lest boundElements is stale\n            !boundElement.containerId\n          ) {\n            (boundElement as Mutable<ExcalidrawTextElement>).containerId =\n              container.id;\n          }\n        }\n        return acc;\n      },\n      [],\n    );\n  }\n};\n\n/**\n * Repairs target bound element's container's boundElements array,\n * or removes contaienrId if container does not exist.\n *\n * NOTE mutates elements.\n */\nconst repairBoundElement = (\n  boundElement: Mutable<ExcalidrawTextElement>,\n  elementsMap: Map<string, Mutable<ExcalidrawElement>>,\n) => {\n  const container = boundElement.containerId\n    ? elementsMap.get(boundElement.containerId)\n    : null;\n\n  if (!container) {\n    boundElement.containerId = null;\n    return;\n  }\n\n  if (boundElement.isDeleted) {\n    return;\n  }\n\n  if (\n    container.boundElements &&\n    !container.boundElements.find((binding) => binding.id === boundElement.id)\n  ) {\n    // copy because we're not cloning on restore, and we don't want to mutate upstream\n    const boundElements = (\n      container.boundElements || (container.boundElements = [])\n    ).slice();\n    boundElements.push({ type: \"text\", id: boundElement.id });\n    container.boundElements = boundElements;\n  }\n};\n\nexport const restoreElements = (\n  elements: ImportedDataState[\"elements\"],\n  /** NOTE doesn't serve for reconciliation */\n  localElements: readonly ExcalidrawElement[] | null | undefined,\n  opts?: { refreshDimensions?: boolean; repairBindings?: boolean } | undefined,\n): ExcalidrawElement[] => {\n  const localElementsMap = localElements ? arrayToMap(localElements) : null;\n  const restoredElements = (elements || []).reduce((elements, element) => {\n    // filtering out selection, which is legacy, no longer kept in elements,\n    // and causing issues if retained\n    if (element.type !== \"selection\" && !isInvisiblySmallElement(element)) {\n      let migratedElement: ExcalidrawElement | null = restoreElement(\n        element,\n        opts?.refreshDimensions,\n      );\n      if (migratedElement) {\n        const localElement = localElementsMap?.get(element.id);\n        if (localElement && localElement.version > migratedElement.version) {\n          migratedElement = bumpVersion(migratedElement, localElement.version);\n        }\n        elements.push(migratedElement);\n      }\n    }\n    return elements;\n  }, [] as ExcalidrawElement[]);\n\n  if (!opts?.repairBindings) {\n    return restoredElements;\n  }\n\n  // repair binding. Mutates elements.\n  const restoredElementsMap = arrayToMap(restoredElements);\n  for (const element of restoredElements) {\n    if (isTextElement(element) && element.containerId) {\n      repairBoundElement(element, restoredElementsMap);\n    } else if (element.boundElements) {\n      repairContainerElement(element, restoredElementsMap);\n    }\n  }\n\n  return restoredElements;\n};\n\nconst coalesceAppStateValue = <\n  T extends keyof ReturnType<typeof getDefaultAppState>,\n>(\n  key: T,\n  appState: Exclude<ImportedDataState[\"appState\"], null | undefined>,\n  defaultAppState: ReturnType<typeof getDefaultAppState>,\n) => {\n  const value = appState[key];\n  // NOTE the value! assertion is needed in TS 4.5.5 (fixed in newer versions)\n  return value !== undefined ? value! : defaultAppState[key];\n};\n\nconst LegacyAppStateMigrations: {\n  [K in keyof LegacyAppState]: (\n    ImportedDataState: Exclude<ImportedDataState[\"appState\"], null | undefined>,\n    defaultAppState: ReturnType<typeof getDefaultAppState>,\n  ) => [LegacyAppState[K][1], AppState[LegacyAppState[K][1]]];\n} = {\n  isLibraryOpen: (appState, defaultAppState) => {\n    return [\n      \"openSidebar\",\n      \"isLibraryOpen\" in appState\n        ? appState.isLibraryOpen\n          ? \"library\"\n          : null\n        : coalesceAppStateValue(\"openSidebar\", appState, defaultAppState),\n    ];\n  },\n  isLibraryMenuDocked: (appState, defaultAppState) => {\n    return [\n      \"isSidebarDocked\",\n      appState.isLibraryMenuDocked ??\n        coalesceAppStateValue(\"isSidebarDocked\", appState, defaultAppState),\n    ];\n  },\n};\n\nexport const restoreAppState = (\n  appState: ImportedDataState[\"appState\"],\n  localAppState: Partial<AppState> | null | undefined,\n): RestoredAppState => {\n  appState = appState || {};\n  const defaultAppState = getDefaultAppState();\n  const nextAppState = {} as typeof defaultAppState;\n\n  // first, migrate all legacy AppState properties to new ones. We do it\n  // in one go before migrate the rest of the properties in case the new ones\n  // depend on checking any other key (i.e. they are coupled)\n  for (const legacyKey of Object.keys(\n    LegacyAppStateMigrations,\n  ) as (keyof typeof LegacyAppStateMigrations)[]) {\n    if (legacyKey in appState) {\n      const [nextKey, nextValue] = LegacyAppStateMigrations[legacyKey](\n        appState,\n        defaultAppState,\n      );\n      (nextAppState as any)[nextKey] = nextValue;\n    }\n  }\n\n  for (const [key, defaultValue] of Object.entries(defaultAppState) as [\n    keyof typeof defaultAppState,\n    any,\n  ][]) {\n    // if AppState contains a legacy key, prefer that one and migrate its\n    // value to the new one\n    const suppliedValue = appState[key];\n\n    const localValue = localAppState ? localAppState[key] : undefined;\n    (nextAppState as any)[key] =\n      suppliedValue !== undefined\n        ? suppliedValue\n        : localValue !== undefined\n        ? localValue\n        : defaultValue;\n  }\n\n  return {\n    ...nextAppState,\n    cursorButton: localAppState?.cursorButton || \"up\",\n    // reset on fresh restore so as to hide the UI button if penMode not active\n    penDetected:\n      localAppState?.penDetected ??\n      (appState.penMode ? appState.penDetected ?? false : false),\n    activeTool: {\n      ...updateActiveTool(\n        defaultAppState,\n        nextAppState.activeTool.type &&\n          AllowedExcalidrawActiveTools[nextAppState.activeTool.type]\n          ? nextAppState.activeTool\n          : { type: \"selection\" },\n      ),\n      lastActiveTool: null,\n      locked: nextAppState.activeTool.locked ?? false,\n    },\n    // Migrates from previous version where appState.zoom was a number\n    zoom:\n      typeof appState.zoom === \"number\"\n        ? {\n            value: appState.zoom as NormalizedZoomValue,\n          }\n        : appState.zoom || defaultAppState.zoom,\n    // when sidebar docked and user left it open in last session,\n    // keep it open. If not docked, keep it closed irrespective of last state.\n    openSidebar:\n      nextAppState.openSidebar === \"library\"\n        ? nextAppState.isSidebarDocked\n          ? \"library\"\n          : null\n        : nextAppState.openSidebar,\n  };\n};\n\nexport const restore = (\n  data: Pick<ImportedDataState, \"appState\" | \"elements\" | \"files\"> | null,\n  /**\n   * Local AppState (`this.state` or initial state from localStorage) so that we\n   * don't overwrite local state with default values (when values not\n   * explicitly specified).\n   * Supply `null` if you can't get access to it.\n   */\n  localAppState: Partial<AppState> | null | undefined,\n  localElements: readonly ExcalidrawElement[] | null | undefined,\n  elementsConfig?: { refreshDimensions?: boolean; repairBindings?: boolean },\n): RestoredDataState => {\n  return {\n    elements: restoreElements(data?.elements, localElements, elementsConfig),\n    appState: restoreAppState(data?.appState, localAppState || null),\n    files: data?.files || {},\n  };\n};\n\nconst restoreLibraryItem = (libraryItem: LibraryItem) => {\n  const elements = restoreElements(\n    getNonDeletedElements(libraryItem.elements),\n    null,\n  );\n  return elements.length ? { ...libraryItem, elements } : null;\n};\n\nexport const restoreLibraryItems = (\n  libraryItems: ImportedDataState[\"libraryItems\"] = [],\n  defaultStatus: LibraryItem[\"status\"],\n) => {\n  const restoredItems: LibraryItem[] = [];\n  for (const item of libraryItems) {\n    // migrate older libraries\n    if (Array.isArray(item)) {\n      const restoredItem = restoreLibraryItem({\n        status: defaultStatus,\n        elements: item,\n        id: randomId(),\n        created: Date.now(),\n      });\n      if (restoredItem) {\n        restoredItems.push(restoredItem);\n      }\n    } else {\n      const _item = item as MarkOptional<\n        LibraryItem,\n        \"id\" | \"status\" | \"created\"\n      >;\n      const restoredItem = restoreLibraryItem({\n        ..._item,\n        id: _item.id || randomId(),\n        status: _item.status || defaultStatus,\n        created: _item.created || Date.now(),\n      });\n      if (restoredItem) {\n        restoredItems.push(restoredItem);\n      }\n    }\n  }\n  return restoredItems;\n};\n","import { AppState, ExcalidrawProps, Point } from \"../types\";\nimport {\n  getShortcutKey,\n  sceneCoordsToViewportCoords,\n  viewportCoordsToSceneCoords,\n  wrapEvent,\n} from \"../utils\";\nimport { mutateElement } from \"./mutateElement\";\nimport { NonDeletedExcalidrawElement } from \"./types\";\n\nimport { register } from \"../actions/register\";\nimport { ToolButton } from \"../components/ToolButton\";\nimport { FreedrawIcon, LinkIcon, TrashIcon } from \"../components/icons\";\nimport { t } from \"../i18n\";\nimport {\n  useCallback,\n  useEffect,\n  useLayoutEffect,\n  useRef,\n  useState,\n} from \"react\";\nimport clsx from \"clsx\";\nimport { KEYS } from \"../keys\";\nimport { DEFAULT_LINK_SIZE } from \"../renderer/renderElement\";\nimport { rotate } from \"../math\";\nimport { EVENT, HYPERLINK_TOOLTIP_DELAY, MIME_TYPES } from \"../constants\";\nimport { Bounds } from \"./bounds\";\nimport { getTooltipDiv, updateTooltipPosition } from \"../components/Tooltip\";\nimport { getSelectedElements } from \"../scene\";\nimport { isPointHittingElementBoundingBox } from \"./collision\";\nimport { getElementAbsoluteCoords } from \"./\";\n\nimport \"./Hyperlink.scss\";\nimport { trackEvent } from \"../analytics\";\nimport { useExcalidrawAppState } from \"../components/App\";\n\nconst CONTAINER_WIDTH = 320;\nconst SPACE_BOTTOM = 85;\nconst CONTAINER_PADDING = 5;\nconst CONTAINER_HEIGHT = 42;\nconst AUTO_HIDE_TIMEOUT = 500;\n\nexport const EXTERNAL_LINK_IMG = document.createElement(\"img\");\nEXTERNAL_LINK_IMG.src = `data:${MIME_TYPES.svg}, ${encodeURIComponent(\n  `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"#1971c2\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"feather feather-external-link\"><path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\"></path><polyline points=\"15 3 21 3 21 9\"></polyline><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"></line></svg>`,\n)}`;\n\nlet IS_HYPERLINK_TOOLTIP_VISIBLE = false;\n\nexport const Hyperlink = ({\n  element,\n  setAppState,\n  onLinkOpen,\n}: {\n  element: NonDeletedExcalidrawElement;\n  setAppState: React.Component<any, AppState>[\"setState\"];\n  onLinkOpen: ExcalidrawProps[\"onLinkOpen\"];\n}) => {\n  const appState = useExcalidrawAppState();\n\n  const linkVal = element.link || \"\";\n\n  const [inputVal, setInputVal] = useState(linkVal);\n  const inputRef = useRef<HTMLInputElement>(null);\n  const isEditing = appState.showHyperlinkPopup === \"editor\" || !linkVal;\n\n  const handleSubmit = useCallback(() => {\n    if (!inputRef.current) {\n      return;\n    }\n\n    const link = normalizeLink(inputRef.current.value);\n\n    if (!element.link && link) {\n      trackEvent(\"hyperlink\", \"create\");\n    }\n\n    mutateElement(element, { link });\n    setAppState({ showHyperlinkPopup: \"info\" });\n  }, [element, setAppState]);\n\n  useLayoutEffect(() => {\n    return () => {\n      handleSubmit();\n    };\n  }, [handleSubmit]);\n\n  useEffect(() => {\n    let timeoutId: number | null = null;\n    const handlePointerMove = (event: PointerEvent) => {\n      if (isEditing) {\n        return;\n      }\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n      }\n      const shouldHide = shouldHideLinkPopup(element, appState, [\n        event.clientX,\n        event.clientY,\n      ]) as boolean;\n      if (shouldHide) {\n        timeoutId = window.setTimeout(() => {\n          setAppState({ showHyperlinkPopup: false });\n        }, AUTO_HIDE_TIMEOUT);\n      }\n    };\n    window.addEventListener(EVENT.POINTER_MOVE, handlePointerMove, false);\n    return () => {\n      window.removeEventListener(EVENT.POINTER_MOVE, handlePointerMove, false);\n      if (timeoutId) {\n        clearTimeout(timeoutId);\n      }\n    };\n  }, [appState, element, isEditing, setAppState]);\n\n  const handleRemove = useCallback(() => {\n    trackEvent(\"hyperlink\", \"delete\");\n    mutateElement(element, { link: null });\n    if (isEditing) {\n      inputRef.current!.value = \"\";\n    }\n    setAppState({ showHyperlinkPopup: false });\n  }, [setAppState, element, isEditing]);\n\n  const onEdit = () => {\n    trackEvent(\"hyperlink\", \"edit\", \"popup-ui\");\n    setAppState({ showHyperlinkPopup: \"editor\" });\n  };\n  const { x, y } = getCoordsForPopover(element, appState);\n  if (\n    appState.draggingElement ||\n    appState.resizingElement ||\n    appState.isRotating ||\n    appState.openMenu\n  ) {\n    return null;\n  }\n  return (\n    <div\n      className=\"excalidraw-hyperlinkContainer\"\n      style={{\n        top: `${y}px`,\n        left: `${x}px`,\n        width: CONTAINER_WIDTH,\n        padding: CONTAINER_PADDING,\n      }}\n    >\n      {isEditing ? (\n        <input\n          className={clsx(\"excalidraw-hyperlinkContainer-input\")}\n          placeholder=\"Type or paste your link here\"\n          ref={inputRef}\n          value={inputVal}\n          onChange={(event) => setInputVal(event.target.value)}\n          autoFocus\n          onKeyDown={(event) => {\n            event.stopPropagation();\n            // prevent cmd/ctrl+k shortcut when editing link\n            if (event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K) {\n              event.preventDefault();\n            }\n            if (event.key === KEYS.ENTER || event.key === KEYS.ESCAPE) {\n              handleSubmit();\n            }\n          }}\n        />\n      ) : (\n        <a\n          href={element.link || \"\"}\n          className={clsx(\"excalidraw-hyperlinkContainer-link\", {\n            \"d-none\": isEditing,\n          })}\n          target={isLocalLink(element.link) ? \"_self\" : \"_blank\"}\n          onClick={(event) => {\n            if (element.link && onLinkOpen) {\n              const customEvent = wrapEvent(\n                EVENT.EXCALIDRAW_LINK,\n                event.nativeEvent,\n              );\n              onLinkOpen(element, customEvent);\n              if (customEvent.defaultPrevented) {\n                event.preventDefault();\n              }\n            }\n          }}\n          rel=\"noopener noreferrer\"\n        >\n          {element.link}\n        </a>\n      )}\n      <div className=\"excalidraw-hyperlinkContainer__buttons\">\n        {!isEditing && (\n          <ToolButton\n            type=\"button\"\n            title={t(\"buttons.edit\")}\n            aria-label={t(\"buttons.edit\")}\n            label={t(\"buttons.edit\")}\n            onClick={onEdit}\n            className=\"excalidraw-hyperlinkContainer--edit\"\n            icon={FreedrawIcon}\n          />\n        )}\n\n        {linkVal && (\n          <ToolButton\n            type=\"button\"\n            title={t(\"buttons.remove\")}\n            aria-label={t(\"buttons.remove\")}\n            label={t(\"buttons.remove\")}\n            onClick={handleRemove}\n            className=\"excalidraw-hyperlinkContainer--remove\"\n            icon={TrashIcon}\n          />\n        )}\n      </div>\n    </div>\n  );\n};\n\nconst getCoordsForPopover = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n) => {\n  const [x1, y1] = getElementAbsoluteCoords(element);\n  const { x: viewportX, y: viewportY } = sceneCoordsToViewportCoords(\n    { sceneX: x1 + element.width / 2, sceneY: y1 },\n    appState,\n  );\n  const x = viewportX - appState.offsetLeft - CONTAINER_WIDTH / 2;\n  const y = viewportY - appState.offsetTop - SPACE_BOTTOM;\n  return { x, y };\n};\n\nexport const normalizeLink = (link: string) => {\n  link = link.trim();\n  if (link) {\n    // prefix with protocol if not fully-qualified\n    if (!link.includes(\"://\") && !/^[[\\\\/]/.test(link)) {\n      link = `https://${link}`;\n    }\n  }\n  return link;\n};\n\nexport const isLocalLink = (link: string | null) => {\n  return !!(link?.includes(location.origin) || link?.startsWith(\"/\"));\n};\n\nexport const actionLink = register({\n  name: \"hyperlink\",\n  perform: (elements, appState) => {\n    if (appState.showHyperlinkPopup === \"editor\") {\n      return false;\n    }\n\n    return {\n      elements,\n      appState: {\n        ...appState,\n        showHyperlinkPopup: \"editor\",\n        openMenu: null,\n      },\n      commitToHistory: true,\n    };\n  },\n  trackEvent: { category: \"hyperlink\", action: \"click\" },\n  keyTest: (event) => event[KEYS.CTRL_OR_CMD] && event.key === KEYS.K,\n  contextItemLabel: (elements, appState) =>\n    getContextMenuLabel(elements, appState),\n  predicate: (elements, appState) => {\n    const selectedElements = getSelectedElements(elements, appState);\n    return selectedElements.length === 1;\n  },\n  PanelComponent: ({ elements, appState, updateData }) => {\n    const selectedElements = getSelectedElements(elements, appState);\n\n    return (\n      <ToolButton\n        type=\"button\"\n        icon={LinkIcon}\n        aria-label={t(getContextMenuLabel(elements, appState))}\n        title={`${t(\"labels.link.label\")} - ${getShortcutKey(\"CtrlOrCmd+K\")}`}\n        onClick={() => updateData(null)}\n        selected={selectedElements.length === 1 && !!selectedElements[0].link}\n      />\n    );\n  },\n});\n\nexport const getContextMenuLabel = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n) => {\n  const selectedElements = getSelectedElements(elements, appState);\n  const label = selectedElements[0]!.link\n    ? \"labels.link.edit\"\n    : \"labels.link.create\";\n  return label;\n};\nexport const getLinkHandleFromCoords = (\n  [x1, y1, x2, y2]: Bounds,\n  angle: number,\n  appState: AppState,\n): [x: number, y: number, width: number, height: number] => {\n  const size = DEFAULT_LINK_SIZE;\n  const linkWidth = size / appState.zoom.value;\n  const linkHeight = size / appState.zoom.value;\n  const linkMarginY = size / appState.zoom.value;\n  const centerX = (x1 + x2) / 2;\n  const centerY = (y1 + y2) / 2;\n  const centeringOffset = (size - 8) / (2 * appState.zoom.value);\n  const dashedLineMargin = 4 / appState.zoom.value;\n\n  // Same as `ne` resize handle\n  const x = x2 + dashedLineMargin - centeringOffset;\n  const y = y1 - dashedLineMargin - linkMarginY + centeringOffset;\n\n  const [rotatedX, rotatedY] = rotate(\n    x + linkWidth / 2,\n    y + linkHeight / 2,\n    centerX,\n    centerY,\n    angle,\n  );\n  return [\n    rotatedX - linkWidth / 2,\n    rotatedY - linkHeight / 2,\n    linkWidth,\n    linkHeight,\n  ];\n};\n\nexport const isPointHittingLinkIcon = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n  [x, y]: Point,\n  isMobile: boolean,\n) => {\n  if (!element.link || appState.selectedElementIds[element.id]) {\n    return false;\n  }\n  const threshold = 4 / appState.zoom.value;\n  if (\n    !isMobile &&\n    appState.viewModeEnabled &&\n    isPointHittingElementBoundingBox(element, [x, y], threshold)\n  ) {\n    return true;\n  }\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n  const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords(\n    [x1, y1, x2, y2],\n    element.angle,\n    appState,\n  );\n  const hitLink =\n    x > linkX - threshold &&\n    x < linkX + threshold + linkWidth &&\n    y > linkY - threshold &&\n    y < linkY + linkHeight + threshold;\n  return hitLink;\n};\n\nlet HYPERLINK_TOOLTIP_TIMEOUT_ID: number | null = null;\nexport const showHyperlinkTooltip = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n) => {\n  if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {\n    clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);\n  }\n  HYPERLINK_TOOLTIP_TIMEOUT_ID = window.setTimeout(\n    () => renderTooltip(element, appState),\n    HYPERLINK_TOOLTIP_DELAY,\n  );\n};\n\nconst renderTooltip = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n) => {\n  if (!element.link) {\n    return;\n  }\n\n  const tooltipDiv = getTooltipDiv();\n\n  tooltipDiv.classList.add(\"excalidraw-tooltip--visible\");\n  tooltipDiv.style.maxWidth = \"20rem\";\n  tooltipDiv.textContent = element.link;\n\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n  const [linkX, linkY, linkWidth, linkHeight] = getLinkHandleFromCoords(\n    [x1, y1, x2, y2],\n    element.angle,\n    appState,\n  );\n\n  const linkViewportCoords = sceneCoordsToViewportCoords(\n    { sceneX: linkX, sceneY: linkY },\n    appState,\n  );\n\n  updateTooltipPosition(\n    tooltipDiv,\n    {\n      left: linkViewportCoords.x,\n      top: linkViewportCoords.y,\n      width: linkWidth,\n      height: linkHeight,\n    },\n    \"top\",\n  );\n  trackEvent(\"hyperlink\", \"tooltip\", \"link-icon\");\n\n  IS_HYPERLINK_TOOLTIP_VISIBLE = true;\n};\nexport const hideHyperlinkToolip = () => {\n  if (HYPERLINK_TOOLTIP_TIMEOUT_ID) {\n    clearTimeout(HYPERLINK_TOOLTIP_TIMEOUT_ID);\n  }\n  if (IS_HYPERLINK_TOOLTIP_VISIBLE) {\n    IS_HYPERLINK_TOOLTIP_VISIBLE = false;\n    getTooltipDiv().classList.remove(\"excalidraw-tooltip--visible\");\n  }\n};\n\nexport const shouldHideLinkPopup = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n  [clientX, clientY]: Point,\n): Boolean => {\n  const { x: sceneX, y: sceneY } = viewportCoordsToSceneCoords(\n    { clientX, clientY },\n    appState,\n  );\n\n  const threshold = 15 / appState.zoom.value;\n  // hitbox to prevent hiding when hovered in element bounding box\n  if (isPointHittingElementBoundingBox(element, [sceneX, sceneY], threshold)) {\n    return false;\n  }\n  const [x1, y1, x2] = getElementAbsoluteCoords(element);\n  // hit box to prevent hiding when hovered in the vertical area between element and popover\n  if (\n    sceneX >= x1 &&\n    sceneX <= x2 &&\n    sceneY >= y1 - SPACE_BOTTOM &&\n    sceneY <= y1\n  ) {\n    return false;\n  }\n  // hit box to prevent hiding when hovered around popover within threshold\n  const { x: popoverX, y: popoverY } = getCoordsForPopover(element, appState);\n\n  if (\n    clientX >= popoverX - threshold &&\n    clientX <= popoverX + CONTAINER_WIDTH + CONTAINER_PADDING * 2 + threshold &&\n    clientY >= popoverY - threshold &&\n    clientY <= popoverY + threshold + CONTAINER_PADDING * 2 + CONTAINER_HEIGHT\n  ) {\n    return false;\n  }\n  return true;\n};\n","import {\n  ExcalidrawLinearElement,\n  ExcalidrawBindableElement,\n  NonDeleted,\n  NonDeletedExcalidrawElement,\n  PointBinding,\n  ExcalidrawElement,\n} from \"./types\";\nimport { getElementAtPosition } from \"../scene\";\nimport { AppState } from \"../types\";\nimport {\n  isBindableElement,\n  isBindingElement,\n  isLinearElement,\n} from \"./typeChecks\";\nimport {\n  bindingBorderTest,\n  distanceToBindableElement,\n  maxBindingGap,\n  determineFocusDistance,\n  intersectElementWithLine,\n  determineFocusPoint,\n} from \"./collision\";\nimport { mutateElement } from \"./mutateElement\";\nimport Scene from \"../scene/Scene\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { arrayToMap, tupleToCoors } from \"../utils\";\nimport { KEYS } from \"../keys\";\nimport { getBoundTextElement, handleBindTextResize } from \"./textElement\";\n\nexport type SuggestedBinding =\n  | NonDeleted<ExcalidrawBindableElement>\n  | SuggestedPointBinding;\n\nexport type SuggestedPointBinding = [\n  NonDeleted<ExcalidrawLinearElement>,\n  \"start\" | \"end\" | \"both\",\n  NonDeleted<ExcalidrawBindableElement>,\n];\n\nexport const shouldEnableBindingForPointerEvent = (\n  event: React.PointerEvent<HTMLCanvasElement>,\n) => {\n  return !event[KEYS.CTRL_OR_CMD];\n};\n\nexport const isBindingEnabled = (appState: AppState): boolean => {\n  return appState.isBindingEnabled;\n};\n\nconst getNonDeletedElements = (\n  scene: Scene,\n  ids: readonly ExcalidrawElement[\"id\"][],\n): NonDeleted<ExcalidrawElement>[] => {\n  const result: NonDeleted<ExcalidrawElement>[] = [];\n  ids.forEach((id) => {\n    const element = scene.getNonDeletedElement(id);\n    if (element != null) {\n      result.push(element);\n    }\n  });\n  return result;\n};\n\nexport const bindOrUnbindLinearElement = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  startBindingElement: ExcalidrawBindableElement | null | \"keep\",\n  endBindingElement: ExcalidrawBindableElement | null | \"keep\",\n): void => {\n  const boundToElementIds: Set<ExcalidrawBindableElement[\"id\"]> = new Set();\n  const unboundFromElementIds: Set<ExcalidrawBindableElement[\"id\"]> = new Set();\n  bindOrUnbindLinearElementEdge(\n    linearElement,\n    startBindingElement,\n    endBindingElement,\n    \"start\",\n    boundToElementIds,\n    unboundFromElementIds,\n  );\n  bindOrUnbindLinearElementEdge(\n    linearElement,\n    endBindingElement,\n    startBindingElement,\n    \"end\",\n    boundToElementIds,\n    unboundFromElementIds,\n  );\n\n  const onlyUnbound = Array.from(unboundFromElementIds).filter(\n    (id) => !boundToElementIds.has(id),\n  );\n\n  getNonDeletedElements(Scene.getScene(linearElement)!, onlyUnbound).forEach(\n    (element) => {\n      mutateElement(element, {\n        boundElements: element.boundElements?.filter(\n          (element) =>\n            element.type !== \"arrow\" || element.id !== linearElement.id,\n        ),\n      });\n    },\n  );\n};\n\nconst bindOrUnbindLinearElementEdge = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  bindableElement: ExcalidrawBindableElement | null | \"keep\",\n  otherEdgeBindableElement: ExcalidrawBindableElement | null | \"keep\",\n  startOrEnd: \"start\" | \"end\",\n  // Is mutated\n  boundToElementIds: Set<ExcalidrawBindableElement[\"id\"]>,\n  // Is mutated\n  unboundFromElementIds: Set<ExcalidrawBindableElement[\"id\"]>,\n): void => {\n  if (bindableElement !== \"keep\") {\n    if (bindableElement != null) {\n      // Don't bind if we're trying to bind or are already bound to the same\n      // element on the other edge already (\"start\" edge takes precedence).\n      if (\n        otherEdgeBindableElement == null ||\n        (otherEdgeBindableElement === \"keep\"\n          ? !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n              linearElement,\n              bindableElement,\n              startOrEnd,\n            )\n          : startOrEnd === \"start\" ||\n            otherEdgeBindableElement.id !== bindableElement.id)\n      ) {\n        bindLinearElement(linearElement, bindableElement, startOrEnd);\n        boundToElementIds.add(bindableElement.id);\n      }\n    } else {\n      const unbound = unbindLinearElement(linearElement, startOrEnd);\n      if (unbound != null) {\n        unboundFromElementIds.add(unbound);\n      }\n    }\n  }\n};\n\nexport const bindOrUnbindSelectedElements = (\n  elements: NonDeleted<ExcalidrawElement>[],\n): void => {\n  elements.forEach((element) => {\n    if (isBindingElement(element)) {\n      bindOrUnbindLinearElement(\n        element,\n        getElligibleElementForBindingElement(element, \"start\"),\n        getElligibleElementForBindingElement(element, \"end\"),\n      );\n    } else if (isBindableElement(element)) {\n      maybeBindBindableElement(element);\n    }\n  });\n};\n\nconst maybeBindBindableElement = (\n  bindableElement: NonDeleted<ExcalidrawBindableElement>,\n): void => {\n  getElligibleElementsForBindableElementAndWhere(bindableElement).forEach(\n    ([linearElement, where]) =>\n      bindOrUnbindLinearElement(\n        linearElement,\n        where === \"end\" ? \"keep\" : bindableElement,\n        where === \"start\" ? \"keep\" : bindableElement,\n      ),\n  );\n};\n\nexport const maybeBindLinearElement = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  appState: AppState,\n  scene: Scene,\n  pointerCoords: { x: number; y: number },\n): void => {\n  if (appState.startBoundElement != null) {\n    bindLinearElement(linearElement, appState.startBoundElement, \"start\");\n  }\n  const hoveredElement = getHoveredElementForBinding(pointerCoords, scene);\n  if (\n    hoveredElement != null &&\n    !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n      linearElement,\n      hoveredElement,\n      \"end\",\n    )\n  ) {\n    bindLinearElement(linearElement, hoveredElement, \"end\");\n  }\n};\n\nconst bindLinearElement = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  hoveredElement: ExcalidrawBindableElement,\n  startOrEnd: \"start\" | \"end\",\n): void => {\n  mutateElement(linearElement, {\n    [startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"]: {\n      elementId: hoveredElement.id,\n      ...calculateFocusAndGap(linearElement, hoveredElement, startOrEnd),\n    } as PointBinding,\n  });\n\n  const boundElementsMap = arrayToMap(hoveredElement.boundElements || []);\n  if (!boundElementsMap.has(linearElement.id)) {\n    mutateElement(hoveredElement, {\n      boundElements: (hoveredElement.boundElements || []).concat({\n        id: linearElement.id,\n        type: \"arrow\",\n      }),\n    });\n  }\n};\n\n// Don't bind both ends of a simple segment\nconst isLinearElementSimpleAndAlreadyBoundOnOppositeEdge = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  bindableElement: ExcalidrawBindableElement,\n  startOrEnd: \"start\" | \"end\",\n): boolean => {\n  const otherBinding =\n    linearElement[startOrEnd === \"start\" ? \"endBinding\" : \"startBinding\"];\n  return isLinearElementSimpleAndAlreadyBound(\n    linearElement,\n    otherBinding?.elementId,\n    bindableElement,\n  );\n};\n\nexport const isLinearElementSimpleAndAlreadyBound = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  alreadyBoundToId: ExcalidrawBindableElement[\"id\"] | undefined,\n  bindableElement: ExcalidrawBindableElement,\n): boolean => {\n  return (\n    alreadyBoundToId === bindableElement.id && linearElement.points.length < 3\n  );\n};\n\nexport const unbindLinearElements = (\n  elements: NonDeleted<ExcalidrawElement>[],\n): void => {\n  elements.forEach((element) => {\n    if (isBindingElement(element)) {\n      bindOrUnbindLinearElement(element, null, null);\n    }\n  });\n};\n\nconst unbindLinearElement = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  startOrEnd: \"start\" | \"end\",\n): ExcalidrawBindableElement[\"id\"] | null => {\n  const field = startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\";\n  const binding = linearElement[field];\n  if (binding == null) {\n    return null;\n  }\n  mutateElement(linearElement, { [field]: null });\n  return binding.elementId;\n};\n\nexport const getHoveredElementForBinding = (\n  pointerCoords: {\n    x: number;\n    y: number;\n  },\n  scene: Scene,\n): NonDeleted<ExcalidrawBindableElement> | null => {\n  const hoveredElement = getElementAtPosition(\n    scene.getNonDeletedElements(),\n    (element) =>\n      isBindableElement(element, false) &&\n      bindingBorderTest(element, pointerCoords),\n  );\n  return hoveredElement as NonDeleted<ExcalidrawBindableElement> | null;\n};\n\nconst calculateFocusAndGap = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  hoveredElement: ExcalidrawBindableElement,\n  startOrEnd: \"start\" | \"end\",\n): { focus: number; gap: number } => {\n  const direction = startOrEnd === \"start\" ? -1 : 1;\n  const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;\n  const adjacentPointIndex = edgePointIndex - direction;\n  const edgePoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n    linearElement,\n    edgePointIndex,\n  );\n  const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n    linearElement,\n    adjacentPointIndex,\n  );\n  return {\n    focus: determineFocusDistance(hoveredElement, adjacentPoint, edgePoint),\n    gap: Math.max(1, distanceToBindableElement(hoveredElement, edgePoint)),\n  };\n};\n\n// Supports translating, rotating and scaling `changedElement` with bound\n// linear elements.\n// Because scaling involves moving the focus points as well, it is\n// done before the `changedElement` is updated, and the `newSize` is passed\n// in explicitly.\nexport const updateBoundElements = (\n  changedElement: NonDeletedExcalidrawElement,\n  options?: {\n    simultaneouslyUpdated?: readonly ExcalidrawElement[];\n    newSize?: { width: number; height: number };\n  },\n) => {\n  const boundLinearElements = (changedElement.boundElements ?? []).filter(\n    (el) => el.type === \"arrow\",\n  );\n  if (boundLinearElements.length === 0) {\n    return;\n  }\n  const { newSize, simultaneouslyUpdated } = options ?? {};\n  const simultaneouslyUpdatedElementIds = getSimultaneouslyUpdatedElementIds(\n    simultaneouslyUpdated,\n  );\n\n  getNonDeletedElements(\n    Scene.getScene(changedElement)!,\n    boundLinearElements.map((el) => el.id),\n  ).forEach((element) => {\n    if (!isLinearElement(element)) {\n      return;\n    }\n\n    const bindableElement = changedElement as ExcalidrawBindableElement;\n    // In case the boundElements are stale\n    if (!doesNeedUpdate(element, bindableElement)) {\n      return;\n    }\n    const startBinding = maybeCalculateNewGapWhenScaling(\n      bindableElement,\n      element.startBinding,\n      newSize,\n    );\n    const endBinding = maybeCalculateNewGapWhenScaling(\n      bindableElement,\n      element.endBinding,\n      newSize,\n    );\n    // `linearElement` is being moved/scaled already, just update the binding\n    if (simultaneouslyUpdatedElementIds.has(element.id)) {\n      mutateElement(element, { startBinding, endBinding });\n      return;\n    }\n    updateBoundPoint(\n      element,\n      \"start\",\n      startBinding,\n      changedElement as ExcalidrawBindableElement,\n    );\n    updateBoundPoint(\n      element,\n      \"end\",\n      endBinding,\n      changedElement as ExcalidrawBindableElement,\n    );\n    const boundText = getBoundTextElement(element);\n    if (boundText) {\n      handleBindTextResize(element, false);\n    }\n  });\n};\n\nconst doesNeedUpdate = (\n  boundElement: NonDeleted<ExcalidrawLinearElement>,\n  changedElement: ExcalidrawBindableElement,\n) => {\n  return (\n    boundElement.startBinding?.elementId === changedElement.id ||\n    boundElement.endBinding?.elementId === changedElement.id\n  );\n};\n\nconst getSimultaneouslyUpdatedElementIds = (\n  simultaneouslyUpdated: readonly ExcalidrawElement[] | undefined,\n): Set<ExcalidrawElement[\"id\"]> => {\n  return new Set((simultaneouslyUpdated || []).map((element) => element.id));\n};\n\nconst updateBoundPoint = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  startOrEnd: \"start\" | \"end\",\n  binding: PointBinding | null | undefined,\n  changedElement: ExcalidrawBindableElement,\n): void => {\n  if (\n    binding == null ||\n    // We only need to update the other end if this is a 2 point line element\n    (binding.elementId !== changedElement.id && linearElement.points.length > 2)\n  ) {\n    return;\n  }\n  const bindingElement = Scene.getScene(linearElement)!.getElement(\n    binding.elementId,\n  ) as ExcalidrawBindableElement | null;\n  if (bindingElement == null) {\n    // We're not cleaning up after deleted elements atm., so handle this case\n    return;\n  }\n  const direction = startOrEnd === \"start\" ? -1 : 1;\n  const edgePointIndex = direction === -1 ? 0 : linearElement.points.length - 1;\n  const adjacentPointIndex = edgePointIndex - direction;\n  const adjacentPoint = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n    linearElement,\n    adjacentPointIndex,\n  );\n  const focusPointAbsolute = determineFocusPoint(\n    bindingElement,\n    binding.focus,\n    adjacentPoint,\n  );\n  let newEdgePoint;\n  // The linear element was not originally pointing inside the bound shape,\n  // we can point directly at the focus point\n  if (binding.gap === 0) {\n    newEdgePoint = focusPointAbsolute;\n  } else {\n    const intersections = intersectElementWithLine(\n      bindingElement,\n      adjacentPoint,\n      focusPointAbsolute,\n      binding.gap,\n    );\n    if (intersections.length === 0) {\n      // This should never happen, since focusPoint should always be\n      // inside the element, but just in case, bail out\n      newEdgePoint = focusPointAbsolute;\n    } else {\n      // Guaranteed to intersect because focusPoint is always inside the shape\n      newEdgePoint = intersections[0];\n    }\n  }\n  LinearElementEditor.movePoints(\n    linearElement,\n    [\n      {\n        index: edgePointIndex,\n        point: LinearElementEditor.pointFromAbsoluteCoords(\n          linearElement,\n          newEdgePoint,\n        ),\n      },\n    ],\n    { [startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"]: binding },\n  );\n};\n\nconst maybeCalculateNewGapWhenScaling = (\n  changedElement: ExcalidrawBindableElement,\n  currentBinding: PointBinding | null | undefined,\n  newSize: { width: number; height: number } | undefined,\n): PointBinding | null | undefined => {\n  if (currentBinding == null || newSize == null) {\n    return currentBinding;\n  }\n  const { gap, focus, elementId } = currentBinding;\n  const { width: newWidth, height: newHeight } = newSize;\n  const { width, height } = changedElement;\n  const newGap = Math.max(\n    1,\n    Math.min(\n      maxBindingGap(changedElement, newWidth, newHeight),\n      gap * (newWidth < newHeight ? newWidth / width : newHeight / height),\n    ),\n  );\n  return { elementId, gap: newGap, focus };\n};\n\nexport const getEligibleElementsForBinding = (\n  elements: NonDeleted<ExcalidrawElement>[],\n): SuggestedBinding[] => {\n  const includedElementIds = new Set(elements.map(({ id }) => id));\n  return elements.flatMap((element) =>\n    isBindingElement(element, false)\n      ? (getElligibleElementsForBindingElement(\n          element as NonDeleted<ExcalidrawLinearElement>,\n        ).filter(\n          (element) => !includedElementIds.has(element.id),\n        ) as SuggestedBinding[])\n      : isBindableElement(element, false)\n      ? getElligibleElementsForBindableElementAndWhere(element).filter(\n          (binding) => !includedElementIds.has(binding[0].id),\n        )\n      : [],\n  );\n};\n\nconst getElligibleElementsForBindingElement = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n): NonDeleted<ExcalidrawBindableElement>[] => {\n  return [\n    getElligibleElementForBindingElement(linearElement, \"start\"),\n    getElligibleElementForBindingElement(linearElement, \"end\"),\n  ].filter(\n    (element): element is NonDeleted<ExcalidrawBindableElement> =>\n      element != null,\n  );\n};\n\nconst getElligibleElementForBindingElement = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  startOrEnd: \"start\" | \"end\",\n): NonDeleted<ExcalidrawBindableElement> | null => {\n  return getHoveredElementForBinding(\n    getLinearElementEdgeCoors(linearElement, startOrEnd),\n    Scene.getScene(linearElement)!,\n  );\n};\n\nconst getLinearElementEdgeCoors = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  startOrEnd: \"start\" | \"end\",\n): { x: number; y: number } => {\n  const index = startOrEnd === \"start\" ? 0 : -1;\n  return tupleToCoors(\n    LinearElementEditor.getPointAtIndexGlobalCoordinates(linearElement, index),\n  );\n};\n\nconst getElligibleElementsForBindableElementAndWhere = (\n  bindableElement: NonDeleted<ExcalidrawBindableElement>,\n): SuggestedPointBinding[] => {\n  return Scene.getScene(bindableElement)!\n    .getNonDeletedElements()\n    .map((element) => {\n      if (!isBindingElement(element, false)) {\n        return null;\n      }\n      const canBindStart = isLinearElementEligibleForNewBindingByBindable(\n        element,\n        \"start\",\n        bindableElement,\n      );\n      const canBindEnd = isLinearElementEligibleForNewBindingByBindable(\n        element,\n        \"end\",\n        bindableElement,\n      );\n      if (!canBindStart && !canBindEnd) {\n        return null;\n      }\n      return [\n        element,\n        canBindStart && canBindEnd ? \"both\" : canBindStart ? \"start\" : \"end\",\n        bindableElement,\n      ];\n    })\n    .filter((maybeElement) => maybeElement != null) as SuggestedPointBinding[];\n};\n\nconst isLinearElementEligibleForNewBindingByBindable = (\n  linearElement: NonDeleted<ExcalidrawLinearElement>,\n  startOrEnd: \"start\" | \"end\",\n  bindableElement: NonDeleted<ExcalidrawBindableElement>,\n): boolean => {\n  const existingBinding =\n    linearElement[startOrEnd === \"start\" ? \"startBinding\" : \"endBinding\"];\n  return (\n    existingBinding == null &&\n    !isLinearElementSimpleAndAlreadyBoundOnOppositeEdge(\n      linearElement,\n      bindableElement,\n      startOrEnd,\n    ) &&\n    bindingBorderTest(\n      bindableElement,\n      getLinearElementEdgeCoors(linearElement, startOrEnd),\n    )\n  );\n};\n\n// We need to:\n// 1: Update elements not selected to point to duplicated elements\n// 2: Update duplicated elements to point to other duplicated elements\nexport const fixBindingsAfterDuplication = (\n  sceneElements: readonly ExcalidrawElement[],\n  oldElements: readonly ExcalidrawElement[],\n  oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n  // There are three copying mechanisms: Copy-paste, duplication and alt-drag.\n  // Only when alt-dragging the new \"duplicates\" act as the \"old\", while\n  // the \"old\" elements act as the \"new copy\" - essentially working reverse\n  // to the other two.\n  duplicatesServeAsOld?: \"duplicatesServeAsOld\" | undefined,\n): void => {\n  // First collect all the binding/bindable elements, so we only update\n  // each once, regardless of whether they were duplicated or not.\n  const allBoundElementIds: Set<ExcalidrawElement[\"id\"]> = new Set();\n  const allBindableElementIds: Set<ExcalidrawElement[\"id\"]> = new Set();\n  const shouldReverseRoles = duplicatesServeAsOld === \"duplicatesServeAsOld\";\n  oldElements.forEach((oldElement) => {\n    const { boundElements } = oldElement;\n    if (boundElements != null && boundElements.length > 0) {\n      boundElements.forEach((boundElement) => {\n        if (shouldReverseRoles && !oldIdToDuplicatedId.has(boundElement.id)) {\n          allBoundElementIds.add(boundElement.id);\n        }\n      });\n      allBindableElementIds.add(oldIdToDuplicatedId.get(oldElement.id)!);\n    }\n    if (isBindingElement(oldElement)) {\n      if (oldElement.startBinding != null) {\n        const { elementId } = oldElement.startBinding;\n        if (shouldReverseRoles && !oldIdToDuplicatedId.has(elementId)) {\n          allBindableElementIds.add(elementId);\n        }\n      }\n      if (oldElement.endBinding != null) {\n        const { elementId } = oldElement.endBinding;\n        if (shouldReverseRoles && !oldIdToDuplicatedId.has(elementId)) {\n          allBindableElementIds.add(elementId);\n        }\n      }\n      if (oldElement.startBinding != null || oldElement.endBinding != null) {\n        allBoundElementIds.add(oldIdToDuplicatedId.get(oldElement.id)!);\n      }\n    }\n  });\n\n  // Update the linear elements\n  (\n    sceneElements.filter(({ id }) =>\n      allBoundElementIds.has(id),\n    ) as ExcalidrawLinearElement[]\n  ).forEach((element) => {\n    const { startBinding, endBinding } = element;\n    mutateElement(element, {\n      startBinding: newBindingAfterDuplication(\n        startBinding,\n        oldIdToDuplicatedId,\n      ),\n      endBinding: newBindingAfterDuplication(endBinding, oldIdToDuplicatedId),\n    });\n  });\n\n  // Update the bindable shapes\n  sceneElements\n    .filter(({ id }) => allBindableElementIds.has(id))\n    .forEach((bindableElement) => {\n      const { boundElements } = bindableElement;\n      if (boundElements != null && boundElements.length > 0) {\n        mutateElement(bindableElement, {\n          boundElements: boundElements.map((boundElement) =>\n            oldIdToDuplicatedId.has(boundElement.id)\n              ? {\n                  id: oldIdToDuplicatedId.get(boundElement.id)!,\n                  type: boundElement.type,\n                }\n              : boundElement,\n          ),\n        });\n      }\n    });\n};\n\nconst newBindingAfterDuplication = (\n  binding: PointBinding | null,\n  oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n): PointBinding | null => {\n  if (binding == null) {\n    return null;\n  }\n  const { elementId, focus, gap } = binding;\n  return {\n    focus,\n    gap,\n    elementId: oldIdToDuplicatedId.get(elementId) ?? elementId,\n  };\n};\n\nexport const fixBindingsAfterDeletion = (\n  sceneElements: readonly ExcalidrawElement[],\n  deletedElements: readonly ExcalidrawElement[],\n): void => {\n  const deletedElementIds = new Set(\n    deletedElements.map((element) => element.id),\n  );\n  // non-deleted which bindings need to be updated\n  const affectedElements: Set<ExcalidrawElement[\"id\"]> = new Set();\n  deletedElements.forEach((deletedElement) => {\n    if (isBindableElement(deletedElement)) {\n      deletedElement.boundElements?.forEach((element) => {\n        if (!deletedElementIds.has(element.id)) {\n          affectedElements.add(element.id);\n        }\n      });\n    } else if (isBindingElement(deletedElement)) {\n      if (deletedElement.startBinding) {\n        affectedElements.add(deletedElement.startBinding.elementId);\n      }\n      if (deletedElement.endBinding) {\n        affectedElements.add(deletedElement.endBinding.elementId);\n      }\n    }\n  });\n  sceneElements\n    .filter(({ id }) => affectedElements.has(id))\n    .forEach((element) => {\n      if (isBindableElement(element)) {\n        mutateElement(element, {\n          boundElements: newBoundElementsAfterDeletion(\n            element.boundElements,\n            deletedElementIds,\n          ),\n        });\n      } else if (isBindingElement(element)) {\n        mutateElement(element, {\n          startBinding: newBindingAfterDeletion(\n            element.startBinding,\n            deletedElementIds,\n          ),\n          endBinding: newBindingAfterDeletion(\n            element.endBinding,\n            deletedElementIds,\n          ),\n        });\n      }\n    });\n};\n\nconst newBindingAfterDeletion = (\n  binding: PointBinding | null,\n  deletedElementIds: Set<ExcalidrawElement[\"id\"]>,\n): PointBinding | null => {\n  if (binding == null || deletedElementIds.has(binding.elementId)) {\n    return null;\n  }\n  return binding;\n};\n\nconst newBoundElementsAfterDeletion = (\n  boundElements: ExcalidrawElement[\"boundElements\"],\n  deletedElementIds: Set<ExcalidrawElement[\"id\"]>,\n) => {\n  if (!boundElements) {\n    return null;\n  }\n  return boundElements.filter((ele) => !deletedElementIds.has(ele.id));\n};\n","import {\n  ExcalidrawElement,\n  ExcalidrawLinearElement,\n  Arrowhead,\n  ExcalidrawFreeDrawElement,\n  NonDeleted,\n  ExcalidrawTextElementWithContainer,\n} from \"./types\";\nimport { distance2d, rotate } from \"../math\";\nimport rough from \"roughjs/bin/rough\";\nimport { Drawable, Op } from \"roughjs/bin/core\";\nimport { Point } from \"../types\";\nimport {\n  getShapeForElement,\n  generateRoughOptions,\n} from \"../renderer/renderElement\";\nimport {\n  isArrowElement,\n  isFreeDrawElement,\n  isLinearElement,\n  isTextElement,\n} from \"./typeChecks\";\nimport { rescalePoints } from \"../points\";\nimport { getBoundTextElement, getContainerElement } from \"./textElement\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { Mutable } from \"../utility-types\";\n\n// x and y position of top left corner, x and y position of bottom right corner\nexport type Bounds = readonly [number, number, number, number];\ntype MaybeQuadraticSolution = [number | null, number | null] | false;\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.\nexport const getElementAbsoluteCoords = (\n  element: ExcalidrawElement,\n  includeBoundText: boolean = false,\n): [number, number, number, number, number, number] => {\n  if (isFreeDrawElement(element)) {\n    return getFreeDrawElementAbsoluteCoords(element);\n  } else if (isLinearElement(element)) {\n    return LinearElementEditor.getElementAbsoluteCoords(\n      element,\n      includeBoundText,\n    );\n  } else if (isTextElement(element)) {\n    const container = getContainerElement(element);\n    if (isArrowElement(container)) {\n      const coords = LinearElementEditor.getBoundTextElementPosition(\n        container,\n        element as ExcalidrawTextElementWithContainer,\n      );\n      return [\n        coords.x,\n        coords.y,\n        coords.x + element.width,\n        coords.y + element.height,\n        coords.x + element.width / 2,\n        coords.y + element.height / 2,\n      ];\n    }\n  }\n  return [\n    element.x,\n    element.y,\n    element.x + element.width,\n    element.y + element.height,\n    element.x + element.width / 2,\n    element.y + element.height / 2,\n  ];\n};\n\nexport const pointRelativeTo = (\n  element: ExcalidrawElement,\n  absoluteCoords: Point,\n): Point => {\n  return [absoluteCoords[0] - element.x, absoluteCoords[1] - element.y];\n};\n\nexport const getDiamondPoints = (element: ExcalidrawElement) => {\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\n  return [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY];\n};\n\nexport const getCurvePathOps = (shape: Drawable): Op[] => {\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\n// reference: https://eliot-jones.com/2019/12/cubic-bezier-curve-bounding-boxes\nconst getBezierValueForT = (\n  t: number,\n  p0: number,\n  p1: number,\n  p2: number,\n  p3: number,\n) => {\n  const oneMinusT = 1 - t;\n  return (\n    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  );\n};\n\nconst solveQuadratic = (\n  p0: number,\n  p1: number,\n  p2: number,\n  p3: number,\n): MaybeQuadraticSolution => {\n  const i = p1 - p0;\n  const j = p2 - p1;\n  const k = p3 - p2;\n\n  const a = 3 * i - 6 * j + 3 * k;\n  const b = 6 * j - 6 * i;\n  const c = 3 * i;\n\n  const sqrtPart = b * b - 4 * a * c;\n  const hasSolution = sqrtPart >= 0;\n\n  if (!hasSolution) {\n    return false;\n  }\n\n  let s1 = null;\n  let s2 = null;\n\n  let t1 = Infinity;\n  let t2 = Infinity;\n\n  if (a === 0) {\n    t1 = t2 = -c / b;\n  } else {\n    t1 = (-b + Math.sqrt(sqrtPart)) / (2 * a);\n    t2 = (-b - Math.sqrt(sqrtPart)) / (2 * a);\n  }\n\n  if (t1 >= 0 && t1 <= 1) {\n    s1 = getBezierValueForT(t1, p0, p1, p2, p3);\n  }\n\n  if (t2 >= 0 && t2 <= 1) {\n    s2 = getBezierValueForT(t2, p0, p1, p2, p3);\n  }\n\n  return [s1, s2];\n};\n\nconst getCubicBezierCurveBound = (\n  p0: Point,\n  p1: Point,\n  p2: Point,\n  p3: Point,\n): Bounds => {\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\n  let minX = Math.min(p0[0], p3[0]);\n  let maxX = Math.max(p0[0], p3[0]);\n\n  if (solX) {\n    const xs = solX.filter((x) => x !== null) as number[];\n    minX = Math.min(minX, ...xs);\n    maxX = Math.max(maxX, ...xs);\n  }\n\n  let minY = Math.min(p0[1], p3[1]);\n  let maxY = Math.max(p0[1], p3[1]);\n  if (solY) {\n    const ys = solY.filter((y) => y !== null) as number[];\n    minY = Math.min(minY, ...ys);\n    maxY = Math.max(maxY, ...ys);\n  }\n  return [minX, minY, maxX, maxY];\n};\n\nexport const getMinMaxXYFromCurvePathOps = (\n  ops: Op[],\n  transformXY?: (x: number, y: number) => [number, number],\n): [number, number, number, number] => {\n  let currentP: Point = [0, 0];\n\n  const { minX, minY, maxX, maxY } = ops.reduce(\n    (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 as unknown as Point;\n        // move operation does not draw anything; so, it always\n        // returns false\n      } else if (op === \"bcurveTo\") {\n        const _p1 = [data[0], data[1]] as Point;\n        const _p2 = [data[2], data[3]] as Point;\n        const _p3 = [data[4], data[5]] as Point;\n\n        const p1 = transformXY ? transformXY(..._p1) : _p1;\n        const p2 = transformXY ? transformXY(..._p2) : _p2;\n        const p3 = transformXY ? transformXY(..._p3) : _p3;\n\n        const p0 = transformXY ? transformXY(...currentP) : currentP;\n        currentP = _p3;\n\n        const [minX, minY, maxX, maxY] = getCubicBezierCurveBound(\n          p0,\n          p1,\n          p2,\n          p3,\n        );\n\n        limits.minX = Math.min(limits.minX, minX);\n        limits.minY = Math.min(limits.minY, minY);\n\n        limits.maxX = Math.max(limits.maxX, maxX);\n        limits.maxY = Math.max(limits.maxY, maxY);\n      } else if (op === \"lineTo\") {\n        // TODO: Implement this\n      } else if (op === \"qcurveTo\") {\n        // TODO: Implement this\n      }\n      return limits;\n    },\n    { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n  );\n  return [minX, minY, maxX, maxY];\n};\n\nconst getBoundsFromPoints = (\n  points: ExcalidrawFreeDrawElement[\"points\"],\n): [number, number, number, number] => {\n  let minX = Infinity;\n  let minY = Infinity;\n  let maxX = -Infinity;\n  let maxY = -Infinity;\n\n  for (const [x, y] of points) {\n    minX = Math.min(minX, x);\n    minY = Math.min(minY, y);\n    maxX = Math.max(maxX, x);\n    maxY = Math.max(maxY, y);\n  }\n\n  return [minX, minY, maxX, maxY];\n};\n\nconst getFreeDrawElementAbsoluteCoords = (\n  element: ExcalidrawFreeDrawElement,\n): [number, number, number, number, number, number] => {\n  const [minX, minY, maxX, maxY] = getBoundsFromPoints(element.points);\n  const x1 = minX + element.x;\n  const y1 = minY + element.y;\n  const x2 = maxX + element.x;\n  const y2 = maxY + element.y;\n  return [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2];\n};\n\nexport const getArrowheadPoints = (\n  element: ExcalidrawLinearElement,\n  shape: Drawable[],\n  position: \"start\" | \"end\",\n  arrowhead: Arrowhead,\n) => {\n  const ops = getCurvePathOps(shape[0]);\n  if (ops.length < 1) {\n    return null;\n  }\n\n  // The index of the bCurve operation to examine.\n  const index = position === \"start\" ? 1 : ops.length - 1;\n\n  const data = ops[index].data;\n  const p3 = [data[4], data[5]] as Point;\n  const p2 = [data[2], data[3]] as Point;\n  const p1 = [data[0], data[1]] as Point;\n\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: Point = [0, 0];\n  if (prevOp.op === \"move\") {\n    p0 = prevOp.data as unknown as Point;\n  } else if (prevOp.op === \"bcurveTo\") {\n    p0 = [prevOp.data[4], prevOp.data[5]];\n  }\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: number, idx: number) =>\n    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\n  // Ee know the last point of the arrow (or the first, if start arrowhead).\n  const [x2, y2] = position === \"start\" ? p0 : p3;\n\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\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\n  const size = {\n    arrow: 30,\n    bar: 15,\n    dot: 15,\n    triangle: 15,\n  }[arrowhead]; // pixels (will differ for each arrowhead)\n\n  let length = 0;\n\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] =\n      element.points.length > 1\n        ? element.points[element.points.length - 2]\n        : [0, 0];\n\n    length = Math.hypot(cx - px, cy - py);\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\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\n  if (arrowhead === \"dot\") {\n    const r = Math.hypot(ys - y2, xs - x2) + element.strokeWidth;\n    return [x2, y2, r];\n  }\n\n  const angle = {\n    arrow: 20,\n    bar: 90,\n    triangle: 25,\n  }[arrowhead]; // degrees\n\n  // Return points\n  const [x3, y3] = rotate(xs, ys, x2, y2, (-angle * Math.PI) / 180);\n  const [x4, y4] = rotate(xs, ys, x2, y2, (angle * Math.PI) / 180);\n  return [x2, y2, x3, y3, x4, y4];\n};\n\nconst generateLinearElementShape = (\n  element: ExcalidrawLinearElement,\n): Drawable => {\n  const generator = rough.generator();\n  const options = generateRoughOptions(element);\n\n  const method = (() => {\n    if (element.roundness) {\n      return \"curve\";\n    }\n    if (options.fill) {\n      return \"polygon\";\n    }\n    return \"linearPath\";\n  })();\n\n  return generator[method](element.points as Mutable<Point>[], options);\n};\n\nconst getLinearElementRotatedBounds = (\n  element: ExcalidrawLinearElement,\n  cx: number,\n  cy: number,\n): [number, number, number, number] => {\n  if (element.points.length < 2) {\n    const [pointX, pointY] = element.points[0];\n    const [x, y] = rotate(\n      element.x + pointX,\n      element.y + pointY,\n      cx,\n      cy,\n      element.angle,\n    );\n\n    let coords: [number, number, number, number] = [x, y, x, y];\n    const boundTextElement = getBoundTextElement(element);\n    if (boundTextElement) {\n      const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(\n        element,\n        [x, y, x, y],\n        boundTextElement,\n      );\n      coords = [\n        coordsWithBoundText[0],\n        coordsWithBoundText[1],\n        coordsWithBoundText[2],\n        coordsWithBoundText[3],\n      ];\n    }\n    return coords;\n  }\n\n  // first element is always the curve\n  const cachedShape = getShapeForElement(element)?.[0];\n  const shape = cachedShape ?? generateLinearElementShape(element);\n  const ops = getCurvePathOps(shape);\n  const transformXY = (x: number, y: number) =>\n    rotate(element.x + x, element.y + y, cx, cy, element.angle);\n  const res = getMinMaxXYFromCurvePathOps(ops, transformXY);\n  let coords: [number, number, number, number] = [\n    res[0],\n    res[1],\n    res[2],\n    res[3],\n  ];\n  const boundTextElement = getBoundTextElement(element);\n  if (boundTextElement) {\n    const coordsWithBoundText = LinearElementEditor.getMinMaxXYWithBoundText(\n      element,\n      coords,\n      boundTextElement,\n    );\n    coords = [\n      coordsWithBoundText[0],\n      coordsWithBoundText[1],\n      coordsWithBoundText[2],\n      coordsWithBoundText[3],\n    ];\n  }\n  return coords;\n};\n\n// We could cache this stuff\nexport const getElementBounds = (\n  element: ExcalidrawElement,\n): [number, number, number, number] => {\n  let bounds: [number, number, number, number];\n\n  const [x1, y1, x2, y2, cx, cy] = getElementAbsoluteCoords(element);\n  if (isFreeDrawElement(element)) {\n    const [minX, minY, maxX, maxY] = getBoundsFromPoints(\n      element.points.map(([x, y]) =>\n        rotate(x, y, cx - element.x, cy - element.y, element.angle),\n      ),\n    );\n\n    return [\n      minX + element.x,\n      minY + element.y,\n      maxX + element.x,\n      maxY + element.y,\n    ];\n  } else if (isLinearElement(element)) {\n    bounds = getLinearElementRotatedBounds(element, cx, cy);\n  } else if (element.type === \"diamond\") {\n    const [x11, y11] = rotate(cx, y1, cx, cy, element.angle);\n    const [x12, y12] = rotate(cx, y2, cx, cy, element.angle);\n    const [x22, y22] = rotate(x1, cy, cx, cy, element.angle);\n    const [x21, y21] = rotate(x2, cy, cx, cy, element.angle);\n    const minX = Math.min(x11, x12, x22, x21);\n    const minY = Math.min(y11, y12, y22, y21);\n    const maxX = Math.max(x11, x12, x22, x21);\n    const maxY = Math.max(y11, y12, y22, y21);\n    bounds = [minX, minY, maxX, maxY];\n  } else if (element.type === \"ellipse\") {\n    const w = (x2 - x1) / 2;\n    const h = (y2 - y1) / 2;\n    const cos = Math.cos(element.angle);\n    const sin = Math.sin(element.angle);\n    const ww = Math.hypot(w * cos, h * sin);\n    const hh = Math.hypot(h * cos, w * sin);\n    bounds = [cx - ww, cy - hh, cx + ww, cy + hh];\n  } else {\n    const [x11, y11] = rotate(x1, y1, cx, cy, element.angle);\n    const [x12, y12] = rotate(x1, y2, cx, cy, element.angle);\n    const [x22, y22] = rotate(x2, y2, cx, cy, element.angle);\n    const [x21, y21] = rotate(x2, y1, cx, cy, element.angle);\n    const minX = Math.min(x11, x12, x22, x21);\n    const minY = Math.min(y11, y12, y22, y21);\n    const maxX = Math.max(x11, x12, x22, x21);\n    const maxY = Math.max(y11, y12, y22, y21);\n    bounds = [minX, minY, maxX, maxY];\n  }\n\n  return bounds;\n};\n\nexport const getCommonBounds = (\n  elements: readonly ExcalidrawElement[],\n): [number, number, number, number] => {\n  if (!elements.length) {\n    return [0, 0, 0, 0];\n  }\n\n  let minX = Infinity;\n  let maxX = -Infinity;\n  let minY = Infinity;\n  let maxY = -Infinity;\n\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\n  return [minX, minY, maxX, maxY];\n};\n\nexport const getResizedElementAbsoluteCoords = (\n  element: ExcalidrawElement,\n  nextWidth: number,\n  nextHeight: number,\n  normalizePoints: boolean,\n): [number, number, number, number] => {\n  if (!(isLinearElement(element) || isFreeDrawElement(element))) {\n    return [\n      element.x,\n      element.y,\n      element.x + nextWidth,\n      element.y + nextHeight,\n    ];\n  }\n\n  const points = rescalePoints(\n    0,\n    nextWidth,\n    rescalePoints(1, nextHeight, element.points, normalizePoints),\n    normalizePoints,\n  );\n\n  let bounds: [number, number, number, number];\n\n  if (isFreeDrawElement(element)) {\n    // Free Draw\n    bounds = getBoundsFromPoints(points);\n  } else {\n    // Line\n    const gen = rough.generator();\n    const curve = !element.roundness\n      ? gen.linearPath(\n          points as [number, number][],\n          generateRoughOptions(element),\n        )\n      : gen.curve(points as [number, number][], generateRoughOptions(element));\n\n    const ops = getCurvePathOps(curve);\n    bounds = getMinMaxXYFromCurvePathOps(ops);\n  }\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};\n\nexport const getElementPointsCoords = (\n  element: ExcalidrawLinearElement,\n  points: readonly (readonly [number, number])[],\n): [number, number, number, number] => {\n  // This might be computationally heavey\n  const gen = rough.generator();\n  const curve =\n    element.roundness == null\n      ? gen.linearPath(\n          points as [number, number][],\n          generateRoughOptions(element),\n        )\n      : gen.curve(points as [number, number][], 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};\n\nexport const getClosestElementBounds = (\n  elements: readonly ExcalidrawElement[],\n  from: { x: number; y: number },\n): [number, number, number, number] => {\n  if (!elements.length) {\n    return [0, 0, 0, 0];\n  }\n\n  let minDistance = Infinity;\n  let closestElement = elements[0];\n\n  elements.forEach((element) => {\n    const [x1, y1, x2, y2] = getElementBounds(element);\n    const distance = distance2d((x1 + x2) / 2, (y1 + y2) / 2, from.x, from.y);\n\n    if (distance < minDistance) {\n      minDistance = distance;\n      closestElement = element;\n    }\n  });\n\n  return getElementBounds(closestElement);\n};\n\nexport interface Box {\n  minX: number;\n  minY: number;\n  maxX: number;\n  maxY: number;\n  midX: number;\n  midY: number;\n  width: number;\n  height: number;\n}\n\nexport const getCommonBoundingBox = (\n  elements: ExcalidrawElement[] | readonly NonDeleted<ExcalidrawElement>[],\n): Box => {\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","/**\n * This is a 2D Projective Geometric Algebra implementation.\n *\n * For wider context on geometric algebra visit see https://bivector.net.\n *\n * For this specific algebra see cheatsheet https://bivector.net/2DPGA.pdf.\n *\n * Converted from generator written by enki, with a ton of added on top.\n *\n * This library uses 8-vectors to represent points, directions and lines\n * in 2D space.\n *\n * An array `[a, b, c, d, e, f, g, h]` represents a n(8)vector:\n *   a + b*e0 + c*e1 + d*e2 + e*e01 + f*e20 + g*e12 + h*e012\n *\n * See GAPoint, GALine, GADirection and GATransform modules for common\n * operations.\n */\n\nexport type Point = NVector;\nexport type Direction = NVector;\nexport type Line = NVector;\nexport type Transform = NVector;\n\nexport const point = (x: number, y: number): Point => [0, 0, 0, 0, y, x, 1, 0];\n\nexport const origin = (): Point => [0, 0, 0, 0, 0, 0, 1, 0];\n\nexport const direction = (x: number, y: number): Direction => {\n  const norm = Math.hypot(x, y); // same as `inorm(direction(x, y))`\n  return [0, 0, 0, 0, y / norm, x / norm, 0, 0];\n};\n\nexport const offset = (x: number, y: number): Direction => [\n  0,\n  0,\n  0,\n  0,\n  y,\n  x,\n  0,\n  0,\n];\n\n/// This is the \"implementation\" part of the library\n\ntype NVector = readonly [\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n  number,\n];\n\n// These are labels for what each number in an nvector represents\nconst NVECTOR_BASE = [\"1\", \"e0\", \"e1\", \"e2\", \"e01\", \"e20\", \"e12\", \"e012\"];\n\n// Used to represent points, lines and transformations\nexport const nvector = (value: number = 0, index: number = 0): NVector => {\n  const result = [0, 0, 0, 0, 0, 0, 0, 0];\n  if (index < 0 || index > 7) {\n    throw new Error(`Expected \\`index\\` between 0 and 7, got \\`${index}\\``);\n  }\n  if (value !== 0) {\n    result[index] = value;\n  }\n  return result as unknown as NVector;\n};\n\nconst STRING_EPSILON = 0.000001;\nexport const toString = (nvector: NVector): string => {\n  const result = nvector\n    .map((value, index) =>\n      Math.abs(value) > STRING_EPSILON\n        ? value.toFixed(7).replace(/(\\.|0+)$/, \"\") +\n          (index > 0 ? NVECTOR_BASE[index] : \"\")\n        : null,\n    )\n    .filter((representation) => representation != null)\n    .join(\" + \");\n  return result === \"\" ? \"0\" : result;\n};\n\n// Reverse the order of the basis blades.\nexport const reverse = (nvector: NVector): NVector => [\n  nvector[0],\n  nvector[1],\n  nvector[2],\n  nvector[3],\n  -nvector[4],\n  -nvector[5],\n  -nvector[6],\n  -nvector[7],\n];\n\n// Poincare duality operator.\nexport const dual = (nvector: NVector): NVector => [\n  nvector[7],\n  nvector[6],\n  nvector[5],\n  nvector[4],\n  nvector[3],\n  nvector[2],\n  nvector[1],\n  nvector[0],\n];\n\n// Clifford Conjugation\nexport const conjugate = (nvector: NVector): NVector => [\n  nvector[0],\n  -nvector[1],\n  -nvector[2],\n  -nvector[3],\n  -nvector[4],\n  -nvector[5],\n  -nvector[6],\n  nvector[7],\n];\n\n// Main involution\nexport const involute = (nvector: NVector): NVector => [\n  nvector[0],\n  -nvector[1],\n  -nvector[2],\n  -nvector[3],\n  nvector[4],\n  nvector[5],\n  nvector[6],\n  -nvector[7],\n];\n\n// Multivector addition\nexport const add = (a: NVector, b: NVector | number): NVector => {\n  if (isNumber(b)) {\n    return [a[0] + b, a[1], a[2], a[3], a[4], a[5], a[6], a[7]];\n  }\n  return [\n    a[0] + b[0],\n    a[1] + b[1],\n    a[2] + b[2],\n    a[3] + b[3],\n    a[4] + b[4],\n    a[5] + b[5],\n    a[6] + b[6],\n    a[7] + b[7],\n  ];\n};\n\n// Multivector subtraction\nexport const sub = (a: NVector, b: NVector | number): NVector => {\n  if (isNumber(b)) {\n    return [a[0] - b, a[1], a[2], a[3], a[4], a[5], a[6], a[7]];\n  }\n  return [\n    a[0] - b[0],\n    a[1] - b[1],\n    a[2] - b[2],\n    a[3] - b[3],\n    a[4] - b[4],\n    a[5] - b[5],\n    a[6] - b[6],\n    a[7] - b[7],\n  ];\n};\n\n// The geometric product.\nexport const mul = (a: NVector, b: NVector | number): NVector => {\n  if (isNumber(b)) {\n    return [\n      a[0] * b,\n      a[1] * b,\n      a[2] * b,\n      a[3] * b,\n      a[4] * b,\n      a[5] * b,\n      a[6] * b,\n      a[7] * b,\n    ];\n  }\n  return [\n    mulScalar(a, b),\n    b[1] * a[0] +\n      b[0] * a[1] -\n      b[4] * a[2] +\n      b[5] * a[3] +\n      b[2] * a[4] -\n      b[3] * a[5] -\n      b[7] * a[6] -\n      b[6] * a[7],\n    b[2] * a[0] + b[0] * a[2] - b[6] * a[3] + b[3] * a[6],\n    b[3] * a[0] + b[6] * a[2] + b[0] * a[3] - b[2] * a[6],\n    b[4] * a[0] +\n      b[2] * a[1] -\n      b[1] * a[2] +\n      b[7] * a[3] +\n      b[0] * a[4] +\n      b[6] * a[5] -\n      b[5] * a[6] +\n      b[3] * a[7],\n    b[5] * a[0] -\n      b[3] * a[1] +\n      b[7] * a[2] +\n      b[1] * a[3] -\n      b[6] * a[4] +\n      b[0] * a[5] +\n      b[4] * a[6] +\n      b[2] * a[7],\n    b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6],\n    b[7] * a[0] +\n      b[6] * a[1] +\n      b[5] * a[2] +\n      b[4] * a[3] +\n      b[3] * a[4] +\n      b[2] * a[5] +\n      b[1] * a[6] +\n      b[0] * a[7],\n  ];\n};\n\nexport const mulScalar = (a: NVector, b: NVector): number =>\n  b[0] * a[0] + b[2] * a[2] + b[3] * a[3] - b[6] * a[6];\n\n// The outer/exterior/wedge product.\nexport const meet = (a: NVector, b: NVector): NVector => [\n  b[0] * a[0],\n  b[1] * a[0] + b[0] * a[1],\n  b[2] * a[0] + b[0] * a[2],\n  b[3] * a[0] + b[0] * a[3],\n  b[4] * a[0] + b[2] * a[1] - b[1] * a[2] + b[0] * a[4],\n  b[5] * a[0] - b[3] * a[1] + b[1] * a[3] + b[0] * a[5],\n  b[6] * a[0] + b[3] * a[2] - b[2] * a[3] + b[0] * a[6],\n  b[7] * a[0] +\n    b[6] * a[1] +\n    b[5] * a[2] +\n    b[4] * a[3] +\n    b[3] * a[4] +\n    b[2] * a[5] +\n    b[1] * a[6],\n];\n\n// The regressive product.\nexport const join = (a: NVector, b: NVector): NVector => [\n  joinScalar(a, b),\n  a[1] * b[7] + a[4] * b[5] - a[5] * b[4] + a[7] * b[1],\n  a[2] * b[7] - a[4] * b[6] + a[6] * b[4] + a[7] * b[2],\n  a[3] * b[7] + a[5] * b[6] - a[6] * b[5] + a[7] * b[3],\n  a[4] * b[7] + a[7] * b[4],\n  a[5] * b[7] + a[7] * b[5],\n  a[6] * b[7] + a[7] * b[6],\n  a[7] * b[7],\n];\n\nexport const joinScalar = (a: NVector, b: NVector): number =>\n  a[0] * b[7] +\n  a[1] * b[6] +\n  a[2] * b[5] +\n  a[3] * b[4] +\n  a[4] * b[3] +\n  a[5] * b[2] +\n  a[6] * b[1] +\n  a[7] * b[0];\n\n// The inner product.\nexport const dot = (a: NVector, b: NVector): NVector => [\n  b[0] * a[0] + b[2] * a[2] + b[3] * a[3] - b[6] * a[6],\n  b[1] * a[0] +\n    b[0] * a[1] -\n    b[4] * a[2] +\n    b[5] * a[3] +\n    b[2] * a[4] -\n    b[3] * a[5] -\n    b[7] * a[6] -\n    b[6] * a[7],\n  b[2] * a[0] + b[0] * a[2] - b[6] * a[3] + b[3] * a[6],\n  b[3] * a[0] + b[6] * a[2] + b[0] * a[3] - b[2] * a[6],\n  b[4] * a[0] + b[7] * a[3] + b[0] * a[4] + b[3] * a[7],\n  b[5] * a[0] + b[7] * a[2] + b[0] * a[5] + b[2] * a[7],\n  b[6] * a[0] + b[0] * a[6],\n  b[7] * a[0] + b[0] * a[7],\n];\n\nexport const norm = (a: NVector): number =>\n  Math.sqrt(Math.abs(a[0] * a[0] - a[2] * a[2] - a[3] * a[3] + a[6] * a[6]));\n\nexport const inorm = (a: NVector): number =>\n  Math.sqrt(Math.abs(a[7] * a[7] - a[5] * a[5] - a[4] * a[4] + a[1] * a[1]));\n\nexport const normalized = (a: NVector): NVector => {\n  const n = norm(a);\n  if (n === 0 || n === 1) {\n    return a;\n  }\n  const sign = a[6] < 0 ? -1 : 1;\n  return mul(a, sign / n);\n};\n\nexport const inormalized = (a: NVector): NVector => {\n  const n = inorm(a);\n  if (n === 0 || n === 1) {\n    return a;\n  }\n  return mul(a, 1 / n);\n};\n\nconst isNumber = (a: any): a is number => typeof a === \"number\";\n\nexport const E0: NVector = nvector(1, 1);\nexport const E1: NVector = nvector(1, 2);\nexport const E2: NVector = nvector(1, 3);\nexport const E01: NVector = nvector(1, 4);\nexport const E20: NVector = nvector(1, 5);\nexport const E12: NVector = nvector(1, 6);\nexport const E012: NVector = nvector(1, 7);\nexport const I = E012;\n","import * as GA from \"./ga\";\nimport { Line, Point } from \"./ga\";\n\n/**\n * A line is stored as an array `[0, c, a, b, 0, 0, 0, 0]` representing:\n *   c * e0 + a * e1 + b*e2\n *\n * This maps to a standard formula `a * x + b * y + c`.\n *\n * `(-b, a)` corresponds to a 2D vector parallel to the line. The lines\n * have a natural orientation, corresponding to that vector.\n *\n * The magnitude (\"norm\") of the line is `sqrt(a ^ 2 + b ^ 2)`.\n * `c / norm(line)` is the oriented distance from line to origin.\n */\n\n// Returns line with direction (x, y) through origin\nexport const vector = (x: number, y: number): Line =>\n  GA.normalized([0, 0, -y, x, 0, 0, 0, 0]);\n\n// For equation ax + by + c = 0.\nexport const equation = (a: number, b: number, c: number): Line =>\n  GA.normalized([0, c, a, b, 0, 0, 0, 0]);\n\nexport const through = (from: Point, to: Point): Line =>\n  GA.normalized(GA.join(to, from));\n\nexport const orthogonal = (line: Line, point: Point): Line =>\n  GA.dot(line, point);\n\n// Returns a line perpendicular to the line through `against` and `intersection`\n// going through `intersection`.\nexport const orthogonalThrough = (against: Point, intersection: Point): Line =>\n  orthogonal(through(against, intersection), intersection);\n\nexport const parallel = (line: Line, distance: number): Line => {\n  const result = line.slice();\n  result[1] -= distance;\n  return result as unknown as Line;\n};\n\nexport const parallelThrough = (line: Line, point: Point): Line =>\n  orthogonal(orthogonal(point, line), point);\n\nexport const distance = (line1: Line, line2: Line): number =>\n  GA.inorm(GA.meet(line1, line2));\n\nexport const angle = (line1: Line, line2: Line): number =>\n  Math.acos(GA.dot(line1, line2)[0]);\n\n// The orientation of the line\nexport const sign = (line: Line): number => Math.sign(line[1]);\n","import * as GA from \"./ga\";\nimport * as GALine from \"./galines\";\nimport { Point, Line, join } from \"./ga\";\n\nexport const from = ([x, y]: readonly [number, number]): Point => [\n  0,\n  0,\n  0,\n  0,\n  y,\n  x,\n  1,\n  0,\n];\n\nexport const toTuple = (point: Point): [number, number] => [point[5], point[4]];\n\nexport const abs = (point: Point): Point => [\n  0,\n  0,\n  0,\n  0,\n  Math.abs(point[4]),\n  Math.abs(point[5]),\n  1,\n  0,\n];\n\nexport const intersect = (line1: Line, line2: Line): Point =>\n  GA.normalized(GA.meet(line1, line2));\n\n// Projects `point` onto the `line`.\n// The returned point is the closest point on the `line` to the `point`.\nexport const project = (point: Point, line: Line): Point =>\n  intersect(GALine.orthogonal(line, point), line);\n\nexport const distance = (point1: Point, point2: Point): number =>\n  GA.norm(join(point1, point2));\n\nexport const distanceToLine = (point: Point, line: Line): number =>\n  GA.joinScalar(point, line);\n","import * as GA from \"./ga\";\nimport { Line, Direction, Point } from \"./ga\";\n\n/**\n * A direction is stored as an array `[0, 0, 0, 0, y, x, 0, 0]` representing\n * vector `(x, y)`.\n */\n\nexport const from = (point: Point): Point => [\n  0,\n  0,\n  0,\n  0,\n  point[4],\n  point[5],\n  0,\n  0,\n];\n\nexport const fromTo = (from: Point, to: Point): Direction =>\n  GA.inormalized([0, 0, 0, 0, to[4] - from[4], to[5] - from[5], 0, 0]);\n\nexport const orthogonal = (direction: Direction): Direction =>\n  GA.inormalized([0, 0, 0, 0, -direction[5], direction[4], 0, 0]);\n\nexport const orthogonalToLine = (line: Line): Direction => GA.mul(line, GA.I);\n","import * as GA from \"./ga\";\nimport { Line, Direction, Point, Transform } from \"./ga\";\nimport * as GADirection from \"./gadirections\";\n\n/**\n * TODO: docs\n */\n\nexport const rotation = (pivot: Point, angle: number): Transform =>\n  GA.add(GA.mul(pivot, Math.sin(angle / 2)), Math.cos(angle / 2));\n\nexport const translation = (direction: Direction): Transform => [\n  1,\n  0,\n  0,\n  0,\n  -(0.5 * direction[5]),\n  0.5 * direction[4],\n  0,\n  0,\n];\n\nexport const translationOrthogonal = (\n  direction: Direction,\n  distance: number,\n): Transform => {\n  const scale = 0.5 * distance;\n  return [1, 0, 0, 0, scale * direction[4], scale * direction[5], 0, 0];\n};\n\nexport const translationAlong = (line: Line, distance: number): Transform =>\n  GA.add(GA.mul(GADirection.orthogonalToLine(line), 0.5 * distance), 1);\n\nexport const compose = (motor1: Transform, motor2: Transform): Transform =>\n  GA.mul(motor2, motor1);\n\nexport const apply = (\n  motor: Transform,\n  nvector: Point | Direction | Line,\n): Point | Direction | Line =>\n  GA.normalized(GA.mul(GA.mul(motor, nvector), GA.reverse(motor)));\n","import * as GA from \"../ga\";\nimport * as GAPoint from \"../gapoints\";\nimport * as GADirection from \"../gadirections\";\nimport * as GALine from \"../galines\";\nimport * as GATransform from \"../gatransforms\";\n\nimport {\n  distance2d,\n  rotatePoint,\n  isPathALoop,\n  isPointInPolygon,\n  rotate,\n} from \"../math\";\nimport { pointsOnBezierCurves } from \"points-on-curve\";\n\nimport {\n  NonDeletedExcalidrawElement,\n  ExcalidrawBindableElement,\n  ExcalidrawElement,\n  ExcalidrawRectangleElement,\n  ExcalidrawDiamondElement,\n  ExcalidrawTextElement,\n  ExcalidrawEllipseElement,\n  NonDeleted,\n  ExcalidrawFreeDrawElement,\n  ExcalidrawImageElement,\n  ExcalidrawLinearElement,\n  StrokeRoundness,\n} from \"./types\";\n\nimport { getElementAbsoluteCoords, getCurvePathOps, Bounds } from \"./bounds\";\nimport { Point } from \"../types\";\nimport { Drawable } from \"roughjs/bin/core\";\nimport { AppState } from \"../types\";\nimport { getShapeForElement } from \"../renderer/renderElement\";\nimport { hasBoundTextElement, isImageElement } from \"./typeChecks\";\nimport { isTextElement } from \".\";\nimport { isTransparent } from \"../utils\";\nimport { shouldShowBoundingBox } from \"./transformHandles\";\nimport { getBoundTextElement } from \"./textElement\";\nimport { Mutable } from \"../utility-types\";\n\nconst isElementDraggableFromInside = (\n  element: NonDeletedExcalidrawElement,\n): boolean => {\n  if (element.type === \"arrow\") {\n    return false;\n  }\n\n  if (element.type === \"freedraw\") {\n    return true;\n  }\n  const isDraggableFromInside =\n    !isTransparent(element.backgroundColor) || hasBoundTextElement(element);\n  if (element.type === \"line\") {\n    return isDraggableFromInside && isPathALoop(element.points);\n  }\n  return isDraggableFromInside || isImageElement(element);\n};\n\nexport const hitTest = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n  x: number,\n  y: number,\n): boolean => {\n  // How many pixels off the shape boundary we still consider a hit\n  const threshold = 10 / appState.zoom.value;\n  const point: Point = [x, y];\n\n  if (\n    isElementSelected(appState, element) &&\n    shouldShowBoundingBox([element], appState)\n  ) {\n    return isPointHittingElementBoundingBox(element, point, threshold);\n  }\n\n  const boundTextElement = getBoundTextElement(element);\n  if (boundTextElement) {\n    const isHittingBoundTextElement = hitTest(boundTextElement, appState, x, y);\n    if (isHittingBoundTextElement) {\n      return true;\n    }\n  }\n  return isHittingElementNotConsideringBoundingBox(element, appState, point);\n};\n\nexport const isHittingElementBoundingBoxWithoutHittingElement = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n  x: number,\n  y: number,\n): boolean => {\n  const threshold = 10 / appState.zoom.value;\n\n  // So that bound text element hit is considered within bounding box of container even if its outside actual bounding box of element\n  // eg for linear elements text can be outside the element bounding box\n  const boundTextElement = getBoundTextElement(element);\n  if (boundTextElement && hitTest(boundTextElement, appState, x, y)) {\n    return false;\n  }\n\n  return (\n    !isHittingElementNotConsideringBoundingBox(element, appState, [x, y]) &&\n    isPointHittingElementBoundingBox(element, [x, y], threshold)\n  );\n};\n\nexport const isHittingElementNotConsideringBoundingBox = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n  point: Point,\n): boolean => {\n  const threshold = 10 / appState.zoom.value;\n  const check = isTextElement(element)\n    ? isStrictlyInside\n    : isElementDraggableFromInside(element)\n    ? isInsideCheck\n    : isNearCheck;\n  return hitTestPointAgainstElement({ element, point, threshold, check });\n};\n\nconst isElementSelected = (\n  appState: AppState,\n  element: NonDeleted<ExcalidrawElement>,\n) => appState.selectedElementIds[element.id];\n\nexport const isPointHittingElementBoundingBox = (\n  element: NonDeleted<ExcalidrawElement>,\n  [x, y]: Point,\n  threshold: number,\n) => {\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const elementCenterX = (x1 + x2) / 2;\n  const elementCenterY = (y1 + y2) / 2;\n  // reverse rotate to take element's angle into account.\n  const [rotatedX, rotatedY] = rotate(\n    x,\n    y,\n    elementCenterX,\n    elementCenterY,\n    -element.angle,\n  );\n\n  return (\n    rotatedX > x1 - threshold &&\n    rotatedX < x2 + threshold &&\n    rotatedY > y1 - threshold &&\n    rotatedY < y2 + threshold\n  );\n};\n\nexport const bindingBorderTest = (\n  element: NonDeleted<ExcalidrawBindableElement>,\n  { x, y }: { x: number; y: number },\n): boolean => {\n  const threshold = maxBindingGap(element, element.width, element.height);\n  const check = isOutsideCheck;\n  const point: Point = [x, y];\n  return hitTestPointAgainstElement({ element, point, threshold, check });\n};\n\nexport const maxBindingGap = (\n  element: ExcalidrawElement,\n  elementWidth: number,\n  elementHeight: number,\n): number => {\n  // Aligns diamonds with rectangles\n  const shapeRatio = element.type === \"diamond\" ? 1 / Math.sqrt(2) : 1;\n  const smallerDimension = shapeRatio * Math.min(elementWidth, elementHeight);\n  // We make the bindable boundary bigger for bigger elements\n  return Math.max(16, Math.min(0.25 * smallerDimension, 32));\n};\n\ntype HitTestArgs = {\n  element: NonDeletedExcalidrawElement;\n  point: Point;\n  threshold: number;\n  check: (distance: number, threshold: number) => boolean;\n};\n\nconst hitTestPointAgainstElement = (args: HitTestArgs): boolean => {\n  switch (args.element.type) {\n    case \"rectangle\":\n    case \"image\":\n    case \"text\":\n    case \"diamond\":\n    case \"ellipse\":\n      const distance = distanceToBindableElement(args.element, args.point);\n      return args.check(distance, args.threshold);\n    case \"freedraw\": {\n      if (\n        !args.check(\n          distanceToRectangle(args.element, args.point),\n          args.threshold,\n        )\n      ) {\n        return false;\n      }\n\n      return hitTestFreeDrawElement(args.element, args.point, args.threshold);\n    }\n    case \"arrow\":\n    case \"line\":\n      return hitTestLinear(args);\n    case \"selection\":\n      console.warn(\n        \"This should not happen, we need to investigate why it does.\",\n      );\n      return false;\n  }\n};\n\nexport const distanceToBindableElement = (\n  element: ExcalidrawBindableElement,\n  point: Point,\n): number => {\n  switch (element.type) {\n    case \"rectangle\":\n    case \"image\":\n    case \"text\":\n      return distanceToRectangle(element, point);\n    case \"diamond\":\n      return distanceToDiamond(element, point);\n    case \"ellipse\":\n      return distanceToEllipse(element, point);\n  }\n};\n\nconst isStrictlyInside = (distance: number, threshold: number): boolean => {\n  return distance < 0;\n};\n\nconst isInsideCheck = (distance: number, threshold: number): boolean => {\n  return distance < threshold;\n};\n\nconst isNearCheck = (distance: number, threshold: number): boolean => {\n  return Math.abs(distance) < threshold;\n};\n\nconst isOutsideCheck = (distance: number, threshold: number): boolean => {\n  return 0 <= distance && distance < threshold;\n};\n\nconst distanceToRectangle = (\n  element:\n    | ExcalidrawRectangleElement\n    | ExcalidrawTextElement\n    | ExcalidrawFreeDrawElement\n    | ExcalidrawImageElement,\n  point: Point,\n): number => {\n  const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n  return Math.max(\n    GAPoint.distanceToLine(pointRel, GALine.equation(0, 1, -hheight)),\n    GAPoint.distanceToLine(pointRel, GALine.equation(1, 0, -hwidth)),\n  );\n};\n\nconst distanceToDiamond = (\n  element: ExcalidrawDiamondElement,\n  point: Point,\n): number => {\n  const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n  const side = GALine.equation(hheight, hwidth, -hheight * hwidth);\n  return GAPoint.distanceToLine(pointRel, side);\n};\n\nconst distanceToEllipse = (\n  element: ExcalidrawEllipseElement,\n  point: Point,\n): number => {\n  const [pointRel, tangent] = ellipseParamsForTest(element, point);\n  return -GALine.sign(tangent) * GAPoint.distanceToLine(pointRel, tangent);\n};\n\nconst ellipseParamsForTest = (\n  element: ExcalidrawEllipseElement,\n  point: Point,\n): [GA.Point, GA.Line] => {\n  const [, pointRel, hwidth, hheight] = pointRelativeToElement(element, point);\n  const [px, py] = GAPoint.toTuple(pointRel);\n\n  // We're working in positive quadrant, so start with `t = 45deg`, `tx=cos(t)`\n  let tx = 0.707;\n  let ty = 0.707;\n\n  const a = hwidth;\n  const b = hheight;\n\n  // This is a numerical method to find the params tx, ty at which\n  // the ellipse has the closest point to the given point\n  [0, 1, 2, 3].forEach((_) => {\n    const xx = a * tx;\n    const yy = b * ty;\n\n    const ex = ((a * a - b * b) * tx ** 3) / a;\n    const ey = ((b * b - a * a) * ty ** 3) / b;\n\n    const rx = xx - ex;\n    const ry = yy - ey;\n\n    const qx = px - ex;\n    const qy = py - ey;\n\n    const r = Math.hypot(ry, rx);\n    const q = Math.hypot(qy, qx);\n\n    tx = Math.min(1, Math.max(0, ((qx * r) / q + ex) / a));\n    ty = Math.min(1, Math.max(0, ((qy * r) / q + ey) / b));\n    const t = Math.hypot(ty, tx);\n    tx /= t;\n    ty /= t;\n  });\n\n  const closestPoint = GA.point(a * tx, b * ty);\n\n  const tangent = GALine.orthogonalThrough(pointRel, closestPoint);\n  return [pointRel, tangent];\n};\n\nconst hitTestFreeDrawElement = (\n  element: ExcalidrawFreeDrawElement,\n  point: Point,\n  threshold: number,\n): boolean => {\n  // Check point-distance-to-line-segment for every segment in the\n  // element's points (its input points, not its outline points).\n  // This is... okay? It's plenty fast, but the GA library may\n  // have a faster option.\n\n  let x: number;\n  let y: number;\n\n  if (element.angle === 0) {\n    x = point[0] - element.x;\n    y = point[1] - element.y;\n  } else {\n    // Counter-rotate the point around center before testing\n    const [minX, minY, maxX, maxY] = getElementAbsoluteCoords(element);\n    const rotatedPoint = rotatePoint(\n      point,\n      [minX + (maxX - minX) / 2, minY + (maxY - minY) / 2],\n      -element.angle,\n    );\n    x = rotatedPoint[0] - element.x;\n    y = rotatedPoint[1] - element.y;\n  }\n\n  let [A, B] = element.points;\n  let P: readonly [number, number];\n\n  // For freedraw dots\n  if (\n    distance2d(A[0], A[1], x, y) < threshold ||\n    distance2d(B[0], B[1], x, y) < threshold\n  ) {\n    return true;\n  }\n\n  // For freedraw lines\n  for (let i = 0; i < element.points.length; i++) {\n    const delta = [B[0] - A[0], B[1] - A[1]];\n    const length = Math.hypot(delta[1], delta[0]);\n\n    const U = [delta[0] / length, delta[1] / length];\n    const C = [x - A[0], y - A[1]];\n    const d = (C[0] * U[0] + C[1] * U[1]) / Math.hypot(U[1], U[0]);\n    P = [A[0] + U[0] * d, A[1] + U[1] * d];\n\n    const da = distance2d(P[0], P[1], A[0], A[1]);\n    const db = distance2d(P[0], P[1], B[0], B[1]);\n\n    P = db < da && da > length ? B : da < db && db > length ? A : P;\n\n    if (Math.hypot(y - P[1], x - P[0]) < threshold) {\n      return true;\n    }\n\n    A = B;\n    B = element.points[i + 1];\n  }\n\n  const shape = getShapeForElement(element);\n\n  // for filled freedraw shapes, support\n  // selecting from inside\n  if (shape && shape.sets.length) {\n    return hitTestRoughShape(shape, x, y, threshold);\n  }\n\n  return false;\n};\n\nconst hitTestLinear = (args: HitTestArgs): boolean => {\n  const { element, threshold } = args;\n  if (!getShapeForElement(element)) {\n    return false;\n  }\n\n  const [point, pointAbs, hwidth, hheight] = pointRelativeToElement(\n    args.element,\n    args.point,\n  );\n  const side1 = GALine.equation(0, 1, -hheight);\n  const side2 = GALine.equation(1, 0, -hwidth);\n  if (\n    !isInsideCheck(GAPoint.distanceToLine(pointAbs, side1), threshold) ||\n    !isInsideCheck(GAPoint.distanceToLine(pointAbs, side2), threshold)\n  ) {\n    return false;\n  }\n  const [relX, relY] = GAPoint.toTuple(point);\n\n  const shape = getShapeForElement(element as ExcalidrawLinearElement);\n\n  if (!shape) {\n    return false;\n  }\n\n  if (args.check === isInsideCheck) {\n    const hit = shape.some((subshape) =>\n      hitTestCurveInside(\n        subshape,\n        relX,\n        relY,\n        element.roundness ? \"round\" : \"sharp\",\n      ),\n    );\n    if (hit) {\n      return true;\n    }\n  }\n\n  // hit test all \"subshapes\" of the linear element\n  return shape.some((subshape) =>\n    hitTestRoughShape(subshape, relX, relY, threshold),\n  );\n};\n\n// Returns:\n//   1. the point relative to the elements (x, y) position\n//   2. the point relative to the element's center with positive (x, y)\n//   3. half element width\n//   4. half element height\n//\n// Note that for linear elements the (x, y) position is not at the\n// top right corner of their boundary.\n//\n// Rectangles, diamonds and ellipses are symmetrical over axes,\n// and other elements have a rectangular boundary,\n// so we only need to perform hit tests for the positive quadrant.\nconst pointRelativeToElement = (\n  element: ExcalidrawElement,\n  pointTuple: Point,\n): [GA.Point, GA.Point, number, number] => {\n  const point = GAPoint.from(pointTuple);\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const elementCoords = getElementAbsoluteCoords(element);\n  const center = coordsCenter([x1, y1, x2, y2]);\n  // GA has angle orientation opposite to `rotate`\n  const rotate = GATransform.rotation(center, element.angle);\n  const pointRotated = GATransform.apply(rotate, point);\n  const pointRelToCenter = GA.sub(pointRotated, GADirection.from(center));\n  const pointRelToCenterAbs = GAPoint.abs(pointRelToCenter);\n  const elementPos = GA.offset(element.x, element.y);\n  const pointRelToPos = GA.sub(pointRotated, elementPos);\n  const [ax, ay, bx, by] = elementCoords;\n  const halfWidth = (bx - ax) / 2;\n  const halfHeight = (by - ay) / 2;\n  return [pointRelToPos, pointRelToCenterAbs, halfWidth, halfHeight];\n};\n\n// Returns point in absolute coordinates\nexport const pointInAbsoluteCoords = (\n  element: ExcalidrawElement,\n  // Point relative to the element position\n  point: Point,\n): Point => {\n  const [x, y] = point;\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const cx = (x2 - x1) / 2;\n  const cy = (y2 - y1) / 2;\n  const [rotatedX, rotatedY] = rotate(x, y, cx, cy, element.angle);\n  return [element.x + rotatedX, element.y + rotatedY];\n};\n\nconst relativizationToElementCenter = (\n  element: ExcalidrawElement,\n): GA.Transform => {\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const center = coordsCenter([x1, y1, x2, y2]);\n  // GA has angle orientation opposite to `rotate`\n  const rotate = GATransform.rotation(center, element.angle);\n  const translate = GA.reverse(\n    GATransform.translation(GADirection.from(center)),\n  );\n  return GATransform.compose(rotate, translate);\n};\n\nconst coordsCenter = ([ax, ay, bx, by]: Bounds): GA.Point => {\n  return GA.point((ax + bx) / 2, (ay + by) / 2);\n};\n\n// The focus distance is the oriented ratio between the size of\n// the `element` and the \"focus image\" of the element on which\n// all focus points lie, so it's a number between -1 and 1.\n// The line going through `a` and `b` is a tangent to the \"focus image\"\n// of the element.\nexport const determineFocusDistance = (\n  element: ExcalidrawBindableElement,\n  // Point on the line, in absolute coordinates\n  a: Point,\n  // Another point on the line, in absolute coordinates (closer to element)\n  b: Point,\n): number => {\n  const relateToCenter = relativizationToElementCenter(element);\n  const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));\n  const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));\n  const line = GALine.through(aRel, bRel);\n  const q = element.height / element.width;\n  const hwidth = element.width / 2;\n  const hheight = element.height / 2;\n  const n = line[2];\n  const m = line[3];\n  const c = line[1];\n  const mabs = Math.abs(m);\n  const nabs = Math.abs(n);\n  switch (element.type) {\n    case \"rectangle\":\n    case \"image\":\n    case \"text\":\n      return c / (hwidth * (nabs + q * mabs));\n    case \"diamond\":\n      return mabs < nabs ? c / (nabs * hwidth) : c / (mabs * hheight);\n    case \"ellipse\":\n      return c / (hwidth * Math.sqrt(n ** 2 + q ** 2 * m ** 2));\n  }\n};\n\nexport const determineFocusPoint = (\n  element: ExcalidrawBindableElement,\n  // The oriented, relative distance from the center of `element` of the\n  // returned focusPoint\n  focus: number,\n  adjecentPoint: Point,\n): Point => {\n  if (focus === 0) {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const center = coordsCenter([x1, y1, x2, y2]);\n    return GAPoint.toTuple(center);\n  }\n  const relateToCenter = relativizationToElementCenter(element);\n  const adjecentPointRel = GATransform.apply(\n    relateToCenter,\n    GAPoint.from(adjecentPoint),\n  );\n  const reverseRelateToCenter = GA.reverse(relateToCenter);\n  let point;\n  switch (element.type) {\n    case \"rectangle\":\n    case \"image\":\n    case \"text\":\n    case \"diamond\":\n      point = findFocusPointForRectangulars(element, focus, adjecentPointRel);\n      break;\n    case \"ellipse\":\n      point = findFocusPointForEllipse(element, focus, adjecentPointRel);\n      break;\n  }\n  return GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point));\n};\n\n// Returns 2 or 0 intersection points between line going through `a` and `b`\n// and the `element`, in ascending order of distance from `a`.\nexport const intersectElementWithLine = (\n  element: ExcalidrawBindableElement,\n  // Point on the line, in absolute coordinates\n  a: Point,\n  // Another point on the line, in absolute coordinates\n  b: Point,\n  // If given, the element is inflated by this value\n  gap: number = 0,\n): Point[] => {\n  const relateToCenter = relativizationToElementCenter(element);\n  const aRel = GATransform.apply(relateToCenter, GAPoint.from(a));\n  const bRel = GATransform.apply(relateToCenter, GAPoint.from(b));\n  const line = GALine.through(aRel, bRel);\n  const reverseRelateToCenter = GA.reverse(relateToCenter);\n  const intersections = getSortedElementLineIntersections(\n    element,\n    line,\n    aRel,\n    gap,\n  );\n  return intersections.map((point) =>\n    GAPoint.toTuple(GATransform.apply(reverseRelateToCenter, point)),\n  );\n};\n\nconst getSortedElementLineIntersections = (\n  element: ExcalidrawBindableElement,\n  // Relative to element center\n  line: GA.Line,\n  // Relative to element center\n  nearPoint: GA.Point,\n  gap: number = 0,\n): GA.Point[] => {\n  let intersections: GA.Point[];\n  switch (element.type) {\n    case \"rectangle\":\n    case \"image\":\n    case \"text\":\n    case \"diamond\":\n      const corners = getCorners(element);\n      intersections = corners\n        .flatMap((point, i) => {\n          const edge: [GA.Point, GA.Point] = [point, corners[(i + 1) % 4]];\n          return intersectSegment(line, offsetSegment(edge, gap));\n        })\n        .concat(\n          corners.flatMap((point) => getCircleIntersections(point, gap, line)),\n        );\n      break;\n    case \"ellipse\":\n      intersections = getEllipseIntersections(element, gap, line);\n      break;\n  }\n  if (intersections.length < 2) {\n    // Ignore the \"edge\" case of only intersecting with a single corner\n    return [];\n  }\n  const sortedIntersections = intersections.sort(\n    (i1, i2) =>\n      GAPoint.distance(i1, nearPoint) - GAPoint.distance(i2, nearPoint),\n  );\n  return [\n    sortedIntersections[0],\n    sortedIntersections[sortedIntersections.length - 1],\n  ];\n};\n\nconst getCorners = (\n  element:\n    | ExcalidrawRectangleElement\n    | ExcalidrawImageElement\n    | ExcalidrawDiamondElement\n    | ExcalidrawTextElement,\n  scale: number = 1,\n): GA.Point[] => {\n  const hx = (scale * element.width) / 2;\n  const hy = (scale * element.height) / 2;\n  switch (element.type) {\n    case \"rectangle\":\n    case \"image\":\n    case \"text\":\n      return [\n        GA.point(hx, hy),\n        GA.point(hx, -hy),\n        GA.point(-hx, -hy),\n        GA.point(-hx, hy),\n      ];\n    case \"diamond\":\n      return [\n        GA.point(0, hy),\n        GA.point(hx, 0),\n        GA.point(0, -hy),\n        GA.point(-hx, 0),\n      ];\n  }\n};\n\n// Returns intersection of `line` with `segment`, with `segment` moved by\n// `gap` in its polar direction.\n// If intersection coincides with second segment point returns empty array.\nconst intersectSegment = (\n  line: GA.Line,\n  segment: [GA.Point, GA.Point],\n): GA.Point[] => {\n  const [a, b] = segment;\n  const aDist = GAPoint.distanceToLine(a, line);\n  const bDist = GAPoint.distanceToLine(b, line);\n  if (aDist * bDist >= 0) {\n    // The intersection is outside segment `(a, b)`\n    return [];\n  }\n  return [GAPoint.intersect(line, GALine.through(a, b))];\n};\n\nconst offsetSegment = (\n  segment: [GA.Point, GA.Point],\n  distance: number,\n): [GA.Point, GA.Point] => {\n  const [a, b] = segment;\n  const offset = GATransform.translationOrthogonal(\n    GADirection.fromTo(a, b),\n    distance,\n  );\n  return [GATransform.apply(offset, a), GATransform.apply(offset, b)];\n};\n\nconst getEllipseIntersections = (\n  element: ExcalidrawEllipseElement,\n  gap: number,\n  line: GA.Line,\n): GA.Point[] => {\n  const a = element.width / 2 + gap;\n  const b = element.height / 2 + gap;\n  const m = line[2];\n  const n = line[3];\n  const c = line[1];\n  const squares = a * a * m * m + b * b * n * n;\n  const discr = squares - c * c;\n  if (squares === 0 || discr <= 0) {\n    return [];\n  }\n  const discrRoot = Math.sqrt(discr);\n  const xn = -a * a * m * c;\n  const yn = -b * b * n * c;\n  return [\n    GA.point(\n      (xn + a * b * n * discrRoot) / squares,\n      (yn - a * b * m * discrRoot) / squares,\n    ),\n    GA.point(\n      (xn - a * b * n * discrRoot) / squares,\n      (yn + a * b * m * discrRoot) / squares,\n    ),\n  ];\n};\n\nexport const getCircleIntersections = (\n  center: GA.Point,\n  radius: number,\n  line: GA.Line,\n): GA.Point[] => {\n  if (radius === 0) {\n    return GAPoint.distanceToLine(line, center) === 0 ? [center] : [];\n  }\n  const m = line[2];\n  const n = line[3];\n  const c = line[1];\n  const [a, b] = GAPoint.toTuple(center);\n  const r = radius;\n  const squares = m * m + n * n;\n  const discr = r * r * squares - (m * a + n * b + c) ** 2;\n  if (squares === 0 || discr <= 0) {\n    return [];\n  }\n  const discrRoot = Math.sqrt(discr);\n  const xn = a * n * n - b * m * n - m * c;\n  const yn = b * m * m - a * m * n - n * c;\n\n  return [\n    GA.point((xn + n * discrRoot) / squares, (yn - m * discrRoot) / squares),\n    GA.point((xn - n * discrRoot) / squares, (yn + m * discrRoot) / squares),\n  ];\n};\n\n// The focus point is the tangent point of the \"focus image\" of the\n// `element`, where the tangent goes through `point`.\nexport const findFocusPointForEllipse = (\n  ellipse: ExcalidrawEllipseElement,\n  // Between -1 and 1 (not 0) the relative size of the \"focus image\" of\n  // the element on which the focus point lies\n  relativeDistance: number,\n  // The point for which we're trying to find the focus point, relative\n  // to the ellipse center.\n  point: GA.Point,\n): GA.Point => {\n  const relativeDistanceAbs = Math.abs(relativeDistance);\n  const a = (ellipse.width * relativeDistanceAbs) / 2;\n  const b = (ellipse.height * relativeDistanceAbs) / 2;\n\n  const orientation = Math.sign(relativeDistance);\n  const [px, pyo] = GAPoint.toTuple(point);\n\n  // The calculation below can't handle py = 0\n  const py = pyo === 0 ? 0.0001 : pyo;\n\n  const squares = px ** 2 * b ** 2 + py ** 2 * a ** 2;\n  // Tangent mx + ny + 1 = 0\n  const m =\n    (-px * b ** 2 +\n      orientation * py * Math.sqrt(Math.max(0, squares - a ** 2 * b ** 2))) /\n    squares;\n\n  const n = (-m * px - 1) / py;\n\n  const x = -(a ** 2 * m) / (n ** 2 * b ** 2 + m ** 2 * a ** 2);\n  return GA.point(x, (-m * x - 1) / n);\n};\n\nexport const findFocusPointForRectangulars = (\n  element:\n    | ExcalidrawRectangleElement\n    | ExcalidrawImageElement\n    | ExcalidrawDiamondElement\n    | ExcalidrawTextElement,\n  // Between -1 and 1 for how far away should the focus point be relative\n  // to the size of the element. Sign determines orientation.\n  relativeDistance: number,\n  // The point for which we're trying to find the focus point, relative\n  // to the element center.\n  point: GA.Point,\n): GA.Point => {\n  const relativeDistanceAbs = Math.abs(relativeDistance);\n  const orientation = Math.sign(relativeDistance);\n  const corners = getCorners(element, relativeDistanceAbs);\n\n  let maxDistance = 0;\n  let tangentPoint: null | GA.Point = null;\n  corners.forEach((corner) => {\n    const distance = orientation * GALine.through(point, corner)[1];\n    if (distance > maxDistance) {\n      maxDistance = distance;\n      tangentPoint = corner;\n    }\n  });\n  return tangentPoint!;\n};\n\nconst pointInBezierEquation = (\n  p0: Point,\n  p1: Point,\n  p2: Point,\n  p3: Point,\n  [mx, my]: Point,\n  lineThreshold: number,\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: number, idx: number) =>\n    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\n  // go through t in increments of 0.01\n  let t = 0;\n  while (t <= 1.0) {\n    const tx = equation(t, 0);\n    const ty = equation(t, 1);\n\n    const diff = Math.sqrt(Math.pow(tx - mx, 2) + Math.pow(ty - my, 2));\n\n    if (diff < lineThreshold) {\n      return true;\n    }\n\n    t += 0.01;\n  }\n\n  return false;\n};\n\nconst hitTestCurveInside = (\n  drawable: Drawable,\n  x: number,\n  y: number,\n  roundness: StrokeRoundness,\n) => {\n  const ops = getCurvePathOps(drawable);\n  const points: Mutable<Point>[] = [];\n  let odd = false; // select one line out of double lines\n  for (const operation of ops) {\n    if (operation.op === \"move\") {\n      odd = !odd;\n      if (odd) {\n        points.push([operation.data[0], operation.data[1]]);\n      }\n    } else if (operation.op === \"bcurveTo\") {\n      if (odd) {\n        points.push([operation.data[0], operation.data[1]]);\n        points.push([operation.data[2], operation.data[3]]);\n        points.push([operation.data[4], operation.data[5]]);\n      }\n    } else if (operation.op === \"lineTo\") {\n      if (odd) {\n        points.push([operation.data[0], operation.data[1]]);\n      }\n    }\n  }\n  if (points.length >= 4) {\n    if (roundness === \"sharp\") {\n      return isPointInPolygon(points, x, y);\n    }\n    const polygonPoints = pointsOnBezierCurves(points, 10, 5);\n    return isPointInPolygon(polygonPoints, x, y);\n  }\n  return false;\n};\n\nconst hitTestRoughShape = (\n  drawable: Drawable,\n  x: number,\n  y: number,\n  lineThreshold: number,\n) => {\n  // read operations from first opSet\n  const ops = getCurvePathOps(drawable);\n\n  // set start position as (0,0) just in case\n  // move operation does not exist (unlikely but it is worth safekeeping it)\n  let currentP: Point = [0, 0];\n\n  return ops.some(({ op, data }, idx) => {\n    // There are only four operation types:\n    // move, bcurveTo, lineTo, and curveTo\n    if (op === \"move\") {\n      // change starting point\n      currentP = data as unknown as Point;\n      // move operation does not draw anything; so, it always\n      // returns false\n    } else if (op === \"bcurveTo\") {\n      // create points from bezier curve\n      // bezier curve stores data as a flattened array of three positions\n      // [x1, y1, x2, y2, x3, y3]\n      const p1 = [data[0], data[1]] as Point;\n      const p2 = [data[2], data[3]] as Point;\n      const p3 = [data[4], data[5]] as Point;\n\n      const p0 = currentP;\n      currentP = p3;\n\n      // check if points are on the curve\n      // cubic bezier curves require four parameters\n      // the first parameter is the last stored position (p0)\n      const retVal = pointInBezierEquation(\n        p0,\n        p1,\n        p2,\n        p3,\n        [x, y],\n        lineThreshold,\n      );\n\n      // set end point of bezier curve as the new starting point for\n      // upcoming operations as each operation is based on the last drawn\n      // position of the previous operation\n      return retVal;\n    } else if (op === \"lineTo\") {\n      return hitTestCurveInside(drawable, x, y, \"sharp\");\n    } else if (op === \"qcurveTo\") {\n      // TODO: Implement this\n      console.warn(\"qcurveTo is not implemented yet\");\n    }\n\n    return false;\n  });\n};\n","// -----------------------------------------------------------------------------\n// ExcalidrawImageElement & related helpers\n// -----------------------------------------------------------------------------\n\nimport { MIME_TYPES, SVG_NS } from \"../constants\";\nimport { t } from \"../i18n\";\nimport { AppClassProperties, DataURL, BinaryFiles } from \"../types\";\nimport { isInitializedImageElement } from \"./typeChecks\";\nimport {\n  ExcalidrawElement,\n  FileId,\n  InitializedExcalidrawImageElement,\n} from \"./types\";\n\nexport const loadHTMLImageElement = (dataURL: DataURL) => {\n  return new Promise<HTMLImageElement>((resolve, reject) => {\n    const image = new Image();\n    image.onload = () => {\n      resolve(image);\n    };\n    image.onerror = (error) => {\n      reject(error);\n    };\n    image.src = dataURL;\n  });\n};\n\n/** NOTE: updates cache even if already populated with given image. Thus,\n * you should filter out the images upstream if you want to optimize this. */\nexport const updateImageCache = async ({\n  fileIds,\n  files,\n  imageCache,\n}: {\n  fileIds: FileId[];\n  files: BinaryFiles;\n  imageCache: AppClassProperties[\"imageCache\"];\n}) => {\n  const updatedFiles = new Map<FileId, true>();\n  const erroredFiles = new Map<FileId, true>();\n\n  await Promise.all(\n    fileIds.reduce((promises, fileId) => {\n      const fileData = files[fileId as string];\n      if (fileData && !updatedFiles.has(fileId)) {\n        updatedFiles.set(fileId, true);\n        return promises.concat(\n          (async () => {\n            try {\n              if (fileData.mimeType === MIME_TYPES.binary) {\n                throw new Error(\"Only images can be added to ImageCache\");\n              }\n\n              const imagePromise = loadHTMLImageElement(fileData.dataURL);\n              const data = {\n                image: imagePromise,\n                mimeType: fileData.mimeType,\n              } as const;\n              // store the promise immediately to indicate there's an in-progress\n              // initialization\n              imageCache.set(fileId, data);\n\n              const image = await imagePromise;\n\n              imageCache.set(fileId, { ...data, image });\n            } catch (error: any) {\n              erroredFiles.set(fileId, true);\n            }\n          })(),\n        );\n      }\n      return promises;\n    }, [] as Promise<any>[]),\n  );\n\n  return {\n    imageCache,\n    /** includes errored files because they cache was updated nonetheless */\n    updatedFiles,\n    /** files that failed when creating HTMLImageElement */\n    erroredFiles,\n  };\n};\n\nexport const getInitializedImageElements = (\n  elements: readonly ExcalidrawElement[],\n) =>\n  elements.filter((element) =>\n    isInitializedImageElement(element),\n  ) as InitializedExcalidrawImageElement[];\n\nexport const isHTMLSVGElement = (node: Node | null): node is SVGElement => {\n  // lower-casing due to XML/HTML convention differences\n  // https://johnresig.com/blog/nodename-case-sensitivity\n  return node?.nodeName.toLowerCase() === \"svg\";\n};\n\nexport const normalizeSVG = async (SVGString: string) => {\n  const doc = new DOMParser().parseFromString(SVGString, MIME_TYPES.svg);\n  const svg = doc.querySelector(\"svg\");\n  const errorNode = doc.querySelector(\"parsererror\");\n  if (errorNode || !isHTMLSVGElement(svg)) {\n    throw new Error(t(\"errors.invalidSVGString\"));\n  } else {\n    if (!svg.hasAttribute(\"xmlns\")) {\n      svg.setAttribute(\"xmlns\", SVG_NS);\n    }\n\n    if (!svg.hasAttribute(\"width\") || !svg.hasAttribute(\"height\")) {\n      const viewBox = svg.getAttribute(\"viewBox\");\n      let width = svg.getAttribute(\"width\") || \"50\";\n      let height = svg.getAttribute(\"height\") || \"50\";\n      if (viewBox) {\n        const match = viewBox.match(/\\d+ +\\d+ +(\\d+) +(\\d+)/);\n        if (match) {\n          [, width, height] = match;\n        }\n      }\n      svg.setAttribute(\"width\", width);\n      svg.setAttribute(\"height\", height);\n    }\n\n    return svg.outerHTML;\n  }\n};\n","import {\n  ExcalidrawElement,\n  PointerType,\n  NonDeletedExcalidrawElement,\n} from \"./types\";\n\nimport {\n  OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n  getTransformHandlesFromCoords,\n  getTransformHandles,\n  TransformHandleType,\n  TransformHandle,\n  MaybeTransformHandleType,\n} from \"./transformHandles\";\nimport { AppState, Zoom } from \"../types\";\n\nconst isInsideTransformHandle = (\n  transformHandle: TransformHandle,\n  x: number,\n  y: number,\n) =>\n  x >= transformHandle[0] &&\n  x <= transformHandle[0] + transformHandle[2] &&\n  y >= transformHandle[1] &&\n  y <= transformHandle[1] + transformHandle[3];\n\nexport const resizeTest = (\n  element: NonDeletedExcalidrawElement,\n  appState: AppState,\n  x: number,\n  y: number,\n  zoom: Zoom,\n  pointerType: PointerType,\n): MaybeTransformHandleType => {\n  if (!appState.selectedElementIds[element.id]) {\n    return false;\n  }\n\n  const { rotation: rotationTransformHandle, ...transformHandles } =\n    getTransformHandles(element, zoom, pointerType);\n\n  if (\n    rotationTransformHandle &&\n    isInsideTransformHandle(rotationTransformHandle, x, y)\n  ) {\n    return \"rotation\" as TransformHandleType;\n  }\n\n  const filter = Object.keys(transformHandles).filter((key) => {\n    const transformHandle =\n      transformHandles[key as Exclude<TransformHandleType, \"rotation\">]!;\n    if (!transformHandle) {\n      return false;\n    }\n    return isInsideTransformHandle(transformHandle, x, y);\n  });\n\n  if (filter.length > 0) {\n    return filter[0] as TransformHandleType;\n  }\n\n  return false;\n};\n\nexport const getElementWithTransformHandleType = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  scenePointerX: number,\n  scenePointerY: number,\n  zoom: Zoom,\n  pointerType: PointerType,\n) => {\n  return elements.reduce((result, element) => {\n    if (result) {\n      return result;\n    }\n    const transformHandleType = resizeTest(\n      element,\n      appState,\n      scenePointerX,\n      scenePointerY,\n      zoom,\n      pointerType,\n    );\n    return transformHandleType ? { element, transformHandleType } : null;\n  }, null as { element: NonDeletedExcalidrawElement; transformHandleType: MaybeTransformHandleType } | null);\n};\n\nexport const getTransformHandleTypeFromCoords = (\n  [x1, y1, x2, y2]: readonly [number, number, number, number],\n  scenePointerX: number,\n  scenePointerY: number,\n  zoom: Zoom,\n  pointerType: PointerType,\n): MaybeTransformHandleType => {\n  const transformHandles = getTransformHandlesFromCoords(\n    [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2],\n    0,\n    zoom,\n    pointerType,\n    OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n  );\n\n  const found = Object.keys(transformHandles).find((key) => {\n    const transformHandle =\n      transformHandles[key as Exclude<TransformHandleType, \"rotation\">]!;\n    return (\n      transformHandle &&\n      isInsideTransformHandle(transformHandle, scenePointerX, scenePointerY)\n    );\n  });\n  return (found || false) as MaybeTransformHandleType;\n};\n\nconst RESIZE_CURSORS = [\"ns\", \"nesw\", \"ew\", \"nwse\"];\nconst rotateResizeCursor = (cursor: string, angle: number) => {\n  const index = RESIZE_CURSORS.indexOf(cursor);\n  if (index >= 0) {\n    const a = Math.round(angle / (Math.PI / 4));\n    cursor = RESIZE_CURSORS[(index + a) % RESIZE_CURSORS.length];\n  }\n  return cursor;\n};\n\n/*\n * Returns bi-directional cursor for the element being resized\n */\nexport const getCursorForResizingElement = (resizingElement: {\n  element?: ExcalidrawElement;\n  transformHandleType: MaybeTransformHandleType;\n}): string => {\n  const { element, transformHandleType } = resizingElement;\n  const shouldSwapCursors =\n    element && Math.sign(element.height) * Math.sign(element.width) === -1;\n  let cursor = null;\n\n  switch (transformHandleType) {\n    case \"n\":\n    case \"s\":\n      cursor = \"ns\";\n      break;\n    case \"w\":\n    case \"e\":\n      cursor = \"ew\";\n      break;\n    case \"nw\":\n    case \"se\":\n      if (shouldSwapCursors) {\n        cursor = \"nesw\";\n      } else {\n        cursor = \"nwse\";\n      }\n      break;\n    case \"ne\":\n    case \"sw\":\n      if (shouldSwapCursors) {\n        cursor = \"nwse\";\n      } else {\n        cursor = \"nesw\";\n      }\n      break;\n    case \"rotation\":\n      return \"grab\";\n  }\n\n  if (cursor && element) {\n    cursor = rotateResizeCursor(cursor, element.angle);\n  }\n\n  return cursor ? `${cursor}-resize` : \"\";\n};\n","import { updateBoundElements } from \"./binding\";\nimport { getCommonBounds } from \"./bounds\";\nimport { mutateElement } from \"./mutateElement\";\nimport { getPerfectElementSize } from \"./sizeHelpers\";\nimport { NonDeletedExcalidrawElement } from \"./types\";\nimport { AppState, PointerDownState } from \"../types\";\nimport { getBoundTextElement } from \"./textElement\";\nimport { isSelectedViaGroup } from \"../groups\";\n\nexport const dragSelectedElements = (\n  pointerDownState: PointerDownState,\n  selectedElements: NonDeletedExcalidrawElement[],\n  pointerX: number,\n  pointerY: number,\n  lockDirection: boolean = false,\n  distanceX: number = 0,\n  distanceY: number = 0,\n  appState: AppState,\n) => {\n  const [x1, y1] = getCommonBounds(selectedElements);\n  const offset = { x: pointerX - x1, y: pointerY - y1 };\n  selectedElements.forEach((element) => {\n    updateElementCoords(\n      lockDirection,\n      distanceX,\n      distanceY,\n      pointerDownState,\n      element,\n      offset,\n    );\n    // update coords of bound text only if we're dragging the container directly\n    // (we don't drag the group that it's part of)\n    if (\n      // container isn't part of any group\n      // (perf optim so we don't check `isSelectedViaGroup()` in every case)\n      !element.groupIds.length ||\n      // container is part of a group, but we're dragging the container directly\n      (appState.editingGroupId && !isSelectedViaGroup(appState, element))\n    ) {\n      const textElement = getBoundTextElement(element);\n      if (textElement) {\n        updateElementCoords(\n          lockDirection,\n          distanceX,\n          distanceY,\n          pointerDownState,\n          textElement,\n          offset,\n        );\n      }\n    }\n    updateBoundElements(element, {\n      simultaneouslyUpdated: selectedElements,\n    });\n  });\n};\n\nconst updateElementCoords = (\n  lockDirection: boolean,\n  distanceX: number,\n  distanceY: number,\n  pointerDownState: PointerDownState,\n  element: NonDeletedExcalidrawElement,\n  offset: { x: number; y: number },\n) => {\n  let x: number;\n  let y: number;\n  if (lockDirection) {\n    const lockX = lockDirection && distanceX < distanceY;\n    const lockY = lockDirection && distanceX > distanceY;\n    const original = pointerDownState.originalElements.get(element.id);\n    x = lockX && original ? original.x : element.x + offset.x;\n    y = lockY && original ? original.y : element.y + offset.y;\n  } else {\n    x = element.x + offset.x;\n    y = element.y + offset.y;\n  }\n\n  mutateElement(element, {\n    x,\n    y,\n  });\n};\nexport const getDragOffsetXY = (\n  selectedElements: NonDeletedExcalidrawElement[],\n  x: number,\n  y: number,\n): [number, number] => {\n  const [x1, y1] = getCommonBounds(selectedElements);\n  return [x - x1, y - y1];\n};\n\nexport const dragNewElement = (\n  draggingElement: NonDeletedExcalidrawElement,\n  elementType: AppState[\"activeTool\"][\"type\"],\n  originX: number,\n  originY: number,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  shouldMaintainAspectRatio: boolean,\n  shouldResizeFromCenter: boolean,\n  /** whether to keep given aspect ratio when `isResizeWithSidesSameLength` is\n      true */\n  widthAspectRatio?: number | null,\n) => {\n  if (shouldMaintainAspectRatio && draggingElement.type !== \"selection\") {\n    if (widthAspectRatio) {\n      height = width / widthAspectRatio;\n    } else {\n      // Depending on where the cursor is at (x, y) relative to where the starting point is\n      // (originX, originY), we use ONLY width or height to control size increase.\n      // This allows the cursor to always \"stick\" to one of the sides of the bounding box.\n      if (Math.abs(y - originY) > Math.abs(x - originX)) {\n        ({ width, height } = getPerfectElementSize(\n          elementType,\n          height,\n          x < originX ? -width : width,\n        ));\n      } else {\n        ({ width, height } = getPerfectElementSize(\n          elementType,\n          width,\n          y < originY ? -height : height,\n        ));\n      }\n\n      if (height < 0) {\n        height = -height;\n      }\n    }\n  }\n\n  let newX = x < originX ? originX - width : originX;\n  let newY = y < originY ? originY - height : originY;\n\n  if (shouldResizeFromCenter) {\n    width += width;\n    height += height;\n    newX = originX - width / 2;\n    newY = originY - height / 2;\n  }\n\n  if (width !== 0 && height !== 0) {\n    mutateElement(draggingElement, {\n      x: newX,\n      y: newY,\n      width,\n      height,\n    });\n  }\n};\n","import { AppState } from \"../types\";\nimport { NonDeletedExcalidrawElement } from \"./types\";\nimport { getSelectedElements } from \"../scene\";\n\nexport const showSelectedShapeActions = (\n  appState: AppState,\n  elements: readonly NonDeletedExcalidrawElement[],\n) =>\n  Boolean(\n    (!appState.viewModeEnabled &&\n      appState.activeTool.type !== \"custom\" &&\n      (appState.editingElement ||\n        (appState.activeTool.type !== \"selection\" &&\n          appState.activeTool.type !== \"eraser\" &&\n          appState.activeTool.type !== \"hand\"))) ||\n      getSelectedElements(elements, appState).length,\n  );\n","import {\n  ExcalidrawElement,\n  NonDeletedExcalidrawElement,\n  NonDeleted,\n} from \"./types\";\nimport { isInvisiblySmallElement } from \"./sizeHelpers\";\nimport { isLinearElementType } from \"./typeChecks\";\n\nexport {\n  newElement,\n  newTextElement,\n  updateTextElement,\n  refreshTextDimensions,\n  newLinearElement,\n  newImageElement,\n  duplicateElement,\n} from \"./newElement\";\nexport {\n  getElementAbsoluteCoords,\n  getElementBounds,\n  getCommonBounds,\n  getDiamondPoints,\n  getArrowheadPoints,\n  getClosestElementBounds,\n} from \"./bounds\";\n\nexport {\n  OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n  getTransformHandlesFromCoords,\n  getTransformHandles,\n} from \"./transformHandles\";\nexport {\n  hitTest,\n  isHittingElementBoundingBoxWithoutHittingElement,\n} from \"./collision\";\nexport {\n  resizeTest,\n  getCursorForResizingElement,\n  getElementWithTransformHandleType,\n  getTransformHandleTypeFromCoords,\n} from \"./resizeTest\";\nexport {\n  transformElements,\n  getResizeOffsetXY,\n  getResizeArrowDirection,\n} from \"./resizeElements\";\nexport {\n  dragSelectedElements,\n  getDragOffsetXY,\n  dragNewElement,\n} from \"./dragElements\";\nexport { isTextElement, isExcalidrawElement } from \"./typeChecks\";\nexport { textWysiwyg } from \"./textWysiwyg\";\nexport { redrawTextBoundingBox } from \"./textElement\";\nexport {\n  getPerfectElementSize,\n  getLockedLinearCursorAlignSize,\n  isInvisiblySmallElement,\n  resizePerfectLineForNWHandler,\n  getNormalizedDimensions,\n} from \"./sizeHelpers\";\nexport { showSelectedShapeActions } from \"./showSelectedShapeActions\";\n\nexport const getSceneVersion = (elements: readonly ExcalidrawElement[]) =>\n  elements.reduce((acc, el) => acc + el.version, 0);\n\nexport const getVisibleElements = (elements: readonly ExcalidrawElement[]) =>\n  elements.filter(\n    (el) => !el.isDeleted && !isInvisiblySmallElement(el),\n  ) as readonly NonDeletedExcalidrawElement[];\n\nexport const getNonDeletedElements = (elements: readonly ExcalidrawElement[]) =>\n  elements.filter(\n    (element) => !element.isDeleted,\n  ) as readonly NonDeletedExcalidrawElement[];\n\nexport const isNonDeletedElement = <T extends ExcalidrawElement>(\n  element: T,\n): element is NonDeleted<T> => !element.isDeleted;\n\nconst _clearElements = (\n  elements: readonly ExcalidrawElement[],\n): ExcalidrawElement[] =>\n  getNonDeletedElements(elements).map((element) =>\n    isLinearElementType(element.type)\n      ? { ...element, lastCommittedPoint: null }\n      : element,\n  );\n\nexport const clearElementsForDatabase = (\n  elements: readonly ExcalidrawElement[],\n) => _clearElements(elements);\n\nexport const clearElementsForExport = (\n  elements: readonly ExcalidrawElement[],\n) => _clearElements(elements);\n\nexport const clearElementsForLocalStorage = (\n  elements: readonly ExcalidrawElement[],\n) => _clearElements(elements);\n","import {\n  NonDeleted,\n  ExcalidrawLinearElement,\n  ExcalidrawElement,\n  PointBinding,\n  ExcalidrawBindableElement,\n  ExcalidrawTextElementWithContainer,\n} from \"./types\";\nimport {\n  distance2d,\n  rotate,\n  isPathALoop,\n  getGridPoint,\n  rotatePoint,\n  centerPoint,\n  getControlPointsForBezierCurve,\n  getBezierXY,\n  getBezierCurveLength,\n  mapIntervalToBezierT,\n  arePointsEqual,\n} from \"../math\";\nimport { getElementAbsoluteCoords, getLockedLinearCursorAlignSize } from \".\";\nimport {\n  getCurvePathOps,\n  getElementPointsCoords,\n  getMinMaxXYFromCurvePathOps,\n} from \"./bounds\";\nimport { Point, AppState, PointerCoords } from \"../types\";\nimport { mutateElement } from \"./mutateElement\";\nimport History from \"../history\";\n\nimport Scene from \"../scene/Scene\";\nimport {\n  bindOrUnbindLinearElement,\n  getHoveredElementForBinding,\n  isBindingEnabled,\n} from \"./binding\";\nimport { tupleToCoors } from \"../utils\";\nimport { isBindingElement } from \"./typeChecks\";\nimport { shouldRotateWithDiscreteAngle } from \"../keys\";\nimport { getBoundTextElement, handleBindTextResize } from \"./textElement\";\nimport { getShapeForElement } from \"../renderer/renderElement\";\nimport { DRAGGING_THRESHOLD } from \"../constants\";\nimport { Mutable } from \"../utility-types\";\n\nconst editorMidPointsCache: {\n  version: number | null;\n  points: (Point | null)[];\n  zoom: number | null;\n} = { version: null, points: [], zoom: null };\nexport class LinearElementEditor {\n  public readonly elementId: ExcalidrawElement[\"id\"] & {\n    _brand: \"excalidrawLinearElementId\";\n  };\n  /** indices */\n  public readonly selectedPointsIndices: readonly number[] | null;\n\n  public readonly pointerDownState: Readonly<{\n    prevSelectedPointsIndices: readonly number[] | null;\n    /** index */\n    lastClickedPoint: number;\n    origin: Readonly<{ x: number; y: number }> | null;\n    segmentMidpoint: {\n      value: Point | null;\n      index: number | null;\n      added: boolean;\n    };\n  }>;\n\n  /** whether you're dragging a point */\n  public readonly isDragging: boolean;\n  public readonly lastUncommittedPoint: Point | null;\n  public readonly pointerOffset: Readonly<{ x: number; y: number }>;\n  public readonly startBindingElement:\n    | ExcalidrawBindableElement\n    | null\n    | \"keep\";\n  public readonly endBindingElement: ExcalidrawBindableElement | null | \"keep\";\n  public readonly hoverPointIndex: number;\n  public readonly segmentMidPointHoveredCoords: Point | null;\n\n  constructor(element: NonDeleted<ExcalidrawLinearElement>, scene: Scene) {\n    this.elementId = element.id as string & {\n      _brand: \"excalidrawLinearElementId\";\n    };\n    Scene.mapElementToScene(this.elementId, scene);\n    LinearElementEditor.normalizePoints(element);\n\n    this.selectedPointsIndices = null;\n    this.lastUncommittedPoint = null;\n    this.isDragging = false;\n    this.pointerOffset = { x: 0, y: 0 };\n    this.startBindingElement = \"keep\";\n    this.endBindingElement = \"keep\";\n    this.pointerDownState = {\n      prevSelectedPointsIndices: null,\n      lastClickedPoint: -1,\n      origin: null,\n\n      segmentMidpoint: {\n        value: null,\n        index: null,\n        added: false,\n      },\n    };\n    this.hoverPointIndex = -1;\n    this.segmentMidPointHoveredCoords = null;\n  }\n\n  // ---------------------------------------------------------------------------\n  // static methods\n  // ---------------------------------------------------------------------------\n\n  static POINT_HANDLE_SIZE = 10;\n  /**\n   * @param id the `elementId` from the instance of this class (so that we can\n   *  statically guarantee this method returns an ExcalidrawLinearElement)\n   */\n  static getElement(id: InstanceType<typeof LinearElementEditor>[\"elementId\"]) {\n    const element = Scene.getScene(id)?.getNonDeletedElement(id);\n    if (element) {\n      return element as NonDeleted<ExcalidrawLinearElement>;\n    }\n    return null;\n  }\n\n  static handleBoxSelection(\n    event: PointerEvent,\n    appState: AppState,\n    setState: React.Component<any, AppState>[\"setState\"],\n  ) {\n    if (\n      !appState.editingLinearElement ||\n      appState.draggingElement?.type !== \"selection\"\n    ) {\n      return false;\n    }\n    const { editingLinearElement } = appState;\n    const { selectedPointsIndices, elementId } = editingLinearElement;\n\n    const element = LinearElementEditor.getElement(elementId);\n    if (!element) {\n      return false;\n    }\n\n    const [selectionX1, selectionY1, selectionX2, selectionY2] =\n      getElementAbsoluteCoords(appState.draggingElement);\n\n    const pointsSceneCoords =\n      LinearElementEditor.getPointsGlobalCoordinates(element);\n\n    const nextSelectedPoints = pointsSceneCoords.reduce(\n      (acc: number[], point, index) => {\n        if (\n          (point[0] >= selectionX1 &&\n            point[0] <= selectionX2 &&\n            point[1] >= selectionY1 &&\n            point[1] <= selectionY2) ||\n          (event.shiftKey && selectedPointsIndices?.includes(index))\n        ) {\n          acc.push(index);\n        }\n\n        return acc;\n      },\n      [],\n    );\n\n    setState({\n      editingLinearElement: {\n        ...editingLinearElement,\n        selectedPointsIndices: nextSelectedPoints.length\n          ? nextSelectedPoints\n          : null,\n      },\n    });\n  }\n\n  /** @returns whether point was dragged */\n  static handlePointDragging(\n    event: PointerEvent,\n    appState: AppState,\n    scenePointerX: number,\n    scenePointerY: number,\n    maybeSuggestBinding: (\n      element: NonDeleted<ExcalidrawLinearElement>,\n      pointSceneCoords: { x: number; y: number }[],\n    ) => void,\n    linearElementEditor: LinearElementEditor,\n  ): boolean {\n    if (!linearElementEditor) {\n      return false;\n    }\n    const { selectedPointsIndices, elementId } = linearElementEditor;\n    const element = LinearElementEditor.getElement(elementId);\n    if (!element) {\n      return false;\n    }\n\n    // point that's being dragged (out of all selected points)\n    const draggingPoint = element.points[\n      linearElementEditor.pointerDownState.lastClickedPoint\n    ] as [number, number] | undefined;\n\n    if (selectedPointsIndices && draggingPoint) {\n      if (\n        shouldRotateWithDiscreteAngle(event) &&\n        selectedPointsIndices.length === 1 &&\n        element.points.length > 1\n      ) {\n        const selectedIndex = selectedPointsIndices[0];\n        const referencePoint =\n          element.points[selectedIndex === 0 ? 1 : selectedIndex - 1];\n\n        const [width, height] = LinearElementEditor._getShiftLockedDelta(\n          element,\n          referencePoint,\n          [scenePointerX, scenePointerY],\n          appState.gridSize,\n        );\n\n        LinearElementEditor.movePoints(element, [\n          {\n            index: selectedIndex,\n            point: [width + referencePoint[0], height + referencePoint[1]],\n            isDragging:\n              selectedIndex ===\n              linearElementEditor.pointerDownState.lastClickedPoint,\n          },\n        ]);\n      } else {\n        const newDraggingPointPosition = LinearElementEditor.createPointAt(\n          element,\n          scenePointerX - linearElementEditor.pointerOffset.x,\n          scenePointerY - linearElementEditor.pointerOffset.y,\n          appState.gridSize,\n        );\n\n        const deltaX = newDraggingPointPosition[0] - draggingPoint[0];\n        const deltaY = newDraggingPointPosition[1] - draggingPoint[1];\n\n        LinearElementEditor.movePoints(\n          element,\n          selectedPointsIndices.map((pointIndex) => {\n            const newPointPosition =\n              pointIndex ===\n              linearElementEditor.pointerDownState.lastClickedPoint\n                ? LinearElementEditor.createPointAt(\n                    element,\n                    scenePointerX - linearElementEditor.pointerOffset.x,\n                    scenePointerY - linearElementEditor.pointerOffset.y,\n                    appState.gridSize,\n                  )\n                : ([\n                    element.points[pointIndex][0] + deltaX,\n                    element.points[pointIndex][1] + deltaY,\n                  ] as const);\n            return {\n              index: pointIndex,\n              point: newPointPosition,\n              isDragging:\n                pointIndex ===\n                linearElementEditor.pointerDownState.lastClickedPoint,\n            };\n          }),\n        );\n\n        const boundTextElement = getBoundTextElement(element);\n        if (boundTextElement) {\n          handleBindTextResize(element, false);\n        }\n      }\n\n      // suggest bindings for first and last point if selected\n      if (isBindingElement(element, false)) {\n        const coords: { x: number; y: number }[] = [];\n\n        const firstSelectedIndex = selectedPointsIndices[0];\n        if (firstSelectedIndex === 0) {\n          coords.push(\n            tupleToCoors(\n              LinearElementEditor.getPointGlobalCoordinates(\n                element,\n                element.points[0],\n              ),\n            ),\n          );\n        }\n\n        const lastSelectedIndex =\n          selectedPointsIndices[selectedPointsIndices.length - 1];\n        if (lastSelectedIndex === element.points.length - 1) {\n          coords.push(\n            tupleToCoors(\n              LinearElementEditor.getPointGlobalCoordinates(\n                element,\n                element.points[lastSelectedIndex],\n              ),\n            ),\n          );\n        }\n\n        if (coords.length) {\n          maybeSuggestBinding(element, coords);\n        }\n      }\n\n      return true;\n    }\n\n    return false;\n  }\n\n  static handlePointerUp(\n    event: PointerEvent,\n    editingLinearElement: LinearElementEditor,\n    appState: AppState,\n  ): LinearElementEditor {\n    const { elementId, selectedPointsIndices, isDragging, pointerDownState } =\n      editingLinearElement;\n    const element = LinearElementEditor.getElement(elementId);\n    if (!element) {\n      return editingLinearElement;\n    }\n\n    const bindings: Mutable<\n      Partial<\n        Pick<\n          InstanceType<typeof LinearElementEditor>,\n          \"startBindingElement\" | \"endBindingElement\"\n        >\n      >\n    > = {};\n\n    if (isDragging && selectedPointsIndices) {\n      for (const selectedPoint of selectedPointsIndices) {\n        if (\n          selectedPoint === 0 ||\n          selectedPoint === element.points.length - 1\n        ) {\n          if (isPathALoop(element.points, appState.zoom.value)) {\n            LinearElementEditor.movePoints(element, [\n              {\n                index: selectedPoint,\n                point:\n                  selectedPoint === 0\n                    ? element.points[element.points.length - 1]\n                    : element.points[0],\n              },\n            ]);\n          }\n\n          const bindingElement = isBindingEnabled(appState)\n            ? getHoveredElementForBinding(\n                tupleToCoors(\n                  LinearElementEditor.getPointAtIndexGlobalCoordinates(\n                    element,\n                    selectedPoint!,\n                  ),\n                ),\n                Scene.getScene(element)!,\n              )\n            : null;\n\n          bindings[\n            selectedPoint === 0 ? \"startBindingElement\" : \"endBindingElement\"\n          ] = bindingElement;\n        }\n      }\n    }\n\n    return {\n      ...editingLinearElement,\n      ...bindings,\n      // if clicking without previously dragging a point(s), and not holding\n      // shift, deselect all points except the one clicked. If holding shift,\n      // toggle the point.\n      selectedPointsIndices:\n        isDragging || event.shiftKey\n          ? !isDragging &&\n            event.shiftKey &&\n            pointerDownState.prevSelectedPointsIndices?.includes(\n              pointerDownState.lastClickedPoint,\n            )\n            ? selectedPointsIndices &&\n              selectedPointsIndices.filter(\n                (pointIndex) =>\n                  pointIndex !== pointerDownState.lastClickedPoint,\n              )\n            : selectedPointsIndices\n          : selectedPointsIndices?.includes(pointerDownState.lastClickedPoint)\n          ? [pointerDownState.lastClickedPoint]\n          : selectedPointsIndices,\n      isDragging: false,\n      pointerOffset: { x: 0, y: 0 },\n    };\n  }\n\n  static getEditorMidPoints = (\n    element: NonDeleted<ExcalidrawLinearElement>,\n    appState: AppState,\n  ): typeof editorMidPointsCache[\"points\"] => {\n    const boundText = getBoundTextElement(element);\n\n    // Since its not needed outside editor unless 2 pointer lines or bound text\n    if (\n      !appState.editingLinearElement &&\n      element.points.length > 2 &&\n      !boundText\n    ) {\n      return [];\n    }\n    if (\n      editorMidPointsCache.version === element.version &&\n      editorMidPointsCache.zoom === appState.zoom.value\n    ) {\n      return editorMidPointsCache.points;\n    }\n    LinearElementEditor.updateEditorMidPointsCache(element, appState);\n    return editorMidPointsCache.points!;\n  };\n\n  static updateEditorMidPointsCache = (\n    element: NonDeleted<ExcalidrawLinearElement>,\n    appState: AppState,\n  ) => {\n    const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n\n    let index = 0;\n    const midpoints: (Point | null)[] = [];\n    while (index < points.length - 1) {\n      if (\n        LinearElementEditor.isSegmentTooShort(\n          element,\n          element.points[index],\n          element.points[index + 1],\n          appState.zoom,\n        )\n      ) {\n        midpoints.push(null);\n        index++;\n        continue;\n      }\n      const segmentMidPoint = LinearElementEditor.getSegmentMidPoint(\n        element,\n        points[index],\n        points[index + 1],\n        index + 1,\n      );\n      midpoints.push(segmentMidPoint);\n      index++;\n    }\n    editorMidPointsCache.points = midpoints;\n    editorMidPointsCache.version = element.version;\n    editorMidPointsCache.zoom = appState.zoom.value;\n  };\n\n  static getSegmentMidpointHitCoords = (\n    linearElementEditor: LinearElementEditor,\n    scenePointer: { x: number; y: number },\n    appState: AppState,\n  ) => {\n    const { elementId } = linearElementEditor;\n    const element = LinearElementEditor.getElement(elementId);\n    if (!element) {\n      return null;\n    }\n    const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(\n      element,\n      appState.zoom,\n      scenePointer.x,\n      scenePointer.y,\n    );\n    if (clickedPointIndex >= 0) {\n      return null;\n    }\n    const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n    if (points.length >= 3 && !appState.editingLinearElement) {\n      return null;\n    }\n\n    const threshold =\n      LinearElementEditor.POINT_HANDLE_SIZE / appState.zoom.value;\n\n    const existingSegmentMidpointHitCoords =\n      linearElementEditor.segmentMidPointHoveredCoords;\n    if (existingSegmentMidpointHitCoords) {\n      const distance = distance2d(\n        existingSegmentMidpointHitCoords[0],\n        existingSegmentMidpointHitCoords[1],\n        scenePointer.x,\n        scenePointer.y,\n      );\n      if (distance <= threshold) {\n        return existingSegmentMidpointHitCoords;\n      }\n    }\n    let index = 0;\n    const midPoints: typeof editorMidPointsCache[\"points\"] =\n      LinearElementEditor.getEditorMidPoints(element, appState);\n    while (index < midPoints.length) {\n      if (midPoints[index] !== null) {\n        const distance = distance2d(\n          midPoints[index]![0],\n          midPoints[index]![1],\n          scenePointer.x,\n          scenePointer.y,\n        );\n        if (distance <= threshold) {\n          return midPoints[index];\n        }\n      }\n\n      index++;\n    }\n    return null;\n  };\n\n  static isSegmentTooShort(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    startPoint: Point,\n    endPoint: Point,\n    zoom: AppState[\"zoom\"],\n  ) {\n    let distance = distance2d(\n      startPoint[0],\n      startPoint[1],\n      endPoint[0],\n      endPoint[1],\n    );\n    if (element.points.length > 2 && element.roundness) {\n      distance = getBezierCurveLength(element, endPoint);\n    }\n\n    return distance * zoom.value < LinearElementEditor.POINT_HANDLE_SIZE * 4;\n  }\n\n  static getSegmentMidPoint(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    startPoint: Point,\n    endPoint: Point,\n    endPointIndex: number,\n  ) {\n    let segmentMidPoint = centerPoint(startPoint, endPoint);\n    if (element.points.length > 2 && element.roundness) {\n      const controlPoints = getControlPointsForBezierCurve(\n        element,\n        element.points[endPointIndex],\n      );\n      if (controlPoints) {\n        const t = mapIntervalToBezierT(\n          element,\n          element.points[endPointIndex],\n          0.5,\n        );\n\n        const [tx, ty] = getBezierXY(\n          controlPoints[0],\n          controlPoints[1],\n          controlPoints[2],\n          controlPoints[3],\n          t,\n        );\n        segmentMidPoint = LinearElementEditor.getPointGlobalCoordinates(\n          element,\n          [tx, ty],\n        );\n      }\n    }\n\n    return segmentMidPoint;\n  }\n\n  static getSegmentMidPointIndex(\n    linearElementEditor: LinearElementEditor,\n    appState: AppState,\n    midPoint: Point,\n  ) {\n    const element = LinearElementEditor.getElement(\n      linearElementEditor.elementId,\n    );\n    if (!element) {\n      return -1;\n    }\n    const midPoints = LinearElementEditor.getEditorMidPoints(element, appState);\n    let index = 0;\n    while (index < midPoints.length) {\n      if (LinearElementEditor.arePointsEqual(midPoint, midPoints[index])) {\n        return index + 1;\n      }\n      index++;\n    }\n    return -1;\n  }\n\n  static handlePointerDown(\n    event: React.PointerEvent<HTMLCanvasElement>,\n    appState: AppState,\n    history: History,\n    scenePointer: { x: number; y: number },\n    linearElementEditor: LinearElementEditor,\n  ): {\n    didAddPoint: boolean;\n    hitElement: NonDeleted<ExcalidrawElement> | null;\n    linearElementEditor: LinearElementEditor | null;\n  } {\n    const ret: ReturnType<typeof LinearElementEditor[\"handlePointerDown\"]> = {\n      didAddPoint: false,\n      hitElement: null,\n      linearElementEditor: null,\n    };\n\n    if (!linearElementEditor) {\n      return ret;\n    }\n\n    const { elementId } = linearElementEditor;\n    const element = LinearElementEditor.getElement(elementId);\n\n    if (!element) {\n      return ret;\n    }\n    const segmentMidpoint = LinearElementEditor.getSegmentMidpointHitCoords(\n      linearElementEditor,\n      scenePointer,\n      appState,\n    );\n    let segmentMidpointIndex = null;\n    if (segmentMidpoint) {\n      segmentMidpointIndex = LinearElementEditor.getSegmentMidPointIndex(\n        linearElementEditor,\n        appState,\n        segmentMidpoint,\n      );\n    }\n    if (event.altKey && appState.editingLinearElement) {\n      if (linearElementEditor.lastUncommittedPoint == null) {\n        mutateElement(element, {\n          points: [\n            ...element.points,\n            LinearElementEditor.createPointAt(\n              element,\n              scenePointer.x,\n              scenePointer.y,\n              appState.gridSize,\n            ),\n          ],\n        });\n        ret.didAddPoint = true;\n      }\n      history.resumeRecording();\n      ret.linearElementEditor = {\n        ...linearElementEditor,\n        pointerDownState: {\n          prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n          lastClickedPoint: -1,\n          origin: { x: scenePointer.x, y: scenePointer.y },\n          segmentMidpoint: {\n            value: segmentMidpoint,\n            index: segmentMidpointIndex,\n            added: false,\n          },\n        },\n        selectedPointsIndices: [element.points.length - 1],\n        lastUncommittedPoint: null,\n        endBindingElement: getHoveredElementForBinding(\n          scenePointer,\n          Scene.getScene(element)!,\n        ),\n      };\n\n      ret.didAddPoint = true;\n      return ret;\n    }\n\n    const clickedPointIndex = LinearElementEditor.getPointIndexUnderCursor(\n      element,\n      appState.zoom,\n      scenePointer.x,\n      scenePointer.y,\n    );\n    // if we clicked on a point, set the element as hitElement otherwise\n    // it would get deselected if the point is outside the hitbox area\n    if (clickedPointIndex >= 0 || segmentMidpoint) {\n      ret.hitElement = element;\n    } else {\n      // You might be wandering why we are storing the binding elements on\n      // LinearElementEditor and passing them in, instead of calculating them\n      // from the end points of the `linearElement` - this is to allow disabling\n      // binding (which needs to happen at the point the user finishes moving\n      // the point).\n      const { startBindingElement, endBindingElement } = linearElementEditor;\n      if (isBindingEnabled(appState) && isBindingElement(element)) {\n        bindOrUnbindLinearElement(\n          element,\n          startBindingElement,\n          endBindingElement,\n        );\n      }\n    }\n\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    const targetPoint =\n      clickedPointIndex > -1 &&\n      rotate(\n        element.x + element.points[clickedPointIndex][0],\n        element.y + element.points[clickedPointIndex][1],\n        cx,\n        cy,\n        element.angle,\n      );\n\n    const nextSelectedPointsIndices =\n      clickedPointIndex > -1 || event.shiftKey\n        ? event.shiftKey ||\n          linearElementEditor.selectedPointsIndices?.includes(clickedPointIndex)\n          ? normalizeSelectedPoints([\n              ...(linearElementEditor.selectedPointsIndices || []),\n              clickedPointIndex,\n            ])\n          : [clickedPointIndex]\n        : null;\n    ret.linearElementEditor = {\n      ...linearElementEditor,\n      pointerDownState: {\n        prevSelectedPointsIndices: linearElementEditor.selectedPointsIndices,\n        lastClickedPoint: clickedPointIndex,\n        origin: { x: scenePointer.x, y: scenePointer.y },\n        segmentMidpoint: {\n          value: segmentMidpoint,\n          index: segmentMidpointIndex,\n          added: false,\n        },\n      },\n      selectedPointsIndices: nextSelectedPointsIndices,\n      pointerOffset: targetPoint\n        ? {\n            x: scenePointer.x - targetPoint[0],\n            y: scenePointer.y - targetPoint[1],\n          }\n        : { x: 0, y: 0 },\n    };\n\n    return ret;\n  }\n\n  static arePointsEqual(point1: Point | null, point2: Point | null) {\n    if (!point1 && !point2) {\n      return true;\n    }\n    if (!point1 || !point2) {\n      return false;\n    }\n    return arePointsEqual(point1, point2);\n  }\n\n  static handlePointerMove(\n    event: React.PointerEvent<HTMLCanvasElement>,\n    scenePointerX: number,\n    scenePointerY: number,\n    appState: AppState,\n  ): LinearElementEditor | null {\n    if (!appState.editingLinearElement) {\n      return null;\n    }\n    const { elementId, lastUncommittedPoint } = appState.editingLinearElement;\n    const element = LinearElementEditor.getElement(elementId);\n    if (!element) {\n      return appState.editingLinearElement;\n    }\n\n    const { points } = element;\n    const lastPoint = points[points.length - 1];\n\n    if (!event.altKey) {\n      if (lastPoint === lastUncommittedPoint) {\n        LinearElementEditor.deletePoints(element, [points.length - 1]);\n      }\n      return {\n        ...appState.editingLinearElement,\n        lastUncommittedPoint: null,\n      };\n    }\n\n    let newPoint: Point;\n\n    if (shouldRotateWithDiscreteAngle(event) && points.length >= 2) {\n      const lastCommittedPoint = points[points.length - 2];\n\n      const [width, height] = LinearElementEditor._getShiftLockedDelta(\n        element,\n        lastCommittedPoint,\n        [scenePointerX, scenePointerY],\n        appState.gridSize,\n      );\n\n      newPoint = [\n        width + lastCommittedPoint[0],\n        height + lastCommittedPoint[1],\n      ];\n    } else {\n      newPoint = LinearElementEditor.createPointAt(\n        element,\n        scenePointerX - appState.editingLinearElement.pointerOffset.x,\n        scenePointerY - appState.editingLinearElement.pointerOffset.y,\n        appState.gridSize,\n      );\n    }\n\n    if (lastPoint === lastUncommittedPoint) {\n      LinearElementEditor.movePoints(element, [\n        {\n          index: element.points.length - 1,\n          point: newPoint,\n        },\n      ]);\n    } else {\n      LinearElementEditor.addPoints(element, appState, [{ point: newPoint }]);\n    }\n    return {\n      ...appState.editingLinearElement,\n      lastUncommittedPoint: element.points[element.points.length - 1],\n    };\n  }\n\n  /** scene coords */\n  static getPointGlobalCoordinates(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    point: Point,\n  ) {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n\n    let { x, y } = element;\n    [x, y] = rotate(x + point[0], y + point[1], cx, cy, element.angle);\n    return [x, y] as const;\n  }\n\n  /** scene coords */\n  static getPointsGlobalCoordinates(\n    element: NonDeleted<ExcalidrawLinearElement>,\n  ): Point[] {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    return element.points.map((point) => {\n      let { x, y } = element;\n      [x, y] = rotate(x + point[0], y + point[1], cx, cy, element.angle);\n      return [x, y] as const;\n    });\n  }\n\n  static getPointAtIndexGlobalCoordinates(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    indexMaybeFromEnd: number, // -1 for last element\n  ): Point {\n    const index =\n      indexMaybeFromEnd < 0\n        ? element.points.length + indexMaybeFromEnd\n        : indexMaybeFromEnd;\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n\n    const point = element.points[index];\n    const { x, y } = element;\n    return point\n      ? rotate(x + point[0], y + point[1], cx, cy, element.angle)\n      : rotate(x, y, cx, cy, element.angle);\n  }\n\n  static pointFromAbsoluteCoords(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    absoluteCoords: Point,\n  ): Point {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    const [x, y] = rotate(\n      absoluteCoords[0],\n      absoluteCoords[1],\n      cx,\n      cy,\n      -element.angle,\n    );\n    return [x - element.x, y - element.y];\n  }\n\n  static getPointIndexUnderCursor(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    zoom: AppState[\"zoom\"],\n    x: number,\n    y: number,\n  ) {\n    const pointHandles =\n      LinearElementEditor.getPointsGlobalCoordinates(element);\n    let idx = pointHandles.length;\n    // loop from right to left because points on the right are rendered over\n    // points on the left, thus should take precedence when clicking, if they\n    // overlap\n    while (--idx > -1) {\n      const point = pointHandles[idx];\n      if (\n        distance2d(x, y, point[0], point[1]) * zoom.value <\n        // +1px to account for outline stroke\n        LinearElementEditor.POINT_HANDLE_SIZE + 1\n      ) {\n        return idx;\n      }\n    }\n    return -1;\n  }\n\n  static createPointAt(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    scenePointerX: number,\n    scenePointerY: number,\n    gridSize: number | null,\n  ): Point {\n    const pointerOnGrid = getGridPoint(scenePointerX, scenePointerY, gridSize);\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    const [rotatedX, rotatedY] = rotate(\n      pointerOnGrid[0],\n      pointerOnGrid[1],\n      cx,\n      cy,\n      -element.angle,\n    );\n\n    return [rotatedX - element.x, rotatedY - element.y];\n  }\n\n  /**\n   * Normalizes line points so that the start point is at [0,0]. This is\n   * expected in various parts of the codebase. Also returns new x/y to account\n   * for the potential normalization.\n   */\n  static getNormalizedPoints(element: ExcalidrawLinearElement) {\n    const { points } = element;\n\n    const offsetX = points[0][0];\n    const offsetY = points[0][1];\n\n    return {\n      points: points.map((point, _idx) => {\n        return [point[0] - offsetX, point[1] - offsetY] as const;\n      }),\n      x: element.x + offsetX,\n      y: element.y + offsetY,\n    };\n  }\n\n  // element-mutating methods\n  // ---------------------------------------------------------------------------\n\n  static normalizePoints(element: NonDeleted<ExcalidrawLinearElement>) {\n    mutateElement(element, LinearElementEditor.getNormalizedPoints(element));\n  }\n\n  static duplicateSelectedPoints(appState: AppState) {\n    if (!appState.editingLinearElement) {\n      return false;\n    }\n\n    const { selectedPointsIndices, elementId } = appState.editingLinearElement;\n\n    const element = LinearElementEditor.getElement(elementId);\n\n    if (!element || selectedPointsIndices === null) {\n      return false;\n    }\n\n    const { points } = element;\n\n    const nextSelectedIndices: number[] = [];\n\n    let pointAddedToEnd = false;\n    let indexCursor = -1;\n    const nextPoints = points.reduce((acc: Point[], point, index) => {\n      ++indexCursor;\n      acc.push(point);\n\n      const isSelected = selectedPointsIndices.includes(index);\n      if (isSelected) {\n        const nextPoint = points[index + 1];\n\n        if (!nextPoint) {\n          pointAddedToEnd = true;\n        }\n        acc.push(\n          nextPoint\n            ? [(point[0] + nextPoint[0]) / 2, (point[1] + nextPoint[1]) / 2]\n            : [point[0], point[1]],\n        );\n\n        nextSelectedIndices.push(indexCursor + 1);\n        ++indexCursor;\n      }\n\n      return acc;\n    }, []);\n\n    mutateElement(element, { points: nextPoints });\n\n    // temp hack to ensure the line doesn't move when adding point to the end,\n    // potentially expanding the bounding box\n    if (pointAddedToEnd) {\n      const lastPoint = element.points[element.points.length - 1];\n      LinearElementEditor.movePoints(element, [\n        {\n          index: element.points.length - 1,\n          point: [lastPoint[0] + 30, lastPoint[1] + 30],\n        },\n      ]);\n    }\n\n    return {\n      appState: {\n        ...appState,\n        editingLinearElement: {\n          ...appState.editingLinearElement,\n          selectedPointsIndices: nextSelectedIndices,\n        },\n      },\n    };\n  }\n\n  static deletePoints(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    pointIndices: readonly number[],\n  ) {\n    let offsetX = 0;\n    let offsetY = 0;\n\n    const isDeletingOriginPoint = pointIndices.includes(0);\n\n    // if deleting first point, make the next to be [0,0] and recalculate\n    // positions of the rest with respect to it\n    if (isDeletingOriginPoint) {\n      const firstNonDeletedPoint = element.points.find((point, idx) => {\n        return !pointIndices.includes(idx);\n      });\n      if (firstNonDeletedPoint) {\n        offsetX = firstNonDeletedPoint[0];\n        offsetY = firstNonDeletedPoint[1];\n      }\n    }\n\n    const nextPoints = element.points.reduce((acc: Point[], point, idx) => {\n      if (!pointIndices.includes(idx)) {\n        acc.push(\n          !acc.length ? [0, 0] : [point[0] - offsetX, point[1] - offsetY],\n        );\n      }\n      return acc;\n    }, []);\n\n    LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n  }\n\n  static addPoints(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    appState: AppState,\n    targetPoints: { point: Point }[],\n  ) {\n    const offsetX = 0;\n    const offsetY = 0;\n\n    const nextPoints = [...element.points, ...targetPoints.map((x) => x.point)];\n    LinearElementEditor._updatePoints(element, nextPoints, offsetX, offsetY);\n  }\n\n  static movePoints(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    targetPoints: { index: number; point: Point; isDragging?: boolean }[],\n    otherUpdates?: { startBinding?: PointBinding; endBinding?: PointBinding },\n  ) {\n    const { points } = element;\n\n    // in case we're moving start point, instead of modifying its position\n    // which would break the invariant of it being at [0,0], we move\n    // all the other points in the opposite direction by delta to\n    // offset it. We do the same with actual element.x/y position, so\n    // this hacks are completely transparent to the user.\n    let offsetX = 0;\n    let offsetY = 0;\n\n    const selectedOriginPoint = targetPoints.find(({ index }) => index === 0);\n\n    if (selectedOriginPoint) {\n      offsetX =\n        selectedOriginPoint.point[0] + points[selectedOriginPoint.index][0];\n      offsetY =\n        selectedOriginPoint.point[1] + points[selectedOriginPoint.index][1];\n    }\n\n    const nextPoints = points.map((point, idx) => {\n      const selectedPointData = targetPoints.find((p) => p.index === idx);\n      if (selectedPointData) {\n        if (selectedOriginPoint) {\n          return point;\n        }\n\n        const deltaX =\n          selectedPointData.point[0] - points[selectedPointData.index][0];\n        const deltaY =\n          selectedPointData.point[1] - points[selectedPointData.index][1];\n\n        return [point[0] + deltaX, point[1] + deltaY] as const;\n      }\n      return offsetX || offsetY\n        ? ([point[0] - offsetX, point[1] - offsetY] as const)\n        : point;\n    });\n\n    LinearElementEditor._updatePoints(\n      element,\n      nextPoints,\n      offsetX,\n      offsetY,\n      otherUpdates,\n    );\n  }\n\n  static shouldAddMidpoint(\n    linearElementEditor: LinearElementEditor,\n    pointerCoords: PointerCoords,\n    appState: AppState,\n  ) {\n    const element = LinearElementEditor.getElement(\n      linearElementEditor.elementId,\n    );\n\n    if (!element) {\n      return false;\n    }\n\n    const { segmentMidpoint } = linearElementEditor.pointerDownState;\n\n    if (\n      segmentMidpoint.added ||\n      segmentMidpoint.value === null ||\n      segmentMidpoint.index === null ||\n      linearElementEditor.pointerDownState.origin === null\n    ) {\n      return false;\n    }\n\n    const origin = linearElementEditor.pointerDownState.origin!;\n    const dist = distance2d(\n      origin.x,\n      origin.y,\n      pointerCoords.x,\n      pointerCoords.y,\n    );\n    if (\n      !appState.editingLinearElement &&\n      dist < DRAGGING_THRESHOLD / appState.zoom.value\n    ) {\n      return false;\n    }\n    return true;\n  }\n\n  static addMidpoint(\n    linearElementEditor: LinearElementEditor,\n    pointerCoords: PointerCoords,\n    appState: AppState,\n  ) {\n    const element = LinearElementEditor.getElement(\n      linearElementEditor.elementId,\n    );\n    if (!element) {\n      return;\n    }\n    const { segmentMidpoint } = linearElementEditor.pointerDownState;\n    const ret: {\n      pointerDownState: LinearElementEditor[\"pointerDownState\"];\n      selectedPointsIndices: LinearElementEditor[\"selectedPointsIndices\"];\n    } = {\n      pointerDownState: linearElementEditor.pointerDownState,\n      selectedPointsIndices: linearElementEditor.selectedPointsIndices,\n    };\n\n    const midpoint = LinearElementEditor.createPointAt(\n      element,\n      pointerCoords.x,\n      pointerCoords.y,\n      appState.gridSize,\n    );\n    const points = [\n      ...element.points.slice(0, segmentMidpoint.index!),\n      midpoint,\n      ...element.points.slice(segmentMidpoint.index!),\n    ];\n\n    mutateElement(element, {\n      points,\n    });\n\n    ret.pointerDownState = {\n      ...linearElementEditor.pointerDownState,\n      segmentMidpoint: {\n        ...linearElementEditor.pointerDownState.segmentMidpoint,\n        added: true,\n      },\n      lastClickedPoint: segmentMidpoint.index!,\n    };\n    ret.selectedPointsIndices = [segmentMidpoint.index!];\n    return ret;\n  }\n\n  private static _updatePoints(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    nextPoints: readonly Point[],\n    offsetX: number,\n    offsetY: number,\n    otherUpdates?: { startBinding?: PointBinding; endBinding?: PointBinding },\n  ) {\n    const nextCoords = getElementPointsCoords(element, nextPoints);\n    const prevCoords = getElementPointsCoords(element, element.points);\n    const nextCenterX = (nextCoords[0] + nextCoords[2]) / 2;\n    const nextCenterY = (nextCoords[1] + nextCoords[3]) / 2;\n    const prevCenterX = (prevCoords[0] + prevCoords[2]) / 2;\n    const prevCenterY = (prevCoords[1] + prevCoords[3]) / 2;\n    const dX = prevCenterX - nextCenterX;\n    const dY = prevCenterY - nextCenterY;\n    const rotated = rotate(offsetX, offsetY, dX, dY, element.angle);\n    mutateElement(element, {\n      ...otherUpdates,\n      points: nextPoints,\n      x: element.x + rotated[0],\n      y: element.y + rotated[1],\n    });\n  }\n\n  private static _getShiftLockedDelta(\n    element: NonDeleted<ExcalidrawLinearElement>,\n    referencePoint: Point,\n    scenePointer: Point,\n    gridSize: number | null,\n  ) {\n    const referencePointCoords = LinearElementEditor.getPointGlobalCoordinates(\n      element,\n      referencePoint,\n    );\n\n    const [gridX, gridY] = getGridPoint(\n      scenePointer[0],\n      scenePointer[1],\n      gridSize,\n    );\n\n    const { width, height } = getLockedLinearCursorAlignSize(\n      referencePointCoords[0],\n      referencePointCoords[1],\n      gridX,\n      gridY,\n    );\n\n    return rotatePoint([width, height], [0, 0], -element.angle);\n  }\n\n  static getBoundTextElementPosition = (\n    element: ExcalidrawLinearElement,\n    boundTextElement: ExcalidrawTextElementWithContainer,\n  ): { x: number; y: number } => {\n    const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n    if (points.length < 2) {\n      mutateElement(boundTextElement, { isDeleted: true });\n    }\n    let x = 0;\n    let y = 0;\n    if (element.points.length % 2 === 1) {\n      const index = Math.floor(element.points.length / 2);\n      const midPoint = LinearElementEditor.getPointGlobalCoordinates(\n        element,\n        element.points[index],\n      );\n      x = midPoint[0] - boundTextElement.width / 2;\n      y = midPoint[1] - boundTextElement.height / 2;\n    } else {\n      const index = element.points.length / 2 - 1;\n\n      let midSegmentMidpoint = editorMidPointsCache.points[index];\n      if (element.points.length === 2) {\n        midSegmentMidpoint = centerPoint(points[0], points[1]);\n      }\n      if (\n        !midSegmentMidpoint ||\n        editorMidPointsCache.version !== element.version\n      ) {\n        midSegmentMidpoint = LinearElementEditor.getSegmentMidPoint(\n          element,\n          points[index],\n          points[index + 1],\n          index + 1,\n        );\n      }\n      x = midSegmentMidpoint[0] - boundTextElement.width / 2;\n      y = midSegmentMidpoint[1] - boundTextElement.height / 2;\n    }\n    return { x, y };\n  };\n\n  static getMinMaxXYWithBoundText = (\n    element: ExcalidrawLinearElement,\n    elementBounds: [number, number, number, number],\n    boundTextElement: ExcalidrawTextElementWithContainer,\n  ): [number, number, number, number, number, number] => {\n    let [x1, y1, x2, y2] = elementBounds;\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    const { x: boundTextX1, y: boundTextY1 } =\n      LinearElementEditor.getBoundTextElementPosition(\n        element,\n        boundTextElement,\n      );\n    const boundTextX2 = boundTextX1 + boundTextElement.width;\n    const boundTextY2 = boundTextY1 + boundTextElement.height;\n\n    const topLeftRotatedPoint = rotatePoint([x1, y1], [cx, cy], element.angle);\n    const topRightRotatedPoint = rotatePoint([x2, y1], [cx, cy], element.angle);\n\n    const counterRotateBoundTextTopLeft = rotatePoint(\n      [boundTextX1, boundTextY1],\n\n      [cx, cy],\n\n      -element.angle,\n    );\n    const counterRotateBoundTextTopRight = rotatePoint(\n      [boundTextX2, boundTextY1],\n\n      [cx, cy],\n\n      -element.angle,\n    );\n    const counterRotateBoundTextBottomLeft = rotatePoint(\n      [boundTextX1, boundTextY2],\n\n      [cx, cy],\n\n      -element.angle,\n    );\n    const counterRotateBoundTextBottomRight = rotatePoint(\n      [boundTextX2, boundTextY2],\n\n      [cx, cy],\n\n      -element.angle,\n    );\n\n    if (\n      topLeftRotatedPoint[0] < topRightRotatedPoint[0] &&\n      topLeftRotatedPoint[1] >= topRightRotatedPoint[1]\n    ) {\n      x1 = Math.min(x1, counterRotateBoundTextBottomLeft[0]);\n      x2 = Math.max(\n        x2,\n        Math.max(\n          counterRotateBoundTextTopRight[0],\n          counterRotateBoundTextBottomRight[0],\n        ),\n      );\n      y1 = Math.min(y1, counterRotateBoundTextTopLeft[1]);\n\n      y2 = Math.max(y2, counterRotateBoundTextBottomRight[1]);\n    } else if (\n      topLeftRotatedPoint[0] >= topRightRotatedPoint[0] &&\n      topLeftRotatedPoint[1] > topRightRotatedPoint[1]\n    ) {\n      x1 = Math.min(x1, counterRotateBoundTextBottomRight[0]);\n      x2 = Math.max(\n        x2,\n        Math.max(\n          counterRotateBoundTextTopLeft[0],\n          counterRotateBoundTextTopRight[0],\n        ),\n      );\n      y1 = Math.min(y1, counterRotateBoundTextBottomLeft[1]);\n\n      y2 = Math.max(y2, counterRotateBoundTextTopRight[1]);\n    } else if (topLeftRotatedPoint[0] >= topRightRotatedPoint[0]) {\n      x1 = Math.min(x1, counterRotateBoundTextTopRight[0]);\n      x2 = Math.max(x2, counterRotateBoundTextBottomLeft[0]);\n      y1 = Math.min(y1, counterRotateBoundTextBottomRight[1]);\n\n      y2 = Math.max(y2, counterRotateBoundTextTopLeft[1]);\n    } else if (topLeftRotatedPoint[1] <= topRightRotatedPoint[1]) {\n      x1 = Math.min(\n        x1,\n        Math.min(\n          counterRotateBoundTextTopRight[0],\n          counterRotateBoundTextTopLeft[0],\n        ),\n      );\n\n      x2 = Math.max(x2, counterRotateBoundTextBottomRight[0]);\n      y1 = Math.min(y1, counterRotateBoundTextTopRight[1]);\n      y2 = Math.max(y2, counterRotateBoundTextBottomLeft[1]);\n    }\n\n    return [x1, y1, x2, y2, cx, cy];\n  };\n\n  static getElementAbsoluteCoords = (\n    element: ExcalidrawLinearElement,\n    includeBoundText: boolean = false,\n  ): [number, number, number, number, number, number] => {\n    let coords: [number, number, number, number, number, number];\n    let x1;\n    let y1;\n    let x2;\n    let y2;\n    if (element.points.length < 2 || !getShapeForElement(element)) {\n      // XXX this is just a poor estimate and not very useful\n      const { minX, minY, maxX, maxY } = element.points.reduce(\n        (limits, [x, y]) => {\n          limits.minY = Math.min(limits.minY, y);\n          limits.minX = Math.min(limits.minX, x);\n\n          limits.maxX = Math.max(limits.maxX, x);\n          limits.maxY = Math.max(limits.maxY, y);\n\n          return limits;\n        },\n        { minX: Infinity, minY: Infinity, maxX: -Infinity, maxY: -Infinity },\n      );\n      x1 = minX + element.x;\n      y1 = minY + element.y;\n      x2 = maxX + element.x;\n      y2 = maxY + element.y;\n    } else {\n      const shape = getShapeForElement(element)!;\n\n      // first element is always the curve\n      const ops = getCurvePathOps(shape[0]);\n\n      const [minX, minY, maxX, maxY] = getMinMaxXYFromCurvePathOps(ops);\n      x1 = minX + element.x;\n      y1 = minY + element.y;\n      x2 = maxX + element.x;\n      y2 = maxY + element.y;\n    }\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    coords = [x1, y1, x2, y2, cx, cy];\n\n    if (!includeBoundText) {\n      return coords;\n    }\n    const boundTextElement = getBoundTextElement(element);\n    if (boundTextElement) {\n      coords = LinearElementEditor.getMinMaxXYWithBoundText(\n        element,\n        [x1, y1, x2, y2],\n        boundTextElement,\n      );\n    }\n\n    return coords;\n  };\n}\n\nconst normalizeSelectedPoints = (\n  points: (number | null)[],\n): number[] | null => {\n  let nextPoints = [\n    ...new Set(points.filter((p) => p !== null && p !== -1)),\n  ] as number[];\n  nextPoints = nextPoints.sort((a, b) => a - b);\n  return nextPoints.length ? nextPoints : null;\n};\n","import { ExcalidrawElement } from \"./types\";\nimport { invalidateShapeForElement } from \"../renderer/renderElement\";\nimport Scene from \"../scene/Scene\";\nimport { getSizeFromPoints } from \"../points\";\nimport { randomInteger } from \"../random\";\nimport { Point } from \"../types\";\nimport { getUpdatedTimestamp } from \"../utils\";\nimport { Mutable } from \"../utility-types\";\n\ntype ElementUpdate<TElement extends ExcalidrawElement> = Omit<\n  Partial<TElement>,\n  \"id\" | \"version\" | \"versionNonce\"\n>;\n\n// This function tracks updates of text elements for the purposes for collaboration.\n// The version is used to compare updates when more than one user is working in\n// the same drawing. Note: this will trigger the component to update. Make sure you\n// are calling it either from a React event handler or within unstable_batchedUpdates().\nexport const mutateElement = <TElement extends Mutable<ExcalidrawElement>>(\n  element: TElement,\n  updates: ElementUpdate<TElement>,\n  informMutation = true,\n): TElement => {\n  let didChange = false;\n\n  // casting to any because can't use `in` operator\n  // (see https://github.com/microsoft/TypeScript/issues/21732)\n  const { points, fileId } = updates as any;\n\n  if (typeof points !== \"undefined\") {\n    updates = { ...getSizeFromPoints(points), ...updates };\n  }\n\n  for (const key in updates) {\n    const value = (updates as any)[key];\n    if (typeof value !== \"undefined\") {\n      if (\n        (element as any)[key] === value &&\n        // if object, always update because its attrs could have changed\n        // (except for specific keys we handle below)\n        (typeof value !== \"object\" ||\n          value === null ||\n          key === \"groupIds\" ||\n          key === \"scale\")\n      ) {\n        continue;\n      }\n\n      if (key === \"scale\") {\n        const prevScale = (element as any)[key];\n        const nextScale = value;\n        if (prevScale[0] === nextScale[0] && prevScale[1] === nextScale[1]) {\n          continue;\n        }\n      } else if (key === \"points\") {\n        const prevPoints = (element as any)[key];\n        const nextPoints = value;\n        if (prevPoints.length === nextPoints.length) {\n          let didChangePoints = false;\n          let index = prevPoints.length;\n          while (--index) {\n            const prevPoint: Point = prevPoints[index];\n            const nextPoint: Point = nextPoints[index];\n            if (\n              prevPoint[0] !== nextPoint[0] ||\n              prevPoint[1] !== nextPoint[1]\n            ) {\n              didChangePoints = true;\n              break;\n            }\n          }\n          if (!didChangePoints) {\n            continue;\n          }\n        }\n      }\n\n      (element as any)[key] = value;\n      didChange = true;\n    }\n  }\n  if (!didChange) {\n    return element;\n  }\n\n  if (\n    typeof updates.height !== \"undefined\" ||\n    typeof updates.width !== \"undefined\" ||\n    typeof fileId != \"undefined\" ||\n    typeof points !== \"undefined\"\n  ) {\n    invalidateShapeForElement(element);\n  }\n\n  element.version++;\n  element.versionNonce = randomInteger();\n  element.updated = getUpdatedTimestamp();\n\n  if (informMutation) {\n    Scene.getScene(element)?.informMutation();\n  }\n\n  return element;\n};\n\nexport const newElementWith = <TElement extends ExcalidrawElement>(\n  element: TElement,\n  updates: ElementUpdate<TElement>,\n): TElement => {\n  let didChange = false;\n  for (const key in updates) {\n    const value = (updates as any)[key];\n    if (typeof value !== \"undefined\") {\n      if (\n        (element as any)[key] === value &&\n        // if object, always update because its attrs could have changed\n        (typeof value !== \"object\" || value === null)\n      ) {\n        continue;\n      }\n      didChange = true;\n    }\n  }\n\n  if (!didChange) {\n    return element;\n  }\n\n  return {\n    ...element,\n    ...updates,\n    updated: getUpdatedTimestamp(),\n    version: element.version + 1,\n    versionNonce: randomInteger(),\n  };\n};\n\n/**\n * Mutates element, bumping `version`, `versionNonce`, and `updated`.\n *\n * NOTE: does not trigger re-render.\n */\nexport const bumpVersion = (\n  element: Mutable<ExcalidrawElement>,\n  version?: ExcalidrawElement[\"version\"],\n) => {\n  element.version = (version ?? element.version) + 1;\n  element.versionNonce = randomInteger();\n  element.updated = getUpdatedTimestamp();\n  return element;\n};\n","import {\n  ExcalidrawElement,\n  ExcalidrawImageElement,\n  ExcalidrawTextElement,\n  ExcalidrawLinearElement,\n  ExcalidrawGenericElement,\n  NonDeleted,\n  TextAlign,\n  GroupId,\n  VerticalAlign,\n  Arrowhead,\n  ExcalidrawFreeDrawElement,\n  FontFamilyValues,\n  ExcalidrawTextContainer,\n} from \"../element/types\";\nimport { getFontString, getUpdatedTimestamp, isTestEnv } from \"../utils\";\nimport { randomInteger, randomId } from \"../random\";\nimport { mutateElement, newElementWith } from \"./mutateElement\";\nimport { getNewGroupIdsForDuplication } from \"../groups\";\nimport { AppState } from \"../types\";\nimport { getElementAbsoluteCoords } from \".\";\nimport { adjustXYWithRotation } from \"../math\";\nimport { getResizedElementAbsoluteCoords } from \"./bounds\";\nimport {\n  getBoundTextElementOffset,\n  getContainerDims,\n  getContainerElement,\n  measureText,\n  normalizeText,\n  wrapText,\n  getMaxContainerWidth,\n} from \"./textElement\";\nimport { VERTICAL_ALIGN } from \"../constants\";\nimport { isArrowElement } from \"./typeChecks\";\nimport { MarkOptional, Merge, Mutable } from \"../utility-types\";\n\ntype ElementConstructorOpts = MarkOptional<\n  Omit<ExcalidrawGenericElement, \"id\" | \"type\" | \"isDeleted\" | \"updated\">,\n  | \"width\"\n  | \"height\"\n  | \"angle\"\n  | \"groupIds\"\n  | \"boundElements\"\n  | \"seed\"\n  | \"version\"\n  | \"versionNonce\"\n  | \"link\"\n>;\n\nconst _newElementBase = <T extends ExcalidrawElement>(\n  type: T[\"type\"],\n  {\n    x,\n    y,\n    strokeColor,\n    backgroundColor,\n    fillStyle,\n    strokeWidth,\n    strokeStyle,\n    roughness,\n    opacity,\n    width = 0,\n    height = 0,\n    angle = 0,\n    groupIds = [],\n    roundness = null,\n    boundElements = null,\n    link = null,\n    locked,\n    ...rest\n  }: ElementConstructorOpts & Omit<Partial<ExcalidrawGenericElement>, \"type\">,\n) => {\n  // assign type to guard against excess properties\n  const element: Merge<ExcalidrawGenericElement, { type: T[\"type\"] }> = {\n    id: rest.id || randomId(),\n    type,\n    x,\n    y,\n    width,\n    height,\n    angle,\n    strokeColor,\n    backgroundColor,\n    fillStyle,\n    strokeWidth,\n    strokeStyle,\n    roughness,\n    opacity,\n    groupIds,\n    roundness,\n    seed: rest.seed ?? randomInteger(),\n    version: rest.version || 1,\n    versionNonce: rest.versionNonce ?? 0,\n    isDeleted: false as false,\n    boundElements,\n    updated: getUpdatedTimestamp(),\n    link,\n    locked,\n  };\n  return element;\n};\n\nexport const newElement = (\n  opts: {\n    type: ExcalidrawGenericElement[\"type\"];\n  } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawGenericElement> =>\n  _newElementBase<ExcalidrawGenericElement>(opts.type, opts);\n\n/** computes element x/y offset based on textAlign/verticalAlign */\nconst getTextElementPositionOffsets = (\n  opts: {\n    textAlign: ExcalidrawTextElement[\"textAlign\"];\n    verticalAlign: ExcalidrawTextElement[\"verticalAlign\"];\n  },\n  metrics: {\n    width: number;\n    height: number;\n  },\n) => {\n  return {\n    x:\n      opts.textAlign === \"center\"\n        ? metrics.width / 2\n        : opts.textAlign === \"right\"\n        ? metrics.width\n        : 0,\n    y: opts.verticalAlign === \"middle\" ? metrics.height / 2 : 0,\n  };\n};\n\nexport const newTextElement = (\n  opts: {\n    text: string;\n    fontSize: number;\n    fontFamily: FontFamilyValues;\n    textAlign: TextAlign;\n    verticalAlign: VerticalAlign;\n    containerId?: ExcalidrawTextContainer[\"id\"];\n  } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawTextElement> => {\n  const text = normalizeText(opts.text);\n  const metrics = measureText(text, getFontString(opts));\n  const offsets = getTextElementPositionOffsets(opts, metrics);\n  const textElement = newElementWith(\n    {\n      ..._newElementBase<ExcalidrawTextElement>(\"text\", opts),\n      text,\n      fontSize: opts.fontSize,\n      fontFamily: opts.fontFamily,\n      textAlign: opts.textAlign,\n      verticalAlign: opts.verticalAlign,\n      x: opts.x - offsets.x,\n      y: opts.y - offsets.y,\n      width: metrics.width,\n      height: metrics.height,\n      containerId: opts.containerId || null,\n      originalText: text,\n    },\n    {},\n  );\n  return textElement;\n};\n\nconst getAdjustedDimensions = (\n  element: ExcalidrawTextElement,\n  nextText: string,\n): {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n} => {\n  const container = getContainerElement(element);\n\n  const { width: nextWidth, height: nextHeight } = measureText(\n    nextText,\n    getFontString(element),\n  );\n  const { textAlign, verticalAlign } = element;\n  let x: number;\n  let y: number;\n  if (\n    textAlign === \"center\" &&\n    verticalAlign === VERTICAL_ALIGN.MIDDLE &&\n    !element.containerId\n  ) {\n    const prevMetrics = measureText(element.text, getFontString(element));\n    const offsets = getTextElementPositionOffsets(element, {\n      width: nextWidth - prevMetrics.width,\n      height: nextHeight - prevMetrics.height,\n    });\n\n    x = element.x - offsets.x;\n    y = element.y - offsets.y;\n  } else {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n    const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(\n      element,\n      nextWidth,\n      nextHeight,\n      false,\n    );\n    const deltaX1 = (x1 - nextX1) / 2;\n    const deltaY1 = (y1 - nextY1) / 2;\n    const deltaX2 = (x2 - nextX2) / 2;\n    const deltaY2 = (y2 - nextY2) / 2;\n\n    [x, y] = adjustXYWithRotation(\n      {\n        s: true,\n        e: textAlign === \"center\" || textAlign === \"left\",\n        w: textAlign === \"center\" || textAlign === \"right\",\n      },\n      element.x,\n      element.y,\n      element.angle,\n      deltaX1,\n      deltaY1,\n      deltaX2,\n      deltaY2,\n    );\n  }\n\n  // make sure container dimensions are set properly when\n  // text editor overflows beyond viewport dimensions\n  if (container) {\n    const boundTextElementPadding = getBoundTextElementOffset(element);\n\n    const containerDims = getContainerDims(container);\n    let height = containerDims.height;\n    let width = containerDims.width;\n    if (nextHeight > height - boundTextElementPadding * 2) {\n      height = nextHeight + boundTextElementPadding * 2;\n    }\n    if (nextWidth > width - boundTextElementPadding * 2) {\n      width = nextWidth + boundTextElementPadding * 2;\n    }\n    if (\n      !isArrowElement(container) &&\n      (height !== containerDims.height || width !== containerDims.width)\n    ) {\n      mutateElement(container, { height, width });\n    }\n  }\n  return {\n    width: nextWidth,\n    height: nextHeight,\n    x: Number.isFinite(x) ? x : element.x,\n    y: Number.isFinite(y) ? y : element.y,\n  };\n};\n\nexport const refreshTextDimensions = (\n  textElement: ExcalidrawTextElement,\n  text = textElement.text,\n) => {\n  const container = getContainerElement(textElement);\n  if (container) {\n    text = wrapText(\n      text,\n      getFontString(textElement),\n      getMaxContainerWidth(container),\n    );\n  }\n  const dimensions = getAdjustedDimensions(textElement, text);\n  return { text, ...dimensions };\n};\n\nexport const updateTextElement = (\n  textElement: ExcalidrawTextElement,\n  {\n    text,\n    isDeleted,\n    originalText,\n  }: {\n    text: string;\n    isDeleted?: boolean;\n    originalText: string;\n  },\n): ExcalidrawTextElement => {\n  return newElementWith(textElement, {\n    originalText,\n    isDeleted: isDeleted ?? textElement.isDeleted,\n    ...refreshTextDimensions(textElement, originalText),\n  });\n};\n\nexport const newFreeDrawElement = (\n  opts: {\n    type: \"freedraw\";\n    points?: ExcalidrawFreeDrawElement[\"points\"];\n    simulatePressure: boolean;\n  } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawFreeDrawElement> => {\n  return {\n    ..._newElementBase<ExcalidrawFreeDrawElement>(opts.type, opts),\n    points: opts.points || [],\n    pressures: [],\n    simulatePressure: opts.simulatePressure,\n    lastCommittedPoint: null,\n  };\n};\n\nexport const newLinearElement = (\n  opts: {\n    type: ExcalidrawLinearElement[\"type\"];\n    startArrowhead: Arrowhead | null;\n    endArrowhead: Arrowhead | null;\n    points?: ExcalidrawLinearElement[\"points\"];\n  } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawLinearElement> => {\n  return {\n    ..._newElementBase<ExcalidrawLinearElement>(opts.type, opts),\n    points: opts.points || [],\n    lastCommittedPoint: null,\n    startBinding: null,\n    endBinding: null,\n    startArrowhead: opts.startArrowhead,\n    endArrowhead: opts.endArrowhead,\n  };\n};\n\nexport const newImageElement = (\n  opts: {\n    type: ExcalidrawImageElement[\"type\"];\n    status?: ExcalidrawImageElement[\"status\"];\n    fileId?: ExcalidrawImageElement[\"fileId\"];\n    scale?: ExcalidrawImageElement[\"scale\"];\n  } & ElementConstructorOpts,\n): NonDeleted<ExcalidrawImageElement> => {\n  return {\n    ..._newElementBase<ExcalidrawImageElement>(\"image\", opts),\n    // in the future we'll support changing stroke color for some SVG elements,\n    // and `transparent` will likely mean \"use original colors of the image\"\n    strokeColor: \"transparent\",\n    status: opts.status ?? \"pending\",\n    fileId: opts.fileId ?? null,\n    scale: opts.scale ?? [1, 1],\n  };\n};\n\n// Simplified deep clone for the purpose of cloning ExcalidrawElement only\n// (doesn't clone Date, RegExp, Map, Set, Typed arrays etc.)\n//\n// Adapted from https://github.com/lukeed/klona\nexport const deepCopyElement = (val: any, depth: number = 0) => {\n  if (val == null || typeof val !== \"object\") {\n    return val;\n  }\n\n  if (Object.prototype.toString.call(val) === \"[object Object]\") {\n    const tmp =\n      typeof val.constructor === \"function\"\n        ? Object.create(Object.getPrototypeOf(val))\n        : {};\n    for (const key in val) {\n      if (val.hasOwnProperty(key)) {\n        // don't copy non-serializable objects like these caches. They'll be\n        // populated when the element is rendered.\n        if (depth === 0 && (key === \"shape\" || key === \"canvas\")) {\n          continue;\n        }\n        tmp[key] = deepCopyElement(val[key], depth + 1);\n      }\n    }\n    return tmp;\n  }\n\n  if (Array.isArray(val)) {\n    let k = val.length;\n    const arr = new Array(k);\n    while (k--) {\n      arr[k] = deepCopyElement(val[k], depth + 1);\n    }\n    return arr;\n  }\n\n  return val;\n};\n\n/**\n * Duplicate an element, often used in the alt-drag operation.\n * Note that this method has gotten a bit complicated since the\n * introduction of gruoping/ungrouping elements.\n * @param editingGroupId The current group being edited. The new\n *                       element will inherit this group and its\n *                       parents.\n * @param groupIdMapForOperation A Map that maps old group IDs to\n *                               duplicated ones. If you are duplicating\n *                               multiple elements at once, share this map\n *                               amongst all of them\n * @param element Element to duplicate\n * @param overrides Any element properties to override\n */\nexport const duplicateElement = <TElement extends Mutable<ExcalidrawElement>>(\n  editingGroupId: AppState[\"editingGroupId\"],\n  groupIdMapForOperation: Map<GroupId, GroupId>,\n  element: TElement,\n  overrides?: Partial<TElement>,\n): TElement => {\n  let copy: TElement = deepCopyElement(element);\n\n  if (isTestEnv()) {\n    copy.id = `${copy.id}_copy`;\n    // `window.h` may not be defined in some unit tests\n    if (\n      window.h?.app\n        ?.getSceneElementsIncludingDeleted()\n        .find((el) => el.id === copy.id)\n    ) {\n      copy.id += \"_copy\";\n    }\n  } else {\n    copy.id = randomId();\n  }\n  copy.boundElements = null;\n  copy.updated = getUpdatedTimestamp();\n  copy.seed = randomInteger();\n  copy.groupIds = getNewGroupIdsForDuplication(\n    copy.groupIds,\n    editingGroupId,\n    (groupId) => {\n      if (!groupIdMapForOperation.has(groupId)) {\n        groupIdMapForOperation.set(groupId, randomId());\n      }\n      return groupIdMapForOperation.get(groupId)!;\n    },\n  );\n  if (overrides) {\n    copy = Object.assign(copy, overrides);\n  }\n  return copy;\n};\n","import { SHIFT_LOCKING_ANGLE } from \"../constants\";\nimport { rescalePoints } from \"../points\";\n\nimport {\n  rotate,\n  adjustXYWithRotation,\n  centerPoint,\n  rotatePoint,\n} from \"../math\";\nimport {\n  ExcalidrawLinearElement,\n  ExcalidrawTextElement,\n  NonDeletedExcalidrawElement,\n  NonDeleted,\n  ExcalidrawElement,\n  ExcalidrawTextElementWithContainer,\n} from \"./types\";\nimport {\n  getElementAbsoluteCoords,\n  getCommonBounds,\n  getResizedElementAbsoluteCoords,\n  getCommonBoundingBox,\n} from \"./bounds\";\nimport {\n  isArrowElement,\n  isBoundToContainer,\n  isFreeDrawElement,\n  isLinearElement,\n  isTextElement,\n} from \"./typeChecks\";\nimport { mutateElement } from \"./mutateElement\";\nimport { getFontString } from \"../utils\";\nimport { updateBoundElements } from \"./binding\";\nimport {\n  TransformHandleType,\n  MaybeTransformHandleType,\n  TransformHandleDirection,\n} from \"./transformHandles\";\nimport { Point, PointerDownState } from \"../types\";\nimport Scene from \"../scene/Scene\";\nimport {\n  getApproxMinLineHeight,\n  getApproxMinLineWidth,\n  getBoundTextElement,\n  getBoundTextElementId,\n  getContainerElement,\n  handleBindTextResize,\n  getMaxContainerWidth,\n} from \"./textElement\";\n\nexport const normalizeAngle = (angle: number): number => {\n  if (angle >= 2 * Math.PI) {\n    return angle - 2 * Math.PI;\n  }\n  return angle;\n};\n\n// Returns true when transform (resizing/rotation) happened\nexport const transformElements = (\n  pointerDownState: PointerDownState,\n  transformHandleType: MaybeTransformHandleType,\n  selectedElements: readonly NonDeletedExcalidrawElement[],\n  resizeArrowDirection: \"origin\" | \"end\",\n  shouldRotateWithDiscreteAngle: boolean,\n  shouldResizeFromCenter: boolean,\n  shouldMaintainAspectRatio: boolean,\n  pointerX: number,\n  pointerY: number,\n  centerX: number,\n  centerY: number,\n) => {\n  if (selectedElements.length === 1) {\n    const [element] = selectedElements;\n    if (transformHandleType === \"rotation\") {\n      rotateSingleElement(\n        element,\n        pointerX,\n        pointerY,\n        shouldRotateWithDiscreteAngle,\n        pointerDownState.originalElements,\n      );\n      updateBoundElements(element);\n    } else if (\n      isTextElement(element) &&\n      (transformHandleType === \"nw\" ||\n        transformHandleType === \"ne\" ||\n        transformHandleType === \"sw\" ||\n        transformHandleType === \"se\")\n    ) {\n      resizeSingleTextElement(\n        element,\n        transformHandleType,\n        shouldResizeFromCenter,\n        pointerX,\n        pointerY,\n      );\n      updateBoundElements(element);\n    } else if (transformHandleType) {\n      resizeSingleElement(\n        pointerDownState.originalElements,\n        shouldMaintainAspectRatio,\n        element,\n        transformHandleType,\n        shouldResizeFromCenter,\n        pointerX,\n        pointerY,\n      );\n    }\n\n    return true;\n  } else if (selectedElements.length > 1) {\n    if (transformHandleType === \"rotation\") {\n      rotateMultipleElements(\n        pointerDownState,\n        selectedElements,\n        pointerX,\n        pointerY,\n        shouldRotateWithDiscreteAngle,\n        centerX,\n        centerY,\n      );\n      return true;\n    } else if (\n      transformHandleType === \"nw\" ||\n      transformHandleType === \"ne\" ||\n      transformHandleType === \"sw\" ||\n      transformHandleType === \"se\"\n    ) {\n      resizeMultipleElements(\n        pointerDownState,\n        selectedElements,\n        transformHandleType,\n        shouldResizeFromCenter,\n        pointerX,\n        pointerY,\n      );\n      return true;\n    }\n  }\n  return false;\n};\n\nconst rotateSingleElement = (\n  element: NonDeletedExcalidrawElement,\n  pointerX: number,\n  pointerY: number,\n  shouldRotateWithDiscreteAngle: boolean,\n  originalElements: Map<string, NonDeleted<ExcalidrawElement>>,\n) => {\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const cx = (x1 + x2) / 2;\n  const cy = (y1 + y2) / 2;\n  let angle = (5 * Math.PI) / 2 + Math.atan2(pointerY - cy, pointerX - cx);\n  if (shouldRotateWithDiscreteAngle) {\n    angle += SHIFT_LOCKING_ANGLE / 2;\n    angle -= angle % SHIFT_LOCKING_ANGLE;\n  }\n  angle = normalizeAngle(angle);\n  const boundTextElementId = getBoundTextElementId(element);\n\n  mutateElement(element, { angle });\n  if (boundTextElementId) {\n    const textElement =\n      Scene.getScene(element)?.getElement<ExcalidrawTextElementWithContainer>(\n        boundTextElementId,\n      );\n\n    if (textElement && !isArrowElement(element)) {\n      mutateElement(textElement, { angle });\n    }\n  }\n};\n\nconst rescalePointsInElement = (\n  element: NonDeletedExcalidrawElement,\n  width: number,\n  height: number,\n  normalizePoints: boolean,\n) =>\n  isLinearElement(element) || isFreeDrawElement(element)\n    ? {\n        points: rescalePoints(\n          0,\n          width,\n          rescalePoints(1, height, element.points, normalizePoints),\n          normalizePoints,\n        ),\n      }\n    : {};\n\nconst MIN_FONT_SIZE = 1;\n\nconst measureFontSizeFromWidth = (\n  element: NonDeleted<ExcalidrawTextElement>,\n  nextWidth: number,\n): number | null => {\n  // We only use width to scale font on resize\n  let width = element.width;\n\n  const hasContainer = isBoundToContainer(element);\n  if (hasContainer) {\n    const container = getContainerElement(element);\n    if (container) {\n      width = getMaxContainerWidth(container);\n    }\n  }\n  const nextFontSize = element.fontSize * (nextWidth / width);\n  if (nextFontSize < MIN_FONT_SIZE) {\n    return null;\n  }\n\n  return nextFontSize;\n};\n\nconst getSidesForTransformHandle = (\n  transformHandleType: TransformHandleType,\n  shouldResizeFromCenter: boolean,\n) => {\n  return {\n    n:\n      /^(n|ne|nw)$/.test(transformHandleType) ||\n      (shouldResizeFromCenter && /^(s|se|sw)$/.test(transformHandleType)),\n    s:\n      /^(s|se|sw)$/.test(transformHandleType) ||\n      (shouldResizeFromCenter && /^(n|ne|nw)$/.test(transformHandleType)),\n    w:\n      /^(w|nw|sw)$/.test(transformHandleType) ||\n      (shouldResizeFromCenter && /^(e|ne|se)$/.test(transformHandleType)),\n    e:\n      /^(e|ne|se)$/.test(transformHandleType) ||\n      (shouldResizeFromCenter && /^(w|nw|sw)$/.test(transformHandleType)),\n  };\n};\n\nconst resizeSingleTextElement = (\n  element: NonDeleted<ExcalidrawTextElement>,\n  transformHandleType: \"nw\" | \"ne\" | \"sw\" | \"se\",\n  shouldResizeFromCenter: boolean,\n  pointerX: number,\n  pointerY: number,\n) => {\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const cx = (x1 + x2) / 2;\n  const cy = (y1 + y2) / 2;\n  // rotation pointer with reverse angle\n  const [rotatedX, rotatedY] = rotate(\n    pointerX,\n    pointerY,\n    cx,\n    cy,\n    -element.angle,\n  );\n  let scale: number;\n  switch (transformHandleType) {\n    case \"se\":\n      scale = Math.max(\n        (rotatedX - x1) / (x2 - x1),\n        (rotatedY - y1) / (y2 - y1),\n      );\n      break;\n    case \"nw\":\n      scale = Math.max(\n        (x2 - rotatedX) / (x2 - x1),\n        (y2 - rotatedY) / (y2 - y1),\n      );\n      break;\n    case \"ne\":\n      scale = Math.max(\n        (rotatedX - x1) / (x2 - x1),\n        (y2 - rotatedY) / (y2 - y1),\n      );\n      break;\n    case \"sw\":\n      scale = Math.max(\n        (x2 - rotatedX) / (x2 - x1),\n        (rotatedY - y1) / (y2 - y1),\n      );\n      break;\n  }\n  if (scale > 0) {\n    const nextWidth = element.width * scale;\n    const nextHeight = element.height * scale;\n    const nextFontSize = measureFontSizeFromWidth(element, nextWidth);\n    if (nextFontSize === null) {\n      return;\n    }\n    const [nextX1, nextY1, nextX2, nextY2] = getResizedElementAbsoluteCoords(\n      element,\n      nextWidth,\n      nextHeight,\n      false,\n    );\n    const deltaX1 = (x1 - nextX1) / 2;\n    const deltaY1 = (y1 - nextY1) / 2;\n    const deltaX2 = (x2 - nextX2) / 2;\n    const deltaY2 = (y2 - nextY2) / 2;\n    const [nextElementX, nextElementY] = adjustXYWithRotation(\n      getSidesForTransformHandle(transformHandleType, shouldResizeFromCenter),\n      element.x,\n      element.y,\n      element.angle,\n      deltaX1,\n      deltaY1,\n      deltaX2,\n      deltaY2,\n    );\n    mutateElement(element, {\n      fontSize: nextFontSize,\n      width: nextWidth,\n      height: nextHeight,\n      x: nextElementX,\n      y: nextElementY,\n    });\n  }\n};\n\nexport const resizeSingleElement = (\n  originalElements: PointerDownState[\"originalElements\"],\n  shouldMaintainAspectRatio: boolean,\n  element: NonDeletedExcalidrawElement,\n  transformHandleDirection: TransformHandleDirection,\n  shouldResizeFromCenter: boolean,\n  pointerX: number,\n  pointerY: number,\n) => {\n  const stateAtResizeStart = originalElements.get(element.id)!;\n  // Gets bounds corners\n  const [x1, y1, x2, y2] = getResizedElementAbsoluteCoords(\n    stateAtResizeStart,\n    stateAtResizeStart.width,\n    stateAtResizeStart.height,\n    true,\n  );\n  const startTopLeft: Point = [x1, y1];\n  const startBottomRight: Point = [x2, y2];\n  const startCenter: Point = centerPoint(startTopLeft, startBottomRight);\n\n  // Calculate new dimensions based on cursor position\n  const rotatedPointer = rotatePoint(\n    [pointerX, pointerY],\n    startCenter,\n    -stateAtResizeStart.angle,\n  );\n\n  // Get bounds corners rendered on screen\n  const [esx1, esy1, esx2, esy2] = getResizedElementAbsoluteCoords(\n    element,\n    element.width,\n    element.height,\n    true,\n  );\n\n  const boundsCurrentWidth = esx2 - esx1;\n  const boundsCurrentHeight = esy2 - esy1;\n\n  // It's important we set the initial scale value based on the width and height at resize start,\n  // otherwise previous dimensions affected by modifiers will be taken into account.\n  const atStartBoundsWidth = startBottomRight[0] - startTopLeft[0];\n  const atStartBoundsHeight = startBottomRight[1] - startTopLeft[1];\n  let scaleX = atStartBoundsWidth / boundsCurrentWidth;\n  let scaleY = atStartBoundsHeight / boundsCurrentHeight;\n\n  let boundTextFont: { fontSize?: number } = {};\n  const boundTextElement = getBoundTextElement(element);\n\n  if (transformHandleDirection.includes(\"e\")) {\n    scaleX = (rotatedPointer[0] - startTopLeft[0]) / boundsCurrentWidth;\n  }\n  if (transformHandleDirection.includes(\"s\")) {\n    scaleY = (rotatedPointer[1] - startTopLeft[1]) / boundsCurrentHeight;\n  }\n  if (transformHandleDirection.includes(\"w\")) {\n    scaleX = (startBottomRight[0] - rotatedPointer[0]) / boundsCurrentWidth;\n  }\n  if (transformHandleDirection.includes(\"n\")) {\n    scaleY = (startBottomRight[1] - rotatedPointer[1]) / boundsCurrentHeight;\n  }\n\n  // Linear elements dimensions differ from bounds dimensions\n  const eleInitialWidth = stateAtResizeStart.width;\n  const eleInitialHeight = stateAtResizeStart.height;\n  // We have to use dimensions of element on screen, otherwise the scaling of the\n  // dimensions won't match the cursor for linear elements.\n  let eleNewWidth = element.width * scaleX;\n  let eleNewHeight = element.height * scaleY;\n\n  // adjust dimensions for resizing from center\n  if (shouldResizeFromCenter) {\n    eleNewWidth = 2 * eleNewWidth - eleInitialWidth;\n    eleNewHeight = 2 * eleNewHeight - eleInitialHeight;\n  }\n\n  // adjust dimensions to keep sides ratio\n  if (shouldMaintainAspectRatio) {\n    const widthRatio = Math.abs(eleNewWidth) / eleInitialWidth;\n    const heightRatio = Math.abs(eleNewHeight) / eleInitialHeight;\n    if (transformHandleDirection.length === 1) {\n      eleNewHeight *= widthRatio;\n      eleNewWidth *= heightRatio;\n    }\n    if (transformHandleDirection.length === 2) {\n      const ratio = Math.max(widthRatio, heightRatio);\n      eleNewWidth = eleInitialWidth * ratio * Math.sign(eleNewWidth);\n      eleNewHeight = eleInitialHeight * ratio * Math.sign(eleNewHeight);\n    }\n  }\n\n  if (boundTextElement) {\n    const stateOfBoundTextElementAtResize = originalElements.get(\n      boundTextElement.id,\n    ) as typeof boundTextElement | undefined;\n    if (stateOfBoundTextElementAtResize) {\n      boundTextFont = {\n        fontSize: stateOfBoundTextElementAtResize.fontSize,\n      };\n    }\n    if (shouldMaintainAspectRatio) {\n      const updatedElement = {\n        ...element,\n        width: eleNewWidth,\n        height: eleNewHeight,\n      };\n\n      const nextFontSize = measureFontSizeFromWidth(\n        boundTextElement,\n        getMaxContainerWidth(updatedElement),\n      );\n      if (nextFontSize === null) {\n        return;\n      }\n      boundTextFont = {\n        fontSize: nextFontSize,\n      };\n    } else {\n      const minWidth = getApproxMinLineWidth(getFontString(boundTextElement));\n      const minHeight = getApproxMinLineHeight(getFontString(boundTextElement));\n      eleNewWidth = Math.ceil(Math.max(eleNewWidth, minWidth));\n      eleNewHeight = Math.ceil(Math.max(eleNewHeight, minHeight));\n    }\n  }\n\n  const [newBoundsX1, newBoundsY1, newBoundsX2, newBoundsY2] =\n    getResizedElementAbsoluteCoords(\n      stateAtResizeStart,\n      eleNewWidth,\n      eleNewHeight,\n      true,\n    );\n  const newBoundsWidth = newBoundsX2 - newBoundsX1;\n  const newBoundsHeight = newBoundsY2 - newBoundsY1;\n\n  // Calculate new topLeft based on fixed corner during resize\n  let newTopLeft = [...startTopLeft] as [number, number];\n  if ([\"n\", \"w\", \"nw\"].includes(transformHandleDirection)) {\n    newTopLeft = [\n      startBottomRight[0] - Math.abs(newBoundsWidth),\n      startBottomRight[1] - Math.abs(newBoundsHeight),\n    ];\n  }\n  if (transformHandleDirection === \"ne\") {\n    const bottomLeft = [startTopLeft[0], startBottomRight[1]];\n    newTopLeft = [bottomLeft[0], bottomLeft[1] - Math.abs(newBoundsHeight)];\n  }\n  if (transformHandleDirection === \"sw\") {\n    const topRight = [startBottomRight[0], startTopLeft[1]];\n    newTopLeft = [topRight[0] - Math.abs(newBoundsWidth), topRight[1]];\n  }\n\n  // Keeps opposite handle fixed during resize\n  if (shouldMaintainAspectRatio) {\n    if ([\"s\", \"n\"].includes(transformHandleDirection)) {\n      newTopLeft[0] = startCenter[0] - newBoundsWidth / 2;\n    }\n    if ([\"e\", \"w\"].includes(transformHandleDirection)) {\n      newTopLeft[1] = startCenter[1] - newBoundsHeight / 2;\n    }\n  }\n\n  // Flip horizontally\n  if (eleNewWidth < 0) {\n    if (transformHandleDirection.includes(\"e\")) {\n      newTopLeft[0] -= Math.abs(newBoundsWidth);\n    }\n    if (transformHandleDirection.includes(\"w\")) {\n      newTopLeft[0] += Math.abs(newBoundsWidth);\n    }\n  }\n  // Flip vertically\n  if (eleNewHeight < 0) {\n    if (transformHandleDirection.includes(\"s\")) {\n      newTopLeft[1] -= Math.abs(newBoundsHeight);\n    }\n    if (transformHandleDirection.includes(\"n\")) {\n      newTopLeft[1] += Math.abs(newBoundsHeight);\n    }\n  }\n\n  if (shouldResizeFromCenter) {\n    newTopLeft[0] = startCenter[0] - Math.abs(newBoundsWidth) / 2;\n    newTopLeft[1] = startCenter[1] - Math.abs(newBoundsHeight) / 2;\n  }\n\n  // adjust topLeft to new rotation point\n  const angle = stateAtResizeStart.angle;\n  const rotatedTopLeft = rotatePoint(newTopLeft, startCenter, angle);\n  const newCenter: Point = [\n    newTopLeft[0] + Math.abs(newBoundsWidth) / 2,\n    newTopLeft[1] + Math.abs(newBoundsHeight) / 2,\n  ];\n  const rotatedNewCenter = rotatePoint(newCenter, startCenter, angle);\n  newTopLeft = rotatePoint(rotatedTopLeft, rotatedNewCenter, -angle);\n\n  // Readjust points for linear elements\n  let rescaledElementPointsY;\n  let rescaledPoints;\n\n  if (isLinearElement(element) || isFreeDrawElement(element)) {\n    rescaledElementPointsY = rescalePoints(\n      1,\n      eleNewHeight,\n      (stateAtResizeStart as ExcalidrawLinearElement).points,\n      true,\n    );\n\n    rescaledPoints = rescalePoints(\n      0,\n      eleNewWidth,\n      rescaledElementPointsY,\n      true,\n    );\n  }\n\n  // For linear elements (x,y) are the coordinates of the first drawn point not the top-left corner\n  // So we need to readjust (x,y) to be where the first point should be\n  const newOrigin = [...newTopLeft];\n  newOrigin[0] += stateAtResizeStart.x - newBoundsX1;\n  newOrigin[1] += stateAtResizeStart.y - newBoundsY1;\n  const resizedElement = {\n    width: Math.abs(eleNewWidth),\n    height: Math.abs(eleNewHeight),\n    x: newOrigin[0],\n    y: newOrigin[1],\n    points: rescaledPoints,\n  };\n\n  if (\"scale\" in element && \"scale\" in stateAtResizeStart) {\n    mutateElement(element, {\n      scale: [\n        // defaulting because scaleX/Y can be 0/-0\n        (Math.sign(newBoundsX2 - stateAtResizeStart.x) ||\n          stateAtResizeStart.scale[0]) * stateAtResizeStart.scale[0],\n        (Math.sign(newBoundsY2 - stateAtResizeStart.y) ||\n          stateAtResizeStart.scale[1]) * stateAtResizeStart.scale[1],\n      ],\n    });\n  }\n\n  if (\n    resizedElement.width !== 0 &&\n    resizedElement.height !== 0 &&\n    Number.isFinite(resizedElement.x) &&\n    Number.isFinite(resizedElement.y)\n  ) {\n    updateBoundElements(element, {\n      newSize: { width: resizedElement.width, height: resizedElement.height },\n    });\n\n    mutateElement(element, resizedElement);\n    if (boundTextElement && boundTextFont) {\n      mutateElement(boundTextElement, { fontSize: boundTextFont.fontSize });\n    }\n    handleBindTextResize(element, transformHandleDirection);\n  }\n};\n\nconst resizeMultipleElements = (\n  pointerDownState: PointerDownState,\n  selectedElements: readonly NonDeletedExcalidrawElement[],\n  transformHandleType: \"nw\" | \"ne\" | \"sw\" | \"se\",\n  shouldResizeFromCenter: boolean,\n  pointerX: number,\n  pointerY: number,\n) => {\n  // map selected elements to the original elements. While it never should\n  // happen that pointerDownState.originalElements won't contain the selected\n  // elements during resize, this coupling isn't guaranteed, so to ensure\n  // type safety we need to transform only those elements we filter.\n  const targetElements = selectedElements.reduce(\n    (\n      acc: {\n        /** element at resize start */\n        orig: NonDeletedExcalidrawElement;\n        /** latest element */\n        latest: NonDeletedExcalidrawElement;\n      }[],\n      element,\n    ) => {\n      const origElement = pointerDownState.originalElements.get(element.id);\n      if (origElement) {\n        acc.push({ orig: origElement, latest: element });\n      }\n      return acc;\n    },\n    [],\n  );\n\n  const { minX, minY, maxX, maxY, midX, midY } = getCommonBoundingBox(\n    targetElements.map(({ orig }) => orig),\n  );\n  const direction = transformHandleType;\n\n  const mapDirectionsToAnchors: Record<typeof direction, Point> = {\n    ne: [minX, maxY],\n    se: [minX, minY],\n    sw: [maxX, minY],\n    nw: [maxX, maxY],\n  };\n\n  // anchor point must be on the opposite side of the dragged selection handle\n  // or be the center of the selection if alt is pressed\n  const [anchorX, anchorY]: Point = shouldResizeFromCenter\n    ? [midX, midY]\n    : mapDirectionsToAnchors[direction];\n\n  const mapDirectionsToPointerSides: Record<\n    typeof direction,\n    [x: boolean, y: boolean]\n  > = {\n    ne: [pointerX >= anchorX, pointerY <= anchorY],\n    se: [pointerX >= anchorX, pointerY >= anchorY],\n    sw: [pointerX <= anchorX, pointerY >= anchorY],\n    nw: [pointerX <= anchorX, pointerY <= anchorY],\n  };\n\n  // pointer side relative to anchor\n  const [pointerSideX, pointerSideY] = mapDirectionsToPointerSides[\n    direction\n  ].map((condition) => (condition ? 1 : -1));\n\n  // stop resizing if a pointer is on the other side of selection\n  if (pointerSideX < 0 && pointerSideY < 0) {\n    return;\n  }\n\n  const scale =\n    Math.max(\n      (pointerSideX * Math.abs(pointerX - anchorX)) / (maxX - minX),\n      (pointerSideY * Math.abs(pointerY - anchorY)) / (maxY - minY),\n    ) * (shouldResizeFromCenter ? 2 : 1);\n\n  if (scale === 0) {\n    return;\n  }\n\n  targetElements.forEach((element) => {\n    const width = element.orig.width * scale;\n    const height = element.orig.height * scale;\n    const x = anchorX + (element.orig.x - anchorX) * scale;\n    const y = anchorY + (element.orig.y - anchorY) * scale;\n\n    // readjust points for linear & free draw elements\n    const rescaledPoints = rescalePointsInElement(\n      element.orig,\n      width,\n      height,\n      false,\n    );\n\n    const update: {\n      width: number;\n      height: number;\n      x: number;\n      y: number;\n      points?: Point[];\n      fontSize?: number;\n    } = {\n      width,\n      height,\n      x,\n      y,\n      ...rescaledPoints,\n    };\n\n    let boundTextUpdates: { fontSize: number } | null = null;\n\n    const boundTextElement = getBoundTextElement(element.latest);\n\n    if (boundTextElement || isTextElement(element.orig)) {\n      const updatedElement = {\n        ...element.latest,\n        width,\n        height,\n      };\n      const fontSize = measureFontSizeFromWidth(\n        boundTextElement ?? (element.orig as ExcalidrawTextElement),\n        boundTextElement\n          ? getMaxContainerWidth(updatedElement)\n          : updatedElement.width,\n      );\n\n      if (!fontSize) {\n        return;\n      }\n\n      if (isTextElement(element.orig)) {\n        update.fontSize = fontSize;\n      }\n\n      if (boundTextElement) {\n        boundTextUpdates = {\n          fontSize,\n        };\n      }\n    }\n\n    updateBoundElements(element.latest, { newSize: { width, height } });\n\n    mutateElement(element.latest, update);\n\n    if (boundTextElement && boundTextUpdates) {\n      mutateElement(boundTextElement, boundTextUpdates);\n\n      handleBindTextResize(element.latest, transformHandleType);\n    }\n  });\n};\n\nconst rotateMultipleElements = (\n  pointerDownState: PointerDownState,\n  elements: readonly NonDeletedExcalidrawElement[],\n  pointerX: number,\n  pointerY: number,\n  shouldRotateWithDiscreteAngle: boolean,\n  centerX: number,\n  centerY: number,\n) => {\n  let centerAngle =\n    (5 * Math.PI) / 2 + Math.atan2(pointerY - centerY, pointerX - centerX);\n  if (shouldRotateWithDiscreteAngle) {\n    centerAngle += SHIFT_LOCKING_ANGLE / 2;\n    centerAngle -= centerAngle % SHIFT_LOCKING_ANGLE;\n  }\n  elements.forEach((element) => {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const cx = (x1 + x2) / 2;\n    const cy = (y1 + y2) / 2;\n    const origAngle =\n      pointerDownState.originalElements.get(element.id)?.angle ?? element.angle;\n    const [rotatedCX, rotatedCY] = rotate(\n      cx,\n      cy,\n      centerX,\n      centerY,\n      centerAngle + origAngle - element.angle,\n    );\n    mutateElement(element, {\n      x: element.x + (rotatedCX - cx),\n      y: element.y + (rotatedCY - cy),\n      angle: normalizeAngle(centerAngle + origAngle),\n    });\n    const boundTextElementId = getBoundTextElementId(element);\n    if (boundTextElementId) {\n      const textElement =\n        Scene.getScene(element)?.getElement<ExcalidrawTextElementWithContainer>(\n          boundTextElementId,\n        );\n      if (textElement && !isArrowElement(element)) {\n        mutateElement(textElement, {\n          x: textElement.x + (rotatedCX - cx),\n          y: textElement.y + (rotatedCY - cy),\n          angle: normalizeAngle(centerAngle + origAngle),\n        });\n      }\n    }\n  });\n};\n\nexport const getResizeOffsetXY = (\n  transformHandleType: MaybeTransformHandleType,\n  selectedElements: NonDeletedExcalidrawElement[],\n  x: number,\n  y: number,\n): [number, number] => {\n  const [x1, y1, x2, y2] =\n    selectedElements.length === 1\n      ? getElementAbsoluteCoords(selectedElements[0])\n      : getCommonBounds(selectedElements);\n  const cx = (x1 + x2) / 2;\n  const cy = (y1 + y2) / 2;\n  const angle = selectedElements.length === 1 ? selectedElements[0].angle : 0;\n  [x, y] = rotate(x, y, cx, cy, -angle);\n  switch (transformHandleType) {\n    case \"n\":\n      return rotate(x - (x1 + x2) / 2, y - y1, 0, 0, angle);\n    case \"s\":\n      return rotate(x - (x1 + x2) / 2, y - y2, 0, 0, angle);\n    case \"w\":\n      return rotate(x - x1, y - (y1 + y2) / 2, 0, 0, angle);\n    case \"e\":\n      return rotate(x - x2, y - (y1 + y2) / 2, 0, 0, angle);\n    case \"nw\":\n      return rotate(x - x1, y - y1, 0, 0, angle);\n    case \"ne\":\n      return rotate(x - x2, y - y1, 0, 0, angle);\n    case \"sw\":\n      return rotate(x - x1, y - y2, 0, 0, angle);\n    case \"se\":\n      return rotate(x - x2, y - y2, 0, 0, angle);\n    default:\n      return [0, 0];\n  }\n};\n\nexport const getResizeArrowDirection = (\n  transformHandleType: MaybeTransformHandleType,\n  element: NonDeleted<ExcalidrawLinearElement>,\n): \"origin\" | \"end\" => {\n  const [, [px, py]] = element.points;\n  const isResizeEnd =\n    (transformHandleType === \"nw\" && (px < 0 || py < 0)) ||\n    (transformHandleType === \"ne\" && px >= 0) ||\n    (transformHandleType === \"sw\" && px <= 0) ||\n    (transformHandleType === \"se\" && (px > 0 || py > 0));\n  return isResizeEnd ? \"end\" : \"origin\";\n};\n","import { ExcalidrawElement } from \"./types\";\nimport { mutateElement } from \"./mutateElement\";\nimport { isFreeDrawElement, isLinearElement } from \"./typeChecks\";\nimport { SHIFT_LOCKING_ANGLE } from \"../constants\";\nimport { AppState } from \"../types\";\n\nexport const isInvisiblySmallElement = (\n  element: ExcalidrawElement,\n): boolean => {\n  if (isLinearElement(element) || isFreeDrawElement(element)) {\n    return element.points.length < 2;\n  }\n  return element.width === 0 && element.height === 0;\n};\n\n/**\n * Makes a perfect shape or diagonal/horizontal/vertical line\n */\nexport const getPerfectElementSize = (\n  elementType: AppState[\"activeTool\"][\"type\"],\n  width: number,\n  height: number,\n): { width: number; height: number } => {\n  const absWidth = Math.abs(width);\n  const absHeight = Math.abs(height);\n\n  if (\n    elementType === \"line\" ||\n    elementType === \"arrow\" ||\n    elementType === \"freedraw\"\n  ) {\n    const lockedAngle =\n      Math.round(Math.atan(absHeight / absWidth) / SHIFT_LOCKING_ANGLE) *\n      SHIFT_LOCKING_ANGLE;\n    if (lockedAngle === 0) {\n      height = 0;\n    } else if (lockedAngle === Math.PI / 2) {\n      width = 0;\n    } else {\n      height = absWidth * Math.tan(lockedAngle) * Math.sign(height) || height;\n    }\n  } else if (elementType !== \"selection\") {\n    height = absWidth * Math.sign(height);\n  }\n  return { width, height };\n};\n\nexport const getLockedLinearCursorAlignSize = (\n  originX: number,\n  originY: number,\n  x: number,\n  y: number,\n) => {\n  let width = x - originX;\n  let height = y - originY;\n\n  const lockedAngle =\n    Math.round(Math.atan(height / width) / SHIFT_LOCKING_ANGLE) *\n    SHIFT_LOCKING_ANGLE;\n\n  if (lockedAngle === 0) {\n    height = 0;\n  } else if (lockedAngle === Math.PI / 2) {\n    width = 0;\n  } else {\n    // locked angle line, y = mx + b => mx - y + b = 0\n    const a1 = Math.tan(lockedAngle);\n    const b1 = -1;\n    const c1 = originY - a1 * originX;\n\n    // line through cursor, perpendicular to locked angle line\n    const a2 = -1 / a1;\n    const b2 = -1;\n    const c2 = y - a2 * x;\n\n    // intersection of the two lines above\n    const intersectX = (b1 * c2 - b2 * c1) / (a1 * b2 - a2 * b1);\n    const intersectY = (c1 * a2 - c2 * a1) / (a1 * b2 - a2 * b1);\n\n    // delta\n    width = intersectX - originX;\n    height = intersectY - originY;\n  }\n\n  return { width, height };\n};\n\nexport const resizePerfectLineForNWHandler = (\n  element: ExcalidrawElement,\n  x: number,\n  y: number,\n) => {\n  const anchorX = element.x + element.width;\n  const anchorY = element.y + element.height;\n  const distanceToAnchorX = x - anchorX;\n  const distanceToAnchorY = y - anchorY;\n  if (Math.abs(distanceToAnchorX) < Math.abs(distanceToAnchorY) / 2) {\n    mutateElement(element, {\n      x: anchorX,\n      width: 0,\n      y,\n      height: -distanceToAnchorY,\n    });\n  } else if (Math.abs(distanceToAnchorY) < Math.abs(element.width) / 2) {\n    mutateElement(element, {\n      y: anchorY,\n      height: 0,\n    });\n  } else {\n    const nextHeight =\n      Math.sign(distanceToAnchorY) *\n      Math.sign(distanceToAnchorX) *\n      element.width;\n    mutateElement(element, {\n      x,\n      y: anchorY - nextHeight,\n      width: -distanceToAnchorX,\n      height: nextHeight,\n    });\n  }\n};\n\nexport const getNormalizedDimensions = (\n  element: Pick<ExcalidrawElement, \"width\" | \"height\" | \"x\" | \"y\">,\n): {\n  width: ExcalidrawElement[\"width\"];\n  height: ExcalidrawElement[\"height\"];\n  x: ExcalidrawElement[\"x\"];\n  y: ExcalidrawElement[\"y\"];\n} => {\n  const ret = {\n    width: element.width,\n    height: element.height,\n    x: element.x,\n    y: element.y,\n  };\n\n  if (element.width < 0) {\n    const nextWidth = Math.abs(element.width);\n    ret.width = nextWidth;\n    ret.x = element.x - nextWidth;\n  }\n\n  if (element.height < 0) {\n    const nextHeight = Math.abs(element.height);\n    ret.height = nextHeight;\n    ret.y = element.y - nextHeight;\n  }\n\n  return ret;\n};\n","import { getFontString, arrayToMap, isTestEnv } from \"../utils\";\nimport {\n  ExcalidrawElement,\n  ExcalidrawTextContainer,\n  ExcalidrawTextElement,\n  ExcalidrawTextElementWithContainer,\n  FontString,\n  NonDeletedExcalidrawElement,\n} from \"./types\";\nimport { mutateElement } from \"./mutateElement\";\nimport { BOUND_TEXT_PADDING, TEXT_ALIGN, VERTICAL_ALIGN } from \"../constants\";\nimport { MaybeTransformHandleType } from \"./transformHandles\";\nimport Scene from \"../scene/Scene\";\nimport { isTextElement } from \".\";\nimport { isBoundToContainer, isArrowElement } from \"./typeChecks\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { AppState } from \"../types\";\nimport { isTextBindableContainer } from \"./typeChecks\";\nimport { getElementAbsoluteCoords } from \"../element\";\nimport { getSelectedElements } from \"../scene\";\nimport { isHittingElementNotConsideringBoundingBox } from \"./collision\";\nimport {\n  resetOriginalContainerCache,\n  updateOriginalContainerCache,\n} from \"./textWysiwyg\";\nimport { ExtractSetType } from \"../utility-types\";\n\nexport const normalizeText = (text: string) => {\n  return (\n    text\n      // replace tabs with spaces so they render and measure correctly\n      .replace(/\\t/g, \"        \")\n      // normalize newlines\n      .replace(/\\r?\\n|\\r/g, \"\\n\")\n  );\n};\n\nexport const redrawTextBoundingBox = (\n  textElement: ExcalidrawTextElement,\n  container: ExcalidrawElement | null,\n) => {\n  let maxWidth = undefined;\n\n  const boundTextUpdates = {\n    x: textElement.x,\n    y: textElement.y,\n    text: textElement.text,\n    width: textElement.width,\n    height: textElement.height,\n  };\n\n  boundTextUpdates.text = textElement.text;\n\n  if (container) {\n    maxWidth = getMaxContainerWidth(container);\n    boundTextUpdates.text = wrapText(\n      textElement.originalText,\n      getFontString(textElement),\n      maxWidth,\n    );\n  }\n  const metrics = measureText(\n    boundTextUpdates.text,\n    getFontString(textElement),\n  );\n\n  boundTextUpdates.width = metrics.width;\n  boundTextUpdates.height = metrics.height;\n\n  if (container) {\n    if (isArrowElement(container)) {\n      const centerX = textElement.x + textElement.width / 2;\n      const centerY = textElement.y + textElement.height / 2;\n      const diffWidth = metrics.width - textElement.width;\n      const diffHeight = metrics.height - textElement.height;\n      boundTextUpdates.x = centerY - (textElement.height + diffHeight) / 2;\n      boundTextUpdates.y = centerX - (textElement.width + diffWidth) / 2;\n    } else {\n      const containerDims = getContainerDims(container);\n      let maxContainerHeight = getMaxContainerHeight(container);\n\n      let nextHeight = containerDims.height;\n      if (metrics.height > maxContainerHeight) {\n        nextHeight = computeContainerDimensionForBoundText(\n          metrics.height,\n          container.type,\n        );\n        mutateElement(container, { height: nextHeight });\n        maxContainerHeight = getMaxContainerHeight(container);\n        updateOriginalContainerCache(container.id, nextHeight);\n      }\n      const updatedTextElement = {\n        ...textElement,\n        ...boundTextUpdates,\n      } as ExcalidrawTextElementWithContainer;\n      const { x, y } = computeBoundTextPosition(container, updatedTextElement);\n      boundTextUpdates.x = x;\n      boundTextUpdates.y = y;\n    }\n  }\n\n  mutateElement(textElement, boundTextUpdates);\n};\n\nexport const bindTextToShapeAfterDuplication = (\n  sceneElements: ExcalidrawElement[],\n  oldElements: ExcalidrawElement[],\n  oldIdToDuplicatedId: Map<ExcalidrawElement[\"id\"], ExcalidrawElement[\"id\"]>,\n): void => {\n  const sceneElementMap = arrayToMap(sceneElements) as Map<\n    ExcalidrawElement[\"id\"],\n    ExcalidrawElement\n  >;\n  oldElements.forEach((element) => {\n    const newElementId = oldIdToDuplicatedId.get(element.id) as string;\n    const boundTextElementId = getBoundTextElementId(element);\n\n    if (boundTextElementId) {\n      const newTextElementId = oldIdToDuplicatedId.get(boundTextElementId);\n      if (newTextElementId) {\n        const newContainer = sceneElementMap.get(newElementId);\n        if (newContainer) {\n          mutateElement(newContainer, {\n            boundElements: (element.boundElements || [])\n              .filter(\n                (boundElement) =>\n                  boundElement.id !== newTextElementId &&\n                  boundElement.id !== boundTextElementId,\n              )\n              .concat({\n                type: \"text\",\n                id: newTextElementId,\n              }),\n          });\n        }\n        const newTextElement = sceneElementMap.get(newTextElementId);\n        if (newTextElement && isTextElement(newTextElement)) {\n          mutateElement(newTextElement, {\n            containerId: newContainer ? newElementId : null,\n          });\n        }\n      }\n    }\n  });\n};\n\nexport const handleBindTextResize = (\n  container: NonDeletedExcalidrawElement,\n  transformHandleType: MaybeTransformHandleType,\n) => {\n  const boundTextElementId = getBoundTextElementId(container);\n  if (!boundTextElementId) {\n    return;\n  }\n  resetOriginalContainerCache(container.id);\n  let textElement = Scene.getScene(container)!.getElement(\n    boundTextElementId,\n  ) as ExcalidrawTextElement;\n  if (textElement && textElement.text) {\n    if (!container) {\n      return;\n    }\n\n    textElement = Scene.getScene(container)!.getElement(\n      boundTextElementId,\n    ) as ExcalidrawTextElement;\n    let text = textElement.text;\n    let nextHeight = textElement.height;\n    let nextWidth = textElement.width;\n    const containerDims = getContainerDims(container);\n    const maxWidth = getMaxContainerWidth(container);\n    const maxHeight = getMaxContainerHeight(container);\n    let containerHeight = containerDims.height;\n    if (transformHandleType !== \"n\" && transformHandleType !== \"s\") {\n      if (text) {\n        text = wrapText(\n          textElement.originalText,\n          getFontString(textElement),\n          maxWidth,\n        );\n      }\n      const dimensions = measureText(text, getFontString(textElement));\n      nextHeight = dimensions.height;\n      nextWidth = dimensions.width;\n    }\n    // increase height in case text element height exceeds\n    if (nextHeight > maxHeight) {\n      containerHeight = computeContainerDimensionForBoundText(\n        nextHeight,\n        container.type,\n      );\n\n      const diff = containerHeight - containerDims.height;\n      // fix the y coord when resizing from ne/nw/n\n      const updatedY =\n        !isArrowElement(container) &&\n        (transformHandleType === \"ne\" ||\n          transformHandleType === \"nw\" ||\n          transformHandleType === \"n\")\n          ? container.y - diff\n          : container.y;\n      mutateElement(container, {\n        height: containerHeight,\n        y: updatedY,\n      });\n    }\n\n    mutateElement(textElement, {\n      text,\n      width: nextWidth,\n      height: nextHeight,\n    });\n\n    if (!isArrowElement(container)) {\n      mutateElement(\n        textElement,\n        computeBoundTextPosition(\n          container,\n          textElement as ExcalidrawTextElementWithContainer,\n        ),\n      );\n    }\n  }\n};\n\nconst computeBoundTextPosition = (\n  container: ExcalidrawElement,\n  boundTextElement: ExcalidrawTextElementWithContainer,\n) => {\n  const containerCoords = getContainerCoords(container);\n  const maxContainerHeight = getMaxContainerHeight(container);\n  const maxContainerWidth = getMaxContainerWidth(container);\n\n  let x;\n  let y;\n  if (boundTextElement.verticalAlign === VERTICAL_ALIGN.TOP) {\n    y = containerCoords.y;\n  } else if (boundTextElement.verticalAlign === VERTICAL_ALIGN.BOTTOM) {\n    y = containerCoords.y + (maxContainerHeight - boundTextElement.height);\n  } else {\n    y =\n      containerCoords.y +\n      (maxContainerHeight / 2 - boundTextElement.height / 2);\n  }\n  if (boundTextElement.textAlign === TEXT_ALIGN.LEFT) {\n    x = containerCoords.x;\n  } else if (boundTextElement.textAlign === TEXT_ALIGN.RIGHT) {\n    x = containerCoords.x + (maxContainerWidth - boundTextElement.width);\n  } else {\n    x =\n      containerCoords.x + (maxContainerWidth / 2 - boundTextElement.width / 2);\n  }\n  return { x, y };\n};\n\n// https://github.com/grassator/canvas-text-editor/blob/master/lib/FontMetrics.js\n\nexport const measureText = (text: string, font: FontString) => {\n  text = text\n    .split(\"\\n\")\n    // replace empty lines with single space because leading/trailing empty\n    // lines would be stripped from computation\n    .map((x) => x || \" \")\n    .join(\"\\n\");\n\n  const height = getTextHeight(text, font);\n  const width = getTextWidth(text, font);\n\n  return { width, height };\n};\n\nconst DUMMY_TEXT = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\".toLocaleUpperCase();\nconst cacheApproxLineHeight: { [key: FontString]: number } = {};\n\nexport const getApproxLineHeight = (font: FontString) => {\n  if (cacheApproxLineHeight[font]) {\n    return cacheApproxLineHeight[font];\n  }\n  const fontSize = parseInt(font);\n\n  // Calculate line height relative to font size\n  cacheApproxLineHeight[font] = fontSize * 1.2;\n  return cacheApproxLineHeight[font];\n};\n\nlet canvas: HTMLCanvasElement | undefined;\n\nconst getLineWidth = (text: string, font: FontString) => {\n  if (!canvas) {\n    canvas = document.createElement(\"canvas\");\n  }\n  const canvas2dContext = canvas.getContext(\"2d\")!;\n  canvas2dContext.font = font;\n  const width = canvas2dContext.measureText(text).width;\n\n  // since in test env the canvas measureText algo\n  // doesn't measure text and instead just returns number of\n  // characters hence we assume that each letteris 10px\n  if (isTestEnv()) {\n    return width * 10;\n  }\n  return width;\n};\n\nexport const getTextWidth = (text: string, font: FontString) => {\n  const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n  let width = 0;\n  lines.forEach((line) => {\n    width = Math.max(width, getLineWidth(line, font));\n  });\n  return width;\n};\n\nexport const getTextHeight = (text: string, font: FontString) => {\n  const lines = text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n  const lineHeight = getApproxLineHeight(font);\n  return lineHeight * lines.length;\n};\n\nexport const wrapText = (text: string, font: FontString, maxWidth: number) => {\n  const lines: Array<string> = [];\n  const originalLines = text.split(\"\\n\");\n  const spaceWidth = getLineWidth(\" \", font);\n  const push = (str: string) => {\n    if (str.trim()) {\n      lines.push(str);\n    }\n  };\n  originalLines.forEach((originalLine) => {\n    const words = originalLine.split(\" \");\n    // This means its newline so push it\n    if (words.length === 1 && words[0] === \"\") {\n      lines.push(words[0]);\n      return; // continue\n    }\n    let currentLine = \"\";\n    let currentLineWidthTillNow = 0;\n\n    let index = 0;\n\n    while (index < words.length) {\n      const currentWordWidth = getLineWidth(words[index], font);\n      // This will only happen when single word takes entire width\n      if (currentWordWidth === maxWidth) {\n        push(words[index]);\n        index++;\n      }\n\n      // Start breaking longer words exceeding max width\n      else if (currentWordWidth > maxWidth) {\n        // push current line since the current word exceeds the max width\n        // so will be appended in next line\n        push(currentLine);\n        currentLine = \"\";\n        currentLineWidthTillNow = 0;\n\n        while (words[index].length > 0) {\n          const currentChar = String.fromCodePoint(\n            words[index].codePointAt(0)!,\n          );\n          const width = charWidth.calculate(currentChar, font);\n          currentLineWidthTillNow += width;\n          words[index] = words[index].slice(currentChar.length);\n\n          if (currentLineWidthTillNow >= maxWidth) {\n            // only remove last trailing space which we have added when joining words\n            if (currentLine.slice(-1) === \" \") {\n              currentLine = currentLine.slice(0, -1);\n            }\n            push(currentLine);\n            currentLine = currentChar;\n            currentLineWidthTillNow = width;\n          } else {\n            currentLine += currentChar;\n          }\n        }\n        // push current line if appending space exceeds max width\n        if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n          push(currentLine);\n          currentLine = \"\";\n          currentLineWidthTillNow = 0;\n        } else {\n          // space needs to be appended before next word\n          // as currentLine contains chars which couldn't be appended\n          // to previous line\n          currentLine += \" \";\n          currentLineWidthTillNow += spaceWidth;\n        }\n\n        index++;\n      } else {\n        // Start appending words in a line till max width reached\n        while (currentLineWidthTillNow < maxWidth && index < words.length) {\n          const word = words[index];\n          currentLineWidthTillNow = getLineWidth(currentLine + word, font);\n\n          if (currentLineWidthTillNow > maxWidth) {\n            push(currentLine);\n            currentLineWidthTillNow = 0;\n            currentLine = \"\";\n\n            break;\n          }\n          index++;\n          currentLine += `${word} `;\n\n          // Push the word if appending space exceeds max width\n          if (currentLineWidthTillNow + spaceWidth >= maxWidth) {\n            const word = currentLine.slice(0, -1);\n            push(word);\n            currentLine = \"\";\n            currentLineWidthTillNow = 0;\n            break;\n          }\n        }\n        if (currentLineWidthTillNow === maxWidth) {\n          currentLine = \"\";\n          currentLineWidthTillNow = 0;\n        }\n      }\n    }\n    if (currentLine) {\n      // only remove last trailing space which we have added when joining words\n      if (currentLine.slice(-1) === \" \") {\n        currentLine = currentLine.slice(0, -1);\n      }\n      push(currentLine);\n    }\n  });\n  return lines.join(\"\\n\");\n};\n\nexport const charWidth = (() => {\n  const cachedCharWidth: { [key: FontString]: Array<number> } = {};\n\n  const calculate = (char: string, font: FontString) => {\n    const ascii = char.charCodeAt(0);\n    if (!cachedCharWidth[font]) {\n      cachedCharWidth[font] = [];\n    }\n    if (!cachedCharWidth[font][ascii]) {\n      const width = getLineWidth(char, font);\n      cachedCharWidth[font][ascii] = width;\n    }\n\n    return cachedCharWidth[font][ascii];\n  };\n\n  const getCache = (font: FontString) => {\n    return cachedCharWidth[font];\n  };\n  return {\n    calculate,\n    getCache,\n  };\n})();\n\nexport const getApproxMinLineWidth = (font: FontString) => {\n  const maxCharWidth = getMaxCharWidth(font);\n  if (maxCharWidth === 0) {\n    return (\n      measureText(DUMMY_TEXT.split(\"\").join(\"\\n\"), font).width +\n      BOUND_TEXT_PADDING * 2\n    );\n  }\n  return maxCharWidth + BOUND_TEXT_PADDING * 2;\n};\n\nexport const getApproxMinLineHeight = (font: FontString) => {\n  return getApproxLineHeight(font) + BOUND_TEXT_PADDING * 2;\n};\n\nexport const getMinCharWidth = (font: FontString) => {\n  const cache = charWidth.getCache(font);\n  if (!cache) {\n    return 0;\n  }\n  const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n\n  return Math.min(...cacheWithOutEmpty);\n};\n\nexport const getMaxCharWidth = (font: FontString) => {\n  const cache = charWidth.getCache(font);\n  if (!cache) {\n    return 0;\n  }\n  const cacheWithOutEmpty = cache.filter((val) => val !== undefined);\n  return Math.max(...cacheWithOutEmpty);\n};\n\nexport const getApproxCharsToFitInWidth = (font: FontString, width: number) => {\n  // Generally lower case is used so converting to lower case\n  const dummyText = DUMMY_TEXT.toLocaleLowerCase();\n  const batchLength = 6;\n  let index = 0;\n  let widthTillNow = 0;\n  let str = \"\";\n  while (widthTillNow <= width) {\n    const batch = dummyText.substr(index, index + batchLength);\n    str += batch;\n    widthTillNow += getLineWidth(str, font);\n    if (index === dummyText.length - 1) {\n      index = 0;\n    }\n    index = index + batchLength;\n  }\n\n  while (widthTillNow > width) {\n    str = str.substr(0, str.length - 1);\n    widthTillNow = getLineWidth(str, font);\n  }\n  return str.length;\n};\n\nexport const getBoundTextElementId = (container: ExcalidrawElement | null) => {\n  return container?.boundElements?.length\n    ? container?.boundElements?.filter((ele) => ele.type === \"text\")[0]?.id ||\n        null\n    : null;\n};\n\nexport const getBoundTextElement = (element: ExcalidrawElement | null) => {\n  if (!element) {\n    return null;\n  }\n  const boundTextElementId = getBoundTextElementId(element);\n  if (boundTextElementId) {\n    return (\n      (Scene.getScene(element)?.getElement(\n        boundTextElementId,\n      ) as ExcalidrawTextElementWithContainer) || null\n    );\n  }\n  return null;\n};\n\nexport const getContainerElement = (\n  element:\n    | (ExcalidrawElement & {\n        containerId: ExcalidrawElement[\"id\"] | null;\n      })\n    | null,\n) => {\n  if (!element) {\n    return null;\n  }\n  if (element.containerId) {\n    return Scene.getScene(element)?.getElement(element.containerId) || null;\n  }\n  return null;\n};\n\nexport const getContainerDims = (element: ExcalidrawElement) => {\n  const MIN_WIDTH = 300;\n  if (isArrowElement(element)) {\n    const width = Math.max(element.width, MIN_WIDTH);\n    const height = element.height;\n    return { width, height };\n  }\n  return { width: element.width, height: element.height };\n};\n\nexport const getContainerCenter = (\n  container: ExcalidrawElement,\n  appState: AppState,\n) => {\n  if (!isArrowElement(container)) {\n    return {\n      x: container.x + container.width / 2,\n      y: container.y + container.height / 2,\n    };\n  }\n  const points = LinearElementEditor.getPointsGlobalCoordinates(container);\n  if (points.length % 2 === 1) {\n    const index = Math.floor(container.points.length / 2);\n    const midPoint = LinearElementEditor.getPointGlobalCoordinates(\n      container,\n      container.points[index],\n    );\n    return { x: midPoint[0], y: midPoint[1] };\n  }\n  const index = container.points.length / 2 - 1;\n  let midSegmentMidpoint = LinearElementEditor.getEditorMidPoints(\n    container,\n    appState,\n  )[index];\n  if (!midSegmentMidpoint) {\n    midSegmentMidpoint = LinearElementEditor.getSegmentMidPoint(\n      container,\n      points[index],\n      points[index + 1],\n      index + 1,\n    );\n  }\n  return { x: midSegmentMidpoint[0], y: midSegmentMidpoint[1] };\n};\n\nexport const getContainerCoords = (container: NonDeletedExcalidrawElement) => {\n  let offsetX = BOUND_TEXT_PADDING;\n  let offsetY = BOUND_TEXT_PADDING;\n\n  if (container.type === \"ellipse\") {\n    // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6172\n    offsetX += (container.width / 2) * (1 - Math.sqrt(2) / 2);\n    offsetY += (container.height / 2) * (1 - Math.sqrt(2) / 2);\n  }\n  // The derivation of coordinates is explained in https://github.com/excalidraw/excalidraw/pull/6265\n  if (container.type === \"diamond\") {\n    offsetX += container.width / 4;\n    offsetY += container.height / 4;\n  }\n  return {\n    x: container.x + offsetX,\n    y: container.y + offsetY,\n  };\n};\n\nexport const getTextElementAngle = (textElement: ExcalidrawTextElement) => {\n  const container = getContainerElement(textElement);\n  if (!container || isArrowElement(container)) {\n    return textElement.angle;\n  }\n  return container.angle;\n};\n\nexport const getBoundTextElementOffset = (\n  boundTextElement: ExcalidrawTextElement | null,\n) => {\n  const container = getContainerElement(boundTextElement);\n  if (!container || !boundTextElement) {\n    return 0;\n  }\n  if (isArrowElement(container)) {\n    return BOUND_TEXT_PADDING * 8;\n  }\n\n  return BOUND_TEXT_PADDING;\n};\n\nexport const getBoundTextElementPosition = (\n  container: ExcalidrawElement,\n  boundTextElement: ExcalidrawTextElementWithContainer,\n) => {\n  if (isArrowElement(container)) {\n    return LinearElementEditor.getBoundTextElementPosition(\n      container,\n      boundTextElement,\n    );\n  }\n};\n\nexport const shouldAllowVerticalAlign = (\n  selectedElements: NonDeletedExcalidrawElement[],\n) => {\n  return selectedElements.some((element) => {\n    const hasBoundContainer = isBoundToContainer(element);\n    if (hasBoundContainer) {\n      const container = getContainerElement(element);\n      if (isTextElement(element) && isArrowElement(container)) {\n        return false;\n      }\n      return true;\n    }\n    const boundTextElement = getBoundTextElement(element);\n    if (boundTextElement) {\n      if (isArrowElement(element)) {\n        return false;\n      }\n      return true;\n    }\n    return false;\n  });\n};\n\nexport const getTextBindableContainerAtPosition = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  x: number,\n  y: number,\n): ExcalidrawTextContainer | null => {\n  const selectedElements = getSelectedElements(elements, appState);\n  if (selectedElements.length === 1) {\n    return isTextBindableContainer(selectedElements[0], false)\n      ? selectedElements[0]\n      : null;\n  }\n  let hitElement = null;\n  // We need to to hit testing from front (end of the array) to back (beginning of the array)\n  for (let index = elements.length - 1; index >= 0; --index) {\n    if (elements[index].isDeleted) {\n      continue;\n    }\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(elements[index]);\n    if (\n      isArrowElement(elements[index]) &&\n      isHittingElementNotConsideringBoundingBox(elements[index], appState, [\n        x,\n        y,\n      ])\n    ) {\n      hitElement = elements[index];\n      break;\n    } else if (x1 < x && x < x2 && y1 < y && y < y2) {\n      hitElement = elements[index];\n      break;\n    }\n  }\n\n  return isTextBindableContainer(hitElement, false) ? hitElement : null;\n};\n\nconst VALID_CONTAINER_TYPES = new Set([\n  \"rectangle\",\n  \"ellipse\",\n  \"diamond\",\n  \"image\",\n  \"arrow\",\n]);\n\nexport const isValidTextContainer = (element: ExcalidrawElement) =>\n  VALID_CONTAINER_TYPES.has(element.type);\n\nexport const computeContainerDimensionForBoundText = (\n  dimension: number,\n  containerType: ExtractSetType<typeof VALID_CONTAINER_TYPES>,\n) => {\n  dimension = Math.ceil(dimension);\n  const padding = BOUND_TEXT_PADDING * 2;\n\n  if (containerType === \"ellipse\") {\n    return Math.round(((dimension + padding) / Math.sqrt(2)) * 2);\n  }\n  if (containerType === \"arrow\") {\n    return dimension + padding * 8;\n  }\n  if (containerType === \"diamond\") {\n    return 2 * (dimension + padding);\n  }\n  return dimension + padding;\n};\n\nexport const getMaxContainerWidth = (container: ExcalidrawElement) => {\n  const width = getContainerDims(container).width;\n  if (isArrowElement(container)) {\n    const containerWidth = width - BOUND_TEXT_PADDING * 8 * 2;\n    if (containerWidth <= 0) {\n      const boundText = getBoundTextElement(container);\n      if (boundText) {\n        return boundText.width;\n      }\n      return BOUND_TEXT_PADDING * 8 * 2;\n    }\n    return containerWidth;\n  }\n\n  if (container.type === \"ellipse\") {\n    // The width of the largest rectangle inscribed inside an ellipse is\n    // Math.round((ellipse.width / 2) * Math.sqrt(2)) which is derived from\n    // equation of an ellipse -https://github.com/excalidraw/excalidraw/pull/6172\n    return Math.round((width / 2) * Math.sqrt(2)) - BOUND_TEXT_PADDING * 2;\n  }\n  if (container.type === \"diamond\") {\n    // The width of the largest rectangle inscribed inside a rhombus is\n    // Math.round(width / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n    return Math.round(width / 2) - BOUND_TEXT_PADDING * 2;\n  }\n  return width - BOUND_TEXT_PADDING * 2;\n};\n\nexport const getMaxContainerHeight = (container: ExcalidrawElement) => {\n  const height = getContainerDims(container).height;\n  if (isArrowElement(container)) {\n    const containerHeight = height - BOUND_TEXT_PADDING * 8 * 2;\n    if (containerHeight <= 0) {\n      const boundText = getBoundTextElement(container);\n      if (boundText) {\n        return boundText.height;\n      }\n      return BOUND_TEXT_PADDING * 8 * 2;\n    }\n    return height;\n  }\n  if (container.type === \"ellipse\") {\n    // The height of the largest rectangle inscribed inside an ellipse is\n    // Math.round((ellipse.height / 2) * Math.sqrt(2)) which is derived from\n    // equation of an ellipse - https://github.com/excalidraw/excalidraw/pull/6172\n    return Math.round((height / 2) * Math.sqrt(2)) - BOUND_TEXT_PADDING * 2;\n  }\n  if (container.type === \"diamond\") {\n    // The height of the largest rectangle inscribed inside a rhombus is\n    // Math.round(height / 2) - https://github.com/excalidraw/excalidraw/pull/6265\n    return Math.round(height / 2) - BOUND_TEXT_PADDING * 2;\n  }\n  return height - BOUND_TEXT_PADDING * 2;\n};\n","import { CODES, KEYS } from \"../keys\";\nimport {\n  isWritableElement,\n  getFontString,\n  getFontFamilyString,\n  isTestEnv,\n} from \"../utils\";\nimport Scene from \"../scene/Scene\";\nimport {\n  isArrowElement,\n  isBoundToContainer,\n  isTextElement,\n} from \"./typeChecks\";\nimport { CLASSES, isFirefox, isSafari, VERTICAL_ALIGN } from \"../constants\";\nimport {\n  ExcalidrawElement,\n  ExcalidrawLinearElement,\n  ExcalidrawTextElementWithContainer,\n  ExcalidrawTextElement,\n  ExcalidrawTextContainer,\n} from \"./types\";\nimport { AppState } from \"../types\";\nimport { mutateElement } from \"./mutateElement\";\nimport {\n  getApproxLineHeight,\n  getBoundTextElementId,\n  getContainerCoords,\n  getContainerDims,\n  getContainerElement,\n  getTextElementAngle,\n  getTextWidth,\n  measureText,\n  normalizeText,\n  redrawTextBoundingBox,\n  wrapText,\n  getMaxContainerHeight,\n  getMaxContainerWidth,\n} from \"./textElement\";\nimport {\n  actionDecreaseFontSize,\n  actionIncreaseFontSize,\n} from \"../actions/actionProperties\";\nimport { actionZoomIn, actionZoomOut } from \"../actions/actionCanvas\";\nimport App from \"../components/App\";\nimport { LinearElementEditor } from \"./linearElementEditor\";\nimport { parseClipboard } from \"../clipboard\";\n\nconst getTransform = (\n  width: number,\n  height: number,\n  angle: number,\n  appState: AppState,\n  maxWidth: number,\n  maxHeight: number,\n) => {\n  const { zoom } = appState;\n  const degree = (180 * angle) / Math.PI;\n  let translateX = (width * (zoom.value - 1)) / 2;\n  let translateY = (height * (zoom.value - 1)) / 2;\n  if (width > maxWidth && zoom.value !== 1) {\n    translateX = (maxWidth * (zoom.value - 1)) / 2;\n  }\n  if (height > maxHeight && zoom.value !== 1) {\n    translateY = (maxHeight * (zoom.value - 1)) / 2;\n  }\n  return `translate(${translateX}px, ${translateY}px) scale(${zoom.value}) rotate(${degree}deg)`;\n};\n\nconst originalContainerCache: {\n  [id: ExcalidrawTextContainer[\"id\"]]:\n    | {\n        height: ExcalidrawTextContainer[\"height\"];\n      }\n    | undefined;\n} = {};\n\nexport const updateOriginalContainerCache = (\n  id: ExcalidrawTextContainer[\"id\"],\n  height: ExcalidrawTextContainer[\"height\"],\n) => {\n  const data =\n    originalContainerCache[id] || (originalContainerCache[id] = { height });\n  data.height = height;\n  return data;\n};\n\nexport const resetOriginalContainerCache = (\n  id: ExcalidrawTextContainer[\"id\"],\n) => {\n  if (originalContainerCache[id]) {\n    delete originalContainerCache[id];\n  }\n};\n\nexport const getOriginalContainerHeightFromCache = (\n  id: ExcalidrawTextContainer[\"id\"],\n) => {\n  return originalContainerCache[id]?.height ?? null;\n};\n\nexport const textWysiwyg = ({\n  id,\n  onChange,\n  onSubmit,\n  getViewportCoords,\n  element,\n  canvas,\n  excalidrawContainer,\n  app,\n}: {\n  id: ExcalidrawElement[\"id\"];\n  onChange?: (text: string) => void;\n  onSubmit: (data: {\n    text: string;\n    viaKeyboard: boolean;\n    originalText: string;\n  }) => void;\n  getViewportCoords: (x: number, y: number) => [number, number];\n  element: ExcalidrawTextElement;\n  canvas: HTMLCanvasElement | null;\n  excalidrawContainer: HTMLDivElement | null;\n  app: App;\n}) => {\n  const textPropertiesUpdated = (\n    updatedTextElement: ExcalidrawTextElement,\n    editable: HTMLTextAreaElement,\n  ) => {\n    if (!editable.style.fontFamily || !editable.style.fontSize) {\n      return false;\n    }\n    const currentFont = editable.style.fontFamily.replace(/\"/g, \"\");\n    if (\n      getFontFamilyString({ fontFamily: updatedTextElement.fontFamily }) !==\n      currentFont\n    ) {\n      return true;\n    }\n    if (`${updatedTextElement.fontSize}px` !== editable.style.fontSize) {\n      return true;\n    }\n    return false;\n  };\n\n  const updateWysiwygStyle = () => {\n    const appState = app.state;\n    const updatedTextElement =\n      Scene.getScene(element)?.getElement<ExcalidrawTextElement>(id);\n\n    if (!updatedTextElement) {\n      return;\n    }\n    const { textAlign, verticalAlign } = updatedTextElement;\n    const approxLineHeight = getApproxLineHeight(\n      getFontString(updatedTextElement),\n    );\n    if (updatedTextElement && isTextElement(updatedTextElement)) {\n      let coordX = updatedTextElement.x;\n      let coordY = updatedTextElement.y;\n      const container = getContainerElement(updatedTextElement);\n      let maxWidth = updatedTextElement.width;\n\n      let maxHeight = updatedTextElement.height;\n      let textElementWidth = updatedTextElement.width;\n      // Set to element height by default since that's\n      // what is going to be used for unbounded text\n      let textElementHeight = updatedTextElement.height;\n\n      if (container && updatedTextElement.containerId) {\n        if (isArrowElement(container)) {\n          const boundTextCoords =\n            LinearElementEditor.getBoundTextElementPosition(\n              container,\n              updatedTextElement as ExcalidrawTextElementWithContainer,\n            );\n          coordX = boundTextCoords.x;\n          coordY = boundTextCoords.y;\n        }\n        const propertiesUpdated = textPropertiesUpdated(\n          updatedTextElement,\n          editable,\n        );\n        const containerDims = getContainerDims(container);\n        // using editor.style.height to get the accurate height of text editor\n        const editorHeight = Number(editable.style.height.slice(0, -2));\n        if (editorHeight > 0) {\n          textElementHeight = editorHeight;\n        }\n        if (propertiesUpdated) {\n          // update height of the editor after properties updated\n          textElementHeight = updatedTextElement.height;\n        }\n\n        let originalContainerData;\n        if (propertiesUpdated) {\n          originalContainerData = updateOriginalContainerCache(\n            container.id,\n            containerDims.height,\n          );\n        } else {\n          originalContainerData = originalContainerCache[container.id];\n          if (!originalContainerData) {\n            originalContainerData = updateOriginalContainerCache(\n              container.id,\n              containerDims.height,\n            );\n          }\n        }\n\n        maxWidth = getMaxContainerWidth(container);\n        maxHeight = getMaxContainerHeight(container);\n\n        // autogrow container height if text exceeds\n        if (!isArrowElement(container) && textElementHeight > maxHeight) {\n          const diff = Math.min(\n            textElementHeight - maxHeight,\n            approxLineHeight,\n          );\n          mutateElement(container, { height: containerDims.height + diff });\n          return;\n        } else if (\n          // autoshrink container height until original container height\n          // is reached when text is removed\n          !isArrowElement(container) &&\n          containerDims.height > originalContainerData.height &&\n          textElementHeight < maxHeight\n        ) {\n          const diff = Math.min(\n            maxHeight - textElementHeight,\n            approxLineHeight,\n          );\n          mutateElement(container, { height: containerDims.height - diff });\n        }\n        // Start pushing text upward until a diff of 30px (padding)\n        // is reached\n        else {\n          const containerCoords = getContainerCoords(container);\n\n          // vertically center align the text\n          if (verticalAlign === VERTICAL_ALIGN.MIDDLE) {\n            if (!isArrowElement(container)) {\n              coordY =\n                containerCoords.y + maxHeight / 2 - textElementHeight / 2;\n            }\n          }\n          if (verticalAlign === VERTICAL_ALIGN.BOTTOM) {\n            coordY = containerCoords.y + (maxHeight - textElementHeight);\n          }\n        }\n      }\n      const [viewportX, viewportY] = getViewportCoords(coordX, coordY);\n      const initialSelectionStart = editable.selectionStart;\n      const initialSelectionEnd = editable.selectionEnd;\n      const initialLength = editable.value.length;\n      editable.value = updatedTextElement.originalText;\n\n      // restore cursor position after value updated so it doesn't\n      // go to the end of text when container auto expanded\n      if (\n        initialSelectionStart === initialSelectionEnd &&\n        initialSelectionEnd !== initialLength\n      ) {\n        // get diff between length and selection end and shift\n        // the cursor by \"diff\" times to position correctly\n        const diff = initialLength - initialSelectionEnd;\n        editable.selectionStart = editable.value.length - diff;\n        editable.selectionEnd = editable.value.length - diff;\n      }\n\n      const lines = updatedTextElement.originalText.split(\"\\n\");\n      const lineHeight = updatedTextElement.containerId\n        ? approxLineHeight\n        : updatedTextElement.height / lines.length;\n      if (!container) {\n        maxWidth = (appState.width - 8 - viewportX) / appState.zoom.value;\n        textElementWidth = Math.min(textElementWidth, maxWidth);\n      } else if (isFirefox || isSafari) {\n        // As firefox, Safari needs little higher dimensions on DOM\n        textElementWidth += 0.5;\n      }\n      // Make sure text editor height doesn't go beyond viewport\n      const editorMaxHeight =\n        (appState.height - viewportY) / appState.zoom.value;\n      Object.assign(editable.style, {\n        font: getFontString(updatedTextElement),\n        // must be defined *after* font ¯\\_(ツ)_/¯\n        lineHeight: `${lineHeight}px`,\n        width: `${textElementWidth}px`,\n        height: `${textElementHeight}px`,\n        left: `${viewportX}px`,\n        top: `${viewportY}px`,\n        transform: getTransform(\n          textElementWidth,\n          textElementHeight,\n          getTextElementAngle(updatedTextElement),\n          appState,\n          maxWidth,\n          editorMaxHeight,\n        ),\n        textAlign,\n        verticalAlign,\n        color: updatedTextElement.strokeColor,\n        opacity: updatedTextElement.opacity / 100,\n        filter: \"var(--theme-filter)\",\n        maxHeight: `${editorMaxHeight}px`,\n      });\n      // For some reason updating font attribute doesn't set font family\n      // hence updating font family explicitly for test environment\n      if (isTestEnv()) {\n        editable.style.fontFamily = getFontFamilyString(updatedTextElement);\n      }\n      mutateElement(updatedTextElement, { x: coordX, y: coordY });\n    }\n  };\n\n  const editable = document.createElement(\"textarea\");\n\n  editable.dir = \"auto\";\n  editable.tabIndex = 0;\n  editable.dataset.type = \"wysiwyg\";\n  // prevent line wrapping on Safari\n  editable.wrap = \"off\";\n  editable.classList.add(\"excalidraw-wysiwyg\");\n\n  let whiteSpace = \"pre\";\n  let wordBreak = \"normal\";\n\n  if (isBoundToContainer(element)) {\n    whiteSpace = \"pre-wrap\";\n    wordBreak = \"break-word\";\n  }\n  Object.assign(editable.style, {\n    position: \"absolute\",\n    display: \"inline-block\",\n    minHeight: \"1em\",\n    backfaceVisibility: \"hidden\",\n    margin: 0,\n    padding: 0,\n    border: 0,\n    outline: 0,\n    resize: \"none\",\n    background: \"transparent\",\n    overflow: \"hidden\",\n    // must be specified because in dark mode canvas creates a stacking context\n    zIndex: \"var(--zIndex-wysiwyg)\",\n    wordBreak,\n    // prevent line wrapping (`whitespace: nowrap` doesn't work on FF)\n    whiteSpace,\n    overflowWrap: \"break-word\",\n    boxSizing: \"content-box\",\n  });\n  updateWysiwygStyle();\n\n  if (onChange) {\n    editable.onpaste = async (event) => {\n      const clipboardData = await parseClipboard(event, true);\n      if (!clipboardData.text) {\n        return;\n      }\n      const data = normalizeText(clipboardData.text);\n      if (!data) {\n        return;\n      }\n      const container = getContainerElement(element);\n\n      const font = getFontString({\n        fontSize: app.state.currentItemFontSize,\n        fontFamily: app.state.currentItemFontFamily,\n      });\n      if (container) {\n        const wrappedText = wrapText(\n          `${editable.value}${data}`,\n          font,\n          getMaxContainerWidth(container),\n        );\n        const width = getTextWidth(wrappedText, font);\n        editable.style.width = `${width}px`;\n      }\n    };\n\n    editable.oninput = () => {\n      const updatedTextElement = Scene.getScene(element)?.getElement(\n        id,\n      ) as ExcalidrawTextElement;\n      const font = getFontString(updatedTextElement);\n      if (isBoundToContainer(element)) {\n        const container = getContainerElement(element);\n        const wrappedText = wrapText(\n          normalizeText(editable.value),\n          font,\n          getMaxContainerWidth(container!),\n        );\n        const { width, height } = measureText(wrappedText, font);\n        editable.style.width = `${width}px`;\n        editable.style.height = `${height}px`;\n      }\n      onChange(normalizeText(editable.value));\n    };\n  }\n\n  editable.onkeydown = (event) => {\n    if (!event.shiftKey && actionZoomIn.keyTest(event)) {\n      event.preventDefault();\n      app.actionManager.executeAction(actionZoomIn);\n      updateWysiwygStyle();\n    } else if (!event.shiftKey && actionZoomOut.keyTest(event)) {\n      event.preventDefault();\n      app.actionManager.executeAction(actionZoomOut);\n      updateWysiwygStyle();\n    } else if (actionDecreaseFontSize.keyTest(event)) {\n      app.actionManager.executeAction(actionDecreaseFontSize);\n    } else if (actionIncreaseFontSize.keyTest(event)) {\n      app.actionManager.executeAction(actionIncreaseFontSize);\n    } else if (event.key === KEYS.ESCAPE) {\n      event.preventDefault();\n      submittedViaKeyboard = true;\n      handleSubmit();\n    } else if (event.key === KEYS.ENTER && event[KEYS.CTRL_OR_CMD]) {\n      event.preventDefault();\n      if (event.isComposing || event.keyCode === 229) {\n        return;\n      }\n      submittedViaKeyboard = true;\n      handleSubmit();\n    } else if (\n      event.key === KEYS.TAB ||\n      (event[KEYS.CTRL_OR_CMD] &&\n        (event.code === CODES.BRACKET_LEFT ||\n          event.code === CODES.BRACKET_RIGHT))\n    ) {\n      event.preventDefault();\n      if (event.isComposing) {\n        return;\n      } else if (event.shiftKey || event.code === CODES.BRACKET_LEFT) {\n        outdent();\n      } else {\n        indent();\n      }\n      // We must send an input event to resize the element\n      editable.dispatchEvent(new Event(\"input\"));\n    }\n  };\n\n  const TAB_SIZE = 4;\n  const TAB = \" \".repeat(TAB_SIZE);\n  const RE_LEADING_TAB = new RegExp(`^ {1,${TAB_SIZE}}`);\n  const indent = () => {\n    const { selectionStart, selectionEnd } = editable;\n    const linesStartIndices = getSelectedLinesStartIndices();\n\n    let value = editable.value;\n    linesStartIndices.forEach((startIndex: number) => {\n      const startValue = value.slice(0, startIndex);\n      const endValue = value.slice(startIndex);\n\n      value = `${startValue}${TAB}${endValue}`;\n    });\n\n    editable.value = value;\n\n    editable.selectionStart = selectionStart + TAB_SIZE;\n    editable.selectionEnd = selectionEnd + TAB_SIZE * linesStartIndices.length;\n  };\n\n  const outdent = () => {\n    const { selectionStart, selectionEnd } = editable;\n    const linesStartIndices = getSelectedLinesStartIndices();\n    const removedTabs: number[] = [];\n\n    let value = editable.value;\n    linesStartIndices.forEach((startIndex) => {\n      const tabMatch = value\n        .slice(startIndex, startIndex + TAB_SIZE)\n        .match(RE_LEADING_TAB);\n\n      if (tabMatch) {\n        const startValue = value.slice(0, startIndex);\n        const endValue = value.slice(startIndex + tabMatch[0].length);\n\n        // Delete a tab from the line\n        value = `${startValue}${endValue}`;\n        removedTabs.push(startIndex);\n      }\n    });\n\n    editable.value = value;\n\n    if (removedTabs.length) {\n      if (selectionStart > removedTabs[removedTabs.length - 1]) {\n        editable.selectionStart = Math.max(\n          selectionStart - TAB_SIZE,\n          removedTabs[removedTabs.length - 1],\n        );\n      } else {\n        // If the cursor is before the first tab removed, ex:\n        // Line| #1\n        //     Line #2\n        // Lin|e #3\n        // we should reset the selectionStart to his initial value.\n        editable.selectionStart = selectionStart;\n      }\n      editable.selectionEnd = Math.max(\n        editable.selectionStart,\n        selectionEnd - TAB_SIZE * removedTabs.length,\n      );\n    }\n  };\n\n  /**\n   * @returns indices of start positions of selected lines, in reverse order\n   */\n  const getSelectedLinesStartIndices = () => {\n    let { selectionStart, selectionEnd, value } = editable;\n\n    // chars before selectionStart on the same line\n    const startOffset = value.slice(0, selectionStart).match(/[^\\n]*$/)![0]\n      .length;\n    // put caret at the start of the line\n    selectionStart = selectionStart - startOffset;\n\n    const selected = value.slice(selectionStart, selectionEnd);\n\n    return selected\n      .split(\"\\n\")\n      .reduce(\n        (startIndices, line, idx, lines) =>\n          startIndices.concat(\n            idx\n              ? // curr line index is prev line's start + prev line's length + \\n\n                startIndices[idx - 1] + lines[idx - 1].length + 1\n              : // first selected line\n                selectionStart,\n          ),\n        [] as number[],\n      )\n      .reverse();\n  };\n\n  const stopEvent = (event: Event) => {\n    event.preventDefault();\n    event.stopPropagation();\n  };\n\n  // using a state variable instead of passing it to the handleSubmit callback\n  // so that we don't need to create separate a callback for event handlers\n  let submittedViaKeyboard = false;\n  const handleSubmit = () => {\n    // cleanup must be run before onSubmit otherwise when app blurs the wysiwyg\n    // it'd get stuck in an infinite loop of blur→onSubmit after we re-focus the\n    // wysiwyg on update\n    cleanup();\n    const updateElement = Scene.getScene(element)?.getElement(\n      element.id,\n    ) as ExcalidrawTextElement;\n    if (!updateElement) {\n      return;\n    }\n    let text = editable.value;\n    const container = getContainerElement(updateElement);\n\n    if (container) {\n      text = updateElement.text;\n      if (editable.value.trim()) {\n        const boundTextElementId = getBoundTextElementId(container);\n        if (!boundTextElementId || boundTextElementId !== element.id) {\n          mutateElement(container, {\n            boundElements: (container.boundElements || []).concat({\n              type: \"text\",\n              id: element.id,\n            }),\n          });\n        }\n      } else {\n        mutateElement(container, {\n          boundElements: container.boundElements?.filter(\n            (ele) =>\n              !isTextElement(\n                ele as ExcalidrawTextElement | ExcalidrawLinearElement,\n              ),\n          ),\n        });\n      }\n      redrawTextBoundingBox(updateElement, container);\n    }\n\n    onSubmit({\n      text,\n      viaKeyboard: submittedViaKeyboard,\n      originalText: editable.value,\n    });\n  };\n\n  const cleanup = () => {\n    if (isDestroyed) {\n      return;\n    }\n    isDestroyed = true;\n    // remove events to ensure they don't late-fire\n    editable.onblur = null;\n    editable.oninput = null;\n    editable.onkeydown = null;\n\n    if (observer) {\n      observer.disconnect();\n    }\n\n    window.removeEventListener(\"resize\", updateWysiwygStyle);\n    window.removeEventListener(\"wheel\", stopEvent, true);\n    window.removeEventListener(\"pointerdown\", onPointerDown);\n    window.removeEventListener(\"pointerup\", bindBlurEvent);\n    window.removeEventListener(\"blur\", handleSubmit);\n\n    unbindUpdate();\n\n    editable.remove();\n  };\n\n  const bindBlurEvent = (event?: MouseEvent) => {\n    window.removeEventListener(\"pointerup\", bindBlurEvent);\n    // Deferred so that the pointerdown that initiates the wysiwyg doesn't\n    // trigger the blur on ensuing pointerup.\n    // Also to handle cases such as picking a color which would trigger a blur\n    // in that same tick.\n    const target = event?.target;\n\n    const isTargetColorPicker =\n      target instanceof HTMLInputElement &&\n      target.closest(\".color-picker-input\") &&\n      isWritableElement(target);\n\n    setTimeout(() => {\n      editable.onblur = handleSubmit;\n      if (target && isTargetColorPicker) {\n        target.onblur = () => {\n          editable.focus();\n        };\n      }\n      // case: clicking on the same property → no change → no update → no focus\n      if (!isTargetColorPicker) {\n        editable.focus();\n      }\n    });\n  };\n\n  // prevent blur when changing properties from the menu\n  const onPointerDown = (event: MouseEvent) => {\n    const isTargetColorPicker =\n      event.target instanceof HTMLInputElement &&\n      event.target.closest(\".color-picker-input\") &&\n      isWritableElement(event.target);\n    if (\n      ((event.target instanceof HTMLElement ||\n        event.target instanceof SVGElement) &&\n        event.target.closest(`.${CLASSES.SHAPE_ACTIONS_MENU}`) &&\n        !isWritableElement(event.target)) ||\n      isTargetColorPicker\n    ) {\n      editable.onblur = null;\n      window.addEventListener(\"pointerup\", bindBlurEvent);\n      // handle edge-case where pointerup doesn't fire e.g. due to user\n      // alt-tabbing away\n      window.addEventListener(\"blur\", handleSubmit);\n    }\n  };\n\n  // handle updates of textElement properties of editing element\n  const unbindUpdate = Scene.getScene(element)!.addCallback(() => {\n    updateWysiwygStyle();\n    const isColorPickerActive = !!document.activeElement?.closest(\n      \".color-picker-input\",\n    );\n    if (!isColorPickerActive) {\n      editable.focus();\n    }\n  });\n\n  // ---------------------------------------------------------------------------\n\n  let isDestroyed = false;\n\n  // select on init (focusing is done separately inside the bindBlurEvent()\n  // because we need it to happen *after* the blur event from `pointerdown`)\n  editable.select();\n  bindBlurEvent();\n\n  // reposition wysiwyg in case of canvas is resized. Using ResizeObserver\n  // is preferred so we catch changes from host, where window may not resize.\n  let observer: ResizeObserver | null = null;\n  if (canvas && \"ResizeObserver\" in window) {\n    observer = new window.ResizeObserver(() => {\n      updateWysiwygStyle();\n    });\n    observer.observe(canvas);\n  } else {\n    window.addEventListener(\"resize\", updateWysiwygStyle);\n  }\n\n  window.addEventListener(\"pointerdown\", onPointerDown);\n  window.addEventListener(\"wheel\", stopEvent, {\n    passive: false,\n    capture: true,\n  });\n  excalidrawContainer\n    ?.querySelector(\".excalidraw-textEditorContainer\")!\n    .appendChild(editable);\n};\n","import {\n  ExcalidrawElement,\n  NonDeletedExcalidrawElement,\n  PointerType,\n} from \"./types\";\n\nimport { getElementAbsoluteCoords } from \"./bounds\";\nimport { rotate } from \"../math\";\nimport { AppState, Zoom } from \"../types\";\nimport { isTextElement } from \".\";\nimport { isLinearElement } from \"./typeChecks\";\nimport { DEFAULT_SPACING } from \"../renderer/renderScene\";\n\nexport type TransformHandleDirection =\n  | \"n\"\n  | \"s\"\n  | \"w\"\n  | \"e\"\n  | \"nw\"\n  | \"ne\"\n  | \"sw\"\n  | \"se\";\n\nexport type TransformHandleType = TransformHandleDirection | \"rotation\";\n\nexport type TransformHandle = [number, number, number, number];\nexport type TransformHandles = Partial<{\n  [T in TransformHandleType]: TransformHandle;\n}>;\nexport type MaybeTransformHandleType = TransformHandleType | false;\n\nconst transformHandleSizes: { [k in PointerType]: number } = {\n  mouse: 8,\n  pen: 16,\n  touch: 28,\n};\n\nconst ROTATION_RESIZE_HANDLE_GAP = 16;\n\nexport const OMIT_SIDES_FOR_MULTIPLE_ELEMENTS = {\n  e: true,\n  s: true,\n  n: true,\n  w: true,\n};\n\nconst OMIT_SIDES_FOR_TEXT_ELEMENT = {\n  e: true,\n  s: true,\n  n: true,\n  w: true,\n};\n\nconst OMIT_SIDES_FOR_LINE_SLASH = {\n  e: true,\n  s: true,\n  n: true,\n  w: true,\n  nw: true,\n  se: true,\n};\n\nconst OMIT_SIDES_FOR_LINE_BACKSLASH = {\n  e: true,\n  s: true,\n  n: true,\n  w: true,\n};\n\nconst generateTransformHandle = (\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  cx: number,\n  cy: number,\n  angle: number,\n): TransformHandle => {\n  const [xx, yy] = rotate(x + width / 2, y + height / 2, cx, cy, angle);\n  return [xx - width / 2, yy - height / 2, width, height];\n};\n\nexport const getTransformHandlesFromCoords = (\n  [x1, y1, x2, y2, cx, cy]: [number, number, number, number, number, number],\n  angle: number,\n  zoom: Zoom,\n  pointerType: PointerType,\n  omitSides: { [T in TransformHandleType]?: boolean } = {},\n  margin = 4,\n): TransformHandles => {\n  const size = transformHandleSizes[pointerType];\n  const handleWidth = size / zoom.value;\n  const handleHeight = size / zoom.value;\n\n  const handleMarginX = size / zoom.value;\n  const handleMarginY = size / zoom.value;\n\n  const width = x2 - x1;\n  const height = y2 - y1;\n  const dashedLineMargin = margin / zoom.value;\n  const centeringOffset = (size - DEFAULT_SPACING * 2) / (2 * zoom.value);\n\n  const transformHandles: TransformHandles = {\n    nw: omitSides.nw\n      ? undefined\n      : generateTransformHandle(\n          x1 - dashedLineMargin - handleMarginX + centeringOffset,\n          y1 - dashedLineMargin - handleMarginY + centeringOffset,\n          handleWidth,\n          handleHeight,\n          cx,\n          cy,\n          angle,\n        ),\n    ne: omitSides.ne\n      ? undefined\n      : generateTransformHandle(\n          x2 + dashedLineMargin - centeringOffset,\n          y1 - dashedLineMargin - handleMarginY + centeringOffset,\n          handleWidth,\n          handleHeight,\n          cx,\n          cy,\n          angle,\n        ),\n    sw: omitSides.sw\n      ? undefined\n      : generateTransformHandle(\n          x1 - dashedLineMargin - handleMarginX + centeringOffset,\n          y2 + dashedLineMargin - centeringOffset,\n          handleWidth,\n          handleHeight,\n          cx,\n          cy,\n          angle,\n        ),\n    se: omitSides.se\n      ? undefined\n      : generateTransformHandle(\n          x2 + dashedLineMargin - centeringOffset,\n          y2 + dashedLineMargin - centeringOffset,\n          handleWidth,\n          handleHeight,\n          cx,\n          cy,\n          angle,\n        ),\n    rotation: omitSides.rotation\n      ? undefined\n      : generateTransformHandle(\n          x1 + width / 2 - handleWidth / 2,\n          y1 -\n            dashedLineMargin -\n            handleMarginY +\n            centeringOffset -\n            ROTATION_RESIZE_HANDLE_GAP / zoom.value,\n          handleWidth,\n          handleHeight,\n          cx,\n          cy,\n          angle,\n        ),\n  };\n\n  // We only want to show height handles (all cardinal directions)  above a certain size\n  // Note: we render using \"mouse\" size so we should also use \"mouse\" size for this check\n  const minimumSizeForEightHandles =\n    (5 * transformHandleSizes.mouse) / zoom.value;\n  if (Math.abs(width) > minimumSizeForEightHandles) {\n    if (!omitSides.n) {\n      transformHandles.n = generateTransformHandle(\n        x1 + width / 2 - handleWidth / 2,\n        y1 - dashedLineMargin - handleMarginY + centeringOffset,\n        handleWidth,\n        handleHeight,\n        cx,\n        cy,\n        angle,\n      );\n    }\n    if (!omitSides.s) {\n      transformHandles.s = generateTransformHandle(\n        x1 + width / 2 - handleWidth / 2,\n        y2 + dashedLineMargin - centeringOffset,\n        handleWidth,\n        handleHeight,\n        cx,\n        cy,\n        angle,\n      );\n    }\n  }\n  if (Math.abs(height) > minimumSizeForEightHandles) {\n    if (!omitSides.w) {\n      transformHandles.w = generateTransformHandle(\n        x1 - dashedLineMargin - handleMarginX + centeringOffset,\n        y1 + height / 2 - handleHeight / 2,\n        handleWidth,\n        handleHeight,\n        cx,\n        cy,\n        angle,\n      );\n    }\n    if (!omitSides.e) {\n      transformHandles.e = generateTransformHandle(\n        x2 + dashedLineMargin - centeringOffset,\n        y1 + height / 2 - handleHeight / 2,\n        handleWidth,\n        handleHeight,\n        cx,\n        cy,\n        angle,\n      );\n    }\n  }\n\n  return transformHandles;\n};\n\nexport const getTransformHandles = (\n  element: ExcalidrawElement,\n  zoom: Zoom,\n  pointerType: PointerType = \"mouse\",\n): TransformHandles => {\n  // so that when locked element is selected (especially when you toggle lock\n  // via keyboard) the locked element is visually distinct, indicating\n  // you can't move/resize\n  if (element.locked) {\n    return {};\n  }\n\n  let omitSides: { [T in TransformHandleType]?: boolean } = {};\n  if (element.type === \"freedraw\" || isLinearElement(element)) {\n    if (element.points.length === 2) {\n      // only check the last point because starting point is always (0,0)\n      const [, p1] = element.points;\n      if (p1[0] === 0 || p1[1] === 0) {\n        omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n      } else if (p1[0] > 0 && p1[1] < 0) {\n        omitSides = OMIT_SIDES_FOR_LINE_SLASH;\n      } else if (p1[0] > 0 && p1[1] > 0) {\n        omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n      } else if (p1[0] < 0 && p1[1] > 0) {\n        omitSides = OMIT_SIDES_FOR_LINE_SLASH;\n      } else if (p1[0] < 0 && p1[1] < 0) {\n        omitSides = OMIT_SIDES_FOR_LINE_BACKSLASH;\n      }\n    }\n  } else if (isTextElement(element)) {\n    omitSides = OMIT_SIDES_FOR_TEXT_ELEMENT;\n  }\n  const dashedLineMargin = isLinearElement(element)\n    ? DEFAULT_SPACING + 8\n    : DEFAULT_SPACING;\n  return getTransformHandlesFromCoords(\n    getElementAbsoluteCoords(element, true),\n    element.angle,\n    zoom,\n    pointerType,\n    omitSides,\n    dashedLineMargin,\n  );\n};\n\nexport const shouldShowBoundingBox = (\n  elements: NonDeletedExcalidrawElement[],\n  appState: AppState,\n) => {\n  if (appState.editingLinearElement) {\n    return false;\n  }\n  if (elements.length > 1) {\n    return true;\n  }\n  const element = elements[0];\n  if (!isLinearElement(element)) {\n    return true;\n  }\n\n  return element.points.length > 2;\n};\n","import { ROUNDNESS } from \"../constants\";\nimport { AppState } from \"../types\";\nimport { MarkNonNullable } from \"../utility-types\";\nimport {\n  ExcalidrawElement,\n  ExcalidrawTextElement,\n  ExcalidrawLinearElement,\n  ExcalidrawBindableElement,\n  ExcalidrawGenericElement,\n  ExcalidrawFreeDrawElement,\n  InitializedExcalidrawImageElement,\n  ExcalidrawImageElement,\n  ExcalidrawTextElementWithContainer,\n  ExcalidrawTextContainer,\n  RoundnessType,\n} from \"./types\";\n\nexport const isGenericElement = (\n  element: ExcalidrawElement | null,\n): element is ExcalidrawGenericElement => {\n  return (\n    element != null &&\n    (element.type === \"selection\" ||\n      element.type === \"rectangle\" ||\n      element.type === \"diamond\" ||\n      element.type === \"ellipse\")\n  );\n};\n\nexport const isInitializedImageElement = (\n  element: ExcalidrawElement | null,\n): element is InitializedExcalidrawImageElement => {\n  return !!element && element.type === \"image\" && !!element.fileId;\n};\n\nexport const isImageElement = (\n  element: ExcalidrawElement | null,\n): element is ExcalidrawImageElement => {\n  return !!element && element.type === \"image\";\n};\n\nexport const isTextElement = (\n  element: ExcalidrawElement | null,\n): element is ExcalidrawTextElement => {\n  return element != null && element.type === \"text\";\n};\n\nexport const isFreeDrawElement = (\n  element?: ExcalidrawElement | null,\n): element is ExcalidrawFreeDrawElement => {\n  return element != null && isFreeDrawElementType(element.type);\n};\n\nexport const isFreeDrawElementType = (\n  elementType: ExcalidrawElement[\"type\"],\n): boolean => {\n  return elementType === \"freedraw\";\n};\n\nexport const isLinearElement = (\n  element?: ExcalidrawElement | null,\n): element is ExcalidrawLinearElement => {\n  return element != null && isLinearElementType(element.type);\n};\n\nexport const isArrowElement = (\n  element?: ExcalidrawElement | null,\n): element is ExcalidrawLinearElement => {\n  return element != null && element.type === \"arrow\";\n};\n\nexport const isLinearElementType = (\n  elementType: AppState[\"activeTool\"][\"type\"],\n): boolean => {\n  return (\n    elementType === \"arrow\" || elementType === \"line\" // || elementType === \"freedraw\"\n  );\n};\n\nexport const isBindingElement = (\n  element?: ExcalidrawElement | null,\n  includeLocked = true,\n): element is ExcalidrawLinearElement => {\n  return (\n    element != null &&\n    (!element.locked || includeLocked === true) &&\n    isBindingElementType(element.type)\n  );\n};\n\nexport const isBindingElementType = (\n  elementType: AppState[\"activeTool\"][\"type\"],\n): boolean => {\n  return elementType === \"arrow\";\n};\n\nexport const isBindableElement = (\n  element: ExcalidrawElement | null,\n  includeLocked = true,\n): element is ExcalidrawBindableElement => {\n  return (\n    element != null &&\n    (!element.locked || includeLocked === true) &&\n    (element.type === \"rectangle\" ||\n      element.type === \"diamond\" ||\n      element.type === \"ellipse\" ||\n      element.type === \"image\" ||\n      (element.type === \"text\" && !element.containerId))\n  );\n};\n\nexport const isTextBindableContainer = (\n  element: ExcalidrawElement | null,\n  includeLocked = true,\n): element is ExcalidrawTextContainer => {\n  return (\n    element != null &&\n    (!element.locked || includeLocked === true) &&\n    (element.type === \"rectangle\" ||\n      element.type === \"diamond\" ||\n      element.type === \"ellipse\" ||\n      element.type === \"image\" ||\n      isArrowElement(element))\n  );\n};\n\nexport const isExcalidrawElement = (element: any): boolean => {\n  return (\n    element?.type === \"text\" ||\n    element?.type === \"diamond\" ||\n    element?.type === \"rectangle\" ||\n    element?.type === \"ellipse\" ||\n    element?.type === \"arrow\" ||\n    element?.type === \"freedraw\" ||\n    element?.type === \"line\"\n  );\n};\n\nexport const hasBoundTextElement = (\n  element: ExcalidrawElement | null,\n): element is MarkNonNullable<ExcalidrawBindableElement, \"boundElements\"> => {\n  return (\n    isTextBindableContainer(element) &&\n    !!element.boundElements?.some(({ type }) => type === \"text\")\n  );\n};\n\nexport const isBoundToContainer = (\n  element: ExcalidrawElement | null,\n): element is ExcalidrawTextElementWithContainer => {\n  return (\n    element !== null &&\n    \"containerId\" in element &&\n    element.containerId !== null &&\n    isTextElement(element)\n  );\n};\n\nexport const isUsingAdaptiveRadius = (type: string) => type === \"rectangle\";\n\nexport const isUsingProportionalRadius = (type: string) =>\n  type === \"line\" || type === \"arrow\" || type === \"diamond\";\n\nexport const canApplyRoundnessTypeToElement = (\n  roundnessType: RoundnessType,\n  element: ExcalidrawElement,\n) => {\n  if (\n    (roundnessType === ROUNDNESS.ADAPTIVE_RADIUS ||\n      // if legacy roundness, it can be applied to elements that currently\n      // use adaptive radius\n      roundnessType === ROUNDNESS.LEGACY) &&\n    isUsingAdaptiveRadius(element.type)\n  ) {\n    return true;\n  }\n  if (\n    roundnessType === ROUNDNESS.PROPORTIONAL_RADIUS &&\n    isUsingProportionalRadius(element.type)\n  ) {\n    return true;\n  }\n\n  return false;\n};\n\nexport const getDefaultRoundnessTypeForElement = (\n  element: ExcalidrawElement,\n) => {\n  if (\n    element.type === \"arrow\" ||\n    element.type === \"line\" ||\n    element.type === \"diamond\"\n  ) {\n    return {\n      type: ROUNDNESS.PROPORTIONAL_RADIUS,\n    };\n  }\n\n  if (element.type === \"rectangle\") {\n    return {\n      type: ROUNDNESS.ADAPTIVE_RADIUS,\n    };\n  }\n\n  return null;\n};\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n  if (isNativeReflectConstruct()) {\n    _construct = Reflect.construct.bind();\n  } else {\n    _construct = function _construct(Parent, args, Class) {\n      var a = [null];\n      a.push.apply(a, args);\n      var Constructor = Function.bind.apply(Parent, a);\n      var instance = new Constructor();\n      if (Class) setPrototypeOf(instance, Class.prototype);\n      return instance;\n    };\n  }\n  return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n  var _cache = typeof Map === \"function\" ? new Map() : undefined;\n  _wrapNativeSuper = function _wrapNativeSuper(Class) {\n    if (Class === null || !isNativeFunction(Class)) return Class;\n    if (typeof Class !== \"function\") {\n      throw new TypeError(\"Super expression must either be null or a function\");\n    }\n    if (typeof _cache !== \"undefined\") {\n      if (_cache.has(Class)) return _cache.get(Class);\n      _cache.set(Class, Wrapper);\n    }\n    function Wrapper() {\n      return construct(Class, arguments, getPrototypeOf(this).constructor);\n    }\n    Wrapper.prototype = Object.create(Class.prototype, {\n      constructor: {\n        value: Wrapper,\n        enumerable: false,\n        writable: true,\n        configurable: true\n      }\n    });\n    return setPrototypeOf(Wrapper, Class);\n  };\n  return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n  return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","type CANVAS_ERROR_NAMES = \"CANVAS_ERROR\" | \"CANVAS_POSSIBLY_TOO_BIG\";\n\nexport class CanvasError extends Error {\n  constructor(\n    message: string = \"Couldn't export canvas.\",\n    name: CANVAS_ERROR_NAMES = \"CANVAS_ERROR\",\n  ) {\n    super();\n    this.name = name;\n    this.message = message;\n  }\n}\n\nexport class AbortError extends DOMException {\n  constructor(message: string = \"Request Aborted\") {\n    super(message, \"AbortError\");\n  }\n}\n","import { GroupId, ExcalidrawElement, NonDeleted } from \"./element/types\";\nimport { AppState } from \"./types\";\nimport { getSelectedElements } from \"./scene\";\nimport { getBoundTextElement } from \"./element/textElement\";\n\nexport const selectGroup = (\n  groupId: GroupId,\n  appState: AppState,\n  elements: readonly NonDeleted<ExcalidrawElement>[],\n): AppState => {\n  const elementsInGroup = elements.filter((element) =>\n    element.groupIds.includes(groupId),\n  );\n\n  if (elementsInGroup.length < 2) {\n    if (\n      appState.selectedGroupIds[groupId] ||\n      appState.editingGroupId === groupId\n    ) {\n      return {\n        ...appState,\n        selectedGroupIds: { ...appState.selectedGroupIds, [groupId]: false },\n        editingGroupId: null,\n      };\n    }\n    return appState;\n  }\n\n  return {\n    ...appState,\n    selectedGroupIds: { ...appState.selectedGroupIds, [groupId]: true },\n    selectedElementIds: {\n      ...appState.selectedElementIds,\n      ...Object.fromEntries(\n        elementsInGroup.map((element) => [element.id, true]),\n      ),\n    },\n  };\n};\n\n/**\n * If the element's group is selected, don't render an individual\n * selection border around it.\n */\nexport const isSelectedViaGroup = (\n  appState: AppState,\n  element: ExcalidrawElement,\n) => getSelectedGroupForElement(appState, element) != null;\n\nexport const getSelectedGroupForElement = (\n  appState: AppState,\n  element: ExcalidrawElement,\n) =>\n  element.groupIds\n    .filter((groupId) => groupId !== appState.editingGroupId)\n    .find((groupId) => appState.selectedGroupIds[groupId]);\n\nexport const getSelectedGroupIds = (appState: AppState): GroupId[] =>\n  Object.entries(appState.selectedGroupIds)\n    .filter(([groupId, isSelected]) => isSelected)\n    .map(([groupId, isSelected]) => groupId);\n\n/**\n * When you select an element, you often want to actually select the whole group it's in, unless\n * you're currently editing that group.\n */\nexport const selectGroupsForSelectedElements = (\n  appState: AppState,\n  elements: readonly NonDeleted<ExcalidrawElement>[],\n): AppState => {\n  let nextAppState: AppState = { ...appState, selectedGroupIds: {} };\n\n  const selectedElements = getSelectedElements(elements, appState);\n\n  if (!selectedElements.length) {\n    return { ...nextAppState, editingGroupId: null };\n  }\n\n  for (const selectedElement of selectedElements) {\n    let groupIds = selectedElement.groupIds;\n    if (appState.editingGroupId) {\n      // handle the case where a group is nested within a group\n      const indexOfEditingGroup = groupIds.indexOf(appState.editingGroupId);\n      if (indexOfEditingGroup > -1) {\n        groupIds = groupIds.slice(0, indexOfEditingGroup);\n      }\n    }\n    if (groupIds.length > 0) {\n      const groupId = groupIds[groupIds.length - 1];\n      nextAppState = selectGroup(groupId, nextAppState, elements);\n    }\n  }\n\n  return nextAppState;\n};\n\nexport const editGroupForSelectedElement = (\n  appState: AppState,\n  element: NonDeleted<ExcalidrawElement>,\n): AppState => {\n  return {\n    ...appState,\n    editingGroupId: element.groupIds.length ? element.groupIds[0] : null,\n    selectedGroupIds: {},\n    selectedElementIds: {\n      [element.id]: true,\n    },\n  };\n};\n\nexport const isElementInGroup = (element: ExcalidrawElement, groupId: string) =>\n  element.groupIds.includes(groupId);\n\nexport const getElementsInGroup = (\n  elements: readonly ExcalidrawElement[],\n  groupId: string,\n) => elements.filter((element) => isElementInGroup(element, groupId));\n\nexport const getSelectedGroupIdForElement = (\n  element: ExcalidrawElement,\n  selectedGroupIds: { [groupId: string]: boolean },\n) => element.groupIds.find((groupId) => selectedGroupIds[groupId]);\n\nexport const getNewGroupIdsForDuplication = (\n  groupIds: ExcalidrawElement[\"groupIds\"],\n  editingGroupId: AppState[\"editingGroupId\"],\n  mapper: (groupId: GroupId) => GroupId,\n) => {\n  const copy = [...groupIds];\n  const positionOfEditingGroupId = editingGroupId\n    ? groupIds.indexOf(editingGroupId)\n    : -1;\n  const endIndex =\n    positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;\n  for (let index = 0; index < endIndex; index++) {\n    copy[index] = mapper(copy[index]);\n  }\n\n  return copy;\n};\n\nexport const addToGroup = (\n  prevGroupIds: ExcalidrawElement[\"groupIds\"],\n  newGroupId: GroupId,\n  editingGroupId: AppState[\"editingGroupId\"],\n) => {\n  // insert before the editingGroupId, or push to the end.\n  const groupIds = [...prevGroupIds];\n  const positionOfEditingGroupId = editingGroupId\n    ? groupIds.indexOf(editingGroupId)\n    : -1;\n  const positionToInsert =\n    positionOfEditingGroupId > -1 ? positionOfEditingGroupId : groupIds.length;\n  groupIds.splice(positionToInsert, 0, newGroupId);\n  return groupIds;\n};\n\nexport const removeFromSelectedGroups = (\n  groupIds: ExcalidrawElement[\"groupIds\"],\n  selectedGroupIds: { [groupId: string]: boolean },\n) => groupIds.filter((groupId) => !selectedGroupIds[groupId]);\n\nexport const getMaximumGroups = (\n  elements: ExcalidrawElement[],\n): ExcalidrawElement[][] => {\n  const groups: Map<String, ExcalidrawElement[]> = new Map<\n    String,\n    ExcalidrawElement[]\n  >();\n\n  elements.forEach((element: ExcalidrawElement) => {\n    const groupId =\n      element.groupIds.length === 0\n        ? element.id\n        : element.groupIds[element.groupIds.length - 1];\n\n    const currentGroupMembers = groups.get(groupId) || [];\n\n    // Include bound text if present when grouping\n    const boundTextElement = getBoundTextElement(element);\n    if (boundTextElement) {\n      currentGroupMembers.push(boundTextElement);\n    }\n    groups.set(groupId, [...currentGroupMembers, element]);\n  });\n\n  return Array.from(groups.values());\n};\n","import { useCallback, useState } from \"react\";\n\nexport const useCallbackRefState = <T>() => {\n  const [refValue, setRefValue] = useState<T | null>(null);\n  const refCallback = useCallback((value: T | null) => setRefValue(value), []);\n  return [refValue, refCallback] as const;\n};\n","import fallbackLangData from \"./locales/en.json\";\nimport percentages from \"./locales/percentages.json\";\nimport { ENV } from \"./constants\";\nimport { jotaiScope, jotaiStore } from \"./jotai\";\nimport { atom, useAtomValue } from \"jotai\";\n\nconst COMPLETION_THRESHOLD = 85;\n\nexport interface Language {\n  code: string;\n  label: string;\n  rtl?: boolean;\n}\n\nexport const defaultLang = { code: \"en\", label: \"English\" };\n\nconst allLanguages: Language[] = [\n  { code: \"ar-SA\", label: \"العربية\", rtl: true },\n  { code: \"bg-BG\", label: \"Български\" },\n  { code: \"ca-ES\", label: \"Català\" },\n  { code: \"cs-CZ\", label: \"Česky\" },\n  { code: \"de-DE\", label: \"Deutsch\" },\n  { code: \"el-GR\", label: \"Ελληνικά\" },\n  { code: \"es-ES\", label: \"Español\" },\n  { code: \"eu-ES\", label: \"Euskara\" },\n  { code: \"fa-IR\", label: \"فارسی\", rtl: true },\n  { code: \"fi-FI\", label: \"Suomi\" },\n  { code: \"fr-FR\", label: \"Français\" },\n  { code: \"gl-ES\", label: \"Galego\" },\n  { code: \"he-IL\", label: \"עברית\", rtl: true },\n  { code: \"hi-IN\", label: \"हिन्दी\" },\n  { code: \"hu-HU\", label: \"Magyar\" },\n  { code: \"id-ID\", label: \"Bahasa Indonesia\" },\n  { code: \"it-IT\", label: \"Italiano\" },\n  { code: \"ja-JP\", label: \"日本語\" },\n  { code: \"kab-KAB\", label: \"Taqbaylit\" },\n  { code: \"kk-KZ\", label: \"Қазақ тілі\" },\n  { code: \"ko-KR\", label: \"한국어\" },\n  { code: \"ku-TR\", label: \"Kurdî\" },\n  { code: \"lt-LT\", label: \"Lietuvių\" },\n  { code: \"lv-LV\", label: \"Latviešu\" },\n  { code: \"my-MM\", label: \"Burmese\" },\n  { code: \"nb-NO\", label: \"Norsk bokmål\" },\n  { code: \"nl-NL\", label: \"Nederlands\" },\n  { code: \"nn-NO\", label: \"Norsk nynorsk\" },\n  { code: \"oc-FR\", label: \"Occitan\" },\n  { code: \"pa-IN\", label: \"ਪੰਜਾਬੀ\" },\n  { code: \"pl-PL\", label: \"Polski\" },\n  { code: \"pt-BR\", label: \"Português Brasileiro\" },\n  { code: \"pt-PT\", label: \"Português\" },\n  { code: \"ro-RO\", label: \"Română\" },\n  { code: \"ru-RU\", label: \"Русский\" },\n  { code: \"sk-SK\", label: \"Slovenčina\" },\n  { code: \"sv-SE\", label: \"Svenska\" },\n  { code: \"sl-SI\", label: \"Slovenščina\" },\n  { code: \"tr-TR\", label: \"Türkçe\" },\n  { code: \"uk-UA\", label: \"Українська\" },\n  { code: \"zh-CN\", label: \"简体中文\" },\n  { code: \"zh-TW\", label: \"繁體中文\" },\n  { code: \"vi-VN\", label: \"Tiếng Việt\" },\n  { code: \"mr-IN\", label: \"मराठी\" },\n].concat([defaultLang]);\n\nexport const languages: Language[] = allLanguages\n  .sort((left, right) => (left.label > right.label ? 1 : -1))\n  .filter(\n    (lang) =>\n      (percentages as Record<string, number>)[lang.code] >=\n      COMPLETION_THRESHOLD,\n  );\n\nconst TEST_LANG_CODE = \"__test__\";\nif (process.env.NODE_ENV === ENV.DEVELOPMENT) {\n  languages.unshift(\n    { code: TEST_LANG_CODE, label: \"test language\" },\n    {\n      code: `${TEST_LANG_CODE}.rtl`,\n      label: \"\\u{202a}test language (rtl)\\u{202c}\",\n      rtl: true,\n    },\n  );\n}\n\nlet currentLang: Language = defaultLang;\nlet currentLangData = {};\n\nexport const setLanguage = async (lang: Language) => {\n  currentLang = lang;\n  document.documentElement.dir = currentLang.rtl ? \"rtl\" : \"ltr\";\n  document.documentElement.lang = currentLang.code;\n\n  if (lang.code.startsWith(TEST_LANG_CODE)) {\n    currentLangData = {};\n  } else {\n    try {\n      currentLangData = await import(\n        /* webpackChunkName: \"locales/[request]\" */ `./locales/${currentLang.code}.json`\n      );\n    } catch (error: any) {\n      console.error(`Failed to load language ${lang.code}:`, error.message);\n      currentLangData = fallbackLangData;\n    }\n  }\n\n  jotaiStore.set(editorLangCodeAtom, lang.code);\n};\n\nexport const getLanguage = () => currentLang;\n\nconst findPartsForData = (data: any, parts: string[]) => {\n  for (let index = 0; index < parts.length; ++index) {\n    const part = parts[index];\n    if (data[part] === undefined) {\n      return undefined;\n    }\n    data = data[part];\n  }\n  if (typeof data !== \"string\") {\n    return undefined;\n  }\n  return data;\n};\n\nexport const t = (\n  path: string,\n  replacement?: { [key: string]: string | number },\n) => {\n  if (currentLang.code.startsWith(TEST_LANG_CODE)) {\n    const name = replacement\n      ? `${path}(${JSON.stringify(replacement).slice(1, -1)})`\n      : path;\n    return `\\u{202a}[[${name}]]\\u{202c}`;\n  }\n\n  const parts = path.split(\".\");\n  let translation =\n    findPartsForData(currentLangData, parts) ||\n    findPartsForData(fallbackLangData, parts);\n  if (translation === undefined) {\n    throw new Error(`Can't find translation for ${path}`);\n  }\n\n  if (replacement) {\n    for (const key in replacement) {\n      translation = translation.replace(`{{${key}}}`, String(replacement[key]));\n    }\n  }\n  return translation;\n};\n\n/** @private atom used solely to rerender components using `useI18n` hook */\nconst editorLangCodeAtom = atom(defaultLang.code);\n\n// Should be used in components that fall under these cases:\n// - component is rendered as an <Excalidraw> child\n// - component is rendered internally by <Excalidraw>, but the component\n//   is memoized w/o being updated on `langCode`, `AppState`, or `UIAppState`\nexport const useI18n = () => {\n  const langCode = useAtomValue(editorLangCodeAtom, jotaiScope);\n  return { t, langCode };\n};\n","import { PrimitiveAtom, unstable_createStore, useAtom } from \"jotai\";\nimport { useLayoutEffect } from \"react\";\n\nexport const jotaiScope = Symbol();\nexport const jotaiStore = unstable_createStore();\n\nexport const useAtomWithInitialValue = <\n  T extends unknown,\n  A extends PrimitiveAtom<T>,\n>(\n  atom: A,\n  initialValue: T | (() => T),\n) => {\n  const [value, setValue] = useAtom(atom);\n\n  useLayoutEffect(() => {\n    if (typeof initialValue === \"function\") {\n      // @ts-ignore\n      setValue(initialValue());\n    } else {\n      setValue(initialValue);\n    }\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  return [value, setValue] as const;\n};\n","import { isDarwin } from \"./constants\";\n\nexport const CODES = {\n  EQUAL: \"Equal\",\n  MINUS: \"Minus\",\n  NUM_ADD: \"NumpadAdd\",\n  NUM_SUBTRACT: \"NumpadSubtract\",\n  NUM_ZERO: \"Numpad0\",\n  BRACKET_RIGHT: \"BracketRight\",\n  BRACKET_LEFT: \"BracketLeft\",\n  ONE: \"Digit1\",\n  TWO: \"Digit2\",\n  NINE: \"Digit9\",\n  QUOTE: \"Quote\",\n  ZERO: \"Digit0\",\n  SLASH: \"Slash\",\n  C: \"KeyC\",\n  D: \"KeyD\",\n  H: \"KeyH\",\n  V: \"KeyV\",\n  Z: \"KeyZ\",\n  R: \"KeyR\",\n} as const;\n\nexport const KEYS = {\n  ARROW_DOWN: \"ArrowDown\",\n  ARROW_LEFT: \"ArrowLeft\",\n  ARROW_RIGHT: \"ArrowRight\",\n  ARROW_UP: \"ArrowUp\",\n  PAGE_UP: \"PageUp\",\n  PAGE_DOWN: \"PageDown\",\n  BACKSPACE: \"Backspace\",\n  ALT: \"Alt\",\n  CTRL_OR_CMD: isDarwin ? \"metaKey\" : \"ctrlKey\",\n  DELETE: \"Delete\",\n  ENTER: \"Enter\",\n  ESCAPE: \"Escape\",\n  QUESTION_MARK: \"?\",\n  SPACE: \" \",\n  TAB: \"Tab\",\n  CHEVRON_LEFT: \"<\",\n  CHEVRON_RIGHT: \">\",\n  PERIOD: \".\",\n  COMMA: \",\",\n\n  A: \"a\",\n  C: \"c\",\n  D: \"d\",\n  E: \"e\",\n  F: \"f\",\n  G: \"g\",\n  H: \"h\",\n  I: \"i\",\n  L: \"l\",\n  O: \"o\",\n  P: \"p\",\n  Q: \"q\",\n  R: \"r\",\n  S: \"s\",\n  T: \"t\",\n  V: \"v\",\n  X: \"x\",\n  Y: \"y\",\n  Z: \"z\",\n  K: \"k\",\n\n  0: \"0\",\n  1: \"1\",\n  2: \"2\",\n  3: \"3\",\n  4: \"4\",\n  5: \"5\",\n  6: \"6\",\n  7: \"7\",\n  8: \"8\",\n  9: \"9\",\n} as const;\n\nexport type Key = keyof typeof KEYS;\n\nexport const isArrowKey = (key: string) =>\n  key === KEYS.ARROW_LEFT ||\n  key === KEYS.ARROW_RIGHT ||\n  key === KEYS.ARROW_DOWN ||\n  key === KEYS.ARROW_UP;\n\nexport const shouldResizeFromCenter = (event: MouseEvent | KeyboardEvent) =>\n  event.altKey;\n\nexport const shouldMaintainAspectRatio = (event: MouseEvent | KeyboardEvent) =>\n  event.shiftKey;\n\nexport const shouldRotateWithDiscreteAngle = (\n  event: MouseEvent | KeyboardEvent | React.PointerEvent<HTMLCanvasElement>,\n) => event.shiftKey;\n","import { NormalizedZoomValue, Point, Zoom } from \"./types\";\nimport {\n  DEFAULT_ADAPTIVE_RADIUS,\n  LINE_CONFIRM_THRESHOLD,\n  DEFAULT_PROPORTIONAL_RADIUS,\n  ROUNDNESS,\n} from \"./constants\";\nimport {\n  ExcalidrawElement,\n  ExcalidrawLinearElement,\n  NonDeleted,\n} from \"./element/types\";\nimport { getShapeForElement } from \"./renderer/renderElement\";\nimport { getCurvePathOps } from \"./element/bounds\";\nimport { Mutable } from \"./utility-types\";\n\nexport const rotate = (\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  angle: number,\n): [number, number] =>\n  // 𝑎′𝑥=(𝑎𝑥−𝑐𝑥)cos𝜃−(𝑎𝑦−𝑐𝑦)sin𝜃+𝑐𝑥\n  // 𝑎′𝑦=(𝑎𝑥−𝑐𝑥)sin𝜃+(𝑎𝑦−𝑐𝑦)cos𝜃+𝑐𝑦.\n  // https://math.stackexchange.com/questions/2204520/how-do-i-rotate-a-line-segment-in-a-specific-point-on-the-line\n  [\n    (x1 - x2) * Math.cos(angle) - (y1 - y2) * Math.sin(angle) + x2,\n    (x1 - x2) * Math.sin(angle) + (y1 - y2) * Math.cos(angle) + y2,\n  ];\n\nexport const rotatePoint = (\n  point: Point,\n  center: Point,\n  angle: number,\n): [number, number] => rotate(point[0], point[1], center[0], center[1], angle);\n\nexport const adjustXYWithRotation = (\n  sides: {\n    n?: boolean;\n    e?: boolean;\n    s?: boolean;\n    w?: boolean;\n  },\n  x: number,\n  y: number,\n  angle: number,\n  deltaX1: number,\n  deltaY1: number,\n  deltaX2: number,\n  deltaY2: number,\n): [number, number] => {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  if (sides.e && sides.w) {\n    x += deltaX1 + deltaX2;\n  } else if (sides.e) {\n    x += deltaX1 * (1 + cos);\n    y += deltaX1 * sin;\n    x += deltaX2 * (1 - cos);\n    y += deltaX2 * -sin;\n  } else if (sides.w) {\n    x += deltaX1 * (1 - cos);\n    y += deltaX1 * -sin;\n    x += deltaX2 * (1 + cos);\n    y += deltaX2 * sin;\n  }\n\n  if (sides.n && sides.s) {\n    y += deltaY1 + deltaY2;\n  } else if (sides.n) {\n    x += deltaY1 * sin;\n    y += deltaY1 * (1 - cos);\n    x += deltaY2 * -sin;\n    y += deltaY2 * (1 + cos);\n  } else if (sides.s) {\n    x += deltaY1 * -sin;\n    y += deltaY1 * (1 + cos);\n    x += deltaY2 * sin;\n    y += deltaY2 * (1 - cos);\n  }\n  return [x, y];\n};\n\nexport const getPointOnAPath = (point: Point, path: Point[]) => {\n  const [px, py] = point;\n  const [start, ...other] = path;\n  let [lastX, lastY] = start;\n  let kLine: number = 0;\n  let idx: number = 0;\n\n  // if any item in the array is true, it means that a point is\n  // on some segment of a line based path\n  const retVal = other.some(([x2, y2], i) => {\n    // we always take a line when dealing with line segments\n    const x1 = lastX;\n    const y1 = lastY;\n\n    lastX = x2;\n    lastY = y2;\n\n    // if a point is not within the domain of the line segment\n    // it is not on the line segment\n    if (px < x1 || px > x2) {\n      return false;\n    }\n\n    // check if all points lie on the same line\n    // y1 = kx1 + b, y2 = kx2 + b\n    // y2 - y1 = k(x2 - x2) -> k = (y2 - y1) / (x2 - x1)\n\n    // coefficient for the line (p0, p1)\n    const kL = (y2 - y1) / (x2 - x1);\n\n    // coefficient for the line segment (p0, point)\n    const kP1 = (py - y1) / (px - x1);\n\n    // coefficient for the line segment (point, p1)\n    const kP2 = (py - y2) / (px - x2);\n\n    // because we are basing both lines from the same starting point\n    // the only option for collinearity is having same coefficients\n\n    // using it for floating point comparisons\n    const epsilon = 0.3;\n\n    // if coefficient is more than an arbitrary epsilon,\n    // these lines are nor collinear\n    if (Math.abs(kP1 - kL) > epsilon && Math.abs(kP2 - kL) > epsilon) {\n      return false;\n    }\n\n    // store the coefficient because we are goint to need it\n    kLine = kL;\n    idx = i;\n\n    return true;\n  });\n\n  // Return a coordinate that is always on the line segment\n  if (retVal === true) {\n    return { x: point[0], y: kLine * point[0], segment: idx };\n  }\n\n  return null;\n};\n\nexport const distance2d = (x1: number, y1: number, x2: number, y2: number) => {\n  const xd = x2 - x1;\n  const yd = y2 - y1;\n  return Math.hypot(xd, yd);\n};\n\nexport const centerPoint = (a: Point, b: Point): Point => {\n  return [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2];\n};\n\n// Checks if the first and last point are close enough\n// to be considered a loop\nexport const isPathALoop = (\n  points: ExcalidrawLinearElement[\"points\"],\n  /** supply if you want the loop detection to account for current zoom */\n  zoomValue: Zoom[\"value\"] = 1 as NormalizedZoomValue,\n): boolean => {\n  if (points.length >= 3) {\n    const [first, last] = [points[0], points[points.length - 1]];\n    const distance = distance2d(first[0], first[1], last[0], last[1]);\n\n    // Adjusting LINE_CONFIRM_THRESHOLD to current zoom so that when zoomed in\n    // really close we make the threshold smaller, and vice versa.\n    return distance <= LINE_CONFIRM_THRESHOLD / zoomValue;\n  }\n  return false;\n};\n\n// Draw a line from the point to the right till infiinty\n// Check how many lines of the polygon does this infinite line intersects with\n// If the number of intersections is odd, point is in the polygon\nexport const isPointInPolygon = (\n  points: Point[],\n  x: number,\n  y: number,\n): boolean => {\n  const vertices = points.length;\n\n  // There must be at least 3 vertices in polygon\n  if (vertices < 3) {\n    return false;\n  }\n  const extreme: Point = [Number.MAX_SAFE_INTEGER, y];\n  const p: Point = [x, y];\n  let count = 0;\n  for (let i = 0; i < vertices; i++) {\n    const current = points[i];\n    const next = points[(i + 1) % vertices];\n    if (doSegmentsIntersect(current, next, p, extreme)) {\n      if (orderedColinearOrientation(current, p, next) === 0) {\n        return isPointWithinBounds(current, p, next);\n      }\n      count++;\n    }\n  }\n  // true if count is off\n  return count % 2 === 1;\n};\n\n// Returns whether `q` lies inside the segment/rectangle defined by `p` and `r`.\n// This is an approximation to \"does `q` lie on a segment `pr`\" check.\nconst isPointWithinBounds = (p: Point, q: Point, r: Point) => {\n  return (\n    q[0] <= Math.max(p[0], r[0]) &&\n    q[0] >= Math.min(p[0], r[0]) &&\n    q[1] <= Math.max(p[1], r[1]) &&\n    q[1] >= Math.min(p[1], r[1])\n  );\n};\n\n// For the ordered points p, q, r, return\n// 0 if p, q, r are colinear\n// 1 if Clockwise\n// 2 if counterclickwise\nconst orderedColinearOrientation = (p: Point, q: Point, r: Point) => {\n  const val = (q[1] - p[1]) * (r[0] - q[0]) - (q[0] - p[0]) * (r[1] - q[1]);\n  if (val === 0) {\n    return 0;\n  }\n  return val > 0 ? 1 : 2;\n};\n\n// Check is p1q1 intersects with p2q2\nconst doSegmentsIntersect = (p1: Point, q1: Point, p2: Point, q2: Point) => {\n  const o1 = orderedColinearOrientation(p1, q1, p2);\n  const o2 = orderedColinearOrientation(p1, q1, q2);\n  const o3 = orderedColinearOrientation(p2, q2, p1);\n  const o4 = orderedColinearOrientation(p2, q2, q1);\n\n  if (o1 !== o2 && o3 !== o4) {\n    return true;\n  }\n\n  // p1, q1 and p2 are colinear and p2 lies on segment p1q1\n  if (o1 === 0 && isPointWithinBounds(p1, p2, q1)) {\n    return true;\n  }\n\n  // p1, q1 and p2 are colinear and q2 lies on segment p1q1\n  if (o2 === 0 && isPointWithinBounds(p1, q2, q1)) {\n    return true;\n  }\n\n  // p2, q2 and p1 are colinear and p1 lies on segment p2q2\n  if (o3 === 0 && isPointWithinBounds(p2, p1, q2)) {\n    return true;\n  }\n\n  // p2, q2 and q1 are colinear and q1 lies on segment p2q2\n  if (o4 === 0 && isPointWithinBounds(p2, q1, q2)) {\n    return true;\n  }\n\n  return false;\n};\n\n// TODO: Rounding this point causes some shake when free drawing\nexport const getGridPoint = (\n  x: number,\n  y: number,\n  gridSize: number | null,\n): [number, number] => {\n  if (gridSize) {\n    return [\n      Math.round(x / gridSize) * gridSize,\n      Math.round(y / gridSize) * gridSize,\n    ];\n  }\n  return [x, y];\n};\n\nexport const getCornerRadius = (x: number, element: ExcalidrawElement) => {\n  if (\n    element.roundness?.type === ROUNDNESS.PROPORTIONAL_RADIUS ||\n    element.roundness?.type === ROUNDNESS.LEGACY\n  ) {\n    return x * DEFAULT_PROPORTIONAL_RADIUS;\n  }\n\n  if (element.roundness?.type === ROUNDNESS.ADAPTIVE_RADIUS) {\n    const fixedRadiusSize = element.roundness?.value ?? DEFAULT_ADAPTIVE_RADIUS;\n\n    const CUTOFF_SIZE = fixedRadiusSize / DEFAULT_PROPORTIONAL_RADIUS;\n\n    if (x <= CUTOFF_SIZE) {\n      return x * DEFAULT_PROPORTIONAL_RADIUS;\n    }\n\n    return fixedRadiusSize;\n  }\n\n  return 0;\n};\n\nexport const getControlPointsForBezierCurve = (\n  element: NonDeleted<ExcalidrawLinearElement>,\n  endPoint: Point,\n) => {\n  const shape = getShapeForElement(element as ExcalidrawLinearElement);\n  if (!shape) {\n    return null;\n  }\n\n  const ops = getCurvePathOps(shape[0]);\n  let currentP: Mutable<Point> = [0, 0];\n  let index = 0;\n  let minDistance = Infinity;\n  let controlPoints: Mutable<Point>[] | null = null;\n\n  while (index < ops.length) {\n    const { op, data } = ops[index];\n    if (op === \"move\") {\n      currentP = data as unknown as Mutable<Point>;\n    }\n    if (op === \"bcurveTo\") {\n      const p0 = currentP;\n      const p1 = [data[0], data[1]] as Mutable<Point>;\n      const p2 = [data[2], data[3]] as Mutable<Point>;\n      const p3 = [data[4], data[5]] as Mutable<Point>;\n      const distance = distance2d(p3[0], p3[1], endPoint[0], endPoint[1]);\n      if (distance < minDistance) {\n        minDistance = distance;\n        controlPoints = [p0, p1, p2, p3];\n      }\n      currentP = p3;\n    }\n    index++;\n  }\n\n  return controlPoints;\n};\n\nexport const getBezierXY = (\n  p0: Point,\n  p1: Point,\n  p2: Point,\n  p3: Point,\n  t: number,\n) => {\n  const equation = (t: number, idx: number) =>\n    Math.pow(1 - t, 3) * p3[idx] +\n    3 * t * Math.pow(1 - t, 2) * p2[idx] +\n    3 * Math.pow(t, 2) * (1 - t) * p1[idx] +\n    p0[idx] * Math.pow(t, 3);\n  const tx = equation(t, 0);\n  const ty = equation(t, 1);\n  return [tx, ty];\n};\n\nexport const getPointsInBezierCurve = (\n  element: NonDeleted<ExcalidrawLinearElement>,\n  endPoint: Point,\n) => {\n  const controlPoints: Mutable<Point>[] = getControlPointsForBezierCurve(\n    element,\n    endPoint,\n  )!;\n  if (!controlPoints) {\n    return [];\n  }\n  const pointsOnCurve: Mutable<Point>[] = [];\n  let t = 1;\n  // Take 20 points on curve for better accuracy\n  while (t > 0) {\n    const point = getBezierXY(\n      controlPoints[0],\n      controlPoints[1],\n      controlPoints[2],\n      controlPoints[3],\n      t,\n    );\n    pointsOnCurve.push([point[0], point[1]]);\n    t -= 0.05;\n  }\n  if (pointsOnCurve.length) {\n    if (arePointsEqual(pointsOnCurve.at(-1)!, endPoint)) {\n      pointsOnCurve.push([endPoint[0], endPoint[1]]);\n    }\n  }\n  return pointsOnCurve;\n};\n\nexport const getBezierCurveArcLengths = (\n  element: NonDeleted<ExcalidrawLinearElement>,\n  endPoint: Point,\n) => {\n  const arcLengths: number[] = [];\n  arcLengths[0] = 0;\n  const points = getPointsInBezierCurve(element, endPoint);\n  let index = 0;\n  let distance = 0;\n  while (index < points.length - 1) {\n    const segmentDistance = distance2d(\n      points[index][0],\n      points[index][1],\n      points[index + 1][0],\n      points[index + 1][1],\n    );\n    distance += segmentDistance;\n    arcLengths.push(distance);\n    index++;\n  }\n\n  return arcLengths;\n};\n\nexport const getBezierCurveLength = (\n  element: NonDeleted<ExcalidrawLinearElement>,\n  endPoint: Point,\n) => {\n  const arcLengths = getBezierCurveArcLengths(element, endPoint);\n  return arcLengths.at(-1) as number;\n};\n\n// This maps interval to actual interval t on the curve so that when t = 0.5, its actually the point at 50% of the length\nexport const mapIntervalToBezierT = (\n  element: NonDeleted<ExcalidrawLinearElement>,\n  endPoint: Point,\n  interval: number, // The interval between 0 to 1 for which you want to find the point on the curve,\n) => {\n  const arcLengths = getBezierCurveArcLengths(element, endPoint);\n  const pointsCount = arcLengths.length - 1;\n  const curveLength = arcLengths.at(-1) as number;\n  const targetLength = interval * curveLength;\n  let low = 0;\n  let high = pointsCount;\n  let index = 0;\n  // Doing a binary search to find the largest length that is less than the target length\n  while (low < high) {\n    index = Math.floor(low + (high - low) / 2);\n    if (arcLengths[index] < targetLength) {\n      low = index + 1;\n    } else {\n      high = index;\n    }\n  }\n  if (arcLengths[index] > targetLength) {\n    index--;\n  }\n  if (arcLengths[index] === targetLength) {\n    return index / pointsCount;\n  }\n\n  return (\n    1 -\n    (index +\n      (targetLength - arcLengths[index]) /\n        (arcLengths[index + 1] - arcLengths[index])) /\n      pointsCount\n  );\n};\n\nexport const arePointsEqual = (p1: Point, p2: Point) => {\n  return p1[0] === p2[0] && p1[1] === p2[1];\n};\n\nexport const isRightAngle = (angle: number) => {\n  // if our angles were mathematically accurate, we could just check\n  //\n  //    angle % (Math.PI / 2) === 0\n  //\n  // but since we're in floating point land, we need to round.\n  //\n  // Below, after dividing by Math.PI, a multiple of 0.5 indicates a right\n  // angle, which we can check with modulo after rounding.\n  return Math.round((angle / Math.PI) * 10000) % 5000 === 0;\n};\n","import {\n  exportToCanvas as _exportToCanvas,\n  exportToSvg as _exportToSvg,\n} from \"../scene/export\";\nimport { getDefaultAppState } from \"../appState\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { ExcalidrawElement, NonDeleted } from \"../element/types\";\nimport { getNonDeletedElements } from \"../element\";\nimport { restore } from \"../data/restore\";\nimport { MIME_TYPES } from \"../constants\";\nimport { encodePngMetadata } from \"../data/image\";\nimport { serializeAsJSON } from \"../data/json\";\nimport {\n  copyBlobToClipboardAsPng,\n  copyTextToSystemClipboard,\n  copyToClipboard,\n} from \"../clipboard\";\n\nexport { MIME_TYPES };\n\ntype ExportOpts = {\n  elements: readonly NonDeleted<ExcalidrawElement>[];\n  appState?: Partial<Omit<AppState, \"offsetTop\" | \"offsetLeft\">>;\n  files: BinaryFiles | null;\n  maxWidthOrHeight?: number;\n  getDimensions?: (\n    width: number,\n    height: number,\n  ) => { width: number; height: number; scale?: number };\n};\n\nexport const exportToCanvas = ({\n  elements,\n  appState,\n  files,\n  maxWidthOrHeight,\n  getDimensions,\n  exportPadding,\n}: ExportOpts & {\n  exportPadding?: number;\n}) => {\n  const { elements: restoredElements, appState: restoredAppState } = restore(\n    { elements, appState },\n    null,\n    null,\n  );\n  const { exportBackground, viewBackgroundColor } = restoredAppState;\n  return _exportToCanvas(\n    getNonDeletedElements(restoredElements),\n    { ...restoredAppState, offsetTop: 0, offsetLeft: 0, width: 0, height: 0 },\n    files || {},\n    { exportBackground, exportPadding, viewBackgroundColor },\n    (width: number, height: number) => {\n      const canvas = document.createElement(\"canvas\");\n\n      if (maxWidthOrHeight) {\n        if (typeof getDimensions === \"function\") {\n          console.warn(\n            \"`getDimensions()` is ignored when `maxWidthOrHeight` is supplied.\",\n          );\n        }\n\n        const max = Math.max(width, height);\n\n        const scale = maxWidthOrHeight / max;\n\n        canvas.width = width * scale;\n        canvas.height = height * scale;\n\n        return {\n          canvas,\n          scale,\n        };\n      }\n\n      const ret = getDimensions?.(width, height) || { width, height };\n\n      canvas.width = ret.width;\n      canvas.height = ret.height;\n\n      return {\n        canvas,\n        scale: ret.scale ?? 1,\n      };\n    },\n  );\n};\n\nexport const exportToBlob = async (\n  opts: ExportOpts & {\n    mimeType?: string;\n    quality?: number;\n    exportPadding?: number;\n  },\n): Promise<Blob> => {\n  let { mimeType = MIME_TYPES.png, quality } = opts;\n\n  if (mimeType === MIME_TYPES.png && typeof quality === \"number\") {\n    console.warn(`\"quality\" will be ignored for \"${MIME_TYPES.png}\" mimeType`);\n  }\n\n  // typo in MIME type (should be \"jpeg\")\n  if (mimeType === \"image/jpg\") {\n    mimeType = MIME_TYPES.jpg;\n  }\n\n  if (mimeType === MIME_TYPES.jpg && !opts.appState?.exportBackground) {\n    console.warn(\n      `Defaulting \"exportBackground\" to \"true\" for \"${MIME_TYPES.jpg}\" mimeType`,\n    );\n    opts = {\n      ...opts,\n      appState: { ...opts.appState, exportBackground: true },\n    };\n  }\n\n  const canvas = await exportToCanvas(opts);\n\n  quality = quality ? quality : /image\\/jpe?g/.test(mimeType) ? 0.92 : 0.8;\n\n  return new Promise((resolve, reject) => {\n    canvas.toBlob(\n      async (blob) => {\n        if (!blob) {\n          return reject(new Error(\"couldn't export to blob\"));\n        }\n        if (\n          blob &&\n          mimeType === MIME_TYPES.png &&\n          opts.appState?.exportEmbedScene\n        ) {\n          blob = await encodePngMetadata({\n            blob,\n            metadata: serializeAsJSON(\n              opts.elements,\n              opts.appState,\n              opts.files || {},\n              \"local\",\n            ),\n          });\n        }\n        resolve(blob);\n      },\n      mimeType,\n      quality,\n    );\n  });\n};\n\nexport const exportToSvg = async ({\n  elements,\n  appState = getDefaultAppState(),\n  files = {},\n  exportPadding,\n}: Omit<ExportOpts, \"getDimensions\"> & {\n  exportPadding?: number;\n}): Promise<SVGSVGElement> => {\n  const { elements: restoredElements, appState: restoredAppState } = restore(\n    { elements, appState },\n    null,\n    null,\n  );\n  return _exportToSvg(\n    getNonDeletedElements(restoredElements),\n    {\n      ...restoredAppState,\n      exportPadding,\n    },\n    files,\n  );\n};\n\nexport const exportToClipboard = async (\n  opts: ExportOpts & {\n    mimeType?: string;\n    quality?: number;\n    type: \"png\" | \"svg\" | \"json\";\n  },\n) => {\n  if (opts.type === \"svg\") {\n    const svg = await exportToSvg(opts);\n    await copyTextToSystemClipboard(svg.outerHTML);\n  } else if (opts.type === \"png\") {\n    await copyBlobToClipboardAsPng(exportToBlob(opts));\n  } else if (opts.type === \"json\") {\n    const appState = {\n      offsetTop: 0,\n      offsetLeft: 0,\n      width: 0,\n      height: 0,\n      ...getDefaultAppState(),\n      ...opts.appState,\n    };\n    await copyToClipboard(opts.elements, appState, opts.files);\n  } else {\n    throw new Error(\"Invalid export type\");\n  }\n};\n\nexport { serializeAsJSON, serializeLibraryAsJSON } from \"../data/json\";\nexport {\n  loadFromBlob,\n  loadSceneOrLibraryFromBlob,\n  loadLibraryFromBlob,\n} from \"../data/blob\";\nexport { getFreeDrawSvgPath } from \"../renderer/renderElement\";\nexport { mergeLibraryItems } from \"../data/library\";\n","import { Point } from \"./types\";\n\nexport const getSizeFromPoints = (points: readonly Point[]) => {\n  const xs = points.map((point) => point[0]);\n  const ys = points.map((point) => point[1]);\n  return {\n    width: Math.max(...xs) - Math.min(...xs),\n    height: Math.max(...ys) - Math.min(...ys),\n  };\n};\n\n/** @arg dimension, 0 for rescaling only x, 1 for y */\nexport const rescalePoints = (\n  dimension: 0 | 1,\n  newSize: number,\n  points: readonly Point[],\n  normalize: boolean,\n): Point[] => {\n  const coordinates = points.map((point) => point[dimension]);\n  const maxCoordinate = Math.max(...coordinates);\n  const minCoordinate = Math.min(...coordinates);\n  const size = maxCoordinate - minCoordinate;\n  const scale = size === 0 ? 1 : newSize / size;\n\n  let nextMinCoordinate = Infinity;\n\n  const scaledPoints = points.map((point): Point => {\n    const newCoordinate = point[dimension] * scale;\n    const newPoint = [...point];\n    newPoint[dimension] = newCoordinate;\n    if (newCoordinate < nextMinCoordinate) {\n      nextMinCoordinate = newCoordinate;\n    }\n    return newPoint as unknown as Point;\n  });\n\n  if (!normalize) {\n    return scaledPoints;\n  }\n\n  if (scaledPoints.length === 2) {\n    // we don't translate two-point lines\n    return scaledPoints;\n  }\n\n  const translation = minCoordinate - nextMinCoordinate;\n\n  const nextPoints = scaledPoints.map(\n    (scaledPoint) =>\n      scaledPoint.map((value, currentDimension) => {\n        return currentDimension === dimension ? value + translation : value;\n      }) as [number, number],\n  );\n  return nextPoints;\n};\n","import { Random } from \"roughjs/bin/math\";\nimport { nanoid } from \"nanoid\";\nimport { isTestEnv } from \"./utils\";\n\nlet random = new Random(Date.now());\nlet testIdBase = 0;\n\nexport const randomInteger = () => Math.floor(random.next() * 2 ** 31);\n\nexport const reseed = (seed: number) => {\n  random = new Random(seed);\n  testIdBase = 0;\n};\n\nexport const randomId = () => (isTestEnv() ? `id${testIdBase++}` : nanoid());\n","function $(e,t,u,x=h=>h){return e*x(.5-t*(.5-u))}function se(e){return[-e[0],-e[1]]}function l(e,t){return[e[0]+t[0],e[1]+t[1]]}function a(e,t){return[e[0]-t[0],e[1]-t[1]]}function b(e,t){return[e[0]*t,e[1]*t]}function he(e,t){return[e[0]/t,e[1]/t]}function R(e){return[e[1],-e[0]]}function B(e,t){return e[0]*t[0]+e[1]*t[1]}function ue(e,t){return e[0]===t[0]&&e[1]===t[1]}function ge(e){return Math.hypot(e[0],e[1])}function de(e){return e[0]*e[0]+e[1]*e[1]}function A(e,t){return de(a(e,t))}function G(e){return he(e,ge(e))}function ie(e,t){return Math.hypot(e[1]-t[1],e[0]-t[0])}function L(e,t,u){let x=Math.sin(u),h=Math.cos(u),y=e[0]-t[0],n=e[1]-t[1],f=y*h-n*x,d=y*x+n*h;return[f+t[0],d+t[1]]}function K(e,t,u){return l(e,b(a(t,e),u))}function ee(e,t,u){return l(e,b(t,u))}var{min:C,PI:xe}=Math,pe=.275,V=xe+1e-4;function ce(e,t={}){let{size:u=16,smoothing:x=.5,thinning:h=.5,simulatePressure:y=!0,easing:n=r=>r,start:f={},end:d={},last:D=!1}=t,{cap:S=!0,easing:j=r=>r*(2-r)}=f,{cap:q=!0,easing:c=r=>--r*r*r+1}=d;if(e.length===0||u<=0)return[];let p=e[e.length-1].runningLength,g=f.taper===!1?0:f.taper===!0?Math.max(u,p):f.taper,T=d.taper===!1?0:d.taper===!0?Math.max(u,p):d.taper,te=Math.pow(u*x,2),_=[],M=[],H=e.slice(0,10).reduce((r,i)=>{let o=i.pressure;if(y){let s=C(1,i.distance/u),W=C(1,1-s);o=C(1,r+(W-r)*(s*pe))}return(r+o)/2},e[0].pressure),m=$(u,h,e[e.length-1].pressure,n),U,X=e[0].vector,z=e[0].point,F=z,O=z,E=F,J=!1;for(let r=0;r<e.length;r++){let{pressure:i}=e[r],{point:o,vector:s,distance:W,runningLength:I}=e[r];if(r<e.length-1&&p-I<3)continue;if(h){if(y){let v=C(1,W/u),Z=C(1,1-v);i=C(1,H+(Z-H)*(v*pe))}m=$(u,h,i,n)}else m=u/2;U===void 0&&(U=m);let le=I<g?j(I/g):1,fe=p-I<T?c((p-I)/T):1;m=Math.max(.01,m*Math.min(le,fe));let re=(r<e.length-1?e[r+1]:e[r]).vector,Y=r<e.length-1?B(s,re):1,be=B(s,X)<0&&!J,ne=Y!==null&&Y<0;if(be||ne){let v=b(R(X),m);for(let Z=1/13,w=0;w<=1;w+=Z)O=L(a(o,v),o,V*w),_.push(O),E=L(l(o,v),o,V*-w),M.push(E);z=O,F=E,ne&&(J=!0);continue}if(J=!1,r===e.length-1){let v=b(R(s),m);_.push(a(o,v)),M.push(l(o,v));continue}let oe=b(R(K(re,s,Y)),m);O=a(o,oe),(r<=1||A(z,O)>te)&&(_.push(O),z=O),E=l(o,oe),(r<=1||A(F,E)>te)&&(M.push(E),F=E),H=i,X=s}let P=e[0].point.slice(0,2),k=e.length>1?e[e.length-1].point.slice(0,2):l(e[0].point,[1,1]),Q=[],N=[];if(e.length===1){if(!(g||T)||D){let r=ee(P,G(R(a(P,k))),-(U||m)),i=[];for(let o=1/13,s=o;s<=1;s+=o)i.push(L(r,P,V*2*s));return i}}else{if(!(g||T&&e.length===1))if(S)for(let i=1/13,o=i;o<=1;o+=i){let s=L(M[0],P,V*o);Q.push(s)}else{let i=a(_[0],M[0]),o=b(i,.5),s=b(i,.51);Q.push(a(P,o),a(P,s),l(P,s),l(P,o))}let r=R(se(e[e.length-1].vector));if(T||g&&e.length===1)N.push(k);else if(q){let i=ee(k,r,m);for(let o=1/29,s=o;s<1;s+=o)N.push(L(i,k,V*3*s))}else N.push(l(k,b(r,m)),l(k,b(r,m*.99)),a(k,b(r,m*.99)),a(k,b(r,m)))}return _.concat(N,M.reverse(),Q)}function me(e,t={}){var q;let{streamline:u=.5,size:x=16,last:h=!1}=t;if(e.length===0)return[];let y=.15+(1-u)*.85,n=Array.isArray(e[0])?e:e.map(({x:c,y:p,pressure:g=.5})=>[c,p,g]);if(n.length===2){let c=n[1];n=n.slice(0,-1);for(let p=1;p<5;p++)n.push(K(n[0],c,p/4))}n.length===1&&(n=[...n,[...l(n[0],[1,1]),...n[0].slice(2)]]);let f=[{point:[n[0][0],n[0][1]],pressure:n[0][2]>=0?n[0][2]:.25,vector:[1,1],distance:0,runningLength:0}],d=!1,D=0,S=f[0],j=n.length-1;for(let c=1;c<n.length;c++){let p=h&&c===j?n[c].slice(0,2):K(S.point,n[c],y);if(ue(S.point,p))continue;let g=ie(p,S.point);if(D+=g,c<j&&!d){if(D<x)continue;d=!0}S={point:p,pressure:n[c][2]>=0?n[c][2]:.5,vector:G(a(S.point,p)),distance:g,runningLength:D},f.push(S)}return f[0].vector=((q=f[1])==null?void 0:q.vector)||[0,0],f}function ae(e,t={}){return ce(me(e,t),t)}var _e=ae;export{_e as default,ae as getStroke,ce as getStrokeOutlinePoints,me as getStrokePoints};\n","import {\n  ExcalidrawElement,\n  ExcalidrawLinearElement,\n  ExcalidrawTextElement,\n  Arrowhead,\n  NonDeletedExcalidrawElement,\n  ExcalidrawFreeDrawElement,\n  ExcalidrawImageElement,\n  ExcalidrawTextElementWithContainer,\n} from \"../element/types\";\nimport {\n  isTextElement,\n  isLinearElement,\n  isFreeDrawElement,\n  isInitializedImageElement,\n  isArrowElement,\n  hasBoundTextElement,\n} from \"../element/typeChecks\";\nimport {\n  getDiamondPoints,\n  getElementAbsoluteCoords,\n  getArrowheadPoints,\n} from \"../element/bounds\";\nimport { RoughCanvas } from \"roughjs/bin/canvas\";\nimport { Drawable, Options } from \"roughjs/bin/core\";\nimport { RoughSVG } from \"roughjs/bin/svg\";\nimport { RoughGenerator } from \"roughjs/bin/generator\";\n\nimport { RenderConfig } from \"../scene/types\";\nimport { distance, getFontString, getFontFamilyString, isRTL } from \"../utils\";\nimport { getCornerRadius, isPathALoop, isRightAngle } from \"../math\";\nimport rough from \"roughjs/bin/rough\";\nimport { AppState, BinaryFiles, Zoom } from \"../types\";\nimport { getDefaultAppState } from \"../appState\";\nimport {\n  BOUND_TEXT_PADDING,\n  MAX_DECIMALS_FOR_SVG_EXPORT,\n  MIME_TYPES,\n  SVG_NS,\n} from \"../constants\";\nimport { getStroke, StrokeOptions } from \"perfect-freehand\";\nimport {\n  getApproxLineHeight,\n  getBoundTextElement,\n  getContainerCoords,\n  getContainerElement,\n  getMaxContainerHeight,\n  getMaxContainerWidth,\n} from \"../element/textElement\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\n\n// using a stronger invert (100% vs our regular 93%) and saturate\n// as a temp hack to make images in dark theme look closer to original\n// color scheme (it's still not quite there and the colors look slightly\n// desatured, alas...)\nconst IMAGE_INVERT_FILTER = \"invert(100%) hue-rotate(180deg) saturate(1.25)\";\n\nconst defaultAppState = getDefaultAppState();\n\nconst isPendingImageElement = (\n  element: ExcalidrawElement,\n  renderConfig: RenderConfig,\n) =>\n  isInitializedImageElement(element) &&\n  !renderConfig.imageCache.has(element.fileId);\n\nconst shouldResetImageFilter = (\n  element: ExcalidrawElement,\n  renderConfig: RenderConfig,\n) => {\n  return (\n    renderConfig.theme === \"dark\" &&\n    isInitializedImageElement(element) &&\n    !isPendingImageElement(element, renderConfig) &&\n    renderConfig.imageCache.get(element.fileId)?.mimeType !== MIME_TYPES.svg\n  );\n};\n\nconst getDashArrayDashed = (strokeWidth: number) => [8, 8 + strokeWidth];\n\nconst getDashArrayDotted = (strokeWidth: number) => [1.5, 6 + strokeWidth];\n\nconst getCanvasPadding = (element: ExcalidrawElement) =>\n  element.type === \"freedraw\" ? element.strokeWidth * 12 : 20;\n\nexport interface ExcalidrawElementWithCanvas {\n  element: ExcalidrawElement | ExcalidrawTextElement;\n  canvas: HTMLCanvasElement;\n  theme: RenderConfig[\"theme\"];\n  canvasZoom: Zoom[\"value\"];\n  canvasOffsetX: number;\n  canvasOffsetY: number;\n  boundTextElementVersion: number | null;\n}\n\nconst generateElementCanvas = (\n  element: NonDeletedExcalidrawElement,\n  zoom: Zoom,\n  renderConfig: RenderConfig,\n): ExcalidrawElementWithCanvas => {\n  const canvas = document.createElement(\"canvas\");\n  const context = canvas.getContext(\"2d\")!;\n  const padding = getCanvasPadding(element);\n\n  let canvasOffsetX = 0;\n  let canvasOffsetY = 0;\n\n  if (isLinearElement(element) || isFreeDrawElement(element)) {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n    canvas.width =\n      distance(x1, x2) * window.devicePixelRatio * zoom.value +\n      padding * zoom.value * 2;\n    canvas.height =\n      distance(y1, y2) * window.devicePixelRatio * zoom.value +\n      padding * zoom.value * 2;\n\n    canvasOffsetX =\n      element.x > x1\n        ? distance(element.x, x1) * window.devicePixelRatio * zoom.value\n        : 0;\n\n    canvasOffsetY =\n      element.y > y1\n        ? distance(element.y, y1) * window.devicePixelRatio * zoom.value\n        : 0;\n\n    context.translate(canvasOffsetX, canvasOffsetY);\n  } else {\n    canvas.width =\n      element.width * window.devicePixelRatio * zoom.value +\n      padding * zoom.value * 2;\n    canvas.height =\n      element.height * window.devicePixelRatio * zoom.value +\n      padding * zoom.value * 2;\n  }\n\n  context.save();\n  context.translate(padding * zoom.value, padding * zoom.value);\n  context.scale(\n    window.devicePixelRatio * zoom.value,\n    window.devicePixelRatio * zoom.value,\n  );\n\n  const rc = rough.canvas(canvas);\n\n  // in dark theme, revert the image color filter\n  if (shouldResetImageFilter(element, renderConfig)) {\n    context.filter = IMAGE_INVERT_FILTER;\n  }\n\n  drawElementOnCanvas(element, rc, context, renderConfig);\n  context.restore();\n\n  return {\n    element,\n    canvas,\n    theme: renderConfig.theme,\n    canvasZoom: zoom.value,\n    canvasOffsetX,\n    canvasOffsetY,\n    boundTextElementVersion: getBoundTextElement(element)?.version || null,\n  };\n};\n\nexport const DEFAULT_LINK_SIZE = 14;\n\nconst IMAGE_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(\n  `<svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"fas\" data-icon=\"image\" class=\"svg-inline--fa fa-image fa-w-16\" role=\"img\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\"><path fill=\"#888\" d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48zM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56zM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48z\"></path></svg>`,\n)}`;\n\nconst IMAGE_ERROR_PLACEHOLDER_IMG = document.createElement(\"img\");\nIMAGE_ERROR_PLACEHOLDER_IMG.src = `data:${MIME_TYPES.svg},${encodeURIComponent(\n  `<svg viewBox=\"0 0 668 668\" xmlns=\"http://www.w3.org/2000/svg\" xml:space=\"preserve\" style=\"fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2\"><path d=\"M464 448H48c-26.51 0-48-21.49-48-48V112c0-26.51 21.49-48 48-48h416c26.51 0 48 21.49 48 48v288c0 26.51-21.49 48-48 48ZM112 120c-30.928 0-56 25.072-56 56s25.072 56 56 56 56-25.072 56-56-25.072-56-56-56ZM64 384h384V272l-87.515-87.515c-4.686-4.686-12.284-4.686-16.971 0L208 320l-55.515-55.515c-4.686-4.686-12.284-4.686-16.971 0L64 336v48Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.81709 0 0 .81709 124.825 145.825)\"/><path d=\"M256 8C119.034 8 8 119.033 8 256c0 136.967 111.034 248 248 248s248-111.034 248-248S392.967 8 256 8Zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676ZM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676Z\" style=\"fill:#888;fill-rule:nonzero\" transform=\"matrix(.30366 0 0 .30366 506.822 60.065)\"/></svg>`,\n)}`;\n\nconst drawImagePlaceholder = (\n  element: ExcalidrawImageElement,\n  context: CanvasRenderingContext2D,\n  zoomValue: AppState[\"zoom\"][\"value\"],\n) => {\n  context.fillStyle = \"#E7E7E7\";\n  context.fillRect(0, 0, element.width, element.height);\n\n  const imageMinWidthOrHeight = Math.min(element.width, element.height);\n\n  const size = Math.min(\n    imageMinWidthOrHeight,\n    Math.min(imageMinWidthOrHeight * 0.4, 100),\n  );\n\n  context.drawImage(\n    element.status === \"error\"\n      ? IMAGE_ERROR_PLACEHOLDER_IMG\n      : IMAGE_PLACEHOLDER_IMG,\n    element.width / 2 - size / 2,\n    element.height / 2 - size / 2,\n    size,\n    size,\n  );\n};\n\nconst drawElementOnCanvas = (\n  element: NonDeletedExcalidrawElement,\n  rc: RoughCanvas,\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n) => {\n  context.globalAlpha = element.opacity / 100;\n  switch (element.type) {\n    case \"rectangle\":\n    case \"diamond\":\n    case \"ellipse\": {\n      context.lineJoin = \"round\";\n      context.lineCap = \"round\";\n      rc.draw(getShapeForElement(element)!);\n      break;\n    }\n    case \"arrow\":\n    case \"line\": {\n      context.lineJoin = \"round\";\n      context.lineCap = \"round\";\n\n      getShapeForElement(element)!.forEach((shape) => {\n        rc.draw(shape);\n      });\n      break;\n    }\n    case \"freedraw\": {\n      // Draw directly to canvas\n      context.save();\n      context.fillStyle = element.strokeColor;\n\n      const path = getFreeDrawPath2D(element) as Path2D;\n      const fillShape = getShapeForElement(element);\n\n      if (fillShape) {\n        rc.draw(fillShape);\n      }\n\n      context.fillStyle = element.strokeColor;\n      context.fill(path);\n\n      context.restore();\n      break;\n    }\n    case \"image\": {\n      const img = isInitializedImageElement(element)\n        ? renderConfig.imageCache.get(element.fileId)?.image\n        : undefined;\n      if (img != null && !(img instanceof Promise)) {\n        context.drawImage(\n          img,\n          0 /* hardcoded for the selection box*/,\n          0,\n          element.width,\n          element.height,\n        );\n      } else {\n        drawImagePlaceholder(element, context, renderConfig.zoom.value);\n      }\n      break;\n    }\n    default: {\n      if (isTextElement(element)) {\n        const rtl = isRTL(element.text);\n        const shouldTemporarilyAttach = rtl && !context.canvas.isConnected;\n        if (shouldTemporarilyAttach) {\n          // to correctly render RTL text mixed with LTR, we have to append it\n          // to the DOM\n          document.body.appendChild(context.canvas);\n        }\n        context.canvas.setAttribute(\"dir\", rtl ? \"rtl\" : \"ltr\");\n        context.save();\n        context.font = getFontString(element);\n        context.fillStyle = element.strokeColor;\n        context.textAlign = element.textAlign as CanvasTextAlign;\n\n        // Canvas does not support multiline text by default\n        const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n        const lineHeight = element.containerId\n          ? getApproxLineHeight(getFontString(element))\n          : element.height / lines.length;\n        const horizontalOffset =\n          element.textAlign === \"center\"\n            ? element.width / 2\n            : element.textAlign === \"right\"\n            ? element.width\n            : 0;\n        context.textBaseline = \"bottom\";\n\n        for (let index = 0; index < lines.length; index++) {\n          context.fillText(\n            lines[index],\n            horizontalOffset,\n            (index + 1) * lineHeight,\n          );\n        }\n        context.restore();\n        if (shouldTemporarilyAttach) {\n          context.canvas.remove();\n        }\n      } else {\n        throw new Error(`Unimplemented type ${element.type}`);\n      }\n    }\n  }\n  context.globalAlpha = 1;\n};\n\nconst elementWithCanvasCache = new WeakMap<\n  ExcalidrawElement,\n  ExcalidrawElementWithCanvas\n>();\n\nconst shapeCache = new WeakMap<ExcalidrawElement, ElementShape>();\n\ntype ElementShape = Drawable | Drawable[] | null;\n\ntype ElementShapes = {\n  freedraw: Drawable | null;\n  arrow: Drawable[];\n  line: Drawable[];\n  text: null;\n  image: null;\n};\n\nexport const getShapeForElement = <T extends ExcalidrawElement>(element: T) =>\n  shapeCache.get(element) as T[\"type\"] extends keyof ElementShapes\n    ? ElementShapes[T[\"type\"]] | undefined\n    : Drawable | null | undefined;\n\nexport const setShapeForElement = <T extends ExcalidrawElement>(\n  element: T,\n  shape: T[\"type\"] extends keyof ElementShapes\n    ? ElementShapes[T[\"type\"]]\n    : Drawable,\n) => shapeCache.set(element, shape);\n\nexport const invalidateShapeForElement = (element: ExcalidrawElement) =>\n  shapeCache.delete(element);\n\nexport const generateRoughOptions = (\n  element: ExcalidrawElement,\n  continuousPath = false,\n): Options => {\n  const options: Options = {\n    seed: element.seed,\n    strokeLineDash:\n      element.strokeStyle === \"dashed\"\n        ? getDashArrayDashed(element.strokeWidth)\n        : element.strokeStyle === \"dotted\"\n        ? getDashArrayDotted(element.strokeWidth)\n        : undefined,\n    // for non-solid strokes, disable multiStroke because it tends to make\n    // dashes/dots overlay each other\n    disableMultiStroke: element.strokeStyle !== \"solid\",\n    // for non-solid strokes, increase the width a bit to make it visually\n    // similar to solid strokes, because we're also disabling multiStroke\n    strokeWidth:\n      element.strokeStyle !== \"solid\"\n        ? element.strokeWidth + 0.5\n        : element.strokeWidth,\n    // when increasing strokeWidth, we must explicitly set fillWeight and\n    // hachureGap because if not specified, roughjs uses strokeWidth to\n    // calculate them (and we don't want the fills to be modified)\n    fillWeight: element.strokeWidth / 2,\n    hachureGap: element.strokeWidth * 4,\n    roughness: element.roughness,\n    stroke: element.strokeColor,\n    preserveVertices: continuousPath,\n  };\n\n  switch (element.type) {\n    case \"rectangle\":\n    case \"diamond\":\n    case \"ellipse\": {\n      options.fillStyle = element.fillStyle;\n      options.fill =\n        element.backgroundColor === \"transparent\"\n          ? undefined\n          : element.backgroundColor;\n      if (element.type === \"ellipse\") {\n        options.curveFitting = 1;\n      }\n      return options;\n    }\n    case \"line\":\n    case \"freedraw\": {\n      if (isPathALoop(element.points)) {\n        options.fillStyle = element.fillStyle;\n        options.fill =\n          element.backgroundColor === \"transparent\"\n            ? undefined\n            : element.backgroundColor;\n      }\n      return options;\n    }\n    case \"arrow\":\n      return options;\n    default: {\n      throw new Error(`Unimplemented type ${element.type}`);\n    }\n  }\n};\n\n/**\n * Generates the element's shape and puts it into the cache.\n * @param element\n * @param generator\n */\nconst generateElementShape = (\n  element: NonDeletedExcalidrawElement,\n  generator: RoughGenerator,\n) => {\n  let shape = shapeCache.get(element);\n\n  // `null` indicates no rc shape applicable for this element type\n  // (= do not generate anything)\n  if (shape === undefined) {\n    elementWithCanvasCache.delete(element);\n\n    switch (element.type) {\n      case \"rectangle\":\n        if (element.roundness) {\n          const w = element.width;\n          const h = element.height;\n          const r = getCornerRadius(Math.min(w, h), element);\n          shape = generator.path(\n            `M ${r} 0 L ${w - r} 0 Q ${w} 0, ${w} ${r} L ${w} ${\n              h - r\n            } Q ${w} ${h}, ${w - r} ${h} L ${r} ${h} Q 0 ${h}, 0 ${\n              h - r\n            } L 0 ${r} Q 0 0, ${r} 0`,\n            generateRoughOptions(element, true),\n          );\n        } else {\n          shape = generator.rectangle(\n            0,\n            0,\n            element.width,\n            element.height,\n            generateRoughOptions(element),\n          );\n        }\n        setShapeForElement(element, shape);\n\n        break;\n      case \"diamond\": {\n        const [topX, topY, rightX, rightY, bottomX, bottomY, leftX, leftY] =\n          getDiamondPoints(element);\n        if (element.roundness) {\n          const verticalRadius = getCornerRadius(\n            Math.abs(topX - leftX),\n            element,\n          );\n\n          const horizontalRadius = getCornerRadius(\n            Math.abs(rightY - topY),\n            element,\n          );\n\n          shape = generator.path(\n            `M ${topX + verticalRadius} ${topY + horizontalRadius} L ${\n              rightX - verticalRadius\n            } ${rightY - horizontalRadius}\n            C ${rightX} ${rightY}, ${rightX} ${rightY}, ${\n              rightX - verticalRadius\n            } ${rightY + horizontalRadius}\n            L ${bottomX + verticalRadius} ${bottomY - horizontalRadius}\n            C ${bottomX} ${bottomY}, ${bottomX} ${bottomY}, ${\n              bottomX - verticalRadius\n            } ${bottomY - horizontalRadius}\n            L ${leftX + verticalRadius} ${leftY + horizontalRadius}\n            C ${leftX} ${leftY}, ${leftX} ${leftY}, ${leftX + verticalRadius} ${\n              leftY - horizontalRadius\n            }\n            L ${topX - verticalRadius} ${topY + horizontalRadius}\n            C ${topX} ${topY}, ${topX} ${topY}, ${topX + verticalRadius} ${\n              topY + horizontalRadius\n            }`,\n            generateRoughOptions(element, true),\n          );\n        } else {\n          shape = generator.polygon(\n            [\n              [topX, topY],\n              [rightX, rightY],\n              [bottomX, bottomY],\n              [leftX, leftY],\n            ],\n            generateRoughOptions(element),\n          );\n        }\n        setShapeForElement(element, shape);\n\n        break;\n      }\n      case \"ellipse\":\n        shape = generator.ellipse(\n          element.width / 2,\n          element.height / 2,\n          element.width,\n          element.height,\n          generateRoughOptions(element),\n        );\n        setShapeForElement(element, shape);\n\n        break;\n      case \"line\":\n      case \"arrow\": {\n        const options = generateRoughOptions(element);\n\n        // points array can be empty in the beginning, so it is important to add\n        // initial position to it\n        const points = element.points.length ? element.points : [[0, 0]];\n\n        // curve is always the first element\n        // this simplifies finding the curve for an element\n        if (!element.roundness) {\n          if (options.fill) {\n            shape = [generator.polygon(points as [number, number][], options)];\n          } else {\n            shape = [\n              generator.linearPath(points as [number, number][], options),\n            ];\n          }\n        } else {\n          shape = [generator.curve(points as [number, number][], options)];\n        }\n\n        // add lines only in arrow\n        if (element.type === \"arrow\") {\n          const { startArrowhead = null, endArrowhead = \"arrow\" } = element;\n\n          const getArrowheadShapes = (\n            element: ExcalidrawLinearElement,\n            shape: Drawable[],\n            position: \"start\" | \"end\",\n            arrowhead: Arrowhead,\n          ) => {\n            const arrowheadPoints = getArrowheadPoints(\n              element,\n              shape,\n              position,\n              arrowhead,\n            );\n\n            if (arrowheadPoints === null) {\n              return [];\n            }\n\n            // Other arrowheads here...\n            if (arrowhead === \"dot\") {\n              const [x, y, r] = arrowheadPoints;\n\n              return [\n                generator.circle(x, y, r, {\n                  ...options,\n                  fill: element.strokeColor,\n                  fillStyle: \"solid\",\n                  stroke: \"none\",\n                }),\n              ];\n            }\n\n            if (arrowhead === \"triangle\") {\n              const [x, y, x2, y2, x3, y3] = arrowheadPoints;\n\n              // always use solid stroke for triangle arrowhead\n              delete options.strokeLineDash;\n\n              return [\n                generator.polygon(\n                  [\n                    [x, y],\n                    [x2, y2],\n                    [x3, y3],\n                    [x, y],\n                  ],\n                  {\n                    ...options,\n                    fill: element.strokeColor,\n                    fillStyle: \"solid\",\n                  },\n                ),\n              ];\n            }\n\n            // Arrow arrowheads\n            const [x2, y2, x3, y3, x4, y4] = arrowheadPoints;\n\n            if (element.strokeStyle === \"dotted\") {\n              // for dotted arrows caps, reduce gap to make it more legible\n              const dash = getDashArrayDotted(element.strokeWidth - 1);\n              options.strokeLineDash = [dash[0], dash[1] - 1];\n            } else {\n              // for solid/dashed, keep solid arrow cap\n              delete options.strokeLineDash;\n            }\n            return [\n              generator.line(x3, y3, x2, y2, options),\n              generator.line(x4, y4, x2, y2, options),\n            ];\n          };\n\n          if (startArrowhead !== null) {\n            const shapes = getArrowheadShapes(\n              element,\n              shape,\n              \"start\",\n              startArrowhead,\n            );\n            shape.push(...shapes);\n          }\n\n          if (endArrowhead !== null) {\n            if (endArrowhead === undefined) {\n              // Hey, we have an old arrow here!\n            }\n\n            const shapes = getArrowheadShapes(\n              element,\n              shape,\n              \"end\",\n              endArrowhead,\n            );\n            shape.push(...shapes);\n          }\n        }\n\n        setShapeForElement(element, shape);\n\n        break;\n      }\n      case \"freedraw\": {\n        generateFreeDrawShape(element);\n\n        if (isPathALoop(element.points)) {\n          // generate rough polygon to fill freedraw shape\n          shape = generator.polygon(element.points as [number, number][], {\n            ...generateRoughOptions(element),\n            stroke: \"none\",\n          });\n        } else {\n          shape = null;\n        }\n        setShapeForElement(element, shape);\n        break;\n      }\n      case \"text\":\n      case \"image\": {\n        // just to ensure we don't regenerate element.canvas on rerenders\n        setShapeForElement(element, null);\n        break;\n      }\n    }\n  }\n};\n\nconst generateElementWithCanvas = (\n  element: NonDeletedExcalidrawElement,\n  renderConfig: RenderConfig,\n) => {\n  const zoom: Zoom = renderConfig ? renderConfig.zoom : defaultAppState.zoom;\n  const prevElementWithCanvas = elementWithCanvasCache.get(element);\n  const shouldRegenerateBecauseZoom =\n    prevElementWithCanvas &&\n    prevElementWithCanvas.canvasZoom !== zoom.value &&\n    !renderConfig?.shouldCacheIgnoreZoom;\n  const boundTextElementVersion = getBoundTextElement(element)?.version || null;\n\n  if (\n    !prevElementWithCanvas ||\n    shouldRegenerateBecauseZoom ||\n    prevElementWithCanvas.theme !== renderConfig.theme ||\n    prevElementWithCanvas.boundTextElementVersion !== boundTextElementVersion\n  ) {\n    const elementWithCanvas = generateElementCanvas(\n      element,\n      zoom,\n      renderConfig,\n    );\n\n    elementWithCanvasCache.set(element, elementWithCanvas);\n\n    return elementWithCanvas;\n  }\n  return prevElementWithCanvas;\n};\n\nconst drawElementFromCanvas = (\n  elementWithCanvas: ExcalidrawElementWithCanvas,\n  rc: RoughCanvas,\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n) => {\n  const element = elementWithCanvas.element;\n  const padding = getCanvasPadding(element);\n  const zoom = elementWithCanvas.canvasZoom;\n  let [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n\n  // Free draw elements will otherwise \"shuffle\" as the min x and y change\n  if (isFreeDrawElement(element)) {\n    x1 = Math.floor(x1);\n    x2 = Math.ceil(x2);\n    y1 = Math.floor(y1);\n    y2 = Math.ceil(y2);\n  }\n\n  const cx = ((x1 + x2) / 2 + renderConfig.scrollX) * window.devicePixelRatio;\n  const cy = ((y1 + y2) / 2 + renderConfig.scrollY) * window.devicePixelRatio;\n\n  context.save();\n  context.scale(1 / window.devicePixelRatio, 1 / window.devicePixelRatio);\n  const boundTextElement = getBoundTextElement(element);\n\n  if (isArrowElement(element) && boundTextElement) {\n    const tempCanvas = document.createElement(\"canvas\");\n    const tempCanvasContext = tempCanvas.getContext(\"2d\")!;\n\n    // Take max dimensions of arrow canvas so that when canvas is rotated\n    // the arrow doesn't get clipped\n    const maxDim = Math.max(distance(x1, x2), distance(y1, y2));\n    tempCanvas.width =\n      maxDim * window.devicePixelRatio * zoom +\n      padding * elementWithCanvas.canvasZoom * 10;\n    tempCanvas.height =\n      maxDim * window.devicePixelRatio * zoom +\n      padding * elementWithCanvas.canvasZoom * 10;\n    const offsetX = (tempCanvas.width - elementWithCanvas.canvas!.width) / 2;\n    const offsetY = (tempCanvas.height - elementWithCanvas.canvas!.height) / 2;\n\n    tempCanvasContext.translate(tempCanvas.width / 2, tempCanvas.height / 2);\n    tempCanvasContext.rotate(element.angle);\n\n    tempCanvasContext.drawImage(\n      elementWithCanvas.canvas!,\n      -elementWithCanvas.canvas.width / 2,\n      -elementWithCanvas.canvas.height / 2,\n      elementWithCanvas.canvas.width,\n      elementWithCanvas.canvas.height,\n    );\n\n    const [, , , , boundTextCx, boundTextCy] =\n      getElementAbsoluteCoords(boundTextElement);\n\n    tempCanvasContext.rotate(-element.angle);\n\n    // Shift the canvas to the center of the bound text element\n    const shiftX =\n      tempCanvas.width / 2 -\n      (boundTextCx - x1) * window.devicePixelRatio * zoom -\n      offsetX -\n      padding * zoom;\n\n    const shiftY =\n      tempCanvas.height / 2 -\n      (boundTextCy - y1) * window.devicePixelRatio * zoom -\n      offsetY -\n      padding * zoom;\n    tempCanvasContext.translate(-shiftX, -shiftY);\n\n    // Clear the bound text area\n    tempCanvasContext.clearRect(\n      -(boundTextElement.width / 2 + BOUND_TEXT_PADDING) *\n        window.devicePixelRatio *\n        zoom,\n      -(boundTextElement.height / 2 + BOUND_TEXT_PADDING) *\n        window.devicePixelRatio *\n        zoom,\n      (boundTextElement.width + BOUND_TEXT_PADDING * 2) *\n        window.devicePixelRatio *\n        zoom,\n      (boundTextElement.height + BOUND_TEXT_PADDING * 2) *\n        window.devicePixelRatio *\n        zoom,\n    );\n\n    context.translate(cx, cy);\n    context.drawImage(\n      tempCanvas,\n      (-(x2 - x1) / 2) * window.devicePixelRatio - offsetX / zoom - padding,\n      (-(y2 - y1) / 2) * window.devicePixelRatio - offsetY / zoom - padding,\n      tempCanvas.width / zoom,\n      tempCanvas.height / zoom,\n    );\n  } else {\n    // we translate context to element center so that rotation and scale\n    // originates from the element center\n    context.translate(cx, cy);\n\n    context.rotate(element.angle);\n\n    if (\n      \"scale\" in elementWithCanvas.element &&\n      !isPendingImageElement(element, renderConfig)\n    ) {\n      context.scale(\n        elementWithCanvas.element.scale[0],\n        elementWithCanvas.element.scale[1],\n      );\n    }\n\n    // revert afterwards we don't have account for it during drawing\n    context.translate(-cx, -cy);\n\n    context.drawImage(\n      elementWithCanvas.canvas!,\n      (x1 + renderConfig.scrollX) * window.devicePixelRatio -\n        (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom,\n      (y1 + renderConfig.scrollY) * window.devicePixelRatio -\n        (padding * elementWithCanvas.canvasZoom) / elementWithCanvas.canvasZoom,\n      elementWithCanvas.canvas!.width / elementWithCanvas.canvasZoom,\n      elementWithCanvas.canvas!.height / elementWithCanvas.canvasZoom,\n    );\n\n    if (\n      process.env.REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX &&\n      hasBoundTextElement(element)\n    ) {\n      const coords = getContainerCoords(element);\n      context.strokeStyle = \"#c92a2a\";\n      context.lineWidth = 3;\n      context.strokeRect(\n        (coords.x + renderConfig.scrollX) * window.devicePixelRatio,\n        (coords.y + renderConfig.scrollY) * window.devicePixelRatio,\n        getMaxContainerWidth(element) * window.devicePixelRatio,\n        getMaxContainerHeight(element) * window.devicePixelRatio,\n      );\n    }\n  }\n  context.restore();\n\n  // Clear the nested element we appended to the DOM\n};\n\nexport const renderElement = (\n  element: NonDeletedExcalidrawElement,\n  rc: RoughCanvas,\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n  appState: AppState,\n) => {\n  const generator = rc.generator;\n  switch (element.type) {\n    case \"selection\": {\n      context.save();\n      context.translate(\n        element.x + renderConfig.scrollX,\n        element.y + renderConfig.scrollY,\n      );\n      context.fillStyle = \"rgba(0, 0, 200, 0.04)\";\n\n      // render from 0.5px offset  to get 1px wide line\n      // https://stackoverflow.com/questions/7530593/html5-canvas-and-line-width/7531540#7531540\n      // TODO can be be improved by offseting to the negative when user selects\n      // from right to left\n      const offset = 0.5 / renderConfig.zoom.value;\n\n      context.fillRect(offset, offset, element.width, element.height);\n      context.lineWidth = 1 / renderConfig.zoom.value;\n      context.strokeStyle = \"rgb(105, 101, 219)\";\n      context.strokeRect(offset, offset, element.width, element.height);\n\n      context.restore();\n      break;\n    }\n    case \"freedraw\": {\n      generateElementShape(element, generator);\n\n      if (renderConfig.isExporting) {\n        const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n        const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n        const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n        const shiftX = (x2 - x1) / 2 - (element.x - x1);\n        const shiftY = (y2 - y1) / 2 - (element.y - y1);\n        context.save();\n        context.translate(cx, cy);\n        context.rotate(element.angle);\n        context.translate(-shiftX, -shiftY);\n        drawElementOnCanvas(element, rc, context, renderConfig);\n        context.restore();\n      } else {\n        const elementWithCanvas = generateElementWithCanvas(\n          element,\n          renderConfig,\n        );\n        drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n      }\n\n      break;\n    }\n    case \"rectangle\":\n    case \"diamond\":\n    case \"ellipse\":\n    case \"line\":\n    case \"arrow\":\n    case \"image\":\n    case \"text\": {\n      generateElementShape(element, generator);\n      if (renderConfig.isExporting) {\n        const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n        const cx = (x1 + x2) / 2 + renderConfig.scrollX;\n        const cy = (y1 + y2) / 2 + renderConfig.scrollY;\n        let shiftX = (x2 - x1) / 2 - (element.x - x1);\n        let shiftY = (y2 - y1) / 2 - (element.y - y1);\n        if (isTextElement(element)) {\n          const container = getContainerElement(element);\n          if (isArrowElement(container)) {\n            const boundTextCoords =\n              LinearElementEditor.getBoundTextElementPosition(\n                container,\n                element as ExcalidrawTextElementWithContainer,\n              );\n            shiftX = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n            shiftY = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n          }\n        }\n        context.save();\n        context.translate(cx, cy);\n\n        if (shouldResetImageFilter(element, renderConfig)) {\n          context.filter = \"none\";\n        }\n        const boundTextElement = getBoundTextElement(element);\n\n        if (isArrowElement(element) && boundTextElement) {\n          const tempCanvas = document.createElement(\"canvas\");\n\n          const tempCanvasContext = tempCanvas.getContext(\"2d\")!;\n\n          // Take max dimensions of arrow canvas so that when canvas is rotated\n          // the arrow doesn't get clipped\n          const maxDim = Math.max(distance(x1, x2), distance(y1, y2));\n          const padding = getCanvasPadding(element);\n          tempCanvas.width =\n            maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n          tempCanvas.height =\n            maxDim * appState.exportScale + padding * 10 * appState.exportScale;\n\n          tempCanvasContext.translate(\n            tempCanvas.width / 2,\n            tempCanvas.height / 2,\n          );\n          tempCanvasContext.scale(appState.exportScale, appState.exportScale);\n\n          // Shift the canvas to left most point of the arrow\n          shiftX = element.width / 2 - (element.x - x1);\n          shiftY = element.height / 2 - (element.y - y1);\n\n          tempCanvasContext.rotate(element.angle);\n          const tempRc = rough.canvas(tempCanvas);\n\n          tempCanvasContext.translate(-shiftX, -shiftY);\n\n          drawElementOnCanvas(element, tempRc, tempCanvasContext, renderConfig);\n\n          tempCanvasContext.translate(shiftX, shiftY);\n\n          tempCanvasContext.rotate(-element.angle);\n\n          // Shift the canvas to center of bound text\n          const [, , , , boundTextCx, boundTextCy] =\n            getElementAbsoluteCoords(boundTextElement);\n          const boundTextShiftX = (x1 + x2) / 2 - boundTextCx;\n          const boundTextShiftY = (y1 + y2) / 2 - boundTextCy;\n          tempCanvasContext.translate(-boundTextShiftX, -boundTextShiftY);\n\n          // Clear the bound text area\n          tempCanvasContext.clearRect(\n            -boundTextElement.width / 2,\n            -boundTextElement.height / 2,\n            boundTextElement.width,\n            boundTextElement.height,\n          );\n          context.scale(1 / appState.exportScale, 1 / appState.exportScale);\n          context.drawImage(\n            tempCanvas,\n            -tempCanvas.width / 2,\n            -tempCanvas.height / 2,\n            tempCanvas.width,\n            tempCanvas.height,\n          );\n        } else {\n          context.rotate(element.angle);\n\n          if (element.type === \"image\") {\n            // note: scale must be applied *after* rotating\n            context.scale(element.scale[0], element.scale[1]);\n          }\n\n          context.translate(-shiftX, -shiftY);\n          drawElementOnCanvas(element, rc, context, renderConfig);\n        }\n\n        context.restore();\n        // not exporting → optimized rendering (cache & render from element\n        // canvases)\n      } else {\n        const elementWithCanvas = generateElementWithCanvas(\n          element,\n          renderConfig,\n        );\n\n        const currentImageSmoothingStatus = context.imageSmoothingEnabled;\n\n        if (\n          // do not disable smoothing during zoom as blurry shapes look better\n          // on low resolution (while still zooming in) than sharp ones\n          !renderConfig?.shouldCacheIgnoreZoom &&\n          // angle is 0 -> always disable smoothing\n          (!element.angle ||\n            // or check if angle is a right angle in which case we can still\n            // disable smoothing without adversely affecting the result\n            isRightAngle(element.angle))\n        ) {\n          // Disabling smoothing makes output much sharper, especially for\n          // text. Unless for non-right angles, where the aliasing is really\n          // terrible on Chromium.\n          //\n          // Note that `context.imageSmoothingQuality=\"high\"` has almost\n          // zero effect.\n          //\n          context.imageSmoothingEnabled = false;\n        }\n\n        drawElementFromCanvas(elementWithCanvas, rc, context, renderConfig);\n\n        // reset\n        context.imageSmoothingEnabled = currentImageSmoothingStatus;\n      }\n      break;\n    }\n    default: {\n      // @ts-ignore\n      throw new Error(`Unimplemented type ${element.type}`);\n    }\n  }\n};\n\nconst roughSVGDrawWithPrecision = (\n  rsvg: RoughSVG,\n  drawable: Drawable,\n  precision?: number,\n) => {\n  if (typeof precision === \"undefined\") {\n    return rsvg.draw(drawable);\n  }\n  const pshape: Drawable = {\n    sets: drawable.sets,\n    shape: drawable.shape,\n    options: { ...drawable.options, fixedDecimalPlaceDigits: precision },\n  };\n  return rsvg.draw(pshape);\n};\n\nexport const renderElementToSvg = (\n  element: NonDeletedExcalidrawElement,\n  rsvg: RoughSVG,\n  svgRoot: SVGElement,\n  files: BinaryFiles,\n  offsetX: number,\n  offsetY: number,\n  exportWithDarkMode?: boolean,\n) => {\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  let cx = (x2 - x1) / 2 - (element.x - x1);\n  let cy = (y2 - y1) / 2 - (element.y - y1);\n  if (isTextElement(element)) {\n    const container = getContainerElement(element);\n    if (isArrowElement(container)) {\n      const [x1, y1, x2, y2] = getElementAbsoluteCoords(container);\n\n      const boundTextCoords = LinearElementEditor.getBoundTextElementPosition(\n        container,\n        element as ExcalidrawTextElementWithContainer,\n      );\n      cx = (x2 - x1) / 2 - (boundTextCoords.x - x1);\n      cy = (y2 - y1) / 2 - (boundTextCoords.y - y1);\n      offsetX = offsetX + boundTextCoords.x - element.x;\n      offsetY = offsetY + boundTextCoords.y - element.y;\n    }\n  }\n  const degree = (180 * element.angle) / Math.PI;\n  const generator = rsvg.generator;\n\n  // element to append node to, most of the time svgRoot\n  let root = svgRoot;\n\n  // if the element has a link, create an anchor tag and make that the new root\n  if (element.link) {\n    const anchorTag = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"a\");\n    anchorTag.setAttribute(\"href\", element.link);\n    root.appendChild(anchorTag);\n    root = anchorTag;\n  }\n\n  switch (element.type) {\n    case \"selection\": {\n      // Since this is used only during editing experience, which is canvas based,\n      // this should not happen\n      throw new Error(\"Selection rendering is not supported for SVG\");\n    }\n    case \"rectangle\":\n    case \"diamond\":\n    case \"ellipse\": {\n      generateElementShape(element, generator);\n      const node = roughSVGDrawWithPrecision(\n        rsvg,\n        getShapeForElement(element)!,\n        MAX_DECIMALS_FOR_SVG_EXPORT,\n      );\n      const opacity = element.opacity / 100;\n      if (opacity !== 1) {\n        node.setAttribute(\"stroke-opacity\", `${opacity}`);\n        node.setAttribute(\"fill-opacity\", `${opacity}`);\n      }\n      node.setAttribute(\"stroke-linecap\", \"round\");\n      node.setAttribute(\n        \"transform\",\n        `translate(${offsetX || 0} ${\n          offsetY || 0\n        }) rotate(${degree} ${cx} ${cy})`,\n      );\n      root.appendChild(node);\n      break;\n    }\n    case \"line\":\n    case \"arrow\": {\n      const boundText = getBoundTextElement(element);\n      const maskPath = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"mask\");\n      if (boundText) {\n        maskPath.setAttribute(\"id\", `mask-${element.id}`);\n        const maskRectVisible = svgRoot.ownerDocument!.createElementNS(\n          SVG_NS,\n          \"rect\",\n        );\n        offsetX = offsetX || 0;\n        offsetY = offsetY || 0;\n        maskRectVisible.setAttribute(\"x\", \"0\");\n        maskRectVisible.setAttribute(\"y\", \"0\");\n        maskRectVisible.setAttribute(\"fill\", \"#fff\");\n        maskRectVisible.setAttribute(\n          \"width\",\n          `${element.width + 100 + offsetX}`,\n        );\n        maskRectVisible.setAttribute(\n          \"height\",\n          `${element.height + 100 + offsetY}`,\n        );\n\n        maskPath.appendChild(maskRectVisible);\n        const maskRectInvisible = svgRoot.ownerDocument!.createElementNS(\n          SVG_NS,\n          \"rect\",\n        );\n        const boundTextCoords = LinearElementEditor.getBoundTextElementPosition(\n          element,\n          boundText,\n        );\n\n        const maskX = offsetX + boundTextCoords.x - element.x;\n        const maskY = offsetY + boundTextCoords.y - element.y;\n\n        maskRectInvisible.setAttribute(\"x\", maskX.toString());\n        maskRectInvisible.setAttribute(\"y\", maskY.toString());\n        maskRectInvisible.setAttribute(\"fill\", \"#000\");\n        maskRectInvisible.setAttribute(\"width\", `${boundText.width}`);\n        maskRectInvisible.setAttribute(\"height\", `${boundText.height}`);\n        maskRectInvisible.setAttribute(\"opacity\", \"1\");\n        maskPath.appendChild(maskRectInvisible);\n      }\n      generateElementShape(element, generator);\n      const group = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n      if (boundText) {\n        group.setAttribute(\"mask\", `url(#mask-${element.id})`);\n      }\n      const opacity = element.opacity / 100;\n      group.setAttribute(\"stroke-linecap\", \"round\");\n\n      getShapeForElement(element)!.forEach((shape) => {\n        const node = roughSVGDrawWithPrecision(\n          rsvg,\n          shape,\n          MAX_DECIMALS_FOR_SVG_EXPORT,\n        );\n        if (opacity !== 1) {\n          node.setAttribute(\"stroke-opacity\", `${opacity}`);\n          node.setAttribute(\"fill-opacity\", `${opacity}`);\n        }\n        node.setAttribute(\n          \"transform\",\n          `translate(${offsetX || 0} ${\n            offsetY || 0\n          }) rotate(${degree} ${cx} ${cy})`,\n        );\n        if (\n          element.type === \"line\" &&\n          isPathALoop(element.points) &&\n          element.backgroundColor !== \"transparent\"\n        ) {\n          node.setAttribute(\"fill-rule\", \"evenodd\");\n        }\n        group.appendChild(node);\n      });\n      root.appendChild(group);\n      root.append(maskPath);\n      break;\n    }\n    case \"freedraw\": {\n      generateElementShape(element, generator);\n      generateFreeDrawShape(element);\n      const opacity = element.opacity / 100;\n      const shape = getShapeForElement(element);\n      const node = shape\n        ? roughSVGDrawWithPrecision(rsvg, shape, MAX_DECIMALS_FOR_SVG_EXPORT)\n        : svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n      if (opacity !== 1) {\n        node.setAttribute(\"stroke-opacity\", `${opacity}`);\n        node.setAttribute(\"fill-opacity\", `${opacity}`);\n      }\n      node.setAttribute(\n        \"transform\",\n        `translate(${offsetX || 0} ${\n          offsetY || 0\n        }) rotate(${degree} ${cx} ${cy})`,\n      );\n      node.setAttribute(\"stroke\", \"none\");\n      const path = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"path\");\n      path.setAttribute(\"fill\", element.strokeColor);\n      path.setAttribute(\"d\", getFreeDrawSvgPath(element));\n      node.appendChild(path);\n      root.appendChild(node);\n      break;\n    }\n    case \"image\": {\n      const width = Math.round(element.width);\n      const height = Math.round(element.height);\n      const fileData =\n        isInitializedImageElement(element) && files[element.fileId];\n      if (fileData) {\n        const symbolId = `image-${fileData.id}`;\n        let symbol = svgRoot.querySelector(`#${symbolId}`);\n        if (!symbol) {\n          symbol = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"symbol\");\n          symbol.id = symbolId;\n\n          const image = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"image\");\n\n          image.setAttribute(\"width\", \"100%\");\n          image.setAttribute(\"height\", \"100%\");\n          image.setAttribute(\"href\", fileData.dataURL);\n\n          symbol.appendChild(image);\n\n          root.prepend(symbol);\n        }\n\n        const use = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"use\");\n        use.setAttribute(\"href\", `#${symbolId}`);\n\n        // in dark theme, revert the image color filter\n        if (exportWithDarkMode && fileData.mimeType !== MIME_TYPES.svg) {\n          use.setAttribute(\"filter\", IMAGE_INVERT_FILTER);\n        }\n\n        use.setAttribute(\"width\", `${width}`);\n        use.setAttribute(\"height\", `${height}`);\n\n        // We first apply `scale` transforms (horizontal/vertical mirroring)\n        // on the <use> element, then apply translation and rotation\n        // on the <g> element which wraps the <use>.\n        // Doing this separately is a quick hack to to work around compositing\n        // the transformations correctly (the transform-origin was not being\n        // applied correctly).\n        if (element.scale[0] !== 1 || element.scale[1] !== 1) {\n          const translateX = element.scale[0] !== 1 ? -width : 0;\n          const translateY = element.scale[1] !== 1 ? -height : 0;\n          use.setAttribute(\n            \"transform\",\n            `scale(${element.scale[0]}, ${element.scale[1]}) translate(${translateX} ${translateY})`,\n          );\n        }\n\n        const g = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n        g.appendChild(use);\n        g.setAttribute(\n          \"transform\",\n          `translate(${offsetX || 0} ${\n            offsetY || 0\n          }) rotate(${degree} ${cx} ${cy})`,\n        );\n\n        root.appendChild(g);\n      }\n      break;\n    }\n    default: {\n      if (isTextElement(element)) {\n        const opacity = element.opacity / 100;\n        const node = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"g\");\n        if (opacity !== 1) {\n          node.setAttribute(\"stroke-opacity\", `${opacity}`);\n          node.setAttribute(\"fill-opacity\", `${opacity}`);\n        }\n\n        node.setAttribute(\n          \"transform\",\n          `translate(${offsetX || 0} ${\n            offsetY || 0\n          }) rotate(${degree} ${cx} ${cy})`,\n        );\n        const lines = element.text.replace(/\\r\\n?/g, \"\\n\").split(\"\\n\");\n        const lineHeight = element.height / lines.length;\n        const horizontalOffset =\n          element.textAlign === \"center\"\n            ? element.width / 2\n            : element.textAlign === \"right\"\n            ? element.width\n            : 0;\n        const direction = isRTL(element.text) ? \"rtl\" : \"ltr\";\n        const textAnchor =\n          element.textAlign === \"center\"\n            ? \"middle\"\n            : element.textAlign === \"right\" || direction === \"rtl\"\n            ? \"end\"\n            : \"start\";\n        for (let i = 0; i < lines.length; i++) {\n          const text = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"text\");\n          text.textContent = lines[i];\n          text.setAttribute(\"x\", `${horizontalOffset}`);\n          text.setAttribute(\"y\", `${i * lineHeight}`);\n          text.setAttribute(\"font-family\", getFontFamilyString(element));\n          text.setAttribute(\"font-size\", `${element.fontSize}px`);\n          text.setAttribute(\"fill\", element.strokeColor);\n          text.setAttribute(\"text-anchor\", textAnchor);\n          text.setAttribute(\"style\", \"white-space: pre;\");\n          text.setAttribute(\"direction\", direction);\n          text.setAttribute(\"dominant-baseline\", \"text-before-edge\");\n          node.appendChild(text);\n        }\n        root.appendChild(node);\n      } else {\n        // @ts-ignore\n        throw new Error(`Unimplemented type ${element.type}`);\n      }\n    }\n  }\n};\n\nexport const pathsCache = new WeakMap<ExcalidrawFreeDrawElement, Path2D>([]);\n\nexport function generateFreeDrawShape(element: ExcalidrawFreeDrawElement) {\n  const svgPathData = getFreeDrawSvgPath(element);\n  const path = new Path2D(svgPathData);\n  pathsCache.set(element, path);\n  return path;\n}\n\nexport function getFreeDrawPath2D(element: ExcalidrawFreeDrawElement) {\n  return pathsCache.get(element);\n}\n\nexport function getFreeDrawSvgPath(element: ExcalidrawFreeDrawElement) {\n  // If input points are empty (should they ever be?) return a dot\n  const inputPoints = element.simulatePressure\n    ? element.points\n    : element.points.length\n    ? element.points.map(([x, y], i) => [x, y, element.pressures[i]])\n    : [[0, 0, 0.5]];\n\n  // Consider changing the options for simulated pressure vs real pressure\n  const options: StrokeOptions = {\n    simulatePressure: element.simulatePressure,\n    size: element.strokeWidth * 4.25,\n    thinning: 0.6,\n    smoothing: 0.5,\n    streamline: 0.5,\n    easing: (t) => Math.sin((t * Math.PI) / 2), // https://easings.net/#easeOutSine\n    last: !!element.lastCommittedPoint, // LastCommittedPoint is added on pointerup\n  };\n\n  return getSvgPathFromStroke(getStroke(inputPoints as number[][], options));\n}\n\nfunction med(A: number[], B: number[]) {\n  return [(A[0] + B[0]) / 2, (A[1] + B[1]) / 2];\n}\n\n// Trim SVG path data so number are each two decimal points. This\n// improves SVG exports, and prevents rendering errors on points\n// with long decimals.\nconst TO_FIXED_PRECISION = /(\\s?[A-Z]?,?-?[0-9]*\\.[0-9]{0,2})(([0-9]|e|-)*)/g;\n\nfunction getSvgPathFromStroke(points: number[][]): string {\n  if (!points.length) {\n    return \"\";\n  }\n\n  const max = points.length - 1;\n\n  return points\n    .reduce(\n      (acc, point, i, arr) => {\n        if (i === max) {\n          acc.push(point, med(point, arr[0]), \"L\", arr[0], \"Z\");\n        } else {\n          acc.push(point, med(point, arr[i + 1]));\n        }\n        return acc;\n      },\n      [\"M\", points[0], \"Q\"],\n    )\n    .join(\" \")\n    .replace(TO_FIXED_PRECISION, \"$1\");\n}\n","import { RoughCanvas } from \"roughjs/bin/canvas\";\nimport { RoughSVG } from \"roughjs/bin/svg\";\nimport oc from \"open-color\";\n\nimport { AppState, BinaryFiles, Point, Zoom } from \"../types\";\nimport {\n  ExcalidrawElement,\n  NonDeletedExcalidrawElement,\n  ExcalidrawLinearElement,\n  NonDeleted,\n  GroupId,\n  ExcalidrawBindableElement,\n} from \"../element/types\";\nimport {\n  getElementAbsoluteCoords,\n  OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n  getTransformHandlesFromCoords,\n  getTransformHandles,\n  getElementBounds,\n  getCommonBounds,\n} from \"../element\";\n\nimport { roundRect } from \"./roundRect\";\nimport { RenderConfig } from \"../scene/types\";\nimport {\n  getScrollBars,\n  SCROLLBAR_COLOR,\n  SCROLLBAR_WIDTH,\n} from \"../scene/scrollbars\";\nimport { getSelectedElements } from \"../scene/selection\";\n\nimport { renderElement, renderElementToSvg } from \"./renderElement\";\nimport { getClientColors } from \"../clients\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\nimport {\n  isSelectedViaGroup,\n  getSelectedGroupIds,\n  getElementsInGroup,\n} from \"../groups\";\nimport { maxBindingGap } from \"../element/collision\";\nimport {\n  SuggestedBinding,\n  SuggestedPointBinding,\n  isBindingEnabled,\n} from \"../element/binding\";\nimport {\n  shouldShowBoundingBox,\n  TransformHandles,\n  TransformHandleType,\n} from \"../element/transformHandles\";\nimport {\n  viewportCoordsToSceneCoords,\n  supportsEmoji,\n  throttleRAF,\n} from \"../utils\";\nimport { UserIdleState } from \"../types\";\nimport { THEME_FILTER } from \"../constants\";\nimport {\n  EXTERNAL_LINK_IMG,\n  getLinkHandleFromCoords,\n} from \"../element/Hyperlink\";\nimport { isLinearElement } from \"../element/typeChecks\";\n\nconst hasEmojiSupport = supportsEmoji();\nexport const DEFAULT_SPACING = 2;\n\nconst strokeRectWithRotation = (\n  context: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  cx: number,\n  cy: number,\n  angle: number,\n  fill: boolean = false,\n) => {\n  context.save();\n  context.translate(cx, cy);\n  context.rotate(angle);\n  if (fill) {\n    context.fillRect(x - cx, y - cy, width, height);\n  }\n  context.strokeRect(x - cx, y - cy, width, height);\n  context.restore();\n};\n\nconst strokeDiamondWithRotation = (\n  context: CanvasRenderingContext2D,\n  width: number,\n  height: number,\n  cx: number,\n  cy: number,\n  angle: number,\n) => {\n  context.save();\n  context.translate(cx, cy);\n  context.rotate(angle);\n  context.beginPath();\n  context.moveTo(0, height / 2);\n  context.lineTo(width / 2, 0);\n  context.lineTo(0, -height / 2);\n  context.lineTo(-width / 2, 0);\n  context.closePath();\n  context.stroke();\n  context.restore();\n};\n\nconst strokeEllipseWithRotation = (\n  context: CanvasRenderingContext2D,\n  width: number,\n  height: number,\n  cx: number,\n  cy: number,\n  angle: number,\n) => {\n  context.beginPath();\n  context.ellipse(cx, cy, width / 2, height / 2, angle, 0, Math.PI * 2);\n  context.stroke();\n};\n\nconst fillCircle = (\n  context: CanvasRenderingContext2D,\n  cx: number,\n  cy: number,\n  radius: number,\n  stroke = true,\n) => {\n  context.beginPath();\n  context.arc(cx, cy, radius, 0, Math.PI * 2);\n  context.fill();\n  if (stroke) {\n    context.stroke();\n  }\n};\n\nconst strokeGrid = (\n  context: CanvasRenderingContext2D,\n  gridSize: number,\n  offsetX: number,\n  offsetY: number,\n  width: number,\n  height: number,\n) => {\n  context.save();\n  context.strokeStyle = \"rgba(0,0,0,0.1)\";\n  context.beginPath();\n  for (let x = offsetX; x < offsetX + width + gridSize * 2; x += gridSize) {\n    context.moveTo(x, offsetY - gridSize);\n    context.lineTo(x, offsetY + height + gridSize * 2);\n  }\n  for (let y = offsetY; y < offsetY + height + gridSize * 2; y += gridSize) {\n    context.moveTo(offsetX - gridSize, y);\n    context.lineTo(offsetX + width + gridSize * 2, y);\n  }\n  context.stroke();\n  context.restore();\n};\n\nconst renderSingleLinearPoint = (\n  context: CanvasRenderingContext2D,\n  appState: AppState,\n  renderConfig: RenderConfig,\n  point: Point,\n  radius: number,\n  isSelected: boolean,\n  isPhantomPoint = false,\n) => {\n  context.strokeStyle = \"#5e5ad8\";\n  context.setLineDash([]);\n  context.fillStyle = \"rgba(255, 255, 255, 0.9)\";\n  if (isSelected) {\n    context.fillStyle = \"rgba(134, 131, 226, 0.9)\";\n  } else if (isPhantomPoint) {\n    context.fillStyle = \"rgba(177, 151, 252, 0.7)\";\n  }\n\n  fillCircle(\n    context,\n    point[0],\n    point[1],\n    radius / renderConfig.zoom.value,\n    !isPhantomPoint,\n  );\n};\n\nconst renderLinearPointHandles = (\n  context: CanvasRenderingContext2D,\n  appState: AppState,\n  renderConfig: RenderConfig,\n  element: NonDeleted<ExcalidrawLinearElement>,\n) => {\n  if (!appState.selectedLinearElement) {\n    return;\n  }\n  context.save();\n  context.translate(renderConfig.scrollX, renderConfig.scrollY);\n  context.lineWidth = 1 / renderConfig.zoom.value;\n  const points = LinearElementEditor.getPointsGlobalCoordinates(element);\n\n  const { POINT_HANDLE_SIZE } = LinearElementEditor;\n  const radius = appState.editingLinearElement\n    ? POINT_HANDLE_SIZE\n    : POINT_HANDLE_SIZE / 2;\n  points.forEach((point, idx) => {\n    const isSelected =\n      !!appState.editingLinearElement?.selectedPointsIndices?.includes(idx);\n\n    renderSingleLinearPoint(\n      context,\n      appState,\n      renderConfig,\n      point,\n      radius,\n      isSelected,\n    );\n  });\n\n  //Rendering segment mid points\n  const midPoints = LinearElementEditor.getEditorMidPoints(\n    element,\n    appState,\n  ).filter((midPoint) => midPoint !== null) as Point[];\n\n  midPoints.forEach((segmentMidPoint) => {\n    if (\n      appState?.selectedLinearElement?.segmentMidPointHoveredCoords &&\n      LinearElementEditor.arePointsEqual(\n        segmentMidPoint,\n        appState.selectedLinearElement.segmentMidPointHoveredCoords,\n      )\n    ) {\n      // The order of renderingSingleLinearPoint and highLight points is different\n      // inside vs outside editor as hover states are different,\n      // in editor when hovered the original point is not visible as hover state fully covers it whereas outside the\n      // editor original point is visible and hover state is just an outer circle.\n      if (appState.editingLinearElement) {\n        renderSingleLinearPoint(\n          context,\n          appState,\n          renderConfig,\n          segmentMidPoint,\n          radius,\n          false,\n        );\n        highlightPoint(segmentMidPoint, context, renderConfig);\n      } else {\n        highlightPoint(segmentMidPoint, context, renderConfig);\n        renderSingleLinearPoint(\n          context,\n          appState,\n          renderConfig,\n          segmentMidPoint,\n          radius,\n          false,\n        );\n      }\n    } else if (appState.editingLinearElement || points.length === 2) {\n      renderSingleLinearPoint(\n        context,\n        appState,\n        renderConfig,\n        segmentMidPoint,\n        POINT_HANDLE_SIZE / 2,\n        false,\n        true,\n      );\n    }\n  });\n\n  context.restore();\n};\n\nconst highlightPoint = (\n  point: Point,\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n) => {\n  context.fillStyle = \"rgba(105, 101, 219, 0.4)\";\n\n  fillCircle(\n    context,\n    point[0],\n    point[1],\n    LinearElementEditor.POINT_HANDLE_SIZE / renderConfig.zoom.value,\n    false,\n  );\n};\nconst renderLinearElementPointHighlight = (\n  context: CanvasRenderingContext2D,\n  appState: AppState,\n  renderConfig: RenderConfig,\n) => {\n  const { elementId, hoverPointIndex } = appState.selectedLinearElement!;\n  if (\n    appState.editingLinearElement?.selectedPointsIndices?.includes(\n      hoverPointIndex,\n    )\n  ) {\n    return;\n  }\n  const element = LinearElementEditor.getElement(elementId);\n  if (!element) {\n    return;\n  }\n  const point = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n    element,\n    hoverPointIndex,\n  );\n  context.save();\n  context.translate(renderConfig.scrollX, renderConfig.scrollY);\n\n  highlightPoint(point, context, renderConfig);\n  context.restore();\n};\n\nexport const _renderScene = ({\n  elements,\n  appState,\n  scale,\n  rc,\n  canvas,\n  renderConfig,\n}: {\n  elements: readonly NonDeletedExcalidrawElement[];\n  appState: AppState;\n  scale: number;\n  rc: RoughCanvas;\n  canvas: HTMLCanvasElement;\n  renderConfig: RenderConfig;\n}) =>\n  // extra options passed to the renderer\n  {\n    if (canvas === null) {\n      return { atLeastOneVisibleElement: false };\n    }\n    const {\n      renderScrollbars = true,\n      renderSelection = true,\n      renderGrid = true,\n      isExporting,\n    } = renderConfig;\n\n    const selectionColor = renderConfig.selectionColor || oc.black;\n\n    const context = canvas.getContext(\"2d\")!;\n\n    context.setTransform(1, 0, 0, 1, 0, 0);\n    context.save();\n    context.scale(scale, scale);\n    // When doing calculations based on canvas width we should used normalized one\n    const normalizedCanvasWidth = canvas.width / scale;\n    const normalizedCanvasHeight = canvas.height / scale;\n\n    if (isExporting && renderConfig.theme === \"dark\") {\n      context.filter = THEME_FILTER;\n    }\n\n    // Paint background\n    if (typeof renderConfig.viewBackgroundColor === \"string\") {\n      const hasTransparence =\n        renderConfig.viewBackgroundColor === \"transparent\" ||\n        renderConfig.viewBackgroundColor.length === 5 || // #RGBA\n        renderConfig.viewBackgroundColor.length === 9 || // #RRGGBBA\n        /(hsla|rgba)\\(/.test(renderConfig.viewBackgroundColor);\n      if (hasTransparence) {\n        context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\n      }\n      context.save();\n      context.fillStyle = renderConfig.viewBackgroundColor;\n      context.fillRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\n      context.restore();\n    } else {\n      context.clearRect(0, 0, normalizedCanvasWidth, normalizedCanvasHeight);\n    }\n\n    // Apply zoom\n    context.save();\n    context.scale(renderConfig.zoom.value, renderConfig.zoom.value);\n\n    // Grid\n    if (renderGrid && appState.gridSize) {\n      strokeGrid(\n        context,\n        appState.gridSize,\n        -Math.ceil(renderConfig.zoom.value / appState.gridSize) *\n          appState.gridSize +\n          (renderConfig.scrollX % appState.gridSize),\n        -Math.ceil(renderConfig.zoom.value / appState.gridSize) *\n          appState.gridSize +\n          (renderConfig.scrollY % appState.gridSize),\n        normalizedCanvasWidth / renderConfig.zoom.value,\n        normalizedCanvasHeight / renderConfig.zoom.value,\n      );\n    }\n\n    // Paint visible elements\n    const visibleElements = elements.filter((element) =>\n      isVisibleElement(element, normalizedCanvasWidth, normalizedCanvasHeight, {\n        zoom: renderConfig.zoom,\n        offsetLeft: appState.offsetLeft,\n        offsetTop: appState.offsetTop,\n        scrollX: renderConfig.scrollX,\n        scrollY: renderConfig.scrollY,\n      }),\n    );\n\n    let editingLinearElement: NonDeleted<ExcalidrawLinearElement> | undefined =\n      undefined;\n    visibleElements.forEach((element) => {\n      try {\n        renderElement(element, rc, context, renderConfig, appState);\n        // Getting the element using LinearElementEditor during collab mismatches version - being one head of visible elements due to\n        // ShapeCache returns empty hence making sure that we get the\n        // correct element from visible elements\n        if (appState.editingLinearElement?.elementId === element.id) {\n          if (element) {\n            editingLinearElement =\n              element as NonDeleted<ExcalidrawLinearElement>;\n          }\n        }\n        if (!isExporting) {\n          renderLinkIcon(element, context, appState);\n        }\n      } catch (error: any) {\n        console.error(error);\n      }\n    });\n\n    if (editingLinearElement) {\n      renderLinearPointHandles(\n        context,\n        appState,\n        renderConfig,\n        editingLinearElement,\n      );\n    }\n\n    // Paint selection element\n    if (appState.selectionElement) {\n      try {\n        renderElement(\n          appState.selectionElement,\n          rc,\n          context,\n          renderConfig,\n          appState,\n        );\n      } catch (error: any) {\n        console.error(error);\n      }\n    }\n\n    if (isBindingEnabled(appState)) {\n      appState.suggestedBindings\n        .filter((binding) => binding != null)\n        .forEach((suggestedBinding) => {\n          renderBindingHighlight(context, renderConfig, suggestedBinding!);\n        });\n    }\n    const locallySelectedElements = getSelectedElements(elements, appState);\n\n    // Getting the element using LinearElementEditor during collab mismatches version - being one head of visible elements due to\n    // ShapeCache returns empty hence making sure that we get the\n    // correct element from visible elements\n    if (\n      locallySelectedElements.length === 1 &&\n      appState.editingLinearElement?.elementId === locallySelectedElements[0].id\n    ) {\n      renderLinearPointHandles(\n        context,\n        appState,\n        renderConfig,\n        locallySelectedElements[0] as NonDeleted<ExcalidrawLinearElement>,\n      );\n    }\n\n    if (\n      appState.selectedLinearElement &&\n      appState.selectedLinearElement.hoverPointIndex >= 0\n    ) {\n      renderLinearElementPointHighlight(context, appState, renderConfig);\n    }\n    // Paint selected elements\n    if (\n      renderSelection &&\n      !appState.multiElement &&\n      !appState.editingLinearElement\n    ) {\n      const showBoundingBox = shouldShowBoundingBox(\n        locallySelectedElements,\n        appState,\n      );\n\n      const locallySelectedIds = locallySelectedElements.map(\n        (element) => element.id,\n      );\n      const isSingleLinearElementSelected =\n        locallySelectedElements.length === 1 &&\n        isLinearElement(locallySelectedElements[0]);\n      // render selected linear element points\n      if (\n        isSingleLinearElementSelected &&\n        appState.selectedLinearElement?.elementId ===\n          locallySelectedElements[0].id &&\n        !locallySelectedElements[0].locked\n      ) {\n        renderLinearPointHandles(\n          context,\n          appState,\n          renderConfig,\n          locallySelectedElements[0] as ExcalidrawLinearElement,\n        );\n      }\n      if (showBoundingBox) {\n        const selections = elements.reduce((acc, element) => {\n          const selectionColors = [];\n          // local user\n          if (\n            locallySelectedIds.includes(element.id) &&\n            !isSelectedViaGroup(appState, element)\n          ) {\n            selectionColors.push(selectionColor);\n          }\n          // remote users\n          if (renderConfig.remoteSelectedElementIds[element.id]) {\n            selectionColors.push(\n              ...renderConfig.remoteSelectedElementIds[element.id].map(\n                (socketId) => {\n                  const { background } = getClientColors(socketId, appState);\n                  return background;\n                },\n              ),\n            );\n          }\n\n          if (selectionColors.length) {\n            const [elementX1, elementY1, elementX2, elementY2, cx, cy] =\n              getElementAbsoluteCoords(element, true);\n            acc.push({\n              angle: element.angle,\n              elementX1,\n              elementY1,\n              elementX2,\n              elementY2,\n              selectionColors,\n              dashed: !!renderConfig.remoteSelectedElementIds[element.id],\n              cx,\n              cy,\n            });\n          }\n          return acc;\n        }, [] as { angle: number; elementX1: number; elementY1: number; elementX2: number; elementY2: number; selectionColors: string[]; dashed?: boolean; cx: number; cy: number }[]);\n\n        const addSelectionForGroupId = (groupId: GroupId) => {\n          const groupElements = getElementsInGroup(elements, groupId);\n          const [elementX1, elementY1, elementX2, elementY2] =\n            getCommonBounds(groupElements);\n          selections.push({\n            angle: 0,\n            elementX1,\n            elementX2,\n            elementY1,\n            elementY2,\n            selectionColors: [oc.black],\n            dashed: true,\n            cx: elementX1 + (elementX2 - elementX1) / 2,\n            cy: elementY1 + (elementY2 - elementY1) / 2,\n          });\n        };\n\n        for (const groupId of getSelectedGroupIds(appState)) {\n          // TODO: support multiplayer selected group IDs\n          addSelectionForGroupId(groupId);\n        }\n\n        if (appState.editingGroupId) {\n          addSelectionForGroupId(appState.editingGroupId);\n        }\n\n        selections.forEach((selection) =>\n          renderSelectionBorder(context, renderConfig, selection),\n        );\n      }\n      // Paint resize transformHandles\n      context.save();\n      context.translate(renderConfig.scrollX, renderConfig.scrollY);\n\n      if (locallySelectedElements.length === 1) {\n        context.fillStyle = oc.white;\n        const transformHandles = getTransformHandles(\n          locallySelectedElements[0],\n          renderConfig.zoom,\n          \"mouse\", // when we render we don't know which pointer type so use mouse\n        );\n        if (!appState.viewModeEnabled && showBoundingBox) {\n          renderTransformHandles(\n            context,\n            renderConfig,\n            transformHandles,\n            locallySelectedElements[0].angle,\n          );\n        }\n      } else if (locallySelectedElements.length > 1 && !appState.isRotating) {\n        const dashedLinePadding =\n          (DEFAULT_SPACING * 2) / renderConfig.zoom.value;\n        context.fillStyle = oc.white;\n        const [x1, y1, x2, y2] = getCommonBounds(locallySelectedElements);\n        const initialLineDash = context.getLineDash();\n        context.setLineDash([2 / renderConfig.zoom.value]);\n        const lineWidth = context.lineWidth;\n        context.lineWidth = 1 / renderConfig.zoom.value;\n        context.strokeStyle = selectionColor;\n        strokeRectWithRotation(\n          context,\n          x1 - dashedLinePadding,\n          y1 - dashedLinePadding,\n          x2 - x1 + dashedLinePadding * 2,\n          y2 - y1 + dashedLinePadding * 2,\n          (x1 + x2) / 2,\n          (y1 + y2) / 2,\n          0,\n        );\n        context.lineWidth = lineWidth;\n        context.setLineDash(initialLineDash);\n        const transformHandles = getTransformHandlesFromCoords(\n          [x1, y1, x2, y2, (x1 + x2) / 2, (y1 + y2) / 2],\n          0,\n          renderConfig.zoom,\n          \"mouse\",\n          OMIT_SIDES_FOR_MULTIPLE_ELEMENTS,\n        );\n        if (locallySelectedElements.some((element) => !element.locked)) {\n          renderTransformHandles(context, renderConfig, transformHandles, 0);\n        }\n      }\n      context.restore();\n    }\n\n    // Reset zoom\n    context.restore();\n\n    // Paint remote pointers\n    for (const clientId in renderConfig.remotePointerViewportCoords) {\n      let { x, y } = renderConfig.remotePointerViewportCoords[clientId];\n\n      x -= appState.offsetLeft;\n      y -= appState.offsetTop;\n\n      const width = 9;\n      const height = 14;\n\n      const isOutOfBounds =\n        x < 0 ||\n        x > normalizedCanvasWidth - width ||\n        y < 0 ||\n        y > normalizedCanvasHeight - height;\n\n      x = Math.max(x, 0);\n      x = Math.min(x, normalizedCanvasWidth - width);\n      y = Math.max(y, 0);\n      y = Math.min(y, normalizedCanvasHeight - height);\n\n      const { background, stroke } = getClientColors(clientId, appState);\n\n      context.save();\n      context.strokeStyle = stroke;\n      context.fillStyle = background;\n\n      const userState = renderConfig.remotePointerUserStates[clientId];\n      if (isOutOfBounds || userState === UserIdleState.AWAY) {\n        context.globalAlpha = 0.48;\n      }\n\n      if (\n        renderConfig.remotePointerButton &&\n        renderConfig.remotePointerButton[clientId] === \"down\"\n      ) {\n        context.beginPath();\n        context.arc(x, y, 15, 0, 2 * Math.PI, false);\n        context.lineWidth = 3;\n        context.strokeStyle = \"#ffffff88\";\n        context.stroke();\n        context.closePath();\n\n        context.beginPath();\n        context.arc(x, y, 15, 0, 2 * Math.PI, false);\n        context.lineWidth = 1;\n        context.strokeStyle = stroke;\n        context.stroke();\n        context.closePath();\n      }\n\n      context.beginPath();\n      context.moveTo(x, y);\n      context.lineTo(x + 1, y + 14);\n      context.lineTo(x + 4, y + 9);\n      context.lineTo(x + 9, y + 10);\n      context.lineTo(x, y);\n      context.fill();\n      context.stroke();\n\n      const username = renderConfig.remotePointerUsernames[clientId];\n\n      let idleState = \"\";\n      if (userState === UserIdleState.AWAY) {\n        idleState = hasEmojiSupport ? \"⚫️\" : ` (${UserIdleState.AWAY})`;\n      } else if (userState === UserIdleState.IDLE) {\n        idleState = hasEmojiSupport ? \"💤\" : ` (${UserIdleState.IDLE})`;\n      }\n\n      const usernameAndIdleState = `${username || \"\"}${\n        idleState ? ` ${idleState}` : \"\"\n      }`;\n\n      if (!isOutOfBounds && usernameAndIdleState) {\n        const offsetX = x + width;\n        const offsetY = y + height;\n        const paddingHorizontal = 4;\n        const paddingVertical = 4;\n        const measure = context.measureText(usernameAndIdleState);\n        const measureHeight =\n          measure.actualBoundingBoxDescent + measure.actualBoundingBoxAscent;\n\n        const boxX = offsetX - 1;\n        const boxY = offsetY - 1;\n        const boxWidth = measure.width + 2 * paddingHorizontal + 2;\n        const boxHeight = measureHeight + 2 * paddingVertical + 2;\n        if (context.roundRect) {\n          context.beginPath();\n          context.roundRect(\n            boxX,\n            boxY,\n            boxWidth,\n            boxHeight,\n            4 / renderConfig.zoom.value,\n          );\n          context.fillStyle = background;\n          context.fill();\n          context.fillStyle = stroke;\n          context.stroke();\n        } else {\n          // Border\n          context.fillStyle = stroke;\n          context.fillRect(boxX, boxY, boxWidth, boxHeight);\n          // Background\n          context.fillStyle = background;\n          context.fillRect(offsetX, offsetY, boxWidth - 2, boxHeight - 2);\n        }\n        context.fillStyle = oc.white;\n\n        context.fillText(\n          usernameAndIdleState,\n          offsetX + paddingHorizontal,\n          offsetY + paddingVertical + measure.actualBoundingBoxAscent,\n        );\n      }\n\n      context.restore();\n      context.closePath();\n    }\n\n    // Paint scrollbars\n    let scrollBars;\n    if (renderScrollbars) {\n      scrollBars = getScrollBars(\n        elements,\n        normalizedCanvasWidth,\n        normalizedCanvasHeight,\n        renderConfig,\n      );\n\n      context.save();\n      context.fillStyle = SCROLLBAR_COLOR;\n      context.strokeStyle = \"rgba(255,255,255,0.8)\";\n      [scrollBars.horizontal, scrollBars.vertical].forEach((scrollBar) => {\n        if (scrollBar) {\n          roundRect(\n            context,\n            scrollBar.x,\n            scrollBar.y,\n            scrollBar.width,\n            scrollBar.height,\n            SCROLLBAR_WIDTH / 2,\n          );\n        }\n      });\n      context.restore();\n    }\n\n    context.restore();\n    return { atLeastOneVisibleElement: visibleElements.length > 0, scrollBars };\n  };\n\nconst renderSceneThrottled = throttleRAF(\n  (config: {\n    elements: readonly NonDeletedExcalidrawElement[];\n    appState: AppState;\n    scale: number;\n    rc: RoughCanvas;\n    canvas: HTMLCanvasElement;\n    renderConfig: RenderConfig;\n    callback?: (data: ReturnType<typeof _renderScene>) => void;\n  }) => {\n    const ret = _renderScene(config);\n    config.callback?.(ret);\n  },\n  { trailing: true },\n);\n\n/** renderScene throttled to animation framerate */\nexport const renderScene = <T extends boolean = false>(\n  config: {\n    elements: readonly NonDeletedExcalidrawElement[];\n    appState: AppState;\n    scale: number;\n    rc: RoughCanvas;\n    canvas: HTMLCanvasElement;\n    renderConfig: RenderConfig;\n    callback?: (data: ReturnType<typeof _renderScene>) => void;\n  },\n  /** Whether to throttle rendering. Defaults to false.\n   * When throttling, no value is returned. Use the callback instead. */\n  throttle?: T,\n): T extends true ? void : ReturnType<typeof _renderScene> => {\n  if (throttle) {\n    renderSceneThrottled(config);\n    return undefined as T extends true ? void : ReturnType<typeof _renderScene>;\n  }\n  const ret = _renderScene(config);\n  config.callback?.(ret);\n  return ret as T extends true ? void : ReturnType<typeof _renderScene>;\n};\n\nconst renderTransformHandles = (\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n  transformHandles: TransformHandles,\n  angle: number,\n): void => {\n  Object.keys(transformHandles).forEach((key) => {\n    const transformHandle = transformHandles[key as TransformHandleType];\n    if (transformHandle !== undefined) {\n      const [x, y, width, height] = transformHandle;\n\n      context.save();\n      context.lineWidth = 1 / renderConfig.zoom.value;\n      if (renderConfig.selectionColor) {\n        context.strokeStyle = renderConfig.selectionColor;\n      }\n      if (key === \"rotation\") {\n        fillCircle(context, x + width / 2, y + height / 2, width / 2);\n        // prefer round corners if roundRect API is available\n      } else if (context.roundRect) {\n        context.beginPath();\n        context.roundRect(x, y, width, height, 2 / renderConfig.zoom.value);\n        context.fill();\n        context.stroke();\n      } else {\n        strokeRectWithRotation(\n          context,\n          x,\n          y,\n          width,\n          height,\n          x + width / 2,\n          y + height / 2,\n          angle,\n          true, // fill before stroke\n        );\n      }\n      context.restore();\n    }\n  });\n};\n\nconst renderSelectionBorder = (\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n  elementProperties: {\n    angle: number;\n    elementX1: number;\n    elementY1: number;\n    elementX2: number;\n    elementY2: number;\n    selectionColors: string[];\n    dashed?: boolean;\n    cx: number;\n    cy: number;\n  },\n  padding = DEFAULT_SPACING * 2,\n) => {\n  const {\n    angle,\n    elementX1,\n    elementY1,\n    elementX2,\n    elementY2,\n    selectionColors,\n    cx,\n    cy,\n    dashed,\n  } = elementProperties;\n  const elementWidth = elementX2 - elementX1;\n  const elementHeight = elementY2 - elementY1;\n\n  const linePadding = padding / renderConfig.zoom.value;\n  const lineWidth = 8 / renderConfig.zoom.value;\n  const spaceWidth = 4 / renderConfig.zoom.value;\n\n  context.save();\n  context.translate(renderConfig.scrollX, renderConfig.scrollY);\n  context.lineWidth = 1 / renderConfig.zoom.value;\n\n  const count = selectionColors.length;\n  for (let index = 0; index < count; ++index) {\n    context.strokeStyle = selectionColors[index];\n    if (dashed) {\n      context.setLineDash([\n        lineWidth,\n        spaceWidth + (lineWidth + spaceWidth) * (count - 1),\n      ]);\n    }\n    context.lineDashOffset = (lineWidth + spaceWidth) * index;\n    strokeRectWithRotation(\n      context,\n      elementX1 - linePadding,\n      elementY1 - linePadding,\n      elementWidth + linePadding * 2,\n      elementHeight + linePadding * 2,\n      cx,\n      cy,\n      angle,\n    );\n  }\n  context.restore();\n};\n\nconst renderBindingHighlight = (\n  context: CanvasRenderingContext2D,\n  renderConfig: RenderConfig,\n  suggestedBinding: SuggestedBinding,\n) => {\n  const renderHighlight = Array.isArray(suggestedBinding)\n    ? renderBindingHighlightForSuggestedPointBinding\n    : renderBindingHighlightForBindableElement;\n\n  context.save();\n  context.translate(renderConfig.scrollX, renderConfig.scrollY);\n  renderHighlight(context, suggestedBinding as any);\n\n  context.restore();\n};\n\nconst renderBindingHighlightForBindableElement = (\n  context: CanvasRenderingContext2D,\n  element: ExcalidrawBindableElement,\n) => {\n  const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n  const width = x2 - x1;\n  const height = y2 - y1;\n  const threshold = maxBindingGap(element, width, height);\n\n  // So that we don't overlap the element itself\n  const strokeOffset = 4;\n  context.strokeStyle = \"rgba(0,0,0,.05)\";\n  context.lineWidth = threshold - strokeOffset;\n  const padding = strokeOffset / 2 + threshold / 2;\n\n  switch (element.type) {\n    case \"rectangle\":\n    case \"text\":\n    case \"image\":\n      strokeRectWithRotation(\n        context,\n        x1 - padding,\n        y1 - padding,\n        width + padding * 2,\n        height + padding * 2,\n        x1 + width / 2,\n        y1 + height / 2,\n        element.angle,\n      );\n      break;\n    case \"diamond\":\n      const side = Math.hypot(width, height);\n      const wPadding = (padding * side) / height;\n      const hPadding = (padding * side) / width;\n      strokeDiamondWithRotation(\n        context,\n        width + wPadding * 2,\n        height + hPadding * 2,\n        x1 + width / 2,\n        y1 + height / 2,\n        element.angle,\n      );\n      break;\n    case \"ellipse\":\n      strokeEllipseWithRotation(\n        context,\n        width + padding * 2,\n        height + padding * 2,\n        x1 + width / 2,\n        y1 + height / 2,\n        element.angle,\n      );\n      break;\n  }\n};\n\nconst renderBindingHighlightForSuggestedPointBinding = (\n  context: CanvasRenderingContext2D,\n  suggestedBinding: SuggestedPointBinding,\n) => {\n  const [element, startOrEnd, bindableElement] = suggestedBinding;\n\n  const threshold = maxBindingGap(\n    bindableElement,\n    bindableElement.width,\n    bindableElement.height,\n  );\n\n  context.strokeStyle = \"rgba(0,0,0,0)\";\n  context.fillStyle = \"rgba(0,0,0,.05)\";\n\n  const pointIndices =\n    startOrEnd === \"both\" ? [0, -1] : startOrEnd === \"start\" ? [0] : [-1];\n  pointIndices.forEach((index) => {\n    const [x, y] = LinearElementEditor.getPointAtIndexGlobalCoordinates(\n      element,\n      index,\n    );\n    fillCircle(context, x, y, threshold);\n  });\n};\n\nlet linkCanvasCache: any;\nconst renderLinkIcon = (\n  element: NonDeletedExcalidrawElement,\n  context: CanvasRenderingContext2D,\n  appState: AppState,\n) => {\n  if (element.link && !appState.selectedElementIds[element.id]) {\n    const [x1, y1, x2, y2] = getElementAbsoluteCoords(element);\n    const [x, y, width, height] = getLinkHandleFromCoords(\n      [x1, y1, x2, y2],\n      element.angle,\n      appState,\n    );\n    const centerX = x + width / 2;\n    const centerY = y + height / 2;\n    context.save();\n    context.translate(appState.scrollX + centerX, appState.scrollY + centerY);\n    context.rotate(element.angle);\n\n    if (!linkCanvasCache || linkCanvasCache.zoom !== appState.zoom.value) {\n      linkCanvasCache = document.createElement(\"canvas\");\n      linkCanvasCache.zoom = appState.zoom.value;\n      linkCanvasCache.width =\n        width * window.devicePixelRatio * appState.zoom.value;\n      linkCanvasCache.height =\n        height * window.devicePixelRatio * appState.zoom.value;\n      const linkCanvasCacheContext = linkCanvasCache.getContext(\"2d\")!;\n      linkCanvasCacheContext.scale(\n        window.devicePixelRatio * appState.zoom.value,\n        window.devicePixelRatio * appState.zoom.value,\n      );\n      linkCanvasCacheContext.fillStyle = \"#fff\";\n      linkCanvasCacheContext.fillRect(0, 0, width, height);\n      linkCanvasCacheContext.drawImage(EXTERNAL_LINK_IMG, 0, 0, width, height);\n      linkCanvasCacheContext.restore();\n      context.drawImage(\n        linkCanvasCache,\n        x - centerX,\n        y - centerY,\n        width,\n        height,\n      );\n    } else {\n      context.drawImage(\n        linkCanvasCache,\n        x - centerX,\n        y - centerY,\n        width,\n        height,\n      );\n    }\n    context.restore();\n  }\n};\n\nconst isVisibleElement = (\n  element: ExcalidrawElement,\n  canvasWidth: number,\n  canvasHeight: number,\n  viewTransformations: {\n    zoom: Zoom;\n    offsetLeft: number;\n    offsetTop: number;\n    scrollX: number;\n    scrollY: number;\n  },\n) => {\n  const [x1, y1, x2, y2] = getElementBounds(element); // scene coordinates\n  const topLeftSceneCoords = viewportCoordsToSceneCoords(\n    {\n      clientX: viewTransformations.offsetLeft,\n      clientY: viewTransformations.offsetTop,\n    },\n    viewTransformations,\n  );\n  const bottomRightSceneCoords = viewportCoordsToSceneCoords(\n    {\n      clientX: viewTransformations.offsetLeft + canvasWidth,\n      clientY: viewTransformations.offsetTop + canvasHeight,\n    },\n    viewTransformations,\n  );\n\n  return (\n    topLeftSceneCoords.x <= x2 &&\n    topLeftSceneCoords.y <= y2 &&\n    bottomRightSceneCoords.x >= x1 &&\n    bottomRightSceneCoords.y >= y1\n  );\n};\n\n// This should be only called for exporting purposes\nexport const renderSceneToSvg = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  rsvg: RoughSVG,\n  svgRoot: SVGElement,\n  files: BinaryFiles,\n  {\n    offsetX = 0,\n    offsetY = 0,\n    exportWithDarkMode = false,\n  }: {\n    offsetX?: number;\n    offsetY?: number;\n    exportWithDarkMode?: boolean;\n  } = {},\n) => {\n  if (!svgRoot) {\n    return;\n  }\n  // render elements\n  elements.forEach((element, index) => {\n    if (!element.isDeleted) {\n      try {\n        renderElementToSvg(\n          element,\n          rsvg,\n          svgRoot,\n          files,\n          element.x + offsetX,\n          element.y + offsetY,\n          exportWithDarkMode,\n        );\n      } catch (error: any) {\n        console.error(error);\n      }\n    }\n  });\n};\n","/**\n * https://stackoverflow.com/a/3368118\n * Draws a rounded rectangle using the current state of the canvas.\n * @param {CanvasRenderingContext2D} context\n * @param {Number} x The top left x coordinate\n * @param {Number} y The top left y coordinate\n * @param {Number} width The width of the rectangle\n * @param {Number} height The height of the rectangle\n * @param {Number} radius The corner radius\n */\nexport const roundRect = (\n  context: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  width: number,\n  height: number,\n  radius: number,\n) => {\n  context.beginPath();\n  context.moveTo(x + radius, y);\n  context.lineTo(x + width - radius, y);\n  context.quadraticCurveTo(x + width, y, x + width, y + radius);\n  context.lineTo(x + width, y + height - radius);\n  context.quadraticCurveTo(\n    x + width,\n    y + height,\n    x + width - radius,\n    y + height,\n  );\n  context.lineTo(x + radius, y + height);\n  context.quadraticCurveTo(x, y + height, x, y + height - radius);\n  context.lineTo(x, y + radius);\n  context.quadraticCurveTo(x, y, x + radius, y);\n  context.closePath();\n  context.fill();\n  context.stroke();\n};\n","import {\n  ExcalidrawElement,\n  NonDeletedExcalidrawElement,\n  NonDeleted,\n} from \"../element/types\";\nimport { getNonDeletedElements, isNonDeletedElement } from \"../element\";\nimport { LinearElementEditor } from \"../element/linearElementEditor\";\n\ntype ElementIdKey = InstanceType<typeof LinearElementEditor>[\"elementId\"];\ntype ElementKey = ExcalidrawElement | ElementIdKey;\n\ntype SceneStateCallback = () => void;\ntype SceneStateCallbackRemover = () => void;\n\nconst isIdKey = (elementKey: ElementKey): elementKey is ElementIdKey => {\n  if (typeof elementKey === \"string\") {\n    return true;\n  }\n  return false;\n};\n\nclass Scene {\n  // ---------------------------------------------------------------------------\n  // static methods/props\n  // ---------------------------------------------------------------------------\n\n  private static sceneMapByElement = new WeakMap<ExcalidrawElement, Scene>();\n  private static sceneMapById = new Map<string, Scene>();\n\n  static mapElementToScene(elementKey: ElementKey, scene: Scene) {\n    if (isIdKey(elementKey)) {\n      // for cases where we don't have access to the element object\n      // (e.g. restore serialized appState with id references)\n      this.sceneMapById.set(elementKey, scene);\n    } else {\n      this.sceneMapByElement.set(elementKey, scene);\n      // if mapping element objects, also cache the id string when later\n      // looking up by id alone\n      this.sceneMapById.set(elementKey.id, scene);\n    }\n  }\n\n  static getScene(elementKey: ElementKey): Scene | null {\n    if (isIdKey(elementKey)) {\n      return this.sceneMapById.get(elementKey) || null;\n    }\n    return this.sceneMapByElement.get(elementKey) || null;\n  }\n\n  // ---------------------------------------------------------------------------\n  // instance methods/props\n  // ---------------------------------------------------------------------------\n\n  private callbacks: Set<SceneStateCallback> = new Set();\n\n  private nonDeletedElements: readonly NonDeletedExcalidrawElement[] = [];\n  private elements: readonly ExcalidrawElement[] = [];\n  private elementsMap = new Map<ExcalidrawElement[\"id\"], ExcalidrawElement>();\n\n  getElementsIncludingDeleted() {\n    return this.elements;\n  }\n\n  getNonDeletedElements(): readonly NonDeletedExcalidrawElement[] {\n    return this.nonDeletedElements;\n  }\n\n  getElement<T extends ExcalidrawElement>(id: T[\"id\"]): T | null {\n    return (this.elementsMap.get(id) as T | undefined) || null;\n  }\n\n  getNonDeletedElement(\n    id: ExcalidrawElement[\"id\"],\n  ): NonDeleted<ExcalidrawElement> | null {\n    const element = this.getElement(id);\n    if (element && isNonDeletedElement(element)) {\n      return element;\n    }\n    return null;\n  }\n\n  /**\n   * A utility method to help with updating all scene elements, with the added\n   * performance optimization of not renewing the array if no change is made.\n   *\n   * Maps all current excalidraw elements, invoking the callback for each\n   * element. The callback should either return a new mapped element, or the\n   * original element if no changes are made. If no changes are made to any\n   * element, this results in a no-op. Otherwise, the newly mapped elements\n   * are set as the next scene's elements.\n   *\n   * @returns whether a change was made\n   */\n  mapElements(\n    iteratee: (element: ExcalidrawElement) => ExcalidrawElement,\n  ): boolean {\n    let didChange = false;\n    const newElements = this.elements.map((element) => {\n      const nextElement = iteratee(element);\n      if (nextElement !== element) {\n        didChange = true;\n      }\n      return nextElement;\n    });\n    if (didChange) {\n      this.replaceAllElements(newElements);\n    }\n    return didChange;\n  }\n\n  replaceAllElements(nextElements: readonly ExcalidrawElement[]) {\n    this.elements = nextElements;\n    this.elementsMap.clear();\n    nextElements.forEach((element) => {\n      this.elementsMap.set(element.id, element);\n      Scene.mapElementToScene(element, this);\n    });\n    this.nonDeletedElements = getNonDeletedElements(this.elements);\n    this.informMutation();\n  }\n\n  informMutation() {\n    for (const callback of Array.from(this.callbacks)) {\n      callback();\n    }\n  }\n\n  addCallback(cb: SceneStateCallback): SceneStateCallbackRemover {\n    if (this.callbacks.has(cb)) {\n      throw new Error();\n    }\n\n    this.callbacks.add(cb);\n\n    return () => {\n      if (!this.callbacks.has(cb)) {\n        throw new Error();\n      }\n      this.callbacks.delete(cb);\n    };\n  }\n\n  destroy() {\n    Scene.sceneMapById.forEach((scene, elementKey) => {\n      if (scene === this) {\n        Scene.sceneMapById.delete(elementKey);\n      }\n    });\n    // done not for memory leaks, but to guard against possible late fires\n    // (I guess?)\n    this.callbacks.clear();\n  }\n\n  insertElementAtIndex(element: ExcalidrawElement, index: number) {\n    if (!Number.isFinite(index) || index < 0) {\n      throw new Error(\n        \"insertElementAtIndex can only be called with index >= 0\",\n      );\n    }\n    const nextElements = [\n      ...this.elements.slice(0, index),\n      element,\n      ...this.elements.slice(index),\n    ];\n    this.replaceAllElements(nextElements);\n  }\n\n  getElementIndex(elementId: string) {\n    return this.elements.findIndex((element) => element.id === elementId);\n  }\n}\n\nexport default Scene;\n","import { NonDeletedExcalidrawElement } from \"../element/types\";\n\nexport const hasBackground = (type: string) =>\n  type === \"rectangle\" ||\n  type === \"ellipse\" ||\n  type === \"diamond\" ||\n  type === \"line\" ||\n  type === \"freedraw\";\n\nexport const hasStrokeColor = (type: string) => type !== \"image\";\n\nexport const hasStrokeWidth = (type: string) =>\n  type === \"rectangle\" ||\n  type === \"ellipse\" ||\n  type === \"diamond\" ||\n  type === \"freedraw\" ||\n  type === \"arrow\" ||\n  type === \"line\";\n\nexport const hasStrokeStyle = (type: string) =>\n  type === \"rectangle\" ||\n  type === \"ellipse\" ||\n  type === \"diamond\" ||\n  type === \"arrow\" ||\n  type === \"line\";\n\nexport const canChangeRoundness = (type: string) =>\n  type === \"rectangle\" ||\n  type === \"arrow\" ||\n  type === \"line\" ||\n  type === \"diamond\";\n\nexport const hasText = (type: string) => type === \"text\";\n\nexport const canHaveArrowheads = (type: string) => type === \"arrow\";\n\nexport const getElementAtPosition = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  isAtPositionFn: (element: NonDeletedExcalidrawElement) => boolean,\n) => {\n  let hitElement = null;\n  // We need to to hit testing from front (end of the array) to back (beginning of the array)\n  // because array is ordered from lower z-index to highest and we want element z-index\n  // with higher z-index\n  for (let index = elements.length - 1; index >= 0; --index) {\n    const element = elements[index];\n    if (element.isDeleted) {\n      continue;\n    }\n    if (isAtPositionFn(element)) {\n      hitElement = element;\n      break;\n    }\n  }\n\n  return hitElement;\n};\n\nexport const getElementsAtPosition = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  isAtPositionFn: (element: NonDeletedExcalidrawElement) => boolean,\n) => {\n  // The parameter elements comes ordered from lower z-index to higher.\n  // We want to preserve that order on the returned array.\n  return elements.filter(\n    (element) => !element.isDeleted && isAtPositionFn(element),\n  );\n};\n","import rough from \"roughjs/bin/rough\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\nimport { getCommonBounds } from \"../element/bounds\";\nimport { renderScene, renderSceneToSvg } from \"../renderer/renderScene\";\nimport { distance } from \"../utils\";\nimport { AppState, BinaryFiles } from \"../types\";\nimport { DEFAULT_EXPORT_PADDING, SVG_NS, THEME_FILTER } from \"../constants\";\nimport { getDefaultAppState } from \"../appState\";\nimport { serializeAsJSON } from \"../data/json\";\nimport {\n  getInitializedImageElements,\n  updateImageCache,\n} from \"../element/image\";\n\nexport const SVG_EXPORT_TAG = `<!-- svg-source:excalidraw -->`;\n\nexport const exportToCanvas = async (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles,\n  {\n    exportBackground,\n    exportPadding = DEFAULT_EXPORT_PADDING,\n    viewBackgroundColor,\n  }: {\n    exportBackground: boolean;\n    exportPadding?: number;\n    viewBackgroundColor: string;\n  },\n  createCanvas: (\n    width: number,\n    height: number,\n  ) => { canvas: HTMLCanvasElement; scale: number } = (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  },\n) => {\n  const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n\n  const { canvas, scale = 1 } = createCanvas(width, height);\n\n  const defaultAppState = getDefaultAppState();\n\n  const { imageCache } = await updateImageCache({\n    imageCache: new Map(),\n    fileIds: getInitializedImageElements(elements).map(\n      (element) => element.fileId,\n    ),\n    files,\n  });\n\n  renderScene({\n    elements,\n    appState,\n    scale,\n    rc: rough.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\n  return canvas;\n};\n\nexport const exportToSvg = async (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: {\n    exportBackground: boolean;\n    exportPadding?: number;\n    exportScale?: number;\n    viewBackgroundColor: string;\n    exportWithDarkMode?: boolean;\n    exportEmbedScene?: boolean;\n  },\n  files: BinaryFiles | null,\n): Promise<SVGSVGElement> => {\n  const {\n    exportPadding = DEFAULT_EXPORT_PADDING,\n    viewBackgroundColor,\n    exportScale = 1,\n    exportEmbedScene,\n  } = appState;\n  let metadata = \"\";\n  if (exportEmbedScene) {\n    try {\n      metadata = await (\n        await import(/* webpackChunkName: \"image\" */ \"../../src/data/image\")\n      ).encodeSvgMetadata({\n        text: serializeAsJSON(elements, appState, files || {}, \"local\"),\n      });\n    } catch (error: any) {\n      console.error(error);\n    }\n  }\n  const [minX, minY, width, height] = getCanvasSize(elements, exportPadding);\n\n  // initialize SVG root\n  const svgRoot = document.createElementNS(SVG_NS, \"svg\");\n  svgRoot.setAttribute(\"version\", \"1.1\");\n  svgRoot.setAttribute(\"xmlns\", 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\", THEME_FILTER);\n  }\n\n  let assetPath = \"https://excalidraw.com/\";\n\n  // Asset path needs to be determined only when using package\n  if (process.env.IS_EXCALIDRAW_NPM_PACKAGE) {\n    assetPath =\n      window.EXCALIDRAW_ASSET_PATH ||\n      `https://unpkg.com/${process.env.PKG_NAME}@${process.env.PKG_VERSION}`;\n\n    if (assetPath?.startsWith(\"/\")) {\n      assetPath = assetPath.replace(\"/\", `${window.location.origin}/`);\n    }\n    assetPath = `${assetPath}/dist/excalidraw-assets/`;\n  }\n  svgRoot.innerHTML = `\n  ${SVG_EXPORT_TAG}\n  ${metadata}\n  <defs>\n    <style class=\"style-fonts\">\n      @font-face {\n        font-family: \"Virgil\";\n        src: url(\"${assetPath}Virgil.woff2\");\n      }\n      @font-face {\n        font-family: \"Cascadia\";\n        src: url(\"${assetPath}Cascadia.woff2\");\n      }\n    </style>\n  </defs>\n  `;\n  // render background rect\n  if (appState.exportBackground && viewBackgroundColor) {\n    const rect = svgRoot.ownerDocument!.createElementNS(SVG_NS, \"rect\");\n    rect.setAttribute(\"x\", \"0\");\n    rect.setAttribute(\"y\", \"0\");\n    rect.setAttribute(\"width\", `${width}`);\n    rect.setAttribute(\"height\", `${height}`);\n    rect.setAttribute(\"fill\", viewBackgroundColor);\n    svgRoot.appendChild(rect);\n  }\n\n  const rsvg = rough.svg(svgRoot);\n  renderSceneToSvg(elements, rsvg, svgRoot, files || {}, {\n    offsetX: -minX + exportPadding,\n    offsetY: -minY + exportPadding,\n    exportWithDarkMode: appState.exportWithDarkMode,\n  });\n\n  return svgRoot;\n};\n\n// calculate smallest area to fit the contents in\nconst getCanvasSize = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  exportPadding: number,\n): [number, number, number, number] => {\n  const [minX, minY, maxX, maxY] = getCommonBounds(elements);\n  const width = distance(minX, maxX) + exportPadding * 2;\n  const height = distance(minY, maxY) + exportPadding + exportPadding;\n\n  return [minX, minY, width, height];\n};\n\nexport const getExportSize = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  exportPadding: number,\n  scale: number,\n): [number, number] => {\n  const [, , width, height] = getCanvasSize(elements, exportPadding).map(\n    (dimension) => Math.trunc(dimension * scale),\n  );\n\n  return [width, height];\n};\n","import { AppState, PointerCoords, Zoom } from \"../types\";\nimport { ExcalidrawElement } from \"../element/types\";\nimport {\n  getCommonBounds,\n  getClosestElementBounds,\n  getVisibleElements,\n} from \"../element\";\n\nimport {\n  sceneCoordsToViewportCoords,\n  viewportCoordsToSceneCoords,\n} from \"../utils\";\n\nconst isOutsideViewPort = (\n  appState: AppState,\n  canvas: HTMLCanvasElement | null,\n  cords: Array<number>,\n) => {\n  const [x1, y1, x2, y2] = cords;\n  const { x: viewportX1, y: viewportY1 } = sceneCoordsToViewportCoords(\n    { sceneX: x1, sceneY: y1 },\n    appState,\n  );\n  const { x: viewportX2, y: viewportY2 } = sceneCoordsToViewportCoords(\n    { sceneX: x2, sceneY: y2 },\n    appState,\n  );\n  return (\n    viewportX2 - viewportX1 > appState.width ||\n    viewportY2 - viewportY1 > appState.height\n  );\n};\n\nexport const centerScrollOn = ({\n  scenePoint,\n  viewportDimensions,\n  zoom,\n}: {\n  scenePoint: PointerCoords;\n  viewportDimensions: { height: number; width: number };\n  zoom: Zoom;\n}) => {\n  return {\n    scrollX: viewportDimensions.width / 2 / zoom.value - scenePoint.x,\n    scrollY: viewportDimensions.height / 2 / zoom.value - scenePoint.y,\n  };\n};\n\nexport const calculateScrollCenter = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  canvas: HTMLCanvasElement | null,\n): { scrollX: number; scrollY: number } => {\n  elements = getVisibleElements(elements);\n\n  if (!elements.length) {\n    return {\n      scrollX: 0,\n      scrollY: 0,\n    };\n  }\n  let [x1, y1, x2, y2] = getCommonBounds(elements);\n\n  if (isOutsideViewPort(appState, canvas, [x1, y1, x2, y2])) {\n    [x1, y1, x2, y2] = getClosestElementBounds(\n      elements,\n      viewportCoordsToSceneCoords(\n        { clientX: appState.scrollX, clientY: appState.scrollY },\n        appState,\n      ),\n    );\n  }\n\n  const centerX = (x1 + x2) / 2;\n  const centerY = (y1 + y2) / 2;\n\n  return centerScrollOn({\n    scenePoint: { x: centerX, y: centerY },\n    viewportDimensions: { width: appState.width, height: appState.height },\n    zoom: appState.zoom,\n  });\n};\n","import { ExcalidrawElement } from \"../element/types\";\nimport { getCommonBounds } from \"../element\";\nimport { Zoom } from \"../types\";\nimport { ScrollBars } from \"./types\";\nimport { getGlobalCSSVariable } from \"../utils\";\nimport { getLanguage } from \"../i18n\";\n\nexport const SCROLLBAR_MARGIN = 4;\nexport const SCROLLBAR_WIDTH = 6;\nexport const SCROLLBAR_COLOR = \"rgba(0,0,0,0.3)\";\n\nexport const getScrollBars = (\n  elements: readonly ExcalidrawElement[],\n  viewportWidth: number,\n  viewportHeight: number,\n  {\n    scrollX,\n    scrollY,\n    zoom,\n  }: {\n    scrollX: number;\n    scrollY: number;\n    zoom: Zoom;\n  },\n): ScrollBars => {\n  if (elements.length === 0) {\n    return {\n      horizontal: null,\n      vertical: null,\n    };\n  }\n  // This is the bounding box of all the elements\n  const [elementsMinX, elementsMinY, elementsMaxX, elementsMaxY] =\n    getCommonBounds(elements);\n\n  // Apply zoom\n  const viewportWidthWithZoom = viewportWidth / zoom.value;\n  const viewportHeightWithZoom = viewportHeight / zoom.value;\n\n  const viewportWidthDiff = viewportWidth - viewportWidthWithZoom;\n  const viewportHeightDiff = viewportHeight - viewportHeightWithZoom;\n\n  const safeArea = {\n    top: parseInt(getGlobalCSSVariable(\"sat\")),\n    bottom: parseInt(getGlobalCSSVariable(\"sab\")),\n    left: parseInt(getGlobalCSSVariable(\"sal\")),\n    right: parseInt(getGlobalCSSVariable(\"sar\")),\n  };\n\n  const isRTL = getLanguage().rtl;\n\n  // The viewport is the rectangle currently visible for the user\n  const viewportMinX = -scrollX + viewportWidthDiff / 2 + safeArea.left;\n  const viewportMinY = -scrollY + viewportHeightDiff / 2 + safeArea.top;\n  const viewportMaxX = viewportMinX + viewportWidthWithZoom - safeArea.right;\n  const viewportMaxY = viewportMinY + viewportHeightWithZoom - safeArea.bottom;\n\n  // The scene is the bounding box of both the elements and viewport\n  const sceneMinX = Math.min(elementsMinX, viewportMinX);\n  const sceneMinY = Math.min(elementsMinY, viewportMinY);\n  const sceneMaxX = Math.max(elementsMaxX, viewportMaxX);\n  const sceneMaxY = Math.max(elementsMaxY, viewportMaxY);\n\n  // The scrollbar represents where the viewport is in relationship to the scene\n\n  return {\n    horizontal:\n      viewportMinX === sceneMinX && viewportMaxX === sceneMaxX\n        ? null\n        : {\n            x:\n              Math.max(safeArea.left, SCROLLBAR_MARGIN) +\n              ((viewportMinX - sceneMinX) / (sceneMaxX - sceneMinX)) *\n                viewportWidth,\n            y:\n              viewportHeight -\n              SCROLLBAR_WIDTH -\n              Math.max(SCROLLBAR_MARGIN, safeArea.bottom),\n            width:\n              ((viewportMaxX - viewportMinX) / (sceneMaxX - sceneMinX)) *\n                viewportWidth -\n              Math.max(SCROLLBAR_MARGIN * 2, safeArea.left + safeArea.right),\n            height: SCROLLBAR_WIDTH,\n          },\n    vertical:\n      viewportMinY === sceneMinY && viewportMaxY === sceneMaxY\n        ? null\n        : {\n            x: isRTL\n              ? Math.max(safeArea.left, SCROLLBAR_MARGIN)\n              : viewportWidth -\n                SCROLLBAR_WIDTH -\n                Math.max(safeArea.right, SCROLLBAR_MARGIN),\n            y:\n              ((viewportMinY - sceneMinY) / (sceneMaxY - sceneMinY)) *\n                viewportHeight +\n              Math.max(safeArea.top, SCROLLBAR_MARGIN),\n            width: SCROLLBAR_WIDTH,\n            height:\n              ((viewportMaxY - viewportMinY) / (sceneMaxY - sceneMinY)) *\n                viewportHeight -\n              Math.max(SCROLLBAR_MARGIN * 2, safeArea.top + safeArea.bottom),\n          },\n  };\n};\n\nexport const isOverScrollBars = (\n  scrollBars: ScrollBars,\n  x: number,\n  y: number,\n): {\n  isOverEither: boolean;\n  isOverHorizontal: boolean;\n  isOverVertical: boolean;\n} => {\n  const [isOverHorizontal, isOverVertical] = [\n    scrollBars.horizontal,\n    scrollBars.vertical,\n  ].map((scrollBar) => {\n    return (\n      scrollBar != null &&\n      scrollBar.x <= x &&\n      x <= scrollBar.x + scrollBar.width &&\n      scrollBar.y <= y &&\n      y <= scrollBar.y + scrollBar.height\n    );\n  });\n  const isOverEither = isOverHorizontal || isOverVertical;\n  return { isOverEither, isOverHorizontal, isOverVertical };\n};\n","import {\n  ExcalidrawElement,\n  NonDeletedExcalidrawElement,\n} from \"../element/types\";\nimport { getElementAbsoluteCoords, getElementBounds } from \"../element\";\nimport { AppState } from \"../types\";\nimport { isBoundToContainer } from \"../element/typeChecks\";\n\nexport const getElementsWithinSelection = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  selection: NonDeletedExcalidrawElement,\n) => {\n  const [selectionX1, selectionY1, selectionX2, selectionY2] =\n    getElementAbsoluteCoords(selection);\n  return elements.filter((element) => {\n    const [elementX1, elementY1, elementX2, elementY2] =\n      getElementBounds(element);\n\n    return (\n      element.locked === false &&\n      element.type !== \"selection\" &&\n      !isBoundToContainer(element) &&\n      selectionX1 <= elementX1 &&\n      selectionY1 <= elementY1 &&\n      selectionX2 >= elementX2 &&\n      selectionY2 >= elementY2\n    );\n  });\n};\n\nexport const isSomeElementSelected = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n): boolean =>\n  elements.some((element) => appState.selectedElementIds[element.id]);\n\n/**\n * Returns common attribute (picked by `getAttribute` callback) of selected\n *  elements. If elements don't share the same value, returns `null`.\n */\nexport const getCommonAttributeOfSelectedElements = <T>(\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  getAttribute: (element: ExcalidrawElement) => T,\n): T | null => {\n  const attributes = Array.from(\n    new Set(\n      getSelectedElements(elements, appState).map((element) =>\n        getAttribute(element),\n      ),\n    ),\n  );\n  return attributes.length === 1 ? attributes[0] : null;\n};\n\nexport const getSelectedElements = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  includeBoundTextElement: boolean = false,\n) =>\n  elements.filter((element) => {\n    if (appState.selectedElementIds[element.id]) {\n      return element;\n    }\n    if (\n      includeBoundTextElement &&\n      isBoundToContainer(element) &&\n      appState.selectedElementIds[element?.containerId]\n    ) {\n      return element;\n    }\n    return null;\n  });\n\nexport const getTargetElements = (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n) =>\n  appState.editingElement\n    ? [appState.editingElement]\n    : getSelectedElements(elements, appState, true);\n","import { MIN_ZOOM } from \"../constants\";\nimport { AppState, NormalizedZoomValue } from \"../types\";\n\nexport const getNormalizedZoom = (zoom: number): NormalizedZoomValue => {\n  return Math.max(MIN_ZOOM, Math.min(zoom, 30)) as NormalizedZoomValue;\n};\n\nexport const getStateForZoom = (\n  {\n    viewportX,\n    viewportY,\n    nextZoom,\n  }: {\n    viewportX: number;\n    viewportY: number;\n    nextZoom: NormalizedZoomValue;\n  },\n  appState: AppState,\n) => {\n  const appLayerX = viewportX - appState.offsetLeft;\n  const appLayerY = viewportY - appState.offsetTop;\n\n  const currentZoom = appState.zoom.value;\n\n  // get original scroll position without zoom\n  const baseScrollX = appState.scrollX + (appLayerX - appLayerX / currentZoom);\n  const baseScrollY = appState.scrollY + (appLayerY - appLayerY / currentZoom);\n\n  // get scroll offsets for target zoom level\n  const zoomOffsetScrollX = -(appLayerX - appLayerX / nextZoom);\n  const zoomOffsetScrollY = -(appLayerY - appLayerY / nextZoom);\n\n  return {\n    scrollX: baseScrollX + zoomOffsetScrollX,\n    scrollY: baseScrollY + zoomOffsetScrollY,\n    zoom: {\n      value: nextZoom,\n    },\n  };\n};\n","import {\n  PointerType,\n  ExcalidrawLinearElement,\n  NonDeletedExcalidrawElement,\n  NonDeleted,\n  TextAlign,\n  ExcalidrawElement,\n  GroupId,\n  ExcalidrawBindableElement,\n  Arrowhead,\n  ChartType,\n  FontFamilyValues,\n  FileId,\n  ExcalidrawImageElement,\n  Theme,\n  StrokeRoundness,\n} from \"./element/types\";\nimport { SHAPES } from \"./shapes\";\nimport { Point as RoughPoint } from \"roughjs/bin/geometry\";\nimport { LinearElementEditor } from \"./element/linearElementEditor\";\nimport { SuggestedBinding } from \"./element/binding\";\nimport { ImportedDataState } from \"./data/types\";\nimport type App from \"./components/App\";\nimport type { ResolvablePromise, throttleRAF } from \"./utils\";\nimport { Spreadsheet } from \"./charts\";\nimport { Language } from \"./i18n\";\nimport { ClipboardData } from \"./clipboard\";\nimport { isOverScrollBars } from \"./scene\";\nimport { MaybeTransformHandleType } from \"./element/transformHandles\";\nimport Library from \"./data/library\";\nimport type { FileSystemHandle } from \"./data/filesystem\";\nimport type { ALLOWED_IMAGE_MIME_TYPES, MIME_TYPES } from \"./constants\";\nimport { ContextMenuItems } from \"./components/ContextMenu\";\nimport { Merge, ForwardRef } from \"./utility-types\";\n\nexport type Point = Readonly<RoughPoint>;\n\nexport type Collaborator = {\n  pointer?: {\n    x: number;\n    y: number;\n  };\n  button?: \"up\" | \"down\";\n  selectedElementIds?: AppState[\"selectedElementIds\"];\n  username?: string | null;\n  userState?: UserIdleState;\n  color?: {\n    background: string;\n    stroke: string;\n  };\n  // The url of the collaborator's avatar, defaults to username intials\n  // if not present\n  avatarUrl?: string;\n  // user id. If supplied, we'll filter out duplicates when rendering user avatars.\n  id?: string;\n};\n\nexport type DataURL = string & { _brand: \"DataURL\" };\n\nexport type BinaryFileData = {\n  mimeType:\n    | typeof ALLOWED_IMAGE_MIME_TYPES[number]\n    // future user or unknown file type\n    | typeof MIME_TYPES.binary;\n  id: FileId;\n  dataURL: DataURL;\n  /**\n   * Epoch timestamp in milliseconds\n   */\n  created: number;\n  /**\n   * Indicates when the file was last retrieved from storage to be loaded\n   * onto the scene. We use this flag to determine whether to delete unused\n   * files from storage.\n   *\n   * Epoch timestamp in milliseconds.\n   */\n  lastRetrieved?: number;\n};\n\nexport type BinaryFileMetadata = Omit<BinaryFileData, \"dataURL\">;\n\nexport type BinaryFiles = Record<ExcalidrawElement[\"id\"], BinaryFileData>;\n\nexport type LastActiveTool =\n  | {\n      type: typeof SHAPES[number][\"value\"] | \"eraser\" | \"hand\";\n      customType: null;\n    }\n  | {\n      type: \"custom\";\n      customType: string;\n    }\n  | null;\n\nexport type AppState = {\n  contextMenu: {\n    items: ContextMenuItems;\n    top: number;\n    left: number;\n  } | null;\n  showWelcomeScreen: boolean;\n  isLoading: boolean;\n  errorMessage: string | null;\n  draggingElement: NonDeletedExcalidrawElement | null;\n  resizingElement: NonDeletedExcalidrawElement | null;\n  multiElement: NonDeleted<ExcalidrawLinearElement> | null;\n  selectionElement: NonDeletedExcalidrawElement | null;\n  isBindingEnabled: boolean;\n  startBoundElement: NonDeleted<ExcalidrawBindableElement> | null;\n  suggestedBindings: SuggestedBinding[];\n  // element being edited, but not necessarily added to elements array yet\n  // (e.g. text element when typing into the input)\n  editingElement: NonDeletedExcalidrawElement | null;\n  editingLinearElement: LinearElementEditor | null;\n  activeTool: {\n    /**\n     * indicates a previous tool we should revert back to if we deselect the\n     * currently active tool. At the moment applies to `eraser` and `hand` tool.\n     */\n    lastActiveTool: LastActiveTool;\n    locked: boolean;\n  } & (\n    | {\n        type: typeof SHAPES[number][\"value\"] | \"eraser\" | \"hand\";\n        customType: null;\n      }\n    | {\n        type: \"custom\";\n        customType: string;\n      }\n  );\n  penMode: boolean;\n  penDetected: boolean;\n  exportBackground: boolean;\n  exportEmbedScene: boolean;\n  exportWithDarkMode: boolean;\n  exportScale: number;\n  currentItemStrokeColor: string;\n  currentItemBackgroundColor: string;\n  currentItemFillStyle: ExcalidrawElement[\"fillStyle\"];\n  currentItemStrokeWidth: number;\n  currentItemStrokeStyle: ExcalidrawElement[\"strokeStyle\"];\n  currentItemRoughness: number;\n  currentItemOpacity: number;\n  currentItemFontFamily: FontFamilyValues;\n  currentItemFontSize: number;\n  currentItemTextAlign: TextAlign;\n  currentItemStartArrowhead: Arrowhead | null;\n  currentItemEndArrowhead: Arrowhead | null;\n  currentItemRoundness: StrokeRoundness;\n  viewBackgroundColor: string;\n  scrollX: number;\n  scrollY: number;\n  cursorButton: \"up\" | \"down\";\n  scrolledOutside: boolean;\n  name: string;\n  isResizing: boolean;\n  isRotating: boolean;\n  zoom: Zoom;\n  // mobile-only\n  openMenu: \"canvas\" | \"shape\" | null;\n  openPopup:\n    | \"canvasColorPicker\"\n    | \"backgroundColorPicker\"\n    | \"strokeColorPicker\"\n    | null;\n  openSidebar: \"library\" | \"customSidebar\" | null;\n  openDialog: \"imageExport\" | \"help\" | \"jsonExport\" | null;\n  isSidebarDocked: boolean;\n\n  lastPointerDownWith: PointerType;\n  selectedElementIds: { [id: string]: boolean };\n  previousSelectedElementIds: { [id: string]: boolean };\n  shouldCacheIgnoreZoom: boolean;\n  toast: { message: string; closable?: boolean; duration?: number } | null;\n  zenModeEnabled: boolean;\n  theme: Theme;\n  gridSize: number | null;\n  viewModeEnabled: boolean;\n\n  /** top-most selected groups (i.e. does not include nested groups) */\n  selectedGroupIds: { [groupId: string]: boolean };\n  /** group being edited when you drill down to its constituent element\n    (e.g. when you double-click on a group's element) */\n  editingGroupId: GroupId | null;\n  width: number;\n  height: number;\n  offsetTop: number;\n  offsetLeft: number;\n\n  fileHandle: FileSystemHandle | null;\n  collaborators: Map<string, Collaborator>;\n  showStats: boolean;\n  currentChartType: ChartType;\n  pasteDialog:\n    | {\n        shown: false;\n        data: null;\n      }\n    | {\n        shown: true;\n        data: Spreadsheet;\n      };\n  /** imageElement waiting to be placed on canvas */\n  pendingImageElementId: ExcalidrawImageElement[\"id\"] | null;\n  showHyperlinkPopup: false | \"info\" | \"editor\";\n  selectedLinearElement: LinearElementEditor | null;\n};\n\nexport type NormalizedZoomValue = number & { _brand: \"normalizedZoom\" };\n\nexport type Zoom = Readonly<{\n  value: NormalizedZoomValue;\n}>;\n\nexport type PointerCoords = Readonly<{\n  x: number;\n  y: number;\n}>;\n\nexport type Gesture = {\n  pointers: Map<number, PointerCoords>;\n  lastCenter: { x: number; y: number } | null;\n  initialDistance: number | null;\n  initialScale: number | null;\n};\n\nexport declare class GestureEvent extends UIEvent {\n  readonly rotation: number;\n  readonly scale: number;\n}\n\n// libraries\n// -----------------------------------------------------------------------------\n/** @deprecated legacy: do not use outside of migration paths */\nexport type LibraryItem_v1 = readonly NonDeleted<ExcalidrawElement>[];\n/** @deprecated legacy: do not use outside of migration paths */\ntype LibraryItems_v1 = readonly LibraryItem_v1[];\n\n/** v2 library item */\nexport type LibraryItem = {\n  id: string;\n  status: \"published\" | \"unpublished\";\n  elements: readonly NonDeleted<ExcalidrawElement>[];\n  /** timestamp in epoch (ms) */\n  created: number;\n  name?: string;\n  error?: string;\n};\nexport type LibraryItems = readonly LibraryItem[];\nexport type LibraryItems_anyVersion = LibraryItems | LibraryItems_v1;\n\nexport type LibraryItemsSource =\n  | ((\n      currentLibraryItems: LibraryItems,\n    ) =>\n      | Blob\n      | LibraryItems_anyVersion\n      | Promise<LibraryItems_anyVersion | Blob>)\n  | Blob\n  | LibraryItems_anyVersion\n  | Promise<LibraryItems_anyVersion | Blob>;\n// -----------------------------------------------------------------------------\n\n// NOTE ready/readyPromise props are optional for host apps' sake (our own\n// implem guarantees existence)\nexport type ExcalidrawAPIRefValue =\n  | ExcalidrawImperativeAPI\n  | {\n      readyPromise?: ResolvablePromise<ExcalidrawImperativeAPI>;\n      ready?: false;\n    };\n\nexport type ExcalidrawInitialDataState = Merge<\n  ImportedDataState,\n  {\n    libraryItems?:\n      | Required<ImportedDataState>[\"libraryItems\"]\n      | Promise<Required<ImportedDataState>[\"libraryItems\"]>;\n  }\n>;\n\nexport interface ExcalidrawProps {\n  onChange?: (\n    elements: readonly ExcalidrawElement[],\n    appState: AppState,\n    files: BinaryFiles,\n  ) => void;\n  initialData?:\n    | ExcalidrawInitialDataState\n    | null\n    | Promise<ExcalidrawInitialDataState | null>;\n  excalidrawRef?: ForwardRef<ExcalidrawAPIRefValue>;\n  isCollaborating?: boolean;\n  onPointerUpdate?: (payload: {\n    pointer: { x: number; y: number };\n    button: \"down\" | \"up\";\n    pointersMap: Gesture[\"pointers\"];\n  }) => void;\n  onPaste?: (\n    data: ClipboardData,\n    event: ClipboardEvent | null,\n  ) => Promise<boolean> | boolean;\n  renderTopRightUI?: (\n    isMobile: boolean,\n    appState: AppState,\n  ) => JSX.Element | null;\n  langCode?: Language[\"code\"];\n  viewModeEnabled?: boolean;\n  zenModeEnabled?: boolean;\n  gridModeEnabled?: boolean;\n  libraryReturnUrl?: string;\n  theme?: Theme;\n  name?: string;\n  renderCustomStats?: (\n    elements: readonly NonDeletedExcalidrawElement[],\n    appState: AppState,\n  ) => JSX.Element;\n  UIOptions?: Partial<UIOptions>;\n  detectScroll?: boolean;\n  handleKeyboardGlobally?: boolean;\n  onLibraryChange?: (libraryItems: LibraryItems) => void | Promise<any>;\n  autoFocus?: boolean;\n  generateIdForFile?: (file: File) => string | Promise<string>;\n  onLinkOpen?: (\n    element: NonDeletedExcalidrawElement,\n    event: CustomEvent<{\n      nativeEvent: MouseEvent | React.PointerEvent<HTMLCanvasElement>;\n    }>,\n  ) => void;\n  onPointerDown?: (\n    activeTool: AppState[\"activeTool\"],\n    pointerDownState: PointerDownState,\n  ) => void;\n  onScrollChange?: (scrollX: number, scrollY: number) => void;\n  /**\n   * Render function that renders custom <Sidebar /> component.\n   */\n  renderSidebar?: () => JSX.Element | null;\n  children?: React.ReactNode;\n}\n\nexport type SceneData = {\n  elements?: ImportedDataState[\"elements\"];\n  appState?: ImportedDataState[\"appState\"];\n  collaborators?: Map<string, Collaborator>;\n  commitToHistory?: boolean;\n};\n\nexport enum UserIdleState {\n  ACTIVE = \"active\",\n  AWAY = \"away\",\n  IDLE = \"idle\",\n}\n\nexport type ExportOpts = {\n  saveFileToDisk?: boolean;\n  onExportToBackend?: (\n    exportedElements: readonly NonDeletedExcalidrawElement[],\n    appState: AppState,\n    files: BinaryFiles,\n    canvas: HTMLCanvasElement | null,\n  ) => void;\n  renderCustomUI?: (\n    exportedElements: readonly NonDeletedExcalidrawElement[],\n    appState: AppState,\n    files: BinaryFiles,\n    canvas: HTMLCanvasElement | null,\n  ) => JSX.Element;\n};\n\n// NOTE at the moment, if action name coressponds to canvasAction prop, its\n// truthiness value will determine whether the action is rendered or not\n// (see manager renderAction). We also override canvasAction values in\n// excalidraw package index.tsx.\ntype CanvasActions = Partial<{\n  changeViewBackgroundColor: boolean;\n  clearCanvas: boolean;\n  export: false | ExportOpts;\n  loadScene: boolean;\n  saveToActiveFile: boolean;\n  toggleTheme: boolean | null;\n  saveAsImage: boolean;\n}>;\n\ntype UIOptions = Partial<{\n  dockedSidebarBreakpoint: number;\n  canvasActions: CanvasActions;\n  /** @deprecated does nothing. Will be removed in 0.15 */\n  welcomeScreen?: boolean;\n}>;\n\nexport type AppProps = Merge<\n  ExcalidrawProps,\n  {\n    UIOptions: Merge<\n      UIOptions,\n      {\n        canvasActions: Required<CanvasActions> & { export: ExportOpts };\n      }\n    >;\n    detectScroll: boolean;\n    handleKeyboardGlobally: boolean;\n    isCollaborating: boolean;\n    children?: React.ReactNode;\n  }\n>;\n\n/** A subset of App class properties that we need to use elsewhere\n * in the app, eg Manager. Factored out into a separate type to keep DRY. */\nexport type AppClassProperties = {\n  props: AppProps;\n  canvas: HTMLCanvasElement | null;\n  focusContainer(): void;\n  library: Library;\n  imageCache: Map<\n    FileId,\n    {\n      image: HTMLImageElement | Promise<HTMLImageElement>;\n      mimeType: typeof ALLOWED_IMAGE_MIME_TYPES[number];\n    }\n  >;\n  files: BinaryFiles;\n  device: App[\"device\"];\n  scene: App[\"scene\"];\n  pasteFromClipboard: App[\"pasteFromClipboard\"];\n};\n\nexport type PointerDownState = Readonly<{\n  // The first position at which pointerDown happened\n  origin: Readonly<{ x: number; y: number }>;\n  // Same as \"origin\" but snapped to the grid, if grid is on\n  originInGrid: Readonly<{ x: number; y: number }>;\n  // Scrollbar checks\n  scrollbars: ReturnType<typeof isOverScrollBars>;\n  // The previous pointer position\n  lastCoords: { x: number; y: number };\n  // map of original elements data\n  originalElements: Map<string, NonDeleted<ExcalidrawElement>>;\n  resize: {\n    // Handle when resizing, might change during the pointer interaction\n    handleType: MaybeTransformHandleType;\n    // This is determined on the initial pointer down event\n    isResizing: boolean;\n    // This is determined on the initial pointer down event\n    offset: { x: number; y: number };\n    // This is determined on the initial pointer down event\n    arrowDirection: \"origin\" | \"end\";\n    // This is a center point of selected elements determined on the initial pointer down event (for rotation only)\n    center: { x: number; y: number };\n  };\n  hit: {\n    // The element the pointer is \"hitting\", is determined on the initial\n    // pointer down event\n    element: NonDeleted<ExcalidrawElement> | null;\n    // The elements the pointer is \"hitting\", is determined on the initial\n    // pointer down event\n    allHitElements: NonDeleted<ExcalidrawElement>[];\n    // This is determined on the initial pointer down event\n    wasAddedToSelection: boolean;\n    // Whether selected element(s) were duplicated, might change during the\n    // pointer interaction\n    hasBeenDuplicated: boolean;\n    hasHitCommonBoundingBoxOfSelectedElements: boolean;\n  };\n  withCmdOrCtrl: boolean;\n  drag: {\n    // Might change during the pointer interaction\n    hasOccurred: boolean;\n    // Might change during the pointer interaction\n    offset: { x: number; y: number } | null;\n  };\n  // We need to have these in the state so that we can unsubscribe them\n  eventListeners: {\n    // It's defined on the initial pointer down event\n    onMove: null | ReturnType<typeof throttleRAF>;\n    // It's defined on the initial pointer down event\n    onUp: null | ((event: PointerEvent) => void);\n    // It's defined on the initial pointer down event\n    onKeyDown: null | ((event: KeyboardEvent) => void);\n    // It's defined on the initial pointer down event\n    onKeyUp: null | ((event: KeyboardEvent) => void);\n  };\n  boxSelection: {\n    hasOccurred: boolean;\n  };\n  elementIdsToErase: {\n    [key: ExcalidrawElement[\"id\"]]: {\n      opacity: ExcalidrawElement[\"opacity\"];\n      erase: boolean;\n    };\n  };\n}>;\n\nexport type ExcalidrawImperativeAPI = {\n  updateScene: InstanceType<typeof App>[\"updateScene\"];\n  updateLibrary: InstanceType<typeof Library>[\"updateLibrary\"];\n  resetScene: InstanceType<typeof App>[\"resetScene\"];\n  getSceneElementsIncludingDeleted: InstanceType<\n    typeof App\n  >[\"getSceneElementsIncludingDeleted\"];\n  history: {\n    clear: InstanceType<typeof App>[\"resetHistory\"];\n  };\n  scrollToContent: InstanceType<typeof App>[\"scrollToContent\"];\n  getSceneElements: InstanceType<typeof App>[\"getSceneElements\"];\n  getAppState: () => InstanceType<typeof App>[\"state\"];\n  getFiles: () => InstanceType<typeof App>[\"files\"];\n  refresh: InstanceType<typeof App>[\"refresh\"];\n  setToast: InstanceType<typeof App>[\"setToast\"];\n  addFiles: (data: BinaryFileData[]) => void;\n  readyPromise: ResolvablePromise<ExcalidrawImperativeAPI>;\n  ready: true;\n  id: string;\n  setActiveTool: InstanceType<typeof App>[\"setActiveTool\"];\n  setCursor: InstanceType<typeof App>[\"setCursor\"];\n  resetCursor: InstanceType<typeof App>[\"resetCursor\"];\n  toggleMenu: InstanceType<typeof App>[\"toggleMenu\"];\n};\n\nexport type Device = Readonly<{\n  isSmScreen: boolean;\n  isMobile: boolean;\n  isTouchScreen: boolean;\n  canDeviceFitSidebar: boolean;\n}>;\n","import oc from \"open-color\";\n\nimport colors from \"./colors\";\nimport {\n  CURSOR_TYPE,\n  DEFAULT_VERSION,\n  EVENT,\n  FONT_FAMILY,\n  isDarwin,\n  MIME_TYPES,\n  THEME,\n  WINDOWS_EMOJI_FALLBACK_FONT,\n} from \"./constants\";\nimport { FontFamilyValues, FontString } from \"./element/types\";\nimport { AppState, DataURL, LastActiveTool, Zoom } from \"./types\";\nimport { unstable_batchedUpdates } from \"react-dom\";\nimport { SHAPES } from \"./shapes\";\nimport { isEraserActive, isHandToolActive } from \"./appState\";\nimport { ResolutionType } from \"./utility-types\";\n\nlet mockDateTime: string | null = null;\n\nexport const setDateTimeForTests = (dateTime: string) => {\n  mockDateTime = dateTime;\n};\n\nexport const getDateTime = () => {\n  if (mockDateTime) {\n    return mockDateTime;\n  }\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\n  return `${year}-${month}-${day}-${hr}${min}`;\n};\n\nexport const capitalizeString = (str: string) =>\n  str.charAt(0).toUpperCase() + str.slice(1);\n\nexport const isToolIcon = (\n  target: Element | EventTarget | null,\n): target is HTMLElement =>\n  target instanceof HTMLElement && target.className.includes(\"ToolIcon\");\n\nexport const isInputLike = (\n  target: Element | EventTarget | null,\n): target is\n  | HTMLInputElement\n  | HTMLTextAreaElement\n  | HTMLSelectElement\n  | HTMLBRElement\n  | HTMLDivElement =>\n  (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;\n\nexport const isWritableElement = (\n  target: Element | EventTarget | null,\n): target is\n  | HTMLInputElement\n  | HTMLTextAreaElement\n  | HTMLBRElement\n  | HTMLDivElement =>\n  (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\"));\n\nexport const getFontFamilyString = ({\n  fontFamily,\n}: {\n  fontFamily: FontFamilyValues;\n}) => {\n  for (const [fontFamilyString, id] of Object.entries(FONT_FAMILY)) {\n    if (id === fontFamily) {\n      return `${fontFamilyString}, ${WINDOWS_EMOJI_FALLBACK_FONT}`;\n    }\n  }\n  return WINDOWS_EMOJI_FALLBACK_FONT;\n};\n\n/** returns fontSize+fontFamily string for assignment to DOM elements */\nexport const getFontString = ({\n  fontSize,\n  fontFamily,\n}: {\n  fontSize: number;\n  fontFamily: FontFamilyValues;\n}) => {\n  return `${fontSize}px ${getFontFamilyString({ fontFamily })}` as FontString;\n};\n\nexport const debounce = <T extends any[]>(\n  fn: (...args: T) => void,\n  timeout: number,\n) => {\n  let handle = 0;\n  let lastArgs: T | null = null;\n  const ret = (...args: T) => {\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\n// throttle callback to execute once per animation frame\nexport const throttleRAF = <T extends any[]>(\n  fn: (...args: T) => void,\n  opts?: { trailing?: boolean },\n) => {\n  let timerId: number | null = null;\n  let lastArgs: T | null = null;\n  let lastArgsTrailing: T | null = null;\n\n  const scheduleFunc = (args: T) => {\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\n  const ret = (...args: T) => {\n    if (process.env.NODE_ENV === \"test\") {\n      fn(...args);\n      return;\n    }\n    lastArgs = args;\n    if (timerId === null) {\n      scheduleFunc(lastArgs);\n    } else if (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\n// https://github.com/lodash/lodash/blob/es/chunk.js\nexport const chunk = <T extends any>(\n  array: readonly T[],\n  size: number,\n): T[][] => {\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};\n\nexport const selectNode = (node: Element) => {\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};\n\nexport const removeSelection = () => {\n  const selection = window.getSelection();\n  if (selection) {\n    selection.removeAllRanges();\n  }\n};\n\nexport const distance = (x: number, y: number) => Math.abs(x - y);\n\nexport const updateActiveTool = (\n  appState: Pick<AppState, \"activeTool\">,\n  data: (\n    | { type: typeof SHAPES[number][\"value\"] | \"eraser\" | \"hand\" }\n    | { type: \"custom\"; customType: string }\n  ) & { lastActiveToolBeforeEraser?: LastActiveTool },\n): AppState[\"activeTool\"] => {\n  if (data.type === \"custom\") {\n    return {\n      ...appState.activeTool,\n      type: \"custom\",\n      customType: data.customType,\n    };\n  }\n\n  return {\n    ...appState.activeTool,\n    lastActiveTool:\n      data.lastActiveToolBeforeEraser === undefined\n        ? appState.activeTool.lastActiveTool\n        : data.lastActiveToolBeforeEraser,\n    type: data.type,\n    customType: null,\n  };\n};\n\nexport const resetCursor = (canvas: HTMLCanvasElement | null) => {\n  if (canvas) {\n    canvas.style.cursor = \"\";\n  }\n};\n\nexport const setCursor = (canvas: HTMLCanvasElement | null, cursor: string) => {\n  if (canvas) {\n    canvas.style.cursor = cursor;\n  }\n};\n\nlet eraserCanvasCache: any;\nlet previewDataURL: string;\nexport const setEraserCursor = (\n  canvas: HTMLCanvasElement | null,\n  theme: AppState[\"theme\"],\n) => {\n  const cursorImageSizePx = 20;\n\n  const drawCanvas = () => {\n    const isDarkTheme = theme === 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(\n      eraserCanvasCache.width / 2,\n      eraserCanvasCache.height / 2,\n      5,\n      0,\n      2 * Math.PI,\n    );\n    context.fillStyle = isDarkTheme ? oc.black : oc.white;\n    context.fill();\n    context.strokeStyle = isDarkTheme ? oc.white : oc.black;\n    context.stroke();\n    previewDataURL = eraserCanvasCache.toDataURL(MIME_TYPES.svg) as DataURL;\n  };\n  if (!eraserCanvasCache || eraserCanvasCache.theme !== theme) {\n    drawCanvas();\n  }\n\n  setCursor(\n    canvas,\n    `url(${previewDataURL}) ${cursorImageSizePx / 2} ${\n      cursorImageSizePx / 2\n    }, auto`,\n  );\n};\n\nexport const setCursorForShape = (\n  canvas: HTMLCanvasElement | null,\n  appState: AppState,\n) => {\n  if (!canvas) {\n    return;\n  }\n  if (appState.activeTool.type === \"selection\") {\n    resetCursor(canvas);\n  } else if (isHandToolActive(appState)) {\n    canvas.style.cursor = CURSOR_TYPE.GRAB;\n  } else if (isEraserActive(appState)) {\n    setEraserCursor(canvas, appState.theme);\n    // do nothing if image tool is selected which suggests there's\n    // a image-preview set as the cursor\n    // Ignore custom type as well and let host decide\n  } else if (![\"image\", \"custom\"].includes(appState.activeTool.type)) {\n    canvas.style.cursor = CURSOR_TYPE.CROSSHAIR;\n  }\n};\n\nexport const isFullScreen = () =>\n  document.fullscreenElement?.nodeName === \"HTML\";\n\nexport const allowFullScreen = () =>\n  document.documentElement.requestFullscreen();\n\nexport const exitFullScreen = () => document.exitFullscreen();\n\nexport const getShortcutKey = (shortcut: string): string => {\n  shortcut = shortcut\n    .replace(/\\bAlt\\b/i, \"Alt\")\n    .replace(/\\bShift\\b/i, \"Shift\")\n    .replace(/\\b(Enter|Return)\\b/i, \"Enter\");\n  if (isDarwin) {\n    return shortcut\n      .replace(/\\bCtrlOrCmd\\b/gi, \"Cmd\")\n      .replace(/\\bAlt\\b/i, \"Option\");\n  }\n  return shortcut.replace(/\\bCtrlOrCmd\\b/gi, \"Ctrl\");\n};\n\nexport const viewportCoordsToSceneCoords = (\n  { clientX, clientY }: { clientX: number; clientY: number },\n  {\n    zoom,\n    offsetLeft,\n    offsetTop,\n    scrollX,\n    scrollY,\n  }: {\n    zoom: Zoom;\n    offsetLeft: number;\n    offsetTop: number;\n    scrollX: number;\n    scrollY: number;\n  },\n) => {\n  const x = (clientX - offsetLeft) / zoom.value - scrollX;\n  const y = (clientY - offsetTop) / zoom.value - scrollY;\n\n  return { x, y };\n};\n\nexport const sceneCoordsToViewportCoords = (\n  { sceneX, sceneY }: { sceneX: number; sceneY: number },\n  {\n    zoom,\n    offsetLeft,\n    offsetTop,\n    scrollX,\n    scrollY,\n  }: {\n    zoom: Zoom;\n    offsetLeft: number;\n    offsetTop: number;\n    scrollX: number;\n    scrollY: number;\n  },\n) => {\n  const x = (sceneX + scrollX) * zoom.value + offsetLeft;\n  const y = (sceneY + scrollY) * zoom.value + offsetTop;\n  return { x, y };\n};\n\nexport const getGlobalCSSVariable = (name: string) =>\n  getComputedStyle(document.documentElement).getPropertyValue(`--${name}`);\n\nconst RS_LTR_CHARS =\n  \"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 */\nexport const isRTL = (text: string) => RE_RTL_CHECK.test(text);\n\nexport const tupleToCoors = (\n  xyTuple: readonly [number, number],\n): { x: number; y: number } => {\n  const [x, y] = xyTuple;\n  return { x, y };\n};\n\n/** use as a rejectionHandler to mute filesystem Abort errors */\nexport const muteFSAbortError = (error?: Error) => {\n  if (error?.name === \"AbortError\") {\n    console.warn(error);\n    return;\n  }\n  throw error;\n};\n\nexport const findIndex = <T>(\n  array: readonly T[],\n  cb: (element: T, index: number, array: readonly T[]) => boolean,\n  fromIndex: number = 0,\n) => {\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};\n\nexport const findLastIndex = <T>(\n  array: readonly T[],\n  cb: (element: T, index: number, array: readonly T[]) => boolean,\n  fromIndex: number = array.length - 1,\n) => {\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};\n\nexport const isTransparent = (color: string) => {\n  const isRGBTransparent = color.length === 5 && color.substr(4, 1) === \"0\";\n  const isRRGGBBTransparent = color.length === 9 && color.substr(7, 2) === \"00\";\n  return (\n    isRGBTransparent ||\n    isRRGGBBTransparent ||\n    color === colors.elementBackground[0]\n  );\n};\n\nexport type ResolvablePromise<T> = Promise<T> & {\n  resolve: [T] extends [undefined] ? (value?: T) => void : (value: T) => void;\n  reject: (error: Error) => void;\n};\nexport const resolvablePromise = <T>() => {\n  let resolve!: any;\n  let reject!: any;\n  const promise = new Promise((_resolve, _reject) => {\n    resolve = _resolve;\n    reject = _reject;\n  });\n  (promise as any).resolve = resolve;\n  (promise as any).reject = reject;\n  return promise as ResolvablePromise<T>;\n};\n\n/**\n * @param func handler taking at most single parameter (event).\n */\nexport const withBatchedUpdates = <\n  TFunction extends ((event: any) => void) | (() => void),\n>(\n  func: Parameters<TFunction>[\"length\"] extends 0 | 1 ? TFunction : never,\n) =>\n  ((event) => {\n    unstable_batchedUpdates(func as TFunction, event);\n  }) as TFunction;\n\n/**\n * barches React state updates and throttles the calls to a single call per\n * animation frame\n */\nexport const withBatchedUpdatesThrottled = <\n  TFunction extends ((event: any) => void) | (() => void),\n>(\n  func: Parameters<TFunction>[\"length\"] extends 0 | 1 ? TFunction : never,\n) => {\n  // @ts-ignore\n  return throttleRAF<Parameters<TFunction>>(((event) => {\n    unstable_batchedUpdates(func, event);\n  }) as TFunction);\n};\n\n//https://stackoverflow.com/a/9462382/8418\nexport const nFormatter = (num: number, digits: number): string => {\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 (\n    (num / si[index].value).toFixed(digits).replace(rx, \"$1\") + si[index].symbol\n  );\n};\n\nexport const getVersion = () => {\n  return (\n    document.querySelector<HTMLMetaElement>('meta[name=\"version\"]')?.content ||\n    DEFAULT_VERSION\n  );\n};\n\n// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js\nexport const 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};\n\nexport const getNearestScrollableContainer = (\n  element: HTMLElement,\n): HTMLElement | Document => {\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 (\n      hasScrollableContent &&\n      (overflowY === \"auto\" ||\n        overflowY === \"scroll\" ||\n        overflowY === \"overlay\")\n    ) {\n      return parent;\n    }\n    parent = parent.parentElement;\n  }\n  return document;\n};\n\nexport const focusNearestParent = (element: HTMLInputElement) => {\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};\n\nexport const preventUnload = (event: BeforeUnloadEvent) => {\n  event.preventDefault();\n  // NOTE: modern browsers no longer allow showing a custom message here\n  event.returnValue = \"\";\n};\n\nexport const bytesToHexString = (bytes: Uint8Array) => {\n  return Array.from(bytes)\n    .map((byte) => `0${byte.toString(16)}`.slice(-2))\n    .join(\"\");\n};\n\nexport const getUpdatedTimestamp = () => (isTestEnv() ? 1 : Date.now());\n\n/**\n * Transforms array of objects containing `id` attribute,\n * or array of ids (strings), into a Map, keyd by `id`.\n */\nexport const arrayToMap = <T extends { id: string } | string>(\n  items: readonly T[],\n) => {\n  return items.reduce((acc: Map<string, T>, element) => {\n    acc.set(typeof element === \"string\" ? element : element.id, element);\n    return acc;\n  }, new Map());\n};\n\nexport const arrayToMapWithIndex = <T extends { id: string }>(\n  elements: readonly T[],\n) =>\n  elements.reduce((acc, element: T, idx) => {\n    acc.set(element.id, [element, idx]);\n    return acc;\n  }, new Map<string, [element: T, index: number]>());\n\nexport const isTestEnv = () =>\n  typeof process !== \"undefined\" && process.env?.NODE_ENV === \"test\";\n\nexport const isProdEnv = () =>\n  typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\";\n\nexport const wrapEvent = <T extends Event>(name: EVENT, nativeEvent: T) => {\n  return new CustomEvent(name, {\n    detail: {\n      nativeEvent,\n    },\n    cancelable: true,\n  });\n};\n\nexport const updateObject = <T extends Record<string, any>>(\n  obj: T,\n  updates: Partial<T>,\n): T => {\n  let didChange = false;\n  for (const key in updates) {\n    const value = (updates as any)[key];\n    if (typeof value !== \"undefined\") {\n      if (\n        (obj as any)[key] === value &&\n        // if object, always update because its attrs could have changed\n        (typeof value !== \"object\" || value === null)\n      ) {\n        continue;\n      }\n      didChange = true;\n    }\n  }\n\n  if (!didChange) {\n    return obj;\n  }\n\n  return {\n    ...obj,\n    ...updates,\n  };\n};\n\nexport const isPrimitive = (val: any) => {\n  const type = typeof val;\n  return val == null || (type !== \"object\" && type !== \"function\");\n};\n\nexport const getFrame = () => {\n  try {\n    return window.self === window.top ? \"top\" : \"iframe\";\n  } catch (error) {\n    return \"iframe\";\n  }\n};\n\nexport const isPromiseLike = (\n  value: any,\n): value is Promise<ResolutionType<typeof value>> => {\n  return (\n    !!value &&\n    typeof value === \"object\" &&\n    \"then\" in value &&\n    \"catch\" in value &&\n    \"finally\" in value\n  );\n};\n\nexport const queryFocusableElements = (container: HTMLElement | null) => {\n  const focusableElements = container?.querySelectorAll<HTMLElement>(\n    \"button, a, input, select, textarea, div[tabindex], label[tabindex]\",\n  );\n\n  return focusableElements\n    ? Array.from(focusableElements).filter(\n        (element) =>\n          element.tabIndex > -1 && !(element as HTMLInputElement).disabled,\n      )\n    : [];\n};\n\nexport const isShallowEqual = <T extends Record<string, any>>(\n  objA: T,\n  objB: T,\n) => {\n  const aKeys = Object.keys(objA);\n  const bKeys = Object.keys(objA);\n  if (aKeys.length !== bKeys.length) {\n    return false;\n  }\n  return aKeys.every((key) => objA[key] === objB[key]);\n};\n\n// taken from Radix UI\n// https://github.com/radix-ui/primitives/blob/main/packages/core/primitive/src/primitive.tsx\nexport const composeEventHandlers = <E>(\n  originalEventHandler?: (event: E) => void,\n  ourEventHandler?: (event: E) => void,\n  { checkForDefaultPrevented = true } = {},\n) => {\n  return function handleEvent(event: E) {\n    originalEventHandler?.(event);\n\n    if (\n      !checkForDefaultPrevented ||\n      !(event as unknown as Event).defaultPrevented\n    ) {\n      return ourEventHandler?.(event);\n    }\n  };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Event, Integration, StackFrame, WrappedFunction } from '@sentry/types';\n\nimport { isNodeEnv } from './node';\nimport { snipLine } from './string';\n\n/** Internal */\ninterface SentryGlobal {\n  Sentry?: {\n    Integrations?: Integration[];\n  };\n  SENTRY_ENVIRONMENT?: string;\n  SENTRY_DSN?: string;\n  SENTRY_RELEASE?: {\n    id?: string;\n  };\n  __SENTRY__: {\n    globalEventProcessors: any;\n    hub: any;\n    logger: any;\n  };\n}\n\nconst fallbackGlobalObject = {};\n\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject<T>(): T & SentryGlobal {\n  return (isNodeEnv()\n    ? global\n    : typeof window !== 'undefined'\n    ? window\n    : typeof self !== 'undefined'\n    ? self\n    : fallbackGlobalObject) as T & SentryGlobal;\n}\n\n/**\n * Extended Window interface that allows for Crypto API usage in IE browsers\n */\ninterface MsCryptoWindow extends Window {\n  msCrypto?: Crypto;\n}\n\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4(): string {\n  const global = getGlobalObject() as MsCryptoWindow;\n  const crypto = global.crypto || global.msCrypto;\n\n  if (!(crypto === void 0) && crypto.getRandomValues) {\n    // Use window.crypto API if available\n    const arr = new Uint16Array(8);\n    crypto.getRandomValues(arr);\n\n    // set 4 in byte 7\n    // eslint-disable-next-line no-bitwise\n    arr[3] = (arr[3] & 0xfff) | 0x4000;\n    // set 2 most significant bits of byte 9 to '10'\n    // eslint-disable-next-line no-bitwise\n    arr[4] = (arr[4] & 0x3fff) | 0x8000;\n\n    const pad = (num: number): string => {\n      let v = num.toString(16);\n      while (v.length < 4) {\n        v = `0${v}`;\n      }\n      return v;\n    };\n\n    return (\n      pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7])\n    );\n  }\n  // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n  return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, c => {\n    // eslint-disable-next-line no-bitwise\n    const r = (Math.random() * 16) | 0;\n    // eslint-disable-next-line no-bitwise\n    const v = c === 'x' ? r : (r & 0x3) | 0x8;\n    return v.toString(16);\n  });\n}\n\n/**\n * Parses string form of URL into an object\n * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n * // intentionally using regex and not <a/> href parsing trick because React Native and other\n * // environments where DOM might not be available\n * @returns parsed URL object\n */\nexport function parseUrl(\n  url: string,\n): {\n  host?: string;\n  path?: string;\n  protocol?: string;\n  relative?: string;\n} {\n  if (!url) {\n    return {};\n  }\n\n  const match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n  if (!match) {\n    return {};\n  }\n\n  // coerce to undefined values to empty string so we don't get 'undefined'\n  const query = match[6] || '';\n  const fragment = match[8] || '';\n  return {\n    host: match[4],\n    path: match[5],\n    protocol: match[2],\n    relative: match[5] + query + fragment, // everything minus origin\n  };\n}\n\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event: Event): string {\n  if (event.message) {\n    return event.message;\n  }\n  if (event.exception && event.exception.values && event.exception.values[0]) {\n    const exception = event.exception.values[0];\n\n    if (exception.type && exception.value) {\n      return `${exception.type}: ${exception.value}`;\n    }\n    return exception.type || exception.value || event.event_id || '<unknown>';\n  }\n  return event.event_id || '<unknown>';\n}\n\n/** JSDoc */\ninterface ExtensibleConsole extends Console {\n  [key: string]: any;\n}\n\n/** JSDoc */\nexport function consoleSandbox(callback: () => any): any {\n  const global = getGlobalObject<Window>();\n  const levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n\n  if (!('console' in global)) {\n    return callback();\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  const originalConsole = (global as any).console as ExtensibleConsole;\n  const wrappedLevels: { [key: string]: any } = {};\n\n  // Restore all wrapped console methods\n  levels.forEach(level => {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    if (level in (global as any).console && (originalConsole[level] as WrappedFunction).__sentry_original__) {\n      wrappedLevels[level] = originalConsole[level] as WrappedFunction;\n      originalConsole[level] = (originalConsole[level] as WrappedFunction).__sentry_original__;\n    }\n  });\n\n  // Perform callback manipulations\n  const result = callback();\n\n  // Revert restoration to wrapped state\n  Object.keys(wrappedLevels).forEach(level => {\n    originalConsole[level] = wrappedLevels[level];\n  });\n\n  return result;\n}\n\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event: Event, value?: string, type?: string): void {\n  event.exception = event.exception || {};\n  event.exception.values = event.exception.values || [];\n  event.exception.values[0] = event.exception.values[0] || {};\n  event.exception.values[0].value = event.exception.values[0].value || value || '';\n  event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n}\n\n/**\n * Adds exception mechanism to a given event.\n * @param event The event to modify.\n * @param mechanism Mechanism of the mechanism.\n * @hidden\n */\nexport function addExceptionMechanism(\n  event: Event,\n  mechanism: {\n    [key: string]: any;\n  } = {},\n): void {\n  // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n  try {\n    // @ts-ignore Type 'Mechanism | {}' is not assignable to type 'Mechanism | undefined'\n    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n    event.exception!.values![0].mechanism = event.exception!.values![0].mechanism || {};\n    Object.keys(mechanism).forEach(key => {\n      // @ts-ignore Mechanism has no index signature\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      event.exception!.values![0].mechanism[key] = mechanism[key];\n    });\n  } catch (_oO) {\n    // no-empty\n  }\n}\n\n/**\n * A safe form of location.href\n */\nexport function getLocationHref(): string {\n  try {\n    return document.location.href;\n  } catch (oO) {\n    return '';\n  }\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\n/**\n * Represents Semantic Versioning object\n */\ninterface SemVer {\n  major?: number;\n  minor?: number;\n  patch?: number;\n  prerelease?: string;\n  buildmetadata?: string;\n}\n\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input: string): SemVer {\n  const match = input.match(SEMVER_REGEXP) || [];\n  const major = parseInt(match[1], 10);\n  const minor = parseInt(match[2], 10);\n  const patch = parseInt(match[3], 10);\n  return {\n    buildmetadata: match[5],\n    major: isNaN(major) ? undefined : major,\n    minor: isNaN(minor) ? undefined : minor,\n    patch: isNaN(patch) ? undefined : patch,\n    prerelease: match[4],\n  };\n}\n\nconst defaultRetryAfter = 60 * 1000; // 60 seconds\n\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param now current unix timestamp\n * @param header string representation of 'Retry-After' header\n */\nexport function parseRetryAfterHeader(now: number, header?: string | number | null): number {\n  if (!header) {\n    return defaultRetryAfter;\n  }\n\n  const headerDelay = parseInt(`${header}`, 10);\n  if (!isNaN(headerDelay)) {\n    return headerDelay * 1000;\n  }\n\n  const headerDate = Date.parse(`${header}`);\n  if (!isNaN(headerDate)) {\n    return headerDate - now;\n  }\n\n  return defaultRetryAfter;\n}\n\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines: string[], frame: StackFrame, linesOfContext: number = 5): void {\n  const lineno = frame.lineno || 0;\n  const maxLines = lines.length;\n  const sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n\n  frame.pre_context = lines\n    .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n    .map((line: string) => snipLine(line, 0));\n\n  frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n\n  frame.post_context = lines\n    .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n    .map((line: string) => snipLine(line, 0));\n}\n\n/**\n * Strip the query string and fragment off of a given URL or path (if present)\n *\n * @param urlPath Full URL or path, including possible query string and/or fragment\n * @returns URL or path without query string or fragment\n */\nexport function stripUrlQueryAndFragment(urlPath: string): string {\n  // eslint-disable-next-line no-useless-escape\n  return urlPath.split(/[\\?#]/, 1)[0];\n}\n","/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv(): boolean {\n  return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n}\n\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\nexport function dynamicRequire(mod: any, request: string): any {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return mod.require(request);\n}\n","import { getGlobalObject } from './misc';\nimport { dynamicRequire, isNodeEnv } from './node';\n\n/**\n * An object that can return the current timestamp in seconds since the UNIX epoch.\n */\ninterface TimestampSource {\n  nowSeconds(): number;\n}\n\n/**\n * A TimestampSource implementation for environments that do not support the Performance Web API natively.\n *\n * Note that this TimestampSource does not use a monotonic clock. A call to `nowSeconds` may return a timestamp earlier\n * than a previously returned value. We do not try to emulate a monotonic behavior in order to facilitate debugging. It\n * is more obvious to explain \"why does my span have negative duration\" than \"why my spans have zero duration\".\n */\nconst dateTimestampSource: TimestampSource = {\n  nowSeconds: () => Date.now() / 1000,\n};\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high resolution monotonic clock.\n */\ninterface Performance {\n  /**\n   * The millisecond timestamp at which measurement began, measured in Unix time.\n   */\n  timeOrigin: number;\n  /**\n   * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n   */\n  now(): number;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction getBrowserPerformance(): Performance | undefined {\n  const { performance } = getGlobalObject<Window>();\n  if (!performance || !performance.now) {\n    return undefined;\n  }\n\n  // Replace performance.timeOrigin with our own timeOrigin based on Date.now().\n  //\n  // This is a partial workaround for browsers reporting performance.timeOrigin such that performance.timeOrigin +\n  // performance.now() gives a date arbitrarily in the past.\n  //\n  // Additionally, computing timeOrigin in this way fills the gap for browsers where performance.timeOrigin is\n  // undefined.\n  //\n  // The assumption that performance.timeOrigin + performance.now() ~= Date.now() is flawed, but we depend on it to\n  // interact with data coming out of performance entries.\n  //\n  // Note that despite recommendations against it in the spec, browsers implement the Performance API with a clock that\n  // might stop when the computer is asleep (and perhaps under other circumstances). Such behavior causes\n  // performance.timeOrigin + performance.now() to have an arbitrary skew over Date.now(). In laptop computers, we have\n  // observed skews that can be as long as days, weeks or months.\n  //\n  // See https://github.com/getsentry/sentry-javascript/issues/2590.\n  //\n  // BUG: despite our best intentions, this workaround has its limitations. It mostly addresses timings of pageload\n  // transactions, but ignores the skew built up over time that can aversely affect timestamps of navigation\n  // transactions of long-lived web pages.\n  const timeOrigin = Date.now() - performance.now();\n\n  return {\n    now: () => performance.now(),\n    timeOrigin,\n  };\n}\n\n/**\n * Returns the native Performance API implementation from Node.js. Returns undefined in old Node.js versions that don't\n * implement the API.\n */\nfunction getNodePerformance(): Performance | undefined {\n  try {\n    const perfHooks = dynamicRequire(module, 'perf_hooks') as { performance: Performance };\n    return perfHooks.performance;\n  } catch (_) {\n    return undefined;\n  }\n}\n\n/**\n * The Performance API implementation for the current platform, if available.\n */\nconst platformPerformance: Performance | undefined = isNodeEnv() ? getNodePerformance() : getBrowserPerformance();\n\nconst timestampSource: TimestampSource =\n  platformPerformance === undefined\n    ? dateTimestampSource\n    : {\n        nowSeconds: () => (platformPerformance.timeOrigin + platformPerformance.now()) / 1000,\n      };\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport const dateTimestampInSeconds = dateTimestampSource.nowSeconds.bind(dateTimestampSource);\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * See `usingPerformanceAPI` to test whether the Performance API is used.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport const timestampInSeconds = timestampSource.nowSeconds.bind(timestampSource);\n\n// Re-exported with an old name for backwards-compatibility.\nexport const timestampWithMs = timestampInSeconds;\n\n/**\n * A boolean that is true when timestampInSeconds uses the Performance API to produce monotonic timestamps.\n */\nexport const usingPerformanceAPI = platformPerformance !== undefined;\n\n/**\n * Internal helper to store what is the source of browserPerformanceTimeOrigin below. For debugging only.\n */\nexport let _browserPerformanceTimeOriginMode: string;\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport const browserPerformanceTimeOrigin = ((): number | undefined => {\n  // Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n  // performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n  // data as reliable if they are within a reasonable threshold of the current time.\n\n  const { performance } = getGlobalObject<Window>();\n  if (!performance) {\n    _browserPerformanceTimeOriginMode = 'none';\n    return undefined;\n  }\n\n  const threshold = 3600 * 1000;\n\n  const timeOriginIsReliable =\n    performance.timeOrigin && Math.abs(performance.timeOrigin + performance.now() - Date.now()) < threshold;\n  if (timeOriginIsReliable) {\n    _browserPerformanceTimeOriginMode = 'timeOrigin';\n    return performance.timeOrigin;\n  }\n\n  // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n  // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n  // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n  // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n  // Date API.\n  // eslint-disable-next-line deprecation/deprecation\n  const navigationStart = performance.timing && performance.timing.navigationStart;\n  const hasNavigationStart = typeof navigationStart === 'number';\n  const navigationStartIsReliable =\n    hasNavigationStart && Math.abs(navigationStart + performance.now() - Date.now()) < threshold;\n  if (navigationStartIsReliable) {\n    _browserPerformanceTimeOriginMode = 'navigationStart';\n    return navigationStart;\n  }\n\n  // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to Date.\n  _browserPerformanceTimeOriginMode = 'dateNow';\n  return Date.now();\n})();\n","function toVal(mix) {\n\tvar k, y, str='';\n\n\tif (typeof mix === 'string' || typeof mix === 'number') {\n\t\tstr += mix;\n\t} else if (typeof mix === 'object') {\n\t\tif (Array.isArray(mix)) {\n\t\t\tfor (k=0; k < mix.length; k++) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tif (y = toVal(mix[k])) {\n\t\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\t\tstr += y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor (k in mix) {\n\t\t\t\tif (mix[k]) {\n\t\t\t\t\tstr && (str += ' ');\n\t\t\t\t\tstr += k;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn str;\n}\n\nexport default function () {\n\tvar i=0, tmp, x, str='';\n\twhile (i < arguments.length) {\n\t\tif (tmp = arguments[i++]) {\n\t\t\tif (x = toVal(tmp)) {\n\t\t\t\tstr && (str += ' ');\n\t\t\t\tstr += x\n\t\t\t}\n\t\t}\n\t}\n\treturn str;\n}\n","/* crc32.js (C) 2014-2015 SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\nvar CRC32;\n(function (factory) {\n\tif(typeof DO_NOT_EXPORT_CRC === 'undefined') {\n\t\tif('object' === typeof exports) {\n\t\t\tfactory(exports);\n\t\t} else if ('function' === typeof define && define.amd) {\n\t\t\tdefine(function () {\n\t\t\t\tvar module = {};\n\t\t\t\tfactory(module);\n\t\t\t\treturn module;\n\t\t\t});\n\t\t} else {\n\t\t  factory(CRC32 = {});\n\t\t}\n\t} else {\n\t\tfactory(CRC32 = {});\n\t}\n}(function(CRC32) {\nCRC32.version = '0.3.0';\n/* see perf/crc32table.js */\nfunction signed_crc_table() {\n\tvar c = 0, table = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar table = signed_crc_table();\n/* charCodeAt is the best approach for binary strings */\nvar use_buffer = typeof Buffer !== 'undefined';\nfunction crc32_bstr(bstr) {\n\tif(bstr.length > 32768) if(use_buffer) return crc32_buf_8(new Buffer(bstr));\n\tvar crc = -1, L = bstr.length - 1;\n\tfor(var i = 0; i < L;) {\n\t\tcrc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t\tcrc =  table[(crc ^ bstr.charCodeAt(i++)) & 0xFF] ^ (crc >>> 8);\n\t}\n\tif(i === L) crc = (crc >>> 8) ^ table[(crc ^ bstr.charCodeAt(i)) & 0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf(buf) {\n\tif(buf.length > 10000) return crc32_buf_8(buf);\n\tfor(var crc = -1, i = 0, L=buf.length-3; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+3) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\nfunction crc32_buf_8(buf) {\n\tfor(var crc = -1, i = 0, L=buf.length-7; i < L;) {\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t\tcrc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\t}\n\twhile(i < L+7) crc = (crc >>> 8) ^ table[(crc^buf[i++])&0xFF];\n\treturn crc ^ -1;\n}\n\n/* much much faster to intertwine utf8 and crc */\nfunction crc32_str(str) {\n\tfor(var crc = -1, i = 0, L=str.length, c, d; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ c) & 0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (192|((c>>6)&31))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++) & 1023;\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (240|((c>>8)&7))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>2)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((d>>6)&15)|(c&3))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(d&63))) & 0xFF];\n\t\t} else {\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (224|((c>>12)&15))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|((c>>6)&63))) & 0xFF];\n\t\t\tcrc = (crc >>> 8) ^ table[(crc ^ (128|(c&63))) & 0xFF];\n\t\t}\n\t}\n\treturn crc ^ -1;\n}\nCRC32.table = table;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\n}));\n","import { createContext, useState, useEffect, useDebugValue, useRef, createElement, useContext, useCallback, useReducer } from 'react';\n\nconst SUSPENSE_PROMISE = Symbol();\nconst isSuspensePromise = (promise) => !!promise[SUSPENSE_PROMISE];\nconst isSuspensePromiseAlreadyCancelled = (suspensePromise) => !suspensePromise[SUSPENSE_PROMISE].c;\nconst cancelSuspensePromise = (suspensePromise) => {\n  var _a, _b;\n  (_b = (_a = suspensePromise[SUSPENSE_PROMISE]).c) == null ? void 0 : _b.call(_a);\n};\nconst isEqualSuspensePromise = (oldSuspensePromise, newSuspensePromise) => {\n  const oldOriginalPromise = oldSuspensePromise[SUSPENSE_PROMISE].o;\n  const newOriginalPromise = newSuspensePromise[SUSPENSE_PROMISE].o;\n  return oldOriginalPromise === newOriginalPromise || oldSuspensePromise === newOriginalPromise || isSuspensePromise(oldOriginalPromise) && isEqualSuspensePromise(oldOriginalPromise, newSuspensePromise);\n};\nconst createSuspensePromise = (promise) => {\n  const objectToAttach = {\n    o: promise,\n    c: null\n  };\n  const suspensePromise = new Promise((resolve) => {\n    objectToAttach.c = () => {\n      objectToAttach.c = null;\n      resolve();\n    };\n    promise.then(objectToAttach.c, objectToAttach.c);\n  });\n  suspensePromise[SUSPENSE_PROMISE] = objectToAttach;\n  return suspensePromise;\n};\n\nvar __defProp$1 = Object.defineProperty;\nvar __defProps$1 = Object.defineProperties;\nvar __getOwnPropDescs$1 = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols$1 = Object.getOwnPropertySymbols;\nvar __hasOwnProp$1 = Object.prototype.hasOwnProperty;\nvar __propIsEnum$1 = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp$1 = (obj, key, value) => key in obj ? __defProp$1(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues$1 = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp$1.call(b, prop))\n      __defNormalProp$1(a, prop, b[prop]);\n  if (__getOwnPropSymbols$1)\n    for (var prop of __getOwnPropSymbols$1(b)) {\n      if (__propIsEnum$1.call(b, prop))\n        __defNormalProp$1(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __spreadProps$1 = (a, b) => __defProps$1(a, __getOwnPropDescs$1(b));\nconst hasInitialValue = (atom) => \"init\" in atom;\nconst READ_ATOM = \"r\";\nconst WRITE_ATOM = \"w\";\nconst COMMIT_ATOM = \"c\";\nconst SUBSCRIBE_ATOM = \"s\";\nconst RESTORE_ATOMS = \"h\";\nconst DEV_SUBSCRIBE_STATE = \"n\";\nconst DEV_GET_MOUNTED_ATOMS = \"l\";\nconst DEV_GET_ATOM_STATE = \"a\";\nconst DEV_GET_MOUNTED = \"m\";\nconst createStore = (initialValues) => {\n  const committedAtomStateMap = /* @__PURE__ */ new WeakMap();\n  const mountedMap = /* @__PURE__ */ new WeakMap();\n  const pendingMap = /* @__PURE__ */ new Map();\n  let stateListeners;\n  let mountedAtoms;\n  if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n    stateListeners = /* @__PURE__ */ new Set();\n    mountedAtoms = /* @__PURE__ */ new Set();\n  }\n  if (initialValues) {\n    for (const [atom, value] of initialValues) {\n      const atomState = { v: value, r: 0, d: /* @__PURE__ */ new Map() };\n      if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n        Object.freeze(atomState);\n        if (!hasInitialValue(atom)) {\n          console.warn(\"Found initial value for derived atom which can cause unexpected behavior\", atom);\n        }\n      }\n      committedAtomStateMap.set(atom, atomState);\n    }\n  }\n  const suspensePromiseCacheMap = /* @__PURE__ */ new WeakMap();\n  const addSuspensePromiseToCache = (version, atom, suspensePromise) => {\n    let cache = suspensePromiseCacheMap.get(atom);\n    if (!cache) {\n      cache = /* @__PURE__ */ new Map();\n      suspensePromiseCacheMap.set(atom, cache);\n    }\n    suspensePromise.then(() => {\n      if (cache.get(version) === suspensePromise) {\n        cache.delete(version);\n        if (!cache.size) {\n          suspensePromiseCacheMap.delete(atom);\n        }\n      }\n    });\n    cache.set(version, suspensePromise);\n  };\n  const cancelAllSuspensePromiseInCache = (atom) => {\n    const versionSet = /* @__PURE__ */ new Set();\n    const cache = suspensePromiseCacheMap.get(atom);\n    if (cache) {\n      suspensePromiseCacheMap.delete(atom);\n      cache.forEach((suspensePromise, version) => {\n        cancelSuspensePromise(suspensePromise);\n        versionSet.add(version);\n      });\n    }\n    return versionSet;\n  };\n  const versionedAtomStateMapMap = /* @__PURE__ */ new WeakMap();\n  const getVersionedAtomStateMap = (version) => {\n    let versionedAtomStateMap = versionedAtomStateMapMap.get(version);\n    if (!versionedAtomStateMap) {\n      versionedAtomStateMap = /* @__PURE__ */ new Map();\n      versionedAtomStateMapMap.set(version, versionedAtomStateMap);\n    }\n    return versionedAtomStateMap;\n  };\n  const getAtomState = (version, atom) => {\n    if (version) {\n      const versionedAtomStateMap = getVersionedAtomStateMap(version);\n      let atomState = versionedAtomStateMap.get(atom);\n      if (!atomState) {\n        atomState = getAtomState(version.p, atom);\n        if (atomState) {\n          if (\"p\" in atomState) {\n            atomState.p.then(() => versionedAtomStateMap.delete(atom));\n          }\n          versionedAtomStateMap.set(atom, atomState);\n        }\n      }\n      return atomState;\n    }\n    return committedAtomStateMap.get(atom);\n  };\n  const setAtomState = (version, atom, atomState) => {\n    if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      Object.freeze(atomState);\n    }\n    if (version) {\n      const versionedAtomStateMap = getVersionedAtomStateMap(version);\n      versionedAtomStateMap.set(atom, atomState);\n    } else {\n      const prevAtomState = committedAtomStateMap.get(atom);\n      committedAtomStateMap.set(atom, atomState);\n      if (!pendingMap.has(atom)) {\n        pendingMap.set(atom, prevAtomState);\n      }\n    }\n  };\n  const createReadDependencies = (version, prevReadDependencies = /* @__PURE__ */ new Map(), dependencies) => {\n    if (!dependencies) {\n      return prevReadDependencies;\n    }\n    const readDependencies = /* @__PURE__ */ new Map();\n    let changed = false;\n    dependencies.forEach((atom) => {\n      var _a;\n      const revision = ((_a = getAtomState(version, atom)) == null ? void 0 : _a.r) || 0;\n      readDependencies.set(atom, revision);\n      if (prevReadDependencies.get(atom) !== revision) {\n        changed = true;\n      }\n    });\n    if (prevReadDependencies.size === readDependencies.size && !changed) {\n      return prevReadDependencies;\n    }\n    return readDependencies;\n  };\n  const setAtomValue = (version, atom, value, dependencies, suspensePromise) => {\n    const atomState = getAtomState(version, atom);\n    if (atomState) {\n      if (suspensePromise && (!(\"p\" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {\n        return atomState;\n      }\n      if (\"p\" in atomState) {\n        cancelSuspensePromise(atomState.p);\n      }\n    }\n    const nextAtomState = {\n      v: value,\n      r: (atomState == null ? void 0 : atomState.r) || 0,\n      d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n    };\n    if (!atomState || !(\"v\" in atomState) || !Object.is(atomState.v, value)) {\n      ++nextAtomState.r;\n      if (nextAtomState.d.has(atom)) {\n        nextAtomState.d = new Map(nextAtomState.d).set(atom, nextAtomState.r);\n      }\n    } else if (nextAtomState.d !== atomState.d && (nextAtomState.d.size !== atomState.d.size || !Array.from(nextAtomState.d.keys()).every((a) => atomState.d.has(a)))) {\n      Promise.resolve().then(() => {\n        flushPending(version);\n      });\n    }\n    setAtomState(version, atom, nextAtomState);\n    return nextAtomState;\n  };\n  const setAtomReadError = (version, atom, error, dependencies, suspensePromise) => {\n    const atomState = getAtomState(version, atom);\n    if (atomState) {\n      if (suspensePromise && (!(\"p\" in atomState) || !isEqualSuspensePromise(atomState.p, suspensePromise))) {\n        return atomState;\n      }\n      if (\"p\" in atomState) {\n        cancelSuspensePromise(atomState.p);\n      }\n    }\n    const nextAtomState = {\n      e: error,\n      r: (atomState == null ? void 0 : atomState.r) || 0,\n      d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n    };\n    setAtomState(version, atom, nextAtomState);\n    return nextAtomState;\n  };\n  const setAtomSuspensePromise = (version, atom, suspensePromise, dependencies) => {\n    const atomState = getAtomState(version, atom);\n    if (atomState && \"p\" in atomState) {\n      if (isEqualSuspensePromise(atomState.p, suspensePromise)) {\n        return atomState;\n      }\n      cancelSuspensePromise(atomState.p);\n    }\n    addSuspensePromiseToCache(version, atom, suspensePromise);\n    const nextAtomState = {\n      p: suspensePromise,\n      r: (atomState == null ? void 0 : atomState.r) || 0,\n      d: createReadDependencies(version, atomState == null ? void 0 : atomState.d, dependencies)\n    };\n    setAtomState(version, atom, nextAtomState);\n    return nextAtomState;\n  };\n  const setAtomPromiseOrValue = (version, atom, promiseOrValue, dependencies) => {\n    if (promiseOrValue instanceof Promise) {\n      const suspensePromise = createSuspensePromise(promiseOrValue.then((value) => {\n        setAtomValue(version, atom, value, dependencies, suspensePromise);\n        flushPending(version);\n      }).catch((e) => {\n        if (e instanceof Promise) {\n          if (isSuspensePromise(e)) {\n            return e.then(() => {\n              readAtomState(version, atom, true);\n            });\n          }\n          return e;\n        }\n        setAtomReadError(version, atom, e, dependencies, suspensePromise);\n        flushPending(version);\n      }));\n      return setAtomSuspensePromise(version, atom, suspensePromise, dependencies);\n    }\n    return setAtomValue(version, atom, promiseOrValue, dependencies);\n  };\n  const setAtomInvalidated = (version, atom) => {\n    const atomState = getAtomState(version, atom);\n    if (atomState) {\n      if (\"p\" in atomState) {\n        cancelSuspensePromise(atomState.p);\n      }\n      const nextAtomState = __spreadProps$1(__spreadValues$1({}, atomState), {\n        i: atomState.r\n      });\n      setAtomState(version, atom, nextAtomState);\n    } else if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      console.warn(\"[Bug] could not invalidate non existing atom\", atom);\n    }\n  };\n  const readAtomState = (version, atom, force) => {\n    if (!force) {\n      const atomState = getAtomState(version, atom);\n      if (atomState) {\n        if (atomState.r !== atomState.i && \"p\" in atomState && !isSuspensePromiseAlreadyCancelled(atomState.p)) {\n          return atomState;\n        }\n        atomState.d.forEach((_, a) => {\n          if (a !== atom) {\n            if (!mountedMap.has(a)) {\n              readAtomState(version, a);\n            } else {\n              const aState = getAtomState(version, a);\n              if (aState && aState.r === aState.i) {\n                readAtomState(version, a);\n              }\n            }\n          }\n        });\n        if (Array.from(atomState.d).every(([a, r]) => {\n          const aState = getAtomState(version, a);\n          return aState && \"v\" in aState && aState.r === r;\n        })) {\n          return atomState;\n        }\n      }\n    }\n    const dependencies = /* @__PURE__ */ new Set();\n    try {\n      const promiseOrValue = atom.read((a) => {\n        dependencies.add(a);\n        const aState = a === atom ? getAtomState(version, a) : readAtomState(version, a);\n        if (aState) {\n          if (\"e\" in aState) {\n            throw aState.e;\n          }\n          if (\"p\" in aState) {\n            throw aState.p;\n          }\n          return aState.v;\n        }\n        if (hasInitialValue(a)) {\n          return a.init;\n        }\n        throw new Error(\"no atom init\");\n      });\n      return setAtomPromiseOrValue(version, atom, promiseOrValue, dependencies);\n    } catch (errorOrPromise) {\n      if (errorOrPromise instanceof Promise) {\n        const suspensePromise = createSuspensePromise(errorOrPromise);\n        return setAtomSuspensePromise(version, atom, suspensePromise, dependencies);\n      }\n      return setAtomReadError(version, atom, errorOrPromise, dependencies);\n    }\n  };\n  const readAtom = (readingAtom, version) => {\n    const atomState = readAtomState(version, readingAtom);\n    return atomState;\n  };\n  const addAtom = (addingAtom) => {\n    let mounted = mountedMap.get(addingAtom);\n    if (!mounted) {\n      mounted = mountAtom(addingAtom);\n    }\n    return mounted;\n  };\n  const canUnmountAtom = (atom, mounted) => !mounted.l.size && (!mounted.t.size || mounted.t.size === 1 && mounted.t.has(atom));\n  const delAtom = (deletingAtom) => {\n    const mounted = mountedMap.get(deletingAtom);\n    if (mounted && canUnmountAtom(deletingAtom, mounted)) {\n      unmountAtom(deletingAtom);\n    }\n  };\n  const invalidateDependents = (version, atom) => {\n    const mounted = mountedMap.get(atom);\n    mounted == null ? void 0 : mounted.t.forEach((dependent) => {\n      if (dependent !== atom) {\n        setAtomInvalidated(version, dependent);\n        invalidateDependents(version, dependent);\n      }\n    });\n  };\n  const writeAtomState = (version, atom, update) => {\n    let isSync = true;\n    const writeGetter = (a, options) => {\n      const aState = readAtomState(version, a);\n      if (\"e\" in aState) {\n        throw aState.e;\n      }\n      if (\"p\" in aState) {\n        if (options == null ? void 0 : options.unstable_promise) {\n          return aState.p.then(() => writeGetter(a, options));\n        }\n        if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n          console.info(\"Reading pending atom state in write operation. We throw a promise for now.\", a);\n        }\n        throw aState.p;\n      }\n      if (\"v\" in aState) {\n        return aState.v;\n      }\n      if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n        console.warn(\"[Bug] no value found while reading atom in write operation. This is probably a bug.\", a);\n      }\n      throw new Error(\"no value found\");\n    };\n    const setter = (a, v) => {\n      let promiseOrVoid2;\n      if (a === atom) {\n        if (!hasInitialValue(a)) {\n          throw new Error(\"atom not writable\");\n        }\n        const versionSet = cancelAllSuspensePromiseInCache(a);\n        versionSet.forEach((cancelledVersion) => {\n          if (cancelledVersion !== version) {\n            setAtomPromiseOrValue(cancelledVersion, a, v);\n          }\n        });\n        setAtomPromiseOrValue(version, a, v);\n        invalidateDependents(version, a);\n      } else {\n        promiseOrVoid2 = writeAtomState(version, a, v);\n      }\n      if (!isSync) {\n        flushPending(version);\n      }\n      return promiseOrVoid2;\n    };\n    const promiseOrVoid = atom.write(writeGetter, setter, update);\n    isSync = false;\n    version = void 0;\n    return promiseOrVoid;\n  };\n  const writeAtom = (writingAtom, update, version) => {\n    const promiseOrVoid = writeAtomState(version, writingAtom, update);\n    flushPending(version);\n    return promiseOrVoid;\n  };\n  const isActuallyWritableAtom = (atom) => !!atom.write;\n  const mountAtom = (atom, initialDependent) => {\n    const mounted = {\n      t: new Set(initialDependent && [initialDependent]),\n      l: /* @__PURE__ */ new Set()\n    };\n    mountedMap.set(atom, mounted);\n    if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      mountedAtoms.add(atom);\n    }\n    const atomState = readAtomState(void 0, atom);\n    atomState.d.forEach((_, a) => {\n      const aMounted = mountedMap.get(a);\n      if (aMounted) {\n        aMounted.t.add(atom);\n      } else {\n        if (a !== atom) {\n          mountAtom(a, atom);\n        }\n      }\n    });\n    if (isActuallyWritableAtom(atom) && atom.onMount) {\n      const setAtom = (update) => writeAtom(atom, update);\n      const onUnmount = atom.onMount(setAtom);\n      if (onUnmount) {\n        mounted.u = onUnmount;\n      }\n    }\n    return mounted;\n  };\n  const unmountAtom = (atom) => {\n    var _a;\n    const onUnmount = (_a = mountedMap.get(atom)) == null ? void 0 : _a.u;\n    if (onUnmount) {\n      onUnmount();\n    }\n    mountedMap.delete(atom);\n    if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      mountedAtoms.delete(atom);\n    }\n    const atomState = getAtomState(void 0, atom);\n    if (atomState) {\n      atomState.d.forEach((_, a) => {\n        if (a !== atom) {\n          const mounted = mountedMap.get(a);\n          if (mounted) {\n            mounted.t.delete(atom);\n            if (canUnmountAtom(a, mounted)) {\n              unmountAtom(a);\n            }\n          }\n        }\n      });\n    } else if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      console.warn(\"[Bug] could not find atom state to unmount\", atom);\n    }\n  };\n  const mountDependencies = (atom, atomState, prevReadDependencies) => {\n    const dependencies = new Set(atomState.d.keys());\n    prevReadDependencies == null ? void 0 : prevReadDependencies.forEach((_, a) => {\n      if (dependencies.has(a)) {\n        dependencies.delete(a);\n        return;\n      }\n      const mounted = mountedMap.get(a);\n      if (mounted) {\n        mounted.t.delete(atom);\n        if (canUnmountAtom(a, mounted)) {\n          unmountAtom(a);\n        }\n      }\n    });\n    dependencies.forEach((a) => {\n      const mounted = mountedMap.get(a);\n      if (mounted) {\n        mounted.t.add(atom);\n      } else if (mountedMap.has(atom)) {\n        mountAtom(a, atom);\n      }\n    });\n  };\n  const flushPending = (version) => {\n    if (version) {\n      const versionedAtomStateMap = getVersionedAtomStateMap(version);\n      versionedAtomStateMap.forEach((atomState, atom) => {\n        if (atomState !== committedAtomStateMap.get(atom)) {\n          const mounted = mountedMap.get(atom);\n          mounted == null ? void 0 : mounted.l.forEach((listener) => listener(version));\n        }\n      });\n      return;\n    }\n    while (pendingMap.size) {\n      const pending = Array.from(pendingMap);\n      pendingMap.clear();\n      pending.forEach(([atom, prevAtomState]) => {\n        const atomState = getAtomState(void 0, atom);\n        if (atomState && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n          mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n        }\n        const mounted = mountedMap.get(atom);\n        mounted == null ? void 0 : mounted.l.forEach((listener) => listener());\n      });\n    }\n    if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n      stateListeners.forEach((l) => l());\n    }\n  };\n  const commitVersionedAtomStateMap = (version) => {\n    const versionedAtomStateMap = getVersionedAtomStateMap(version);\n    versionedAtomStateMap.forEach((atomState, atom) => {\n      const prevAtomState = committedAtomStateMap.get(atom);\n      if (atomState.r > ((prevAtomState == null ? void 0 : prevAtomState.r) || 0) || \"v\" in atomState && atomState.r === (prevAtomState == null ? void 0 : prevAtomState.r) && atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n        committedAtomStateMap.set(atom, atomState);\n        if (atomState.d !== (prevAtomState == null ? void 0 : prevAtomState.d)) {\n          mountDependencies(atom, atomState, prevAtomState == null ? void 0 : prevAtomState.d);\n        }\n      }\n    });\n  };\n  const commitAtom = (_atom, version) => {\n    if (version) {\n      commitVersionedAtomStateMap(version);\n    }\n    flushPending(void 0);\n  };\n  const subscribeAtom = (atom, callback) => {\n    const mounted = addAtom(atom);\n    const listeners = mounted.l;\n    listeners.add(callback);\n    return () => {\n      listeners.delete(callback);\n      delAtom(atom);\n    };\n  };\n  const restoreAtoms = (values, version) => {\n    for (const [atom, value] of values) {\n      if (hasInitialValue(atom)) {\n        setAtomPromiseOrValue(version, atom, value);\n        invalidateDependents(version, atom);\n      }\n    }\n    flushPending(version);\n  };\n  if ((import.meta.env && import.meta.env.MODE) !== \"production\") {\n    return {\n      [READ_ATOM]: readAtom,\n      [WRITE_ATOM]: writeAtom,\n      [COMMIT_ATOM]: commitAtom,\n      [SUBSCRIBE_ATOM]: subscribeAtom,\n      [RESTORE_ATOMS]: restoreAtoms,\n      [DEV_SUBSCRIBE_STATE]: (l) => {\n        stateListeners.add(l);\n        return () => {\n          stateListeners.delete(l);\n        };\n      },\n      [DEV_GET_MOUNTED_ATOMS]: () => mountedAtoms.values(),\n      [DEV_GET_ATOM_STATE]: (a) => committedAtomStateMap.get(a),\n      [DEV_GET_MOUNTED]: (a) => mountedMap.get(a)\n    };\n  }\n  return {\n    [READ_ATOM]: readAtom,\n    [WRITE_ATOM]: writeAtom,\n    [COMMIT_ATOM]: commitAtom,\n    [SUBSCRIBE_ATOM]: subscribeAtom,\n    [RESTORE_ATOMS]: restoreAtoms\n  };\n};\nconst createStoreForExport = (initialValues) => {\n  const store = createStore(initialValues);\n  const get = (atom) => {\n    const atomState = store[READ_ATOM](atom);\n    if (\"e\" in atomState) {\n      throw atomState.e;\n    }\n    if (\"p\" in atomState) {\n      return void 0;\n    }\n    return atomState.v;\n  };\n  const asyncGet = (atom) => new Promise((resolve, reject) => {\n    const atomState = store[READ_ATOM](atom);\n    if (\"e\" in atomState) {\n      reject(atomState.e);\n    } else if (\"p\" in atomState) {\n      resolve(atomState.p.then(() => asyncGet(atom)));\n    } else {\n      resolve(atomState.v);\n    }\n  });\n  const set = (atom, update) => store[WRITE_ATOM](atom, update);\n  const sub = (atom, callback) => store[SUBSCRIBE_ATOM](atom, callback);\n  return {\n    get,\n    asyncGet,\n    set,\n    sub,\n    SECRET_INTERNAL_store: store\n  };\n};\n\nconst createScopeContainer = (initialValues, unstable_createStore) => {\n  const store = unstable_createStore ? unstable_createStore(initialValues).SECRET_INTERNAL_store : createStore(initialValues);\n  return { s: store };\n};\nconst ScopeContextMap = /* @__PURE__ */ new Map();\nconst getScopeContext = (scope) => {\n  if (!ScopeContextMap.has(scope)) {\n    ScopeContextMap.set(scope, createContext(createScopeContainer()));\n  }\n  return ScopeContextMap.get(scope);\n};\n\nvar __defProp = Object.defineProperty;\nvar __defProps = Object.defineProperties;\nvar __getOwnPropDescs = Object.getOwnPropertyDescriptors;\nvar __getOwnPropSymbols = Object.getOwnPropertySymbols;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __propIsEnum = Object.prototype.propertyIsEnumerable;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __spreadValues = (a, b) => {\n  for (var prop in b || (b = {}))\n    if (__hasOwnProp.call(b, prop))\n      __defNormalProp(a, prop, b[prop]);\n  if (__getOwnPropSymbols)\n    for (var prop of __getOwnPropSymbols(b)) {\n      if (__propIsEnum.call(b, prop))\n        __defNormalProp(a, prop, b[prop]);\n    }\n  return a;\n};\nvar __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));\nconst atomToPrintable = (atom) => atom.debugLabel || atom.toString();\nconst stateToPrintable = ([store, atoms]) => Object.fromEntries(atoms.flatMap((atom) => {\n  var _a, _b;\n  const mounted = (_a = store[DEV_GET_MOUNTED]) == null ? void 0 : _a.call(store, atom);\n  if (!mounted) {\n    return [];\n  }\n  const dependents = mounted.t;\n  const atomState = ((_b = store[DEV_GET_ATOM_STATE]) == null ? void 0 : _b.call(store, atom)) || {};\n  return [\n    [\n      atomToPrintable(atom),\n      __spreadProps(__spreadValues(__spreadValues(__spreadValues({}, \"e\" in atomState && { error: atomState.e }), \"p\" in atomState && { promise: atomState.p }), \"v\" in atomState && { value: atomState.v }), {\n        dependents: Array.from(dependents).map(atomToPrintable)\n      })\n    ]\n  ];\n}));\nconst useDebugState = (scopeContainer) => {\n  const { s: store } = scopeContainer;\n  const [atoms, setAtoms] = useState([]);\n  useEffect(() => {\n    var _a;\n    const callback = () => {\n      var _a2;\n      setAtoms(Array.from(((_a2 = store[DEV_GET_MOUNTED_ATOMS]) == null ? void 0 : _a2.call(store)) || []));\n    };\n    const unsubscribe = (_a = store[DEV_SUBSCRIBE_STATE]) == null ? void 0 : _a.call(store, callback);\n    callback();\n    return unsubscribe;\n  }, [store]);\n  useDebugValue([store, atoms], stateToPrintable);\n};\n\nconst Provider = ({\n  children,\n  initialValues,\n  scope,\n  unstable_createStore,\n  unstable_enableVersionedWrite\n}) => {\n  const [version, setVersion] = useState();\n  useEffect(() => {\n    if (version) {\n      scopeContainerRef.current.s[COMMIT_ATOM](null, version);\n      delete version.p;\n    }\n  }, [version]);\n  const scopeContainerRef = useRef();\n  if (!scopeContainerRef.current) {\n    scopeContainerRef.current = createScopeContainer(initialValues, unstable_createStore);\n    if (unstable_enableVersionedWrite) {\n      scopeContainerRef.current.w = (write) => {\n        setVersion((parentVersion) => {\n          const nextVersion = parentVersion ? { p: parentVersion } : {};\n          write(nextVersion);\n          return nextVersion;\n        });\n      };\n    }\n  }\n  if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !unstable_enableVersionedWrite) {\n    useDebugState(scopeContainerRef.current);\n  }\n  const ScopeContainerContext = getScopeContext(scope);\n  return createElement(ScopeContainerContext.Provider, {\n    value: scopeContainerRef.current\n  }, children);\n};\n\nlet keyCount = 0;\nfunction atom(read, write) {\n  const key = `atom${++keyCount}`;\n  const config = {\n    toString: () => key\n  };\n  if (typeof read === \"function\") {\n    config.read = read;\n  } else {\n    config.init = read;\n    config.read = (get) => get(config);\n    config.write = (get, set, update) => set(config, typeof update === \"function\" ? update(get(config)) : update);\n  }\n  if (write) {\n    config.write = write;\n  }\n  return config;\n}\n\nfunction useAtomValue(atom, scope) {\n  const ScopeContext = getScopeContext(scope);\n  const { s: store } = useContext(ScopeContext);\n  const getAtomValue = useCallback((version2) => {\n    const atomState = store[READ_ATOM](atom, version2);\n    if (\"e\" in atomState) {\n      throw atomState.e;\n    }\n    if (\"p\" in atomState) {\n      throw atomState.p;\n    }\n    if (\"v\" in atomState) {\n      return atomState.v;\n    }\n    throw new Error(\"no atom value\");\n  }, [store, atom]);\n  const [[version, value, atomFromUseReducer], rerenderIfChanged] = useReducer(useCallback((prev, nextVersion) => {\n    const nextValue = getAtomValue(nextVersion);\n    if (Object.is(prev[1], nextValue) && prev[2] === atom) {\n      return prev;\n    }\n    return [nextVersion, nextValue, atom];\n  }, [getAtomValue, atom]), void 0, () => {\n    const initialVersion = void 0;\n    const initialValue = getAtomValue(initialVersion);\n    return [initialVersion, initialValue, atom];\n  });\n  if (atomFromUseReducer !== atom) {\n    rerenderIfChanged(void 0);\n  }\n  useEffect(() => {\n    const unsubscribe = store[SUBSCRIBE_ATOM](atom, rerenderIfChanged);\n    rerenderIfChanged(void 0);\n    return unsubscribe;\n  }, [store, atom]);\n  useEffect(() => {\n    store[COMMIT_ATOM](atom, version);\n  });\n  useDebugValue(value);\n  return value;\n}\n\nfunction useSetAtom(atom, scope) {\n  const ScopeContext = getScopeContext(scope);\n  const { s: store, w: versionedWrite } = useContext(ScopeContext);\n  const setAtom = useCallback((update) => {\n    if ((import.meta.env && import.meta.env.MODE) !== \"production\" && !(\"write\" in atom)) {\n      throw new Error(\"not writable atom\");\n    }\n    const write = (version) => store[WRITE_ATOM](atom, update, version);\n    return versionedWrite ? versionedWrite(write) : write();\n  }, [store, versionedWrite, atom]);\n  return setAtom;\n}\n\nfunction useAtom(atom, scope) {\n  if (\"scope\" in atom) {\n    console.warn(\"atom.scope is deprecated. Please do useAtom(atom, scope) instead.\");\n    scope = atom.scope;\n  }\n  return [\n    useAtomValue(atom, scope),\n    useSetAtom(atom, scope)\n  ];\n}\n\nexport { Provider, getScopeContext as SECRET_INTERNAL_getScopeContext, atom, createStoreForExport as unstable_createStore, useAtom, useAtomValue, useSetAtom };\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\n/**\n * Creates a throttled function that only invokes `func` at most once per\n * every `wait` milliseconds. The throttled function comes with a `cancel`\n * method to cancel delayed `func` invocations and a `flush` method to\n * immediately invoke them. Provide `options` to indicate whether `func`\n * should be invoked on the leading and/or trailing edge of the `wait`\n * timeout. The `func` is invoked with the last arguments provided to the\n * throttled function. Subsequent calls to the throttled function return the\n * result of the last `func` invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the throttled function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.throttle` and `_.debounce`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to throttle.\n * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=true]\n *  Specify invoking on the leading edge of the timeout.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new throttled function.\n * @example\n *\n * // Avoid excessively updating the position while scrolling.\n * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n *\n * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n * jQuery(element).on('click', throttled);\n *\n * // Cancel the trailing throttled invocation.\n * jQuery(window).on('popstate', throttled.cancel);\n */\nfunction throttle(func, wait, options) {\n  var leading = true,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  if (isObject(options)) {\n    leading = 'leading' in options ? !!options.leading : leading;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n  return debounce(func, wait, {\n    'leading': leading,\n    'maxWait': wait,\n    'trailing': trailing\n  });\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n  if (typeof value == 'number') {\n    return value;\n  }\n  if (isSymbol(value)) {\n    return NAN;\n  }\n  if (isObject(value)) {\n    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n    value = isObject(other) ? (other + '') : other;\n  }\n  if (typeof value != 'string') {\n    return value === 0 ? value : +value;\n  }\n  value = value.replace(reTrim, '');\n  var isBinary = reIsBinary.test(value);\n  return (isBinary || reIsOctal.test(value))\n    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n    : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = throttle;\n","// Top level file is just a mixin of submodules & constants\n'use strict';\n\nvar assign    = require('./lib/utils/common').assign;\n\nvar deflate   = require('./lib/deflate');\nvar inflate   = require('./lib/inflate');\nvar constants = require('./lib/zlib/constants');\n\nvar pako = {};\n\nassign(pako, deflate, inflate, constants);\n\nmodule.exports = pako;\n","'use strict';\n\n\nvar zlib_deflate = require('./zlib/deflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\n\nvar toString = Object.prototype.toString;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\nvar Z_NO_FLUSH      = 0;\nvar Z_FINISH        = 4;\n\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_SYNC_FLUSH    = 2;\n\nvar Z_DEFAULT_COMPRESSION = -1;\n\nvar Z_DEFAULT_STRATEGY    = 0;\n\nvar Z_DEFLATED  = 8;\n\n/* ===========================================================================*/\n\n\n/**\n * class Deflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[deflate]],\n * [[deflateRaw]] and [[gzip]].\n **/\n\n/* internal\n * Deflate.chunks -> Array\n *\n * Chunks of output data, if [[Deflate#onData]] not overridden.\n **/\n\n/**\n * Deflate.result -> Uint8Array|Array\n *\n * Compressed result, generated by default [[Deflate#onData]]\n * and [[Deflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Deflate#push]] with `Z_FINISH` / `true` param)  or if you\n * push a chunk with explicit flush (call [[Deflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Deflate.err -> Number\n *\n * Error code after deflate finished. 0 (Z_OK) on success.\n * You will not need it in real life, because deflate errors\n * are possible only on wrong options or bad `onData` / `onEnd`\n * custom handlers.\n **/\n\n/**\n * Deflate.msg -> String\n *\n * Error message, if [[Deflate.err]] != 0\n **/\n\n\n/**\n * new Deflate(options)\n * - options (Object): zlib deflate options.\n *\n * Creates new deflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `level`\n * - `windowBits`\n * - `memLevel`\n * - `strategy`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw deflate\n * - `gzip` (Boolean) - create gzip wrapper\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n * - `header` (Object) - custom header for gzip\n *   - `text` (Boolean) - true if compressed data believed to be text\n *   - `time` (Number) - modification time, unix timestamp\n *   - `os` (Number) - operation system code\n *   - `extra` (Array) - array of bytes with extra data (max 65536)\n *   - `name` (String) - file name (binary string)\n *   - `comment` (String) - comment (binary string)\n *   - `hcrc` (Boolean) - true if header crc should be added\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var deflate = new pako.Deflate({ level: 3});\n *\n * deflate.push(chunk1, false);\n * deflate.push(chunk2, true);  // true -> last chunk\n *\n * if (deflate.err) { throw new Error(deflate.err); }\n *\n * console.log(deflate.result);\n * ```\n **/\nfunction Deflate(options) {\n  if (!(this instanceof Deflate)) return new Deflate(options);\n\n  this.options = utils.assign({\n    level: Z_DEFAULT_COMPRESSION,\n    method: Z_DEFLATED,\n    chunkSize: 16384,\n    windowBits: 15,\n    memLevel: 8,\n    strategy: Z_DEFAULT_STRATEGY,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  if (opt.raw && (opt.windowBits > 0)) {\n    opt.windowBits = -opt.windowBits;\n  }\n\n  else if (opt.gzip && (opt.windowBits > 0) && (opt.windowBits < 16)) {\n    opt.windowBits += 16;\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status = zlib_deflate.deflateInit2(\n    this.strm,\n    opt.level,\n    opt.method,\n    opt.windowBits,\n    opt.memLevel,\n    opt.strategy\n  );\n\n  if (status !== Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  if (opt.header) {\n    zlib_deflate.deflateSetHeader(this.strm, opt.header);\n  }\n\n  if (opt.dictionary) {\n    var dict;\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      // If we need to compress text, change encoding to utf8.\n      dict = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      dict = new Uint8Array(opt.dictionary);\n    } else {\n      dict = opt.dictionary;\n    }\n\n    status = zlib_deflate.deflateSetDictionary(this.strm, dict);\n\n    if (status !== Z_OK) {\n      throw new Error(msg[status]);\n    }\n\n    this._dict_set = true;\n  }\n}\n\n/**\n * Deflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be\n *   converted to utf8 byte sequence.\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with\n * new compressed chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the compression context.\n *\n * On fail call [[Deflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * array format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nDeflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var status, _mode;\n\n  if (this.ended) { return false; }\n\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? Z_FINISH : Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // If we need to compress text, change encoding to utf8.\n    strm.input = strings.string2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n    status = zlib_deflate.deflate(strm, _mode);    /* no bad return value */\n\n    if (status !== Z_STREAM_END && status !== Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n    if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) {\n      if (this.options.to === 'string') {\n        this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out)));\n      } else {\n        this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n      }\n    }\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== Z_STREAM_END);\n\n  // Finalize on the last chunk.\n  if (_mode === Z_FINISH) {\n    status = zlib_deflate.deflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === Z_SYNC_FLUSH) {\n    this.onEnd(Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Deflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nDeflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Deflate#onEnd(status) -> Void\n * - status (Number): deflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called once after you tell deflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nDeflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === Z_OK) {\n    if (this.options.to === 'string') {\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * deflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * Compress `data` with deflate algorithm and `options`.\n *\n * Supported options are:\n *\n * - level\n * - windowBits\n * - memLevel\n * - strategy\n * - dictionary\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be \"binary string\"\n *    (each char code [0..255])\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , data = Uint8Array([1,2,3,4,5,6,7,8,9]);\n *\n * console.log(pako.deflate(data));\n * ```\n **/\nfunction deflate(input, options) {\n  var deflator = new Deflate(options);\n\n  deflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (deflator.err) { throw deflator.msg || msg[deflator.err]; }\n\n  return deflator.result;\n}\n\n\n/**\n * deflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction deflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return deflate(input, options);\n}\n\n\n/**\n * gzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to compress.\n * - options (Object): zlib deflate options.\n *\n * The same as [[deflate]], but create gzip wrapper instead of\n * deflate one.\n **/\nfunction gzip(input, options) {\n  options = options || {};\n  options.gzip = true;\n  return deflate(input, options);\n}\n\n\nexports.Deflate = Deflate;\nexports.deflate = deflate;\nexports.deflateRaw = deflateRaw;\nexports.gzip = gzip;\n","'use strict';\n\n\nvar zlib_inflate = require('./zlib/inflate');\nvar utils        = require('./utils/common');\nvar strings      = require('./utils/strings');\nvar c            = require('./zlib/constants');\nvar msg          = require('./zlib/messages');\nvar ZStream      = require('./zlib/zstream');\nvar GZheader     = require('./zlib/gzheader');\n\nvar toString = Object.prototype.toString;\n\n/**\n * class Inflate\n *\n * Generic JS-style wrapper for zlib calls. If you don't need\n * streaming behaviour - use more simple functions: [[inflate]]\n * and [[inflateRaw]].\n **/\n\n/* internal\n * inflate.chunks -> Array\n *\n * Chunks of output data, if [[Inflate#onData]] not overridden.\n **/\n\n/**\n * Inflate.result -> Uint8Array|Array|String\n *\n * Uncompressed result, generated by default [[Inflate#onData]]\n * and [[Inflate#onEnd]] handlers. Filled after you push last chunk\n * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you\n * push a chunk with explicit flush (call [[Inflate#push]] with\n * `Z_SYNC_FLUSH` param).\n **/\n\n/**\n * Inflate.err -> Number\n *\n * Error code after inflate finished. 0 (Z_OK) on success.\n * Should be checked if broken data possible.\n **/\n\n/**\n * Inflate.msg -> String\n *\n * Error message, if [[Inflate.err]] != 0\n **/\n\n\n/**\n * new Inflate(options)\n * - options (Object): zlib inflate options.\n *\n * Creates new inflator instance with specified params. Throws exception\n * on bad params. Supported options:\n *\n * - `windowBits`\n * - `dictionary`\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information on these.\n *\n * Additional options, for internal needs:\n *\n * - `chunkSize` - size of generated data chunks (16K by default)\n * - `raw` (Boolean) - do raw inflate\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n * By default, when no options set, autodetect deflate/gzip data format via\n * wrapper header.\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , chunk1 = Uint8Array([1,2,3,4,5,6,7,8,9])\n *   , chunk2 = Uint8Array([10,11,12,13,14,15,16,17,18,19]);\n *\n * var inflate = new pako.Inflate({ level: 3});\n *\n * inflate.push(chunk1, false);\n * inflate.push(chunk2, true);  // true -> last chunk\n *\n * if (inflate.err) { throw new Error(inflate.err); }\n *\n * console.log(inflate.result);\n * ```\n **/\nfunction Inflate(options) {\n  if (!(this instanceof Inflate)) return new Inflate(options);\n\n  this.options = utils.assign({\n    chunkSize: 16384,\n    windowBits: 0,\n    to: ''\n  }, options || {});\n\n  var opt = this.options;\n\n  // Force window size for `raw` data, if not set directly,\n  // because we have no header for autodetect.\n  if (opt.raw && (opt.windowBits >= 0) && (opt.windowBits < 16)) {\n    opt.windowBits = -opt.windowBits;\n    if (opt.windowBits === 0) { opt.windowBits = -15; }\n  }\n\n  // If `windowBits` not defined (and mode not raw) - set autodetect flag for gzip/deflate\n  if ((opt.windowBits >= 0) && (opt.windowBits < 16) &&\n      !(options && options.windowBits)) {\n    opt.windowBits += 32;\n  }\n\n  // Gzip header has no info about windows size, we can do autodetect only\n  // for deflate. So, if window size not set, force it to max when gzip possible\n  if ((opt.windowBits > 15) && (opt.windowBits < 48)) {\n    // bit 3 (16) -> gzipped data\n    // bit 4 (32) -> autodetect gzip/deflate\n    if ((opt.windowBits & 15) === 0) {\n      opt.windowBits |= 15;\n    }\n  }\n\n  this.err    = 0;      // error code, if happens (0 = Z_OK)\n  this.msg    = '';     // error message\n  this.ended  = false;  // used to avoid multiple onEnd() calls\n  this.chunks = [];     // chunks of compressed data\n\n  this.strm   = new ZStream();\n  this.strm.avail_out = 0;\n\n  var status  = zlib_inflate.inflateInit2(\n    this.strm,\n    opt.windowBits\n  );\n\n  if (status !== c.Z_OK) {\n    throw new Error(msg[status]);\n  }\n\n  this.header = new GZheader();\n\n  zlib_inflate.inflateGetHeader(this.strm, this.header);\n\n  // Setup dictionary\n  if (opt.dictionary) {\n    // Convert data if needed\n    if (typeof opt.dictionary === 'string') {\n      opt.dictionary = strings.string2buf(opt.dictionary);\n    } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') {\n      opt.dictionary = new Uint8Array(opt.dictionary);\n    }\n    if (opt.raw) { //In raw mode we need to set the dictionary early\n      status = zlib_inflate.inflateSetDictionary(this.strm, opt.dictionary);\n      if (status !== c.Z_OK) {\n        throw new Error(msg[status]);\n      }\n    }\n  }\n}\n\n/**\n * Inflate#push(data[, mode]) -> Boolean\n * - data (Uint8Array|Array|ArrayBuffer|String): input data\n * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes.\n *   See constants. Skipped or `false` means Z_NO_FLUSH, `true` means Z_FINISH.\n *\n * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with\n * new output chunks. Returns `true` on success. The last data block must have\n * mode Z_FINISH (or `true`). That will flush internal pending buffers and call\n * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you\n * can use mode Z_SYNC_FLUSH, keeping the decompression context.\n *\n * On fail call [[Inflate#onEnd]] with error code and return false.\n *\n * We strongly recommend to use `Uint8Array` on input for best speed (output\n * format is detected automatically). Also, don't skip last param and always\n * use the same type in your code (boolean or number). That will improve JS speed.\n *\n * For regular `Array`-s make sure all elements are [0..255].\n *\n * ##### Example\n *\n * ```javascript\n * push(chunk, false); // push one of data chunks\n * ...\n * push(chunk, true);  // push last chunk\n * ```\n **/\nInflate.prototype.push = function (data, mode) {\n  var strm = this.strm;\n  var chunkSize = this.options.chunkSize;\n  var dictionary = this.options.dictionary;\n  var status, _mode;\n  var next_out_utf8, tail, utf8str;\n\n  // Flag to properly process Z_BUF_ERROR on testing inflate call\n  // when we check that all output data was flushed.\n  var allowBufError = false;\n\n  if (this.ended) { return false; }\n  _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH);\n\n  // Convert data if needed\n  if (typeof data === 'string') {\n    // Only binary strings can be decompressed on practice\n    strm.input = strings.binstring2buf(data);\n  } else if (toString.call(data) === '[object ArrayBuffer]') {\n    strm.input = new Uint8Array(data);\n  } else {\n    strm.input = data;\n  }\n\n  strm.next_in = 0;\n  strm.avail_in = strm.input.length;\n\n  do {\n    if (strm.avail_out === 0) {\n      strm.output = new utils.Buf8(chunkSize);\n      strm.next_out = 0;\n      strm.avail_out = chunkSize;\n    }\n\n    status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH);    /* no bad return value */\n\n    if (status === c.Z_NEED_DICT && dictionary) {\n      status = zlib_inflate.inflateSetDictionary(this.strm, dictionary);\n    }\n\n    if (status === c.Z_BUF_ERROR && allowBufError === true) {\n      status = c.Z_OK;\n      allowBufError = false;\n    }\n\n    if (status !== c.Z_STREAM_END && status !== c.Z_OK) {\n      this.onEnd(status);\n      this.ended = true;\n      return false;\n    }\n\n    if (strm.next_out) {\n      if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) {\n\n        if (this.options.to === 'string') {\n\n          next_out_utf8 = strings.utf8border(strm.output, strm.next_out);\n\n          tail = strm.next_out - next_out_utf8;\n          utf8str = strings.buf2string(strm.output, next_out_utf8);\n\n          // move tail\n          strm.next_out = tail;\n          strm.avail_out = chunkSize - tail;\n          if (tail) { utils.arraySet(strm.output, strm.output, next_out_utf8, tail, 0); }\n\n          this.onData(utf8str);\n\n        } else {\n          this.onData(utils.shrinkBuf(strm.output, strm.next_out));\n        }\n      }\n    }\n\n    // When no more input data, we should check that internal inflate buffers\n    // are flushed. The only way to do it when avail_out = 0 - run one more\n    // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR.\n    // Here we set flag to process this error properly.\n    //\n    // NOTE. Deflate does not return error in this case and does not needs such\n    // logic.\n    if (strm.avail_in === 0 && strm.avail_out === 0) {\n      allowBufError = true;\n    }\n\n  } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END);\n\n  if (status === c.Z_STREAM_END) {\n    _mode = c.Z_FINISH;\n  }\n\n  // Finalize on the last chunk.\n  if (_mode === c.Z_FINISH) {\n    status = zlib_inflate.inflateEnd(this.strm);\n    this.onEnd(status);\n    this.ended = true;\n    return status === c.Z_OK;\n  }\n\n  // callback interim results if Z_SYNC_FLUSH.\n  if (_mode === c.Z_SYNC_FLUSH) {\n    this.onEnd(c.Z_OK);\n    strm.avail_out = 0;\n    return true;\n  }\n\n  return true;\n};\n\n\n/**\n * Inflate#onData(chunk) -> Void\n * - chunk (Uint8Array|Array|String): output data. Type of array depends\n *   on js engine support. When string output requested, each chunk\n *   will be string.\n *\n * By default, stores data blocks in `chunks[]` property and glue\n * those in `onEnd`. Override this handler, if you need another behaviour.\n **/\nInflate.prototype.onData = function (chunk) {\n  this.chunks.push(chunk);\n};\n\n\n/**\n * Inflate#onEnd(status) -> Void\n * - status (Number): inflate status. 0 (Z_OK) on success,\n *   other if not.\n *\n * Called either after you tell inflate that the input stream is\n * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH)\n * or if an error happened. By default - join collected chunks,\n * free memory and fill `results` / `err` properties.\n **/\nInflate.prototype.onEnd = function (status) {\n  // On success - join\n  if (status === c.Z_OK) {\n    if (this.options.to === 'string') {\n      // Glue & convert here, until we teach pako to send\n      // utf8 aligned strings to onData\n      this.result = this.chunks.join('');\n    } else {\n      this.result = utils.flattenChunks(this.chunks);\n    }\n  }\n  this.chunks = [];\n  this.err = status;\n  this.msg = this.strm.msg;\n};\n\n\n/**\n * inflate(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Decompress `data` with inflate/ungzip and `options`. Autodetect\n * format via wrapper header by default. That's why we don't provide\n * separate `ungzip` method.\n *\n * Supported options are:\n *\n * - windowBits\n *\n * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced)\n * for more information.\n *\n * Sugar (options):\n *\n * - `raw` (Boolean) - say that we work with raw stream, if you don't wish to specify\n *   negative windowBits implicitly.\n * - `to` (String) - if equal to 'string', then result will be converted\n *   from utf8 to utf16 (javascript) string. When string output requested,\n *   chunk length can differ from `chunkSize`, depending on content.\n *\n *\n * ##### Example:\n *\n * ```javascript\n * var pako = require('pako')\n *   , input = pako.deflate([1,2,3,4,5,6,7,8,9])\n *   , output;\n *\n * try {\n *   output = pako.inflate(input);\n * } catch (err)\n *   console.log(err);\n * }\n * ```\n **/\nfunction inflate(input, options) {\n  var inflator = new Inflate(options);\n\n  inflator.push(input, true);\n\n  // That will never happens, if you don't cheat with options :)\n  if (inflator.err) { throw inflator.msg || msg[inflator.err]; }\n\n  return inflator.result;\n}\n\n\n/**\n * inflateRaw(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * The same as [[inflate]], but creates raw data, without wrapper\n * (header and adler32 crc).\n **/\nfunction inflateRaw(input, options) {\n  options = options || {};\n  options.raw = true;\n  return inflate(input, options);\n}\n\n\n/**\n * ungzip(data[, options]) -> Uint8Array|Array|String\n * - data (Uint8Array|Array|String): input data to decompress.\n * - options (Object): zlib inflate options.\n *\n * Just shortcut to [[inflate]], because it autodetects format\n * by header.content. Done for convenience.\n **/\n\n\nexports.Inflate = Inflate;\nexports.inflate = inflate;\nexports.inflateRaw = inflateRaw;\nexports.ungzip  = inflate;\n","'use strict';\n\n\nvar TYPED_OK =  (typeof Uint8Array !== 'undefined') &&\n                (typeof Uint16Array !== 'undefined') &&\n                (typeof Int32Array !== 'undefined');\n\nfunction _has(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n}\n\nexports.assign = function (obj /*from1, from2, from3, ...*/) {\n  var sources = Array.prototype.slice.call(arguments, 1);\n  while (sources.length) {\n    var source = sources.shift();\n    if (!source) { continue; }\n\n    if (typeof source !== 'object') {\n      throw new TypeError(source + 'must be non-object');\n    }\n\n    for (var p in source) {\n      if (_has(source, p)) {\n        obj[p] = source[p];\n      }\n    }\n  }\n\n  return obj;\n};\n\n\n// reduce buffer size, avoiding mem copy\nexports.shrinkBuf = function (buf, size) {\n  if (buf.length === size) { return buf; }\n  if (buf.subarray) { return buf.subarray(0, size); }\n  buf.length = size;\n  return buf;\n};\n\n\nvar fnTyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    if (src.subarray && dest.subarray) {\n      dest.set(src.subarray(src_offs, src_offs + len), dest_offs);\n      return;\n    }\n    // Fallback to ordinary array\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    var i, l, len, pos, chunk, result;\n\n    // calculate data length\n    len = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      len += chunks[i].length;\n    }\n\n    // join chunks\n    result = new Uint8Array(len);\n    pos = 0;\n    for (i = 0, l = chunks.length; i < l; i++) {\n      chunk = chunks[i];\n      result.set(chunk, pos);\n      pos += chunk.length;\n    }\n\n    return result;\n  }\n};\n\nvar fnUntyped = {\n  arraySet: function (dest, src, src_offs, len, dest_offs) {\n    for (var i = 0; i < len; i++) {\n      dest[dest_offs + i] = src[src_offs + i];\n    }\n  },\n  // Join array of chunks to single array.\n  flattenChunks: function (chunks) {\n    return [].concat.apply([], chunks);\n  }\n};\n\n\n// Enable/Disable typed arrays use, for testing\n//\nexports.setTyped = function (on) {\n  if (on) {\n    exports.Buf8  = Uint8Array;\n    exports.Buf16 = Uint16Array;\n    exports.Buf32 = Int32Array;\n    exports.assign(exports, fnTyped);\n  } else {\n    exports.Buf8  = Array;\n    exports.Buf16 = Array;\n    exports.Buf32 = Array;\n    exports.assign(exports, fnUntyped);\n  }\n};\n\nexports.setTyped(TYPED_OK);\n","// String encode/decode helpers\n'use strict';\n\n\nvar utils = require('./common');\n\n\n// Quick check if we can use fast array to bin string conversion\n//\n// - apply(Array) can fail on Android 2.2\n// - apply(Uint8Array) can fail on iOS 5.1 Safari\n//\nvar STR_APPLY_OK = true;\nvar STR_APPLY_UIA_OK = true;\n\ntry { String.fromCharCode.apply(null, [ 0 ]); } catch (__) { STR_APPLY_OK = false; }\ntry { String.fromCharCode.apply(null, new Uint8Array(1)); } catch (__) { STR_APPLY_UIA_OK = false; }\n\n\n// Table with utf8 lengths (calculated by first byte of sequence)\n// Note, that 5 & 6-byte values and some 4-byte values can not be represented in JS,\n// because max possible codepoint is 0x10ffff\nvar _utf8len = new utils.Buf8(256);\nfor (var q = 0; q < 256; q++) {\n  _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1);\n}\n_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start\n\n\n// convert string to array (typed, when possible)\nexports.string2buf = function (str) {\n  var buf, c, c2, m_pos, i, str_len = str.length, buf_len = 0;\n\n  // count binary size\n  for (m_pos = 0; m_pos < str_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    buf_len += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4;\n  }\n\n  // allocate buffer\n  buf = new utils.Buf8(buf_len);\n\n  // convert\n  for (i = 0, m_pos = 0; i < buf_len; m_pos++) {\n    c = str.charCodeAt(m_pos);\n    if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) {\n      c2 = str.charCodeAt(m_pos + 1);\n      if ((c2 & 0xfc00) === 0xdc00) {\n        c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00);\n        m_pos++;\n      }\n    }\n    if (c < 0x80) {\n      /* one byte */\n      buf[i++] = c;\n    } else if (c < 0x800) {\n      /* two bytes */\n      buf[i++] = 0xC0 | (c >>> 6);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else if (c < 0x10000) {\n      /* three bytes */\n      buf[i++] = 0xE0 | (c >>> 12);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    } else {\n      /* four bytes */\n      buf[i++] = 0xf0 | (c >>> 18);\n      buf[i++] = 0x80 | (c >>> 12 & 0x3f);\n      buf[i++] = 0x80 | (c >>> 6 & 0x3f);\n      buf[i++] = 0x80 | (c & 0x3f);\n    }\n  }\n\n  return buf;\n};\n\n// Helper (used in 2 places)\nfunction buf2binstring(buf, len) {\n  // On Chrome, the arguments in a function call that are allowed is `65534`.\n  // If the length of the buffer is smaller than that, we can use this optimization,\n  // otherwise we will take a slower path.\n  if (len < 65534) {\n    if ((buf.subarray && STR_APPLY_UIA_OK) || (!buf.subarray && STR_APPLY_OK)) {\n      return String.fromCharCode.apply(null, utils.shrinkBuf(buf, len));\n    }\n  }\n\n  var result = '';\n  for (var i = 0; i < len; i++) {\n    result += String.fromCharCode(buf[i]);\n  }\n  return result;\n}\n\n\n// Convert byte array to binary string\nexports.buf2binstring = function (buf) {\n  return buf2binstring(buf, buf.length);\n};\n\n\n// Convert binary string (typed, when possible)\nexports.binstring2buf = function (str) {\n  var buf = new utils.Buf8(str.length);\n  for (var i = 0, len = buf.length; i < len; i++) {\n    buf[i] = str.charCodeAt(i);\n  }\n  return buf;\n};\n\n\n// convert array to string\nexports.buf2string = function (buf, max) {\n  var i, out, c, c_len;\n  var len = max || buf.length;\n\n  // Reserve max possible length (2 words per char)\n  // NB: by unknown reasons, Array is significantly faster for\n  //     String.fromCharCode.apply than Uint16Array.\n  var utf16buf = new Array(len * 2);\n\n  for (out = 0, i = 0; i < len;) {\n    c = buf[i++];\n    // quick process ascii\n    if (c < 0x80) { utf16buf[out++] = c; continue; }\n\n    c_len = _utf8len[c];\n    // skip 5 & 6 byte codes\n    if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; }\n\n    // apply mask on first byte\n    c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07;\n    // join the rest\n    while (c_len > 1 && i < len) {\n      c = (c << 6) | (buf[i++] & 0x3f);\n      c_len--;\n    }\n\n    // terminated by end of string?\n    if (c_len > 1) { utf16buf[out++] = 0xfffd; continue; }\n\n    if (c < 0x10000) {\n      utf16buf[out++] = c;\n    } else {\n      c -= 0x10000;\n      utf16buf[out++] = 0xd800 | ((c >> 10) & 0x3ff);\n      utf16buf[out++] = 0xdc00 | (c & 0x3ff);\n    }\n  }\n\n  return buf2binstring(utf16buf, out);\n};\n\n\n// Calculate max possible position in utf8 buffer,\n// that will not break sequence. If that's not possible\n// - (very small limits) return max size as is.\n//\n// buf[] - utf8 bytes array\n// max   - length limit (mandatory);\nexports.utf8border = function (buf, max) {\n  var pos;\n\n  max = max || buf.length;\n  if (max > buf.length) { max = buf.length; }\n\n  // go back from last position, until start of sequence found\n  pos = max - 1;\n  while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; }\n\n  // Very small and broken sequence,\n  // return max, because we should return something anyway.\n  if (pos < 0) { return max; }\n\n  // If we came to start of buffer - that means buffer is too small,\n  // return max too.\n  if (pos === 0) { return max; }\n\n  return (pos + _utf8len[buf[pos]] > max) ? pos : max;\n};\n","'use strict';\n\n// Note: adler32 takes 12% for level 0 and 2% for level 6.\n// It isn't worth it to make additional optimizations as in original.\n// Small size is preferable.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction adler32(adler, buf, len, pos) {\n  var s1 = (adler & 0xffff) |0,\n      s2 = ((adler >>> 16) & 0xffff) |0,\n      n = 0;\n\n  while (len !== 0) {\n    // Set limit ~ twice less than 5552, to keep\n    // s2 in 31-bits, because we force signed ints.\n    // in other case %= will fail.\n    n = len > 2000 ? 2000 : len;\n    len -= n;\n\n    do {\n      s1 = (s1 + buf[pos++]) |0;\n      s2 = (s2 + s1) |0;\n    } while (--n);\n\n    s1 %= 65521;\n    s2 %= 65521;\n  }\n\n  return (s1 | (s2 << 16)) |0;\n}\n\n\nmodule.exports = adler32;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n\n  /* Allowed flush values; see deflate() and inflate() below for details */\n  Z_NO_FLUSH:         0,\n  Z_PARTIAL_FLUSH:    1,\n  Z_SYNC_FLUSH:       2,\n  Z_FULL_FLUSH:       3,\n  Z_FINISH:           4,\n  Z_BLOCK:            5,\n  Z_TREES:            6,\n\n  /* Return codes for the compression/decompression functions. Negative values\n  * are errors, positive values are used for special but normal events.\n  */\n  Z_OK:               0,\n  Z_STREAM_END:       1,\n  Z_NEED_DICT:        2,\n  Z_ERRNO:           -1,\n  Z_STREAM_ERROR:    -2,\n  Z_DATA_ERROR:      -3,\n  //Z_MEM_ERROR:     -4,\n  Z_BUF_ERROR:       -5,\n  //Z_VERSION_ERROR: -6,\n\n  /* compression levels */\n  Z_NO_COMPRESSION:         0,\n  Z_BEST_SPEED:             1,\n  Z_BEST_COMPRESSION:       9,\n  Z_DEFAULT_COMPRESSION:   -1,\n\n\n  Z_FILTERED:               1,\n  Z_HUFFMAN_ONLY:           2,\n  Z_RLE:                    3,\n  Z_FIXED:                  4,\n  Z_DEFAULT_STRATEGY:       0,\n\n  /* Possible values of the data_type field (though see inflate()) */\n  Z_BINARY:                 0,\n  Z_TEXT:                   1,\n  //Z_ASCII:                1, // = Z_TEXT (deprecated)\n  Z_UNKNOWN:                2,\n\n  /* The deflate compression method */\n  Z_DEFLATED:               8\n  //Z_NULL:                 null // Use -1 or null inline, depending on var type\n};\n","'use strict';\n\n// Note: we can't get significant speed boost here.\n// So write code to minimize size - no pregenerated tables\n// and array tools dependencies.\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// Use ordinary array, since untyped makes no boost here\nfunction makeTable() {\n  var c, table = [];\n\n  for (var n = 0; n < 256; n++) {\n    c = n;\n    for (var k = 0; k < 8; k++) {\n      c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1));\n    }\n    table[n] = c;\n  }\n\n  return table;\n}\n\n// Create table on load. Just 255 signed longs. Not a problem.\nvar crcTable = makeTable();\n\n\nfunction crc32(crc, buf, len, pos) {\n  var t = crcTable,\n      end = pos + len;\n\n  crc ^= -1;\n\n  for (var i = pos; i < end; i++) {\n    crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF];\n  }\n\n  return (crc ^ (-1)); // >>> 0;\n}\n\n\nmodule.exports = crc32;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils   = require('../utils/common');\nvar trees   = require('./trees');\nvar adler32 = require('./adler32');\nvar crc32   = require('./crc32');\nvar msg     = require('./messages');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\nvar Z_NO_FLUSH      = 0;\nvar Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\nvar Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\n//var Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\n//var Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\n//var Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n\n/* compression levels */\n//var Z_NO_COMPRESSION      = 0;\n//var Z_BEST_SPEED          = 1;\n//var Z_BEST_COMPRESSION    = 9;\nvar Z_DEFAULT_COMPRESSION = -1;\n\n\nvar Z_FILTERED            = 1;\nvar Z_HUFFMAN_ONLY        = 2;\nvar Z_RLE                 = 3;\nvar Z_FIXED               = 4;\nvar Z_DEFAULT_STRATEGY    = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\n//var Z_BINARY              = 0;\n//var Z_TEXT                = 1;\n//var Z_ASCII               = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n/*============================================================================*/\n\n\nvar MAX_MEM_LEVEL = 9;\n/* Maximum value for memLevel in deflateInit2 */\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_MEM_LEVEL = 8;\n\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\nvar D_CODES       = 30;\n/* number of distance codes */\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\nvar MAX_BITS  = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar MIN_MATCH = 3;\nvar MAX_MATCH = 258;\nvar MIN_LOOKAHEAD = (MAX_MATCH + MIN_MATCH + 1);\n\nvar PRESET_DICT = 0x20;\n\nvar INIT_STATE = 42;\nvar EXTRA_STATE = 69;\nvar NAME_STATE = 73;\nvar COMMENT_STATE = 91;\nvar HCRC_STATE = 103;\nvar BUSY_STATE = 113;\nvar FINISH_STATE = 666;\n\nvar BS_NEED_MORE      = 1; /* block not completed, need more input or more output */\nvar BS_BLOCK_DONE     = 2; /* block flush performed */\nvar BS_FINISH_STARTED = 3; /* finish started, need only more output at next deflate */\nvar BS_FINISH_DONE    = 4; /* finish done, accept no more input or output */\n\nvar OS_CODE = 0x03; // Unix :) . Don't detect, use this default.\n\nfunction err(strm, errorCode) {\n  strm.msg = msg[errorCode];\n  return errorCode;\n}\n\nfunction rank(f) {\n  return ((f) << 1) - ((f) > 4 ? 9 : 0);\n}\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n\n/* =========================================================================\n * Flush as much pending output as possible. All deflate() output goes\n * through this function so some applications may wish to modify it\n * to avoid allocating a large strm->output buffer and copying into it.\n * (See also read_buf()).\n */\nfunction flush_pending(strm) {\n  var s = strm.state;\n\n  //_tr_flush_bits(s);\n  var len = s.pending;\n  if (len > strm.avail_out) {\n    len = strm.avail_out;\n  }\n  if (len === 0) { return; }\n\n  utils.arraySet(strm.output, s.pending_buf, s.pending_out, len, strm.next_out);\n  strm.next_out += len;\n  s.pending_out += len;\n  strm.total_out += len;\n  strm.avail_out -= len;\n  s.pending -= len;\n  if (s.pending === 0) {\n    s.pending_out = 0;\n  }\n}\n\n\nfunction flush_block_only(s, last) {\n  trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last);\n  s.block_start = s.strstart;\n  flush_pending(s.strm);\n}\n\n\nfunction put_byte(s, b) {\n  s.pending_buf[s.pending++] = b;\n}\n\n\n/* =========================================================================\n * Put a short in the pending buffer. The 16-bit value is put in MSB order.\n * IN assertion: the stream state is correct and there is enough room in\n * pending_buf.\n */\nfunction putShortMSB(s, b) {\n//  put_byte(s, (Byte)(b >> 8));\n//  put_byte(s, (Byte)(b & 0xff));\n  s.pending_buf[s.pending++] = (b >>> 8) & 0xff;\n  s.pending_buf[s.pending++] = b & 0xff;\n}\n\n\n/* ===========================================================================\n * Read a new buffer from the current input stream, update the adler32\n * and total number of bytes read.  All deflate() input goes through\n * this function so some applications may wish to modify it to avoid\n * allocating a large strm->input buffer and copying from it.\n * (See also flush_pending()).\n */\nfunction read_buf(strm, buf, start, size) {\n  var len = strm.avail_in;\n\n  if (len > size) { len = size; }\n  if (len === 0) { return 0; }\n\n  strm.avail_in -= len;\n\n  // zmemcpy(buf, strm->next_in, len);\n  utils.arraySet(buf, strm.input, strm.next_in, len, start);\n  if (strm.state.wrap === 1) {\n    strm.adler = adler32(strm.adler, buf, len, start);\n  }\n\n  else if (strm.state.wrap === 2) {\n    strm.adler = crc32(strm.adler, buf, len, start);\n  }\n\n  strm.next_in += len;\n  strm.total_in += len;\n\n  return len;\n}\n\n\n/* ===========================================================================\n * Set match_start to the longest match starting at the given string and\n * return its length. Matches shorter or equal to prev_length are discarded,\n * in which case the result is equal to prev_length and match_start is\n * garbage.\n * IN assertions: cur_match is the head of the hash chain for the current\n *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\n * OUT assertion: the match length is not greater than s->lookahead.\n */\nfunction longest_match(s, cur_match) {\n  var chain_length = s.max_chain_length;      /* max hash chain length */\n  var scan = s.strstart; /* current string */\n  var match;                       /* matched string */\n  var len;                           /* length of current match */\n  var best_len = s.prev_length;              /* best match length so far */\n  var nice_match = s.nice_match;             /* stop if match long enough */\n  var limit = (s.strstart > (s.w_size - MIN_LOOKAHEAD)) ?\n      s.strstart - (s.w_size - MIN_LOOKAHEAD) : 0/*NIL*/;\n\n  var _win = s.window; // shortcut\n\n  var wmask = s.w_mask;\n  var prev  = s.prev;\n\n  /* Stop when cur_match becomes <= limit. To simplify the code,\n   * we prevent matches with the string of window index 0.\n   */\n\n  var strend = s.strstart + MAX_MATCH;\n  var scan_end1  = _win[scan + best_len - 1];\n  var scan_end   = _win[scan + best_len];\n\n  /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\n   * It is easy to get rid of this optimization if necessary.\n   */\n  // Assert(s->hash_bits >= 8 && MAX_MATCH == 258, \"Code too clever\");\n\n  /* Do not waste too much time if we already have a good match: */\n  if (s.prev_length >= s.good_match) {\n    chain_length >>= 2;\n  }\n  /* Do not look for matches beyond the end of the input. This is necessary\n   * to make deflate deterministic.\n   */\n  if (nice_match > s.lookahead) { nice_match = s.lookahead; }\n\n  // Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, \"need lookahead\");\n\n  do {\n    // Assert(cur_match < s->strstart, \"no future\");\n    match = cur_match;\n\n    /* Skip to next match if the match length cannot increase\n     * or if the match length is less than 2.  Note that the checks below\n     * for insufficient lookahead only occur occasionally for performance\n     * reasons.  Therefore uninitialized memory will be accessed, and\n     * conditional jumps will be made that depend on those values.\n     * However the length of the match is limited to the lookahead, so\n     * the output of deflate is not affected by the uninitialized values.\n     */\n\n    if (_win[match + best_len]     !== scan_end  ||\n        _win[match + best_len - 1] !== scan_end1 ||\n        _win[match]                !== _win[scan] ||\n        _win[++match]              !== _win[scan + 1]) {\n      continue;\n    }\n\n    /* The check at best_len-1 can be removed because it will be made\n     * again later. (This heuristic is not always a win.)\n     * It is not necessary to compare scan[2] and match[2] since they\n     * are always equal when the other bytes match, given that\n     * the hash keys are equal and that HASH_BITS >= 8.\n     */\n    scan += 2;\n    match++;\n    // Assert(*scan == *match, \"match[2]?\");\n\n    /* We check for insufficient lookahead only every 8th comparison;\n     * the 256th check will be made at strstart+258.\n     */\n    do {\n      /*jshint noempty:false*/\n    } while (_win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             _win[++scan] === _win[++match] && _win[++scan] === _win[++match] &&\n             scan < strend);\n\n    // Assert(scan <= s->window+(unsigned)(s->window_size-1), \"wild scan\");\n\n    len = MAX_MATCH - (strend - scan);\n    scan = strend - MAX_MATCH;\n\n    if (len > best_len) {\n      s.match_start = cur_match;\n      best_len = len;\n      if (len >= nice_match) {\n        break;\n      }\n      scan_end1  = _win[scan + best_len - 1];\n      scan_end   = _win[scan + best_len];\n    }\n  } while ((cur_match = prev[cur_match & wmask]) > limit && --chain_length !== 0);\n\n  if (best_len <= s.lookahead) {\n    return best_len;\n  }\n  return s.lookahead;\n}\n\n\n/* ===========================================================================\n * Fill the window when the lookahead becomes insufficient.\n * Updates strstart and lookahead.\n *\n * IN assertion: lookahead < MIN_LOOKAHEAD\n * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\n *    At least one byte has been read, or avail_in == 0; reads are\n *    performed for at least two bytes (required for the zip translate_eol\n *    option -- not supported here).\n */\nfunction fill_window(s) {\n  var _w_size = s.w_size;\n  var p, n, m, more, str;\n\n  //Assert(s->lookahead < MIN_LOOKAHEAD, \"already enough lookahead\");\n\n  do {\n    more = s.window_size - s.lookahead - s.strstart;\n\n    // JS ints have 32 bit, block below not needed\n    /* Deal with !@#$% 64K limit: */\n    //if (sizeof(int) <= 2) {\n    //    if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\n    //        more = wsize;\n    //\n    //  } else if (more == (unsigned)(-1)) {\n    //        /* Very unlikely, but possible on 16 bit machine if\n    //         * strstart == 0 && lookahead == 1 (input done a byte at time)\n    //         */\n    //        more--;\n    //    }\n    //}\n\n\n    /* If the window is almost full and there is insufficient lookahead,\n     * move the upper half to the lower one to make room in the upper half.\n     */\n    if (s.strstart >= _w_size + (_w_size - MIN_LOOKAHEAD)) {\n\n      utils.arraySet(s.window, s.window, _w_size, _w_size, 0);\n      s.match_start -= _w_size;\n      s.strstart -= _w_size;\n      /* we now have strstart >= MAX_DIST */\n      s.block_start -= _w_size;\n\n      /* Slide the hash table (could be avoided with 32 bit values\n       at the expense of memory usage). We slide even when level == 0\n       to keep the hash table consistent if we switch back to level > 0\n       later. (Using level 0 permanently is not an optimal usage of\n       zlib, so we don't care about this pathological case.)\n       */\n\n      n = s.hash_size;\n      p = n;\n      do {\n        m = s.head[--p];\n        s.head[p] = (m >= _w_size ? m - _w_size : 0);\n      } while (--n);\n\n      n = _w_size;\n      p = n;\n      do {\n        m = s.prev[--p];\n        s.prev[p] = (m >= _w_size ? m - _w_size : 0);\n        /* If n is not on any hash chain, prev[n] is garbage but\n         * its value will never be used.\n         */\n      } while (--n);\n\n      more += _w_size;\n    }\n    if (s.strm.avail_in === 0) {\n      break;\n    }\n\n    /* If there was no sliding:\n     *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\n     *    more == window_size - lookahead - strstart\n     * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\n     * => more >= window_size - 2*WSIZE + 2\n     * In the BIG_MEM or MMAP case (not yet supported),\n     *   window_size == input_size + MIN_LOOKAHEAD  &&\n     *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\n     * Otherwise, window_size == 2*WSIZE so more >= 2.\n     * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\n     */\n    //Assert(more >= 2, \"more < 2\");\n    n = read_buf(s.strm, s.window, s.strstart + s.lookahead, more);\n    s.lookahead += n;\n\n    /* Initialize the hash value now that we have some input: */\n    if (s.lookahead + s.insert >= MIN_MATCH) {\n      str = s.strstart - s.insert;\n      s.ins_h = s.window[str];\n\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + 1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + 1]) & s.hash_mask;\n//#if MIN_MATCH != 3\n//        Call update_hash() MIN_MATCH-3 more times\n//#endif\n      while (s.insert) {\n        /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n        s.prev[str & s.w_mask] = s.head[s.ins_h];\n        s.head[s.ins_h] = str;\n        str++;\n        s.insert--;\n        if (s.lookahead + s.insert < MIN_MATCH) {\n          break;\n        }\n      }\n    }\n    /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\n     * but this is not important since only literal bytes will be emitted.\n     */\n\n  } while (s.lookahead < MIN_LOOKAHEAD && s.strm.avail_in !== 0);\n\n  /* If the WIN_INIT bytes after the end of the current data have never been\n   * written, then zero those bytes in order to avoid memory check reports of\n   * the use of uninitialized (or uninitialised as Julian writes) bytes by\n   * the longest match routines.  Update the high water mark for the next\n   * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\n   * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\n   */\n//  if (s.high_water < s.window_size) {\n//    var curr = s.strstart + s.lookahead;\n//    var init = 0;\n//\n//    if (s.high_water < curr) {\n//      /* Previous high water mark below current data -- zero WIN_INIT\n//       * bytes or up to end of window, whichever is less.\n//       */\n//      init = s.window_size - curr;\n//      if (init > WIN_INIT)\n//        init = WIN_INIT;\n//      zmemzero(s->window + curr, (unsigned)init);\n//      s->high_water = curr + init;\n//    }\n//    else if (s->high_water < (ulg)curr + WIN_INIT) {\n//      /* High water mark at or above current data, but below current data\n//       * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\n//       * to end of window, whichever is less.\n//       */\n//      init = (ulg)curr + WIN_INIT - s->high_water;\n//      if (init > s->window_size - s->high_water)\n//        init = s->window_size - s->high_water;\n//      zmemzero(s->window + s->high_water, (unsigned)init);\n//      s->high_water += init;\n//    }\n//  }\n//\n//  Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\n//    \"not enough room for search\");\n}\n\n/* ===========================================================================\n * Copy without compression as much as possible from the input stream, return\n * the current block state.\n * This function does not insert new strings in the dictionary since\n * uncompressible data is probably not useful. This function is used\n * only for the level=0 compression option.\n * NOTE: this function should be optimized to avoid extra copying from\n * window to pending_buf.\n */\nfunction deflate_stored(s, flush) {\n  /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\n   * to pending_buf_size, and each stored block has a 5 byte header:\n   */\n  var max_block_size = 0xffff;\n\n  if (max_block_size > s.pending_buf_size - 5) {\n    max_block_size = s.pending_buf_size - 5;\n  }\n\n  /* Copy as much as possible from input to output: */\n  for (;;) {\n    /* Fill the window as much as possible: */\n    if (s.lookahead <= 1) {\n\n      //Assert(s->strstart < s->w_size+MAX_DIST(s) ||\n      //  s->block_start >= (long)s->w_size, \"slide too late\");\n//      if (!(s.strstart < s.w_size + (s.w_size - MIN_LOOKAHEAD) ||\n//        s.block_start >= s.w_size)) {\n//        throw  new Error(\"slide too late\");\n//      }\n\n      fill_window(s);\n      if (s.lookahead === 0 && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n\n      if (s.lookahead === 0) {\n        break;\n      }\n      /* flush the current block */\n    }\n    //Assert(s->block_start >= 0L, \"block gone\");\n//    if (s.block_start < 0) throw new Error(\"block gone\");\n\n    s.strstart += s.lookahead;\n    s.lookahead = 0;\n\n    /* Emit a stored block if pending_buf will be full: */\n    var max_start = s.block_start + max_block_size;\n\n    if (s.strstart === 0 || s.strstart >= max_start) {\n      /* strstart == 0 is possible when wraparound on 16-bit machine */\n      s.lookahead = s.strstart - max_start;\n      s.strstart = max_start;\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n\n\n    }\n    /* Flush if we may have to slide, otherwise block_start may become\n     * negative and the data will be gone:\n     */\n    if (s.strstart - s.block_start >= (s.w_size - MIN_LOOKAHEAD)) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n\n  s.insert = 0;\n\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n\n  if (s.strstart > s.block_start) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_NEED_MORE;\n}\n\n/* ===========================================================================\n * Compress as much as possible from the input stream, return the current\n * block state.\n * This function does not perform lazy evaluation of matches and inserts\n * new strings in the dictionary only for unmatched strings or for short\n * matches. It is used only for the fast compression options.\n */\nfunction deflate_fast(s, flush) {\n  var hash_head;        /* head of the hash chain */\n  var bflush;           /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) {\n        break; /* flush the current block */\n      }\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     * At this point we have always match_length < MIN_MATCH\n     */\n    if (hash_head !== 0/*NIL*/ && ((s.strstart - hash_head) <= (s.w_size - MIN_LOOKAHEAD))) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n    }\n    if (s.match_length >= MIN_MATCH) {\n      // check_match(s, s.strstart, s.match_start, s.match_length); // for debug only\n\n      /*** _tr_tally_dist(s, s.strstart - s.match_start,\n                     s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, s.strstart - s.match_start, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n\n      /* Insert new strings in the hash table only if the match length\n       * is not too large. This saves time but degrades compression.\n       */\n      if (s.match_length <= s.max_lazy_match/*max_insert_length*/ && s.lookahead >= MIN_MATCH) {\n        s.match_length--; /* string at strstart already in table */\n        do {\n          s.strstart++;\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n          /* strstart never exceeds WSIZE-MAX_MATCH, so there are\n           * always MIN_MATCH bytes ahead.\n           */\n        } while (--s.match_length !== 0);\n        s.strstart++;\n      } else\n      {\n        s.strstart += s.match_length;\n        s.match_length = 0;\n        s.ins_h = s.window[s.strstart];\n        /* UPDATE_HASH(s, s.ins_h, s.window[s.strstart+1]); */\n        s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + 1]) & s.hash_mask;\n\n//#if MIN_MATCH != 3\n//                Call UPDATE_HASH() MIN_MATCH-3 more times\n//#endif\n        /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\n         * matter since it will be recomputed at next deflate call.\n         */\n      }\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s.window[s.strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1);\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * Same as above, but achieves better compression. We use a lazy\n * evaluation for matches: a match is finally adopted only if there is\n * no better match at the next window position.\n */\nfunction deflate_slow(s, flush) {\n  var hash_head;          /* head of hash chain */\n  var bflush;              /* set if current block must be flushed */\n\n  var max_insert;\n\n  /* Process the input block. */\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the next match, plus MIN_MATCH bytes to insert the\n     * string following the next match.\n     */\n    if (s.lookahead < MIN_LOOKAHEAD) {\n      fill_window(s);\n      if (s.lookahead < MIN_LOOKAHEAD && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* Insert the string window[strstart .. strstart+2] in the\n     * dictionary, and set hash_head to the head of the hash chain:\n     */\n    hash_head = 0/*NIL*/;\n    if (s.lookahead >= MIN_MATCH) {\n      /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n      hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n      s.head[s.ins_h] = s.strstart;\n      /***/\n    }\n\n    /* Find the longest match, discarding those <= prev_length.\n     */\n    s.prev_length = s.match_length;\n    s.prev_match = s.match_start;\n    s.match_length = MIN_MATCH - 1;\n\n    if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match &&\n        s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) {\n      /* To simplify the code, we prevent matches with the string\n       * of window index 0 (in particular we have to avoid a match\n       * of the string with itself at the start of the input file).\n       */\n      s.match_length = longest_match(s, hash_head);\n      /* longest_match() sets match_start */\n\n      if (s.match_length <= 5 &&\n         (s.strategy === Z_FILTERED || (s.match_length === MIN_MATCH && s.strstart - s.match_start > 4096/*TOO_FAR*/))) {\n\n        /* If prev_match is also MIN_MATCH, match_start is garbage\n         * but we will ignore the current match anyway.\n         */\n        s.match_length = MIN_MATCH - 1;\n      }\n    }\n    /* If there was a match at the previous step and the current\n     * match is not better, output the previous match:\n     */\n    if (s.prev_length >= MIN_MATCH && s.match_length <= s.prev_length) {\n      max_insert = s.strstart + s.lookahead - MIN_MATCH;\n      /* Do not insert strings in hash table beyond this. */\n\n      //check_match(s, s.strstart-1, s.prev_match, s.prev_length);\n\n      /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match,\n                     s.prev_length - MIN_MATCH, bflush);***/\n      bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH);\n      /* Insert in hash table all strings up to the end of the match.\n       * strstart-1 and strstart are already inserted. If there is not\n       * enough lookahead, the last two strings are not inserted in\n       * the hash table.\n       */\n      s.lookahead -= s.prev_length - 1;\n      s.prev_length -= 2;\n      do {\n        if (++s.strstart <= max_insert) {\n          /*** INSERT_STRING(s, s.strstart, hash_head); ***/\n          s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[s.strstart + MIN_MATCH - 1]) & s.hash_mask;\n          hash_head = s.prev[s.strstart & s.w_mask] = s.head[s.ins_h];\n          s.head[s.ins_h] = s.strstart;\n          /***/\n        }\n      } while (--s.prev_length !== 0);\n      s.match_available = 0;\n      s.match_length = MIN_MATCH - 1;\n      s.strstart++;\n\n      if (bflush) {\n        /*** FLUSH_BLOCK(s, 0); ***/\n        flush_block_only(s, false);\n        if (s.strm.avail_out === 0) {\n          return BS_NEED_MORE;\n        }\n        /***/\n      }\n\n    } else if (s.match_available) {\n      /* If there was no match at the previous position, output a\n       * single literal. If there was a match but the current match\n       * is longer, truncate the previous match to a single literal.\n       */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n      /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n      if (bflush) {\n        /*** FLUSH_BLOCK_ONLY(s, 0) ***/\n        flush_block_only(s, false);\n        /***/\n      }\n      s.strstart++;\n      s.lookahead--;\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n    } else {\n      /* There is no previous match to compare with, wait for\n       * the next step to decide.\n       */\n      s.match_available = 1;\n      s.strstart++;\n      s.lookahead--;\n    }\n  }\n  //Assert (flush != Z_NO_FLUSH, \"no flush?\");\n  if (s.match_available) {\n    //Tracevv((stderr,\"%c\", s->window[s->strstart-1]));\n    /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]);\n\n    s.match_available = 0;\n  }\n  s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n\n  return BS_BLOCK_DONE;\n}\n\n\n/* ===========================================================================\n * For Z_RLE, simply look for runs of bytes, generate matches only of distance\n * one.  Do not maintain a hash table.  (It will be regenerated if this run of\n * deflate switches away from Z_RLE.)\n */\nfunction deflate_rle(s, flush) {\n  var bflush;            /* set if current block must be flushed */\n  var prev;              /* byte at distance one to match */\n  var scan, strend;      /* scan goes up to strend for length of run */\n\n  var _win = s.window;\n\n  for (;;) {\n    /* Make sure that we always have enough lookahead, except\n     * at the end of the input file. We need MAX_MATCH bytes\n     * for the longest run, plus one for the unrolled loop.\n     */\n    if (s.lookahead <= MAX_MATCH) {\n      fill_window(s);\n      if (s.lookahead <= MAX_MATCH && flush === Z_NO_FLUSH) {\n        return BS_NEED_MORE;\n      }\n      if (s.lookahead === 0) { break; } /* flush the current block */\n    }\n\n    /* See how many times the previous byte repeats */\n    s.match_length = 0;\n    if (s.lookahead >= MIN_MATCH && s.strstart > 0) {\n      scan = s.strstart - 1;\n      prev = _win[scan];\n      if (prev === _win[++scan] && prev === _win[++scan] && prev === _win[++scan]) {\n        strend = s.strstart + MAX_MATCH;\n        do {\n          /*jshint noempty:false*/\n        } while (prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 prev === _win[++scan] && prev === _win[++scan] &&\n                 scan < strend);\n        s.match_length = MAX_MATCH - (strend - scan);\n        if (s.match_length > s.lookahead) {\n          s.match_length = s.lookahead;\n        }\n      }\n      //Assert(scan <= s->window+(uInt)(s->window_size-1), \"wild scan\");\n    }\n\n    /* Emit match if have run of MIN_MATCH or longer, else emit literal */\n    if (s.match_length >= MIN_MATCH) {\n      //check_match(s, s.strstart, s.strstart - 1, s.match_length);\n\n      /*** _tr_tally_dist(s, 1, s.match_length - MIN_MATCH, bflush); ***/\n      bflush = trees._tr_tally(s, 1, s.match_length - MIN_MATCH);\n\n      s.lookahead -= s.match_length;\n      s.strstart += s.match_length;\n      s.match_length = 0;\n    } else {\n      /* No match, output a literal byte */\n      //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n      /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n      bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n\n      s.lookahead--;\n      s.strstart++;\n    }\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* ===========================================================================\n * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\n * (It will be regenerated if this run of deflate switches away from Huffman.)\n */\nfunction deflate_huff(s, flush) {\n  var bflush;             /* set if current block must be flushed */\n\n  for (;;) {\n    /* Make sure that we have a literal to write. */\n    if (s.lookahead === 0) {\n      fill_window(s);\n      if (s.lookahead === 0) {\n        if (flush === Z_NO_FLUSH) {\n          return BS_NEED_MORE;\n        }\n        break;      /* flush the current block */\n      }\n    }\n\n    /* Output a literal byte */\n    s.match_length = 0;\n    //Tracevv((stderr,\"%c\", s->window[s->strstart]));\n    /*** _tr_tally_lit(s, s.window[s.strstart], bflush); ***/\n    bflush = trees._tr_tally(s, 0, s.window[s.strstart]);\n    s.lookahead--;\n    s.strstart++;\n    if (bflush) {\n      /*** FLUSH_BLOCK(s, 0); ***/\n      flush_block_only(s, false);\n      if (s.strm.avail_out === 0) {\n        return BS_NEED_MORE;\n      }\n      /***/\n    }\n  }\n  s.insert = 0;\n  if (flush === Z_FINISH) {\n    /*** FLUSH_BLOCK(s, 1); ***/\n    flush_block_only(s, true);\n    if (s.strm.avail_out === 0) {\n      return BS_FINISH_STARTED;\n    }\n    /***/\n    return BS_FINISH_DONE;\n  }\n  if (s.last_lit) {\n    /*** FLUSH_BLOCK(s, 0); ***/\n    flush_block_only(s, false);\n    if (s.strm.avail_out === 0) {\n      return BS_NEED_MORE;\n    }\n    /***/\n  }\n  return BS_BLOCK_DONE;\n}\n\n/* Values for max_lazy_match, good_match and max_chain_length, depending on\n * the desired pack level (0..9). The values given below have been tuned to\n * exclude worst case performance for pathological files. Better values may be\n * found for specific files.\n */\nfunction Config(good_length, max_lazy, nice_length, max_chain, func) {\n  this.good_length = good_length;\n  this.max_lazy = max_lazy;\n  this.nice_length = nice_length;\n  this.max_chain = max_chain;\n  this.func = func;\n}\n\nvar configuration_table;\n\nconfiguration_table = [\n  /*      good lazy nice chain */\n  new Config(0, 0, 0, 0, deflate_stored),          /* 0 store only */\n  new Config(4, 4, 8, 4, deflate_fast),            /* 1 max speed, no lazy matches */\n  new Config(4, 5, 16, 8, deflate_fast),           /* 2 */\n  new Config(4, 6, 32, 32, deflate_fast),          /* 3 */\n\n  new Config(4, 4, 16, 16, deflate_slow),          /* 4 lazy matches */\n  new Config(8, 16, 32, 32, deflate_slow),         /* 5 */\n  new Config(8, 16, 128, 128, deflate_slow),       /* 6 */\n  new Config(8, 32, 128, 256, deflate_slow),       /* 7 */\n  new Config(32, 128, 258, 1024, deflate_slow),    /* 8 */\n  new Config(32, 258, 258, 4096, deflate_slow)     /* 9 max compression */\n];\n\n\n/* ===========================================================================\n * Initialize the \"longest match\" routines for a new zlib stream\n */\nfunction lm_init(s) {\n  s.window_size = 2 * s.w_size;\n\n  /*** CLEAR_HASH(s); ***/\n  zero(s.head); // Fill with NIL (= 0);\n\n  /* Set the default configuration parameters:\n   */\n  s.max_lazy_match = configuration_table[s.level].max_lazy;\n  s.good_match = configuration_table[s.level].good_length;\n  s.nice_match = configuration_table[s.level].nice_length;\n  s.max_chain_length = configuration_table[s.level].max_chain;\n\n  s.strstart = 0;\n  s.block_start = 0;\n  s.lookahead = 0;\n  s.insert = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  s.ins_h = 0;\n}\n\n\nfunction DeflateState() {\n  this.strm = null;            /* pointer back to this zlib stream */\n  this.status = 0;            /* as the name implies */\n  this.pending_buf = null;      /* output still pending */\n  this.pending_buf_size = 0;  /* size of pending_buf */\n  this.pending_out = 0;       /* next pending byte to output to the stream */\n  this.pending = 0;           /* nb of bytes in the pending buffer */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.gzhead = null;         /* gzip header information to write */\n  this.gzindex = 0;           /* where in extra, name, or comment */\n  this.method = Z_DEFLATED; /* can only be DEFLATED */\n  this.last_flush = -1;   /* value of flush param for previous deflate call */\n\n  this.w_size = 0;  /* LZ77 window size (32K by default) */\n  this.w_bits = 0;  /* log2(w_size)  (8..16) */\n  this.w_mask = 0;  /* w_size - 1 */\n\n  this.window = null;\n  /* Sliding window. Input bytes are read into the second half of the window,\n   * and move to the first half later to keep a dictionary of at least wSize\n   * bytes. With this organization, matches are limited to a distance of\n   * wSize-MAX_MATCH bytes, but this ensures that IO is always\n   * performed with a length multiple of the block size.\n   */\n\n  this.window_size = 0;\n  /* Actual size of window: 2*wSize, except when the user input buffer\n   * is directly used as sliding window.\n   */\n\n  this.prev = null;\n  /* Link to older string with same hash index. To limit the size of this\n   * array to 64K, this link is maintained only for the last 32K strings.\n   * An index in this array is thus a window index modulo 32K.\n   */\n\n  this.head = null;   /* Heads of the hash chains or NIL. */\n\n  this.ins_h = 0;       /* hash index of string to be inserted */\n  this.hash_size = 0;   /* number of elements in hash table */\n  this.hash_bits = 0;   /* log2(hash_size) */\n  this.hash_mask = 0;   /* hash_size-1 */\n\n  this.hash_shift = 0;\n  /* Number of bits by which ins_h must be shifted at each input\n   * step. It must be such that after MIN_MATCH steps, the oldest\n   * byte no longer takes part in the hash key, that is:\n   *   hash_shift * MIN_MATCH >= hash_bits\n   */\n\n  this.block_start = 0;\n  /* Window position at the beginning of the current output block. Gets\n   * negative when the window is moved backwards.\n   */\n\n  this.match_length = 0;      /* length of best match */\n  this.prev_match = 0;        /* previous match */\n  this.match_available = 0;   /* set if previous match exists */\n  this.strstart = 0;          /* start of string to insert */\n  this.match_start = 0;       /* start of matching string */\n  this.lookahead = 0;         /* number of valid bytes ahead in window */\n\n  this.prev_length = 0;\n  /* Length of the best match at previous step. Matches not greater than this\n   * are discarded. This is used in the lazy match evaluation.\n   */\n\n  this.max_chain_length = 0;\n  /* To speed up deflation, hash chains are never searched beyond this\n   * length.  A higher limit improves compression ratio but degrades the\n   * speed.\n   */\n\n  this.max_lazy_match = 0;\n  /* Attempt to find a better match only when the current match is strictly\n   * smaller than this value. This mechanism is used only for compression\n   * levels >= 4.\n   */\n  // That's alias to max_lazy_match, don't use directly\n  //this.max_insert_length = 0;\n  /* Insert new strings in the hash table only if the match length is not\n   * greater than this length. This saves time but degrades compression.\n   * max_insert_length is used only for compression levels <= 3.\n   */\n\n  this.level = 0;     /* compression level (1..9) */\n  this.strategy = 0;  /* favor or force Huffman coding*/\n\n  this.good_match = 0;\n  /* Use a faster search when the previous match is longer than this */\n\n  this.nice_match = 0; /* Stop searching when current match exceeds this */\n\n              /* used by trees.c: */\n\n  /* Didn't use ct_data typedef below to suppress compiler warning */\n\n  // struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\n  // struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\n  // struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\n\n  // Use flat array of DOUBLE size, with interleaved fata,\n  // because JS does not support effective\n  this.dyn_ltree  = new utils.Buf16(HEAP_SIZE * 2);\n  this.dyn_dtree  = new utils.Buf16((2 * D_CODES + 1) * 2);\n  this.bl_tree    = new utils.Buf16((2 * BL_CODES + 1) * 2);\n  zero(this.dyn_ltree);\n  zero(this.dyn_dtree);\n  zero(this.bl_tree);\n\n  this.l_desc   = null;         /* desc. for literal tree */\n  this.d_desc   = null;         /* desc. for distance tree */\n  this.bl_desc  = null;         /* desc. for bit length tree */\n\n  //ush bl_count[MAX_BITS+1];\n  this.bl_count = new utils.Buf16(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  //int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\n  this.heap = new utils.Buf16(2 * L_CODES + 1);  /* heap used to build the Huffman trees */\n  zero(this.heap);\n\n  this.heap_len = 0;               /* number of elements in the heap */\n  this.heap_max = 0;               /* element of largest frequency */\n  /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\n   * The same heap array is used to build all trees.\n   */\n\n  this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1];\n  zero(this.depth);\n  /* Depth of each subtree used as tie breaker for trees of equal frequency\n   */\n\n  this.l_buf = 0;          /* buffer index for literals or lengths */\n\n  this.lit_bufsize = 0;\n  /* Size of match buffer for literals/lengths.  There are 4 reasons for\n   * limiting lit_bufsize to 64K:\n   *   - frequencies can be kept in 16 bit counters\n   *   - if compression is not successful for the first block, all input\n   *     data is still in the window so we can still emit a stored block even\n   *     when input comes from standard input.  (This can also be done for\n   *     all blocks if lit_bufsize is not greater than 32K.)\n   *   - if compression is not successful for a file smaller than 64K, we can\n   *     even emit a stored file instead of a stored block (saving 5 bytes).\n   *     This is applicable only for zip (not gzip or zlib).\n   *   - creating new Huffman trees less frequently may not provide fast\n   *     adaptation to changes in the input data statistics. (Take for\n   *     example a binary file with poorly compressible code followed by\n   *     a highly compressible string table.) Smaller buffer sizes give\n   *     fast adaptation but have of course the overhead of transmitting\n   *     trees more frequently.\n   *   - I can't count above 4\n   */\n\n  this.last_lit = 0;      /* running index in l_buf */\n\n  this.d_buf = 0;\n  /* Buffer index for distances. To simplify the code, d_buf and l_buf have\n   * the same number of elements. To use different lengths, an extra flag\n   * array would be necessary.\n   */\n\n  this.opt_len = 0;       /* bit length of current block with optimal trees */\n  this.static_len = 0;    /* bit length of current block with static trees */\n  this.matches = 0;       /* number of string matches in current block */\n  this.insert = 0;        /* bytes at end of window left to insert */\n\n\n  this.bi_buf = 0;\n  /* Output buffer. bits are inserted starting at the bottom (least\n   * significant bits).\n   */\n  this.bi_valid = 0;\n  /* Number of valid bits in bi_buf.  All bits above the last valid bit\n   * are always zero.\n   */\n\n  // Used for window memory init. We safely ignore it for JS. That makes\n  // sense only for pointers and memory check tools.\n  //this.high_water = 0;\n  /* High water mark offset in window for initialized bytes -- bytes above\n   * this are set to zero in order to avoid memory check warnings when\n   * longest match routines access bytes past the input.  This is then\n   * updated to the new high water mark.\n   */\n}\n\n\nfunction deflateResetKeep(strm) {\n  var s;\n\n  if (!strm || !strm.state) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.total_in = strm.total_out = 0;\n  strm.data_type = Z_UNKNOWN;\n\n  s = strm.state;\n  s.pending = 0;\n  s.pending_out = 0;\n\n  if (s.wrap < 0) {\n    s.wrap = -s.wrap;\n    /* was made negative by deflate(..., Z_FINISH); */\n  }\n  s.status = (s.wrap ? INIT_STATE : BUSY_STATE);\n  strm.adler = (s.wrap === 2) ?\n    0  // crc32(0, Z_NULL, 0)\n  :\n    1; // adler32(0, Z_NULL, 0)\n  s.last_flush = Z_NO_FLUSH;\n  trees._tr_init(s);\n  return Z_OK;\n}\n\n\nfunction deflateReset(strm) {\n  var ret = deflateResetKeep(strm);\n  if (ret === Z_OK) {\n    lm_init(strm.state);\n  }\n  return ret;\n}\n\n\nfunction deflateSetHeader(strm, head) {\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  if (strm.state.wrap !== 2) { return Z_STREAM_ERROR; }\n  strm.state.gzhead = head;\n  return Z_OK;\n}\n\n\nfunction deflateInit2(strm, level, method, windowBits, memLevel, strategy) {\n  if (!strm) { // === Z_NULL\n    return Z_STREAM_ERROR;\n  }\n  var wrap = 1;\n\n  if (level === Z_DEFAULT_COMPRESSION) {\n    level = 6;\n  }\n\n  if (windowBits < 0) { /* suppress zlib wrapper */\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n\n  else if (windowBits > 15) {\n    wrap = 2;           /* write gzip wrapper instead */\n    windowBits -= 16;\n  }\n\n\n  if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method !== Z_DEFLATED ||\n    windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\n    strategy < 0 || strategy > Z_FIXED) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n\n  if (windowBits === 8) {\n    windowBits = 9;\n  }\n  /* until 256-byte window bug fixed */\n\n  var s = new DeflateState();\n\n  strm.state = s;\n  s.strm = strm;\n\n  s.wrap = wrap;\n  s.gzhead = null;\n  s.w_bits = windowBits;\n  s.w_size = 1 << s.w_bits;\n  s.w_mask = s.w_size - 1;\n\n  s.hash_bits = memLevel + 7;\n  s.hash_size = 1 << s.hash_bits;\n  s.hash_mask = s.hash_size - 1;\n  s.hash_shift = ~~((s.hash_bits + MIN_MATCH - 1) / MIN_MATCH);\n\n  s.window = new utils.Buf8(s.w_size * 2);\n  s.head = new utils.Buf16(s.hash_size);\n  s.prev = new utils.Buf16(s.w_size);\n\n  // Don't need mem init magic for JS.\n  //s.high_water = 0;  /* nothing written to s->window yet */\n\n  s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\n\n  s.pending_buf_size = s.lit_bufsize * 4;\n\n  //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\n  //s->pending_buf = (uchf *) overlay;\n  s.pending_buf = new utils.Buf8(s.pending_buf_size);\n\n  // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`)\n  //s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\n  s.d_buf = 1 * s.lit_bufsize;\n\n  //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\n  s.l_buf = (1 + 2) * s.lit_bufsize;\n\n  s.level = level;\n  s.strategy = strategy;\n  s.method = method;\n\n  return deflateReset(strm);\n}\n\nfunction deflateInit(strm, level) {\n  return deflateInit2(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY);\n}\n\n\nfunction deflate(strm, flush) {\n  var old_flush, s;\n  var beg, val; // for gzip header write only\n\n  if (!strm || !strm.state ||\n    flush > Z_BLOCK || flush < 0) {\n    return strm ? err(strm, Z_STREAM_ERROR) : Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n\n  if (!strm.output ||\n      (!strm.input && strm.avail_in !== 0) ||\n      (s.status === FINISH_STATE && flush !== Z_FINISH)) {\n    return err(strm, (strm.avail_out === 0) ? Z_BUF_ERROR : Z_STREAM_ERROR);\n  }\n\n  s.strm = strm; /* just in case */\n  old_flush = s.last_flush;\n  s.last_flush = flush;\n\n  /* Write the header */\n  if (s.status === INIT_STATE) {\n\n    if (s.wrap === 2) { // GZIP header\n      strm.adler = 0;  //crc32(0L, Z_NULL, 0);\n      put_byte(s, 31);\n      put_byte(s, 139);\n      put_byte(s, 8);\n      if (!s.gzhead) { // s->gzhead == Z_NULL\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, 0);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, OS_CODE);\n        s.status = BUSY_STATE;\n      }\n      else {\n        put_byte(s, (s.gzhead.text ? 1 : 0) +\n                    (s.gzhead.hcrc ? 2 : 0) +\n                    (!s.gzhead.extra ? 0 : 4) +\n                    (!s.gzhead.name ? 0 : 8) +\n                    (!s.gzhead.comment ? 0 : 16)\n        );\n        put_byte(s, s.gzhead.time & 0xff);\n        put_byte(s, (s.gzhead.time >> 8) & 0xff);\n        put_byte(s, (s.gzhead.time >> 16) & 0xff);\n        put_byte(s, (s.gzhead.time >> 24) & 0xff);\n        put_byte(s, s.level === 9 ? 2 :\n                    (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2 ?\n                     4 : 0));\n        put_byte(s, s.gzhead.os & 0xff);\n        if (s.gzhead.extra && s.gzhead.extra.length) {\n          put_byte(s, s.gzhead.extra.length & 0xff);\n          put_byte(s, (s.gzhead.extra.length >> 8) & 0xff);\n        }\n        if (s.gzhead.hcrc) {\n          strm.adler = crc32(strm.adler, s.pending_buf, s.pending, 0);\n        }\n        s.gzindex = 0;\n        s.status = EXTRA_STATE;\n      }\n    }\n    else // DEFLATE header\n    {\n      var header = (Z_DEFLATED + ((s.w_bits - 8) << 4)) << 8;\n      var level_flags = -1;\n\n      if (s.strategy >= Z_HUFFMAN_ONLY || s.level < 2) {\n        level_flags = 0;\n      } else if (s.level < 6) {\n        level_flags = 1;\n      } else if (s.level === 6) {\n        level_flags = 2;\n      } else {\n        level_flags = 3;\n      }\n      header |= (level_flags << 6);\n      if (s.strstart !== 0) { header |= PRESET_DICT; }\n      header += 31 - (header % 31);\n\n      s.status = BUSY_STATE;\n      putShortMSB(s, header);\n\n      /* Save the adler32 of the preset dictionary: */\n      if (s.strstart !== 0) {\n        putShortMSB(s, strm.adler >>> 16);\n        putShortMSB(s, strm.adler & 0xffff);\n      }\n      strm.adler = 1; // adler32(0L, Z_NULL, 0);\n    }\n  }\n\n//#ifdef GZIP\n  if (s.status === EXTRA_STATE) {\n    if (s.gzhead.extra/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n\n      while (s.gzindex < (s.gzhead.extra.length & 0xffff)) {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            break;\n          }\n        }\n        put_byte(s, s.gzhead.extra[s.gzindex] & 0xff);\n        s.gzindex++;\n      }\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (s.gzindex === s.gzhead.extra.length) {\n        s.gzindex = 0;\n        s.status = NAME_STATE;\n      }\n    }\n    else {\n      s.status = NAME_STATE;\n    }\n  }\n  if (s.status === NAME_STATE) {\n    if (s.gzhead.name/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.name.length) {\n          val = s.gzhead.name.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.gzindex = 0;\n        s.status = COMMENT_STATE;\n      }\n    }\n    else {\n      s.status = COMMENT_STATE;\n    }\n  }\n  if (s.status === COMMENT_STATE) {\n    if (s.gzhead.comment/* != Z_NULL*/) {\n      beg = s.pending;  /* start of bytes to update crc */\n      //int val;\n\n      do {\n        if (s.pending === s.pending_buf_size) {\n          if (s.gzhead.hcrc && s.pending > beg) {\n            strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n          }\n          flush_pending(strm);\n          beg = s.pending;\n          if (s.pending === s.pending_buf_size) {\n            val = 1;\n            break;\n          }\n        }\n        // JS specific: little magic to add zero terminator to end of string\n        if (s.gzindex < s.gzhead.comment.length) {\n          val = s.gzhead.comment.charCodeAt(s.gzindex++) & 0xff;\n        } else {\n          val = 0;\n        }\n        put_byte(s, val);\n      } while (val !== 0);\n\n      if (s.gzhead.hcrc && s.pending > beg) {\n        strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg);\n      }\n      if (val === 0) {\n        s.status = HCRC_STATE;\n      }\n    }\n    else {\n      s.status = HCRC_STATE;\n    }\n  }\n  if (s.status === HCRC_STATE) {\n    if (s.gzhead.hcrc) {\n      if (s.pending + 2 > s.pending_buf_size) {\n        flush_pending(strm);\n      }\n      if (s.pending + 2 <= s.pending_buf_size) {\n        put_byte(s, strm.adler & 0xff);\n        put_byte(s, (strm.adler >> 8) & 0xff);\n        strm.adler = 0; //crc32(0L, Z_NULL, 0);\n        s.status = BUSY_STATE;\n      }\n    }\n    else {\n      s.status = BUSY_STATE;\n    }\n  }\n//#endif\n\n  /* Flush as much pending output as possible */\n  if (s.pending !== 0) {\n    flush_pending(strm);\n    if (strm.avail_out === 0) {\n      /* Since avail_out is 0, deflate will be called again with\n       * more output space, but possibly with both pending and\n       * avail_in equal to zero. There won't be anything to do,\n       * but this is not an error situation so make sure we\n       * return OK instead of BUF_ERROR at next call of deflate:\n       */\n      s.last_flush = -1;\n      return Z_OK;\n    }\n\n    /* Make sure there is something to do and avoid duplicate consecutive\n     * flushes. For repeated and useless calls with Z_FINISH, we keep\n     * returning Z_STREAM_END instead of Z_BUF_ERROR.\n     */\n  } else if (strm.avail_in === 0 && rank(flush) <= rank(old_flush) &&\n    flush !== Z_FINISH) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* User must not provide more input after the first FINISH: */\n  if (s.status === FINISH_STATE && strm.avail_in !== 0) {\n    return err(strm, Z_BUF_ERROR);\n  }\n\n  /* Start a new block or continue the current one.\n   */\n  if (strm.avail_in !== 0 || s.lookahead !== 0 ||\n    (flush !== Z_NO_FLUSH && s.status !== FINISH_STATE)) {\n    var bstate = (s.strategy === Z_HUFFMAN_ONLY) ? deflate_huff(s, flush) :\n      (s.strategy === Z_RLE ? deflate_rle(s, flush) :\n        configuration_table[s.level].func(s, flush));\n\n    if (bstate === BS_FINISH_STARTED || bstate === BS_FINISH_DONE) {\n      s.status = FINISH_STATE;\n    }\n    if (bstate === BS_NEED_MORE || bstate === BS_FINISH_STARTED) {\n      if (strm.avail_out === 0) {\n        s.last_flush = -1;\n        /* avoid BUF_ERROR next call, see above */\n      }\n      return Z_OK;\n      /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\n       * of deflate should use the same flush parameter to make sure\n       * that the flush is complete. So we don't have to output an\n       * empty block here, this will be done at next call. This also\n       * ensures that for a very small output buffer, we emit at most\n       * one empty block.\n       */\n    }\n    if (bstate === BS_BLOCK_DONE) {\n      if (flush === Z_PARTIAL_FLUSH) {\n        trees._tr_align(s);\n      }\n      else if (flush !== Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\n\n        trees._tr_stored_block(s, 0, 0, false);\n        /* For a full flush, this empty block will be recognized\n         * as a special marker by inflate_sync().\n         */\n        if (flush === Z_FULL_FLUSH) {\n          /*** CLEAR_HASH(s); ***/             /* forget history */\n          zero(s.head); // Fill with NIL (= 0);\n\n          if (s.lookahead === 0) {\n            s.strstart = 0;\n            s.block_start = 0;\n            s.insert = 0;\n          }\n        }\n      }\n      flush_pending(strm);\n      if (strm.avail_out === 0) {\n        s.last_flush = -1; /* avoid BUF_ERROR at next call, see above */\n        return Z_OK;\n      }\n    }\n  }\n  //Assert(strm->avail_out > 0, \"bug2\");\n  //if (strm.avail_out <= 0) { throw new Error(\"bug2\");}\n\n  if (flush !== Z_FINISH) { return Z_OK; }\n  if (s.wrap <= 0) { return Z_STREAM_END; }\n\n  /* Write the trailer */\n  if (s.wrap === 2) {\n    put_byte(s, strm.adler & 0xff);\n    put_byte(s, (strm.adler >> 8) & 0xff);\n    put_byte(s, (strm.adler >> 16) & 0xff);\n    put_byte(s, (strm.adler >> 24) & 0xff);\n    put_byte(s, strm.total_in & 0xff);\n    put_byte(s, (strm.total_in >> 8) & 0xff);\n    put_byte(s, (strm.total_in >> 16) & 0xff);\n    put_byte(s, (strm.total_in >> 24) & 0xff);\n  }\n  else\n  {\n    putShortMSB(s, strm.adler >>> 16);\n    putShortMSB(s, strm.adler & 0xffff);\n  }\n\n  flush_pending(strm);\n  /* If avail_out is zero, the application will call deflate again\n   * to flush the rest.\n   */\n  if (s.wrap > 0) { s.wrap = -s.wrap; }\n  /* write the trailer only once! */\n  return s.pending !== 0 ? Z_OK : Z_STREAM_END;\n}\n\nfunction deflateEnd(strm) {\n  var status;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  status = strm.state.status;\n  if (status !== INIT_STATE &&\n    status !== EXTRA_STATE &&\n    status !== NAME_STATE &&\n    status !== COMMENT_STATE &&\n    status !== HCRC_STATE &&\n    status !== BUSY_STATE &&\n    status !== FINISH_STATE\n  ) {\n    return err(strm, Z_STREAM_ERROR);\n  }\n\n  strm.state = null;\n\n  return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK;\n}\n\n\n/* =========================================================================\n * Initializes the compression dictionary from the given byte\n * sequence without producing any compressed output.\n */\nfunction deflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var s;\n  var str, n;\n  var wrap;\n  var avail;\n  var next;\n  var input;\n  var tmpDict;\n\n  if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  s = strm.state;\n  wrap = s.wrap;\n\n  if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* when using zlib wrappers, compute Adler-32 for provided dictionary */\n  if (wrap === 1) {\n    /* adler32(strm->adler, dictionary, dictLength); */\n    strm.adler = adler32(strm.adler, dictionary, dictLength, 0);\n  }\n\n  s.wrap = 0;   /* avoid computing Adler-32 in read_buf */\n\n  /* if dictionary would fill window, just replace the history */\n  if (dictLength >= s.w_size) {\n    if (wrap === 0) {            /* already empty otherwise */\n      /*** CLEAR_HASH(s); ***/\n      zero(s.head); // Fill with NIL (= 0);\n      s.strstart = 0;\n      s.block_start = 0;\n      s.insert = 0;\n    }\n    /* use the tail */\n    // dictionary = dictionary.slice(dictLength - s.w_size);\n    tmpDict = new utils.Buf8(s.w_size);\n    utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0);\n    dictionary = tmpDict;\n    dictLength = s.w_size;\n  }\n  /* insert dictionary into window and hash */\n  avail = strm.avail_in;\n  next = strm.next_in;\n  input = strm.input;\n  strm.avail_in = dictLength;\n  strm.next_in = 0;\n  strm.input = dictionary;\n  fill_window(s);\n  while (s.lookahead >= MIN_MATCH) {\n    str = s.strstart;\n    n = s.lookahead - (MIN_MATCH - 1);\n    do {\n      /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */\n      s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask;\n\n      s.prev[str & s.w_mask] = s.head[s.ins_h];\n\n      s.head[s.ins_h] = str;\n      str++;\n    } while (--n);\n    s.strstart = str;\n    s.lookahead = MIN_MATCH - 1;\n    fill_window(s);\n  }\n  s.strstart += s.lookahead;\n  s.block_start = s.strstart;\n  s.insert = s.lookahead;\n  s.lookahead = 0;\n  s.match_length = s.prev_length = MIN_MATCH - 1;\n  s.match_available = 0;\n  strm.next_in = next;\n  strm.input = input;\n  strm.avail_in = avail;\n  s.wrap = wrap;\n  return Z_OK;\n}\n\n\nexports.deflateInit = deflateInit;\nexports.deflateInit2 = deflateInit2;\nexports.deflateReset = deflateReset;\nexports.deflateResetKeep = deflateResetKeep;\nexports.deflateSetHeader = deflateSetHeader;\nexports.deflate = deflate;\nexports.deflateEnd = deflateEnd;\nexports.deflateSetDictionary = deflateSetDictionary;\nexports.deflateInfo = 'pako deflate (from Nodeca project)';\n\n/* Not implemented\nexports.deflateBound = deflateBound;\nexports.deflateCopy = deflateCopy;\nexports.deflateParams = deflateParams;\nexports.deflatePending = deflatePending;\nexports.deflatePrime = deflatePrime;\nexports.deflateTune = deflateTune;\n*/\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction GZheader() {\n  /* true if compressed data believed to be text */\n  this.text       = 0;\n  /* modification time */\n  this.time       = 0;\n  /* extra flags (not used when writing a gzip file) */\n  this.xflags     = 0;\n  /* operating system */\n  this.os         = 0;\n  /* pointer to extra field or Z_NULL if none */\n  this.extra      = null;\n  /* extra field length (valid if extra != Z_NULL) */\n  this.extra_len  = 0; // Actually, we don't need it in JS,\n                       // but leave for few code modifications\n\n  //\n  // Setup limits is not necessary because in js we should not preallocate memory\n  // for inflate use constant limit in 65536 bytes\n  //\n\n  /* space at extra (only when reading header) */\n  // this.extra_max  = 0;\n  /* pointer to zero-terminated file name or Z_NULL */\n  this.name       = '';\n  /* space at name (only when reading header) */\n  // this.name_max   = 0;\n  /* pointer to zero-terminated comment or Z_NULL */\n  this.comment    = '';\n  /* space at comment (only when reading header) */\n  // this.comm_max   = 0;\n  /* true if there was or will be a header crc */\n  this.hcrc       = 0;\n  /* true when done reading gzip header (not used when writing a gzip file) */\n  this.done       = false;\n}\n\nmodule.exports = GZheader;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n// See state defs from inflate.js\nvar BAD = 30;       /* got a data error -- remain here until reset */\nvar TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\n\n/*\n   Decode literal, length, and distance codes and write out the resulting\n   literal and match bytes until either not enough input or output is\n   available, an end-of-block is encountered, or a data error is encountered.\n   When large enough input and output buffers are supplied to inflate(), for\n   example, a 16K input buffer and a 64K output buffer, more than 95% of the\n   inflate execution time is spent in this routine.\n\n   Entry assumptions:\n\n        state.mode === LEN\n        strm.avail_in >= 6\n        strm.avail_out >= 258\n        start >= strm.avail_out\n        state.bits < 8\n\n   On return, state.mode is one of:\n\n        LEN -- ran out of enough output space or enough available input\n        TYPE -- reached end of block code, inflate() to interpret next block\n        BAD -- error in block data\n\n   Notes:\n\n    - The maximum input bits used by a length/distance pair is 15 bits for the\n      length code, 5 bits for the length extra, 15 bits for the distance code,\n      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\n      Therefore if strm.avail_in >= 6, then there is enough input to avoid\n      checking for available input while decoding.\n\n    - The maximum bytes that a single length/distance pair can output is 258\n      bytes, which is the maximum length that can be coded.  inflate_fast()\n      requires strm.avail_out >= 258 for each loop to avoid checking for\n      output space.\n */\nmodule.exports = function inflate_fast(strm, start) {\n  var state;\n  var _in;                    /* local strm.input */\n  var last;                   /* have enough input while in < last */\n  var _out;                   /* local strm.output */\n  var beg;                    /* inflate()'s initial strm.output */\n  var end;                    /* while out < end, enough space available */\n//#ifdef INFLATE_STRICT\n  var dmax;                   /* maximum distance from zlib header */\n//#endif\n  var wsize;                  /* window size or zero if not using window */\n  var whave;                  /* valid bytes in the window */\n  var wnext;                  /* window write index */\n  // Use `s_window` instead `window`, avoid conflict with instrumentation tools\n  var s_window;               /* allocated sliding window, if wsize != 0 */\n  var hold;                   /* local strm.hold */\n  var bits;                   /* local strm.bits */\n  var lcode;                  /* local strm.lencode */\n  var dcode;                  /* local strm.distcode */\n  var lmask;                  /* mask for first level of length codes */\n  var dmask;                  /* mask for first level of distance codes */\n  var here;                   /* retrieved table entry */\n  var op;                     /* code bits, operation, extra bits, or */\n                              /*  window position, window bytes to copy */\n  var len;                    /* match length, unused bytes */\n  var dist;                   /* match distance */\n  var from;                   /* where to copy match from */\n  var from_source;\n\n\n  var input, output; // JS specific, because we have no pointers\n\n  /* copy state to local variables */\n  state = strm.state;\n  //here = state.here;\n  _in = strm.next_in;\n  input = strm.input;\n  last = _in + (strm.avail_in - 5);\n  _out = strm.next_out;\n  output = strm.output;\n  beg = _out - (start - strm.avail_out);\n  end = _out + (strm.avail_out - 257);\n//#ifdef INFLATE_STRICT\n  dmax = state.dmax;\n//#endif\n  wsize = state.wsize;\n  whave = state.whave;\n  wnext = state.wnext;\n  s_window = state.window;\n  hold = state.hold;\n  bits = state.bits;\n  lcode = state.lencode;\n  dcode = state.distcode;\n  lmask = (1 << state.lenbits) - 1;\n  dmask = (1 << state.distbits) - 1;\n\n\n  /* decode literals and length/distances until end-of-block or not enough\n     input data or output space */\n\n  top:\n  do {\n    if (bits < 15) {\n      hold += input[_in++] << bits;\n      bits += 8;\n      hold += input[_in++] << bits;\n      bits += 8;\n    }\n\n    here = lcode[hold & lmask];\n\n    dolen:\n    for (;;) { // Goto emulation\n      op = here >>> 24/*here.bits*/;\n      hold >>>= op;\n      bits -= op;\n      op = (here >>> 16) & 0xff/*here.op*/;\n      if (op === 0) {                          /* literal */\n        //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n        //        \"inflate:         literal '%c'\\n\" :\n        //        \"inflate:         literal 0x%02x\\n\", here.val));\n        output[_out++] = here & 0xffff/*here.val*/;\n      }\n      else if (op & 16) {                     /* length base */\n        len = here & 0xffff/*here.val*/;\n        op &= 15;                           /* number of extra bits */\n        if (op) {\n          if (bits < op) {\n            hold += input[_in++] << bits;\n            bits += 8;\n          }\n          len += hold & ((1 << op) - 1);\n          hold >>>= op;\n          bits -= op;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", len));\n        if (bits < 15) {\n          hold += input[_in++] << bits;\n          bits += 8;\n          hold += input[_in++] << bits;\n          bits += 8;\n        }\n        here = dcode[hold & dmask];\n\n        dodist:\n        for (;;) { // goto emulation\n          op = here >>> 24/*here.bits*/;\n          hold >>>= op;\n          bits -= op;\n          op = (here >>> 16) & 0xff/*here.op*/;\n\n          if (op & 16) {                      /* distance base */\n            dist = here & 0xffff/*here.val*/;\n            op &= 15;                       /* number of extra bits */\n            if (bits < op) {\n              hold += input[_in++] << bits;\n              bits += 8;\n              if (bits < op) {\n                hold += input[_in++] << bits;\n                bits += 8;\n              }\n            }\n            dist += hold & ((1 << op) - 1);\n//#ifdef INFLATE_STRICT\n            if (dist > dmax) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break top;\n            }\n//#endif\n            hold >>>= op;\n            bits -= op;\n            //Tracevv((stderr, \"inflate:         distance %u\\n\", dist));\n            op = _out - beg;                /* max distance in output */\n            if (dist > op) {                /* see if copy from window */\n              op = dist - op;               /* distance back in window */\n              if (op > whave) {\n                if (state.sane) {\n                  strm.msg = 'invalid distance too far back';\n                  state.mode = BAD;\n                  break top;\n                }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//                if (len <= op - whave) {\n//                  do {\n//                    output[_out++] = 0;\n//                  } while (--len);\n//                  continue top;\n//                }\n//                len -= op - whave;\n//                do {\n//                  output[_out++] = 0;\n//                } while (--op > whave);\n//                if (op === 0) {\n//                  from = _out - dist;\n//                  do {\n//                    output[_out++] = output[from++];\n//                  } while (--len);\n//                  continue top;\n//                }\n//#endif\n              }\n              from = 0; // window index\n              from_source = s_window;\n              if (wnext === 0) {           /* very common case */\n                from += wsize - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              else if (wnext < op) {      /* wrap around window */\n                from += wsize + wnext - op;\n                op -= wnext;\n                if (op < len) {         /* some from end of window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = 0;\n                  if (wnext < len) {  /* some from start of window */\n                    op = wnext;\n                    len -= op;\n                    do {\n                      output[_out++] = s_window[from++];\n                    } while (--op);\n                    from = _out - dist;      /* rest from output */\n                    from_source = output;\n                  }\n                }\n              }\n              else {                      /* contiguous in window */\n                from += wnext - op;\n                if (op < len) {         /* some from window */\n                  len -= op;\n                  do {\n                    output[_out++] = s_window[from++];\n                  } while (--op);\n                  from = _out - dist;  /* rest from output */\n                  from_source = output;\n                }\n              }\n              while (len > 2) {\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                output[_out++] = from_source[from++];\n                len -= 3;\n              }\n              if (len) {\n                output[_out++] = from_source[from++];\n                if (len > 1) {\n                  output[_out++] = from_source[from++];\n                }\n              }\n            }\n            else {\n              from = _out - dist;          /* copy direct from output */\n              do {                        /* minimum length is three */\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                output[_out++] = output[from++];\n                len -= 3;\n              } while (len > 2);\n              if (len) {\n                output[_out++] = output[from++];\n                if (len > 1) {\n                  output[_out++] = output[from++];\n                }\n              }\n            }\n          }\n          else if ((op & 64) === 0) {          /* 2nd level distance code */\n            here = dcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n            continue dodist;\n          }\n          else {\n            strm.msg = 'invalid distance code';\n            state.mode = BAD;\n            break top;\n          }\n\n          break; // need to emulate goto via \"continue\"\n        }\n      }\n      else if ((op & 64) === 0) {              /* 2nd level length code */\n        here = lcode[(here & 0xffff)/*here.val*/ + (hold & ((1 << op) - 1))];\n        continue dolen;\n      }\n      else if (op & 32) {                     /* end-of-block */\n        //Tracevv((stderr, \"inflate:         end of block\\n\"));\n        state.mode = TYPE;\n        break top;\n      }\n      else {\n        strm.msg = 'invalid literal/length code';\n        state.mode = BAD;\n        break top;\n      }\n\n      break; // need to emulate goto via \"continue\"\n    }\n  } while (_in < last && _out < end);\n\n  /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\n  len = bits >> 3;\n  _in -= len;\n  bits -= len << 3;\n  hold &= (1 << bits) - 1;\n\n  /* update state and return */\n  strm.next_in = _in;\n  strm.next_out = _out;\n  strm.avail_in = (_in < last ? 5 + (last - _in) : 5 - (_in - last));\n  strm.avail_out = (_out < end ? 257 + (end - _out) : 257 - (_out - end));\n  state.hold = hold;\n  state.bits = bits;\n  return;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils         = require('../utils/common');\nvar adler32       = require('./adler32');\nvar crc32         = require('./crc32');\nvar inflate_fast  = require('./inffast');\nvar inflate_table = require('./inftrees');\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n/* Allowed flush values; see deflate() and inflate() below for details */\n//var Z_NO_FLUSH      = 0;\n//var Z_PARTIAL_FLUSH = 1;\n//var Z_SYNC_FLUSH    = 2;\n//var Z_FULL_FLUSH    = 3;\nvar Z_FINISH        = 4;\nvar Z_BLOCK         = 5;\nvar Z_TREES         = 6;\n\n\n/* Return codes for the compression/decompression functions. Negative values\n * are errors, positive values are used for special but normal events.\n */\nvar Z_OK            = 0;\nvar Z_STREAM_END    = 1;\nvar Z_NEED_DICT     = 2;\n//var Z_ERRNO         = -1;\nvar Z_STREAM_ERROR  = -2;\nvar Z_DATA_ERROR    = -3;\nvar Z_MEM_ERROR     = -4;\nvar Z_BUF_ERROR     = -5;\n//var Z_VERSION_ERROR = -6;\n\n/* The deflate compression method */\nvar Z_DEFLATED  = 8;\n\n\n/* STATES ====================================================================*/\n/* ===========================================================================*/\n\n\nvar    HEAD = 1;       /* i: waiting for magic header */\nvar    FLAGS = 2;      /* i: waiting for method and flags (gzip) */\nvar    TIME = 3;       /* i: waiting for modification time (gzip) */\nvar    OS = 4;         /* i: waiting for extra flags and operating system (gzip) */\nvar    EXLEN = 5;      /* i: waiting for extra length (gzip) */\nvar    EXTRA = 6;      /* i: waiting for extra bytes (gzip) */\nvar    NAME = 7;       /* i: waiting for end of file name (gzip) */\nvar    COMMENT = 8;    /* i: waiting for end of comment (gzip) */\nvar    HCRC = 9;       /* i: waiting for header crc (gzip) */\nvar    DICTID = 10;    /* i: waiting for dictionary check value */\nvar    DICT = 11;      /* waiting for inflateSetDictionary() call */\nvar        TYPE = 12;      /* i: waiting for type bits, including last-flag bit */\nvar        TYPEDO = 13;    /* i: same, but skip check to exit inflate on new block */\nvar        STORED = 14;    /* i: waiting for stored size (length and complement) */\nvar        COPY_ = 15;     /* i/o: same as COPY below, but only first time in */\nvar        COPY = 16;      /* i/o: waiting for input or output to copy stored block */\nvar        TABLE = 17;     /* i: waiting for dynamic block table lengths */\nvar        LENLENS = 18;   /* i: waiting for code length code lengths */\nvar        CODELENS = 19;  /* i: waiting for length/lit and distance code lengths */\nvar            LEN_ = 20;      /* i: same as LEN below, but only first time in */\nvar            LEN = 21;       /* i: waiting for length/lit/eob code */\nvar            LENEXT = 22;    /* i: waiting for length extra bits */\nvar            DIST = 23;      /* i: waiting for distance code */\nvar            DISTEXT = 24;   /* i: waiting for distance extra bits */\nvar            MATCH = 25;     /* o: waiting for output space to copy string */\nvar            LIT = 26;       /* o: waiting for output space to write literal */\nvar    CHECK = 27;     /* i: waiting for 32-bit check value */\nvar    LENGTH = 28;    /* i: waiting for 32-bit length (gzip) */\nvar    DONE = 29;      /* finished check, done -- remain here until reset */\nvar    BAD = 30;       /* got a data error -- remain here until reset */\nvar    MEM = 31;       /* got an inflate() memory error -- remain here until reset */\nvar    SYNC = 32;      /* looking for synchronization bytes to restart inflate() */\n\n/* ===========================================================================*/\n\n\n\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH =  (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar MAX_WBITS = 15;\n/* 32K LZ77 window */\nvar DEF_WBITS = MAX_WBITS;\n\n\nfunction zswap32(q) {\n  return  (((q >>> 24) & 0xff) +\n          ((q >>> 8) & 0xff00) +\n          ((q & 0xff00) << 8) +\n          ((q & 0xff) << 24));\n}\n\n\nfunction InflateState() {\n  this.mode = 0;             /* current inflate mode */\n  this.last = false;          /* true if processing last block */\n  this.wrap = 0;              /* bit 0 true for zlib, bit 1 true for gzip */\n  this.havedict = false;      /* true if dictionary provided */\n  this.flags = 0;             /* gzip header method and flags (0 if zlib) */\n  this.dmax = 0;              /* zlib header max distance (INFLATE_STRICT) */\n  this.check = 0;             /* protected copy of check value */\n  this.total = 0;             /* protected copy of output count */\n  // TODO: may be {}\n  this.head = null;           /* where to save gzip header information */\n\n  /* sliding window */\n  this.wbits = 0;             /* log base 2 of requested window size */\n  this.wsize = 0;             /* window size or zero if not using window */\n  this.whave = 0;             /* valid bytes in the window */\n  this.wnext = 0;             /* window write index */\n  this.window = null;         /* allocated sliding window, if needed */\n\n  /* bit accumulator */\n  this.hold = 0;              /* input bit accumulator */\n  this.bits = 0;              /* number of bits in \"in\" */\n\n  /* for string and stored block copying */\n  this.length = 0;            /* literal or length of data to copy */\n  this.offset = 0;            /* distance back to copy string from */\n\n  /* for table and code decoding */\n  this.extra = 0;             /* extra bits needed */\n\n  /* fixed and dynamic code tables */\n  this.lencode = null;          /* starting table for length/literal codes */\n  this.distcode = null;         /* starting table for distance codes */\n  this.lenbits = 0;           /* index bits for lencode */\n  this.distbits = 0;          /* index bits for distcode */\n\n  /* dynamic table building */\n  this.ncode = 0;             /* number of code length code lengths */\n  this.nlen = 0;              /* number of length code lengths */\n  this.ndist = 0;             /* number of distance code lengths */\n  this.have = 0;              /* number of code lengths in lens[] */\n  this.next = null;              /* next available space in codes[] */\n\n  this.lens = new utils.Buf16(320); /* temporary storage for code lengths */\n  this.work = new utils.Buf16(288); /* work area for code table building */\n\n  /*\n   because we don't have pointers in js, we use lencode and distcode directly\n   as buffers so we don't need codes\n  */\n  //this.codes = new utils.Buf32(ENOUGH);       /* space for code tables */\n  this.lendyn = null;              /* dynamic table for length/literal codes (JS specific) */\n  this.distdyn = null;             /* dynamic table for distance codes (JS specific) */\n  this.sane = 0;                   /* if false, allow invalid distance too far */\n  this.back = 0;                   /* bits back of last unprocessed length/lit */\n  this.was = 0;                    /* initial length of match */\n}\n\nfunction inflateResetKeep(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  strm.total_in = strm.total_out = state.total = 0;\n  strm.msg = ''; /*Z_NULL*/\n  if (state.wrap) {       /* to support ill-conceived Java test suite */\n    strm.adler = state.wrap & 1;\n  }\n  state.mode = HEAD;\n  state.last = 0;\n  state.havedict = 0;\n  state.dmax = 32768;\n  state.head = null/*Z_NULL*/;\n  state.hold = 0;\n  state.bits = 0;\n  //state.lencode = state.distcode = state.next = state.codes;\n  state.lencode = state.lendyn = new utils.Buf32(ENOUGH_LENS);\n  state.distcode = state.distdyn = new utils.Buf32(ENOUGH_DISTS);\n\n  state.sane = 1;\n  state.back = -1;\n  //Tracev((stderr, \"inflate: reset\\n\"));\n  return Z_OK;\n}\n\nfunction inflateReset(strm) {\n  var state;\n\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  state.wsize = 0;\n  state.whave = 0;\n  state.wnext = 0;\n  return inflateResetKeep(strm);\n\n}\n\nfunction inflateReset2(strm, windowBits) {\n  var wrap;\n  var state;\n\n  /* get the state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  /* extract wrap request from windowBits parameter */\n  if (windowBits < 0) {\n    wrap = 0;\n    windowBits = -windowBits;\n  }\n  else {\n    wrap = (windowBits >> 4) + 1;\n    if (windowBits < 48) {\n      windowBits &= 15;\n    }\n  }\n\n  /* set number of window bits, free window if different */\n  if (windowBits && (windowBits < 8 || windowBits > 15)) {\n    return Z_STREAM_ERROR;\n  }\n  if (state.window !== null && state.wbits !== windowBits) {\n    state.window = null;\n  }\n\n  /* update state and reset the rest of it */\n  state.wrap = wrap;\n  state.wbits = windowBits;\n  return inflateReset(strm);\n}\n\nfunction inflateInit2(strm, windowBits) {\n  var ret;\n  var state;\n\n  if (!strm) { return Z_STREAM_ERROR; }\n  //strm.msg = Z_NULL;                 /* in case we return an error */\n\n  state = new InflateState();\n\n  //if (state === Z_NULL) return Z_MEM_ERROR;\n  //Tracev((stderr, \"inflate: allocated\\n\"));\n  strm.state = state;\n  state.window = null/*Z_NULL*/;\n  ret = inflateReset2(strm, windowBits);\n  if (ret !== Z_OK) {\n    strm.state = null/*Z_NULL*/;\n  }\n  return ret;\n}\n\nfunction inflateInit(strm) {\n  return inflateInit2(strm, DEF_WBITS);\n}\n\n\n/*\n Return state with length and distance decoding tables and index sizes set to\n fixed code decoding.  Normally this returns fixed tables from inffixed.h.\n If BUILDFIXED is defined, then instead this routine builds the tables the\n first time it's called, and returns those tables the first time and\n thereafter.  This reduces the size of the code by about 2K bytes, in\n exchange for a little execution time.  However, BUILDFIXED should not be\n used for threaded applications, since the rewriting of the tables and virgin\n may not be thread-safe.\n */\nvar virgin = true;\n\nvar lenfix, distfix; // We have no pointers in JS, so keep tables separate\n\nfunction fixedtables(state) {\n  /* build fixed huffman tables if first call (may not be thread safe) */\n  if (virgin) {\n    var sym;\n\n    lenfix = new utils.Buf32(512);\n    distfix = new utils.Buf32(32);\n\n    /* literal/length table */\n    sym = 0;\n    while (sym < 144) { state.lens[sym++] = 8; }\n    while (sym < 256) { state.lens[sym++] = 9; }\n    while (sym < 280) { state.lens[sym++] = 7; }\n    while (sym < 288) { state.lens[sym++] = 8; }\n\n    inflate_table(LENS,  state.lens, 0, 288, lenfix,   0, state.work, { bits: 9 });\n\n    /* distance table */\n    sym = 0;\n    while (sym < 32) { state.lens[sym++] = 5; }\n\n    inflate_table(DISTS, state.lens, 0, 32,   distfix, 0, state.work, { bits: 5 });\n\n    /* do this just once */\n    virgin = false;\n  }\n\n  state.lencode = lenfix;\n  state.lenbits = 9;\n  state.distcode = distfix;\n  state.distbits = 5;\n}\n\n\n/*\n Update the window with the last wsize (normally 32K) bytes written before\n returning.  If window does not exist yet, create it.  This is only called\n when a window is already in use, or when output has been written during this\n inflate call, but the end of the deflate stream has not been reached yet.\n It is also called to create a window for dictionary data when a dictionary\n is loaded.\n\n Providing output buffers larger than 32K to inflate() should provide a speed\n advantage, since only the last 32K of output is copied to the sliding window\n upon return from inflate(), and since all distances after the first 32K of\n output will fall in the output data, making match copies simpler and faster.\n The advantage may be dependent on the size of the processor's data caches.\n */\nfunction updatewindow(strm, src, end, copy) {\n  var dist;\n  var state = strm.state;\n\n  /* if it hasn't been done already, allocate space for the window */\n  if (state.window === null) {\n    state.wsize = 1 << state.wbits;\n    state.wnext = 0;\n    state.whave = 0;\n\n    state.window = new utils.Buf8(state.wsize);\n  }\n\n  /* copy state->wsize or less output bytes into the circular window */\n  if (copy >= state.wsize) {\n    utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0);\n    state.wnext = 0;\n    state.whave = state.wsize;\n  }\n  else {\n    dist = state.wsize - state.wnext;\n    if (dist > copy) {\n      dist = copy;\n    }\n    //zmemcpy(state->window + state->wnext, end - copy, dist);\n    utils.arraySet(state.window, src, end - copy, dist, state.wnext);\n    copy -= dist;\n    if (copy) {\n      //zmemcpy(state->window, end - copy, copy);\n      utils.arraySet(state.window, src, end - copy, copy, 0);\n      state.wnext = copy;\n      state.whave = state.wsize;\n    }\n    else {\n      state.wnext += dist;\n      if (state.wnext === state.wsize) { state.wnext = 0; }\n      if (state.whave < state.wsize) { state.whave += dist; }\n    }\n  }\n  return 0;\n}\n\nfunction inflate(strm, flush) {\n  var state;\n  var input, output;          // input/output buffers\n  var next;                   /* next input INDEX */\n  var put;                    /* next output INDEX */\n  var have, left;             /* available input and output */\n  var hold;                   /* bit buffer */\n  var bits;                   /* bits in bit buffer */\n  var _in, _out;              /* save starting available input and output */\n  var copy;                   /* number of stored or match bytes to copy */\n  var from;                   /* where to copy match bytes from */\n  var from_source;\n  var here = 0;               /* current decoding table entry */\n  var here_bits, here_op, here_val; // paked \"here\" denormalized (JS specific)\n  //var last;                   /* parent table entry */\n  var last_bits, last_op, last_val; // paked \"last\" denormalized (JS specific)\n  var len;                    /* length to copy for repeats, bits to drop */\n  var ret;                    /* return code */\n  var hbuf = new utils.Buf8(4);    /* buffer for gzip header crc calculation */\n  var opts;\n\n  var n; // temporary var for NEED_BITS\n\n  var order = /* permutation of code lengths */\n    [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n\n  if (!strm || !strm.state || !strm.output ||\n      (!strm.input && strm.avail_in !== 0)) {\n    return Z_STREAM_ERROR;\n  }\n\n  state = strm.state;\n  if (state.mode === TYPE) { state.mode = TYPEDO; }    /* skip check */\n\n\n  //--- LOAD() ---\n  put = strm.next_out;\n  output = strm.output;\n  left = strm.avail_out;\n  next = strm.next_in;\n  input = strm.input;\n  have = strm.avail_in;\n  hold = state.hold;\n  bits = state.bits;\n  //---\n\n  _in = have;\n  _out = left;\n  ret = Z_OK;\n\n  inf_leave: // goto emulation\n  for (;;) {\n    switch (state.mode) {\n      case HEAD:\n        if (state.wrap === 0) {\n          state.mode = TYPEDO;\n          break;\n        }\n        //=== NEEDBITS(16);\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((state.wrap & 2) && hold === 0x8b1f) {  /* gzip header */\n          state.check = 0/*crc32(0L, Z_NULL, 0)*/;\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          state.mode = FLAGS;\n          break;\n        }\n        state.flags = 0;           /* expect zlib header */\n        if (state.head) {\n          state.head.done = false;\n        }\n        if (!(state.wrap & 1) ||   /* check if zlib header allowed */\n          (((hold & 0xff)/*BITS(8)*/ << 8) + (hold >> 8)) % 31) {\n          strm.msg = 'incorrect header check';\n          state.mode = BAD;\n          break;\n        }\n        if ((hold & 0x0f)/*BITS(4)*/ !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n        len = (hold & 0x0f)/*BITS(4)*/ + 8;\n        if (state.wbits === 0) {\n          state.wbits = len;\n        }\n        else if (len > state.wbits) {\n          strm.msg = 'invalid window size';\n          state.mode = BAD;\n          break;\n        }\n        state.dmax = 1 << len;\n        //Tracev((stderr, \"inflate:   zlib header ok\\n\"));\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = hold & 0x200 ? DICTID : TYPE;\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        break;\n      case FLAGS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.flags = hold;\n        if ((state.flags & 0xff) !== Z_DEFLATED) {\n          strm.msg = 'unknown compression method';\n          state.mode = BAD;\n          break;\n        }\n        if (state.flags & 0xe000) {\n          strm.msg = 'unknown header flags set';\n          state.mode = BAD;\n          break;\n        }\n        if (state.head) {\n          state.head.text = ((hold >> 8) & 1);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = TIME;\n        /* falls through */\n      case TIME:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.time = hold;\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC4(state.check, hold)\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          hbuf[2] = (hold >>> 16) & 0xff;\n          hbuf[3] = (hold >>> 24) & 0xff;\n          state.check = crc32(state.check, hbuf, 4, 0);\n          //===\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = OS;\n        /* falls through */\n      case OS:\n        //=== NEEDBITS(16); */\n        while (bits < 16) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if (state.head) {\n          state.head.xflags = (hold & 0xff);\n          state.head.os = (hold >> 8);\n        }\n        if (state.flags & 0x0200) {\n          //=== CRC2(state.check, hold);\n          hbuf[0] = hold & 0xff;\n          hbuf[1] = (hold >>> 8) & 0xff;\n          state.check = crc32(state.check, hbuf, 2, 0);\n          //===//\n        }\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = EXLEN;\n        /* falls through */\n      case EXLEN:\n        if (state.flags & 0x0400) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length = hold;\n          if (state.head) {\n            state.head.extra_len = hold;\n          }\n          if (state.flags & 0x0200) {\n            //=== CRC2(state.check, hold);\n            hbuf[0] = hold & 0xff;\n            hbuf[1] = (hold >>> 8) & 0xff;\n            state.check = crc32(state.check, hbuf, 2, 0);\n            //===//\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        else if (state.head) {\n          state.head.extra = null/*Z_NULL*/;\n        }\n        state.mode = EXTRA;\n        /* falls through */\n      case EXTRA:\n        if (state.flags & 0x0400) {\n          copy = state.length;\n          if (copy > have) { copy = have; }\n          if (copy) {\n            if (state.head) {\n              len = state.head.extra_len - state.length;\n              if (!state.head.extra) {\n                // Use untyped array for more convenient processing later\n                state.head.extra = new Array(state.head.extra_len);\n              }\n              utils.arraySet(\n                state.head.extra,\n                input,\n                next,\n                // extra field is limited to 65536 bytes\n                // - no need for additional size check\n                copy,\n                /*len + copy > state.head.extra_max - len ? state.head.extra_max : copy,*/\n                len\n              );\n              //zmemcpy(state.head.extra + len, next,\n              //        len + copy > state.head.extra_max ?\n              //        state.head.extra_max - len : copy);\n            }\n            if (state.flags & 0x0200) {\n              state.check = crc32(state.check, input, copy, next);\n            }\n            have -= copy;\n            next += copy;\n            state.length -= copy;\n          }\n          if (state.length) { break inf_leave; }\n        }\n        state.length = 0;\n        state.mode = NAME;\n        /* falls through */\n      case NAME:\n        if (state.flags & 0x0800) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            // TODO: 2 or 1 bytes?\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.name_max*/)) {\n              state.head.name += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.name = null;\n        }\n        state.length = 0;\n        state.mode = COMMENT;\n        /* falls through */\n      case COMMENT:\n        if (state.flags & 0x1000) {\n          if (have === 0) { break inf_leave; }\n          copy = 0;\n          do {\n            len = input[next + copy++];\n            /* use constant limit because in js we should not preallocate memory */\n            if (state.head && len &&\n                (state.length < 65536 /*state.head.comm_max*/)) {\n              state.head.comment += String.fromCharCode(len);\n            }\n          } while (len && copy < have);\n          if (state.flags & 0x0200) {\n            state.check = crc32(state.check, input, copy, next);\n          }\n          have -= copy;\n          next += copy;\n          if (len) { break inf_leave; }\n        }\n        else if (state.head) {\n          state.head.comment = null;\n        }\n        state.mode = HCRC;\n        /* falls through */\n      case HCRC:\n        if (state.flags & 0x0200) {\n          //=== NEEDBITS(16); */\n          while (bits < 16) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.check & 0xffff)) {\n            strm.msg = 'header crc mismatch';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n        }\n        if (state.head) {\n          state.head.hcrc = ((state.flags >> 9) & 1);\n          state.head.done = true;\n        }\n        strm.adler = state.check = 0;\n        state.mode = TYPE;\n        break;\n      case DICTID:\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        strm.adler = state.check = zswap32(hold);\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = DICT;\n        /* falls through */\n      case DICT:\n        if (state.havedict === 0) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          return Z_NEED_DICT;\n        }\n        strm.adler = state.check = 1/*adler32(0L, Z_NULL, 0)*/;\n        state.mode = TYPE;\n        /* falls through */\n      case TYPE:\n        if (flush === Z_BLOCK || flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case TYPEDO:\n        if (state.last) {\n          //--- BYTEBITS() ---//\n          hold >>>= bits & 7;\n          bits -= bits & 7;\n          //---//\n          state.mode = CHECK;\n          break;\n        }\n        //=== NEEDBITS(3); */\n        while (bits < 3) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.last = (hold & 0x01)/*BITS(1)*/;\n        //--- DROPBITS(1) ---//\n        hold >>>= 1;\n        bits -= 1;\n        //---//\n\n        switch ((hold & 0x03)/*BITS(2)*/) {\n          case 0:                             /* stored block */\n            //Tracev((stderr, \"inflate:     stored block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = STORED;\n            break;\n          case 1:                             /* fixed block */\n            fixedtables(state);\n            //Tracev((stderr, \"inflate:     fixed codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = LEN_;             /* decode codes */\n            if (flush === Z_TREES) {\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n              break inf_leave;\n            }\n            break;\n          case 2:                             /* dynamic block */\n            //Tracev((stderr, \"inflate:     dynamic codes block%s\\n\",\n            //        state.last ? \" (last)\" : \"\"));\n            state.mode = TABLE;\n            break;\n          case 3:\n            strm.msg = 'invalid block type';\n            state.mode = BAD;\n        }\n        //--- DROPBITS(2) ---//\n        hold >>>= 2;\n        bits -= 2;\n        //---//\n        break;\n      case STORED:\n        //--- BYTEBITS() ---// /* go to byte boundary */\n        hold >>>= bits & 7;\n        bits -= bits & 7;\n        //---//\n        //=== NEEDBITS(32); */\n        while (bits < 32) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        if ((hold & 0xffff) !== ((hold >>> 16) ^ 0xffff)) {\n          strm.msg = 'invalid stored block lengths';\n          state.mode = BAD;\n          break;\n        }\n        state.length = hold & 0xffff;\n        //Tracev((stderr, \"inflate:       stored length %u\\n\",\n        //        state.length));\n        //=== INITBITS();\n        hold = 0;\n        bits = 0;\n        //===//\n        state.mode = COPY_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case COPY_:\n        state.mode = COPY;\n        /* falls through */\n      case COPY:\n        copy = state.length;\n        if (copy) {\n          if (copy > have) { copy = have; }\n          if (copy > left) { copy = left; }\n          if (copy === 0) { break inf_leave; }\n          //--- zmemcpy(put, next, copy); ---\n          utils.arraySet(output, input, next, copy, put);\n          //---//\n          have -= copy;\n          next += copy;\n          left -= copy;\n          put += copy;\n          state.length -= copy;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       stored end\\n\"));\n        state.mode = TYPE;\n        break;\n      case TABLE:\n        //=== NEEDBITS(14); */\n        while (bits < 14) {\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n        }\n        //===//\n        state.nlen = (hold & 0x1f)/*BITS(5)*/ + 257;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ndist = (hold & 0x1f)/*BITS(5)*/ + 1;\n        //--- DROPBITS(5) ---//\n        hold >>>= 5;\n        bits -= 5;\n        //---//\n        state.ncode = (hold & 0x0f)/*BITS(4)*/ + 4;\n        //--- DROPBITS(4) ---//\n        hold >>>= 4;\n        bits -= 4;\n        //---//\n//#ifndef PKZIP_BUG_WORKAROUND\n        if (state.nlen > 286 || state.ndist > 30) {\n          strm.msg = 'too many length or distance symbols';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracev((stderr, \"inflate:       table sizes ok\\n\"));\n        state.have = 0;\n        state.mode = LENLENS;\n        /* falls through */\n      case LENLENS:\n        while (state.have < state.ncode) {\n          //=== NEEDBITS(3);\n          while (bits < 3) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.lens[order[state.have++]] = (hold & 0x07);//BITS(3);\n          //--- DROPBITS(3) ---//\n          hold >>>= 3;\n          bits -= 3;\n          //---//\n        }\n        while (state.have < 19) {\n          state.lens[order[state.have++]] = 0;\n        }\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        //state.next = state.codes;\n        //state.lencode = state.next;\n        // Switch to use dynamic table\n        state.lencode = state.lendyn;\n        state.lenbits = 7;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts);\n        state.lenbits = opts.bits;\n\n        if (ret) {\n          strm.msg = 'invalid code lengths set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, \"inflate:       code lengths ok\\n\"));\n        state.have = 0;\n        state.mode = CODELENS;\n        /* falls through */\n      case CODELENS:\n        while (state.have < state.nlen + state.ndist) {\n          for (;;) {\n            here = state.lencode[hold & ((1 << state.lenbits) - 1)];/*BITS(state.lenbits)*/\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          if (here_val < 16) {\n            //--- DROPBITS(here.bits) ---//\n            hold >>>= here_bits;\n            bits -= here_bits;\n            //---//\n            state.lens[state.have++] = here_val;\n          }\n          else {\n            if (here_val === 16) {\n              //=== NEEDBITS(here.bits + 2);\n              n = here_bits + 2;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              if (state.have === 0) {\n                strm.msg = 'invalid bit length repeat';\n                state.mode = BAD;\n                break;\n              }\n              len = state.lens[state.have - 1];\n              copy = 3 + (hold & 0x03);//BITS(2);\n              //--- DROPBITS(2) ---//\n              hold >>>= 2;\n              bits -= 2;\n              //---//\n            }\n            else if (here_val === 17) {\n              //=== NEEDBITS(here.bits + 3);\n              n = here_bits + 3;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 3 + (hold & 0x07);//BITS(3);\n              //--- DROPBITS(3) ---//\n              hold >>>= 3;\n              bits -= 3;\n              //---//\n            }\n            else {\n              //=== NEEDBITS(here.bits + 7);\n              n = here_bits + 7;\n              while (bits < n) {\n                if (have === 0) { break inf_leave; }\n                have--;\n                hold += input[next++] << bits;\n                bits += 8;\n              }\n              //===//\n              //--- DROPBITS(here.bits) ---//\n              hold >>>= here_bits;\n              bits -= here_bits;\n              //---//\n              len = 0;\n              copy = 11 + (hold & 0x7f);//BITS(7);\n              //--- DROPBITS(7) ---//\n              hold >>>= 7;\n              bits -= 7;\n              //---//\n            }\n            if (state.have + copy > state.nlen + state.ndist) {\n              strm.msg = 'invalid bit length repeat';\n              state.mode = BAD;\n              break;\n            }\n            while (copy--) {\n              state.lens[state.have++] = len;\n            }\n          }\n        }\n\n        /* handle error breaks in while */\n        if (state.mode === BAD) { break; }\n\n        /* check for end-of-block code (better have one) */\n        if (state.lens[256] === 0) {\n          strm.msg = 'invalid code -- missing end-of-block';\n          state.mode = BAD;\n          break;\n        }\n\n        /* build code tables -- note: do not change the lenbits or distbits\n           values here (9 and 6) without reading the comments in inftrees.h\n           concerning the ENOUGH constants, which depend on those values */\n        state.lenbits = 9;\n\n        opts = { bits: state.lenbits };\n        ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.lenbits = opts.bits;\n        // state.lencode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid literal/lengths set';\n          state.mode = BAD;\n          break;\n        }\n\n        state.distbits = 6;\n        //state.distcode.copy(state.codes);\n        // Switch to use dynamic table\n        state.distcode = state.distdyn;\n        opts = { bits: state.distbits };\n        ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts);\n        // We have separate tables & no pointers. 2 commented lines below not needed.\n        // state.next_index = opts.table_index;\n        state.distbits = opts.bits;\n        // state.distcode = state.next;\n\n        if (ret) {\n          strm.msg = 'invalid distances set';\n          state.mode = BAD;\n          break;\n        }\n        //Tracev((stderr, 'inflate:       codes ok\\n'));\n        state.mode = LEN_;\n        if (flush === Z_TREES) { break inf_leave; }\n        /* falls through */\n      case LEN_:\n        state.mode = LEN;\n        /* falls through */\n      case LEN:\n        if (have >= 6 && left >= 258) {\n          //--- RESTORE() ---\n          strm.next_out = put;\n          strm.avail_out = left;\n          strm.next_in = next;\n          strm.avail_in = have;\n          state.hold = hold;\n          state.bits = bits;\n          //---\n          inflate_fast(strm, _out);\n          //--- LOAD() ---\n          put = strm.next_out;\n          output = strm.output;\n          left = strm.avail_out;\n          next = strm.next_in;\n          input = strm.input;\n          have = strm.avail_in;\n          hold = state.hold;\n          bits = state.bits;\n          //---\n\n          if (state.mode === TYPE) {\n            state.back = -1;\n          }\n          break;\n        }\n        state.back = 0;\n        for (;;) {\n          here = state.lencode[hold & ((1 << state.lenbits) - 1)];  /*BITS(state.lenbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if (here_bits <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if (here_op && (here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.lencode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        state.length = here_val;\n        if (here_op === 0) {\n          //Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\n          //        \"inflate:         literal '%c'\\n\" :\n          //        \"inflate:         literal 0x%02x\\n\", here.val));\n          state.mode = LIT;\n          break;\n        }\n        if (here_op & 32) {\n          //Tracevv((stderr, \"inflate:         end of block\\n\"));\n          state.back = -1;\n          state.mode = TYPE;\n          break;\n        }\n        if (here_op & 64) {\n          strm.msg = 'invalid literal/length code';\n          state.mode = BAD;\n          break;\n        }\n        state.extra = here_op & 15;\n        state.mode = LENEXT;\n        /* falls through */\n      case LENEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n        //Tracevv((stderr, \"inflate:         length %u\\n\", state.length));\n        state.was = state.length;\n        state.mode = DIST;\n        /* falls through */\n      case DIST:\n        for (;;) {\n          here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/\n          here_bits = here >>> 24;\n          here_op = (here >>> 16) & 0xff;\n          here_val = here & 0xffff;\n\n          if ((here_bits) <= bits) { break; }\n          //--- PULLBYTE() ---//\n          if (have === 0) { break inf_leave; }\n          have--;\n          hold += input[next++] << bits;\n          bits += 8;\n          //---//\n        }\n        if ((here_op & 0xf0) === 0) {\n          last_bits = here_bits;\n          last_op = here_op;\n          last_val = here_val;\n          for (;;) {\n            here = state.distcode[last_val +\n                    ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)];\n            here_bits = here >>> 24;\n            here_op = (here >>> 16) & 0xff;\n            here_val = here & 0xffff;\n\n            if ((last_bits + here_bits) <= bits) { break; }\n            //--- PULLBYTE() ---//\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n            //---//\n          }\n          //--- DROPBITS(last.bits) ---//\n          hold >>>= last_bits;\n          bits -= last_bits;\n          //---//\n          state.back += last_bits;\n        }\n        //--- DROPBITS(here.bits) ---//\n        hold >>>= here_bits;\n        bits -= here_bits;\n        //---//\n        state.back += here_bits;\n        if (here_op & 64) {\n          strm.msg = 'invalid distance code';\n          state.mode = BAD;\n          break;\n        }\n        state.offset = here_val;\n        state.extra = (here_op) & 15;\n        state.mode = DISTEXT;\n        /* falls through */\n      case DISTEXT:\n        if (state.extra) {\n          //=== NEEDBITS(state.extra);\n          n = state.extra;\n          while (bits < n) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/;\n          //--- DROPBITS(state.extra) ---//\n          hold >>>= state.extra;\n          bits -= state.extra;\n          //---//\n          state.back += state.extra;\n        }\n//#ifdef INFLATE_STRICT\n        if (state.offset > state.dmax) {\n          strm.msg = 'invalid distance too far back';\n          state.mode = BAD;\n          break;\n        }\n//#endif\n        //Tracevv((stderr, \"inflate:         distance %u\\n\", state.offset));\n        state.mode = MATCH;\n        /* falls through */\n      case MATCH:\n        if (left === 0) { break inf_leave; }\n        copy = _out - left;\n        if (state.offset > copy) {         /* copy from window */\n          copy = state.offset - copy;\n          if (copy > state.whave) {\n            if (state.sane) {\n              strm.msg = 'invalid distance too far back';\n              state.mode = BAD;\n              break;\n            }\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n//#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\n//          Trace((stderr, \"inflate.c too far\\n\"));\n//          copy -= state.whave;\n//          if (copy > state.length) { copy = state.length; }\n//          if (copy > left) { copy = left; }\n//          left -= copy;\n//          state.length -= copy;\n//          do {\n//            output[put++] = 0;\n//          } while (--copy);\n//          if (state.length === 0) { state.mode = LEN; }\n//          break;\n//#endif\n          }\n          if (copy > state.wnext) {\n            copy -= state.wnext;\n            from = state.wsize - copy;\n          }\n          else {\n            from = state.wnext - copy;\n          }\n          if (copy > state.length) { copy = state.length; }\n          from_source = state.window;\n        }\n        else {                              /* copy from output */\n          from_source = output;\n          from = put - state.offset;\n          copy = state.length;\n        }\n        if (copy > left) { copy = left; }\n        left -= copy;\n        state.length -= copy;\n        do {\n          output[put++] = from_source[from++];\n        } while (--copy);\n        if (state.length === 0) { state.mode = LEN; }\n        break;\n      case LIT:\n        if (left === 0) { break inf_leave; }\n        output[put++] = state.length;\n        left--;\n        state.mode = LEN;\n        break;\n      case CHECK:\n        if (state.wrap) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            // Use '|' instead of '+' to make sure that result is signed\n            hold |= input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          _out -= left;\n          strm.total_out += _out;\n          state.total += _out;\n          if (_out) {\n            strm.adler = state.check =\n                /*UPDATE(state.check, put - _out, _out);*/\n                (state.flags ? crc32(state.check, output, _out, put - _out) : adler32(state.check, output, _out, put - _out));\n\n          }\n          _out = left;\n          // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too\n          if ((state.flags ? hold : zswap32(hold)) !== state.check) {\n            strm.msg = 'incorrect data check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   check matches trailer\\n\"));\n        }\n        state.mode = LENGTH;\n        /* falls through */\n      case LENGTH:\n        if (state.wrap && state.flags) {\n          //=== NEEDBITS(32);\n          while (bits < 32) {\n            if (have === 0) { break inf_leave; }\n            have--;\n            hold += input[next++] << bits;\n            bits += 8;\n          }\n          //===//\n          if (hold !== (state.total & 0xffffffff)) {\n            strm.msg = 'incorrect length check';\n            state.mode = BAD;\n            break;\n          }\n          //=== INITBITS();\n          hold = 0;\n          bits = 0;\n          //===//\n          //Tracev((stderr, \"inflate:   length matches trailer\\n\"));\n        }\n        state.mode = DONE;\n        /* falls through */\n      case DONE:\n        ret = Z_STREAM_END;\n        break inf_leave;\n      case BAD:\n        ret = Z_DATA_ERROR;\n        break inf_leave;\n      case MEM:\n        return Z_MEM_ERROR;\n      case SYNC:\n        /* falls through */\n      default:\n        return Z_STREAM_ERROR;\n    }\n  }\n\n  // inf_leave <- here is real place for \"goto inf_leave\", emulated via \"break inf_leave\"\n\n  /*\n     Return from inflate(), updating the total counts and the check value.\n     If there was no progress during the inflate() call, return a buffer\n     error.  Call updatewindow() to create and/or update the window state.\n     Note: a memory error from inflate() is non-recoverable.\n   */\n\n  //--- RESTORE() ---\n  strm.next_out = put;\n  strm.avail_out = left;\n  strm.next_in = next;\n  strm.avail_in = have;\n  state.hold = hold;\n  state.bits = bits;\n  //---\n\n  if (state.wsize || (_out !== strm.avail_out && state.mode < BAD &&\n                      (state.mode < CHECK || flush !== Z_FINISH))) {\n    if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) {\n      state.mode = MEM;\n      return Z_MEM_ERROR;\n    }\n  }\n  _in -= strm.avail_in;\n  _out -= strm.avail_out;\n  strm.total_in += _in;\n  strm.total_out += _out;\n  state.total += _out;\n  if (state.wrap && _out) {\n    strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/\n      (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out));\n  }\n  strm.data_type = state.bits + (state.last ? 64 : 0) +\n                    (state.mode === TYPE ? 128 : 0) +\n                    (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0);\n  if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) {\n    ret = Z_BUF_ERROR;\n  }\n  return ret;\n}\n\nfunction inflateEnd(strm) {\n\n  if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) {\n    return Z_STREAM_ERROR;\n  }\n\n  var state = strm.state;\n  if (state.window) {\n    state.window = null;\n  }\n  strm.state = null;\n  return Z_OK;\n}\n\nfunction inflateGetHeader(strm, head) {\n  var state;\n\n  /* check state */\n  if (!strm || !strm.state) { return Z_STREAM_ERROR; }\n  state = strm.state;\n  if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; }\n\n  /* save header structure */\n  state.head = head;\n  head.done = false;\n  return Z_OK;\n}\n\nfunction inflateSetDictionary(strm, dictionary) {\n  var dictLength = dictionary.length;\n\n  var state;\n  var dictid;\n  var ret;\n\n  /* check state */\n  if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; }\n  state = strm.state;\n\n  if (state.wrap !== 0 && state.mode !== DICT) {\n    return Z_STREAM_ERROR;\n  }\n\n  /* check for correct dictionary identifier */\n  if (state.mode === DICT) {\n    dictid = 1; /* adler32(0, null, 0)*/\n    /* dictid = adler32(dictid, dictionary, dictLength); */\n    dictid = adler32(dictid, dictionary, dictLength, 0);\n    if (dictid !== state.check) {\n      return Z_DATA_ERROR;\n    }\n  }\n  /* copy dictionary to window using updatewindow(), which will amend the\n   existing dictionary if appropriate */\n  ret = updatewindow(strm, dictionary, dictLength, dictLength);\n  if (ret) {\n    state.mode = MEM;\n    return Z_MEM_ERROR;\n  }\n  state.havedict = 1;\n  // Tracev((stderr, \"inflate:   dictionary set\\n\"));\n  return Z_OK;\n}\n\nexports.inflateReset = inflateReset;\nexports.inflateReset2 = inflateReset2;\nexports.inflateResetKeep = inflateResetKeep;\nexports.inflateInit = inflateInit;\nexports.inflateInit2 = inflateInit2;\nexports.inflate = inflate;\nexports.inflateEnd = inflateEnd;\nexports.inflateGetHeader = inflateGetHeader;\nexports.inflateSetDictionary = inflateSetDictionary;\nexports.inflateInfo = 'pako inflate (from Nodeca project)';\n\n/* Not implemented\nexports.inflateCopy = inflateCopy;\nexports.inflateGetDictionary = inflateGetDictionary;\nexports.inflateMark = inflateMark;\nexports.inflatePrime = inflatePrime;\nexports.inflateSync = inflateSync;\nexports.inflateSyncPoint = inflateSyncPoint;\nexports.inflateUndermine = inflateUndermine;\n*/\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nvar utils = require('../utils/common');\n\nvar MAXBITS = 15;\nvar ENOUGH_LENS = 852;\nvar ENOUGH_DISTS = 592;\n//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS);\n\nvar CODES = 0;\nvar LENS = 1;\nvar DISTS = 2;\n\nvar lbase = [ /* Length codes 257..285 base */\n  3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\n  35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0\n];\n\nvar lext = [ /* Length codes 257..285 extra */\n  16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\n  19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78\n];\n\nvar dbase = [ /* Distance codes 0..29 base */\n  1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\n  257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\n  8193, 12289, 16385, 24577, 0, 0\n];\n\nvar dext = [ /* Distance codes 0..29 extra */\n  16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\n  23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\n  28, 28, 29, 29, 64, 64\n];\n\nmodule.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts)\n{\n  var bits = opts.bits;\n      //here = opts.here; /* table entry for duplication */\n\n  var len = 0;               /* a code's length in bits */\n  var sym = 0;               /* index of code symbols */\n  var min = 0, max = 0;          /* minimum and maximum code lengths */\n  var root = 0;              /* number of index bits for root table */\n  var curr = 0;              /* number of index bits for current table */\n  var drop = 0;              /* code bits to drop for sub-table */\n  var left = 0;                   /* number of prefix codes available */\n  var used = 0;              /* code entries in table used */\n  var huff = 0;              /* Huffman code */\n  var incr;              /* for incrementing code, index */\n  var fill;              /* index for replicating entries */\n  var low;               /* low bits for current root entry */\n  var mask;              /* mask for low root bits */\n  var next;             /* next available space in table */\n  var base = null;     /* base value table to use */\n  var base_index = 0;\n//  var shoextra;    /* extra bits table to use */\n  var end;                    /* use base and extra for symbol > end */\n  var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];    /* number of codes of each length */\n  var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1];     /* offsets in table for each length */\n  var extra = null;\n  var extra_index = 0;\n\n  var here_bits, here_op, here_val;\n\n  /*\n   Process a set of code lengths to create a canonical Huffman code.  The\n   code lengths are lens[0..codes-1].  Each length corresponds to the\n   symbols 0..codes-1.  The Huffman code is generated by first sorting the\n   symbols by length from short to long, and retaining the symbol order\n   for codes with equal lengths.  Then the code starts with all zero bits\n   for the first code of the shortest length, and the codes are integer\n   increments for the same length, and zeros are appended as the length\n   increases.  For the deflate format, these bits are stored backwards\n   from their more natural integer increment ordering, and so when the\n   decoding tables are built in the large loop below, the integer codes\n   are incremented backwards.\n\n   This routine assumes, but does not check, that all of the entries in\n   lens[] are in the range 0..MAXBITS.  The caller must assure this.\n   1..MAXBITS is interpreted as that code length.  zero means that that\n   symbol does not occur in this code.\n\n   The codes are sorted by computing a count of codes for each length,\n   creating from that a table of starting indices for each length in the\n   sorted table, and then entering the symbols in order in the sorted\n   table.  The sorted table is work[], with that space being provided by\n   the caller.\n\n   The length counts are used for other purposes as well, i.e. finding\n   the minimum and maximum length codes, determining if there are any\n   codes at all, checking for a valid set of lengths, and looking ahead\n   at length counts to determine sub-table sizes when building the\n   decoding tables.\n   */\n\n  /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\n  for (len = 0; len <= MAXBITS; len++) {\n    count[len] = 0;\n  }\n  for (sym = 0; sym < codes; sym++) {\n    count[lens[lens_index + sym]]++;\n  }\n\n  /* bound code lengths, force root to be within code lengths */\n  root = bits;\n  for (max = MAXBITS; max >= 1; max--) {\n    if (count[max] !== 0) { break; }\n  }\n  if (root > max) {\n    root = max;\n  }\n  if (max === 0) {                     /* no symbols to code at all */\n    //table.op[opts.table_index] = 64;  //here.op = (var char)64;    /* invalid code marker */\n    //table.bits[opts.table_index] = 1;   //here.bits = (var char)1;\n    //table.val[opts.table_index++] = 0;   //here.val = (var short)0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n\n    //table.op[opts.table_index] = 64;\n    //table.bits[opts.table_index] = 1;\n    //table.val[opts.table_index++] = 0;\n    table[table_index++] = (1 << 24) | (64 << 16) | 0;\n\n    opts.bits = 1;\n    return 0;     /* no symbols, but wait for decoding to report error */\n  }\n  for (min = 1; min < max; min++) {\n    if (count[min] !== 0) { break; }\n  }\n  if (root < min) {\n    root = min;\n  }\n\n  /* check for an over-subscribed or incomplete set of lengths */\n  left = 1;\n  for (len = 1; len <= MAXBITS; len++) {\n    left <<= 1;\n    left -= count[len];\n    if (left < 0) {\n      return -1;\n    }        /* over-subscribed */\n  }\n  if (left > 0 && (type === CODES || max !== 1)) {\n    return -1;                      /* incomplete set */\n  }\n\n  /* generate offsets into symbol table for each length for sorting */\n  offs[1] = 0;\n  for (len = 1; len < MAXBITS; len++) {\n    offs[len + 1] = offs[len] + count[len];\n  }\n\n  /* sort symbols by length, by symbol order within each length */\n  for (sym = 0; sym < codes; sym++) {\n    if (lens[lens_index + sym] !== 0) {\n      work[offs[lens[lens_index + sym]]++] = sym;\n    }\n  }\n\n  /*\n   Create and fill in decoding tables.  In this loop, the table being\n   filled is at next and has curr index bits.  The code being used is huff\n   with length len.  That code is converted to an index by dropping drop\n   bits off of the bottom.  For codes where len is less than drop + curr,\n   those top drop + curr - len bits are incremented through all values to\n   fill the table with replicated entries.\n\n   root is the number of index bits for the root table.  When len exceeds\n   root, sub-tables are created pointed to by the root entry with an index\n   of the low root bits of huff.  This is saved in low to check for when a\n   new sub-table should be started.  drop is zero when the root table is\n   being filled, and drop is root when sub-tables are being filled.\n\n   When a new sub-table is needed, it is necessary to look ahead in the\n   code lengths to determine what size sub-table is needed.  The length\n   counts are used for this, and so count[] is decremented as codes are\n   entered in the tables.\n\n   used keeps track of how many table entries have been allocated from the\n   provided *table space.  It is checked for LENS and DIST tables against\n   the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\n   the initial root table size constants.  See the comments in inftrees.h\n   for more information.\n\n   sym increments through all symbols, and the loop terminates when\n   all codes of length max, i.e. all codes, have been processed.  This\n   routine permits incomplete codes, so another loop after this one fills\n   in the rest of the decoding tables with invalid code markers.\n   */\n\n  /* set up for code type */\n  // poor man optimization - use if-else instead of switch,\n  // to avoid deopts in old v8\n  if (type === CODES) {\n    base = extra = work;    /* dummy value--not used */\n    end = 19;\n\n  } else if (type === LENS) {\n    base = lbase;\n    base_index -= 257;\n    extra = lext;\n    extra_index -= 257;\n    end = 256;\n\n  } else {                    /* DISTS */\n    base = dbase;\n    extra = dext;\n    end = -1;\n  }\n\n  /* initialize opts for loop */\n  huff = 0;                   /* starting code */\n  sym = 0;                    /* starting code symbol */\n  len = min;                  /* starting code length */\n  next = table_index;              /* current table to fill in */\n  curr = root;                /* current table index bits */\n  drop = 0;                   /* current bits to drop from code for index */\n  low = -1;                   /* trigger new sub-table when len > root */\n  used = 1 << root;          /* use root table entries */\n  mask = used - 1;            /* mask for comparing low */\n\n  /* check available table space */\n  if ((type === LENS && used > ENOUGH_LENS) ||\n    (type === DISTS && used > ENOUGH_DISTS)) {\n    return 1;\n  }\n\n  /* process all codes and make table entries */\n  for (;;) {\n    /* create table entry */\n    here_bits = len - drop;\n    if (work[sym] < end) {\n      here_op = 0;\n      here_val = work[sym];\n    }\n    else if (work[sym] > end) {\n      here_op = extra[extra_index + work[sym]];\n      here_val = base[base_index + work[sym]];\n    }\n    else {\n      here_op = 32 + 64;         /* end of block */\n      here_val = 0;\n    }\n\n    /* replicate for those indices with low len bits equal to huff */\n    incr = 1 << (len - drop);\n    fill = 1 << curr;\n    min = fill;                 /* save offset to next table */\n    do {\n      fill -= incr;\n      table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0;\n    } while (fill !== 0);\n\n    /* backwards increment the len-bit code huff */\n    incr = 1 << (len - 1);\n    while (huff & incr) {\n      incr >>= 1;\n    }\n    if (incr !== 0) {\n      huff &= incr - 1;\n      huff += incr;\n    } else {\n      huff = 0;\n    }\n\n    /* go to next symbol, update count, len */\n    sym++;\n    if (--count[len] === 0) {\n      if (len === max) { break; }\n      len = lens[lens_index + work[sym]];\n    }\n\n    /* create new sub-table if needed */\n    if (len > root && (huff & mask) !== low) {\n      /* if first time, transition to sub-tables */\n      if (drop === 0) {\n        drop = root;\n      }\n\n      /* increment past last table */\n      next += min;            /* here min is 1 << curr */\n\n      /* determine length of next table */\n      curr = len - drop;\n      left = 1 << curr;\n      while (curr + drop < max) {\n        left -= count[curr + drop];\n        if (left <= 0) { break; }\n        curr++;\n        left <<= 1;\n      }\n\n      /* check for enough space */\n      used += 1 << curr;\n      if ((type === LENS && used > ENOUGH_LENS) ||\n        (type === DISTS && used > ENOUGH_DISTS)) {\n        return 1;\n      }\n\n      /* point entry in root table to sub-table */\n      low = huff & mask;\n      /*table.op[low] = curr;\n      table.bits[low] = root;\n      table.val[low] = next - opts.table_index;*/\n      table[low] = (root << 24) | (curr << 16) | (next - table_index) |0;\n    }\n  }\n\n  /* fill in remaining table entry if code is incomplete (guaranteed to have\n   at most one remaining entry, since if the code is incomplete, the\n   maximum code length that was allowed to get this far is one bit) */\n  if (huff !== 0) {\n    //table.op[next + huff] = 64;            /* invalid code marker */\n    //table.bits[next + huff] = len - drop;\n    //table.val[next + huff] = 0;\n    table[next + huff] = ((len - drop) << 24) | (64 << 16) |0;\n  }\n\n  /* set return parameters */\n  //opts.table_index += used;\n  opts.bits = root;\n  return 0;\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nmodule.exports = {\n  2:      'need dictionary',     /* Z_NEED_DICT       2  */\n  1:      'stream end',          /* Z_STREAM_END      1  */\n  0:      '',                    /* Z_OK              0  */\n  '-1':   'file error',          /* Z_ERRNO         (-1) */\n  '-2':   'stream error',        /* Z_STREAM_ERROR  (-2) */\n  '-3':   'data error',          /* Z_DATA_ERROR    (-3) */\n  '-4':   'insufficient memory', /* Z_MEM_ERROR     (-4) */\n  '-5':   'buffer error',        /* Z_BUF_ERROR     (-5) */\n  '-6':   'incompatible version' /* Z_VERSION_ERROR (-6) */\n};\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\n/* eslint-disable space-unary-ops */\n\nvar utils = require('../utils/common');\n\n/* Public constants ==========================================================*/\n/* ===========================================================================*/\n\n\n//var Z_FILTERED          = 1;\n//var Z_HUFFMAN_ONLY      = 2;\n//var Z_RLE               = 3;\nvar Z_FIXED               = 4;\n//var Z_DEFAULT_STRATEGY  = 0;\n\n/* Possible values of the data_type field (though see inflate()) */\nvar Z_BINARY              = 0;\nvar Z_TEXT                = 1;\n//var Z_ASCII             = 1; // = Z_TEXT\nvar Z_UNKNOWN             = 2;\n\n/*============================================================================*/\n\n\nfunction zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } }\n\n// From zutil.h\n\nvar STORED_BLOCK = 0;\nvar STATIC_TREES = 1;\nvar DYN_TREES    = 2;\n/* The three kinds of block type */\n\nvar MIN_MATCH    = 3;\nvar MAX_MATCH    = 258;\n/* The minimum and maximum match lengths */\n\n// From deflate.h\n/* ===========================================================================\n * Internal compression state.\n */\n\nvar LENGTH_CODES  = 29;\n/* number of length codes, not counting the special END_BLOCK code */\n\nvar LITERALS      = 256;\n/* number of literal bytes 0..255 */\n\nvar L_CODES       = LITERALS + 1 + LENGTH_CODES;\n/* number of Literal or Length codes, including the END_BLOCK code */\n\nvar D_CODES       = 30;\n/* number of distance codes */\n\nvar BL_CODES      = 19;\n/* number of codes used to transfer the bit lengths */\n\nvar HEAP_SIZE     = 2 * L_CODES + 1;\n/* maximum heap size */\n\nvar MAX_BITS      = 15;\n/* All codes must not exceed MAX_BITS bits */\n\nvar Buf_size      = 16;\n/* size of bit buffer in bi_buf */\n\n\n/* ===========================================================================\n * Constants\n */\n\nvar MAX_BL_BITS = 7;\n/* Bit length codes must not exceed MAX_BL_BITS bits */\n\nvar END_BLOCK   = 256;\n/* end of block literal code */\n\nvar REP_3_6     = 16;\n/* repeat previous bit length 3-6 times (2 bits of repeat count) */\n\nvar REPZ_3_10   = 17;\n/* repeat a zero length 3-10 times  (3 bits of repeat count) */\n\nvar REPZ_11_138 = 18;\n/* repeat a zero length 11-138 times  (7 bits of repeat count) */\n\n/* eslint-disable comma-spacing,array-bracket-spacing */\nvar extra_lbits =   /* extra bits for each length code */\n  [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0];\n\nvar extra_dbits =   /* extra bits for each distance code */\n  [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13];\n\nvar extra_blbits =  /* extra bits for each bit length code */\n  [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7];\n\nvar bl_order =\n  [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15];\n/* eslint-enable comma-spacing,array-bracket-spacing */\n\n/* The lengths of the bit length codes are sent in order of decreasing\n * probability, to avoid transmitting the lengths for unused bit length codes.\n */\n\n/* ===========================================================================\n * Local data. These are initialized only once.\n */\n\n// We pre-fill arrays with 0 to avoid uninitialized gaps\n\nvar DIST_CODE_LEN = 512; /* see definition of array dist_code below */\n\n// !!!! Use flat array instead of structure, Freq = i*2, Len = i*2+1\nvar static_ltree  = new Array((L_CODES + 2) * 2);\nzero(static_ltree);\n/* The static literal tree. Since the bit lengths are imposed, there is no\n * need for the L_CODES extra codes used during heap construction. However\n * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\n * below).\n */\n\nvar static_dtree  = new Array(D_CODES * 2);\nzero(static_dtree);\n/* The static distance tree. (Actually a trivial tree since all codes use\n * 5 bits.)\n */\n\nvar _dist_code    = new Array(DIST_CODE_LEN);\nzero(_dist_code);\n/* Distance codes. The first 256 values correspond to the distances\n * 3 .. 258, the last 256 values correspond to the top 8 bits of\n * the 15 bit distances.\n */\n\nvar _length_code  = new Array(MAX_MATCH - MIN_MATCH + 1);\nzero(_length_code);\n/* length code for each normalized match length (0 == MIN_MATCH) */\n\nvar base_length   = new Array(LENGTH_CODES);\nzero(base_length);\n/* First normalized length for each code (0 = MIN_MATCH) */\n\nvar base_dist     = new Array(D_CODES);\nzero(base_dist);\n/* First normalized distance for each code (0 = distance of 1) */\n\n\nfunction StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) {\n\n  this.static_tree  = static_tree;  /* static tree or NULL */\n  this.extra_bits   = extra_bits;   /* extra bits for each code or NULL */\n  this.extra_base   = extra_base;   /* base index for extra_bits */\n  this.elems        = elems;        /* max number of elements in the tree */\n  this.max_length   = max_length;   /* max bit length for the codes */\n\n  // show if `static_tree` has data or dummy - needed for monomorphic objects\n  this.has_stree    = static_tree && static_tree.length;\n}\n\n\nvar static_l_desc;\nvar static_d_desc;\nvar static_bl_desc;\n\n\nfunction TreeDesc(dyn_tree, stat_desc) {\n  this.dyn_tree = dyn_tree;     /* the dynamic tree */\n  this.max_code = 0;            /* largest code with non zero frequency */\n  this.stat_desc = stat_desc;   /* the corresponding static tree */\n}\n\n\n\nfunction d_code(dist) {\n  return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)];\n}\n\n\n/* ===========================================================================\n * Output a short LSB first on the stream.\n * IN assertion: there is enough room in pendingBuf.\n */\nfunction put_short(s, w) {\n//    put_byte(s, (uch)((w) & 0xff));\n//    put_byte(s, (uch)((ush)(w) >> 8));\n  s.pending_buf[s.pending++] = (w) & 0xff;\n  s.pending_buf[s.pending++] = (w >>> 8) & 0xff;\n}\n\n\n/* ===========================================================================\n * Send a value on a given number of bits.\n * IN assertion: length <= 16 and value fits in length bits.\n */\nfunction send_bits(s, value, length) {\n  if (s.bi_valid > (Buf_size - length)) {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    put_short(s, s.bi_buf);\n    s.bi_buf = value >> (Buf_size - s.bi_valid);\n    s.bi_valid += length - Buf_size;\n  } else {\n    s.bi_buf |= (value << s.bi_valid) & 0xffff;\n    s.bi_valid += length;\n  }\n}\n\n\nfunction send_code(s, c, tree) {\n  send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/);\n}\n\n\n/* ===========================================================================\n * Reverse the first len bits of a code, using straightforward code (a faster\n * method would use a table)\n * IN assertion: 1 <= len <= 15\n */\nfunction bi_reverse(code, len) {\n  var res = 0;\n  do {\n    res |= code & 1;\n    code >>>= 1;\n    res <<= 1;\n  } while (--len > 0);\n  return res >>> 1;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer, keeping at most 7 bits in it.\n */\nfunction bi_flush(s) {\n  if (s.bi_valid === 16) {\n    put_short(s, s.bi_buf);\n    s.bi_buf = 0;\n    s.bi_valid = 0;\n\n  } else if (s.bi_valid >= 8) {\n    s.pending_buf[s.pending++] = s.bi_buf & 0xff;\n    s.bi_buf >>= 8;\n    s.bi_valid -= 8;\n  }\n}\n\n\n/* ===========================================================================\n * Compute the optimal bit lengths for a tree and update the total bit length\n * for the current block.\n * IN assertion: the fields freq and dad are set, heap[heap_max] and\n *    above are the tree nodes sorted by increasing frequency.\n * OUT assertions: the field len is set to the optimal bit length, the\n *     array bl_count contains the frequencies for each bit length.\n *     The length opt_len is updated; static_len is also updated if stree is\n *     not null.\n */\nfunction gen_bitlen(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc;    /* the tree descriptor */\n{\n  var tree            = desc.dyn_tree;\n  var max_code        = desc.max_code;\n  var stree           = desc.stat_desc.static_tree;\n  var has_stree       = desc.stat_desc.has_stree;\n  var extra           = desc.stat_desc.extra_bits;\n  var base            = desc.stat_desc.extra_base;\n  var max_length      = desc.stat_desc.max_length;\n  var h;              /* heap index */\n  var n, m;           /* iterate over the tree elements */\n  var bits;           /* bit length */\n  var xbits;          /* extra bits */\n  var f;              /* frequency */\n  var overflow = 0;   /* number of elements with bit length too large */\n\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    s.bl_count[bits] = 0;\n  }\n\n  /* In a first pass, compute the optimal bit lengths (which may\n   * overflow in the case of the bit length tree).\n   */\n  tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */\n\n  for (h = s.heap_max + 1; h < HEAP_SIZE; h++) {\n    n = s.heap[h];\n    bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1;\n    if (bits > max_length) {\n      bits = max_length;\n      overflow++;\n    }\n    tree[n * 2 + 1]/*.Len*/ = bits;\n    /* We overwrite tree[n].Dad which is no longer needed */\n\n    if (n > max_code) { continue; } /* not a leaf node */\n\n    s.bl_count[bits]++;\n    xbits = 0;\n    if (n >= base) {\n      xbits = extra[n - base];\n    }\n    f = tree[n * 2]/*.Freq*/;\n    s.opt_len += f * (bits + xbits);\n    if (has_stree) {\n      s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits);\n    }\n  }\n  if (overflow === 0) { return; }\n\n  // Trace((stderr,\"\\nbit length overflow\\n\"));\n  /* This happens for example on obj2 and pic of the Calgary corpus */\n\n  /* Find the first bit length which could increase: */\n  do {\n    bits = max_length - 1;\n    while (s.bl_count[bits] === 0) { bits--; }\n    s.bl_count[bits]--;      /* move one leaf down the tree */\n    s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */\n    s.bl_count[max_length]--;\n    /* The brother of the overflow item also moves one step up,\n     * but this does not affect bl_count[max_length]\n     */\n    overflow -= 2;\n  } while (overflow > 0);\n\n  /* Now recompute all bit lengths, scanning in increasing frequency.\n   * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\n   * lengths instead of fixing only the wrong ones. This idea is taken\n   * from 'ar' written by Haruhiko Okumura.)\n   */\n  for (bits = max_length; bits !== 0; bits--) {\n    n = s.bl_count[bits];\n    while (n !== 0) {\n      m = s.heap[--h];\n      if (m > max_code) { continue; }\n      if (tree[m * 2 + 1]/*.Len*/ !== bits) {\n        // Trace((stderr,\"code %d bits %d->%d\\n\", m, tree[m].Len, bits));\n        s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/;\n        tree[m * 2 + 1]/*.Len*/ = bits;\n      }\n      n--;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Generate the codes for a given tree and bit counts (which need not be\n * optimal).\n * IN assertion: the array bl_count contains the bit length statistics for\n * the given tree and the field len is set for all tree elements.\n * OUT assertion: the field code is set for all tree elements of non\n *     zero code length.\n */\nfunction gen_codes(tree, max_code, bl_count)\n//    ct_data *tree;             /* the tree to decorate */\n//    int max_code;              /* largest code with non zero frequency */\n//    ushf *bl_count;            /* number of codes at each bit length */\n{\n  var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */\n  var code = 0;              /* running code value */\n  var bits;                  /* bit index */\n  var n;                     /* code index */\n\n  /* The distribution counts are first used to generate the code values\n   * without bit reversal.\n   */\n  for (bits = 1; bits <= MAX_BITS; bits++) {\n    next_code[bits] = code = (code + bl_count[bits - 1]) << 1;\n  }\n  /* Check that the bit counts in bl_count are consistent. The last code\n   * must be all ones.\n   */\n  //Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\n  //        \"inconsistent bit counts\");\n  //Tracev((stderr,\"\\ngen_codes: max_code %d \", max_code));\n\n  for (n = 0;  n <= max_code; n++) {\n    var len = tree[n * 2 + 1]/*.Len*/;\n    if (len === 0) { continue; }\n    /* Now reverse the bits */\n    tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len);\n\n    //Tracecv(tree != static_ltree, (stderr,\"\\nn %3d %c l %2d c %4x (%x) \",\n    //     n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\n  }\n}\n\n\n/* ===========================================================================\n * Initialize the various 'constant' tables.\n */\nfunction tr_static_init() {\n  var n;        /* iterates over tree elements */\n  var bits;     /* bit counter */\n  var length;   /* length value */\n  var code;     /* code value */\n  var dist;     /* distance index */\n  var bl_count = new Array(MAX_BITS + 1);\n  /* number of codes at each bit length for an optimal tree */\n\n  // do check in _tr_init()\n  //if (static_init_done) return;\n\n  /* For some embedded targets, global variables are not initialized: */\n/*#ifdef NO_INIT_GLOBAL_POINTERS\n  static_l_desc.static_tree = static_ltree;\n  static_l_desc.extra_bits = extra_lbits;\n  static_d_desc.static_tree = static_dtree;\n  static_d_desc.extra_bits = extra_dbits;\n  static_bl_desc.extra_bits = extra_blbits;\n#endif*/\n\n  /* Initialize the mapping length (0..255) -> length code (0..28) */\n  length = 0;\n  for (code = 0; code < LENGTH_CODES - 1; code++) {\n    base_length[code] = length;\n    for (n = 0; n < (1 << extra_lbits[code]); n++) {\n      _length_code[length++] = code;\n    }\n  }\n  //Assert (length == 256, \"tr_static_init: length != 256\");\n  /* Note that the length 255 (match length 258) can be represented\n   * in two different ways: code 284 + 5 bits or code 285, so we\n   * overwrite length_code[255] to use the best encoding:\n   */\n  _length_code[length - 1] = code;\n\n  /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\n  dist = 0;\n  for (code = 0; code < 16; code++) {\n    base_dist[code] = dist;\n    for (n = 0; n < (1 << extra_dbits[code]); n++) {\n      _dist_code[dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: dist != 256\");\n  dist >>= 7; /* from now on, all distances are divided by 128 */\n  for (; code < D_CODES; code++) {\n    base_dist[code] = dist << 7;\n    for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) {\n      _dist_code[256 + dist++] = code;\n    }\n  }\n  //Assert (dist == 256, \"tr_static_init: 256+dist != 512\");\n\n  /* Construct the codes of the static literal tree */\n  for (bits = 0; bits <= MAX_BITS; bits++) {\n    bl_count[bits] = 0;\n  }\n\n  n = 0;\n  while (n <= 143) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  while (n <= 255) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 9;\n    n++;\n    bl_count[9]++;\n  }\n  while (n <= 279) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 7;\n    n++;\n    bl_count[7]++;\n  }\n  while (n <= 287) {\n    static_ltree[n * 2 + 1]/*.Len*/ = 8;\n    n++;\n    bl_count[8]++;\n  }\n  /* Codes 286 and 287 do not exist, but we must include them in the\n   * tree construction to get a canonical Huffman tree (longest code\n   * all ones)\n   */\n  gen_codes(static_ltree, L_CODES + 1, bl_count);\n\n  /* The static distance tree is trivial: */\n  for (n = 0; n < D_CODES; n++) {\n    static_dtree[n * 2 + 1]/*.Len*/ = 5;\n    static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5);\n  }\n\n  // Now data ready and we can init static trees\n  static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS);\n  static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS);\n  static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0,         BL_CODES, MAX_BL_BITS);\n\n  //static_init_done = true;\n}\n\n\n/* ===========================================================================\n * Initialize a new block.\n */\nfunction init_block(s) {\n  var n; /* iterates over tree elements */\n\n  /* Initialize the trees. */\n  for (n = 0; n < L_CODES;  n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < D_CODES;  n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; }\n  for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; }\n\n  s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1;\n  s.opt_len = s.static_len = 0;\n  s.last_lit = s.matches = 0;\n}\n\n\n/* ===========================================================================\n * Flush the bit buffer and align the output on a byte boundary\n */\nfunction bi_windup(s)\n{\n  if (s.bi_valid > 8) {\n    put_short(s, s.bi_buf);\n  } else if (s.bi_valid > 0) {\n    //put_byte(s, (Byte)s->bi_buf);\n    s.pending_buf[s.pending++] = s.bi_buf;\n  }\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n}\n\n/* ===========================================================================\n * Copy a stored block, storing first the length and its\n * one's complement if requested.\n */\nfunction copy_block(s, buf, len, header)\n//DeflateState *s;\n//charf    *buf;    /* the input data */\n//unsigned len;     /* its length */\n//int      header;  /* true if block header must be written */\n{\n  bi_windup(s);        /* align on byte boundary */\n\n  if (header) {\n    put_short(s, len);\n    put_short(s, ~len);\n  }\n//  while (len--) {\n//    put_byte(s, *buf++);\n//  }\n  utils.arraySet(s.pending_buf, s.window, buf, len, s.pending);\n  s.pending += len;\n}\n\n/* ===========================================================================\n * Compares to subtrees, using the tree depth as tie breaker when\n * the subtrees have equal frequency. This minimizes the worst case length.\n */\nfunction smaller(tree, n, m, depth) {\n  var _n2 = n * 2;\n  var _m2 = m * 2;\n  return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ ||\n         (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m]));\n}\n\n/* ===========================================================================\n * Restore the heap property by moving down the tree starting at node k,\n * exchanging a node with the smallest of its two sons if necessary, stopping\n * when the heap property is re-established (each father smaller than its\n * two sons).\n */\nfunction pqdownheap(s, tree, k)\n//    deflate_state *s;\n//    ct_data *tree;  /* the tree to restore */\n//    int k;               /* node to move down */\n{\n  var v = s.heap[k];\n  var j = k << 1;  /* left son of k */\n  while (j <= s.heap_len) {\n    /* Set j to the smallest of the two sons: */\n    if (j < s.heap_len &&\n      smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) {\n      j++;\n    }\n    /* Exit if v is smaller than both sons */\n    if (smaller(tree, v, s.heap[j], s.depth)) { break; }\n\n    /* Exchange v with the smallest son */\n    s.heap[k] = s.heap[j];\n    k = j;\n\n    /* And continue down the tree, setting j to the left son of k */\n    j <<= 1;\n  }\n  s.heap[k] = v;\n}\n\n\n// inlined manually\n// var SMALLEST = 1;\n\n/* ===========================================================================\n * Send the block data compressed using the given Huffman trees\n */\nfunction compress_block(s, ltree, dtree)\n//    deflate_state *s;\n//    const ct_data *ltree; /* literal tree */\n//    const ct_data *dtree; /* distance tree */\n{\n  var dist;           /* distance of matched string */\n  var lc;             /* match length or unmatched char (if dist == 0) */\n  var lx = 0;         /* running index in l_buf */\n  var code;           /* the code to send */\n  var extra;          /* number of extra bits to send */\n\n  if (s.last_lit !== 0) {\n    do {\n      dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]);\n      lc = s.pending_buf[s.l_buf + lx];\n      lx++;\n\n      if (dist === 0) {\n        send_code(s, lc, ltree); /* send a literal byte */\n        //Tracecv(isgraph(lc), (stderr,\" '%c' \", lc));\n      } else {\n        /* Here, lc is the match length - MIN_MATCH */\n        code = _length_code[lc];\n        send_code(s, code + LITERALS + 1, ltree); /* send the length code */\n        extra = extra_lbits[code];\n        if (extra !== 0) {\n          lc -= base_length[code];\n          send_bits(s, lc, extra);       /* send the extra length bits */\n        }\n        dist--; /* dist is now the match distance - 1 */\n        code = d_code(dist);\n        //Assert (code < D_CODES, \"bad d_code\");\n\n        send_code(s, code, dtree);       /* send the distance code */\n        extra = extra_dbits[code];\n        if (extra !== 0) {\n          dist -= base_dist[code];\n          send_bits(s, dist, extra);   /* send the extra distance bits */\n        }\n      } /* literal or match pair ? */\n\n      /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\n      //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\n      //       \"pendingBuf overflow\");\n\n    } while (lx < s.last_lit);\n  }\n\n  send_code(s, END_BLOCK, ltree);\n}\n\n\n/* ===========================================================================\n * Construct one Huffman tree and assigns the code bit strings and lengths.\n * Update the total bit length for the current block.\n * IN assertion: the field freq is set for all tree elements.\n * OUT assertions: the fields len and code are set to the optimal bit length\n *     and corresponding code. The length opt_len is updated; static_len is\n *     also updated if stree is not null. The field max_code is set.\n */\nfunction build_tree(s, desc)\n//    deflate_state *s;\n//    tree_desc *desc; /* the tree descriptor */\n{\n  var tree     = desc.dyn_tree;\n  var stree    = desc.stat_desc.static_tree;\n  var has_stree = desc.stat_desc.has_stree;\n  var elems    = desc.stat_desc.elems;\n  var n, m;          /* iterate over heap elements */\n  var max_code = -1; /* largest code with non zero frequency */\n  var node;          /* new node being created */\n\n  /* Construct the initial heap, with least frequent element in\n   * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\n   * heap[0] is not used.\n   */\n  s.heap_len = 0;\n  s.heap_max = HEAP_SIZE;\n\n  for (n = 0; n < elems; n++) {\n    if (tree[n * 2]/*.Freq*/ !== 0) {\n      s.heap[++s.heap_len] = max_code = n;\n      s.depth[n] = 0;\n\n    } else {\n      tree[n * 2 + 1]/*.Len*/ = 0;\n    }\n  }\n\n  /* The pkzip format requires that at least one distance code exists,\n   * and that at least one bit should be sent even if there is only one\n   * possible code. So to avoid special checks later on we force at least\n   * two codes of non zero frequency.\n   */\n  while (s.heap_len < 2) {\n    node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0);\n    tree[node * 2]/*.Freq*/ = 1;\n    s.depth[node] = 0;\n    s.opt_len--;\n\n    if (has_stree) {\n      s.static_len -= stree[node * 2 + 1]/*.Len*/;\n    }\n    /* node is 0 or 1 so it does not have extra bits */\n  }\n  desc.max_code = max_code;\n\n  /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\n   * establish sub-heaps of increasing lengths:\n   */\n  for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); }\n\n  /* Construct the Huffman tree by repeatedly combining the least two\n   * frequent nodes.\n   */\n  node = elems;              /* next internal node of the tree */\n  do {\n    //pqremove(s, tree, n);  /* n = node of least frequency */\n    /*** pqremove ***/\n    n = s.heap[1/*SMALLEST*/];\n    s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--];\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n    /***/\n\n    m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */\n\n    s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */\n    s.heap[--s.heap_max] = m;\n\n    /* Create a new node father of n and m */\n    tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/;\n    s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1;\n    tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node;\n\n    /* and insert the new node in the heap */\n    s.heap[1/*SMALLEST*/] = node++;\n    pqdownheap(s, tree, 1/*SMALLEST*/);\n\n  } while (s.heap_len >= 2);\n\n  s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/];\n\n  /* At this point, the fields freq and dad are set. We can now\n   * generate the bit lengths.\n   */\n  gen_bitlen(s, desc);\n\n  /* The field len is now set, we can generate the bit codes */\n  gen_codes(tree, max_code, s.bl_count);\n}\n\n\n/* ===========================================================================\n * Scan a literal or distance tree to determine the frequencies of the codes\n * in the bit length tree.\n */\nfunction scan_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree;   /* the tree to be scanned */\n//    int max_code;    /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n  tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      s.bl_tree[curlen * 2]/*.Freq*/ += count;\n\n    } else if (curlen !== 0) {\n\n      if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; }\n      s.bl_tree[REP_3_6 * 2]/*.Freq*/++;\n\n    } else if (count <= 10) {\n      s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++;\n\n    } else {\n      s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++;\n    }\n\n    count = 0;\n    prevlen = curlen;\n\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Send a literal or distance tree in compressed form, using the codes in\n * bl_tree.\n */\nfunction send_tree(s, tree, max_code)\n//    deflate_state *s;\n//    ct_data *tree; /* the tree to be scanned */\n//    int max_code;       /* and its largest code of non zero frequency */\n{\n  var n;                     /* iterates over all tree elements */\n  var prevlen = -1;          /* last emitted length */\n  var curlen;                /* length of current code */\n\n  var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */\n\n  var count = 0;             /* repeat count of the current code */\n  var max_count = 7;         /* max repeat count */\n  var min_count = 4;         /* min repeat count */\n\n  /* tree[max_code+1].Len = -1; */  /* guard already set */\n  if (nextlen === 0) {\n    max_count = 138;\n    min_count = 3;\n  }\n\n  for (n = 0; n <= max_code; n++) {\n    curlen = nextlen;\n    nextlen = tree[(n + 1) * 2 + 1]/*.Len*/;\n\n    if (++count < max_count && curlen === nextlen) {\n      continue;\n\n    } else if (count < min_count) {\n      do { send_code(s, curlen, s.bl_tree); } while (--count !== 0);\n\n    } else if (curlen !== 0) {\n      if (curlen !== prevlen) {\n        send_code(s, curlen, s.bl_tree);\n        count--;\n      }\n      //Assert(count >= 3 && count <= 6, \" 3_6?\");\n      send_code(s, REP_3_6, s.bl_tree);\n      send_bits(s, count - 3, 2);\n\n    } else if (count <= 10) {\n      send_code(s, REPZ_3_10, s.bl_tree);\n      send_bits(s, count - 3, 3);\n\n    } else {\n      send_code(s, REPZ_11_138, s.bl_tree);\n      send_bits(s, count - 11, 7);\n    }\n\n    count = 0;\n    prevlen = curlen;\n    if (nextlen === 0) {\n      max_count = 138;\n      min_count = 3;\n\n    } else if (curlen === nextlen) {\n      max_count = 6;\n      min_count = 3;\n\n    } else {\n      max_count = 7;\n      min_count = 4;\n    }\n  }\n}\n\n\n/* ===========================================================================\n * Construct the Huffman tree for the bit lengths and return the index in\n * bl_order of the last bit length code to send.\n */\nfunction build_bl_tree(s) {\n  var max_blindex;  /* index of last bit length code of non zero freq */\n\n  /* Determine the bit length frequencies for literal and distance trees */\n  scan_tree(s, s.dyn_ltree, s.l_desc.max_code);\n  scan_tree(s, s.dyn_dtree, s.d_desc.max_code);\n\n  /* Build the bit length tree: */\n  build_tree(s, s.bl_desc);\n  /* opt_len now includes the length of the tree representations, except\n   * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\n   */\n\n  /* Determine the number of bit length codes to send. The pkzip format\n   * requires that at least 4 bit length codes be sent. (appnote.txt says\n   * 3 but the actual value used is 4.)\n   */\n  for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) {\n    if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) {\n      break;\n    }\n  }\n  /* Update opt_len to include the bit length tree and counts */\n  s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4;\n  //Tracev((stderr, \"\\ndyn trees: dyn %ld, stat %ld\",\n  //        s->opt_len, s->static_len));\n\n  return max_blindex;\n}\n\n\n/* ===========================================================================\n * Send the header for a block using dynamic Huffman trees: the counts, the\n * lengths of the bit length codes, the literal tree and the distance tree.\n * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\n */\nfunction send_all_trees(s, lcodes, dcodes, blcodes)\n//    deflate_state *s;\n//    int lcodes, dcodes, blcodes; /* number of codes for each tree */\n{\n  var rank;                    /* index in bl_order */\n\n  //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, \"not enough codes\");\n  //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\n  //        \"too many codes\");\n  //Tracev((stderr, \"\\nbl counts: \"));\n  send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */\n  send_bits(s, dcodes - 1,   5);\n  send_bits(s, blcodes - 4,  4); /* not -3 as stated in appnote.txt */\n  for (rank = 0; rank < blcodes; rank++) {\n    //Tracev((stderr, \"\\nbl code %2d \", bl_order[rank]));\n    send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3);\n  }\n  //Tracev((stderr, \"\\nbl tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */\n  //Tracev((stderr, \"\\nlit tree: sent %ld\", s->bits_sent));\n\n  send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */\n  //Tracev((stderr, \"\\ndist tree: sent %ld\", s->bits_sent));\n}\n\n\n/* ===========================================================================\n * Check if the data type is TEXT or BINARY, using the following algorithm:\n * - TEXT if the two conditions below are satisfied:\n *    a) There are no non-portable control characters belonging to the\n *       \"black list\" (0..6, 14..25, 28..31).\n *    b) There is at least one printable character belonging to the\n *       \"white list\" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\n * - BINARY otherwise.\n * - The following partially-portable control characters form a\n *   \"gray list\" that is ignored in this detection algorithm:\n *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\n * IN assertion: the fields Freq of dyn_ltree are set.\n */\nfunction detect_data_type(s) {\n  /* black_mask is the bit mask of black-listed bytes\n   * set bits 0..6, 14..25, and 28..31\n   * 0xf3ffc07f = binary 11110011111111111100000001111111\n   */\n  var black_mask = 0xf3ffc07f;\n  var n;\n\n  /* Check for non-textual (\"black-listed\") bytes. */\n  for (n = 0; n <= 31; n++, black_mask >>>= 1) {\n    if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) {\n      return Z_BINARY;\n    }\n  }\n\n  /* Check for textual (\"white-listed\") bytes. */\n  if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 ||\n      s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) {\n    return Z_TEXT;\n  }\n  for (n = 32; n < LITERALS; n++) {\n    if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) {\n      return Z_TEXT;\n    }\n  }\n\n  /* There are no \"black-listed\" or \"white-listed\" bytes:\n   * this stream either is empty or has tolerated (\"gray-listed\") bytes only.\n   */\n  return Z_BINARY;\n}\n\n\nvar static_init_done = false;\n\n/* ===========================================================================\n * Initialize the tree data structures for a new zlib stream.\n */\nfunction _tr_init(s)\n{\n\n  if (!static_init_done) {\n    tr_static_init();\n    static_init_done = true;\n  }\n\n  s.l_desc  = new TreeDesc(s.dyn_ltree, static_l_desc);\n  s.d_desc  = new TreeDesc(s.dyn_dtree, static_d_desc);\n  s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc);\n\n  s.bi_buf = 0;\n  s.bi_valid = 0;\n\n  /* Initialize the first block of the first file: */\n  init_block(s);\n}\n\n\n/* ===========================================================================\n * Send a stored block\n */\nfunction _tr_stored_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3);    /* send block type */\n  copy_block(s, buf, stored_len, true); /* with header */\n}\n\n\n/* ===========================================================================\n * Send one empty static block to give enough lookahead for inflate.\n * This takes 10 bits, of which 7 may remain in the bit buffer.\n */\nfunction _tr_align(s) {\n  send_bits(s, STATIC_TREES << 1, 3);\n  send_code(s, END_BLOCK, static_ltree);\n  bi_flush(s);\n}\n\n\n/* ===========================================================================\n * Determine the best encoding for the current block: dynamic trees, static\n * trees or store, and output the encoded block to the zip file.\n */\nfunction _tr_flush_block(s, buf, stored_len, last)\n//DeflateState *s;\n//charf *buf;       /* input block, or NULL if too old */\n//ulg stored_len;   /* length of input block */\n//int last;         /* one if this is the last block for a file */\n{\n  var opt_lenb, static_lenb;  /* opt_len and static_len in bytes */\n  var max_blindex = 0;        /* index of last bit length code of non zero freq */\n\n  /* Build the Huffman trees unless a stored block is forced */\n  if (s.level > 0) {\n\n    /* Check if the file is binary or text */\n    if (s.strm.data_type === Z_UNKNOWN) {\n      s.strm.data_type = detect_data_type(s);\n    }\n\n    /* Construct the literal and distance trees */\n    build_tree(s, s.l_desc);\n    // Tracev((stderr, \"\\nlit data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n\n    build_tree(s, s.d_desc);\n    // Tracev((stderr, \"\\ndist data: dyn %ld, stat %ld\", s->opt_len,\n    //        s->static_len));\n    /* At this point, opt_len and static_len are the total bit lengths of\n     * the compressed block data, excluding the tree representations.\n     */\n\n    /* Build the bit length tree for the above two trees, and get the index\n     * in bl_order of the last bit length code to send.\n     */\n    max_blindex = build_bl_tree(s);\n\n    /* Determine the best encoding. Compute the block lengths in bytes. */\n    opt_lenb = (s.opt_len + 3 + 7) >>> 3;\n    static_lenb = (s.static_len + 3 + 7) >>> 3;\n\n    // Tracev((stderr, \"\\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u \",\n    //        opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\n    //        s->last_lit));\n\n    if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; }\n\n  } else {\n    // Assert(buf != (char*)0, \"lost buf\");\n    opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\n  }\n\n  if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) {\n    /* 4: two words for the lengths */\n\n    /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\n     * Otherwise we can't have processed more than WSIZE input bytes since\n     * the last block flush, because compression would have been\n     * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\n     * transform a block into a stored block.\n     */\n    _tr_stored_block(s, buf, stored_len, last);\n\n  } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) {\n\n    send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3);\n    compress_block(s, static_ltree, static_dtree);\n\n  } else {\n    send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3);\n    send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1);\n    compress_block(s, s.dyn_ltree, s.dyn_dtree);\n  }\n  // Assert (s->compressed_len == s->bits_sent, \"bad compressed size\");\n  /* The above check is made mod 2^32, for files larger than 512 MB\n   * and uLong implemented on 32 bits.\n   */\n  init_block(s);\n\n  if (last) {\n    bi_windup(s);\n  }\n  // Tracev((stderr,\"\\ncomprlen %lu(%lu) \", s->compressed_len>>3,\n  //       s->compressed_len-7*last));\n}\n\n/* ===========================================================================\n * Save the match info and tally the frequency counts. Return true if\n * the current block must be flushed.\n */\nfunction _tr_tally(s, dist, lc)\n//    deflate_state *s;\n//    unsigned dist;  /* distance of matched string */\n//    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\n{\n  //var out_length, in_length, dcode;\n\n  s.pending_buf[s.d_buf + s.last_lit * 2]     = (dist >>> 8) & 0xff;\n  s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff;\n\n  s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff;\n  s.last_lit++;\n\n  if (dist === 0) {\n    /* lc is the unmatched char */\n    s.dyn_ltree[lc * 2]/*.Freq*/++;\n  } else {\n    s.matches++;\n    /* Here, lc is the match length - MIN_MATCH */\n    dist--;             /* dist = match distance - 1 */\n    //Assert((ush)dist < (ush)MAX_DIST(s) &&\n    //       (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\n    //       (ush)d_code(dist) < (ush)D_CODES,  \"_tr_tally: bad match\");\n\n    s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++;\n    s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++;\n  }\n\n// (!) This block is disabled in zlib defaults,\n// don't enable it for binary compatibility\n\n//#ifdef TRUNCATE_BLOCK\n//  /* Try to guess if it is profitable to stop the current block here */\n//  if ((s.last_lit & 0x1fff) === 0 && s.level > 2) {\n//    /* Compute an upper bound for the compressed length */\n//    out_length = s.last_lit*8;\n//    in_length = s.strstart - s.block_start;\n//\n//    for (dcode = 0; dcode < D_CODES; dcode++) {\n//      out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]);\n//    }\n//    out_length >>>= 3;\n//    //Tracev((stderr,\"\\nlast_lit %u, in %ld, out ~%ld(%ld%%) \",\n//    //       s->last_lit, in_length, out_length,\n//    //       100L - out_length*100L/in_length));\n//    if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) {\n//      return true;\n//    }\n//  }\n//#endif\n\n  return (s.last_lit === s.lit_bufsize - 1);\n  /* We avoid equality with lit_bufsize because of wraparound at 64K\n   * on 16 bit machines and because stored blocks are restricted to\n   * 64K-1 bytes.\n   */\n}\n\nexports._tr_init  = _tr_init;\nexports._tr_stored_block = _tr_stored_block;\nexports._tr_flush_block  = _tr_flush_block;\nexports._tr_tally = _tr_tally;\nexports._tr_align = _tr_align;\n","'use strict';\n\n// (C) 1995-2013 Jean-loup Gailly and Mark Adler\n// (C) 2014-2017 Vitaly Puzrin and Andrey Tupitsin\n//\n// This software is provided 'as-is', without any express or implied\n// warranty. In no event will the authors be held liable for any damages\n// arising from the use of this software.\n//\n// Permission is granted to anyone to use this software for any purpose,\n// including commercial applications, and to alter it and redistribute it\n// freely, subject to the following restrictions:\n//\n// 1. The origin of this software must not be misrepresented; you must not\n//   claim that you wrote the original software. If you use this software\n//   in a product, an acknowledgment in the product documentation would be\n//   appreciated but is not required.\n// 2. Altered source versions must be plainly marked as such, and must not be\n//   misrepresented as being the original software.\n// 3. This notice may not be removed or altered from any source distribution.\n\nfunction ZStream() {\n  /* next input byte */\n  this.input = null; // JS specific, because we have no pointers\n  this.next_in = 0;\n  /* number of bytes available at input */\n  this.avail_in = 0;\n  /* total number of input bytes read so far */\n  this.total_in = 0;\n  /* next output byte should be put there */\n  this.output = null; // JS specific, because we have no pointers\n  this.next_out = 0;\n  /* remaining free space at output */\n  this.avail_out = 0;\n  /* total number of bytes output so far */\n  this.total_out = 0;\n  /* last error message, NULL if no error */\n  this.msg = ''/*Z_NULL*/;\n  /* not visible by applications */\n  this.state = null;\n  /* best guess about the data type: binary or text */\n  this.data_type = 2/*Z_UNKNOWN*/;\n  /* adler32 value of the uncompressed data */\n  this.adler = 0;\n}\n\nmodule.exports = ZStream;\n","module.exports = decode\n\nfunction decode (data) {\n  if (data.data && data.name) {\n    data = data.data\n  }\n\n  var naming = true\n  var text = ''\n  var name = ''\n\n  for (var i = 0; i < data.length; i++) {\n    var code = data[i]\n\n    if (naming) {\n      if (code) {\n        name += String.fromCharCode(code)\n      } else {\n        naming = false\n      }\n    } else {\n      if (code) {\n        text += String.fromCharCode(code)\n      } else {\n        throw new Error('Invalid NULL character found. 0x00 character is not permitted in tEXt content')\n      }\n    }\n  }\n\n  return {\n    keyword: name,\n    text: text\n  }\n}\n","module.exports = encode\n\nfunction encode (keyword, content) {\n  keyword = String(keyword)\n  content = String(content)\n\n  if (!/^[\\x00-\\xFF]+$/.test(keyword) || !/^[\\x00-\\xFF]+$/.test(content)) {\n    throw new Error('Only Latin-1 characters are permitted in PNG tEXt chunks. You might want to consider base64 encoding and/or zEXt compression')\n  }\n\n  if (keyword.length >= 80) {\n    throw new Error('Keyword \"' + keyword + '\" is longer than the 79-character limit imposed by the PNG specification')\n  }\n\n  var totalSize = keyword.length + content.length + 1\n  var output = new Uint8Array(totalSize)\n  var idx = 0\n  var code\n\n  for (var i = 0; i < keyword.length; i++) {\n    if (!(code = keyword.charCodeAt(i))) {\n      throw new Error('0x00 character is not permitted in tEXt keywords')\n    }\n\n    output[idx++] = code\n  }\n\n  output[idx++] = 0\n\n  for (var j = 0; j < content.length; j++) {\n    if (!(code = content.charCodeAt(j))) {\n      throw new Error('0x00 character is not permitted in tEXt content')\n    }\n\n    output[idx++] = code\n  }\n\n  return {\n    name: 'tEXt',\n    data: output\n  }\n}\n","exports.encode = require('./encode')\nexports.decode = require('./decode')\n","var sliced = require('sliced')\nvar crc32 = require('crc-32')\n\nmodule.exports = encodeChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction encodeChunks (chunks) {\n  var totalSize = 8\n  var idx = totalSize\n  var i\n\n  for (i = 0; i < chunks.length; i++) {\n    totalSize += chunks[i].data.length\n    totalSize += 12\n  }\n\n  var output = new Uint8Array(totalSize)\n\n  output[0] = 0x89\n  output[1] = 0x50\n  output[2] = 0x4E\n  output[3] = 0x47\n  output[4] = 0x0D\n  output[5] = 0x0A\n  output[6] = 0x1A\n  output[7] = 0x0A\n\n  for (i = 0; i < chunks.length; i++) {\n    var chunk = chunks[i]\n    var name = chunk.name\n    var data = chunk.data\n    var size = data.length\n    var nameChars = [\n      name.charCodeAt(0),\n      name.charCodeAt(1),\n      name.charCodeAt(2),\n      name.charCodeAt(3)\n    ]\n\n    uint32[0] = size\n    output[idx++] = uint8[3]\n    output[idx++] = uint8[2]\n    output[idx++] = uint8[1]\n    output[idx++] = uint8[0]\n\n    output[idx++] = nameChars[0]\n    output[idx++] = nameChars[1]\n    output[idx++] = nameChars[2]\n    output[idx++] = nameChars[3]\n\n    for (var j = 0; j < size;) {\n      output[idx++] = data[j++]\n    }\n\n    var crcCheck = nameChars.concat(sliced(data))\n    var crc = crc32.buf(crcCheck)\n\n    int32[0] = crc\n    output[idx++] = uint8[3]\n    output[idx++] = uint8[2]\n    output[idx++] = uint8[1]\n    output[idx++] = uint8[0]\n  }\n\n  return output\n}\n","var crc32 = require('crc-32')\n\nmodule.exports = extractChunks\n\n// Used for fast-ish conversion between uint8s and uint32s/int32s.\n// Also required in order to remain agnostic for both Node Buffers and\n// Uint8Arrays.\nvar uint8 = new Uint8Array(4)\nvar int32 = new Int32Array(uint8.buffer)\nvar uint32 = new Uint32Array(uint8.buffer)\n\nfunction extractChunks (data) {\n  if (data[0] !== 0x89) throw new Error('Invalid .png file header')\n  if (data[1] !== 0x50) throw new Error('Invalid .png file header')\n  if (data[2] !== 0x4E) throw new Error('Invalid .png file header')\n  if (data[3] !== 0x47) throw new Error('Invalid .png file header')\n  if (data[4] !== 0x0D) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n  if (data[5] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n  if (data[6] !== 0x1A) throw new Error('Invalid .png file header')\n  if (data[7] !== 0x0A) throw new Error('Invalid .png file header: possibly caused by DOS-Unix line ending conversion?')\n\n  var ended = false\n  var chunks = []\n  var idx = 8\n\n  while (idx < data.length) {\n    // Read the length of the current chunk,\n    // which is stored as a Uint32.\n    uint8[3] = data[idx++]\n    uint8[2] = data[idx++]\n    uint8[1] = data[idx++]\n    uint8[0] = data[idx++]\n\n    // Chunk includes name/type for CRC check (see below).\n    var length = uint32[0] + 4\n    var chunk = new Uint8Array(length)\n    chunk[0] = data[idx++]\n    chunk[1] = data[idx++]\n    chunk[2] = data[idx++]\n    chunk[3] = data[idx++]\n\n    // Get the name in ASCII for identification.\n    var name = (\n      String.fromCharCode(chunk[0]) +\n      String.fromCharCode(chunk[1]) +\n      String.fromCharCode(chunk[2]) +\n      String.fromCharCode(chunk[3])\n    )\n\n    // The IHDR header MUST come first.\n    if (!chunks.length && name !== 'IHDR') {\n      throw new Error('IHDR header missing')\n    }\n\n    // The IEND header marks the end of the file,\n    // so on discovering it break out of the loop.\n    if (name === 'IEND') {\n      ended = true\n      chunks.push({\n        name: name,\n        data: new Uint8Array(0)\n      })\n\n      break\n    }\n\n    // Read the contents of the chunk out of the main buffer.\n    for (var i = 4; i < length; i++) {\n      chunk[i] = data[idx++]\n    }\n\n    // Read out the CRC value for comparison.\n    // It's stored as an Int32.\n    uint8[3] = data[idx++]\n    uint8[2] = data[idx++]\n    uint8[1] = data[idx++]\n    uint8[0] = data[idx++]\n\n    var crcActual = int32[0]\n    var crcExpect = crc32.buf(chunk)\n    if (crcExpect !== crcActual) {\n      throw new Error(\n        'CRC values for ' + name + ' header do not match, PNG file is likely corrupted'\n      )\n    }\n\n    // The chunk data is now copied to remove the 4 preceding\n    // bytes used for the chunk name/type.\n    var chunkData = new Uint8Array(chunk.buffer.slice(4))\n\n    chunks.push({\n      name: name,\n      data: chunkData\n    })\n  }\n\n  if (!ended) {\n    throw new Error('.png file ended prematurely: no IEND header was found')\n  }\n\n  return chunks\n}\n","// distance between 2 points\nfunction distance(p1, p2) {\n    return Math.sqrt(distanceSq(p1, p2));\n}\n// distance between 2 points squared\nfunction distanceSq(p1, p2) {\n    return Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2);\n}\n// Sistance squared from a point p to the line segment vw\nfunction distanceToSegmentSq(p, v, w) {\n    const l2 = distanceSq(v, w);\n    if (l2 === 0) {\n        return distanceSq(p, v);\n    }\n    let t = ((p[0] - v[0]) * (w[0] - v[0]) + (p[1] - v[1]) * (w[1] - v[1])) / l2;\n    t = Math.max(0, Math.min(1, t));\n    return distanceSq(p, lerp(v, w, t));\n}\nfunction lerp(a, b, t) {\n    return [\n        a[0] + (b[0] - a[0]) * t,\n        a[1] + (b[1] - a[1]) * t,\n    ];\n}\n// Adapted from https://seant23.wordpress.com/2010/11/12/offset-bezier-curves/\nfunction flatness(points, offset) {\n    const p1 = points[offset + 0];\n    const p2 = points[offset + 1];\n    const p3 = points[offset + 2];\n    const p4 = points[offset + 3];\n    let ux = 3 * p2[0] - 2 * p1[0] - p4[0];\n    ux *= ux;\n    let uy = 3 * p2[1] - 2 * p1[1] - p4[1];\n    uy *= uy;\n    let vx = 3 * p3[0] - 2 * p4[0] - p1[0];\n    vx *= vx;\n    let vy = 3 * p3[1] - 2 * p4[1] - p1[1];\n    vy *= vy;\n    if (ux < vx) {\n        ux = vx;\n    }\n    if (uy < vy) {\n        uy = vy;\n    }\n    return ux + uy;\n}\nfunction getPointsOnBezierCurveWithSplitting(points, offset, tolerance, newPoints) {\n    const outPoints = newPoints || [];\n    if (flatness(points, offset) < tolerance) {\n        const p0 = points[offset + 0];\n        if (outPoints.length) {\n            const d = distance(outPoints[outPoints.length - 1], p0);\n            if (d > 1) {\n                outPoints.push(p0);\n            }\n        }\n        else {\n            outPoints.push(p0);\n        }\n        outPoints.push(points[offset + 3]);\n    }\n    else {\n        // subdivide\n        const t = .5;\n        const p1 = points[offset + 0];\n        const p2 = points[offset + 1];\n        const p3 = points[offset + 2];\n        const p4 = points[offset + 3];\n        const q1 = lerp(p1, p2, t);\n        const q2 = lerp(p2, p3, t);\n        const q3 = lerp(p3, p4, t);\n        const r1 = lerp(q1, q2, t);\n        const r2 = lerp(q2, q3, t);\n        const red = lerp(r1, r2, t);\n        getPointsOnBezierCurveWithSplitting([p1, q1, r1, red], 0, tolerance, outPoints);\n        getPointsOnBezierCurveWithSplitting([red, r2, q3, p4], 0, tolerance, outPoints);\n    }\n    return outPoints;\n}\nexport function simplify(points, distance) {\n    return simplifyPoints(points, 0, points.length, distance);\n}\n// Ramer–Douglas–Peucker algorithm\n// https://en.wikipedia.org/wiki/Ramer%E2%80%93Douglas%E2%80%93Peucker_algorithm\nfunction simplifyPoints(points, start, end, epsilon, newPoints) {\n    const outPoints = newPoints || [];\n    // find the most distance point from the endpoints\n    const s = points[start];\n    const e = points[end - 1];\n    let maxDistSq = 0;\n    let maxNdx = 1;\n    for (let i = start + 1; i < end - 1; ++i) {\n        const distSq = distanceToSegmentSq(points[i], s, e);\n        if (distSq > maxDistSq) {\n            maxDistSq = distSq;\n            maxNdx = i;\n        }\n    }\n    // if that point is too far, split\n    if (Math.sqrt(maxDistSq) > epsilon) {\n        simplifyPoints(points, start, maxNdx + 1, epsilon, outPoints);\n        simplifyPoints(points, maxNdx, end, epsilon, outPoints);\n    }\n    else {\n        if (!outPoints.length) {\n            outPoints.push(s);\n        }\n        outPoints.push(e);\n    }\n    return outPoints;\n}\nexport function pointsOnBezierCurves(points, tolerance = 0.15, distance) {\n    const newPoints = [];\n    const numSegments = (points.length - 1) / 3;\n    for (let i = 0; i < numSegments; i++) {\n        const offset = i * 3;\n        getPointsOnBezierCurveWithSplitting(points, offset, tolerance, newPoints);\n    }\n    if (distance && distance > 0) {\n        return simplifyPoints(newPoints, 0, newPoints.length, distance);\n    }\n    return newPoints;\n}\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var da=new Set,ea={};function fa(a,b){ha(a,b);ha(a+\"Capture\",b)}\nfunction ha(a,b){ea[a]=b;for(a=0;a<b.length;a++)da.add(b[a])}\nvar ia=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),ja=Object.prototype.hasOwnProperty,ka=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,la=\n{},ma={};function oa(a){if(ja.call(ma,a))return!0;if(ja.call(la,a))return!1;if(ka.test(a))return ma[a]=!0;la[a]=!0;return!1}function pa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction qa(a,b,c,d){if(null===b||\"undefined\"===typeof b||pa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1])qa(b,c,e,d)&&(c=null),d||null===e?oa(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c)))}\nvar ua=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,va=Symbol.for(\"react.element\"),wa=Symbol.for(\"react.portal\"),ya=Symbol.for(\"react.fragment\"),za=Symbol.for(\"react.strict_mode\"),Aa=Symbol.for(\"react.profiler\"),Ba=Symbol.for(\"react.provider\"),Ca=Symbol.for(\"react.context\"),Da=Symbol.for(\"react.forward_ref\"),Ea=Symbol.for(\"react.suspense\"),Fa=Symbol.for(\"react.suspense_list\"),Ga=Symbol.for(\"react.memo\"),Ha=Symbol.for(\"react.lazy\");Symbol.for(\"react.scope\");Symbol.for(\"react.debug_trace_mode\");\nvar Ia=Symbol.for(\"react.offscreen\");Symbol.for(\"react.legacy_hidden\");Symbol.for(\"react.cache\");Symbol.for(\"react.tracing_marker\");var Ja=Symbol.iterator;function Ka(a){if(null===a||\"object\"!==typeof a)return null;a=Ja&&a[Ja]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}var A=Object.assign,La;function Ma(a){if(void 0===La)try{throw Error();}catch(c){var b=c.stack.trim().match(/\\n( *(at )?)/);La=b&&b[1]||\"\"}return\"\\n\"+La+a}var Na=!1;\nfunction Oa(a,b){if(!a||Na)return\"\";Na=!0;var c=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(b)if(b=function(){throw Error();},Object.defineProperty(b.prototype,\"props\",{set:function(){throw Error();}}),\"object\"===typeof Reflect&&Reflect.construct){try{Reflect.construct(b,[])}catch(l){var d=l}Reflect.construct(a,[],b)}else{try{b.call()}catch(l){d=l}a.call(b.prototype)}else{try{throw Error();}catch(l){d=l}a()}}catch(l){if(l&&d&&\"string\"===typeof l.stack){for(var e=l.stack.split(\"\\n\"),\nf=d.stack.split(\"\\n\"),g=e.length-1,h=f.length-1;1<=g&&0<=h&&e[g]!==f[h];)h--;for(;1<=g&&0<=h;g--,h--)if(e[g]!==f[h]){if(1!==g||1!==h){do if(g--,h--,0>h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"<anonymous>\")&&(k=k.replace(\"<anonymous>\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+Sa(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction gb(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(p(91));return A({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function hb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(p(92));if(eb(c)){if(1<c.length)throw Error(p(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:Sa(c)}}\nfunction ib(a,b){var c=Sa(b.value),d=Sa(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function jb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}function kb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}\nfunction lb(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?kb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar mb,nb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(\"http://www.w3.org/2000/svg\"!==a.namespaceURI||\"innerHTML\"in a)a.innerHTML=b;else{mb=mb||document.createElement(\"div\");mb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a<b.length;a++)Bb(b[a])}}function Gb(a,b){return a(b)}function Hb(){}var Ib=!1;function Jb(a,b,c){if(Ib)return a(b,c);Ib=!0;try{return Gb(a,b,c)}finally{if(Ib=!1,null!==zb||null!==Ab)Hb(),Fb()}}\nfunction Kb(a,b){var c=a.stateNode;if(null===c)return null;var d=Db(c);if(null===d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==\ntypeof c)throw Error(p(231,b,typeof c));return c}var Lb=!1;if(ia)try{var Mb={};Object.defineProperty(Mb,\"passive\",{get:function(){Lb=!0}});window.addEventListener(\"test\",Mb,Mb);window.removeEventListener(\"test\",Mb,Mb)}catch(a){Lb=!1}function Nb(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var Ob=!1,Pb=null,Qb=!1,Rb=null,Sb={onError:function(a){Ob=!0;Pb=a}};function Tb(a,b,c,d,e,f,g,h,k){Ob=!1;Pb=null;Nb.apply(Sb,arguments)}\nfunction Ub(a,b,c,d,e,f,g,h,k){Tb.apply(this,arguments);if(Ob){if(Ob){var l=Pb;Ob=!1;Pb=null}else throw Error(p(198));Qb||(Qb=!0,Rb=l)}}function Vb(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.flags&4098)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function Wb(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function Xb(a){if(Vb(a)!==a)throw Error(p(188));}\nfunction Yb(a){var b=a.alternate;if(!b){b=Vb(a);if(null===b)throw Error(p(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return Xb(e),a;if(f===d)return Xb(e),b;f=f.sibling}throw Error(p(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(p(189));}}if(c.alternate!==d)throw Error(p(190));}if(3!==c.tag)throw Error(p(188));return c.stateNode.current===c?a:b}function Zb(a){a=Yb(a);return null!==a?$b(a):null}function $b(a){if(5===a.tag||6===a.tag)return a;for(a=a.child;null!==a;){var b=$b(a);if(null!==b)return b;a=a.sibling}return null}\nvar ac=ca.unstable_scheduleCallback,bc=ca.unstable_cancelCallback,cc=ca.unstable_shouldYield,dc=ca.unstable_requestPaint,B=ca.unstable_now,ec=ca.unstable_getCurrentPriorityLevel,fc=ca.unstable_ImmediatePriority,gc=ca.unstable_UserBlockingPriority,hc=ca.unstable_NormalPriority,ic=ca.unstable_LowPriority,jc=ca.unstable_IdlePriority,kc=null,lc=null;function mc(a){if(lc&&\"function\"===typeof lc.onCommitFiberRoot)try{lc.onCommitFiberRoot(kc,a,void 0,128===(a.current.flags&128))}catch(b){}}\nvar oc=Math.clz32?Math.clz32:nc,pc=Math.log,qc=Math.LN2;function nc(a){a>>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0<b;)c=31-oc(b),e=1<<c,d|=a[c],b&=~e;return d}\nfunction vc(a,b){switch(a){case 1:case 2:case 4:return b+250;case 8:case 16:case 32:case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return b+5E3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}\nfunction wc(a,b){for(var c=a.suspendedLanes,d=a.pingedLanes,e=a.expirationTimes,f=a.pendingLanes;0<f;){var g=31-oc(f),h=1<<g,k=e[g];if(-1===k){if(0===(h&c)||0!==(h&d))e[g]=vc(h,b)}else k<=b&&(a.expiredLanes|=h);f&=~h}}function xc(a){a=a.pendingLanes&-1073741825;return 0!==a?a:a&1073741824?1073741824:0}function yc(){var a=rc;rc<<=1;0===(rc&4194240)&&(rc=64);return a}function zc(a){for(var b=[],c=0;31>c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0<c;){var e=31-oc(c),f=1<<e;b[e]=0;d[e]=-1;a[e]=-1;c&=~f}}\nfunction Cc(a,b){var c=a.entangledLanes|=b;for(a=a.entanglements;c;){var d=31-oc(c),e=1<<d;e&b|a[d]&b&&(a[d]|=b);c&=~e}}var C=0;function Dc(a){a&=-a;return 1<a?4<a?0!==(a&268435455)?16:536870912:4:1}var Ec,Fc,Gc,Hc,Ic,Jc=!1,Kc=[],Lc=null,Mc=null,Nc=null,Oc=new Map,Pc=new Map,Qc=[],Rc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");\nfunction Sc(a,b){switch(a){case \"focusin\":case \"focusout\":Lc=null;break;case \"dragenter\":case \"dragleave\":Mc=null;break;case \"mouseover\":case \"mouseout\":Nc=null;break;case \"pointerover\":case \"pointerout\":Oc.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Pc.delete(b.pointerId)}}\nfunction Tc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a={blockedOn:b,domEventName:c,eventSystemFlags:d,nativeEvent:f,targetContainers:[e]},null!==b&&(b=Cb(b),null!==b&&Fc(b)),a;a.eventSystemFlags|=d;b=a.targetContainers;null!==e&&-1===b.indexOf(e)&&b.push(e);return a}\nfunction Uc(a,b,c,d,e){switch(b){case \"focusin\":return Lc=Tc(Lc,a,b,c,d,e),!0;case \"dragenter\":return Mc=Tc(Mc,a,b,c,d,e),!0;case \"mouseover\":return Nc=Tc(Nc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Oc.set(f,Tc(Oc.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Pc.set(f,Tc(Pc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Vc(a){var b=Wc(a.target);if(null!==b){var c=Vb(b);if(null!==c)if(b=c.tag,13===b){if(b=Wb(c),null!==b){a.blockedOn=b;Ic(a.priority,function(){Gc(c)});return}}else if(3===b&&c.stateNode.current.memoizedState.isDehydrated){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}\nfunction Xc(a){if(null!==a.blockedOn)return!1;for(var b=a.targetContainers;0<b.length;){var c=Yc(a.domEventName,a.eventSystemFlags,b[0],a.nativeEvent);if(null===c){c=a.nativeEvent;var d=new c.constructor(c.type,c);wb=d;c.target.dispatchEvent(d);wb=null}else return b=Cb(c),null!==b&&Fc(b),a.blockedOn=c,!1;b.shift()}return!0}function Zc(a,b,c){Xc(a)&&c.delete(b)}function $c(){Jc=!1;null!==Lc&&Xc(Lc)&&(Lc=null);null!==Mc&&Xc(Mc)&&(Mc=null);null!==Nc&&Xc(Nc)&&(Nc=null);Oc.forEach(Zc);Pc.forEach(Zc)}\nfunction ad(a,b){a.blockedOn===b&&(a.blockedOn=null,Jc||(Jc=!0,ca.unstable_scheduleCallback(ca.unstable_NormalPriority,$c)))}\nfunction bd(a){function b(b){return ad(b,a)}if(0<Kc.length){ad(Kc[0],a);for(var c=1;c<Kc.length;c++){var d=Kc[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Lc&&ad(Lc,a);null!==Mc&&ad(Mc,a);null!==Nc&&ad(Nc,a);Oc.forEach(b);Pc.forEach(b);for(c=0;c<Qc.length;c++)d=Qc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Qc.length&&(c=Qc[0],null===c.blockedOn);)Vc(c),null===c.blockedOn&&Qc.shift()}var cd=ua.ReactCurrentBatchConfig,dd=!0;\nfunction ed(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=1,fd(a,b,c,d)}finally{C=e,cd.transition=f}}function gd(a,b,c,d){var e=C,f=cd.transition;cd.transition=null;try{C=4,fd(a,b,c,d)}finally{C=e,cd.transition=f}}\nfunction fd(a,b,c,d){if(dd){var e=Yc(a,b,c,d);if(null===e)hd(a,b,d,id,c),Sc(a,d);else if(Uc(e,a,b,c,d))d.stopPropagation();else if(Sc(a,d),b&4&&-1<Rc.indexOf(a)){for(;null!==e;){var f=Cb(e);null!==f&&Ec(f);f=Yc(a,b,c,d);null===f&&hd(a,b,d,id,c);if(f===e)break;e=f}null!==e&&d.stopPropagation()}else hd(a,b,d,null,c)}}var id=null;\nfunction Yc(a,b,c,d){id=null;a=xb(d);a=Wc(a);if(null!==a)if(b=Vb(a),null===b)a=null;else if(c=b.tag,13===c){a=Wb(b);if(null!==a)return a;a=null}else if(3===c){if(b.stateNode.current.memoizedState.isDehydrated)return 3===b.tag?b.stateNode.containerInfo:null;a=null}else b!==a&&(a=null);id=a;return null}\nfunction jd(a){switch(a){case \"cancel\":case \"click\":case \"close\":case \"contextmenu\":case \"copy\":case \"cut\":case \"auxclick\":case \"dblclick\":case \"dragend\":case \"dragstart\":case \"drop\":case \"focusin\":case \"focusout\":case \"input\":case \"invalid\":case \"keydown\":case \"keypress\":case \"keyup\":case \"mousedown\":case \"mouseup\":case \"paste\":case \"pause\":case \"play\":case \"pointercancel\":case \"pointerdown\":case \"pointerup\":case \"ratechange\":case \"reset\":case \"resize\":case \"seeked\":case \"submit\":case \"touchcancel\":case \"touchend\":case \"touchstart\":case \"volumechange\":case \"change\":case \"selectionchange\":case \"textInput\":case \"compositionstart\":case \"compositionend\":case \"compositionupdate\":case \"beforeblur\":case \"afterblur\":case \"beforeinput\":case \"blur\":case \"fullscreenchange\":case \"focus\":case \"hashchange\":case \"popstate\":case \"select\":case \"selectstart\":return 1;case \"drag\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"mousemove\":case \"mouseout\":case \"mouseover\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"scroll\":case \"toggle\":case \"touchmove\":case \"wheel\":case \"mouseenter\":case \"mouseleave\":case \"pointerenter\":case \"pointerleave\":return 4;\ncase \"message\":switch(ec()){case fc:return 1;case gc:return 4;case hc:case ic:return 16;case jc:return 536870912;default:return 16}default:return 16}}var kd=null,ld=null,md=null;function nd(){if(md)return md;var a,b=ld,c=b.length,d,e=\"value\"in kd?kd.value:kd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return md=e.slice(a,1<d?1-d:void 0)}\nfunction od(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}function pd(){return!0}function qd(){return!1}\nfunction rd(a){function b(b,d,e,f,g){this._reactName=b;this._targetInst=e;this.type=d;this.nativeEvent=f;this.target=g;this.currentTarget=null;for(var c in a)a.hasOwnProperty(c)&&(b=a[c],this[c]=b?b(f):f[c]);this.isDefaultPrevented=(null!=f.defaultPrevented?f.defaultPrevented:!1===f.returnValue)?pd:qd;this.isPropagationStopped=qd;return this}A(b.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&\n(a.returnValue=!1),this.isDefaultPrevented=pd)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=pd)},persist:function(){},isPersistent:pd});return b}\nvar sd={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},td=rd(sd),ud=A({},sd,{view:0,detail:0}),vd=rd(ud),wd,xd,yd,Ad=A({},ud,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:zd,button:0,buttons:0,relatedTarget:function(a){return void 0===a.relatedTarget?a.fromElement===a.srcElement?a.toElement:a.fromElement:a.relatedTarget},movementX:function(a){if(\"movementX\"in\na)return a.movementX;a!==yd&&(yd&&\"mousemove\"===a.type?(wd=a.screenX-yd.screenX,xd=a.screenY-yd.screenY):xd=wd=0,yd=a);return wd},movementY:function(a){return\"movementY\"in a?a.movementY:xd}}),Bd=rd(Ad),Cd=A({},Ad,{dataTransfer:0}),Dd=rd(Cd),Ed=A({},ud,{relatedTarget:0}),Fd=rd(Ed),Gd=A({},sd,{animationName:0,elapsedTime:0,pseudoElement:0}),Hd=rd(Gd),Id=A({},sd,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),Jd=rd(Id),Kd=A({},sd,{data:0}),Ld=rd(Kd),Md={Esc:\"Escape\",\nSpacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nd={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",\n119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},Od={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pd(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Od[a])?!!b[a]:!1}function zd(){return Pd}\nvar Qd=A({},ud,{key:function(a){if(a.key){var b=Md[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=od(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?Nd[a.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:zd,charCode:function(a){return\"keypress\"===a.type?od(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?od(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),Rd=rd(Qd),Sd=A({},Ad,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Td=rd(Sd),Ud=A({},ud,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:zd}),Vd=rd(Ud),Wd=A({},sd,{propertyName:0,elapsedTime:0,pseudoElement:0}),Xd=rd(Wd),Yd=A({},Ad,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},\ndeltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:0,deltaMode:0}),Zd=rd(Yd),$d=[9,13,27,32],ae=ia&&\"CompositionEvent\"in window,be=null;ia&&\"documentMode\"in document&&(be=document.documentMode);var ce=ia&&\"TextEvent\"in window&&!be,de=ia&&(!ae||be&&8<be&&11>=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return de&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar le={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function me(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!le[a.type]:\"textarea\"===b?!0:!1}function ne(a,b,c,d){Eb(d);b=oe(b,\"onChange\");0<b.length&&(c=new td(\"onChange\",\"change\",null,c,d),a.push({event:c,listeners:b}))}var pe=null,qe=null;function re(a){se(a,0)}function te(a){var b=ue(a);if(Wa(b))return a}\nfunction ve(a,b){if(\"change\"===a)return b}var we=!1;if(ia){var xe;if(ia){var ye=\"oninput\"in document;if(!ye){var ze=document.createElement(\"div\");ze.setAttribute(\"oninput\",\"return;\");ye=\"function\"===typeof ze.oninput}xe=ye}else xe=!1;we=xe&&(!document.documentMode||9<document.documentMode)}function Ae(){pe&&(pe.detachEvent(\"onpropertychange\",Be),qe=pe=null)}function Be(a){if(\"value\"===a.propertyName&&te(qe)){var b=[];ne(b,qe,a,xb(a));Jb(re,b)}}\nfunction Ce(a,b,c){\"focusin\"===a?(Ae(),pe=b,qe=c,pe.attachEvent(\"onpropertychange\",Be)):\"focusout\"===a&&Ae()}function De(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return te(qe)}function Ee(a,b){if(\"click\"===a)return te(b)}function Fe(a,b){if(\"input\"===a||\"change\"===a)return te(b)}function Ge(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var He=\"function\"===typeof Object.is?Object.is:Ge;\nfunction Ie(a,b){if(He(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++){var e=c[d];if(!ja.call(b,e)||!He(a[e],b[e]))return!1}return!0}function Je(a){for(;a&&a.firstChild;)a=a.firstChild;return a}\nfunction Ke(a,b){var c=Je(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c<b.length;c++)a=b[c],a.element.scrollLeft=a.left,a.element.scrollTop=a.top}}\nvar Pe=ia&&\"documentMode\"in document&&11>=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0<d.length&&(b=new td(\"onSelect\",\"select\",null,b,c),a.push({event:b,listeners:d}),b.target=Qe)))}\nfunction Ve(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var We={animationend:Ve(\"Animation\",\"AnimationEnd\"),animationiteration:Ve(\"Animation\",\"AnimationIteration\"),animationstart:Ve(\"Animation\",\"AnimationStart\"),transitionend:Ve(\"Transition\",\"TransitionEnd\")},Xe={},Ye={};\nia&&(Ye=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete We.animationend.animation,delete We.animationiteration.animation,delete We.animationstart.animation),\"TransitionEvent\"in window||delete We.transitionend.transition);function Ze(a){if(Xe[a])return Xe[a];if(!We[a])return a;var b=We[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Ye)return Xe[a]=b[c];return a}var $e=Ze(\"animationend\"),af=Ze(\"animationiteration\"),bf=Ze(\"animationstart\"),cf=Ze(\"transitionend\"),df=new Map,ef=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");\nfunction ff(a,b){df.set(a,b);fa(b,[a])}for(var gf=0;gf<ef.length;gf++){var hf=ef[gf],jf=hf.toLowerCase(),kf=hf[0].toUpperCase()+hf.slice(1);ff(jf,\"on\"+kf)}ff($e,\"onAnimationEnd\");ff(af,\"onAnimationIteration\");ff(bf,\"onAnimationStart\");ff(\"dblclick\",\"onDoubleClick\");ff(\"focusin\",\"onFocus\");ff(\"focusout\",\"onBlur\");ff(cf,\"onTransitionEnd\");ha(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]);ha(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]);ha(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]);\nha(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]);fa(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \"));fa(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \"));fa(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]);fa(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \"));fa(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \"));\nfa(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var lf=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),mf=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(lf));\nfunction nf(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=c;Ub(d,b,void 0,a);a.currentTarget=null}\nfunction se(a,b){b=0!==(b&4);for(var c=0;c<a.length;c++){var d=a[c],e=d.event;d=d.listeners;a:{var f=void 0;if(b)for(var g=d.length-1;0<=g;g--){var h=d[g],k=h.instance,l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}else for(g=0;g<d.length;g++){h=d[g];k=h.instance;l=h.currentTarget;h=h.listener;if(k!==f&&e.isPropagationStopped())break a;nf(e,h,l);f=k}}}if(Qb)throw a=Rb,Qb=!1,Rb=null,a;}\nfunction D(a,b){var c=b[of];void 0===c&&(c=b[of]=new Set);var d=a+\"__bubble\";c.has(d)||(pf(b,a,2,!1),c.add(d))}function qf(a,b,c){var d=0;b&&(d|=4);pf(c,a,d,b)}var rf=\"_reactListening\"+Math.random().toString(36).slice(2);function sf(a){if(!a[rf]){a[rf]=!0;da.forEach(function(b){\"selectionchange\"!==b&&(mf.has(b)||qf(b,!1,a),qf(b,!0,a))});var b=9===a.nodeType?a:a.ownerDocument;null===b||b[rf]||(b[rf]=!0,qf(\"selectionchange\",!1,b))}}\nfunction pf(a,b,c,d){switch(jd(b)){case 1:var e=ed;break;case 4:e=gd;break;default:e=fd}c=e.bind(null,b,c,a);e=void 0;!Lb||\"touchstart\"!==b&&\"touchmove\"!==b&&\"wheel\"!==b||(e=!0);d?void 0!==e?a.addEventListener(b,c,{capture:!0,passive:e}):a.addEventListener(b,c,!0):void 0!==e?a.addEventListener(b,c,{passive:e}):a.addEventListener(b,c,!1)}\nfunction hd(a,b,c,d,e){var f=d;if(0===(b&1)&&0===(b&2)&&null!==d)a:for(;;){if(null===d)return;var g=d.tag;if(3===g||4===g){var h=d.stateNode.containerInfo;if(h===e||8===h.nodeType&&h.parentNode===e)break;if(4===g)for(g=d.return;null!==g;){var k=g.tag;if(3===k||4===k)if(k=g.stateNode.containerInfo,k===e||8===k.nodeType&&k.parentNode===e)return;g=g.return}for(;null!==h;){g=Wc(h);if(null===g)return;k=g.tag;if(5===k||6===k){d=f=g;continue a}h=h.parentNode}}d=d.return}Jb(function(){var d=f,e=xb(c),g=[];\na:{var h=df.get(a);if(void 0!==h){var k=td,n=a;switch(a){case \"keypress\":if(0===od(c))break a;case \"keydown\":case \"keyup\":k=Rd;break;case \"focusin\":n=\"focus\";k=Fd;break;case \"focusout\":n=\"blur\";k=Fd;break;case \"beforeblur\":case \"afterblur\":k=Fd;break;case \"click\":if(2===c.button)break a;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":k=Bd;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":k=\nDd;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":k=Vd;break;case $e:case af:case bf:k=Hd;break;case cf:k=Xd;break;case \"scroll\":k=vd;break;case \"wheel\":k=Zd;break;case \"copy\":case \"cut\":case \"paste\":k=Jd;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":k=Td}var t=0!==(b&4),J=!t&&\"scroll\"===a,x=t?null!==h?h+\"Capture\":null:h;t=[];for(var w=d,u;null!==\nw;){u=w;var F=u.stateNode;5===u.tag&&null!==F&&(u=F,null!==x&&(F=Kb(w,x),null!=F&&t.push(tf(w,F,u))));if(J)break;w=w.return}0<t.length&&(h=new k(h,n,null,c,e),g.push({event:h,listeners:t}))}}if(0===(b&7)){a:{h=\"mouseover\"===a||\"pointerover\"===a;k=\"mouseout\"===a||\"pointerout\"===a;if(h&&c!==wb&&(n=c.relatedTarget||c.fromElement)&&(Wc(n)||n[uf]))break a;if(k||h){h=e.window===e?e:(h=e.ownerDocument)?h.defaultView||h.parentWindow:window;if(k){if(n=c.relatedTarget||c.toElement,k=d,n=n?Wc(n):null,null!==\nn&&(J=Vb(n),n!==J||5!==n.tag&&6!==n.tag))n=null}else k=null,n=d;if(k!==n){t=Bd;F=\"onMouseLeave\";x=\"onMouseEnter\";w=\"mouse\";if(\"pointerout\"===a||\"pointerover\"===a)t=Td,F=\"onPointerLeave\",x=\"onPointerEnter\",w=\"pointer\";J=null==k?h:ue(k);u=null==n?h:ue(n);h=new t(F,w+\"leave\",k,c,e);h.target=J;h.relatedTarget=u;F=null;Wc(e)===d&&(t=new t(x,w+\"enter\",n,c,e),t.target=u,t.relatedTarget=J,F=t);J=F;if(k&&n)b:{t=k;x=n;w=0;for(u=t;u;u=vf(u))w++;u=0;for(F=x;F;F=vf(F))u++;for(;0<w-u;)t=vf(t),w--;for(;0<u-w;)x=\nvf(x),u--;for(;w--;){if(t===x||null!==x&&t===x.alternate)break b;t=vf(t);x=vf(x)}t=null}else t=null;null!==k&&wf(g,h,k,t,!1);null!==n&&null!==J&&wf(g,J,n,t,!0)}}}a:{h=d?ue(d):window;k=h.nodeName&&h.nodeName.toLowerCase();if(\"select\"===k||\"input\"===k&&\"file\"===h.type)var na=ve;else if(me(h))if(we)na=Fe;else{na=De;var xa=Ce}else(k=h.nodeName)&&\"input\"===k.toLowerCase()&&(\"checkbox\"===h.type||\"radio\"===h.type)&&(na=Ee);if(na&&(na=na(a,d))){ne(g,na,c,e);break a}xa&&xa(a,h,d);\"focusout\"===a&&(xa=h._wrapperState)&&\nxa.controlled&&\"number\"===h.type&&cb(h,\"number\",h.value)}xa=d?ue(d):window;switch(a){case \"focusin\":if(me(xa)||\"true\"===xa.contentEditable)Qe=xa,Re=d,Se=null;break;case \"focusout\":Se=Re=Qe=null;break;case \"mousedown\":Te=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":Te=!1;Ue(g,c,e);break;case \"selectionchange\":if(Pe)break;case \"keydown\":case \"keyup\":Ue(g,c,e)}var $a;if(ae)b:{switch(a){case \"compositionstart\":var ba=\"onCompositionStart\";break b;case \"compositionend\":ba=\"onCompositionEnd\";\nbreak b;case \"compositionupdate\":ba=\"onCompositionUpdate\";break b}ba=void 0}else ie?ge(a,c)&&(ba=\"onCompositionEnd\"):\"keydown\"===a&&229===c.keyCode&&(ba=\"onCompositionStart\");ba&&(de&&\"ko\"!==c.locale&&(ie||\"onCompositionStart\"!==ba?\"onCompositionEnd\"===ba&&ie&&($a=nd()):(kd=e,ld=\"value\"in kd?kd.value:kd.textContent,ie=!0)),xa=oe(d,ba),0<xa.length&&(ba=new Ld(ba,a,null,c,e),g.push({event:ba,listeners:xa}),$a?ba.data=$a:($a=he(c),null!==$a&&(ba.data=$a))));if($a=ce?je(a,c):ke(a,c))d=oe(d,\"onBeforeInput\"),\n0<d.length&&(e=new Ld(\"onBeforeInput\",\"beforeinput\",null,c,e),g.push({event:e,listeners:d}),e.data=$a)}se(g,b)})}function tf(a,b,c){return{instance:a,listener:b,currentTarget:c}}function oe(a,b){for(var c=b+\"Capture\",d=[];null!==a;){var e=a,f=e.stateNode;5===e.tag&&null!==f&&(e=f,f=Kb(a,c),null!=f&&d.unshift(tf(a,f,e)),f=Kb(a,b),null!=f&&d.push(tf(a,f,e)));a=a.return}return d}function vf(a){if(null===a)return null;do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction wf(a,b,c,d,e){for(var f=b._reactName,g=[];null!==c&&c!==d;){var h=c,k=h.alternate,l=h.stateNode;if(null!==k&&k===d)break;5===h.tag&&null!==l&&(h=l,e?(k=Kb(c,f),null!=k&&g.unshift(tf(c,k,h))):e||(k=Kb(c,f),null!=k&&g.push(tf(c,k,h))));c=c.return}0!==g.length&&a.push({event:b,listeners:g})}var xf=/\\r\\n?/g,yf=/\\u0000|\\uFFFD/g;function zf(a){return(\"string\"===typeof a?a:\"\"+a).replace(xf,\"\\n\").replace(yf,\"\")}function Af(a,b,c){b=zf(b);if(zf(a)!==b&&c)throw Error(p(425));}function Bf(){}\nvar Cf=null,Df=null;function Ef(a,b){return\"textarea\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}\nvar Ff=\"function\"===typeof setTimeout?setTimeout:void 0,Gf=\"function\"===typeof clearTimeout?clearTimeout:void 0,Hf=\"function\"===typeof Promise?Promise:void 0,Jf=\"function\"===typeof queueMicrotask?queueMicrotask:\"undefined\"!==typeof Hf?function(a){return Hf.resolve(null).then(a).catch(If)}:Ff;function If(a){setTimeout(function(){throw a;})}\nfunction Kf(a,b){var c=b,d=0;do{var e=c.nextSibling;a.removeChild(c);if(e&&8===e.nodeType)if(c=e.data,\"/$\"===c){if(0===d){a.removeChild(e);bd(b);return}d--}else\"$\"!==c&&\"$?\"!==c&&\"$!\"!==c||d++;c=e}while(c);bd(b)}function Lf(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break;if(8===b){b=a.data;if(\"$\"===b||\"$!\"===b||\"$?\"===b)break;if(\"/$\"===b)return null}}return a}\nfunction Mf(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(\"$\"===c||\"$!\"===c||\"$?\"===c){if(0===b)return a;b--}else\"/$\"===c&&b++}a=a.previousSibling}return null}var Nf=Math.random().toString(36).slice(2),Of=\"__reactFiber$\"+Nf,Pf=\"__reactProps$\"+Nf,uf=\"__reactContainer$\"+Nf,of=\"__reactEvents$\"+Nf,Qf=\"__reactListeners$\"+Nf,Rf=\"__reactHandles$\"+Nf;\nfunction Wc(a){var b=a[Of];if(b)return b;for(var c=a.parentNode;c;){if(b=c[uf]||c[Of]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Mf(a);null!==a;){if(c=a[Of])return c;a=Mf(a)}return b}a=c;c=a.parentNode}return null}function Cb(a){a=a[Of]||a[uf];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function ue(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(p(33));}function Db(a){return a[Pf]||null}var Sf=[],Tf=-1;function Uf(a){return{current:a}}\nfunction E(a){0>Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a<c.length;a++){var d=c[a];do d=d(!0);while(null!==d)}eg=null;fg=!1}catch(e){throw null!==eg&&(eg=eg.slice(a+1)),ac(fc,jg),e;}finally{C=b,gg=!1}}return null}var kg=[],lg=0,mg=null,ng=0,og=[],pg=0,qg=null,rg=1,sg=\"\";function tg(a,b){kg[lg++]=ng;kg[lg++]=mg;mg=a;ng=b}\nfunction ug(a,b,c){og[pg++]=rg;og[pg++]=sg;og[pg++]=qg;qg=a;var d=rg;a=sg;var e=32-oc(d)-1;d&=~(1<<e);c+=1;var f=32-oc(b)+e;if(30<f){var g=e-e%5;f=(d&(1<<g)-1).toString(32);d>>=g;e-=g;rg=1<<32-oc(b)+e|c<<e|d;sg=f+a}else rg=1<<f|c<<e|d,sg=a}function vg(a){null!==a.return&&(tg(a,1),ug(a,1,0))}function wg(a){for(;a===mg;)mg=kg[--lg],kg[lg]=null,ng=kg[--lg],kg[lg]=null;for(;a===qg;)qg=og[--pg],og[pg]=null,sg=og[--pg],og[pg]=null,rg=og[--pg],og[pg]=null}var xg=null,yg=null,I=!1,zg=null;\nfunction Ag(a,b){var c=Bg(5,null,null,0);c.elementType=\"DELETED\";c.stateNode=b;c.return=a;b=a.deletions;null===b?(a.deletions=[c],a.flags|=16):b.push(c)}\nfunction Cg(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,xg=a,yg=Lf(b.firstChild),!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,xg=a,yg=null,!0):!1;case 13:return b=8!==b.nodeType?null:b,null!==b?(c=null!==qg?{id:rg,overflow:sg}:null,a.memoizedState={dehydrated:b,treeContext:c,retryLane:1073741824},c=Bg(18,null,null,0),c.stateNode=b,c.return=a,a.child=c,xg=a,yg=\nnull,!0):!1;default:return!1}}function Dg(a){return 0!==(a.mode&1)&&0===(a.flags&128)}function Eg(a){if(I){var b=yg;if(b){var c=b;if(!Cg(a,b)){if(Dg(a))throw Error(p(418));b=Lf(c.nextSibling);var d=xg;b&&Cg(a,b)?Ag(d,c):(a.flags=a.flags&-4097|2,I=!1,xg=a)}}else{if(Dg(a))throw Error(p(418));a.flags=a.flags&-4097|2;I=!1;xg=a}}}function Fg(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;xg=a}\nfunction Gg(a){if(a!==xg)return!1;if(!I)return Fg(a),I=!0,!1;var b;(b=3!==a.tag)&&!(b=5!==a.tag)&&(b=a.type,b=\"head\"!==b&&\"body\"!==b&&!Ef(a.type,a.memoizedProps));if(b&&(b=yg)){if(Dg(a))throw Hg(),Error(p(418));for(;b;)Ag(a,b),b=Lf(b.nextSibling)}Fg(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(p(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(\"/$\"===c){if(0===b){yg=Lf(a.nextSibling);break a}b--}else\"$\"!==c&&\"$!\"!==c&&\"$?\"!==c||b++}a=a.nextSibling}yg=\nnull}}else yg=xg?Lf(a.stateNode.nextSibling):null;return!0}function Hg(){for(var a=yg;a;)a=Lf(a.nextSibling)}function Ig(){yg=xg=null;I=!1}function Jg(a){null===zg?zg=[a]:zg.push(a)}var Kg=ua.ReactCurrentBatchConfig;function Lg(a,b){if(a&&a.defaultProps){b=A({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c]);return b}return b}var Mg=Uf(null),Ng=null,Og=null,Pg=null;function Qg(){Pg=Og=Ng=null}function Rg(a){var b=Mg.current;E(Mg);a._currentValue=b}\nfunction Sg(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}function Tg(a,b){Ng=a;Pg=Og=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(Ug=!0),a.firstContext=null)}\nfunction Vg(a){var b=a._currentValue;if(Pg!==a)if(a={context:a,memoizedValue:b,next:null},null===Og){if(null===Ng)throw Error(p(308));Og=a;Ng.dependencies={lanes:0,firstContext:a}}else Og=Og.next=a;return b}var Wg=null;function Xg(a){null===Wg?Wg=[a]:Wg.push(a)}function Yg(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,Xg(b)):(c.next=e.next,e.next=c);b.interleaved=c;return Zg(a,d)}\nfunction Zg(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var $g=!1;function ah(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction bh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function ch(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction dh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return Zg(a,c)}e=d.interleaved;null===e?(b.next=b,Xg(d)):(b.next=e.next,e.next=b);d.interleaved=b;return Zg(a,c)}function eh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction fh(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction gh(a,b,c,d){var e=a.updateQueue;$g=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:$g=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);hh|=g;a.lanes=g;a.memoizedState=q}}\nfunction ih(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=c;if(\"function\"!==typeof e)throw Error(p(191,e));e.call(d)}}}var jh=(new aa.Component).refs;function kh(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:A({},b,c);a.memoizedState=c;0===a.lanes&&(a.updateQueue.baseState=c)}\nvar nh={isMounted:function(a){return(a=a._reactInternals)?Vb(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternals;var d=L(),e=lh(a),f=ch(d,e);f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=dh(a,f,e);null!==b&&(mh(b,a,e,d),eh(b,a,e))},enqueueReplaceState:function(a,b,c){a=a._reactInternals;var d=L(),e=lh(a),f=ch(d,e);f.tag=1;f.payload=b;void 0!==c&&null!==c&&(f.callback=c);b=dh(a,f,e);null!==b&&(mh(b,a,e,d),eh(b,a,e))},enqueueForceUpdate:function(a,b){a=a._reactInternals;var c=L(),d=\nlh(a),e=ch(c,d);e.tag=2;void 0!==b&&null!==b&&(e.callback=b);b=dh(a,e,d);null!==b&&(mh(b,a,d,c),eh(b,a,d))}};function oh(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!Ie(c,d)||!Ie(e,f):!0}\nfunction ph(a,b,c){var d=!1,e=Vf;var f=b.contextType;\"object\"===typeof f&&null!==f?f=Vg(f):(e=Zf(b)?Xf:H.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Yf(a,e):Vf);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=nh;a.stateNode=b;b._reactInternals=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction qh(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&nh.enqueueReplaceState(b,b.state,null)}\nfunction rh(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=jh;ah(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=Vg(f):(f=Zf(b)?Xf:H.current,e.context=Yf(a,f));e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(kh(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||(b=e.state,\n\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&nh.enqueueReplaceState(e,e.state,null),gh(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.flags|=4194308)}\nfunction sh(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(p(309));var d=c.stateNode}if(!d)throw Error(p(147,a));var e=d,f=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===f)return b.ref;b=function(a){var b=e.refs;b===jh&&(b=e.refs={});null===a?delete b[f]:b[f]=a};b._stringRef=f;return b}if(\"string\"!==typeof a)throw Error(p(284));if(!c._owner)throw Error(p(290,a));}return a}\nfunction th(a,b){a=Object.prototype.toString.call(b);throw Error(p(31,\"[object Object]\"===a?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":a));}function uh(a){var b=a._init;return b(a._payload)}\nfunction vh(a){function b(b,c){if(a){var d=b.deletions;null===d?(b.deletions=[c],b.flags|=16):d.push(c)}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=wh(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return b.flags|=1048576,c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.flags|=2,c):d;b.flags|=2;return c}function g(b){a&&\nnull===b.alternate&&(b.flags|=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=xh(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){var f=c.type;if(f===ya)return m(a,b,c.props.children,d,c.key);if(null!==b&&(b.elementType===f||\"object\"===typeof f&&null!==f&&f.$$typeof===Ha&&uh(f)===b.type))return d=e(b,c.props),d.ref=sh(a,b,c),d.return=a,d;d=yh(c.type,c.key,c.props,null,a.mode,d);d.ref=sh(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||\nb.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==c.implementation)return b=zh(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Ah(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function q(a,b,c){if(\"string\"===typeof b&&\"\"!==b||\"number\"===typeof b)return b=xh(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case va:return c=yh(b.type,b.key,b.props,null,a.mode,c),\nc.ref=sh(a,null,b),c.return=a,c;case wa:return b=zh(b,a.mode,c),b.return=a,b;case Ha:var d=b._init;return q(a,d(b._payload),c)}if(eb(b)||Ka(b))return b=Ah(b,a.mode,c,null),b.return=a,b;th(a,b)}return null}function r(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c&&\"\"!==c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case va:return c.key===e?k(a,b,c,d):null;case wa:return c.key===e?l(a,b,c,d):null;case Ha:return e=c._init,r(a,\nb,e(c._payload),d)}if(eb(c)||Ka(c))return null!==e?null:m(a,b,c,d,null);th(a,c)}return null}function y(a,b,c,d,e){if(\"string\"===typeof d&&\"\"!==d||\"number\"===typeof d)return a=a.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case va:return a=a.get(null===d.key?c:d.key)||null,k(b,a,d,e);case wa:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e);case Ha:var f=d._init;return y(a,b,c,f(d._payload),e)}if(eb(d)||Ka(d))return a=a.get(c)||null,m(b,a,d,e,null);th(b,d)}return null}\nfunction n(e,g,h,k){for(var l=null,m=null,u=g,w=g=0,x=null;null!==u&&w<h.length;w++){u.index>w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;w<h.length;w++)u=q(e,h[w],k),null!==u&&(g=f(u,g,w),null===m?l=u:m.sibling=u,m=u);I&&tg(e,w);return l}for(u=d(e,u);w<h.length;w++)x=y(u,e,w,h[w],k),null!==x&&(a&&null!==x.alternate&&u.delete(null===\nx.key?w:x.key),g=f(x,g,w),null===m?l=x:m.sibling=x,m=x);a&&u.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function t(e,g,h,k){var l=Ka(h);if(\"function\"!==typeof l)throw Error(p(150));h=l.call(h);if(null==h)throw Error(p(151));for(var u=l=null,m=g,w=g=0,x=null,n=h.next();null!==m&&!n.done;w++,n=h.next()){m.index>w?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&uh(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=sh(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Ah(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=yh(f.type,f.key,f.props,null,a.mode,h),h.ref=sh(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=zh(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);th(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=xh(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Bh=vh(!0),Ch=vh(!1),Dh={},Eh=Uf(Dh),Fh=Uf(Dh),Gh=Uf(Dh);function Hh(a){if(a===Dh)throw Error(p(174));return a}function Ih(a,b){G(Gh,b);G(Fh,a);G(Eh,Dh);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(Eh);G(Eh,b)}function Jh(){E(Eh);E(Fh);E(Gh)}\nfunction Kh(a){Hh(Gh.current);var b=Hh(Eh.current);var c=lb(b,a.type);b!==c&&(G(Fh,a),G(Eh,c))}function Lh(a){Fh.current===a&&(E(Eh),E(Fh))}var M=Uf(0);\nfunction Mh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Nh=[];\nfunction Oh(){for(var a=0;a<Nh.length;a++)Nh[a]._workInProgressVersionPrimary=null;Nh.length=0}var Ph=ua.ReactCurrentDispatcher,Qh=ua.ReactCurrentBatchConfig,Rh=0,N=null,O=null,P=null,Sh=!1,Th=!1,Uh=0,Vh=0;function Q(){throw Error(p(321));}function Wh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!He(a[c],b[c]))return!1;return!0}\nfunction Xh(a,b,c,d,e,f){Rh=f;N=b;b.memoizedState=null;b.updateQueue=null;b.lanes=0;Ph.current=null===a||null===a.memoizedState?Yh:Zh;a=c(d,e);if(Th){f=0;do{Th=!1;Uh=0;if(25<=f)throw Error(p(301));f+=1;P=O=null;b.updateQueue=null;Ph.current=$h;a=c(d,e)}while(Th)}Ph.current=ai;b=null!==O&&null!==O.next;Rh=0;P=O=N=null;Sh=!1;if(b)throw Error(p(300));return a}function bi(){var a=0!==Uh;Uh=0;return a}\nfunction ci(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===P?N.memoizedState=P=a:P=P.next=a;return P}function di(){if(null===O){var a=N.alternate;a=null!==a?a.memoizedState:null}else a=O.next;var b=null===P?N.memoizedState:P.next;if(null!==b)P=b,O=a;else{if(null===a)throw Error(p(310));O=a;a={memoizedState:O.memoizedState,baseState:O.baseState,baseQueue:O.baseQueue,queue:O.queue,next:null};null===P?N.memoizedState=P=a:P=P.next=a}return P}\nfunction ei(a,b){return\"function\"===typeof b?b(a):b}\nfunction fi(a){var b=di(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=O,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){f=e.next;d=d.baseState;var h=g=null,k=null,l=f;do{var m=l.lane;if((Rh&m)===m)null!==k&&(k=k.next={lane:0,action:l.action,hasEagerState:l.hasEagerState,eagerState:l.eagerState,next:null}),d=l.hasEagerState?l.eagerState:a(d,l.action);else{var q={lane:m,action:l.action,hasEagerState:l.hasEagerState,\neagerState:l.eagerState,next:null};null===k?(h=k=q,g=d):k=k.next=q;N.lanes|=m;hh|=m}l=l.next}while(null!==l&&l!==f);null===k?g=d:k.next=h;He(d,b.memoizedState)||(Ug=!0);b.memoizedState=d;b.baseState=g;b.baseQueue=k;c.lastRenderedState=d}a=c.interleaved;if(null!==a){e=a;do f=e.lane,N.lanes|=f,hh|=f,e=e.next;while(e!==a)}else null===e&&(c.lanes=0);return[b.memoizedState,c.dispatch]}\nfunction gi(a){var b=di(),c=b.queue;if(null===c)throw Error(p(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);He(f,b.memoizedState)||(Ug=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}function hi(){}\nfunction ii(a,b){var c=N,d=di(),e=b(),f=!He(d.memoizedState,e);f&&(d.memoizedState=e,Ug=!0);d=d.queue;ji(ki.bind(null,c,d,a),[a]);if(d.getSnapshot!==b||f||null!==P&&P.memoizedState.tag&1){c.flags|=2048;li(9,mi.bind(null,c,d,e,b),void 0,null);if(null===R)throw Error(p(349));0!==(Rh&30)||ni(c,b,e)}return e}function ni(a,b,c){a.flags|=16384;a={getSnapshot:b,value:c};b=N.updateQueue;null===b?(b={lastEffect:null,stores:null},N.updateQueue=b,b.stores=[a]):(c=b.stores,null===c?b.stores=[a]:c.push(a))}\nfunction mi(a,b,c,d){b.value=c;b.getSnapshot=d;oi(b)&&pi(a)}function ki(a,b,c){return c(function(){oi(b)&&pi(a)})}function oi(a){var b=a.getSnapshot;a=a.value;try{var c=b();return!He(a,c)}catch(d){return!0}}function pi(a){var b=Zg(a,1);null!==b&&mh(b,a,1,-1)}\nfunction qi(a){var b=ci();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:ei,lastRenderedState:a};b.queue=a;a=a.dispatch=ri.bind(null,N,a);return[b.memoizedState,a]}\nfunction li(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=N.updateQueue;null===b?(b={lastEffect:null,stores:null},N.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}function si(){return di().memoizedState}function ti(a,b,c,d){var e=ci();N.flags|=a;e.memoizedState=li(1|b,c,void 0,void 0===d?null:d)}\nfunction ui(a,b,c,d){var e=di();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&Wh(d,g.deps)){e.memoizedState=li(b,c,f,d);return}}N.flags|=a;e.memoizedState=li(1|b,c,f,d)}function vi(a,b){return ti(8390656,8,a,b)}function ji(a,b){return ui(2048,8,a,b)}function wi(a,b){return ui(4,2,a,b)}function xi(a,b){return ui(4,4,a,b)}\nfunction yi(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function zi(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ui(4,4,yi.bind(null,b,a),c)}function Ai(){}function Bi(a,b){var c=di();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Wh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Ci(a,b){var c=di();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&Wh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Di(a,b,c){if(0===(Rh&21))return a.baseState&&(a.baseState=!1,Ug=!0),a.memoizedState=c;He(c,b)||(c=yc(),N.lanes|=c,hh|=c,a.baseState=!0);return b}function Ei(a,b){var c=C;C=0!==c&&4>c?c:4;a(!0);var d=Qh.transition;Qh.transition={};try{a(!1),b()}finally{C=c,Qh.transition=d}}function Fi(){return di().memoizedState}\nfunction Gi(a,b,c){var d=lh(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,c);else if(c=Yg(a,b,c,d),null!==c){var e=L();mh(c,a,d,e);Ji(c,b,d)}}\nfunction ri(a,b,c){var d=lh(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,Xg(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=Yg(a,b,e,d);null!==c&&(e=L(),mh(c,a,d,e),Ji(c,b,d))}}\nfunction Hi(a){var b=a.alternate;return a===N||null!==b&&b===N}function Ii(a,b){Th=Sh=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Ji(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar ai={readContext:Vg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useInsertionEffect:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useDeferredValue:Q,useTransition:Q,useMutableSource:Q,useSyncExternalStore:Q,useId:Q,unstable_isNewReconciler:!1},Yh={readContext:Vg,useCallback:function(a,b){ci().memoizedState=[a,void 0===b?null:b];return a},useContext:Vg,useEffect:vi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ti(4194308,\n4,yi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ti(4194308,4,a,b)},useInsertionEffect:function(a,b){return ti(4,2,a,b)},useMemo:function(a,b){var c=ci();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=ci();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=Gi.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=\nci();a={current:a};return b.memoizedState=a},useState:qi,useDebugValue:Ai,useDeferredValue:function(a){return ci().memoizedState=a},useTransition:function(){var a=qi(!1),b=a[0];a=Ei.bind(null,a[1]);ci().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=N,e=ci();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===R)throw Error(p(349));0!==(Rh&30)||ni(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;vi(ki.bind(null,d,\nf,a),[a]);d.flags|=2048;li(9,mi.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=ci(),b=R.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Uh++;0<c&&(b+=\"H\"+c.toString(32));b+=\":\"}else c=Vh++,b=\":\"+b+\"r\"+c.toString(32)+\":\";return a.memoizedState=b},unstable_isNewReconciler:!1},Zh={readContext:Vg,useCallback:Bi,useContext:Vg,useEffect:ji,useImperativeHandle:zi,useInsertionEffect:wi,useLayoutEffect:xi,useMemo:Ci,useReducer:fi,useRef:si,useState:function(){return fi(ei)},\nuseDebugValue:Ai,useDeferredValue:function(a){var b=di();return Di(b,O.memoizedState,a)},useTransition:function(){var a=fi(ei)[0],b=di().memoizedState;return[a,b]},useMutableSource:hi,useSyncExternalStore:ii,useId:Fi,unstable_isNewReconciler:!1},$h={readContext:Vg,useCallback:Bi,useContext:Vg,useEffect:ji,useImperativeHandle:zi,useInsertionEffect:wi,useLayoutEffect:xi,useMemo:Ci,useReducer:gi,useRef:si,useState:function(){return gi(ei)},useDebugValue:Ai,useDeferredValue:function(a){var b=di();return null===\nO?b.memoizedState=a:Di(b,O.memoizedState,a)},useTransition:function(){var a=gi(ei)[0],b=di().memoizedState;return[a,b]},useMutableSource:hi,useSyncExternalStore:ii,useId:Fi,unstable_isNewReconciler:!1};function Ki(a,b){try{var c=\"\",d=b;do c+=Pa(d),d=d.return;while(d);var e=c}catch(f){e=\"\\nError generating stack: \"+f.message+\"\\n\"+f.stack}return{value:a,source:b,stack:e,digest:null}}function Li(a,b,c){return{value:a,source:null,stack:null!=c?c:null,digest:null!=b?b:null}}\nfunction Mi(a,b){try{console.error(b.value)}catch(c){setTimeout(function(){throw c;})}}var Ni=\"function\"===typeof WeakMap?WeakMap:Map;function Oi(a,b,c){c=ch(-1,c);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Pi||(Pi=!0,Qi=d);Mi(a,b)};return c}\nfunction Ri(a,b,c){c=ch(-1,c);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){return d(e)};c.callback=function(){Mi(a,b)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){Mi(a,b);\"function\"!==typeof d&&(null===Si?Si=new Set([this]):Si.add(this));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nfunction Ti(a,b,c){var d=a.pingCache;if(null===d){d=a.pingCache=new Ni;var e=new Set;d.set(b,e)}else e=d.get(b),void 0===e&&(e=new Set,d.set(b,e));e.has(c)||(e.add(c),a=Ui.bind(null,a,b,c),b.then(a,a))}function Vi(a){do{var b;if(b=13===a.tag)b=a.memoizedState,b=null!==b?null!==b.dehydrated?!0:!1:!0;if(b)return a;a=a.return}while(null!==a);return null}\nfunction Wi(a,b,c,d,e){if(0===(a.mode&1))return a===b?a.flags|=65536:(a.flags|=128,c.flags|=131072,c.flags&=-52805,1===c.tag&&(null===c.alternate?c.tag=17:(b=ch(-1,1),b.tag=2,dh(c,b,1))),c.lanes|=1),a;a.flags|=65536;a.lanes=e;return a}var Xi=ua.ReactCurrentOwner,Ug=!1;function Yi(a,b,c,d){b.child=null===a?Ch(b,null,c,d):Bh(b,a.child,c,d)}\nfunction Zi(a,b,c,d,e){c=c.render;var f=b.ref;Tg(b,e);d=Xh(a,b,c,d,f,e);c=bi();if(null!==a&&!Ug)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,$i(a,b,e);I&&c&&vg(b);b.flags|=1;Yi(a,b,d,e);return b.child}\nfunction aj(a,b,c,d,e){if(null===a){var f=c.type;if(\"function\"===typeof f&&!bj(f)&&void 0===f.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=f,cj(a,b,f,d,e);a=yh(c.type,null,d,b,b.mode,e);a.ref=b.ref;a.return=b;return b.child=a}f=a.child;if(0===(a.lanes&e)){var g=f.memoizedProps;c=c.compare;c=null!==c?c:Ie;if(c(g,d)&&a.ref===b.ref)return $i(a,b,e)}b.flags|=1;a=wh(f,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction cj(a,b,c,d,e){if(null!==a){var f=a.memoizedProps;if(Ie(f,d)&&a.ref===b.ref)if(Ug=!1,b.pendingProps=d=f,0!==(a.lanes&e))0!==(a.flags&131072)&&(Ug=!0);else return b.lanes=a.lanes,$i(a,b,e)}return dj(a,b,c,d,e)}\nfunction ej(a,b,c){var d=b.pendingProps,e=d.children,f=null!==a?a.memoizedState:null;if(\"hidden\"===d.mode)if(0===(b.mode&1))b.memoizedState={baseLanes:0,cachePool:null,transitions:null},G(fj,gj),gj|=c;else{if(0===(c&1073741824))return a=null!==f?f.baseLanes|c:c,b.lanes=b.childLanes=1073741824,b.memoizedState={baseLanes:a,cachePool:null,transitions:null},b.updateQueue=null,G(fj,gj),gj|=a,null;b.memoizedState={baseLanes:0,cachePool:null,transitions:null};d=null!==f?f.baseLanes:c;G(fj,gj);gj|=d}else null!==\nf?(d=f.baseLanes|c,b.memoizedState=null):d=c,G(fj,gj),gj|=d;Yi(a,b,e,c);return b.child}function hj(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.flags|=512,b.flags|=2097152}function dj(a,b,c,d,e){var f=Zf(c)?Xf:H.current;f=Yf(b,f);Tg(b,e);c=Xh(a,b,c,d,f,e);d=bi();if(null!==a&&!Ug)return b.updateQueue=a.updateQueue,b.flags&=-2053,a.lanes&=~e,$i(a,b,e);I&&d&&vg(b);b.flags|=1;Yi(a,b,c,e);return b.child}\nfunction ij(a,b,c,d,e){if(Zf(c)){var f=!0;cg(b)}else f=!1;Tg(b,e);if(null===b.stateNode)jj(a,b),ph(b,c,d),rh(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=Vg(l):(l=Zf(c)?Xf:H.current,l=Yf(b,l));var m=c.getDerivedStateFromProps,q=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;q||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||\n(h!==d||k!==l)&&qh(b,g,d,l);$g=!1;var r=b.memoizedState;g.state=r;gh(b,d,g,e);k=b.memoizedState;h!==d||r!==k||Wf.current||$g?(\"function\"===typeof m&&(kh(b,c,m,d),k=b.memoizedState),(h=$g||oh(b,c,h,d,r,k,l))?(q||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===typeof g.componentDidMount&&(b.flags|=4194308)):\n(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.flags|=4194308),d=!1)}else{g=b.stateNode;bh(a,b);h=b.memoizedProps;l=b.type===b.elementType?h:Lg(b.type,h);g.props=l;q=b.pendingProps;r=g.context;k=c.contextType;\"object\"===typeof k&&null!==k?k=Vg(k):(k=Zf(c)?Xf:H.current,k=Yf(b,k));var y=c.getDerivedStateFromProps;(m=\"function\"===typeof y||\"function\"===typeof g.getSnapshotBeforeUpdate)||\n\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==q||r!==k)&&qh(b,g,d,k);$g=!1;r=b.memoizedState;g.state=r;gh(b,d,g,e);var n=b.memoizedState;h!==q||r!==n||Wf.current||$g?(\"function\"===typeof y&&(kh(b,c,y,d),n=b.memoizedState),(l=$g||oh(b,c,l,d,r,n,k)||!1)?(m||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,n,k),\"function\"===typeof g.UNSAFE_componentWillUpdate&&\ng.UNSAFE_componentWillUpdate(d,n,k)),\"function\"===typeof g.componentDidUpdate&&(b.flags|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.flags|=1024)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),b.memoizedProps=d,b.memoizedState=n),g.props=d,g.state=n,g.context=k,d=l):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&r===\na.memoizedState||(b.flags|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&r===a.memoizedState||(b.flags|=1024),d=!1)}return kj(a,b,c,d,f,e)}\nfunction kj(a,b,c,d,e,f){hj(a,b);var g=0!==(b.flags&128);if(!d&&!g)return e&&dg(b,c,!1),$i(a,b,f);d=b.stateNode;Xi.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.flags|=1;null!==a&&g?(b.child=Bh(b,a.child,null,f),b.child=Bh(b,null,h,f)):Yi(a,b,h,f);b.memoizedState=d.state;e&&dg(b,c,!0);return b.child}function lj(a){var b=a.stateNode;b.pendingContext?ag(a,b.pendingContext,b.pendingContext!==b.context):b.context&&ag(a,b.context,!1);Ih(a,b.containerInfo)}\nfunction mj(a,b,c,d,e){Ig();Jg(e);b.flags|=256;Yi(a,b,c,d);return b.child}var nj={dehydrated:null,treeContext:null,retryLane:0};function oj(a){return{baseLanes:a,cachePool:null,transitions:null}}\nfunction pj(a,b,c){var d=b.pendingProps,e=M.current,f=!1,g=0!==(b.flags&128),h;(h=g)||(h=null!==a&&null===a.memoizedState?!1:0!==(e&2));if(h)f=!0,b.flags&=-129;else if(null===a||null!==a.memoizedState)e|=1;G(M,e&1);if(null===a){Eg(b);a=b.memoizedState;if(null!==a&&(a=a.dehydrated,null!==a))return 0===(b.mode&1)?b.lanes=1:\"$!\"===a.data?b.lanes=8:b.lanes=1073741824,null;g=d.children;a=d.fallback;return f?(d=b.mode,f=b.child,g={mode:\"hidden\",children:g},0===(d&1)&&null!==f?(f.childLanes=0,f.pendingProps=\ng):f=qj(g,d,0,null),a=Ah(a,d,c,null),f.return=b,a.return=b,f.sibling=a,b.child=f,b.child.memoizedState=oj(c),b.memoizedState=nj,a):rj(b,g)}e=a.memoizedState;if(null!==e&&(h=e.dehydrated,null!==h))return sj(a,b,g,d,h,e,c);if(f){f=d.fallback;g=b.mode;e=a.child;h=e.sibling;var k={mode:\"hidden\",children:d.children};0===(g&1)&&b.child!==e?(d=b.child,d.childLanes=0,d.pendingProps=k,b.deletions=null):(d=wh(e,k),d.subtreeFlags=e.subtreeFlags&14680064);null!==h?f=wh(h,f):(f=Ah(f,g,c,null),f.flags|=2);f.return=\nb;d.return=b;d.sibling=f;b.child=d;d=f;f=b.child;g=a.child.memoizedState;g=null===g?oj(c):{baseLanes:g.baseLanes|c,cachePool:null,transitions:g.transitions};f.memoizedState=g;f.childLanes=a.childLanes&~c;b.memoizedState=nj;return d}f=a.child;a=f.sibling;d=wh(f,{mode:\"visible\",children:d.children});0===(b.mode&1)&&(d.lanes=c);d.return=b;d.sibling=null;null!==a&&(c=b.deletions,null===c?(b.deletions=[a],b.flags|=16):c.push(a));b.child=d;b.memoizedState=null;return d}\nfunction rj(a,b){b=qj({mode:\"visible\",children:b},a.mode,0,null);b.return=a;return a.child=b}function tj(a,b,c,d){null!==d&&Jg(d);Bh(b,a.child,null,c);a=rj(b,b.pendingProps.children);a.flags|=2;b.memoizedState=null;return a}\nfunction sj(a,b,c,d,e,f,g){if(c){if(b.flags&256)return b.flags&=-257,d=Li(Error(p(422))),tj(a,b,g,d);if(null!==b.memoizedState)return b.child=a.child,b.flags|=128,null;f=d.fallback;e=b.mode;d=qj({mode:\"visible\",children:d.children},e,0,null);f=Ah(f,e,g,null);f.flags|=2;d.return=b;f.return=b;d.sibling=f;b.child=d;0!==(b.mode&1)&&Bh(b,a.child,null,g);b.child.memoizedState=oj(g);b.memoizedState=nj;return f}if(0===(b.mode&1))return tj(a,b,g,null);if(\"$!\"===e.data){d=e.nextSibling&&e.nextSibling.dataset;\nif(d)var h=d.dgst;d=h;f=Error(p(419));d=Li(f,d,void 0);return tj(a,b,g,d)}h=0!==(g&a.childLanes);if(Ug||h){d=R;if(null!==d){switch(g&-g){case 4:e=2;break;case 16:e=8;break;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:e=32;break;case 536870912:e=268435456;break;default:e=0}e=0!==(e&(d.suspendedLanes|g))?0:e;\n0!==e&&e!==f.retryLane&&(f.retryLane=e,Zg(a,e),mh(d,a,e,-1))}uj();d=Li(Error(p(421)));return tj(a,b,g,d)}if(\"$?\"===e.data)return b.flags|=128,b.child=a.child,b=vj.bind(null,a),e._reactRetry=b,null;a=f.treeContext;yg=Lf(e.nextSibling);xg=b;I=!0;zg=null;null!==a&&(og[pg++]=rg,og[pg++]=sg,og[pg++]=qg,rg=a.id,sg=a.overflow,qg=b);b=rj(b,d.children);b.flags|=4096;return b}function wj(a,b,c){a.lanes|=b;var d=a.alternate;null!==d&&(d.lanes|=b);Sg(a.return,b,c)}\nfunction xj(a,b,c,d,e){var f=a.memoizedState;null===f?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailMode:e}:(f.isBackwards=b,f.rendering=null,f.renderingStartTime=0,f.last=d,f.tail=c,f.tailMode=e)}\nfunction yj(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;Yi(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.flags|=128;else{if(null!==a&&0!==(a.flags&128))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&wj(a,c,b);else if(19===a.tag)wj(a,c,b);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}G(M,d);if(0===(b.mode&1))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===Mh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);xj(b,!1,e,c,f);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===Mh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}xj(b,!0,c,null,f);break;case \"together\":xj(b,!1,null,null,void 0);break;default:b.memoizedState=null}return b.child}\nfunction jj(a,b){0===(b.mode&1)&&null!==a&&(a.alternate=null,b.alternate=null,b.flags|=2)}function $i(a,b,c){null!==a&&(b.dependencies=a.dependencies);hh|=b.lanes;if(0===(c&b.childLanes))return null;if(null!==a&&b.child!==a.child)throw Error(p(153));if(null!==b.child){a=b.child;c=wh(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=wh(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}\nfunction zj(a,b,c){switch(b.tag){case 3:lj(b);Ig();break;case 5:Kh(b);break;case 1:Zf(b.type)&&cg(b);break;case 4:Ih(b,b.stateNode.containerInfo);break;case 10:var d=b.type._context,e=b.memoizedProps.value;G(Mg,d._currentValue);d._currentValue=e;break;case 13:d=b.memoizedState;if(null!==d){if(null!==d.dehydrated)return G(M,M.current&1),b.flags|=128,null;if(0!==(c&b.child.childLanes))return pj(a,b,c);G(M,M.current&1);a=$i(a,b,c);return null!==a?a.sibling:null}G(M,M.current&1);break;case 19:d=0!==(c&\nb.childLanes);if(0!==(a.flags&128)){if(d)return yj(a,b,c);b.flags|=128}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null,e.lastEffect=null);G(M,M.current);if(d)break;else return null;case 22:case 23:return b.lanes=0,ej(a,b,c)}return $i(a,b,c)}var Aj,Bj,Cj,Dj;\nAj=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};Bj=function(){};\nCj=function(a,b,c,d){var e=a.memoizedProps;if(e!==d){a=b.stateNode;Hh(Eh.current);var f=null;switch(c){case \"input\":e=Ya(a,e);d=Ya(a,d);f=[];break;case \"select\":e=A({},e,{value:void 0});d=A({},d,{value:void 0});f=[];break;case \"textarea\":e=gb(a,e);d=gb(a,d);f=[];break;default:\"function\"!==typeof e.onClick&&\"function\"===typeof d.onClick&&(a.onclick=Bf)}ub(c,d);var g;c=null;for(l in e)if(!d.hasOwnProperty(l)&&e.hasOwnProperty(l)&&null!=e[l])if(\"style\"===l){var h=e[l];for(g in h)h.hasOwnProperty(g)&&\n(c||(c={}),c[g]=\"\")}else\"dangerouslySetInnerHTML\"!==l&&\"children\"!==l&&\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&\"autoFocus\"!==l&&(ea.hasOwnProperty(l)?f||(f=[]):(f=f||[]).push(l,null));for(l in d){var k=d[l];h=null!=e?e[l]:void 0;if(d.hasOwnProperty(l)&&k!==h&&(null!=k||null!=h))if(\"style\"===l)if(h){for(g in h)!h.hasOwnProperty(g)||k&&k.hasOwnProperty(g)||(c||(c={}),c[g]=\"\");for(g in k)k.hasOwnProperty(g)&&h[g]!==k[g]&&(c||(c={}),c[g]=k[g])}else c||(f||(f=[]),f.push(l,\nc)),c=k;else\"dangerouslySetInnerHTML\"===l?(k=k?k.__html:void 0,h=h?h.__html:void 0,null!=k&&h!==k&&(f=f||[]).push(l,k)):\"children\"===l?\"string\"!==typeof k&&\"number\"!==typeof k||(f=f||[]).push(l,\"\"+k):\"suppressContentEditableWarning\"!==l&&\"suppressHydrationWarning\"!==l&&(ea.hasOwnProperty(l)?(null!=k&&\"onScroll\"===l&&D(\"scroll\",a),f||h===k||(f=[])):(f=f||[]).push(l,k))}c&&(f=f||[]).push(\"style\",c);var l=f;if(b.updateQueue=l)b.flags|=4}};Dj=function(a,b,c,d){c!==d&&(b.flags|=4)};\nfunction Ej(a,b){if(!I)switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction S(a){var b=null!==a.alternate&&a.alternate.child===a.child,c=0,d=0;if(b)for(var e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags&14680064,d|=e.flags&14680064,e.return=a,e=e.sibling;else for(e=a.child;null!==e;)c|=e.lanes|e.childLanes,d|=e.subtreeFlags,d|=e.flags,e.return=a,e=e.sibling;a.subtreeFlags|=d;a.childLanes=c;return b}\nfunction Fj(a,b,c){var d=b.pendingProps;wg(b);switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return S(b),null;case 1:return Zf(b.type)&&$f(),S(b),null;case 3:d=b.stateNode;Jh();E(Wf);E(H);Oh();d.pendingContext&&(d.context=d.pendingContext,d.pendingContext=null);if(null===a||null===a.child)Gg(b)?b.flags|=4:null===a||a.memoizedState.isDehydrated&&0===(b.flags&256)||(b.flags|=1024,null!==zg&&(Gj(zg),zg=null));Bj(a,b);S(b);return null;case 5:Lh(b);var e=Hh(Gh.current);\nc=b.type;if(null!==a&&null!=b.stateNode)Cj(a,b,c,d,e),a.ref!==b.ref&&(b.flags|=512,b.flags|=2097152);else{if(!d){if(null===b.stateNode)throw Error(p(166));S(b);return null}a=Hh(Eh.current);if(Gg(b)){d=b.stateNode;c=b.type;var f=b.memoizedProps;d[Of]=b;d[Pf]=f;a=0!==(b.mode&1);switch(c){case \"dialog\":D(\"cancel\",d);D(\"close\",d);break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",d);break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],d);break;case \"source\":D(\"error\",d);break;case \"img\":case \"image\":case \"link\":D(\"error\",\nd);D(\"load\",d);break;case \"details\":D(\"toggle\",d);break;case \"input\":Za(d,f);D(\"invalid\",d);break;case \"select\":d._wrapperState={wasMultiple:!!f.multiple};D(\"invalid\",d);break;case \"textarea\":hb(d,f),D(\"invalid\",d)}ub(c,f);e=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,h,a),e=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(!0!==f.suppressHydrationWarning&&Af(d.textContent,\nh,a),e=[\"children\",\"\"+h]):ea.hasOwnProperty(g)&&null!=h&&\"onScroll\"===g&&D(\"scroll\",d)}switch(c){case \"input\":Va(d);db(d,f,!0);break;case \"textarea\":Va(d);jb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&(d.onclick=Bf)}d=e;b.updateQueue=d;null!==d&&(b.flags|=4)}else{g=9===e.nodeType?e:e.ownerDocument;\"http://www.w3.org/1999/xhtml\"===a&&(a=kb(c));\"http://www.w3.org/1999/xhtml\"===a?\"script\"===c?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;Aj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;e<lf.length;e++)D(lf[e],a);e=d;break;case \"source\":D(\"error\",a);e=d;break;case \"img\":case \"image\":case \"link\":D(\"error\",\na);D(\"load\",a);e=d;break;case \"details\":D(\"toggle\",a);e=d;break;case \"input\":Za(a,d);e=Ya(a,d);D(\"invalid\",a);break;case \"option\":e=d;break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};e=A({},d,{value:void 0});D(\"invalid\",a);break;case \"textarea\":hb(a,d);e=gb(a,d);D(\"invalid\",a);break;default:e=d}ub(c,e);h=e;for(f in h)if(h.hasOwnProperty(f)){var k=h[f];\"style\"===f?sb(a,k):\"dangerouslySetInnerHTML\"===f?(k=k?k.__html:void 0,null!=k&&nb(a,k)):\"children\"===f?\"string\"===typeof k?(\"textarea\"!==\nc||\"\"!==k)&&ob(a,k):\"number\"===typeof k&&ob(a,\"\"+k):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(ea.hasOwnProperty(f)?null!=k&&\"onScroll\"===f&&D(\"scroll\",a):null!=k&&ta(a,f,k,g))}switch(c){case \"input\":Va(a);db(a,d,!1);break;case \"textarea\":Va(a);jb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+Sa(d.value));break;case \"select\":a.multiple=!!d.multiple;f=d.value;null!=f?fb(a,!!d.multiple,f,!1):null!=d.defaultValue&&fb(a,!!d.multiple,d.defaultValue,\n!0);break;default:\"function\"===typeof e.onClick&&(a.onclick=Bf)}switch(c){case \"button\":case \"input\":case \"select\":case \"textarea\":d=!!d.autoFocus;break a;case \"img\":d=!0;break a;default:d=!1}}d&&(b.flags|=4)}null!==b.ref&&(b.flags|=512,b.flags|=2097152)}S(b);return null;case 6:if(a&&null!=b.stateNode)Dj(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(p(166));c=Hh(Gh.current);Hh(Eh.current);if(Gg(b)){d=b.stateNode;c=b.memoizedProps;d[Of]=b;if(f=d.nodeValue!==c)if(a=\nxg,null!==a)switch(a.tag){case 3:Af(d.nodeValue,c,0!==(a.mode&1));break;case 5:!0!==a.memoizedProps.suppressHydrationWarning&&Af(d.nodeValue,c,0!==(a.mode&1))}f&&(b.flags|=4)}else d=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),d[Of]=b,b.stateNode=d}S(b);return null;case 13:E(M);d=b.memoizedState;if(null===a||null!==a.memoizedState&&null!==a.memoizedState.dehydrated){if(I&&null!==yg&&0!==(b.mode&1)&&0===(b.flags&128))Hg(),Ig(),b.flags|=98560,f=!1;else if(f=Gg(b),null!==d&&null!==d.dehydrated){if(null===\na){if(!f)throw Error(p(318));f=b.memoizedState;f=null!==f?f.dehydrated:null;if(!f)throw Error(p(317));f[Of]=b}else Ig(),0===(b.flags&128)&&(b.memoizedState=null),b.flags|=4;S(b);f=!1}else null!==zg&&(Gj(zg),zg=null),f=!0;if(!f)return b.flags&65536?b:null}if(0!==(b.flags&128))return b.lanes=c,b;d=null!==d;d!==(null!==a&&null!==a.memoizedState)&&d&&(b.child.flags|=8192,0!==(b.mode&1)&&(null===a||0!==(M.current&1)?0===T&&(T=3):uj()));null!==b.updateQueue&&(b.flags|=4);S(b);return null;case 4:return Jh(),\nBj(a,b),null===a&&sf(b.stateNode.containerInfo),S(b),null;case 10:return Rg(b.type._context),S(b),null;case 17:return Zf(b.type)&&$f(),S(b),null;case 19:E(M);f=b.memoizedState;if(null===f)return S(b),null;d=0!==(b.flags&128);g=f.rendering;if(null===g)if(d)Ej(f,!1);else{if(0!==T||null!==a&&0!==(a.flags&128))for(a=b.child;null!==a;){g=Mh(a);if(null!==g){b.flags|=128;Ej(f,!1);d=g.updateQueue;null!==d&&(b.updateQueue=d,b.flags|=4);b.subtreeFlags=0;d=c;for(c=b.child;null!==c;)f=c,a=d,f.flags&=14680066,\ng=f.alternate,null===g?(f.childLanes=0,f.lanes=a,f.child=null,f.subtreeFlags=0,f.memoizedProps=null,f.memoizedState=null,f.updateQueue=null,f.dependencies=null,f.stateNode=null):(f.childLanes=g.childLanes,f.lanes=g.lanes,f.child=g.child,f.subtreeFlags=0,f.deletions=null,f.memoizedProps=g.memoizedProps,f.memoizedState=g.memoizedState,f.updateQueue=g.updateQueue,f.type=g.type,a=g.dependencies,f.dependencies=null===a?null:{lanes:a.lanes,firstContext:a.firstContext}),c=c.sibling;G(M,M.current&1|2);return b.child}a=\na.sibling}null!==f.tail&&B()>Hj&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304)}else{if(!d)if(a=Mh(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Ej(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Hj&&1073741824!==c&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=M.current,G(M,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Ij(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(gj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Jj(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return Jh(),E(Wf),E(H),Oh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Lh(b),null;case 13:E(M);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(M),null;case 4:return Jh(),null;case 10:return Rg(b.type._context),null;case 22:case 23:return Ij(),\nnull;case 24:return null;default:return null}}var Kj=!1,U=!1,Lj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Mj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Nj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Oj=!1;\nfunction Pj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Lg(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Oj;Oj=!1;return n}\nfunction Qj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Nj(b,c,f)}e=e.next}while(e!==d)}}function Rj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Sj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Tj(a){var b=a.alternate;null!==b&&(a.alternate=null,Tj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Uj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Vj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Uj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}\nfunction Xj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Xj(a,b,c),a=a.sibling;null!==a;)Xj(a,b,c),a=a.sibling}var X=null,Yj=!1;function Zj(a,b,c){for(c=c.child;null!==c;)ak(a,b,c),c=c.sibling}\nfunction ak(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Mj(c,b);case 6:var d=X,e=Yj;X=null;Zj(a,b,c);X=d;Yj=e;null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Yj;X=c.stateNode.containerInfo;Yj=!0;\nZj(a,b,c);X=d;Yj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Nj(c,b,g):0!==(f&4)&&Nj(c,b,g));e=e.next}while(e!==d)}Zj(a,b,c);break;case 1:if(!U&&(Mj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Zj(a,b,c);break;case 21:Zj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Zj(a,b,c),U=d):Zj(a,b,c);break;default:Zj(a,b,c)}}function bk(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Lj);b.forEach(function(b){var d=ck.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction dk(a,b){var c=b.deletions;if(null!==c)for(var d=0;d<c.length;d++){var e=c[d];try{var f=a,g=b,h=g;a:for(;null!==h;){switch(h.tag){case 5:X=h.stateNode;Yj=!1;break a;case 3:X=h.stateNode.containerInfo;Yj=!0;break a;case 4:X=h.stateNode.containerInfo;Yj=!0;break a}h=h.return}if(null===X)throw Error(p(160));ak(f,g,e);X=null;Yj=!1;var k=e.alternate;null!==k&&(k.return=null);e.return=null}catch(l){W(e,b,l)}}if(b.subtreeFlags&12854)for(b=b.child;null!==b;)ek(b,a),b=b.sibling}\nfunction ek(a,b){var c=a.alternate,d=a.flags;switch(a.tag){case 0:case 11:case 14:case 15:dk(b,a);fk(a);if(d&4){try{Qj(3,a,a.return),Rj(3,a)}catch(t){W(a,a.return,t)}try{Qj(5,a,a.return)}catch(t){W(a,a.return,t)}}break;case 1:dk(b,a);fk(a);d&512&&null!==c&&Mj(c,c.return);break;case 5:dk(b,a);fk(a);d&512&&null!==c&&Mj(c,c.return);if(a.flags&32){var e=a.stateNode;try{ob(e,\"\")}catch(t){W(a,a.return,t)}}if(d&4&&(e=a.stateNode,null!=e)){var f=a.memoizedProps,g=null!==c?c.memoizedProps:f,h=a.type,k=a.updateQueue;\na.updateQueue=null;if(null!==k)try{\"input\"===h&&\"radio\"===f.type&&null!=f.name&&ab(e,f);vb(h,g);var l=vb(h,f);for(g=0;g<k.length;g+=2){var m=k[g],q=k[g+1];\"style\"===m?sb(e,q):\"dangerouslySetInnerHTML\"===m?nb(e,q):\"children\"===m?ob(e,q):ta(e,m,q,l)}switch(h){case \"input\":bb(e,f);break;case \"textarea\":ib(e,f);break;case \"select\":var r=e._wrapperState.wasMultiple;e._wrapperState.wasMultiple=!!f.multiple;var y=f.value;null!=y?fb(e,!!f.multiple,y,!1):r!==!!f.multiple&&(null!=f.defaultValue?fb(e,!!f.multiple,\nf.defaultValue,!0):fb(e,!!f.multiple,f.multiple?[]:\"\",!1))}e[Pf]=f}catch(t){W(a,a.return,t)}}break;case 6:dk(b,a);fk(a);if(d&4){if(null===a.stateNode)throw Error(p(162));e=a.stateNode;f=a.memoizedProps;try{e.nodeValue=f}catch(t){W(a,a.return,t)}}break;case 3:dk(b,a);fk(a);if(d&4&&null!==c&&c.memoizedState.isDehydrated)try{bd(b.containerInfo)}catch(t){W(a,a.return,t)}break;case 4:dk(b,a);fk(a);break;case 13:dk(b,a);fk(a);e=a.child;e.flags&8192&&(f=null!==e.memoizedState,e.stateNode.isHidden=f,!f||\nnull!==e.alternate&&null!==e.alternate.memoizedState||(gk=B()));d&4&&bk(a);break;case 22:m=null!==c&&null!==c.memoizedState;a.mode&1?(U=(l=U)||m,dk(b,a),U=l):dk(b,a);fk(a);if(d&8192){l=null!==a.memoizedState;if((a.stateNode.isHidden=l)&&!m&&0!==(a.mode&1))for(V=a,m=a.child;null!==m;){for(q=V=m;null!==V;){r=V;y=r.child;switch(r.tag){case 0:case 11:case 14:case 15:Qj(4,r,r.return);break;case 1:Mj(r,r.return);var n=r.stateNode;if(\"function\"===typeof n.componentWillUnmount){d=r;c=r.return;try{b=d,n.props=\nb.memoizedProps,n.state=b.memoizedState,n.componentWillUnmount()}catch(t){W(d,c,t)}}break;case 5:Mj(r,r.return);break;case 22:if(null!==r.memoizedState){hk(q);continue}}null!==y?(y.return=r,V=y):hk(q)}m=m.sibling}a:for(m=null,q=a;;){if(5===q.tag){if(null===m){m=q;try{e=q.stateNode,l?(f=e.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(h=q.stateNode,k=q.memoizedProps.style,g=void 0!==k&&null!==k&&k.hasOwnProperty(\"display\")?k.display:null,h.style.display=\nrb(\"display\",g))}catch(t){W(a,a.return,t)}}}else if(6===q.tag){if(null===m)try{q.stateNode.nodeValue=l?\"\":q.memoizedProps}catch(t){W(a,a.return,t)}}else if((22!==q.tag&&23!==q.tag||null===q.memoizedState||q===a)&&null!==q.child){q.child.return=q;q=q.child;continue}if(q===a)break a;for(;null===q.sibling;){if(null===q.return||q.return===a)break a;m===q&&(m=null);q=q.return}m===q&&(m=null);q.sibling.return=q.return;q=q.sibling}}break;case 19:dk(b,a);fk(a);d&4&&bk(a);break;case 21:break;default:dk(b,\na),fk(a)}}function fk(a){var b=a.flags;if(b&2){try{a:{for(var c=a.return;null!==c;){if(Uj(c)){var d=c;break a}c=c.return}throw Error(p(160));}switch(d.tag){case 5:var e=d.stateNode;d.flags&32&&(ob(e,\"\"),d.flags&=-33);var f=Vj(a);Xj(a,f,e);break;case 3:case 4:var g=d.stateNode.containerInfo,h=Vj(a);Wj(a,h,g);break;default:throw Error(p(161));}}catch(k){W(a,a.return,k)}a.flags&=-3}b&4096&&(a.flags&=-4097)}function ik(a,b,c){V=a;jk(a,b,c)}\nfunction jk(a,b,c){for(var d=0!==(a.mode&1);null!==V;){var e=V,f=e.child;if(22===e.tag&&d){var g=null!==e.memoizedState||Kj;if(!g){var h=e.alternate,k=null!==h&&null!==h.memoizedState||U;h=Kj;var l=U;Kj=g;if((U=k)&&!l)for(V=e;null!==V;)g=V,k=g.child,22===g.tag&&null!==g.memoizedState?kk(e):null!==k?(k.return=g,V=k):kk(e);for(;null!==f;)V=f,jk(f,b,c),f=f.sibling;V=e;Kj=h;U=l}lk(a,b,c)}else 0!==(e.subtreeFlags&8772)&&null!==f?(f.return=e,V=f):lk(a,b,c)}}\nfunction lk(a){for(;null!==V;){var b=V;if(0!==(b.flags&8772)){var c=b.alternate;try{if(0!==(b.flags&8772))switch(b.tag){case 0:case 11:case 15:U||Rj(5,b);break;case 1:var d=b.stateNode;if(b.flags&4&&!U)if(null===c)d.componentDidMount();else{var e=b.elementType===b.type?c.memoizedProps:Lg(b.type,c.memoizedProps);d.componentDidUpdate(e,c.memoizedState,d.__reactInternalSnapshotBeforeUpdate)}var f=b.updateQueue;null!==f&&ih(b,f,d);break;case 3:var g=b.updateQueue;if(null!==g){c=null;if(null!==b.child)switch(b.child.tag){case 5:c=\nb.child.stateNode;break;case 1:c=b.child.stateNode}ih(b,g,c)}break;case 5:var h=b.stateNode;if(null===c&&b.flags&4){c=h;var k=b.memoizedProps;switch(b.type){case \"button\":case \"input\":case \"select\":case \"textarea\":k.autoFocus&&c.focus();break;case \"img\":k.src&&(c.src=k.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(null===b.memoizedState){var l=b.alternate;if(null!==l){var m=l.memoizedState;if(null!==m){var q=m.dehydrated;null!==q&&bd(q)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;\ndefault:throw Error(p(163));}U||b.flags&512&&Sj(b)}catch(r){W(b,b.return,r)}}if(b===a){V=null;break}c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}function hk(a){for(;null!==V;){var b=V;if(b===a){V=null;break}var c=b.sibling;if(null!==c){c.return=b.return;V=c;break}V=b.return}}\nfunction kk(a){for(;null!==V;){var b=V;try{switch(b.tag){case 0:case 11:case 15:var c=b.return;try{Rj(4,b)}catch(k){W(b,c,k)}break;case 1:var d=b.stateNode;if(\"function\"===typeof d.componentDidMount){var e=b.return;try{d.componentDidMount()}catch(k){W(b,e,k)}}var f=b.return;try{Sj(b)}catch(k){W(b,f,k)}break;case 5:var g=b.return;try{Sj(b)}catch(k){W(b,g,k)}}}catch(k){W(b,b.return,k)}if(b===a){V=null;break}var h=b.sibling;if(null!==h){h.return=b.return;V=h;break}V=b.return}}\nvar mk=Math.ceil,nk=ua.ReactCurrentDispatcher,ok=ua.ReactCurrentOwner,pk=ua.ReactCurrentBatchConfig,K=0,R=null,Y=null,Z=0,gj=0,fj=Uf(0),T=0,qk=null,hh=0,rk=0,sk=0,tk=null,uk=null,gk=0,Hj=Infinity,vk=null,Pi=!1,Qi=null,Si=null,wk=!1,xk=null,yk=0,zk=0,Ak=null,Bk=-1,Ck=0;function L(){return 0!==(K&6)?B():-1!==Bk?Bk:Bk=B()}\nfunction lh(a){if(0===(a.mode&1))return 1;if(0!==(K&2)&&0!==Z)return Z&-Z;if(null!==Kg.transition)return 0===Ck&&(Ck=yc()),Ck;a=C;if(0!==a)return a;a=window.event;a=void 0===a?16:jd(a.type);return a}function mh(a,b,c,d){if(50<zk)throw zk=0,Ak=null,Error(p(185));Ac(a,c,d);if(0===(K&2)||a!==R)a===R&&(0===(K&2)&&(rk|=c),4===T&&Dk(a,Z)),Ek(a,d),1===c&&0===K&&0===(b.mode&1)&&(Hj=B()+500,fg&&jg())}\nfunction Ek(a,b){var c=a.callbackNode;wc(a,b);var d=uc(a,a===R?Z:0);if(0===d)null!==c&&bc(c),a.callbackNode=null,a.callbackPriority=0;else if(b=d&-d,a.callbackPriority!==b){null!=c&&bc(c);if(1===b)0===a.tag?ig(Fk.bind(null,a)):hg(Fk.bind(null,a)),Jf(function(){0===(K&6)&&jg()}),c=null;else{switch(Dc(d)){case 1:c=fc;break;case 4:c=gc;break;case 16:c=hc;break;case 536870912:c=jc;break;default:c=hc}c=Gk(c,Hk.bind(null,a))}a.callbackPriority=b;a.callbackNode=c}}\nfunction Hk(a,b){Bk=-1;Ck=0;if(0!==(K&6))throw Error(p(327));var c=a.callbackNode;if(Ik()&&a.callbackNode!==c)return null;var d=uc(a,a===R?Z:0);if(0===d)return null;if(0!==(d&30)||0!==(d&a.expiredLanes)||b)b=Jk(a,d);else{b=d;var e=K;K|=2;var f=Kk();if(R!==a||Z!==b)vk=null,Hj=B()+500,Lk(a,b);do try{Mk();break}catch(h){Nk(a,h)}while(1);Qg();nk.current=f;K=e;null!==Y?b=0:(R=null,Z=0,b=T)}if(0!==b){2===b&&(e=xc(a),0!==e&&(d=e,b=Ok(a,e)));if(1===b)throw c=qk,Lk(a,0),Dk(a,d),Ek(a,B()),c;if(6===b)Dk(a,d);\nelse{e=a.current.alternate;if(0===(d&30)&&!Pk(e)&&(b=Jk(a,d),2===b&&(f=xc(a),0!==f&&(d=f,b=Ok(a,f))),1===b))throw c=qk,Lk(a,0),Dk(a,d),Ek(a,B()),c;a.finishedWork=e;a.finishedLanes=d;switch(b){case 0:case 1:throw Error(p(345));case 2:Qk(a,uk,vk);break;case 3:Dk(a,d);if((d&130023424)===d&&(b=gk+500-B(),10<b)){if(0!==uc(a,0))break;e=a.suspendedLanes;if((e&d)!==d){L();a.pingedLanes|=a.suspendedLanes&e;break}a.timeoutHandle=Ff(Qk.bind(null,a,uk,vk),b);break}Qk(a,uk,vk);break;case 4:Dk(a,d);if((d&4194240)===\nd)break;b=a.eventTimes;for(e=-1;0<d;){var g=31-oc(d);f=1<<g;g=b[g];g>e&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*mk(d/1960))-d;if(10<d){a.timeoutHandle=Ff(Qk.bind(null,a,uk,vk),d);break}Qk(a,uk,vk);break;case 5:Qk(a,uk,vk);break;default:throw Error(p(329));}}}Ek(a,B());return a.callbackNode===c?Hk.bind(null,a):null}\nfunction Ok(a,b){var c=tk;a.current.memoizedState.isDehydrated&&(Lk(a,b).flags|=256);a=Jk(a,b);2!==a&&(b=uk,uk=c,null!==b&&Gj(b));return a}function Gj(a){null===uk?uk=a:uk.push.apply(uk,a)}\nfunction Pk(a){for(var b=a;;){if(b.flags&16384){var c=b.updateQueue;if(null!==c&&(c=c.stores,null!==c))for(var d=0;d<c.length;d++){var e=c[d],f=e.getSnapshot;e=e.value;try{if(!He(f(),e))return!1}catch(g){return!1}}}c=b.child;if(b.subtreeFlags&16384&&null!==c)c.return=b,b=c;else{if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return!0;b=b.return}b.sibling.return=b.return;b=b.sibling}}return!0}\nfunction Dk(a,b){b&=~sk;b&=~rk;a.suspendedLanes|=b;a.pingedLanes&=~b;for(a=a.expirationTimes;0<b;){var c=31-oc(b),d=1<<c;a[c]=-1;b&=~d}}function Fk(a){if(0!==(K&6))throw Error(p(327));Ik();var b=uc(a,0);if(0===(b&1))return Ek(a,B()),null;var c=Jk(a,b);if(0!==a.tag&&2===c){var d=xc(a);0!==d&&(b=d,c=Ok(a,d))}if(1===c)throw c=qk,Lk(a,0),Dk(a,b),Ek(a,B()),c;if(6===c)throw Error(p(345));a.finishedWork=a.current.alternate;a.finishedLanes=b;Qk(a,uk,vk);Ek(a,B());return null}\nfunction Rk(a,b){var c=K;K|=1;try{return a(b)}finally{K=c,0===K&&(Hj=B()+500,fg&&jg())}}function Sk(a){null!==xk&&0===xk.tag&&0===(K&6)&&Ik();var b=K;K|=1;var c=pk.transition,d=C;try{if(pk.transition=null,C=1,a)return a()}finally{C=d,pk.transition=c,K=b,0===(K&6)&&jg()}}function Ij(){gj=fj.current;E(fj)}\nfunction Lk(a,b){a.finishedWork=null;a.finishedLanes=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Gf(c));if(null!==Y)for(c=Y.return;null!==c;){var d=c;wg(d);switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&$f();break;case 3:Jh();E(Wf);E(H);Oh();break;case 5:Lh(d);break;case 4:Jh();break;case 13:E(M);break;case 19:E(M);break;case 10:Rg(d.type._context);break;case 22:case 23:Ij()}c=c.return}R=a;Y=a=wh(a.current,null);Z=gj=b;T=0;qk=null;sk=rk=hh=0;uk=tk=null;if(null!==Wg){for(b=\n0;b<Wg.length;b++)if(c=Wg[b],d=c.interleaved,null!==d){c.interleaved=null;var e=d.next,f=c.pending;if(null!==f){var g=f.next;f.next=e;d.next=g}c.pending=d}Wg=null}return a}\nfunction Nk(a,b){do{var c=Y;try{Qg();Ph.current=ai;if(Sh){for(var d=N.memoizedState;null!==d;){var e=d.queue;null!==e&&(e.pending=null);d=d.next}Sh=!1}Rh=0;P=O=N=null;Th=!1;Uh=0;ok.current=null;if(null===c||null===c.return){T=1;qk=b;Y=null;break}a:{var f=a,g=c.return,h=c,k=b;b=Z;h.flags|=32768;if(null!==k&&\"object\"===typeof k&&\"function\"===typeof k.then){var l=k,m=h,q=m.tag;if(0===(m.mode&1)&&(0===q||11===q||15===q)){var r=m.alternate;r?(m.updateQueue=r.updateQueue,m.memoizedState=r.memoizedState,\nm.lanes=r.lanes):(m.updateQueue=null,m.memoizedState=null)}var y=Vi(g);if(null!==y){y.flags&=-257;Wi(y,g,h,f,b);y.mode&1&&Ti(f,l,b);b=y;k=l;var n=b.updateQueue;if(null===n){var t=new Set;t.add(k);b.updateQueue=t}else n.add(k);break a}else{if(0===(b&1)){Ti(f,l,b);uj();break a}k=Error(p(426))}}else if(I&&h.mode&1){var J=Vi(g);if(null!==J){0===(J.flags&65536)&&(J.flags|=256);Wi(J,g,h,f,b);Jg(Ki(k,h));break a}}f=k=Ki(k,h);4!==T&&(T=2);null===tk?tk=[f]:tk.push(f);f=g;do{switch(f.tag){case 3:f.flags|=65536;\nb&=-b;f.lanes|=b;var x=Oi(f,k,b);fh(f,x);break a;case 1:h=k;var w=f.type,u=f.stateNode;if(0===(f.flags&128)&&(\"function\"===typeof w.getDerivedStateFromError||null!==u&&\"function\"===typeof u.componentDidCatch&&(null===Si||!Si.has(u)))){f.flags|=65536;b&=-b;f.lanes|=b;var F=Ri(f,h,b);fh(f,F);break a}}f=f.return}while(null!==f)}Tk(c)}catch(na){b=na;Y===c&&null!==c&&(Y=c=c.return);continue}break}while(1)}function Kk(){var a=nk.current;nk.current=ai;return null===a?ai:a}\nfunction uj(){if(0===T||3===T||2===T)T=4;null===R||0===(hh&268435455)&&0===(rk&268435455)||Dk(R,Z)}function Jk(a,b){var c=K;K|=2;var d=Kk();if(R!==a||Z!==b)vk=null,Lk(a,b);do try{Uk();break}catch(e){Nk(a,e)}while(1);Qg();K=c;nk.current=d;if(null!==Y)throw Error(p(261));R=null;Z=0;return T}function Uk(){for(;null!==Y;)Vk(Y)}function Mk(){for(;null!==Y&&!cc();)Vk(Y)}function Vk(a){var b=Wk(a.alternate,a,gj);a.memoizedProps=a.pendingProps;null===b?Tk(a):Y=b;ok.current=null}\nfunction Tk(a){var b=a;do{var c=b.alternate;a=b.return;if(0===(b.flags&32768)){if(c=Fj(c,b,gj),null!==c){Y=c;return}}else{c=Jj(c,b);if(null!==c){c.flags&=32767;Y=c;return}if(null!==a)a.flags|=32768,a.subtreeFlags=0,a.deletions=null;else{T=6;Y=null;return}}b=b.sibling;if(null!==b){Y=b;return}Y=b=a}while(null!==b);0===T&&(T=5)}function Qk(a,b,c){var d=C,e=pk.transition;try{pk.transition=null,C=1,Xk(a,b,c,d)}finally{pk.transition=e,C=d}return null}\nfunction Xk(a,b,c,d){do Ik();while(null!==xk);if(0!==(K&6))throw Error(p(327));c=a.finishedWork;var e=a.finishedLanes;if(null===c)return null;a.finishedWork=null;a.finishedLanes=0;if(c===a.current)throw Error(p(177));a.callbackNode=null;a.callbackPriority=0;var f=c.lanes|c.childLanes;Bc(a,f);a===R&&(Y=R=null,Z=0);0===(c.subtreeFlags&2064)&&0===(c.flags&2064)||wk||(wk=!0,Gk(hc,function(){Ik();return null}));f=0!==(c.flags&15990);if(0!==(c.subtreeFlags&15990)||f){f=pk.transition;pk.transition=null;\nvar g=C;C=1;var h=K;K|=4;ok.current=null;Pj(a,c);ek(c,a);Oe(Df);dd=!!Cf;Df=Cf=null;a.current=c;ik(c,a,e);dc();K=h;C=g;pk.transition=f}else a.current=c;wk&&(wk=!1,xk=a,yk=e);f=a.pendingLanes;0===f&&(Si=null);mc(c.stateNode,d);Ek(a,B());if(null!==b)for(d=a.onRecoverableError,c=0;c<b.length;c++)e=b[c],d(e.value,{componentStack:e.stack,digest:e.digest});if(Pi)throw Pi=!1,a=Qi,Qi=null,a;0!==(yk&1)&&0!==a.tag&&Ik();f=a.pendingLanes;0!==(f&1)?a===Ak?zk++:(zk=0,Ak=a):zk=0;jg();return null}\nfunction Ik(){if(null!==xk){var a=Dc(yk),b=pk.transition,c=C;try{pk.transition=null;C=16>a?16:a;if(null===xk)var d=!1;else{a=xk;xk=null;yk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;k<h.length;k++){var l=h[k];for(V=l;null!==V;){var m=V;switch(m.tag){case 0:case 11:case 15:Qj(8,m,f)}var q=m.child;if(null!==q)q.return=m,V=q;else for(;null!==V;){m=V;var r=m.sibling,y=m.return;Tj(m);if(m===\nl){V=null;break}if(null!==r){r.return=y;V=r;break}V=y}}}var n=f.alternate;if(null!==n){var t=n.child;if(null!==t){n.child=null;do{var J=t.sibling;t.sibling=null;t=J}while(null!==t)}}V=f}}if(0!==(f.subtreeFlags&2064)&&null!==g)g.return=f,V=g;else b:for(;null!==V;){f=V;if(0!==(f.flags&2048))switch(f.tag){case 0:case 11:case 15:Qj(9,f,f.return)}var x=f.sibling;if(null!==x){x.return=f.return;V=x;break b}V=f.return}}var w=a.current;for(V=w;null!==V;){g=V;var u=g.child;if(0!==(g.subtreeFlags&2064)&&null!==\nu)u.return=g,V=u;else b:for(g=w;null!==V;){h=V;if(0!==(h.flags&2048))try{switch(h.tag){case 0:case 11:case 15:Rj(9,h)}}catch(na){W(h,h.return,na)}if(h===g){V=null;break b}var F=h.sibling;if(null!==F){F.return=h.return;V=F;break b}V=h.return}}K=e;jg();if(lc&&\"function\"===typeof lc.onPostCommitFiberRoot)try{lc.onPostCommitFiberRoot(kc,a)}catch(na){}d=!0}return d}finally{C=c,pk.transition=b}}return!1}function Yk(a,b,c){b=Ki(c,b);b=Oi(a,b,1);a=dh(a,b,1);b=L();null!==a&&(Ac(a,1,b),Ek(a,b))}\nfunction W(a,b,c){if(3===a.tag)Yk(a,a,c);else for(;null!==b;){if(3===b.tag){Yk(b,a,c);break}else if(1===b.tag){var d=b.stateNode;if(\"function\"===typeof b.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===Si||!Si.has(d))){a=Ki(c,a);a=Ri(b,a,1);b=dh(b,a,1);a=L();null!==b&&(Ac(b,1,a),Ek(b,a));break}}b=b.return}}\nfunction Ui(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);b=L();a.pingedLanes|=a.suspendedLanes&c;R===a&&(Z&c)===c&&(4===T||3===T&&(Z&130023424)===Z&&500>B()-gk?Lk(a,0):sk|=c);Ek(a,b)}function Zk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=L();a=Zg(a,b);null!==a&&(Ac(a,b,c),Ek(a,c))}function vj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Zk(a,c)}\nfunction ck(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Zk(a,c)}var Wk;\nWk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)Ug=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return Ug=!1,zj(a,b,c);Ug=0!==(a.flags&131072)?!0:!1}else Ug=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;jj(a,b);a=b.pendingProps;var e=Yf(b,H.current);Tg(b,c);e=Xh(null,b,d,a,e,c);var f=bi();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,ah(b),e.updater=nh,b.stateNode=e,e._reactInternals=b,rh(b,d,a,c),b=kj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Yi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{jj(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=$k(d);a=Lg(d,a);switch(e){case 0:b=dj(null,b,d,a,c);break a;case 1:b=ij(null,b,d,a,c);break a;case 11:b=Zi(null,b,d,a,c);break a;case 14:b=aj(null,b,d,Lg(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),dj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),ij(a,b,d,e,c);case 3:a:{lj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;bh(a,b);gh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ki(Error(p(423)),b);b=mj(a,b,d,c,e);break a}else if(d!==e){e=Ki(Error(p(424)),b);b=mj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Ch(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=$i(a,b,c);break a}Yi(a,b,d,c)}b=b.child}return b;case 5:return Kh(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\nhj(a,b),Yi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return pj(a,b,c);case 4:return Ih(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Bh(b,null,d,c):Yi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),Zi(a,b,d,e,c);case 7:return Yi(a,b,b.pendingProps,c),b.child;case 8:return Yi(a,b,b.pendingProps.children,c),b.child;case 12:return Yi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Mg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=$i(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=ch(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);Sg(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);Sg(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Yi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,Tg(b,c),e=Vg(e),d=d(e),b.flags|=1,Yi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Lg(d,b.pendingProps),e=Lg(d.type,e),aj(a,b,d,e,c);case 15:return cj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),jj(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,Tg(b,c),ph(b,d,e),rh(b,d,e,c),kj(null,b,d,!0,a,c);case 19:return yj(a,b,c);case 22:return ej(a,b,c)}throw Error(p(156,b.tag));};function Gk(a,b){return ac(a,b)}\nfunction al(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new al(a,b,c,d)}function bj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction $k(a){if(\"function\"===typeof a)return bj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction wh(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction yh(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Ah(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return qj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Ah(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function qj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function xh(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction zh(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction bl(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function cl(a,b,c,d,e,f,g,h,k){a=new bl(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};ah(f);return a}function dl(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:wa,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nfunction el(a){if(!a)return Vf;a=a._reactInternals;a:{if(Vb(a)!==a||1!==a.tag)throw Error(p(170));var b=a;do{switch(b.tag){case 3:b=b.stateNode.context;break a;case 1:if(Zf(b.type)){b=b.stateNode.__reactInternalMemoizedMergedChildContext;break a}}b=b.return}while(null!==b);throw Error(p(171));}if(1===a.tag){var c=a.type;if(Zf(c))return bg(a,c,b)}return b}\nfunction fl(a,b,c,d,e,f,g,h,k){a=cl(c,d,!0,a,e,f,g,h,k);a.context=el(null);c=a.current;d=L();e=lh(c);f=ch(d,e);f.callback=void 0!==b&&null!==b?b:null;dh(c,f,e);a.current.lanes=e;Ac(a,e,d);Ek(a,d);return a}function gl(a,b,c,d){var e=b.current,f=L(),g=lh(e);c=el(c);null===b.context?b.context=c:b.pendingContext=c;b=ch(f,g);b.payload={element:a};d=void 0===d?null:d;null!==d&&(b.callback=d);a=dh(e,b,g);null!==a&&(mh(a,e,g,f),eh(a,e,g));return g}\nfunction hl(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function il(a,b){a=a.memoizedState;if(null!==a&&null!==a.dehydrated){var c=a.retryLane;a.retryLane=0!==c&&c<b?c:b}}function jl(a,b){il(a,b);(a=a.alternate)&&il(a,b)}function kl(){return null}var ll=\"function\"===typeof reportError?reportError:function(a){console.error(a)};function ml(a){this._internalRoot=a}\nnl.prototype.render=ml.prototype.render=function(a){var b=this._internalRoot;if(null===b)throw Error(p(409));gl(a,b,null,null)};nl.prototype.unmount=ml.prototype.unmount=function(){var a=this._internalRoot;if(null!==a){this._internalRoot=null;var b=a.containerInfo;Sk(function(){gl(null,a,null,null)});b[uf]=null}};function nl(a){this._internalRoot=a}\nnl.prototype.unstable_scheduleHydration=function(a){if(a){var b=Hc();a={blockedOn:null,target:a,priority:b};for(var c=0;c<Qc.length&&0!==b&&b<Qc[c].priority;c++);Qc.splice(c,0,a);0===c&&Vc(a)}};function ol(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType)}function pl(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function ql(){}\nfunction rl(a,b,c,d,e){if(e){if(\"function\"===typeof d){var f=d;d=function(){var a=hl(g);f.call(a)}}var g=fl(b,d,a,0,null,!1,!1,\"\",ql);a._reactRootContainer=g;a[uf]=g.current;sf(8===a.nodeType?a.parentNode:a);Sk();return g}for(;e=a.lastChild;)a.removeChild(e);if(\"function\"===typeof d){var h=d;d=function(){var a=hl(k);h.call(a)}}var k=cl(a,0,!1,null,null,!1,!1,\"\",ql);a._reactRootContainer=k;a[uf]=k.current;sf(8===a.nodeType?a.parentNode:a);Sk(function(){gl(b,k,c,d)});return k}\nfunction sl(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f;if(\"function\"===typeof e){var h=e;e=function(){var a=hl(g);h.call(a)}}gl(b,g,a,e)}else g=rl(c,b,a,e,d);return hl(g)}Ec=function(a){switch(a.tag){case 3:var b=a.stateNode;if(b.current.memoizedState.isDehydrated){var c=tc(b.pendingLanes);0!==c&&(Cc(b,c|1),Ek(b,B()),0===(K&6)&&(Hj=B()+500,jg()))}break;case 13:Sk(function(){var b=Zg(a,1);if(null!==b){var c=L();mh(b,a,1,c)}}),jl(a,1)}};\nFc=function(a){if(13===a.tag){var b=Zg(a,134217728);if(null!==b){var c=L();mh(b,a,134217728,c)}jl(a,134217728)}};Gc=function(a){if(13===a.tag){var b=lh(a),c=Zg(a,b);if(null!==c){var d=L();mh(c,a,b,d)}jl(a,b)}};Hc=function(){return C};Ic=function(a,b){var c=C;try{return C=a,b()}finally{C=c}};\nyb=function(a,b,c){switch(b){case \"input\":bb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Db(d);if(!e)throw Error(p(90));Wa(d);bb(d,e)}}}break;case \"textarea\":ib(a,c);break;case \"select\":b=c.value,null!=b&&fb(a,!!c.multiple,b,!1)}};Gb=Rk;Hb=Sk;\nvar tl={usingClientEntryPoint:!1,Events:[Cb,ue,Db,Eb,Fb,Rk]},ul={findFiberByHostInstance:Wc,bundleType:0,version:\"18.2.0\",rendererPackageName:\"react-dom\"};\nvar vl={bundleType:ul.bundleType,version:ul.version,rendererPackageName:ul.rendererPackageName,rendererConfig:ul.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:ua.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=Zb(a);return null===a?null:a.stateNode},findFiberByHostInstance:ul.findFiberByHostInstance||\nkl,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.2.0-next-9e3b772b8-20220608\"};if(\"undefined\"!==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var wl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!wl.isDisabled&&wl.supportsFiber)try{kc=wl.inject(vl),lc=wl}catch(a){}}exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=tl;\nexports.createPortal=function(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!ol(b))throw Error(p(200));return dl(a,b,null,c)};exports.createRoot=function(a,b){if(!ol(a))throw Error(p(299));var c=!1,d=\"\",e=ll;null!==b&&void 0!==b&&(!0===b.unstable_strictMode&&(c=!0),void 0!==b.identifierPrefix&&(d=b.identifierPrefix),void 0!==b.onRecoverableError&&(e=b.onRecoverableError));b=cl(a,1,!1,null,null,c,!1,d,e);a[uf]=b.current;sf(8===a.nodeType?a.parentNode:a);return new ml(b)};\nexports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternals;if(void 0===b){if(\"function\"===typeof a.render)throw Error(p(188));a=Object.keys(a).join(\",\");throw Error(p(268,a));}a=Zb(b);a=null===a?null:a.stateNode;return a};exports.flushSync=function(a){return Sk(a)};exports.hydrate=function(a,b,c){if(!pl(b))throw Error(p(200));return sl(null,a,b,!0,c)};\nexports.hydrateRoot=function(a,b,c){if(!ol(a))throw Error(p(405));var d=null!=c&&c.hydratedSources||null,e=!1,f=\"\",g=ll;null!==c&&void 0!==c&&(!0===c.unstable_strictMode&&(e=!0),void 0!==c.identifierPrefix&&(f=c.identifierPrefix),void 0!==c.onRecoverableError&&(g=c.onRecoverableError));b=fl(b,null,a,1,null!=c?c:null,e,!1,f,g);a[uf]=b.current;sf(a);if(d)for(a=0;a<d.length;a++)c=d[a],e=c._getVersion,e=e(c._source),null==b.mutableSourceEagerHydrationData?b.mutableSourceEagerHydrationData=[c,e]:b.mutableSourceEagerHydrationData.push(c,\ne);return new nl(b)};exports.render=function(a,b,c){if(!pl(b))throw Error(p(200));return sl(null,a,b,!1,c)};exports.unmountComponentAtNode=function(a){if(!pl(a))throw Error(p(40));return a._reactRootContainer?(Sk(function(){sl(null,null,a,!1,function(){a._reactRootContainer=null;a[uf]=null})}),!0):!1};exports.unstable_batchedUpdates=Rk;\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!pl(c))throw Error(p(200));if(null==a||void 0===a._reactInternals)throw Error(p(38));return sl(a,b,c,!1,d)};exports.version=\"18.2.0-next-9e3b772b8-20220608\";\n","'use strict';\n\nvar m = require('react-dom');\nif (process.env.NODE_ENV === 'production') {\n  exports.createRoot = m.createRoot;\n  exports.hydrateRoot = m.hydrateRoot;\n} else {\n  var i = m.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n  exports.createRoot = function(c, o) {\n    i.usingClientEntryPoint = true;\n    try {\n      return m.createRoot(c, o);\n    } finally {\n      i.usingClientEntryPoint = false;\n    }\n  };\n  exports.hydrateRoot = function(c, h, o) {\n    i.usingClientEntryPoint = true;\n    try {\n      return m.hydrateRoot(c, h, o);\n    } finally {\n      i.usingClientEntryPoint = false;\n    }\n  };\n}\n","'use strict';\n\nfunction checkDCE() {\n  /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n  if (\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n    typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n  ) {\n    return;\n  }\n  if (process.env.NODE_ENV !== 'production') {\n    // This branch is unreachable because this function is only called\n    // in production, but the condition is true only in development.\n    // Therefore if the branch is still here, dead code elimination wasn't\n    // properly applied.\n    // Don't change the message. React DevTools relies on it. Also make sure\n    // this message doesn't occur elsewhere in this function, or it will cause\n    // a false positive.\n    throw new Error('^_^');\n  }\n  try {\n    // Verify that the code above has been dead code eliminated (DCE'd).\n    __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n  } catch (err) {\n    // DevTools shouldn't crash React, no matter what.\n    // We should still report in case we break this code.\n    console.error(err);\n  }\n}\n\nif (process.env.NODE_ENV === 'production') {\n  // DCE check should happen before ReactDOM bundle executes so that\n  // DevTools can report bad minification during injection.\n  checkDCE();\n  module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n  module.exports = require('./cjs/react-dom.development.js');\n}\n","/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var f=require(\"react\"),k=Symbol.for(\"react.element\"),l=Symbol.for(\"react.fragment\"),m=Object.prototype.hasOwnProperty,n=f.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,p={key:!0,ref:!0,__self:!0,__source:!0};\nfunction q(c,a,g){var b,d={},e=null,h=null;void 0!==g&&(e=\"\"+g);void 0!==a.key&&(e=\"\"+a.key);void 0!==a.ref&&(h=a.ref);for(b in a)m.call(a,b)&&!p.hasOwnProperty(b)&&(d[b]=a[b]);if(c&&c.defaultProps)for(b in a=c.defaultProps,a)void 0===d[b]&&(d[b]=a[b]);return{$$typeof:k,type:c,key:e,ref:h,props:d,_owner:n.current}}exports.Fragment=l;exports.jsx=q;exports.jsxs=q;\n","/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var l=Symbol.for(\"react.element\"),n=Symbol.for(\"react.portal\"),p=Symbol.for(\"react.fragment\"),q=Symbol.for(\"react.strict_mode\"),r=Symbol.for(\"react.profiler\"),t=Symbol.for(\"react.provider\"),u=Symbol.for(\"react.context\"),v=Symbol.for(\"react.forward_ref\"),w=Symbol.for(\"react.suspense\"),x=Symbol.for(\"react.memo\"),y=Symbol.for(\"react.lazy\"),z=Symbol.iterator;function A(a){if(null===a||\"object\"!==typeof a)return null;a=z&&a[z]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}\nvar B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},C=Object.assign,D={};function E(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}E.prototype.isReactComponent={};\nE.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(\"setState(...): takes an object of state variables to update or a function which returns an object of state variables.\");this.updater.enqueueSetState(this,a,b,\"setState\")};E.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};function F(){}F.prototype=E.prototype;function G(a,b,e){this.props=a;this.context=b;this.refs=D;this.updater=e||B}var H=G.prototype=new F;\nH.constructor=G;C(H,E.prototype);H.isPureReactComponent=!0;var I=Array.isArray,J=Object.prototype.hasOwnProperty,K={current:null},L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,e){var d,c={},k=null,h=null;if(null!=b)for(d in void 0!==b.ref&&(h=b.ref),void 0!==b.key&&(k=\"\"+b.key),b)J.call(b,d)&&!L.hasOwnProperty(d)&&(c[d]=b[d]);var g=arguments.length-2;if(1===g)c.children=e;else if(1<g){for(var f=Array(g),m=0;m<g;m++)f[m]=arguments[m+2];c.children=f}if(a&&a.defaultProps)for(d in g=a.defaultProps,g)void 0===c[d]&&(c[d]=g[d]);return{$$typeof:l,type:a,key:k,ref:h,props:c,_owner:K.current}}\nfunction N(a,b){return{$$typeof:l,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===l}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+a.replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g;function Q(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(\"\"+a.key):b.toString(36)}\nfunction R(a,b,e,d,c){var k=typeof a;if(\"undefined\"===k||\"boolean\"===k)a=null;var h=!1;if(null===a)h=!0;else switch(k){case \"string\":case \"number\":h=!0;break;case \"object\":switch(a.$$typeof){case l:case n:h=!0}}if(h)return h=a,c=c(h),a=\"\"===d?\".\"+Q(h,0):d,I(c)?(e=\"\",null!=a&&(e=a.replace(P,\"$&/\")+\"/\"),R(c,b,e,\"\",function(a){return a})):null!=c&&(O(c)&&(c=N(c,e+(!c.key||h&&h.key===c.key?\"\":(\"\"+c.key).replace(P,\"$&/\")+\"/\")+a)),b.push(c)),1;h=0;d=\"\"===d?\".\":d+\":\";if(I(a))for(var g=0;g<a.length;g++){k=\na[g];var f=d+Q(k,g);h+=R(k,b,e,f,c)}else if(f=A(a),\"function\"===typeof f)for(a=f.call(a),g=0;!(k=a.next()).done;)k=k.value,f=d+Q(k,g++),h+=R(k,b,e,f,c);else if(\"object\"===k)throw b=String(a),Error(\"Objects are not valid as a React child (found: \"+(\"[object Object]\"===b?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":b)+\"). If you meant to render a collection of children, use an array instead.\");return h}\nfunction S(a,b,e){if(null==a)return a;var d=[],c=0;R(a,d,\"\",\"\",function(a){return b.call(e,a,c++)});return d}function T(a){if(-1===a._status){var b=a._result;b=b();b.then(function(b){if(0===a._status||-1===a._status)a._status=1,a._result=b},function(b){if(0===a._status||-1===a._status)a._status=2,a._result=b});-1===a._status&&(a._status=0,a._result=b)}if(1===a._status)return a._result.default;throw a._result;}\nvar U={current:null},V={transition:null},W={ReactCurrentDispatcher:U,ReactCurrentBatchConfig:V,ReactCurrentOwner:K};exports.Children={map:S,forEach:function(a,b,e){S(a,function(){b.apply(this,arguments)},e)},count:function(a){var b=0;S(a,function(){b++});return b},toArray:function(a){return S(a,function(a){return a})||[]},only:function(a){if(!O(a))throw Error(\"React.Children.only expected to receive a single React element child.\");return a}};exports.Component=E;exports.Fragment=p;\nexports.Profiler=r;exports.PureComponent=G;exports.StrictMode=q;exports.Suspense=w;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=W;\nexports.cloneElement=function(a,b,e){if(null===a||void 0===a)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+a+\".\");var d=C({},a.props),c=a.key,k=a.ref,h=a._owner;if(null!=b){void 0!==b.ref&&(k=b.ref,h=K.current);void 0!==b.key&&(c=\"\"+b.key);if(a.type&&a.type.defaultProps)var g=a.type.defaultProps;for(f in b)J.call(b,f)&&!L.hasOwnProperty(f)&&(d[f]=void 0===b[f]&&void 0!==g?g[f]:b[f])}var f=arguments.length-2;if(1===f)d.children=e;else if(1<f){g=Array(f);\nfor(var m=0;m<f;m++)g[m]=arguments[m+2];d.children=g}return{$$typeof:l,type:a.type,key:c,ref:k,props:d,_owner:h}};exports.createContext=function(a){a={$$typeof:u,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null};a.Provider={$$typeof:t,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};\nexports.forwardRef=function(a){return{$$typeof:v,render:a}};exports.isValidElement=O;exports.lazy=function(a){return{$$typeof:y,_payload:{_status:-1,_result:a},_init:T}};exports.memo=function(a,b){return{$$typeof:x,type:a,compare:void 0===b?null:b}};exports.startTransition=function(a){var b=V.transition;V.transition={};try{a()}finally{V.transition=b}};exports.unstable_act=function(){throw Error(\"act(...) is not supported in production builds of React.\");};\nexports.useCallback=function(a,b){return U.current.useCallback(a,b)};exports.useContext=function(a){return U.current.useContext(a)};exports.useDebugValue=function(){};exports.useDeferredValue=function(a){return U.current.useDeferredValue(a)};exports.useEffect=function(a,b){return U.current.useEffect(a,b)};exports.useId=function(){return U.current.useId()};exports.useImperativeHandle=function(a,b,e){return U.current.useImperativeHandle(a,b,e)};\nexports.useInsertionEffect=function(a,b){return U.current.useInsertionEffect(a,b)};exports.useLayoutEffect=function(a,b){return U.current.useLayoutEffect(a,b)};exports.useMemo=function(a,b){return U.current.useMemo(a,b)};exports.useReducer=function(a,b,e){return U.current.useReducer(a,b,e)};exports.useRef=function(a){return U.current.useRef(a)};exports.useState=function(a){return U.current.useState(a)};exports.useSyncExternalStore=function(a,b,e){return U.current.useSyncExternalStore(a,b,e)};\nexports.useTransition=function(){return U.current.useTransition()};exports.version=\"18.2.0\";\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react.production.min.js');\n} else {\n  module.exports = require('./cjs/react.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/react-jsx-runtime.production.min.js');\n} else {\n  module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","export function randomSeed() {\n    return Math.floor(Math.random() * 2 ** 31);\n}\nexport class Random {\n    constructor(seed) {\n        this.seed = seed;\n    }\n    next() {\n        if (this.seed) {\n            return ((2 ** 31 - 1) & (this.seed = Math.imul(48271, this.seed))) / 2 ** 31;\n        }\n        else {\n            return Math.random();\n        }\n    }\n}\n","export function rotatePoints(points, center, degrees) {\n    if (points && points.length) {\n        const [cx, cy] = center;\n        const angle = (Math.PI / 180) * degrees;\n        const cos = Math.cos(angle);\n        const sin = Math.sin(angle);\n        points.forEach((p) => {\n            const [x, y] = p;\n            p[0] = ((x - cx) * cos) - ((y - cy) * sin) + cx;\n            p[1] = ((x - cx) * sin) + ((y - cy) * cos) + cy;\n        });\n    }\n}\nexport function rotateLines(lines, center, degrees) {\n    const points = [];\n    lines.forEach((line) => points.push(...line));\n    rotatePoints(points, center, degrees);\n}\nexport function lineLength(line) {\n    const p1 = line[0];\n    const p2 = line[1];\n    return Math.sqrt(Math.pow(p1[0] - p2[0], 2) + Math.pow(p1[1] - p2[1], 2));\n}\n","import { rotatePoints, rotateLines } from '../geometry';\nexport function polygonHachureLines(polygonList, o) {\n    const angle = o.hachureAngle + 90;\n    let gap = o.hachureGap;\n    if (gap < 0) {\n        gap = o.strokeWidth * 4;\n    }\n    gap = Math.max(gap, 0.1);\n    const rotationCenter = [0, 0];\n    if (angle) {\n        for (const polygon of polygonList) {\n            rotatePoints(polygon, rotationCenter, angle);\n        }\n    }\n    const lines = straightHachureLines(polygonList, gap);\n    if (angle) {\n        for (const polygon of polygonList) {\n            rotatePoints(polygon, rotationCenter, -angle);\n        }\n        rotateLines(lines, rotationCenter, -angle);\n    }\n    return lines;\n}\nfunction straightHachureLines(polygonList, gap) {\n    const vertexArray = [];\n    for (const polygon of polygonList) {\n        const vertices = [...polygon];\n        if (vertices[0].join(',') !== vertices[vertices.length - 1].join(',')) {\n            vertices.push([vertices[0][0], vertices[0][1]]);\n        }\n        if (vertices.length > 2) {\n            vertexArray.push(vertices);\n        }\n    }\n    const lines = [];\n    gap = Math.max(gap, 0.1);\n    // Create sorted edges table\n    const edges = [];\n    for (const vertices of vertexArray) {\n        for (let i = 0; i < vertices.length - 1; i++) {\n            const p1 = vertices[i];\n            const p2 = vertices[i + 1];\n            if (p1[1] !== p2[1]) {\n                const ymin = Math.min(p1[1], p2[1]);\n                edges.push({\n                    ymin,\n                    ymax: Math.max(p1[1], p2[1]),\n                    x: ymin === p1[1] ? p1[0] : p2[0],\n                    islope: (p2[0] - p1[0]) / (p2[1] - p1[1]),\n                });\n            }\n        }\n    }\n    edges.sort((e1, e2) => {\n        if (e1.ymin < e2.ymin) {\n            return -1;\n        }\n        if (e1.ymin > e2.ymin) {\n            return 1;\n        }\n        if (e1.x < e2.x) {\n            return -1;\n        }\n        if (e1.x > e2.x) {\n            return 1;\n        }\n        if (e1.ymax === e2.ymax) {\n            return 0;\n        }\n        return (e1.ymax - e2.ymax) / Math.abs((e1.ymax - e2.ymax));\n    });\n    if (!edges.length) {\n        return lines;\n    }\n    // Start scanning\n    let activeEdges = [];\n    let y = edges[0].ymin;\n    while (activeEdges.length || edges.length) {\n        if (edges.length) {\n            let ix = -1;\n            for (let i = 0; i < edges.length; i++) {\n                if (edges[i].ymin > y) {\n                    break;\n                }\n                ix = i;\n            }\n            const removed = edges.splice(0, ix + 1);\n            removed.forEach((edge) => {\n                activeEdges.push({ s: y, edge });\n            });\n        }\n        activeEdges = activeEdges.filter((ae) => {\n            if (ae.edge.ymax <= y) {\n                return false;\n            }\n            return true;\n        });\n        activeEdges.sort((ae1, ae2) => {\n            if (ae1.edge.x === ae2.edge.x) {\n                return 0;\n            }\n            return (ae1.edge.x - ae2.edge.x) / Math.abs((ae1.edge.x - ae2.edge.x));\n        });\n        // fill between the edges\n        if (activeEdges.length > 1) {\n            for (let i = 0; i < activeEdges.length; i = i + 2) {\n                const nexti = i + 1;\n                if (nexti >= activeEdges.length) {\n                    break;\n                }\n                const ce = activeEdges[i].edge;\n                const ne = activeEdges[nexti].edge;\n                lines.push([\n                    [Math.round(ce.x), y],\n                    [Math.round(ne.x), y],\n                ]);\n            }\n        }\n        y += gap;\n        activeEdges.forEach((ae) => {\n            ae.edge.x = ae.edge.x + (gap * ae.edge.islope);\n        });\n    }\n    return lines;\n}\n","import { polygonHachureLines } from './scan-line-hachure';\nexport class HachureFiller {\n    constructor(helper) {\n        this.helper = helper;\n    }\n    fillPolygons(polygonList, o) {\n        return this._fillPolygons(polygonList, o);\n    }\n    _fillPolygons(polygonList, o) {\n        const lines = polygonHachureLines(polygonList, o);\n        const ops = this.renderLines(lines, o);\n        return { type: 'fillSketch', ops };\n    }\n    renderLines(lines, o) {\n        const ops = [];\n        for (const line of lines) {\n            ops.push(...this.helper.doubleLineOps(line[0][0], line[0][1], line[1][0], line[1][1], o));\n        }\n        return ops;\n    }\n}\n","import { HachureFiller } from './hachure-filler';\nimport { polygonHachureLines } from './scan-line-hachure';\nimport { lineLength } from '../geometry';\nexport class ZigZagFiller extends HachureFiller {\n    fillPolygons(polygonList, o) {\n        let gap = o.hachureGap;\n        if (gap < 0) {\n            gap = o.strokeWidth * 4;\n        }\n        gap = Math.max(gap, 0.1);\n        const o2 = Object.assign({}, o, { hachureGap: gap });\n        const lines = polygonHachureLines(polygonList, o2);\n        const zigZagAngle = (Math.PI / 180) * o.hachureAngle;\n        const zigzagLines = [];\n        const dgx = gap * 0.5 * Math.cos(zigZagAngle);\n        const dgy = gap * 0.5 * Math.sin(zigZagAngle);\n        for (const [p1, p2] of lines) {\n            if (lineLength([p1, p2])) {\n                zigzagLines.push([\n                    [p1[0] - dgx, p1[1] + dgy],\n                    [...p2],\n                ], [\n                    [p1[0] + dgx, p1[1] - dgy],\n                    [...p2],\n                ]);\n            }\n        }\n        const ops = this.renderLines(zigzagLines, o);\n        return { type: 'fillSketch', ops };\n    }\n}\n","import { HachureFiller } from './hachure-filler';\nexport class HatchFiller extends HachureFiller {\n    fillPolygons(polygonList, o) {\n        const set = this._fillPolygons(polygonList, o);\n        const o2 = Object.assign({}, o, { hachureAngle: o.hachureAngle + 90 });\n        const set2 = this._fillPolygons(polygonList, o2);\n        set.ops = set.ops.concat(set2.ops);\n        return set;\n    }\n}\n","import { lineLength } from '../geometry';\nimport { polygonHachureLines } from './scan-line-hachure';\nexport class DotFiller {\n    constructor(helper) {\n        this.helper = helper;\n    }\n    fillPolygons(polygonList, o) {\n        o = Object.assign({}, o, { hachureAngle: 0 });\n        const lines = polygonHachureLines(polygonList, o);\n        return this.dotsOnLines(lines, o);\n    }\n    dotsOnLines(lines, o) {\n        const ops = [];\n        let gap = o.hachureGap;\n        if (gap < 0) {\n            gap = o.strokeWidth * 4;\n        }\n        gap = Math.max(gap, 0.1);\n        let fweight = o.fillWeight;\n        if (fweight < 0) {\n            fweight = o.strokeWidth / 2;\n        }\n        const ro = gap / 4;\n        for (const line of lines) {\n            const length = lineLength(line);\n            const dl = length / gap;\n            const count = Math.ceil(dl) - 1;\n            const offset = length - (count * gap);\n            const x = ((line[0][0] + line[1][0]) / 2) - (gap / 4);\n            const minY = Math.min(line[0][1], line[1][1]);\n            for (let i = 0; i < count; i++) {\n                const y = minY + offset + (i * gap);\n                const cx = (x - ro) + Math.random() * 2 * ro;\n                const cy = (y - ro) + Math.random() * 2 * ro;\n                const el = this.helper.ellipse(cx, cy, fweight, fweight, o);\n                ops.push(...el.ops);\n            }\n        }\n        return { type: 'fillSketch', ops };\n    }\n}\n","import { lineLength } from '../geometry';\nimport { polygonHachureLines } from './scan-line-hachure';\nexport class DashedFiller {\n    constructor(helper) {\n        this.helper = helper;\n    }\n    fillPolygons(polygonList, o) {\n        const lines = polygonHachureLines(polygonList, o);\n        return { type: 'fillSketch', ops: this.dashedLine(lines, o) };\n    }\n    dashedLine(lines, o) {\n        const offset = o.dashOffset < 0 ? (o.hachureGap < 0 ? (o.strokeWidth * 4) : o.hachureGap) : o.dashOffset;\n        const gap = o.dashGap < 0 ? (o.hachureGap < 0 ? (o.strokeWidth * 4) : o.hachureGap) : o.dashGap;\n        const ops = [];\n        lines.forEach((line) => {\n            const length = lineLength(line);\n            const count = Math.floor(length / (offset + gap));\n            const startOffset = (length + gap - (count * (offset + gap))) / 2;\n            let p1 = line[0];\n            let p2 = line[1];\n            if (p1[0] > p2[0]) {\n                p1 = line[1];\n                p2 = line[0];\n            }\n            const alpha = Math.atan((p2[1] - p1[1]) / (p2[0] - p1[0]));\n            for (let i = 0; i < count; i++) {\n                const lstart = i * (offset + gap);\n                const lend = lstart + offset;\n                const start = [p1[0] + (lstart * Math.cos(alpha)) + (startOffset * Math.cos(alpha)), p1[1] + lstart * Math.sin(alpha) + (startOffset * Math.sin(alpha))];\n                const end = [p1[0] + (lend * Math.cos(alpha)) + (startOffset * Math.cos(alpha)), p1[1] + (lend * Math.sin(alpha)) + (startOffset * Math.sin(alpha))];\n                ops.push(...this.helper.doubleLineOps(start[0], start[1], end[0], end[1], o));\n            }\n        });\n        return ops;\n    }\n}\n","import { lineLength } from '../geometry';\nimport { polygonHachureLines } from './scan-line-hachure';\nexport class ZigZagLineFiller {\n    constructor(helper) {\n        this.helper = helper;\n    }\n    fillPolygons(polygonList, o) {\n        const gap = o.hachureGap < 0 ? (o.strokeWidth * 4) : o.hachureGap;\n        const zo = o.zigzagOffset < 0 ? gap : o.zigzagOffset;\n        o = Object.assign({}, o, { hachureGap: gap + zo });\n        const lines = polygonHachureLines(polygonList, o);\n        return { type: 'fillSketch', ops: this.zigzagLines(lines, zo, o) };\n    }\n    zigzagLines(lines, zo, o) {\n        const ops = [];\n        lines.forEach((line) => {\n            const length = lineLength(line);\n            const count = Math.round(length / (2 * zo));\n            let p1 = line[0];\n            let p2 = line[1];\n            if (p1[0] > p2[0]) {\n                p1 = line[1];\n                p2 = line[0];\n            }\n            const alpha = Math.atan((p2[1] - p1[1]) / (p2[0] - p1[0]));\n            for (let i = 0; i < count; i++) {\n                const lstart = i * 2 * zo;\n                const lend = (i + 1) * 2 * zo;\n                const dz = Math.sqrt(2 * Math.pow(zo, 2));\n                const start = [p1[0] + (lstart * Math.cos(alpha)), p1[1] + lstart * Math.sin(alpha)];\n                const end = [p1[0] + (lend * Math.cos(alpha)), p1[1] + (lend * Math.sin(alpha))];\n                const middle = [start[0] + dz * Math.cos(alpha + Math.PI / 4), start[1] + dz * Math.sin(alpha + Math.PI / 4)];\n                ops.push(...this.helper.doubleLineOps(start[0], start[1], middle[0], middle[1], o), ...this.helper.doubleLineOps(middle[0], middle[1], end[0], end[1], o));\n            }\n        });\n        return ops;\n    }\n}\n","import { HachureFiller } from './hachure-filler';\nimport { ZigZagFiller } from './zigzag-filler';\nimport { HatchFiller } from './hatch-filler';\nimport { DotFiller } from './dot-filler';\nimport { DashedFiller } from './dashed-filler';\nimport { ZigZagLineFiller } from './zigzag-line-filler';\nconst fillers = {};\nexport function getFiller(o, helper) {\n    let fillerName = o.fillStyle || 'hachure';\n    if (!fillers[fillerName]) {\n        switch (fillerName) {\n            case 'zigzag':\n                if (!fillers[fillerName]) {\n                    fillers[fillerName] = new ZigZagFiller(helper);\n                }\n                break;\n            case 'cross-hatch':\n                if (!fillers[fillerName]) {\n                    fillers[fillerName] = new HatchFiller(helper);\n                }\n                break;\n            case 'dots':\n                if (!fillers[fillerName]) {\n                    fillers[fillerName] = new DotFiller(helper);\n                }\n                break;\n            case 'dashed':\n                if (!fillers[fillerName]) {\n                    fillers[fillerName] = new DashedFiller(helper);\n                }\n                break;\n            case 'zigzag-line':\n                if (!fillers[fillerName]) {\n                    fillers[fillerName] = new ZigZagLineFiller(helper);\n                }\n                break;\n            case 'hachure':\n            default:\n                fillerName = 'hachure';\n                if (!fillers[fillerName]) {\n                    fillers[fillerName] = new HachureFiller(helper);\n                }\n                break;\n        }\n    }\n    return fillers[fillerName];\n}\n","const COMMAND = 0;\nconst NUMBER = 1;\nconst EOD = 2;\nconst PARAMS = { A: 7, a: 7, C: 6, c: 6, H: 1, h: 1, L: 2, l: 2, M: 2, m: 2, Q: 4, q: 4, S: 4, s: 4, T: 2, t: 2, V: 1, v: 1, Z: 0, z: 0 };\nfunction tokenize(d) {\n    const tokens = new Array();\n    while (d !== '') {\n        if (d.match(/^([ \\t\\r\\n,]+)/)) {\n            d = d.substr(RegExp.$1.length);\n        }\n        else if (d.match(/^([aAcChHlLmMqQsStTvVzZ])/)) {\n            tokens[tokens.length] = { type: COMMAND, text: RegExp.$1 };\n            d = d.substr(RegExp.$1.length);\n        }\n        else if (d.match(/^(([-+]?[0-9]+(\\.[0-9]*)?|[-+]?\\.[0-9]+)([eE][-+]?[0-9]+)?)/)) {\n            tokens[tokens.length] = { type: NUMBER, text: `${parseFloat(RegExp.$1)}` };\n            d = d.substr(RegExp.$1.length);\n        }\n        else {\n            return [];\n        }\n    }\n    tokens[tokens.length] = { type: EOD, text: '' };\n    return tokens;\n}\nfunction isType(token, type) {\n    return token.type === type;\n}\nexport function parsePath(d) {\n    const segments = [];\n    const tokens = tokenize(d);\n    let mode = 'BOD';\n    let index = 0;\n    let token = tokens[index];\n    while (!isType(token, EOD)) {\n        let paramsCount = 0;\n        const params = [];\n        if (mode === 'BOD') {\n            if (token.text === 'M' || token.text === 'm') {\n                index++;\n                paramsCount = PARAMS[token.text];\n                mode = token.text;\n            }\n            else {\n                return parsePath('M0,0' + d);\n            }\n        }\n        else if (isType(token, NUMBER)) {\n            paramsCount = PARAMS[mode];\n        }\n        else {\n            index++;\n            paramsCount = PARAMS[token.text];\n            mode = token.text;\n        }\n        if ((index + paramsCount) < tokens.length) {\n            for (let i = index; i < index + paramsCount; i++) {\n                const numbeToken = tokens[i];\n                if (isType(numbeToken, NUMBER)) {\n                    params[params.length] = +numbeToken.text;\n                }\n                else {\n                    throw new Error('Param not a number: ' + mode + ',' + numbeToken.text);\n                }\n            }\n            if (typeof PARAMS[mode] === 'number') {\n                const segment = { key: mode, data: params };\n                segments.push(segment);\n                index += paramsCount;\n                token = tokens[index];\n                if (mode === 'M')\n                    mode = 'L';\n                if (mode === 'm')\n                    mode = 'l';\n            }\n            else {\n                throw new Error('Bad segment: ' + mode);\n            }\n        }\n        else {\n            throw new Error('Path data ended short');\n        }\n    }\n    return segments;\n}\nexport function serialize(segments) {\n    const tokens = [];\n    for (const { key, data } of segments) {\n        tokens.push(key);\n        switch (key) {\n            case 'C':\n            case 'c':\n                tokens.push(data[0], `${data[1]},`, data[2], `${data[3]},`, data[4], data[5]);\n                break;\n            case 'S':\n            case 's':\n            case 'Q':\n            case 'q':\n                tokens.push(data[0], `${data[1]},`, data[2], data[3]);\n                break;\n            default:\n                tokens.push(...data);\n                break;\n        }\n    }\n    return tokens.join(' ');\n}\n","// Translate relative commands to absolute commands\nexport function absolutize(segments) {\n    let cx = 0, cy = 0;\n    let subx = 0, suby = 0;\n    const out = [];\n    for (const { key, data } of segments) {\n        switch (key) {\n            case 'M':\n                out.push({ key: 'M', data: [...data] });\n                [cx, cy] = data;\n                [subx, suby] = data;\n                break;\n            case 'm':\n                cx += data[0];\n                cy += data[1];\n                out.push({ key: 'M', data: [cx, cy] });\n                subx = cx;\n                suby = cy;\n                break;\n            case 'L':\n                out.push({ key: 'L', data: [...data] });\n                [cx, cy] = data;\n                break;\n            case 'l':\n                cx += data[0];\n                cy += data[1];\n                out.push({ key: 'L', data: [cx, cy] });\n                break;\n            case 'C':\n                out.push({ key: 'C', data: [...data] });\n                cx = data[4];\n                cy = data[5];\n                break;\n            case 'c': {\n                const newdata = data.map((d, i) => (i % 2) ? (d + cy) : (d + cx));\n                out.push({ key: 'C', data: newdata });\n                cx = newdata[4];\n                cy = newdata[5];\n                break;\n            }\n            case 'Q':\n                out.push({ key: 'Q', data: [...data] });\n                cx = data[2];\n                cy = data[3];\n                break;\n            case 'q': {\n                const newdata = data.map((d, i) => (i % 2) ? (d + cy) : (d + cx));\n                out.push({ key: 'Q', data: newdata });\n                cx = newdata[2];\n                cy = newdata[3];\n                break;\n            }\n            case 'A':\n                out.push({ key: 'A', data: [...data] });\n                cx = data[5];\n                cy = data[6];\n                break;\n            case 'a':\n                cx += data[5];\n                cy += data[6];\n                out.push({ key: 'A', data: [data[0], data[1], data[2], data[3], data[4], cx, cy] });\n                break;\n            case 'H':\n                out.push({ key: 'H', data: [...data] });\n                cx = data[0];\n                break;\n            case 'h':\n                cx += data[0];\n                out.push({ key: 'H', data: [cx] });\n                break;\n            case 'V':\n                out.push({ key: 'V', data: [...data] });\n                cy = data[0];\n                break;\n            case 'v':\n                cy += data[0];\n                out.push({ key: 'V', data: [cy] });\n                break;\n            case 'S':\n                out.push({ key: 'S', data: [...data] });\n                cx = data[2];\n                cy = data[3];\n                break;\n            case 's': {\n                const newdata = data.map((d, i) => (i % 2) ? (d + cy) : (d + cx));\n                out.push({ key: 'S', data: newdata });\n                cx = newdata[2];\n                cy = newdata[3];\n                break;\n            }\n            case 'T':\n                out.push({ key: 'T', data: [...data] });\n                cx = data[0];\n                cy = data[1];\n                break;\n            case 't':\n                cx += data[0];\n                cy += data[1];\n                out.push({ key: 'T', data: [cx, cy] });\n                break;\n            case 'Z':\n            case 'z':\n                out.push({ key: 'Z', data: [] });\n                cx = subx;\n                cy = suby;\n                break;\n        }\n    }\n    return out;\n}\n","// Normalize path to include only M, L, C, and Z commands\nexport function normalize(segments) {\n    const out = [];\n    let lastType = '';\n    let cx = 0, cy = 0;\n    let subx = 0, suby = 0;\n    let lcx = 0, lcy = 0;\n    for (const { key, data } of segments) {\n        switch (key) {\n            case 'M':\n                out.push({ key: 'M', data: [...data] });\n                [cx, cy] = data;\n                [subx, suby] = data;\n                break;\n            case 'C':\n                out.push({ key: 'C', data: [...data] });\n                cx = data[4];\n                cy = data[5];\n                lcx = data[2];\n                lcy = data[3];\n                break;\n            case 'L':\n                out.push({ key: 'L', data: [...data] });\n                [cx, cy] = data;\n                break;\n            case 'H':\n                cx = data[0];\n                out.push({ key: 'L', data: [cx, cy] });\n                break;\n            case 'V':\n                cy = data[0];\n                out.push({ key: 'L', data: [cx, cy] });\n                break;\n            case 'S': {\n                let cx1 = 0, cy1 = 0;\n                if (lastType === 'C' || lastType === 'S') {\n                    cx1 = cx + (cx - lcx);\n                    cy1 = cy + (cy - lcy);\n                }\n                else {\n                    cx1 = cx;\n                    cy1 = cy;\n                }\n                out.push({ key: 'C', data: [cx1, cy1, ...data] });\n                lcx = data[0];\n                lcy = data[1];\n                cx = data[2];\n                cy = data[3];\n                break;\n            }\n            case 'T': {\n                const [x, y] = data;\n                let x1 = 0, y1 = 0;\n                if (lastType === 'Q' || lastType === 'T') {\n                    x1 = cx + (cx - lcx);\n                    y1 = cy + (cy - lcy);\n                }\n                else {\n                    x1 = cx;\n                    y1 = cy;\n                }\n                const cx1 = cx + 2 * (x1 - cx) / 3;\n                const cy1 = cy + 2 * (y1 - cy) / 3;\n                const cx2 = x + 2 * (x1 - x) / 3;\n                const cy2 = y + 2 * (y1 - y) / 3;\n                out.push({ key: 'C', data: [cx1, cy1, cx2, cy2, x, y] });\n                lcx = x1;\n                lcy = y1;\n                cx = x;\n                cy = y;\n                break;\n            }\n            case 'Q': {\n                const [x1, y1, x, y] = data;\n                const cx1 = cx + 2 * (x1 - cx) / 3;\n                const cy1 = cy + 2 * (y1 - cy) / 3;\n                const cx2 = x + 2 * (x1 - x) / 3;\n                const cy2 = y + 2 * (y1 - y) / 3;\n                out.push({ key: 'C', data: [cx1, cy1, cx2, cy2, x, y] });\n                lcx = x1;\n                lcy = y1;\n                cx = x;\n                cy = y;\n                break;\n            }\n            case 'A': {\n                const r1 = Math.abs(data[0]);\n                const r2 = Math.abs(data[1]);\n                const angle = data[2];\n                const largeArcFlag = data[3];\n                const sweepFlag = data[4];\n                const x = data[5];\n                const y = data[6];\n                if (r1 === 0 || r2 === 0) {\n                    out.push({ key: 'C', data: [cx, cy, x, y, x, y] });\n                    cx = x;\n                    cy = y;\n                }\n                else {\n                    if (cx !== x || cy !== y) {\n                        const curves = arcToCubicCurves(cx, cy, x, y, r1, r2, angle, largeArcFlag, sweepFlag);\n                        curves.forEach(function (curve) {\n                            out.push({ key: 'C', data: curve });\n                        });\n                        cx = x;\n                        cy = y;\n                    }\n                }\n                break;\n            }\n            case 'Z':\n                out.push({ key: 'Z', data: [] });\n                cx = subx;\n                cy = suby;\n                break;\n        }\n        lastType = key;\n    }\n    return out;\n}\nfunction degToRad(degrees) {\n    return (Math.PI * degrees) / 180;\n}\nfunction rotate(x, y, angleRad) {\n    const X = x * Math.cos(angleRad) - y * Math.sin(angleRad);\n    const Y = x * Math.sin(angleRad) + y * Math.cos(angleRad);\n    return [X, Y];\n}\nfunction arcToCubicCurves(x1, y1, x2, y2, r1, r2, angle, largeArcFlag, sweepFlag, recursive) {\n    const angleRad = degToRad(angle);\n    let params = [];\n    let f1 = 0, f2 = 0, cx = 0, cy = 0;\n    if (recursive) {\n        [f1, f2, cx, cy] = recursive;\n    }\n    else {\n        [x1, y1] = rotate(x1, y1, -angleRad);\n        [x2, y2] = rotate(x2, y2, -angleRad);\n        const x = (x1 - x2) / 2;\n        const y = (y1 - y2) / 2;\n        let h = (x * x) / (r1 * r1) + (y * y) / (r2 * r2);\n        if (h > 1) {\n            h = Math.sqrt(h);\n            r1 = h * r1;\n            r2 = h * r2;\n        }\n        const sign = (largeArcFlag === sweepFlag) ? -1 : 1;\n        const r1Pow = r1 * r1;\n        const r2Pow = r2 * r2;\n        const left = r1Pow * r2Pow - r1Pow * y * y - r2Pow * x * x;\n        const right = r1Pow * y * y + r2Pow * x * x;\n        const k = sign * Math.sqrt(Math.abs(left / right));\n        cx = k * r1 * y / r2 + (x1 + x2) / 2;\n        cy = k * -r2 * x / r1 + (y1 + y2) / 2;\n        f1 = Math.asin(parseFloat(((y1 - cy) / r2).toFixed(9)));\n        f2 = Math.asin(parseFloat(((y2 - cy) / r2).toFixed(9)));\n        if (x1 < cx) {\n            f1 = Math.PI - f1;\n        }\n        if (x2 < cx) {\n            f2 = Math.PI - f2;\n        }\n        if (f1 < 0) {\n            f1 = Math.PI * 2 + f1;\n        }\n        if (f2 < 0) {\n            f2 = Math.PI * 2 + f2;\n        }\n        if (sweepFlag && f1 > f2) {\n            f1 = f1 - Math.PI * 2;\n        }\n        if (!sweepFlag && f2 > f1) {\n            f2 = f2 - Math.PI * 2;\n        }\n    }\n    let df = f2 - f1;\n    if (Math.abs(df) > (Math.PI * 120 / 180)) {\n        const f2old = f2;\n        const x2old = x2;\n        const y2old = y2;\n        if (sweepFlag && f2 > f1) {\n            f2 = f1 + (Math.PI * 120 / 180) * (1);\n        }\n        else {\n            f2 = f1 + (Math.PI * 120 / 180) * (-1);\n        }\n        x2 = cx + r1 * Math.cos(f2);\n        y2 = cy + r2 * Math.sin(f2);\n        params = arcToCubicCurves(x2, y2, x2old, y2old, r1, r2, angle, 0, sweepFlag, [f2, f2old, cx, cy]);\n    }\n    df = f2 - f1;\n    const c1 = Math.cos(f1);\n    const s1 = Math.sin(f1);\n    const c2 = Math.cos(f2);\n    const s2 = Math.sin(f2);\n    const t = Math.tan(df / 4);\n    const hx = 4 / 3 * r1 * t;\n    const hy = 4 / 3 * r2 * t;\n    const m1 = [x1, y1];\n    const m2 = [x1 + hx * s1, y1 - hy * c1];\n    const m3 = [x2 + hx * s2, y2 - hy * c2];\n    const m4 = [x2, y2];\n    m2[0] = 2 * m1[0] - m2[0];\n    m2[1] = 2 * m1[1] - m2[1];\n    if (recursive) {\n        return [m2, m3, m4].concat(params);\n    }\n    else {\n        params = [m2, m3, m4].concat(params);\n        const curves = [];\n        for (let i = 0; i < params.length; i += 3) {\n            const r1 = rotate(params[i][0], params[i][1], angleRad);\n            const r2 = rotate(params[i + 1][0], params[i + 1][1], angleRad);\n            const r3 = rotate(params[i + 2][0], params[i + 2][1], angleRad);\n            curves.push([r1[0], r1[1], r2[0], r2[1], r3[0], r3[1]]);\n        }\n        return curves;\n    }\n}\n","import { getFiller } from './fillers/filler.js';\nimport { Random } from './math.js';\nimport { parsePath, normalize, absolutize } from 'path-data-parser';\nconst helper = {\n    randOffset,\n    randOffsetWithRange,\n    ellipse,\n    doubleLineOps: doubleLineFillOps,\n};\nexport function line(x1, y1, x2, y2, o) {\n    return { type: 'path', ops: _doubleLine(x1, y1, x2, y2, o) };\n}\nexport function linearPath(points, close, o) {\n    const len = (points || []).length;\n    if (len > 2) {\n        const ops = [];\n        for (let i = 0; i < (len - 1); i++) {\n            ops.push(..._doubleLine(points[i][0], points[i][1], points[i + 1][0], points[i + 1][1], o));\n        }\n        if (close) {\n            ops.push(..._doubleLine(points[len - 1][0], points[len - 1][1], points[0][0], points[0][1], o));\n        }\n        return { type: 'path', ops };\n    }\n    else if (len === 2) {\n        return line(points[0][0], points[0][1], points[1][0], points[1][1], o);\n    }\n    return { type: 'path', ops: [] };\n}\nexport function polygon(points, o) {\n    return linearPath(points, true, o);\n}\nexport function rectangle(x, y, width, height, o) {\n    const points = [\n        [x, y],\n        [x + width, y],\n        [x + width, y + height],\n        [x, y + height],\n    ];\n    return polygon(points, o);\n}\nexport function curve(points, o) {\n    let o1 = _curveWithOffset(points, 1 * (1 + o.roughness * 0.2), o);\n    if (!o.disableMultiStroke) {\n        const o2 = _curveWithOffset(points, 1.5 * (1 + o.roughness * 0.22), cloneOptionsAlterSeed(o));\n        o1 = o1.concat(o2);\n    }\n    return { type: 'path', ops: o1 };\n}\nexport function ellipse(x, y, width, height, o) {\n    const params = generateEllipseParams(width, height, o);\n    return ellipseWithParams(x, y, o, params).opset;\n}\nexport function generateEllipseParams(width, height, o) {\n    const psq = Math.sqrt(Math.PI * 2 * Math.sqrt((Math.pow(width / 2, 2) + Math.pow(height / 2, 2)) / 2));\n    const stepCount = Math.ceil(Math.max(o.curveStepCount, (o.curveStepCount / Math.sqrt(200)) * psq));\n    const increment = (Math.PI * 2) / stepCount;\n    let rx = Math.abs(width / 2);\n    let ry = Math.abs(height / 2);\n    const curveFitRandomness = 1 - o.curveFitting;\n    rx += _offsetOpt(rx * curveFitRandomness, o);\n    ry += _offsetOpt(ry * curveFitRandomness, o);\n    return { increment, rx, ry };\n}\nexport function ellipseWithParams(x, y, o, ellipseParams) {\n    const [ap1, cp1] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1, ellipseParams.increment * _offset(0.1, _offset(0.4, 1, o), o), o);\n    let o1 = _curve(ap1, null, o);\n    if ((!o.disableMultiStroke) && (o.roughness !== 0)) {\n        const [ap2] = _computeEllipsePoints(ellipseParams.increment, x, y, ellipseParams.rx, ellipseParams.ry, 1.5, 0, o);\n        const o2 = _curve(ap2, null, o);\n        o1 = o1.concat(o2);\n    }\n    return {\n        estimatedPoints: cp1,\n        opset: { type: 'path', ops: o1 },\n    };\n}\nexport function arc(x, y, width, height, start, stop, closed, roughClosure, o) {\n    const cx = x;\n    const cy = y;\n    let rx = Math.abs(width / 2);\n    let ry = Math.abs(height / 2);\n    rx += _offsetOpt(rx * 0.01, o);\n    ry += _offsetOpt(ry * 0.01, o);\n    let strt = start;\n    let stp = stop;\n    while (strt < 0) {\n        strt += Math.PI * 2;\n        stp += Math.PI * 2;\n    }\n    if ((stp - strt) > (Math.PI * 2)) {\n        strt = 0;\n        stp = Math.PI * 2;\n    }\n    const ellipseInc = (Math.PI * 2) / o.curveStepCount;\n    const arcInc = Math.min(ellipseInc / 2, (stp - strt) / 2);\n    const ops = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1, o);\n    if (!o.disableMultiStroke) {\n        const o2 = _arc(arcInc, cx, cy, rx, ry, strt, stp, 1.5, o);\n        ops.push(...o2);\n    }\n    if (closed) {\n        if (roughClosure) {\n            ops.push(..._doubleLine(cx, cy, cx + rx * Math.cos(strt), cy + ry * Math.sin(strt), o), ..._doubleLine(cx, cy, cx + rx * Math.cos(stp), cy + ry * Math.sin(stp), o));\n        }\n        else {\n            ops.push({ op: 'lineTo', data: [cx, cy] }, { op: 'lineTo', data: [cx + rx * Math.cos(strt), cy + ry * Math.sin(strt)] });\n        }\n    }\n    return { type: 'path', ops };\n}\nexport function svgPath(path, o) {\n    const segments = normalize(absolutize(parsePath(path)));\n    const ops = [];\n    let first = [0, 0];\n    let current = [0, 0];\n    for (const { key, data } of segments) {\n        switch (key) {\n            case 'M': {\n                const ro = 1 * (o.maxRandomnessOffset || 0);\n                const pv = o.preserveVertices;\n                ops.push({ op: 'move', data: data.map((d) => d + (pv ? 0 : _offsetOpt(ro, o))) });\n                current = [data[0], data[1]];\n                first = [data[0], data[1]];\n                break;\n            }\n            case 'L':\n                ops.push(..._doubleLine(current[0], current[1], data[0], data[1], o));\n                current = [data[0], data[1]];\n                break;\n            case 'C': {\n                const [x1, y1, x2, y2, x, y] = data;\n                ops.push(..._bezierTo(x1, y1, x2, y2, x, y, current, o));\n                current = [x, y];\n                break;\n            }\n            case 'Z':\n                ops.push(..._doubleLine(current[0], current[1], first[0], first[1], o));\n                current = [first[0], first[1]];\n                break;\n        }\n    }\n    return { type: 'path', ops };\n}\n// Fills\nexport function solidFillPolygon(polygonList, o) {\n    const ops = [];\n    for (const points of polygonList) {\n        if (points.length) {\n            const offset = o.maxRandomnessOffset || 0;\n            const len = points.length;\n            if (len > 2) {\n                ops.push({ op: 'move', data: [points[0][0] + _offsetOpt(offset, o), points[0][1] + _offsetOpt(offset, o)] });\n                for (let i = 1; i < len; i++) {\n                    ops.push({ op: 'lineTo', data: [points[i][0] + _offsetOpt(offset, o), points[i][1] + _offsetOpt(offset, o)] });\n                }\n            }\n        }\n    }\n    return { type: 'fillPath', ops };\n}\nexport function patternFillPolygons(polygonList, o) {\n    return getFiller(o, helper).fillPolygons(polygonList, o);\n}\nexport function patternFillArc(x, y, width, height, start, stop, o) {\n    const cx = x;\n    const cy = y;\n    let rx = Math.abs(width / 2);\n    let ry = Math.abs(height / 2);\n    rx += _offsetOpt(rx * 0.01, o);\n    ry += _offsetOpt(ry * 0.01, o);\n    let strt = start;\n    let stp = stop;\n    while (strt < 0) {\n        strt += Math.PI * 2;\n        stp += Math.PI * 2;\n    }\n    if ((stp - strt) > (Math.PI * 2)) {\n        strt = 0;\n        stp = Math.PI * 2;\n    }\n    const increment = (stp - strt) / o.curveStepCount;\n    const points = [];\n    for (let angle = strt; angle <= stp; angle = angle + increment) {\n        points.push([cx + rx * Math.cos(angle), cy + ry * Math.sin(angle)]);\n    }\n    points.push([cx + rx * Math.cos(stp), cy + ry * Math.sin(stp)]);\n    points.push([cx, cy]);\n    return patternFillPolygons([points], o);\n}\nexport function randOffset(x, o) {\n    return _offsetOpt(x, o);\n}\nexport function randOffsetWithRange(min, max, o) {\n    return _offset(min, max, o);\n}\nexport function doubleLineFillOps(x1, y1, x2, y2, o) {\n    return _doubleLine(x1, y1, x2, y2, o, true);\n}\n// Private helpers\nfunction cloneOptionsAlterSeed(ops) {\n    const result = Object.assign({}, ops);\n    result.randomizer = undefined;\n    if (ops.seed) {\n        result.seed = ops.seed + 1;\n    }\n    return result;\n}\nfunction random(ops) {\n    if (!ops.randomizer) {\n        ops.randomizer = new Random(ops.seed || 0);\n    }\n    return ops.randomizer.next();\n}\nfunction _offset(min, max, ops, roughnessGain = 1) {\n    return ops.roughness * roughnessGain * ((random(ops) * (max - min)) + min);\n}\nfunction _offsetOpt(x, ops, roughnessGain = 1) {\n    return _offset(-x, x, ops, roughnessGain);\n}\nfunction _doubleLine(x1, y1, x2, y2, o, filling = false) {\n    const singleStroke = filling ? o.disableMultiStrokeFill : o.disableMultiStroke;\n    const o1 = _line(x1, y1, x2, y2, o, true, false);\n    if (singleStroke) {\n        return o1;\n    }\n    const o2 = _line(x1, y1, x2, y2, o, true, true);\n    return o1.concat(o2);\n}\nfunction _line(x1, y1, x2, y2, o, move, overlay) {\n    const lengthSq = Math.pow((x1 - x2), 2) + Math.pow((y1 - y2), 2);\n    const length = Math.sqrt(lengthSq);\n    let roughnessGain = 1;\n    if (length < 200) {\n        roughnessGain = 1;\n    }\n    else if (length > 500) {\n        roughnessGain = 0.4;\n    }\n    else {\n        roughnessGain = (-0.0016668) * length + 1.233334;\n    }\n    let offset = o.maxRandomnessOffset || 0;\n    if ((offset * offset * 100) > lengthSq) {\n        offset = length / 10;\n    }\n    const halfOffset = offset / 2;\n    const divergePoint = 0.2 + random(o) * 0.2;\n    let midDispX = o.bowing * o.maxRandomnessOffset * (y2 - y1) / 200;\n    let midDispY = o.bowing * o.maxRandomnessOffset * (x1 - x2) / 200;\n    midDispX = _offsetOpt(midDispX, o, roughnessGain);\n    midDispY = _offsetOpt(midDispY, o, roughnessGain);\n    const ops = [];\n    const randomHalf = () => _offsetOpt(halfOffset, o, roughnessGain);\n    const randomFull = () => _offsetOpt(offset, o, roughnessGain);\n    const preserveVertices = o.preserveVertices;\n    if (move) {\n        if (overlay) {\n            ops.push({\n                op: 'move', data: [\n                    x1 + (preserveVertices ? 0 : randomHalf()),\n                    y1 + (preserveVertices ? 0 : randomHalf()),\n                ],\n            });\n        }\n        else {\n            ops.push({\n                op: 'move', data: [\n                    x1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\n                    y1 + (preserveVertices ? 0 : _offsetOpt(offset, o, roughnessGain)),\n                ],\n            });\n        }\n    }\n    if (overlay) {\n        ops.push({\n            op: 'bcurveTo',\n            data: [\n                midDispX + x1 + (x2 - x1) * divergePoint + randomHalf(),\n                midDispY + y1 + (y2 - y1) * divergePoint + randomHalf(),\n                midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomHalf(),\n                midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomHalf(),\n                x2 + (preserveVertices ? 0 : randomHalf()),\n                y2 + (preserveVertices ? 0 : randomHalf()),\n            ],\n        });\n    }\n    else {\n        ops.push({\n            op: 'bcurveTo',\n            data: [\n                midDispX + x1 + (x2 - x1) * divergePoint + randomFull(),\n                midDispY + y1 + (y2 - y1) * divergePoint + randomFull(),\n                midDispX + x1 + 2 * (x2 - x1) * divergePoint + randomFull(),\n                midDispY + y1 + 2 * (y2 - y1) * divergePoint + randomFull(),\n                x2 + (preserveVertices ? 0 : randomFull()),\n                y2 + (preserveVertices ? 0 : randomFull()),\n            ],\n        });\n    }\n    return ops;\n}\nfunction _curveWithOffset(points, offset, o) {\n    const ps = [];\n    ps.push([\n        points[0][0] + _offsetOpt(offset, o),\n        points[0][1] + _offsetOpt(offset, o),\n    ]);\n    ps.push([\n        points[0][0] + _offsetOpt(offset, o),\n        points[0][1] + _offsetOpt(offset, o),\n    ]);\n    for (let i = 1; i < points.length; i++) {\n        ps.push([\n            points[i][0] + _offsetOpt(offset, o),\n            points[i][1] + _offsetOpt(offset, o),\n        ]);\n        if (i === (points.length - 1)) {\n            ps.push([\n                points[i][0] + _offsetOpt(offset, o),\n                points[i][1] + _offsetOpt(offset, o),\n            ]);\n        }\n    }\n    return _curve(ps, null, o);\n}\nfunction _curve(points, closePoint, o) {\n    const len = points.length;\n    const ops = [];\n    if (len > 3) {\n        const b = [];\n        const s = 1 - o.curveTightness;\n        ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\n        for (let i = 1; (i + 2) < len; i++) {\n            const cachedVertArray = points[i];\n            b[0] = [cachedVertArray[0], cachedVertArray[1]];\n            b[1] = [cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6, cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6];\n            b[2] = [points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6, points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6];\n            b[3] = [points[i + 1][0], points[i + 1][1]];\n            ops.push({ op: 'bcurveTo', data: [b[1][0], b[1][1], b[2][0], b[2][1], b[3][0], b[3][1]] });\n        }\n        if (closePoint && closePoint.length === 2) {\n            const ro = o.maxRandomnessOffset;\n            ops.push({ op: 'lineTo', data: [closePoint[0] + _offsetOpt(ro, o), closePoint[1] + _offsetOpt(ro, o)] });\n        }\n    }\n    else if (len === 3) {\n        ops.push({ op: 'move', data: [points[1][0], points[1][1]] });\n        ops.push({\n            op: 'bcurveTo',\n            data: [\n                points[1][0], points[1][1],\n                points[2][0], points[2][1],\n                points[2][0], points[2][1],\n            ],\n        });\n    }\n    else if (len === 2) {\n        ops.push(..._doubleLine(points[0][0], points[0][1], points[1][0], points[1][1], o));\n    }\n    return ops;\n}\nfunction _computeEllipsePoints(increment, cx, cy, rx, ry, offset, overlap, o) {\n    const coreOnly = o.roughness === 0;\n    const corePoints = [];\n    const allPoints = [];\n    if (coreOnly) {\n        increment = increment / 4;\n        allPoints.push([\n            cx + rx * Math.cos(-increment),\n            cy + ry * Math.sin(-increment),\n        ]);\n        for (let angle = 0; angle <= Math.PI * 2; angle = angle + increment) {\n            const p = [\n                cx + rx * Math.cos(angle),\n                cy + ry * Math.sin(angle),\n            ];\n            corePoints.push(p);\n            allPoints.push(p);\n        }\n        allPoints.push([\n            cx + rx * Math.cos(0),\n            cy + ry * Math.sin(0),\n        ]);\n        allPoints.push([\n            cx + rx * Math.cos(increment),\n            cy + ry * Math.sin(increment),\n        ]);\n    }\n    else {\n        const radOffset = _offsetOpt(0.5, o) - (Math.PI / 2);\n        allPoints.push([\n            _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\n            _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\n        ]);\n        const endAngle = Math.PI * 2 + radOffset - 0.01;\n        for (let angle = radOffset; angle < endAngle; angle = angle + increment) {\n            const p = [\n                _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\n                _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\n            ];\n            corePoints.push(p);\n            allPoints.push(p);\n        }\n        allPoints.push([\n            _offsetOpt(offset, o) + cx + rx * Math.cos(radOffset + Math.PI * 2 + overlap * 0.5),\n            _offsetOpt(offset, o) + cy + ry * Math.sin(radOffset + Math.PI * 2 + overlap * 0.5),\n        ]);\n        allPoints.push([\n            _offsetOpt(offset, o) + cx + 0.98 * rx * Math.cos(radOffset + overlap),\n            _offsetOpt(offset, o) + cy + 0.98 * ry * Math.sin(radOffset + overlap),\n        ]);\n        allPoints.push([\n            _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset + overlap * 0.5),\n            _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset + overlap * 0.5),\n        ]);\n    }\n    return [allPoints, corePoints];\n}\nfunction _arc(increment, cx, cy, rx, ry, strt, stp, offset, o) {\n    const radOffset = strt + _offsetOpt(0.1, o);\n    const points = [];\n    points.push([\n        _offsetOpt(offset, o) + cx + 0.9 * rx * Math.cos(radOffset - increment),\n        _offsetOpt(offset, o) + cy + 0.9 * ry * Math.sin(radOffset - increment),\n    ]);\n    for (let angle = radOffset; angle <= stp; angle = angle + increment) {\n        points.push([\n            _offsetOpt(offset, o) + cx + rx * Math.cos(angle),\n            _offsetOpt(offset, o) + cy + ry * Math.sin(angle),\n        ]);\n    }\n    points.push([\n        cx + rx * Math.cos(stp),\n        cy + ry * Math.sin(stp),\n    ]);\n    points.push([\n        cx + rx * Math.cos(stp),\n        cy + ry * Math.sin(stp),\n    ]);\n    return _curve(points, null, o);\n}\nfunction _bezierTo(x1, y1, x2, y2, x, y, current, o) {\n    const ops = [];\n    const ros = [o.maxRandomnessOffset || 1, (o.maxRandomnessOffset || 1) + 0.3];\n    let f = [0, 0];\n    const iterations = o.disableMultiStroke ? 1 : 2;\n    const preserveVertices = o.preserveVertices;\n    for (let i = 0; i < iterations; i++) {\n        if (i === 0) {\n            ops.push({ op: 'move', data: [current[0], current[1]] });\n        }\n        else {\n            ops.push({ op: 'move', data: [current[0] + (preserveVertices ? 0 : _offsetOpt(ros[0], o)), current[1] + (preserveVertices ? 0 : _offsetOpt(ros[0], o))] });\n        }\n        f = preserveVertices ? [x, y] : [x + _offsetOpt(ros[i], o), y + _offsetOpt(ros[i], o)];\n        ops.push({\n            op: 'bcurveTo',\n            data: [\n                x1 + _offsetOpt(ros[i], o), y1 + _offsetOpt(ros[i], o),\n                x2 + _offsetOpt(ros[i], o), y2 + _offsetOpt(ros[i], o),\n                f[0], f[1],\n            ],\n        });\n    }\n    return ops;\n}\n","function clone(p) {\n    return [...p];\n}\nexport function curveToBezier(pointsIn, curveTightness = 0) {\n    const len = pointsIn.length;\n    if (len < 3) {\n        throw new Error('A curve must have at least three points.');\n    }\n    const out = [];\n    if (len === 3) {\n        out.push(clone(pointsIn[0]), clone(pointsIn[1]), clone(pointsIn[2]), clone(pointsIn[2]));\n    }\n    else {\n        const points = [];\n        points.push(pointsIn[0], pointsIn[0]);\n        for (let i = 1; i < pointsIn.length; i++) {\n            points.push(pointsIn[i]);\n            if (i === (pointsIn.length - 1)) {\n                points.push(pointsIn[i]);\n            }\n        }\n        const b = [];\n        const s = 1 - curveTightness;\n        out.push(clone(points[0]));\n        for (let i = 1; (i + 2) < points.length; i++) {\n            const cachedVertArray = points[i];\n            b[0] = [cachedVertArray[0], cachedVertArray[1]];\n            b[1] = [cachedVertArray[0] + (s * points[i + 1][0] - s * points[i - 1][0]) / 6, cachedVertArray[1] + (s * points[i + 1][1] - s * points[i - 1][1]) / 6];\n            b[2] = [points[i + 1][0] + (s * points[i][0] - s * points[i + 2][0]) / 6, points[i + 1][1] + (s * points[i][1] - s * points[i + 2][1]) / 6];\n            b[3] = [points[i + 1][0], points[i + 1][1]];\n            out.push(b[1], b[2], b[3]);\n        }\n    }\n    return out;\n}\n","import { line, solidFillPolygon, patternFillPolygons, rectangle, ellipseWithParams, generateEllipseParams, linearPath, arc, patternFillArc, curve, svgPath } from './renderer.js';\nimport { randomSeed } from './math.js';\nimport { curveToBezier } from 'points-on-curve/lib/curve-to-bezier.js';\nimport { pointsOnBezierCurves } from 'points-on-curve';\nimport { pointsOnPath } from 'points-on-path';\nconst NOS = 'none';\nexport class RoughGenerator {\n    constructor(config) {\n        this.defaultOptions = {\n            maxRandomnessOffset: 2,\n            roughness: 1,\n            bowing: 1,\n            stroke: '#000',\n            strokeWidth: 1,\n            curveTightness: 0,\n            curveFitting: 0.95,\n            curveStepCount: 9,\n            fillStyle: 'hachure',\n            fillWeight: -1,\n            hachureAngle: -41,\n            hachureGap: -1,\n            dashOffset: -1,\n            dashGap: -1,\n            zigzagOffset: -1,\n            seed: 0,\n            disableMultiStroke: false,\n            disableMultiStrokeFill: false,\n            preserveVertices: false,\n        };\n        this.config = config || {};\n        if (this.config.options) {\n            this.defaultOptions = this._o(this.config.options);\n        }\n    }\n    static newSeed() {\n        return randomSeed();\n    }\n    _o(options) {\n        return options ? Object.assign({}, this.defaultOptions, options) : this.defaultOptions;\n    }\n    _d(shape, sets, options) {\n        return { shape, sets: sets || [], options: options || this.defaultOptions };\n    }\n    line(x1, y1, x2, y2, options) {\n        const o = this._o(options);\n        return this._d('line', [line(x1, y1, x2, y2, o)], o);\n    }\n    rectangle(x, y, width, height, options) {\n        const o = this._o(options);\n        const paths = [];\n        const outline = rectangle(x, y, width, height, o);\n        if (o.fill) {\n            const points = [[x, y], [x + width, y], [x + width, y + height], [x, y + height]];\n            if (o.fillStyle === 'solid') {\n                paths.push(solidFillPolygon([points], o));\n            }\n            else {\n                paths.push(patternFillPolygons([points], o));\n            }\n        }\n        if (o.stroke !== NOS) {\n            paths.push(outline);\n        }\n        return this._d('rectangle', paths, o);\n    }\n    ellipse(x, y, width, height, options) {\n        const o = this._o(options);\n        const paths = [];\n        const ellipseParams = generateEllipseParams(width, height, o);\n        const ellipseResponse = ellipseWithParams(x, y, o, ellipseParams);\n        if (o.fill) {\n            if (o.fillStyle === 'solid') {\n                const shape = ellipseWithParams(x, y, o, ellipseParams).opset;\n                shape.type = 'fillPath';\n                paths.push(shape);\n            }\n            else {\n                paths.push(patternFillPolygons([ellipseResponse.estimatedPoints], o));\n            }\n        }\n        if (o.stroke !== NOS) {\n            paths.push(ellipseResponse.opset);\n        }\n        return this._d('ellipse', paths, o);\n    }\n    circle(x, y, diameter, options) {\n        const ret = this.ellipse(x, y, diameter, diameter, options);\n        ret.shape = 'circle';\n        return ret;\n    }\n    linearPath(points, options) {\n        const o = this._o(options);\n        return this._d('linearPath', [linearPath(points, false, o)], o);\n    }\n    arc(x, y, width, height, start, stop, closed = false, options) {\n        const o = this._o(options);\n        const paths = [];\n        const outline = arc(x, y, width, height, start, stop, closed, true, o);\n        if (closed && o.fill) {\n            if (o.fillStyle === 'solid') {\n                const fillOptions = Object.assign({}, o);\n                fillOptions.disableMultiStroke = true;\n                const shape = arc(x, y, width, height, start, stop, true, false, fillOptions);\n                shape.type = 'fillPath';\n                paths.push(shape);\n            }\n            else {\n                paths.push(patternFillArc(x, y, width, height, start, stop, o));\n            }\n        }\n        if (o.stroke !== NOS) {\n            paths.push(outline);\n        }\n        return this._d('arc', paths, o);\n    }\n    curve(points, options) {\n        const o = this._o(options);\n        const paths = [];\n        const outline = curve(points, o);\n        if (o.fill && o.fill !== NOS && points.length >= 3) {\n            const bcurve = curveToBezier(points);\n            const polyPoints = pointsOnBezierCurves(bcurve, 10, (1 + o.roughness) / 2);\n            if (o.fillStyle === 'solid') {\n                paths.push(solidFillPolygon([polyPoints], o));\n            }\n            else {\n                paths.push(patternFillPolygons([polyPoints], o));\n            }\n        }\n        if (o.stroke !== NOS) {\n            paths.push(outline);\n        }\n        return this._d('curve', paths, o);\n    }\n    polygon(points, options) {\n        const o = this._o(options);\n        const paths = [];\n        const outline = linearPath(points, true, o);\n        if (o.fill) {\n            if (o.fillStyle === 'solid') {\n                paths.push(solidFillPolygon([points], o));\n            }\n            else {\n                paths.push(patternFillPolygons([points], o));\n            }\n        }\n        if (o.stroke !== NOS) {\n            paths.push(outline);\n        }\n        return this._d('polygon', paths, o);\n    }\n    path(d, options) {\n        const o = this._o(options);\n        const paths = [];\n        if (!d) {\n            return this._d('path', paths, o);\n        }\n        d = (d || '').replace(/\\n/g, ' ').replace(/(-\\s)/g, '-').replace('/(\\s\\s)/g', ' ');\n        const hasFill = o.fill && o.fill !== 'transparent' && o.fill !== NOS;\n        const hasStroke = o.stroke !== NOS;\n        const simplified = !!(o.simplification && (o.simplification < 1));\n        const distance = simplified ? (4 - 4 * (o.simplification)) : ((1 + o.roughness) / 2);\n        const sets = pointsOnPath(d, 1, distance);\n        if (hasFill) {\n            if (o.fillStyle === 'solid') {\n                paths.push(solidFillPolygon(sets, o));\n            }\n            else {\n                paths.push(patternFillPolygons(sets, o));\n            }\n        }\n        if (hasStroke) {\n            if (simplified) {\n                sets.forEach((set) => {\n                    paths.push(linearPath(set, false, o));\n                });\n            }\n            else {\n                paths.push(svgPath(d, o));\n            }\n        }\n        return this._d('path', paths, o);\n    }\n    opsToPath(drawing, fixedDecimals) {\n        let path = '';\n        for (const item of drawing.ops) {\n            const data = ((typeof fixedDecimals === 'number') && fixedDecimals >= 0) ? (item.data.map((d) => +d.toFixed(fixedDecimals))) : item.data;\n            switch (item.op) {\n                case 'move':\n                    path += `M${data[0]} ${data[1]} `;\n                    break;\n                case 'bcurveTo':\n                    path += `C${data[0]} ${data[1]}, ${data[2]} ${data[3]}, ${data[4]} ${data[5]} `;\n                    break;\n                case 'lineTo':\n                    path += `L${data[0]} ${data[1]} `;\n                    break;\n            }\n        }\n        return path.trim();\n    }\n    toPaths(drawable) {\n        const sets = drawable.sets || [];\n        const o = drawable.options || this.defaultOptions;\n        const paths = [];\n        for (const drawing of sets) {\n            let path = null;\n            switch (drawing.type) {\n                case 'path':\n                    path = {\n                        d: this.opsToPath(drawing),\n                        stroke: o.stroke,\n                        strokeWidth: o.strokeWidth,\n                        fill: NOS,\n                    };\n                    break;\n                case 'fillPath':\n                    path = {\n                        d: this.opsToPath(drawing),\n                        stroke: NOS,\n                        strokeWidth: 0,\n                        fill: o.fill || NOS,\n                    };\n                    break;\n                case 'fillSketch':\n                    path = this.fillSketch(drawing, o);\n                    break;\n            }\n            if (path) {\n                paths.push(path);\n            }\n        }\n        return paths;\n    }\n    fillSketch(drawing, o) {\n        let fweight = o.fillWeight;\n        if (fweight < 0) {\n            fweight = o.strokeWidth / 2;\n        }\n        return {\n            d: this.opsToPath(drawing),\n            stroke: o.fill || NOS,\n            strokeWidth: fweight,\n            fill: NOS,\n        };\n    }\n}\n","import { pointsOnBezierCurves, simplify } from 'points-on-curve';\nimport { parsePath, absolutize, normalize } from 'path-data-parser';\nexport function pointsOnPath(path, tolerance, distance) {\n    const segments = parsePath(path);\n    const normalized = normalize(absolutize(segments));\n    const sets = [];\n    let currentPoints = [];\n    let start = [0, 0];\n    let pendingCurve = [];\n    const appendPendingCurve = () => {\n        if (pendingCurve.length >= 4) {\n            currentPoints.push(...pointsOnBezierCurves(pendingCurve, tolerance));\n        }\n        pendingCurve = [];\n    };\n    const appendPendingPoints = () => {\n        appendPendingCurve();\n        if (currentPoints.length) {\n            sets.push(currentPoints);\n            currentPoints = [];\n        }\n    };\n    for (const { key, data } of normalized) {\n        switch (key) {\n            case 'M':\n                appendPendingPoints();\n                start = [data[0], data[1]];\n                currentPoints.push(start);\n                break;\n            case 'L':\n                appendPendingCurve();\n                currentPoints.push([data[0], data[1]]);\n                break;\n            case 'C':\n                if (!pendingCurve.length) {\n                    const lastPoint = currentPoints.length ? currentPoints[currentPoints.length - 1] : start;\n                    pendingCurve.push([lastPoint[0], lastPoint[1]]);\n                }\n                pendingCurve.push([data[0], data[1]]);\n                pendingCurve.push([data[2], data[3]]);\n                pendingCurve.push([data[4], data[5]]);\n                break;\n            case 'Z':\n                appendPendingCurve();\n                currentPoints.push([start[0], start[1]]);\n                break;\n        }\n    }\n    appendPendingPoints();\n    if (!distance) {\n        return sets;\n    }\n    const out = [];\n    for (const set of sets) {\n        const simplifiedSet = simplify(set, distance);\n        if (simplifiedSet.length) {\n            out.push(simplifiedSet);\n        }\n    }\n    return out;\n}\n","import { RoughGenerator } from './generator';\nexport class RoughCanvas {\n    constructor(canvas, config) {\n        this.canvas = canvas;\n        this.ctx = this.canvas.getContext('2d');\n        this.gen = new RoughGenerator(config);\n    }\n    draw(drawable) {\n        const sets = drawable.sets || [];\n        const o = drawable.options || this.getDefaultOptions();\n        const ctx = this.ctx;\n        const precision = drawable.options.fixedDecimalPlaceDigits;\n        for (const drawing of sets) {\n            switch (drawing.type) {\n                case 'path':\n                    ctx.save();\n                    ctx.strokeStyle = o.stroke === 'none' ? 'transparent' : o.stroke;\n                    ctx.lineWidth = o.strokeWidth;\n                    if (o.strokeLineDash) {\n                        ctx.setLineDash(o.strokeLineDash);\n                    }\n                    if (o.strokeLineDashOffset) {\n                        ctx.lineDashOffset = o.strokeLineDashOffset;\n                    }\n                    this._drawToContext(ctx, drawing, precision);\n                    ctx.restore();\n                    break;\n                case 'fillPath': {\n                    ctx.save();\n                    ctx.fillStyle = o.fill || '';\n                    const fillRule = (drawable.shape === 'curve' || drawable.shape === 'polygon' || drawable.shape === 'path') ? 'evenodd' : 'nonzero';\n                    this._drawToContext(ctx, drawing, precision, fillRule);\n                    ctx.restore();\n                    break;\n                }\n                case 'fillSketch':\n                    this.fillSketch(ctx, drawing, o);\n                    break;\n            }\n        }\n    }\n    fillSketch(ctx, drawing, o) {\n        let fweight = o.fillWeight;\n        if (fweight < 0) {\n            fweight = o.strokeWidth / 2;\n        }\n        ctx.save();\n        if (o.fillLineDash) {\n            ctx.setLineDash(o.fillLineDash);\n        }\n        if (o.fillLineDashOffset) {\n            ctx.lineDashOffset = o.fillLineDashOffset;\n        }\n        ctx.strokeStyle = o.fill || '';\n        ctx.lineWidth = fweight;\n        this._drawToContext(ctx, drawing, o.fixedDecimalPlaceDigits);\n        ctx.restore();\n    }\n    _drawToContext(ctx, drawing, fixedDecimals, rule = 'nonzero') {\n        ctx.beginPath();\n        for (const item of drawing.ops) {\n            const data = ((typeof fixedDecimals === 'number') && fixedDecimals >= 0) ? (item.data.map((d) => +d.toFixed(fixedDecimals))) : item.data;\n            switch (item.op) {\n                case 'move':\n                    ctx.moveTo(data[0], data[1]);\n                    break;\n                case 'bcurveTo':\n                    ctx.bezierCurveTo(data[0], data[1], data[2], data[3], data[4], data[5]);\n                    break;\n                case 'lineTo':\n                    ctx.lineTo(data[0], data[1]);\n                    break;\n            }\n        }\n        if (drawing.type === 'fillPath') {\n            ctx.fill(rule);\n        }\n        else {\n            ctx.stroke();\n        }\n    }\n    get generator() {\n        return this.gen;\n    }\n    getDefaultOptions() {\n        return this.gen.defaultOptions;\n    }\n    line(x1, y1, x2, y2, options) {\n        const d = this.gen.line(x1, y1, x2, y2, options);\n        this.draw(d);\n        return d;\n    }\n    rectangle(x, y, width, height, options) {\n        const d = this.gen.rectangle(x, y, width, height, options);\n        this.draw(d);\n        return d;\n    }\n    ellipse(x, y, width, height, options) {\n        const d = this.gen.ellipse(x, y, width, height, options);\n        this.draw(d);\n        return d;\n    }\n    circle(x, y, diameter, options) {\n        const d = this.gen.circle(x, y, diameter, options);\n        this.draw(d);\n        return d;\n    }\n    linearPath(points, options) {\n        const d = this.gen.linearPath(points, options);\n        this.draw(d);\n        return d;\n    }\n    polygon(points, options) {\n        const d = this.gen.polygon(points, options);\n        this.draw(d);\n        return d;\n    }\n    arc(x, y, width, height, start, stop, closed = false, options) {\n        const d = this.gen.arc(x, y, width, height, start, stop, closed, options);\n        this.draw(d);\n        return d;\n    }\n    curve(points, options) {\n        const d = this.gen.curve(points, options);\n        this.draw(d);\n        return d;\n    }\n    path(d, options) {\n        const drawing = this.gen.path(d, options);\n        this.draw(drawing);\n        return drawing;\n    }\n}\n","export const SVGNS = 'http://www.w3.org/2000/svg';\n","import { SVGNS } from './core';\nimport { RoughGenerator } from './generator';\nexport class RoughSVG {\n    constructor(svg, config) {\n        this.svg = svg;\n        this.gen = new RoughGenerator(config);\n    }\n    draw(drawable) {\n        const sets = drawable.sets || [];\n        const o = drawable.options || this.getDefaultOptions();\n        const doc = this.svg.ownerDocument || window.document;\n        const g = doc.createElementNS(SVGNS, 'g');\n        const precision = drawable.options.fixedDecimalPlaceDigits;\n        for (const drawing of sets) {\n            let path = null;\n            switch (drawing.type) {\n                case 'path': {\n                    path = doc.createElementNS(SVGNS, 'path');\n                    path.setAttribute('d', this.opsToPath(drawing, precision));\n                    path.setAttribute('stroke', o.stroke);\n                    path.setAttribute('stroke-width', o.strokeWidth + '');\n                    path.setAttribute('fill', 'none');\n                    if (o.strokeLineDash) {\n                        path.setAttribute('stroke-dasharray', o.strokeLineDash.join(' ').trim());\n                    }\n                    if (o.strokeLineDashOffset) {\n                        path.setAttribute('stroke-dashoffset', `${o.strokeLineDashOffset}`);\n                    }\n                    break;\n                }\n                case 'fillPath': {\n                    path = doc.createElementNS(SVGNS, 'path');\n                    path.setAttribute('d', this.opsToPath(drawing, precision));\n                    path.setAttribute('stroke', 'none');\n                    path.setAttribute('stroke-width', '0');\n                    path.setAttribute('fill', o.fill || '');\n                    if (drawable.shape === 'curve' || drawable.shape === 'polygon') {\n                        path.setAttribute('fill-rule', 'evenodd');\n                    }\n                    break;\n                }\n                case 'fillSketch': {\n                    path = this.fillSketch(doc, drawing, o);\n                    break;\n                }\n            }\n            if (path) {\n                g.appendChild(path);\n            }\n        }\n        return g;\n    }\n    fillSketch(doc, drawing, o) {\n        let fweight = o.fillWeight;\n        if (fweight < 0) {\n            fweight = o.strokeWidth / 2;\n        }\n        const path = doc.createElementNS(SVGNS, 'path');\n        path.setAttribute('d', this.opsToPath(drawing, o.fixedDecimalPlaceDigits));\n        path.setAttribute('stroke', o.fill || '');\n        path.setAttribute('stroke-width', fweight + '');\n        path.setAttribute('fill', 'none');\n        if (o.fillLineDash) {\n            path.setAttribute('stroke-dasharray', o.fillLineDash.join(' ').trim());\n        }\n        if (o.fillLineDashOffset) {\n            path.setAttribute('stroke-dashoffset', `${o.fillLineDashOffset}`);\n        }\n        return path;\n    }\n    get generator() {\n        return this.gen;\n    }\n    getDefaultOptions() {\n        return this.gen.defaultOptions;\n    }\n    opsToPath(drawing, fixedDecimalPlaceDigits) {\n        return this.gen.opsToPath(drawing, fixedDecimalPlaceDigits);\n    }\n    line(x1, y1, x2, y2, options) {\n        const d = this.gen.line(x1, y1, x2, y2, options);\n        return this.draw(d);\n    }\n    rectangle(x, y, width, height, options) {\n        const d = this.gen.rectangle(x, y, width, height, options);\n        return this.draw(d);\n    }\n    ellipse(x, y, width, height, options) {\n        const d = this.gen.ellipse(x, y, width, height, options);\n        return this.draw(d);\n    }\n    circle(x, y, diameter, options) {\n        const d = this.gen.circle(x, y, diameter, options);\n        return this.draw(d);\n    }\n    linearPath(points, options) {\n        const d = this.gen.linearPath(points, options);\n        return this.draw(d);\n    }\n    polygon(points, options) {\n        const d = this.gen.polygon(points, options);\n        return this.draw(d);\n    }\n    arc(x, y, width, height, start, stop, closed = false, options) {\n        const d = this.gen.arc(x, y, width, height, start, stop, closed, options);\n        return this.draw(d);\n    }\n    curve(points, options) {\n        const d = this.gen.curve(points, options);\n        return this.draw(d);\n    }\n    path(d, options) {\n        const drawing = this.gen.path(d, options);\n        return this.draw(drawing);\n    }\n}\n","import { RoughCanvas } from './canvas';\nimport { RoughGenerator } from './generator';\nimport { RoughSVG } from './svg';\nexport default {\n    canvas(canvas, config) {\n        return new RoughCanvas(canvas, config);\n    },\n    svg(svg, config) {\n        return new RoughSVG(svg, config);\n    },\n    generator(config) {\n        return new RoughGenerator(config);\n    },\n    newSeed() {\n        return RoughGenerator.newSeed();\n    },\n};\n","/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';function f(a,b){var c=a.length;a.push(b);a:for(;0<c;){var d=c-1>>>1,e=a[d];if(0<g(e,b))a[d]=b,a[c]=e,c=d;else break a}}function h(a){return 0===a.length?null:a[0]}function k(a){if(0===a.length)return null;var b=a[0],c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length,w=e>>>1;d<w;){var m=2*(d+1)-1,C=a[m],n=m+1,x=a[n];if(0>g(C,c))n<e&&0>g(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(n<e&&0>g(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Q<P?!1:!0}function R(){if(null!==O){var a=exports.unstable_now();Q=a;var b=!0;try{b=O(!0,a)}finally{b?S():(N=!1,O=null)}}else N=!1}var S;if(\"function\"===typeof F)S=function(){F(R)};else if(\"undefined\"!==typeof MessageChannel){var T=new MessageChannel,U=T.port2;T.port1.onmessage=R;S=function(){U.postMessage(null)}}else S=function(){D(R,0)};function I(a){O=a;N||(N=!0,S())}function K(a,b){L=D(function(){a(exports.unstable_now())},b)}\nexports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){A||z||(A=!0,I(J))};\nexports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):P=0<a?Math.floor(1E3/a):5};exports.unstable_getCurrentPriorityLevel=function(){return y};exports.unstable_getFirstCallbackNode=function(){return h(r)};exports.unstable_next=function(a){switch(y){case 1:case 2:case 3:var b=3;break;default:b=y}var c=y;y=b;try{return a()}finally{y=c}};exports.unstable_pauseExecution=function(){};\nexports.unstable_requestPaint=function(){};exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=y;y=a;try{return b()}finally{y=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();\"object\"===typeof c&&null!==c?(c=c.delay,c=\"number\"===typeof c&&0<c?d+c:d):c=d;switch(a){case 1:var e=-1;break;case 2:e=250;break;case 5:e=1073741823;break;case 4:e=1E4;break;default:e=5E3}e=c+e;a={id:u++,callback:b,priorityLevel:a,startTime:c,expirationTime:e,sortIndex:-1};c>d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n  module.exports = require('./cjs/scheduler.development.js');\n}\n","\n/**\n * An Array.prototype.slice.call(arguments) alternative\n *\n * @param {Object} args something with a length\n * @param {Number} slice\n * @param {Number} sliceEnd\n * @api public\n */\n\nmodule.exports = function (args, slice, sliceEnd) {\n  var ret = [];\n  var len = args.length;\n\n  if (0 === len) return ret;\n\n  var start = slice < 0\n    ? Math.max(0, slice + len)\n    : slice || 0;\n\n  if (sliceEnd !== undefined) {\n    len = sliceEnd < 0\n      ? sliceEnd + len\n      : sliceEnd\n  }\n\n  while (len-- > start) {\n    ret[len - start] = args[len];\n  }\n\n  return ret;\n}\n\n","/**\n * @license React\n * use-sync-external-store-shim.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var e=require(\"react\");function h(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var k=\"function\"===typeof Object.is?Object.is:h,l=e.useState,m=e.useEffect,n=e.useLayoutEffect,p=e.useDebugValue;function q(a,b){var d=b(),f=l({inst:{value:d,getSnapshot:b}}),c=f[0].inst,g=f[1];n(function(){c.value=d;c.getSnapshot=b;r(c)&&g({inst:c})},[a,d,b]);m(function(){r(c)&&g({inst:c});return a(function(){r(c)&&g({inst:c})})},[a]);p(d);return d}\nfunction r(a){var b=a.getSnapshot;a=a.value;try{var d=b();return!k(a,d)}catch(f){return!0}}function t(a,b){return b()}var u=\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement?t:q;exports.useSyncExternalStore=void 0!==e.useSyncExternalStore?e.useSyncExternalStore:u;\n","/**\n * @license React\n * use-sync-external-store-shim/with-selector.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n'use strict';var h=require(\"react\"),n=require(\"use-sync-external-store/shim\");function p(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var q=\"function\"===typeof Object.is?Object.is:p,r=n.useSyncExternalStore,t=h.useRef,u=h.useEffect,v=h.useMemo,w=h.useDebugValue;\nexports.useSyncExternalStoreWithSelector=function(a,b,e,l,g){var c=t(null);if(null===c.current){var f={hasValue:!1,value:null};c.current=f}else f=c.current;c=v(function(){function a(a){if(!c){c=!0;d=a;a=l(a);if(void 0!==g&&f.hasValue){var b=f.value;if(g(b,a))return k=b}return k=a}b=k;if(q(d,a))return b;var e=l(a);if(void 0!==g&&g(b,e))return b;d=a;return k=e}var c=!1,d,k,m=void 0===e?null:e;return[function(){return a(b())},null===m?void 0:function(){return a(m())}]},[b,e,l,g]);var d=r(a,c[0],c[1]);\nu(function(){f.hasValue=!0;f.value=d},[d]);w(d);return d};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('../cjs/use-sync-external-store-shim.production.min.js');\n} else {\n  module.exports = require('../cjs/use-sync-external-store-shim.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n  module.exports = require('../cjs/use-sync-external-store-shim/with-selector.production.min.js');\n} else {\n  module.exports = require('../cjs/use-sync-external-store-shim/with-selector.development.js');\n}\n","var map = {\n\t\"./ar-SA.json\": [\n\t\t966,\n\t\t2091\n\t],\n\t\"./bg-BG.json\": [\n\t\t5574,\n\t\t1628\n\t],\n\t\"./bn-BD.json\": [\n\t\t5609,\n\t\t7429\n\t],\n\t\"./ca-ES.json\": [\n\t\t197,\n\t\t5130\n\t],\n\t\"./cs-CZ.json\": [\n\t\t6974,\n\t\t6265\n\t],\n\t\"./da-DK.json\": [\n\t\t5587,\n\t\t1790\n\t],\n\t\"./de-DE.json\": [\n\t\t4048,\n\t\t3082\n\t],\n\t\"./el-GR.json\": [\n\t\t4020,\n\t\t1513\n\t],\n\t\"./en.json\": [\n\t\t790\n\t],\n\t\"./es-ES.json\": [\n\t\t3840,\n\t\t8759\n\t],\n\t\"./eu-ES.json\": [\n\t\t2565,\n\t\t8081\n\t],\n\t\"./fa-IR.json\": [\n\t\t9218,\n\t\t5330\n\t],\n\t\"./fi-FI.json\": [\n\t\t8584,\n\t\t3512\n\t],\n\t\"./fr-FR.json\": [\n\t\t4824,\n\t\t3682\n\t],\n\t\"./gl-ES.json\": [\n\t\t4111,\n\t\t2943\n\t],\n\t\"./he-IL.json\": [\n\t\t5577,\n\t\t2312\n\t],\n\t\"./hi-IN.json\": [\n\t\t9223,\n\t\t9828\n\t],\n\t\"./hu-HU.json\": [\n\t\t7972,\n\t\t7368\n\t],\n\t\"./id-ID.json\": [\n\t\t1122,\n\t\t3808\n\t],\n\t\"./it-IT.json\": [\n\t\t9064,\n\t\t6239\n\t],\n\t\"./ja-JP.json\": [\n\t\t2301,\n\t\t1204\n\t],\n\t\"./kab-KAB.json\": [\n\t\t1384,\n\t\t9551\n\t],\n\t\"./kk-KZ.json\": [\n\t\t460,\n\t\t22\n\t],\n\t\"./ko-KR.json\": [\n\t\t2511,\n\t\t6844\n\t],\n\t\"./ku-TR.json\": [\n\t\t6612,\n\t\t3031\n\t],\n\t\"./lt-LT.json\": [\n\t\t2045,\n\t\t8340\n\t],\n\t\"./lv-LV.json\": [\n\t\t8586,\n\t\t6768\n\t],\n\t\"./mr-IN.json\": [\n\t\t6161,\n\t\t3397\n\t],\n\t\"./my-MM.json\": [\n\t\t5610,\n\t\t1477\n\t],\n\t\"./nb-NO.json\": [\n\t\t7288,\n\t\t2359\n\t],\n\t\"./nl-NL.json\": [\n\t\t4402,\n\t\t3024\n\t],\n\t\"./nn-NO.json\": [\n\t\t8865,\n\t\t3885\n\t],\n\t\"./oc-FR.json\": [\n\t\t9302,\n\t\t1690\n\t],\n\t\"./pa-IN.json\": [\n\t\t116,\n\t\t3162\n\t],\n\t\"./percentages.json\": [\n\t\t2675\n\t],\n\t\"./pl-PL.json\": [\n\t\t258,\n\t\t3674\n\t],\n\t\"./pt-BR.json\": [\n\t\t6837,\n\t\t3721\n\t],\n\t\"./pt-PT.json\": [\n\t\t2176,\n\t\t5395\n\t],\n\t\"./ro-RO.json\": [\n\t\t6362,\n\t\t5089\n\t],\n\t\"./ru-RU.json\": [\n\t\t9925,\n\t\t8124\n\t],\n\t\"./si-LK.json\": [\n\t\t2707,\n\t\t1302\n\t],\n\t\"./sk-SK.json\": [\n\t\t1094,\n\t\t8750\n\t],\n\t\"./sl-SI.json\": [\n\t\t6979,\n\t\t6071\n\t],\n\t\"./sv-SE.json\": [\n\t\t9385,\n\t\t8534\n\t],\n\t\"./ta-IN.json\": [\n\t\t3131,\n\t\t2404\n\t],\n\t\"./tr-TR.json\": [\n\t\t9961,\n\t\t4977\n\t],\n\t\"./uk-UA.json\": [\n\t\t4924,\n\t\t7759\n\t],\n\t\"./vi-VN.json\": [\n\t\t931,\n\t\t4000\n\t],\n\t\"./zh-CN.json\": [\n\t\t9890,\n\t\t4680\n\t],\n\t\"./zh-HK.json\": [\n\t\t8539,\n\t\t7920\n\t],\n\t\"./zh-TW.json\": [\n\t\t6687,\n\t\t3421\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(function() {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(function() {\n\t\treturn __webpack_require__.t(id, 3 | 16);\n\t});\n}\nwebpackAsyncContext.keys = function() { return Object.keys(map); };\nwebpackAsyncContext.id = 5491;\nmodule.exports = webpackAsyncContext;","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) {\n    arr2[i] = arr[i];\n  }\n  return arr2;\n}","export default function _assertThisInitialized(self) {\n  if (self === void 0) {\n    throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n  }\n  return self;\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\nexport default function _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n      args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n      _next(undefined);\n    });\n  };\n}","export default function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\nexport default function _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  Object.defineProperty(Constructor, \"prototype\", {\n    writable: false\n  });\n  return Constructor;\n}","import unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nexport default function _createForOfIteratorHelper(o, allowArrayLike) {\n  var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n  if (!it) {\n    if (Array.isArray(o) || (it = unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n      if (it) o = it;\n      var i = 0;\n      var F = function F() {};\n      return {\n        s: F,\n        n: function n() {\n          if (i >= o.length) return {\n            done: true\n          };\n          return {\n            done: false,\n            value: o[i++]\n          };\n        },\n        e: function e(_e) {\n          throw _e;\n        },\n        f: F\n      };\n    }\n    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n  var normalCompletion = true,\n    didErr = false,\n    err;\n  return {\n    s: function s() {\n      it = it.call(o);\n    },\n    n: function n() {\n      var step = it.next();\n      normalCompletion = step.done;\n      return step;\n    },\n    e: function e(_e2) {\n      didErr = true;\n      err = _e2;\n    },\n    f: function f() {\n      try {\n        if (!normalCompletion && it[\"return\"] != null) it[\"return\"]();\n      } finally {\n        if (didErr) throw err;\n      }\n    }\n  };\n}","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nexport default function _possibleConstructorReturn(self, call) {\n  if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) {\n    return call;\n  } else if (call !== void 0) {\n    throw new TypeError(\"Derived constructors may only return object or undefined\");\n  }\n  return assertThisInitialized(self);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nimport possibleConstructorReturn from \"./possibleConstructorReturn.js\";\nexport default function _createSuper(Derived) {\n  var hasNativeReflectConstruct = isNativeReflectConstruct();\n  return function _createSuperInternal() {\n    var Super = getPrototypeOf(Derived),\n      result;\n    if (hasNativeReflectConstruct) {\n      var NewTarget = getPrototypeOf(this).constructor;\n      result = Reflect.construct(Super, arguments, NewTarget);\n    } else {\n      result = Super.apply(this, arguments);\n    }\n    return possibleConstructorReturn(this, result);\n  };\n}","export default function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n  return obj;\n}","export default function _getPrototypeOf(o) {\n  _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) {\n    return o.__proto__ || Object.getPrototypeOf(o);\n  };\n  return _getPrototypeOf(o);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inherits(subClass, superClass) {\n  if (typeof superClass !== \"function\" && superClass !== null) {\n    throw new TypeError(\"Super expression must either be null or a function\");\n  }\n  subClass.prototype = Object.create(superClass && superClass.prototype, {\n    constructor: {\n      value: subClass,\n      writable: true,\n      configurable: true\n    }\n  });\n  Object.defineProperty(subClass, \"prototype\", {\n    writable: false\n  });\n  if (superClass) setPrototypeOf(subClass, superClass);\n}","export default function _isNativeReflectConstruct() {\n  if (typeof Reflect === \"undefined\" || !Reflect.construct) return false;\n  if (Reflect.construct.sham) return false;\n  if (typeof Proxy === \"function\") return true;\n  try {\n    Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n    return true;\n  } catch (e) {\n    return false;\n  }\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n    enumerableOnly && (symbols = symbols.filter(function (sym) {\n      return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n    })), keys.push.apply(keys, symbols);\n  }\n  return keys;\n}\nexport default function _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = null != arguments[i] ? arguments[i] : {};\n    i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n      defineProperty(target, key, source[key]);\n    }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n      Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n    });\n  }\n  return target;\n}","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n  if (source == null) return {};\n  var target = objectWithoutPropertiesLoose(source, excluded);\n  var key, i;\n  if (Object.getOwnPropertySymbols) {\n    var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n    for (i = 0; i < sourceSymbolKeys.length; i++) {\n      key = sourceSymbolKeys[i];\n      if (excluded.indexOf(key) >= 0) continue;\n      if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n      target[key] = source[key];\n    }\n  }\n  return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n  if (source == null) return {};\n  var target = {};\n  var sourceKeys = Object.keys(source);\n  var key, i;\n  for (i = 0; i < sourceKeys.length; i++) {\n    key = sourceKeys[i];\n    if (excluded.indexOf(key) >= 0) continue;\n    target[key] = source[key];\n  }\n  return target;\n}","import _typeof from \"./typeof.js\";\nexport default function _regeneratorRuntime() {\n  \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n  _regeneratorRuntime = function _regeneratorRuntime() {\n    return exports;\n  };\n  var exports = {},\n    Op = Object.prototype,\n    hasOwn = Op.hasOwnProperty,\n    defineProperty = Object.defineProperty || function (obj, key, desc) {\n      obj[key] = desc.value;\n    },\n    $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n    iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n    asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n    toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n  function define(obj, key, value) {\n    return Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: !0,\n      configurable: !0,\n      writable: !0\n    }), obj[key];\n  }\n  try {\n    define({}, \"\");\n  } catch (err) {\n    define = function define(obj, key, value) {\n      return obj[key] = value;\n    };\n  }\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n      generator = Object.create(protoGenerator.prototype),\n      context = new Context(tryLocsList || []);\n    return defineProperty(generator, \"_invoke\", {\n      value: makeInvokeMethod(innerFn, self, context)\n    }), generator;\n  }\n  function tryCatch(fn, obj, arg) {\n    try {\n      return {\n        type: \"normal\",\n        arg: fn.call(obj, arg)\n      };\n    } catch (err) {\n      return {\n        type: \"throw\",\n        arg: err\n      };\n    }\n  }\n  exports.wrap = wrap;\n  var ContinueSentinel = {};\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n  var IteratorPrototype = {};\n  define(IteratorPrototype, iteratorSymbol, function () {\n    return this;\n  });\n  var getProto = Object.getPrototypeOf,\n    NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function (method) {\n      define(prototype, method, function (arg) {\n        return this._invoke(method, arg);\n      });\n    });\n  }\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (\"throw\" !== record.type) {\n        var result = record.arg,\n          value = result.value;\n        return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n          invoke(\"next\", value, resolve, reject);\n        }, function (err) {\n          invoke(\"throw\", err, resolve, reject);\n        }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n          result.value = unwrapped, resolve(result);\n        }, function (error) {\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n      reject(record.arg);\n    }\n    var previousPromise;\n    defineProperty(this, \"_invoke\", {\n      value: function value(method, arg) {\n        function callInvokeWithMethodAndArg() {\n          return new PromiseImpl(function (resolve, reject) {\n            invoke(method, arg, resolve, reject);\n          });\n        }\n        return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n      }\n    });\n  }\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = \"suspendedStart\";\n    return function (method, arg) {\n      if (\"executing\" === state) throw new Error(\"Generator is already running\");\n      if (\"completed\" === state) {\n        if (\"throw\" === method) throw arg;\n        return doneResult();\n      }\n      for (context.method = method, context.arg = arg;;) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n        if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n          if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n          context.dispatchException(context.arg);\n        } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n        state = \"executing\";\n        var record = tryCatch(innerFn, self, context);\n        if (\"normal\" === record.type) {\n          if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n          return {\n            value: record.arg,\n            done: context.done\n          };\n        }\n        \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n      }\n    };\n  }\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (undefined === method) {\n      if (context.delegate = null, \"throw\" === context.method) {\n        if (delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method)) return ContinueSentinel;\n        context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a 'throw' method\");\n      }\n      return ContinueSentinel;\n    }\n    var record = tryCatch(method, delegate.iterator, context.arg);\n    if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n    var info = record.arg;\n    return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n  }\n  function pushTryEntry(locs) {\n    var entry = {\n      tryLoc: locs[0]\n    };\n    1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n  }\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\", delete record.arg, entry.completion = record;\n  }\n  function Context(tryLocsList) {\n    this.tryEntries = [{\n      tryLoc: \"root\"\n    }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n  }\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) return iteratorMethod.call(iterable);\n      if (\"function\" == typeof iterable.next) return iterable;\n      if (!isNaN(iterable.length)) {\n        var i = -1,\n          next = function next() {\n            for (; ++i < iterable.length;) {\n              if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n            }\n            return next.value = undefined, next.done = !0, next;\n          };\n        return next.next = next;\n      }\n    }\n    return {\n      next: doneResult\n    };\n  }\n  function doneResult() {\n    return {\n      value: undefined,\n      done: !0\n    };\n  }\n  return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n    value: GeneratorFunctionPrototype,\n    configurable: !0\n  }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n    value: GeneratorFunction,\n    configurable: !0\n  }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n    var ctor = \"function\" == typeof genFun && genFun.constructor;\n    return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n  }, exports.mark = function (genFun) {\n    return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n  }, exports.awrap = function (arg) {\n    return {\n      __await: arg\n    };\n  }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n    return this;\n  }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    void 0 === PromiseImpl && (PromiseImpl = Promise);\n    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n    return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n      return result.done ? result.value : iter.next();\n    });\n  }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n    return this;\n  }), define(Gp, \"toString\", function () {\n    return \"[object Generator]\";\n  }), exports.keys = function (val) {\n    var object = Object(val),\n      keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    return keys.reverse(), function next() {\n      for (; keys.length;) {\n        var key = keys.pop();\n        if (key in object) return next.value = key, next.done = !1, next;\n      }\n      return next.done = !0, next;\n    };\n  }, exports.values = values, Context.prototype = {\n    constructor: Context,\n    reset: function reset(skipTempReset) {\n      if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {\n        \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n      }\n    },\n    stop: function stop() {\n      this.done = !0;\n      var rootRecord = this.tryEntries[0].completion;\n      if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n      return this.rval;\n    },\n    dispatchException: function dispatchException(exception) {\n      if (this.done) throw exception;\n      var context = this;\n      function handle(loc, caught) {\n        return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n      }\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i],\n          record = entry.completion;\n        if (\"root\" === entry.tryLoc) return handle(\"end\");\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n            hasFinally = hasOwn.call(entry, \"finallyLoc\");\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n          } else {\n            if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n            if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n          }\n        }\n      }\n    },\n    abrupt: function abrupt(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n      finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n      var record = finallyEntry ? finallyEntry.completion : {};\n      return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n    },\n    complete: function complete(record, afterLoc) {\n      if (\"throw\" === record.type) throw record.arg;\n      return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n    },\n    finish: function finish(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n      }\n    },\n    \"catch\": function _catch(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (\"throw\" === record.type) {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n      throw new Error(\"illegal catch attempt\");\n    },\n    delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n      return this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n    }\n  }, exports;\n}","export default function _setPrototypeOf(o, p) {\n  _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n    o.__proto__ = p;\n    return o;\n  };\n  return _setPrototypeOf(o, p);\n}","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}","export default function _iterableToArrayLimit(arr, i) {\n  var _i = arr == null ? null : typeof Symbol !== \"undefined\" && arr[Symbol.iterator] || arr[\"@@iterator\"];\n  if (_i == null) return;\n  var _arr = [];\n  var _n = true;\n  var _d = false;\n  var _s, _e;\n  try {\n    for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) {\n      _arr.push(_s.value);\n      if (i && _arr.length === i) break;\n    }\n  } catch (err) {\n    _d = true;\n    _e = err;\n  } finally {\n    try {\n      if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n    } finally {\n      if (_d) throw _e;\n    }\n  }\n  return _arr;\n}","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n  return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n  if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n  throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","export default function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n    return typeof obj;\n  } : function (obj) {\n    return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n  }, _typeof(obj);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","import { urlAlphabet } from './url-alphabet/index.js'\nlet random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nlet customRandom = (alphabet, defaultSize, getRandom) => {\n  let mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n  let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n  return (size = defaultSize) => {\n    let id = ''\n    while (true) {\n      let bytes = getRandom(step)\n      let j = step\n      while (j--) {\n        id += alphabet[bytes[j] & mask] || ''\n        if (id.length === size) return id\n      }\n    }\n  }\n}\nlet customAlphabet = (alphabet, size = 21) =>\n  customRandom(alphabet, size, random)\nlet nanoid = (size = 21) =>\n  crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n    byte &= 63\n    if (byte < 36) {\n      id += byte.toString(36)\n    } else if (byte < 62) {\n      id += (byte - 26).toString(36).toUpperCase()\n    } else if (byte > 62) {\n      id += '-'\n    } else {\n      id += '_'\n    }\n    return id\n  }, '')\nexport { nanoid, customAlphabet, customRandom, urlAlphabet, random }\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = function(module) {\n\tvar getter = module && module.__esModule ?\n\t\tfunction() { return module['default']; } :\n\t\tfunction() { return module; };\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? function(obj) { return Object.getPrototypeOf(obj); } : function(obj) { return obj.__proto__; };\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach(function(key) { def[key] = function() { return value[key]; }; });\n\t}\n\tdef['default'] = function() { return value; };\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = function(chunkId) {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce(function(promises, key) {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = function(chunkId) {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + ({\"22\":\"locales/kk-KZ-json\",\"851\":\"storage\",\"1204\":\"locales/ja-JP-json\",\"1302\":\"locales/si-LK-json\",\"1326\":\"firebase\",\"1477\":\"locales/my-MM-json\",\"1513\":\"locales/el-GR-json\",\"1628\":\"locales/bg-BG-json\",\"1690\":\"locales/oc-FR-json\",\"1790\":\"locales/da-DK-json\",\"1965\":\"firestore\",\"2091\":\"locales/ar-SA-json\",\"2312\":\"locales/he-IL-json\",\"2359\":\"locales/nb-NO-json\",\"2404\":\"locales/ta-IN-json\",\"2943\":\"locales/gl-ES-json\",\"2967\":\"pwacompat\",\"3024\":\"locales/nl-NL-json\",\"3031\":\"locales/ku-TR-json\",\"3082\":\"locales/de-DE-json\",\"3162\":\"locales/pa-IN-json\",\"3397\":\"locales/mr-IN-json\",\"3421\":\"locales/zh-TW-json\",\"3512\":\"locales/fi-FI-json\",\"3674\":\"locales/pl-PL-json\",\"3682\":\"locales/fr-FR-json\",\"3721\":\"locales/pt-BR-json\",\"3808\":\"locales/id-ID-json\",\"3885\":\"locales/nn-NO-json\",\"4000\":\"locales/vi-VN-json\",\"4680\":\"locales/zh-CN-json\",\"4977\":\"locales/tr-TR-json\",\"5089\":\"locales/ro-RO-json\",\"5130\":\"locales/ca-ES-json\",\"5330\":\"locales/fa-IR-json\",\"5395\":\"locales/pt-PT-json\",\"6071\":\"locales/sl-SI-json\",\"6239\":\"locales/it-IT-json\",\"6265\":\"locales/cs-CZ-json\",\"6375\":\"bug-issue-template\",\"6768\":\"locales/lv-LV-json\",\"6844\":\"locales/ko-KR-json\",\"7357\":\"socketIoClient\",\"7368\":\"locales/hu-HU-json\",\"7429\":\"locales/bn-BD-json\",\"7759\":\"locales/uk-UA-json\",\"7920\":\"locales/zh-HK-json\",\"8081\":\"locales/eu-ES-json\",\"8124\":\"locales/ru-RU-json\",\"8340\":\"locales/lt-LT-json\",\"8534\":\"locales/sv-SE-json\",\"8750\":\"locales/sk-SK-json\",\"8759\":\"locales/es-ES-json\",\"9551\":\"locales/kab-KAB-json\",\"9828\":\"locales/hi-IN-json\"}[chunkId] || chunkId) + \".\" + {\"22\":\"90b1e6f5\",\"242\":\"f555ddfb\",\"528\":\"e83531d5\",\"851\":\"362fdd64\",\"1204\":\"ba7479fa\",\"1302\":\"c5e6b4f8\",\"1326\":\"12edd7bf\",\"1477\":\"527d26a7\",\"1513\":\"625257ff\",\"1628\":\"3ba65068\",\"1690\":\"ce52502c\",\"1790\":\"9ab5c710\",\"1965\":\"5e7a8869\",\"2091\":\"620149c0\",\"2312\":\"57007c5d\",\"2359\":\"e6f938c0\",\"2404\":\"ac07a635\",\"2522\":\"11534f15\",\"2943\":\"d060a5b6\",\"2967\":\"4dadffd8\",\"3024\":\"1238bedf\",\"3031\":\"26cc613d\",\"3082\":\"daa3adb0\",\"3162\":\"1cbd38ba\",\"3397\":\"eb224022\",\"3421\":\"7200a7c2\",\"3512\":\"63985e49\",\"3674\":\"f714592b\",\"3682\":\"9d5249aa\",\"3721\":\"4acbd8a6\",\"3808\":\"3eb61db5\",\"3885\":\"d1571242\",\"4000\":\"8244d32f\",\"4680\":\"ccd9416a\",\"4977\":\"1c001f8f\",\"5089\":\"3f388b69\",\"5130\":\"7aac00e4\",\"5330\":\"23132fd7\",\"5395\":\"1c970eb9\",\"5877\":\"b19083bb\",\"6039\":\"e42294a9\",\"6071\":\"44e30eb6\",\"6239\":\"69ca7b15\",\"6265\":\"109c1813\",\"6375\":\"fa3d50f5\",\"6740\":\"7ccae227\",\"6745\":\"0571630d\",\"6768\":\"556f78f7\",\"6844\":\"4317c31e\",\"7357\":\"5ff26b8b\",\"7368\":\"d6adff97\",\"7429\":\"df41c14c\",\"7759\":\"dd76ef9d\",\"7920\":\"bad08d18\",\"8081\":\"a51c1562\",\"8124\":\"bd3e5a53\",\"8340\":\"04481743\",\"8534\":\"548c15f5\",\"8750\":\"967d0340\",\"8759\":\"6e3ccf8e\",\"8968\":\"14799891\",\"9511\":\"f119a6e7\",\"9551\":\"72c16276\",\"9828\":\"98ffbbad\",\"9954\":\"b699481f\"}[chunkId] + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = function(chunkId) {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.hmd = function(module) {\n\tmodule = Object.create(module);\n\tif (!module.children) module.children = [];\n\tObject.defineProperty(module, 'exports', {\n\t\tenumerable: true,\n\t\tset: function() {\n\t\t\tthrow new Error('ES Modules may not assign module.exports or exports.*, Use ESM export syntax, instead: ' + module.id);\n\t\t}\n\t});\n\treturn module;\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","var inProgress = {};\nvar dataWebpackPrefix = \"excalidraw:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function(url, done, key, chunkId) {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function(prev, event) {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach(function(fn) { return fn(event); });\n\t\tif(prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = function(exports) {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"./\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t179: 0\n};\n\n__webpack_require__.f.j = function(chunkId, promises) {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise(function(resolve, reject) { installedChunkData = installedChunks[chunkId] = [resolve, reject]; });\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = function(event) {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t} else installedChunks[chunkId] = 0;\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = function(parentChunkLoadingFunction, data) {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some(function(id) { return installedChunks[id] !== 0; })) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkexcalidraw\"] = self[\"webpackChunkexcalidraw\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","const polyfill = () => {\n  if (!Array.prototype.at) {\n    // Taken from https://github.com/tc39/proposal-relative-indexing-method#polyfill so that it works in tests\n    /* eslint-disable */\n    Object.defineProperty(Array.prototype, \"at\", {\n      value: function (n: number) {\n        // ToInteger() abstract op\n        n = Math.trunc(n) || 0;\n        // Allow negative indexing from the end\n        if (n < 0) {\n          n += this.length;\n        }\n        // OOB access is guaranteed to return undefined\n        if (n < 0 || n >= this.length) {\n          return undefined;\n        }\n        // Otherwise, this is just normal property access\n        return this[n];\n      },\n      writable: true,\n      enumerable: false,\n      configurable: true,\n    });\n  }\n};\nexport default polyfill;\n","import _classCallCheck from '@babel/runtime/helpers/esm/classCallCheck';\nimport _createClass from '@babel/runtime/helpers/esm/createClass';\n\nvar arr = [];\nvar each = arr.forEach;\nvar slice = arr.slice;\nfunction defaults(obj) {\n  each.call(slice.call(arguments, 1), function (source) {\n    if (source) {\n      for (var prop in source) {\n        if (obj[prop] === undefined) obj[prop] = source[prop];\n      }\n    }\n  });\n  return obj;\n}\n\n// eslint-disable-next-line no-control-regex\nvar fieldContentRegExp = /^[\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+$/;\n\nvar serializeCookie = function serializeCookie(name, val, options) {\n  var opt = options || {};\n  opt.path = opt.path || '/';\n  var value = encodeURIComponent(val);\n  var str = name + '=' + value;\n\n  if (opt.maxAge > 0) {\n    var maxAge = opt.maxAge - 0;\n    if (isNaN(maxAge)) throw new Error('maxAge should be a Number');\n    str += '; Max-Age=' + Math.floor(maxAge);\n  }\n\n  if (opt.domain) {\n    if (!fieldContentRegExp.test(opt.domain)) {\n      throw new TypeError('option domain is invalid');\n    }\n\n    str += '; Domain=' + opt.domain;\n  }\n\n  if (opt.path) {\n    if (!fieldContentRegExp.test(opt.path)) {\n      throw new TypeError('option path is invalid');\n    }\n\n    str += '; Path=' + opt.path;\n  }\n\n  if (opt.expires) {\n    if (typeof opt.expires.toUTCString !== 'function') {\n      throw new TypeError('option expires is invalid');\n    }\n\n    str += '; Expires=' + opt.expires.toUTCString();\n  }\n\n  if (opt.httpOnly) str += '; HttpOnly';\n  if (opt.secure) str += '; Secure';\n\n  if (opt.sameSite) {\n    var sameSite = typeof opt.sameSite === 'string' ? opt.sameSite.toLowerCase() : opt.sameSite;\n\n    switch (sameSite) {\n      case true:\n        str += '; SameSite=Strict';\n        break;\n\n      case 'lax':\n        str += '; SameSite=Lax';\n        break;\n\n      case 'strict':\n        str += '; SameSite=Strict';\n        break;\n\n      case 'none':\n        str += '; SameSite=None';\n        break;\n\n      default:\n        throw new TypeError('option sameSite is invalid');\n    }\n  }\n\n  return str;\n};\n\nvar cookie = {\n  create: function create(name, value, minutes, domain) {\n    var cookieOptions = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {\n      path: '/',\n      sameSite: 'strict'\n    };\n\n    if (minutes) {\n      cookieOptions.expires = new Date();\n      cookieOptions.expires.setTime(cookieOptions.expires.getTime() + minutes * 60 * 1000);\n    }\n\n    if (domain) cookieOptions.domain = domain;\n    document.cookie = serializeCookie(name, encodeURIComponent(value), cookieOptions);\n  },\n  read: function read(name) {\n    var nameEQ = name + '=';\n    var ca = document.cookie.split(';');\n\n    for (var i = 0; i < ca.length; i++) {\n      var c = ca[i];\n\n      while (c.charAt(0) === ' ') {\n        c = c.substring(1, c.length);\n      }\n\n      if (c.indexOf(nameEQ) === 0) return c.substring(nameEQ.length, c.length);\n    }\n\n    return null;\n  },\n  remove: function remove(name) {\n    this.create(name, '', -1);\n  }\n};\nvar cookie$1 = {\n  name: 'cookie',\n  lookup: function lookup(options) {\n    var found;\n\n    if (options.lookupCookie && typeof document !== 'undefined') {\n      var c = cookie.read(options.lookupCookie);\n      if (c) found = c;\n    }\n\n    return found;\n  },\n  cacheUserLanguage: function cacheUserLanguage(lng, options) {\n    if (options.lookupCookie && typeof document !== 'undefined') {\n      cookie.create(options.lookupCookie, lng, options.cookieMinutes, options.cookieDomain, options.cookieOptions);\n    }\n  }\n};\n\nvar querystring = {\n  name: 'querystring',\n  lookup: function lookup(options) {\n    var found;\n\n    if (typeof window !== 'undefined') {\n      var search = window.location.search;\n\n      if (!window.location.search && window.location.hash && window.location.hash.indexOf('?') > -1) {\n        search = window.location.hash.substring(window.location.hash.indexOf('?'));\n      }\n\n      var query = search.substring(1);\n      var params = query.split('&');\n\n      for (var i = 0; i < params.length; i++) {\n        var pos = params[i].indexOf('=');\n\n        if (pos > 0) {\n          var key = params[i].substring(0, pos);\n\n          if (key === options.lookupQuerystring) {\n            found = params[i].substring(pos + 1);\n          }\n        }\n      }\n    }\n\n    return found;\n  }\n};\n\nvar hasLocalStorageSupport = null;\n\nvar localStorageAvailable = function localStorageAvailable() {\n  if (hasLocalStorageSupport !== null) return hasLocalStorageSupport;\n\n  try {\n    hasLocalStorageSupport = window !== 'undefined' && window.localStorage !== null;\n    var testKey = 'i18next.translate.boo';\n    window.localStorage.setItem(testKey, 'foo');\n    window.localStorage.removeItem(testKey);\n  } catch (e) {\n    hasLocalStorageSupport = false;\n  }\n\n  return hasLocalStorageSupport;\n};\n\nvar localStorage = {\n  name: 'localStorage',\n  lookup: function lookup(options) {\n    var found;\n\n    if (options.lookupLocalStorage && localStorageAvailable()) {\n      var lng = window.localStorage.getItem(options.lookupLocalStorage);\n      if (lng) found = lng;\n    }\n\n    return found;\n  },\n  cacheUserLanguage: function cacheUserLanguage(lng, options) {\n    if (options.lookupLocalStorage && localStorageAvailable()) {\n      window.localStorage.setItem(options.lookupLocalStorage, lng);\n    }\n  }\n};\n\nvar hasSessionStorageSupport = null;\n\nvar sessionStorageAvailable = function sessionStorageAvailable() {\n  if (hasSessionStorageSupport !== null) return hasSessionStorageSupport;\n\n  try {\n    hasSessionStorageSupport = window !== 'undefined' && window.sessionStorage !== null;\n    var testKey = 'i18next.translate.boo';\n    window.sessionStorage.setItem(testKey, 'foo');\n    window.sessionStorage.removeItem(testKey);\n  } catch (e) {\n    hasSessionStorageSupport = false;\n  }\n\n  return hasSessionStorageSupport;\n};\n\nvar sessionStorage = {\n  name: 'sessionStorage',\n  lookup: function lookup(options) {\n    var found;\n\n    if (options.lookupSessionStorage && sessionStorageAvailable()) {\n      var lng = window.sessionStorage.getItem(options.lookupSessionStorage);\n      if (lng) found = lng;\n    }\n\n    return found;\n  },\n  cacheUserLanguage: function cacheUserLanguage(lng, options) {\n    if (options.lookupSessionStorage && sessionStorageAvailable()) {\n      window.sessionStorage.setItem(options.lookupSessionStorage, lng);\n    }\n  }\n};\n\nvar navigator$1 = {\n  name: 'navigator',\n  lookup: function lookup(options) {\n    var found = [];\n\n    if (typeof navigator !== 'undefined') {\n      if (navigator.languages) {\n        // chrome only; not an array, so can't use .push.apply instead of iterating\n        for (var i = 0; i < navigator.languages.length; i++) {\n          found.push(navigator.languages[i]);\n        }\n      }\n\n      if (navigator.userLanguage) {\n        found.push(navigator.userLanguage);\n      }\n\n      if (navigator.language) {\n        found.push(navigator.language);\n      }\n    }\n\n    return found.length > 0 ? found : undefined;\n  }\n};\n\nvar htmlTag = {\n  name: 'htmlTag',\n  lookup: function lookup(options) {\n    var found;\n    var htmlTag = options.htmlTag || (typeof document !== 'undefined' ? document.documentElement : null);\n\n    if (htmlTag && typeof htmlTag.getAttribute === 'function') {\n      found = htmlTag.getAttribute('lang');\n    }\n\n    return found;\n  }\n};\n\nvar path = {\n  name: 'path',\n  lookup: function lookup(options) {\n    var found;\n\n    if (typeof window !== 'undefined') {\n      var language = window.location.pathname.match(/\\/([a-zA-Z-]*)/g);\n\n      if (language instanceof Array) {\n        if (typeof options.lookupFromPathIndex === 'number') {\n          if (typeof language[options.lookupFromPathIndex] !== 'string') {\n            return undefined;\n          }\n\n          found = language[options.lookupFromPathIndex].replace('/', '');\n        } else {\n          found = language[0].replace('/', '');\n        }\n      }\n    }\n\n    return found;\n  }\n};\n\nvar subdomain = {\n  name: 'subdomain',\n  lookup: function lookup(options) {\n    var found;\n\n    if (typeof window !== 'undefined') {\n      var language = window.location.href.match(/(?:http[s]*\\:\\/\\/)*(.*?)\\.(?=[^\\/]*\\..{2,5})/gi);\n\n      if (language instanceof Array) {\n        if (typeof options.lookupFromSubdomainIndex === 'number') {\n          found = language[options.lookupFromSubdomainIndex].replace('http://', '').replace('https://', '').replace('.', '');\n        } else {\n          found = language[0].replace('http://', '').replace('https://', '').replace('.', '');\n        }\n      }\n    }\n\n    return found;\n  }\n};\n\nfunction getDefaults() {\n  return {\n    order: ['querystring', 'cookie', 'localStorage', 'sessionStorage', 'navigator', 'htmlTag'],\n    lookupQuerystring: 'lng',\n    lookupCookie: 'i18next',\n    lookupLocalStorage: 'i18nextLng',\n    lookupSessionStorage: 'i18nextLng',\n    // cache user language\n    caches: ['localStorage'],\n    excludeCacheFor: ['cimode'] //cookieMinutes: 10,\n    //cookieDomain: 'myDomain'\n\n  };\n}\n\nvar Browser = /*#__PURE__*/function () {\n  function Browser(services) {\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n    _classCallCheck(this, Browser);\n\n    this.type = 'languageDetector';\n    this.detectors = {};\n    this.init(services, options);\n  }\n\n  _createClass(Browser, [{\n    key: \"init\",\n    value: function init(services) {\n      var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n      var i18nOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n      this.services = services;\n      this.options = defaults(options, this.options || {}, getDefaults()); // backwards compatibility\n\n      if (this.options.lookupFromUrlIndex) this.options.lookupFromPathIndex = this.options.lookupFromUrlIndex;\n      this.i18nOptions = i18nOptions;\n      this.addDetector(cookie$1);\n      this.addDetector(querystring);\n      this.addDetector(localStorage);\n      this.addDetector(sessionStorage);\n      this.addDetector(navigator$1);\n      this.addDetector(htmlTag);\n      this.addDetector(path);\n      this.addDetector(subdomain);\n    }\n  }, {\n    key: \"addDetector\",\n    value: function addDetector(detector) {\n      this.detectors[detector.name] = detector;\n    }\n  }, {\n    key: \"detect\",\n    value: function detect(detectionOrder) {\n      var _this = this;\n\n      if (!detectionOrder) detectionOrder = this.options.order;\n      var detected = [];\n      detectionOrder.forEach(function (detectorName) {\n        if (_this.detectors[detectorName]) {\n          var lookup = _this.detectors[detectorName].lookup(_this.options);\n\n          if (lookup && typeof lookup === 'string') lookup = [lookup];\n          if (lookup) detected = detected.concat(lookup);\n        }\n      });\n      if (this.services.languageUtils.getBestMatchFromCodes) return detected; // new i18next v19.5.0\n\n      return detected.length > 0 ? detected[0] : null; // a little backward compatibility\n    }\n  }, {\n    key: \"cacheUserLanguage\",\n    value: function cacheUserLanguage(lng, caches) {\n      var _this2 = this;\n\n      if (!caches) caches = this.options.caches;\n      if (!caches) return;\n      if (this.options.excludeCacheFor && this.options.excludeCacheFor.indexOf(lng) > -1) return;\n      caches.forEach(function (cacheName) {\n        if (_this2.detectors[cacheName]) _this2.detectors[cacheName].cacheUserLanguage(lng, _this2.options);\n      });\n    }\n  }]);\n\n  return Browser;\n}();\n\nBrowser.type = 'languageDetector';\n\nexport { Browser as default };\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n    extendStatics = Object.setPrototypeOf ||\r\n        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n    return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n    extendStatics(d, b);\r\n    function __() { this.constructor = d; }\r\n    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n    __assign = Object.assign || function __assign(t) {\r\n        for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n            s = arguments[i];\r\n            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n        }\r\n        return t;\r\n    }\r\n    return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n    if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n    return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n    return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n    if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n    return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n    function verb(n) { return function (v) { return step([n, v]); }; }\r\n    function step(op) {\r\n        if (f) throw new TypeError(\"Generator is already executing.\");\r\n        while (_) try {\r\n            if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n            if (y = 0, t) op = [op[0] & 2, t.value];\r\n            switch (op[0]) {\r\n                case 0: case 1: t = op; break;\r\n                case 4: _.label++; return { value: op[1], done: false };\r\n                case 5: _.label++; y = op[1]; op = [0]; continue;\r\n                case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n                default:\r\n                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n                    if (t[2]) _.ops.pop();\r\n                    _.trys.pop(); continue;\r\n            }\r\n            op = body.call(thisArg, _);\r\n        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n    }\r\n}\r\n\r\nexport function __createBinding(o, m, k, k2) {\r\n    if (k2 === undefined) k2 = k;\r\n    o[k2] = m[k];\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n    for (var p in m) if (p !== \"default\" && !exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n    var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n    if (m) return m.call(o);\r\n    if (o && typeof o.length === \"number\") return {\r\n        next: function () {\r\n            if (o && i >= o.length) o = void 0;\r\n            return { value: o && o[i++], done: !o };\r\n        }\r\n    };\r\n    throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n    var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n    if (!m) return o;\r\n    var i = m.call(o), r, ar = [], e;\r\n    try {\r\n        while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n    }\r\n    catch (error) { e = { error: error }; }\r\n    finally {\r\n        try {\r\n            if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n        }\r\n        finally { if (e) throw e.error; }\r\n    }\r\n    return ar;\r\n}\r\n\r\nexport function __spread() {\r\n    for (var ar = [], i = 0; i < arguments.length; i++)\r\n        ar = ar.concat(__read(arguments[i]));\r\n    return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n    for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n    for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n        for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n            r[k] = a[j];\r\n    return r;\r\n};\r\n\r\nexport function __await(v) {\r\n    return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n    return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n    function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n    function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n    function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n    function fulfill(value) { resume(\"next\", value); }\r\n    function reject(value) { resume(\"throw\", value); }\r\n    function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n    var i, p;\r\n    return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n    function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n    if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n    var m = o[Symbol.asyncIterator], i;\r\n    return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n    function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n    function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n    if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n    return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n    if (mod && mod.__esModule) return mod;\r\n    var result = {};\r\n    if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n    result.default = mod;\r\n    return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n    return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to get private field on non-instance\");\r\n    }\r\n    return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n    if (!privateMap.has(receiver)) {\r\n        throw new TypeError(\"attempted to set private field on non-instance\");\r\n    }\r\n    privateMap.set(receiver, value);\r\n    return value;\r\n}\r\n","import { User } from './user';\n\n/**\n * @inheritdoc\n */\nexport interface Session extends SessionContext {\n  /** JSDoc */\n  update(context?: SessionContext): void;\n\n  /** JSDoc */\n  close(status?: SessionStatus): void;\n\n  /** JSDoc */\n  toJSON(): {\n    init: boolean;\n    sid: string;\n    did?: string;\n    timestamp: string;\n    started: string;\n    duration: number;\n    status: SessionStatus;\n    errors: number;\n    attrs?: {\n      release?: string;\n      environment?: string;\n      user_agent?: string;\n      ip_address?: string;\n    };\n  };\n}\n\n/**\n * Session Context\n */\nexport interface SessionContext {\n  sid?: string;\n  did?: string;\n  init?: boolean;\n  timestamp?: number;\n  started?: number;\n  duration?: number;\n  status?: SessionStatus;\n  release?: string;\n  environment?: string;\n  userAgent?: string;\n  ipAddress?: string;\n  errors?: number;\n  user?: User | null;\n}\n\n/**\n * Session Status\n */\nexport enum SessionStatus {\n  /** JSDoc */\n  Ok = 'ok',\n  /** JSDoc */\n  Exited = 'exited',\n  /** JSDoc */\n  Crashed = 'crashed',\n  /** JSDoc */\n  Abnormal = 'abnormal',\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { consoleSandbox, getGlobalObject } from './misc';\n\n// TODO: Implement different loggers for different environments\nconst global = getGlobalObject<Window | NodeJS.Global>();\n\n/** Prefix for logging strings */\nconst PREFIX = 'Sentry Logger ';\n\n/** JSDoc */\nclass Logger {\n  /** JSDoc */\n  private _enabled: boolean;\n\n  /** JSDoc */\n  public constructor() {\n    this._enabled = false;\n  }\n\n  /** JSDoc */\n  public disable(): void {\n    this._enabled = false;\n  }\n\n  /** JSDoc */\n  public enable(): void {\n    this._enabled = true;\n  }\n\n  /** JSDoc */\n  public log(...args: any[]): void {\n    if (!this._enabled) {\n      return;\n    }\n    consoleSandbox(() => {\n      global.console.log(`${PREFIX}[Log]: ${args.join(' ')}`);\n    });\n  }\n\n  /** JSDoc */\n  public warn(...args: any[]): void {\n    if (!this._enabled) {\n      return;\n    }\n    consoleSandbox(() => {\n      global.console.warn(`${PREFIX}[Warn]: ${args.join(' ')}`);\n    });\n  }\n\n  /** JSDoc */\n  public error(...args: any[]): void {\n    if (!this._enabled) {\n      return;\n    }\n    consoleSandbox(() => {\n      global.console.error(`${PREFIX}[Error]: ${args.join(' ')}`);\n    });\n  }\n}\n\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nconst logger = (global.__SENTRY__.logger as Logger) || (global.__SENTRY__.logger = new Logger());\n\nexport { logger };\n","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/typedef */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n\n/** SyncPromise internal states */\nenum States {\n  /** Pending */\n  PENDING = 'PENDING',\n  /** Resolved / OK */\n  RESOLVED = 'RESOLVED',\n  /** Rejected / Error */\n  REJECTED = 'REJECTED',\n}\n\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nclass SyncPromise<T> implements PromiseLike<T> {\n  private _state: States = States.PENDING;\n  private _handlers: Array<{\n    done: boolean;\n    onfulfilled?: ((value: T) => T | PromiseLike<T>) | null;\n    onrejected?: ((reason: any) => any) | null;\n  }> = [];\n  private _value: any;\n\n  public constructor(\n    executor: (resolve: (value?: T | PromiseLike<T> | null) => void, reject: (reason?: any) => void) => void,\n  ) {\n    try {\n      executor(this._resolve, this._reject);\n    } catch (e) {\n      this._reject(e);\n    }\n  }\n\n  /** JSDoc */\n  public static resolve<T>(value: T | PromiseLike<T>): PromiseLike<T> {\n    return new SyncPromise(resolve => {\n      resolve(value);\n    });\n  }\n\n  /** JSDoc */\n  public static reject<T = never>(reason?: any): PromiseLike<T> {\n    return new SyncPromise((_, reject) => {\n      reject(reason);\n    });\n  }\n\n  /** JSDoc */\n  public static all<U = any>(collection: Array<U | PromiseLike<U>>): PromiseLike<U[]> {\n    return new SyncPromise<U[]>((resolve, reject) => {\n      if (!Array.isArray(collection)) {\n        reject(new TypeError(`Promise.all requires an array as input.`));\n        return;\n      }\n\n      if (collection.length === 0) {\n        resolve([]);\n        return;\n      }\n\n      let counter = collection.length;\n      const resolvedCollection: U[] = [];\n\n      collection.forEach((item, index) => {\n        SyncPromise.resolve(item)\n          .then(value => {\n            resolvedCollection[index] = value;\n            counter -= 1;\n\n            if (counter !== 0) {\n              return;\n            }\n            resolve(resolvedCollection);\n          })\n          .then(null, reject);\n      });\n    });\n  }\n\n  /** JSDoc */\n  public then<TResult1 = T, TResult2 = never>(\n    onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,\n    onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n  ): PromiseLike<TResult1 | TResult2> {\n    return new SyncPromise((resolve, reject) => {\n      this._attachHandler({\n        done: false,\n        onfulfilled: result => {\n          if (!onfulfilled) {\n            // TODO: ¯\\_(ツ)_/¯\n            // TODO: FIXME\n            resolve(result as any);\n            return;\n          }\n          try {\n            resolve(onfulfilled(result));\n            return;\n          } catch (e) {\n            reject(e);\n            return;\n          }\n        },\n        onrejected: reason => {\n          if (!onrejected) {\n            reject(reason);\n            return;\n          }\n          try {\n            resolve(onrejected(reason));\n            return;\n          } catch (e) {\n            reject(e);\n            return;\n          }\n        },\n      });\n    });\n  }\n\n  /** JSDoc */\n  public catch<TResult = never>(\n    onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n  ): PromiseLike<T | TResult> {\n    return this.then(val => val, onrejected);\n  }\n\n  /** JSDoc */\n  public finally<TResult>(onfinally?: (() => void) | null): PromiseLike<TResult> {\n    return new SyncPromise<TResult>((resolve, reject) => {\n      let val: TResult | any;\n      let isRejected: boolean;\n\n      return this.then(\n        value => {\n          isRejected = false;\n          val = value;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n        reason => {\n          isRejected = true;\n          val = reason;\n          if (onfinally) {\n            onfinally();\n          }\n        },\n      ).then(() => {\n        if (isRejected) {\n          reject(val);\n          return;\n        }\n\n        resolve((val as unknown) as any);\n      });\n    });\n  }\n\n  /** JSDoc */\n  public toString(): string {\n    return '[object SyncPromise]';\n  }\n\n  /** JSDoc */\n  private readonly _resolve = (value?: T | PromiseLike<T> | null) => {\n    this._setResult(States.RESOLVED, value);\n  };\n\n  /** JSDoc */\n  private readonly _reject = (reason?: any) => {\n    this._setResult(States.REJECTED, reason);\n  };\n\n  /** JSDoc */\n  private readonly _setResult = (state: States, value?: T | PromiseLike<T> | any) => {\n    if (this._state !== States.PENDING) {\n      return;\n    }\n\n    if (isThenable(value)) {\n      (value as PromiseLike<T>).then(this._resolve, this._reject);\n      return;\n    }\n\n    this._state = state;\n    this._value = value;\n\n    this._executeHandlers();\n  };\n\n  // TODO: FIXME\n  /** JSDoc */\n  private readonly _attachHandler = (handler: {\n    /** JSDoc */\n    done: boolean;\n    /** JSDoc */\n    onfulfilled?(value: T): any;\n    /** JSDoc */\n    onrejected?(reason: any): any;\n  }) => {\n    this._handlers = this._handlers.concat(handler);\n    this._executeHandlers();\n  };\n\n  /** JSDoc */\n  private readonly _executeHandlers = () => {\n    if (this._state === States.PENDING) {\n      return;\n    }\n\n    const cachedHandlers = this._handlers.slice();\n    this._handlers = [];\n\n    cachedHandlers.forEach(handler => {\n      if (handler.done) {\n        return;\n      }\n\n      if (this._state === States.RESOLVED) {\n        if (handler.onfulfilled) {\n          // eslint-disable-next-line @typescript-eslint/no-floating-promises\n          handler.onfulfilled((this._value as unknown) as any);\n        }\n      }\n\n      if (this._state === States.REJECTED) {\n        if (handler.onrejected) {\n          handler.onrejected(this._value);\n        }\n      }\n\n      handler.done = true;\n    });\n  };\n}\n\nexport { SyncPromise };\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\nimport { Primitive } from '@sentry/types';\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat: any): boolean {\n  switch (Object.prototype.toString.call(wat)) {\n    case '[object Error]':\n      return true;\n    case '[object Exception]':\n      return true;\n    case '[object DOMException]':\n      return true;\n    default:\n      return isInstanceOf(wat, Error);\n  }\n}\n\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat: any): boolean {\n  return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n}\n\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat: any): boolean {\n  return Object.prototype.toString.call(wat) === '[object DOMError]';\n}\n\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat: any): boolean {\n  return Object.prototype.toString.call(wat) === '[object DOMException]';\n}\n\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat: any): boolean {\n  return Object.prototype.toString.call(wat) === '[object String]';\n}\n\n/**\n * Checks whether given value's is a primitive (undefined, null, number, boolean, string, bigint, symbol)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat: any): wat is Primitive {\n  return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat: any): boolean {\n  return Object.prototype.toString.call(wat) === '[object Object]';\n}\n\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat: any): boolean {\n  return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat: any): boolean {\n  return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat: any): boolean {\n  return Object.prototype.toString.call(wat) === '[object RegExp]';\n}\n\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat: any): boolean {\n  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n  return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat: any): boolean {\n  return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat: any, base: any): boolean {\n  try {\n    return wat instanceof base;\n  } catch (_e) {\n    return false;\n  }\n}\n","/* eslint-disable max-lines */\nimport {\n  Breadcrumb,\n  CaptureContext,\n  Context,\n  Contexts,\n  Event,\n  EventHint,\n  EventProcessor,\n  Extra,\n  Extras,\n  Primitive,\n  Scope as ScopeInterface,\n  ScopeContext,\n  Severity,\n  Span,\n  Transaction,\n  User,\n} from '@sentry/types';\nimport { dateTimestampInSeconds, getGlobalObject, isPlainObject, isThenable, SyncPromise } from '@sentry/utils';\n\nimport { Session } from './session';\n\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nexport class Scope implements ScopeInterface {\n  /** Flag if notifiying is happening. */\n  protected _notifyingListeners: boolean = false;\n\n  /** Callback for client to receive scope changes. */\n  protected _scopeListeners: Array<(scope: Scope) => void> = [];\n\n  /** Callback list that will be called after {@link applyToEvent}. */\n  protected _eventProcessors: EventProcessor[] = [];\n\n  /** Array of breadcrumbs. */\n  protected _breadcrumbs: Breadcrumb[] = [];\n\n  /** User */\n  protected _user: User = {};\n\n  /** Tags */\n  protected _tags: { [key: string]: Primitive } = {};\n\n  /** Extra */\n  protected _extra: Extras = {};\n\n  /** Contexts */\n  protected _contexts: Contexts = {};\n\n  /** Fingerprint */\n  protected _fingerprint?: string[];\n\n  /** Severity */\n  protected _level?: Severity;\n\n  /** Transaction Name */\n  protected _transactionName?: string;\n\n  /** Span */\n  protected _span?: Span;\n\n  /** Session */\n  protected _session?: Session;\n\n  /**\n   * Inherit values from the parent scope.\n   * @param scope to clone.\n   */\n  public static clone(scope?: Scope): Scope {\n    const newScope = new Scope();\n    if (scope) {\n      newScope._breadcrumbs = [...scope._breadcrumbs];\n      newScope._tags = { ...scope._tags };\n      newScope._extra = { ...scope._extra };\n      newScope._contexts = { ...scope._contexts };\n      newScope._user = scope._user;\n      newScope._level = scope._level;\n      newScope._span = scope._span;\n      newScope._session = scope._session;\n      newScope._transactionName = scope._transactionName;\n      newScope._fingerprint = scope._fingerprint;\n      newScope._eventProcessors = [...scope._eventProcessors];\n    }\n    return newScope;\n  }\n\n  /**\n   * Add internal on change listener. Used for sub SDKs that need to store the scope.\n   * @hidden\n   */\n  public addScopeListener(callback: (scope: Scope) => void): void {\n    this._scopeListeners.push(callback);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addEventProcessor(callback: EventProcessor): this {\n    this._eventProcessors.push(callback);\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setUser(user: User | null): this {\n    this._user = user || {};\n    if (this._session) {\n      this._session.update({ user });\n    }\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getUser(): User | undefined {\n    return this._user;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTags(tags: { [key: string]: Primitive }): this {\n    this._tags = {\n      ...this._tags,\n      ...tags,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTag(key: string, value: Primitive): this {\n    this._tags = { ...this._tags, [key]: value };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setExtras(extras: Extras): this {\n    this._extra = {\n      ...this._extra,\n      ...extras,\n    };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setExtra(key: string, extra: Extra): this {\n    this._extra = { ...this._extra, [key]: extra };\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setFingerprint(fingerprint: string[]): this {\n    this._fingerprint = fingerprint;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setLevel(level: Severity): this {\n    this._level = level;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTransactionName(name?: string): this {\n    this._transactionName = name;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Can be removed in major version.\n   * @deprecated in favor of {@link this.setTransactionName}\n   */\n  public setTransaction(name?: string): this {\n    return this.setTransactionName(name);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setContext(key: string, context: Context | null): this {\n    if (context === null) {\n      // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n      delete this._contexts[key];\n    } else {\n      this._contexts = { ...this._contexts, [key]: context };\n    }\n\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setSpan(span?: Span): this {\n    this._span = span;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getSpan(): Span | undefined {\n    return this._span;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getTransaction(): Transaction | undefined {\n    // often, this span will be a transaction, but it's not guaranteed to be\n    const span = this.getSpan() as undefined | (Span & { spanRecorder: { spans: Span[] } });\n\n    // try it the new way first\n    if (span?.transaction) {\n      return span?.transaction;\n    }\n\n    // fallback to the old way (known bug: this only finds transactions with sampled = true)\n    if (span?.spanRecorder?.spans[0]) {\n      return span.spanRecorder.spans[0] as Transaction;\n    }\n\n    // neither way found a transaction\n    return undefined;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setSession(session?: Session): this {\n    if (!session) {\n      delete this._session;\n    } else {\n      this._session = session;\n    }\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getSession(): Session | undefined {\n    return this._session;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public update(captureContext?: CaptureContext): this {\n    if (!captureContext) {\n      return this;\n    }\n\n    if (typeof captureContext === 'function') {\n      const updatedScope = (captureContext as <T>(scope: T) => T)(this);\n      return updatedScope instanceof Scope ? updatedScope : this;\n    }\n\n    if (captureContext instanceof Scope) {\n      this._tags = { ...this._tags, ...captureContext._tags };\n      this._extra = { ...this._extra, ...captureContext._extra };\n      this._contexts = { ...this._contexts, ...captureContext._contexts };\n      if (captureContext._user && Object.keys(captureContext._user).length) {\n        this._user = captureContext._user;\n      }\n      if (captureContext._level) {\n        this._level = captureContext._level;\n      }\n      if (captureContext._fingerprint) {\n        this._fingerprint = captureContext._fingerprint;\n      }\n    } else if (isPlainObject(captureContext)) {\n      // eslint-disable-next-line no-param-reassign\n      captureContext = captureContext as ScopeContext;\n      this._tags = { ...this._tags, ...captureContext.tags };\n      this._extra = { ...this._extra, ...captureContext.extra };\n      this._contexts = { ...this._contexts, ...captureContext.contexts };\n      if (captureContext.user) {\n        this._user = captureContext.user;\n      }\n      if (captureContext.level) {\n        this._level = captureContext.level;\n      }\n      if (captureContext.fingerprint) {\n        this._fingerprint = captureContext.fingerprint;\n      }\n    }\n\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public clear(): this {\n    this._breadcrumbs = [];\n    this._tags = {};\n    this._extra = {};\n    this._user = {};\n    this._contexts = {};\n    this._level = undefined;\n    this._transactionName = undefined;\n    this._fingerprint = undefined;\n    this._span = undefined;\n    this._session = undefined;\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addBreadcrumb(breadcrumb: Breadcrumb, maxBreadcrumbs?: number): this {\n    const mergedBreadcrumb = {\n      timestamp: dateTimestampInSeconds(),\n      ...breadcrumb,\n    };\n\n    this._breadcrumbs =\n      maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0\n        ? [...this._breadcrumbs, mergedBreadcrumb].slice(-maxBreadcrumbs)\n        : [...this._breadcrumbs, mergedBreadcrumb];\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public clearBreadcrumbs(): this {\n    this._breadcrumbs = [];\n    this._notifyScopeListeners();\n    return this;\n  }\n\n  /**\n   * Applies the current context and fingerprint to the event.\n   * Note that breadcrumbs will be added by the client.\n   * Also if the event has already breadcrumbs on it, we do not merge them.\n   * @param event Event\n   * @param hint May contain additional informartion about the original exception.\n   * @hidden\n   */\n  public applyToEvent(event: Event, hint?: EventHint): PromiseLike<Event | null> {\n    if (this._extra && Object.keys(this._extra).length) {\n      event.extra = { ...this._extra, ...event.extra };\n    }\n    if (this._tags && Object.keys(this._tags).length) {\n      event.tags = { ...this._tags, ...event.tags };\n    }\n    if (this._user && Object.keys(this._user).length) {\n      event.user = { ...this._user, ...event.user };\n    }\n    if (this._contexts && Object.keys(this._contexts).length) {\n      event.contexts = { ...this._contexts, ...event.contexts };\n    }\n    if (this._level) {\n      event.level = this._level;\n    }\n    if (this._transactionName) {\n      event.transaction = this._transactionName;\n    }\n    // We want to set the trace context for normal events only if there isn't already\n    // a trace context on the event. There is a product feature in place where we link\n    // errors with transaction and it relys on that.\n    if (this._span) {\n      event.contexts = { trace: this._span.getTraceContext(), ...event.contexts };\n      const transactionName = this._span.transaction?.name;\n      if (transactionName) {\n        event.tags = { transaction: transactionName, ...event.tags };\n      }\n    }\n\n    this._applyFingerprint(event);\n\n    event.breadcrumbs = [...(event.breadcrumbs || []), ...this._breadcrumbs];\n    event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n\n    return this._notifyEventProcessors([...getGlobalEventProcessors(), ...this._eventProcessors], event, hint);\n  }\n\n  /**\n   * This will be called after {@link applyToEvent} is finished.\n   */\n  protected _notifyEventProcessors(\n    processors: EventProcessor[],\n    event: Event | null,\n    hint?: EventHint,\n    index: number = 0,\n  ): PromiseLike<Event | null> {\n    return new SyncPromise<Event | null>((resolve, reject) => {\n      const processor = processors[index];\n      if (event === null || typeof processor !== 'function') {\n        resolve(event);\n      } else {\n        const result = processor({ ...event }, hint) as Event | null;\n        if (isThenable(result)) {\n          (result as PromiseLike<Event | null>)\n            .then(final => this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve))\n            .then(null, reject);\n        } else {\n          this._notifyEventProcessors(processors, result, hint, index + 1)\n            .then(resolve)\n            .then(null, reject);\n        }\n      }\n    });\n  }\n\n  /**\n   * This will be called on every set call.\n   */\n  protected _notifyScopeListeners(): void {\n    // We need this check for this._notifyingListeners to be able to work on scope during updates\n    // If this check is not here we'll produce endless recursion when something is done with the scope\n    // during the callback.\n    if (!this._notifyingListeners) {\n      this._notifyingListeners = true;\n      this._scopeListeners.forEach(callback => {\n        callback(this);\n      });\n      this._notifyingListeners = false;\n    }\n  }\n\n  /**\n   * Applies fingerprint from the scope to the event if there's one,\n   * uses message if there's one instead or get rid of empty fingerprint\n   */\n  private _applyFingerprint(event: Event): void {\n    // Make sure it's an array first and we actually have something in place\n    event.fingerprint = event.fingerprint\n      ? Array.isArray(event.fingerprint)\n        ? event.fingerprint\n        : [event.fingerprint]\n      : [];\n\n    // If we have something on the scope, then merge it with event\n    if (this._fingerprint) {\n      event.fingerprint = event.fingerprint.concat(this._fingerprint);\n    }\n\n    // If we have no data at all, remove empty array default\n    if (event.fingerprint && !event.fingerprint.length) {\n      delete event.fingerprint;\n    }\n  }\n}\n\n/**\n * Retruns the global event processors.\n */\nfunction getGlobalEventProcessors(): EventProcessor[] {\n  /* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access  */\n  const global = getGlobalObject<any>();\n  global.__SENTRY__ = global.__SENTRY__ || {};\n  global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n  return global.__SENTRY__.globalEventProcessors;\n  /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access */\n}\n\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback: EventProcessor): void {\n  getGlobalEventProcessors().push(callback);\n}\n","import { isString } from './is';\n\n/**\n * Given a child DOM element, returns a query-selector statement describing that\n * and its ancestors\n * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem: unknown): string {\n  type SimpleNode = {\n    parentNode: SimpleNode;\n  } | null;\n\n  // try/catch both:\n  // - accessing event.target (see getsentry/raven-js#838, #768)\n  // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n  // - can throw an exception in some circumstances.\n  try {\n    let currentElem = elem as SimpleNode;\n    const MAX_TRAVERSE_HEIGHT = 5;\n    const MAX_OUTPUT_LEN = 80;\n    const out = [];\n    let height = 0;\n    let len = 0;\n    const separator = ' > ';\n    const sepLength = separator.length;\n    let nextStr;\n\n    // eslint-disable-next-line no-plusplus\n    while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n      nextStr = _htmlElementAsString(currentElem);\n      // bail out if\n      // - nextStr is the 'html' element\n      // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n      //   (ignore this limit if we are on the first iteration)\n      if (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n        break;\n      }\n\n      out.push(nextStr);\n\n      len += nextStr.length;\n      currentElem = currentElem.parentNode;\n    }\n\n    return out.reverse().join(separator);\n  } catch (_oO) {\n    return '<unknown>';\n  }\n}\n\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el: unknown): string {\n  const elem = el as {\n    tagName?: string;\n    id?: string;\n    className?: string;\n    getAttribute(key: string): string;\n  };\n\n  const out = [];\n  let className;\n  let classes;\n  let key;\n  let attr;\n  let i;\n\n  if (!elem || !elem.tagName) {\n    return '';\n  }\n\n  out.push(elem.tagName.toLowerCase());\n  if (elem.id) {\n    out.push(`#${elem.id}`);\n  }\n\n  // eslint-disable-next-line prefer-const\n  className = elem.className;\n  if (className && isString(className)) {\n    classes = className.split(/\\s+/);\n    for (i = 0; i < classes.length; i++) {\n      out.push(`.${classes[i]}`);\n    }\n  }\n  const allowedAttrs = ['type', 'name', 'title', 'alt'];\n  for (i = 0; i < allowedAttrs.length; i++) {\n    key = allowedAttrs[i];\n    attr = elem.getAttribute(key);\n    if (attr) {\n      out.push(`[${key}=\"${attr}\"]`);\n    }\n  }\n  return out.join('');\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nexport class Memo {\n  /** Determines if WeakSet is available */\n  private readonly _hasWeakSet: boolean;\n  /** Either WeakSet or Array */\n  private readonly _inner: any;\n\n  public constructor() {\n    this._hasWeakSet = typeof WeakSet === 'function';\n    this._inner = this._hasWeakSet ? new WeakSet() : [];\n  }\n\n  /**\n   * Sets obj to remember.\n   * @param obj Object to remember\n   */\n  public memoize(obj: any): boolean {\n    if (this._hasWeakSet) {\n      if (this._inner.has(obj)) {\n        return true;\n      }\n      this._inner.add(obj);\n      return false;\n    }\n    // eslint-disable-next-line @typescript-eslint/prefer-for-of\n    for (let i = 0; i < this._inner.length; i++) {\n      const value = this._inner[i];\n      if (value === obj) {\n        return true;\n      }\n    }\n    this._inner.push(obj);\n    return false;\n  }\n\n  /**\n   * Removes object from internal storage.\n   * @param obj Object to forget\n   */\n  public unmemoize(obj: any): void {\n    if (this._hasWeakSet) {\n      this._inner.delete(obj);\n    } else {\n      for (let i = 0; i < this._inner.length; i++) {\n        if (this._inner[i] === obj) {\n          this._inner.splice(i, 1);\n          break;\n        }\n      }\n    }\n  }\n}\n","const defaultFunctionName = '<anonymous>';\n\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn: unknown): string {\n  try {\n    if (!fn || typeof fn !== 'function') {\n      return defaultFunctionName;\n    }\n    return fn.name || defaultFunctionName;\n  } catch (e) {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    return defaultFunctionName;\n  }\n}\n","import { isRegExp, isString } from './is';\n\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string (0 = unlimited)\n * @returns string Encoded\n */\nexport function truncate(str: string, max: number = 0): string {\n  if (typeof str !== 'string' || max === 0) {\n    return str;\n  }\n  return str.length <= max ? str : `${str.substr(0, max)}...`;\n}\n\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line: string, colno: number): string {\n  let newLine = line;\n  const ll = newLine.length;\n  if (ll <= 150) {\n    return newLine;\n  }\n  if (colno > ll) {\n    // eslint-disable-next-line no-param-reassign\n    colno = ll;\n  }\n\n  let start = Math.max(colno - 60, 0);\n  if (start < 5) {\n    start = 0;\n  }\n\n  let end = Math.min(start + 140, ll);\n  if (end > ll - 5) {\n    end = ll;\n  }\n  if (end === ll) {\n    start = Math.max(end - 140, 0);\n  }\n\n  newLine = newLine.slice(start, end);\n  if (start > 0) {\n    newLine = `'{snip} ${newLine}`;\n  }\n  if (end < ll) {\n    newLine += ' {snip}';\n  }\n\n  return newLine;\n}\n\n/**\n * Join values in array\n * @param input array of values to be joined together\n * @param delimiter string to be placed in-between values\n * @returns Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function safeJoin(input: any[], delimiter?: string): string {\n  if (!Array.isArray(input)) {\n    return '';\n  }\n\n  const output = [];\n  // eslint-disable-next-line @typescript-eslint/prefer-for-of\n  for (let i = 0; i < input.length; i++) {\n    const value = input[i];\n    try {\n      output.push(String(value));\n    } catch (e) {\n      output.push('[value cannot be serialized]');\n    }\n  }\n\n  return output.join(delimiter);\n}\n\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value: string, pattern: RegExp | string): boolean {\n  if (!isString(value)) {\n    return false;\n  }\n\n  if (isRegExp(pattern)) {\n    return (pattern as RegExp).test(value);\n  }\n  if (typeof pattern === 'string') {\n    return value.indexOf(pattern) !== -1;\n  }\n  return false;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ExtendedError, WrappedFunction } from '@sentry/types';\n\nimport { htmlTreeAsString } from './browser';\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive, isSyntheticEvent } from './is';\nimport { Memo } from './memo';\nimport { getFunctionName } from './stacktrace';\nimport { truncate } from './string';\n\n/**\n * Wrap a given object method with a higher-order function\n *\n * @param source An object that contains a method to be wrapped.\n * @param name A name of method to be wrapped.\n * @param replacementFactory A function that should be used to wrap a given method, returning the wrapped method which\n * will be substituted in for `source[name]`.\n * @returns void\n */\nexport function fill(source: { [key: string]: any }, name: string, replacementFactory: (...args: any[]) => any): void {\n  if (!(name in source)) {\n    return;\n  }\n\n  const original = source[name] as () => any;\n  const wrapped = replacementFactory(original) as WrappedFunction;\n\n  // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n  // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n  if (typeof wrapped === 'function') {\n    try {\n      wrapped.prototype = wrapped.prototype || {};\n      Object.defineProperties(wrapped, {\n        __sentry_original__: {\n          enumerable: false,\n          value: original,\n        },\n      });\n    } catch (_Oo) {\n      // This can throw if multiple fill happens on a global object like XMLHttpRequest\n      // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n    }\n  }\n\n  source[name] = wrapped;\n}\n\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object: { [key: string]: any }): string {\n  return Object.keys(object)\n    .map(key => `${encodeURIComponent(key)}=${encodeURIComponent(object[key])}`)\n    .join('&');\n}\n\n/**\n * Transforms any object into an object literal with all its attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order for it to be usable by the serializer\n */\nfunction getWalkSource(\n  value: any,\n): {\n  [key: string]: any;\n} {\n  if (isError(value)) {\n    const error = value as ExtendedError;\n    const err: {\n      [key: string]: any;\n      stack: string | undefined;\n      message: string;\n      name: string;\n    } = {\n      message: error.message,\n      name: error.name,\n      stack: error.stack,\n    };\n\n    for (const i in error) {\n      if (Object.prototype.hasOwnProperty.call(error, i)) {\n        err[i] = error[i];\n      }\n    }\n\n    return err;\n  }\n\n  if (isEvent(value)) {\n    /**\n     * Event-like interface that's usable in browser and node\n     */\n    interface SimpleEvent {\n      [key: string]: unknown;\n      type: string;\n      target?: unknown;\n      currentTarget?: unknown;\n    }\n\n    const event = value as SimpleEvent;\n\n    const source: {\n      [key: string]: any;\n    } = {};\n\n    source.type = event.type;\n\n    // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n    try {\n      source.target = isElement(event.target)\n        ? htmlTreeAsString(event.target)\n        : Object.prototype.toString.call(event.target);\n    } catch (_oO) {\n      source.target = '<unknown>';\n    }\n\n    try {\n      source.currentTarget = isElement(event.currentTarget)\n        ? htmlTreeAsString(event.currentTarget)\n        : Object.prototype.toString.call(event.currentTarget);\n    } catch (_oO) {\n      source.currentTarget = '<unknown>';\n    }\n\n    if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n      source.detail = event.detail;\n    }\n\n    for (const i in event) {\n      if (Object.prototype.hasOwnProperty.call(event, i)) {\n        source[i] = event;\n      }\n    }\n\n    return source;\n  }\n\n  return value as {\n    [key: string]: any;\n  };\n}\n\n/** Calculates bytes size of input string */\nfunction utf8Length(value: string): number {\n  // eslint-disable-next-line no-bitwise\n  return ~-encodeURI(value).split(/%..|./).length;\n}\n\n/** Calculates bytes size of input object */\nfunction jsonSize(value: any): number {\n  return utf8Length(JSON.stringify(value));\n}\n\n/** JSDoc */\nexport function normalizeToSize<T>(\n  object: { [key: string]: any },\n  // Default Node.js REPL depth\n  depth: number = 3,\n  // 100kB, as 200kB is max payload size, so half sounds reasonable\n  maxSize: number = 100 * 1024,\n): T {\n  const serialized = normalize(object, depth);\n\n  if (jsonSize(serialized) > maxSize) {\n    return normalizeToSize(object, depth - 1, maxSize);\n  }\n\n  return serialized as T;\n}\n\n/**\n * Transform any non-primitive, BigInt, or Symbol-type value into a string. Acts as a no-op on strings, numbers,\n * booleans, null, and undefined.\n *\n * @param value The value to stringify\n * @returns For non-primitive, BigInt, and Symbol-type values, a string denoting the value's type, type and value, or\n *  type and `description` property, respectively. For non-BigInt, non-Symbol primitives, returns the original value,\n *  unchanged.\n */\nfunction serializeValue(value: any): any {\n  const type = Object.prototype.toString.call(value);\n\n  // Node.js REPL notation\n  if (typeof value === 'string') {\n    return value;\n  }\n  if (type === '[object Object]') {\n    return '[Object]';\n  }\n  if (type === '[object Array]') {\n    return '[Array]';\n  }\n\n  const normalized = normalizeValue(value);\n  return isPrimitive(normalized) ? normalized : type;\n}\n\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\nfunction normalizeValue<T>(value: T, key?: any): T | string {\n  if (key === 'domain' && value && typeof value === 'object' && ((value as unknown) as { _events: any })._events) {\n    return '[Domain]';\n  }\n\n  if (key === 'domainEmitter') {\n    return '[DomainEmitter]';\n  }\n\n  if (typeof (global as any) !== 'undefined' && (value as unknown) === global) {\n    return '[Global]';\n  }\n\n  if (typeof (window as any) !== 'undefined' && (value as unknown) === window) {\n    return '[Window]';\n  }\n\n  if (typeof (document as any) !== 'undefined' && (value as unknown) === document) {\n    return '[Document]';\n  }\n\n  // React's SyntheticEvent thingy\n  if (isSyntheticEvent(value)) {\n    return '[SyntheticEvent]';\n  }\n\n  if (typeof value === 'number' && value !== value) {\n    return '[NaN]';\n  }\n\n  if (value === void 0) {\n    return '[undefined]';\n  }\n\n  if (typeof value === 'function') {\n    return `[Function: ${getFunctionName(value)}]`;\n  }\n\n  // symbols and bigints are considered primitives by TS, but aren't natively JSON-serilaizable\n\n  if (typeof value === 'symbol') {\n    return `[${String(value)}]`;\n  }\n\n  if (typeof value === 'bigint') {\n    return `[BigInt: ${String(value)}]`;\n  }\n\n  return value;\n}\n\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function walk(key: string, value: any, depth: number = +Infinity, memo: Memo = new Memo()): any {\n  // If we reach the maximum depth, serialize whatever has left\n  if (depth === 0) {\n    return serializeValue(value);\n  }\n\n  /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n  // If value implements `toJSON` method, call it and return early\n  if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n    return value.toJSON();\n  }\n  /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n  // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n  const normalized = normalizeValue(value, key);\n  if (isPrimitive(normalized)) {\n    return normalized;\n  }\n\n  // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n  const source = getWalkSource(value);\n\n  // Create an accumulator that will act as a parent for all future itterations of that branch\n  const acc = Array.isArray(value) ? [] : {};\n\n  // If we already walked that branch, bail out, as it's circular reference\n  if (memo.memoize(value)) {\n    return '[Circular ~]';\n  }\n\n  // Walk all keys of the source\n  for (const innerKey in source) {\n    // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n    if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n      continue;\n    }\n    // Recursively walk through all the child nodes\n    (acc as { [key: string]: any })[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n  }\n\n  // Once walked through all the branches, remove the parent from memo storage\n  memo.unmemoize(value);\n\n  // Return accumulated values\n  return acc;\n}\n\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function normalize(input: any, depth?: number): any {\n  try {\n    return JSON.parse(JSON.stringify(input, (key: string, value: any) => walk(key, value, depth)));\n  } catch (_oO) {\n    return '**non-serializable**';\n  }\n}\n\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function extractExceptionKeysForMessage(exception: any, maxLength: number = 40): string {\n  const keys = Object.keys(getWalkSource(exception));\n  keys.sort();\n\n  if (!keys.length) {\n    return '[object has no keys]';\n  }\n\n  if (keys[0].length >= maxLength) {\n    return truncate(keys[0], maxLength);\n  }\n\n  for (let includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n    const serialized = keys.slice(0, includedKeys).join(', ');\n    if (serialized.length > maxLength) {\n      continue;\n    }\n    if (includedKeys === keys.length) {\n      return serialized;\n    }\n    return truncate(serialized, maxLength);\n  }\n\n  return '';\n}\n\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\nexport function dropUndefinedKeys<T>(val: T): T {\n  if (isPlainObject(val)) {\n    const obj = val as { [key: string]: any };\n    const rv: { [key: string]: any } = {};\n    for (const key of Object.keys(obj)) {\n      if (typeof obj[key] !== 'undefined') {\n        rv[key] = dropUndefinedKeys(obj[key]);\n      }\n    }\n    return rv as T;\n  }\n\n  if (Array.isArray(val)) {\n    return (val as any[]).map(dropUndefinedKeys) as any;\n  }\n\n  return val;\n}\n","import { Session as SessionInterface, SessionContext, SessionStatus } from '@sentry/types';\nimport { dropUndefinedKeys, uuid4 } from '@sentry/utils';\n\n/**\n * @inheritdoc\n */\nexport class Session implements SessionInterface {\n  public userAgent?: string;\n  public errors: number = 0;\n  public release?: string;\n  public sid: string = uuid4();\n  public did?: string;\n  public timestamp: number = Date.now();\n  public started: number = Date.now();\n  public duration: number = 0;\n  public status: SessionStatus = SessionStatus.Ok;\n  public environment?: string;\n  public ipAddress?: string;\n  public init: boolean = true;\n\n  constructor(context?: Omit<SessionContext, 'started' | 'status'>) {\n    if (context) {\n      this.update(context);\n    }\n  }\n\n  /** JSDoc */\n  // eslint-disable-next-line complexity\n  update(context: SessionContext = {}): void {\n    if (context.user) {\n      if (context.user.ip_address) {\n        this.ipAddress = context.user.ip_address;\n      }\n\n      if (!context.did) {\n        this.did = context.user.id || context.user.email || context.user.username;\n      }\n    }\n\n    this.timestamp = context.timestamp || Date.now();\n\n    if (context.sid) {\n      // Good enough uuid validation. — Kamil\n      this.sid = context.sid.length === 32 ? context.sid : uuid4();\n    }\n    if (context.init !== undefined) {\n      this.init = context.init;\n    }\n    if (context.did) {\n      this.did = `${context.did}`;\n    }\n    if (typeof context.started === 'number') {\n      this.started = context.started;\n    }\n    if (typeof context.duration === 'number') {\n      this.duration = context.duration;\n    } else {\n      this.duration = this.timestamp - this.started;\n    }\n    if (context.release) {\n      this.release = context.release;\n    }\n    if (context.environment) {\n      this.environment = context.environment;\n    }\n    if (context.ipAddress) {\n      this.ipAddress = context.ipAddress;\n    }\n    if (context.userAgent) {\n      this.userAgent = context.userAgent;\n    }\n    if (typeof context.errors === 'number') {\n      this.errors = context.errors;\n    }\n    if (context.status) {\n      this.status = context.status;\n    }\n  }\n\n  /** JSDoc */\n  close(status?: Exclude<SessionStatus, SessionStatus.Ok>): void {\n    if (status) {\n      this.update({ status });\n    } else if (this.status === SessionStatus.Ok) {\n      this.update({ status: SessionStatus.Exited });\n    } else {\n      this.update();\n    }\n  }\n\n  /** JSDoc */\n  toJSON(): {\n    init: boolean;\n    sid: string;\n    did?: string;\n    timestamp: string;\n    started: string;\n    duration: number;\n    status: SessionStatus;\n    errors: number;\n    attrs?: {\n      release?: string;\n      environment?: string;\n      user_agent?: string;\n      ip_address?: string;\n    };\n  } {\n    return dropUndefinedKeys({\n      sid: `${this.sid}`,\n      init: this.init,\n      started: new Date(this.started).toISOString(),\n      timestamp: new Date(this.timestamp).toISOString(),\n      status: this.status,\n      errors: this.errors,\n      did: typeof this.did === 'number' || typeof this.did === 'string' ? `${this.did}` : undefined,\n      duration: this.duration,\n      attrs: dropUndefinedKeys({\n        release: this.release,\n        environment: this.environment,\n        ip_address: this.ipAddress,\n        user_agent: this.userAgent,\n      }),\n    });\n  }\n}\n","/* eslint-disable max-lines */\nimport {\n  Breadcrumb,\n  BreadcrumbHint,\n  Client,\n  CustomSamplingContext,\n  Event,\n  EventHint,\n  Extra,\n  Extras,\n  Hub as HubInterface,\n  Integration,\n  IntegrationClass,\n  Primitive,\n  SessionContext,\n  SessionStatus,\n  Severity,\n  Span,\n  SpanContext,\n  Transaction,\n  TransactionContext,\n  User,\n} from '@sentry/types';\nimport { consoleSandbox, dateTimestampInSeconds, getGlobalObject, isNodeEnv, logger, uuid4 } from '@sentry/utils';\n\nimport { Carrier, DomainAsCarrier, Layer } from './interfaces';\nimport { Scope } from './scope';\nimport { Session } from './session';\n\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nexport const API_VERSION = 3;\n\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nconst DEFAULT_BREADCRUMBS = 100;\n\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nconst MAX_BREADCRUMBS = 100;\n\n/**\n * @inheritDoc\n */\nexport class Hub implements HubInterface {\n  /** Is a {@link Layer}[] containing the client and scope */\n  private readonly _stack: Layer[] = [{}];\n\n  /** Contains the last event id of a captured event.  */\n  private _lastEventId?: string;\n\n  /**\n   * Creates a new instance of the hub, will push one {@link Layer} into the\n   * internal stack on creation.\n   *\n   * @param client bound to the hub.\n   * @param scope bound to the hub.\n   * @param version number, higher number means higher priority.\n   */\n  public constructor(client?: Client, scope: Scope = new Scope(), private readonly _version: number = API_VERSION) {\n    this.getStackTop().scope = scope;\n    this.bindClient(client);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public isOlderThan(version: number): boolean {\n    return this._version < version;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public bindClient(client?: Client): void {\n    const top = this.getStackTop();\n    top.client = client;\n    if (client && client.setupIntegrations) {\n      client.setupIntegrations();\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public pushScope(): Scope {\n    // We want to clone the content of prev scope\n    const scope = Scope.clone(this.getScope());\n    this.getStack().push({\n      client: this.getClient(),\n      scope,\n    });\n    return scope;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public popScope(): boolean {\n    if (this.getStack().length <= 1) return false;\n    return !!this.getStack().pop();\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public withScope(callback: (scope: Scope) => void): void {\n    const scope = this.pushScope();\n    try {\n      callback(scope);\n    } finally {\n      this.popScope();\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getClient<C extends Client>(): C | undefined {\n    return this.getStackTop().client as C;\n  }\n\n  /** Returns the scope of the top stack. */\n  public getScope(): Scope | undefined {\n    return this.getStackTop().scope;\n  }\n\n  /** Returns the scope stack for domains or the process. */\n  public getStack(): Layer[] {\n    return this._stack;\n  }\n\n  /** Returns the topmost scope layer in the order domain > local > process. */\n  public getStackTop(): Layer {\n    return this._stack[this._stack.length - 1];\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n  public captureException(exception: any, hint?: EventHint): string {\n    const eventId = (this._lastEventId = uuid4());\n    let finalHint = hint;\n\n    // If there's no explicit hint provided, mimick the same thing that would happen\n    // in the minimal itself to create a consistent behavior.\n    // We don't do this in the client, as it's the lowest level API, and doing this,\n    // would prevent user from having full control over direct calls.\n    if (!hint) {\n      let syntheticException: Error;\n      try {\n        throw new Error('Sentry syntheticException');\n      } catch (exception) {\n        syntheticException = exception as Error;\n      }\n      finalHint = {\n        originalException: exception,\n        syntheticException,\n      };\n    }\n\n    this._invokeClient('captureException', exception, {\n      ...finalHint,\n      event_id: eventId,\n    });\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureMessage(message: string, level?: Severity, hint?: EventHint): string {\n    const eventId = (this._lastEventId = uuid4());\n    let finalHint = hint;\n\n    // If there's no explicit hint provided, mimick the same thing that would happen\n    // in the minimal itself to create a consistent behavior.\n    // We don't do this in the client, as it's the lowest level API, and doing this,\n    // would prevent user from having full control over direct calls.\n    if (!hint) {\n      let syntheticException: Error;\n      try {\n        throw new Error(message);\n      } catch (exception) {\n        syntheticException = exception as Error;\n      }\n      finalHint = {\n        originalException: message,\n        syntheticException,\n      };\n    }\n\n    this._invokeClient('captureMessage', message, level, {\n      ...finalHint,\n      event_id: eventId,\n    });\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureEvent(event: Event, hint?: EventHint): string {\n    const eventId = (this._lastEventId = uuid4());\n    this._invokeClient('captureEvent', event, {\n      ...hint,\n      event_id: eventId,\n    });\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public lastEventId(): string | undefined {\n    return this._lastEventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public addBreadcrumb(breadcrumb: Breadcrumb, hint?: BreadcrumbHint): void {\n    const { scope, client } = this.getStackTop();\n\n    if (!scope || !client) return;\n\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    const { beforeBreadcrumb = null, maxBreadcrumbs = DEFAULT_BREADCRUMBS } =\n      (client.getOptions && client.getOptions()) || {};\n\n    if (maxBreadcrumbs <= 0) return;\n\n    const timestamp = dateTimestampInSeconds();\n    const mergedBreadcrumb = { timestamp, ...breadcrumb };\n    const finalBreadcrumb = beforeBreadcrumb\n      ? (consoleSandbox(() => beforeBreadcrumb(mergedBreadcrumb, hint)) as Breadcrumb | null)\n      : mergedBreadcrumb;\n\n    if (finalBreadcrumb === null) return;\n\n    scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setUser(user: User | null): void {\n    const scope = this.getScope();\n    if (scope) scope.setUser(user);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTags(tags: { [key: string]: Primitive }): void {\n    const scope = this.getScope();\n    if (scope) scope.setTags(tags);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setExtras(extras: Extras): void {\n    const scope = this.getScope();\n    if (scope) scope.setExtras(extras);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setTag(key: string, value: Primitive): void {\n    const scope = this.getScope();\n    if (scope) scope.setTag(key, value);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setExtra(key: string, extra: Extra): void {\n    const scope = this.getScope();\n    if (scope) scope.setExtra(key, extra);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  public setContext(name: string, context: { [key: string]: any } | null): void {\n    const scope = this.getScope();\n    if (scope) scope.setContext(name, context);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public configureScope(callback: (scope: Scope) => void): void {\n    const { scope, client } = this.getStackTop();\n    if (scope && client) {\n      callback(scope);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public run(callback: (hub: Hub) => void): void {\n    const oldHub = makeMain(this);\n    try {\n      callback(this);\n    } finally {\n      makeMain(oldHub);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getIntegration<T extends Integration>(integration: IntegrationClass<T>): T | null {\n    const client = this.getClient();\n    if (!client) return null;\n    try {\n      return client.getIntegration(integration);\n    } catch (_oO) {\n      logger.warn(`Cannot retrieve integration ${integration.id} from the current Hub`);\n      return null;\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public startSpan(context: SpanContext): Span {\n    return this._callExtensionMethod('startSpan', context);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public startTransaction(context: TransactionContext, customSamplingContext?: CustomSamplingContext): Transaction {\n    return this._callExtensionMethod('startTransaction', context, customSamplingContext);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public traceHeaders(): { [key: string]: string } {\n    return this._callExtensionMethod<{ [key: string]: string }>('traceHeaders');\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureSession(endSession: boolean = false): void {\n    // both send the update and pull the session from the scope\n    if (endSession) {\n      return this.endSession();\n    }\n\n    // only send the update\n    this._sendSessionUpdate();\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public endSession(): void {\n    this.getStackTop()\n      ?.scope?.getSession()\n      ?.close();\n    this._sendSessionUpdate();\n\n    // the session is over; take it off of the scope\n    this.getStackTop()?.scope?.setSession();\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public startSession(context?: SessionContext): Session {\n    const { scope, client } = this.getStackTop();\n    const { release, environment } = (client && client.getOptions()) || {};\n    const session = new Session({\n      release,\n      environment,\n      ...(scope && { user: scope.getUser() }),\n      ...context,\n    });\n\n    if (scope) {\n      // End existing session if there's one\n      const currentSession = scope.getSession && scope.getSession();\n      if (currentSession && currentSession.status === SessionStatus.Ok) {\n        currentSession.update({ status: SessionStatus.Exited });\n      }\n      this.endSession();\n\n      // Afterwards we set the new session on the scope\n      scope.setSession(session);\n    }\n\n    return session;\n  }\n\n  /**\n   * Sends the current Session on the scope\n   */\n  private _sendSessionUpdate(): void {\n    const { scope, client } = this.getStackTop();\n    if (!scope) return;\n\n    const session = scope.getSession && scope.getSession();\n    if (session) {\n      if (client && client.captureSession) {\n        client.captureSession(session);\n      }\n    }\n  }\n\n  /**\n   * Internal helper function to call a method on the top client if it exists.\n   *\n   * @param method The method to call on the client.\n   * @param args Arguments to pass to the client function.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _invokeClient<M extends keyof Client>(method: M, ...args: any[]): void {\n    const { scope, client } = this.getStackTop();\n    if (client && client[method]) {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n      (client as any)[method](...args, scope);\n    }\n  }\n\n  /**\n   * Calls global extension method and binding current instance to the function call\n   */\n  // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _callExtensionMethod<T>(method: string, ...args: any[]): T {\n    const carrier = getMainCarrier();\n    const sentry = carrier.__SENTRY__;\n    if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n      return sentry.extensions[method].apply(this, args);\n    }\n    logger.warn(`Extension method ${method} couldn't be found, doing nothing.`);\n  }\n}\n\n/** Returns the global shim registry. */\nexport function getMainCarrier(): Carrier {\n  const carrier = getGlobalObject();\n  carrier.__SENTRY__ = carrier.__SENTRY__ || {\n    extensions: {},\n    hub: undefined,\n  };\n  return carrier;\n}\n\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub: Hub): Hub {\n  const registry = getMainCarrier();\n  const oldHub = getHubFromCarrier(registry);\n  setHubOnCarrier(registry, hub);\n  return oldHub;\n}\n\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub(): Hub {\n  // Get main carrier (global for every environment)\n  const registry = getMainCarrier();\n\n  // If there's no hub, or its an old API, assign a new one\n  if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n    setHubOnCarrier(registry, new Hub());\n  }\n\n  // Prefer domains over global if they are there (applicable only to Node environment)\n  if (isNodeEnv()) {\n    return getHubFromActiveDomain(registry);\n  }\n  // Return hub that lives on a global object\n  return getHubFromCarrier(registry);\n}\n\n/**\n * Returns the active domain, if one exists\n * @deprecated No longer used; remove in v7\n * @returns The domain, or undefined if there is no active domain\n */\n// eslint-disable-next-line deprecation/deprecation\nexport function getActiveDomain(): DomainAsCarrier | undefined {\n  logger.warn('Function `getActiveDomain` is deprecated and will be removed in a future version.');\n\n  const sentry = getMainCarrier().__SENTRY__;\n\n  return sentry && sentry.extensions && sentry.extensions.domain && sentry.extensions.domain.active;\n}\n\n/**\n * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry: Carrier): Hub {\n  try {\n    const activeDomain = getMainCarrier().__SENTRY__?.extensions?.domain?.active;\n\n    // If there's no active domain, just return global hub\n    if (!activeDomain) {\n      return getHubFromCarrier(registry);\n    }\n\n    // If there's no hub on current domain, or it's an old API, assign a new one\n    if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n      const registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n      setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n    }\n\n    // Return hub that lives on a domain\n    return getHubFromCarrier(activeDomain);\n  } catch (_Oo) {\n    // Return hub that lives on a global object\n    return getHubFromCarrier(registry);\n  }\n}\n\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier: Carrier): boolean {\n  return !!(carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub);\n}\n\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier: Carrier): Hub {\n  if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) return carrier.__SENTRY__.hub;\n  carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n  carrier.__SENTRY__.hub = new Hub();\n  return carrier.__SENTRY__.hub;\n}\n\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n * @returns A boolean indicating success or failure\n */\nexport function setHubOnCarrier(carrier: Carrier, hub: Hub): boolean {\n  if (!carrier) return false;\n  carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n  carrier.__SENTRY__.hub = hub;\n  return true;\n}\n","import { getCurrentHub, Hub, Scope } from '@sentry/hub';\nimport {\n  Breadcrumb,\n  CaptureContext,\n  CustomSamplingContext,\n  Event,\n  Extra,\n  Extras,\n  Primitive,\n  Severity,\n  Transaction,\n  TransactionContext,\n  User,\n} from '@sentry/types';\n\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction callOnHub<T>(method: string, ...args: any[]): T {\n  const hub = getCurrentHub();\n  if (hub && hub[method as keyof Hub]) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return (hub[method as keyof Hub] as any)(...args);\n  }\n  throw new Error(`No hub defined or ${method} was not found on the hub, please open a bug report.`);\n}\n\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function captureException(exception: any, captureContext?: CaptureContext): string {\n  let syntheticException: Error;\n  try {\n    throw new Error('Sentry syntheticException');\n  } catch (exception) {\n    syntheticException = exception as Error;\n  }\n  return callOnHub('captureException', exception, {\n    captureContext,\n    originalException: exception,\n    syntheticException,\n  });\n}\n\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message: string, captureContext?: CaptureContext | Severity): string {\n  let syntheticException: Error;\n  try {\n    throw new Error(message);\n  } catch (exception) {\n    syntheticException = exception as Error;\n  }\n\n  // This is necessary to provide explicit scopes upgrade, without changing the original\n  // arity of the `captureMessage(message, level)` method.\n  const level = typeof captureContext === 'string' ? captureContext : undefined;\n  const context = typeof captureContext !== 'string' ? { captureContext } : undefined;\n\n  return callOnHub('captureMessage', message, level, {\n    originalException: message,\n    syntheticException,\n    ...context,\n  });\n}\n\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event: Event): string {\n  return callOnHub('captureEvent', event);\n}\n\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback: (scope: Scope) => void): void {\n  callOnHub<void>('configureScope', callback);\n}\n\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb: Breadcrumb): void {\n  callOnHub<void>('addBreadcrumb', breadcrumb);\n}\n\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function setContext(name: string, context: { [key: string]: any } | null): void {\n  callOnHub<void>('setContext', name, context);\n}\n\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras: Extras): void {\n  callOnHub<void>('setExtras', extras);\n}\n\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags: { [key: string]: Primitive }): void {\n  callOnHub<void>('setTags', tags);\n}\n\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key: string, extra: Extra): void {\n  callOnHub<void>('setExtra', key, extra);\n}\n\n/**\n * Set key:value that will be sent as tags data with the event.\n *\n * Can also be used to unset a tag, by passing `undefined`.\n *\n * @param key String key of tag\n * @param value Value of tag\n */\nexport function setTag(key: string, value: Primitive): void {\n  callOnHub<void>('setTag', key, value);\n}\n\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user: User | null): void {\n  callOnHub<void>('setUser', user);\n}\n\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n *     pushScope();\n *     callback();\n *     popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback: (scope: Scope) => void): void {\n  callOnHub<void>('withScope', callback);\n}\n\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _callOnClient(method: string, ...args: any[]): void {\n  callOnHub<void>('_invokeClient', method, ...args);\n}\n\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and child spans to other spans. To start a\n * new child span within the transaction or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished, otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at which point the transaction with all its\n * finished child spans will be sent to Sentry.\n *\n * @param context Properties of the new `Transaction`.\n * @param customSamplingContext Information given to the transaction sampling function (along with context-dependent\n * default values). See {@link Options.tracesSampler}.\n *\n * @returns The transaction which was just started\n */\nexport function startTransaction(\n  context: TransactionContext,\n  customSamplingContext?: CustomSamplingContext,\n): Transaction {\n  return callOnHub('startTransaction', { ...context }, customSamplingContext);\n}\n","import React from \"react\";\nimport * as Sentry from \"@sentry/browser\";\nimport { t } from \"../i18n\";\n\ninterface TopErrorBoundaryState {\n  hasError: boolean;\n  sentryEventId: string;\n  localStorage: string;\n}\n\nexport class TopErrorBoundary extends React.Component<\n  any,\n  TopErrorBoundaryState\n> {\n  state: TopErrorBoundaryState = {\n    hasError: false,\n    sentryEventId: \"\",\n    localStorage: \"\",\n  };\n\n  render() {\n    return this.state.hasError ? this.errorSplash() : this.props.children;\n  }\n\n  componentDidCatch(error: Error, errorInfo: any) {\n    const _localStorage: any = {};\n    for (const [key, value] of Object.entries({ ...localStorage })) {\n      try {\n        _localStorage[key] = JSON.parse(value);\n      } catch (error: any) {\n        _localStorage[key] = value;\n      }\n    }\n\n    Sentry.withScope((scope) => {\n      scope.setExtras(errorInfo);\n      const eventId = Sentry.captureException(error);\n\n      this.setState((state) => ({\n        hasError: true,\n        sentryEventId: eventId,\n        localStorage: JSON.stringify(_localStorage),\n      }));\n    });\n  }\n\n  private selectTextArea(event: React.MouseEvent<HTMLTextAreaElement>) {\n    if (event.target !== document.activeElement) {\n      event.preventDefault();\n      (event.target as HTMLTextAreaElement).select();\n    }\n  }\n\n  private async createGithubIssue() {\n    let body = \"\";\n    try {\n      const templateStrFn = (\n        await import(\n          /* webpackChunkName: \"bug-issue-template\" */ \"../bug-issue-template\"\n        )\n      ).default;\n      body = encodeURIComponent(templateStrFn(this.state.sentryEventId));\n    } catch (error: any) {\n      console.error(error);\n    }\n\n    window.open(\n      `https://github.com/excalidraw/excalidraw/issues/new?body=${body}`,\n    );\n  }\n\n  private errorSplash() {\n    return (\n      <div className=\"ErrorSplash excalidraw\">\n        <div className=\"ErrorSplash-messageContainer\">\n          <div className=\"ErrorSplash-paragraph bigger align-center\">\n            {t(\"errorSplash.headingMain_pre\")}\n            <button onClick={() => window.location.reload()}>\n              {t(\"errorSplash.headingMain_button\")}\n            </button>\n          </div>\n          <div className=\"ErrorSplash-paragraph align-center\">\n            {t(\"errorSplash.clearCanvasMessage\")}\n            <button\n              onClick={() => {\n                try {\n                  localStorage.clear();\n                  window.location.reload();\n                } catch (error: any) {\n                  console.error(error);\n                }\n              }}\n            >\n              {t(\"errorSplash.clearCanvasMessage_button\")}\n            </button>\n            <br />\n            <div className=\"smaller\">\n              <span role=\"img\" aria-label=\"warning\">\n                ⚠️\n              </span>\n              {t(\"errorSplash.clearCanvasCaveat\")}\n              <span role=\"img\" aria-hidden=\"true\">\n                ⚠️\n              </span>\n            </div>\n          </div>\n          <div>\n            <div className=\"ErrorSplash-paragraph\">\n              {t(\"errorSplash.trackedToSentry_pre\")}\n              {this.state.sentryEventId}\n              {t(\"errorSplash.trackedToSentry_post\")}\n            </div>\n            <div className=\"ErrorSplash-paragraph\">\n              {t(\"errorSplash.openIssueMessage_pre\")}\n              <button onClick={() => this.createGithubIssue()}>\n                {t(\"errorSplash.openIssueMessage_button\")}\n              </button>\n              {t(\"errorSplash.openIssueMessage_post\")}\n            </div>\n            <div className=\"ErrorSplash-paragraph\">\n              <div className=\"ErrorSplash-details\">\n                <label>{t(\"errorSplash.sceneContent\")}</label>\n                <textarea\n                  rows={5}\n                  onPointerDown={this.selectTextArea}\n                  readOnly={true}\n                  value={this.state.localStorage}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n","import React, { useEffect, useState } from \"react\";\n\nimport { LoadingMessage } from \"./LoadingMessage\";\nimport { defaultLang, Language, languages, setLanguage } from \"../i18n\";\nimport { Theme } from \"../element/types\";\n\ninterface Props {\n  langCode: Language[\"code\"];\n  children: React.ReactElement;\n  theme?: Theme;\n}\n\nexport const InitializeApp = (props: Props) => {\n  const [loading, setLoading] = useState(true);\n\n  useEffect(() => {\n    const updateLang = async () => {\n      await setLanguage(currentLang);\n      setLoading(false);\n    };\n    const currentLang =\n      languages.find((lang) => lang.code === props.langCode) || defaultLang;\n    updateLang();\n  }, [props.langCode]);\n\n  return loading ? <LoadingMessage theme={props.theme} /> : props.children;\n};\n","import clsx from \"clsx\";\nimport { useExcalidrawAppState } from \"../App\";\nimport { useTunnels } from \"../context/tunnels\";\nimport \"./FooterCenter.scss\";\n\nconst FooterCenter = ({ children }: { children?: React.ReactNode }) => {\n  const { footerCenterTunnel } = useTunnels();\n  const appState = useExcalidrawAppState();\n  return (\n    <footerCenterTunnel.In>\n      <div\n        className={clsx(\"footer-center zen-mode-transition\", {\n          \"layer-ui__wrapper__footer-left--transition-bottom\":\n            appState.zenModeEnabled,\n        })}\n      >\n        {children}\n      </div>\n    </footerCenterTunnel.In>\n  );\n};\n\nexport default FooterCenter;\nFooterCenter.displayName = \"FooterCenter\";\n","import { actionLoadScene, actionShortcuts } from \"../../actions\";\nimport { getShortcutFromShortcutName } from \"../../actions/shortcuts\";\nimport { t, useI18n } from \"../../i18n\";\nimport {\n  useDevice,\n  useExcalidrawActionManager,\n  useExcalidrawAppState,\n} from \"../App\";\nimport { useTunnels } from \"../context/tunnels\";\nimport { ExcalLogo, HelpIcon, LoadIcon, usersIcon } from \"../icons\";\n\nconst WelcomeScreenMenuItemContent = ({\n  icon,\n  shortcut,\n  children,\n}: {\n  icon?: JSX.Element;\n  shortcut?: string | null;\n  children: React.ReactNode;\n}) => {\n  const device = useDevice();\n  return (\n    <>\n      <div className=\"welcome-screen-menu-item__icon\">{icon}</div>\n      <div className=\"welcome-screen-menu-item__text\">{children}</div>\n      {shortcut && !device.isMobile && (\n        <div className=\"welcome-screen-menu-item__shortcut\">{shortcut}</div>\n      )}\n    </>\n  );\n};\nWelcomeScreenMenuItemContent.displayName = \"WelcomeScreenMenuItemContent\";\n\nconst WelcomeScreenMenuItem = ({\n  onSelect,\n  children,\n  icon,\n  shortcut,\n  className = \"\",\n  ...props\n}: {\n  onSelect: () => void;\n  children: React.ReactNode;\n  icon?: JSX.Element;\n  shortcut?: string | null;\n} & React.ButtonHTMLAttributes<HTMLButtonElement>) => {\n  return (\n    <button\n      {...props}\n      type=\"button\"\n      className={`welcome-screen-menu-item ${className}`}\n      onClick={onSelect}\n    >\n      <WelcomeScreenMenuItemContent icon={icon} shortcut={shortcut}>\n        {children}\n      </WelcomeScreenMenuItemContent>\n    </button>\n  );\n};\nWelcomeScreenMenuItem.displayName = \"WelcomeScreenMenuItem\";\n\nconst WelcomeScreenMenuItemLink = ({\n  children,\n  href,\n  icon,\n  shortcut,\n  className = \"\",\n  ...props\n}: {\n  children: React.ReactNode;\n  href: string;\n  icon?: JSX.Element;\n  shortcut?: string | null;\n} & React.AnchorHTMLAttributes<HTMLAnchorElement>) => {\n  return (\n    <a\n      {...props}\n      className={`welcome-screen-menu-item ${className}`}\n      href={href}\n      target=\"_blank\"\n      rel=\"noreferrer\"\n    >\n      <WelcomeScreenMenuItemContent icon={icon} shortcut={shortcut}>\n        {children}\n      </WelcomeScreenMenuItemContent>\n    </a>\n  );\n};\nWelcomeScreenMenuItemLink.displayName = \"WelcomeScreenMenuItemLink\";\n\nconst Center = ({ children }: { children?: React.ReactNode }) => {\n  const { welcomeScreenCenterTunnel } = useTunnels();\n  return (\n    <welcomeScreenCenterTunnel.In>\n      <div className=\"welcome-screen-center\">\n        {children || (\n          <>\n            <Logo />\n            <Heading>{t(\"welcomeScreen.defaults.center_heading\")}</Heading>\n            <Menu>\n              <MenuItemLoadScene />\n              <MenuItemHelp />\n            </Menu>\n          </>\n        )}\n      </div>\n    </welcomeScreenCenterTunnel.In>\n  );\n};\nCenter.displayName = \"Center\";\n\nconst Logo = ({ children }: { children?: React.ReactNode }) => {\n  return (\n    <div className=\"welcome-screen-center__logo virgil welcome-screen-decor\">\n      {children || <>{ExcalLogo} Excalidraw</>}\n    </div>\n  );\n};\nLogo.displayName = \"Logo\";\n\nconst Heading = ({ children }: { children: React.ReactNode }) => {\n  return (\n    <div className=\"welcome-screen-center__heading welcome-screen-decor virgil\">\n      {children}\n    </div>\n  );\n};\nHeading.displayName = \"Heading\";\n\nconst Menu = ({ children }: { children?: React.ReactNode }) => {\n  return <div className=\"welcome-screen-menu\">{children}</div>;\n};\nMenu.displayName = \"Menu\";\n\nconst MenuItemHelp = () => {\n  const actionManager = useExcalidrawActionManager();\n\n  return (\n    <WelcomeScreenMenuItem\n      onSelect={() => actionManager.executeAction(actionShortcuts)}\n      shortcut=\"?\"\n      icon={HelpIcon}\n    >\n      {t(\"helpDialog.title\")}\n    </WelcomeScreenMenuItem>\n  );\n};\nMenuItemHelp.displayName = \"MenuItemHelp\";\n\nconst MenuItemLoadScene = () => {\n  const appState = useExcalidrawAppState();\n  const actionManager = useExcalidrawActionManager();\n\n  if (appState.viewModeEnabled) {\n    return null;\n  }\n\n  return (\n    <WelcomeScreenMenuItem\n      onSelect={() => actionManager.executeAction(actionLoadScene)}\n      shortcut={getShortcutFromShortcutName(\"loadScene\")}\n      icon={LoadIcon}\n    >\n      {t(\"buttons.load\")}\n    </WelcomeScreenMenuItem>\n  );\n};\nMenuItemLoadScene.displayName = \"MenuItemLoadScene\";\n\nconst MenuItemLiveCollaborationTrigger = ({\n  onSelect,\n}: {\n  onSelect: () => any;\n}) => {\n  const { t } = useI18n();\n  return (\n    <WelcomeScreenMenuItem shortcut={null} onSelect={onSelect} icon={usersIcon}>\n      {t(\"labels.liveCollaboration\")}\n    </WelcomeScreenMenuItem>\n  );\n};\nMenuItemLiveCollaborationTrigger.displayName =\n  \"MenuItemLiveCollaborationTrigger\";\n\n// -----------------------------------------------------------------------------\n\nCenter.Logo = Logo;\nCenter.Heading = Heading;\nCenter.Menu = Menu;\nCenter.MenuItem = WelcomeScreenMenuItem;\nCenter.MenuItemLink = WelcomeScreenMenuItemLink;\nCenter.MenuItemHelp = MenuItemHelp;\nCenter.MenuItemLoadScene = MenuItemLoadScene;\nCenter.MenuItemLiveCollaborationTrigger = MenuItemLiveCollaborationTrigger;\n\nexport { Center };\n","import { t } from \"../../i18n\";\nimport { useTunnels } from \"../context/tunnels\";\nimport {\n  WelcomeScreenHelpArrow,\n  WelcomeScreenMenuArrow,\n  WelcomeScreenTopToolbarArrow,\n} from \"../icons\";\n\nconst MenuHint = ({ children }: { children?: React.ReactNode }) => {\n  const { welcomeScreenMenuHintTunnel } = useTunnels();\n  return (\n    <welcomeScreenMenuHintTunnel.In>\n      <div className=\"virgil welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--menu\">\n        {WelcomeScreenMenuArrow}\n        <div className=\"welcome-screen-decor-hint__label\">\n          {children || t(\"welcomeScreen.defaults.menuHint\")}\n        </div>\n      </div>\n    </welcomeScreenMenuHintTunnel.In>\n  );\n};\nMenuHint.displayName = \"MenuHint\";\n\nconst ToolbarHint = ({ children }: { children?: React.ReactNode }) => {\n  const { welcomeScreenToolbarHintTunnel } = useTunnels();\n  return (\n    <welcomeScreenToolbarHintTunnel.In>\n      <div className=\"virgil welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--toolbar\">\n        <div className=\"welcome-screen-decor-hint__label\">\n          {children || t(\"welcomeScreen.defaults.toolbarHint\")}\n        </div>\n        {WelcomeScreenTopToolbarArrow}\n      </div>\n    </welcomeScreenToolbarHintTunnel.In>\n  );\n};\nToolbarHint.displayName = \"ToolbarHint\";\n\nconst HelpHint = ({ children }: { children?: React.ReactNode }) => {\n  const { welcomeScreenHelpHintTunnel } = useTunnels();\n  return (\n    <welcomeScreenHelpHintTunnel.In>\n      <div className=\"virgil welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--help\">\n        <div>{children || t(\"welcomeScreen.defaults.helpHint\")}</div>\n        {WelcomeScreenHelpArrow}\n      </div>\n    </welcomeScreenHelpHintTunnel.In>\n  );\n};\nHelpHint.displayName = \"HelpHint\";\n\nexport { HelpHint, MenuHint, ToolbarHint };\n","import { Center } from \"./WelcomeScreen.Center\";\nimport { MenuHint, ToolbarHint, HelpHint } from \"./WelcomeScreen.Hints\";\n\nimport \"./WelcomeScreen.scss\";\n\nconst WelcomeScreen = (props: { children?: React.ReactNode }) => {\n  return (\n    <>\n      {props.children || (\n        <>\n          <Center />\n          <MenuHint />\n          <ToolbarHint />\n          <HelpHint />\n        </>\n      )}\n    </>\n  );\n};\n\nWelcomeScreen.displayName = \"WelcomeScreen\";\n\nWelcomeScreen.Center = Center;\nWelcomeScreen.Hints = { MenuHint, ToolbarHint, HelpHint };\n\nexport default WelcomeScreen;\n","import \"./Button.scss\";\n\ninterface ButtonProps extends React.HTMLAttributes<HTMLButtonElement> {\n  type?: \"button\" | \"submit\" | \"reset\";\n  onSelect: () => any;\n  children: React.ReactNode;\n  className?: string;\n}\n\n/**\n * A generic button component that follows Excalidraw's design system.\n * Style can be customised using `className` or `style` prop.\n * Accepts all props that a regular `button` element accepts.\n */\nexport const Button = ({\n  type = \"button\",\n  onSelect,\n  children,\n  className = \"\",\n  ...rest\n}: ButtonProps) => {\n  return (\n    <button\n      onClick={(event) => {\n        onSelect();\n        rest.onClick?.(event);\n      }}\n      type={type}\n      className={`excalidraw-button ${className}`}\n      {...rest}\n    >\n      {children}\n    </button>\n  );\n};\n","import { t } from \"../../i18n\";\nimport { usersIcon } from \"../icons\";\nimport { Button } from \"../Button\";\n\nimport clsx from \"clsx\";\nimport { useExcalidrawAppState } from \"../App\";\n\nimport \"./LiveCollaborationTrigger.scss\";\n\nconst LiveCollaborationTrigger = ({\n  isCollaborating,\n  onSelect,\n  ...rest\n}: {\n  isCollaborating: boolean;\n  onSelect: () => void;\n} & React.ButtonHTMLAttributes<HTMLButtonElement>) => {\n  const appState = useExcalidrawAppState();\n\n  return (\n    <Button\n      {...rest}\n      className={clsx(\"collab-button\", { active: isCollaborating })}\n      type=\"button\"\n      onSelect={onSelect}\n      style={{ position: \"relative\" }}\n      title={t(\"labels.liveCollaboration\")}\n    >\n      {usersIcon}\n      {appState.collaborators.size > 0 && (\n        <div className=\"CollabButton-collaborators\">\n          {appState.collaborators.size}\n        </div>\n      )}\n    </Button>\n  );\n};\n\nexport default LiveCollaborationTrigger;\nLiveCollaborationTrigger.displayName = \"LiveCollaborationTrigger\";\n","import React, { useEffect, forwardRef } from \"react\";\nimport { InitializeApp } from \"../../components/InitializeApp\";\nimport App from \"../../components/App\";\nimport { isShallowEqual } from \"../../utils\";\n\nimport \"../../css/app.scss\";\nimport \"../../css/styles.scss\";\n\nimport { AppProps, ExcalidrawAPIRefValue, ExcalidrawProps } from \"../../types\";\nimport { defaultLang } from \"../../i18n\";\nimport { DEFAULT_UI_OPTIONS } from \"../../constants\";\nimport { Provider } from \"jotai\";\nimport { jotaiScope, jotaiStore } from \"../../jotai\";\nimport Footer from \"../../components/footer/FooterCenter\";\nimport MainMenu from \"../../components/main-menu/MainMenu\";\nimport WelcomeScreen from \"../../components/welcome-screen/WelcomeScreen\";\nimport LiveCollaborationTrigger from \"../../components/live-collaboration/LiveCollaborationTrigger\";\n\nconst ExcalidrawBase = (props: ExcalidrawProps) => {\n  const {\n    onChange,\n    initialData,\n    excalidrawRef,\n    isCollaborating = false,\n    onPointerUpdate,\n    renderTopRightUI,\n    renderSidebar,\n    langCode = defaultLang.code,\n    viewModeEnabled,\n    zenModeEnabled,\n    gridModeEnabled,\n    libraryReturnUrl,\n    theme,\n    name,\n    renderCustomStats,\n    onPaste,\n    detectScroll = true,\n    handleKeyboardGlobally = false,\n    onLibraryChange,\n    autoFocus = false,\n    generateIdForFile,\n    onLinkOpen,\n    onPointerDown,\n    onScrollChange,\n    children,\n  } = props;\n\n  const canvasActions = props.UIOptions?.canvasActions;\n\n  const UIOptions: AppProps[\"UIOptions\"] = {\n    ...props.UIOptions,\n    canvasActions: {\n      ...DEFAULT_UI_OPTIONS.canvasActions,\n      ...canvasActions,\n    },\n  };\n\n  if (canvasActions?.export) {\n    UIOptions.canvasActions.export.saveFileToDisk =\n      canvasActions.export?.saveFileToDisk ??\n      DEFAULT_UI_OPTIONS.canvasActions.export.saveFileToDisk;\n  }\n\n  if (\n    UIOptions.canvasActions.toggleTheme === null &&\n    typeof theme === \"undefined\"\n  ) {\n    UIOptions.canvasActions.toggleTheme = true;\n  }\n\n  useEffect(() => {\n    // Block pinch-zooming on iOS outside of the content area\n    const handleTouchMove = (event: TouchEvent) => {\n      // @ts-ignore\n      if (typeof event.scale === \"number\" && event.scale !== 1) {\n        event.preventDefault();\n      }\n    };\n\n    document.addEventListener(\"touchmove\", handleTouchMove, {\n      passive: false,\n    });\n\n    return () => {\n      document.removeEventListener(\"touchmove\", handleTouchMove);\n    };\n  }, []);\n\n  return (\n    <Provider unstable_createStore={() => jotaiStore} scope={jotaiScope}>\n      <InitializeApp langCode={langCode} theme={theme}>\n        <App\n          onChange={onChange}\n          initialData={initialData}\n          excalidrawRef={excalidrawRef}\n          isCollaborating={isCollaborating}\n          onPointerUpdate={onPointerUpdate}\n          renderTopRightUI={renderTopRightUI}\n          langCode={langCode}\n          viewModeEnabled={viewModeEnabled}\n          zenModeEnabled={zenModeEnabled}\n          gridModeEnabled={gridModeEnabled}\n          libraryReturnUrl={libraryReturnUrl}\n          theme={theme}\n          name={name}\n          renderCustomStats={renderCustomStats}\n          UIOptions={UIOptions}\n          onPaste={onPaste}\n          detectScroll={detectScroll}\n          handleKeyboardGlobally={handleKeyboardGlobally}\n          onLibraryChange={onLibraryChange}\n          autoFocus={autoFocus}\n          generateIdForFile={generateIdForFile}\n          onLinkOpen={onLinkOpen}\n          onPointerDown={onPointerDown}\n          onScrollChange={onScrollChange}\n          renderSidebar={renderSidebar}\n        >\n          {children}\n        </App>\n      </InitializeApp>\n    </Provider>\n  );\n};\n\ntype PublicExcalidrawProps = Omit<ExcalidrawProps, \"forwardedRef\">;\n\nconst areEqual = (\n  prevProps: PublicExcalidrawProps,\n  nextProps: PublicExcalidrawProps,\n) => {\n  // short-circuit early\n  if (prevProps.children !== nextProps.children) {\n    return false;\n  }\n\n  const {\n    initialData: prevInitialData,\n    UIOptions: prevUIOptions = {},\n    ...prev\n  } = prevProps;\n  const {\n    initialData: nextInitialData,\n    UIOptions: nextUIOptions = {},\n    ...next\n  } = nextProps;\n\n  // comparing UIOptions\n  const prevUIOptionsKeys = Object.keys(prevUIOptions) as (keyof Partial<\n    typeof DEFAULT_UI_OPTIONS\n  >)[];\n  const nextUIOptionsKeys = Object.keys(nextUIOptions) as (keyof Partial<\n    typeof DEFAULT_UI_OPTIONS\n  >)[];\n\n  if (prevUIOptionsKeys.length !== nextUIOptionsKeys.length) {\n    return false;\n  }\n\n  const isUIOptionsSame = prevUIOptionsKeys.every((key) => {\n    if (key === \"canvasActions\") {\n      const canvasOptionKeys = Object.keys(\n        prevUIOptions.canvasActions!,\n      ) as (keyof Partial<typeof DEFAULT_UI_OPTIONS.canvasActions>)[];\n      return canvasOptionKeys.every((key) => {\n        if (\n          key === \"export\" &&\n          prevUIOptions?.canvasActions?.export &&\n          nextUIOptions?.canvasActions?.export\n        ) {\n          return (\n            prevUIOptions.canvasActions.export.saveFileToDisk ===\n            nextUIOptions.canvasActions.export.saveFileToDisk\n          );\n        }\n        return (\n          prevUIOptions?.canvasActions?.[key] ===\n          nextUIOptions?.canvasActions?.[key]\n        );\n      });\n    }\n    return prevUIOptions[key] === nextUIOptions[key];\n  });\n\n  return isUIOptionsSame && isShallowEqual(prev, next);\n};\n\nconst forwardedRefComp = forwardRef<\n  ExcalidrawAPIRefValue,\n  PublicExcalidrawProps\n>((props, ref) => <ExcalidrawBase {...props} excalidrawRef={ref} />);\n\nexport const Excalidraw = React.memo(forwardedRefComp, areEqual);\nExcalidraw.displayName = \"Excalidraw\";\n\nexport {\n  getSceneVersion,\n  isInvisiblySmallElement,\n  getNonDeletedElements,\n} from \"../../element\";\nexport { defaultLang, useI18n, languages } from \"../../i18n\";\nexport {\n  restore,\n  restoreAppState,\n  restoreElements,\n  restoreLibraryItems,\n} from \"../../data/restore\";\nexport {\n  exportToCanvas,\n  exportToBlob,\n  exportToSvg,\n  serializeAsJSON,\n  serializeLibraryAsJSON,\n  loadLibraryFromBlob,\n  loadFromBlob,\n  loadSceneOrLibraryFromBlob,\n  getFreeDrawSvgPath,\n  exportToClipboard,\n  mergeLibraryItems,\n} from \"../../packages/utils\";\nexport { isLinearElement } from \"../../element/typeChecks\";\n\nexport { FONT_FAMILY, THEME, MIME_TYPES } from \"../../constants\";\n\nexport {\n  mutateElement,\n  newElementWith,\n  bumpVersion,\n} from \"../../element/mutateElement\";\n\nexport {\n  parseLibraryTokensFromUrl,\n  useHandleLibrary,\n} from \"../../data/library\";\n\nexport {\n  sceneCoordsToViewportCoords,\n  viewportCoordsToSceneCoords,\n} from \"../../utils\";\n\nexport { Sidebar } from \"../../components/Sidebar/Sidebar\";\nexport { Button } from \"../../components/Button\";\nexport { Footer };\nexport { MainMenu };\nexport { useDevice } from \"../../components/App\";\nexport { WelcomeScreen };\nexport { LiveCollaborationTrigger };\n","// time constants (ms)\nexport const SAVE_TO_LOCAL_STORAGE_TIMEOUT = 300;\nexport const INITIAL_SCENE_UPDATE_TIMEOUT = 5000;\nexport const FILE_UPLOAD_TIMEOUT = 300;\nexport const LOAD_IMAGES_TIMEOUT = 500;\nexport const SYNC_FULL_SCENE_INTERVAL_MS = 20000;\nexport const SYNC_BROWSER_TABS_TIMEOUT = 50;\nexport const CURSOR_SYNC_TIMEOUT = 33; // ~30fps\nexport const DELETED_ELEMENT_TIMEOUT = 24 * 60 * 60 * 1000; // 1 day\n\nexport const FILE_UPLOAD_MAX_BYTES = 3 * 1024 * 1024; // 3 MiB\n// 1 year (https://stackoverflow.com/a/25201898/927631)\nexport const FILE_CACHE_MAX_AGE_SEC = 31536000;\n\nexport const WS_EVENTS = {\n  SERVER_VOLATILE: \"server-volatile-broadcast\",\n  SERVER: \"server-broadcast\",\n};\n\nexport enum WS_SCENE_EVENT_TYPES {\n  INIT = \"SCENE_INIT\",\n  UPDATE = \"SCENE_UPDATE\",\n}\n\nexport const FIREBASE_STORAGE_PREFIXES = {\n  shareLinkFiles: `/files/shareLinks`,\n  collabFiles: `/files/rooms`,\n};\n\nexport const ROOM_ID_BYTES = 10;\n\nexport const STORAGE_KEYS = {\n  LOCAL_STORAGE_ELEMENTS: \"excalidraw\",\n  LOCAL_STORAGE_APP_STATE: \"excalidraw-state\",\n  LOCAL_STORAGE_COLLAB: \"excalidraw-collab\",\n  LOCAL_STORAGE_LIBRARY: \"excalidraw-library\",\n  LOCAL_STORAGE_THEME: \"excalidraw-theme\",\n  VERSION_DATA_STATE: \"version-dataState\",\n  VERSION_FILES: \"version-files\",\n} as const;\n\nexport const COOKIES = {\n  AUTH_STATE_COOKIE: \"excplus-auth\",\n} as const;\n\nexport const isExcalidrawPlusSignedUser = document.cookie.includes(\n  COOKIES.AUTH_STATE_COOKIE,\n);\n","import { ExcalidrawElement, FileId } from \"../../element/types\";\nimport { getSceneVersion } from \"../../element\";\nimport Portal from \"../collab/Portal\";\nimport { restoreElements } from \"../../data/restore\";\nimport {\n  AppState,\n  BinaryFileData,\n  BinaryFileMetadata,\n  DataURL,\n} from \"../../types\";\nimport { FILE_CACHE_MAX_AGE_SEC } from \"../app_constants\";\nimport { decompressData } from \"../../data/encode\";\nimport { encryptData, decryptData } from \"../../data/encryption\";\nimport { MIME_TYPES } from \"../../constants\";\nimport { reconcileElements } from \"../collab/reconciliation\";\nimport { getSyncableElements, SyncableExcalidrawElement } from \".\";\nimport { ResolutionType } from \"../../utility-types\";\n\n// private\n// -----------------------------------------------------------------------------\n\nlet FIREBASE_CONFIG: Record<string, any>;\ntry {\n  FIREBASE_CONFIG = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);\n} catch (error: any) {\n  console.warn(\n    `Error JSON parsing firebase config. Supplied value: ${process.env.REACT_APP_FIREBASE_CONFIG}`,\n  );\n  FIREBASE_CONFIG = {};\n}\n\nlet firebasePromise: Promise<typeof import(\"firebase/app\").default> | null =\n  null;\nlet firestorePromise: Promise<any> | null | true = null;\nlet firebaseStoragePromise: Promise<any> | null | true = null;\n\nlet isFirebaseInitialized = false;\n\nconst _loadFirebase = async () => {\n  const firebase = (\n    await import(/* webpackChunkName: \"firebase\" */ \"firebase/app\")\n  ).default;\n\n  if (!isFirebaseInitialized) {\n    try {\n      firebase.initializeApp(FIREBASE_CONFIG);\n    } catch (error: any) {\n      // trying initialize again throws. Usually this is harmless, and happens\n      // mainly in dev (HMR)\n      if (error.code === \"app/duplicate-app\") {\n        console.warn(error.name, error.code);\n      } else {\n        throw error;\n      }\n    }\n    isFirebaseInitialized = true;\n  }\n\n  return firebase;\n};\n\nconst _getFirebase = async (): Promise<\n  typeof import(\"firebase/app\").default\n> => {\n  if (!firebasePromise) {\n    firebasePromise = _loadFirebase();\n  }\n  return firebasePromise;\n};\n\n// -----------------------------------------------------------------------------\n\nconst loadFirestore = async () => {\n  const firebase = await _getFirebase();\n  if (!firestorePromise) {\n    firestorePromise = import(\n      /* webpackChunkName: \"firestore\" */ \"firebase/firestore\"\n    );\n  }\n  if (firestorePromise !== true) {\n    await firestorePromise;\n    firestorePromise = true;\n  }\n  return firebase;\n};\n\nexport const loadFirebaseStorage = async () => {\n  const firebase = await _getFirebase();\n  if (!firebaseStoragePromise) {\n    firebaseStoragePromise = import(\n      /* webpackChunkName: \"storage\" */ \"firebase/storage\"\n    );\n  }\n  if (firebaseStoragePromise !== true) {\n    await firebaseStoragePromise;\n    firebaseStoragePromise = true;\n  }\n  return firebase;\n};\n\ninterface FirebaseStoredScene {\n  sceneVersion: number;\n  iv: firebase.default.firestore.Blob;\n  ciphertext: firebase.default.firestore.Blob;\n}\n\nconst encryptElements = async (\n  key: string,\n  elements: readonly ExcalidrawElement[],\n): Promise<{ ciphertext: ArrayBuffer; iv: Uint8Array }> => {\n  const json = JSON.stringify(elements);\n  const encoded = new TextEncoder().encode(json);\n  const { encryptedBuffer, iv } = await encryptData(key, encoded);\n\n  return { ciphertext: encryptedBuffer, iv };\n};\n\nconst decryptElements = async (\n  data: FirebaseStoredScene,\n  roomKey: string,\n): Promise<readonly ExcalidrawElement[]> => {\n  const ciphertext = data.ciphertext.toUint8Array();\n  const iv = data.iv.toUint8Array();\n\n  const decrypted = await decryptData(iv, ciphertext, roomKey);\n  const decodedData = new TextDecoder(\"utf-8\").decode(\n    new Uint8Array(decrypted),\n  );\n  return JSON.parse(decodedData);\n};\n\nclass FirebaseSceneVersionCache {\n  private static cache = new WeakMap<SocketIOClient.Socket, number>();\n  static get = (socket: SocketIOClient.Socket) => {\n    return FirebaseSceneVersionCache.cache.get(socket);\n  };\n  static set = (\n    socket: SocketIOClient.Socket,\n    elements: readonly SyncableExcalidrawElement[],\n  ) => {\n    FirebaseSceneVersionCache.cache.set(socket, getSceneVersion(elements));\n  };\n}\n\nexport const isSavedToFirebase = (\n  portal: Portal,\n  elements: readonly ExcalidrawElement[],\n): boolean => {\n  if (portal.socket && portal.roomId && portal.roomKey) {\n    const sceneVersion = getSceneVersion(elements);\n\n    return FirebaseSceneVersionCache.get(portal.socket) === sceneVersion;\n  }\n  // if no room exists, consider the room saved so that we don't unnecessarily\n  // prevent unload (there's nothing we could do at that point anyway)\n  return true;\n};\n\nexport const saveFilesToFirebase = async ({\n  prefix,\n  files,\n}: {\n  prefix: string;\n  files: { id: FileId; buffer: Uint8Array }[];\n}) => {\n  const firebase = await loadFirebaseStorage();\n\n  const erroredFiles = new Map<FileId, true>();\n  const savedFiles = new Map<FileId, true>();\n\n  await Promise.all(\n    files.map(async ({ id, buffer }) => {\n      try {\n        await firebase\n          .storage()\n          .ref(`${prefix}/${id}`)\n          .put(\n            new Blob([buffer], {\n              type: MIME_TYPES.binary,\n            }),\n            {\n              cacheControl: `public, max-age=${FILE_CACHE_MAX_AGE_SEC}`,\n            },\n          );\n        savedFiles.set(id, true);\n      } catch (error: any) {\n        erroredFiles.set(id, true);\n      }\n    }),\n  );\n\n  return { savedFiles, erroredFiles };\n};\n\nconst createFirebaseSceneDocument = async (\n  firebase: ResolutionType<typeof loadFirestore>,\n  elements: readonly SyncableExcalidrawElement[],\n  roomKey: string,\n) => {\n  const sceneVersion = getSceneVersion(elements);\n  const { ciphertext, iv } = await encryptElements(roomKey, elements);\n  return {\n    sceneVersion,\n    ciphertext: firebase.firestore.Blob.fromUint8Array(\n      new Uint8Array(ciphertext),\n    ),\n    iv: firebase.firestore.Blob.fromUint8Array(iv),\n  } as FirebaseStoredScene;\n};\n\nexport const saveToFirebase = async (\n  portal: Portal,\n  elements: readonly SyncableExcalidrawElement[],\n  appState: AppState,\n) => {\n  const { roomId, roomKey, socket } = portal;\n  if (\n    // bail if no room exists as there's nothing we can do at this point\n    !roomId ||\n    !roomKey ||\n    !socket ||\n    isSavedToFirebase(portal, elements)\n  ) {\n    return false;\n  }\n\n  const firebase = await loadFirestore();\n  const firestore = firebase.firestore();\n\n  const docRef = firestore.collection(\"scenes\").doc(roomId);\n\n  const savedData = await firestore.runTransaction(async (transaction) => {\n    const snapshot = await transaction.get(docRef);\n\n    if (!snapshot.exists) {\n      const sceneDocument = await createFirebaseSceneDocument(\n        firebase,\n        elements,\n        roomKey,\n      );\n\n      transaction.set(docRef, sceneDocument);\n\n      return {\n        elements,\n        reconciledElements: null,\n      };\n    }\n\n    const prevDocData = snapshot.data() as FirebaseStoredScene;\n    const prevElements = getSyncableElements(\n      await decryptElements(prevDocData, roomKey),\n    );\n\n    const reconciledElements = getSyncableElements(\n      reconcileElements(elements, prevElements, appState),\n    );\n\n    const sceneDocument = await createFirebaseSceneDocument(\n      firebase,\n      reconciledElements,\n      roomKey,\n    );\n\n    transaction.update(docRef, sceneDocument);\n    return {\n      elements,\n      reconciledElements,\n    };\n  });\n\n  FirebaseSceneVersionCache.set(socket, savedData.elements);\n\n  return { reconciledElements: savedData.reconciledElements };\n};\n\nexport const loadFromFirebase = async (\n  roomId: string,\n  roomKey: string,\n  socket: SocketIOClient.Socket | null,\n): Promise<readonly ExcalidrawElement[] | null> => {\n  const firebase = await loadFirestore();\n  const db = firebase.firestore();\n\n  const docRef = db.collection(\"scenes\").doc(roomId);\n  const doc = await docRef.get();\n  if (!doc.exists) {\n    return null;\n  }\n  const storedScene = doc.data() as FirebaseStoredScene;\n  const elements = getSyncableElements(\n    await decryptElements(storedScene, roomKey),\n  );\n\n  if (socket) {\n    FirebaseSceneVersionCache.set(socket, elements);\n  }\n\n  return restoreElements(elements, null);\n};\n\nexport const loadFilesFromFirebase = async (\n  prefix: string,\n  decryptionKey: string,\n  filesIds: readonly FileId[],\n) => {\n  const loadedFiles: BinaryFileData[] = [];\n  const erroredFiles = new Map<FileId, true>();\n\n  await Promise.all(\n    [...new Set(filesIds)].map(async (id) => {\n      try {\n        const url = `https://firebasestorage.googleapis.com/v0/b/${\n          FIREBASE_CONFIG.storageBucket\n        }/o/${encodeURIComponent(prefix.replace(/^\\//, \"\"))}%2F${id}`;\n        const response = await fetch(`${url}?alt=media`);\n        if (response.status < 400) {\n          const arrayBuffer = await response.arrayBuffer();\n\n          const { data, metadata } = await decompressData<BinaryFileMetadata>(\n            new Uint8Array(arrayBuffer),\n            {\n              decryptionKey,\n            },\n          );\n\n          const dataURL = new TextDecoder().decode(data) as DataURL;\n\n          loadedFiles.push({\n            mimeType: metadata.mimeType || MIME_TYPES.binary,\n            id,\n            dataURL,\n            created: metadata?.created || Date.now(),\n            lastRetrieved: metadata?.created || Date.now(),\n          });\n        } else {\n          erroredFiles.set(id, true);\n        }\n      } catch (error: any) {\n        erroredFiles.set(id, true);\n        console.error(error);\n      }\n    }),\n  );\n\n  return { loadedFiles, erroredFiles };\n};\n","import { compressData } from \"../../data/encode\";\nimport { newElementWith } from \"../../element/mutateElement\";\nimport { isInitializedImageElement } from \"../../element/typeChecks\";\nimport {\n  ExcalidrawElement,\n  ExcalidrawImageElement,\n  FileId,\n  InitializedExcalidrawImageElement,\n} from \"../../element/types\";\nimport { t } from \"../../i18n\";\nimport {\n  BinaryFileData,\n  BinaryFileMetadata,\n  ExcalidrawImperativeAPI,\n  BinaryFiles,\n} from \"../../types\";\n\nexport class FileManager {\n  /** files being fetched */\n  private fetchingFiles = new Map<ExcalidrawImageElement[\"fileId\"], true>();\n  /** files being saved */\n  private savingFiles = new Map<ExcalidrawImageElement[\"fileId\"], true>();\n  /* files already saved to persistent storage */\n  private savedFiles = new Map<ExcalidrawImageElement[\"fileId\"], true>();\n  private erroredFiles = new Map<ExcalidrawImageElement[\"fileId\"], true>();\n\n  private _getFiles;\n  private _saveFiles;\n\n  constructor({\n    getFiles,\n    saveFiles,\n  }: {\n    getFiles: (fileIds: FileId[]) => Promise<{\n      loadedFiles: BinaryFileData[];\n      erroredFiles: Map<FileId, true>;\n    }>;\n    saveFiles: (data: { addedFiles: Map<FileId, BinaryFileData> }) => Promise<{\n      savedFiles: Map<FileId, true>;\n      erroredFiles: Map<FileId, true>;\n    }>;\n  }) {\n    this._getFiles = getFiles;\n    this._saveFiles = saveFiles;\n  }\n\n  /**\n   * returns whether file is already saved or being processed\n   */\n  isFileHandled = (id: FileId) => {\n    return (\n      this.savedFiles.has(id) ||\n      this.fetchingFiles.has(id) ||\n      this.savingFiles.has(id) ||\n      this.erroredFiles.has(id)\n    );\n  };\n\n  isFileSaved = (id: FileId) => {\n    return this.savedFiles.has(id);\n  };\n\n  saveFiles = async ({\n    elements,\n    files,\n  }: {\n    elements: readonly ExcalidrawElement[];\n    files: BinaryFiles;\n  }) => {\n    const addedFiles: Map<FileId, BinaryFileData> = new Map();\n\n    for (const element of elements) {\n      if (\n        isInitializedImageElement(element) &&\n        files[element.fileId] &&\n        !this.isFileHandled(element.fileId)\n      ) {\n        addedFiles.set(element.fileId, files[element.fileId]);\n        this.savingFiles.set(element.fileId, true);\n      }\n    }\n\n    try {\n      const { savedFiles, erroredFiles } = await this._saveFiles({\n        addedFiles,\n      });\n\n      for (const [fileId] of savedFiles) {\n        this.savedFiles.set(fileId, true);\n      }\n\n      return {\n        savedFiles,\n        erroredFiles,\n      };\n    } finally {\n      for (const [fileId] of addedFiles) {\n        this.savingFiles.delete(fileId);\n      }\n    }\n  };\n\n  getFiles = async (\n    ids: FileId[],\n  ): Promise<{\n    loadedFiles: BinaryFileData[];\n    erroredFiles: Map<FileId, true>;\n  }> => {\n    if (!ids.length) {\n      return {\n        loadedFiles: [],\n        erroredFiles: new Map(),\n      };\n    }\n    for (const id of ids) {\n      this.fetchingFiles.set(id, true);\n    }\n\n    try {\n      const { loadedFiles, erroredFiles } = await this._getFiles(ids);\n\n      for (const file of loadedFiles) {\n        this.savedFiles.set(file.id, true);\n      }\n      for (const [fileId] of erroredFiles) {\n        this.erroredFiles.set(fileId, true);\n      }\n\n      return { loadedFiles, erroredFiles };\n    } finally {\n      for (const id of ids) {\n        this.fetchingFiles.delete(id);\n      }\n    }\n  };\n\n  /** a file element prevents unload only if it's being saved regardless of\n   *  its `status`. This ensures that elements who for any reason haven't\n   *  beed set to `saved` status don't prevent unload in future sessions.\n   *  Technically we should prevent unload when the origin client haven't\n   *  yet saved the `status` update to storage, but that should be taken care\n   *  of during regular beforeUnload unsaved files check.\n   */\n  shouldPreventUnload = (elements: readonly ExcalidrawElement[]) => {\n    return elements.some((element) => {\n      return (\n        isInitializedImageElement(element) &&\n        !element.isDeleted &&\n        this.savingFiles.has(element.fileId)\n      );\n    });\n  };\n\n  /**\n   * helper to determine if image element status needs updating\n   */\n  shouldUpdateImageElementStatus = (\n    element: ExcalidrawElement,\n  ): element is InitializedExcalidrawImageElement => {\n    return (\n      isInitializedImageElement(element) &&\n      this.isFileSaved(element.fileId) &&\n      element.status === \"pending\"\n    );\n  };\n\n  reset() {\n    this.fetchingFiles.clear();\n    this.savingFiles.clear();\n    this.savedFiles.clear();\n    this.erroredFiles.clear();\n  }\n}\n\nexport const encodeFilesForUpload = async ({\n  files,\n  maxBytes,\n  encryptionKey,\n}: {\n  files: Map<FileId, BinaryFileData>;\n  maxBytes: number;\n  encryptionKey: string;\n}) => {\n  const processedFiles: {\n    id: FileId;\n    buffer: Uint8Array;\n  }[] = [];\n\n  for (const [id, fileData] of files) {\n    const buffer = new TextEncoder().encode(fileData.dataURL);\n\n    const encodedFile = await compressData<BinaryFileMetadata>(buffer, {\n      encryptionKey,\n      metadata: {\n        id,\n        mimeType: fileData.mimeType,\n        created: Date.now(),\n        lastRetrieved: Date.now(),\n      },\n    });\n\n    if (buffer.byteLength > maxBytes) {\n      throw new Error(\n        t(\"errors.fileTooBig\", {\n          maxSize: `${Math.trunc(maxBytes / 1024 / 1024)}MB`,\n        }),\n      );\n    }\n\n    processedFiles.push({\n      id,\n      buffer: encodedFile,\n    });\n  }\n\n  return processedFiles;\n};\n\nexport const updateStaleImageStatuses = (params: {\n  excalidrawAPI: ExcalidrawImperativeAPI;\n  erroredFiles: Map<FileId, true>;\n  elements: readonly ExcalidrawElement[];\n}) => {\n  if (!params.erroredFiles.size) {\n    return;\n  }\n  params.excalidrawAPI.updateScene({\n    elements: params.excalidrawAPI\n      .getSceneElementsIncludingDeleted()\n      .map((element) => {\n        if (\n          isInitializedImageElement(element) &&\n          params.erroredFiles.has(element.fileId)\n        ) {\n          return newElementWith(element, {\n            status: \"error\",\n          });\n        }\n        return element;\n      }),\n  });\n};\n","import { PRECEDING_ELEMENT_KEY } from \"../../constants\";\nimport { ExcalidrawElement } from \"../../element/types\";\nimport { AppState } from \"../../types\";\nimport { arrayToMapWithIndex } from \"../../utils\";\n\nexport type ReconciledElements = readonly ExcalidrawElement[] & {\n  _brand: \"reconciledElements\";\n};\n\nexport type BroadcastedExcalidrawElement = ExcalidrawElement & {\n  [PRECEDING_ELEMENT_KEY]?: string;\n};\n\nconst shouldDiscardRemoteElement = (\n  localAppState: AppState,\n  local: ExcalidrawElement | undefined,\n  remote: BroadcastedExcalidrawElement,\n): boolean => {\n  if (\n    local &&\n    // local element is being edited\n    (local.id === localAppState.editingElement?.id ||\n      local.id === localAppState.resizingElement?.id ||\n      local.id === localAppState.draggingElement?.id ||\n      // local element is newer\n      local.version > remote.version ||\n      // resolve conflicting edits deterministically by taking the one with\n      // the lowest versionNonce\n      (local.version === remote.version &&\n        local.versionNonce < remote.versionNonce))\n  ) {\n    return true;\n  }\n  return false;\n};\n\nexport const reconcileElements = (\n  localElements: readonly ExcalidrawElement[],\n  remoteElements: readonly BroadcastedExcalidrawElement[],\n  localAppState: AppState,\n): ReconciledElements => {\n  const localElementsData =\n    arrayToMapWithIndex<ExcalidrawElement>(localElements);\n\n  const reconciledElements: ExcalidrawElement[] = localElements.slice();\n\n  const duplicates = new WeakMap<ExcalidrawElement, true>();\n\n  let cursor = 0;\n  let offset = 0;\n\n  let remoteElementIdx = -1;\n  for (const remoteElement of remoteElements) {\n    remoteElementIdx++;\n\n    const local = localElementsData.get(remoteElement.id);\n\n    if (shouldDiscardRemoteElement(localAppState, local?.[0], remoteElement)) {\n      if (remoteElement[PRECEDING_ELEMENT_KEY]) {\n        delete remoteElement[PRECEDING_ELEMENT_KEY];\n      }\n\n      continue;\n    }\n\n    // Mark duplicate for removal as it'll be replaced with the remote element\n    if (local) {\n      // Unless the ramote and local elements are the same element in which case\n      // we need to keep it as we'd otherwise discard it from the resulting\n      // array.\n      if (local[0] === remoteElement) {\n        continue;\n      }\n      duplicates.set(local[0], true);\n    }\n\n    // parent may not be defined in case the remote client is running an older\n    // excalidraw version\n    const parent =\n      remoteElement[PRECEDING_ELEMENT_KEY] ||\n      remoteElements[remoteElementIdx - 1]?.id ||\n      null;\n\n    if (parent != null) {\n      delete remoteElement[PRECEDING_ELEMENT_KEY];\n\n      // ^ indicates the element is the first in elements array\n      if (parent === \"^\") {\n        offset++;\n        if (cursor === 0) {\n          reconciledElements.unshift(remoteElement);\n          localElementsData.set(remoteElement.id, [\n            remoteElement,\n            cursor - offset,\n          ]);\n        } else {\n          reconciledElements.splice(cursor + 1, 0, remoteElement);\n          localElementsData.set(remoteElement.id, [\n            remoteElement,\n            cursor + 1 - offset,\n          ]);\n          cursor++;\n        }\n      } else {\n        let idx = localElementsData.has(parent)\n          ? localElementsData.get(parent)![1]\n          : null;\n        if (idx != null) {\n          idx += offset;\n        }\n        if (idx != null && idx >= cursor) {\n          reconciledElements.splice(idx + 1, 0, remoteElement);\n          offset++;\n          localElementsData.set(remoteElement.id, [\n            remoteElement,\n            idx + 1 - offset,\n          ]);\n          cursor = idx + 1;\n        } else if (idx != null) {\n          reconciledElements.splice(cursor + 1, 0, remoteElement);\n          offset++;\n          localElementsData.set(remoteElement.id, [\n            remoteElement,\n            cursor + 1 - offset,\n          ]);\n          cursor++;\n        } else {\n          reconciledElements.push(remoteElement);\n          localElementsData.set(remoteElement.id, [\n            remoteElement,\n            reconciledElements.length - 1 - offset,\n          ]);\n        }\n      }\n      // no parent z-index information, local element exists → replace in place\n    } else if (local) {\n      reconciledElements[local[1]] = remoteElement;\n      localElementsData.set(remoteElement.id, [remoteElement, local[1]]);\n      // otherwise push to the end\n    } else {\n      reconciledElements.push(remoteElement);\n      localElementsData.set(remoteElement.id, [\n        remoteElement,\n        reconciledElements.length - 1 - offset,\n      ]);\n    }\n  }\n\n  const ret: readonly ExcalidrawElement[] = reconciledElements.filter(\n    (element) => !duplicates.has(element),\n  );\n\n  return ret as ReconciledElements;\n};\n","import { compressData, decompressData } from \"../../data/encode\";\nimport {\n  decryptData,\n  generateEncryptionKey,\n  IV_LENGTH_BYTES,\n} from \"../../data/encryption\";\nimport { serializeAsJSON } from \"../../data/json\";\nimport { restore } from \"../../data/restore\";\nimport { ImportedDataState } from \"../../data/types\";\nimport { isInvisiblySmallElement } from \"../../element/sizeHelpers\";\nimport { isInitializedImageElement } from \"../../element/typeChecks\";\nimport { ExcalidrawElement, FileId } from \"../../element/types\";\nimport { t } from \"../../i18n\";\nimport {\n  AppState,\n  BinaryFileData,\n  BinaryFiles,\n  UserIdleState,\n} from \"../../types\";\nimport { bytesToHexString } from \"../../utils\";\nimport {\n  DELETED_ELEMENT_TIMEOUT,\n  FILE_UPLOAD_MAX_BYTES,\n  ROOM_ID_BYTES,\n} from \"../app_constants\";\nimport { encodeFilesForUpload } from \"./FileManager\";\nimport { saveFilesToFirebase } from \"./firebase\";\n\nexport type SyncableExcalidrawElement = ExcalidrawElement & {\n  _brand: \"SyncableExcalidrawElement\";\n};\n\nexport const isSyncableElement = (\n  element: ExcalidrawElement,\n): element is SyncableExcalidrawElement => {\n  if (element.isDeleted) {\n    if (element.updated > Date.now() - DELETED_ELEMENT_TIMEOUT) {\n      return true;\n    }\n    return false;\n  }\n  return !isInvisiblySmallElement(element);\n};\n\nexport const getSyncableElements = (elements: readonly ExcalidrawElement[]) =>\n  elements.filter((element) =>\n    isSyncableElement(element),\n  ) as SyncableExcalidrawElement[];\n\nconst BACKEND_V2_GET = process.env.REACT_APP_BACKEND_V2_GET_URL;\nconst BACKEND_V2_POST = process.env.REACT_APP_BACKEND_V2_POST_URL;\n\nconst generateRoomId = async () => {\n  const buffer = new Uint8Array(ROOM_ID_BYTES);\n  window.crypto.getRandomValues(buffer);\n  return bytesToHexString(buffer);\n};\n\n/**\n * Right now the reason why we resolve connection params (url, polling...)\n * from upstream is to allow changing the params immediately when needed without\n * having to wait for clients to update the SW.\n *\n * If REACT_APP_WS_SERVER_URL env is set, we use that instead (useful for forks)\n */\nexport const getCollabServer = async (): Promise<{\n  url: string;\n  polling: boolean;\n}> => {\n  if (process.env.REACT_APP_WS_SERVER_URL) {\n    return {\n      url: process.env.REACT_APP_WS_SERVER_URL,\n      polling: true,\n    };\n  }\n\n  try {\n    const resp = await fetch(\n      `${process.env.REACT_APP_PORTAL_URL}/collab-server`,\n    );\n    return await resp.json();\n  } catch (error) {\n    console.error(error);\n    throw new Error(t(\"errors.cannotResolveCollabServer\"));\n  }\n};\n\nexport type EncryptedData = {\n  data: ArrayBuffer;\n  iv: Uint8Array;\n};\n\nexport type SocketUpdateDataSource = {\n  SCENE_INIT: {\n    type: \"SCENE_INIT\";\n    payload: {\n      elements: readonly ExcalidrawElement[];\n    };\n  };\n  SCENE_UPDATE: {\n    type: \"SCENE_UPDATE\";\n    payload: {\n      elements: readonly ExcalidrawElement[];\n    };\n  };\n  MOUSE_LOCATION: {\n    type: \"MOUSE_LOCATION\";\n    payload: {\n      socketId: string;\n      pointer: { x: number; y: number };\n      button: \"down\" | \"up\";\n      selectedElementIds: AppState[\"selectedElementIds\"];\n      username: string;\n    };\n  };\n  IDLE_STATUS: {\n    type: \"IDLE_STATUS\";\n    payload: {\n      socketId: string;\n      userState: UserIdleState;\n      username: string;\n    };\n  };\n};\n\nexport type SocketUpdateDataIncoming =\n  | SocketUpdateDataSource[keyof SocketUpdateDataSource]\n  | {\n      type: \"INVALID_RESPONSE\";\n    };\n\nexport type SocketUpdateData =\n  SocketUpdateDataSource[keyof SocketUpdateDataSource] & {\n    _brand: \"socketUpdateData\";\n  };\n\nconst RE_COLLAB_LINK = /^#room=([a-zA-Z0-9_-]+),([a-zA-Z0-9_-]+)$/;\n\nexport const isCollaborationLink = (link: string) => {\n  const hash = new URL(link).hash;\n  return RE_COLLAB_LINK.test(hash);\n};\n\nexport const getCollaborationLinkData = (link: string) => {\n  const hash = new URL(link).hash;\n  const match = hash.match(RE_COLLAB_LINK);\n  if (match && match[2].length !== 22) {\n    window.alert(t(\"alerts.invalidEncryptionKey\"));\n    return null;\n  }\n  return match ? { roomId: match[1], roomKey: match[2] } : null;\n};\n\nexport const generateCollaborationLinkData = async () => {\n  const roomId = await generateRoomId();\n  const roomKey = await generateEncryptionKey();\n\n  if (!roomKey) {\n    throw new Error(\"Couldn't generate room key\");\n  }\n\n  return { roomId, roomKey };\n};\n\nexport const getCollaborationLink = (data: {\n  roomId: string;\n  roomKey: string;\n}) => {\n  return `${window.location.origin}${window.location.pathname}#room=${data.roomId},${data.roomKey}`;\n};\n\n/**\n * Decodes shareLink data using the legacy buffer format.\n * @deprecated\n */\nconst legacy_decodeFromBackend = async ({\n  buffer,\n  decryptionKey,\n}: {\n  buffer: ArrayBuffer;\n  decryptionKey: string;\n}) => {\n  let decrypted: ArrayBuffer;\n\n  try {\n    // Buffer should contain both the IV (fixed length) and encrypted data\n    const iv = buffer.slice(0, IV_LENGTH_BYTES);\n    const encrypted = buffer.slice(IV_LENGTH_BYTES, buffer.byteLength);\n    decrypted = await decryptData(new Uint8Array(iv), encrypted, decryptionKey);\n  } catch (error: any) {\n    // Fixed IV (old format, backward compatibility)\n    const fixedIv = new Uint8Array(IV_LENGTH_BYTES);\n    decrypted = await decryptData(fixedIv, buffer, decryptionKey);\n  }\n\n  // We need to convert the decrypted array buffer to a string\n  const string = new window.TextDecoder(\"utf-8\").decode(\n    new Uint8Array(decrypted),\n  );\n  const data: ImportedDataState = JSON.parse(string);\n\n  return {\n    elements: data.elements || null,\n    appState: data.appState || null,\n  };\n};\n\nconst importFromBackend = async (\n  id: string,\n  decryptionKey: string,\n): Promise<ImportedDataState> => {\n  try {\n    const response = await fetch(`${BACKEND_V2_GET}${id}`);\n\n    if (!response.ok) {\n      window.alert(t(\"alerts.importBackendFailed\"));\n      return {};\n    }\n    const buffer = await response.arrayBuffer();\n\n    try {\n      const { data: decodedBuffer } = await decompressData(\n        new Uint8Array(buffer),\n        {\n          decryptionKey,\n        },\n      );\n      const data: ImportedDataState = JSON.parse(\n        new TextDecoder().decode(decodedBuffer),\n      );\n\n      return {\n        elements: data.elements || null,\n        appState: data.appState || null,\n      };\n    } catch (error: any) {\n      console.warn(\n        \"error when decoding shareLink data using the new format:\",\n        error,\n      );\n      return legacy_decodeFromBackend({ buffer, decryptionKey });\n    }\n  } catch (error: any) {\n    window.alert(t(\"alerts.importBackendFailed\"));\n    console.error(error);\n    return {};\n  }\n};\n\nexport const loadScene = async (\n  id: string | null,\n  privateKey: string | null,\n  // Supply local state even if importing from backend to ensure we restore\n  // localStorage user settings which we do not persist on server.\n  // Non-optional so we don't forget to pass it even if `undefined`.\n  localDataState: ImportedDataState | undefined | null,\n) => {\n  let data;\n  if (id != null && privateKey != null) {\n    // the private key is used to decrypt the content from the server, take\n    // extra care not to leak it\n    data = restore(\n      await importFromBackend(id, privateKey),\n      localDataState?.appState,\n      localDataState?.elements,\n      { repairBindings: true },\n    );\n  } else {\n    data = restore(localDataState || null, null, null, {\n      repairBindings: true,\n    });\n  }\n\n  return {\n    elements: data.elements,\n    appState: data.appState,\n    // note: this will always be empty because we're not storing files\n    // in the scene database/localStorage, and instead fetch them async\n    // from a different database\n    files: data.files,\n    commitToHistory: false,\n  };\n};\n\nexport const exportToBackend = async (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles,\n) => {\n  const encryptionKey = await generateEncryptionKey(\"string\");\n\n  const payload = await compressData(\n    new TextEncoder().encode(\n      serializeAsJSON(elements, appState, files, \"database\"),\n    ),\n    { encryptionKey },\n  );\n\n  try {\n    const filesMap = new Map<FileId, BinaryFileData>();\n    for (const element of elements) {\n      if (isInitializedImageElement(element) && files[element.fileId]) {\n        filesMap.set(element.fileId, files[element.fileId]);\n      }\n    }\n\n    const filesToUpload = await encodeFilesForUpload({\n      files: filesMap,\n      encryptionKey,\n      maxBytes: FILE_UPLOAD_MAX_BYTES,\n    });\n\n    const response = await fetch(BACKEND_V2_POST, {\n      method: \"POST\",\n      body: payload.buffer,\n    });\n    const json = await response.json();\n    if (json.id) {\n      const url = new URL(window.location.href);\n      // We need to store the key (and less importantly the id) as hash instead\n      // of queryParam in order to never send it to the server\n      url.hash = `json=${json.id},${encryptionKey}`;\n      const urlString = url.toString();\n\n      await saveFilesToFirebase({\n        prefix: `/files/shareLinks/${json.id}`,\n        files: filesToUpload,\n      });\n\n      window.prompt(`🔒${t(\"alerts.uploadedSecurly\")}`, urlString);\n    } else if (json.error_class === \"RequestTooLargeError\") {\n      window.alert(t(\"alerts.couldNotCreateShareableLinkTooBig\"));\n    } else {\n      window.alert(t(\"alerts.couldNotCreateShareableLink\"));\n    }\n  } catch (error: any) {\n    console.error(error);\n    window.alert(t(\"alerts.couldNotCreateShareableLink\"));\n  }\n};\n","import { ExcalidrawElement } from \"../../element/types\";\nimport { AppState } from \"../../types\";\nimport {\n  clearAppStateForLocalStorage,\n  getDefaultAppState,\n} from \"../../appState\";\nimport { clearElementsForLocalStorage } from \"../../element\";\nimport { STORAGE_KEYS } from \"../app_constants\";\nimport { ImportedDataState } from \"../../data/types\";\n\nexport const saveUsernameToLocalStorage = (username: string) => {\n  try {\n    localStorage.setItem(\n      STORAGE_KEYS.LOCAL_STORAGE_COLLAB,\n      JSON.stringify({ username }),\n    );\n  } catch (error: any) {\n    // Unable to access window.localStorage\n    console.error(error);\n  }\n};\n\nexport const importUsernameFromLocalStorage = (): string | null => {\n  try {\n    const data = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_COLLAB);\n    if (data) {\n      return JSON.parse(data).username;\n    }\n  } catch (error: any) {\n    // Unable to access localStorage\n    console.error(error);\n  }\n\n  return null;\n};\n\nexport const importFromLocalStorage = () => {\n  let savedElements = null;\n  let savedState = null;\n\n  try {\n    savedElements = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS);\n    savedState = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_APP_STATE);\n  } catch (error: any) {\n    // Unable to access localStorage\n    console.error(error);\n  }\n\n  let elements: ExcalidrawElement[] = [];\n  if (savedElements) {\n    try {\n      elements = clearElementsForLocalStorage(JSON.parse(savedElements));\n    } catch (error: any) {\n      console.error(error);\n      // Do nothing because elements array is already empty\n    }\n  }\n\n  let appState = null;\n  if (savedState) {\n    try {\n      appState = {\n        ...getDefaultAppState(),\n        ...clearAppStateForLocalStorage(\n          JSON.parse(savedState) as Partial<AppState>,\n        ),\n      };\n    } catch (error: any) {\n      console.error(error);\n      // Do nothing because appState is already null\n    }\n  }\n  return { elements, appState };\n};\n\nexport const getElementsStorageSize = () => {\n  try {\n    const elements = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS);\n    const elementsSize = elements?.length || 0;\n    return elementsSize;\n  } catch (error: any) {\n    console.error(error);\n    return 0;\n  }\n};\n\nexport const getTotalStorageSize = () => {\n  try {\n    const appState = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_APP_STATE);\n    const collab = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_COLLAB);\n    const library = localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY);\n\n    const appStateSize = appState?.length || 0;\n    const collabSize = collab?.length || 0;\n    const librarySize = library?.length || 0;\n\n    return appStateSize + collabSize + librarySize + getElementsStorageSize();\n  } catch (error: any) {\n    console.error(error);\n    return 0;\n  }\n};\n\nexport const getLibraryItemsFromStorage = () => {\n  try {\n    const libraryItems: ImportedDataState[\"libraryItems\"] = JSON.parse(\n      localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY) as string,\n    );\n\n    return libraryItems || [];\n  } catch (error) {\n    console.error(error);\n    return [];\n  }\n};\n","import {\n  isSyncableElement,\n  SocketUpdateData,\n  SocketUpdateDataSource,\n} from \"../data\";\n\nimport { TCollabClass } from \"./Collab\";\n\nimport { ExcalidrawElement } from \"../../element/types\";\nimport {\n  WS_EVENTS,\n  FILE_UPLOAD_TIMEOUT,\n  WS_SCENE_EVENT_TYPES,\n} from \"../app_constants\";\nimport { UserIdleState } from \"../../types\";\nimport { trackEvent } from \"../../analytics\";\nimport throttle from \"lodash.throttle\";\nimport { newElementWith } from \"../../element/mutateElement\";\nimport { BroadcastedExcalidrawElement } from \"./reconciliation\";\nimport { encryptData } from \"../../data/encryption\";\nimport { PRECEDING_ELEMENT_KEY } from \"../../constants\";\n\nclass Portal {\n  collab: TCollabClass;\n  socket: SocketIOClient.Socket | null = null;\n  socketInitialized: boolean = false; // we don't want the socket to emit any updates until it is fully initialized\n  roomId: string | null = null;\n  roomKey: string | null = null;\n  broadcastedElementVersions: Map<string, number> = new Map();\n\n  constructor(collab: TCollabClass) {\n    this.collab = collab;\n  }\n\n  open(socket: SocketIOClient.Socket, id: string, key: string) {\n    this.socket = socket;\n    this.roomId = id;\n    this.roomKey = key;\n\n    // Initialize socket listeners\n    this.socket.on(\"init-room\", () => {\n      if (this.socket) {\n        this.socket.emit(\"join-room\", this.roomId);\n        trackEvent(\"share\", \"room joined\");\n      }\n    });\n    this.socket.on(\"new-user\", async (_socketId: string) => {\n      this.broadcastScene(\n        WS_SCENE_EVENT_TYPES.INIT,\n        this.collab.getSceneElementsIncludingDeleted(),\n        /* syncAll */ true,\n      );\n    });\n    this.socket.on(\"room-user-change\", (clients: string[]) => {\n      this.collab.setCollaborators(clients);\n    });\n\n    return socket;\n  }\n\n  close() {\n    if (!this.socket) {\n      return;\n    }\n    this.queueFileUpload.flush();\n    this.socket.close();\n    this.socket = null;\n    this.roomId = null;\n    this.roomKey = null;\n    this.socketInitialized = false;\n    this.broadcastedElementVersions = new Map();\n  }\n\n  isOpen() {\n    return !!(\n      this.socketInitialized &&\n      this.socket &&\n      this.roomId &&\n      this.roomKey\n    );\n  }\n\n  async _broadcastSocketData(\n    data: SocketUpdateData,\n    volatile: boolean = false,\n  ) {\n    if (this.isOpen()) {\n      const json = JSON.stringify(data);\n      const encoded = new TextEncoder().encode(json);\n      const { encryptedBuffer, iv } = await encryptData(this.roomKey!, encoded);\n\n      this.socket?.emit(\n        volatile ? WS_EVENTS.SERVER_VOLATILE : WS_EVENTS.SERVER,\n        this.roomId,\n        encryptedBuffer,\n        iv,\n      );\n    }\n  }\n\n  queueFileUpload = throttle(async () => {\n    try {\n      await this.collab.fileManager.saveFiles({\n        elements: this.collab.excalidrawAPI.getSceneElementsIncludingDeleted(),\n        files: this.collab.excalidrawAPI.getFiles(),\n      });\n    } catch (error: any) {\n      if (error.name !== \"AbortError\") {\n        this.collab.excalidrawAPI.updateScene({\n          appState: {\n            errorMessage: error.message,\n          },\n        });\n      }\n    }\n\n    this.collab.excalidrawAPI.updateScene({\n      elements: this.collab.excalidrawAPI\n        .getSceneElementsIncludingDeleted()\n        .map((element) => {\n          if (this.collab.fileManager.shouldUpdateImageElementStatus(element)) {\n            // this will signal collaborators to pull image data from server\n            // (using mutation instead of newElementWith otherwise it'd break\n            // in-progress dragging)\n            return newElementWith(element, { status: \"saved\" });\n          }\n          return element;\n        }),\n    });\n  }, FILE_UPLOAD_TIMEOUT);\n\n  broadcastScene = async (\n    updateType: WS_SCENE_EVENT_TYPES.INIT | WS_SCENE_EVENT_TYPES.UPDATE,\n    allElements: readonly ExcalidrawElement[],\n    syncAll: boolean,\n  ) => {\n    if (updateType === WS_SCENE_EVENT_TYPES.INIT && !syncAll) {\n      throw new Error(\"syncAll must be true when sending SCENE.INIT\");\n    }\n\n    // sync out only the elements we think we need to to save bandwidth.\n    // periodically we'll resync the whole thing to make sure no one diverges\n    // due to a dropped message (server goes down etc).\n    const syncableElements = allElements.reduce(\n      (acc, element: BroadcastedExcalidrawElement, idx, elements) => {\n        if (\n          (syncAll ||\n            !this.broadcastedElementVersions.has(element.id) ||\n            element.version >\n              this.broadcastedElementVersions.get(element.id)!) &&\n          isSyncableElement(element)\n        ) {\n          acc.push({\n            ...element,\n            // z-index info for the reconciler\n            [PRECEDING_ELEMENT_KEY]: idx === 0 ? \"^\" : elements[idx - 1]?.id,\n          });\n        }\n        return acc;\n      },\n      [] as BroadcastedExcalidrawElement[],\n    );\n\n    const data: SocketUpdateDataSource[typeof updateType] = {\n      type: updateType,\n      payload: {\n        elements: syncableElements,\n      },\n    };\n\n    for (const syncableElement of syncableElements) {\n      this.broadcastedElementVersions.set(\n        syncableElement.id,\n        syncableElement.version,\n      );\n    }\n\n    this.queueFileUpload();\n\n    await this._broadcastSocketData(data as SocketUpdateData);\n  };\n\n  broadcastIdleChange = (userState: UserIdleState) => {\n    if (this.socket?.id) {\n      const data: SocketUpdateDataSource[\"IDLE_STATUS\"] = {\n        type: \"IDLE_STATUS\",\n        payload: {\n          socketId: this.socket.id,\n          userState,\n          username: this.collab.state.username,\n        },\n      };\n      return this._broadcastSocketData(\n        data as SocketUpdateData,\n        true, // volatile\n      );\n    }\n  };\n\n  broadcastMouseLocation = (payload: {\n    pointer: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"pointer\"];\n    button: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"button\"];\n  }) => {\n    if (this.socket?.id) {\n      const data: SocketUpdateDataSource[\"MOUSE_LOCATION\"] = {\n        type: \"MOUSE_LOCATION\",\n        payload: {\n          socketId: this.socket.id,\n          pointer: payload.pointer,\n          button: payload.button || \"up\",\n          selectedElementIds:\n            this.collab.excalidrawAPI.getAppState().selectedElementIds,\n          username: this.collab.state.username,\n        },\n      };\n      return this._broadcastSocketData(\n        data as SocketUpdateData,\n        true, // volatile\n      );\n    }\n  };\n}\n\nexport default Portal;\n","import React, { useRef } from \"react\";\nimport { copyTextToSystemClipboard } from \"../../clipboard\";\nimport { Dialog } from \"../../components/Dialog\";\nimport {\n  clipboard,\n  start,\n  stop,\n  share,\n  shareIOS,\n  shareWindows,\n} from \"../../components/icons\";\nimport { ToolButton } from \"../../components/ToolButton\";\nimport \"./RoomDialog.scss\";\nimport Stack from \"../../components/Stack\";\nimport { AppState } from \"../../types\";\nimport { trackEvent } from \"../../analytics\";\nimport { getFrame } from \"../../utils\";\nimport DialogActionButton from \"../../components/DialogActionButton\";\nimport { useI18n } from \"../../i18n\";\n\nconst getShareIcon = () => {\n  const navigator = window.navigator as any;\n  const isAppleBrowser = /Apple/.test(navigator.vendor);\n  const isWindowsBrowser = navigator.appVersion.indexOf(\"Win\") !== -1;\n\n  if (isAppleBrowser) {\n    return shareIOS;\n  } else if (isWindowsBrowser) {\n    return shareWindows;\n  }\n\n  return share;\n};\n\nconst RoomDialog = ({\n  handleClose,\n  activeRoomLink,\n  username,\n  onUsernameChange,\n  onRoomCreate,\n  onRoomDestroy,\n  setErrorMessage,\n  theme,\n}: {\n  handleClose: () => void;\n  activeRoomLink: string;\n  username: string;\n  onUsernameChange: (username: string) => void;\n  onRoomCreate: () => void;\n  onRoomDestroy: () => void;\n  setErrorMessage: (message: string) => void;\n  theme: AppState[\"theme\"];\n}) => {\n  const { t } = useI18n();\n  const roomLinkInput = useRef<HTMLInputElement>(null);\n\n  const copyRoomLink = async () => {\n    try {\n      await copyTextToSystemClipboard(activeRoomLink);\n    } catch (error: any) {\n      setErrorMessage(error.message);\n    }\n    if (roomLinkInput.current) {\n      roomLinkInput.current.select();\n    }\n  };\n\n  const shareRoomLink = async () => {\n    try {\n      await navigator.share({\n        title: t(\"roomDialog.shareTitle\"),\n        text: t(\"roomDialog.shareTitle\"),\n        url: activeRoomLink,\n      });\n    } catch (error: any) {\n      // Just ignore.\n    }\n  };\n\n  const selectInput = (event: React.MouseEvent<HTMLInputElement>) => {\n    if (event.target !== document.activeElement) {\n      event.preventDefault();\n      (event.target as HTMLInputElement).select();\n    }\n  };\n\n  const renderRoomDialog = () => {\n    return (\n      <div className=\"RoomDialog-modal\">\n        {!activeRoomLink && (\n          <>\n            <p>{t(\"roomDialog.desc_intro\")}</p>\n            <p>{`🔒 ${t(\"roomDialog.desc_privacy\")}`}</p>\n            <div className=\"RoomDialog-sessionStartButtonContainer\">\n              <DialogActionButton\n                label={t(\"roomDialog.button_startSession\")}\n                onClick={() => {\n                  trackEvent(\"share\", \"room creation\", `ui (${getFrame()})`);\n                  onRoomCreate();\n                }}\n              >\n                {start}\n              </DialogActionButton>\n            </div>\n          </>\n        )}\n        {activeRoomLink && (\n          <>\n            <p>{t(\"roomDialog.desc_inProgressIntro\")}</p>\n            <p>{t(\"roomDialog.desc_shareLink\")}</p>\n            <div className=\"RoomDialog-linkContainer\">\n              <Stack.Row gap={2}>\n                {\"share\" in navigator ? (\n                  <ToolButton\n                    className=\"RoomDialog__button\"\n                    type=\"button\"\n                    icon={getShareIcon()}\n                    title={t(\"labels.share\")}\n                    aria-label={t(\"labels.share\")}\n                    onClick={shareRoomLink}\n                  />\n                ) : null}\n                <ToolButton\n                  className=\"RoomDialog__button\"\n                  type=\"button\"\n                  icon={clipboard}\n                  title={t(\"labels.copy\")}\n                  aria-label={t(\"labels.copy\")}\n                  onClick={copyRoomLink}\n                />\n              </Stack.Row>\n              <input\n                type=\"text\"\n                value={activeRoomLink}\n                readOnly={true}\n                className=\"RoomDialog-link\"\n                ref={roomLinkInput}\n                onPointerDown={selectInput}\n              />\n            </div>\n            <div className=\"RoomDialog-usernameContainer\">\n              <label className=\"RoomDialog-usernameLabel\" htmlFor=\"username\">\n                {t(\"labels.yourName\")}\n              </label>\n              <input\n                type=\"text\"\n                id=\"username\"\n                value={username.trim() || \"\"}\n                className=\"RoomDialog-username TextInput\"\n                onChange={(event) => onUsernameChange(event.target.value)}\n                onKeyPress={(event) => event.key === \"Enter\" && handleClose()}\n              />\n            </div>\n            <p>\n              <span role=\"img\" aria-hidden=\"true\" className=\"RoomDialog-emoji\">\n                {\"🔒\"}\n              </span>{\" \"}\n              {t(\"roomDialog.desc_privacy\")}\n            </p>\n            <p>{t(\"roomDialog.desc_exitSession\")}</p>\n            <div className=\"RoomDialog-sessionStartButtonContainer\">\n              <DialogActionButton\n                actionType=\"danger\"\n                label={t(\"roomDialog.button_stopSession\")}\n                onClick={() => {\n                  trackEvent(\"share\", \"room closed\");\n                  onRoomDestroy();\n                }}\n              >\n                {stop}\n              </DialogActionButton>\n            </div>\n          </>\n        )}\n      </div>\n    );\n  };\n  return (\n    <Dialog\n      small\n      onCloseRequest={handleClose}\n      title={t(\"labels.liveCollaboration\")}\n      theme={theme}\n    >\n      {renderRoomDialog()}\n    </Dialog>\n  );\n};\n\nexport default RoomDialog;\n","import { STORAGE_KEYS } from \"../app_constants\";\n\n// in-memory state (this tab's current state) versions. Currently just\n// timestamps of the last time the state was saved to browser storage.\nconst LOCAL_STATE_VERSIONS = {\n  [STORAGE_KEYS.VERSION_DATA_STATE]: -1,\n  [STORAGE_KEYS.VERSION_FILES]: -1,\n};\n\ntype BrowserStateTypes = keyof typeof LOCAL_STATE_VERSIONS;\n\nexport const isBrowserStorageStateNewer = (type: BrowserStateTypes) => {\n  const storageTimestamp = JSON.parse(localStorage.getItem(type) || \"-1\");\n  return storageTimestamp > LOCAL_STATE_VERSIONS[type];\n};\n\nexport const updateBrowserStateVersion = (type: BrowserStateTypes) => {\n  const timestamp = Date.now();\n  localStorage.setItem(type, JSON.stringify(timestamp));\n  LOCAL_STATE_VERSIONS[type] = timestamp;\n};\n\nexport const resetBrowserStateVersions = () => {\n  for (const key of Object.keys(LOCAL_STATE_VERSIONS) as BrowserStateTypes[]) {\n    const timestamp = -1;\n    localStorage.setItem(key, JSON.stringify(timestamp));\n    LOCAL_STATE_VERSIONS[key] = timestamp;\n  }\n};\n","/**\n * Work around Safari 14 IndexedDB open bug.\n *\n * Safari has a horrible bug where IDB requests can hang while the browser is starting up. https://bugs.webkit.org/show_bug.cgi?id=226547\n * The only solution is to keep nudging it until it's awake.\n */\nfunction idbReady() {\n    var isSafari = !navigator.userAgentData &&\n        /Safari\\//.test(navigator.userAgent) &&\n        !/Chrom(e|ium)\\//.test(navigator.userAgent);\n    // No point putting other browsers or older versions of Safari through this mess.\n    if (!isSafari || !indexedDB.databases)\n        return Promise.resolve();\n    var intervalId;\n    return new Promise(function (resolve) {\n        var tryIdb = function () { return indexedDB.databases().finally(resolve); };\n        intervalId = setInterval(tryIdb, 100);\n        tryIdb();\n    }).finally(function () { return clearInterval(intervalId); });\n}\n\nexport default idbReady;\n","import safariFix from 'safari-14-idb-fix';\n\nfunction promisifyRequest(request) {\n    return new Promise((resolve, reject) => {\n        // @ts-ignore - file size hacks\n        request.oncomplete = request.onsuccess = () => resolve(request.result);\n        // @ts-ignore - file size hacks\n        request.onabort = request.onerror = () => reject(request.error);\n    });\n}\nfunction createStore(dbName, storeName) {\n    const dbp = safariFix().then(() => {\n        const request = indexedDB.open(dbName);\n        request.onupgradeneeded = () => request.result.createObjectStore(storeName);\n        return promisifyRequest(request);\n    });\n    return (txMode, callback) => dbp.then((db) => callback(db.transaction(storeName, txMode).objectStore(storeName)));\n}\nlet defaultGetStoreFunc;\nfunction defaultGetStore() {\n    if (!defaultGetStoreFunc) {\n        defaultGetStoreFunc = createStore('keyval-store', 'keyval');\n    }\n    return defaultGetStoreFunc;\n}\n/**\n * Get a value by its key.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction get(key, customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => promisifyRequest(store.get(key)));\n}\n/**\n * Set a value with a key.\n *\n * @param key\n * @param value\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction set(key, value, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        store.put(value, key);\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Set multiple values at once. This is faster than calling set() multiple times.\n * It's also atomic – if one of the pairs can't be added, none will be added.\n *\n * @param entries Array of entries, where each entry is an array of `[key, value]`.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction setMany(entries, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        entries.forEach((entry) => store.put(entry[1], entry[0]));\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Get multiple values by their keys\n *\n * @param keys\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction getMany(keys, customStore = defaultGetStore()) {\n    return customStore('readonly', (store) => Promise.all(keys.map((key) => promisifyRequest(store.get(key)))));\n}\n/**\n * Update a value. This lets you see the old value and update it as an atomic operation.\n *\n * @param key\n * @param updater A callback that takes the old value and returns a new value.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction update(key, updater, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => \n    // Need to create the promise manually.\n    // If I try to chain promises, the transaction closes in browsers\n    // that use a promise polyfill (IE10/11).\n    new Promise((resolve, reject) => {\n        store.get(key).onsuccess = function () {\n            try {\n                store.put(updater(this.result), key);\n                resolve(promisifyRequest(store.transaction));\n            }\n            catch (err) {\n                reject(err);\n            }\n        };\n    }));\n}\n/**\n * Delete a particular key from the store.\n *\n * @param key\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction del(key, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        store.delete(key);\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Delete multiple keys at once.\n *\n * @param keys List of keys to delete.\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction delMany(keys, customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        keys.forEach((key) => store.delete(key));\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Clear all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction clear(customStore = defaultGetStore()) {\n    return customStore('readwrite', (store) => {\n        store.clear();\n        return promisifyRequest(store.transaction);\n    });\n}\nfunction eachCursor(customStore, callback) {\n    return customStore('readonly', (store) => {\n        // This would be store.getAllKeys(), but it isn't supported by Edge or Safari.\n        // And openKeyCursor isn't supported by Safari.\n        store.openCursor().onsuccess = function () {\n            if (!this.result)\n                return;\n            callback(this.result);\n            this.result.continue();\n        };\n        return promisifyRequest(store.transaction);\n    });\n}\n/**\n * Get all keys in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction keys(customStore = defaultGetStore()) {\n    const items = [];\n    return eachCursor(customStore, (cursor) => items.push(cursor.key)).then(() => items);\n}\n/**\n * Get all values in the store.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction values(customStore = defaultGetStore()) {\n    const items = [];\n    return eachCursor(customStore, (cursor) => items.push(cursor.value)).then(() => items);\n}\n/**\n * Get all entries in the store. Each entry is an array of `[key, value]`.\n *\n * @param customStore Method to get a custom store. Use with caution (see the docs).\n */\nfunction entries(customStore = defaultGetStore()) {\n    const items = [];\n    return eachCursor(customStore, (cursor) => items.push([cursor.key, cursor.value])).then(() => items);\n}\n\nexport { clear, createStore, del, delMany, entries, get, getMany, keys, promisifyRequest, set, setMany, update, values };\n","export class Locker<T extends string> {\n  private locks = new Map<T, true>();\n\n  lock = (lockType: T) => {\n    this.locks.set(lockType, true);\n  };\n\n  /** @returns whether no locks remaining */\n  unlock = (lockType: T) => {\n    this.locks.delete(lockType);\n    return !this.isLocked();\n  };\n\n  /** @returns whether some (or specific) locks are present */\n  isLocked(lockType?: T) {\n    return lockType ? this.locks.has(lockType) : !!this.locks.size;\n  }\n}\n","/**\n * This file deals with saving data state (appState, elements, images, ...)\n * locally to the browser.\n *\n * Notes:\n *\n * - DataState refers to full state of the app: appState, elements, images,\n *   though some state is saved separately (collab username, library) for one\n *   reason or another. We also save different data to different sotrage\n *   (localStorage, indexedDB).\n */\n\nimport { createStore, entries, del, getMany, set, setMany } from \"idb-keyval\";\nimport { clearAppStateForLocalStorage } from \"../../appState\";\nimport { clearElementsForLocalStorage } from \"../../element\";\nimport { ExcalidrawElement, FileId } from \"../../element/types\";\nimport { AppState, BinaryFileData, BinaryFiles } from \"../../types\";\nimport { debounce } from \"../../utils\";\nimport { SAVE_TO_LOCAL_STORAGE_TIMEOUT, STORAGE_KEYS } from \"../app_constants\";\nimport { FileManager } from \"./FileManager\";\nimport { Locker } from \"./Locker\";\nimport { updateBrowserStateVersion } from \"./tabSync\";\n\nconst filesStore = createStore(\"files-db\", \"files-store\");\n\nclass LocalFileManager extends FileManager {\n  clearObsoleteFiles = async (opts: { currentFileIds: FileId[] }) => {\n    await entries(filesStore).then((entries) => {\n      for (const [id, imageData] of entries as [FileId, BinaryFileData][]) {\n        // if image is unused (not on canvas) & is older than 1 day, delete it\n        // from storage. We check `lastRetrieved` we care about the last time\n        // the image was used (loaded on canvas), not when it was initially\n        // created.\n        if (\n          (!imageData.lastRetrieved ||\n            Date.now() - imageData.lastRetrieved > 24 * 3600 * 1000) &&\n          !opts.currentFileIds.includes(id as FileId)\n        ) {\n          del(id, filesStore);\n        }\n      }\n    });\n  };\n}\n\nconst saveDataStateToLocalStorage = (\n  elements: readonly ExcalidrawElement[],\n  appState: AppState,\n) => {\n  try {\n    localStorage.setItem(\n      STORAGE_KEYS.LOCAL_STORAGE_ELEMENTS,\n      JSON.stringify(clearElementsForLocalStorage(elements)),\n    );\n    localStorage.setItem(\n      STORAGE_KEYS.LOCAL_STORAGE_APP_STATE,\n      JSON.stringify(clearAppStateForLocalStorage(appState)),\n    );\n    updateBrowserStateVersion(STORAGE_KEYS.VERSION_DATA_STATE);\n  } catch (error: any) {\n    // Unable to access window.localStorage\n    console.error(error);\n  }\n};\n\ntype SavingLockTypes = \"collaboration\";\n\nexport class LocalData {\n  private static _save = debounce(\n    async (\n      elements: readonly ExcalidrawElement[],\n      appState: AppState,\n      files: BinaryFiles,\n      onFilesSaved: () => void,\n    ) => {\n      saveDataStateToLocalStorage(elements, appState);\n\n      await this.fileStorage.saveFiles({\n        elements,\n        files,\n      });\n      onFilesSaved();\n    },\n    SAVE_TO_LOCAL_STORAGE_TIMEOUT,\n  );\n\n  /** Saves DataState, including files. Bails if saving is paused */\n  static save = (\n    elements: readonly ExcalidrawElement[],\n    appState: AppState,\n    files: BinaryFiles,\n    onFilesSaved: () => void,\n  ) => {\n    // we need to make the `isSavePaused` check synchronously (undebounced)\n    if (!this.isSavePaused()) {\n      this._save(elements, appState, files, onFilesSaved);\n    }\n  };\n\n  static flushSave = () => {\n    this._save.flush();\n  };\n\n  private static locker = new Locker<SavingLockTypes>();\n\n  static pauseSave = (lockType: SavingLockTypes) => {\n    this.locker.lock(lockType);\n  };\n\n  static resumeSave = (lockType: SavingLockTypes) => {\n    this.locker.unlock(lockType);\n  };\n\n  static isSavePaused = () => {\n    return document.hidden || this.locker.isLocked();\n  };\n\n  // ---------------------------------------------------------------------------\n\n  static fileStorage = new LocalFileManager({\n    getFiles(ids) {\n      return getMany(ids, filesStore).then(\n        async (filesData: (BinaryFileData | undefined)[]) => {\n          const loadedFiles: BinaryFileData[] = [];\n          const erroredFiles = new Map<FileId, true>();\n\n          const filesToSave: [FileId, BinaryFileData][] = [];\n\n          filesData.forEach((data, index) => {\n            const id = ids[index];\n            if (data) {\n              const _data: BinaryFileData = {\n                ...data,\n                lastRetrieved: Date.now(),\n              };\n              filesToSave.push([id, _data]);\n              loadedFiles.push(_data);\n            } else {\n              erroredFiles.set(id, true);\n            }\n          });\n\n          try {\n            // save loaded files back to storage with updated `lastRetrieved`\n            setMany(filesToSave, filesStore);\n          } catch (error) {\n            console.warn(error);\n          }\n\n          return { loadedFiles, erroredFiles };\n        },\n      );\n    },\n    async saveFiles({ addedFiles }) {\n      const savedFiles = new Map<FileId, true>();\n      const erroredFiles = new Map<FileId, true>();\n\n      // before we use `storage` event synchronization, let's update the flag\n      // optimistically. Hopefully nothing fails, and an IDB read executed\n      // before an IDB write finishes will read the latest value.\n      updateBrowserStateVersion(STORAGE_KEYS.VERSION_FILES);\n\n      await Promise.all(\n        [...addedFiles].map(async ([id, fileData]) => {\n          try {\n            await set(id, fileData, filesStore);\n            savedFiles.set(id, true);\n          } catch (error: any) {\n            console.error(error);\n            erroredFiles.set(id, true);\n          }\n        }),\n      );\n\n      return { savedFiles, erroredFiles };\n    },\n  });\n}\n","import { unstable_createStore } from \"jotai\";\n\nexport const appJotaiStore = unstable_createStore();\n","import throttle from \"lodash.throttle\";\nimport { PureComponent } from \"react\";\nimport { ExcalidrawImperativeAPI } from \"../../types\";\nimport { ErrorDialog } from \"../../components/ErrorDialog\";\nimport { APP_NAME, ENV, EVENT } from \"../../constants\";\nimport { ImportedDataState } from \"../../data/types\";\nimport {\n  ExcalidrawElement,\n  InitializedExcalidrawImageElement,\n} from \"../../element/types\";\nimport {\n  getSceneVersion,\n  restoreElements,\n} from \"../../packages/excalidraw/index\";\nimport { Collaborator, Gesture } from \"../../types\";\nimport {\n  preventUnload,\n  resolvablePromise,\n  withBatchedUpdates,\n} from \"../../utils\";\nimport {\n  CURSOR_SYNC_TIMEOUT,\n  FILE_UPLOAD_MAX_BYTES,\n  FIREBASE_STORAGE_PREFIXES,\n  INITIAL_SCENE_UPDATE_TIMEOUT,\n  LOAD_IMAGES_TIMEOUT,\n  WS_SCENE_EVENT_TYPES,\n  SYNC_FULL_SCENE_INTERVAL_MS,\n} from \"../app_constants\";\nimport {\n  generateCollaborationLinkData,\n  getCollaborationLink,\n  getCollabServer,\n  getSyncableElements,\n  SocketUpdateDataSource,\n  SyncableExcalidrawElement,\n} from \"../data\";\nimport {\n  isSavedToFirebase,\n  loadFilesFromFirebase,\n  loadFromFirebase,\n  saveFilesToFirebase,\n  saveToFirebase,\n} from \"../data/firebase\";\nimport {\n  importUsernameFromLocalStorage,\n  saveUsernameToLocalStorage,\n} from \"../data/localStorage\";\nimport Portal from \"./Portal\";\nimport RoomDialog from \"./RoomDialog\";\nimport { t } from \"../../i18n\";\nimport { UserIdleState } from \"../../types\";\nimport { IDLE_THRESHOLD, ACTIVE_THRESHOLD } from \"../../constants\";\nimport {\n  encodeFilesForUpload,\n  FileManager,\n  updateStaleImageStatuses,\n} from \"../data/FileManager\";\nimport { AbortError } from \"../../errors\";\nimport {\n  isImageElement,\n  isInitializedImageElement,\n} from \"../../element/typeChecks\";\nimport { newElementWith } from \"../../element/mutateElement\";\nimport {\n  ReconciledElements,\n  reconcileElements as _reconcileElements,\n} from \"./reconciliation\";\nimport { decryptData } from \"../../data/encryption\";\nimport { resetBrowserStateVersions } from \"../data/tabSync\";\nimport { LocalData } from \"../data/LocalData\";\nimport { atom, useAtom } from \"jotai\";\nimport { appJotaiStore } from \"../app-jotai\";\n\nexport const collabAPIAtom = atom<CollabAPI | null>(null);\nexport const collabDialogShownAtom = atom(false);\nexport const isCollaboratingAtom = atom(false);\nexport const isOfflineAtom = atom(false);\n\ninterface CollabState {\n  errorMessage: string;\n  username: string;\n  activeRoomLink: string;\n}\n\ntype CollabInstance = InstanceType<typeof Collab>;\n\nexport interface CollabAPI {\n  /** function so that we can access the latest value from stale callbacks */\n  isCollaborating: () => boolean;\n  onPointerUpdate: CollabInstance[\"onPointerUpdate\"];\n  startCollaboration: CollabInstance[\"startCollaboration\"];\n  stopCollaboration: CollabInstance[\"stopCollaboration\"];\n  syncElements: CollabInstance[\"syncElements\"];\n  fetchImageFilesFromFirebase: CollabInstance[\"fetchImageFilesFromFirebase\"];\n  setUsername: (username: string) => void;\n}\n\ninterface PublicProps {\n  excalidrawAPI: ExcalidrawImperativeAPI;\n}\n\ntype Props = PublicProps & { modalIsShown: boolean };\n\nclass Collab extends PureComponent<Props, CollabState> {\n  portal: Portal;\n  fileManager: FileManager;\n  excalidrawAPI: Props[\"excalidrawAPI\"];\n  activeIntervalId: number | null;\n  idleTimeoutId: number | null;\n\n  private socketInitializationTimer?: number;\n  private lastBroadcastedOrReceivedSceneVersion: number = -1;\n  private collaborators = new Map<string, Collaborator>();\n\n  constructor(props: Props) {\n    super(props);\n    this.state = {\n      errorMessage: \"\",\n      username: importUsernameFromLocalStorage() || \"\",\n      activeRoomLink: \"\",\n    };\n    this.portal = new Portal(this);\n    this.fileManager = new FileManager({\n      getFiles: async (fileIds) => {\n        const { roomId, roomKey } = this.portal;\n        if (!roomId || !roomKey) {\n          throw new AbortError();\n        }\n\n        return loadFilesFromFirebase(`files/rooms/${roomId}`, roomKey, fileIds);\n      },\n      saveFiles: async ({ addedFiles }) => {\n        const { roomId, roomKey } = this.portal;\n        if (!roomId || !roomKey) {\n          throw new AbortError();\n        }\n\n        return saveFilesToFirebase({\n          prefix: `${FIREBASE_STORAGE_PREFIXES.collabFiles}/${roomId}`,\n          files: await encodeFilesForUpload({\n            files: addedFiles,\n            encryptionKey: roomKey,\n            maxBytes: FILE_UPLOAD_MAX_BYTES,\n          }),\n        });\n      },\n    });\n    this.excalidrawAPI = props.excalidrawAPI;\n    this.activeIntervalId = null;\n    this.idleTimeoutId = null;\n  }\n\n  componentDidMount() {\n    window.addEventListener(EVENT.BEFORE_UNLOAD, this.beforeUnload);\n    window.addEventListener(\"online\", this.onOfflineStatusToggle);\n    window.addEventListener(\"offline\", this.onOfflineStatusToggle);\n    window.addEventListener(EVENT.UNLOAD, this.onUnload);\n\n    const collabAPI: CollabAPI = {\n      isCollaborating: this.isCollaborating,\n      onPointerUpdate: this.onPointerUpdate,\n      startCollaboration: this.startCollaboration,\n      syncElements: this.syncElements,\n      fetchImageFilesFromFirebase: this.fetchImageFilesFromFirebase,\n      stopCollaboration: this.stopCollaboration,\n      setUsername: this.setUsername,\n    };\n\n    appJotaiStore.set(collabAPIAtom, collabAPI);\n    this.onOfflineStatusToggle();\n\n    if (\n      process.env.NODE_ENV === ENV.TEST ||\n      process.env.NODE_ENV === ENV.DEVELOPMENT\n    ) {\n      window.collab = window.collab || ({} as Window[\"collab\"]);\n      Object.defineProperties(window, {\n        collab: {\n          configurable: true,\n          value: this,\n        },\n      });\n    }\n  }\n\n  onOfflineStatusToggle = () => {\n    appJotaiStore.set(isOfflineAtom, !window.navigator.onLine);\n  };\n\n  componentWillUnmount() {\n    window.removeEventListener(\"online\", this.onOfflineStatusToggle);\n    window.removeEventListener(\"offline\", this.onOfflineStatusToggle);\n    window.removeEventListener(EVENT.BEFORE_UNLOAD, this.beforeUnload);\n    window.removeEventListener(EVENT.UNLOAD, this.onUnload);\n    window.removeEventListener(EVENT.POINTER_MOVE, this.onPointerMove);\n    window.removeEventListener(\n      EVENT.VISIBILITY_CHANGE,\n      this.onVisibilityChange,\n    );\n    if (this.activeIntervalId) {\n      window.clearInterval(this.activeIntervalId);\n      this.activeIntervalId = null;\n    }\n    if (this.idleTimeoutId) {\n      window.clearTimeout(this.idleTimeoutId);\n      this.idleTimeoutId = null;\n    }\n  }\n\n  isCollaborating = () => appJotaiStore.get(isCollaboratingAtom)!;\n\n  private setIsCollaborating = (isCollaborating: boolean) => {\n    appJotaiStore.set(isCollaboratingAtom, isCollaborating);\n  };\n\n  private onUnload = () => {\n    this.destroySocketClient({ isUnload: true });\n  };\n\n  private beforeUnload = withBatchedUpdates((event: BeforeUnloadEvent) => {\n    const syncableElements = getSyncableElements(\n      this.getSceneElementsIncludingDeleted(),\n    );\n\n    if (\n      this.isCollaborating() &&\n      (this.fileManager.shouldPreventUnload(syncableElements) ||\n        !isSavedToFirebase(this.portal, syncableElements))\n    ) {\n      // this won't run in time if user decides to leave the site, but\n      //  the purpose is to run in immediately after user decides to stay\n      this.saveCollabRoomToFirebase(syncableElements);\n\n      preventUnload(event);\n    }\n  });\n\n  saveCollabRoomToFirebase = async (\n    syncableElements: readonly SyncableExcalidrawElement[],\n  ) => {\n    try {\n      const savedData = await saveToFirebase(\n        this.portal,\n        syncableElements,\n        this.excalidrawAPI.getAppState(),\n      );\n\n      if (this.isCollaborating() && savedData && savedData.reconciledElements) {\n        this.handleRemoteSceneUpdate(\n          this.reconcileElements(savedData.reconciledElements),\n        );\n      }\n    } catch (error: any) {\n      this.setState({\n        // firestore doesn't return a specific error code when size exceeded\n        errorMessage: /is longer than.*?bytes/.test(error.message)\n          ? t(\"errors.collabSaveFailed_sizeExceeded\")\n          : t(\"errors.collabSaveFailed\"),\n      });\n      console.error(error);\n    }\n  };\n\n  stopCollaboration = (keepRemoteState = true) => {\n    this.queueBroadcastAllElements.cancel();\n    this.queueSaveToFirebase.cancel();\n    this.loadImageFiles.cancel();\n\n    this.saveCollabRoomToFirebase(\n      getSyncableElements(\n        this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n      ),\n    );\n\n    if (this.portal.socket && this.fallbackInitializationHandler) {\n      this.portal.socket.off(\n        \"connect_error\",\n        this.fallbackInitializationHandler,\n      );\n    }\n\n    if (!keepRemoteState) {\n      LocalData.fileStorage.reset();\n      this.destroySocketClient();\n    } else if (window.confirm(t(\"alerts.collabStopOverridePrompt\"))) {\n      // hack to ensure that we prefer we disregard any new browser state\n      // that could have been saved in other tabs while we were collaborating\n      resetBrowserStateVersions();\n\n      window.history.pushState({}, APP_NAME, window.location.origin);\n      this.destroySocketClient();\n\n      LocalData.fileStorage.reset();\n\n      const elements = this.excalidrawAPI\n        .getSceneElementsIncludingDeleted()\n        .map((element) => {\n          if (isImageElement(element) && element.status === \"saved\") {\n            return newElementWith(element, { status: \"pending\" });\n          }\n          return element;\n        });\n\n      this.excalidrawAPI.updateScene({\n        elements,\n        commitToHistory: false,\n      });\n    }\n  };\n\n  private destroySocketClient = (opts?: { isUnload: boolean }) => {\n    this.lastBroadcastedOrReceivedSceneVersion = -1;\n    this.portal.close();\n    this.fileManager.reset();\n    if (!opts?.isUnload) {\n      this.setIsCollaborating(false);\n      this.setState({\n        activeRoomLink: \"\",\n      });\n      this.collaborators = new Map();\n      this.excalidrawAPI.updateScene({\n        collaborators: this.collaborators,\n      });\n      LocalData.resumeSave(\"collaboration\");\n    }\n  };\n\n  private fetchImageFilesFromFirebase = async (opts: {\n    elements: readonly ExcalidrawElement[];\n    /**\n     * Indicates whether to fetch files that are errored or pending and older\n     * than 10 seconds.\n     *\n     * Use this as a machanism to fetch files which may be ok but for some\n     * reason their status was not updated correctly.\n     */\n    forceFetchFiles?: boolean;\n  }) => {\n    const unfetchedImages = opts.elements\n      .filter((element) => {\n        return (\n          isInitializedImageElement(element) &&\n          !this.fileManager.isFileHandled(element.fileId) &&\n          !element.isDeleted &&\n          (opts.forceFetchFiles\n            ? element.status !== \"pending\" ||\n              Date.now() - element.updated > 10000\n            : element.status === \"saved\")\n        );\n      })\n      .map((element) => (element as InitializedExcalidrawImageElement).fileId);\n\n    return await this.fileManager.getFiles(unfetchedImages);\n  };\n\n  private decryptPayload = async (\n    iv: Uint8Array,\n    encryptedData: ArrayBuffer,\n    decryptionKey: string,\n  ) => {\n    try {\n      const decrypted = await decryptData(iv, encryptedData, decryptionKey);\n\n      const decodedData = new TextDecoder(\"utf-8\").decode(\n        new Uint8Array(decrypted),\n      );\n      return JSON.parse(decodedData);\n    } catch (error) {\n      window.alert(t(\"alerts.decryptFailed\"));\n      console.error(error);\n      return {\n        type: \"INVALID_RESPONSE\",\n      };\n    }\n  };\n\n  private fallbackInitializationHandler: null | (() => any) = null;\n\n  startCollaboration = async (\n    existingRoomLinkData: null | { roomId: string; roomKey: string },\n  ): Promise<ImportedDataState | null> => {\n    if (this.portal.socket) {\n      return null;\n    }\n\n    let roomId;\n    let roomKey;\n\n    if (existingRoomLinkData) {\n      ({ roomId, roomKey } = existingRoomLinkData);\n    } else {\n      ({ roomId, roomKey } = await generateCollaborationLinkData());\n      window.history.pushState(\n        {},\n        APP_NAME,\n        getCollaborationLink({ roomId, roomKey }),\n      );\n    }\n\n    const scenePromise = resolvablePromise<ImportedDataState | null>();\n\n    this.setIsCollaborating(true);\n    LocalData.pauseSave(\"collaboration\");\n\n    const { default: socketIOClient } = await import(\n      /* webpackChunkName: \"socketIoClient\" */ \"socket.io-client\"\n    );\n\n    const fallbackInitializationHandler = () => {\n      this.initializeRoom({\n        roomLinkData: existingRoomLinkData,\n        fetchScene: true,\n      }).then((scene) => {\n        scenePromise.resolve(scene);\n      });\n    };\n    this.fallbackInitializationHandler = fallbackInitializationHandler;\n\n    try {\n      const socketServerData = await getCollabServer();\n\n      this.portal.socket = this.portal.open(\n        socketIOClient(socketServerData.url, {\n          transports: socketServerData.polling\n            ? [\"websocket\", \"polling\"]\n            : [\"websocket\"],\n        }),\n        roomId,\n        roomKey,\n      );\n\n      this.portal.socket.once(\"connect_error\", fallbackInitializationHandler);\n    } catch (error: any) {\n      console.error(error);\n      this.setState({ errorMessage: error.message });\n      return null;\n    }\n\n    if (!existingRoomLinkData) {\n      const elements = this.excalidrawAPI.getSceneElements().map((element) => {\n        if (isImageElement(element) && element.status === \"saved\") {\n          return newElementWith(element, { status: \"pending\" });\n        }\n        return element;\n      });\n      // remove deleted elements from elements array & history to ensure we don't\n      // expose potentially sensitive user data in case user manually deletes\n      // existing elements (or clears scene), which would otherwise be persisted\n      // to database even if deleted before creating the room.\n      this.excalidrawAPI.history.clear();\n      this.excalidrawAPI.updateScene({\n        elements,\n        commitToHistory: true,\n      });\n\n      this.saveCollabRoomToFirebase(getSyncableElements(elements));\n    }\n\n    // fallback in case you're not alone in the room but still don't receive\n    // initial SCENE_INIT message\n    this.socketInitializationTimer = window.setTimeout(\n      fallbackInitializationHandler,\n      INITIAL_SCENE_UPDATE_TIMEOUT,\n    );\n\n    // All socket listeners are moving to Portal\n    this.portal.socket.on(\n      \"client-broadcast\",\n      async (encryptedData: ArrayBuffer, iv: Uint8Array) => {\n        if (!this.portal.roomKey) {\n          return;\n        }\n\n        const decryptedData = await this.decryptPayload(\n          iv,\n          encryptedData,\n          this.portal.roomKey,\n        );\n\n        switch (decryptedData.type) {\n          case \"INVALID_RESPONSE\":\n            return;\n          case WS_SCENE_EVENT_TYPES.INIT: {\n            if (!this.portal.socketInitialized) {\n              this.initializeRoom({ fetchScene: false });\n              const remoteElements = decryptedData.payload.elements;\n              const reconciledElements = this.reconcileElements(remoteElements);\n              this.handleRemoteSceneUpdate(reconciledElements, {\n                init: true,\n              });\n              // noop if already resolved via init from firebase\n              scenePromise.resolve({\n                elements: reconciledElements,\n                scrollToContent: true,\n              });\n            }\n            break;\n          }\n          case WS_SCENE_EVENT_TYPES.UPDATE:\n            this.handleRemoteSceneUpdate(\n              this.reconcileElements(decryptedData.payload.elements),\n            );\n            break;\n          case \"MOUSE_LOCATION\": {\n            const { pointer, button, username, selectedElementIds } =\n              decryptedData.payload;\n            const socketId: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"socketId\"] =\n              decryptedData.payload.socketId ||\n              // @ts-ignore legacy, see #2094 (#2097)\n              decryptedData.payload.socketID;\n\n            const collaborators = new Map(this.collaborators);\n            const user = collaborators.get(socketId) || {}!;\n            user.pointer = pointer;\n            user.button = button;\n            user.selectedElementIds = selectedElementIds;\n            user.username = username;\n            collaborators.set(socketId, user);\n            this.excalidrawAPI.updateScene({\n              collaborators,\n            });\n            break;\n          }\n          case \"IDLE_STATUS\": {\n            const { userState, socketId, username } = decryptedData.payload;\n            const collaborators = new Map(this.collaborators);\n            const user = collaborators.get(socketId) || {}!;\n            user.userState = userState;\n            user.username = username;\n            this.excalidrawAPI.updateScene({\n              collaborators,\n            });\n            break;\n          }\n        }\n      },\n    );\n\n    this.portal.socket.on(\"first-in-room\", async () => {\n      if (this.portal.socket) {\n        this.portal.socket.off(\"first-in-room\");\n      }\n      const sceneData = await this.initializeRoom({\n        fetchScene: true,\n        roomLinkData: existingRoomLinkData,\n      });\n      scenePromise.resolve(sceneData);\n    });\n\n    this.initializeIdleDetector();\n\n    this.setState({\n      activeRoomLink: window.location.href,\n    });\n\n    return scenePromise;\n  };\n\n  private initializeRoom = async ({\n    fetchScene,\n    roomLinkData,\n  }:\n    | {\n        fetchScene: true;\n        roomLinkData: { roomId: string; roomKey: string } | null;\n      }\n    | { fetchScene: false; roomLinkData?: null }) => {\n    clearTimeout(this.socketInitializationTimer!);\n    if (this.portal.socket && this.fallbackInitializationHandler) {\n      this.portal.socket.off(\n        \"connect_error\",\n        this.fallbackInitializationHandler,\n      );\n    }\n    if (fetchScene && roomLinkData && this.portal.socket) {\n      this.excalidrawAPI.resetScene();\n\n      try {\n        const elements = await loadFromFirebase(\n          roomLinkData.roomId,\n          roomLinkData.roomKey,\n          this.portal.socket,\n        );\n        if (elements) {\n          this.setLastBroadcastedOrReceivedSceneVersion(\n            getSceneVersion(elements),\n          );\n\n          return {\n            elements,\n            scrollToContent: true,\n          };\n        }\n      } catch (error: any) {\n        // log the error and move on. other peers will sync us the scene.\n        console.error(error);\n      } finally {\n        this.portal.socketInitialized = true;\n      }\n    } else {\n      this.portal.socketInitialized = true;\n    }\n    return null;\n  };\n\n  private reconcileElements = (\n    remoteElements: readonly ExcalidrawElement[],\n  ): ReconciledElements => {\n    const localElements = this.getSceneElementsIncludingDeleted();\n    const appState = this.excalidrawAPI.getAppState();\n\n    remoteElements = restoreElements(remoteElements, null);\n\n    const reconciledElements = _reconcileElements(\n      localElements,\n      remoteElements,\n      appState,\n    );\n\n    // Avoid broadcasting to the rest of the collaborators the scene\n    // we just received!\n    // Note: this needs to be set before updating the scene as it\n    // synchronously calls render.\n    this.setLastBroadcastedOrReceivedSceneVersion(\n      getSceneVersion(reconciledElements),\n    );\n\n    return reconciledElements;\n  };\n\n  private loadImageFiles = throttle(async () => {\n    const { loadedFiles, erroredFiles } =\n      await this.fetchImageFilesFromFirebase({\n        elements: this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n      });\n\n    this.excalidrawAPI.addFiles(loadedFiles);\n\n    updateStaleImageStatuses({\n      excalidrawAPI: this.excalidrawAPI,\n      erroredFiles,\n      elements: this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n    });\n  }, LOAD_IMAGES_TIMEOUT);\n\n  private handleRemoteSceneUpdate = (\n    elements: ReconciledElements,\n    { init = false }: { init?: boolean } = {},\n  ) => {\n    this.excalidrawAPI.updateScene({\n      elements,\n      commitToHistory: !!init,\n    });\n\n    // We haven't yet implemented multiplayer undo functionality, so we clear the undo stack\n    // when we receive any messages from another peer. This UX can be pretty rough -- if you\n    // undo, a user makes a change, and then try to redo, your element(s) will be lost. However,\n    // right now we think this is the right tradeoff.\n    this.excalidrawAPI.history.clear();\n\n    this.loadImageFiles();\n  };\n\n  private onPointerMove = () => {\n    if (this.idleTimeoutId) {\n      window.clearTimeout(this.idleTimeoutId);\n      this.idleTimeoutId = null;\n    }\n\n    this.idleTimeoutId = window.setTimeout(this.reportIdle, IDLE_THRESHOLD);\n\n    if (!this.activeIntervalId) {\n      this.activeIntervalId = window.setInterval(\n        this.reportActive,\n        ACTIVE_THRESHOLD,\n      );\n    }\n  };\n\n  private onVisibilityChange = () => {\n    if (document.hidden) {\n      if (this.idleTimeoutId) {\n        window.clearTimeout(this.idleTimeoutId);\n        this.idleTimeoutId = null;\n      }\n      if (this.activeIntervalId) {\n        window.clearInterval(this.activeIntervalId);\n        this.activeIntervalId = null;\n      }\n      this.onIdleStateChange(UserIdleState.AWAY);\n    } else {\n      this.idleTimeoutId = window.setTimeout(this.reportIdle, IDLE_THRESHOLD);\n      this.activeIntervalId = window.setInterval(\n        this.reportActive,\n        ACTIVE_THRESHOLD,\n      );\n      this.onIdleStateChange(UserIdleState.ACTIVE);\n    }\n  };\n\n  private reportIdle = () => {\n    this.onIdleStateChange(UserIdleState.IDLE);\n    if (this.activeIntervalId) {\n      window.clearInterval(this.activeIntervalId);\n      this.activeIntervalId = null;\n    }\n  };\n\n  private reportActive = () => {\n    this.onIdleStateChange(UserIdleState.ACTIVE);\n  };\n\n  private initializeIdleDetector = () => {\n    document.addEventListener(EVENT.POINTER_MOVE, this.onPointerMove);\n    document.addEventListener(EVENT.VISIBILITY_CHANGE, this.onVisibilityChange);\n  };\n\n  setCollaborators(sockets: string[]) {\n    const collaborators: InstanceType<typeof Collab>[\"collaborators\"] =\n      new Map();\n    for (const socketId of sockets) {\n      if (this.collaborators.has(socketId)) {\n        collaborators.set(socketId, this.collaborators.get(socketId)!);\n      } else {\n        collaborators.set(socketId, {});\n      }\n    }\n    this.collaborators = collaborators;\n    this.excalidrawAPI.updateScene({ collaborators });\n  }\n\n  public setLastBroadcastedOrReceivedSceneVersion = (version: number) => {\n    this.lastBroadcastedOrReceivedSceneVersion = version;\n  };\n\n  public getLastBroadcastedOrReceivedSceneVersion = () => {\n    return this.lastBroadcastedOrReceivedSceneVersion;\n  };\n\n  public getSceneElementsIncludingDeleted = () => {\n    return this.excalidrawAPI.getSceneElementsIncludingDeleted();\n  };\n\n  onPointerUpdate = throttle(\n    (payload: {\n      pointer: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"pointer\"];\n      button: SocketUpdateDataSource[\"MOUSE_LOCATION\"][\"payload\"][\"button\"];\n      pointersMap: Gesture[\"pointers\"];\n    }) => {\n      payload.pointersMap.size < 2 &&\n        this.portal.socket &&\n        this.portal.broadcastMouseLocation(payload);\n    },\n    CURSOR_SYNC_TIMEOUT,\n  );\n\n  onIdleStateChange = (userState: UserIdleState) => {\n    this.portal.broadcastIdleChange(userState);\n  };\n\n  broadcastElements = (elements: readonly ExcalidrawElement[]) => {\n    if (\n      getSceneVersion(elements) >\n      this.getLastBroadcastedOrReceivedSceneVersion()\n    ) {\n      this.portal.broadcastScene(WS_SCENE_EVENT_TYPES.UPDATE, elements, false);\n      this.lastBroadcastedOrReceivedSceneVersion = getSceneVersion(elements);\n      this.queueBroadcastAllElements();\n    }\n  };\n\n  syncElements = (elements: readonly ExcalidrawElement[]) => {\n    this.broadcastElements(elements);\n    this.queueSaveToFirebase();\n  };\n\n  queueBroadcastAllElements = throttle(() => {\n    this.portal.broadcastScene(\n      WS_SCENE_EVENT_TYPES.UPDATE,\n      this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n      true,\n    );\n    const currentVersion = this.getLastBroadcastedOrReceivedSceneVersion();\n    const newVersion = Math.max(\n      currentVersion,\n      getSceneVersion(this.getSceneElementsIncludingDeleted()),\n    );\n    this.setLastBroadcastedOrReceivedSceneVersion(newVersion);\n  }, SYNC_FULL_SCENE_INTERVAL_MS);\n\n  queueSaveToFirebase = throttle(\n    () => {\n      if (this.portal.socketInitialized) {\n        this.saveCollabRoomToFirebase(\n          getSyncableElements(\n            this.excalidrawAPI.getSceneElementsIncludingDeleted(),\n          ),\n        );\n      }\n    },\n    SYNC_FULL_SCENE_INTERVAL_MS,\n    { leading: false },\n  );\n\n  handleClose = () => {\n    appJotaiStore.set(collabDialogShownAtom, false);\n  };\n\n  setUsername = (username: string) => {\n    this.setState({ username });\n  };\n\n  onUsernameChange = (username: string) => {\n    this.setUsername(username);\n    saveUsernameToLocalStorage(username);\n  };\n\n  render() {\n    const { username, errorMessage, activeRoomLink } = this.state;\n\n    const { modalIsShown } = this.props;\n\n    return (\n      <>\n        {modalIsShown && (\n          <RoomDialog\n            handleClose={this.handleClose}\n            activeRoomLink={activeRoomLink}\n            username={username}\n            onUsernameChange={this.onUsernameChange}\n            onRoomCreate={() => this.startCollaboration(null)}\n            onRoomDestroy={this.stopCollaboration}\n            setErrorMessage={(errorMessage) => {\n              this.setState({ errorMessage });\n            }}\n            theme={this.excalidrawAPI.getAppState().theme}\n          />\n        )}\n        {errorMessage && (\n          <ErrorDialog\n            message={errorMessage}\n            onClose={() => this.setState({ errorMessage: \"\" })}\n          />\n        )}\n      </>\n    );\n  }\n}\n\ndeclare global {\n  interface Window {\n    collab: InstanceType<typeof Collab>;\n  }\n}\n\nif (\n  process.env.NODE_ENV === ENV.TEST ||\n  process.env.NODE_ENV === ENV.DEVELOPMENT\n) {\n  window.collab = window.collab || ({} as Window[\"collab\"]);\n}\n\nconst _Collab: React.FC<PublicProps> = (props) => {\n  const [collabDialogShown] = useAtom(collabDialogShownAtom);\n  return <Collab {...props} modalIsShown={collabDialogShown} />;\n};\n\nexport default _Collab;\n\nexport type TCollabClass = Collab;\n","import { useEffect, useState } from \"react\";\nimport { debounce, getVersion, nFormatter } from \"../utils\";\nimport {\n  getElementsStorageSize,\n  getTotalStorageSize,\n} from \"./data/localStorage\";\nimport { DEFAULT_VERSION } from \"../constants\";\nimport { t } from \"../i18n\";\nimport { copyTextToSystemClipboard } from \"../clipboard\";\nimport { AppState } from \"../types\";\nimport { NonDeletedExcalidrawElement } from \"../element/types\";\ntype StorageSizes = { scene: number; total: number };\n\nconst STORAGE_SIZE_TIMEOUT = 500;\n\nconst getStorageSizes = debounce((cb: (sizes: StorageSizes) => void) => {\n  cb({\n    scene: getElementsStorageSize(),\n    total: getTotalStorageSize(),\n  });\n}, STORAGE_SIZE_TIMEOUT);\n\ntype Props = {\n  setToast: (message: string) => void;\n  elements: readonly NonDeletedExcalidrawElement[];\n  appState: AppState;\n};\nconst CustomStats = (props: Props) => {\n  const [storageSizes, setStorageSizes] = useState<StorageSizes>({\n    scene: 0,\n    total: 0,\n  });\n\n  useEffect(() => {\n    getStorageSizes((sizes) => {\n      setStorageSizes(sizes);\n    });\n  }, [props.elements, props.appState]);\n  useEffect(() => () => getStorageSizes.cancel(), []);\n\n  const version = getVersion();\n  let hash;\n  let timestamp;\n\n  if (version !== DEFAULT_VERSION) {\n    timestamp = version.slice(0, 16).replace(\"T\", \" \");\n    hash = version.slice(21);\n  } else {\n    timestamp = t(\"stats.versionNotAvailable\");\n  }\n\n  return (\n    <>\n      <tr>\n        <th colSpan={2}>{t(\"stats.storage\")}</th>\n      </tr>\n      <tr>\n        <td>{t(\"stats.scene\")}</td>\n        <td>{nFormatter(storageSizes.scene, 1)}</td>\n      </tr>\n      <tr>\n        <td>{t(\"stats.total\")}</td>\n        <td>{nFormatter(storageSizes.total, 1)}</td>\n      </tr>\n      <tr>\n        <th colSpan={2}>{t(\"stats.version\")}</th>\n      </tr>\n      <tr>\n        <td\n          colSpan={2}\n          style={{ textAlign: \"center\", cursor: \"pointer\" }}\n          onClick={async () => {\n            try {\n              await copyTextToSystemClipboard(getVersion());\n              props.setToast(t(\"toast.copyToClipboard\"));\n            } catch {}\n          }}\n          title={t(\"stats.versionCopy\")}\n        >\n          {timestamp}\n          <br />\n          {hash}\n        </td>\n      </tr>\n    </>\n  );\n};\n\nexport default CustomStats;\n","import { createIcon } from \"../../components/icons\";\n\nexport const excalidrawPlusIcon = createIcon(\n  <>\n    <path\n      d=\"M72.652 63.598c-1.368.91-1.191 2.833-.953 4.572.702 5.104.47 5.323 1.073 7.016.649 1.826.433 2.553-.08 3.292-.406.588-1.207 1.371-1.906 1.516-.98.204-2.967.01-3.922-.246-.643-.174-1.292-.94-1.598-1.53-.389-.751-1.256-1.951-.694-3.593.56-1.64 1.325-5.374 1.363-6.108.098-1.904.02-3.934-1.085-5.014-1.104-1.082-3.941-1.055-5.739-1.038-1.723.017-3.583 1.207-5.045 1.141-1.343-.061-2.939-.686-3.728-1.536-.79-.852-1.082-2.469-1.007-3.57.074-1.1.726-2.398 1.454-3.033.727-.635 1.91-.867 2.909-.777 1.472.13 4.1 1.342 5.928 1.564 1.67.203 4.016.501 5.04-.227 1.021-.73 1.048-2.717 1.094-4.145.07-2.063-1.021-6.528-.683-8.23.22-1.098 1.709-1.696 2.717-1.979 1.007-.282 2.521-.125 3.328.285.788.398 1.499 1.29 1.516 2.173.031 1.68-1.209 5.66-1.322 7.905-.058 1.133-.61 3.124.482 3.764 1.264.74 2.95 1.778 7.1.673 1.765-.47 3.157-.689 4.62-.622 1.342.06 2.939.685 3.728 1.536.787.85 1.08 2.468 1.006 3.568-.074 1.101-.726 2.4-1.454 3.035-.727.634-1.908.866-2.908.777-1.473-.13-3.164-.68-4.88-1.248-2.526-.835-5.176-.708-6.354.079z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M51.396 25.807c0 .237-.285.474-.617.474-.284 0-1.09 1.328-1.708 2.941-1.897 4.934-20.873 42.46-20.92 41.273 0-.616-.285-1.043-.76-1.043-.664 0-.759.38-.474 2.23.284 2.134.095 2.609-6.642 15.702-3.795 7.448-7.875 15.228-9.06 17.316-1.234 2.182-2.183 4.554-2.278 5.55-.142 1.708.047 1.945 4.175 5.503 2.372 2.088 5.408 4.697 6.736 5.883 5.978 5.456 8.777 7.638 9.536 7.496 1.138-.19 18.739-18.644 18.786-19.688 0-.475-.854-7.685-1.898-16.035-1.802-14.232-3.51-30.884-3.32-32.497.142-.996-.57-6.024-1.092-8.207-.426-1.708-.237-2.42 3.179-10.2 1.992-4.601 4.602-10.247 5.74-12.524 1.091-2.277 2.04-4.27 2.04-4.412 0-.142-.332-.237-.711-.237-.38 0-.712.19-.712.475zM40.485 61.245c.522 3.32 1.565 11.29 2.324 17.695 1.47 11.765 3.179 24.811 3.653 28.132.285 1.66.095 1.992-2.989 5.408-5.36 6.025-11.053 11.955-12.998 13.473l-1.803 1.423-9.25-8.634c-8.54-7.875-9.252-8.681-8.73-9.63.285-.522 2.704-4.934 5.361-9.773 2.657-4.839 6.167-11.29 7.78-14.327 1.66-3.084 3.179-5.74 3.463-5.882.332-.19.427 4.601.332 14.8-.19 15.23-.142 15.277 1.376 14.945.19 0 .332-7.686.332-17.031V74.86l4.981-9.963c2.752-5.503 5.03-9.915 5.124-9.867.095.047.57 2.846 1.044 6.215zM20.228 3.842c-3.51 2.799-8.919 7.543-13.189 11.623l-3.368 3.178.617 4.175c.332 2.277.949 6.736 1.328 9.867.427 3.132.854 6.073.996 6.5.19.57 0 .854-.521.854-.902 0-.95-.237 1.518 7.59.901 2.989 1.755 5.74 1.85 6.025.095.332.474.474.901.332.427-.19.664-.57.522-.901-.142-.38.095-.76.474-.902.522-.19.475-.569-.332-1.945-1.28-2.134-4.554-20.352-4.744-26.234-.142-4.175-.142-4.222 1.613-6.594 1.708-2.325 5.646-5.835 11.718-10.295 1.708-1.28 3.416-2.704 3.89-3.178.712-.854 1.044-.617 7.021 5.74 3.463 3.653 7.306 7.4 8.54 8.35l2.277 1.707-1.756 3.7c-.948 1.993-4.791 9.678-8.586 16.984-7.923 15.37-6.31 13.9-15.513 14.043l-5.978.047-1.992 2.277c-2.088 2.42-2.372 3.32-1.376 4.839.38.522.664 1.376.664 1.898 0 .854.332.996 2.23 1.09 1.186.048 2.277.19 2.42.333.142.142.331 3.083.474 6.547l.19 6.262-3.179 6.831c-5.266 11.386-7.353 16.604-7.353 18.312 0 .901.19 1.66.38 1.66.474 0 .474-.047 19.782-40.324 8.966-18.691 17.458-36.292 18.881-39.185 1.423-2.894 2.704-5.55 2.799-5.93.095-.427-3.178-3.7-8.397-8.303-4.696-4.174-8.824-7.97-9.203-8.396-1.091-1.329-2.704-.902-5.598 1.423zm-2.372 62.147c-.38.996-1.376 3.083-2.183 4.649-1.328 2.656-1.47 2.751-1.802 1.66-.19-.664-.332-2.61-.38-4.364-.047-3.464-.142-3.416 3.843-3.653l1.28-.048-.758 1.756zm3.985-7.59c-2.183 4.221-2.277 4.269-8.255 4.553-5.266.285-5.36.238-5.36-.759 0-.569-.19-1.328-.428-1.708-.284-.426-.094-1.186.57-2.23l1.043-1.612h4.744c2.61-.048 5.598-.237 6.642-.427 1.044-.19 1.945-.285 2.04-.237.095.047-.38 1.138-.996 2.42zm-.19-43.266c-.854.616-1.091 1.233-1.091 2.799 0 1.85.142 2.134 1.423 2.656 1.28.522 1.613.475 3.084-.522 1.945-1.328 1.992-1.66.569-3.795-1.234-1.85-2.467-2.182-3.985-1.138z\"\n      fill=\"currentColor\"\n    />\n    <path\n      d=\"M50.141 24.917c.352-.615 1.06-1.085 1.967-1.085.804 0 1.477.34 1.734.597.342.342.477.74.477 1.14 0 .089-.006.305-.119.612-.168.461-1.056 2.337-2.08 4.471-1.131 2.264-3.724 7.875-5.708 12.457-1.671 3.806-2.558 5.881-2.97 7.216-.301.975-.279 1.406-.123 2.032.558 2.33 1.27 7.704 1.122 8.73-.187 1.596 1.537 18.06 3.32 32.136 1.056 8.446 1.91 15.74 1.91 16.22l-.002.07c-.009.184-.087.607-.447 1.14-.506.747-1.932 2.414-3.805 4.476-4.242 4.672-10.806 11.46-13.673 14.059-.682.617-1.199 1.023-1.472 1.182a1.872 1.872 0 01-.612.236c-.41.077-1.225-.015-2.35-.737-1.495-.959-4.19-3.217-8.46-7.114-1.327-1.184-4.36-3.79-6.718-5.865-1.712-1.476-2.767-2.405-3.411-3.096-.677-.727-.994-1.291-1.16-1.839-.165-.544-.18-1.09-.117-1.847.104-1.1 1.103-3.737 2.466-6.15 1.182-2.08 5.247-9.833 9.031-17.26 3.34-6.491 5.06-9.853 5.906-11.859.677-1.603.696-2.113.587-2.93-.18-1.168-.195-1.884-.111-2.308.1-.511.321-.851.58-1.1.346-.331.813-.55 1.488-.55.199 0 .391.024.574.07 4.068-7.268 18.093-35.143 19.705-39.334.585-1.53 1.353-2.823 1.794-3.288.228-.24.462-.39.677-.482zM38.72 59.573a448.835 448.835 0 00-3.06 5.995l-4.823 9.646v16.63c0 8.501-.124 15.643-.287 16.987-.142 1.166-1.002 1.462-1.384 1.526l.16-.017c-.671.147-1.214.135-1.647-.047-.495-.209-1.058-.629-1.33-1.813-.332-1.439-.336-5.202-.22-14.563.04-4.272.047-7.59.016-9.984-.33.582-.666 1.188-.986 1.783-1.615 3.04-5.13 9.5-7.79 14.345-2.383 4.34-4.576 8.338-5.207 9.493.131.186.356.489.61.77 1.165 1.287 3.451 3.428 7.667 7.316l8.316 7.76.798-.63c1.917-1.495 7.517-7.35 12.808-13.295.898-.995 1.544-1.72 2-2.29.37-.464.594-.76.675-1.06.067-.247.004-.478-.051-.8l-.007-.041c-.475-3.324-2.184-16.382-3.657-28.168-.757-6.384-1.797-14.328-2.317-17.639l-.004-.023c-.089-.635-.185-1.272-.28-1.881zM19.289 2.67c1.673-1.343 3-2.096 4.04-2.364 1.537-.394 2.687.004 3.621 1.119.396.44 4.46 4.165 9.071 8.264 4.274 3.769 7.265 6.676 8.244 7.909.69.868.68 1.598.625 1.844-.002.013-.006.026-.009.038-.1.398-1.416 3.195-2.908 6.228-1.423 2.893-9.912 20.488-18.875 39.173C7.581 97.252 4.465 103.75 3.6 105.058c-.497.751-.885.854-1.111.924a1.729 1.729 0 01-.526.076c-.42 0-.964-.148-1.368-.767-.223-.342-.511-1.288-.511-2.394 0-.606.19-1.592.67-3.03.955-2.866 3.1-7.864 6.821-15.911l3.03-6.513-.178-5.89a153.908 153.908 0 00-.33-5.346c-.352-.041-.773-.081-1.14-.096-.98-.049-1.616-.131-2.03-.261-.645-.204-1.016-.535-1.267-.928-.221-.348-.358-.79-.358-1.4 0-.282-.173-.735-.377-1.016l-.04-.059c-.621-.945-.859-1.757-.79-2.608.085-1.023.72-2.222 2.283-4.034l1.607-1.836c-.218-.687-.996-3.199-1.807-5.89-1.558-4.942-2.122-6.841-2.152-7.56-.034-.83.282-1.245.57-1.51a1.53 1.53 0 01.406-.265c-.217-1.235-.55-3.498-.875-5.878a488.89 488.89 0 00-1.323-9.829l-.617-4.175a1.5 1.5 0 01.455-1.31l3.361-3.172c4.301-4.11 9.749-8.888 13.287-11.709zm-3.879 71.31c-.31.283-.612.394-.858.441a1.547 1.547 0 01-1.04-.132l.103 3.418v.018l1.795-3.746zm12.426 1.473a23.55 23.55 0 01-.225.553 43.912 43.912 0 01-.763 1.686c.328-.11.65-.094.966.015l.022.008v-2.262zm1.524-3.996l-.032.037a1.575 1.575 0 01-.862.5c.042.411.057.798 0 1.25l.894-1.787zM16.286 65.87c-.566.056-1.034.117-1.267.149-.014.118-.03.275-.035.408-.012.4-.001.889.007 1.466.006.237.014.477.024.716.49-.997.97-2.02 1.271-2.739zm4.486-3.076a4.31 4.31 0 01-.88.654c.136.22.21.469.22.721l.281-.585.38-.79zm-.299-5.017c-1.381.168-3.98.324-6.29.365h-3.956l-.594.92c-.19.298-.36.7-.429.874.215.444.399 1.073.478 1.666h.014c.771.012 1.964-.048 3.819-.148 2.63-.125 3.979-.11 4.898-.616.326-.18.561-.453.817-.83.374-.551.75-1.276 1.243-2.23zm4.52-3.77a6.345 6.345 0 01-1.098.892c.156.141.3.333.383.595l.714-1.487zm15.241-3.122c-.47.934-.941 1.866-1.41 2.789.6-.264 1.192-.034 1.288.014.079.04.308.15.517.425a27.335 27.335 0 00-.224-1.044c-.185-.74-.289-1.336-.17-2.184zM24.148 5.38c-.758.673-2.198 1.856-3.649 2.944-5.896 4.33-9.738 7.717-11.4 9.978-.594.803-.97 1.279-1.177 1.801-.316.802-.217 1.685-.143 3.852.132 4.065 1.762 14.092 3.157 20.466.555 2.535 1.023 4.46 1.383 5.059.528.9.771 1.5.842 1.889.088.484.016.86-.118 1.167a1.86 1.86 0 01-.27.446l2.687-.021c1.825-.028 3.22.008 4.349-.038.897-.038 1.587-.111 2.187-.396.71-.336 1.26-.968 1.948-2.018 1.313-2.003 2.904-5.314 5.721-10.782 3.785-7.286 7.618-14.95 8.563-16.935l1.23-2.593-1.311-.984c-1.258-.967-5.182-4.782-8.717-8.51-2.604-2.769-4.52-4.608-5.282-5.325zm-11.86 47.181l-.001-.003-.026-.064.027.067zm-1.503-1.764l.059-.024a1.07 1.07 0 00-.059.024zm42.106-24.884l-.002.022.001-.009.001-.013zm.003-.035l.002-.071-.002.071zM20.773 13.917c-1.241.896-1.713 1.74-1.713 4.015 0 1.663.252 2.444.727 3.002.334.391.822.714 1.63 1.043.743.303 1.275.437 1.771.44.735.005 1.457-.254 2.72-1.109 1.495-1.02 2.072-1.825 2.19-2.615.111-.744-.188-1.715-1.214-3.254-.872-1.307-1.805-2.006-2.727-2.266-1.036-.292-2.15-.105-3.356.723l-.028.02zm4.263 4.285c-.128-.242-.375-.69-.648-1.099-.4-.598-.691-1.03-1.123-1.056-.24-.015-.473.123-.744.308-.461.337-.461.721-.461 1.577 0 .417.04.883.058 1.064.1.052.282.142.431.203.283.115.47.216.66.218.084 0 .152-.057.255-.113.215-.115.46-.275.757-.476.311-.213.632-.472.815-.626zM19.293 2.669l-.005.003.005-.003z\"\n      fill=\"currentColor\"\n    />\n  </>,\n  { width: 89, height: 131, style: { transform: \"translateX(4px)\" } },\n);\n","import React from \"react\";\nimport { Card } from \"../../components/Card\";\nimport { ToolButton } from \"../../components/ToolButton\";\nimport { serializeAsJSON } from \"../../data/json\";\nimport { loadFirebaseStorage, saveFilesToFirebase } from \"../data/firebase\";\nimport { FileId, NonDeletedExcalidrawElement } from \"../../element/types\";\nimport { AppState, BinaryFileData, BinaryFiles } from \"../../types\";\nimport { nanoid } from \"nanoid\";\nimport { useI18n } from \"../../i18n\";\nimport { excalidrawPlusIcon } from \"./icons\";\nimport { encryptData, generateEncryptionKey } from \"../../data/encryption\";\nimport { isInitializedImageElement } from \"../../element/typeChecks\";\nimport { FILE_UPLOAD_MAX_BYTES } from \"../app_constants\";\nimport { encodeFilesForUpload } from \"../data/FileManager\";\nimport { MIME_TYPES } from \"../../constants\";\nimport { trackEvent } from \"../../analytics\";\nimport { getFrame } from \"../../utils\";\n\nconst exportToExcalidrawPlus = async (\n  elements: readonly NonDeletedExcalidrawElement[],\n  appState: AppState,\n  files: BinaryFiles,\n) => {\n  const firebase = await loadFirebaseStorage();\n\n  const id = `${nanoid(12)}`;\n\n  const encryptionKey = (await generateEncryptionKey())!;\n  const encryptedData = await encryptData(\n    encryptionKey,\n    serializeAsJSON(elements, appState, files, \"database\"),\n  );\n\n  const blob = new Blob(\n    [encryptedData.iv, new Uint8Array(encryptedData.encryptedBuffer)],\n    {\n      type: MIME_TYPES.binary,\n    },\n  );\n\n  await firebase\n    .storage()\n    .ref(`/migrations/scenes/${id}`)\n    .put(blob, {\n      customMetadata: {\n        data: JSON.stringify({ version: 2, name: appState.name }),\n        created: Date.now().toString(),\n      },\n    });\n\n  const filesMap = new Map<FileId, BinaryFileData>();\n  for (const element of elements) {\n    if (isInitializedImageElement(element) && files[element.fileId]) {\n      filesMap.set(element.fileId, files[element.fileId]);\n    }\n  }\n\n  if (filesMap.size) {\n    const filesToUpload = await encodeFilesForUpload({\n      files: filesMap,\n      encryptionKey,\n      maxBytes: FILE_UPLOAD_MAX_BYTES,\n    });\n\n    await saveFilesToFirebase({\n      prefix: `/migrations/files/scenes/${id}`,\n      files: filesToUpload,\n    });\n  }\n\n  window.open(\n    `https://plus.excalidraw.com/import?excalidraw=${id},${encryptionKey}`,\n  );\n};\n\nexport const ExportToExcalidrawPlus: React.FC<{\n  elements: readonly NonDeletedExcalidrawElement[];\n  appState: AppState;\n  files: BinaryFiles;\n  onError: (error: Error) => void;\n}> = ({ elements, appState, files, onError }) => {\n  const { t } = useI18n();\n  return (\n    <Card color=\"primary\">\n      <div className=\"Card-icon\">{excalidrawPlusIcon}</div>\n      <h2>Excalidraw+</h2>\n      <div className=\"Card-details\">\n        {t(\"exportDialog.excalidrawplus_description\")}\n      </div>\n      <ToolButton\n        className=\"Card-button\"\n        type=\"button\"\n        title={t(\"exportDialog.excalidrawplus_button\")}\n        aria-label={t(\"exportDialog.excalidrawplus_button\")}\n        showAriaLabel={true}\n        onClick={async () => {\n          try {\n            trackEvent(\"export\", \"eplus\", `ui (${getFrame()})`);\n            await exportToExcalidrawPlus(elements, appState, files);\n          } catch (error: any) {\n            console.error(error);\n            if (error.name !== \"AbortError\") {\n              onError(new Error(t(\"exportDialog.excalidrawplus_exportError\")));\n            }\n          }\n        }}\n      />\n    </Card>\n  );\n};\n","import { useSetAtom } from \"jotai\";\nimport React from \"react\";\nimport { appLangCodeAtom } from \"..\";\nimport { defaultLang, useI18n } from \"../../i18n\";\nimport { languages } from \"../../i18n\";\n\nexport const LanguageList = ({ style }: { style?: React.CSSProperties }) => {\n  const { t, langCode } = useI18n();\n  const setLangCode = useSetAtom(appLangCodeAtom);\n\n  return (\n    <select\n      className=\"dropdown-select dropdown-select__language\"\n      onChange={({ target }) => setLangCode(target.value)}\n      value={langCode}\n      aria-label={t(\"buttons.selectLanguage\")}\n      style={style}\n    >\n      <option key={defaultLang.code} value={defaultLang.code}>\n        {defaultLang.label}\n      </option>\n      {languages.map((lang) => (\n        <option key={lang.code} value={lang.code}>\n          {lang.label}\n        </option>\n      ))}\n    </select>\n  );\n};\n","import React from \"react\";\nimport { PlusPromoIcon } from \"../../components/icons\";\nimport { MainMenu } from \"../../packages/excalidraw/index\";\nimport { LanguageList } from \"./LanguageList\";\n\nexport const AppMainMenu: React.FC<{\n  setCollabDialogShown: (toggle: boolean) => any;\n  isCollaborating: boolean;\n}> = React.memo((props) => {\n  return (\n    <MainMenu>\n      <MainMenu.DefaultItems.LoadScene />\n      <MainMenu.DefaultItems.SaveToActiveFile />\n      <MainMenu.DefaultItems.Export />\n      <MainMenu.DefaultItems.SaveAsImage />\n      <MainMenu.DefaultItems.LiveCollaborationTrigger\n        isCollaborating={props.isCollaborating}\n        onSelect={() => props.setCollabDialogShown(true)}\n      />\n\n      <MainMenu.DefaultItems.Help />\n      <MainMenu.DefaultItems.ClearCanvas />\n      <MainMenu.Separator />\n      <MainMenu.ItemLink\n        icon={PlusPromoIcon}\n        href=\"https://plus.excalidraw.com/plus?utm_source=excalidraw&utm_medium=app&utm_content=hamburger\"\n        className=\"ExcalidrawPlus\"\n      >\n        Excalidraw+\n      </MainMenu.ItemLink>\n      <MainMenu.DefaultItems.Socials />\n      <MainMenu.Separator />\n      <MainMenu.DefaultItems.ToggleTheme />\n      <MainMenu.ItemCustom>\n        <LanguageList style={{ width: \"100%\" }} />\n      </MainMenu.ItemCustom>\n      <MainMenu.DefaultItems.ChangeCanvasBackground />\n    </MainMenu>\n  );\n});\n","import React from \"react\";\nimport { PlusPromoIcon } from \"../../components/icons\";\nimport { useI18n } from \"../../i18n\";\nimport { WelcomeScreen } from \"../../packages/excalidraw/index\";\nimport { isExcalidrawPlusSignedUser } from \"../app_constants\";\n\nexport const AppWelcomeScreen: React.FC<{\n  setCollabDialogShown: (toggle: boolean) => any;\n}> = React.memo((props) => {\n  const { t } = useI18n();\n  let headingContent;\n\n  if (isExcalidrawPlusSignedUser) {\n    headingContent = t(\"welcomeScreen.app.center_heading_plus\")\n      .split(/(Excalidraw\\+)/)\n      .map((bit, idx) => {\n        if (bit === \"Excalidraw+\") {\n          return (\n            <a\n              style={{ pointerEvents: \"all\" }}\n              href={`${process.env.REACT_APP_PLUS_APP}?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenSignedInUser`}\n              key={idx}\n            >\n              Excalidraw+\n            </a>\n          );\n        }\n        return bit;\n      });\n  } else {\n    headingContent = t(\"welcomeScreen.app.center_heading\");\n  }\n\n  return (\n    <WelcomeScreen>\n      <WelcomeScreen.Hints.MenuHint>\n        {t(\"welcomeScreen.app.menuHint\")}\n      </WelcomeScreen.Hints.MenuHint>\n      <WelcomeScreen.Hints.ToolbarHint />\n      <WelcomeScreen.Hints.HelpHint />\n      <WelcomeScreen.Center>\n        <WelcomeScreen.Center.Logo />\n        <WelcomeScreen.Center.Heading>\n          {headingContent}\n        </WelcomeScreen.Center.Heading>\n        <WelcomeScreen.Center.Menu>\n          <WelcomeScreen.Center.MenuItemLoadScene />\n          <WelcomeScreen.Center.MenuItemHelp />\n          <WelcomeScreen.Center.MenuItemLiveCollaborationTrigger\n            onSelect={() => props.setCollabDialogShown(true)}\n          />\n          {!isExcalidrawPlusSignedUser && (\n            <WelcomeScreen.Center.MenuItemLink\n              href=\"https://plus.excalidraw.com/plus?utm_source=excalidraw&utm_medium=app&utm_content=welcomeScreenGuest\"\n              shortcut={null}\n              icon={PlusPromoIcon}\n            >\n              Try Excalidraw Plus!\n            </WelcomeScreen.Center.MenuItemLink>\n          )}\n        </WelcomeScreen.Center.Menu>\n      </WelcomeScreen.Center>\n    </WelcomeScreen>\n  );\n});\n","import { shield } from \"../../components/icons\";\nimport { Tooltip } from \"../../components/Tooltip\";\nimport { useI18n } from \"../../i18n\";\n\nexport const EncryptedIcon = () => {\n  const { t } = useI18n();\n\n  return (\n    <a\n      className=\"encrypted-icon tooltip\"\n      href=\"https://blog.excalidraw.com/end-to-end-encryption/\"\n      target=\"_blank\"\n      rel=\"noopener noreferrer\"\n      aria-label={t(\"encrypted.link\")}\n    >\n      <Tooltip label={t(\"encrypted.tooltip\")} long={true}>\n        {shield}\n      </Tooltip>\n    </a>\n  );\n};\n","import { isExcalidrawPlusSignedUser } from \"../app_constants\";\n\nexport const ExcalidrawPlusAppLink = () => {\n  if (!isExcalidrawPlusSignedUser) {\n    return null;\n  }\n  return (\n    <a\n      href={`${process.env.REACT_APP_PLUS_APP}?utm_source=excalidraw&utm_medium=app&utm_content=signedInUserRedirectButton#excalidraw-redirect`}\n      target=\"_blank\"\n      rel=\"noreferrer\"\n      className=\"plus-button\"\n    >\n      Go to Excalidraw+\n    </a>\n  );\n};\n","import React from \"react\";\nimport { Footer } from \"../../packages/excalidraw/index\";\nimport { EncryptedIcon } from \"./EncryptedIcon\";\nimport { ExcalidrawPlusAppLink } from \"./ExcalidrawPlusAppLink\";\n\nexport const AppFooter = React.memo(() => {\n  return (\n    <Footer>\n      <div\n        style={{\n          display: \"flex\",\n          gap: \".5rem\",\n          alignItems: \"center\",\n        }}\n      >\n        <ExcalidrawPlusAppLink />\n        <EncryptedIcon />\n      </div>\n    </Footer>\n  );\n});\n","import polyfill from \"../polyfill\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { trackEvent } from \"../analytics\";\nimport { getDefaultAppState } from \"../appState\";\nimport { ErrorDialog } from \"../components/ErrorDialog\";\nimport { TopErrorBoundary } from \"../components/TopErrorBoundary\";\nimport {\n  APP_NAME,\n  EVENT,\n  THEME,\n  TITLE_TIMEOUT,\n  VERSION_TIMEOUT,\n} from \"../constants\";\nimport { loadFromBlob } from \"../data/blob\";\nimport {\n  ExcalidrawElement,\n  FileId,\n  NonDeletedExcalidrawElement,\n  Theme,\n} from \"../element/types\";\nimport { useCallbackRefState } from \"../hooks/useCallbackRefState\";\nimport { t } from \"../i18n\";\nimport {\n  Excalidraw,\n  defaultLang,\n  LiveCollaborationTrigger,\n} from \"../packages/excalidraw/index\";\nimport {\n  AppState,\n  LibraryItems,\n  ExcalidrawImperativeAPI,\n  BinaryFiles,\n  ExcalidrawInitialDataState,\n} from \"../types\";\nimport {\n  debounce,\n  getVersion,\n  getFrame,\n  isTestEnv,\n  preventUnload,\n  ResolvablePromise,\n  resolvablePromise,\n} from \"../utils\";\nimport {\n  FIREBASE_STORAGE_PREFIXES,\n  STORAGE_KEYS,\n  SYNC_BROWSER_TABS_TIMEOUT,\n} from \"./app_constants\";\nimport Collab, {\n  CollabAPI,\n  collabAPIAtom,\n  collabDialogShownAtom,\n  isCollaboratingAtom,\n  isOfflineAtom,\n} from \"./collab/Collab\";\nimport {\n  exportToBackend,\n  getCollaborationLinkData,\n  isCollaborationLink,\n  loadScene,\n} from \"./data\";\nimport {\n  getLibraryItemsFromStorage,\n  importFromLocalStorage,\n  importUsernameFromLocalStorage,\n} from \"./data/localStorage\";\nimport CustomStats from \"./CustomStats\";\nimport { restore, restoreAppState, RestoredDataState } from \"../data/restore\";\nimport { ExportToExcalidrawPlus } from \"./components/ExportToExcalidrawPlus\";\nimport { updateStaleImageStatuses } from \"./data/FileManager\";\nimport { newElementWith } from \"../element/mutateElement\";\nimport { isInitializedImageElement } from \"../element/typeChecks\";\nimport { loadFilesFromFirebase } from \"./data/firebase\";\nimport { LocalData } from \"./data/LocalData\";\nimport { isBrowserStorageStateNewer } from \"./data/tabSync\";\nimport clsx from \"clsx\";\nimport { reconcileElements } from \"./collab/reconciliation\";\nimport { parseLibraryTokensFromUrl, useHandleLibrary } from \"../data/library\";\nimport { AppMainMenu } from \"./components/AppMainMenu\";\nimport { AppWelcomeScreen } from \"./components/AppWelcomeScreen\";\nimport { AppFooter } from \"./components/AppFooter\";\nimport { atom, Provider, useAtom, useAtomValue } from \"jotai\";\nimport { useAtomWithInitialValue } from \"../jotai\";\nimport { appJotaiStore } from \"./app-jotai\";\n\nimport \"./index.scss\";\nimport { ResolutionType } from \"../utility-types\";\n\npolyfill();\n\nwindow.EXCALIDRAW_THROTTLE_RENDER = true;\n\nconst languageDetector = new LanguageDetector();\nlanguageDetector.init({\n  languageUtils: {},\n});\n\nconst initializeScene = async (opts: {\n  collabAPI: CollabAPI;\n  excalidrawAPI: ExcalidrawImperativeAPI;\n}): Promise<\n  { scene: ExcalidrawInitialDataState | null } & (\n    | { isExternalScene: true; id: string; key: string }\n    | { isExternalScene: false; id?: null; key?: null }\n  )\n> => {\n  const searchParams = new URLSearchParams(window.location.search);\n  const id = searchParams.get(\"id\");\n  const jsonBackendMatch = window.location.hash.match(\n    /^#json=([a-zA-Z0-9_-]+),([a-zA-Z0-9_-]+)$/,\n  );\n  const externalUrlMatch = window.location.hash.match(/^#url=(.*)$/);\n\n  const localDataState = importFromLocalStorage();\n\n  let scene: RestoredDataState & {\n    scrollToContent?: boolean;\n  } = await loadScene(null, null, localDataState);\n\n  let roomLinkData = getCollaborationLinkData(window.location.href);\n  const isExternalScene = !!(id || jsonBackendMatch || roomLinkData);\n  if (isExternalScene) {\n    if (\n      // don't prompt if scene is empty\n      !scene.elements.length ||\n      // don't prompt for collab scenes because we don't override local storage\n      roomLinkData ||\n      // otherwise, prompt whether user wants to override current scene\n      window.confirm(t(\"alerts.loadSceneOverridePrompt\"))\n    ) {\n      if (jsonBackendMatch) {\n        scene = await loadScene(\n          jsonBackendMatch[1],\n          jsonBackendMatch[2],\n          localDataState,\n        );\n      }\n      scene.scrollToContent = true;\n      if (!roomLinkData) {\n        window.history.replaceState({}, APP_NAME, window.location.origin);\n      }\n    } else {\n      // https://github.com/excalidraw/excalidraw/issues/1919\n      if (document.hidden) {\n        return new Promise((resolve, reject) => {\n          window.addEventListener(\n            \"focus\",\n            () => initializeScene(opts).then(resolve).catch(reject),\n            {\n              once: true,\n            },\n          );\n        });\n      }\n\n      roomLinkData = null;\n      window.history.replaceState({}, APP_NAME, window.location.origin);\n    }\n  } else if (externalUrlMatch) {\n    window.history.replaceState({}, APP_NAME, window.location.origin);\n\n    const url = externalUrlMatch[1];\n    try {\n      const request = await fetch(window.decodeURIComponent(url));\n      const data = await loadFromBlob(await request.blob(), null, null);\n      if (\n        !scene.elements.length ||\n        window.confirm(t(\"alerts.loadSceneOverridePrompt\"))\n      ) {\n        return { scene: data, isExternalScene };\n      }\n    } catch (error: any) {\n      return {\n        scene: {\n          appState: {\n            errorMessage: t(\"alerts.invalidSceneUrl\"),\n          },\n        },\n        isExternalScene,\n      };\n    }\n  }\n\n  if (roomLinkData) {\n    const { excalidrawAPI } = opts;\n\n    const scene = await opts.collabAPI.startCollaboration(roomLinkData);\n\n    return {\n      // when collaborating, the state may have already been updated at this\n      // point (we may have received updates from other clients), so reconcile\n      // elements and appState with existing state\n      scene: {\n        ...scene,\n        appState: {\n          ...restoreAppState(\n            {\n              ...scene?.appState,\n              theme: localDataState?.appState?.theme || scene?.appState?.theme,\n            },\n            excalidrawAPI.getAppState(),\n          ),\n          // necessary if we're invoking from a hashchange handler which doesn't\n          // go through App.initializeScene() that resets this flag\n          isLoading: false,\n        },\n        elements: reconcileElements(\n          scene?.elements || [],\n          excalidrawAPI.getSceneElementsIncludingDeleted(),\n          excalidrawAPI.getAppState(),\n        ),\n      },\n      isExternalScene: true,\n      id: roomLinkData.roomId,\n      key: roomLinkData.roomKey,\n    };\n  } else if (scene) {\n    return isExternalScene && jsonBackendMatch\n      ? {\n          scene,\n          isExternalScene,\n          id: jsonBackendMatch[1],\n          key: jsonBackendMatch[2],\n        }\n      : { scene, isExternalScene: false };\n  }\n  return { scene: null, isExternalScene: false };\n};\n\nconst detectedLangCode = languageDetector.detect() || defaultLang.code;\nexport const appLangCodeAtom = atom(\n  Array.isArray(detectedLangCode) ? detectedLangCode[0] : detectedLangCode,\n);\n\nconst ExcalidrawWrapper = () => {\n  const [errorMessage, setErrorMessage] = useState(\"\");\n  const [langCode, setLangCode] = useAtom(appLangCodeAtom);\n\n  // initial state\n  // ---------------------------------------------------------------------------\n\n  const initialStatePromiseRef = useRef<{\n    promise: ResolvablePromise<ExcalidrawInitialDataState | null>;\n  }>({ promise: null! });\n  if (!initialStatePromiseRef.current.promise) {\n    initialStatePromiseRef.current.promise =\n      resolvablePromise<ExcalidrawInitialDataState | null>();\n  }\n\n  useEffect(() => {\n    trackEvent(\"load\", \"frame\", getFrame());\n    // Delayed so that the app has a time to load the latest SW\n    setTimeout(() => {\n      trackEvent(\"load\", \"version\", getVersion());\n    }, VERSION_TIMEOUT);\n  }, []);\n\n  const [excalidrawAPI, excalidrawRefCallback] =\n    useCallbackRefState<ExcalidrawImperativeAPI>();\n\n  const [collabAPI] = useAtom(collabAPIAtom);\n  const [, setCollabDialogShown] = useAtom(collabDialogShownAtom);\n  const [isCollaborating] = useAtomWithInitialValue(isCollaboratingAtom, () => {\n    return isCollaborationLink(window.location.href);\n  });\n\n  useHandleLibrary({\n    excalidrawAPI,\n    getInitialLibraryItems: getLibraryItemsFromStorage,\n  });\n\n  useEffect(() => {\n    if (!collabAPI || !excalidrawAPI) {\n      return;\n    }\n\n    const loadImages = (\n      data: ResolutionType<typeof initializeScene>,\n      isInitialLoad = false,\n    ) => {\n      if (!data.scene) {\n        return;\n      }\n      if (collabAPI.isCollaborating()) {\n        if (data.scene.elements) {\n          collabAPI\n            .fetchImageFilesFromFirebase({\n              elements: data.scene.elements,\n              forceFetchFiles: true,\n            })\n            .then(({ loadedFiles, erroredFiles }) => {\n              excalidrawAPI.addFiles(loadedFiles);\n              updateStaleImageStatuses({\n                excalidrawAPI,\n                erroredFiles,\n                elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n              });\n            });\n        }\n      } else {\n        const fileIds =\n          data.scene.elements?.reduce((acc, element) => {\n            if (isInitializedImageElement(element)) {\n              return acc.concat(element.fileId);\n            }\n            return acc;\n          }, [] as FileId[]) || [];\n\n        if (data.isExternalScene) {\n          loadFilesFromFirebase(\n            `${FIREBASE_STORAGE_PREFIXES.shareLinkFiles}/${data.id}`,\n            data.key,\n            fileIds,\n          ).then(({ loadedFiles, erroredFiles }) => {\n            excalidrawAPI.addFiles(loadedFiles);\n            updateStaleImageStatuses({\n              excalidrawAPI,\n              erroredFiles,\n              elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n            });\n          });\n        } else if (isInitialLoad) {\n          if (fileIds.length) {\n            LocalData.fileStorage\n              .getFiles(fileIds)\n              .then(({ loadedFiles, erroredFiles }) => {\n                if (loadedFiles.length) {\n                  excalidrawAPI.addFiles(loadedFiles);\n                }\n                updateStaleImageStatuses({\n                  excalidrawAPI,\n                  erroredFiles,\n                  elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n                });\n              });\n          }\n          // on fresh load, clear unused files from IDB (from previous\n          // session)\n          LocalData.fileStorage.clearObsoleteFiles({ currentFileIds: fileIds });\n        }\n      }\n    };\n\n    initializeScene({ collabAPI, excalidrawAPI }).then(async (data) => {\n      loadImages(data, /* isInitialLoad */ true);\n      initialStatePromiseRef.current.promise.resolve(data.scene);\n    });\n\n    const onHashChange = async (event: HashChangeEvent) => {\n      event.preventDefault();\n      const libraryUrlTokens = parseLibraryTokensFromUrl();\n      if (!libraryUrlTokens) {\n        if (\n          collabAPI.isCollaborating() &&\n          !isCollaborationLink(window.location.href)\n        ) {\n          collabAPI.stopCollaboration(false);\n        }\n        excalidrawAPI.updateScene({ appState: { isLoading: true } });\n\n        initializeScene({ collabAPI, excalidrawAPI }).then((data) => {\n          loadImages(data);\n          if (data.scene) {\n            excalidrawAPI.updateScene({\n              ...data.scene,\n              ...restore(data.scene, null, null, { repairBindings: true }),\n              commitToHistory: true,\n            });\n          }\n        });\n      }\n    };\n\n    const titleTimeout = setTimeout(\n      () => (document.title = APP_NAME),\n      TITLE_TIMEOUT,\n    );\n\n    const syncData = debounce(() => {\n      if (isTestEnv()) {\n        return;\n      }\n      if (!document.hidden && !collabAPI.isCollaborating()) {\n        // don't sync if local state is newer or identical to browser state\n        if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_DATA_STATE)) {\n          const localDataState = importFromLocalStorage();\n          const username = importUsernameFromLocalStorage();\n          let langCode = languageDetector.detect() || defaultLang.code;\n          if (Array.isArray(langCode)) {\n            langCode = langCode[0];\n          }\n          setLangCode(langCode);\n          excalidrawAPI.updateScene({\n            ...localDataState,\n          });\n          excalidrawAPI.updateLibrary({\n            libraryItems: getLibraryItemsFromStorage(),\n          });\n          collabAPI.setUsername(username || \"\");\n        }\n\n        if (isBrowserStorageStateNewer(STORAGE_KEYS.VERSION_FILES)) {\n          const elements = excalidrawAPI.getSceneElementsIncludingDeleted();\n          const currFiles = excalidrawAPI.getFiles();\n          const fileIds =\n            elements?.reduce((acc, element) => {\n              if (\n                isInitializedImageElement(element) &&\n                // only load and update images that aren't already loaded\n                !currFiles[element.fileId]\n              ) {\n                return acc.concat(element.fileId);\n              }\n              return acc;\n            }, [] as FileId[]) || [];\n          if (fileIds.length) {\n            LocalData.fileStorage\n              .getFiles(fileIds)\n              .then(({ loadedFiles, erroredFiles }) => {\n                if (loadedFiles.length) {\n                  excalidrawAPI.addFiles(loadedFiles);\n                }\n                updateStaleImageStatuses({\n                  excalidrawAPI,\n                  erroredFiles,\n                  elements: excalidrawAPI.getSceneElementsIncludingDeleted(),\n                });\n              });\n          }\n        }\n      }\n    }, SYNC_BROWSER_TABS_TIMEOUT);\n\n    const onUnload = () => {\n      LocalData.flushSave();\n    };\n\n    const visibilityChange = (event: FocusEvent | Event) => {\n      if (event.type === EVENT.BLUR || document.hidden) {\n        LocalData.flushSave();\n      }\n      if (\n        event.type === EVENT.VISIBILITY_CHANGE ||\n        event.type === EVENT.FOCUS\n      ) {\n        syncData();\n      }\n    };\n\n    window.addEventListener(EVENT.HASHCHANGE, onHashChange, false);\n    window.addEventListener(EVENT.UNLOAD, onUnload, false);\n    window.addEventListener(EVENT.BLUR, visibilityChange, false);\n    document.addEventListener(EVENT.VISIBILITY_CHANGE, visibilityChange, false);\n    window.addEventListener(EVENT.FOCUS, visibilityChange, false);\n    return () => {\n      window.removeEventListener(EVENT.HASHCHANGE, onHashChange, false);\n      window.removeEventListener(EVENT.UNLOAD, onUnload, false);\n      window.removeEventListener(EVENT.BLUR, visibilityChange, false);\n      window.removeEventListener(EVENT.FOCUS, visibilityChange, false);\n      document.removeEventListener(\n        EVENT.VISIBILITY_CHANGE,\n        visibilityChange,\n        false,\n      );\n      clearTimeout(titleTimeout);\n    };\n  }, [collabAPI, excalidrawAPI, setLangCode]);\n\n  useEffect(() => {\n    const unloadHandler = (event: BeforeUnloadEvent) => {\n      LocalData.flushSave();\n\n      if (\n        excalidrawAPI &&\n        LocalData.fileStorage.shouldPreventUnload(\n          excalidrawAPI.getSceneElements(),\n        )\n      ) {\n        preventUnload(event);\n      }\n    };\n    window.addEventListener(EVENT.BEFORE_UNLOAD, unloadHandler);\n    return () => {\n      window.removeEventListener(EVENT.BEFORE_UNLOAD, unloadHandler);\n    };\n  }, [excalidrawAPI]);\n\n  useEffect(() => {\n    languageDetector.cacheUserLanguage(langCode);\n  }, [langCode]);\n\n  const [theme, setTheme] = useState<Theme>(\n    () =>\n      localStorage.getItem(STORAGE_KEYS.LOCAL_STORAGE_THEME) ||\n      // FIXME migration from old LS scheme. Can be removed later. #5660\n      importFromLocalStorage().appState?.theme ||\n      THEME.LIGHT,\n  );\n\n  useEffect(() => {\n    localStorage.setItem(STORAGE_KEYS.LOCAL_STORAGE_THEME, theme);\n    // currently only used for body styling during init (see public/index.html),\n    // but may change in the future\n    document.documentElement.classList.toggle(\"dark\", theme === THEME.DARK);\n  }, [theme]);\n\n  const onChange = (\n    elements: readonly ExcalidrawElement[],\n    appState: AppState,\n    files: BinaryFiles,\n  ) => {\n    if (collabAPI?.isCollaborating()) {\n      collabAPI.syncElements(elements);\n    }\n\n    setTheme(appState.theme);\n\n    // this check is redundant, but since this is a hot path, it's best\n    // not to evaludate the nested expression every time\n    if (!LocalData.isSavePaused()) {\n      LocalData.save(elements, appState, files, () => {\n        if (excalidrawAPI) {\n          let didChange = false;\n\n          const elements = excalidrawAPI\n            .getSceneElementsIncludingDeleted()\n            .map((element) => {\n              if (\n                LocalData.fileStorage.shouldUpdateImageElementStatus(element)\n              ) {\n                const newElement = newElementWith(element, { status: \"saved\" });\n                if (newElement !== element) {\n                  didChange = true;\n                }\n                return newElement;\n              }\n              return element;\n            });\n\n          if (didChange) {\n            excalidrawAPI.updateScene({\n              elements,\n            });\n          }\n        }\n      });\n    }\n  };\n\n  const onExportToBackend = async (\n    exportedElements: readonly NonDeletedExcalidrawElement[],\n    appState: AppState,\n    files: BinaryFiles,\n    canvas: HTMLCanvasElement | null,\n  ) => {\n    if (exportedElements.length === 0) {\n      return window.alert(t(\"alerts.cannotExportEmptyCanvas\"));\n    }\n    if (canvas) {\n      try {\n        await exportToBackend(\n          exportedElements,\n          {\n            ...appState,\n            viewBackgroundColor: appState.exportBackground\n              ? appState.viewBackgroundColor\n              : getDefaultAppState().viewBackgroundColor,\n          },\n          files,\n        );\n      } catch (error: any) {\n        if (error.name !== \"AbortError\") {\n          const { width, height } = canvas;\n          console.error(error, { width, height });\n          setErrorMessage(error.message);\n        }\n      }\n    }\n  };\n\n  const renderCustomStats = (\n    elements: readonly NonDeletedExcalidrawElement[],\n    appState: AppState,\n  ) => {\n    return (\n      <CustomStats\n        setToast={(message) => excalidrawAPI!.setToast({ message })}\n        appState={appState}\n        elements={elements}\n      />\n    );\n  };\n\n  const onLibraryChange = async (items: LibraryItems) => {\n    if (!items.length) {\n      localStorage.removeItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY);\n      return;\n    }\n    const serializedItems = JSON.stringify(items);\n    localStorage.setItem(STORAGE_KEYS.LOCAL_STORAGE_LIBRARY, serializedItems);\n  };\n\n  const isOffline = useAtomValue(isOfflineAtom);\n\n  return (\n    <div\n      style={{ height: \"100%\" }}\n      className={clsx(\"excalidraw-app\", {\n        \"is-collaborating\": isCollaborating,\n      })}\n    >\n      <Excalidraw\n        ref={excalidrawRefCallback}\n        onChange={onChange}\n        initialData={initialStatePromiseRef.current.promise}\n        isCollaborating={isCollaborating}\n        onPointerUpdate={collabAPI?.onPointerUpdate}\n        UIOptions={{\n          canvasActions: {\n            toggleTheme: true,\n            export: {\n              onExportToBackend,\n              renderCustomUI: (elements, appState, files) => {\n                return (\n                  <ExportToExcalidrawPlus\n                    elements={elements}\n                    appState={appState}\n                    files={files}\n                    onError={(error) => {\n                      excalidrawAPI?.updateScene({\n                        appState: {\n                          errorMessage: error.message,\n                        },\n                      });\n                    }}\n                  />\n                );\n              },\n            },\n          },\n        }}\n        langCode={langCode}\n        renderCustomStats={renderCustomStats}\n        detectScroll={false}\n        handleKeyboardGlobally={true}\n        onLibraryChange={onLibraryChange}\n        autoFocus={true}\n        theme={theme}\n        renderTopRightUI={(isMobile) => {\n          if (isMobile) {\n            return null;\n          }\n          return (\n            <LiveCollaborationTrigger\n              isCollaborating={isCollaborating}\n              onSelect={() => setCollabDialogShown(true)}\n            />\n          );\n        }}\n      >\n        <AppMainMenu\n          setCollabDialogShown={setCollabDialogShown}\n          isCollaborating={isCollaborating}\n        />\n        <AppWelcomeScreen setCollabDialogShown={setCollabDialogShown} />\n        <AppFooter />\n        {isCollaborating && isOffline && (\n          <div className=\"collab-offline-warning\">\n            {t(\"alerts.collabOfflineWarning\")}\n          </div>\n        )}\n      </Excalidraw>\n      {excalidrawAPI && <Collab excalidrawAPI={excalidrawAPI} />}\n      {errorMessage && (\n        <ErrorDialog\n          message={errorMessage}\n          onClose={() => setErrorMessage(\"\")}\n        />\n      )}\n    </div>\n  );\n};\n\nconst ExcalidrawApp = () => {\n  return (\n    <TopErrorBoundary>\n      <Provider unstable_createStore={() => appJotaiStore}>\n        <ExcalidrawWrapper />\n      </Provider>\n    </TopErrorBoundary>\n  );\n};\n\nexport default ExcalidrawApp;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read https://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n  window.location.hostname === \"localhost\" ||\n    // [::1] is the IPv6 localhost address.\n    window.location.hostname === \"[::1]\" ||\n    // 127.0.0.0/8 are considered localhost for IPv4.\n    window.location.hostname.match(\n      /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/,\n    ),\n);\n\ntype Config = {\n  onSuccess?: (registration: ServiceWorkerRegistration) => void;\n  onUpdate?: (registration: ServiceWorkerRegistration) => void;\n};\n\nexport const register = (config?: Config) => {\n  if (\n    (process.env.NODE_ENV === \"production\" ||\n      process.env.REACT_APP_DEV_ENABLE_SW?.toLowerCase() === \"true\") &&\n    \"serviceWorker\" in navigator\n  ) {\n    // The URL constructor is available in all browsers that support SW.\n    const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n    if (publicUrl.origin !== window.location.origin) {\n      // Our service worker won't work if PUBLIC_URL is on a different origin\n      // from what our page is served on. This might happen if a CDN is used to\n      // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n      return;\n    }\n\n    window.addEventListener(\"load\", () => {\n      const isWebexLP = window.location.pathname.startsWith(\"/webex\");\n      if (isWebexLP) {\n        unregister(() => {\n          window.location.reload();\n        });\n        return false;\n      }\n      const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n      if (isLocalhost) {\n        // This is running on localhost. Let's check if a service worker still exists or not.\n        checkValidServiceWorker(swUrl, config);\n\n        // Add some additional logging to localhost, pointing developers to the\n        // service worker/PWA documentation.\n        navigator.serviceWorker.ready.then(() => {\n          console.info(\n            \"This web app is being served cache-first by a service \" +\n              \"worker. To learn more, visit https://bit.ly/CRA-PWA\",\n          );\n        });\n      } else {\n        // Is not localhost. Just register service worker\n        registerValidSW(swUrl, config);\n      }\n    });\n  }\n};\n\nconst registerValidSW = (swUrl: string, config?: Config) => {\n  navigator.serviceWorker\n    .register(swUrl)\n    .then((registration) => {\n      registration.onupdatefound = () => {\n        const installingWorker = registration.installing;\n        if (installingWorker == null) {\n          return;\n        }\n        installingWorker.onstatechange = () => {\n          if (installingWorker.state === \"installed\") {\n            if (navigator.serviceWorker.controller) {\n              // At this point, the updated precached content has been fetched,\n              // but the previous service worker will still serve the older\n              // content until all client tabs are closed.\n\n              console.info(\n                \"New content is available and will be used when all tabs for this page are closed.\",\n              );\n\n              // Execute callback\n              if (config && config.onUpdate) {\n                config.onUpdate(registration);\n              }\n            } else {\n              // At this point, everything has been precached.\n              // It's the perfect time to display a\n              // \"Content is cached for offline use.\" message.\n\n              console.info(\"Content is cached for offline use.\");\n\n              // Execute callback\n              if (config && config.onSuccess) {\n                config.onSuccess(registration);\n              }\n            }\n          }\n        };\n      };\n    })\n    .catch((error) => {\n      console.error(\"Error during service worker registration:\", error);\n    });\n};\n\nconst checkValidServiceWorker = (swUrl: string, config?: Config) => {\n  // Check if the service worker can be found. If it can't reload the page.\n  fetch(swUrl, {\n    headers: { \"Service-Worker\": \"script\" },\n  })\n    .then((response) => {\n      // Ensure service worker exists, and that we really are getting a JS file.\n      const contentType = response.headers.get(\"content-type\");\n      if (\n        response.status === 404 ||\n        (contentType != null && contentType.indexOf(\"javascript\") === -1)\n      ) {\n        // No service worker found. Probably a different app. Reload the page.\n        navigator.serviceWorker.ready.then((registration) => {\n          registration.unregister().then(() => {\n            window.location.reload();\n          });\n        });\n      } else {\n        // Service worker found. Proceed as normal.\n        registerValidSW(swUrl, config);\n      }\n    })\n    .catch((error) => {\n      console.info(\n        \"No internet connection found. App is running in offline mode.\",\n        error.message,\n      );\n    });\n};\n\nexport const unregister = (callback?: () => void) => {\n  if (\"serviceWorker\" in navigator) {\n    navigator.serviceWorker.ready\n      .then((registration) => {\n        return registration.unregister();\n      })\n      .then(() => {\n        callback?.();\n      })\n      .catch((error) => {\n        console.error(error.message);\n      });\n  }\n};\n","import { register as registerServiceWorker } from \"../serviceWorkerRegistration\";\nimport { EVENT } from \"../constants\";\n\n// On Apple mobile devices add the proprietary app icon and splashscreen markup.\n// No one should have to do this manually, and eventually this annoyance will\n// go away once https://bugs.webkit.org/show_bug.cgi?id=183937 is fixed.\nif (\n  /\\b(iPad|iPhone|iPod|Safari)\\b/.test(navigator.userAgent) &&\n  !matchMedia(\"(display-mode: standalone)\").matches\n) {\n  import(/* webpackChunkName: \"pwacompat\" */ \"pwacompat\");\n}\n\nregisterServiceWorker({\n  onUpdate: (registration) => {\n    const waitingServiceWorker = registration.waiting;\n    if (waitingServiceWorker) {\n      waitingServiceWorker.addEventListener(\n        EVENT.STATE_CHANGE,\n        (event: Event) => {\n          const target = event.target as ServiceWorker;\n          const state = target.state as ServiceWorkerState;\n          if (state === \"activated\") {\n            window.location.reload();\n          }\n        },\n      );\n      waitingServiceWorker.postMessage({ type: \"SKIP_WAITING\" });\n    }\n  },\n});\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { Event, Integration } from '@sentry/types';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\n\n// \"Script error.\" is hard coded into browsers for errors that it can't read.\n// this is the result of a script being pulled in from an external domain and CORS.\nconst DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n\n/** JSDoc */\ninterface InboundFiltersOptions {\n  allowUrls: Array<string | RegExp>;\n  denyUrls: Array<string | RegExp>;\n  ignoreErrors: Array<string | RegExp>;\n  ignoreInternal: boolean;\n\n  /** @deprecated use {@link InboundFiltersOptions.allowUrls} instead. */\n  whitelistUrls: Array<string | RegExp>;\n  /** @deprecated use {@link InboundFiltersOptions.denyUrls} instead. */\n  blacklistUrls: Array<string | RegExp>;\n}\n\n/** Inbound filters configurable by the user */\nexport class InboundFilters implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'InboundFilters';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = InboundFilters.id;\n\n  public constructor(private readonly _options: Partial<InboundFiltersOptions> = {}) {}\n\n  /**\n   * @inheritDoc\n   */\n  public setupOnce(): void {\n    addGlobalEventProcessor((event: Event) => {\n      const hub = getCurrentHub();\n      if (!hub) {\n        return event;\n      }\n      const self = hub.getIntegration(InboundFilters);\n      if (self) {\n        const client = hub.getClient();\n        const clientOptions = client ? client.getOptions() : {};\n        const options = self._mergeOptions(clientOptions);\n        if (self._shouldDropEvent(event, options)) {\n          return null;\n        }\n      }\n      return event;\n    });\n  }\n\n  /** JSDoc */\n  private _shouldDropEvent(event: Event, options: Partial<InboundFiltersOptions>): boolean {\n    if (this._isSentryError(event, options)) {\n      logger.warn(`Event dropped due to being internal Sentry Error.\\nEvent: ${getEventDescription(event)}`);\n      return true;\n    }\n    if (this._isIgnoredError(event, options)) {\n      logger.warn(\n        `Event dropped due to being matched by \\`ignoreErrors\\` option.\\nEvent: ${getEventDescription(event)}`,\n      );\n      return true;\n    }\n    if (this._isDeniedUrl(event, options)) {\n      logger.warn(\n        `Event dropped due to being matched by \\`denyUrls\\` option.\\nEvent: ${getEventDescription(\n          event,\n        )}.\\nUrl: ${this._getEventFilterUrl(event)}`,\n      );\n      return true;\n    }\n    if (!this._isAllowedUrl(event, options)) {\n      logger.warn(\n        `Event dropped due to not being matched by \\`allowUrls\\` option.\\nEvent: ${getEventDescription(\n          event,\n        )}.\\nUrl: ${this._getEventFilterUrl(event)}`,\n      );\n      return true;\n    }\n    return false;\n  }\n\n  /** JSDoc */\n  private _isSentryError(event: Event, options: Partial<InboundFiltersOptions>): boolean {\n    if (!options.ignoreInternal) {\n      return false;\n    }\n\n    try {\n      return (\n        (event &&\n          event.exception &&\n          event.exception.values &&\n          event.exception.values[0] &&\n          event.exception.values[0].type === 'SentryError') ||\n        false\n      );\n    } catch (_oO) {\n      return false;\n    }\n  }\n\n  /** JSDoc */\n  private _isIgnoredError(event: Event, options: Partial<InboundFiltersOptions>): boolean {\n    if (!options.ignoreErrors || !options.ignoreErrors.length) {\n      return false;\n    }\n\n    return this._getPossibleEventMessages(event).some(message =>\n      // Not sure why TypeScript complains here...\n      (options.ignoreErrors as Array<RegExp | string>).some(pattern => isMatchingPattern(message, pattern)),\n    );\n  }\n\n  /** JSDoc */\n  private _isDeniedUrl(event: Event, options: Partial<InboundFiltersOptions>): boolean {\n    // TODO: Use Glob instead?\n    if (!options.denyUrls || !options.denyUrls.length) {\n      return false;\n    }\n    const url = this._getEventFilterUrl(event);\n    return !url ? false : options.denyUrls.some(pattern => isMatchingPattern(url, pattern));\n  }\n\n  /** JSDoc */\n  private _isAllowedUrl(event: Event, options: Partial<InboundFiltersOptions>): boolean {\n    // TODO: Use Glob instead?\n    if (!options.allowUrls || !options.allowUrls.length) {\n      return true;\n    }\n    const url = this._getEventFilterUrl(event);\n    return !url ? true : options.allowUrls.some(pattern => isMatchingPattern(url, pattern));\n  }\n\n  /** JSDoc */\n  private _mergeOptions(clientOptions: Partial<InboundFiltersOptions> = {}): Partial<InboundFiltersOptions> {\n    return {\n      allowUrls: [\n        // eslint-disable-next-line deprecation/deprecation\n        ...(this._options.whitelistUrls || []),\n        ...(this._options.allowUrls || []),\n        // eslint-disable-next-line deprecation/deprecation\n        ...(clientOptions.whitelistUrls || []),\n        ...(clientOptions.allowUrls || []),\n      ],\n      denyUrls: [\n        // eslint-disable-next-line deprecation/deprecation\n        ...(this._options.blacklistUrls || []),\n        ...(this._options.denyUrls || []),\n        // eslint-disable-next-line deprecation/deprecation\n        ...(clientOptions.blacklistUrls || []),\n        ...(clientOptions.denyUrls || []),\n      ],\n      ignoreErrors: [\n        ...(this._options.ignoreErrors || []),\n        ...(clientOptions.ignoreErrors || []),\n        ...DEFAULT_IGNORE_ERRORS,\n      ],\n      ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n    };\n  }\n\n  /** JSDoc */\n  private _getPossibleEventMessages(event: Event): string[] {\n    if (event.message) {\n      return [event.message];\n    }\n    if (event.exception) {\n      try {\n        const { type = '', value = '' } = (event.exception.values && event.exception.values[0]) || {};\n        return [`${value}`, `${type}: ${value}`];\n      } catch (oO) {\n        logger.error(`Cannot extract message for event ${getEventDescription(event)}`);\n        return [];\n      }\n    }\n    return [];\n  }\n\n  /** JSDoc */\n  private _getEventFilterUrl(event: Event): string | null {\n    try {\n      if (event.stacktrace) {\n        const frames = event.stacktrace.frames;\n        return (frames && frames[frames.length - 1].filename) || null;\n      }\n      if (event.exception) {\n        const frames =\n          event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n        return (frames && frames[frames.length - 1].filename) || null;\n      }\n      return null;\n    } catch (oO) {\n      logger.error(`Cannot extract url for event ${getEventDescription(event)}`);\n      return null;\n    }\n  }\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\n\nlet originalFunctionToString: () => void;\n\n/** Patch toString calls to return proper name for wrapped functions */\nexport class FunctionToString implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'FunctionToString';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = FunctionToString.id;\n\n  /**\n   * @inheritDoc\n   */\n  public setupOnce(): void {\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    originalFunctionToString = Function.prototype.toString;\n\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    Function.prototype.toString = function(this: WrappedFunction, ...args: any[]): string {\n      const context = this.__sentry_original__ || this;\n      return originalFunctionToString.apply(context, args);\n    };\n  }\n}\n","import { logger } from './logger';\nimport { getGlobalObject } from './misc';\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n  try {\n    new ErrorEvent('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n  try {\n    // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n    // 1 argument required, but only 0 present.\n    // @ts-ignore It really needs 1 argument, not 0.\n    new DOMError('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n  try {\n    new DOMException('');\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch(): boolean {\n  if (!('fetch' in getGlobalObject<Window>())) {\n    return false;\n  }\n\n  try {\n    new Headers();\n    new Request('');\n    new Response();\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFetch(func: Function): boolean {\n  return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n  if (!supportsFetch()) {\n    return false;\n  }\n\n  const global = getGlobalObject<Window>();\n\n  // Fast path to avoid DOM I/O\n  // eslint-disable-next-line @typescript-eslint/unbound-method\n  if (isNativeFetch(global.fetch)) {\n    return true;\n  }\n\n  // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n  // so create a \"pure\" iframe to see if that has native fetch\n  let result = false;\n  const doc = global.document;\n  // eslint-disable-next-line deprecation/deprecation\n  if (doc && typeof (doc.createElement as unknown) === `function`) {\n    try {\n      const sandbox = doc.createElement('iframe');\n      sandbox.hidden = true;\n      doc.head.appendChild(sandbox);\n      if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n        // eslint-disable-next-line @typescript-eslint/unbound-method\n        result = isNativeFetch(sandbox.contentWindow.fetch);\n      }\n      doc.head.removeChild(sandbox);\n    } catch (err) {\n      logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n    }\n  }\n\n  return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n  return 'ReportingObserver' in getGlobalObject();\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy(): boolean {\n  // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n  // https://caniuse.com/#feat=referrer-policy\n  // It doesn't. And it throw exception instead of ignoring this parameter...\n  // REF: https://github.com/getsentry/raven-js/issues/1233\n\n  if (!supportsFetch()) {\n    return false;\n  }\n\n  try {\n    new Request('_', {\n      referrerPolicy: 'origin' as ReferrerPolicy,\n    });\n    return true;\n  } catch (e) {\n    return false;\n  }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n  // NOTE: in Chrome App environment, touching history.pushState, *even inside\n  //       a try/catch block*, will cause Chrome to output an error to console.error\n  // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n  const global = getGlobalObject<Window>();\n  /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const chrome = (global as any).chrome;\n  const isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n  /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n  const hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n\n  return !isChromePackagedApp && hasHistoryApi;\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/ban-types */\nimport { WrappedFunction } from '@sentry/types';\n\nimport { isInstanceOf, isString } from './is';\nimport { logger } from './logger';\nimport { getGlobalObject } from './misc';\nimport { fill } from './object';\nimport { getFunctionName } from './stacktrace';\nimport { supportsHistory, supportsNativeFetch } from './supports';\n\nconst global = getGlobalObject<Window>();\n\n/** Object describing handler that will be triggered for a given `type` of instrumentation */\ninterface InstrumentHandler {\n  type: InstrumentHandlerType;\n  callback: InstrumentHandlerCallback;\n}\ntype InstrumentHandlerType =\n  | 'console'\n  | 'dom'\n  | 'fetch'\n  | 'history'\n  | 'sentry'\n  | 'xhr'\n  | 'error'\n  | 'unhandledrejection';\ntype InstrumentHandlerCallback = (data: any) => void;\n\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n *  - Console API\n *  - Fetch API\n *  - XHR API\n *  - History API\n *  - DOM API (click/typing)\n *  - Error API\n *  - UnhandledRejection API\n */\n\nconst handlers: { [key in InstrumentHandlerType]?: InstrumentHandlerCallback[] } = {};\nconst instrumented: { [key in InstrumentHandlerType]?: boolean } = {};\n\n/** Instruments given API */\nfunction instrument(type: InstrumentHandlerType): void {\n  if (instrumented[type]) {\n    return;\n  }\n\n  instrumented[type] = true;\n\n  switch (type) {\n    case 'console':\n      instrumentConsole();\n      break;\n    case 'dom':\n      instrumentDOM();\n      break;\n    case 'xhr':\n      instrumentXHR();\n      break;\n    case 'fetch':\n      instrumentFetch();\n      break;\n    case 'history':\n      instrumentHistory();\n      break;\n    case 'error':\n      instrumentError();\n      break;\n    case 'unhandledrejection':\n      instrumentUnhandledRejection();\n      break;\n    default:\n      logger.warn('unknown instrumentation type:', type);\n  }\n}\n\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(handler: InstrumentHandler): void {\n  if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n    return;\n  }\n  handlers[handler.type] = handlers[handler.type] || [];\n  (handlers[handler.type] as InstrumentHandlerCallback[]).push(handler.callback);\n  instrument(handler.type);\n}\n\n/** JSDoc */\nfunction triggerHandlers(type: InstrumentHandlerType, data: any): void {\n  if (!type || !handlers[type]) {\n    return;\n  }\n\n  for (const handler of handlers[type] || []) {\n    try {\n      handler(data);\n    } catch (e) {\n      logger.error(\n        `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(\n          handler,\n        )}\\nError: ${e}`,\n      );\n    }\n  }\n}\n\n/** JSDoc */\nfunction instrumentConsole(): void {\n  if (!('console' in global)) {\n    return;\n  }\n\n  ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function(level: string): void {\n    if (!(level in global.console)) {\n      return;\n    }\n\n    fill(global.console, level, function(originalConsoleLevel: () => any): Function {\n      return function(...args: any[]): void {\n        triggerHandlers('console', { args, level });\n\n        // this fails for some browsers. :(\n        if (originalConsoleLevel) {\n          Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n        }\n      };\n    });\n  });\n}\n\n/** JSDoc */\nfunction instrumentFetch(): void {\n  if (!supportsNativeFetch()) {\n    return;\n  }\n\n  fill(global, 'fetch', function(originalFetch: () => void): () => void {\n    return function(...args: any[]): void {\n      const handlerData = {\n        args,\n        fetchData: {\n          method: getFetchMethod(args),\n          url: getFetchUrl(args),\n        },\n        startTimestamp: Date.now(),\n      };\n\n      triggerHandlers('fetch', {\n        ...handlerData,\n      });\n\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      return originalFetch.apply(global, args).then(\n        (response: Response) => {\n          triggerHandlers('fetch', {\n            ...handlerData,\n            endTimestamp: Date.now(),\n            response,\n          });\n          return response;\n        },\n        (error: Error) => {\n          triggerHandlers('fetch', {\n            ...handlerData,\n            endTimestamp: Date.now(),\n            error,\n          });\n          // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n          //       it means the sentry.javascript SDK caught an error invoking your application code.\n          //       This is expected behavior and NOT indicative of a bug with sentry.javascript.\n          throw error;\n        },\n      );\n    };\n  });\n}\n\ntype XHRSendInput = null | Blob | BufferSource | FormData | URLSearchParams | string;\n\n/** JSDoc */\ninterface SentryWrappedXMLHttpRequest extends XMLHttpRequest {\n  [key: string]: any;\n  __sentry_xhr__?: {\n    method?: string;\n    url?: string;\n    status_code?: number;\n    body?: XHRSendInput;\n  };\n}\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs: any[] = []): string {\n  if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n    return String(fetchArgs[0].method).toUpperCase();\n  }\n  if (fetchArgs[1] && fetchArgs[1].method) {\n    return String(fetchArgs[1].method).toUpperCase();\n  }\n  return 'GET';\n}\n\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs: any[] = []): string {\n  if (typeof fetchArgs[0] === 'string') {\n    return fetchArgs[0];\n  }\n  if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n    return fetchArgs[0].url;\n  }\n  return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n/** JSDoc */\nfunction instrumentXHR(): void {\n  if (!('XMLHttpRequest' in global)) {\n    return;\n  }\n\n  // Poor man's implementation of ES6 `Map`, tracking and keeping in sync key and value separately.\n  const requestKeys: XMLHttpRequest[] = [];\n  const requestValues: Array<any>[] = [];\n  const xhrproto = XMLHttpRequest.prototype;\n\n  fill(xhrproto, 'open', function(originalOpen: () => void): () => void {\n    return function(this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      const xhr = this;\n      const url = args[1];\n      xhr.__sentry_xhr__ = {\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n        url: args[1],\n      };\n\n      // if Sentry key appears in URL, don't capture it as a request\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      if (isString(url) && xhr.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n        xhr.__sentry_own_request__ = true;\n      }\n\n      const onreadystatechangeHandler = function(): void {\n        if (xhr.readyState === 4) {\n          try {\n            // touching statusCode in some platforms throws\n            // an exception\n            if (xhr.__sentry_xhr__) {\n              xhr.__sentry_xhr__.status_code = xhr.status;\n            }\n          } catch (e) {\n            /* do nothing */\n          }\n\n          try {\n            const requestPos = requestKeys.indexOf(xhr);\n            if (requestPos !== -1) {\n              // Make sure to pop both key and value to keep it in sync.\n              requestKeys.splice(requestPos);\n              const args = requestValues.splice(requestPos)[0];\n              if (xhr.__sentry_xhr__ && args[0] !== undefined) {\n                xhr.__sentry_xhr__.body = args[0] as XHRSendInput;\n              }\n            }\n          } catch (e) {\n            /* do nothing */\n          }\n\n          triggerHandlers('xhr', {\n            args,\n            endTimestamp: Date.now(),\n            startTimestamp: Date.now(),\n            xhr,\n          });\n        }\n      };\n\n      if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n        fill(xhr, 'onreadystatechange', function(original: WrappedFunction): Function {\n          return function(...readyStateArgs: any[]): void {\n            onreadystatechangeHandler();\n            return original.apply(xhr, readyStateArgs);\n          };\n        });\n      } else {\n        xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n      }\n\n      return originalOpen.apply(xhr, args);\n    };\n  });\n\n  fill(xhrproto, 'send', function(originalSend: () => void): () => void {\n    return function(this: SentryWrappedXMLHttpRequest, ...args: any[]): void {\n      requestKeys.push(this);\n      requestValues.push(args);\n\n      triggerHandlers('xhr', {\n        args,\n        startTimestamp: Date.now(),\n        xhr: this,\n      });\n\n      return originalSend.apply(this, args);\n    };\n  });\n}\n\nlet lastHref: string;\n\n/** JSDoc */\nfunction instrumentHistory(): void {\n  if (!supportsHistory()) {\n    return;\n  }\n\n  const oldOnPopState = global.onpopstate;\n  global.onpopstate = function(this: WindowEventHandlers, ...args: any[]): any {\n    const to = global.location.href;\n    // keep track of the current URL state, as we always receive only the updated state\n    const from = lastHref;\n    lastHref = to;\n    triggerHandlers('history', {\n      from,\n      to,\n    });\n    if (oldOnPopState) {\n      return oldOnPopState.apply(this, args);\n    }\n  };\n\n  /** @hidden */\n  function historyReplacementFunction(originalHistoryFunction: () => void): () => void {\n    return function(this: History, ...args: any[]): void {\n      const url = args.length > 2 ? args[2] : undefined;\n      if (url) {\n        // coerce to string (this is what pushState does)\n        const from = lastHref;\n        const to = String(url);\n        // keep track of the current URL state, as we always receive only the updated state\n        lastHref = to;\n        triggerHandlers('history', {\n          from,\n          to,\n        });\n      }\n      return originalHistoryFunction.apply(this, args);\n    };\n  }\n\n  fill(global.history, 'pushState', historyReplacementFunction);\n  fill(global.history, 'replaceState', historyReplacementFunction);\n}\n\nconst debounceDuration = 1000;\nlet debounceTimerID: number | undefined;\nlet lastCapturedEvent: Event | undefined;\n\n/**\n * Decide whether the current event should finish the debounce of previously captured one.\n * @param previous previously captured event\n * @param current event to be captured\n */\nfunction shouldShortcircuitPreviousDebounce(previous: Event | undefined, current: Event): boolean {\n  // If there was no previous event, it should always be swapped for the new one.\n  if (!previous) {\n    return true;\n  }\n\n  // If both events have different type, then user definitely performed two separate actions. e.g. click + keypress.\n  if (previous.type !== current.type) {\n    return true;\n  }\n\n  try {\n    // If both events have the same type, it's still possible that actions were performed on different targets.\n    // e.g. 2 clicks on different buttons.\n    if (previous.target !== current.target) {\n      return true;\n    }\n  } catch (e) {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n  }\n\n  // If both events have the same type _and_ same `target` (an element which triggered an event, _not necessarily_\n  // to which an event listener was attached), we treat them as the same action, as we want to capture\n  // only one breadcrumb. e.g. multiple clicks on the same button, or typing inside a user input box.\n  return false;\n}\n\n/**\n * Decide whether an event should be captured.\n * @param event event to be captured\n */\nfunction shouldSkipDOMEvent(event: Event): boolean {\n  // We are only interested in filtering `keypress` events for now.\n  if (event.type !== 'keypress') {\n    return false;\n  }\n\n  try {\n    const target = event.target as HTMLElement;\n\n    if (!target || !target.tagName) {\n      return true;\n    }\n\n    // Only consider keypress events on actual input elements. This will disregard keypresses targeting body\n    // e.g.tabbing through elements, hotkeys, etc.\n    if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable) {\n      return false;\n    }\n  } catch (e) {\n    // just accessing `target` property can throw an exception in some rare circumstances\n    // see: https://github.com/getsentry/sentry-javascript/issues/838\n  }\n\n  return true;\n}\n\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param handler function that will be triggered\n * @param globalListener indicates whether event was captured by the global event listener\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction makeDOMEventHandler(handler: Function, globalListener: boolean = false): (event: Event) => void {\n  return (event: Event): void => {\n    // It's possible this handler might trigger multiple times for the same\n    // event (e.g. event propagation through node ancestors).\n    // Ignore if we've already captured that event.\n    if (!event || lastCapturedEvent === event) {\n      return;\n    }\n\n    // We always want to skip _some_ events.\n    if (shouldSkipDOMEvent(event)) {\n      return;\n    }\n\n    const name = event.type === 'keypress' ? 'input' : event.type;\n\n    // If there is no debounce timer, it means that we can safely capture the new event and store it for future comparisons.\n    if (debounceTimerID === undefined) {\n      handler({\n        event: event,\n        name,\n        global: globalListener,\n      });\n      lastCapturedEvent = event;\n    }\n    // If there is a debounce awaiting, see if the new event is different enough to treat it as a unique one.\n    // If that's the case, emit the previous event and store locally the newly-captured DOM event.\n    else if (shouldShortcircuitPreviousDebounce(lastCapturedEvent, event)) {\n      handler({\n        event: event,\n        name,\n        global: globalListener,\n      });\n      lastCapturedEvent = event;\n    }\n\n    // Start a new debounce timer that will prevent us from capturing multiple events that should be grouped together.\n    clearTimeout(debounceTimerID);\n    debounceTimerID = global.setTimeout(() => {\n      debounceTimerID = undefined;\n    }, debounceDuration);\n  };\n}\n\ntype AddEventListener = (\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n  options?: boolean | AddEventListenerOptions,\n) => void;\ntype RemoveEventListener = (\n  type: string,\n  listener: EventListenerOrEventListenerObject,\n  options?: boolean | EventListenerOptions,\n) => void;\n\ntype InstrumentedElement = Element & {\n  __sentry_instrumentation_handlers__?: {\n    [key in 'click' | 'keypress']?: {\n      handler?: Function;\n      /** The number of custom listeners attached to this element */\n      refCount: number;\n    };\n  };\n};\n\n/** JSDoc */\nfunction instrumentDOM(): void {\n  if (!('document' in global)) {\n    return;\n  }\n\n  // Make it so that any click or keypress that is unhandled / bubbled up all the way to the document triggers our dom\n  // handlers. (Normally we have only one, which captures a breadcrumb for each click or keypress.) Do this before\n  // we instrument `addEventListener` so that we don't end up attaching this handler twice.\n  const triggerDOMHandler = triggerHandlers.bind(null, 'dom');\n  const globalDOMEventHandler = makeDOMEventHandler(triggerDOMHandler, true);\n  global.document.addEventListener('click', globalDOMEventHandler, false);\n  global.document.addEventListener('keypress', globalDOMEventHandler, false);\n\n  // After hooking into click and keypress events bubbled up to `document`, we also hook into user-handled\n  // clicks & keypresses, by adding an event listener of our own to any element to which they add a listener. That\n  // way, whenever one of their handlers is triggered, ours will be, too. (This is needed because their handler\n  // could potentially prevent the event from bubbling up to our global listeners. This way, our handler are still\n  // guaranteed to fire at least once.)\n  ['EventTarget', 'Node'].forEach((target: string) => {\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    const proto = (global as any)[target] && (global as any)[target].prototype;\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, no-prototype-builtins\n    if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n      return;\n    }\n\n    fill(proto, 'addEventListener', function(originalAddEventListener: AddEventListener): AddEventListener {\n      return function(\n        this: Element,\n        type: string,\n        listener: EventListenerOrEventListenerObject,\n        options?: boolean | AddEventListenerOptions,\n      ): AddEventListener {\n        if (type === 'click' || type == 'keypress') {\n          try {\n            const el = this as InstrumentedElement;\n            const handlers = (el.__sentry_instrumentation_handlers__ = el.__sentry_instrumentation_handlers__ || {});\n            const handlerForType = (handlers[type] = handlers[type] || { refCount: 0 });\n\n            if (!handlerForType.handler) {\n              const handler = makeDOMEventHandler(triggerDOMHandler);\n              handlerForType.handler = handler;\n              originalAddEventListener.call(this, type, handler, options);\n            }\n\n            handlerForType.refCount += 1;\n          } catch (e) {\n            // Accessing dom properties is always fragile.\n            // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n          }\n        }\n\n        return originalAddEventListener.call(this, type, listener, options);\n      };\n    });\n\n    fill(proto, 'removeEventListener', function(originalRemoveEventListener: RemoveEventListener): RemoveEventListener {\n      return function(\n        this: Element,\n        type: string,\n        listener: EventListenerOrEventListenerObject,\n        options?: boolean | EventListenerOptions,\n      ): () => void {\n        if (type === 'click' || type == 'keypress') {\n          try {\n            const el = this as InstrumentedElement;\n            const handlers = el.__sentry_instrumentation_handlers__ || {};\n            const handlerForType = handlers[type];\n\n            if (handlerForType) {\n              handlerForType.refCount -= 1;\n              // If there are no longer any custom handlers of the current type on this element, we can remove ours, too.\n              if (handlerForType.refCount <= 0) {\n                originalRemoveEventListener.call(this, type, handlerForType.handler, options);\n                handlerForType.handler = undefined;\n                delete handlers[type]; // eslint-disable-line @typescript-eslint/no-dynamic-delete\n              }\n\n              // If there are no longer any custom handlers of any type on this element, cleanup everything.\n              if (Object.keys(handlers).length === 0) {\n                delete el.__sentry_instrumentation_handlers__;\n              }\n            }\n          } catch (e) {\n            // Accessing dom properties is always fragile.\n            // Also allows us to skip `addEventListenrs` calls with no proper `this` context.\n          }\n        }\n\n        return originalRemoveEventListener.call(this, type, listener, options);\n      };\n    });\n  });\n}\n\nlet _oldOnErrorHandler: OnErrorEventHandler = null;\n/** JSDoc */\nfunction instrumentError(): void {\n  _oldOnErrorHandler = global.onerror;\n\n  global.onerror = function(msg: any, url: any, line: any, column: any, error: any): boolean {\n    triggerHandlers('error', {\n      column,\n      error,\n      line,\n      msg,\n      url,\n    });\n\n    if (_oldOnErrorHandler) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnErrorHandler.apply(this, arguments);\n    }\n\n    return false;\n  };\n}\n\nlet _oldOnUnhandledRejectionHandler: ((e: any) => void) | null = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection(): void {\n  _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n\n  global.onunhandledrejection = function(e: any): boolean {\n    triggerHandlers('unhandledrejection', e);\n\n    if (_oldOnUnhandledRejectionHandler) {\n      // eslint-disable-next-line prefer-rest-params\n      return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n    }\n\n    return true;\n  };\n}\n","export const SDK_VERSION = '6.2.5';\n","export const setPrototypeOf =\n  Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties);\n\n/**\n * setPrototypeOf polyfill using __proto__\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction setProtoOf<TTarget extends object, TProto>(obj: TTarget, proto: TProto): TTarget & TProto {\n  // @ts-ignore __proto__ does not exist on obj\n  obj.__proto__ = proto;\n  return obj as TTarget & TProto;\n}\n\n/**\n * setPrototypeOf polyfill using mixin\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction mixinProperties<TTarget extends object, TProto>(obj: TTarget, proto: TProto): TTarget & TProto {\n  for (const prop in proto) {\n    // eslint-disable-next-line no-prototype-builtins\n    if (!obj.hasOwnProperty(prop)) {\n      // @ts-ignore typescript complains about indexing so we remove\n      obj[prop] = proto[prop];\n    }\n  }\n\n  return obj as TTarget & TProto;\n}\n","import { setPrototypeOf } from './polyfill';\n\n/** An error emitted by Sentry SDKs and related utilities. */\nexport class SentryError extends Error {\n  /** Display name of this error instance. */\n  public name: string;\n\n  public constructor(public message: string) {\n    super(message);\n\n    this.name = new.target.prototype.constructor.name;\n    setPrototypeOf(this, new.target.prototype);\n  }\n}\n","import { DsnComponents, DsnLike, DsnProtocol } from '@sentry/types';\n\nimport { SentryError } from './error';\n\n/** Regular expression used to parse a Dsn. */\nconst DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\n/** Error message */\nconst ERROR_MESSAGE = 'Invalid Dsn';\n\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nexport class Dsn implements DsnComponents {\n  /** Protocol used to connect to Sentry. */\n  public protocol!: DsnProtocol;\n  /** Public authorization key (deprecated, renamed to publicKey). */\n  public user!: string;\n  /** Public authorization key. */\n  public publicKey!: string;\n  /** Private authorization key (deprecated, optional). */\n  public pass!: string;\n  /** Hostname of the Sentry instance. */\n  public host!: string;\n  /** Port of the Sentry instance. */\n  public port!: string;\n  /** Path */\n  public path!: string;\n  /** Project ID */\n  public projectId!: string;\n\n  /** Creates a new Dsn component */\n  public constructor(from: DsnLike) {\n    if (typeof from === 'string') {\n      this._fromString(from);\n    } else {\n      this._fromComponents(from);\n    }\n\n    this._validate();\n  }\n\n  /**\n   * Renders the string representation of this Dsn.\n   *\n   * By default, this will render the public representation without the password\n   * component. To get the deprecated private representation, set `withPassword`\n   * to true.\n   *\n   * @param withPassword When set to true, the password will be included.\n   */\n  public toString(withPassword: boolean = false): string {\n    const { host, path, pass, port, projectId, protocol, publicKey } = this;\n    return (\n      `${protocol}://${publicKey}${withPassword && pass ? `:${pass}` : ''}` +\n      `@${host}${port ? `:${port}` : ''}/${path ? `${path}/` : path}${projectId}`\n    );\n  }\n\n  /** Parses a string into this Dsn. */\n  private _fromString(str: string): void {\n    const match = DSN_REGEX.exec(str);\n\n    if (!match) {\n      throw new SentryError(ERROR_MESSAGE);\n    }\n\n    const [protocol, publicKey, pass = '', host, port = '', lastPath] = match.slice(1);\n    let path = '';\n    let projectId = lastPath;\n\n    const split = projectId.split('/');\n    if (split.length > 1) {\n      path = split.slice(0, -1).join('/');\n      projectId = split.pop() as string;\n    }\n\n    if (projectId) {\n      const projectMatch = projectId.match(/^\\d+/);\n      if (projectMatch) {\n        projectId = projectMatch[0];\n      }\n    }\n\n    this._fromComponents({ host, pass, path, projectId, port, protocol: protocol as DsnProtocol, publicKey });\n  }\n\n  /** Maps Dsn components into this instance. */\n  private _fromComponents(components: DsnComponents): void {\n    // TODO this is for backwards compatibility, and can be removed in a future version\n    if ('user' in components && !('publicKey' in components)) {\n      components.publicKey = components.user;\n    }\n    this.user = components.publicKey || '';\n\n    this.protocol = components.protocol;\n    this.publicKey = components.publicKey || '';\n    this.pass = components.pass || '';\n    this.host = components.host;\n    this.port = components.port || '';\n    this.path = components.path || '';\n    this.projectId = components.projectId;\n  }\n\n  /** Validates this Dsn and throws on error. */\n  private _validate(): void {\n    ['protocol', 'publicKey', 'host', 'projectId'].forEach(component => {\n      if (!this[component as keyof DsnComponents]) {\n        throw new SentryError(`${ERROR_MESSAGE}: ${component} missing`);\n      }\n    });\n\n    if (!this.projectId.match(/^\\d+$/)) {\n      throw new SentryError(`${ERROR_MESSAGE}: Invalid projectId ${this.projectId}`);\n    }\n\n    if (this.protocol !== 'http' && this.protocol !== 'https') {\n      throw new SentryError(`${ERROR_MESSAGE}: Invalid protocol ${this.protocol}`);\n    }\n\n    if (this.port && isNaN(parseInt(this.port, 10))) {\n      throw new SentryError(`${ERROR_MESSAGE}: Invalid port ${this.port}`);\n    }\n  }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { Integration, Options } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\nexport const installedIntegrations: string[] = [];\n\n/** Map of integrations assigned to a client */\nexport interface IntegrationIndex {\n  [key: string]: Integration;\n}\n\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options: Options): Integration[] {\n  const defaultIntegrations = (options.defaultIntegrations && [...options.defaultIntegrations]) || [];\n  const userIntegrations = options.integrations;\n  let integrations: Integration[] = [];\n  if (Array.isArray(userIntegrations)) {\n    const userIntegrationsNames = userIntegrations.map(i => i.name);\n    const pickedIntegrationsNames: string[] = [];\n\n    // Leave only unique default integrations, that were not overridden with provided user integrations\n    defaultIntegrations.forEach(defaultIntegration => {\n      if (\n        userIntegrationsNames.indexOf(defaultIntegration.name) === -1 &&\n        pickedIntegrationsNames.indexOf(defaultIntegration.name) === -1\n      ) {\n        integrations.push(defaultIntegration);\n        pickedIntegrationsNames.push(defaultIntegration.name);\n      }\n    });\n\n    // Don't add same user integration twice\n    userIntegrations.forEach(userIntegration => {\n      if (pickedIntegrationsNames.indexOf(userIntegration.name) === -1) {\n        integrations.push(userIntegration);\n        pickedIntegrationsNames.push(userIntegration.name);\n      }\n    });\n  } else if (typeof userIntegrations === 'function') {\n    integrations = userIntegrations(defaultIntegrations);\n    integrations = Array.isArray(integrations) ? integrations : [integrations];\n  } else {\n    integrations = [...defaultIntegrations];\n  }\n\n  // Make sure that if present, `Debug` integration will always run last\n  const integrationsNames = integrations.map(i => i.name);\n  const alwaysLastToRun = 'Debug';\n  if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n    integrations.push(...integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1));\n  }\n\n  return integrations;\n}\n\n/** Setup given integration */\nexport function setupIntegration(integration: Integration): void {\n  if (installedIntegrations.indexOf(integration.name) !== -1) {\n    return;\n  }\n  integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n  installedIntegrations.push(integration.name);\n  logger.log(`Integration installed: ${integration.name}`);\n}\n\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations<O extends Options>(options: O): IntegrationIndex {\n  const integrations: IntegrationIndex = {};\n  getIntegrationsToSetup(options).forEach(integration => {\n    integrations[integration.name] = integration;\n    setupIntegration(integration);\n  });\n  return integrations;\n}\n","/* eslint-disable max-lines */\nimport { Scope, Session } from '@sentry/hub';\nimport {\n  Client,\n  Event,\n  EventHint,\n  Integration,\n  IntegrationClass,\n  Options,\n  SessionStatus,\n  Severity,\n} from '@sentry/types';\nimport {\n  dateTimestampInSeconds,\n  Dsn,\n  isPrimitive,\n  isThenable,\n  logger,\n  normalize,\n  SentryError,\n  SyncPromise,\n  truncate,\n  uuid4,\n} from '@sentry/utils';\n\nimport { Backend, BackendClass } from './basebackend';\nimport { IntegrationIndex, setupIntegrations } from './integration';\n\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient._prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n *   public constructor(options: NodeOptions) {\n *     super(NodeBackend, options);\n *   }\n *\n *   // ...\n * }\n */\nexport abstract class BaseClient<B extends Backend, O extends Options> implements Client<O> {\n  /**\n   * The backend used to physically interact in the environment. Usually, this\n   * will correspond to the client. When composing SDKs, however, the Backend\n   * from the root SDK will be used.\n   */\n  protected readonly _backend: B;\n\n  /** Options passed to the SDK. */\n  protected readonly _options: O;\n\n  /** The client Dsn, if specified in options. Without this Dsn, the SDK will be disabled. */\n  protected readonly _dsn?: Dsn;\n\n  /** Array of used integrations. */\n  protected _integrations: IntegrationIndex = {};\n\n  /** Number of call being processed */\n  protected _processing: number = 0;\n\n  /**\n   * Initializes this client instance.\n   *\n   * @param backendClass A constructor function to create the backend.\n   * @param options Options for the client.\n   */\n  protected constructor(backendClass: BackendClass<B, O>, options: O) {\n    this._backend = new backendClass(options);\n    this._options = options;\n\n    if (options.dsn) {\n      this._dsn = new Dsn(options.dsn);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n  public captureException(exception: any, hint?: EventHint, scope?: Scope): string | undefined {\n    let eventId: string | undefined = hint && hint.event_id;\n\n    this._process(\n      this._getBackend()\n        .eventFromException(exception, hint)\n        .then(event => this._captureEvent(event, hint, scope))\n        .then(result => {\n          eventId = result;\n        }),\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureMessage(message: string, level?: Severity, hint?: EventHint, scope?: Scope): string | undefined {\n    let eventId: string | undefined = hint && hint.event_id;\n\n    const promisedEvent = isPrimitive(message)\n      ? this._getBackend().eventFromMessage(String(message), level, hint)\n      : this._getBackend().eventFromException(message, hint);\n\n    this._process(\n      promisedEvent\n        .then(event => this._captureEvent(event, hint, scope))\n        .then(result => {\n          eventId = result;\n        }),\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureEvent(event: Event, hint?: EventHint, scope?: Scope): string | undefined {\n    let eventId: string | undefined = hint && hint.event_id;\n\n    this._process(\n      this._captureEvent(event, hint, scope).then(result => {\n        eventId = result;\n      }),\n    );\n\n    return eventId;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public captureSession(session: Session): void {\n    if (!session.release) {\n      logger.warn('Discarded session because of missing release');\n    } else {\n      this._sendSession(session);\n      // After sending, we set init false to inidcate it's not the first occurence\n      session.update({ init: false });\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getDsn(): Dsn | undefined {\n    return this._dsn;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getOptions(): O {\n    return this._options;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public flush(timeout?: number): PromiseLike<boolean> {\n    return this._isClientProcessing(timeout).then(ready => {\n      return this._getBackend()\n        .getTransport()\n        .close(timeout)\n        .then(transportFlushed => ready && transportFlushed);\n    });\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public close(timeout?: number): PromiseLike<boolean> {\n    return this.flush(timeout).then(result => {\n      this.getOptions().enabled = false;\n      return result;\n    });\n  }\n\n  /**\n   * Sets up the integrations\n   */\n  public setupIntegrations(): void {\n    if (this._isEnabled()) {\n      this._integrations = setupIntegrations(this._options);\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getIntegration<T extends Integration>(integration: IntegrationClass<T>): T | null {\n    try {\n      return (this._integrations[integration.id] as T) || null;\n    } catch (_oO) {\n      logger.warn(`Cannot retrieve integration ${integration.id} from the current Client`);\n      return null;\n    }\n  }\n\n  /** Updates existing session based on the provided event */\n  protected _updateSessionFromEvent(session: Session, event: Event): void {\n    let crashed = false;\n    let errored = false;\n    let userAgent;\n    const exceptions = event.exception && event.exception.values;\n\n    if (exceptions) {\n      errored = true;\n\n      for (const ex of exceptions) {\n        const mechanism = ex.mechanism;\n        if (mechanism && mechanism.handled === false) {\n          crashed = true;\n          break;\n        }\n      }\n    }\n\n    const user = event.user;\n    if (!session.userAgent) {\n      const headers = event.request ? event.request.headers : {};\n      for (const key in headers) {\n        if (key.toLowerCase() === 'user-agent') {\n          userAgent = headers[key];\n          break;\n        }\n      }\n    }\n\n    session.update({\n      ...(crashed && { status: SessionStatus.Crashed }),\n      user,\n      userAgent,\n      errors: session.errors + Number(errored || crashed),\n    });\n    this.captureSession(session);\n  }\n\n  /** Deliver captured session to Sentry */\n  protected _sendSession(session: Session): void {\n    this._getBackend().sendSession(session);\n  }\n\n  /** Waits for the client to be done with processing. */\n  protected _isClientProcessing(timeout?: number): PromiseLike<boolean> {\n    return new SyncPromise(resolve => {\n      let ticked: number = 0;\n      const tick: number = 1;\n\n      const interval = setInterval(() => {\n        if (this._processing == 0) {\n          clearInterval(interval);\n          resolve(true);\n        } else {\n          ticked += tick;\n          if (timeout && ticked >= timeout) {\n            clearInterval(interval);\n            resolve(false);\n          }\n        }\n      }, tick);\n    });\n  }\n\n  /** Returns the current backend. */\n  protected _getBackend(): B {\n    return this._backend;\n  }\n\n  /** Determines whether this SDK is enabled and a valid Dsn is present. */\n  protected _isEnabled(): boolean {\n    return this.getOptions().enabled !== false && this._dsn !== undefined;\n  }\n\n  /**\n   * Adds common information to events.\n   *\n   * The information includes release and environment from `options`,\n   * breadcrumbs and context (extra, tags and user) from the scope.\n   *\n   * Information that is already present in the event is never overwritten. For\n   * nested objects, such as the context, keys are merged.\n   *\n   * @param event The original event.\n   * @param hint May contain additional information about the original exception.\n   * @param scope A scope containing event metadata.\n   * @returns A new event with more information.\n   */\n  protected _prepareEvent(event: Event, scope?: Scope, hint?: EventHint): PromiseLike<Event | null> {\n    const { normalizeDepth = 3 } = this.getOptions();\n    const prepared: Event = {\n      ...event,\n      event_id: event.event_id || (hint && hint.event_id ? hint.event_id : uuid4()),\n      timestamp: event.timestamp || dateTimestampInSeconds(),\n    };\n\n    this._applyClientOptions(prepared);\n    this._applyIntegrationsMetadata(prepared);\n\n    // If we have scope given to us, use it as the base for further modifications.\n    // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n    let finalScope = scope;\n    if (hint && hint.captureContext) {\n      finalScope = Scope.clone(finalScope).update(hint.captureContext);\n    }\n\n    // We prepare the result here with a resolved Event.\n    let result = SyncPromise.resolve<Event | null>(prepared);\n\n    // This should be the last thing called, since we want that\n    // {@link Hub.addEventProcessor} gets the finished prepared event.\n    if (finalScope) {\n      // In case we have a hub we reassign it.\n      result = finalScope.applyToEvent(prepared, hint);\n    }\n\n    return result.then(evt => {\n      if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n        return this._normalizeEvent(evt, normalizeDepth);\n      }\n      return evt;\n    });\n  }\n\n  /**\n   * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n   * Normalized keys:\n   * - `breadcrumbs.data`\n   * - `user`\n   * - `contexts`\n   * - `extra`\n   * @param event Event\n   * @returns Normalized event\n   */\n  protected _normalizeEvent(event: Event | null, depth: number): Event | null {\n    if (!event) {\n      return null;\n    }\n\n    const normalized = {\n      ...event,\n      ...(event.breadcrumbs && {\n        breadcrumbs: event.breadcrumbs.map(b => ({\n          ...b,\n          ...(b.data && {\n            data: normalize(b.data, depth),\n          }),\n        })),\n      }),\n      ...(event.user && {\n        user: normalize(event.user, depth),\n      }),\n      ...(event.contexts && {\n        contexts: normalize(event.contexts, depth),\n      }),\n      ...(event.extra && {\n        extra: normalize(event.extra, depth),\n      }),\n    };\n    // event.contexts.trace stores information about a Transaction. Similarly,\n    // event.spans[] stores information about child Spans. Given that a\n    // Transaction is conceptually a Span, normalization should apply to both\n    // Transactions and Spans consistently.\n    // For now the decision is to skip normalization of Transactions and Spans,\n    // so this block overwrites the normalized event to add back the original\n    // Transaction information prior to normalization.\n    if (event.contexts && event.contexts.trace) {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      normalized.contexts.trace = event.contexts.trace;\n    }\n    return normalized;\n  }\n\n  /**\n   *  Enhances event using the client configuration.\n   *  It takes care of all \"static\" values like environment, release and `dist`,\n   *  as well as truncating overly long values.\n   * @param event event instance to be enhanced\n   */\n  protected _applyClientOptions(event: Event): void {\n    const options = this.getOptions();\n    const { environment, release, dist, maxValueLength = 250 } = options;\n\n    if (!('environment' in event)) {\n      event.environment = 'environment' in options ? environment : 'production';\n    }\n\n    if (event.release === undefined && release !== undefined) {\n      event.release = release;\n    }\n\n    if (event.dist === undefined && dist !== undefined) {\n      event.dist = dist;\n    }\n\n    if (event.message) {\n      event.message = truncate(event.message, maxValueLength);\n    }\n\n    const exception = event.exception && event.exception.values && event.exception.values[0];\n    if (exception && exception.value) {\n      exception.value = truncate(exception.value, maxValueLength);\n    }\n\n    const request = event.request;\n    if (request && request.url) {\n      request.url = truncate(request.url, maxValueLength);\n    }\n  }\n\n  /**\n   * This function adds all used integrations to the SDK info in the event.\n   * @param event The event that will be filled with all integrations.\n   */\n  protected _applyIntegrationsMetadata(event: Event): void {\n    const sdkInfo = event.sdk;\n    const integrationsArray = Object.keys(this._integrations);\n    if (sdkInfo && integrationsArray.length > 0) {\n      sdkInfo.integrations = integrationsArray;\n    }\n  }\n\n  /**\n   * Tells the backend to send this event\n   * @param event The Sentry event to send\n   */\n  protected _sendEvent(event: Event): void {\n    this._getBackend().sendEvent(event);\n  }\n\n  /**\n   * Processes the event and logs an error in case of rejection\n   * @param event\n   * @param hint\n   * @param scope\n   */\n  protected _captureEvent(event: Event, hint?: EventHint, scope?: Scope): PromiseLike<string | undefined> {\n    return this._processEvent(event, hint, scope).then(\n      finalEvent => {\n        return finalEvent.event_id;\n      },\n      reason => {\n        logger.error(reason);\n        return undefined;\n      },\n    );\n  }\n\n  /**\n   * Processes an event (either error or message) and sends it to Sentry.\n   *\n   * This also adds breadcrumbs and context information to the event. However,\n   * platform specific meta data (such as the User's IP address) must be added\n   * by the SDK implementor.\n   *\n   *\n   * @param event The event to send to Sentry.\n   * @param hint May contain additional information about the original exception.\n   * @param scope A scope containing event metadata.\n   * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n   */\n  protected _processEvent(event: Event, hint?: EventHint, scope?: Scope): PromiseLike<Event> {\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    const { beforeSend, sampleRate } = this.getOptions();\n\n    if (!this._isEnabled()) {\n      return SyncPromise.reject(new SentryError('SDK not enabled, will not send event.'));\n    }\n\n    const isTransaction = event.type === 'transaction';\n    // 1.0 === 100% events are sent\n    // 0.0 === 0% events are sent\n    // Sampling for transaction happens somewhere else\n    if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n      return SyncPromise.reject(\n        new SentryError(\n          `Discarding event because it's not included in the random sample (sampling rate = ${sampleRate})`,\n        ),\n      );\n    }\n\n    return this._prepareEvent(event, scope, hint)\n      .then(prepared => {\n        if (prepared === null) {\n          throw new SentryError('An event processor returned null, will not send event.');\n        }\n\n        const isInternalException = hint && hint.data && (hint.data as { __sentry__: boolean }).__sentry__ === true;\n        if (isInternalException || isTransaction || !beforeSend) {\n          return prepared;\n        }\n\n        const beforeSendResult = beforeSend(prepared, hint);\n        if (typeof beforeSendResult === 'undefined') {\n          throw new SentryError('`beforeSend` method has to return `null` or a valid event.');\n        } else if (isThenable(beforeSendResult)) {\n          return (beforeSendResult as PromiseLike<Event | null>).then(\n            event => event,\n            e => {\n              throw new SentryError(`beforeSend rejected with ${e}`);\n            },\n          );\n        }\n        return beforeSendResult;\n      })\n      .then(processedEvent => {\n        if (processedEvent === null) {\n          throw new SentryError('`beforeSend` returned `null`, will not send event.');\n        }\n\n        const session = scope && scope.getSession && scope.getSession();\n        if (!isTransaction && session) {\n          this._updateSessionFromEvent(session, processedEvent);\n        }\n\n        this._sendEvent(processedEvent);\n        return processedEvent;\n      })\n      .then(null, reason => {\n        if (reason instanceof SentryError) {\n          throw reason;\n        }\n\n        this.captureException(reason, {\n          data: {\n            __sentry__: true,\n          },\n          originalException: reason as Error,\n        });\n        throw new SentryError(\n          `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: ${reason}`,\n        );\n      });\n  }\n\n  /**\n   * Occupies the client with processing and event\n   */\n  protected _process<T>(promise: PromiseLike<T>): void {\n    this._processing += 1;\n    promise.then(\n      value => {\n        this._processing -= 1;\n        return value;\n      },\n      reason => {\n        this._processing -= 1;\n        return reason;\n      },\n    );\n  }\n}\n","/** The status of an event. */\n// eslint-disable-next-line import/export\nexport enum Status {\n  /** The status could not be determined. */\n  Unknown = 'unknown',\n  /** The event was skipped due to configuration or callbacks. */\n  Skipped = 'skipped',\n  /** The event was sent to Sentry successfully. */\n  Success = 'success',\n  /** The client is currently rate limited and will try again later. */\n  RateLimit = 'rate_limit',\n  /** The event could not be processed. */\n  Invalid = 'invalid',\n  /** A server-side error ocurred during submission. */\n  Failed = 'failed',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace, import/export\nexport namespace Status {\n  /**\n   * Converts a HTTP status code into a {@link Status}.\n   *\n   * @param code The HTTP response status code.\n   * @returns The send status or {@link Status.Unknown}.\n   */\n  export function fromHttpCode(code: number): Status {\n    if (code >= 200 && code < 300) {\n      return Status.Success;\n    }\n\n    if (code === 429) {\n      return Status.RateLimit;\n    }\n\n    if (code >= 400 && code < 500) {\n      return Status.Invalid;\n    }\n\n    if (code >= 500) {\n      return Status.Failed;\n    }\n\n    return Status.Unknown;\n  }\n}\n","import { Event, Response, Status, Transport } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\n/** Noop transport */\nexport class NoopTransport implements Transport {\n  /**\n   * @inheritDoc\n   */\n  public sendEvent(_: Event): PromiseLike<Response> {\n    return SyncPromise.resolve({\n      reason: `NoopTransport: Event has been skipped because no Dsn is configured.`,\n      status: Status.Skipped,\n    });\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public close(_?: number): PromiseLike<boolean> {\n    return SyncPromise.resolve(true);\n  }\n}\n","/** JSDoc */\n// eslint-disable-next-line import/export\nexport enum Severity {\n  /** JSDoc */\n  Fatal = 'fatal',\n  /** JSDoc */\n  Error = 'error',\n  /** JSDoc */\n  Warning = 'warning',\n  /** JSDoc */\n  Log = 'log',\n  /** JSDoc */\n  Info = 'info',\n  /** JSDoc */\n  Debug = 'debug',\n  /** JSDoc */\n  Critical = 'critical',\n}\n\n// eslint-disable-next-line @typescript-eslint/no-namespace, import/export\nexport namespace Severity {\n  /**\n   * Converts a string-based level into a {@link Severity}.\n   *\n   * @param level string representation of Severity\n   * @returns Severity\n   */\n  export function fromString(level: string): Severity {\n    switch (level) {\n      case 'debug':\n        return Severity.Debug;\n      case 'info':\n        return Severity.Info;\n      case 'warn':\n      case 'warning':\n        return Severity.Warning;\n      case 'error':\n        return Severity.Error;\n      case 'fatal':\n        return Severity.Fatal;\n      case 'critical':\n        return Severity.Critical;\n      case 'log':\n      default:\n        return Severity.Log;\n    }\n  }\n}\n","import { Event, EventHint, Options, Session, Severity, Transport } from '@sentry/types';\nimport { logger, SentryError } from '@sentry/utils';\n\nimport { NoopTransport } from './transports/noop';\n\n/**\n * Internal platform-dependent Sentry SDK Backend.\n *\n * While {@link Client} contains business logic specific to an SDK, the\n * Backend offers platform specific implementations for low-level operations.\n * These are persisting and loading information, sending events, and hooking\n * into the environment.\n *\n * Backends receive a handle to the Client in their constructor. When a\n * Backend automatically generates events, it must pass them to\n * the Client for validation and processing first.\n *\n * Usually, the Client will be of corresponding type, e.g. NodeBackend\n * receives NodeClient. However, higher-level SDKs can choose to instantiate\n * multiple Backends and delegate tasks between them. In this case, an event\n * generated by one backend might very well be sent by another one.\n *\n * The client also provides access to options via {@link Client.getOptions}.\n * @hidden\n */\nexport interface Backend {\n  /** Creates a {@link Event} from an exception. */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  eventFromException(exception: any, hint?: EventHint): PromiseLike<Event>;\n\n  /** Creates a {@link Event} from a plain message. */\n  eventFromMessage(message: string, level?: Severity, hint?: EventHint): PromiseLike<Event>;\n\n  /** Submits the event to Sentry */\n  sendEvent(event: Event): void;\n\n  /** Submits the session to Sentry */\n  sendSession(session: Session): void;\n\n  /**\n   * Returns the transport that is used by the backend.\n   * Please note that the transport gets lazy initialized so it will only be there once the first event has been sent.\n   *\n   * @returns The transport.\n   */\n  getTransport(): Transport;\n}\n\n/**\n * A class object that can instantiate Backend objects.\n * @hidden\n */\nexport type BackendClass<B extends Backend, O extends Options> = new (options: O) => B;\n\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nexport abstract class BaseBackend<O extends Options> implements Backend {\n  /** Options passed to the SDK. */\n  protected readonly _options: O;\n\n  /** Cached transport used internally. */\n  protected _transport: Transport;\n\n  /** Creates a new backend instance. */\n  public constructor(options: O) {\n    this._options = options;\n    if (!this._options.dsn) {\n      logger.warn('No DSN provided, backend will not do anything.');\n    }\n    this._transport = this._setupTransport();\n  }\n\n  /**\n   * @inheritDoc\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n  public eventFromException(_exception: any, _hint?: EventHint): PromiseLike<Event> {\n    throw new SentryError('Backend has to implement `eventFromException` method');\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public eventFromMessage(_message: string, _level?: Severity, _hint?: EventHint): PromiseLike<Event> {\n    throw new SentryError('Backend has to implement `eventFromMessage` method');\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendEvent(event: Event): void {\n    this._transport.sendEvent(event).then(null, reason => {\n      logger.error(`Error while sending event: ${reason}`);\n    });\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendSession(session: Session): void {\n    if (!this._transport.sendSession) {\n      logger.warn(\"Dropping session because custom transport doesn't implement sendSession\");\n      return;\n    }\n\n    this._transport.sendSession(session).then(null, reason => {\n      logger.error(`Error while sending session: ${reason}`);\n    });\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public getTransport(): Transport {\n    return this._transport;\n  }\n\n  /**\n   * Sets up the transport so it can be used later to send requests.\n   */\n  protected _setupTransport(): Transport {\n    return new NoopTransport();\n  }\n}\n","/**\n * This was originally forked from https://github.com/occ/TraceKit, but has since been\n * largely modified and is now maintained as part of Sentry JS SDK.\n */\n\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n/**\n * An object representing a single stack frame.\n * {Object} StackFrame\n * {string} url The JavaScript or HTML file URL.\n * {string} func The function name, or empty for anonymous functions (if guessing did not work).\n * {string[]?} args The arguments passed to the function, if known.\n * {number=} line The line number, if known.\n * {number=} column The column number, if known.\n * {string[]} context An array of source code lines; the middle element corresponds to the correct line#.\n */\nexport interface StackFrame {\n  url: string;\n  func: string;\n  args: string[];\n  line: number | null;\n  column: number | null;\n}\n\n/**\n * An object representing a JavaScript stack trace.\n * {Object} StackTrace\n * {string} name The name of the thrown exception.\n * {string} message The exception error message.\n * {TraceKit.StackFrame[]} stack An array of stack frames.\n */\nexport interface StackTrace {\n  name: string;\n  message: string;\n  mechanism?: string;\n  stack: StackFrame[];\n  failed?: boolean;\n}\n\n// global reference to slice\nconst UNKNOWN_FUNCTION = '?';\n\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nconst chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nconst gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js)|\\/[\\w\\-. /=]+)(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nconst winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nconst geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nconst chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nconst reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function computeStackTrace(ex: any): StackTrace {\n  let stack = null;\n  let popSize = 0;\n\n  if (ex) {\n    if (typeof ex.framesToPop === 'number') {\n      popSize = ex.framesToPop;\n    } else if (reactMinifiedRegexp.test(ex.message)) {\n      popSize = 1;\n    }\n  }\n\n  try {\n    // This must be tried first because Opera 10 *destroys*\n    // its stacktrace property if you try to access the stack\n    // property first!!\n    stack = computeStackTraceFromStacktraceProp(ex);\n    if (stack) {\n      return popFrames(stack, popSize);\n    }\n  } catch (e) {\n    // no-empty\n  }\n\n  try {\n    stack = computeStackTraceFromStackProp(ex);\n    if (stack) {\n      return popFrames(stack, popSize);\n    }\n  } catch (e) {\n    // no-empty\n  }\n\n  return {\n    message: extractMessage(ex),\n    name: ex && ex.name,\n    stack: [],\n    failed: true,\n  };\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, complexity\nfunction computeStackTraceFromStackProp(ex: any): StackTrace | null {\n  if (!ex || !ex.stack) {\n    return null;\n  }\n\n  const stack = [];\n  const lines = ex.stack.split('\\n');\n  let isEval;\n  let submatch;\n  let parts;\n  let element;\n\n  for (let i = 0; i < lines.length; ++i) {\n    if ((parts = chrome.exec(lines[i]))) {\n      const isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n      isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n      if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n        // throw out eval line/column and use top-most line/column number\n        parts[2] = submatch[1]; // url\n        parts[3] = submatch[2]; // line\n        parts[4] = submatch[3]; // column\n      }\n      element = {\n        // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n        // prefix here seems like the quickest solution for now.\n        url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],\n        func: parts[1] || UNKNOWN_FUNCTION,\n        args: isNative ? [parts[2]] : [],\n        line: parts[3] ? +parts[3] : null,\n        column: parts[4] ? +parts[4] : null,\n      };\n    } else if ((parts = winjs.exec(lines[i]))) {\n      element = {\n        url: parts[2],\n        func: parts[1] || UNKNOWN_FUNCTION,\n        args: [],\n        line: +parts[3],\n        column: parts[4] ? +parts[4] : null,\n      };\n    } else if ((parts = gecko.exec(lines[i]))) {\n      isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n      if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n        // throw out eval line/column and use top-most line number\n        parts[1] = parts[1] || `eval`;\n        parts[3] = submatch[1];\n        parts[4] = submatch[2];\n        parts[5] = ''; // no column when eval\n      } else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n        // FireFox uses this awesome columnNumber property for its top frame\n        // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n        // so adding 1\n        // NOTE: this hack doesn't work if top-most frame is eval\n        stack[0].column = (ex.columnNumber as number) + 1;\n      }\n      element = {\n        url: parts[3],\n        func: parts[1] || UNKNOWN_FUNCTION,\n        args: parts[2] ? parts[2].split(',') : [],\n        line: parts[4] ? +parts[4] : null,\n        column: parts[5] ? +parts[5] : null,\n      };\n    } else {\n      continue;\n    }\n\n    if (!element.func && element.line) {\n      element.func = UNKNOWN_FUNCTION;\n    }\n\n    stack.push(element);\n  }\n\n  if (!stack.length) {\n    return null;\n  }\n\n  return {\n    message: extractMessage(ex),\n    name: ex.name,\n    stack,\n  };\n}\n\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction computeStackTraceFromStacktraceProp(ex: any): StackTrace | null {\n  if (!ex || !ex.stacktrace) {\n    return null;\n  }\n  // Access and store the stacktrace property before doing ANYTHING\n  // else to it because Opera is not very good at providing it\n  // reliably in other circumstances.\n  const stacktrace = ex.stacktrace;\n  const opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n  const opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\((.*)\\))? in (.*):\\s*$/i;\n  const lines = stacktrace.split('\\n');\n  const stack = [];\n  let parts;\n\n  for (let line = 0; line < lines.length; line += 2) {\n    let element = null;\n    if ((parts = opera10Regex.exec(lines[line]))) {\n      element = {\n        url: parts[2],\n        func: parts[3],\n        args: [],\n        line: +parts[1],\n        column: null,\n      };\n    } else if ((parts = opera11Regex.exec(lines[line]))) {\n      element = {\n        url: parts[6],\n        func: parts[3] || parts[4],\n        args: parts[5] ? parts[5].split(',') : [],\n        line: +parts[1],\n        column: +parts[2],\n      };\n    }\n\n    if (element) {\n      if (!element.func && element.line) {\n        element.func = UNKNOWN_FUNCTION;\n      }\n      stack.push(element);\n    }\n  }\n\n  if (!stack.length) {\n    return null;\n  }\n\n  return {\n    message: extractMessage(ex),\n    name: ex.name,\n    stack,\n  };\n}\n\n/** Remove N number of frames from the stack */\nfunction popFrames(stacktrace: StackTrace, popSize: number): StackTrace {\n  try {\n    return {\n      ...stacktrace,\n      stack: stacktrace.stack.slice(popSize),\n    };\n  } catch (e) {\n    return stacktrace;\n  }\n}\n\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractMessage(ex: any): string {\n  const message = ex && ex.message;\n  if (!message) {\n    return 'No error message';\n  }\n  if (message.error && typeof message.error.message === 'string') {\n    return message.error.message;\n  }\n  return message;\n}\n","import { Event, Exception, StackFrame } from '@sentry/types';\nimport { extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\n\nimport { computeStackTrace, StackFrame as TraceKitStackFrame, StackTrace as TraceKitStackTrace } from './tracekit';\n\nconst STACKTRACE_LIMIT = 50;\n\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromStacktrace(stacktrace: TraceKitStackTrace): Exception {\n  const frames = prepareFramesForEvent(stacktrace.stack);\n\n  const exception: Exception = {\n    type: stacktrace.name,\n    value: stacktrace.message,\n  };\n\n  if (frames && frames.length) {\n    exception.stacktrace = { frames };\n  }\n\n  if (exception.type === undefined && exception.value === '') {\n    exception.value = 'Unrecoverable error caught';\n  }\n\n  return exception;\n}\n\n/**\n * @hidden\n */\nexport function eventFromPlainObject(\n  exception: Record<string, unknown>,\n  syntheticException?: Error,\n  rejection?: boolean,\n): Event {\n  const event: Event = {\n    exception: {\n      values: [\n        {\n          type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n          value: `Non-Error ${\n            rejection ? 'promise rejection' : 'exception'\n          } captured with keys: ${extractExceptionKeysForMessage(exception)}`,\n        },\n      ],\n    },\n    extra: {\n      __serialized__: normalizeToSize(exception),\n    },\n  };\n\n  if (syntheticException) {\n    const stacktrace = computeStackTrace(syntheticException);\n    const frames = prepareFramesForEvent(stacktrace.stack);\n    event.stacktrace = {\n      frames,\n    };\n  }\n\n  return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromStacktrace(stacktrace: TraceKitStackTrace): Event {\n  const exception = exceptionFromStacktrace(stacktrace);\n\n  return {\n    exception: {\n      values: [exception],\n    },\n  };\n}\n\n/**\n * @hidden\n */\nexport function prepareFramesForEvent(stack: TraceKitStackFrame[]): StackFrame[] {\n  if (!stack || !stack.length) {\n    return [];\n  }\n\n  let localStack = stack;\n\n  const firstFrameFunction = localStack[0].func || '';\n  const lastFrameFunction = localStack[localStack.length - 1].func || '';\n\n  // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n  if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n    localStack = localStack.slice(1);\n  }\n\n  // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n  if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n    localStack = localStack.slice(0, -1);\n  }\n\n  // The frame where the crash happened, should be the last entry in the array\n  return localStack\n    .slice(0, STACKTRACE_LIMIT)\n    .map(\n      (frame: TraceKitStackFrame): StackFrame => ({\n        colno: frame.column === null ? undefined : frame.column,\n        filename: frame.url || localStack[0].url,\n        function: frame.func || '?',\n        in_app: true,\n        lineno: frame.line === null ? undefined : frame.line,\n      }),\n    )\n    .reverse();\n}\n","import { Event, EventHint, Options, Severity } from '@sentry/types';\nimport {\n  addExceptionMechanism,\n  addExceptionTypeValue,\n  isDOMError,\n  isDOMException,\n  isError,\n  isErrorEvent,\n  isEvent,\n  isPlainObject,\n  SyncPromise,\n} from '@sentry/utils';\n\nimport { eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent } from './parsers';\nimport { computeStackTrace } from './tracekit';\n\n/**\n * Builds and Event from a Exception\n * @hidden\n */\nexport function eventFromException(options: Options, exception: unknown, hint?: EventHint): PromiseLike<Event> {\n  const syntheticException = (hint && hint.syntheticException) || undefined;\n  const event = eventFromUnknownInput(exception, syntheticException, {\n    attachStacktrace: options.attachStacktrace,\n  });\n  addExceptionMechanism(event, {\n    handled: true,\n    type: 'generic',\n  });\n  event.level = Severity.Error;\n  if (hint && hint.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return SyncPromise.resolve(event);\n}\n\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(\n  options: Options,\n  message: string,\n  level: Severity = Severity.Info,\n  hint?: EventHint,\n): PromiseLike<Event> {\n  const syntheticException = (hint && hint.syntheticException) || undefined;\n  const event = eventFromString(message, syntheticException, {\n    attachStacktrace: options.attachStacktrace,\n  });\n  event.level = level;\n  if (hint && hint.event_id) {\n    event.event_id = hint.event_id;\n  }\n  return SyncPromise.resolve(event);\n}\n\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(\n  exception: unknown,\n  syntheticException?: Error,\n  options: {\n    rejection?: boolean;\n    attachStacktrace?: boolean;\n  } = {},\n): Event {\n  let event: Event;\n\n  if (isErrorEvent(exception as ErrorEvent) && (exception as ErrorEvent).error) {\n    // If it is an ErrorEvent with `error` property, extract it to get actual Error\n    const errorEvent = exception as ErrorEvent;\n    // eslint-disable-next-line no-param-reassign\n    exception = errorEvent.error;\n    event = eventFromStacktrace(computeStackTrace(exception as Error));\n    return event;\n  }\n  if (isDOMError(exception as DOMError) || isDOMException(exception as DOMException)) {\n    // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n    // then we just extract the name, code, and message, as they don't provide anything else\n    // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n    // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n    const domException = exception as DOMException;\n    const name = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n    const message = domException.message ? `${name}: ${domException.message}` : name;\n\n    event = eventFromString(message, syntheticException, options);\n    addExceptionTypeValue(event, message);\n    if ('code' in domException) {\n      event.tags = { ...event.tags, 'DOMException.code': `${domException.code}` };\n    }\n\n    return event;\n  }\n  if (isError(exception as Error)) {\n    // we have a real Error object, do nothing\n    event = eventFromStacktrace(computeStackTrace(exception as Error));\n    return event;\n  }\n  if (isPlainObject(exception) || isEvent(exception)) {\n    // If it is plain Object or Event, serialize it manually and extract options\n    // This will allow us to group events based on top-level keys\n    // which is much better than creating new group when any key/value change\n    const objectException = exception as Record<string, unknown>;\n    event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n    addExceptionMechanism(event, {\n      synthetic: true,\n    });\n    return event;\n  }\n\n  // If none of previous checks were valid, then it means that it's not:\n  // - an instance of DOMError\n  // - an instance of DOMException\n  // - an instance of Event\n  // - an instance of Error\n  // - a valid ErrorEvent (one with an error property)\n  // - a plain Object\n  //\n  // So bail out and capture it as a simple message:\n  event = eventFromString(exception as string, syntheticException, options);\n  addExceptionTypeValue(event, `${exception}`, undefined);\n  addExceptionMechanism(event, {\n    synthetic: true,\n  });\n\n  return event;\n}\n\n/**\n * @hidden\n */\nexport function eventFromString(\n  input: string,\n  syntheticException?: Error,\n  options: {\n    attachStacktrace?: boolean;\n  } = {},\n): Event {\n  const event: Event = {\n    message: input,\n  };\n\n  if (options.attachStacktrace && syntheticException) {\n    const stacktrace = computeStackTrace(syntheticException);\n    const frames = prepareFramesForEvent(stacktrace.stack);\n    event.stacktrace = {\n      frames,\n    };\n  }\n\n  return event;\n}\n","import { Event, SdkInfo, SentryRequest, Session } from '@sentry/types';\n\nimport { API } from './api';\n\n/** Extract sdk info from from the API metadata */\nfunction getSdkMetadataForEnvelopeHeader(api: API): SdkInfo | undefined {\n  if (!api.metadata || !api.metadata.sdk) {\n    return;\n  }\n  const { name, version } = api.metadata.sdk;\n  return { name, version };\n}\n\n/**\n * Apply SdkInfo (name, version, packages, integrations) to the corresponding event key.\n * Merge with existing data if any.\n **/\nfunction enhanceEventWithSdkInfo(event: Event, sdkInfo?: SdkInfo): Event {\n  if (!sdkInfo) {\n    return event;\n  }\n\n  event.sdk = event.sdk || {\n    name: sdkInfo.name,\n    version: sdkInfo.version,\n  };\n  event.sdk.name = event.sdk.name || sdkInfo.name;\n  event.sdk.version = event.sdk.version || sdkInfo.version;\n  event.sdk.integrations = [...(event.sdk.integrations || []), ...(sdkInfo.integrations || [])];\n  event.sdk.packages = [...(event.sdk.packages || []), ...(sdkInfo.packages || [])];\n  return event;\n}\n\n/** Creates a SentryRequest from an event. */\nexport function sessionToSentryRequest(session: Session, api: API): SentryRequest {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n  const envelopeHeaders = JSON.stringify({\n    sent_at: new Date().toISOString(),\n    ...(sdkInfo && { sdk: sdkInfo }),\n  });\n  const itemHeaders = JSON.stringify({\n    type: 'session',\n  });\n\n  return {\n    body: `${envelopeHeaders}\\n${itemHeaders}\\n${JSON.stringify(session)}`,\n    type: 'session',\n    url: api.getEnvelopeEndpointWithUrlEncodedAuth(),\n  };\n}\n\n/** Creates a SentryRequest from an event. */\nexport function eventToSentryRequest(event: Event, api: API): SentryRequest {\n  const sdkInfo = getSdkMetadataForEnvelopeHeader(api);\n  const eventType = event.type || 'event';\n  const useEnvelope = eventType === 'transaction';\n\n  const { transactionSampling, ...metadata } = event.debug_meta || {};\n  const { method: samplingMethod, rate: sampleRate } = transactionSampling || {};\n  if (Object.keys(metadata).length === 0) {\n    delete event.debug_meta;\n  } else {\n    event.debug_meta = metadata;\n  }\n\n  const req: SentryRequest = {\n    body: JSON.stringify(sdkInfo ? enhanceEventWithSdkInfo(event, api.metadata.sdk) : event),\n    type: eventType,\n    url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth(),\n  };\n\n  // https://develop.sentry.dev/sdk/envelopes/\n\n  // Since we don't need to manipulate envelopes nor store them, there is no\n  // exported concept of an Envelope with operations including serialization and\n  // deserialization. Instead, we only implement a minimal subset of the spec to\n  // serialize events inline here.\n  if (useEnvelope) {\n    const envelopeHeaders = JSON.stringify({\n      event_id: event.event_id,\n      sent_at: new Date().toISOString(),\n      ...(sdkInfo && { sdk: sdkInfo }),\n    });\n    const itemHeaders = JSON.stringify({\n      type: event.type,\n\n      // TODO: Right now, sampleRate may or may not be defined (it won't be in the cases of inheritance and\n      // explicitly-set sampling decisions). Are we good with that?\n      sample_rates: [{ id: samplingMethod, rate: sampleRate }],\n\n      // The content-type is assumed to be 'application/json' and not part of\n      // the current spec for transaction items, so we don't bloat the request\n      // body with it.\n      //\n      // content_type: 'application/json',\n      //\n      // The length is optional. It must be the number of bytes in req.Body\n      // encoded as UTF-8. Since the server can figure this out and would\n      // otherwise refuse events that report the length incorrectly, we decided\n      // not to send the length to avoid problems related to reporting the wrong\n      // size and to reduce request body size.\n      //\n      // length: new TextEncoder().encode(req.body).length,\n    });\n    // The trailing newline is optional. We intentionally don't send it to avoid\n    // sending unnecessary bytes.\n    //\n    // const envelope = `${envelopeHeaders}\\n${itemHeaders}\\n${req.body}\\n`;\n    const envelope = `${envelopeHeaders}\\n${itemHeaders}\\n${req.body}`;\n    req.body = envelope;\n  }\n\n  return req;\n}\n","import { DsnLike, SdkMetadata } from '@sentry/types';\nimport { Dsn, urlEncode } from '@sentry/utils';\n\nconst SENTRY_API_VERSION = '7';\n\n/**\n * Helper class to provide urls, headers and metadata that can be used to form\n * different types of requests to Sentry endpoints.\n * Supports both envelopes and regular event requests.\n **/\nexport class API {\n  /** The DSN as passed to Sentry.init() */\n  public dsn: DsnLike;\n\n  /** Metadata about the SDK (name, version, etc) for inclusion in envelope headers */\n  public metadata: SdkMetadata;\n\n  /** The internally used Dsn object. */\n  private readonly _dsnObject: Dsn;\n\n  /** Create a new instance of API */\n  public constructor(dsn: DsnLike, metadata: SdkMetadata = {}) {\n    this.dsn = dsn;\n    this._dsnObject = new Dsn(dsn);\n    this.metadata = metadata;\n  }\n\n  /** Returns the Dsn object. */\n  public getDsn(): Dsn {\n    return this._dsnObject;\n  }\n\n  /** Returns the prefix to construct Sentry ingestion API endpoints. */\n  public getBaseApiEndpoint(): string {\n    const dsn = this._dsnObject;\n    const protocol = dsn.protocol ? `${dsn.protocol}:` : '';\n    const port = dsn.port ? `:${dsn.port}` : '';\n    return `${protocol}//${dsn.host}${port}${dsn.path ? `/${dsn.path}` : ''}/api/`;\n  }\n\n  /** Returns the store endpoint URL. */\n  public getStoreEndpoint(): string {\n    return this._getIngestEndpoint('store');\n  }\n\n  /**\n   * Returns the store endpoint URL with auth in the query string.\n   *\n   * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n   */\n  public getStoreEndpointWithUrlEncodedAuth(): string {\n    return `${this.getStoreEndpoint()}?${this._encodedAuth()}`;\n  }\n\n  /**\n   * Returns the envelope endpoint URL with auth in the query string.\n   *\n   * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n   */\n  public getEnvelopeEndpointWithUrlEncodedAuth(): string {\n    return `${this._getEnvelopeEndpoint()}?${this._encodedAuth()}`;\n  }\n\n  /** Returns only the path component for the store endpoint. */\n  public getStoreEndpointPath(): string {\n    const dsn = this._dsnObject;\n    return `${dsn.path ? `/${dsn.path}` : ''}/api/${dsn.projectId}/store/`;\n  }\n\n  /**\n   * Returns an object that can be used in request headers.\n   * This is needed for node and the old /store endpoint in sentry\n   */\n  public getRequestHeaders(clientName: string, clientVersion: string): { [key: string]: string } {\n    // CHANGE THIS to use metadata but keep clientName and clientVersion compatible\n    const dsn = this._dsnObject;\n    const header = [`Sentry sentry_version=${SENTRY_API_VERSION}`];\n    header.push(`sentry_client=${clientName}/${clientVersion}`);\n    header.push(`sentry_key=${dsn.publicKey}`);\n    if (dsn.pass) {\n      header.push(`sentry_secret=${dsn.pass}`);\n    }\n    return {\n      'Content-Type': 'application/json',\n      'X-Sentry-Auth': header.join(', '),\n    };\n  }\n\n  /** Returns the url to the report dialog endpoint. */\n  public getReportDialogEndpoint(\n    dialogOptions: {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      [key: string]: any;\n      user?: { name?: string; email?: string };\n    } = {},\n  ): string {\n    const dsn = this._dsnObject;\n    const endpoint = `${this.getBaseApiEndpoint()}embed/error-page/`;\n\n    const encodedOptions = [];\n    encodedOptions.push(`dsn=${dsn.toString()}`);\n    for (const key in dialogOptions) {\n      if (key === 'dsn') {\n        continue;\n      }\n\n      if (key === 'user') {\n        if (!dialogOptions.user) {\n          continue;\n        }\n        if (dialogOptions.user.name) {\n          encodedOptions.push(`name=${encodeURIComponent(dialogOptions.user.name)}`);\n        }\n        if (dialogOptions.user.email) {\n          encodedOptions.push(`email=${encodeURIComponent(dialogOptions.user.email)}`);\n        }\n      } else {\n        encodedOptions.push(`${encodeURIComponent(key)}=${encodeURIComponent(dialogOptions[key] as string)}`);\n      }\n    }\n    if (encodedOptions.length) {\n      return `${endpoint}?${encodedOptions.join('&')}`;\n    }\n\n    return endpoint;\n  }\n\n  /** Returns the envelope endpoint URL. */\n  private _getEnvelopeEndpoint(): string {\n    return this._getIngestEndpoint('envelope');\n  }\n\n  /** Returns the ingest API endpoint for target. */\n  private _getIngestEndpoint(target: 'store' | 'envelope'): string {\n    const base = this.getBaseApiEndpoint();\n    const dsn = this._dsnObject;\n    return `${base}${dsn.projectId}/${target}/`;\n  }\n\n  /** Returns a URL-encoded string with auth config suitable for a query string. */\n  private _encodedAuth(): string {\n    const dsn = this._dsnObject;\n    const auth = {\n      // We send only the minimum set of required information. See\n      // https://github.com/getsentry/sentry-javascript/issues/2572.\n      sentry_key: dsn.publicKey,\n      sentry_version: SENTRY_API_VERSION,\n    };\n    return urlEncode(auth);\n  }\n}\n","import { SentryError } from './error';\nimport { SyncPromise } from './syncpromise';\n\n/** A simple queue that holds promises. */\nexport class PromiseBuffer<T> {\n  /** Internal set of queued Promises */\n  private readonly _buffer: Array<PromiseLike<T>> = [];\n\n  public constructor(protected _limit?: number) {}\n\n  /**\n   * Says if the buffer is ready to take more requests\n   */\n  public isReady(): boolean {\n    return this._limit === undefined || this.length() < this._limit;\n  }\n\n  /**\n   * Add a promise to the queue.\n   *\n   * @param task Can be any PromiseLike<T>\n   * @returns The original promise.\n   */\n  public add(task: PromiseLike<T>): PromiseLike<T> {\n    if (!this.isReady()) {\n      return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n    }\n    if (this._buffer.indexOf(task) === -1) {\n      this._buffer.push(task);\n    }\n    task\n      .then(() => this.remove(task))\n      .then(null, () =>\n        this.remove(task).then(null, () => {\n          // We have to add this catch here otherwise we have an unhandledPromiseRejection\n          // because it's a new Promise chain.\n        }),\n      );\n    return task;\n  }\n\n  /**\n   * Remove a promise to the queue.\n   *\n   * @param task Can be any PromiseLike<T>\n   * @returns Removed promise.\n   */\n  public remove(task: PromiseLike<T>): PromiseLike<T> {\n    const removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n    return removedTask;\n  }\n\n  /**\n   * This function returns the number of unresolved promises in the queue.\n   */\n  public length(): number {\n    return this._buffer.length;\n  }\n\n  /**\n   * This will drain the whole queue, returns true if queue is empty or drained.\n   * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n   *\n   * @param timeout Number in ms to wait until it resolves with false.\n   */\n  public drain(timeout?: number): PromiseLike<boolean> {\n    return new SyncPromise<boolean>(resolve => {\n      const capturedSetTimeout = setTimeout(() => {\n        if (timeout && timeout > 0) {\n          resolve(false);\n        }\n      }, timeout);\n      SyncPromise.all(this._buffer)\n        .then(() => {\n          clearTimeout(capturedSetTimeout);\n          resolve(true);\n        })\n        .then(null, () => {\n          resolve(true);\n        });\n    });\n  }\n}\n","import { API } from '@sentry/core';\nimport {\n  Event,\n  Response as SentryResponse,\n  SentryRequestType,\n  Status,\n  Transport,\n  TransportOptions,\n} from '@sentry/types';\nimport { logger, parseRetryAfterHeader, PromiseBuffer, SentryError } from '@sentry/utils';\n\nconst CATEGORY_MAPPING: {\n  [key in SentryRequestType]: string;\n} = {\n  event: 'error',\n  transaction: 'transaction',\n  session: 'session',\n};\n\n/** Base Transport class implementation */\nexport abstract class BaseTransport implements Transport {\n  /**\n   * @deprecated\n   */\n  public url: string;\n\n  /** Helper to get Sentry API endpoints. */\n  protected readonly _api: API;\n\n  /** A simple buffer holding all requests. */\n  protected readonly _buffer: PromiseBuffer<SentryResponse> = new PromiseBuffer(30);\n\n  /** Locks transport after receiving rate limits in a response */\n  protected readonly _rateLimits: Record<string, Date> = {};\n\n  public constructor(public options: TransportOptions) {\n    this._api = new API(options.dsn, options._metadata);\n    // eslint-disable-next-line deprecation/deprecation\n    this.url = this._api.getStoreEndpointWithUrlEncodedAuth();\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendEvent(_: Event): PromiseLike<SentryResponse> {\n    throw new SentryError('Transport Class has to implement `sendEvent` method');\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public close(timeout?: number): PromiseLike<boolean> {\n    return this._buffer.drain(timeout);\n  }\n\n  /**\n   * Handle Sentry repsonse for promise-based transports.\n   */\n  protected _handleResponse({\n    requestType,\n    response,\n    headers,\n    resolve,\n    reject,\n  }: {\n    requestType: SentryRequestType;\n    response: Response | XMLHttpRequest;\n    headers: Record<string, string | null>;\n    resolve: (value?: SentryResponse | PromiseLike<SentryResponse> | null | undefined) => void;\n    reject: (reason?: unknown) => void;\n  }): void {\n    const status = Status.fromHttpCode(response.status);\n    /**\n     * \"The name is case-insensitive.\"\n     * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n     */\n    const limited = this._handleRateLimit(headers);\n    if (limited) logger.warn(`Too many requests, backing off until: ${this._disabledUntil(requestType)}`);\n\n    if (status === Status.Success) {\n      resolve({ status });\n      return;\n    }\n\n    reject(response);\n  }\n\n  /**\n   * Gets the time that given category is disabled until for rate limiting\n   */\n  protected _disabledUntil(requestType: SentryRequestType): Date {\n    const category = CATEGORY_MAPPING[requestType];\n    return this._rateLimits[category] || this._rateLimits.all;\n  }\n\n  /**\n   * Checks if a category is rate limited\n   */\n  protected _isRateLimited(requestType: SentryRequestType): boolean {\n    return this._disabledUntil(requestType) > new Date(Date.now());\n  }\n\n  /**\n   * Sets internal _rateLimits from incoming headers. Returns true if headers contains a non-empty rate limiting header.\n   */\n  protected _handleRateLimit(headers: Record<string, string | null>): boolean {\n    const now = Date.now();\n    const rlHeader = headers['x-sentry-rate-limits'];\n    const raHeader = headers['retry-after'];\n\n    if (rlHeader) {\n      // rate limit headers are of the form\n      //     <header>,<header>,..\n      // where each <header> is of the form\n      //     <retry_after>: <categories>: <scope>: <reason_code>\n      // where\n      //     <retry_after> is a delay in ms\n      //     <categories> is the event type(s) (error, transaction, etc) being rate limited and is of the form\n      //         <category>;<category>;...\n      //     <scope> is what's being limited (org, project, or key) - ignored by SDK\n      //     <reason_code> is an arbitrary string like \"org_quota\" - ignored by SDK\n      for (const limit of rlHeader.trim().split(',')) {\n        const parameters = limit.split(':', 2);\n        const headerDelay = parseInt(parameters[0], 10);\n        const delay = (!isNaN(headerDelay) ? headerDelay : 60) * 1000; // 60sec default\n        for (const category of parameters[1].split(';')) {\n          this._rateLimits[category || 'all'] = new Date(now + delay);\n        }\n      }\n      return true;\n    } else if (raHeader) {\n      this._rateLimits.all = new Date(now + parseRetryAfterHeader(now, raHeader));\n      return true;\n    }\n    return false;\n  }\n}\n","import { eventToSentryRequest, sessionToSentryRequest } from '@sentry/core';\nimport { Event, Response, SentryRequest, Session, TransportOptions } from '@sentry/types';\nimport { getGlobalObject, isNativeFetch, logger, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\n\nimport { BaseTransport } from './base';\n\ntype FetchImpl = typeof fetch;\n\n/**\n * A special usecase for incorrectly wrapped Fetch APIs in conjunction with ad-blockers.\n * Whenever someone wraps the Fetch API and returns the wrong promise chain,\n * this chain becomes orphaned and there is no possible way to capture it's rejections\n * other than allowing it bubble up to this very handler. eg.\n *\n * const f = window.fetch;\n * window.fetch = function () {\n *   const p = f.apply(this, arguments);\n *\n *   p.then(function() {\n *     console.log('hi.');\n *   });\n *\n *   return p;\n * }\n *\n * `p.then(function () { ... })` is producing a completely separate promise chain,\n * however, what's returned is `p` - the result of original `fetch` call.\n *\n * This mean, that whenever we use the Fetch API to send our own requests, _and_\n * some ad-blocker blocks it, this orphaned chain will _always_ reject,\n * effectively causing another event to be captured.\n * This makes a whole process become an infinite loop, which we need to somehow\n * deal with, and break it in one way or another.\n *\n * To deal with this issue, we are making sure that we _always_ use the real\n * browser Fetch API, instead of relying on what `window.fetch` exposes.\n * The only downside to this would be missing our own requests as breadcrumbs,\n * but because we are already not doing this, it should be just fine.\n *\n * Possible failed fetch error messages per-browser:\n *\n * Chrome:  Failed to fetch\n * Edge:    Failed to Fetch\n * Firefox: NetworkError when attempting to fetch resource\n * Safari:  resource blocked by content blocker\n */\nfunction getNativeFetchImplementation(): FetchImpl {\n  /* eslint-disable @typescript-eslint/unbound-method */\n\n  // Fast path to avoid DOM I/O\n  const global = getGlobalObject<Window>();\n  if (isNativeFetch(global.fetch)) {\n    return global.fetch.bind(global);\n  }\n\n  const document = global.document;\n  let fetchImpl = global.fetch;\n  // eslint-disable-next-line deprecation/deprecation\n  if (typeof document?.createElement === `function`) {\n    try {\n      const sandbox = document.createElement('iframe');\n      sandbox.hidden = true;\n      document.head.appendChild(sandbox);\n      if (sandbox.contentWindow?.fetch) {\n        fetchImpl = sandbox.contentWindow.fetch;\n      }\n      document.head.removeChild(sandbox);\n    } catch (e) {\n      logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', e);\n    }\n  }\n\n  return fetchImpl.bind(global);\n  /* eslint-enable @typescript-eslint/unbound-method */\n}\n\n/** `fetch` based transport */\nexport class FetchTransport extends BaseTransport {\n  /**\n   * Fetch API reference which always points to native browser implementation.\n   */\n  private _fetch: typeof fetch;\n\n  constructor(options: TransportOptions, fetchImpl: FetchImpl = getNativeFetchImplementation()) {\n    super(options);\n    this._fetch = fetchImpl;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendEvent(event: Event): PromiseLike<Response> {\n    return this._sendRequest(eventToSentryRequest(event, this._api), event);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendSession(session: Session): PromiseLike<Response> {\n    return this._sendRequest(sessionToSentryRequest(session, this._api), session);\n  }\n\n  /**\n   * @param sentryRequest Prepared SentryRequest to be delivered\n   * @param originalPayload Original payload used to create SentryRequest\n   */\n  private _sendRequest(sentryRequest: SentryRequest, originalPayload: Event | Session): PromiseLike<Response> {\n    if (this._isRateLimited(sentryRequest.type)) {\n      return Promise.reject({\n        event: originalPayload,\n        type: sentryRequest.type,\n        reason: `Transport locked till ${this._disabledUntil(sentryRequest.type)} due to too many requests.`,\n        status: 429,\n      });\n    }\n\n    const options: RequestInit = {\n      body: sentryRequest.body,\n      method: 'POST',\n      // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n      // https://caniuse.com/#feat=referrer-policy\n      // It doesn't. And it throw exception instead of ignoring this parameter...\n      // REF: https://github.com/getsentry/raven-js/issues/1233\n      referrerPolicy: (supportsReferrerPolicy() ? 'origin' : '') as ReferrerPolicy,\n    };\n    if (this.options.fetchParameters !== undefined) {\n      Object.assign(options, this.options.fetchParameters);\n    }\n    if (this.options.headers !== undefined) {\n      options.headers = this.options.headers;\n    }\n\n    return this._buffer.add(\n      new SyncPromise<Response>((resolve, reject) => {\n        this._fetch(sentryRequest.url, options)\n          .then(response => {\n            const headers = {\n              'x-sentry-rate-limits': response.headers.get('X-Sentry-Rate-Limits'),\n              'retry-after': response.headers.get('Retry-After'),\n            };\n            this._handleResponse({\n              requestType: sentryRequest.type,\n              response,\n              headers,\n              resolve,\n              reject,\n            });\n          })\n          .catch(reject);\n      }),\n    );\n  }\n}\n","import { eventToSentryRequest, sessionToSentryRequest } from '@sentry/core';\nimport { Event, Response, SentryRequest, Session } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n\nimport { BaseTransport } from './base';\n\n/** `XHR` based transport */\nexport class XHRTransport extends BaseTransport {\n  /**\n   * @inheritDoc\n   */\n  public sendEvent(event: Event): PromiseLike<Response> {\n    return this._sendRequest(eventToSentryRequest(event, this._api), event);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public sendSession(session: Session): PromiseLike<Response> {\n    return this._sendRequest(sessionToSentryRequest(session, this._api), session);\n  }\n\n  /**\n   * @param sentryRequest Prepared SentryRequest to be delivered\n   * @param originalPayload Original payload used to create SentryRequest\n   */\n  private _sendRequest(sentryRequest: SentryRequest, originalPayload: Event | Session): PromiseLike<Response> {\n    if (this._isRateLimited(sentryRequest.type)) {\n      return Promise.reject({\n        event: originalPayload,\n        type: sentryRequest.type,\n        reason: `Transport locked till ${this._disabledUntil(sentryRequest.type)} due to too many requests.`,\n        status: 429,\n      });\n    }\n\n    return this._buffer.add(\n      new SyncPromise<Response>((resolve, reject) => {\n        const request = new XMLHttpRequest();\n\n        request.onreadystatechange = (): void => {\n          if (request.readyState === 4) {\n            const headers = {\n              'x-sentry-rate-limits': request.getResponseHeader('X-Sentry-Rate-Limits'),\n              'retry-after': request.getResponseHeader('Retry-After'),\n            };\n            this._handleResponse({ requestType: sentryRequest.type, response: request, headers, resolve, reject });\n          }\n        };\n\n        request.open('POST', sentryRequest.url);\n        for (const header in this.options.headers) {\n          if (this.options.headers.hasOwnProperty(header)) {\n            request.setRequestHeader(header, this.options.headers[header]);\n          }\n        }\n        request.send(sentryRequest.body);\n      }),\n    );\n  }\n}\n","import { BaseBackend } from '@sentry/core';\nimport { Event, EventHint, Options, Severity, Transport } from '@sentry/types';\nimport { supportsFetch } from '@sentry/utils';\n\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n\n/**\n * Configuration options for the Sentry Browser SDK.\n * @see BrowserClient for more information.\n */\nexport interface BrowserOptions extends Options {\n  /**\n   * A pattern for error URLs which should exclusively be sent to Sentry.\n   * This is the opposite of {@link Options.denyUrls}.\n   * By default, all errors will be sent.\n   */\n  allowUrls?: Array<string | RegExp>;\n\n  /**\n   * A pattern for error URLs which should not be sent to Sentry.\n   * To allow certain errors instead, use {@link Options.allowUrls}.\n   * By default, all errors will be sent.\n   */\n  denyUrls?: Array<string | RegExp>;\n\n  /** @deprecated use {@link Options.allowUrls} instead. */\n  whitelistUrls?: Array<string | RegExp>;\n\n  /** @deprecated use {@link Options.denyUrls} instead. */\n  blacklistUrls?: Array<string | RegExp>;\n\n  /**\n   * A flag enabling Sessions Tracking feature.\n   * By default Sessions Tracking is disabled.\n   */\n  autoSessionTracking?: boolean;\n}\n\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nexport class BrowserBackend extends BaseBackend<BrowserOptions> {\n  /**\n   * @inheritDoc\n   */\n  public eventFromException(exception: unknown, hint?: EventHint): PromiseLike<Event> {\n    return eventFromException(this._options, exception, hint);\n  }\n  /**\n   * @inheritDoc\n   */\n  public eventFromMessage(message: string, level: Severity = Severity.Info, hint?: EventHint): PromiseLike<Event> {\n    return eventFromMessage(this._options, message, level, hint);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  protected _setupTransport(): Transport {\n    if (!this._options.dsn) {\n      // We return the noop transport here in case there is no Dsn.\n      return super._setupTransport();\n    }\n\n    const transportOptions = {\n      ...this._options.transportOptions,\n      dsn: this._options.dsn,\n      _metadata: this._options._metadata,\n    };\n\n    if (this._options.transport) {\n      return new this._options.transport(transportOptions);\n    }\n    if (supportsFetch()) {\n      return new FetchTransport(transportOptions);\n    }\n    return new XHRTransport(transportOptions);\n  }\n}\n","import { API, captureException, withScope } from '@sentry/core';\nimport { DsnLike, Event as SentryEvent, Mechanism, Scope, WrappedFunction } from '@sentry/types';\nimport { addExceptionMechanism, addExceptionTypeValue, logger } from '@sentry/utils';\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n  return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n  // onerror should trigger before setTimeout\n  ignoreOnError += 1;\n  setTimeout(() => {\n    ignoreOnError -= 1;\n  });\n}\n\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(\n  fn: WrappedFunction,\n  options: {\n    mechanism?: Mechanism;\n  } = {},\n  before?: WrappedFunction,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): any {\n  if (typeof fn !== 'function') {\n    return fn;\n  }\n\n  try {\n    // We don't wanna wrap it twice\n    if (fn.__sentry__) {\n      return fn;\n    }\n\n    // If this has already been wrapped in the past, return that wrapped function\n    if (fn.__sentry_wrapped__) {\n      return fn.__sentry_wrapped__;\n    }\n  } catch (e) {\n    // Just accessing custom props in some Selenium environments\n    // can cause a \"Permission denied\" exception (see raven-js#495).\n    // Bail on wrapping and return the function as-is (defers to window.onerror).\n    return fn;\n  }\n\n  /* eslint-disable prefer-rest-params */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  const sentryWrapped: WrappedFunction = function(this: any): void {\n    const args = Array.prototype.slice.call(arguments);\n\n    try {\n      if (before && typeof before === 'function') {\n        before.apply(this, arguments);\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n      const wrappedArguments = args.map((arg: any) => wrap(arg, options));\n\n      if (fn.handleEvent) {\n        // Attempt to invoke user-land function\n        // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n        //       means the sentry.javascript SDK caught an error invoking your application code. This\n        //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n        // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n        return fn.handleEvent.apply(this, wrappedArguments);\n      }\n      // Attempt to invoke user-land function\n      // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n      //       means the sentry.javascript SDK caught an error invoking your application code. This\n      //       is expected behavior and NOT indicative of a bug with sentry.javascript.\n      return fn.apply(this, wrappedArguments);\n    } catch (ex) {\n      ignoreNextOnError();\n\n      withScope((scope: Scope) => {\n        scope.addEventProcessor((event: SentryEvent) => {\n          const processedEvent = { ...event };\n\n          if (options.mechanism) {\n            addExceptionTypeValue(processedEvent, undefined, undefined);\n            addExceptionMechanism(processedEvent, options.mechanism);\n          }\n\n          processedEvent.extra = {\n            ...processedEvent.extra,\n            arguments: args,\n          };\n\n          return processedEvent;\n        });\n\n        captureException(ex);\n      });\n\n      throw ex;\n    }\n  };\n  /* eslint-enable prefer-rest-params */\n\n  // Accessing some objects may throw\n  // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n  try {\n    for (const property in fn) {\n      if (Object.prototype.hasOwnProperty.call(fn, property)) {\n        sentryWrapped[property] = fn[property];\n      }\n    }\n  } catch (_oO) {} // eslint-disable-line no-empty\n\n  fn.prototype = fn.prototype || {};\n  sentryWrapped.prototype = fn.prototype;\n\n  Object.defineProperty(fn, '__sentry_wrapped__', {\n    enumerable: false,\n    value: sentryWrapped,\n  });\n\n  // Signal that this function has been wrapped/filled already\n  // for both debugging and to prevent it to being wrapped/filled twice\n  Object.defineProperties(sentryWrapped, {\n    __sentry__: {\n      enumerable: false,\n      value: true,\n    },\n    __sentry_original__: {\n      enumerable: false,\n      value: fn,\n    },\n  });\n\n  // Restore original function name (not all browsers allow that)\n  try {\n    const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name') as PropertyDescriptor;\n    if (descriptor.configurable) {\n      Object.defineProperty(sentryWrapped, 'name', {\n        get(): string {\n          return fn.name;\n        },\n      });\n    }\n    // eslint-disable-next-line no-empty\n  } catch (_oO) {}\n\n  return sentryWrapped;\n}\n\n/**\n * All properties the report dialog supports\n */\nexport interface ReportDialogOptions {\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n  eventId?: string;\n  dsn?: DsnLike;\n  user?: {\n    email?: string;\n    name?: string;\n  };\n  lang?: string;\n  title?: string;\n  subtitle?: string;\n  subtitle2?: string;\n  labelName?: string;\n  labelEmail?: string;\n  labelComments?: string;\n  labelClose?: string;\n  labelSubmit?: string;\n  errorGeneric?: string;\n  errorFormEntry?: string;\n  successMessage?: string;\n  /** Callback after reportDialog showed up */\n  onLoad?(): void;\n}\n\n/**\n * Injects the Report Dialog script\n * @hidden\n */\nexport function injectReportDialog(options: ReportDialogOptions = {}): void {\n  if (!options.eventId) {\n    logger.error(`Missing eventId option in showReportDialog call`);\n    return;\n  }\n  if (!options.dsn) {\n    logger.error(`Missing dsn option in showReportDialog call`);\n    return;\n  }\n\n  const script = document.createElement('script');\n  script.async = true;\n  script.src = new API(options.dsn).getReportDialogEndpoint(options);\n\n  if (options.onLoad) {\n    // eslint-disable-next-line @typescript-eslint/unbound-method\n    script.onload = options.onLoad;\n  }\n\n  (document.head || document.body).appendChild(script);\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable max-lines */\nimport { getCurrentHub } from '@sentry/core';\nimport { Event, Integration, Severity } from '@sentry/types';\nimport {\n  addInstrumentationHandler,\n  getEventDescription,\n  getGlobalObject,\n  htmlTreeAsString,\n  parseUrl,\n  safeJoin,\n} from '@sentry/utils';\n\n/** JSDoc */\ninterface BreadcrumbsOptions {\n  console: boolean;\n  dom: boolean;\n  fetch: boolean;\n  history: boolean;\n  sentry: boolean;\n  xhr: boolean;\n}\n\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nexport class Breadcrumbs implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'Breadcrumbs';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = Breadcrumbs.id;\n\n  /** JSDoc */\n  private readonly _options: BreadcrumbsOptions;\n\n  /**\n   * @inheritDoc\n   */\n  public constructor(options?: Partial<BreadcrumbsOptions>) {\n    this._options = {\n      console: true,\n      dom: true,\n      fetch: true,\n      history: true,\n      sentry: true,\n      xhr: true,\n      ...options,\n    };\n  }\n\n  /**\n   * Create a breadcrumb of `sentry` from the events themselves\n   */\n  public addSentryBreadcrumb(event: Event): void {\n    if (!this._options.sentry) {\n      return;\n    }\n    getCurrentHub().addBreadcrumb(\n      {\n        category: `sentry.${event.type === 'transaction' ? 'transaction' : 'event'}`,\n        event_id: event.event_id,\n        level: event.level,\n        message: getEventDescription(event),\n      },\n      {\n        event,\n      },\n    );\n  }\n\n  /**\n   * Instrument browser built-ins w/ breadcrumb capturing\n   *  - Console API\n   *  - DOM API (click/typing)\n   *  - XMLHttpRequest API\n   *  - Fetch API\n   *  - History API\n   */\n  public setupOnce(): void {\n    if (this._options.console) {\n      addInstrumentationHandler({\n        callback: (...args) => {\n          this._consoleBreadcrumb(...args);\n        },\n        type: 'console',\n      });\n    }\n    if (this._options.dom) {\n      addInstrumentationHandler({\n        callback: (...args) => {\n          this._domBreadcrumb(...args);\n        },\n        type: 'dom',\n      });\n    }\n    if (this._options.xhr) {\n      addInstrumentationHandler({\n        callback: (...args) => {\n          this._xhrBreadcrumb(...args);\n        },\n        type: 'xhr',\n      });\n    }\n    if (this._options.fetch) {\n      addInstrumentationHandler({\n        callback: (...args) => {\n          this._fetchBreadcrumb(...args);\n        },\n        type: 'fetch',\n      });\n    }\n    if (this._options.history) {\n      addInstrumentationHandler({\n        callback: (...args) => {\n          this._historyBreadcrumb(...args);\n        },\n        type: 'history',\n      });\n    }\n  }\n\n  /**\n   * Creates breadcrumbs from console API calls\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _consoleBreadcrumb(handlerData: { [key: string]: any }): void {\n    const breadcrumb = {\n      category: 'console',\n      data: {\n        arguments: handlerData.args,\n        logger: 'console',\n      },\n      level: Severity.fromString(handlerData.level),\n      message: safeJoin(handlerData.args, ' '),\n    };\n\n    if (handlerData.level === 'assert') {\n      if (handlerData.args[0] === false) {\n        breadcrumb.message = `Assertion failed: ${safeJoin(handlerData.args.slice(1), ' ') || 'console.assert'}`;\n        breadcrumb.data.arguments = handlerData.args.slice(1);\n      } else {\n        // Don't capture a breadcrumb for passed assertions\n        return;\n      }\n    }\n\n    getCurrentHub().addBreadcrumb(breadcrumb, {\n      input: handlerData.args,\n      level: handlerData.level,\n    });\n  }\n\n  /**\n   * Creates breadcrumbs from DOM API calls\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _domBreadcrumb(handlerData: { [key: string]: any }): void {\n    let target;\n\n    // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n    try {\n      target = handlerData.event.target\n        ? htmlTreeAsString(handlerData.event.target as Node)\n        : htmlTreeAsString((handlerData.event as unknown) as Node);\n    } catch (e) {\n      target = '<unknown>';\n    }\n\n    if (target.length === 0) {\n      return;\n    }\n\n    getCurrentHub().addBreadcrumb(\n      {\n        category: `ui.${handlerData.name}`,\n        message: target,\n      },\n      {\n        event: handlerData.event,\n        name: handlerData.name,\n        global: handlerData.global,\n      },\n    );\n  }\n\n  /**\n   * Creates breadcrumbs from XHR API calls\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _xhrBreadcrumb(handlerData: { [key: string]: any }): void {\n    if (handlerData.endTimestamp) {\n      // We only capture complete, non-sentry requests\n      if (handlerData.xhr.__sentry_own_request__) {\n        return;\n      }\n\n      const { method, url, status_code, body } = handlerData.xhr.__sentry_xhr__ || {};\n\n      getCurrentHub().addBreadcrumb(\n        {\n          category: 'xhr',\n          data: {\n            method,\n            url,\n            status_code,\n          },\n          type: 'http',\n        },\n        {\n          xhr: handlerData.xhr,\n          input: body,\n        },\n      );\n\n      return;\n    }\n  }\n\n  /**\n   * Creates breadcrumbs from fetch API calls\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _fetchBreadcrumb(handlerData: { [key: string]: any }): void {\n    // We only capture complete fetch requests\n    if (!handlerData.endTimestamp) {\n      return;\n    }\n\n    if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n      // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n      return;\n    }\n\n    if (handlerData.error) {\n      getCurrentHub().addBreadcrumb(\n        {\n          category: 'fetch',\n          data: handlerData.fetchData,\n          level: Severity.Error,\n          type: 'http',\n        },\n        {\n          data: handlerData.error,\n          input: handlerData.args,\n        },\n      );\n    } else {\n      getCurrentHub().addBreadcrumb(\n        {\n          category: 'fetch',\n          data: {\n            ...handlerData.fetchData,\n            status_code: handlerData.response.status,\n          },\n          type: 'http',\n        },\n        {\n          input: handlerData.args,\n          response: handlerData.response,\n        },\n      );\n    }\n  }\n\n  /**\n   * Creates breadcrumbs from history API calls\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _historyBreadcrumb(handlerData: { [key: string]: any }): void {\n    const global = getGlobalObject<Window>();\n    let from = handlerData.from;\n    let to = handlerData.to;\n    const parsedLoc = parseUrl(global.location.href);\n    let parsedFrom = parseUrl(from);\n    const parsedTo = parseUrl(to);\n\n    // Initial pushState doesn't provide `from` information\n    if (!parsedFrom.path) {\n      parsedFrom = parsedLoc;\n    }\n\n    // Use only the path component of the URL if the URL matches the current\n    // document (almost all the time when using pushState)\n    if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n      to = parsedTo.relative;\n    }\n    if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n      from = parsedFrom.relative;\n    }\n\n    getCurrentHub().addBreadcrumb({\n      category: 'navigation',\n      data: {\n        from,\n        to,\n      },\n    });\n  }\n}\n","import { BaseClient, Scope, SDK_VERSION } from '@sentry/core';\nimport { Event, EventHint } from '@sentry/types';\nimport { getGlobalObject, logger } from '@sentry/utils';\n\nimport { BrowserBackend, BrowserOptions } from './backend';\nimport { injectReportDialog, ReportDialogOptions } from './helpers';\nimport { Breadcrumbs } from './integrations';\n\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nexport class BrowserClient extends BaseClient<BrowserBackend, BrowserOptions> {\n  /**\n   * Creates a new Browser SDK instance.\n   *\n   * @param options Configuration options for this SDK.\n   */\n  public constructor(options: BrowserOptions = {}) {\n    options._metadata = options._metadata || {};\n    options._metadata.sdk = options._metadata.sdk || {\n      name: 'sentry.javascript.browser',\n      packages: [\n        {\n          name: 'npm:@sentry/browser',\n          version: SDK_VERSION,\n        },\n      ],\n      version: SDK_VERSION,\n    };\n\n    super(BrowserBackend, options);\n  }\n\n  /**\n   * Show a report dialog to the user to send feedback to a specific event.\n   *\n   * @param options Set individual options for the dialog\n   */\n  public showReportDialog(options: ReportDialogOptions = {}): void {\n    // doesn't work without a document (React Native)\n    const document = getGlobalObject<Window>().document;\n    if (!document) {\n      return;\n    }\n\n    if (!this._isEnabled()) {\n      logger.error('Trying to call showReportDialog with Sentry Client disabled');\n      return;\n    }\n\n    injectReportDialog({\n      ...options,\n      dsn: options.dsn || this.getDsn(),\n    });\n  }\n\n  /**\n   * @inheritDoc\n   */\n  protected _prepareEvent(event: Event, scope?: Scope, hint?: EventHint): PromiseLike<Event | null> {\n    event.platform = event.platform || 'javascript';\n    return super._prepareEvent(event, scope, hint);\n  }\n\n  /**\n   * @inheritDoc\n   */\n  protected _sendEvent(event: Event): void {\n    const integration = this.getIntegration(Breadcrumbs);\n    if (integration) {\n      integration.addSentryBreadcrumb(event);\n    }\n    super._sendEvent(event);\n  }\n}\n","import { Integration, WrappedFunction } from '@sentry/types';\nimport { fill, getFunctionName, getGlobalObject } from '@sentry/utils';\n\nimport { wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n  'EventTarget',\n  'Window',\n  'Node',\n  'ApplicationCache',\n  'AudioTrackList',\n  'ChannelMergerNode',\n  'CryptoOperation',\n  'EventSource',\n  'FileReader',\n  'HTMLUnknownElement',\n  'IDBDatabase',\n  'IDBRequest',\n  'IDBTransaction',\n  'KeyOperation',\n  'MediaController',\n  'MessagePort',\n  'ModalWindow',\n  'Notification',\n  'SVGElementInstance',\n  'Screen',\n  'TextTrack',\n  'TextTrackCue',\n  'TextTrackList',\n  'WebSocket',\n  'WebSocketWorker',\n  'Worker',\n  'XMLHttpRequest',\n  'XMLHttpRequestEventTarget',\n  'XMLHttpRequestUpload',\n];\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\n/** JSDoc */\ninterface TryCatchOptions {\n  setTimeout: boolean;\n  setInterval: boolean;\n  requestAnimationFrame: boolean;\n  XMLHttpRequest: boolean;\n  eventTarget: boolean | string[];\n}\n\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nexport class TryCatch implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'TryCatch';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = TryCatch.id;\n\n  /** JSDoc */\n  private readonly _options: TryCatchOptions;\n\n  /**\n   * @inheritDoc\n   */\n  public constructor(options?: Partial<TryCatchOptions>) {\n    this._options = {\n      XMLHttpRequest: true,\n      eventTarget: true,\n      requestAnimationFrame: true,\n      setInterval: true,\n      setTimeout: true,\n      ...options,\n    };\n  }\n\n  /**\n   * Wrap timer functions and event targets to catch errors\n   * and provide better metadata.\n   */\n  public setupOnce(): void {\n    const global = getGlobalObject();\n\n    if (this._options.setTimeout) {\n      fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n    }\n\n    if (this._options.setInterval) {\n      fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n    }\n\n    if (this._options.requestAnimationFrame) {\n      fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n    }\n\n    if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n      fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n    }\n\n    if (this._options.eventTarget) {\n      const eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;\n      eventTarget.forEach(this._wrapEventTarget.bind(this));\n    }\n  }\n\n  /** JSDoc */\n  private _wrapTimeFunction(original: () => void): () => number {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function(this: any, ...args: any[]): number {\n      const originalCallback = args[0];\n      args[0] = wrap(originalCallback, {\n        mechanism: {\n          data: { function: getFunctionName(original) },\n          handled: true,\n          type: 'instrument',\n        },\n      });\n      return original.apply(this, args);\n    };\n  }\n\n  /** JSDoc */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _wrapRAF(original: any): (callback: () => void) => any {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function(this: any, callback: () => void): () => void {\n      // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n      return original.call(\n        this,\n        wrap(callback, {\n          mechanism: {\n            data: {\n              function: 'requestAnimationFrame',\n              handler: getFunctionName(original),\n            },\n            handled: true,\n            type: 'instrument',\n          },\n        }),\n      );\n    };\n  }\n\n  /** JSDoc */\n  private _wrapEventTarget(target: string): void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const global = getGlobalObject() as { [key: string]: any };\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    const proto = global[target] && global[target].prototype;\n\n    // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n    if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n      return;\n    }\n\n    fill(proto, 'addEventListener', function(\n      original: () => void,\n    ): (eventName: string, fn: EventListenerObject, options?: boolean | AddEventListenerOptions) => void {\n      return function(\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        this: any,\n        eventName: string,\n        fn: EventListenerObject,\n        options?: boolean | AddEventListenerOptions,\n      ): (eventName: string, fn: EventListenerObject, capture?: boolean, secure?: boolean) => void {\n        try {\n          if (typeof fn.handleEvent === 'function') {\n            fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n              mechanism: {\n                data: {\n                  function: 'handleEvent',\n                  handler: getFunctionName(fn),\n                  target,\n                },\n                handled: true,\n                type: 'instrument',\n              },\n            });\n          }\n        } catch (err) {\n          // can sometimes get 'Permission denied to access property \"handle Event'\n        }\n\n        return original.call(\n          this,\n          eventName,\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          wrap((fn as any) as WrappedFunction, {\n            mechanism: {\n              data: {\n                function: 'addEventListener',\n                handler: getFunctionName(fn),\n                target,\n              },\n              handled: true,\n              type: 'instrument',\n            },\n          }),\n          options,\n        );\n      };\n    });\n\n    fill(proto, 'removeEventListener', function(\n      originalRemoveEventListener: () => void,\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    ): (this: any, eventName: string, fn: EventListenerObject, options?: boolean | EventListenerOptions) => () => void {\n      return function(\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        this: any,\n        eventName: string,\n        fn: EventListenerObject,\n        options?: boolean | EventListenerOptions,\n      ): () => void {\n        /**\n         * There are 2 possible scenarios here:\n         *\n         * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n         * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n         * as a pass-through, and call original `removeEventListener` with it.\n         *\n         * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n         * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n         * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n         * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n         * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n         *\n         * When someone adds a handler prior to initialization, and then do it again, but after,\n         * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n         * to get rid of the initial handler and it'd stick there forever.\n         */\n        const wrappedEventHandler = (fn as unknown) as WrappedFunction;\n        try {\n          const originalEventHandler = wrappedEventHandler?.__sentry_wrapped__;\n          if (originalEventHandler) {\n            originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n          }\n        } catch (e) {\n          // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n        }\n        return originalRemoveEventListener.call(this, eventName, wrappedEventHandler, options);\n      };\n    });\n  }\n\n  /** JSDoc */\n  private _wrapXHR(originalSend: () => void): () => void {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    return function(this: XMLHttpRequest, ...args: any[]): void {\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      const xhr = this;\n      const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n      xmlHttpRequestProps.forEach(prop => {\n        if (prop in xhr && typeof xhr[prop] === 'function') {\n          // eslint-disable-next-line @typescript-eslint/no-explicit-any\n          fill(xhr, prop, function(original: WrappedFunction): () => any {\n            const wrapOptions = {\n              mechanism: {\n                data: {\n                  function: prop,\n                  handler: getFunctionName(original),\n                },\n                handled: true,\n                type: 'instrument',\n              },\n            };\n\n            // If Instrument integration has been called before TryCatch, get the name of original function\n            if (original.__sentry_original__) {\n              wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n            }\n\n            // Otherwise wrap directly\n            return wrap(original, wrapOptions);\n          });\n        }\n      });\n\n      return originalSend.apply(this, args);\n    };\n  }\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { getCurrentHub } from '@sentry/core';\nimport { Event, Integration, Primitive, Severity } from '@sentry/types';\nimport {\n  addExceptionMechanism,\n  addInstrumentationHandler,\n  getLocationHref,\n  isErrorEvent,\n  isPrimitive,\n  isString,\n  logger,\n} from '@sentry/utils';\n\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n\n/** JSDoc */\ninterface GlobalHandlersIntegrations {\n  onerror: boolean;\n  onunhandledrejection: boolean;\n}\n\n/** Global handlers */\nexport class GlobalHandlers implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'GlobalHandlers';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = GlobalHandlers.id;\n\n  /** JSDoc */\n  private readonly _options: GlobalHandlersIntegrations;\n\n  /** JSDoc */\n  private _onErrorHandlerInstalled: boolean = false;\n\n  /** JSDoc */\n  private _onUnhandledRejectionHandlerInstalled: boolean = false;\n\n  /** JSDoc */\n  public constructor(options?: GlobalHandlersIntegrations) {\n    this._options = {\n      onerror: true,\n      onunhandledrejection: true,\n      ...options,\n    };\n  }\n  /**\n   * @inheritDoc\n   */\n  public setupOnce(): void {\n    Error.stackTraceLimit = 50;\n\n    if (this._options.onerror) {\n      logger.log('Global Handler attached: onerror');\n      this._installGlobalOnErrorHandler();\n    }\n\n    if (this._options.onunhandledrejection) {\n      logger.log('Global Handler attached: onunhandledrejection');\n      this._installGlobalOnUnhandledRejectionHandler();\n    }\n  }\n\n  /** JSDoc */\n  private _installGlobalOnErrorHandler(): void {\n    if (this._onErrorHandlerInstalled) {\n      return;\n    }\n\n    addInstrumentationHandler({\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      callback: (data: { msg: any; url: any; line: any; column: any; error: any }) => {\n        const error = data.error;\n        const currentHub = getCurrentHub();\n        const hasIntegration = currentHub.getIntegration(GlobalHandlers);\n        const isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n        if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n          return;\n        }\n\n        const client = currentHub.getClient();\n        const event = isPrimitive(error)\n          ? this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)\n          : this._enhanceEventWithInitialFrame(\n              eventFromUnknownInput(error, undefined, {\n                attachStacktrace: client && client.getOptions().attachStacktrace,\n                rejection: false,\n              }),\n              data.url,\n              data.line,\n              data.column,\n            );\n\n        addExceptionMechanism(event, {\n          handled: false,\n          type: 'onerror',\n        });\n\n        currentHub.captureEvent(event, {\n          originalException: error,\n        });\n      },\n      type: 'error',\n    });\n\n    this._onErrorHandlerInstalled = true;\n  }\n\n  /** JSDoc */\n  private _installGlobalOnUnhandledRejectionHandler(): void {\n    if (this._onUnhandledRejectionHandlerInstalled) {\n      return;\n    }\n\n    addInstrumentationHandler({\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      callback: (e: any) => {\n        let error = e;\n\n        // dig the object of the rejection out of known event types\n        try {\n          // PromiseRejectionEvents store the object of the rejection under 'reason'\n          // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n          if ('reason' in e) {\n            error = e.reason;\n          }\n          // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n          // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n          // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n          // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n          // https://github.com/getsentry/sentry-javascript/issues/2380\n          else if ('detail' in e && 'reason' in e.detail) {\n            error = e.detail.reason;\n          }\n        } catch (_oO) {\n          // no-empty\n        }\n\n        const currentHub = getCurrentHub();\n        const hasIntegration = currentHub.getIntegration(GlobalHandlers);\n        const isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n        if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n          return true;\n        }\n\n        const client = currentHub.getClient();\n        const event = isPrimitive(error)\n          ? this._eventFromRejectionWithPrimitive(error)\n          : eventFromUnknownInput(error, undefined, {\n              attachStacktrace: client && client.getOptions().attachStacktrace,\n              rejection: true,\n            });\n\n        event.level = Severity.Error;\n\n        addExceptionMechanism(event, {\n          handled: false,\n          type: 'onunhandledrejection',\n        });\n\n        currentHub.captureEvent(event, {\n          originalException: error,\n        });\n\n        return;\n      },\n      type: 'unhandledrejection',\n    });\n\n    this._onUnhandledRejectionHandlerInstalled = true;\n  }\n\n  /**\n   * This function creates a stack from an old, error-less onerror handler.\n   */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _eventFromIncompleteOnError(msg: any, url: any, line: any, column: any): Event {\n    const ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n\n    // If 'message' is ErrorEvent, get real message from inside\n    let message = isErrorEvent(msg) ? msg.message : msg;\n    let name;\n\n    if (isString(message)) {\n      const groups = message.match(ERROR_TYPES_RE);\n      if (groups) {\n        name = groups[1];\n        message = groups[2];\n      }\n    }\n\n    const event = {\n      exception: {\n        values: [\n          {\n            type: name || 'Error',\n            value: message,\n          },\n        ],\n      },\n    };\n\n    return this._enhanceEventWithInitialFrame(event, url, line, column);\n  }\n\n  /**\n   * Create an event from a promise rejection where the `reason` is a primitive.\n   *\n   * @param reason: The `reason` property of the promise rejection\n   * @returns An Event object with an appropriate `exception` value\n   */\n  private _eventFromRejectionWithPrimitive(reason: Primitive): Event {\n    return {\n      exception: {\n        values: [\n          {\n            type: 'UnhandledRejection',\n            // String() is needed because the Primitive type includes symbols (which can't be automatically stringified)\n            value: `Non-Error promise rejection captured with value: ${String(reason)}`,\n          },\n        ],\n      },\n    };\n  }\n\n  /** JSDoc */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  private _enhanceEventWithInitialFrame(event: Event, url: any, line: any, column: any): Event {\n    event.exception = event.exception || {};\n    event.exception.values = event.exception.values || [];\n    event.exception.values[0] = event.exception.values[0] || {};\n    event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n    event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n\n    const colno = isNaN(parseInt(column, 10)) ? undefined : column;\n    const lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n    const filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n    if (event.exception.values[0].stacktrace.frames.length === 0) {\n      event.exception.values[0].stacktrace.frames.push({\n        colno,\n        filename,\n        function: '?',\n        in_app: true,\n        lineno,\n      });\n    }\n\n    return event;\n  }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, EventHint, Exception, ExtendedError, Integration } from '@sentry/types';\nimport { isInstanceOf } from '@sentry/utils';\n\nimport { exceptionFromStacktrace } from '../parsers';\nimport { computeStackTrace } from '../tracekit';\n\nconst DEFAULT_KEY = 'cause';\nconst DEFAULT_LIMIT = 5;\n\n/** Adds SDK info to an event. */\nexport class LinkedErrors implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'LinkedErrors';\n\n  /**\n   * @inheritDoc\n   */\n  public readonly name: string = LinkedErrors.id;\n\n  /**\n   * @inheritDoc\n   */\n  private readonly _key: string;\n\n  /**\n   * @inheritDoc\n   */\n  private readonly _limit: number;\n\n  /**\n   * @inheritDoc\n   */\n  public constructor(options: { key?: string; limit?: number } = {}) {\n    this._key = options.key || DEFAULT_KEY;\n    this._limit = options.limit || DEFAULT_LIMIT;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setupOnce(): void {\n    addGlobalEventProcessor((event: Event, hint?: EventHint) => {\n      const self = getCurrentHub().getIntegration(LinkedErrors);\n      if (self) {\n        return self._handler(event, hint);\n      }\n      return event;\n    });\n  }\n\n  /**\n   * @inheritDoc\n   */\n  private _handler(event: Event, hint?: EventHint): Event | null {\n    if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n      return event;\n    }\n    const linkedErrors = this._walkErrorTree(hint.originalException as ExtendedError, this._key);\n    event.exception.values = [...linkedErrors, ...event.exception.values];\n    return event;\n  }\n\n  /**\n   * @inheritDoc\n   */\n  private _walkErrorTree(error: ExtendedError, key: string, stack: Exception[] = []): Exception[] {\n    if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n      return stack;\n    }\n    const stacktrace = computeStackTrace(error[key]);\n    const exception = exceptionFromStacktrace(stacktrace);\n    return this._walkErrorTree(error[key], key, [exception, ...stack]);\n  }\n}\n","import { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { Event, Integration } from '@sentry/types';\nimport { getGlobalObject } from '@sentry/utils';\n\nconst global = getGlobalObject<Window>();\n\n/** UserAgent */\nexport class UserAgent implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'UserAgent';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = UserAgent.id;\n\n  /**\n   * @inheritDoc\n   */\n  public setupOnce(): void {\n    addGlobalEventProcessor((event: Event) => {\n      if (getCurrentHub().getIntegration(UserAgent)) {\n        // if none of the information we want exists, don't bother\n        if (!global.navigator && !global.location && !global.document) {\n          return event;\n        }\n\n        // grab as much info as exists and add it to the event\n        const url = event.request?.url || global.location?.href;\n        const { referrer } = global.document || {};\n        const { userAgent } = global.navigator || {};\n\n        const headers = {\n          ...event.request?.headers,\n          ...(referrer && { Referer: referrer }),\n          ...(userAgent && { 'User-Agent': userAgent }),\n        };\n        const request = { ...(url && { url }), headers };\n\n        return { ...event, request };\n      }\n      return event;\n    });\n  }\n}\n","import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { addInstrumentationHandler, getGlobalObject, logger, SyncPromise } from '@sentry/utils';\n\nimport { BrowserOptions } from './backend';\nimport { BrowserClient } from './client';\nimport { ReportDialogOptions, wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\n\nexport const defaultIntegrations = [\n  new CoreIntegrations.InboundFilters(),\n  new CoreIntegrations.FunctionToString(),\n  new TryCatch(),\n  new Breadcrumbs(),\n  new GlobalHandlers(),\n  new LinkedErrors(),\n  new UserAgent(),\n];\n\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n *   dsn: '__DSN__',\n *   // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n *   scope.setExtra({ battery: 0.7 });\n *   scope.setTag({ user_mode: 'admin' });\n *   scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n *   message: 'My Breadcrumb',\n *   // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n *   message: 'Manual',\n *   stacktrace: [\n *     // ...\n *   ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options: BrowserOptions = {}): void {\n  if (options.defaultIntegrations === undefined) {\n    options.defaultIntegrations = defaultIntegrations;\n  }\n  if (options.release === undefined) {\n    const window = getGlobalObject<Window>();\n    // This supports the variable that sentry-webpack-plugin injects\n    if (window.SENTRY_RELEASE && window.SENTRY_RELEASE.id) {\n      options.release = window.SENTRY_RELEASE.id;\n    }\n  }\n  if (options.autoSessionTracking === undefined) {\n    options.autoSessionTracking = true;\n  }\n\n  initAndBind(BrowserClient, options);\n\n  if (options.autoSessionTracking) {\n    startSessionTracking();\n  }\n}\n\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options: ReportDialogOptions = {}): void {\n  if (!options.eventId) {\n    options.eventId = getCurrentHub().lastEventId();\n  }\n  const client = getCurrentHub().getClient<BrowserClient>();\n  if (client) {\n    client.showReportDialog(options);\n  }\n}\n\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId(): string | undefined {\n  return getCurrentHub().lastEventId();\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad(): void {\n  // Noop\n}\n\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback: () => void): void {\n  callback();\n}\n\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function flush(timeout?: number): PromiseLike<boolean> {\n  const client = getCurrentHub().getClient<BrowserClient>();\n  if (client) {\n    return client.flush(timeout);\n  }\n  return SyncPromise.reject(false);\n}\n\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function close(timeout?: number): PromiseLike<boolean> {\n  const client = getCurrentHub().getClient<BrowserClient>();\n  if (client) {\n    return client.close(timeout);\n  }\n  return SyncPromise.reject(false);\n}\n\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn: (...args: any) => any): any {\n  return internalWrap(fn)();\n}\n\n/**\n * Enable automatic Session Tracking for the initial page load.\n */\nfunction startSessionTracking(): void {\n  const window = getGlobalObject<Window>();\n  const document = window.document;\n\n  if (typeof document === 'undefined') {\n    logger.warn('Session tracking in non-browser environment with @sentry/browser is not supported.');\n    return;\n  }\n\n  const hub = getCurrentHub();\n\n  if ('startSession' in hub) {\n    // The only way for this to be false is for there to be a version mismatch between @sentry/browser (>= 6.0.0) and\n    // @sentry/hub (< 5.27.0). In the simple case, there won't ever be such a mismatch, because the two packages are\n    // pinned at the same version in package.json, but there are edge cases where it's possible'. See\n    // https://github.com/getsentry/sentry-javascript/issues/3234 and\n    // https://github.com/getsentry/sentry-javascript/issues/3207.\n\n    hub.startSession();\n    hub.captureSession();\n\n    // We want to create a session for every navigation as well\n    addInstrumentationHandler({\n      callback: () => {\n        hub.startSession();\n        hub.captureSession();\n      },\n      type: 'history',\n    });\n  }\n}\n","import { EventProcessor, Hub, Integration, Severity } from '@sentry/types';\nimport { fill, getGlobalObject, safeJoin } from '@sentry/utils';\n\nconst global = getGlobalObject<Window | NodeJS.Global>();\n\n/** Send Console API calls as Sentry Events */\nexport class CaptureConsole implements Integration {\n  /**\n   * @inheritDoc\n   */\n  public static id: string = 'CaptureConsole';\n\n  /**\n   * @inheritDoc\n   */\n  public name: string = CaptureConsole.id;\n\n  /**\n   * @inheritDoc\n   */\n  private readonly _levels: string[] = ['log', 'info', 'warn', 'error', 'debug', 'assert'];\n\n  /**\n   * @inheritDoc\n   */\n  public constructor(options: { levels?: string[] } = {}) {\n    if (options.levels) {\n      this._levels = options.levels;\n    }\n  }\n\n  /**\n   * @inheritDoc\n   */\n  public setupOnce(_: (callback: EventProcessor) => void, getCurrentHub: () => Hub): void {\n    if (!('console' in global)) {\n      return;\n    }\n\n    this._levels.forEach((level: string) => {\n      if (!(level in global.console)) {\n        return;\n      }\n\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      fill(global.console, level, (originalConsoleLevel: () => any) => (...args: any[]): void => {\n        const hub = getCurrentHub();\n\n        if (hub.getIntegration(CaptureConsole)) {\n          hub.withScope(scope => {\n            scope.setLevel(Severity.fromString(level));\n            scope.setExtra('arguments', args);\n            scope.addEventProcessor(event => {\n              event.logger = 'console';\n              return event;\n            });\n\n            let message = safeJoin(args, ' ');\n            if (level === 'assert') {\n              if (args[0] === false) {\n                message = `Assertion failed: ${safeJoin(args.slice(1), ' ') || 'console.assert'}`;\n                scope.setExtra('arguments', args.slice(1));\n                hub.captureMessage(message);\n              }\n            } else {\n              hub.captureMessage(message);\n            }\n          });\n        }\n\n        // this fails for some browsers. :(\n        if (originalConsoleLevel) {\n          Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n        }\n      });\n    });\n  }\n}\n","import * as Sentry from \"@sentry/browser\";\nimport * as SentryIntegrations from \"@sentry/integrations\";\n\nconst SentryEnvHostnameMap: { [key: string]: string } = {\n  \"excalidraw.com\": \"production\",\n  \"vercel.app\": \"staging\",\n};\n\nconst REACT_APP_DISABLE_SENTRY =\n  process.env.REACT_APP_DISABLE_SENTRY === \"true\";\n\n// Disable Sentry locally or inside the Docker to avoid noise/respect privacy\nconst onlineEnv =\n  !REACT_APP_DISABLE_SENTRY &&\n  Object.keys(SentryEnvHostnameMap).find(\n    (item) => window.location.hostname.indexOf(item) >= 0,\n  );\n\nSentry.init({\n  dsn: onlineEnv\n    ? \"https://7bfc596a5bf945eda6b660d3015a5460@sentry.io/5179260\"\n    : undefined,\n  environment: onlineEnv ? SentryEnvHostnameMap[onlineEnv] : undefined,\n  release: process.env.REACT_APP_GIT_SHA,\n  ignoreErrors: [\n    \"undefined is not an object (evaluating 'window.__pad.performLoop')\", // Only happens on Safari, but spams our servers. Doesn't break anything\n  ],\n  integrations: [\n    new SentryIntegrations.CaptureConsole({\n      levels: [\"error\"],\n    }),\n  ],\n  beforeSend(event) {\n    if (event.request?.url) {\n      event.request.url = event.request.url.replace(/#.*$/, \"\");\n    }\n    return event;\n  },\n});\n","import { getCurrentHub } from '@sentry/hub';\nimport { Client, Options } from '@sentry/types';\nimport { logger } from '@sentry/utils';\n\n/** A class object that can instantiate Client objects. */\nexport type ClientClass<F extends Client, O extends Options> = new (options: O) => F;\n\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instantiate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind<F extends Client, O extends Options>(clientClass: ClientClass<F, O>, options: O): void {\n  if (options.debug === true) {\n    logger.enable();\n  }\n  const hub = getCurrentHub();\n  const client = new clientClass(options);\n  hub.bindClient(client);\n}\n","import { StrictMode } from \"react\";\nimport { createRoot } from \"react-dom/client\";\nimport ExcalidrawApp from \"./excalidraw-app\";\n\nimport \"./excalidraw-app/pwa\";\nimport \"./excalidraw-app/sentry\";\nwindow.__EXCALIDRAW_SHA__ = process.env.REACT_APP_GIT_SHA;\nconst rootElement = document.getElementById(\"root\")!;\nconst root = createRoot(rootElement);\nroot.render(\n  <StrictMode>\n    <ExcalidrawApp />\n  </StrictMode>,\n);\n"],"names":["actionUnbindText","register","name","contextItemLabel","trackEvent","category","predicate","elements","appState","getSelectedElements","some","element","hasBoundTextElement","perform","getNonDeletedElements","forEach","boundTextElement","getBoundTextElement","measureText","originalText","getFontString","width","height","originalContainerHeight","getOriginalContainerHeightFromCache","id","resetOriginalContainerCache","mutateElement","containerId","text","boundElements","filter","ele","commitToHistory","actionBindText","selectedElements","length","bindingContainer","textElement","isTextElement","isTextBindableContainer","container","verticalAlign","VERTICAL_ALIGN","concat","type","redrawTextBoundingBox","pushTextAboveContainer","selectedElementIds","updatedElements","slice","textElementIndex","findIndex","splice","containerIndex","pushContainerBelowText","actionCreateContainerFromText","newElement","backgroundColor","currentItemBackgroundColor","angle","fillStyle","currentItemFillStyle","strokeColor","currentItemStrokeColor","roughness","currentItemRoughness","strokeWidth","currentItemStrokeWidth","strokeStyle","currentItemStrokeStyle","roundness","currentItemRoundness","isUsingAdaptiveRadius","ROUNDNESS","opacity","locked","x","BOUND_TEXT_PADDING","y","computeContainerDimensionForBoundText","groupIds","linearElementIds","map","el","includes","startBinding","endBinding","elementId","actionClearCanvas","props","app","UIOptions","canvasActions","changeViewBackgroundColor","viewModeEnabled","_","value","viewBackgroundColor","PanelComponent","updateData","style","position","label","t","color","onChange","isActive","openPopup","setActive","active","clearCanvas","imageCache","clear","newElementWith","isDeleted","getDefaultAppState","files","theme","penMode","penDetected","exportBackground","exportEmbedScene","gridSize","showStats","pasteDialog","activeTool","actionZoomIn","viewMode","_elements","getStateForZoom","viewportX","offsetLeft","viewportY","offsetTop","nextZoom","getNormalizedZoom","zoom","ZOOM_STEP","className","icon","ZoomInIcon","title","getShortcutKey","onClick","keyTest","event","code","CODES","KEYS","shiftKey","actionZoomOut","ZoomOutIcon","zoomValueToFitBoundsOnViewport","toFixed","bounds","viewportDimensions","x1","y1","x2","y2","commonBoundsWidth","zoomValueForWidth","commonBoundsHeight","zoomValueForHeight","smallestZoomValue","Math","min","zoomAdjustedToSteps","floor","max","MIN_ZOOM","zoomToFitElements","zoomToSelection","nonDeletedElements","commonBounds","getCommonBounds","newZoom","centerX","centerY","centerScrollOn","scenePoint","actionToggleTheme","altKey","THEME","toggleTheme","actionToggleHandTool","isEraserActive","updateActiveTool","lastActiveTool","lastActiveToolBeforeEraser","selectedGroupIds","key","isHandToolActive","setCursor","canvas","CURSOR_TYPE","actionCopy","copyToClipboard","appProps","device","isMobile","navigator","clipboard","undefined","actionPaste","appStates","data","pasteFromClipboard","actionCut","actionDeleteSelected","actionCopyAsSvg","_data","exportCanvas","console","error","errorMessage","message","probablySupportsClipboardWriteText","actionCopyAsPng","toast","exportSelection","exportColorScheme","exportWithDarkMode","probablySupportsClipboardBlob","copyText","reduce","acc","push","join","copyTextToSystemClipboard","handleGroupEditingState","editingGroupId","siblingElements","getElementsInGroup","action","editingLinearElement","selectedPointsIndices","startBindingElement","endBindingElement","LinearElementEditor","points","nextElements","nextAppState","binding","isBoundToContainer","deleteSelectedElements","fixBindingsAfterDeletion","multiElement","isSomeElementSelected","TrashIcon","visible","ProjectName","useExcalidrawContainer","useState","fileName","setFileName","htmlFor","isNameEditable","onBlur","focusNearestParent","target","onKeyDown","preventDefault","nativeEvent","isComposing","keyCode","currentTarget","blur","DarkModeToggle","ToolButton","ICONS","MOON","SUN","viewBox","fill","d","resaveAsImageWithScene","fileHandle","fileHandleType","getFileHandleType","isImageFileHandleType","Error","actionSaveToActiveFile","exportScale","allElements","exportedElements","EXPORT_SCALES","s","getExportSize","DEFAULT_EXPORT_PADDING","scaleButtonTitle","size","checked","CheckboxItem","Tooltip","long","questionCircle","saveToActiveFile","fileHandleExists","isImageFileHandle","saveAsJSON","replace","warn","actionSaveFileToDisk","saveAs","showAriaLabel","useDevice","hidden","nativeFileSystemSupported","actionLoadScene","loadScene","loadFromJSON","loadedElements","loadedAppState","display","justifyContent","marginTop","marginBottom","ButtonIconSelect","options","group","option","clsx","testId","Picker","onClose","rFirstItem","React","rActiveItem","rGallery","current","focus","role","pressedOption","find","keyBinding","toLowerCase","metaKey","ctrlKey","setTimeout","document","activeElement","isArrowKey","isRTL","getLanguage","rtl","index","Array","prototype","indexOf","call","children","nextIndex","stopImmediatePropagation","stopPropagation","ref","i","toUpperCase","onFocus","IconPicker","rPickerButton","fallback","Popover","onCloseRequest","right","left","changeProperty","callback","includeBoundText","arrayToMap","get","editingElement","getFormValue","getAttribute","defaultValue","getCommonAttributeOfSelectedElements","changeFontSize","getNewFontSize","fallbackValue","newFontSizes","Set","oldElement","newFontSize","add","fontSize","getContainerElement","prevElement","nextElement","textAlign","currentItemFontSize","actionDecreaseFontSize","hasStrokeColor","ColorPicker","FillHachureIcon","FillCrossHatchIcon","FillSolidIcon","StrokeWidthBaseIcon","StrokeWidthBoldIcon","StrokeWidthExtraBoldIcon","seed","randomInteger","SloppinessArchitectIcon","SloppinessArtistIcon","SloppinessCartoonistIcon","StrokeStyleDashedIcon","StrokeStyleDottedIcon","currentItemOpacity","step","FontSizeSmallIcon","FontSizeMediumIcon","FontSizeLargeIcon","FontSizeExtraLargeIcon","DEFAULT_FONT_SIZE","round","actionIncreaseFontSize","fontFamily","currentItemFontFamily","FONT_FAMILY","FreedrawIcon","FontFamilyNormalIcon","FontFamilyCodeIcon","DEFAULT_FONT_FAMILY","currentItemTextAlign","TextAlignLeftIcon","TextAlignCenterIcon","TextAlignRightIcon","hasLegacyRoundness","getTargetElements","EdgeSharpIcon","EdgeRoundIcon","canChangeRoundness","isLinearElement","startArrowhead","endArrowhead","ArrowheadNoneIcon","flip","canHaveArrowheads","currentItemStartArrowhead","currentItemEndArrowhead","actionToggleStats","this","getIndicesToMove","selectedIndices","deletedIndices","includeDeletedIndex","getTargetIndexAccountingForBinding","direction","containerElement","Scene","getElement","boundElementId","getTargetElementsMap","indices","shiftElements","indicesToMove","targetElementsMap","groupedIndices","array","cursor","toContiguousGroups","reverse","leadingIndex","trailingIndex","boundaryIndex","targetIndex","sourceElement","indexFilter","candidateIndex","findLastIndex","siblingGroupId","elementsInSiblingGroup","getTargetIndex","leadingElements","targetElements","displacedElements","trailingElements","bumpVersion","shiftElementsToEnd","groupElements","Object","values","moveOneLeft","moveOneRight","moveAllLeft","moveAllRight","actionSendBackward","keyPriority","SendBackwardIcon","actionBringForward","BringForwardIcon","actionSendToBack","isDarwin","SendToBackIcon","actionBringToFront","BringToFrontIcon","actionSelectAll","selectGroupsForSelectedElements","selectedLinearElement","keys","scene","normalizeGroupElementOrder","origElements","sortedElements","orderInnerGroups","firstGroupSig","aGroup","bGroup","groupHandledElements","Map","idx","has","topGroup","ret","set","elem","normalizeElementOrder","elementsMap","arrayToMapWithIndex","boundElement","child","parent","normalizeBoundElementsOrder","actionDuplicateSelection","duplicateElements","DuplicateIcon","groupIdMap","newElements","oldElements","oldIdToDuplicatedId","duplicateAndOffsetElement","duplicateElement","GRID_SIZE","processedIds","markAsProcessed","elementsWithClones","groupId","getSelectedGroupForElement","finalElementsReversed","finalElementIds","finalElements","bindTextToShapeAfterDuplication","fixBindingsAfterDuplication","actionFinalize","focusContainer","isBindingElement","bindOrUnbindLinearElement","isInvisiblySmallElement","cursorButton","pendingImageElement","pendingImageElementId","window","HTMLElement","multiPointElement","lastPointerDownWith","lastCommittedPoint","isLoop","isPathALoop","linePoints","firstPoint","point","maybeBindLinearElement","resetCursor","draggingElement","startBoundElement","suggestedBindings","done","copiedStyles","actionCopyStyles","elementsCopied","JSON","stringify","actionPasteStyles","parse","pastedElement","isExcalidrawElement","elementStylesToCopyFrom","canApplyRoundnessTypeToElement","getDefaultRoundnessTypeForElement","DEFAULT_TEXT_ALIGN","actionShortcuts","openMenu","HamburgerMenuIcon","selected","showSelectedShapeActions","palette","isFullScreen","allowFullScreen","exitFullScreen","openDialog","enableActionGroup","isElementInGroup","allElementsInSameGroup","actionGroup","getSelectedGroupIds","selectedGroupId","elementIdsInGroup","from","newGroupId","randomId","selectElementIds","addToGroup","elementsInGroup","lastElementInGroup","lastGroupElementIndex","lastIndexOf","elementsAfterGroup","elementsBeforeGroup","updatedElement","updatedElementsInOrder","selectGroup","actionUngroup","boundTextElementIds","nextGroupIds","removeFromSelectedGroups","updateAppState","Avatar","src","shortName","getClientInitials","setError","loadImg","background","alt","referrerPolicy","onError","clientId","collaborator","getClientColors","stroke","border","pointer","username","avatarUrl","actionAddToLibrary","library","getLatestLibrary","then","items","setLibrary","status","deepCopyElement","created","Date","now","catch","calculateTranslation","selectionBoundingBox","axis","groupBoundingBox","getCommonBoundingBox","noTranslation","alignSelectedElements","alignment","groups","getMaximumGroups","flatMap","translation","alignElements","updatedElementsMap","AlignTopIcon","AlignBottomIcon","AlignLeftIcon","AlignRightIcon","CenterVerticallyIcon","CenterHorizontallyIcon","distributeSelectedElements","distribution","start","mid","end","extent","sort","a","b","span","index0","g","index1","pos","box","distributeElements","space","DistributeHorizontallyIcon","DistributeVerticallyIcon","actionFlipHorizontal","flipSelectedElements","eligibleElements","enableActionFlipHorizontal","actionFlipVertical","enableActionFlipVertical","flipDirection","flipElements","flipElement","rotateElement","PI","originalX","originalY","originalAngle","normalizeAngle","transformHandles","getTransformHandles","usingNWHandle","nHandle","nw","ne","initialPointsCoords","finalOffsetX","getElementPointsCoords","initialElementAbsoluteCoords","getElementAbsoluteCoords","elWidth","startPoint","resizeSingleElement","updateBoundElements","finalPointsCoords","coordsDiff","rotationAngle","actionToggleGridMode","gridModeEnabled","actionToggleZenMode","zenModeEnabled","actionToggleLock","operation","getOperation","selectedElementsMap","lock","toLocaleLowerCase","actionToggleLinearEditor","selectedElement","actions","shortcutMap","saveScene","imageExport","cut","copy","paste","copyStyles","pasteStyles","selectAll","duplicateSelection","sendBackward","bringForward","sendToBack","bringToFront","copyAsPng","copyAsSvg","ungroup","gridMode","zenMode","stats","addToLibrary","flipHorizontal","flipVertical","hyperlink","toggleLock","getShortcutFromShortcutName","shortcuts","process","REACT_APP_GOOGLE_ANALYTICS_ID","gtag","event_category","event_label","JEST_WORKER_ID","defaultExportScale","devicePixelRatio","showWelcomeScreen","collaborators","currentChartType","oc","customType","isBindingEnabled","isSidebarDocked","isLoading","isResizing","isRotating","getDateTime","contextMenu","openSidebar","shown","previousSelectedElementIds","resizingElement","scrolledOutside","scrollX","scrollY","selectionElement","shouldCacheIgnoreZoom","showHyperlinkPopup","APP_STATE_STORAGE_CONF","browser","export","server","_clearAppStateForStorage","exportType","stateForExport","propConfig","nextValue","clearAppStateForLocalStorage","cleanAppStateForExport","clearAppStateForDatabase","BAR_WIDTH","BAR_GAP","BAR_HEIGHT","NOT_SPREADSHEET","VALID_SPREADSHEET","tryParseNumber","match","exec","parseFloat","isNumericColumn","lines","columnIndex","every","line","tryParseCells","cells","numCols","reason","hasHeader","spreadsheet","labels","labelColumnNumeric","valueColumnNumeric","labelColumnIndex","valueColumnIndex","rows","row","tryParseSpreadsheet","trim","split","numColsFirstLine","result","transposedResults","nextCells","col","nextCellRow","transposeCells","bgColors","colors","commonProps","getChartDimentions","chartWidth","chartHeight","chartBaseElements","debug","newTextElement","debugRect","chartXLabels","minYLabel","toLocaleString","chartYLabels","newLinearElement","chartLines","renderSpreadsheet","chartType","random","cx","cy","maxX","maxY","minX","minY","dots","ENV","chartTypeLine","bars","barHeight","chartTypeBar","currentUser","sum","str","charCodeAt","backgrounds","strokes","userName","CLIPBOARD","PREFER_APP_CLIPBOARD","probablySupportsClipboardReadText","HTMLCanvasElement","clipboardContainsElements","contents","EXPORT_DATA_TYPES","isArray","isInitializedImageElement","fileId","json","getAppClipboard","parsePotentialSpreadsheet","getSystemClipboard","clipboardData","getData","readText","parseClipboard","isPlainPaste","systemClipboard","SVG_EXPORT_TAG","spreadsheetResult","appClipboardData","systemClipboardData","copyBlobToClipboardAsPng","blob","write","ClipboardItem","MIME_TYPES","isPromiseLike","copied","writeText","copyTextViaExecCommand","documentElement","textarea","createElement","padding","margin","yPosition","pageYOffset","scrollTop","top","setAttribute","body","appendChild","success","select","setSelectionRange","execCommand","remove","shades","canvasBackground","elementBackground","elementStroke","activeConfirmDialogAtom","atom","ActiveConfirmDialog","useAtom","jotaiScope","activeConfirmDialog","setActiveConfirmDialog","actionManager","useExcalidrawActionManager","onConfirm","executeAction","onCancel","writeData","prevElements","updater","prevElementMap","nextElementMap","deletedElements","syncHistory","trackAction","source","ActionManager","getAppState","getElementsIncludingDeleted","renderAction","displayName","formState","isActionEnabled","actionResult","registerAction","getCenter","pointers","allCoords","coords","getDistance","hypot","mapper","item","clearAppStatePropertiesForHistory","elementCache","recording","stateHistory","redoStack","lastEntry","generateEntry","dehydrateHistoryEntry","dehydratedExcalidrawElement","versionNonce","versions","dehydratedHistoryEntry","hydrateHistoryEntry","nextEntry","prev","next","newEntryDehydrated","newEntry","shouldCreateEntry","clearRedoStack","entryToRestore","pop","currentEntry","state","pushEntry","SHAPES","SelectionIcon","numericKey","fillable","RectangleIcon","DiamondIcon","EllipseIcon","ArrowIcon","LineIcon","TextIcon","ImageIcon","EraserIcon","CONTEXT_MENU_SEPARATOR","ContextMenu","useExcalidrawAppState","setAppState","useExcalidrawSetAppState","useExcalidrawElements","filteredItems","fitInViewport","viewportWidth","viewportHeight","onContextMenu","actionName","dangerous","checkmark","SelectedShapeActions","isSingleElementBoundContainer","isEditing","Boolean","showFillIcons","hasBackground","isTransparent","showChangeBackgroundIcons","showLinkIcon","commonSelectedType","hasStrokeWidth","hasStrokeStyle","hasText","shouldAllowVerticalAlign","flexBasis","flexWrap","gap","ShapesSwitcher","onImageAction","letter","capitalizeString","shortcut","keyBindingLabel","onPointerDown","pointerType","nextActiveTool","setCursorForShape","ZoomActions","Stack","align","UndoRedoActions","ExitZenModeAction","showExitZenModeBtn","FinalizeAction","supportsContextFilters","getContext","ErrorCanvasPreview","ExportButton","shade","OpenColor","ImageExportModal","exportPadding","onExportToPng","onExportToSvg","onExportToClipboard","someElementIsSelected","exportSelected","setExportSelected","previewRef","useRef","renderError","setRenderError","useEffect","previewNode","exportToCanvas","canvasToBlob","replaceChildren","gridTemplateColumns","overflow","alignItems","marginLeft","userSelect","isFirefox","ImageExportDialog","handleClose","Dialog","FixedSideContainer","side","HintViewer","hint","multiMode","canDeviceFitSidebar","targetElement","isImageElement","getHints","CHECKED","LockedIcon","UNCHECKED","UnlockedIcon","LockButton","Section","heading","header","LibraryButton","showLabel","querySelector","classList","isOpen","LibraryIcon","PenModeButton","PenModeIcon","Stats","boundingBox","selectedBoundingBox","Island","CloseIcon","colSpan","renderCustomStats","HandButton","handIcon","MobileMenu","onLockToggle","onHandToolToggle","onPenModeToggle","renderTopRightUI","renderSidebars","renderWelcomeScreen","useTunnels","welcomeScreenCenterTunnel","mainMenuTunnel","Out","insertOnCanvasDirectly","SCROLLBAR_WIDTH","SCROLLBAR_MARGIN","marginRight","calculateScrollCenter","ChartPreviewBtn","chartElements","setChartElements","useLayoutEffect","svg","exportToSvg","parentNode","PasteChartDialog","onInsertChart","handleChartClick","small","autofocus","intersperse","Header","href","rel","ExternalLinkIcon","ShortcutIsland","caption","as","delim","first","Shortcut","isOr","splitShortcutKeys","endsWith","ShortcutKey","c","HelpDialog","isWindows","JSONExportModal","exportOpts","onExportToBackend","saveFileToDisk","Card","exportToFileIcon","LinkIcon","getFrame","renderCustomUI","JSONExportDialog","LibraryUnit","isPending","onToggle","onDrag","node","innerHTML","outerHTML","isHovered","setIsHovered","adder","PlusIcon","onMouseEnter","onMouseLeave","draggable","onDragStart","referrer","libraryReturnUrl","location","origin","pathname","VERSIONS","libraryItems","onAddToLibrary","onInsertLibraryItems","pendingElements","selectedItems","onSelectItems","lastSelectedItem","setLastSelectedItem","onItemSelectToggle","shouldSelect","orderedItems","unpublishedItems","publishedItems","rangeStart","rangeEnd","selectedItemsMap","nextSelectedIds","_id","getInsertedElements","createLibraryItemCompo","params","dataTransfer","setData","serializeLibraryAsJSON","renderLibrarySection","_items","chunk","rowItems","showBtn","flex","transform","Spinner","flexDirection","LibraryMenuWrapper","forwardRef","LibraryMenuContent","libraryItemsAtom","libraryItemsData","useCallback","nextItems","isInitialized","LibraryMenu","onInsertElements","setSelectedItems","closeLibrary","cb","listener","Element","contains","addEventListener","removeEventListener","useOnClickOutside","closest","handleKeyDown","EVENT","deselectItems","removeFromLibrary","resetLibrary","Sidebar","__isInternal","initialDockedState","onDock","docked","onRemoveFromLibrary","distributeLibraryItemsOnSquareGrid","HelpButton","HelpIcon","Footer","footerCenterTunnel","welcomeScreenHelpHintTunnel","showFinalize","isTouchScreen","DefaultMainMenu","MainMenu","__fallback","saveAsImage","LayerUI","renderCustomSidebar","tunnels","useInitializeTunnels","renderJSONExportDialog","renderImageExportDialog","createExporter","muteFSAbortError","hostSidebarCountersAtom","hostSidebarCounters","layerUIJSX","LoadingMessage","delay","ErrorDialog","LIBRARY_SIDEBAR_WIDTH","shouldRenderSelectedShapeActions","welcomeScreenMenuHintTunnel","CLASSES","maxHeight","welcomeScreenToolbarHintTunnel","UserList","renderFixedSideContainer","scope","stripIrrelevantAppStateProps","areEqual","prevProps","nextProps","prevAppState","isShallowEqual","Toast","closable","duration","timerRef","shouldAutoClose","Infinity","scheduleTimeout","clearTimeout","actionToggleViewMode","Fonts","onSceneUpdated","onFontsLoaded","fontFaces","fontFace","sig","family","weight","loadedFontFaces","didUpdate","mapElements","invalidateShapeForElement","refreshTextDimensions","loadFontsForElements","Promise","all","fontString","fonts","check","load","flat","deviceContextInitialValue","isSmScreen","DeviceContext","ExcalidrawContainerContext","ExcalidrawElementsContext","ExcalidrawAppStateContext","ExcalidrawSetAppStateContext","ExcalidrawActionManagerContext","useContext","didTapTwice","tappedTwiceTimer","cursorX","cursorY","isHoldingSpace","isPanning","isDraggingScrollBar","currentScrollBars","horizontal","vertical","touchTimeout","invalidateContextMenu","THROTTLE_NEXT_RENDER","IS_PLAIN_PASTE","IS_PLAIN_PASTE_TIMER","PLAIN_PASTE_TOAST_SHOWN","lastPointerUp","gesture","lastCenter","initialDistance","initialScale","App","rc","unmounted","detachIsMobileMqHandler","excalidrawContainerRef","resizeObserver","nearestScrollableContainer","libraryItemsFromStorage","history","excalidrawContainerValue","hitLinkElement","lastPointerDown","lastScenePointer","autoFocus","getSceneElementsIncludingDeleted","getSceneElements","syncActionResult","withBatchedUpdates","isNonDeletedElement","replaceAllElements","resumeRecording","replaceFiles","addNewImagesToImageCache","setState","assign","setCurrentState","onUnload","disableEvent","resetHistory","resetScene","opts","resetLoadingState","initializeScene","launchQueue","setConsumer","launchParams","getFile","loadFileToCanvas","File","initialData","updateLibrary","merge","restore","repairBindings","scrollToContent","refreshDeviceState","getBoundingClientRect","sidebarBreakpoint","dockedSidebarBreakpoint","MQ_RIGHT_SIDEBAR_MIN_WIDTH","updateObject","MQ_SM_MAX_WIDTH","MQ_MAX_WIDTH_PORTRAIT","MQ_MAX_HEIGHT_LANDSCAPE","MQ_MAX_WIDTH_LANDSCAPE","onResize","renderScene","pointerViewportCoords","remoteSelectedElementIds","pointerUsernames","pointerUserStates","user","socketId","userState","sceneCoordsToViewportCoords","sceneX","sceneY","button","renderingElements","selectionColor","getComputedStyle","getPropertyValue","scale","renderConfig","remotePointerViewportCoords","remotePointerButton","remotePointerUsernames","remotePointerUserStates","isExporting","renderScrollbars","atLeastOneVisibleElement","scrollBars","scheduleImageRefresh","EXCALIDRAW_THROTTLE_RENDER","onScroll","debounce","getCanvasOffsets","SCROLL_TIMEOUT","onCut","isWritableElement","cutAll","onCopy","copyAll","onTapStart","isAndroid","resetTapTwice","TAP_TWICE_TIMEOUT","touches","touch","handleCanvasDoubleClick","clientX","clientY","onTapEnd","resetContextMenuTimer","isExcalidrawActive","elementUnderCursor","elementFromPoint","file","string","startsWith","SVGStringToFile","isSupportedImageFile","viewportCoordsToSceneCoords","imageElement","createImageElement","insertImageElement","initializeImageDimensions","onPaste","addElementsFromPasteOrLibrary","addTextFromPaste","setActiveTool","restoreElements","elementsCenterX","distance","elementsCenterY","dx","dy","getGridPoint","gridX","gridY","removePointer","delete","pointerId","prevState","togglePenMode","setToast","restoreFileFromShare","caches","open","webShareTargetCache","response","replaceState","APP_NAME","addFiles","filesMap","fileData","fromEntries","informMutation","updateScene","sceneData","toggleMenu","force","renderSidebar","updateCurrentCursorPosition","test","Proxy","ev","prop","bind","isInputLike","offset","ELEMENT_TRANSLATE_AMOUNT","ELEMENT_SHIFT_TRANSLATE_AMOUNT","offsetX","offsetY","simultaneouslyUpdated","maybeSuggestBindingForAll","isValidTextContainer","midPoint","getContainerCenter","startTextEditing","shape","toString","findShapeByKey","jotaiStore","onWheel","onKeyUp","bindOrUnbindSelectedElements","unbindLinearElements","tool","isToolIcon","isLinearElementType","isTouchScreenMultiTouchGesture","onGestureStart","onGestureChange","onGestureEnd","insertAtParentCenter","shouldBindToContainer","parentCenterPosition","getTextWysiwygSnappedToCenterPosition","existingTextElement","getTextElementAtPosition","isArrowElement","minWidth","getApproxMinLineWidth","minHeight","getApproxMinLineHeight","containerDims","getContainerDims","newHeight","newWidth","elementCenterX","elementCenterY","DEFAULT_VERTICAL_ALIGN","getElementIndex","insertElementAtIndex","handleTextWysiwyg","isExistingElement","hitElement","getElementAtPosition","getSelectedGroupIdForElement","getTextBindableContainerAtPosition","isHittingElementNotConsideringBoundingBox","getElementLinkAtPosition","scenePointer","hitElementIndex","link","isPointHittingLinkIcon","redirectToLink","draggedDistance","distance2d","DRAGGING_THRESHOLD","lastPointerDownCoords","lastPointerDownHittingLinkIcon","lastPointerUpCoords","lastPointerUpHittingLinkIcon","customEvent","url","onLinkOpen","wrapEvent","defaultPrevented","isLocalLink","newWindow","opener","normalizeLink","handleCanvasPointerMove","savePointer","center","deltaX","deltaY","scaleFactor","zoomState","resetShouldCacheIgnoreZoomDebounced","isOverScrollBar","isOverScrollBars","isOverEither","scenePointerX","scenePointerY","isDragging","flushSync","lastUncommittedPoint","maybeSuggestBindingAtCursor","isBindingElementType","maybeSuggestBindingsForLinearElementAtCoords","rx","ry","lastPoint","LINE_CONFIRM_THRESHOLD","lastCommittedX","lastCommittedY","dxFromLastCommitted","dyFromLastCommitted","shouldRotateWithDiscreteAngle","getLockedLinearCursorAlignSize","buttons","transformHandleType","getTransformHandleTypeFromCoords","getCursorForResizingElement","elementWithTransformHandleType","getElementWithTransformHandleType","showHyperlinkTooltip","hideHyperlinkToolip","handleHoverSelectedLinearElement","isHittingCommonBoundingBoxOfSelectedElements","handleEraser","pointerDownState","updateElementIds","idsToUpdate","elementIdsToErase","erase","lastCoords","threshold","samplingInterval","getElementsAtPosition","distanceRatio","nextX","nextY","ELEMENT_READY_TO_ERASE_OPACITY","handleTouchMove","handleCanvasPointerDown","selection","getSelection","anchorNode","removeAllRanges","maybeOpenContextMenuAfterPointerDownOnTouchDevices","maybeCleanupAfterMissingPointerUp","updateGestureOnPointerDown","handleCanvasPanUsingWheelOrSpaceDrag","POINTER_BUTTON","initialPointerDownState","handleDraggingScrollBar","clearSelectionIfNotUsingSelection","updateBindingEnabledOnPointerMove","handleSelectionOnPointerDown","handleLinearElementOnPointerDown","handleFreeDrawElementOnPointerDown","createGenericElementOnPointerDown","onPointerMove","onPointerMoveFromPointerDownHandler","onPointerUp","onPointerUpFromPointerDownHandler","onKeyDownFromPointerDownHandler","onKeyUpFromPointerDownHandler","eventListeners","onMove","onUp","handleTextOnPointerDown","handleCanvasPointerUp","handleCanvasContextMenu","TOUCH_CTX_MENU_TIMEOUT","nextPastePrevented","isLinux","platform","lastX","lastY","withBatchedUpdatesThrottled","abs","preventNextPaste","enableNextPaste","teardown","flush","passive","resize","handleType","tupleToCoors","getResizeOffsetXY","arrowDirection","getResizeArrowDirection","linearElementEditor","hit","didAddPoint","allHitElements","someHitElementIsSelected","isASelectedElement","hasHitCommonBoundingBoxOfSelectedElements","clearSelection","wasAddedToSelection","editGroupForSelectedElement","includeBoundTextElement","elementType","newFreeDrawElement","simulatePressure","pressure","pressures","getHoveredElementForBinding","newImageElement","restoreReadyToEraseElements","eraseElements","initializeImage","imageFile","_imageElement","showCursorImagePreview","mimeType","normalizeSVG","generateIdForFile","generateIdFromFile","existingFileData","dataURL","resizeImageFile","maxWidthOrHeight","DEFAULT_MAX_IMAGE_WIDTH_OR_HEIGHT","MAX_ALLOWED_FILE_BYTES","maxSize","trunc","resizedFile","dataURLToFile","setImagePreviewCursor","getDataURL","resolve","reject","lastRetrieved","cachedImageData","updateImageCache","image","cursorImageSizePx","imagePreview","previewDataURL","loadHTMLImageElement","img","drawImage","toDataURL","fileOpen","description","extensions","forceNaturalSize","placeholderSize","naturalHeight","naturalWidth","_updateImageCache","fileIds","updatedFiles","erroredFiles","imageElements","getInitializedImageElements","uncachedImageElements","throttle","IMAGE_RENDER_TIMEOUT","shouldEnableBinding","shouldEnableBindingForPointerEvent","pointerCoords","hoveredBindableElement","linearElement","oppositeBindingBoundElement","isLinearElementSimpleAndAlreadyBound","handleCanvasRef","rough","handleWheel","handleAppOnDrop","getFileFromEvent","loadFromBlob","libraryJSON","parseLibraryJSON","normalizeFile","loadSceneOrLibraryFromBlob","openLibraryMenu","preferSelected","includeLockedElements","isHittignCommonBoundBox","getContextMenuItems","maybeDragNewGenericElement","dragNewElement","shouldMaintainAspectRatio","shouldResizeFromCenter","aspectRatio","originInGrid","maybeHandleResize","resizeX","resizeY","transformElements","actionLink","sign","MAX_STEP","absDelta","delta","log10","isNaN","onPointerUpdate","pointersMap","updateDOMRect","currentWidth","currentHeight","currentOffsetTop","currentOffsetLeft","refresh","defaultAppState","excalidrawRef","innerWidth","innerHeight","nanoid","Library","readyPromise","resolvablePromise","api","ready","getFiles","History","registerAll","undoOnce","UndoIcon","redoOnce","RedoIcon","createRedoAction","canvasScale","canvasDOMWidth","canvasDOMHeight","canvasWidth","canvasHeight","onPointerCancel","onTouchMove","onDoubleClick","onDrop","tabIndex","handleKeyboardGlobally","Provider","langCode","Hyperlink","renderCanvas","defineProperties","h","configurable","addCallback","addEventListeners","ResizeObserver","observe","matchMedia","mdScreenQuery","smScreenQuery","canDeviceFitSidebarMediaQuery","handler","matches","addListener","removeListener","URLSearchParams","search","disconnect","removeEventListeners","destroy","fontfaces","detectScroll","getNearestScrollableContainer","onScrollChange","setEraserCursor","updateLanguage","deselectElements","toggle","record","textElementProps","LINE_GAP","currentY","textElements","defaultLineHeight","getApproxLineHeight","updateElement","_element","updateTextElement","textWysiwyg","getViewportCoords","onSubmit","viaKeyboard","elementIdToSelect","excalidrawContainer","elementWithHighestZIndex","isHittingElementBoundingBoxWithoutHittingElement","hitTest","hoverPointIndex","segmentMidPointHoveredCoords","shouldShowBoundingBox","withCmdOrCtrl","scrollbars","originalElements","hasBeenDuplicated","drag","hasOccurred","boxSelection","handlePointerMoveOverScrollbars","getDragOffsetXY","segmentMidpoint","added","didDrag","pointsSceneCoords","hasHitASelectedElement","isSelectingPointsInLineEditor","dragX","dragY","dragDistanceX","dragDistanceY","lockDirection","dragSelectedElements","elementsToAppend","duplicatedElement","originDragX","originDragY","nextSceneElements","elementsWithinSelection","getElementsWithinSelection","isOverHorizontal","isOverVertical","childEvent","getNormalizedDimensions","isSelectedViaGroup","idsOfSelectedElementsThatAreInGroups","prevId","_prevState","gId","newSelectedElementIds","newSelectedElements","getEligibleElementsForBinding","elementCenter","TEXT_TO_CENTER_SNAP_THRESHOLD","currentLang","languages","lang","defaultLang","setLanguage","defaultProps","DEFAULT_UI_OPTIONS","checkIcon","isCustomColor","isValidColor","Option","keyBindings","showInput","firstItem","activeItem","gallery","colorInput","customColors","ele1","ele2","updated","colorType","getCustomColors","renderColors","custom","_color","_colorWithoutHash","handled","isCustom","parentElement","actualIndex","ColorInput","innerValue","setInnerValue","inputRef","changeColor","inputValue","getColor","spellCheck","pickerButton","zIndex","changedColor","confirmText","cancelText","rest","setIsLibraryMenuOpen","useSetAtom","isLibraryMenuOpenAtom","DialogActionButton","actionType","Modal","closeOnClickOutside","modalRoot","useBodyRoot","createPortal","labelledBy","maxWidth","div","setDiv","isMobileRef","isDarkTheme","removeChild","useCallbackRefState","islandNode","setIslandNode","lastActiveElement","focusableElements","queryFocusableElements","currentIndex","back","cs","visibility","inset","modalIsShown","setModalIsShown","whiteSpace","libItem","onRemove","svgRef","fontWeight","placeholder","LOCAL_STORAGE_KEY_PUBLISH_LIBRARY","generatePreviewImage","MAX_ITEMS_PER_ROW","BOX_SIZE","BOX_PADDING","BORDER_WIDTH","ctx","fillRect","entries","itemCanvas","rowOffset","colOffset","lineWidth","strokeRect","outputType","onSuccess","updateItemsInStorage","authorName","githubHandle","twitterHandle","website","libraryData","setLibraryData","isSubmitting","setIsSubmitting","localStorage","getItem","importPublishLibDataFromStorage","clonedLibItems","setClonedLibItems","onInputChange","erroredLibItems","isError","previewImage","libContent","version","EXPORT_SOURCE","content","lib","Blob","formData","FormData","append","fetch","method","ok","removeItem","statusText","err","onDialogClose","setItem","savePublishLibDataToStorage","shouldRenderForm","containsPublishedItems","val","renderLibraryItems","required","pattern","getSelectedItems","LibraryMenuHeader","isLibraryMenuOpen","renderRemoveLibAlert","count","ConfirmDialog","setShowRemoveLibAlert","showRemoveLibAlert","itemsSelected","resetLabel","showPublishLibraryDialog","setShowPublishLibraryDialog","publishLibSuccess","setPublishLibSuccess","renderPublishSuccess","onPublishLibSuccess","nextLibItems","onLibraryImport","onLibraryExport","saveLibraryAsJSON","DropdownMenu","DotsIcon","onClickOutside","onSelect","LoadIcon","ExportIcon","publishIcon","alert","isWaiting","setIsWaiting","timer","popoverRef","overflowY","overflowX","unstable_batchedUpdates","SidebarPropsContext","SidebarDockButton","PinIcon","Component","DefaultComponentContext","createContext","ComponentContext","isRenderedUpstream","setIsRenderedUpstream","contextValue","useMemo","DefaultComponent","__isFallback","withUpstreamOverride","renderDockButton","dockable","renderCloseButton","SidebarHeaderComponents","Context","rendered","setHostSidebarCounters","isDockedFallback","setIsDockedFallback","onCloseRef","headerPropsRef","isDocked","circleWidth","r","strokeMiterlimit","Row","Col","justifyItems","excalId","innerRef","sizeCn","setIsLoading","isMountedRef","AbortError","lastPointerTypeRef","ToolIcon","disabled","requestAnimationFrame","getTooltipDiv","existingDiv","updateTooltipPosition","tooltip","tooltipRect","onPointerEnter","textContent","itemRect","updateTooltip","onPointerLeave","mobile","uniqueCollaborators","avatars","client","avatarJSX","UserList_mobile","createStoreImpl","createState","listeners","partial","nextState","is","previousState","getState","subscribe","createStore","useSyncExternalStoreWithSelector","useSyncExternalStoreExports","createImpl","useBoundStore","selector","equalityFn","getServerState","useDebugValue","useStore","create","tunnel","In","TunnelsContext","Symbol","MenuTrigger","classNames","MenuSeparator","MenuGroup","MenuContent","menuRef","querySelectorAll","useOutsideClickHook","MenuTriggerComp","getMenuTriggerComponent","MenuContentComp","getMenuContentComponent","Trigger","DropdownMenuTrigger","Content","DropdownMenuContent","Item","DropdownMenuItem","ItemLink","DropdownMenuItemLink","ItemCustom","DropdownMenuItemCustom","Group","DropdownMenuGroup","Separator","handleClick","useHandleDropdownMenuItemClick","getDropdownMenuItemClassName","DropdownMenuContentPropsContext","origOnClick","DropdownMenuContentProps","composeEventHandlers","itemSelectEvent","CustomEvent","bubbles","cancelable","handlerColor","createIcon","mirror","focusable","tablerIconProps","strokeLinecap","strokeLinejoin","modifiedTablerIconProps","PlusPromoIcon","maskType","maskUnits","mask","WelcomeScreenMenuArrow","fillRule","clipRule","WelcomeScreenHelpArrow","WelcomeScreenTopToolbarArrow","ExcalLogo","MoonIcon","SunIcon","GithubIcon","DiscordIcon","TwitterIcon","save","ExportImageIcon","share","shareIOS","shareWindows","clipPath","usersIcon","stop","shield","GroupIcon","UngroupIcon","ArrowheadArrowIcon","ArrowheadDotIcon","ArrowheadBarIcon","ArrowheadTriangleIcon","TextAlignTopIcon","TextAlignBottomIcon","TextAlignMiddleIcon","LoadScene","useI18n","SaveToActiveFile","SaveAsImage","Help","ClearCanvas","ToggleTheme","ChangeCanvasBackground","Export","Socials","LiveCollaborationTrigger","isCollaborating","componentName","counterAtom","preferHost","WrapperComponent","counter","setCounter","withInternalFallback","DefaultItems","userAgent","isSafari","SHIFT_LOCKING_ANGLE","TEXT","CROSSHAIR","GRABBING","GRAB","POINTER","MOVE","AUTO","MAIN","WHEEL","SECONDARY","TOUCH","TEST","DEVELOPMENT","SHAPE_ACTIONS_MENU","Virgil","Helvetica","Cascadia","LIGHT","DARK","WINDOWS_EMOJI_FALLBACK_FONT","DEFAULT_VERSION","excalidraw","excalidrawlib","png","jpg","gif","webp","bmp","ico","binary","excalidrawClipboard","excalidrawLibrary","EXCALIDRAW_EXPORT_SOURCE","TITLE_TIMEOUT","VERSION_TIMEOUT","HYPERLINK_TOOLTIP_DELAY","IDLE_THRESHOLD","ACTIVE_THRESHOLD","THEME_FILTER","cssVariables","URL_QUERY_KEYS","addLibrary","URL_HASH_KEYS","parseInt","MAX_DECIMALS_FOR_SVG_EXPORT","ALLOWED_IMAGE_MIME_TYPES","SVG_NS","ENCRYPTION_KEY_BITS","TOP","MIDDLE","BOTTOM","TEXT_ALIGN","LEFT","CENTER","RIGHT","DEFAULT_PROPORTIONAL_RADIUS","DEFAULT_ADAPTIVE_RADIUS","LEGACY","PROPORTIONAL_RADIUS","ADAPTIVE_RADIUS","PRECEDING_ELEMENT_KEY","parseFileContents","decodePngMetadata","DOMException","reader","FileReader","readAsText","onloadend","readyState","DONE","decodeSvgMetadata","handle","localAppState","localElements","isValidExcalidrawData","clearElementsForExport","isValidLibrary","defaultStatus","restoreLibraryItems","loadLibraryFromBlob","toBlob","CanvasError","crypto","subtle","blobToArrayBuffer","digest","hashBuffer","bytesToHexString","Uint8Array","onload","onerror","readAsDataURL","filename","dataIndexStart","byteString","atob","ab","ArrayBuffer","ia","res","default","pica","imageBlobReduce","features","_create_blob","env","out_canvas","out_blob","SVGString","TextEncoder","encode","getFileHandle","getAsFileSystemHandle","getActualMimeTypeFromImage","buffer","first8Bytes","headerBytes","createFile","arrayBuffer","readAsArrayBuffer","toByteString","readAsBinaryString","byteStringToArrayBuffer","bufferView","len","byteStringToString","TextDecoder","decode","stringToBase64","btoa","base64ToString","base64","isByteString","compress","deflate","deflated","encoding","compressed","encoded","decoded","inflate","to","DATA_VIEW_BITS_MAP","dataView","bytes","pow","DataView","concatBuffers","buffers","byteLength","splitBuffers","concatenatedBuffer","chunkSize","_encryptAndCompress","encryptionKey","encryptData","encryptedBuffer","iv","compressData","dataBuffer","fileInfo","compression","encryption","encodingMetadataBuffer","contentsMetadataBuffer","metadata","_decryptAndDecompress","decryptedBuffer","decryptionKey","isCompressed","decryptData","decompressData","encodingMetadata","contentsBuffer","IV_LENGTH_BYTES","createIV","arr","getRandomValues","generateEncryptionKey","returnAs","generateKey","exportKey","k","getCryptoKey","usage","importKey","alg","ext","key_ops","kty","importedKey","encrypt","encrypted","privateKey","decrypt","e","self","o","mimeTypes","_fileOpen","multiple","legacySetup","input","scheduleRejection","focusHandler","checkForFile","interval","setInterval","rejectPromise","clearInterval","cancel","fileSave","_fileSave","extension","getTEXtChunk","decodePng","chunks","metadataChunk","tEXt","encodePngMetadata","encodePng","keyword","encodedData","encodeSvgMetadata","versionMatch","tempSvg","tempCanvas","serializeAsJSON","filterOutDeletedFiles","nextFiles","clearElementsForDatabase","serialized","cloneLibraryItems","isUniqueItem","existingLibraryItems","targetLibraryItem","libraryItem","libItemExcalidrawItem","mergeLibraryItems","localItems","otherItems","newItems","lastLibraryItems","updateQueue","getLastUpdateTask","notifyListeners","onLibraryChange","prompt","confirm","numShapes","finally","task","_task","ITEMS_PER_ROW","ceil","sqrt","resElements","colOffsetX","rowOffsetY","maxHeightCurrRow","maxWidthCurrCol","getMaxHeightPerRow","targetCol","currCol","getMaxWidthPerCol","offsetCenterX","offsetCenterY","parseLibraryTokensFromUrl","libraryUrl","hash","idToken","useHandleLibrary","excalidrawAPI","getInitialLibraryItems","getInitialLibraryRef","importLibraryFromURL","libraryPromise","decodeURIComponent","request","shouldPrompt","once","query","onHashChange","libraryUrlTokens","oldURL","AllowedExcalidrawActiveTools","rectangle","diamond","ellipse","arrow","freedraw","eraser","hand","getFontFamilyByName","fontFamilyName","restoreElementWithProperties","extra","base","strokeSharpness","boundElementIds","getUpdatedTimestamp","customData","repairContainerElement","boundIds","repairBoundElement","localElementsMap","restoredElements","migratedElement","refreshDimensions","font","fontPx","_fontFamily","restoreElement","localElement","restoredElementsMap","coalesceAppStateValue","LegacyAppStateMigrations","isLibraryOpen","isLibraryMenuDocked","restoreAppState","legacyKey","nextKey","suppliedValue","localValue","elementsConfig","restoreLibraryItem","restoredItems","restoredItem","_item","EXTERNAL_LINK_IMG","encodeURIComponent","IS_HYPERLINK_TOOLTIP_VISIBLE","linkVal","inputVal","setInputVal","handleSubmit","timeoutId","handlePointerMove","shouldHideLinkPopup","handleRemove","getCoordsForPopover","CONTAINER_WIDTH","getContextMenuLabel","getLinkHandleFromCoords","DEFAULT_LINK_SIZE","linkWidth","linkHeight","linkMarginY","centeringOffset","dashedLineMargin","rotate","isPointHittingElementBoundingBox","linkX","linkY","HYPERLINK_TOOLTIP_TIMEOUT_ID","renderTooltip","tooltipDiv","linkViewportCoords","popoverX","popoverY","CONTAINER_PADDING","ids","getNonDeletedElement","boundToElementIds","unboundFromElementIds","bindOrUnbindLinearElementEdge","onlyUnbound","bindableElement","otherEdgeBindableElement","startOrEnd","isLinearElementSimpleAndAlreadyBoundOnOppositeEdge","bindLinearElement","unbound","unbindLinearElement","getElligibleElementForBindingElement","isBindableElement","maybeBindBindableElement","getElligibleElementsForBindableElementAndWhere","where","hoveredElement","calculateFocusAndGap","otherBinding","alreadyBoundToId","field","bindingBorderTest","edgePointIndex","adjacentPointIndex","edgePoint","adjacentPoint","determineFocusDistance","distanceToBindableElement","changedElement","boundLinearElements","newSize","simultaneouslyUpdatedElementIds","getSimultaneouslyUpdatedElementIds","doesNeedUpdate","maybeCalculateNewGapWhenScaling","updateBoundPoint","handleBindTextResize","bindingElement","newEdgePoint","focusPointAbsolute","determineFocusPoint","intersections","intersectElementWithLine","currentBinding","maxBindingGap","includedElementIds","getElligibleElementsForBindingElement","getLinearElementEdgeCoors","canBindStart","isLinearElementEligibleForNewBindingByBindable","canBindEnd","maybeElement","sceneElements","duplicatesServeAsOld","allBoundElementIds","allBindableElementIds","shouldReverseRoles","newBindingAfterDuplication","deletedElementIds","affectedElements","deletedElement","newBoundElementsAfterDeletion","newBindingAfterDeletion","isFreeDrawElement","getFreeDrawElementAbsoluteCoords","getDiamondPoints","topX","rightX","rightY","getCurvePathOps","sets","ops","getBezierValueForT","p0","p1","p2","p3","oneMinusT","solveQuadratic","j","sqrtPart","s1","s2","t1","t2","getMinMaxXYFromCurvePathOps","transformXY","currentP","limits","op","_p1","_p2","_p3","solX","solY","xs","ys","getCubicBezierCurveBound","getBoundsFromPoints","getArrowheadPoints","arrowhead","prevOp","equation","nx","ny","bar","dot","triangle","px","py","minSize","x3","y3","getLinearElementRotatedBounds","pointX","pointY","coordsWithBoundText","cachedShape","getShapeForElement","generator","generateRoughOptions","generateLinearElementShape","getElementBounds","x11","y11","x12","y12","x22","y22","x21","y21","w","cos","sin","ww","hh","getResizedElementAbsoluteCoords","nextWidth","nextHeight","normalizePoints","rescalePoints","gen","curve","linearPath","getClosestElementBounds","minDistance","closestElement","midX","midY","nvector","sub","isNumber","mul","mulScalar","joinScalar","norm","normalized","n","inormalized","inorm","GA","through","orthogonal","toTuple","intersect","line1","line2","point1","point2","distanceToLine","rotation","pivot","apply","motor","isElementSelected","isStrictlyInside","isDraggableFromInside","isElementDraggableFromInside","isInsideCheck","isNearCheck","hitTestPointAgainstElement","rotatedX","rotatedY","isOutsideCheck","elementWidth","elementHeight","smallerDimension","args","distanceToRectangle","hitTestFreeDrawElement","hitTestLinear","distanceToDiamond","distanceToEllipse","pointRelativeToElement","pointRel","hwidth","hheight","GAPoint","GALine","ellipseParamsForTest","tangent","tx","ty","xx","yy","ex","ey","qx","qy","q","intersection","closestPoint","rotatedPoint","rotatePoint","P","A","B","U","C","da","db","hitTestRoughShape","pointAbs","side1","side2","relX","relY","subshape","hitTestCurveInside","pointTuple","elementCoords","coordsCenter","GATransform","pointRotated","pointRelToCenterAbs","GADirection","elementPos","pointRelToPos","ax","ay","relativizationToElementCenter","translate","bx","by","relateToCenter","aRel","bRel","m","mabs","nabs","adjecentPoint","adjecentPointRel","reverseRelateToCenter","findFocusPointForRectangulars","findFocusPointForEllipse","getSortedElementLineIntersections","nearPoint","corners","getCorners","edge","intersectSegment","offsetSegment","getCircleIntersections","getEllipseIntersections","sortedIntersections","i1","i2","hx","hy","segment","squares","discr","discrRoot","xn","yn","radius","relativeDistance","relativeDistanceAbs","orientation","pyo","maxDistance","tangentPoint","corner","drawable","odd","isPointInPolygon","polygonPoints","pointsOnBezierCurves","lineThreshold","retVal","mx","my","pointInBezierEquation","Image","promises","imagePromise","doc","DOMParser","parseFromString","nodeName","hasAttribute","isInsideTransformHandle","transformHandle","rotationTransformHandle","resizeTest","getTransformHandlesFromCoords","OMIT_SIDES_FOR_MULTIPLE_ELEMENTS","RESIZE_CURSORS","shouldSwapCursors","rotateResizeCursor","pointerX","pointerY","distanceX","distanceY","updateElementCoords","lockX","lockY","original","originX","originY","widthAspectRatio","getPerfectElementSize","newX","newY","getSceneVersion","getVisibleElements","_clearElements","clearElementsForLocalStorage","editorMidPointsCache","pointerOffset","prevSelectedPointsIndices","lastClickedPoint","selectionX1","selectionY1","selectionX2","selectionY2","nextSelectedPoints","getPointsGlobalCoordinates","maybeSuggestBinding","draggingPoint","selectedIndex","referencePoint","_getShiftLockedDelta","movePoints","newDraggingPointPosition","createPointAt","pointIndex","getPointGlobalCoordinates","lastSelectedIndex","bindings","selectedPoint","getPointAtIndexGlobalCoordinates","endPoint","getBezierCurveLength","POINT_HANDLE_SIZE","endPointIndex","segmentMidPoint","centerPoint","controlPoints","getControlPointsForBezierCurve","mapIntervalToBezierT","getBezierXY","midPoints","getEditorMidPoints","arePointsEqual","getSegmentMidpointHitCoords","segmentMidpointIndex","getSegmentMidPointIndex","clickedPointIndex","getPointIndexUnderCursor","targetPoint","nextSelectedPointsIndices","normalizeSelectedPoints","newPoint","deletePoints","addPoints","indexMaybeFromEnd","absoluteCoords","pointHandles","pointerOnGrid","_idx","getNormalizedPoints","nextSelectedIndices","pointAddedToEnd","indexCursor","nextPoints","nextPoint","pointIndices","firstNonDeletedPoint","_updatePoints","targetPoints","otherUpdates","selectedOriginPoint","selectedPointData","p","dist","midpoint","nextCoords","prevCoords","nextCenterX","nextCenterY","dX","dY","rotated","referencePointCoords","boundText","updateEditorMidPointsCache","midpoints","isSegmentTooShort","getSegmentMidPoint","existingSegmentMidpointHitCoords","getBoundTextElementPosition","midSegmentMidpoint","getMinMaxXYWithBoundText","elementBounds","boundTextX1","boundTextY1","boundTextX2","boundTextY2","topLeftRotatedPoint","topRightRotatedPoint","counterRotateBoundTextTopLeft","counterRotateBoundTextTopRight","counterRotateBoundTextBottomLeft","counterRotateBoundTextBottomRight","updates","didChange","getSizeFromPoints","prevScale","nextScale","prevPoints","didChangePoints","prevPoint","_newElementBase","getTextElementPositionOffsets","metrics","normalizeText","offsets","getAdjustedDimensions","nextText","deltaX1","deltaY1","deltaX2","deltaY2","adjustXYWithRotation","prevMetrics","boundTextElementPadding","getBoundTextElementOffset","Number","isFinite","wrapText","getMaxContainerWidth","dimensions","depth","tmp","constructor","getPrototypeOf","hasOwnProperty","groupIdMapForOperation","overrides","isTestEnv","getNewGroupIdsForDuplication","resizeArrowDirection","rotateSingleElement","resizeSingleTextElement","rotateMultipleElements","resizeMultipleElements","atan2","boundTextElementId","getBoundTextElementId","measureFontSizeFromWidth","nextFontSize","getSidesForTransformHandle","nextElementX","nextElementY","transformHandleDirection","stateAtResizeStart","startTopLeft","startBottomRight","startCenter","rotatedPointer","esx1","esy1","boundsCurrentWidth","boundsCurrentHeight","scaleX","scaleY","boundTextFont","eleInitialWidth","eleInitialHeight","eleNewWidth","eleNewHeight","widthRatio","heightRatio","ratio","stateOfBoundTextElementAtResize","newBoundsX1","newBoundsY1","newBoundsX2","newBoundsY2","newBoundsWidth","newBoundsHeight","newTopLeft","bottomLeft","topRight","rescaledElementPointsY","rescaledPoints","rotatedTopLeft","newCenter","rotatedNewCenter","newOrigin","resizedElement","origElement","orig","latest","se","sw","anchorX","anchorY","condition","pointerSideX","pointerSideY","rescalePointsInElement","update","boundTextUpdates","centerAngle","origAngle","rotatedCX","rotatedCY","absWidth","absHeight","lockedAngle","atan","tan","a1","c1","a2","c2","diffWidth","diffHeight","maxContainerHeight","getMaxContainerHeight","updateOriginalContainerCache","updatedTextElement","computeBoundTextPosition","sceneElementMap","newElementId","newTextElementId","newContainer","containerHeight","diff","updatedY","containerCoords","getContainerCoords","maxContainerWidth","getTextHeight","getTextWidth","DUMMY_TEXT","toLocaleUpperCase","cacheApproxLineHeight","getLineWidth","canvas2dContext","originalLines","spaceWidth","originalLine","words","currentLine","currentLineWidthTillNow","currentWordWidth","currentChar","String","fromCodePoint","codePointAt","charWidth","calculate","word","cachedCharWidth","char","ascii","getCache","maxCharWidth","getMaxCharWidth","cache","cacheWithOutEmpty","getTextElementAngle","VALID_CONTAINER_TYPES","dimension","containerType","containerWidth","getTransform","degree","translateX","translateY","originalContainerCache","updateWysiwygStyle","approxLineHeight","coordX","coordY","textElementWidth","textElementHeight","boundTextCoords","originalContainerData","propertiesUpdated","editable","currentFont","getFontFamilyString","textPropertiesUpdated","editorHeight","initialSelectionStart","selectionStart","initialSelectionEnd","selectionEnd","initialLength","lineHeight","editorMaxHeight","dir","dataset","wrap","wordBreak","backfaceVisibility","outline","overflowWrap","boxSizing","onpaste","wrappedText","oninput","onkeydown","submittedViaKeyboard","outdent","indent","dispatchEvent","Event","TAB","repeat","RE_LEADING_TAB","RegExp","linesStartIndices","getSelectedLinesStartIndices","startIndex","startValue","endValue","removedTabs","tabMatch","startOffset","startIndices","stopEvent","cleanup","isDestroyed","onblur","observer","bindBlurEvent","unbindUpdate","isTargetColorPicker","HTMLInputElement","SVGElement","capture","transformHandleSizes","mouse","pen","OMIT_SIDES_FOR_TEXT_ELEMENT","OMIT_SIDES_FOR_LINE_SLASH","OMIT_SIDES_FOR_LINE_BACKSLASH","generateTransformHandle","omitSides","handleWidth","handleHeight","handleMarginX","handleMarginY","DEFAULT_SPACING","minimumSizeForEightHandles","isFreeDrawElementType","includeLocked","roundnessType","_construct","Parent","Class","isNativeReflectConstruct","Reflect","construct","instance","Function","setPrototypeOf","arguments","_wrapNativeSuper","_cache","fn","TypeError","Wrapper","enumerable","writable","indexOfEditingGroup","positionOfEditingGroupId","endIndex","prevGroupIds","positionToInsert","currentGroupMembers","refValue","setRefValue","percentages","TEST_LANG_CODE","unshift","currentLangData","fallbackLangData","editorLangCodeAtom","findPartsForData","parts","part","path","replacement","useAtomValue","unstable_createStore","useAtomWithInitialValue","initialValue","setValue","EQUAL","MINUS","NUM_ADD","NUM_SUBTRACT","NUM_ZERO","BRACKET_RIGHT","BRACKET_LEFT","ONE","TWO","NINE","QUOTE","ZERO","SLASH","D","H","V","Z","R","ARROW_DOWN","ARROW_LEFT","ARROW_RIGHT","ARROW_UP","PAGE_UP","PAGE_DOWN","BACKSPACE","ALT","CTRL_OR_CMD","DELETE","ENTER","ESCAPE","QUESTION_MARK","SPACE","CHEVRON_LEFT","CHEVRON_RIGHT","PERIOD","COMMA","E","F","G","I","L","O","Q","S","T","X","Y","K","sides","xd","yd","zoomValue","last","vertices","extreme","MAX_SAFE_INTEGER","doSegmentsIntersect","orderedColinearOrientation","isPointWithinBounds","q1","q2","o1","o2","o3","o4","getCornerRadius","fixedRadiusSize","getBezierCurveArcLengths","arcLengths","pointsOnCurve","at","getPointsInBezierCurve","pointsCount","targetLength","low","high","isRightAngle","getDimensions","restoredAppState","_exportToCanvas","_exportToSvg","normalize","coordinates","maxCoordinate","minCoordinate","nextMinCoordinate","scaledPoints","newCoordinate","scaledPoint","currentDimension","Random","testIdBase","$","u","l","ue","de","he","ge","ie","ee","xe","pe","ce","smoothing","thinning","easing","f","cap","runningLength","taper","te","M","W","vector","z","J","v","le","fe","re","be","oe","N","me","streamline","ae","IMAGE_INVERT_FILTER","isPendingImageElement","shouldResetImageFilter","getDashArrayDashed","getDashArrayDotted","getCanvasPadding","IMAGE_PLACEHOLDER_IMG","IMAGE_ERROR_PLACEHOLDER_IMG","drawElementOnCanvas","context","globalAlpha","lineJoin","lineCap","draw","pathsCache","getFreeDrawPath2D","fillShape","imageMinWidthOrHeight","drawImagePlaceholder","shouldTemporarilyAttach","isConnected","horizontalOffset","textBaseline","fillText","elementWithCanvasCache","WeakMap","shapeCache","setShapeForElement","continuousPath","strokeLineDash","disableMultiStroke","fillWeight","hachureGap","preserveVertices","curveFitting","generateElementShape","topY","bottomX","bottomY","leftX","leftY","verticalRadius","horizontalRadius","polygon","getArrowheadShapes","arrowheadPoints","circle","x4","y4","dash","shapes","generateFreeDrawShape","generateElementWithCanvas","prevElementWithCanvas","shouldRegenerateBecauseZoom","canvasZoom","boundTextElementVersion","elementWithCanvas","canvasOffsetX","canvasOffsetY","generateElementCanvas","drawElementFromCanvas","tempCanvasContext","maxDim","boundTextCx","boundTextCy","shiftX","shiftY","clearRect","REACT_APP_DEBUG_ENABLE_TEXT_CONTAINER_BOUNDING_BOX","renderElement","tempRc","boundTextShiftX","boundTextShiftY","currentImageSmoothingStatus","imageSmoothingEnabled","roughSVGDrawWithPrecision","rsvg","precision","pshape","fixedDecimalPlaceDigits","renderElementToSvg","svgRoot","root","anchorTag","ownerDocument","createElementNS","maskPath","maskRectVisible","maskRectInvisible","maskX","maskY","getFreeDrawSvgPath","symbolId","symbol","prepend","use","textAnchor","svgPathData","Path2D","med","TO_FIXED_PRECISION","getSvgPathFromStroke","getStroke","linkCanvasCache","hasEmojiSupport","supportsEmoji","strokeRectWithRotation","fillCircle","beginPath","arc","renderSingleLinearPoint","isSelected","isPhantomPoint","setLineDash","renderLinearPointHandles","highlightPoint","_renderScene","renderSelection","renderGrid","setTransform","normalizedCanvasWidth","normalizedCanvasHeight","moveTo","lineTo","strokeGrid","visibleElements","isVisibleElement","renderLinkIcon","suggestedBinding","renderBindingHighlight","locallySelectedElements","renderLinearElementPointHighlight","showBoundingBox","locallySelectedIds","selections","selectionColors","elementX1","elementY1","elementX2","elementY2","dashed","addSelectionForGroupId","renderSelectionBorder","renderTransformHandles","dashedLinePadding","initialLineDash","getLineDash","isOutOfBounds","UserIdleState","closePath","idleState","usernameAndIdleState","measure","measureHeight","actualBoundingBoxDescent","actualBoundingBoxAscent","boxX","boxY","boxWidth","boxHeight","roundRect","getScrollBars","SCROLLBAR_COLOR","scrollBar","quadraticCurveTo","renderSceneThrottled","throttleRAF","config","trailing","elementProperties","linePadding","lineDashOffset","renderHighlight","renderBindingHighlightForSuggestedPointBinding","renderBindingHighlightForBindableElement","strokeOffset","strokeDiamondWithRotation","strokeEllipseWithRotation","linkCanvasCacheContext","viewTransformations","topLeftSceneCoords","bottomRightSceneCoords","renderSceneToSvg","isIdKey","elementKey","callbacks","iteratee","mapElementToScene","sceneMapById","sceneMapByElement","isAtPositionFn","createCanvas","getCanvasSize","assetPath","IS_EXCALIDRAW_NPM_PACKAGE","EXCALIDRAW_ASSET_PATH","PKG_NAME","PKG_VERSION","rect","cords","viewportX1","viewportY1","viewportX2","viewportY2","isOutsideViewPort","elementsMinX","elementsMinY","elementsMaxX","elementsMaxY","viewportWidthWithZoom","viewportHeightWithZoom","viewportWidthDiff","viewportHeightDiff","safeArea","getGlobalCSSVariable","bottom","viewportMinX","viewportMinY","viewportMaxX","viewportMaxY","sceneMinX","sceneMinY","sceneMaxX","sceneMaxY","attributes","appLayerX","appLayerY","currentZoom","eraserCanvasCache","mockDateTime","date","year","getFullYear","month","getMonth","padStart","day","getDate","hr","getHours","getMinutes","charAt","HTMLBRElement","HTMLTextAreaElement","HTMLSelectElement","fontFamilyString","timeout","lastArgs","_lastArgs","timerId","lastArgsTrailing","scheduleFunc","cancelAnimationFrame","resIndex","drawCanvas","fullscreenElement","requestFullscreen","exitFullscreen","RE_RTL_CHECK","xyTuple","fromIndex","isRGBTransparent","substr","isRRGGBBTransparent","promise","_resolve","_reject","func","nFormatter","num","digits","si","getVersion","getImageData","scrollHeight","clientHeight","preventUnload","returnValue","byte","NODE_ENV","detail","obj","objA","objB","aKeys","bKeys","originalEventHandler","ourEventHandler","checkForDefaultPrevented","fallbackGlobalObject","getGlobalObject","isNodeEnv","global","uuid4","msCrypto","Uint16Array","pad","parseUrl","fragment","host","protocol","relative","getEventDescription","exception","event_id","consoleSandbox","originalConsole","wrappedLevels","level","__sentry_original__","addExceptionTypeValue","addExceptionMechanism","mechanism","_oO","getLocationHref","oO","parseRetryAfterHeader","headerDelay","headerDate","dynamicRequire","mod","require","dateTimestampSource","nowSeconds","platformPerformance","module","performance","getNodePerformance","timeOrigin","getBrowserPerformance","timestampSource","dateTimestampInSeconds","navigationStart","timing","toVal","mix","factory","CRC32","table","Int32Array","signed_crc_table","use_buffer","Buffer","crc32_buf_8","buf","crc","bstr","DO_NOT_EXPORT_CRC","exports","SUSPENSE_PROMISE","isSuspensePromise","cancelSuspensePromise","suspensePromise","_a","_b","isEqualSuspensePromise","oldSuspensePromise","newSuspensePromise","oldOriginalPromise","newOriginalPromise","createSuspensePromise","objectToAttach","__defProp$1","defineProperty","__defProps$1","__getOwnPropDescs$1","getOwnPropertyDescriptors","__getOwnPropSymbols$1","getOwnPropertySymbols","__hasOwnProp$1","__propIsEnum$1","propertyIsEnumerable","__defNormalProp$1","hasInitialValue","READ_ATOM","WRITE_ATOM","COMMIT_ATOM","SUBSCRIBE_ATOM","initialValues","stateListeners","mountedAtoms","committedAtomStateMap","mountedMap","pendingMap","atomState","freeze","suspensePromiseCacheMap","versionedAtomStateMapMap","getVersionedAtomStateMap","versionedAtomStateMap","getAtomState","setAtomState","prevAtomState","createReadDependencies","prevReadDependencies","dependencies","readDependencies","changed","revision","setAtomValue","nextAtomState","flushPending","setAtomReadError","setAtomSuspensePromise","addSuspensePromiseToCache","setAtomPromiseOrValue","promiseOrValue","readAtomState","setAtomInvalidated","__spreadValues$1","isSuspensePromiseAlreadyCancelled","aState","read","init","errorOrPromise","readAtom","readingAtom","canUnmountAtom","mounted","invalidateDependents","dependent","writeAtomState","isSync","promiseOrVoid","writeGetter","unstable_promise","info","promiseOrVoid2","versionSet","cancelAllSuspensePromiseInCache","cancelledVersion","writeAtom","writingAtom","mountAtom","initialDependent","aMounted","isActuallyWritableAtom","onMount","onUnmount","unmountAtom","mountDependencies","pending","commitAtom","_atom","commitVersionedAtomStateMap","subscribeAtom","addingAtom","addAtom","deletingAtom","delAtom","restoreAtoms","createStoreForExport","store","asyncGet","SECRET_INTERNAL_store","createScopeContainer","ScopeContextMap","getScopeContext","__defProp","__defProps","__getOwnPropDescs","__getOwnPropSymbols","__hasOwnProp","__propIsEnum","__defNormalProp","__spreadValues","atomToPrintable","debugLabel","stateToPrintable","atoms","dependents","unstable_enableVersionedWrite","setVersion","scopeContainerRef","parentVersion","nextVersion","scopeContainer","setAtoms","_a2","unsubscribe","useDebugState","ScopeContainerContext","keyCount","ScopeContext","getAtomValue","version2","useReducer","initialVersion","atomFromUseReducer","rerenderIfChanged","versionedWrite","FUNC_ERROR_TEXT","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","freeSelf","objectToString","nativeMax","nativeMin","wait","lastThis","maxWait","lastCallTime","lastInvokeTime","leading","maxing","invokeFunc","time","thisArg","leadingEdge","timerExpired","shouldInvoke","timeSinceLastCall","trailingEdge","remainingWait","debounced","isInvoking","toNumber","isObject","isObjectLike","isSymbol","other","valueOf","isBinary","pako","zlib_deflate","utils","strings","msg","ZStream","Deflate","windowBits","memLevel","strategy","opt","raw","gzip","ended","strm","avail_out","deflateInit2","deflateSetHeader","dictionary","dict","string2buf","deflateSetDictionary","_dict_set","deflator","mode","_mode","next_in","avail_in","output","Buf8","next_out","onEnd","onData","buf2binstring","shrinkBuf","deflateEnd","flattenChunks","deflateRaw","zlib_inflate","GZheader","Inflate","inflateInit2","Z_OK","inflateGetHeader","inflateSetDictionary","inflator","next_out_utf8","tail","utf8str","allowBufError","Z_FINISH","Z_NO_FLUSH","binstring2buf","Z_NEED_DICT","Z_BUF_ERROR","Z_STREAM_END","Z_SYNC_FLUSH","utf8border","buf2string","arraySet","inflateEnd","inflateRaw","ungzip","TYPED_OK","_has","sources","shift","subarray","fnTyped","dest","src_offs","dest_offs","fnUntyped","setTyped","on","Buf16","Buf32","STR_APPLY_OK","STR_APPLY_UIA_OK","fromCharCode","__","_utf8len","m_pos","str_len","buf_len","out","c_len","utf16buf","adler","Z_PARTIAL_FLUSH","Z_FULL_FLUSH","Z_BLOCK","Z_TREES","Z_ERRNO","Z_STREAM_ERROR","Z_DATA_ERROR","Z_NO_COMPRESSION","Z_BEST_SPEED","Z_BEST_COMPRESSION","Z_DEFAULT_COMPRESSION","Z_FILTERED","Z_HUFFMAN_ONLY","Z_RLE","Z_FIXED","Z_DEFAULT_STRATEGY","Z_BINARY","Z_TEXT","Z_UNKNOWN","Z_DEFLATED","crcTable","makeTable","configuration_table","trees","adler32","crc32","MAX_MATCH","MIN_LOOKAHEAD","HCRC_STATE","BUSY_STATE","FINISH_STATE","errorCode","rank","zero","flush_pending","pending_buf","pending_out","total_out","flush_block_only","_tr_flush_block","block_start","strstart","put_byte","putShortMSB","read_buf","total_in","longest_match","cur_match","chain_length","max_chain_length","scan","best_len","prev_length","nice_match","limit","w_size","_win","wmask","w_mask","strend","scan_end1","scan_end","good_match","lookahead","match_start","fill_window","more","_w_size","window_size","hash_size","head","insert","ins_h","hash_shift","hash_mask","deflate_fast","hash_head","bflush","match_length","_tr_tally","max_lazy_match","MIN_MATCH","last_lit","deflate_slow","max_insert","prev_match","match_available","Config","good_length","max_lazy","nice_length","max_chain","DeflateState","pending_buf_size","gzhead","gzindex","last_flush","w_bits","hash_bits","dyn_ltree","HEAP_SIZE","dyn_dtree","bl_tree","l_desc","d_desc","bl_desc","bl_count","MAX_BITS","heap","heap_len","heap_max","l_buf","lit_bufsize","d_buf","opt_len","static_len","bi_buf","bi_valid","deflateResetKeep","data_type","_tr_init","deflateReset","max_block_size","max_start","deflateInit","old_flush","beg","hcrc","comment","os","bstate","deflate_huff","deflate_rle","_tr_align","_tr_stored_block","avail","tmpDict","dictLength","deflateInfo","xflags","extra_len","_in","_out","dmax","wsize","whave","wnext","s_window","hold","bits","lcode","dcode","lmask","dmask","here","from_source","lencode","distcode","lenbits","distbits","dolen","dodist","sane","inflate_fast","inflate_table","TYPE","BAD","zswap32","InflateState","havedict","flags","total","wbits","ncode","nlen","ndist","have","lens","work","lendyn","distdyn","was","inflateResetKeep","inflateReset","inflateReset2","lenfix","distfix","virgin","fixedtables","sym","updatewindow","inflateInit","put","here_bits","here_op","here_val","last_bits","last_op","last_val","hbuf","order","inf_leave","inflateInfo","MAXBITS","lbase","lext","dbase","dext","lens_index","codes","table_index","incr","curr","drop","used","huff","base_index","offs","extra_index","LITERALS","L_CODES","D_CODES","extra_lbits","extra_dbits","extra_blbits","bl_order","static_ltree","static_dtree","_dist_code","_length_code","base_length","static_l_desc","static_d_desc","static_bl_desc","base_dist","StaticTreeDesc","static_tree","extra_bits","extra_base","elems","max_length","has_stree","TreeDesc","dyn_tree","stat_desc","max_code","d_code","put_short","send_bits","send_code","tree","bi_reverse","gen_codes","next_code","init_block","END_BLOCK","bi_windup","smaller","_n2","_m2","pqdownheap","compress_block","ltree","dtree","lc","lx","build_tree","desc","stree","xbits","gen_bitlen","scan_tree","curlen","prevlen","nextlen","max_count","min_count","REP_3_6","REPZ_3_10","REPZ_11_138","send_tree","static_init_done","stored_len","copy_block","LENGTH_CODES","tr_static_init","opt_lenb","static_lenb","max_blindex","black_mask","detect_data_type","BL_CODES","build_bl_tree","lcodes","dcodes","blcodes","send_all_trees","STATIC_TREES","bi_flush","naming","totalSize","sliced","nameChars","uint32","uint8","crcCheck","int32","Uint32Array","crcActual","chunkData","distanceSq","distanceToSegmentSq","l2","lerp","getPointsOnBezierCurveWithSplitting","tolerance","newPoints","outPoints","p4","ux","uy","vx","vy","flatness","q3","r1","r2","red","simplify","simplifyPoints","epsilon","maxDistSq","maxNdx","distSq","numSegments","aa","ca","ea","fa","ha","ja","ka","la","ma","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","ra","sa","ta","pa","qa","oa","removeAttribute","setAttributeNS","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","for","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","iterator","Ka","La","Ma","stack","Na","Oa","prepareStackTrace","Pa","tag","render","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","Va","_valueTracker","getOwnPropertyDescriptor","getValue","stopTracking","Ua","Wa","Xa","Ya","defaultChecked","_wrapperState","initialChecked","Za","controlled","bb","eb","fb","defaultSelected","gb","dangerouslySetInnerHTML","hb","ib","jb","kb","lb","mb","nb","namespaceURI","firstChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeType","nodeValue","pb","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","lineClamp","orphans","tabSize","widows","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeOpacity","qb","rb","sb","setProperty","substring","tb","menuitem","area","br","embed","keygen","meta","param","track","wbr","ub","vb","wb","xb","srcElement","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","Nb","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","Wb","memoizedState","dehydrated","Xb","Zb","sibling","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","clz32","pc","qc","log","LN2","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Pc","Qc","Rc","Sc","Tc","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","Uc","jd","kd","ld","md","nd","od","charCode","pd","qd","rd","_reactName","_targetInst","isDefaultPrevented","isPropagationStopped","cancelBubble","persist","isPersistent","wd","sd","eventPhase","timeStamp","isTrusted","td","ud","view","vd","Ad","screenX","screenY","pageX","pageY","getModifierState","zd","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","locale","which","Rd","Td","tangentialPressure","tiltX","tiltY","twist","isPrimary","Vd","targetTouches","changedTouches","Xd","Yd","wheelDeltaX","wheelDeltaY","wheelDelta","deltaZ","deltaMode","Zd","$d","documentMode","datetime","email","number","password","range","tel","week","qe","ve","we","ye","ze","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ie","Je","Ke","nextSibling","Le","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","Ne","contentEditable","Oe","focusedElem","selectionRange","defaultView","extend","rangeCount","anchorOffset","focusNode","focusOffset","createRange","setStart","addRange","setEnd","scrollLeft","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","nf","Ub","of","pf","qf","rf","sf","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","ke","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","Gf","Hf","Jf","queueMicrotask","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","Vf","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","zg","Ag","Bg","deletions","Cg","pendingProps","treeContext","retryLane","Dg","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","Mg","Ng","Og","Pg","Qg","Rg","_currentValue","Sg","childLanes","Tg","firstContext","lanes","Ug","Vg","memoizedValue","Wg","Xg","Yg","interleaved","Zg","$g","ah","baseState","firstBaseUpdate","lastBaseUpdate","shared","effects","bh","ch","eventTime","lane","payload","dh","eh","fh","gh","ih","jh","refs","kh","nh","isMounted","_reactInternals","enqueueSetState","lh","mh","enqueueReplaceState","enqueueForceUpdate","oh","shouldComponentUpdate","isPureReactComponent","ph","contextType","qh","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","rh","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","sh","_owner","_stringRef","th","uh","vh","wh","xh","yh","implementation","zh","Ah","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","tagName","Jh","Kh","Lh","Mh","revealOrder","Nh","Oh","_workInProgressVersionPrimary","Ph","ReactCurrentDispatcher","Qh","Rh","Sh","Th","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","baseQueue","queue","di","ei","fi","lastRenderedReducer","hasEagerState","eagerState","lastRenderedState","dispatch","gi","hi","ii","ji","ki","getSnapshot","li","mi","ni","lastEffect","stores","oi","pi","qi","ri","deps","ti","ui","vi","wi","xi","yi","zi","Ai","Bi","Ci","Di","Ei","Fi","Gi","Hi","Ii","Ji","readContext","useImperativeHandle","useInsertionEffect","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ki","Li","Mi","Ni","Oi","Pi","Qi","Ri","getDerivedStateFromError","componentDidCatch","Si","componentStack","Ti","pingCache","Ui","Vi","Wi","Xi","ReactCurrentOwner","Yi","Zi","$i","aj","bj","compare","cj","dj","ej","baseLanes","cachePool","transitions","fj","gj","hj","ij","jj","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","kj","lj","pendingContext","mj","Aj","Cj","Dj","nj","oj","pj","qj","rj","tj","dgst","uj","vj","_reactRetry","sj","subtreeFlags","wj","xj","isBackwards","rendering","renderingStartTime","tailMode","yj","Ej","Fj","Gj","wasMultiple","suppressHydrationWarning","onclick","createTextNode","Hj","Ij","Jj","Kj","Lj","WeakSet","Mj","Nj","Oj","Qj","Rj","Sj","Tj","Uj","Vj","Wj","insertBefore","_reactRootContainer","Xj","Yj","Zj","ak","onCommitFiberUnmount","componentWillUnmount","bk","ck","dk","ek","fk","isHidden","gk","hk","ik","jk","kk","lk","__reactInternalSnapshotBeforeUpdate","Wk","mk","nk","pk","qk","rk","sk","tk","uk","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","Ek","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","Pk","finishedWork","finishedLanes","Qk","timeoutHandle","Rk","Sk","Tk","Uk","Vk","mutableReadLanes","Bc","Pj","onCommitFiberRoot","mc","onRecoverableError","Xk","onPostCommitFiberRoot","Yk","Zk","al","isReactComponent","pendingChildren","bl","mutableSourceEagerHydrationData","cl","pendingSuspenseBoundaries","dl","fl","gl","hl","il","jl","zj","$k","ll","reportError","ml","_internalRoot","nl","ol","pl","ql","sl","rl","unmount","unstable_scheduleHydration","form","tl","usingClientEntryPoint","Events","ul","findFiberByHostInstance","bundleType","rendererPackageName","vl","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","wl","isDisabled","supportsFiber","inject","createRoot","unstable_strictMode","findDOMNode","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_renderSubtreeIntoContainer","checkDCE","__self","__source","Fragment","jsx","jsxs","forceUpdate","escape","_status","_result","Children","toArray","only","Profiler","PureComponent","StrictMode","Suspense","cloneElement","_currentValue2","_threadCount","Consumer","_defaultValue","_globalName","createFactory","createRef","isValidElement","lazy","memo","startTransition","unstable_act","randomSeed","imul","rotatePoints","degrees","lineLength","polygonHachureLines","polygonList","hachureAngle","rotationCenter","vertexArray","edges","ymin","ymax","islope","e1","e2","activeEdges","ix","ae1","ae2","nexti","straightHachureLines","rotateLines","HachureFiller","helper","_fillPolygons","renderLines","doubleLineOps","ZigZagFiller","zigZagAngle","zigzagLines","dgx","dgy","HatchFiller","set2","DotFiller","dotsOnLines","fweight","ro","DashedFiller","dashedLine","dashOffset","dashGap","alpha","lstart","lend","ZigZagLineFiller","zo","zigzagOffset","dz","middle","fillers","PARAMS","isType","token","parsePath","segments","tokens","$1","tokenize","paramsCount","numbeToken","absolutize","subx","suby","newdata","lastType","lcx","lcy","cx1","cy1","cx2","cy2","largeArcFlag","sweepFlag","arcToCubicCurves","angleRad","recursive","f1","f2","r1Pow","r2Pow","asin","f2old","x2old","y2old","m1","m2","m3","m4","curves","r3","randOffset","_offsetOpt","randOffsetWithRange","_offset","generateEllipseParams","ellipseWithParams","opset","_doubleLine","close","_curveWithOffset","randomizer","cloneOptionsAlterSeed","psq","stepCount","curveStepCount","increment","curveFitRandomness","ellipseParams","_computeEllipsePoints","ap1","cp1","_curve","estimatedPoints","closed","roughClosure","strt","stp","ellipseInc","arcInc","_arc","solidFillPolygon","maxRandomnessOffset","patternFillPolygons","fillerName","getFiller","fillPolygons","patternFillArc","roughnessGain","filling","singleStroke","disableMultiStrokeFill","_line","move","overlay","lengthSq","halfOffset","divergePoint","midDispX","bowing","midDispY","randomHalf","randomFull","ps","closePoint","curveTightness","cachedVertArray","overlap","corePoints","allPoints","radOffset","endAngle","_bezierTo","ros","iterations","clone","NOS","RoughGenerator","defaultOptions","_o","_d","paths","ellipseResponse","diameter","fillOptions","bcurve","pointsIn","curveToBezier","polyPoints","hasFill","hasStroke","simplified","simplification","currentPoints","pendingCurve","appendPendingCurve","appendPendingPoints","simplifiedSet","pointsOnPath","pv","svgPath","drawing","fixedDecimals","opsToPath","fillSketch","RoughCanvas","getDefaultOptions","strokeLineDashOffset","_drawToContext","fillLineDash","fillLineDashOffset","rule","bezierCurveTo","SVGNS","RoughSVG","newSeed","sortIndex","setImmediate","startTime","expirationTime","priorityLevel","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","unstable_wrapCallback","sliceEnd","inst","hasValue","webpackAsyncContext","req","__webpack_require__","_arrayLikeToArray","arr2","_assertThisInitialized","ReferenceError","asyncGeneratorStep","_next","_throw","arg","_asyncToGenerator","_classCallCheck","Constructor","_defineProperties","descriptor","_createClass","protoProps","staticProps","_createForOfIteratorHelper","allowArrayLike","it","_e","normalCompletion","didErr","_e2","_possibleConstructorReturn","assertThisInitialized","_createSuper","Derived","hasNativeReflectConstruct","Super","NewTarget","_defineProperty","_getPrototypeOf","__proto__","_inherits","subClass","superClass","_isNativeReflectConstruct","sham","ownKeys","object","enumerableOnly","symbols","_objectSpread2","_objectWithoutProperties","excluded","sourceKeys","sourceSymbolKeys","_regeneratorRuntime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","innerFn","outerFn","tryLocsList","protoGenerator","Generator","makeInvokeMethod","tryCatch","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","Gp","defineIteratorMethods","_invoke","AsyncIterator","PromiseImpl","invoke","__await","unwrapped","previousPromise","callInvokeWithMethodAndArg","doneResult","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isGeneratorFunction","genFun","ctor","mark","awrap","async","iter","skipTempReset","rootRecord","rval","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","_setPrototypeOf","_slicedToArray","_i","_s","_arr","_n","unsupportedIterableToArray","_toConsumableArray","arrayLikeToArray","_typeof","_unsupportedIterableToArray","minLen","__webpack_module_cache__","moduleId","cachedModule","loaded","__webpack_modules__","getter","__esModule","leafPrototypes","ns","def","getOwnPropertyNames","definition","chunkId","miniCssF","globalThis","hmd","inProgress","dataWebpackPrefix","script","needAttach","scripts","getElementsByTagName","charset","nc","onScriptComplete","doneFns","installedChunks","installedChunkData","errorType","realSrc","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","chunkLoadingGlobal","each","defaults","fieldContentRegExp","serializeCookie","maxAge","domain","expires","toUTCString","httpOnly","secure","sameSite","cookie","minutes","cookieOptions","setTime","getTime","nameEQ","cookie$1","lookup","found","lookupCookie","cacheUserLanguage","lng","cookieMinutes","cookieDomain","querystring","lookupQuerystring","hasLocalStorageSupport","localStorageAvailable","testKey","lookupLocalStorage","hasSessionStorageSupport","sessionStorageAvailable","sessionStorage","lookupSessionStorage","navigator$1","userLanguage","language","htmlTag","lookupFromPathIndex","subdomain","lookupFromSubdomainIndex","Browser","services","detectors","i18nOptions","excludeCacheFor","lookupFromUrlIndex","addDetector","detector","detectionOrder","_this","detected","detectorName","languageUtils","getBestMatchFromCodes","_this2","cacheName","extendStatics","__extends","SessionStatus","__assign","__values","__read","ar","__spread","PREFIX","_enabled","Logger","__SENTRY__","States","logger","wat","isInstanceOf","isErrorEvent","isDOMError","isString","isPrimitive","isPlainObject","isEvent","isElement","isThenable","executor","_state","PENDING","_handlers","_setResult","RESOLVED","REJECTED","_value","_executeHandlers","_attachHandler","cachedHandlers","onfulfilled","onrejected","SyncPromise","collection","resolvedCollection","onfinally","isRejected","_notifyingListeners","_scopeListeners","_eventProcessors","_breadcrumbs","_user","_tags","_extra","_contexts","Scope","newScope","_level","_span","_session","_transactionName","_fingerprint","_notifyScopeListeners","tags","extras","fingerprint","setTransactionName","getSpan","transaction","spanRecorder","spans","session","captureContext","updatedScope","contexts","breadcrumb","maxBreadcrumbs","mergedBreadcrumb","timestamp","trace","getTraceContext","transactionName","_applyFingerprint","breadcrumbs","_notifyEventProcessors","getGlobalEventProcessors","processors","processor","final","globalEventProcessors","addGlobalEventProcessor","htmlTreeAsString","currentElem","sepLength","nextStr","_htmlElementAsString","classes","attr","allowedAttrs","_hasWeakSet","_inner","Memo","defaultFunctionName","getFunctionName","truncate","safeJoin","delimiter","isMatchingPattern","replacementFactory","wrapped","_Oo","getWalkSource","event_1","jsonSize","encodeURI","utf8Length","normalizeToSize","normalizeValue","_events","walk","serializeValue","toJSON","memoize","innerKey","unmemoize","extractExceptionKeysForMessage","maxLength","includedKeys","dropUndefinedKeys","rv","errors","sid","started","Session","ip_address","ipAddress","did","release","environment","Exited","toISOString","attrs","user_agent","_version","_stack","getStackTop","bindClient","Hub","setupIntegrations","getScope","getStack","getClient","pushScope","popScope","eventId","_lastEventId","finalHint","syntheticException","originalException","_invokeClient","_c","beforeBreadcrumb","finalBreadcrumb","addBreadcrumb","setUser","setTags","setExtras","setTag","setExtra","setContext","oldHub","makeMain","integration","getIntegration","_callExtensionMethod","customSamplingContext","endSession","_sendSessionUpdate","getSession","setSession","getUser","currentSession","captureSession","carrier","getMainCarrier","sentry","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","hasHubOnCarrier","isOlderThan","activeDomain","registryHubTopStack","getHubFromActiveDomain","callOnHub","captureException","withScope","TopErrorBoundary","hasError","sentryEventId","errorSplash","errorInfo","_localStorage","Sentry","templateStrFn","reload","createGithubIssue","selectTextArea","readOnly","InitializeApp","loading","setLoading","updateLang","FooterCenter","WelcomeScreenMenuItemContent","WelcomeScreenMenuItem","WelcomeScreenMenuItemLink","Center","Logo","Heading","MenuItemLoadScene","MenuItemHelp","MenuItemLiveCollaborationTrigger","MenuItem","MenuItemLink","MenuHint","ToolbarHint","HelpHint","WelcomeScreen","Hints","Button","ExcalidrawBase","prevUIOptions","nextUIOptions","prevUIOptionsKeys","nextUIOptionsKeys","forwardedRefComp","Excalidraw","WS_SCENE_EVENT_TYPES","FILE_UPLOAD_MAX_BYTES","WS_EVENTS","FIREBASE_CONFIG","FIREBASE_STORAGE_PREFIXES","STORAGE_KEYS","isExcalidrawPlusSignedUser","FileManager","saveFiles","fetchingFiles","savingFiles","savedFiles","_getFiles","_saveFiles","isFileHandled","isFileSaved","addedFiles","loadedFiles","shouldPreventUnload","shouldUpdateImageElementStatus","encodeFilesForUpload","maxBytes","processedFiles","encodedFile","updateStaleImageStatuses","shouldDiscardRemoteElement","local","remote","reconcileElements","remoteElements","localElementsData","reconciledElements","duplicates","remoteElementIdx","remoteElement","firebasePromise","firestorePromise","firebaseStoragePromise","isFirebaseInitialized","_loadFirebase","firebase","initializeApp","_getFirebase","loadFirestore","loadFirebaseStorage","encryptElements","ciphertext","decryptElements","roomKey","toUint8Array","decrypted","decodedData","FirebaseSceneVersionCache","socket","isSavedToFirebase","portal","roomId","sceneVersion","saveFilesToFirebase","prefix","storage","cacheControl","createFirebaseSceneDocument","firestore","fromUint8Array","saveToFirebase","docRef","runTransaction","snapshot","exists","sceneDocument","prevDocData","getSyncableElements","savedData","loadFromFirebase","storedScene","loadFilesFromFirebase","filesIds","storageBucket","isSyncableElement","generateRoomId","getCollabServer","resp","RE_COLLAB_LINK","isCollaborationLink","URL","getCollaborationLinkData","generateCollaborationLinkData","legacy_decodeFromBackend","fixedIv","importFromBackend","decodedBuffer","localDataState","exportToBackend","filesToUpload","urlString","error_class","importUsernameFromLocalStorage","importFromLocalStorage","savedElements","savedState","getElementsStorageSize","getTotalStorageSize","collab","getLibraryItemsFromStorage","Portal","socketInitialized","broadcastedElementVersions","queueFileUpload","fileManager","broadcastScene","updateType","syncAll","INIT","syncableElements","syncableElement","_broadcastSocketData","broadcastIdleChange","broadcastMouseLocation","emit","_socketId","clients","setCollaborators","volatile","getShareIcon","isAppleBrowser","vendor","isWindowsBrowser","appVersion","activeRoomLink","onUsernameChange","onRoomCreate","onRoomDestroy","setErrorMessage","roomLinkInput","copyRoomLink","shareRoomLink","selectInput","onKeyPress","LOCAL_STATE_VERSIONS","isBrowserStorageStateNewer","updateBrowserStateVersion","resetBrowserStateVersions","defaultGetStoreFunc","intervalId","userAgentData","indexedDB","databases","tryIdb","promisifyRequest","oncomplete","onsuccess","onabort","dbName","storeName","dbp","safariFix","onupgradeneeded","createObjectStore","txMode","objectStore","defaultGetStore","customStore","setMany","del","eachCursor","openCursor","continue","Locker","locks","lockType","unlock","isLocked","filesStore","LocalFileManager","clearObsoleteFiles","imageData","currentFileIds","saveDataStateToLocalStorage","LocalData","_save","onFilesSaved","fileStorage","isSavePaused","flushSave","locker","pauseSave","resumeSave","getMany","filesData","filesToSave","appJotaiStore","collabAPIAtom","collabDialogShownAtom","isCollaboratingAtom","isOfflineAtom","Collab","activeIntervalId","idleTimeoutId","socketInitializationTimer","lastBroadcastedOrReceivedSceneVersion","onOfflineStatusToggle","onLine","setIsCollaborating","destroySocketClient","isUnload","beforeUnload","saveCollabRoomToFirebase","handleRemoteSceneUpdate","stopCollaboration","keepRemoteState","queueBroadcastAllElements","queueSaveToFirebase","loadImageFiles","fallbackInitializationHandler","off","pushState","fetchImageFilesFromFirebase","unfetchedImages","forceFetchFiles","decryptPayload","encryptedData","startCollaboration","existingRoomLinkData","scenePromise","socketIOClient","initializeRoom","roomLinkData","fetchScene","socketServerData","transports","polling","decryptedData","UPDATE","socketID","initializeIdleDetector","setLastBroadcastedOrReceivedSceneVersion","_reconcileElements","reportIdle","reportActive","onVisibilityChange","onIdleStateChange","getLastBroadcastedOrReceivedSceneVersion","broadcastElements","syncElements","currentVersion","newVersion","setUsername","saveUsernameToLocalStorage","collabAPI","sockets","collabDialogShown","getStorageSizes","storageSizes","setStorageSizes","sizes","excalidrawPlusIcon","exportToExcalidrawPlus","customMetadata","ExportToExcalidrawPlus","LanguageList","setLangCode","appLangCodeAtom","AppMainMenu","setCollabDialogShown","AppWelcomeScreen","headingContent","bit","pointerEvents","EncryptedIcon","ExcalidrawPlusAppLink","AppFooter","polyfill","languageDetector","LanguageDetector","searchParams","jsonBackendMatch","externalUrlMatch","isExternalScene","detectedLangCode","detect","ExcalidrawWrapper","initialStatePromiseRef","excalidrawRefCallback","loadImages","isInitialLoad","titleTimeout","syncData","currFiles","visibilityChange","unloadHandler","setTheme","serializedItems","isOffline","isLocalhost","hostname","registerValidSW","swUrl","serviceWorker","registration","onupdatefound","installingWorker","installing","onstatechange","controller","onUpdate","checkValidServiceWorker","headers","contentType","unregister","registerServiceWorker","waitingServiceWorker","waiting","originalFunctionToString","DEFAULT_IGNORE_ERRORS","_options","InboundFilters","clientOptions","getOptions","_mergeOptions","_shouldDropEvent","_isSentryError","_isIgnoredError","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","ignoreInternal","ignoreErrors","_getPossibleEventMessages","denyUrls","allowUrls","whitelistUrls","blacklistUrls","stacktrace","frames_1","frames","frames_2","FunctionToString","supportsFetch","Headers","Request","Response","isNativeFetch","supportsReferrerPolicy","lastHref","handlers","instrumented","instrument","originalConsoleLevel","triggerHandlers","instrumentConsole","triggerDOMHandler","globalDOMEventHandler","makeDOMEventHandler","proto","originalAddEventListener","handlers_1","__sentry_instrumentation_handlers__","handlerForType","refCount","originalRemoveEventListener","handlers_2","instrumentDOM","requestKeys","requestValues","xhrproto","XMLHttpRequest","originalOpen","xhr","__sentry_xhr__","__sentry_own_request__","onreadystatechangeHandler","status_code","requestPos","args_1","endTimestamp","startTimestamp","onreadystatechange","readyStateArgs","originalSend","instrumentXHR","sandbox","supportsNativeFetch","originalFetch","handlerData","fetchData","getFetchMethod","getFetchUrl","instrumentFetch","chrome","isChromePackagedApp","hasHistoryApi","supportsHistory","oldOnPopState","onpopstate","historyReplacementFunction","originalHistoryFunction","instrumentHistory","_oldOnErrorHandler","column","_oldOnUnhandledRejectionHandler","onunhandledrejection","addInstrumentationHandler","fetchArgs","debounceTimerID","lastCapturedEvent","globalListener","isContentEditable","shouldSkipDOMEvent","previous","shouldShortcircuitPreviousDebounce","SDK_VERSION","_super","_newTarget","DSN_REGEX","ERROR_MESSAGE","_fromString","_fromComponents","_validate","Dsn","withPassword","pass","port","projectId","publicKey","SentryError","lastPath","projectMatch","components","component","installedIntegrations","integrations","defaultIntegrations","userIntegrations","userIntegrationsNames_1","pickedIntegrationsNames_1","defaultIntegration","userIntegration","integrationsNames","alwaysLastToRun","getIntegrationsToSetup","setupOnce","setupIntegration","Status","backendClass","_integrations","_processing","_backend","dsn","_dsn","BaseClient","_process","_getBackend","eventFromException","_captureEvent","promisedEvent","eventFromMessage","_sendSession","_isClientProcessing","getTransport","transportFlushed","enabled","_isEnabled","crashed","errored","exceptions","Crashed","sendSession","ticked","normalizeDepth","prepared","_applyClientOptions","_applyIntegrationsMetadata","finalScope","applyToEvent","evt","_normalizeEvent","maxValueLength","sdkInfo","sdk","integrationsArray","sendEvent","_processEvent","finalEvent","beforeSend","sampleRate","isTransaction","_prepareEvent","__sentry__","beforeSendResult","processedEvent","_updateSessionFromEvent","_sendEvent","Success","RateLimit","Invalid","Failed","Unknown","Severity","NoopTransport","Skipped","_transport","_setupTransport","BaseBackend","_exception","_hint","_message","Debug","Info","Warning","Fatal","Critical","Log","UNKNOWN_FUNCTION","gecko","winjs","geckoEval","chromeEval","reactMinifiedRegexp","computeStackTrace","popSize","framesToPop","opera10Regex","opera11Regex","extractMessage","computeStackTraceFromStacktraceProp","popFrames","submatch","isNative","columnNumber","computeStackTraceFromStackProp","failed","exceptionFromStacktrace","prepareFramesForEvent","eventFromStacktrace","localStack","firstFrameFunction","lastFrameFunction","frame","colno","function","in_app","lineno","eventFromUnknownInput","domException","name_1","eventFromString","rejection","__serialized__","eventFromPlainObject","synthetic","attachStacktrace","getSdkMetadataForEnvelopeHeader","enhanceEventWithSdkInfo","packages","sessionToSentryRequest","sent_at","getEnvelopeEndpointWithUrlEncodedAuth","eventToSentryRequest","eventType","useEnvelope","transactionSampling","samplingMethod","debug_meta","getStoreEndpointWithUrlEncodedAuth","envelope","sample_rates","rate","_dsnObject","API","_getIngestEndpoint","getStoreEndpoint","_encodedAuth","_getEnvelopeEndpoint","clientName","clientVersion","dialogOptions","endpoint","getBaseApiEndpoint","encodedOptions","auth","sentry_key","sentry_version","_limit","_buffer","PromiseBuffer","isReady","capturedSetTimeout","CATEGORY_MAPPING","_rateLimits","_api","_metadata","BaseTransport","drain","requestType","fromHttpCode","_handleRateLimit","_disabledUntil","rlHeader","raHeader","parameters","fetchImpl","getNativeFetchImplementation","_fetch","FetchTransport","_sendRequest","sentryRequest","originalPayload","_isRateLimited","fetchParameters","_handleResponse","XHRTransport","getResponseHeader","setRequestHeader","send","BrowserBackend","transportOptions","transport","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","before","__sentry_wrapped__","sentryWrapped","wrappedArguments","handleEvent","addEventProcessor","property","injectReportDialog","getReportDialogEndpoint","onLoad","Breadcrumbs","dom","_consoleBreadcrumb","_domBreadcrumb","_xhrBreadcrumb","_fetchBreadcrumb","_historyBreadcrumb","fromString","parsedLoc","parsedFrom","parsedTo","BrowserClient","getDsn","addSentryBreadcrumb","DEFAULT_EVENT_TARGET","TryCatch","eventTarget","_wrapTimeFunction","_wrapRAF","_wrapXHR","_wrapEventTarget","originalCallback","eventName","wrappedEventHandler","xmlHttpRequestProps","wrapOptions","GlobalHandlers","_onErrorHandlerInstalled","_onUnhandledRejectionHandlerInstalled","stackTraceLimit","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","currentHub","hasIntegration","isFailedOwnDelivery","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","captureEvent","_eventFromRejectionWithPrimitive","LinkedErrors","_key","_handler","linkedErrors","_walkErrorTree","UserAgent","Referer","CoreIntegrations","CaptureConsole","_levels","levels","setLevel","captureMessage","SentryEnvHostnameMap","onlineEnv","REACT_APP_DISABLE_SENTRY","window_1","SENTRY_RELEASE","autoSessionTracking","clientClass","initAndBind","startSession","startSessionTracking","SentryIntegrations","__EXCALIDRAW_SHA__","rootElement","getElementById"],"sourceRoot":""}