From 69bf3b07a18c4c8a2755e525676ecfd8278e9d69 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Thu, 11 Jun 2026 23:59:40 -0700 Subject: [PATCH] feat(diagram-render): __downscaleRaster for print-resolution image normalization MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Data-URI rasters re-encode in their own format (JPEG stays JPEG at q0.9 — PNG-encoding photos bloats them) at an explicit target pixel width. Used by make-pdf's pre-pass for the 300dpi content-box ceiling (eng-review D4). Co-Authored-By: Claude Fable 5 --- lib/diagram-render/dist/BUILD_INFO.json | 4 +-- lib/diagram-render/dist/diagram-render.html | 2 +- lib/diagram-render/src/entry.ts | 32 +++++++++++++++++++++ 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/lib/diagram-render/dist/BUILD_INFO.json b/lib/diagram-render/dist/BUILD_INFO.json index 6f37606b0..5ae8527ce 100644 --- a/lib/diagram-render/dist/BUILD_INFO.json +++ b/lib/diagram-render/dist/BUILD_INFO.json @@ -1,7 +1,7 @@ { "name": "gstack-diagram-render", - "sha256": "9b1da250ef93f176bfb7b96c6eb735645a879702539bb6a58c378273d90aca23", - "bytes": 9644924, + "sha256": "0ee91aef5a8da85c8941c26ebf2991bbeba82412644bb070d5c5dd2e23538b81", + "bytes": 9645503, "bunVersion": "1.3.13", "deps": { "@excalidraw/excalidraw": "0.18.0", diff --git a/lib/diagram-render/dist/diagram-render.html b/lib/diagram-render/dist/diagram-render.html index b8c9b1795..e953a32ed 100644 --- a/lib/diagram-render/dist/diagram-render.html +++ b/lib/diagram-render/dist/diagram-render.html @@ -5128,7 +5128,7 @@ TTD mermaid definition render errror: ${$.message}`,"color: yellow"),CC("ai","me `)}}}else Q=eb(Xlu(D.link||""));let G=this.state.activeEmbeddable?.element===D&&this.state.activeEmbeddable?.state==="active",W=this.state.activeEmbeddable?.element===D&&this.state.activeEmbeddable?.state==="hover";return d("div",{className:j3("excalidraw__embeddable-container",{"is-hovered":W}),style:{transform:M?`translate(${Z-this.state.offsetLeft}px, ${X-this.state.offsetTop}px) scale(${B})`:"none",display:M?"block":"none",opacity:$Ru(D,_Q(D,this.scene.getNonDeletedElementsMap()),this.elementsPendingErasure,null,this.state.openDialog?.name==="elementLinkSelector"?hju:1),"--embeddable-radius":`${_O(Math.min(D.width,D.height),D)}px`},children:c0("div",{className:"excalidraw__embeddable-container__inner",style:{width:M?`${D.width}px`:0,height:M?`${D.height}px`:0,transform:M?`rotate(${D.angle}rad)`:"none",pointerEvents:G?_b.enabled:_b.disabled},children:[W&&d("div",{className:"excalidraw__embeddable-hint",children:r0("buttons.embeddableInteractionButton")}),d("div",{className:"excalidraw__embeddable__outer",style:{padding:`${D.strokeWidth}px`},children:($Q(D)?this.props.renderEmbeddable?.(D,this.state):null)??d("iframe",{ref:(q)=>this.cacheEmbeddableRef(D,q),className:"excalidraw__embeddable",srcDoc:Q?.type==="document"?Q.srcdoc(this.state.theme):void 0,src:Q?.type!=="document"?Q?.link??"":void 0,scrolling:"no",referrerPolicy:"no-referrer-when-downgrade",title:"Excalidraw Embedded Content",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowFullScreen:!0,sandbox:`${Q?.sandbox?.allowSameOrigin?"allow-same-origin":""} allow-scripts allow-forms allow-popups allow-popups-to-escape-sandbox allow-presentation allow-downloads`})})]})},D.id)})})}toggleOverscrollBehavior(B){document.documentElement.style.overscrollBehaviorX=B.type==="pointerenter"?"none":"auto"}render(){let B=this.scene.getSelectedElements(this.state),{renderTopRightUI:C,renderCustomStats:F}=this.props,U=this.scene.getSceneNonce(),{elementsMap:D,visibleElements:Z}=this.renderer.getRenderableElements({sceneNonce:U,zoom:this.state.zoom,offsetLeft:this.state.offsetLeft,offsetTop:this.state.offsetTop,scrollX:this.state.scrollX,scrollY:this.state.scrollY,height:this.state.height,width:this.state.width,editingTextElement:this.state.editingTextElement,newElementId:this.state.newElement?.id,pendingImageElementId:this.state.pendingImageElementId});this.visibleElements=Z;let X=this.scene.getNonDeletedElementsMap(),M="setPointerCapture"in HTMLElement.prototype?!1:this.state.selectionElement||this.state.newElement||this.state.selectedElementsAreBeingDragged||this.state.resizingElement||this.state.activeTool.type==="laser"&&this.state.cursorButton==="down",K=B[0];return d("div",{className:j3("excalidraw excalidraw-container",{"excalidraw--view-mode":this.state.viewModeEnabled||this.state.openDialog?.name==="elementLinkSelector","excalidraw--mobile":this.device.editor.isMobile}),style:{"--ui-pointerEvents":M?_b.disabled:_b.enabled,"--right-sidebar-width":"302px"},ref:this.excalidrawContainerRef,onDrop:this.handleAppOnDrop,tabIndex:0,onKeyDown:this.props.handleKeyboardGlobally?void 0:this.onKeyDown,onPointerEnter:this.toggleOverscrollBehavior,onPointerLeave:this.toggleOverscrollBehavior,children:d(nU1.Provider,{value:this,children:d(sU1.Provider,{value:this.props,children:d(N$u.Provider,{value:this.excalidrawContainerValue,children:d(I$u.Provider,{value:this.device,children:d(x$u.Provider,{value:this.setAppState,children:d(T$u.Provider,{value:this.state,children:c0(k$u.Provider,{value:this.scene.getNonDeletedElements(),children:[c0(v$u.Provider,{value:this.actionManager,children:[d(KY9,{canvas:this.canvas,appState:this.state,files:this.files,setAppState:this.setAppState,actionManager:this.actionManager,elements:this.scene.getNonDeletedElements(),onLockToggle:this.toggleLock,onPenModeToggle:this.togglePenMode,onHandToolToggle:this.onHandToolToggle,langCode:CL0().code,renderTopRightUI:C,renderCustomStats:F,showExitZenModeBtn:typeof this.props?.zenModeEnabled>"u"&&this.state.zenModeEnabled,UIOptions:this.props.UIOptions,onExportImage:this.onExportImage,renderWelcomeScreen:!this.state.isLoading&&this.state.showWelcomeScreen&&this.state.activeTool.type==="selection"&&!this.state.zenModeEnabled&&!this.scene.getElementsIncludingDeleted().length,app:this,isCollaborating:this.props.isCollaborating,generateLinkForSelection:this.props.generateLinkForSelection,children:this.props.children}),d("div",{className:"excalidraw-textEditorContainer"}),d("div",{className:"excalidraw-contextMenuContainer"}),d("div",{className:"excalidraw-eye-dropper-container"}),d(cY9,{trails:[this.laserTrails,this.eraserTrail]}),B.length===1&&this.state.openDialog?.name!=="elementLinkSelector"&&this.state.showHyperlinkPopup&&d(iQ9,{element:K,elementsMap:X,setAppState:this.setAppState,onLinkOpen:this.props.onLinkOpen,setToast:this.setToast,updateEmbedValidationStatus:this.updateEmbedValidationStatus},K.id),this.props.aiEnabled!==!1&&B.length===1&&DQ0(K)&&d(FA1,{element:K,elementsMap:D,children:d(m_u,{title:r0("labels.convertToCode"),icon:VRu,checked:!1,onChange:()=>this.onMagicFrameGenerate(K,"button")})}),B.length===1&&hl(K)&&K.customData?.generationData?.status==="done"&&c0(FA1,{element:K,elementsMap:D,children:[d(m_u,{title:r0("labels.copySource"),icon:Rn0,checked:!1,onChange:()=>this.onIframeSrcCopy(K)}),d(m_u,{title:"Enter fullscreen",icon:yT3,checked:!1,onChange:()=>{let Q=this.getHTMLIFrameElement(K);if(Q)try{Q.requestFullscreen(),this.setState({activeEmbeddable:{element:K,state:"active"},selectedElementIds:{[K.id]:!0},newElement:null,selectionElement:null})}catch(G){console.warn(G),this.setState({errorMessage:"Couldn't enter fullscreen"})}}})]}),this.state.toast!==null&&d(QY9,{message:this.state.toast.message,onClose:()=>this.setToast(null),duration:this.state.toast.duration,closable:this.state.toast.closable}),this.state.contextMenu&&d(QL9,{items:this.state.contextMenu.items,top:this.state.contextMenu.top,left:this.state.contextMenu.left,actionManager:this.actionManager,onClose:(Q)=>{this.setState({contextMenu:null},()=>{this.focusContainer(),Q?.()})}}),d(sY9,{canvas:this.canvas,rc:this.rc,elementsMap:D,allElementsMap:X,visibleElements:Z,sceneNonce:U,selectionNonce:this.state.selectionElement?.versionNonce,scale:window.devicePixelRatio,appState:this.state,renderConfig:{imageCache:this.imageCache,isExporting:!1,renderGrid:Q20(this),canvasBackgroundColor:this.state.viewBackgroundColor,embedsValidationStatus:this.embedsValidationStatus,elementsPendingErasure:this.elementsPendingErasure,pendingFlowchartNodes:this.flowChartCreator.pendingNodes}}),this.state.newElement&&d(zq9,{appState:this.state,scale:window.devicePixelRatio,rc:this.rc,elementsMap:D,allElementsMap:X,renderConfig:{imageCache:this.imageCache,isExporting:!1,renderGrid:!1,canvasBackgroundColor:this.state.viewBackgroundColor,embedsValidationStatus:this.embedsValidationStatus,elementsPendingErasure:this.elementsPendingErasure,pendingFlowchartNodes:null}}),d(pY9,{containerRef:this.excalidrawContainerRef,canvas:this.interactiveCanvas,elementsMap:D,visibleElements:Z,allElementsMap:X,selectedElements:B,sceneNonce:U,selectionNonce:this.state.selectionElement?.versionNonce,scale:window.devicePixelRatio,appState:this.state,device:this.device,renderInteractiveSceneCallback:this.renderInteractiveSceneCallback,handleCanvasRef:this.handleInteractiveCanvasRef,onContextMenu:this.handleCanvasContextMenu,onPointerMove:this.handleCanvasPointerMove,onPointerUp:this.handleCanvasPointerUp,onPointerCancel:this.removePointer,onTouchMove:this.handleTouchMove,onPointerDown:this.handleCanvasPointerDown,onDoubleClick:this.handleCanvasDoubleClick}),this.state.userToFollow&&d(aY9,{width:this.state.width,height:this.state.height,userToFollow:this.state.userToFollow,onDisconnect:this.maybeUnfollowRemoteUser}),this.renderFrameNames()]}),this.renderEmbeddables()]})})})})})})})})}setPlugins(B){Object.assign(this.plugins,B)}async onMagicFrameGenerate(B,C){let F=this.plugins.diagramToCode?.generate;if(!F){this.setState({errorMessage:"No diagram to code plugin found"});return}let U=qs0(this.scene.getNonDeletedElements(),B).filter((Z)=>!DQ0(Z));if(!U.length){C==="button"?(this.setState({errorMessage:"Cannot generate from an empty frame"}),CC("ai","generate (no-children)","d2c")):this.setActiveTool({type:"magicframe"});return}let D=this.insertIframeElement({sceneX:B.x+B.width+30,sceneY:B.y,width:B.width,height:B.height});if(D){this.updateMagicGeneration({frameElement:D,data:{status:"pending"}}),this.setState({selectedElementIds:{[D.id]:!0}}),CC("ai","generate (start)","d2c");try{let{html:Z}=await F({frame:B,children:U});if(CC("ai","generate (success)","d2c"),!Z.trim()){this.updateMagicGeneration({frameElement:D,data:{status:"error",code:"ERR_OAI",message:"Nothing genereated :("}});return}let X=Z.includes("")&&Z.includes("")?Z.slice(Z.indexOf(""),Z.indexOf("")+7):Z;this.updateMagicGeneration({frameElement:D,data:{status:"done",html:X}})}catch(Z){CC("ai","generate (failed)","d2c"),this.updateMagicGeneration({frameElement:D,data:{status:"error",code:"ERR_OAI",message:Z.message||"Unknown error during generation"}})}}}onIframeSrcCopy(B){B.customData?.generationData?.status==="done"&&(Y20(B.customData.generationData.html),this.setToast({message:"copied to clipboard",closable:!1,duration:1500}))}clearImageShapeCache(B){let C=B??this.files;this.scene.getNonDeletedElements().forEach((F)=>{sY(F)&&C[F.fileId]&&(this.imageCache.delete(F.fileId),TA.delete(F))})}async componentDidMount(){if(this.unmounted=!1,this.excalidrawContainerValue.container=this.excalidrawContainerRef.current,y2.MODE===hQ.TEST||y2.DEV){let B=this.setState.bind(this);Object.defineProperties(window.h,{state:{configurable:!0,get:()=>this.state},setState:{configurable:!0,value:(...C)=>this.setState(...C)},app:{configurable:!0,value:this},history:{configurable:!0,value:this.history},store:{configurable:!0,value:this.store},fonts:{configurable:!0,value:this.fonts}})}this.store.onStoreIncrementEmitter.on((B)=>{this.history.record(B.elementsChange,B.appStateChange)}),this.scene.onUpdate(this.triggerRender),this.addEventListeners(),this.props.autoFocus&&this.excalidrawContainerRef.current&&this.focusContainer(),vv()||(this.refreshViewportBreakpoints(),this.refreshEditorBreakpoints()),Jn0&&this.excalidrawContainerRef.current&&(this.resizeObserver=new ResizeObserver(()=>{this.refreshEditorBreakpoints(),this.updateDOMRect()}),this.resizeObserver?.observe(this.excalidrawContainerRef.current)),new URLSearchParams(window.location.search.slice(1)).has("web-share-target")?this.restoreFileFromShare():this.updateDOMRect(this.initializeScene),vN3()&&!wk3()&&this.setState({errorMessage:d(qY9,{})})}componentWillUnmount(){window.launchQueue?.setConsumer(()=>{}),this.renderer.destroy(),this.scene.destroy(),this.scene=new Tv,this.fonts=new jv(this.scene),this.renderer=new AA1(this.scene),this.files={},this.imageCache.clear(),this.resizeObserver?.disconnect(),this.unmounted=!0,this.removeEventListeners(),this.library.destroy(),this.laserTrails.stop(),this.eraserTrail.stop(),this.onChangeEmitter.clear(),this.store.onStoreIncrementEmitter.clear(),TA.destroy(),lv.destroy(),clearTimeout(Pg),sD.clearCache(),NK.clearCache(),Pg=0,document.documentElement.style.overscrollBehaviorX=""}removeEventListeners(){this.onRemoveEventListenersEmitter.trigger()}addEventListeners(){this.removeEventListeners(),this.props.handleKeyboardGlobally&&this.onRemoveEventListenersEmitter.once(xA(document,"keydown",this.onKeyDown,!1)),this.onRemoveEventListenersEmitter.once(xA(this.excalidrawContainerRef.current,"wheel",this.handleWheel,{passive:!1}),xA(window,"message",this.onWindowMessage,!1),xA(document,"pointerup",this.removePointer,{passive:!1}),xA(document,"copy",this.onCopy,{passive:!1}),xA(document,"keyup",this.onKeyUp,{passive:!0}),xA(document,"pointermove",this.updateCurrentCursorPosition,{passive:!1}),xA(document.fonts,"loadingdone",(B)=>{let C=B.fontfaces;this.fonts.onLoaded(C)},{passive:!1}),xA(document,"gesturestart",this.onGestureStart,!1),xA(document,"gesturechange",this.onGestureChange,!1),xA(document,"gestureend",this.onGestureEnd,!1),xA(window,"focus",()=>{this.maybeCleanupAfterMissingPointerUp(null),this.triggerRender(!0)},{passive:!1})),!this.state.viewModeEnabled&&(this.onRemoveEventListenersEmitter.once(xA(document,"fullscreenchange",this.onFullscreenChange,{passive:!1}),xA(document,"paste",this.pasteFromClipboard,{passive:!1}),xA(document,"cut",this.onCut,{passive:!1}),xA(window,"resize",this.onResize,!1),xA(window,"unload",this.onUnload,!1),xA(window,"blur",this.onBlur,!1),xA(this.excalidrawContainerRef.current,"wheel",this.handleWheel,{passive:!1}),xA(this.excalidrawContainerRef.current,"dragover",this.disableEvent,!1),xA(this.excalidrawContainerRef.current,"drop",this.disableEvent,!1)),this.props.detectScroll&&this.onRemoveEventListenersEmitter.once(xA(Kk3(this.excalidrawContainerRef.current),"scroll",this.onScroll,{passive:!1})))}componentDidUpdate(B,C){this.updateEmbeddables();let F=this.scene.getElementsIncludingDeleted(),U=this.scene.getElementsMapIncludingDeleted(),D=this.scene.getNonDeletedElementsMap();!this.state.showWelcomeScreen&&!F.length&&this.setState({showWelcomeScreen:!0}),B.UIOptions.dockedSidebarBreakpoint!==this.props.UIOptions.dockedSidebarBreakpoint&&this.refreshEditorBreakpoints(),C.userToFollow&&!this.state.collaborators.has(C.userToFollow.socketId)&&this.maybeUnfollowRemoteUser(),(C.zoom.value!==this.state.zoom.value||C.scrollX!==this.state.scrollX||C.scrollY!==this.state.scrollY)&&(this.props?.onScrollChange?.(this.state.scrollX,this.state.scrollY,this.state.zoom),this.onScrollChangeEmitter.trigger(this.state.scrollX,this.state.scrollY,this.state.zoom)),C.userToFollow!==this.state.userToFollow&&(C.userToFollow&&this.onUserFollowEmitter.trigger({userToFollow:C.userToFollow,action:"UNFOLLOW"}),this.state.userToFollow&&this.onUserFollowEmitter.trigger({userToFollow:this.state.userToFollow,action:"FOLLOW"})),Object.keys(this.state.selectedElementIds).length&&AN(this.state)&&this.setState({activeTool:bU(this.state,{type:"selection"})}),this.state.activeTool.type==="eraser"&&C.theme!==this.state.theme&&Jlu(this.interactiveCanvas,this.state.theme),C.activeTool.type==="selection"&&this.state.activeTool.type!=="selection"&&this.state.showHyperlinkPopup&&this.setState({showHyperlinkPopup:!1}),B.langCode!==this.props.langCode&&this.updateLanguage(),AN(C)&&!AN(this.state)&&this.eraserTrail.endPath(),B.viewModeEnabled!==this.props.viewModeEnabled&&this.setState({viewModeEnabled:!!this.props.viewModeEnabled}),C.viewModeEnabled!==this.state.viewModeEnabled&&(this.addEventListeners(),this.deselectElements()),(C.openDialog?.name==="elementLinkSelector"||this.state.openDialog?.name==="elementLinkSelector")&&C.openDialog?.name!==this.state.openDialog?.name&&(this.deselectElements(),this.setState({hoveredElementIds:{}})),B.zenModeEnabled!==this.props.zenModeEnabled&&this.setState({zenModeEnabled:!!this.props.zenModeEnabled}),B.theme!==this.props.theme&&this.props.theme&&this.setState({theme:this.props.theme}),this.excalidrawContainerRef.current?.classList.toggle("theme--dark",this.state.theme===C7.DARK),this.state.editingLinearElement&&!this.state.selectedElementIds[this.state.editingLinearElement.elementId]&&setTimeout(()=>{this.state.editingLinearElement&&this.actionManager.executeAction(TN)}),this.state.editingTextElement?.isDeleted&&this.setState({editingTextElement:null}),this.state.selectedLinearElement&&!this.state.selectedElementIds[this.state.selectedLinearElement.elementId]&&this.setState({selectedLinearElement:null});let{multiElement:Z}=C;C.activeTool!==this.state.activeTool&&Z!=null&&Ti(this.state)&&dI(Z,!1)&&on0(Z,this.state,yO(L6.getPointAtIndexGlobalCoordinates(Z,-1,D)),this.scene.getNonDeletedElementsMap(),this.scene.getNonDeletedElements()),this.store.commit(U,this.state),this.state.isLoading||(this.props.onChange?.(F,this.state,this.files),this.onChangeEmitter.trigger(F,this.state,this.files))}static resetTapTwice(){oG0=!1}async addElementsFromMixedContentPaste(B,{isPlainPaste:C,sceneX:F,sceneY:U}){if(!C&&B.some((D)=>D.type==="imageUrl")&&this.isToolSupported("image")){let D=B.filter((G)=>G.type==="imageUrl").map((G)=>G.value),Z=await Promise.all(D.map(async(G)=>{try{return{file:await GV3(G)}}catch(W){let q=W.message;return W.cause==="FETCH_ERROR"?q=r0("errors.failedToFetchImage"):W.cause==="UNSUPPORTED"&&(q=r0("errors.unsupportedFileType")),{errorMessage:q}}})),X=U,M=!1,K={};for(let G of Z)if(G.file){let W=this.createImageElement({sceneX:F,sceneY:X}),q=await this.insertImageElement(W,G.file);q&&(M||(M=!0,X-=q.height/2),V3(q,{y:X},!1),X=W.y+W.height+25,K[W.id]=!0)}this.setState({selectedElementIds:pB(K,this.state)});let Q=Z.find((G)=>!!G.errorMessage);Q&&Q.errorMessage&&this.setState({errorMessage:Q.errorMessage})}else{let D=B.filter((Z)=>Z.type==="text");D.length&&this.addTextFromPaste(D.map((Z)=>Z.value).join(` `),C)}}addTextFromPaste(B,C=!1){let{x:F,y:U}=EC({clientX:this.lastViewportPosition.x,clientY:this.lastViewportPosition.y},this.state),D={x:F,y:U,strokeColor:this.state.currentItemStrokeColor,backgroundColor:this.state.currentItemBackgroundColor,fillStyle:this.state.currentItemFillStyle,strokeWidth:this.state.currentItemStrokeWidth,strokeStyle:this.state.currentItemStrokeStyle,roundness:null,roughness:this.state.currentItemRoughness,opacity:this.state.currentItemOpacity,text:B,fontSize:this.state.currentItemFontSize,fontFamily:this.state.currentItemFontFamily,textAlign:E20,verticalAlign:dH0,locked:!1},Z=y8({fontSize:D.fontSize,fontFamily:D.fontFamily}),X=ii(D.fontFamily),[M,,K]=_x3(this.state),Q=Math.max(Math.min((K-M)*0.5,800),200),G=10,W=U,q=C?[B]:B.split(` -`),P=q.reduce((w,N,k)=>{let x=ob(N).trim();if(x.length){let v=this.getTopLayerFrameAtSceneCoords({x:F,y:W}),R=MM(x,Z,X),j=R.width>Q,l=j?yi(x,Z,Q):x;R=j?MM(l,Z,X):R;let y=F-R.width/2,h=W-R.height/2,_=iL({...D,x:y,y:h,text:l,originalText:x,lineHeight:X,autoResize:!j,frameId:v?v.id:null});w.push(_),W+=_.height+G}else q[k-1]?.trim()&&(W+=Z20(D.fontSize,X)+G);return w},[]);P.length!==0&&(this.scene.insertElements(P),this.setState({selectedElementIds:pB(Object.fromEntries(P.map((w)=>[w.id,!0])),this.state)}),!C&&P.length>1&&DA1===!1&&!this.device.editor.isMobile&&(this.setToast({message:r0("toast.pasteAsSingleElement",{shortcut:N3("CtrlOrCmd+Shift+V")}),duration:5000}),DA1=!0),this.store.shouldCaptureIncrement())}handleTextWysiwyg(B,{isExistingElement:C=!1}){let F=this.scene.getElementsMapIncludingDeleted(),U=(D,Z)=>{this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map((X)=>X.id===B.id&&M6(X)?Z5(X,{originalText:D,isDeleted:Z??X.isDeleted,...Klu(X,sZ(X,F),F,D)}):X)])};Eq9({id:B.id,canvas:this.canvas,getViewportCoords:(D,Z)=>{let{x:X,y:M}=iO({sceneX:D,sceneY:Z},this.state);return[X-this.state.offsetLeft,M-this.state.offsetTop]},onChange:HU((D)=>{U(D,!1),ks0(B)&&yQ(B,this.scene.getNonDeletedElementsMap())}),onSubmit:HU(({viaKeyboard:D,nextOriginalText:Z})=>{let X=!Z.trim();if(U(Z,X),!X&&D){let M=B.containerId?B.containerId:B.id;wg.flushSync(()=>{this.setState((K)=>({selectedElementIds:pB({...K.selectedElementIds,[M]:!0},K)}))})}X&&tRu(this.scene.getNonDeletedElements(),[B]),(!X||C)&&this.store.shouldCaptureIncrement(),wg.flushSync(()=>{this.setState({newElement:null,editingTextElement:null})}),this.state.activeTool.locked&&UN(this.interactiveCanvas,this.state),this.focusContainer()}),element:B,excalidrawContainer:this.excalidrawContainerRef.current,app:this,autoSelect:!this.device.isTouchScreen}),this.deselectElements(),U(B.originalText,!1)}deselectElements(){this.setState({selectedElementIds:pB({},this.state),selectedGroupIds:{},editingGroupId:null,activeEmbeddable:null})}getTextElementAtPosition(B,C){let F=this.getElementAtPosition(B,C,{includeBoundTextElement:!0});return F&&M6(F)&&!F.isDeleted?F:null}getElementAtPosition(B,C,F){let U=this.getElementsAtPosition(B,C,F?.includeBoundTextElement,F?.includeLockedElements);if(U.length>1){if(F?.preferSelected){for(let Z=U.length-1;Z>-1;Z--)if(this.state.selectedElementIds[U[Z].id])return U[Z]}let D=U[U.length-1];return db({x:B,y:C,element:D,shape:wv(D,this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold()/2,frameNameBound:w2(D)?this.frameNameBoundsCache.get(D):null})?D:U[U.length-2]}return U.length===1?U[0]:null}getElementsAtPosition(B,C,F=!1,U=!1){let D=[],Z=this.scene.getNonDeletedElementsMap();return(F&&U?this.scene.getNonDeletedElements():this.scene.getNonDeletedElements().filter((X)=>(U||!X.locked)&&(F||!(M6(X)&&X.containerId)))).filter((X)=>this.hitElement(B,C,X)).filter((X)=>{let M=_Q(X,Z);return M&&this.state.frameRendering.enabled&&this.state.frameRendering.clip?$lu({x:B,y:C},M,Z):!0}).filter((X)=>hl(X)?(D.push(X),!1):!0).concat(D)}getElementHitThreshold(){return mN3/this.state.zoom.value}hitElement(B,C,F,U=!0){if(U&&this.state.selectedElementIds[F.id]&&blu([F],this.state)){let D=Kx3(F,this.scene.getNonDeletedElementsMap(),gB(F)?0:this.getElementHitThreshold());if(pH0(v0(B,C),D))return!0}return yRu(B,C,_Ru(F,this.scene.getNonDeletedElementsMap()))?!0:db({x:B,y:C,element:F,shape:wv(F,this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold(),frameNameBound:w2(F)?this.frameNameBoundsCache.get(F):null})}getTextBindableContainerAtPosition(B,C){let F=this.scene.getNonDeletedElements(),U=this.scene.getSelectedElements(this.state);if(U.length===1)return hi(U[0],!1)?U[0]:null;let D=null;for(let Z=F.length-1;Z>=0;--Z){if(F[Z].isDeleted)continue;let[X,M,K,Q]=b2(F[Z],this.scene.getNonDeletedElementsMap());if(L5(F[Z])&&db({x:B,y:C,element:F[Z],shape:wv(F[Z],this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold()})){D=F[Z];break}else if(X=0)||X?_8(this.interactiveCanvas,O8.POINTER):this.hitElement(C,F,D)&&_8(this.interactiveCanvas,O8.MOVE)):this.hitElement(C,F,D)&&(!P6(D)||!(D.startBinding||D.endBinding))&&_8(this.interactiveCanvas,O8.MOVE),this.state.selectedLinearElement.hoverPointIndex!==Z&&this.setState({selectedLinearElement:{...this.state.selectedLinearElement,hoverPointIndex:Z}}),L6.arePointsEqual(this.state.selectedLinearElement.segmentMidPointHoveredCoords,X)||this.setState({selectedLinearElement:{...this.state.selectedLinearElement,segmentMidPointHoveredCoords:X}})}else _8(this.interactiveCanvas,O8.AUTO)}updateGestureOnPointerDown(B){B8.pointers.set(B.pointerId,{x:B.clientX,y:B.clientY}),B8.pointers.size===2&&(B8.lastCenter=TC1(B8.pointers),B8.initialScale=this.state.zoom.value,B8.initialDistance=xC1(Array.from(B8.pointers.values())))}initialPointerDownState(B){let C=EC(B,this.state),F=this.scene.getSelectedElements(this.state),[U,D,Z,X]=eB(F),M=F.findIndex(P6)===0;return{origin:C,withCmdOrCtrl:B[pu.CTRL_OR_CMD],originInGrid:yO(nD(C.x,C.y,B[pu.CTRL_OR_CMD]||M?null:this.getEffectiveGridSize())),scrollbars:RC1(__u,B.clientX-this.state.offsetLeft,B.clientY-this.state.offsetTop),lastCoords:{...C},originalElements:this.scene.getNonDeletedElements().reduce((K,Q)=>(K.set(Q.id,ri(Q)),K),new Map),resize:{handleType:!1,isResizing:!1,offset:{x:0,y:0},arrowDirection:"origin",center:{x:(Z+U)/2,y:(X+D)/2}},hit:{element:null,allHitElements:[],wasAddedToSelection:!1,hasBeenDuplicated:!1,hasHitCommonBoundingBoxOfSelectedElements:this.isHittingCommonBoundingBoxOfSelectedElements(C,F)},drag:{hasOccurred:!1,offset:null},eventListeners:{onMove:null,onUp:null,onKeyUp:null,onKeyDown:null},boxSelection:{hasOccurred:!1}}}handleDraggingScrollBar(B,C){if(!(C.scrollbars.isOverEither&&!this.state.multiElement))return!1;y_u=!0,C.lastCoords.x=B.clientX,C.lastCoords.y=B.clientY;let F=R_u((D)=>{D.target instanceof HTMLElement&&this.handlePointerMoveOverScrollbars(D,C)}),U=HU(()=>{tG0=null,y_u=!1,UN(this.interactiveCanvas,this.state),this.setState({cursorButton:"up"}),this.savePointer(B.clientX,B.clientY,"up"),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",U),F.flush()});return tG0=U,window.addEventListener("pointermove",F),window.addEventListener("pointerup",U),!0}isASelectedElement(B){return B!=null&&this.state.selectedElementIds[B.id]}isHittingCommonBoundingBoxOfSelectedElements(B,C){if(C.length<2)return!1;let F=this.getElementHitThreshold(),[U,D,Z,X]=eB(C);return B.x>U-F&&B.xD-F&&B.y{this.maybeHandleResize(B,C)||this.maybeDragNewGenericElement(B,C)})}onKeyUpFromPointerDownHandler(B){return HU((C)=>{C.key===pu.ALT&&C.preventDefault(),!this.maybeHandleResize(B,C)&&this.maybeDragNewGenericElement(B,C)})}onPointerMoveFromPointerDownHandler(B){return R_u((C)=>{if(this.state.openDialog?.name==="elementLinkSelector")return;let F=EC(C,this.state);if(this.state.selectedLinearElement&&this.state.selectedLinearElement.elbowed&&this.state.selectedLinearElement.pointerDownState.segmentMidpoint.index){let[Q,G]=nD(F.x,F.y,C[pu.CTRL_OR_CMD]?null:this.getEffectiveGridSize()),W=this.state.selectedLinearElement.pointerDownState.segmentMidpoint.index;if(W<0){let P=L6.getSegmentMidpointHitCoords({...this.state.selectedLinearElement,segmentMidPointHoveredCoords:null},{x:Q,y:G},this.state,this.scene.getNonDeletedElementsMap());W=P?L6.getSegmentMidPointIndex(this.state.selectedLinearElement,this.state,P,this.scene.getNonDeletedElementsMap()):-1}let q=L6.moveFixedSegment(this.state.selectedLinearElement,W,Q,G,this.scene.getNonDeletedElementsMap());wg.flushSync(()=>{this.state.selectedLinearElement&&this.setState({selectedLinearElement:{...this.state.selectedLinearElement,segmentMidPointHoveredCoords:q.segmentMidPointHoveredCoords,pointerDownState:q.pointerDownState}})});return}let U=this.lastPointerMoveCoords??B.origin;if(this.lastPointerMoveCoords=F,B.drag.offset===null&&(B.drag.offset=yO(AV3(this.scene.getSelectedElements(this.state),B.origin.x,B.origin.y))),!(C.target instanceof HTMLElement)||this.handlePointerMoveOverScrollbars(C,B))return;if(AN(this.state)){this.handleEraser(C,B,F);return}this.state.activeTool.type==="laser"&&this.laserTrails.addPointToPath(F.x,F.y);let[D,Z]=nD(F.x,F.y,C[pu.CTRL_OR_CMD]?null:this.getEffectiveGridSize());if(!B.drag.hasOccurred&&(this.state.activeTool.type==="arrow"||this.state.activeTool.type==="line")&&iB(v0(F.x,F.y),v0(B.origin.x,B.origin.y)){this.state.selectedLinearElement&&this.setState({selectedLinearElement:{...this.state.selectedLinearElement,pointerDownState:G.pointerDownState,selectedPointsIndices:G.selectedPointsIndices}}),this.state.editingLinearElement&&this.setState({editingLinearElement:{...this.state.editingLinearElement,pointerDownState:G.pointerDownState,selectedPointsIndices:G.selectedPointsIndices}})});return}else if(Q.pointerDownState.segmentMidpoint.value!==null&&!Q.pointerDownState.segmentMidpoint.added)return;if(L6.handlePointDragging(C,this,F.x,F.y,(G,W)=>{this.maybeSuggestBindingsForLinearElementAtCoords(G,W)},Q,this.scene)){B.lastCoords.x=F.x,B.lastCoords.y=F.y,B.drag.hasOccurred=!0,this.state.editingLinearElement&&!this.state.editingLinearElement.isDragging&&this.setState({editingLinearElement:{...this.state.editingLinearElement,isDragging:!0}}),this.state.selectedLinearElement.isDragging||this.setState({selectedLinearElement:{...this.state.selectedLinearElement,isDragging:!0}});return}}let M=B.hit.allHitElements.some((Q)=>this.isASelectedElement(Q)),K=this.state.editingLinearElement&&C.shiftKey&&this.state.editingLinearElement.elementId===B.hit.element?.id;if((M||B.hit.hasHitCommonBoundingBoxOfSelectedElements)&&!K){let Q=this.scene.getSelectedElements(this.state);if(Q.every((P)=>P.locked))return;let G=Q.find((P)=>w2(P)),W=this.getTopLayerFrameAtSceneCoords(F),q=W&&!G?W:null;if(this.state.frameToHighlight!==q&&wg.flushSync(()=>{this.setState({frameToHighlight:q})}),B.drag.hasOccurred=!0,Q.length>0&&!B.withCmdOrCtrl&&!this.state.editingTextElement&&this.state.activeEmbeddable?.state!=="active"){let P={x:F.x-B.origin.x,y:F.y-B.origin.y},w=[...B.originalElements.values()],N=C.shiftKey;if(N){let v=Math.abs(P.x),R=Math.abs(P.y),j=N&&vR;j&&(P.x=0),l&&(P.y=0)}if(this.state.croppingElementId){let v=this.scene.getNonDeletedElementsMap().get(this.state.croppingElementId);if(v&&gB(v)&&v.crop!==null&&B.hit.element===v){let R=v.crop,j=sY(v)&&this.imageCache.get(v.fileId)?.image;if(j&&!(j instanceof Promise)){let l=LF(eX(F.x-U.x,F.y-U.y),Math.max(this.state.zoom.value,2)),[y,h,_,$,m,p]=b2(v,X),i=D9(D3(v0(y,h),v0(m,p),v.angle)),t=D9(D3(v0(_,h),v0(m,p),v.angle)),a=D9(D3(v0(y,$),v0(m,p),v.angle)),o=XM(_H0(t,i)),u0=XM(_H0(a,i)),n=eX(yju(l,o),yju(l,u0)),B0={...R,x:$5(R.x-n[0]*Math.sign(v.scale[0]),0,j.naturalWidth-R.width),y:$5(R.y-n[1]*Math.sign(v.scale[1]),0,j.naturalHeight-R.height)};V3(v,{crop:B0});return}}}this.maybeCacheVisibleGaps(C,Q),this.maybeCacheReferenceSnapPoints(C,Q);let{snapOffset:k,snapLines:x}=ax3(w,P,this,C,this.scene.getNonDeletedElementsMap());if(this.setState({snapLines:x}),this.state.editingFrame||CV3(B,Q,P,this.scene,k,C[pu.CTRL_OR_CMD]?null:this.getEffectiveGridSize()),this.setState({selectedElementsAreBeingDragged:!0,selectionElement:null}),(Q.length!==1||!P6(Q[0]))&&this.setState({suggestedBindings:cn0(Q,this.scene.getNonDeletedElementsMap(),this.state.zoom)}),C.altKey&&!B.hit.hasBeenDuplicated){B.hit.hasBeenDuplicated=!0;let v=[],R=[],j=new Map,l=new Map,y=B.hit.element,h=new Set(this.scene.getSelectedElements({selectedElementIds:this.state.selectedElementIds,includeBoundTextElement:!0,includeElementsInFrames:!0}).map((m)=>m.id)),_=this.scene.getElementsIncludingDeleted();for(let m of _){let p=h.has(m.id)||m.id===y?.id&&B.hit.wasAddedToSelection;if(Math.abs(m.x)>1e7||Math.abs(m.x)>1e7||Math.abs(m.width)>1e7||Math.abs(m.height)>1e7){console.error("Alt+dragging element in scene with invalid dimensions",m.x,m.y,m.width,m.height,p);return}if(p){let i=Qlu(this.state.editingGroupId,j,m);if(Math.abs(i.x)>1e7||Math.abs(i.x)>1e7||Math.abs(i.width)>1e7||Math.abs(i.height)>1e7){console.error("Alt+dragging duplicated element with invalid dimensions",i.x,i.y,i.width,i.height);return}let t=B.originalElements.get(m.id);if(Math.abs(t.x)>1e7||Math.abs(t.x)>1e7||Math.abs(t.width)>1e7||Math.abs(t.height)>1e7){console.error("Alt+dragging duplicated element with invalid dimensions",t.x,t.y,t.width,t.height);return}V3(i,{x:t.x,y:t.y}),B.originalElements.set(i.id,i),v.push(i),R.push(m),l.set(m.id,i.id)}else v.push(m)}let $=[...v,...R];$=this.props.onDuplicate?.($,_)||$,BN($,P2(R)),zlu(v,R,l),dRu($,R,l,"duplicatesServeAsOld"),hlu($,R,l),this.scene.replaceAllElements($),this.maybeCacheVisibleGaps(C,Q,!0),this.maybeCacheReferenceSnapPoints(C,Q,!0)}return}}if(this.state.selectionElement)B.lastCoords.x=F.x,B.lastCoords.y=F.y,this.maybeDragNewGenericElement(B,C);else{let Q=this.state.newElement;if(!Q)return;if(Q.type==="freedraw"){let G=Q.points,W=F.x-Q.x,q=F.y-Q.y,P=G.length>0&&G[G.length-1];if(!(P&&P[0]===W&&P[1]===q)){let w=Q.simulatePressure?Q.pressures:[...Q.pressures,C.pressure];V3(Q,{points:[...G,v0(W,q)],pressures:w},!1),this.setState({newElement:Q})}}else if(d2(Q)){B.drag.hasOccurred=!0;let G=Q.points,W=D-Q.x,q=Z-Q.y;d90(C)&&G.length===2&&({width:W,height:q}=Ps0(Q.x,Q.y,F.x,F.y)),G.length===1?V3(Q,{points:[...G,v0(W,q)]},!1):(G.length===2||G.length>1&&P6(Q))&&V3(Q,{points:[...G.slice(0,-1),v0(W,q)]},!1,{isDragging:!0}),this.setState({newElement:Q}),dI(Q,!1)&&this.maybeSuggestBindingsForLinearElementAtCoords(Q,[F],this.state.startBoundElement)}else B.lastCoords.x=F.x,B.lastCoords.y=F.y,this.maybeDragNewGenericElement(B,C,!1)}if(this.state.activeTool.type==="selection"){B.boxSelection.hasOccurred=!0;let Q=this.scene.getNonDeletedElements();if(this.state.editingLinearElement)L6.handleBoxSelection(C,this.state,this.setState.bind(this),this.scene.getNonDeletedElementsMap());else{let G=!0;!C.shiftKey&&sD(Q,this.state)&&(B.withCmdOrCtrl&&B.hit.element?this.setState((q)=>NK({...q,selectedElementIds:{[B.hit.element.id]:!0}},this.scene.getNonDeletedElements(),q,this)):G=!1);let W=this.state.selectionElement?Os0(Q,this.state.selectionElement,this.scene.getNonDeletedElementsMap(),!1):[];this.setState((q)=>{let P={...G&&q.selectedElementIds,...W.reduce((w,N)=>(w[N.id]=!0,w),{})};return B.hit.element&&(W.length?delete P[B.hit.element.id]:P[B.hit.element.id]=!0),q=G?q:{...q,selectedGroupIds:{},editingGroupId:null},{...NK({editingGroupId:q.editingGroupId,selectedElementIds:P},this.scene.getNonDeletedElements(),q,this),selectedLinearElement:W.length===1&&d2(W[0])?new L6(W[0]):null,showHyperlinkPopup:W.length===1&&(W[0].link||$Q(W[0]))?"info":!1}})}}})}handlePointerMoveOverScrollbars(B,C){if(C.scrollbars.isOverHorizontal){let F=B.clientX,U=F-C.lastCoords.x;return this.translateCanvas({scrollX:this.state.scrollX-U/this.state.zoom.value}),C.lastCoords.x=F,!0}if(C.scrollbars.isOverVertical){let F=B.clientY,U=F-C.lastCoords.y;return this.translateCanvas({scrollY:this.state.scrollY-U/this.state.zoom.value}),C.lastCoords.y=F,!0}return!1}onPointerUpFromPointerDownHandler(B){return HU((C)=>{this.removePointer(C),B.eventListeners.onMove&&B.eventListeners.onMove.flush();let{newElement:F,resizingElement:U,croppingElementId:D,multiElement:Z,activeTool:X,isResizing:M,isRotating:K,isCropping:Q}=this.state;this.setState((w)=>({isResizing:!1,isRotating:!1,isCropping:!1,resizingElement:null,selectionElement:null,frameToHighlight:null,elementsToHighlight:null,cursorButton:"up",snapLines:z20(w.snapLines,[]),originSnapOffset:null})),this.lastPointerMoveCoords=null,lv.setReferenceSnapPoints(null),lv.setVisibleGaps(null),this.savePointer(C.clientX,C.clientY,"up"),this.setState({selectedElementsAreBeingDragged:!1});let G=this.scene.getNonDeletedElementsMap();if(B.drag.hasOccurred&&B.hit?.element?.id){let w=G.get(B.hit.element.id);pO(w)&&w.boundElements?.filter((N)=>N.type==="arrow").map((N)=>G.get(N.id)).filter((N)=>P6(N)).forEach((N)=>{N&&V3(N,{},!0)})}if(this.state.editingLinearElement)if(!B.boxSelection.hasOccurred&&B.hit?.element?.id!==this.state.editingLinearElement.elementId)this.actionManager.executeAction(TN);else{let w=L6.handlePointerUp(C,this.state.editingLinearElement,this.state,this.scene);w!==this.state.editingLinearElement&&this.setState({editingLinearElement:w,suggestedBindings:[]})}else if(this.state.selectedLinearElement){if(this.state.selectedLinearElement.elbowed){let w=L6.getElement(this.state.selectedLinearElement.elementId,this.scene.getNonDeletedElementsMap());w&&V3(w,{},!0)}if(B.hit?.element?.id!==this.state.selectedLinearElement.elementId)this.scene.getSelectedElements(this.state).length>1&&this.setState({selectedLinearElement:null});else{let w=L6.handlePointerUp(C,this.state.selectedLinearElement,this.state,this.scene),{startBindingElement:N,endBindingElement:k}=w,x=this.scene.getElement(w.elementId);dI(x)&&GQ0(x,N,k,G,this.scene),w!==this.state.selectedLinearElement&&this.setState({selectedLinearElement:{...w,selectedPointsIndices:null},suggestedBindings:[]})}}if(this.missingPointerEventCleanupEmitter.clear(),window.removeEventListener("pointermove",B.eventListeners.onMove),window.removeEventListener("pointerup",B.eventListeners.onUp),window.removeEventListener("keydown",B.eventListeners.onKeyDown),window.removeEventListener("keyup",B.eventListeners.onKeyUp),this.state.pendingImageElementId&&this.setState({pendingImageElementId:null}),this.props?.onPointerUp?.(X,B),this.onPointerUpEmitter.trigger(this.state.activeTool,B,C),F?.type==="freedraw"){let w=EC(C,this.state),N=F.points,k=w.x-F.x,x=w.y-F.y;k===N[0][0]&&x===N[0][1]&&(x+=0.0001,k+=0.0001);let v=F.simulatePressure?[]:[...F.pressures,C.pressure];V3(F,{points:[...N,v0(k,x)],pressures:v,lastCommittedPoint:v0(k,x)}),this.actionManager.executeAction(TN);return}if(gB(F)){let w=F;try{this.initializeImageDimensions(w),this.setState({selectedElementIds:pB({[w.id]:!0},this.state)},()=>{this.actionManager.executeAction(TN)})}catch(N){console.error(N),this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().filter((k)=>k.id!==w.id)),this.actionManager.executeAction(TN)}return}if(d2(F)){F.points.length>1&&this.store.shouldCaptureIncrement();let w=EC(C,this.state);!B.drag.hasOccurred&&F&&!Z?(V3(F,{points:[...F.points,v0(w.x-F.x,w.y-F.y)]}),this.setState({multiElement:F,newElement:F})):B.drag.hasOccurred&&!Z&&(Ti(this.state)&&dI(F,!1)&&on0(F,this.state,w,this.scene.getNonDeletedElementsMap(),this.scene.getNonDeletedElements()),this.setState({suggestedBindings:[],startBoundElement:null}),X.locked?this.setState((N)=>({newElement:null})):(cO(this.interactiveCanvas),this.setState((N)=>({newElement:null,activeTool:bU(this.state,{type:"selection"}),selectedElementIds:pB({...N.selectedElementIds,[F.id]:!0},N),selectedLinearElement:new L6(F)}))),this.scene.triggerUpdate());return}if(M6(F)){let w=On0(y8({fontSize:F.fontSize,fontFamily:F.fontFamily}),F.lineHeight);F.widthw.id!==F.id),appState:{newElement:null},captureUpdate:J3.NEVER});return}if(w2(F)){let w=ov3(this.scene.getElementsIncludingDeleted(),F,this.scene.getNonDeletedElementsMap());this.scene.replaceAllElements(S20(this.scene.getElementsMapIncludingDeleted(),w,F,this.state))}if(F&&(V3(F,slu(F)),this.scene.triggerUpdate()),B.drag.hasOccurred){let w=EC(C,this.state);if(this.state.selectedLinearElement&&this.state.selectedLinearElement.isDragging){let N=this.scene.getElement(this.state.selectedLinearElement.elementId);if(N?.frameId){let k=_Q(N,G);k&&N&&(ll(N,k,this.scene.getNonDeletedElementsMap())||(V3(N,{groupIds:[]}),xQ0([N],this.scene.getNonDeletedElementsMap()),this.scene.triggerUpdate()))}}else{let N=this.getTopLayerFrameAtSceneCoords(w),k=this.scene.getSelectedElements(this.state),x=this.scene.getElementsMapIncludingDeleted(),v=(R)=>{if(R.length>0){for(let j of R){let l=j.groupIds.indexOf(this.state.editingGroupId);V3(j,{groupIds:j.groupIds.slice(0,l)},!1)}x.forEach((j)=>{j.groupIds.length&&xC(x,j.groupIds[j.groupIds.length-1]).length<2&&V3(j,{groupIds:[]},!1)}),this.setState({editingGroupId:null})}};if(N&&!this.state.selectedElementIds[N.id]){let R=k.filter((j)=>j.frameId!==N.id&&vQ0(j,x,this.state));this.state.editingGroupId&&v(R),x=S20(x,R,N,this.state)}else if(!N&&this.state.editingGroupId){let R=k.filter((j)=>j.frameId&&!vQ0(j,x,this.state));v(R)}x=ud(x,this.state,this),this.scene.replaceAllElements(x)}}if(U&&this.store.shouldCaptureIncrement(),U&&Bd(U)&&this.updateScene({elements:this.scene.getElementsIncludingDeleted().filter((w)=>w.id!==U.id),captureUpdate:J3.NEVER}),B.resize.isResizing){let w=ud(this.scene.getElementsIncludingDeleted(),this.state,this),N=this.scene.getSelectedElements(this.state).filter((k)=>w2(k));for(let k of N)w=glu(w,TQ0(this.scene.getElementsIncludingDeleted(),k,this.state,G),k,this);this.scene.replaceAllElements(w)}let W=B.hit.element;this.state.selectedLinearElement?.elementId!==W?.id&&d2(W)&&this.scene.getSelectedElements(this.state).length===1&&this.setState({selectedLinearElement:new L6(W)}),(!D||D&&(!W&&!Q||W&&W.id!==D))&&this.finishImageCropping();let q=this.lastPointerDownEvent,P=this.lastPointerUpEvent||this.lastPointerMoveEvent;if(AN(this.state)&&q&&P){if(this.eraserTrail.endPath(),iB(v0(q.clientX,q.clientY),v0(P.clientX,P.clientY))===0){let w=EC({clientX:P.clientX,clientY:P.clientY},this.state);this.getElementsAtPosition(w.x,w.y).forEach((N)=>this.elementsPendingErasure.add(N.id))}this.eraseElements();return}else this.elementsPendingErasure.size&&this.restoreReadyToEraseElements();if(W&&!B.drag.hasOccurred&&!B.hit.wasAddedToSelection&&(!this.state.editingLinearElement||!B.boxSelection.hasOccurred)&&(C.shiftKey&&!this.state.editingLinearElement?this.state.selectedElementIds[W.id]?Blu(this.state,W)?this.setState((w)=>{let N={...w.selectedElementIds};for(let k of W.groupIds.flatMap((x)=>xC(this.scene.getNonDeletedElements(),x)))delete N[k.id];return{selectedGroupIds:{...w.selectedElementIds,...W.groupIds.map((k)=>({[k]:!1})).reduce((k,x)=>({...k,...x}),{})},selectedElementIds:pB(N,w)}}):this.state.selectedLinearElement?.isDragging||this.setState((w)=>{let N={...w.selectedElementIds};delete N[W.id];let k=W5(this.scene.getNonDeletedElements(),{selectedElementIds:N});return{...NK({editingGroupId:w.editingGroupId,selectedElementIds:N},this.scene.getNonDeletedElements(),w,this),selectedLinearElement:k.length===1&&d2(k[0])?new L6(k[0]):w.selectedLinearElement}}):W.frameId&&this.state.selectedElementIds[W.frameId]?this.setState((w)=>{let N={...w.selectedElementIds,[W.id]:!0};return delete N[W.frameId],(this.scene.getElement(W.frameId)?.groupIds??[]).flatMap((k)=>xC(this.scene.getNonDeletedElements(),k)).forEach((k)=>{delete N[k.id]}),{...NK({editingGroupId:w.editingGroupId,selectedElementIds:N},this.scene.getNonDeletedElements(),w,this),showHyperlinkPopup:W.link||$Q(W)?"info":!1}}):this.setState((w)=>({selectedElementIds:pB({...w.selectedElementIds,[W.id]:!0},w)})):this.setState((w)=>({...NK({editingGroupId:w.editingGroupId,selectedElementIds:{[W.id]:!0}},this.scene.getNonDeletedElements(),w,this),selectedLinearElement:d2(W)&&w.selectedLinearElement?.elementId!==W.id?new L6(W):w.selectedLinearElement}))),!(W&&P6(W))&&!B.drag.hasOccurred&&!this.state.isResizing&&(W&&Yx3({x:B.origin.x,y:B.origin.y,element:W,shape:wv(W,this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold(),frameNameBound:w2(W)?this.frameNameBoundsCache.get(W):null},G)||!W&&B.hit.hasHitCommonBoundingBoxOfSelectedElements)){this.state.editingLinearElement?this.setState({editingLinearElement:null}):this.setState({selectedElementIds:pB({},this.state),selectedGroupIds:{},editingGroupId:null,activeEmbeddable:null}),_8(this.interactiveCanvas,O8.AUTO);return}if(!X.locked&&X.type!=="freedraw"&&F&&this.setState((w)=>({selectedElementIds:pB({...w.selectedElementIds,[F.id]:!0},w),showHyperlinkPopup:$Q(F)&&!F.link?"editor":w.showHyperlinkPopup})),(X.type!=="selection"||sD(this.scene.getNonDeletedElements(),this.state)||!uJ(this.state.previousSelectedElementIds,this.state.selectedElementIds))&&this.store.shouldCaptureIncrement(),B.drag.hasOccurred||M||K||Q){let w=this.scene.getSelectedElements(this.state).filter(d2);LQ0(w,this.scene.getNonDeletedElementsMap(),this.scene.getNonDeletedElements(),this.scene,Ti(this.state),this.state.selectedLinearElement?.selectedPointsIndices??[],this.state.zoom)}if(X.type==="laser"){this.laserTrails.endPath();return}!X.locked&&X.type!=="freedraw"?(cO(this.interactiveCanvas),this.setState({newElement:null,suggestedBindings:[],activeTool:bU(this.state,{type:"selection"})})):this.setState({newElement:null,suggestedBindings:[]}),W&&this.lastPointerUpEvent&&this.lastPointerDownEvent&&this.lastPointerUpEvent.timeStamp-this.lastPointerDownEvent.timeStamp<300&&B8.pointers.size<=1&&gY(W)&&this.isIframeLikeElementCenter(W,this.lastPointerUpEvent,B.origin.x,B.origin.y)&&this.handleEmbeddableCenterClick(W)})}clearSelection(B){this.setState((C)=>({selectedElementIds:pB({},C),activeEmbeddable:null,selectedGroupIds:{},editingGroupId:C.editingGroupId&&B!=null&&H20(B,C.editingGroupId)?C.editingGroupId:null})),this.setState({selectedElementIds:pB({},this.state),activeEmbeddable:null,previousSelectedElementIds:this.state.selectedElementIds})}getTextWysiwygSnappedToCenterPosition(B,C,F,U){if(U){let D=U.x+U.width/2,Z=U.y+U.height/2,X=en0(U,F,this.scene.getNonDeletedElementsMap());if(X&&(D=X.x,Z=X.y),Math.hypot(B-D,C-Z)C.code===this.props.langCode)||T50;await XA1(B),this.setAppState({})}},Xq9=()=>{(y2.MODE===hQ.TEST||y2.DEV)&&(window.h=window.h||{},Object.defineProperties(window.h,{elements:{configurable:!0,get(){return this.app?.scene.getElementsIncludingDeleted()},set(u){return this.app?.scene.replaceAllElements(fv(u))}},scene:{configurable:!0,get(){return this.app?.scene}}}))};Xq9();var Jq9=Zq9,Mq9=()=>{Array.prototype.at||Object.defineProperty(Array.prototype,"at",{value:function(u){if(u=Math.trunc(u)||0,u<0&&(u+=this.length),!(u<0||u>=this.length))return this[u]},writable:!0,enumerable:!1,configurable:!0}),Element.prototype.replaceChildren||(Element.prototype.replaceChildren=function(...u){this.innerHTML="",this.append(...u)})},Kq9=Mq9,Hq9=({children:u})=>{let{FooterCenterTunnel:B}=oQ(),C=LM();return d(B.In,{children:d("div",{className:j3("footer-center zen-mode-transition",{"layer-ui__wrapper__footer-left--transition-bottom":C.zenModeEnabled}),children:u})})};Hq9.displayName="FooterCenter";var Qq9=()=>d("svg",{viewBox:"0 0 40 40",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"ExcalidrawLogo-icon",children:d("path",{d:"M39.9 32.889a.326.326 0 0 0-.279-.056c-2.094-3.083-4.774-6-7.343-8.833l-.419-.472a.212.212 0 0 0-.056-.139.586.586 0 0 0-.167-.111l-.084-.083-.056-.056c-.084-.167-.28-.278-.475-.167-.782.39-1.507.973-2.206 1.528-.92.722-1.842 1.445-2.708 2.25a8.405 8.405 0 0 0-.977 1.028c-.14.194-.028.361.14.444-.615.611-1.23 1.223-1.843 1.861a.315.315 0 0 0-.084.223c0 .083.056.166.111.194l1.09.833v.028c1.535 1.528 4.244 3.611 7.12 5.861.418.334.865.667 1.284 1 .195.223.39.473.558.695.084.11.28.139.391.055.056.056.14.111.196.167a.398.398 0 0 0 .167.056.255.255 0 0 0 .224-.111.394.394 0 0 0 .055-.167c.029 0 .028.028.056.028a.318.318 0 0 0 .224-.084l5.082-5.528a.309.309 0 0 0 0-.444Zm-14.63-1.917a.485.485 0 0 0 .111.14c.586.5 1.2 1 1.843 1.555l-2.569-1.945-.251-.166c-.056-.028-.112-.084-.168-.111l-.195-.167.056-.056.055-.055.112-.111c.866-.861 2.346-2.306 3.1-3.028-.81.805-2.43 3.167-2.095 3.944Zm8.767 6.89-2.122-1.612a44.713 44.713 0 0 0-2.625-2.5c1.145.861 2.122 1.611 2.262 1.75 1.117.972 1.06.806 1.815 1.445l.921.666a1.06 1.06 0 0 1-.251.25Zm.558.416-.056-.028c.084-.055.168-.111.252-.194l-.196.222ZM1.089 5.75c.055.361.14.722.195 1.056.335 1.833.67 3.5 1.284 4.75l.252.944c.084.361.223.806.363.917 1.424 1.25 3.602 3.11 5.947 4.889a.295.295 0 0 0 .363 0s0 .027.028.027a.254.254 0 0 0 .196.084.318.318 0 0 0 .223-.084c2.988-3.305 5.221-6.027 6.813-8.305.112-.111.14-.278.14-.417.111-.111.195-.25.307-.333.111-.111.111-.306 0-.39l-.028-.027c0-.055-.028-.139-.084-.167-.698-.666-1.2-1.138-1.731-1.638-.922-.862-1.871-1.75-3.881-3.75l-.028-.028c-.028-.028-.056-.056-.112-.056-.558-.194-1.703-.389-3.127-.639C6.087 2.223 3.21 1.723.614.944c0 0-.168 0-.196.028l-.083.084c-.028.027-.056.055-.224.11h.056-.056c.028.167.028.278.084.473 0 .055.112.5.112.555l.782 3.556Zm15.496 3.278-.335-.334c.084.112.196.195.335.334Zm-3.546 4.666-.056.056c0-.028.028-.056.056-.056Zm-2.038-10c.168.167.866.834 1.033.973-.726-.334-2.54-1.167-3.379-1.445.838.167 1.983.334 2.346.472ZM1.424 2.306c.419.722.754 3.222 1.089 5.666-.196-.778-.335-1.555-.503-2.278-.251-1.277-.503-2.416-.838-3.416.056 0 .14 0 .252.028Zm-.168-.584c-.112 0-.223-.028-.307-.028 0-.027 0-.055-.028-.055.14 0 .223.028.335.083Zm-1.089.222c0-.027 0-.027 0 0ZM39.453 1.333c.028-.11-.558-.61-.363-.639.42-.027.42-.666 0-.666-.558.028-1.144.166-1.675.25-.977.194-1.982.389-2.96.61-2.205.473-4.383.973-6.561 1.557-.67.194-1.424.333-2.066.666-.224.111-.196.333-.084.472-.056.028-.084.028-.14.056-.195.028-.363.056-.558.083-.168.028-.252.167-.224.334 0 .027.028.083.028.11-1.173 1.556-2.485 3.195-3.909 4.945-1.396 1.611-2.876 3.306-4.356 5.056-4.719 5.5-10.052 11.75-15.943 17.25a.268.268 0 0 0 0 .389c.028.027.056.055.084.055-.084.084-.168.14-.252.222-.056.056-.084.111-.084.167a.605.605 0 0 0-.111.139c-.112.111-.112.305.028.389.111.11.307.11.39-.028.029-.028.029-.056.056-.056a.44.44 0 0 1 .615 0c.335.362.67.723.977 1.028l-.698-.583c-.112-.111-.307-.083-.39.028-.113.11-.085.305.027.389l7.427 6.194c.056.056.112.056.196.056s.14-.028.195-.084l.168-.166c.028.027.083.027.111.027.084 0 .14-.027.196-.083 10.052-10.055 18.15-17.639 27.42-24.417.083-.055.111-.166.111-.25.112 0 .196-.083.251-.194 1.704-5.194 2.039-9.806 2.15-12.083v-.028c0-.028.028-.056.028-.083.028-.056.028-.084.028-.084a1.626 1.626 0 0 0-.111-1.028ZM21.472 9.5c.446-.5.893-1.028 1.34-1.5-2.876 3.778-7.65 9.583-14.408 16.5 4.607-5.083 9.242-10.333 13.068-15ZM5.193 35.778h.084-.084Zm3.462 3.194c-.027-.028-.027-.028 0-.028v.028Zm4.16-3.583c.224-.25.448-.472.699-.722 0 0 0 .027.028.027-.252.223-.475.445-.726.695Zm1.146-1.111c.14-.14.279-.334.446-.5l.028-.028c1.648-1.694 3.351-3.389 5.082-5.111l.028-.028c.419-.333.921-.694 1.368-1.028a379.003 379.003 0 0 0-6.952 6.695ZM24.794 6.472c-.921 1.195-1.954 2.778-2.82 4.028-2.736 3.944-11.532 13.583-11.727 13.75a1976.983 1976.983 0 0 1-8.042 7.639l-.167.167c-.14-.167-.14-.417.028-.556C14.49 19.861 22.03 10.167 25.074 5.917c-.084.194-.14.36-.28.555Zm4.83 5.695c-1.116-.64-1.646-1.64-1.34-2.611l.084-.334c.028-.083.084-.194.14-.277.307-.5.754-.917 1.257-1.167.027 0 .055 0 .083-.028-.028-.056-.028-.139-.028-.222.028-.167.14-.278.335-.278.335 0 1.369.306 1.76.639.111.083.223.194.335.305.14.167.363.445.474.667.056.028.112.306.196.445.056.222.111.472.084.694-.028.028 0 .194-.028.194a2.668 2.668 0 0 1-.363 1.028c-.028.028-.028.056-.056.084l-.028.027c-.14.223-.335.417-.53.556-.643.444-1.369.583-2.095.389 0 0-.195-.084-.28-.111Zm8.154-.834a39.098 39.098 0 0 1-.893 3.167c0 .028-.028.083 0 .111-.056 0-.084.028-.14.056-2.206 1.61-4.356 3.305-6.506 5.028 1.843-1.64 3.686-3.306 5.613-4.945.558-.5.949-1.139 1.06-1.861l.28-1.667v-.055c.14-.334.67-.195.586.166Z",fill:"currentColor"})}),Gq9=()=>c0("svg",{viewBox:"0 0 450 55",xmlns:"http://www.w3.org/2000/svg",fill:"none",className:"ExcalidrawLogo-text",children:[d("path",{d:"M429.27 96.74c2.47-1.39 4.78-3.02 6.83-4.95 1.43-1.35 2.73-2.86 3.81-4.51-.66.9-1.4 1.77-2.23 2.59-2.91 2.84-5.72 5.09-8.42 6.87h.01ZM343.6 69.36c.33 3.13.58 6.27.79 9.4.09 1.37.18 2.75.25 4.12-.12-4.46-.27-8.93-.5-13.39-.11-2.08-.24-4.16-.4-6.24-.06 1.79-.11 3.85-.13 6.11h-.01ZM378.47 98.34c.01-.37.07-1.13.01-6.51-.11 1.9-.22 3.81-.31 5.71-.07 1.42-.22 2.91-.16 4.35.39.03.78.07 1.17.1-.92-.85-.76-2.01-.72-3.66l.01.01ZM344.09 86.12c-.09-2.41-.22-4.83-.39-7.24v12.21c.15-.05.32-.09.47-.14.05-1.61-.03-3.23-.09-4.83h.01ZM440.69 66.79c-.22-.34-.45-.67-.69-.99-3.71-4.87-9.91-7.14-15.65-8.55-1.05-.26-2.12-.49-3.18-.71 2.29.59 4.48 1.26 6.64 2.02 7.19 2.54 10.57 5.41 12.88 8.23ZM305.09 72.46l1.2 3.6c.84 2.53 1.67 5.06 2.46 7.61.24.78.5 1.57.73 2.36.22-.04.44-.08.67-.12a776.9 776.9 0 0 1-5.01-13.57c-.02.04-.03.09-.05.13v-.01ZM345.49 90.25v.31c1.48-.42 3.05-.83 4.66-1.2-1.56.25-3.12.52-4.66.89ZM371.02 90.22c0-.57-.04-1.14-.11-1.71-.06-.02-.12-.04-.19-.05-.21-.05-.43-.08-.65-.11.42.16.74.88.95 1.87ZM398.93 54.23c-.13 0-.27-.01-.4-.02l.03.4c.11-.15.23-.27.37-.38ZM401.57 62.28v-.15c-1.22-.24-2.86-.61-3.23-1.25-.09-.15-.18-.51-.27-.98-.09.37-.2.73-.33 1.09 1.24.56 2.52.98 3.83 1.29ZM421.73 88.68c-2.97 1.65-6.28 3.12-9.69 3.68v.18c4.72-.14 11.63-3.85 16.33-8.38-2.04 1.75-4.33 3.24-6.63 4.53l-.01-.01ZM411.28 80.92c-.05-1.2-.09-2.4-.15-3.6-.21 5.66-.46 11.38-.47 14.51.24-.02.48-.04.71-.07.15-3.61.05-7.23-.09-10.83v-.01Z",transform:"translate(-144.023 -51.76)"}),d("path",{d:"M425.38 67.41c-3.5-1.45-7.19-2.57-14.06-3.62.09 1.97.06 4.88-.03 8.12.03.04.06.09.06.15.19 1.36.28 2.73.37 4.1.25 3.77.39 7.55.41 11.33 0 1.38-.01 2.76-.07 4.13 1.4-.25 2.78-.65 4.12-1.15 4.07-1.5 7.94-3.78 11.28-6.54 2.33-1.92 5.13-4.49 5.88-7.58.63-3.53-2.45-6.68-7.97-8.96l.01.02ZM411.35 92.53v-.06l-.34.03c.11.01.22.03.34.03ZM314.26 64.06c-.23-.59-.47-1.17-.7-1.75.57 1.62 1.11 3.25 1.6 4.9l.15.54 2.35 6.05c.32.82.66 1.64.98 2.46-1.38-4.1-2.83-8.17-4.39-12.2h.01ZM156.82 103.07c-.18.13-.38.23-.58.33 1.32-.03 2.66-.2 3.93-.34.86-.09 1.72-.22 2.58-.33-2.12.1-4.12.17-5.94.34h.01ZM210.14 68.88s.03.04.05.07c.18-.31.39-.64.58-.96-.21.3-.42.6-.64.89h.01ZM201.65 82.8c-.5.77-1.02 1.56-1.49 2.37 1.11-1.55 2.21-3.1 3.2-4.59-.23.23-.49.51-.75.79-.32.47-.65.95-.96 1.43ZM194.03 98.66c-.33-.4-.65-.84-1.05-1.17-.24-.2-.07-.49.17-.56-.23-.26-.42-.5-.63-.75 1.51-2.55 3.93-5.87 6.4-9.28-.17-.08-.29-.28-.2-.49.04-.09.09-.17.13-.26-1.21 1.78-2.42 3.55-3.61 5.33-.87 1.31-1.74 2.64-2.54 4-.29.5-.63 1.04-.87 1.61.81.65 1.63 1.27 2.47 1.88-.09-.11-.18-.21-.27-.32v.01ZM307.79 82.93c-1-3.17-2.05-6.32-3.1-9.48-1.62 4.08-3.69 9.17-6.16 15.19 3.32-1.04 6.77-1.87 10.27-2.5-.32-1.08-.67-2.15-1.01-3.21ZM149.5 80.7c.05-1.71.04-3.43 0-5.14-.1 2.26-.16 4.51-.22 6.77-.02.73-.03 1.46-.04 2.19.14-1.27.2-2.55.24-3.82h.02ZM228.98 98.3c.39 1.25.91 3.03.94 3.91.06-.03.12-.07.17-.1.08-1.29-.55-2.65-1.11-3.81ZM307.72 53.36c.81.5 1.53 1.04 2.07 1.49-.38-.8-.78-1.58-1.21-2.35-.17.03-.34.06-.51.11-.43.12-.86.26-1.29.41.35-.01.53.1.94.34ZM283.69 96.14c3.91-7.25 6.89-13.35 8.88-18.15l1.1-2.66c-1.27 2.64-2.56 5.27-3.83 7.9-1.53 3.15-3.06 6.31-4.58 9.47-.87 1.81-1.76 3.62-2.54 5.47.04.02.07.04.11.07.05.05.1.09.15.14.05-.73.27-1.48.71-2.24ZM289.92 103.23s-.04.01-.05.03c0-.02.04-.03.05-.04.05-.05.11-.1.16-.15l.21-.21c-.55 0-1.5-.27-2.55-.72.4.26.8.51 1.22.74.24.13.48.26.73.37.05.02.1.03.14.05a.27.27 0 0 1 .08-.07h.01ZM269.23 68.49c-.39-.19-.82-.48-1.33-.87-3.06-1.56-6.31-2.78-9.36-2.35-3.5.49-5.7 1.11-7.74 2.44 5.71-2.6 12.82-2.07 18.44.79l-.01-.01ZM177.87 53.69l1.06.03c-.96-.22-2-.25-2.89-.3-4.95-.26-9.99.33-14.86 1.19-2.44.43-4.88.95-7.28 1.59 9.09-1.76 15.69-2.77 23.97-2.51ZM219.85 55.51c-.18.12-.36.27-.56.45-.45.53-.86 1.11-1.26 1.66-1.91 2.61-3.71 5.31-5.57 7.95l-.12.18 8.05-10.11c-.18-.05-.36-.1-.55-.13h.01ZM510.71 54.1c.12-.15.29-.3.53-.45.69-.4 3.72-.63 5.87-.74-.36-.02-.73-.04-1.09-.05-1.84-.03-3.67.09-5.49.35.05.3.12.59.18.88v.01ZM510.76 86.02c1.37-3.07 2.49-6.27 3.57-9.46.55-1.64 1.12-3.3 1.6-4.97-1.59 4.01-3.67 9.14-6.2 15.3.24-.08.5-.14.74-.22.1-.22.19-.44.29-.65ZM566.95 75.76c.11-.02.23.03.31.11-.05-.13-.09-.26-.14-.39-.05.09-.11.18-.17.28ZM511.33 86.41c3.08-.89 6.24-1.62 9.46-2.14-1.51-3.98-2.98-7.96-4.39-11.87-.05.15-.09.31-.14.46-1.02 3.32-2.15 6.61-3.39 9.85-.48 1.25-.98 2.49-1.53 3.7h-.01ZM578.24 74.45c.11-.44.23-.87.35-1.31-.31.7-.64 1.39-.97 2.08.09.21.19.4.28.61.12-.46.23-.92.35-1.38h-.01ZM520.62 53.11c-.09 0-.18-.01-.28-.02.38.34.29 1.08.93 2.53l6.65 17.15c2.2 5.68 4.69 11.36 7.41 16.87l1.06 2.17c-2.95-7.05-5.92-14.08-8.87-21.13-1.58-3.79-3.16-7.59-4.7-11.4-.78-1.92-1.73-3.89-2.25-5.91-.03-.1 0-.19.04-.26h.01ZM578.78 77.87c1.45-5.77 3.07-10.43 3.58-13.36.05-.34.16-.88.31-1.55-.67 1.79-1.37 3.56-2.08 5.33-.12.43-.23.86-.35 1.29-.65 2.43-1.29 4.86-1.9 7.3.14.33.29.65.43 1l.01-.01ZM545.3 94.66c.02-.44.03-.83.05-1.12.02-1.01.05-2.02.11-3.02.03-6.66-.46-14.33-1.46-22.8-.13-.42-.27-1.24-.56-2.89 0-.02 0-.04-.01-.06.62 6.61.95 13.25 1.32 19.87.17 3.08.33 6.16.52 9.23.02.25.03.52.04.78l-.01.01ZM580.77 102.81c.13.2.27.38.37.49.27-.11.53-.22.8-.32-.43.09-.82.05-1.17-.16v-.01ZM530.48 104.07h.33c-.36-.13-.71-.32-1.04-.56.14.24.3.47.45.7.06-.08.14-.13.26-.13v-.01ZM542.63 58.82c.06.23.11.47.15.71.14-.33.36-.62.7-.86-.28.05-.57.11-.85.15ZM583.81 57.87c.15-.7.29-1.41.42-2.11-.14.45-.28.9-.42 1.34-.46 1.44-.89 2.89-1.31 4.34.44-1.19.88-2.37 1.31-3.57ZM523.62 91.48c-4.66 1.17-9.05 2.89-14.02 5.27 4.65-1.84 9.48-3.29 14.28-4.63-.09-.22-.17-.41-.26-.64ZM460.64 78.3c-.04-2.9-.11-5.81-.28-8.71-.1-1.68-.17-3.43-.5-5.09-.07.02-.14.03-.2.05.3 6.54.45 12.17.51 17.12.17-.07.34-.14.51-.2 0-1.06-.01-2.11-.03-3.17h-.01ZM470.63 63.24c-3.38-.26-6.81.32-10.1 1.1.41 2.01.47 4.14.57 6.18.18 3.55.25 7.11.27 10.67 3.31-1.38 6.5-3.12 9.3-5.35 1.96-1.56 3.86-3.41 5.02-5.66.73-1.41 1.19-3.22.26-4.65-1.09-1.7-3.46-2.14-5.32-2.29ZM460.29 63.68c1-.24 2.01-.46 3.04-.65-1.15.16-2.37.38-3.71.69v.13c.07-.02.15-.04.22-.05.11-.13.3-.18.45-.11v-.01ZM457.24 100.96c.43-.03.86-.07 1.29-.11.14-.49.27-.99.38-1.49-.44.7-1 1.23-1.67 1.6ZM482.88 104.98c-.18.23-.36.38-.55.47.14.09.27.19.4.28a70.76 70.76 0 0 0 4.37-4.63c.76-.89 1.52-1.81 2.19-2.77-.3-.27-.61-.53-.92-.79-.07 1.94-4.62 6.32-5.49 7.45v-.01Z",transform:"translate(-144.023 -51.76)"}),d("path",{d:"M474.36 63.31c-.4-.16-.84-.27-1.29-.37 1.56.42 3.08 1.22 3.76 2.74.62 1.4.32 2.95-.28 4.32.7-1.22.94-2.34.74-3.47-.24-1.33-1.19-2.54-2.93-3.21v-.01ZM477.34 89.18c-1.2-.81-2.4-1.62-3.6-2.42-.14.1-.26.19-.4.29 1.4.67 2.73 1.39 4 2.13ZM465.88 93.85c.37.25.74.5 1.1.75.46.32.92.65 1.38.97-1.57-1.2-2.01-1.61-2.49-1.72h.01ZM574.92 90.06c-2.28-5.21-4.93-11.13-5.67-12.26-.1-.15-1.57-3.01-1.63-3.08 0 0-.01.02-.02.02.4 1.37 1.09 2.69 1.65 3.99 2.14 4.95 4.36 9.86 6.67 14.73.6 1.26 1.21 2.52 1.83 3.78-.75-2.01-1.64-4.45-2.83-7.18ZM448.73 65.29c.1.2.22.38.34.57.22-.02.43-.06.65-.08v-.08c-.14-.05-.25 0-.99-.41ZM460.16 94.81c-.02.31-.06.59-.1.89-.03 1.71-.33 3.43-.79 5.07.15-.02.3-.03.45-.05.01-.04.02-.08.03-.11.09-.34.15-.69.2-1.03.17-1.07.25-2.16.33-3.24.05-.69.08-1.39.12-2.08-.27.1-.27.26-.24.57v-.02Z",transform:"translate(-144.023 -51.76)"}),d("path",{d:"m328.67 98.12-3.22-6.58c-1.29-2.63-2.53-5.29-3.72-7.97-.25-.85-.52-1.69-.79-2.53-.81-2.57-1.67-5.12-2.55-7.67-1.92-5.53-3.9-11.08-6.32-16.41-.72-1.58-1.46-3.44-2.63-4.79-.03-.17-.16-.29-.34-.36a.282.282 0 0 0-.23-.04c-.06-.01-.12 0-.18.01-.74.06-1.5.38-2.19.61-2.22.77-4.4 1.64-6.63 2.38-.03-.08-.06-.16-.09-.25-.15-.42-.82-.24-.67.19.03.09.07.19.1.28l-.18.06c-.36.11-.28.6 0 .68.18 1.18.63 2.36.98 3.49.03.09.06.17.08.26-.08.23-.17.46-.24.64-.37.98-.79 1.94-1.21 2.9-1.27 2.89-2.62 5.75-3.98 8.6-3.18 6.67-6.44 13.31-9.64 19.97-1.08 2.25-2.2 4.5-3.15 6.81-.13.32.24.5.5.37 1.34 1.33 2.84 2.5 4.4 3.57.65.44 1.31.87 2.01 1.24.4.22.86.48 1.33.5.24.01.35-.19.33-.37.11-.1.21-.21.28-.28.41-.41.81-.84 1.2-1.26.85-.92 1.69-1.87 2.5-2.84 6.31-2.34 12.6-4.31 18.71-5.84 2.14 5.3 3.43 8.43 3.97 9.58.55 1.05 1.15 1.88 1.82 2.52 1.32.56 6.96-.03 9.23-1.96.87-1.28 1.19-2.67.93-4.15-.09-.5-.22-.95-.4-1.33l-.01-.03Zm-20.09-45.61c.43.77.83 1.56 1.21 2.35-.54-.45-1.27-.99-2.07-1.49-.42-.24-.6-.35-.94-.34.43-.15.85-.29 1.29-.41.17-.05.34-.08.51-.11Zm-25.86 45.66c.78-1.85 1.67-3.66 2.54-5.47 1.51-3.16 3.05-6.31 4.58-9.47 1.28-2.63 2.56-5.26 3.83-7.9l-1.1 2.66c-1.99 4.79-4.97 10.9-8.88 18.15-.43.76-.66 1.51-.71 2.24-.05-.05-.1-.09-.15-.14a.259.259 0 0 0-.11-.07Zm6.24 4.71c-.42-.23-.82-.48-1.22-.74 1.05.45 2 .72 2.55.72l-.21.21c-.05.05-.11.1-.16.15-.01.01-.04.03-.05.04 0-.02.03-.02.05-.03a.27.27 0 0 0-.08.07c-.05-.02-.1-.03-.14-.05-.25-.1-.49-.24-.73-.37h-.01Zm15.73-29.43c1.05 3.15 2.1 6.31 3.1 9.48.34 1.06.69 2.13 1.01 3.21-3.5.63-6.95 1.46-10.27 2.5 2.48-6.03 4.54-11.11 6.16-15.19Zm4.79 12.57c-.23-.79-.49-1.58-.73-2.36-.79-2.54-1.63-5.08-2.46-7.61l-1.2-3.6c.02-.04.04-.09.05-.13 1.6 4.45 3.28 9 5.01 13.57l-.67.12v.01Zm5.83-18.27-.15-.54c-.49-1.64-1.03-3.28-1.6-4.9.23.58.47 1.17.7 1.75 1.56 4.03 3.01 8.1 4.39 12.2-.33-.82-.67-1.64-.98-2.46l-2.35-6.05h-.01ZM390.43 79.37c-.13-10.43-.22-17.5-.24-19.97-.24-1.6.21-2.88-.65-3.65-.14-.13-.32-.23-.52-.32h.03c.45 0 .45-.69 0-.7-1.75-.03-3.5-.04-5.25-.14-1.38-.08-2.76-.21-4.15-.31-.07 0-.12.01-.17.04-.21-.07-.47.03-.45.31l.03.45c-.11.14-.19.3-.22.5-.21 1.26-.32 13.67-.36 23.59-.32 5.79-.67 11.57-.97 17.36-.09 1.73-.29 3.54-.21 5.3-.39.02-.38.64.04.69v.12c.05.44.74.45.7 0v-.06c1.1.09 2.2.21 3.3.3 1.14.19 2.44.2 3.29.17 1.73-.05 2.92-.05 3.8-.37.45-.05.9-.11 1.35-.17.44-.06.25-.73-.19-.67h-.01c.24-.32.45-.72.62-1.25.66-1.84.41-6.36.34-11.33l-.13-9.9.02.01Zm-12.26 18.17c.09-1.91.2-3.81.31-5.71.06 5.38 0 6.14-.01 6.51-.05 1.65-.21 2.81.72 3.66-.39-.04-.78-.07-1.17-.1-.06-1.44.09-2.93.16-4.35l-.01-.01ZM588.97 53.85c-2.06-.25-3.17-.51-3.76-.6a.3.3 0 0 1 .04-.08c.22-.39-.39-.75-.6-.35-.56 1.02-.9 2.19-1.26 3.29-.61 1.88-1.17 3.78-1.72 5.68-.63 2.19-1.24 4.39-1.83 6.59-.81 2.03-1.67 4.05-2.61 6.03-1.7-3.64-3.11-6.04-4.03-7.57-2.26-3.74-2.85-5.48-3.57-6.08l.31-.09c.43-.12.25-.8-.19-.67-1.06.3-2.12.6-3.17.95-.93.32-1.85.69-2.76 1.07-.13.05-.19.16-.22.27-.04.02-.08.05-.11.07-.04-.06-.07-.12-.11-.18a.354.354 0 0 0-.48-.12c-.16.09-.22.32-.13.48l.33.54c0 .09.02.18.06.28.51 1.16.78 1.38.72 1.47-2.42 3.44-5.41 7.86-6.2 9.1-1.27 1.97-2.01 3.14-2.45 3.84l-.91-6.56-.43-4.1c-.19-1.85-.37-3.23-.53-4.13-.19-1.1-.3-2.15-.45-3.16-.2-1.36-.29-2.06-.47-2.42h.04c.45.02.45-.68 0-.7-3.43-.16-6.81.94-10.17 1.48-.24-.22-.73-.04-.58.32.24.59.33 1.25.43 1.87.17 1.06.29 2.13.4 3.2.32 3.09.53 6.2.74 9.3.44 6.75.77 13.51 1.17 20.26.11 1.95.13 3.96.46 5.89.05.3.37.31.55.14.74 1.71 2.87 1.27 6.13 1.27 1.34 0 2.39.04 2.99-.11.02.32.48.53.63.18 3.61-8.26 7.41-16.46 12.05-24.2.03-.05.04-.1.05-.15.3.73.64 1.45.94 2.16.97 2.26 1.97 4.52 2.98 6.76 2.26 5.03 4.54 10.07 7.09 14.96.47.9.94 1.79 1.47 2.65.2.32.4.67.66.96-.18.25 0 .68.34.54.91-.38 1.82-.75 2.76-1.07 1.04-.35 2.11-.65 3.17-.95.39-.11.28-.66-.07-.68.62-.4.95-.96.87-1.91-.3-3.34.72-7.47.86-8.52l2.14-11.43c1.75-10.74 3.13-17.51 3.23-20.86.02-.49.08-2.84.13-3.24.17-1.25.48-1-4.96-1.65l.03-.02Zm-46.19 5.67c-.04-.24-.09-.48-.15-.71l.85-.15c-.34.24-.56.53-.7.86Zm1.95 25.12c-.36-6.63-.7-13.26-1.32-19.87 0 .02 0 .04.01.06.29 1.65.44 2.47.56 2.89 1 8.46 1.5 16.14 1.46 22.8-.06.99-.1 2-.11 3.02-.01.29-.03.68-.05 1.12-.01-.26-.03-.53-.04-.78-.19-3.08-.35-6.16-.52-9.23l.01-.01Zm36.4 18.66c-.11-.11-.24-.29-.37-.49.35.21.74.26 1.17.16-.27.11-.53.22-.8.32v.01Zm-.89-33.72c.12-.43.23-.86.35-1.29.71-1.77 1.41-3.55 2.08-5.33-.15.68-.26 1.22-.31 1.55-.5 2.94-2.13 7.59-3.58 13.36-.15-.35-.29-.66-.43-1 .61-2.44 1.25-4.87 1.9-7.3l-.01.01Zm3.56-12.48c.14-.44.28-.89.42-1.34-.13.7-.27 1.41-.42 2.11-.43 1.19-.86 2.38-1.31 3.57.42-1.45.85-2.9 1.31-4.34Zm-5.22 16.05c-.11.44-.23.87-.35 1.31-.12.46-.23.92-.35 1.38-.1-.22-.19-.4-.28-.61.34-.69.66-1.38.97-2.08h.01Zm-11.64 2.62c.06-.1.12-.19.17-.28.05.13.09.26.14.39a.398.398 0 0 0-.31-.11Zm2.3 2.98c-.56-1.3-1.25-2.63-1.65-3.99 0 0 .01-.02.02-.02.06.08 1.52 2.93 1.63 3.08.73 1.13 3.38 7.04 5.67 12.26 1.2 2.73 2.08 5.17 2.83 7.18-.62-1.25-1.23-2.51-1.83-3.78-2.31-4.87-4.53-9.78-6.67-14.73ZM275.92 87.03c-1.06-2.18-1.13-3.45-2.44-2.93-1.52.57-2.94 1.3-4.5 2.1-1.4.72-2.68 1.44-3.92 2.12.01-.25-.24-.5-.51-.34-4.8 2.93-12.41 4.7-17.28 1.31-1.98-1.77-3.32-4.15-3.97-5.78-.29-.95-.49-1.94-.63-2.93-.14-3.34 1.58-6.53 3.9-9.12.8-.79 1.68-1.51 2.66-2.12 3.7-2.3 8.22-3.07 12.51-2.51 2.71.35 5.32 1.24 7.71 2.55.39.22.75-.39.35-.6-.18-.1-.37-.18-.55-.27.56.27 1.03.33 1.51.19l-.48.39c-.15.11-.23.3-.13.48.09.15.33.24.48.13 1.3-.97 2.46-2.09 3.45-3.37.37-.29.64-.6.65-.97v-.02c.08-.33-.03-.7-.21-1.08-.31-.87-.98-2.01-2.19-3.26-2.43-2.52-3.79-3.45-5.68-4.26-1.14-.49-3.12-1.06-4.42-1.23-3.28-.42-10.64-1.21-18.18 4.11-7.74 5.46-11.94 12.3-12.23 20.61-.08 2.06.04 3.98.34 5.71.74 4.18 2.57 8 5.44 11.34 4.26 4.99 9.76 7.52 16.34 7.52 4.85 0 9.69-1.77 14.89-4.62.23-.12.45-.23.68-.35 2.19-1.1 4.37-2.23 6.46-3.5.49-.3 1.03-.61 1.5-.98 1.47-.87 1.11-1.12.49-2.95-.39-1.14-.76-2.7-2.06-5.36l.02-.01Zm-17.38-21.76c3.05-.42 6.31.79 9.36 2.35.51.39.94.68 1.33.87-5.61-2.86-12.72-3.39-18.44-.79 2.05-1.33 4.24-1.95 7.74-2.44l.01.01ZM443.67 72.67c-.4-2.2-1.15-4.33-2.37-6.22-1.49-2.32-3.58-4.19-5.91-5.64-6.17-3.81-13.75-5.11-20.83-6.01-3.23-.41-6.47-.69-9.72-.92l-1.39-.12c-.85-.07-1.52-.1-2.05-.1-1.08-.06-2.17-.12-3.25-.17-.08 0-.14.02-.19.05-.1.05-.18.14-.16.3.27 2.55-.01 5.12-.92 7.52-.15.38.4.56.62.28 1.32.59 2.68 1.05 4.08 1.37 0 2.78-.14 7.58-.33 12.91 0 0 0 .02-.01.03-.61 3.66-.79 7.42-1 11.12-.23 4.01-.43 8.03-.44 12.05 0 .64 0 1.28.03 1.93.02.31 0 .68.15.96.06.11.14.16.24.17-.2.17-.21.54.11.59 3.83.67 7.78.71 11.68.25 2.3-.19 4.87-.65 7.65-1.56 1.85-.54 3.67-1.18 5.43-1.91 7.2-3.02 14.31-8.07 17.35-15.53.76-1.86 1.17-3.8 1.31-5.75.3-1.93.28-3.82-.09-5.58l.01-.02Zm-19.32-15.42c5.74 1.41 11.94 3.68 15.65 8.55.25.32.47.65.69.99-2.3-2.82-5.68-5.69-12.88-8.23-2.16-.76-4.35-1.43-6.64-2.02 1.06.21 2.13.45 3.18.71Zm-25.82-3.04c.13 0 .27.01.4.02-.14.1-.26.23-.37.38 0-.13-.02-.26-.03-.4Zm34.82 22.17c-.75 3.09-3.55 5.66-5.88 7.58-3.35 2.76-7.21 5.03-11.28 6.54-1.33.49-2.71.9-4.12 1.15.06-1.38.08-2.76.07-4.13-.02-3.78-.16-7.56-.41-11.33-.09-1.37-.18-2.74-.37-4.1 0-.06-.03-.11-.06-.15.09-3.25.12-6.16.03-8.12 6.86 1.05 10.56 2.17 14.06 3.62 5.52 2.28 8.59 5.44 7.97 8.96l-.01-.02Zm-22 16.15c-.12 0-.23-.02-.34-.03l.34-.03v.06Zm-.69-.7c0-3.13.26-8.84.47-14.51.06 1.2.11 2.41.15 3.6.15 3.6.25 7.23.09 10.83-.24.03-.48.05-.71.07v.01Zm-12.33-30.94c.37.63 2.01 1.01 3.23 1.25v.15c-1.31-.31-2.59-.73-3.83-1.29.12-.36.23-.72.33-1.09.08.48.18.84.27.98Zm13.7 31.65v-.18c3.41-.56 6.71-2.02 9.69-3.68 2.31-1.28 4.59-2.78 6.63-4.53-4.69 4.53-11.61 8.24-16.33 8.38l.01.01Zm24.07-.75c-2.05 1.93-4.37 3.56-6.83 4.95 2.7-1.78 5.52-4.03 8.42-6.87.82-.82 1.56-1.69 2.23-2.59-1.08 1.65-2.38 3.16-3.81 4.51h-.01ZM187.16 92.14c-.79-2.47-2.1-7.12-3.1-6.87-.19-.01-2.09.77-4.08 1.54-3.06 1.18-5.91 2.13-10.09 2.82-2.74.42-5.87 1.01-10.61 1.06.04-3.34.05-6.01.05-7.99 7.97-.65 12.33-2.11 16.37-3.55 1.11-.39 2.69-1.01 2.63-1.8-.08-.35-.55-1.39-1.17-2.61-.47-1.16-.98-2.31-1.61-3.38-.42-.71-1.04-1.69-1.86-2.06-.11-.08-.22-.13-.29-.12-.02 0-.04 0-.07.01-.19-.04-.39-.05-.6-.01-.17.03-.24.15-.25.28-.04.02-.09.04-.14.05-4.33 1.48-8.85 2.33-13.24 3.61a499.1 499.1 0 0 0-.31-8.19c4.51-.99 8.88-1.38 13.11-1.82 3.68-.38 6.28.12 7.47.34.59.11.9.16 1.16.18h.1c-.1.37.44.66.62.28.02-.04.03-.08.05-.13.15.2.53.22.62-.1.17-.58.19-1.21.21-1.81v-.36c.03-.15.05-.3.07-.45.52-2.47.33-5.09-.64-7.44-.11-.27-.44-.28-.6-.14-.08-.21-.15-.42-.24-.62-.19-.41-.79-.05-.6.35.03.07.05.15.09.22-.98-.42-2.15-.54-3.17-.63-2.17-.19-4.37-.14-6.54 0-5.7.35-11.4 1.3-16.91 2.79-2.08.56-4.13 1.22-6.14 2-4.54 1.05-3.79 1.51-2.17 6.07.18.51.46 1.68.54 1.94.82 2.47 1.08 2.13 3.1 2.13s0 .05 0 .08h.52c-.48 2.66-.51 5.45-.62 8.13-.15 3.48-.22 6.96-.28 10.45 0 .41-.01.82-.02 1.23-.16.29-.33.57-.51.85-.05.38-.09.77-.14 1.18-.42 3.52-.59 6.48-.52 8.8v.34c.02.47.05.76.06.87.16 1.57-.26 3.47 1.35 3.79 1.61.32 3.5.55 4.85.55.11 0 .22-.02.33-.02 1.79.24 3.67.05 5.45-.12 2.85-.28 5.69-.7 8.51-1.19 3.03-.53 6.05-1.14 9.04-1.86 2.4-.58 4.82-1.19 7.13-2.06.51-.19 1.73-.57 2.46-1.14 1.81-.68 2.18-1 1.57-2.67-.23-.62-.48-1.49-.91-2.78l-.03-.02Zm-11.12-38.71c.89.05 1.93.08 2.89.3-.33 0-.68-.02-1.06-.03-8.28-.26-14.88.75-23.97 2.51 2.41-.64 4.85-1.16 7.28-1.59 4.87-.86 9.91-1.45 14.86-1.19Zm-26.53 22.13c.03 1.71.04 3.43 0 5.14-.04 1.27-.11 2.55-.24 3.82 0-.73.02-1.46.04-2.19.05-2.26.12-4.51.22-6.77h-.02Zm6.73 27.85c.2-.1.4-.21.58-.33 1.82-.17 3.82-.24 5.94-.34-.86.11-1.72.24-2.58.33-1.27.14-2.61.31-3.93.34h-.01ZM534.48 85.44c-3.52-8.38-7.07-16.75-10.5-25.17-.63-1.54-1.25-3.09-1.86-4.65-.31-.8-.65-1.6-.87-2.43-.04-.17-.17-.24-.31-.25.1-.2 0-.51-.29-.53-1.59-.08-3.18-.22-4.78-.25-1.96-.03-3.91.13-5.84.42-.31.05-.31.38-.13.56-.03.06-.05.14-.04.22.23 1.54.63 3.06 1.16 4.53.13.35.27.7.41 1.06l-2.68 6.18c-.11.03-.2.09-.25.22-.67 1.9-1.52 3.73-2.34 5.56a536.85 536.85 0 0 1-3.9 8.45c-2.64 5.64-5.34 11.25-7.91 16.93-.44.97-.88 1.94-1.29 2.93-.2.48-.47 1-.55 1.52v.05c-.02.12.02.26.16.34 1.19.73 2.41 1.41 3.66 2.05 1.2.62 2.45 1.25 3.76 1.61.43.12.62-.55.19-.67-1.13-.31-2.2-.83-3.24-1.36 1.09.36 2.1.69 2.75.93 2.82 1.01 2.38 1.1 4.3-3.75 2.1-1.09 4.34-1.96 6.53-2.79 4.35-1.64 8.8-3.03 13.27-4.29.82 2.01 1.77 3.97 2.72 5.92.35.83.62 1.45.79 1.82.22.42.45.8.69 1.15.17.33.33.67.5 1 .42.8.84 1.63 1.4 2.35.23.29.6 0 .55-.31 1.53-.02 3.06-.07 4.58-.27.92-.12 1.82-.32 2.71-.54 1.39-.27 3.85-1.11 3.74-1.42-.67-1.96-1.55-3.87-2.34-5.78-1.57-3.78-3.16-7.56-4.75-11.33v-.01Zm-11.65-26.16c1.54 3.81 3.12 7.6 4.7 11.4 2.94 7.05 5.91 14.09 8.87 21.13l-1.06-2.17c-2.71-5.51-5.2-11.19-7.41-16.87l-6.65-17.15c-.65-1.45-.55-2.19-.93-2.53.09 0 .18.01.28.02a.29.29 0 0 0-.04.26c.52 2.02 1.47 3.98 2.25 5.91h-.01Zm-6.58 13.58c.05-.15.09-.31.14-.46 1.41 3.92 2.88 7.9 4.39 11.87-3.22.52-6.38 1.25-9.46 2.14.55-1.22 1.05-2.46 1.53-3.7 1.24-3.24 2.37-6.53 3.39-9.85h.01Zm-.23-20c.36 0 .73.03 1.09.05-2.15.1-5.18.33-5.87.74-.24.15-.41.3-.53.45-.06-.29-.13-.58-.18-.88 1.82-.26 3.65-.39 5.49-.35v-.01Zm-.09 18.72c-.49 1.67-1.05 3.33-1.6 4.97-1.07 3.19-2.19 6.38-3.57 9.46-.09.21-.19.43-.29.65-.25.07-.5.14-.74.22 2.53-6.16 4.61-11.29 6.2-15.3Zm-6.34 25.16c4.97-2.38 9.37-4.1 14.02-5.27l.26.64c-4.8 1.35-9.63 2.8-14.28 4.63Zm20.17 6.76c.33.23.68.42 1.04.56h-.33c-.12 0-.21.06-.26.13-.15-.23-.31-.45-.45-.7v.01ZM226.57 91.75c-3.55-4.74-6.68-9.11-9.31-12.99 9.2-15.25 10.05-17.81 10.35-18.38.17-.34 1.09-2.27.64-2.53-1.13-.65-1.03-.65-2.97-1.71-1.19-.65-3.04-1.61-4.53-2.12-1.71-.59-1.24-.36-3 2.77-.06.1-.11.2-.17.3-.75 1.02-1.48 2.05-2.2 3.09-1.88 2.71-3.73 5.45-5.69 8.1-3.68-4.91-6.88-8.76-9.51-11.43-.15-.15-.3-.29-.46-.42-1.27-1.28-7.24 3.53-7.93 5.58-.09.09-.19.16-.28.25-.27.26.03.64.33.58.19.65.5 1.29.94 1.91 3.85 5.06 7.19 9.76 9.94 14-1.23 2.61-3.06 5-4.67 7.38l-2.28 3.33c-.5.66-.93 1.23-1.29 1.69-.67.93-2.09 2.61-2.3 3.87-.51.85-1.16 1.84-1.29 2.83-.06.44.61.63.67.19.01-.08.04-.15.06-.22 1.36 1.08 2.76 2.11 4.19 3.11 1.3.91 2.62 1.85 4.04 2.56.21.1.4 0 .48-.17.24.07.48.14.72.2.44.1.62-.57.19-.67-2.02-.48-3.77-1.57-5.23-3.02-.47-.46-.9-.96-1.32-1.46 1.74 1.35 4.2 2.89 5.89 4.14 1.39 1.03 2.85-2.27 4.22-4.2 1.86-2.64 3.96-5.86 5.52-8.29l10.39 14.51c.67.81 1.14 1.21 1.57 1.36-.05.24.12.51.41.4 1.53-.58 3.05-1.19 4.54-1.87 1.52-.69 3.06-1.45 4.36-2.5a.28.28 0 0 0 .12-.23c1.66-1.1.81-1.74-1.41-4.91-1.13-1.58-1.71-2.36-3.7-5.01l-.03-.02Zm2.41 6.54c.56 1.15 1.19 2.52 1.11 3.81-.06.04-.12.07-.17.1-.03-.88-.55-2.66-.94-3.91Zm-16.51-32.73c1.86-2.65 3.65-5.35 5.57-7.95.4-.55.81-1.13 1.26-1.66.19-.18.38-.33.56-.45.18.03.36.08.55.13l-8.05 10.11.12-.18h-.01ZM192.7 95.48c.79-1.37 1.66-2.69 2.54-4 1.19-1.79 2.4-3.56 3.61-5.33-.04.09-.09.17-.13.26-.1.22.03.41.2.49-2.47 3.42-4.89 6.73-6.4 9.28.21.24.4.48.63.75-.24.07-.4.36-.17.56.4.33.72.77 1.05 1.17.09.11.18.21.27.32-.84-.61-1.66-1.24-2.47-1.88.24-.57.58-1.11.87-1.61v-.01Zm7.46-10.32c.47-.81.98-1.59 1.49-2.37.31-.48.64-.95.96-1.43.26-.29.52-.56.75-.79-.99 1.48-2.09 3.03-3.2 4.59Zm10.03-16.22s-.03-.05-.05-.07c.22-.29.43-.59.64-.89-.2.32-.4.65-.58.96h-.01ZM371.54 87.96c-.01-.08-.01-.16-.03-.23-.06-.38-.58-.29-.66.03-.3-.05-.6-.08-.81-.11-1.14-.15-2.29-.19-3.44-.2 1.04-.09 2.09-.18 3.14-.23.45-.02.45-.72 0-.7-6.57.35-13.14 1.23-19.65 2.11-1.53.21-3.05.42-4.57.68-.01 0-.02.01-.04.01-.04-3.33-.13-6.66-.24-9.99-.19-5.7-.4-11.41-.88-17.1-.13-1.51-.23-3.07-.49-4.58 0-.25 0-.48-.02-.68-.06-1.19-.04-2.61-.68-2.78-.16-.07-.72-.16-1.5-.24.22-.17.16-.62-.2-.63-1.19-.04-2.39.09-3.57.23-1.2.14-2.41.32-3.59.6-.16-.1-.41-.06-.5.12-.06.02-.13.03-.19.05-.35.1-.29.55-.03.66-.26.6-.19 2.27-.21 3-.02.66-.66 33.73-.9 40.3-.03.65.06 1.12.04 1.45-.16 3.05.87 4.96 6.34 3.93 1.09-.08 2.75-.77 5.36-1.43 4.13-1.04 5.78-1.52 6.2-1.65 6.43-1.69 6.78-1.97 11.72-2.43.55-.05 4.8-.38 6.03-.3.64.04 1.19.07 1.65.1.09 0 .16-.03.24-.05.1.27.56.33.66-.02.39-1.32.61-2.71.78-4.08.2-1.61.29-3.24.15-4.86.24.03.52-.23.38-.53-.09-.2-.27-.33-.49-.43v-.02Zm-.63.56c.07.57.11 1.14.11 1.71-.21-.99-.53-1.71-.95-1.87.22.03.44.06.65.11.06.01.12.04.19.05Zm-25.41 1.73c1.54-.36 3.1-.64 4.66-.89-1.61.37-3.18.77-4.66 1.2v-.31Zm-.86-7.37c-.07-1.37-.16-2.75-.25-4.12-.21-3.13-.45-6.27-.79-9.4.02-2.25.08-4.31.13-6.11.16 2.08.29 4.16.4 6.24.23 4.46.38 8.93.5 13.39h.01Zm-.94-4c.16 2.41.29 4.83.39 7.24.06 1.6.14 3.22.09 4.83-.15.05-.32.09-.47.14V78.88h-.01ZM483.72 92.83c-3.05-2.28-6.22-4.4-9.38-6.51 8.86-6.49 13.49-12.95 13.73-19.23.04-.76 0-1.5-.13-2.2-.67-3.82-3.5-6.68-8.39-8.48.13.04.27.08.4.13 3.92 1.39 7.74 4.23 8.5 8.56.34 1.95-.05 3.96-.98 5.69-.21.4.39.75.6.35 1.86-3.46 1.46-7.55-.97-10.63-3.53-4.47-9.76-5.88-15.16-6.16-2.32-.12-4.64-.04-6.95.19-6 .32-12.71 1.68-17.63 3.21-.37.11-.67.23-.92.35-.2-.17-.62.02-.57.37v.03c-.64.68-.18 1.64.48 3.21.38.91.67 1.89 1.15 2.58.32.76.68 1.51 1.13 2.19.14.21.38.19.53.07.19-.02.38-.05.57-.08v1.57c-.06.06-.1.13-.11.23-.27 4.18-.34 8.38-.48 12.57l-.3 9.03c-.24 3.91-.44 6.77-.46 7.26-.05.88-.11 1.95.07 2.81-.01.22-.02.43-.04.65 0 .11-.02.23-.03.35 0 .05-.03.27-.01.16-.05.4.5.59.64.28.05.04.12.08.2.08 1.75.13 3.5.28 5.25.3 1.69.02 3.38-.12 5.06-.32.08.23.36.39.55.15.06-.08.11-.17.16-.26.18-.09.24-.32.18-.48.05-.2.1-.4.13-.6.16-.86.25-1.74.33-2.62.11-1.17.17-2.34.23-3.51.15-.01.32-.03.52-.04.36-.03 1.73-.15 2.06-.15.39 0 .7-.02.95-.04 1.76 1.11 3.45 2.35 5.14 3.55 2.83 2.01 5.64 4.04 8.47 6.04 1.42 1 2.85 2 4.29 2.97.1.06.19.07.27.04.08 0 .17-.02.25-.1 1.61-1.56 3.15-3.18 4.6-4.88.75-.88 1.49-1.78 2.15-2.73.01.01.03.02.04.03.34.3.83-.2.49-.49-2.16-1.9-4.34-3.76-6.64-5.48l.03-.01Zm-6.38-3.65a55.72 55.72 0 0 0-4-2.13c.14-.1.26-.19.4-.29 1.2.81 2.4 1.61 3.6 2.42Zm-20.1 11.78c.67-.37 1.23-.91 1.67-1.6-.11.5-.24 1-.38 1.49-.43.04-.86.08-1.29.11Zm2.38-37.24c1.34-.31 2.56-.52 3.71-.69-1.03.19-2.04.41-3.04.65-.14-.07-.34-.02-.45.11-.07.02-.15.04-.22.05v-.13.01Zm.04.84c.07-.02.14-.03.2-.05.34 1.66.41 3.41.5 5.09.17 2.9.24 5.81.28 8.71l.03 3.17c-.17.07-.34.14-.51.2-.06-4.96-.21-10.58-.51-17.12h.01Zm16.04 5.62c-1.16 2.25-3.06 4.1-5.02 5.66-2.8 2.23-5.99 3.97-9.3 5.35-.01-3.56-.09-7.12-.27-10.67-.1-2.04-.16-4.16-.57-6.18 3.3-.78 6.72-1.36 10.1-1.1 1.85.14 4.23.59 5.32 2.29.92 1.43.46 3.24-.26 4.65Zm.85-.18c.6-1.37.9-2.92.28-4.32-.67-1.52-2.2-2.32-3.76-2.74.46.1.89.21 1.29.37 1.74.67 2.69 1.88 2.93 3.21.2 1.13-.05 2.25-.74 3.47V70Zm-27.47-4.14c-.12-.19-.23-.38-.34-.57.74.42.85.36.99.41v.08c-.22.03-.43.06-.65.08Zm11.21 30.46c-.08 1.08-.16 2.17-.33 3.24-.05.35-.11.69-.2 1.03 0 .04-.02.07-.03.11-.15.02-.3.04-.45.05.45-1.64.76-3.36.79-5.07.03-.29.08-.57.1-.89-.03-.31-.03-.47.24-.57-.04.69-.07 1.39-.12 2.08v.02Zm5.6-2.47c.48.11.92.52 2.49 1.72-.46-.32-.92-.65-1.38-.97-.37-.25-.73-.5-1.1-.75h-.01Zm21.23 7.24a70.76 70.76 0 0 1-4.37 4.63c-.14-.09-.27-.19-.4-.28.19-.09.37-.24.55-.47.87-1.14 5.43-5.51 5.49-7.45.31.26.62.53.92.79-.67.97-1.42 1.88-2.19 2.77v.01Z",fill:"currentColor",transform:"translate(-144.023 -51.76)"})]}),Lq9=({style:u,size:B="small",withText:C})=>c0("div",{className:`ExcalidrawLogo is-${B}`,style:u,children:[d(Qq9,{}),C&&d(Gq9,{})]}),V$u=({icon:u,shortcut:B,children:C})=>{let F=aZ();return c0(m1,{children:[d("div",{className:"welcome-screen-menu-item__icon",children:u}),d("div",{className:"welcome-screen-menu-item__text",children:C}),B&&!F.editor.isMobile&&d("div",{className:"welcome-screen-menu-item__shortcut",children:B})]})};V$u.displayName="WelcomeScreenMenuItemContent";var GL0=({onSelect:u,children:B,icon:C,shortcut:F,className:U="",...D})=>d("button",{...D,type:"button",className:`welcome-screen-menu-item ${U}`,onClick:u,children:d(V$u,{icon:C,shortcut:F,children:B})});GL0.displayName="WelcomeScreenMenuItem";var oU1=({children:u,href:B,icon:C,shortcut:F,className:U="",...D})=>d("a",{...D,className:`welcome-screen-menu-item ${U}`,href:B,target:"_blank",rel:"noreferrer",children:d(V$u,{icon:C,shortcut:F,children:u})});oU1.displayName="WelcomeScreenMenuItemLink";var hN=({children:u})=>{let{WelcomeScreenCenterTunnel:B}=oQ();return d(B.In,{children:d("div",{className:"welcome-screen-center",children:u||c0(m1,{children:[d(j$u,{}),d(R$u,{children:r0("welcomeScreen.defaults.center_heading")}),c0(l$u,{children:[d(m$u,{}),d(f$u,{})]})]})})})};hN.displayName="Center";var j$u=({children:u})=>d("div",{className:"welcome-screen-center__logo excalifont welcome-screen-decor",children:u||d(Lq9,{withText:!0})});j$u.displayName="Logo";var R$u=({children:u})=>d("div",{className:"welcome-screen-center__heading welcome-screen-decor excalifont",children:u});R$u.displayName="Heading";var l$u=({children:u})=>d("div",{className:"welcome-screen-menu",children:u});l$u.displayName="Menu";var f$u=()=>{let u=eL();return d(GL0,{onSelect:()=>u.executeAction(K$u),shortcut:"?",icon:xn0,children:r0("helpDialog.title")})};f$u.displayName="MenuItemHelp";var m$u=()=>{let u=LM(),B=eL();return u.viewModeEnabled?null:d(GL0,{onSelect:()=>B.executeAction(n_u),shortcut:_K("loadScene"),icon:Vn0,children:r0("buttons.load")})};m$u.displayName="MenuItemLoadScene";var bU1=({onSelect:u})=>{let{t:B}=$K();return d(GL0,{shortcut:null,onSelect:u,icon:SRu,children:B("labels.liveCollaboration")})};bU1.displayName="MenuItemLiveCollaborationTrigger";hN.Logo=j$u;hN.Heading=R$u;hN.Menu=l$u;hN.MenuItem=GL0;hN.MenuItemLink=oU1;hN.MenuItemHelp=f$u;hN.MenuItemLoadScene=m$u;hN.MenuItemLiveCollaborationTrigger=bU1;var h$u=({children:u})=>{let{WelcomeScreenMenuHintTunnel:B}=oQ();return d(B.In,{children:c0("div",{className:"excalifont welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--menu",children:[xk3,d("div",{className:"welcome-screen-decor-hint__label",children:u||r0("welcomeScreen.defaults.menuHint")})]})})};h$u.displayName="MenuHint";var y$u=({children:u})=>{let{WelcomeScreenToolbarHintTunnel:B}=oQ();return d(B.In,{children:c0("div",{className:"excalifont welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--toolbar",children:[d("div",{className:"welcome-screen-decor-hint__label",children:u||r0("welcomeScreen.defaults.toolbarHint")}),Vk3]})})};y$u.displayName="ToolbarHint";var _$u=({children:u})=>{let{WelcomeScreenHelpHintTunnel:B}=oQ();return d(B.In,{children:c0("div",{className:"excalifont welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--help",children:[d("div",{children:u||r0("welcomeScreen.defaults.helpHint")}),vk3]})})};_$u.displayName="HelpHint";var $$u=(u)=>d(m1,{children:u.children||c0(m1,{children:[d(hN,{}),d(h$u,{}),d(y$u,{}),d(_$u,{})]})});$$u.displayName="WelcomeScreen";$$u.Center=hN;$$u.Hints={MenuHint:h$u,ToolbarHint:y$u,HelpHint:_$u};var Wq9=({isCollaborating:u,onSelect:B,...C})=>{let F=LM(),U=F.width<830;return c0(hd,{...C,className:j3("collab-button",{active:u}),type:"button",onSelect:B,style:{position:"relative",width:U?void 0:"auto"},title:r0("labels.liveCollaboration"),children:[U?nk3:r0("labels.share"),F.collaborators.size>0&&d("div",{className:"CollabButton-collaborators",children:F.collaborators.size})]})};Wq9.displayName="LiveCollaborationTrigger";var Nt5=dU1.default((u,B,C)=>{if(y2.DEV||y2.MODE===hQ.TEST||window?.DEBUG_FRACTIONAL_INDICES){let F=fv(u.map((U)=>({...U})));Cs0(F,{shouldThrow:y2.DEV||y2.MODE===hQ.TEST,includeBoundTextValidation:!0,reconciliationContext:{localElements:B,remoteElements:C}})}},60000,{leading:!0,trailing:!1});var Yq9=({children:u,icon:B})=>{let{TTDDialogTriggerTunnel:C}=oQ(),F=iz();return d(C.In,{children:c0(vC.Item,{onSelect:()=>{CC("ai","dialog open","ttd"),F({openDialog:{name:"ttd",tab:"text-to-diagram"}})},icon:B??$T3,children:[u??r0("labels.textToDiagram"),d(vC.Item.Badge,{children:"AI"})]})})};Yq9.displayName="TTDDialogTrigger";Kq9();var Sq9=(u)=>{let{onChange:B,initialData:C,excalidrawAPI:F,isCollaborating:U=!1,onPointerUpdate:D,renderTopRightUI:Z,langCode:X=T50.code,viewModeEnabled:M,zenModeEnabled:K,gridModeEnabled:Q,libraryReturnUrl:G,theme:W,name:q,renderCustomStats:P,onPaste:w,detectScroll:N=!0,handleKeyboardGlobally:k=!1,onLibraryChange:x,autoFocus:v=!1,generateIdForFile:R,onLinkOpen:j,generateLinkForSelection:l,onPointerDown:y,onPointerUp:h,onScrollChange:_,onDuplicate:$,children:m,validateEmbeddable:p,renderEmbeddable:i,aiEnabled:t,showDeprecatedFonts:a}=u,o=u.UIOptions?.canvasActions,u0={...u.UIOptions,canvasActions:{...Rju.canvasActions,...o},tools:{image:u.UIOptions?.tools?.image??!0}};return o?.export&&(u0.canvasActions.export.saveFileToDisk=o.export?.saveFileToDisk??Rju.canvasActions.export.saveFileToDisk),u0.canvasActions.toggleTheme===null&&typeof W>"u"&&(u0.canvasActions.toggleTheme=!0),do0.useEffect(()=>{(async()=>{await Promise.resolve().then(() => (bE1(),DH9))})();let n=(B0)=>{typeof B0.scale=="number"&&B0.scale!==1&&B0.preventDefault()};return document.addEventListener("touchmove",n,{passive:!1}),()=>{document.removeEventListener("touchmove",n)}},[]),d(zH9,{store:xN,children:d(MH9,{langCode:X,theme:W,children:d(Jq9,{onChange:B,initialData:C,excalidrawAPI:F,isCollaborating:U,onPointerUpdate:D,renderTopRightUI:Z,langCode:X,viewModeEnabled:M,zenModeEnabled:K,gridModeEnabled:Q,libraryReturnUrl:G,theme:W,name:q,renderCustomStats:P,UIOptions:u0,onPaste:w,detectScroll:N,handleKeyboardGlobally:k,onLibraryChange:x,autoFocus:v,generateIdForFile:R,onLinkOpen:j,generateLinkForSelection:l,onPointerDown:y,onPointerUp:h,onScrollChange:_,onDuplicate:$,validateEmbeddable:p,renderEmbeddable:i,aiEnabled:t!==!1,showDeprecatedFonts:a,children:m})})})},Oq9=(u,B)=>{if(u.children!==B.children)return!1;let{initialData:C,UIOptions:F={},...U}=u,{initialData:D,UIOptions:Z={},...X}=B,M=Object.keys(F),K=Object.keys(Z);return M.length!==K.length?!1:M.every((Q)=>Q==="canvasActions"?Object.keys(F.canvasActions).every((G)=>G==="export"&&F?.canvasActions?.export&&Z?.canvasActions?.export?F.canvasActions.export.saveFileToDisk===Z.canvasActions.export.saveFileToDisk:F?.canvasActions?.[G]===Z?.canvasActions?.[G]):F[Q]===Z[Q])&&uJ(U,X)},Pq9=do0.default.memo(Sq9,Oq9);Pq9.displayName="Excalidraw";window.EXCALIDRAW_ASSET_PATH="https://gstack-render.localhost/excalidraw-assets/";var wq9='Helvetica, "Liberation Sans", Arial, "Hiragino Kaku Gothic ProN", "Noto Sans CJK JP", "Microsoft YaHei", "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif';Zku.initialize({startOnLoad:!1,securityLevel:"strict",theme:"neutral",fontFamily:wq9,htmlLabels:!1,flowchart:{htmlLabels:!1}});window.__renderMermaid=async(u,B)=>{if(!/^[A-Za-z][\w-]*$/.test(u))throw Error(`invalid mermaid render id: ${u}`);let{svg:C}=await Zku.render(u,B);return C};window.__mermaidToExcalidraw=async(u)=>{let{elements:B,files:C}=await _vu(u),U={type:"excalidraw",version:2,source:"gstack-diagram-render",elements:JL0(B),appState:{viewBackgroundColor:"#ffffff"},files:C??{}};return JSON.stringify(U)};window.__excalidrawToSvg=async(u)=>{let B=JSON.parse(u);if(!Array.isArray(B.elements))throw Error("excalidraw scene has no elements array");let C=await kQ0({elements:B.elements,appState:{...B.appState??{},exportBackground:!0},files:B.files??null,exportPadding:16});return new XMLSerializer().serializeToString(C)};window.__rasterize=async(u,B)=>{if(!(B>0&&B<=1e4))throw Error(`targetWidthPx out of range: ${B}`);let C=new Blob([u],{type:"image/svg+xml;charset=utf-8"}),F=URL.createObjectURL(C);try{let U=new Image;await new Promise((Q,G)=>{U.onload=()=>Q(),U.onerror=()=>G(Error("SVG image decode failed (malformed SVG or foreignObject content)")),U.src=F});let D=U.naturalWidth||800,Z=U.naturalHeight||600,X=B/D,M=document.createElement("canvas");M.width=Math.round(D*X),M.height=Math.round(Z*X);let K=M.getContext("2d");if(!K)throw Error("2d canvas context unavailable");return K.fillStyle="#ffffff",K.fillRect(0,0,M.width,M.height),K.drawImage(U,0,0,M.width,M.height),M.toDataURL("image/png")}finally{URL.revokeObjectURL(F)}};window.__mountForScreenshot=(u,B)=>{document.getElementById("raster-stage")?.remove();let C=document.createElement("div");C.id="raster-stage",C.style.cssText=`display:inline-block;background:#fff;width:${B}px`,C.innerHTML=u;let F=C.querySelector("svg");if(F)F.setAttribute("width",String(B)),F.removeAttribute("height"),F.style.height="auto";return document.body.appendChild(C),`mounted:${B}`};window.__probeImage=async(u)=>{let B=new Image;return await new Promise((C,F)=>{B.onload=()=>C(),B.onerror=()=>F(Error("image decode failed")),B.src=u}),JSON.stringify({width:B.naturalWidth,height:B.naturalHeight})};window.__bundleInfo={name:"gstack-diagram-render",deps:{"@excalidraw/excalidraw":"0.18.0","@excalidraw/mermaid-to-excalidraw":"1.1.2",mermaid:"11.12.2",react:"18.3.1","react-dom":"18.3.1"}};var tU1=document.getElementById("status");if(tU1)tU1.textContent="ready";var Tb0=document.createElement("div");Tb0.id="done";Tb0.textContent="ready";Tb0.style.cssText="position:absolute;left:-9999px";document.body.appendChild(Tb0); +`),P=q.reduce((w,N,k)=>{let x=ob(N).trim();if(x.length){let v=this.getTopLayerFrameAtSceneCoords({x:F,y:W}),R=MM(x,Z,X),j=R.width>Q,l=j?yi(x,Z,Q):x;R=j?MM(l,Z,X):R;let y=F-R.width/2,h=W-R.height/2,_=iL({...D,x:y,y:h,text:l,originalText:x,lineHeight:X,autoResize:!j,frameId:v?v.id:null});w.push(_),W+=_.height+G}else q[k-1]?.trim()&&(W+=Z20(D.fontSize,X)+G);return w},[]);P.length!==0&&(this.scene.insertElements(P),this.setState({selectedElementIds:pB(Object.fromEntries(P.map((w)=>[w.id,!0])),this.state)}),!C&&P.length>1&&DA1===!1&&!this.device.editor.isMobile&&(this.setToast({message:r0("toast.pasteAsSingleElement",{shortcut:N3("CtrlOrCmd+Shift+V")}),duration:5000}),DA1=!0),this.store.shouldCaptureIncrement())}handleTextWysiwyg(B,{isExistingElement:C=!1}){let F=this.scene.getElementsMapIncludingDeleted(),U=(D,Z)=>{this.scene.replaceAllElements([...this.scene.getElementsIncludingDeleted().map((X)=>X.id===B.id&&M6(X)?Z5(X,{originalText:D,isDeleted:Z??X.isDeleted,...Klu(X,sZ(X,F),F,D)}):X)])};Eq9({id:B.id,canvas:this.canvas,getViewportCoords:(D,Z)=>{let{x:X,y:M}=iO({sceneX:D,sceneY:Z},this.state);return[X-this.state.offsetLeft,M-this.state.offsetTop]},onChange:HU((D)=>{U(D,!1),ks0(B)&&yQ(B,this.scene.getNonDeletedElementsMap())}),onSubmit:HU(({viaKeyboard:D,nextOriginalText:Z})=>{let X=!Z.trim();if(U(Z,X),!X&&D){let M=B.containerId?B.containerId:B.id;wg.flushSync(()=>{this.setState((K)=>({selectedElementIds:pB({...K.selectedElementIds,[M]:!0},K)}))})}X&&tRu(this.scene.getNonDeletedElements(),[B]),(!X||C)&&this.store.shouldCaptureIncrement(),wg.flushSync(()=>{this.setState({newElement:null,editingTextElement:null})}),this.state.activeTool.locked&&UN(this.interactiveCanvas,this.state),this.focusContainer()}),element:B,excalidrawContainer:this.excalidrawContainerRef.current,app:this,autoSelect:!this.device.isTouchScreen}),this.deselectElements(),U(B.originalText,!1)}deselectElements(){this.setState({selectedElementIds:pB({},this.state),selectedGroupIds:{},editingGroupId:null,activeEmbeddable:null})}getTextElementAtPosition(B,C){let F=this.getElementAtPosition(B,C,{includeBoundTextElement:!0});return F&&M6(F)&&!F.isDeleted?F:null}getElementAtPosition(B,C,F){let U=this.getElementsAtPosition(B,C,F?.includeBoundTextElement,F?.includeLockedElements);if(U.length>1){if(F?.preferSelected){for(let Z=U.length-1;Z>-1;Z--)if(this.state.selectedElementIds[U[Z].id])return U[Z]}let D=U[U.length-1];return db({x:B,y:C,element:D,shape:wv(D,this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold()/2,frameNameBound:w2(D)?this.frameNameBoundsCache.get(D):null})?D:U[U.length-2]}return U.length===1?U[0]:null}getElementsAtPosition(B,C,F=!1,U=!1){let D=[],Z=this.scene.getNonDeletedElementsMap();return(F&&U?this.scene.getNonDeletedElements():this.scene.getNonDeletedElements().filter((X)=>(U||!X.locked)&&(F||!(M6(X)&&X.containerId)))).filter((X)=>this.hitElement(B,C,X)).filter((X)=>{let M=_Q(X,Z);return M&&this.state.frameRendering.enabled&&this.state.frameRendering.clip?$lu({x:B,y:C},M,Z):!0}).filter((X)=>hl(X)?(D.push(X),!1):!0).concat(D)}getElementHitThreshold(){return mN3/this.state.zoom.value}hitElement(B,C,F,U=!0){if(U&&this.state.selectedElementIds[F.id]&&blu([F],this.state)){let D=Kx3(F,this.scene.getNonDeletedElementsMap(),gB(F)?0:this.getElementHitThreshold());if(pH0(v0(B,C),D))return!0}return yRu(B,C,_Ru(F,this.scene.getNonDeletedElementsMap()))?!0:db({x:B,y:C,element:F,shape:wv(F,this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold(),frameNameBound:w2(F)?this.frameNameBoundsCache.get(F):null})}getTextBindableContainerAtPosition(B,C){let F=this.scene.getNonDeletedElements(),U=this.scene.getSelectedElements(this.state);if(U.length===1)return hi(U[0],!1)?U[0]:null;let D=null;for(let Z=F.length-1;Z>=0;--Z){if(F[Z].isDeleted)continue;let[X,M,K,Q]=b2(F[Z],this.scene.getNonDeletedElementsMap());if(L5(F[Z])&&db({x:B,y:C,element:F[Z],shape:wv(F[Z],this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold()})){D=F[Z];break}else if(X=0)||X?_8(this.interactiveCanvas,O8.POINTER):this.hitElement(C,F,D)&&_8(this.interactiveCanvas,O8.MOVE)):this.hitElement(C,F,D)&&(!P6(D)||!(D.startBinding||D.endBinding))&&_8(this.interactiveCanvas,O8.MOVE),this.state.selectedLinearElement.hoverPointIndex!==Z&&this.setState({selectedLinearElement:{...this.state.selectedLinearElement,hoverPointIndex:Z}}),L6.arePointsEqual(this.state.selectedLinearElement.segmentMidPointHoveredCoords,X)||this.setState({selectedLinearElement:{...this.state.selectedLinearElement,segmentMidPointHoveredCoords:X}})}else _8(this.interactiveCanvas,O8.AUTO)}updateGestureOnPointerDown(B){B8.pointers.set(B.pointerId,{x:B.clientX,y:B.clientY}),B8.pointers.size===2&&(B8.lastCenter=TC1(B8.pointers),B8.initialScale=this.state.zoom.value,B8.initialDistance=xC1(Array.from(B8.pointers.values())))}initialPointerDownState(B){let C=EC(B,this.state),F=this.scene.getSelectedElements(this.state),[U,D,Z,X]=eB(F),M=F.findIndex(P6)===0;return{origin:C,withCmdOrCtrl:B[pu.CTRL_OR_CMD],originInGrid:yO(nD(C.x,C.y,B[pu.CTRL_OR_CMD]||M?null:this.getEffectiveGridSize())),scrollbars:RC1(__u,B.clientX-this.state.offsetLeft,B.clientY-this.state.offsetTop),lastCoords:{...C},originalElements:this.scene.getNonDeletedElements().reduce((K,Q)=>(K.set(Q.id,ri(Q)),K),new Map),resize:{handleType:!1,isResizing:!1,offset:{x:0,y:0},arrowDirection:"origin",center:{x:(Z+U)/2,y:(X+D)/2}},hit:{element:null,allHitElements:[],wasAddedToSelection:!1,hasBeenDuplicated:!1,hasHitCommonBoundingBoxOfSelectedElements:this.isHittingCommonBoundingBoxOfSelectedElements(C,F)},drag:{hasOccurred:!1,offset:null},eventListeners:{onMove:null,onUp:null,onKeyUp:null,onKeyDown:null},boxSelection:{hasOccurred:!1}}}handleDraggingScrollBar(B,C){if(!(C.scrollbars.isOverEither&&!this.state.multiElement))return!1;y_u=!0,C.lastCoords.x=B.clientX,C.lastCoords.y=B.clientY;let F=R_u((D)=>{D.target instanceof HTMLElement&&this.handlePointerMoveOverScrollbars(D,C)}),U=HU(()=>{tG0=null,y_u=!1,UN(this.interactiveCanvas,this.state),this.setState({cursorButton:"up"}),this.savePointer(B.clientX,B.clientY,"up"),window.removeEventListener("pointermove",F),window.removeEventListener("pointerup",U),F.flush()});return tG0=U,window.addEventListener("pointermove",F),window.addEventListener("pointerup",U),!0}isASelectedElement(B){return B!=null&&this.state.selectedElementIds[B.id]}isHittingCommonBoundingBoxOfSelectedElements(B,C){if(C.length<2)return!1;let F=this.getElementHitThreshold(),[U,D,Z,X]=eB(C);return B.x>U-F&&B.xD-F&&B.y{this.maybeHandleResize(B,C)||this.maybeDragNewGenericElement(B,C)})}onKeyUpFromPointerDownHandler(B){return HU((C)=>{C.key===pu.ALT&&C.preventDefault(),!this.maybeHandleResize(B,C)&&this.maybeDragNewGenericElement(B,C)})}onPointerMoveFromPointerDownHandler(B){return R_u((C)=>{if(this.state.openDialog?.name==="elementLinkSelector")return;let F=EC(C,this.state);if(this.state.selectedLinearElement&&this.state.selectedLinearElement.elbowed&&this.state.selectedLinearElement.pointerDownState.segmentMidpoint.index){let[Q,G]=nD(F.x,F.y,C[pu.CTRL_OR_CMD]?null:this.getEffectiveGridSize()),W=this.state.selectedLinearElement.pointerDownState.segmentMidpoint.index;if(W<0){let P=L6.getSegmentMidpointHitCoords({...this.state.selectedLinearElement,segmentMidPointHoveredCoords:null},{x:Q,y:G},this.state,this.scene.getNonDeletedElementsMap());W=P?L6.getSegmentMidPointIndex(this.state.selectedLinearElement,this.state,P,this.scene.getNonDeletedElementsMap()):-1}let q=L6.moveFixedSegment(this.state.selectedLinearElement,W,Q,G,this.scene.getNonDeletedElementsMap());wg.flushSync(()=>{this.state.selectedLinearElement&&this.setState({selectedLinearElement:{...this.state.selectedLinearElement,segmentMidPointHoveredCoords:q.segmentMidPointHoveredCoords,pointerDownState:q.pointerDownState}})});return}let U=this.lastPointerMoveCoords??B.origin;if(this.lastPointerMoveCoords=F,B.drag.offset===null&&(B.drag.offset=yO(AV3(this.scene.getSelectedElements(this.state),B.origin.x,B.origin.y))),!(C.target instanceof HTMLElement)||this.handlePointerMoveOverScrollbars(C,B))return;if(AN(this.state)){this.handleEraser(C,B,F);return}this.state.activeTool.type==="laser"&&this.laserTrails.addPointToPath(F.x,F.y);let[D,Z]=nD(F.x,F.y,C[pu.CTRL_OR_CMD]?null:this.getEffectiveGridSize());if(!B.drag.hasOccurred&&(this.state.activeTool.type==="arrow"||this.state.activeTool.type==="line")&&iB(v0(F.x,F.y),v0(B.origin.x,B.origin.y)){this.state.selectedLinearElement&&this.setState({selectedLinearElement:{...this.state.selectedLinearElement,pointerDownState:G.pointerDownState,selectedPointsIndices:G.selectedPointsIndices}}),this.state.editingLinearElement&&this.setState({editingLinearElement:{...this.state.editingLinearElement,pointerDownState:G.pointerDownState,selectedPointsIndices:G.selectedPointsIndices}})});return}else if(Q.pointerDownState.segmentMidpoint.value!==null&&!Q.pointerDownState.segmentMidpoint.added)return;if(L6.handlePointDragging(C,this,F.x,F.y,(G,W)=>{this.maybeSuggestBindingsForLinearElementAtCoords(G,W)},Q,this.scene)){B.lastCoords.x=F.x,B.lastCoords.y=F.y,B.drag.hasOccurred=!0,this.state.editingLinearElement&&!this.state.editingLinearElement.isDragging&&this.setState({editingLinearElement:{...this.state.editingLinearElement,isDragging:!0}}),this.state.selectedLinearElement.isDragging||this.setState({selectedLinearElement:{...this.state.selectedLinearElement,isDragging:!0}});return}}let M=B.hit.allHitElements.some((Q)=>this.isASelectedElement(Q)),K=this.state.editingLinearElement&&C.shiftKey&&this.state.editingLinearElement.elementId===B.hit.element?.id;if((M||B.hit.hasHitCommonBoundingBoxOfSelectedElements)&&!K){let Q=this.scene.getSelectedElements(this.state);if(Q.every((P)=>P.locked))return;let G=Q.find((P)=>w2(P)),W=this.getTopLayerFrameAtSceneCoords(F),q=W&&!G?W:null;if(this.state.frameToHighlight!==q&&wg.flushSync(()=>{this.setState({frameToHighlight:q})}),B.drag.hasOccurred=!0,Q.length>0&&!B.withCmdOrCtrl&&!this.state.editingTextElement&&this.state.activeEmbeddable?.state!=="active"){let P={x:F.x-B.origin.x,y:F.y-B.origin.y},w=[...B.originalElements.values()],N=C.shiftKey;if(N){let v=Math.abs(P.x),R=Math.abs(P.y),j=N&&vR;j&&(P.x=0),l&&(P.y=0)}if(this.state.croppingElementId){let v=this.scene.getNonDeletedElementsMap().get(this.state.croppingElementId);if(v&&gB(v)&&v.crop!==null&&B.hit.element===v){let R=v.crop,j=sY(v)&&this.imageCache.get(v.fileId)?.image;if(j&&!(j instanceof Promise)){let l=LF(eX(F.x-U.x,F.y-U.y),Math.max(this.state.zoom.value,2)),[y,h,_,$,m,p]=b2(v,X),i=D9(D3(v0(y,h),v0(m,p),v.angle)),t=D9(D3(v0(_,h),v0(m,p),v.angle)),a=D9(D3(v0(y,$),v0(m,p),v.angle)),o=XM(_H0(t,i)),u0=XM(_H0(a,i)),n=eX(yju(l,o),yju(l,u0)),B0={...R,x:$5(R.x-n[0]*Math.sign(v.scale[0]),0,j.naturalWidth-R.width),y:$5(R.y-n[1]*Math.sign(v.scale[1]),0,j.naturalHeight-R.height)};V3(v,{crop:B0});return}}}this.maybeCacheVisibleGaps(C,Q),this.maybeCacheReferenceSnapPoints(C,Q);let{snapOffset:k,snapLines:x}=ax3(w,P,this,C,this.scene.getNonDeletedElementsMap());if(this.setState({snapLines:x}),this.state.editingFrame||CV3(B,Q,P,this.scene,k,C[pu.CTRL_OR_CMD]?null:this.getEffectiveGridSize()),this.setState({selectedElementsAreBeingDragged:!0,selectionElement:null}),(Q.length!==1||!P6(Q[0]))&&this.setState({suggestedBindings:cn0(Q,this.scene.getNonDeletedElementsMap(),this.state.zoom)}),C.altKey&&!B.hit.hasBeenDuplicated){B.hit.hasBeenDuplicated=!0;let v=[],R=[],j=new Map,l=new Map,y=B.hit.element,h=new Set(this.scene.getSelectedElements({selectedElementIds:this.state.selectedElementIds,includeBoundTextElement:!0,includeElementsInFrames:!0}).map((m)=>m.id)),_=this.scene.getElementsIncludingDeleted();for(let m of _){let p=h.has(m.id)||m.id===y?.id&&B.hit.wasAddedToSelection;if(Math.abs(m.x)>1e7||Math.abs(m.x)>1e7||Math.abs(m.width)>1e7||Math.abs(m.height)>1e7){console.error("Alt+dragging element in scene with invalid dimensions",m.x,m.y,m.width,m.height,p);return}if(p){let i=Qlu(this.state.editingGroupId,j,m);if(Math.abs(i.x)>1e7||Math.abs(i.x)>1e7||Math.abs(i.width)>1e7||Math.abs(i.height)>1e7){console.error("Alt+dragging duplicated element with invalid dimensions",i.x,i.y,i.width,i.height);return}let t=B.originalElements.get(m.id);if(Math.abs(t.x)>1e7||Math.abs(t.x)>1e7||Math.abs(t.width)>1e7||Math.abs(t.height)>1e7){console.error("Alt+dragging duplicated element with invalid dimensions",t.x,t.y,t.width,t.height);return}V3(i,{x:t.x,y:t.y}),B.originalElements.set(i.id,i),v.push(i),R.push(m),l.set(m.id,i.id)}else v.push(m)}let $=[...v,...R];$=this.props.onDuplicate?.($,_)||$,BN($,P2(R)),zlu(v,R,l),dRu($,R,l,"duplicatesServeAsOld"),hlu($,R,l),this.scene.replaceAllElements($),this.maybeCacheVisibleGaps(C,Q,!0),this.maybeCacheReferenceSnapPoints(C,Q,!0)}return}}if(this.state.selectionElement)B.lastCoords.x=F.x,B.lastCoords.y=F.y,this.maybeDragNewGenericElement(B,C);else{let Q=this.state.newElement;if(!Q)return;if(Q.type==="freedraw"){let G=Q.points,W=F.x-Q.x,q=F.y-Q.y,P=G.length>0&&G[G.length-1];if(!(P&&P[0]===W&&P[1]===q)){let w=Q.simulatePressure?Q.pressures:[...Q.pressures,C.pressure];V3(Q,{points:[...G,v0(W,q)],pressures:w},!1),this.setState({newElement:Q})}}else if(d2(Q)){B.drag.hasOccurred=!0;let G=Q.points,W=D-Q.x,q=Z-Q.y;d90(C)&&G.length===2&&({width:W,height:q}=Ps0(Q.x,Q.y,F.x,F.y)),G.length===1?V3(Q,{points:[...G,v0(W,q)]},!1):(G.length===2||G.length>1&&P6(Q))&&V3(Q,{points:[...G.slice(0,-1),v0(W,q)]},!1,{isDragging:!0}),this.setState({newElement:Q}),dI(Q,!1)&&this.maybeSuggestBindingsForLinearElementAtCoords(Q,[F],this.state.startBoundElement)}else B.lastCoords.x=F.x,B.lastCoords.y=F.y,this.maybeDragNewGenericElement(B,C,!1)}if(this.state.activeTool.type==="selection"){B.boxSelection.hasOccurred=!0;let Q=this.scene.getNonDeletedElements();if(this.state.editingLinearElement)L6.handleBoxSelection(C,this.state,this.setState.bind(this),this.scene.getNonDeletedElementsMap());else{let G=!0;!C.shiftKey&&sD(Q,this.state)&&(B.withCmdOrCtrl&&B.hit.element?this.setState((q)=>NK({...q,selectedElementIds:{[B.hit.element.id]:!0}},this.scene.getNonDeletedElements(),q,this)):G=!1);let W=this.state.selectionElement?Os0(Q,this.state.selectionElement,this.scene.getNonDeletedElementsMap(),!1):[];this.setState((q)=>{let P={...G&&q.selectedElementIds,...W.reduce((w,N)=>(w[N.id]=!0,w),{})};return B.hit.element&&(W.length?delete P[B.hit.element.id]:P[B.hit.element.id]=!0),q=G?q:{...q,selectedGroupIds:{},editingGroupId:null},{...NK({editingGroupId:q.editingGroupId,selectedElementIds:P},this.scene.getNonDeletedElements(),q,this),selectedLinearElement:W.length===1&&d2(W[0])?new L6(W[0]):null,showHyperlinkPopup:W.length===1&&(W[0].link||$Q(W[0]))?"info":!1}})}}})}handlePointerMoveOverScrollbars(B,C){if(C.scrollbars.isOverHorizontal){let F=B.clientX,U=F-C.lastCoords.x;return this.translateCanvas({scrollX:this.state.scrollX-U/this.state.zoom.value}),C.lastCoords.x=F,!0}if(C.scrollbars.isOverVertical){let F=B.clientY,U=F-C.lastCoords.y;return this.translateCanvas({scrollY:this.state.scrollY-U/this.state.zoom.value}),C.lastCoords.y=F,!0}return!1}onPointerUpFromPointerDownHandler(B){return HU((C)=>{this.removePointer(C),B.eventListeners.onMove&&B.eventListeners.onMove.flush();let{newElement:F,resizingElement:U,croppingElementId:D,multiElement:Z,activeTool:X,isResizing:M,isRotating:K,isCropping:Q}=this.state;this.setState((w)=>({isResizing:!1,isRotating:!1,isCropping:!1,resizingElement:null,selectionElement:null,frameToHighlight:null,elementsToHighlight:null,cursorButton:"up",snapLines:z20(w.snapLines,[]),originSnapOffset:null})),this.lastPointerMoveCoords=null,lv.setReferenceSnapPoints(null),lv.setVisibleGaps(null),this.savePointer(C.clientX,C.clientY,"up"),this.setState({selectedElementsAreBeingDragged:!1});let G=this.scene.getNonDeletedElementsMap();if(B.drag.hasOccurred&&B.hit?.element?.id){let w=G.get(B.hit.element.id);pO(w)&&w.boundElements?.filter((N)=>N.type==="arrow").map((N)=>G.get(N.id)).filter((N)=>P6(N)).forEach((N)=>{N&&V3(N,{},!0)})}if(this.state.editingLinearElement)if(!B.boxSelection.hasOccurred&&B.hit?.element?.id!==this.state.editingLinearElement.elementId)this.actionManager.executeAction(TN);else{let w=L6.handlePointerUp(C,this.state.editingLinearElement,this.state,this.scene);w!==this.state.editingLinearElement&&this.setState({editingLinearElement:w,suggestedBindings:[]})}else if(this.state.selectedLinearElement){if(this.state.selectedLinearElement.elbowed){let w=L6.getElement(this.state.selectedLinearElement.elementId,this.scene.getNonDeletedElementsMap());w&&V3(w,{},!0)}if(B.hit?.element?.id!==this.state.selectedLinearElement.elementId)this.scene.getSelectedElements(this.state).length>1&&this.setState({selectedLinearElement:null});else{let w=L6.handlePointerUp(C,this.state.selectedLinearElement,this.state,this.scene),{startBindingElement:N,endBindingElement:k}=w,x=this.scene.getElement(w.elementId);dI(x)&&GQ0(x,N,k,G,this.scene),w!==this.state.selectedLinearElement&&this.setState({selectedLinearElement:{...w,selectedPointsIndices:null},suggestedBindings:[]})}}if(this.missingPointerEventCleanupEmitter.clear(),window.removeEventListener("pointermove",B.eventListeners.onMove),window.removeEventListener("pointerup",B.eventListeners.onUp),window.removeEventListener("keydown",B.eventListeners.onKeyDown),window.removeEventListener("keyup",B.eventListeners.onKeyUp),this.state.pendingImageElementId&&this.setState({pendingImageElementId:null}),this.props?.onPointerUp?.(X,B),this.onPointerUpEmitter.trigger(this.state.activeTool,B,C),F?.type==="freedraw"){let w=EC(C,this.state),N=F.points,k=w.x-F.x,x=w.y-F.y;k===N[0][0]&&x===N[0][1]&&(x+=0.0001,k+=0.0001);let v=F.simulatePressure?[]:[...F.pressures,C.pressure];V3(F,{points:[...N,v0(k,x)],pressures:v,lastCommittedPoint:v0(k,x)}),this.actionManager.executeAction(TN);return}if(gB(F)){let w=F;try{this.initializeImageDimensions(w),this.setState({selectedElementIds:pB({[w.id]:!0},this.state)},()=>{this.actionManager.executeAction(TN)})}catch(N){console.error(N),this.scene.replaceAllElements(this.scene.getElementsIncludingDeleted().filter((k)=>k.id!==w.id)),this.actionManager.executeAction(TN)}return}if(d2(F)){F.points.length>1&&this.store.shouldCaptureIncrement();let w=EC(C,this.state);!B.drag.hasOccurred&&F&&!Z?(V3(F,{points:[...F.points,v0(w.x-F.x,w.y-F.y)]}),this.setState({multiElement:F,newElement:F})):B.drag.hasOccurred&&!Z&&(Ti(this.state)&&dI(F,!1)&&on0(F,this.state,w,this.scene.getNonDeletedElementsMap(),this.scene.getNonDeletedElements()),this.setState({suggestedBindings:[],startBoundElement:null}),X.locked?this.setState((N)=>({newElement:null})):(cO(this.interactiveCanvas),this.setState((N)=>({newElement:null,activeTool:bU(this.state,{type:"selection"}),selectedElementIds:pB({...N.selectedElementIds,[F.id]:!0},N),selectedLinearElement:new L6(F)}))),this.scene.triggerUpdate());return}if(M6(F)){let w=On0(y8({fontSize:F.fontSize,fontFamily:F.fontFamily}),F.lineHeight);F.widthw.id!==F.id),appState:{newElement:null},captureUpdate:J3.NEVER});return}if(w2(F)){let w=ov3(this.scene.getElementsIncludingDeleted(),F,this.scene.getNonDeletedElementsMap());this.scene.replaceAllElements(S20(this.scene.getElementsMapIncludingDeleted(),w,F,this.state))}if(F&&(V3(F,slu(F)),this.scene.triggerUpdate()),B.drag.hasOccurred){let w=EC(C,this.state);if(this.state.selectedLinearElement&&this.state.selectedLinearElement.isDragging){let N=this.scene.getElement(this.state.selectedLinearElement.elementId);if(N?.frameId){let k=_Q(N,G);k&&N&&(ll(N,k,this.scene.getNonDeletedElementsMap())||(V3(N,{groupIds:[]}),xQ0([N],this.scene.getNonDeletedElementsMap()),this.scene.triggerUpdate()))}}else{let N=this.getTopLayerFrameAtSceneCoords(w),k=this.scene.getSelectedElements(this.state),x=this.scene.getElementsMapIncludingDeleted(),v=(R)=>{if(R.length>0){for(let j of R){let l=j.groupIds.indexOf(this.state.editingGroupId);V3(j,{groupIds:j.groupIds.slice(0,l)},!1)}x.forEach((j)=>{j.groupIds.length&&xC(x,j.groupIds[j.groupIds.length-1]).length<2&&V3(j,{groupIds:[]},!1)}),this.setState({editingGroupId:null})}};if(N&&!this.state.selectedElementIds[N.id]){let R=k.filter((j)=>j.frameId!==N.id&&vQ0(j,x,this.state));this.state.editingGroupId&&v(R),x=S20(x,R,N,this.state)}else if(!N&&this.state.editingGroupId){let R=k.filter((j)=>j.frameId&&!vQ0(j,x,this.state));v(R)}x=ud(x,this.state,this),this.scene.replaceAllElements(x)}}if(U&&this.store.shouldCaptureIncrement(),U&&Bd(U)&&this.updateScene({elements:this.scene.getElementsIncludingDeleted().filter((w)=>w.id!==U.id),captureUpdate:J3.NEVER}),B.resize.isResizing){let w=ud(this.scene.getElementsIncludingDeleted(),this.state,this),N=this.scene.getSelectedElements(this.state).filter((k)=>w2(k));for(let k of N)w=glu(w,TQ0(this.scene.getElementsIncludingDeleted(),k,this.state,G),k,this);this.scene.replaceAllElements(w)}let W=B.hit.element;this.state.selectedLinearElement?.elementId!==W?.id&&d2(W)&&this.scene.getSelectedElements(this.state).length===1&&this.setState({selectedLinearElement:new L6(W)}),(!D||D&&(!W&&!Q||W&&W.id!==D))&&this.finishImageCropping();let q=this.lastPointerDownEvent,P=this.lastPointerUpEvent||this.lastPointerMoveEvent;if(AN(this.state)&&q&&P){if(this.eraserTrail.endPath(),iB(v0(q.clientX,q.clientY),v0(P.clientX,P.clientY))===0){let w=EC({clientX:P.clientX,clientY:P.clientY},this.state);this.getElementsAtPosition(w.x,w.y).forEach((N)=>this.elementsPendingErasure.add(N.id))}this.eraseElements();return}else this.elementsPendingErasure.size&&this.restoreReadyToEraseElements();if(W&&!B.drag.hasOccurred&&!B.hit.wasAddedToSelection&&(!this.state.editingLinearElement||!B.boxSelection.hasOccurred)&&(C.shiftKey&&!this.state.editingLinearElement?this.state.selectedElementIds[W.id]?Blu(this.state,W)?this.setState((w)=>{let N={...w.selectedElementIds};for(let k of W.groupIds.flatMap((x)=>xC(this.scene.getNonDeletedElements(),x)))delete N[k.id];return{selectedGroupIds:{...w.selectedElementIds,...W.groupIds.map((k)=>({[k]:!1})).reduce((k,x)=>({...k,...x}),{})},selectedElementIds:pB(N,w)}}):this.state.selectedLinearElement?.isDragging||this.setState((w)=>{let N={...w.selectedElementIds};delete N[W.id];let k=W5(this.scene.getNonDeletedElements(),{selectedElementIds:N});return{...NK({editingGroupId:w.editingGroupId,selectedElementIds:N},this.scene.getNonDeletedElements(),w,this),selectedLinearElement:k.length===1&&d2(k[0])?new L6(k[0]):w.selectedLinearElement}}):W.frameId&&this.state.selectedElementIds[W.frameId]?this.setState((w)=>{let N={...w.selectedElementIds,[W.id]:!0};return delete N[W.frameId],(this.scene.getElement(W.frameId)?.groupIds??[]).flatMap((k)=>xC(this.scene.getNonDeletedElements(),k)).forEach((k)=>{delete N[k.id]}),{...NK({editingGroupId:w.editingGroupId,selectedElementIds:N},this.scene.getNonDeletedElements(),w,this),showHyperlinkPopup:W.link||$Q(W)?"info":!1}}):this.setState((w)=>({selectedElementIds:pB({...w.selectedElementIds,[W.id]:!0},w)})):this.setState((w)=>({...NK({editingGroupId:w.editingGroupId,selectedElementIds:{[W.id]:!0}},this.scene.getNonDeletedElements(),w,this),selectedLinearElement:d2(W)&&w.selectedLinearElement?.elementId!==W.id?new L6(W):w.selectedLinearElement}))),!(W&&P6(W))&&!B.drag.hasOccurred&&!this.state.isResizing&&(W&&Yx3({x:B.origin.x,y:B.origin.y,element:W,shape:wv(W,this.scene.getNonDeletedElementsMap()),threshold:this.getElementHitThreshold(),frameNameBound:w2(W)?this.frameNameBoundsCache.get(W):null},G)||!W&&B.hit.hasHitCommonBoundingBoxOfSelectedElements)){this.state.editingLinearElement?this.setState({editingLinearElement:null}):this.setState({selectedElementIds:pB({},this.state),selectedGroupIds:{},editingGroupId:null,activeEmbeddable:null}),_8(this.interactiveCanvas,O8.AUTO);return}if(!X.locked&&X.type!=="freedraw"&&F&&this.setState((w)=>({selectedElementIds:pB({...w.selectedElementIds,[F.id]:!0},w),showHyperlinkPopup:$Q(F)&&!F.link?"editor":w.showHyperlinkPopup})),(X.type!=="selection"||sD(this.scene.getNonDeletedElements(),this.state)||!uJ(this.state.previousSelectedElementIds,this.state.selectedElementIds))&&this.store.shouldCaptureIncrement(),B.drag.hasOccurred||M||K||Q){let w=this.scene.getSelectedElements(this.state).filter(d2);LQ0(w,this.scene.getNonDeletedElementsMap(),this.scene.getNonDeletedElements(),this.scene,Ti(this.state),this.state.selectedLinearElement?.selectedPointsIndices??[],this.state.zoom)}if(X.type==="laser"){this.laserTrails.endPath();return}!X.locked&&X.type!=="freedraw"?(cO(this.interactiveCanvas),this.setState({newElement:null,suggestedBindings:[],activeTool:bU(this.state,{type:"selection"})})):this.setState({newElement:null,suggestedBindings:[]}),W&&this.lastPointerUpEvent&&this.lastPointerDownEvent&&this.lastPointerUpEvent.timeStamp-this.lastPointerDownEvent.timeStamp<300&&B8.pointers.size<=1&&gY(W)&&this.isIframeLikeElementCenter(W,this.lastPointerUpEvent,B.origin.x,B.origin.y)&&this.handleEmbeddableCenterClick(W)})}clearSelection(B){this.setState((C)=>({selectedElementIds:pB({},C),activeEmbeddable:null,selectedGroupIds:{},editingGroupId:C.editingGroupId&&B!=null&&H20(B,C.editingGroupId)?C.editingGroupId:null})),this.setState({selectedElementIds:pB({},this.state),activeEmbeddable:null,previousSelectedElementIds:this.state.selectedElementIds})}getTextWysiwygSnappedToCenterPosition(B,C,F,U){if(U){let D=U.x+U.width/2,Z=U.y+U.height/2,X=en0(U,F,this.scene.getNonDeletedElementsMap());if(X&&(D=X.x,Z=X.y),Math.hypot(B-D,C-Z)C.code===this.props.langCode)||T50;await XA1(B),this.setAppState({})}},Xq9=()=>{(y2.MODE===hQ.TEST||y2.DEV)&&(window.h=window.h||{},Object.defineProperties(window.h,{elements:{configurable:!0,get(){return this.app?.scene.getElementsIncludingDeleted()},set(u){return this.app?.scene.replaceAllElements(fv(u))}},scene:{configurable:!0,get(){return this.app?.scene}}}))};Xq9();var Jq9=Zq9,Mq9=()=>{Array.prototype.at||Object.defineProperty(Array.prototype,"at",{value:function(u){if(u=Math.trunc(u)||0,u<0&&(u+=this.length),!(u<0||u>=this.length))return this[u]},writable:!0,enumerable:!1,configurable:!0}),Element.prototype.replaceChildren||(Element.prototype.replaceChildren=function(...u){this.innerHTML="",this.append(...u)})},Kq9=Mq9,Hq9=({children:u})=>{let{FooterCenterTunnel:B}=oQ(),C=LM();return d(B.In,{children:d("div",{className:j3("footer-center zen-mode-transition",{"layer-ui__wrapper__footer-left--transition-bottom":C.zenModeEnabled}),children:u})})};Hq9.displayName="FooterCenter";var Qq9=()=>d("svg",{viewBox:"0 0 40 40",fill:"none",xmlns:"http://www.w3.org/2000/svg",className:"ExcalidrawLogo-icon",children:d("path",{d:"M39.9 32.889a.326.326 0 0 0-.279-.056c-2.094-3.083-4.774-6-7.343-8.833l-.419-.472a.212.212 0 0 0-.056-.139.586.586 0 0 0-.167-.111l-.084-.083-.056-.056c-.084-.167-.28-.278-.475-.167-.782.39-1.507.973-2.206 1.528-.92.722-1.842 1.445-2.708 2.25a8.405 8.405 0 0 0-.977 1.028c-.14.194-.028.361.14.444-.615.611-1.23 1.223-1.843 1.861a.315.315 0 0 0-.084.223c0 .083.056.166.111.194l1.09.833v.028c1.535 1.528 4.244 3.611 7.12 5.861.418.334.865.667 1.284 1 .195.223.39.473.558.695.084.11.28.139.391.055.056.056.14.111.196.167a.398.398 0 0 0 .167.056.255.255 0 0 0 .224-.111.394.394 0 0 0 .055-.167c.029 0 .028.028.056.028a.318.318 0 0 0 .224-.084l5.082-5.528a.309.309 0 0 0 0-.444Zm-14.63-1.917a.485.485 0 0 0 .111.14c.586.5 1.2 1 1.843 1.555l-2.569-1.945-.251-.166c-.056-.028-.112-.084-.168-.111l-.195-.167.056-.056.055-.055.112-.111c.866-.861 2.346-2.306 3.1-3.028-.81.805-2.43 3.167-2.095 3.944Zm8.767 6.89-2.122-1.612a44.713 44.713 0 0 0-2.625-2.5c1.145.861 2.122 1.611 2.262 1.75 1.117.972 1.06.806 1.815 1.445l.921.666a1.06 1.06 0 0 1-.251.25Zm.558.416-.056-.028c.084-.055.168-.111.252-.194l-.196.222ZM1.089 5.75c.055.361.14.722.195 1.056.335 1.833.67 3.5 1.284 4.75l.252.944c.084.361.223.806.363.917 1.424 1.25 3.602 3.11 5.947 4.889a.295.295 0 0 0 .363 0s0 .027.028.027a.254.254 0 0 0 .196.084.318.318 0 0 0 .223-.084c2.988-3.305 5.221-6.027 6.813-8.305.112-.111.14-.278.14-.417.111-.111.195-.25.307-.333.111-.111.111-.306 0-.39l-.028-.027c0-.055-.028-.139-.084-.167-.698-.666-1.2-1.138-1.731-1.638-.922-.862-1.871-1.75-3.881-3.75l-.028-.028c-.028-.028-.056-.056-.112-.056-.558-.194-1.703-.389-3.127-.639C6.087 2.223 3.21 1.723.614.944c0 0-.168 0-.196.028l-.083.084c-.028.027-.056.055-.224.11h.056-.056c.028.167.028.278.084.473 0 .055.112.5.112.555l.782 3.556Zm15.496 3.278-.335-.334c.084.112.196.195.335.334Zm-3.546 4.666-.056.056c0-.028.028-.056.056-.056Zm-2.038-10c.168.167.866.834 1.033.973-.726-.334-2.54-1.167-3.379-1.445.838.167 1.983.334 2.346.472ZM1.424 2.306c.419.722.754 3.222 1.089 5.666-.196-.778-.335-1.555-.503-2.278-.251-1.277-.503-2.416-.838-3.416.056 0 .14 0 .252.028Zm-.168-.584c-.112 0-.223-.028-.307-.028 0-.027 0-.055-.028-.055.14 0 .223.028.335.083Zm-1.089.222c0-.027 0-.027 0 0ZM39.453 1.333c.028-.11-.558-.61-.363-.639.42-.027.42-.666 0-.666-.558.028-1.144.166-1.675.25-.977.194-1.982.389-2.96.61-2.205.473-4.383.973-6.561 1.557-.67.194-1.424.333-2.066.666-.224.111-.196.333-.084.472-.056.028-.084.028-.14.056-.195.028-.363.056-.558.083-.168.028-.252.167-.224.334 0 .027.028.083.028.11-1.173 1.556-2.485 3.195-3.909 4.945-1.396 1.611-2.876 3.306-4.356 5.056-4.719 5.5-10.052 11.75-15.943 17.25a.268.268 0 0 0 0 .389c.028.027.056.055.084.055-.084.084-.168.14-.252.222-.056.056-.084.111-.084.167a.605.605 0 0 0-.111.139c-.112.111-.112.305.028.389.111.11.307.11.39-.028.029-.028.029-.056.056-.056a.44.44 0 0 1 .615 0c.335.362.67.723.977 1.028l-.698-.583c-.112-.111-.307-.083-.39.028-.113.11-.085.305.027.389l7.427 6.194c.056.056.112.056.196.056s.14-.028.195-.084l.168-.166c.028.027.083.027.111.027.084 0 .14-.027.196-.083 10.052-10.055 18.15-17.639 27.42-24.417.083-.055.111-.166.111-.25.112 0 .196-.083.251-.194 1.704-5.194 2.039-9.806 2.15-12.083v-.028c0-.028.028-.056.028-.083.028-.056.028-.084.028-.084a1.626 1.626 0 0 0-.111-1.028ZM21.472 9.5c.446-.5.893-1.028 1.34-1.5-2.876 3.778-7.65 9.583-14.408 16.5 4.607-5.083 9.242-10.333 13.068-15ZM5.193 35.778h.084-.084Zm3.462 3.194c-.027-.028-.027-.028 0-.028v.028Zm4.16-3.583c.224-.25.448-.472.699-.722 0 0 0 .027.028.027-.252.223-.475.445-.726.695Zm1.146-1.111c.14-.14.279-.334.446-.5l.028-.028c1.648-1.694 3.351-3.389 5.082-5.111l.028-.028c.419-.333.921-.694 1.368-1.028a379.003 379.003 0 0 0-6.952 6.695ZM24.794 6.472c-.921 1.195-1.954 2.778-2.82 4.028-2.736 3.944-11.532 13.583-11.727 13.75a1976.983 1976.983 0 0 1-8.042 7.639l-.167.167c-.14-.167-.14-.417.028-.556C14.49 19.861 22.03 10.167 25.074 5.917c-.084.194-.14.36-.28.555Zm4.83 5.695c-1.116-.64-1.646-1.64-1.34-2.611l.084-.334c.028-.083.084-.194.14-.277.307-.5.754-.917 1.257-1.167.027 0 .055 0 .083-.028-.028-.056-.028-.139-.028-.222.028-.167.14-.278.335-.278.335 0 1.369.306 1.76.639.111.083.223.194.335.305.14.167.363.445.474.667.056.028.112.306.196.445.056.222.111.472.084.694-.028.028 0 .194-.028.194a2.668 2.668 0 0 1-.363 1.028c-.028.028-.028.056-.056.084l-.028.027c-.14.223-.335.417-.53.556-.643.444-1.369.583-2.095.389 0 0-.195-.084-.28-.111Zm8.154-.834a39.098 39.098 0 0 1-.893 3.167c0 .028-.028.083 0 .111-.056 0-.084.028-.14.056-2.206 1.61-4.356 3.305-6.506 5.028 1.843-1.64 3.686-3.306 5.613-4.945.558-.5.949-1.139 1.06-1.861l.28-1.667v-.055c.14-.334.67-.195.586.166Z",fill:"currentColor"})}),Gq9=()=>c0("svg",{viewBox:"0 0 450 55",xmlns:"http://www.w3.org/2000/svg",fill:"none",className:"ExcalidrawLogo-text",children:[d("path",{d:"M429.27 96.74c2.47-1.39 4.78-3.02 6.83-4.95 1.43-1.35 2.73-2.86 3.81-4.51-.66.9-1.4 1.77-2.23 2.59-2.91 2.84-5.72 5.09-8.42 6.87h.01ZM343.6 69.36c.33 3.13.58 6.27.79 9.4.09 1.37.18 2.75.25 4.12-.12-4.46-.27-8.93-.5-13.39-.11-2.08-.24-4.16-.4-6.24-.06 1.79-.11 3.85-.13 6.11h-.01ZM378.47 98.34c.01-.37.07-1.13.01-6.51-.11 1.9-.22 3.81-.31 5.71-.07 1.42-.22 2.91-.16 4.35.39.03.78.07 1.17.1-.92-.85-.76-2.01-.72-3.66l.01.01ZM344.09 86.12c-.09-2.41-.22-4.83-.39-7.24v12.21c.15-.05.32-.09.47-.14.05-1.61-.03-3.23-.09-4.83h.01ZM440.69 66.79c-.22-.34-.45-.67-.69-.99-3.71-4.87-9.91-7.14-15.65-8.55-1.05-.26-2.12-.49-3.18-.71 2.29.59 4.48 1.26 6.64 2.02 7.19 2.54 10.57 5.41 12.88 8.23ZM305.09 72.46l1.2 3.6c.84 2.53 1.67 5.06 2.46 7.61.24.78.5 1.57.73 2.36.22-.04.44-.08.67-.12a776.9 776.9 0 0 1-5.01-13.57c-.02.04-.03.09-.05.13v-.01ZM345.49 90.25v.31c1.48-.42 3.05-.83 4.66-1.2-1.56.25-3.12.52-4.66.89ZM371.02 90.22c0-.57-.04-1.14-.11-1.71-.06-.02-.12-.04-.19-.05-.21-.05-.43-.08-.65-.11.42.16.74.88.95 1.87ZM398.93 54.23c-.13 0-.27-.01-.4-.02l.03.4c.11-.15.23-.27.37-.38ZM401.57 62.28v-.15c-1.22-.24-2.86-.61-3.23-1.25-.09-.15-.18-.51-.27-.98-.09.37-.2.73-.33 1.09 1.24.56 2.52.98 3.83 1.29ZM421.73 88.68c-2.97 1.65-6.28 3.12-9.69 3.68v.18c4.72-.14 11.63-3.85 16.33-8.38-2.04 1.75-4.33 3.24-6.63 4.53l-.01-.01ZM411.28 80.92c-.05-1.2-.09-2.4-.15-3.6-.21 5.66-.46 11.38-.47 14.51.24-.02.48-.04.71-.07.15-3.61.05-7.23-.09-10.83v-.01Z",transform:"translate(-144.023 -51.76)"}),d("path",{d:"M425.38 67.41c-3.5-1.45-7.19-2.57-14.06-3.62.09 1.97.06 4.88-.03 8.12.03.04.06.09.06.15.19 1.36.28 2.73.37 4.1.25 3.77.39 7.55.41 11.33 0 1.38-.01 2.76-.07 4.13 1.4-.25 2.78-.65 4.12-1.15 4.07-1.5 7.94-3.78 11.28-6.54 2.33-1.92 5.13-4.49 5.88-7.58.63-3.53-2.45-6.68-7.97-8.96l.01.02ZM411.35 92.53v-.06l-.34.03c.11.01.22.03.34.03ZM314.26 64.06c-.23-.59-.47-1.17-.7-1.75.57 1.62 1.11 3.25 1.6 4.9l.15.54 2.35 6.05c.32.82.66 1.64.98 2.46-1.38-4.1-2.83-8.17-4.39-12.2h.01ZM156.82 103.07c-.18.13-.38.23-.58.33 1.32-.03 2.66-.2 3.93-.34.86-.09 1.72-.22 2.58-.33-2.12.1-4.12.17-5.94.34h.01ZM210.14 68.88s.03.04.05.07c.18-.31.39-.64.58-.96-.21.3-.42.6-.64.89h.01ZM201.65 82.8c-.5.77-1.02 1.56-1.49 2.37 1.11-1.55 2.21-3.1 3.2-4.59-.23.23-.49.51-.75.79-.32.47-.65.95-.96 1.43ZM194.03 98.66c-.33-.4-.65-.84-1.05-1.17-.24-.2-.07-.49.17-.56-.23-.26-.42-.5-.63-.75 1.51-2.55 3.93-5.87 6.4-9.28-.17-.08-.29-.28-.2-.49.04-.09.09-.17.13-.26-1.21 1.78-2.42 3.55-3.61 5.33-.87 1.31-1.74 2.64-2.54 4-.29.5-.63 1.04-.87 1.61.81.65 1.63 1.27 2.47 1.88-.09-.11-.18-.21-.27-.32v.01ZM307.79 82.93c-1-3.17-2.05-6.32-3.1-9.48-1.62 4.08-3.69 9.17-6.16 15.19 3.32-1.04 6.77-1.87 10.27-2.5-.32-1.08-.67-2.15-1.01-3.21ZM149.5 80.7c.05-1.71.04-3.43 0-5.14-.1 2.26-.16 4.51-.22 6.77-.02.73-.03 1.46-.04 2.19.14-1.27.2-2.55.24-3.82h.02ZM228.98 98.3c.39 1.25.91 3.03.94 3.91.06-.03.12-.07.17-.1.08-1.29-.55-2.65-1.11-3.81ZM307.72 53.36c.81.5 1.53 1.04 2.07 1.49-.38-.8-.78-1.58-1.21-2.35-.17.03-.34.06-.51.11-.43.12-.86.26-1.29.41.35-.01.53.1.94.34ZM283.69 96.14c3.91-7.25 6.89-13.35 8.88-18.15l1.1-2.66c-1.27 2.64-2.56 5.27-3.83 7.9-1.53 3.15-3.06 6.31-4.58 9.47-.87 1.81-1.76 3.62-2.54 5.47.04.02.07.04.11.07.05.05.1.09.15.14.05-.73.27-1.48.71-2.24ZM289.92 103.23s-.04.01-.05.03c0-.02.04-.03.05-.04.05-.05.11-.1.16-.15l.21-.21c-.55 0-1.5-.27-2.55-.72.4.26.8.51 1.22.74.24.13.48.26.73.37.05.02.1.03.14.05a.27.27 0 0 1 .08-.07h.01ZM269.23 68.49c-.39-.19-.82-.48-1.33-.87-3.06-1.56-6.31-2.78-9.36-2.35-3.5.49-5.7 1.11-7.74 2.44 5.71-2.6 12.82-2.07 18.44.79l-.01-.01ZM177.87 53.69l1.06.03c-.96-.22-2-.25-2.89-.3-4.95-.26-9.99.33-14.86 1.19-2.44.43-4.88.95-7.28 1.59 9.09-1.76 15.69-2.77 23.97-2.51ZM219.85 55.51c-.18.12-.36.27-.56.45-.45.53-.86 1.11-1.26 1.66-1.91 2.61-3.71 5.31-5.57 7.95l-.12.18 8.05-10.11c-.18-.05-.36-.1-.55-.13h.01ZM510.71 54.1c.12-.15.29-.3.53-.45.69-.4 3.72-.63 5.87-.74-.36-.02-.73-.04-1.09-.05-1.84-.03-3.67.09-5.49.35.05.3.12.59.18.88v.01ZM510.76 86.02c1.37-3.07 2.49-6.27 3.57-9.46.55-1.64 1.12-3.3 1.6-4.97-1.59 4.01-3.67 9.14-6.2 15.3.24-.08.5-.14.74-.22.1-.22.19-.44.29-.65ZM566.95 75.76c.11-.02.23.03.31.11-.05-.13-.09-.26-.14-.39-.05.09-.11.18-.17.28ZM511.33 86.41c3.08-.89 6.24-1.62 9.46-2.14-1.51-3.98-2.98-7.96-4.39-11.87-.05.15-.09.31-.14.46-1.02 3.32-2.15 6.61-3.39 9.85-.48 1.25-.98 2.49-1.53 3.7h-.01ZM578.24 74.45c.11-.44.23-.87.35-1.31-.31.7-.64 1.39-.97 2.08.09.21.19.4.28.61.12-.46.23-.92.35-1.38h-.01ZM520.62 53.11c-.09 0-.18-.01-.28-.02.38.34.29 1.08.93 2.53l6.65 17.15c2.2 5.68 4.69 11.36 7.41 16.87l1.06 2.17c-2.95-7.05-5.92-14.08-8.87-21.13-1.58-3.79-3.16-7.59-4.7-11.4-.78-1.92-1.73-3.89-2.25-5.91-.03-.1 0-.19.04-.26h.01ZM578.78 77.87c1.45-5.77 3.07-10.43 3.58-13.36.05-.34.16-.88.31-1.55-.67 1.79-1.37 3.56-2.08 5.33-.12.43-.23.86-.35 1.29-.65 2.43-1.29 4.86-1.9 7.3.14.33.29.65.43 1l.01-.01ZM545.3 94.66c.02-.44.03-.83.05-1.12.02-1.01.05-2.02.11-3.02.03-6.66-.46-14.33-1.46-22.8-.13-.42-.27-1.24-.56-2.89 0-.02 0-.04-.01-.06.62 6.61.95 13.25 1.32 19.87.17 3.08.33 6.16.52 9.23.02.25.03.52.04.78l-.01.01ZM580.77 102.81c.13.2.27.38.37.49.27-.11.53-.22.8-.32-.43.09-.82.05-1.17-.16v-.01ZM530.48 104.07h.33c-.36-.13-.71-.32-1.04-.56.14.24.3.47.45.7.06-.08.14-.13.26-.13v-.01ZM542.63 58.82c.06.23.11.47.15.71.14-.33.36-.62.7-.86-.28.05-.57.11-.85.15ZM583.81 57.87c.15-.7.29-1.41.42-2.11-.14.45-.28.9-.42 1.34-.46 1.44-.89 2.89-1.31 4.34.44-1.19.88-2.37 1.31-3.57ZM523.62 91.48c-4.66 1.17-9.05 2.89-14.02 5.27 4.65-1.84 9.48-3.29 14.28-4.63-.09-.22-.17-.41-.26-.64ZM460.64 78.3c-.04-2.9-.11-5.81-.28-8.71-.1-1.68-.17-3.43-.5-5.09-.07.02-.14.03-.2.05.3 6.54.45 12.17.51 17.12.17-.07.34-.14.51-.2 0-1.06-.01-2.11-.03-3.17h-.01ZM470.63 63.24c-3.38-.26-6.81.32-10.1 1.1.41 2.01.47 4.14.57 6.18.18 3.55.25 7.11.27 10.67 3.31-1.38 6.5-3.12 9.3-5.35 1.96-1.56 3.86-3.41 5.02-5.66.73-1.41 1.19-3.22.26-4.65-1.09-1.7-3.46-2.14-5.32-2.29ZM460.29 63.68c1-.24 2.01-.46 3.04-.65-1.15.16-2.37.38-3.71.69v.13c.07-.02.15-.04.22-.05.11-.13.3-.18.45-.11v-.01ZM457.24 100.96c.43-.03.86-.07 1.29-.11.14-.49.27-.99.38-1.49-.44.7-1 1.23-1.67 1.6ZM482.88 104.98c-.18.23-.36.38-.55.47.14.09.27.19.4.28a70.76 70.76 0 0 0 4.37-4.63c.76-.89 1.52-1.81 2.19-2.77-.3-.27-.61-.53-.92-.79-.07 1.94-4.62 6.32-5.49 7.45v-.01Z",transform:"translate(-144.023 -51.76)"}),d("path",{d:"M474.36 63.31c-.4-.16-.84-.27-1.29-.37 1.56.42 3.08 1.22 3.76 2.74.62 1.4.32 2.95-.28 4.32.7-1.22.94-2.34.74-3.47-.24-1.33-1.19-2.54-2.93-3.21v-.01ZM477.34 89.18c-1.2-.81-2.4-1.62-3.6-2.42-.14.1-.26.19-.4.29 1.4.67 2.73 1.39 4 2.13ZM465.88 93.85c.37.25.74.5 1.1.75.46.32.92.65 1.38.97-1.57-1.2-2.01-1.61-2.49-1.72h.01ZM574.92 90.06c-2.28-5.21-4.93-11.13-5.67-12.26-.1-.15-1.57-3.01-1.63-3.08 0 0-.01.02-.02.02.4 1.37 1.09 2.69 1.65 3.99 2.14 4.95 4.36 9.86 6.67 14.73.6 1.26 1.21 2.52 1.83 3.78-.75-2.01-1.64-4.45-2.83-7.18ZM448.73 65.29c.1.2.22.38.34.57.22-.02.43-.06.65-.08v-.08c-.14-.05-.25 0-.99-.41ZM460.16 94.81c-.02.31-.06.59-.1.89-.03 1.71-.33 3.43-.79 5.07.15-.02.3-.03.45-.05.01-.04.02-.08.03-.11.09-.34.15-.69.2-1.03.17-1.07.25-2.16.33-3.24.05-.69.08-1.39.12-2.08-.27.1-.27.26-.24.57v-.02Z",transform:"translate(-144.023 -51.76)"}),d("path",{d:"m328.67 98.12-3.22-6.58c-1.29-2.63-2.53-5.29-3.72-7.97-.25-.85-.52-1.69-.79-2.53-.81-2.57-1.67-5.12-2.55-7.67-1.92-5.53-3.9-11.08-6.32-16.41-.72-1.58-1.46-3.44-2.63-4.79-.03-.17-.16-.29-.34-.36a.282.282 0 0 0-.23-.04c-.06-.01-.12 0-.18.01-.74.06-1.5.38-2.19.61-2.22.77-4.4 1.64-6.63 2.38-.03-.08-.06-.16-.09-.25-.15-.42-.82-.24-.67.19.03.09.07.19.1.28l-.18.06c-.36.11-.28.6 0 .68.18 1.18.63 2.36.98 3.49.03.09.06.17.08.26-.08.23-.17.46-.24.64-.37.98-.79 1.94-1.21 2.9-1.27 2.89-2.62 5.75-3.98 8.6-3.18 6.67-6.44 13.31-9.64 19.97-1.08 2.25-2.2 4.5-3.15 6.81-.13.32.24.5.5.37 1.34 1.33 2.84 2.5 4.4 3.57.65.44 1.31.87 2.01 1.24.4.22.86.48 1.33.5.24.01.35-.19.33-.37.11-.1.21-.21.28-.28.41-.41.81-.84 1.2-1.26.85-.92 1.69-1.87 2.5-2.84 6.31-2.34 12.6-4.31 18.71-5.84 2.14 5.3 3.43 8.43 3.97 9.58.55 1.05 1.15 1.88 1.82 2.52 1.32.56 6.96-.03 9.23-1.96.87-1.28 1.19-2.67.93-4.15-.09-.5-.22-.95-.4-1.33l-.01-.03Zm-20.09-45.61c.43.77.83 1.56 1.21 2.35-.54-.45-1.27-.99-2.07-1.49-.42-.24-.6-.35-.94-.34.43-.15.85-.29 1.29-.41.17-.05.34-.08.51-.11Zm-25.86 45.66c.78-1.85 1.67-3.66 2.54-5.47 1.51-3.16 3.05-6.31 4.58-9.47 1.28-2.63 2.56-5.26 3.83-7.9l-1.1 2.66c-1.99 4.79-4.97 10.9-8.88 18.15-.43.76-.66 1.51-.71 2.24-.05-.05-.1-.09-.15-.14a.259.259 0 0 0-.11-.07Zm6.24 4.71c-.42-.23-.82-.48-1.22-.74 1.05.45 2 .72 2.55.72l-.21.21c-.05.05-.11.1-.16.15-.01.01-.04.03-.05.04 0-.02.03-.02.05-.03a.27.27 0 0 0-.08.07c-.05-.02-.1-.03-.14-.05-.25-.1-.49-.24-.73-.37h-.01Zm15.73-29.43c1.05 3.15 2.1 6.31 3.1 9.48.34 1.06.69 2.13 1.01 3.21-3.5.63-6.95 1.46-10.27 2.5 2.48-6.03 4.54-11.11 6.16-15.19Zm4.79 12.57c-.23-.79-.49-1.58-.73-2.36-.79-2.54-1.63-5.08-2.46-7.61l-1.2-3.6c.02-.04.04-.09.05-.13 1.6 4.45 3.28 9 5.01 13.57l-.67.12v.01Zm5.83-18.27-.15-.54c-.49-1.64-1.03-3.28-1.6-4.9.23.58.47 1.17.7 1.75 1.56 4.03 3.01 8.1 4.39 12.2-.33-.82-.67-1.64-.98-2.46l-2.35-6.05h-.01ZM390.43 79.37c-.13-10.43-.22-17.5-.24-19.97-.24-1.6.21-2.88-.65-3.65-.14-.13-.32-.23-.52-.32h.03c.45 0 .45-.69 0-.7-1.75-.03-3.5-.04-5.25-.14-1.38-.08-2.76-.21-4.15-.31-.07 0-.12.01-.17.04-.21-.07-.47.03-.45.31l.03.45c-.11.14-.19.3-.22.5-.21 1.26-.32 13.67-.36 23.59-.32 5.79-.67 11.57-.97 17.36-.09 1.73-.29 3.54-.21 5.3-.39.02-.38.64.04.69v.12c.05.44.74.45.7 0v-.06c1.1.09 2.2.21 3.3.3 1.14.19 2.44.2 3.29.17 1.73-.05 2.92-.05 3.8-.37.45-.05.9-.11 1.35-.17.44-.06.25-.73-.19-.67h-.01c.24-.32.45-.72.62-1.25.66-1.84.41-6.36.34-11.33l-.13-9.9.02.01Zm-12.26 18.17c.09-1.91.2-3.81.31-5.71.06 5.38 0 6.14-.01 6.51-.05 1.65-.21 2.81.72 3.66-.39-.04-.78-.07-1.17-.1-.06-1.44.09-2.93.16-4.35l-.01-.01ZM588.97 53.85c-2.06-.25-3.17-.51-3.76-.6a.3.3 0 0 1 .04-.08c.22-.39-.39-.75-.6-.35-.56 1.02-.9 2.19-1.26 3.29-.61 1.88-1.17 3.78-1.72 5.68-.63 2.19-1.24 4.39-1.83 6.59-.81 2.03-1.67 4.05-2.61 6.03-1.7-3.64-3.11-6.04-4.03-7.57-2.26-3.74-2.85-5.48-3.57-6.08l.31-.09c.43-.12.25-.8-.19-.67-1.06.3-2.12.6-3.17.95-.93.32-1.85.69-2.76 1.07-.13.05-.19.16-.22.27-.04.02-.08.05-.11.07-.04-.06-.07-.12-.11-.18a.354.354 0 0 0-.48-.12c-.16.09-.22.32-.13.48l.33.54c0 .09.02.18.06.28.51 1.16.78 1.38.72 1.47-2.42 3.44-5.41 7.86-6.2 9.1-1.27 1.97-2.01 3.14-2.45 3.84l-.91-6.56-.43-4.1c-.19-1.85-.37-3.23-.53-4.13-.19-1.1-.3-2.15-.45-3.16-.2-1.36-.29-2.06-.47-2.42h.04c.45.02.45-.68 0-.7-3.43-.16-6.81.94-10.17 1.48-.24-.22-.73-.04-.58.32.24.59.33 1.25.43 1.87.17 1.06.29 2.13.4 3.2.32 3.09.53 6.2.74 9.3.44 6.75.77 13.51 1.17 20.26.11 1.95.13 3.96.46 5.89.05.3.37.31.55.14.74 1.71 2.87 1.27 6.13 1.27 1.34 0 2.39.04 2.99-.11.02.32.48.53.63.18 3.61-8.26 7.41-16.46 12.05-24.2.03-.05.04-.1.05-.15.3.73.64 1.45.94 2.16.97 2.26 1.97 4.52 2.98 6.76 2.26 5.03 4.54 10.07 7.09 14.96.47.9.94 1.79 1.47 2.65.2.32.4.67.66.96-.18.25 0 .68.34.54.91-.38 1.82-.75 2.76-1.07 1.04-.35 2.11-.65 3.17-.95.39-.11.28-.66-.07-.68.62-.4.95-.96.87-1.91-.3-3.34.72-7.47.86-8.52l2.14-11.43c1.75-10.74 3.13-17.51 3.23-20.86.02-.49.08-2.84.13-3.24.17-1.25.48-1-4.96-1.65l.03-.02Zm-46.19 5.67c-.04-.24-.09-.48-.15-.71l.85-.15c-.34.24-.56.53-.7.86Zm1.95 25.12c-.36-6.63-.7-13.26-1.32-19.87 0 .02 0 .04.01.06.29 1.65.44 2.47.56 2.89 1 8.46 1.5 16.14 1.46 22.8-.06.99-.1 2-.11 3.02-.01.29-.03.68-.05 1.12-.01-.26-.03-.53-.04-.78-.19-3.08-.35-6.16-.52-9.23l.01-.01Zm36.4 18.66c-.11-.11-.24-.29-.37-.49.35.21.74.26 1.17.16-.27.11-.53.22-.8.32v.01Zm-.89-33.72c.12-.43.23-.86.35-1.29.71-1.77 1.41-3.55 2.08-5.33-.15.68-.26 1.22-.31 1.55-.5 2.94-2.13 7.59-3.58 13.36-.15-.35-.29-.66-.43-1 .61-2.44 1.25-4.87 1.9-7.3l-.01.01Zm3.56-12.48c.14-.44.28-.89.42-1.34-.13.7-.27 1.41-.42 2.11-.43 1.19-.86 2.38-1.31 3.57.42-1.45.85-2.9 1.31-4.34Zm-5.22 16.05c-.11.44-.23.87-.35 1.31-.12.46-.23.92-.35 1.38-.1-.22-.19-.4-.28-.61.34-.69.66-1.38.97-2.08h.01Zm-11.64 2.62c.06-.1.12-.19.17-.28.05.13.09.26.14.39a.398.398 0 0 0-.31-.11Zm2.3 2.98c-.56-1.3-1.25-2.63-1.65-3.99 0 0 .01-.02.02-.02.06.08 1.52 2.93 1.63 3.08.73 1.13 3.38 7.04 5.67 12.26 1.2 2.73 2.08 5.17 2.83 7.18-.62-1.25-1.23-2.51-1.83-3.78-2.31-4.87-4.53-9.78-6.67-14.73ZM275.92 87.03c-1.06-2.18-1.13-3.45-2.44-2.93-1.52.57-2.94 1.3-4.5 2.1-1.4.72-2.68 1.44-3.92 2.12.01-.25-.24-.5-.51-.34-4.8 2.93-12.41 4.7-17.28 1.31-1.98-1.77-3.32-4.15-3.97-5.78-.29-.95-.49-1.94-.63-2.93-.14-3.34 1.58-6.53 3.9-9.12.8-.79 1.68-1.51 2.66-2.12 3.7-2.3 8.22-3.07 12.51-2.51 2.71.35 5.32 1.24 7.71 2.55.39.22.75-.39.35-.6-.18-.1-.37-.18-.55-.27.56.27 1.03.33 1.51.19l-.48.39c-.15.11-.23.3-.13.48.09.15.33.24.48.13 1.3-.97 2.46-2.09 3.45-3.37.37-.29.64-.6.65-.97v-.02c.08-.33-.03-.7-.21-1.08-.31-.87-.98-2.01-2.19-3.26-2.43-2.52-3.79-3.45-5.68-4.26-1.14-.49-3.12-1.06-4.42-1.23-3.28-.42-10.64-1.21-18.18 4.11-7.74 5.46-11.94 12.3-12.23 20.61-.08 2.06.04 3.98.34 5.71.74 4.18 2.57 8 5.44 11.34 4.26 4.99 9.76 7.52 16.34 7.52 4.85 0 9.69-1.77 14.89-4.62.23-.12.45-.23.68-.35 2.19-1.1 4.37-2.23 6.46-3.5.49-.3 1.03-.61 1.5-.98 1.47-.87 1.11-1.12.49-2.95-.39-1.14-.76-2.7-2.06-5.36l.02-.01Zm-17.38-21.76c3.05-.42 6.31.79 9.36 2.35.51.39.94.68 1.33.87-5.61-2.86-12.72-3.39-18.44-.79 2.05-1.33 4.24-1.95 7.74-2.44l.01.01ZM443.67 72.67c-.4-2.2-1.15-4.33-2.37-6.22-1.49-2.32-3.58-4.19-5.91-5.64-6.17-3.81-13.75-5.11-20.83-6.01-3.23-.41-6.47-.69-9.72-.92l-1.39-.12c-.85-.07-1.52-.1-2.05-.1-1.08-.06-2.17-.12-3.25-.17-.08 0-.14.02-.19.05-.1.05-.18.14-.16.3.27 2.55-.01 5.12-.92 7.52-.15.38.4.56.62.28 1.32.59 2.68 1.05 4.08 1.37 0 2.78-.14 7.58-.33 12.91 0 0 0 .02-.01.03-.61 3.66-.79 7.42-1 11.12-.23 4.01-.43 8.03-.44 12.05 0 .64 0 1.28.03 1.93.02.31 0 .68.15.96.06.11.14.16.24.17-.2.17-.21.54.11.59 3.83.67 7.78.71 11.68.25 2.3-.19 4.87-.65 7.65-1.56 1.85-.54 3.67-1.18 5.43-1.91 7.2-3.02 14.31-8.07 17.35-15.53.76-1.86 1.17-3.8 1.31-5.75.3-1.93.28-3.82-.09-5.58l.01-.02Zm-19.32-15.42c5.74 1.41 11.94 3.68 15.65 8.55.25.32.47.65.69.99-2.3-2.82-5.68-5.69-12.88-8.23-2.16-.76-4.35-1.43-6.64-2.02 1.06.21 2.13.45 3.18.71Zm-25.82-3.04c.13 0 .27.01.4.02-.14.1-.26.23-.37.38 0-.13-.02-.26-.03-.4Zm34.82 22.17c-.75 3.09-3.55 5.66-5.88 7.58-3.35 2.76-7.21 5.03-11.28 6.54-1.33.49-2.71.9-4.12 1.15.06-1.38.08-2.76.07-4.13-.02-3.78-.16-7.56-.41-11.33-.09-1.37-.18-2.74-.37-4.1 0-.06-.03-.11-.06-.15.09-3.25.12-6.16.03-8.12 6.86 1.05 10.56 2.17 14.06 3.62 5.52 2.28 8.59 5.44 7.97 8.96l-.01-.02Zm-22 16.15c-.12 0-.23-.02-.34-.03l.34-.03v.06Zm-.69-.7c0-3.13.26-8.84.47-14.51.06 1.2.11 2.41.15 3.6.15 3.6.25 7.23.09 10.83-.24.03-.48.05-.71.07v.01Zm-12.33-30.94c.37.63 2.01 1.01 3.23 1.25v.15c-1.31-.31-2.59-.73-3.83-1.29.12-.36.23-.72.33-1.09.08.48.18.84.27.98Zm13.7 31.65v-.18c3.41-.56 6.71-2.02 9.69-3.68 2.31-1.28 4.59-2.78 6.63-4.53-4.69 4.53-11.61 8.24-16.33 8.38l.01.01Zm24.07-.75c-2.05 1.93-4.37 3.56-6.83 4.95 2.7-1.78 5.52-4.03 8.42-6.87.82-.82 1.56-1.69 2.23-2.59-1.08 1.65-2.38 3.16-3.81 4.51h-.01ZM187.16 92.14c-.79-2.47-2.1-7.12-3.1-6.87-.19-.01-2.09.77-4.08 1.54-3.06 1.18-5.91 2.13-10.09 2.82-2.74.42-5.87 1.01-10.61 1.06.04-3.34.05-6.01.05-7.99 7.97-.65 12.33-2.11 16.37-3.55 1.11-.39 2.69-1.01 2.63-1.8-.08-.35-.55-1.39-1.17-2.61-.47-1.16-.98-2.31-1.61-3.38-.42-.71-1.04-1.69-1.86-2.06-.11-.08-.22-.13-.29-.12-.02 0-.04 0-.07.01-.19-.04-.39-.05-.6-.01-.17.03-.24.15-.25.28-.04.02-.09.04-.14.05-4.33 1.48-8.85 2.33-13.24 3.61a499.1 499.1 0 0 0-.31-8.19c4.51-.99 8.88-1.38 13.11-1.82 3.68-.38 6.28.12 7.47.34.59.11.9.16 1.16.18h.1c-.1.37.44.66.62.28.02-.04.03-.08.05-.13.15.2.53.22.62-.1.17-.58.19-1.21.21-1.81v-.36c.03-.15.05-.3.07-.45.52-2.47.33-5.09-.64-7.44-.11-.27-.44-.28-.6-.14-.08-.21-.15-.42-.24-.62-.19-.41-.79-.05-.6.35.03.07.05.15.09.22-.98-.42-2.15-.54-3.17-.63-2.17-.19-4.37-.14-6.54 0-5.7.35-11.4 1.3-16.91 2.79-2.08.56-4.13 1.22-6.14 2-4.54 1.05-3.79 1.51-2.17 6.07.18.51.46 1.68.54 1.94.82 2.47 1.08 2.13 3.1 2.13s0 .05 0 .08h.52c-.48 2.66-.51 5.45-.62 8.13-.15 3.48-.22 6.96-.28 10.45 0 .41-.01.82-.02 1.23-.16.29-.33.57-.51.85-.05.38-.09.77-.14 1.18-.42 3.52-.59 6.48-.52 8.8v.34c.02.47.05.76.06.87.16 1.57-.26 3.47 1.35 3.79 1.61.32 3.5.55 4.85.55.11 0 .22-.02.33-.02 1.79.24 3.67.05 5.45-.12 2.85-.28 5.69-.7 8.51-1.19 3.03-.53 6.05-1.14 9.04-1.86 2.4-.58 4.82-1.19 7.13-2.06.51-.19 1.73-.57 2.46-1.14 1.81-.68 2.18-1 1.57-2.67-.23-.62-.48-1.49-.91-2.78l-.03-.02Zm-11.12-38.71c.89.05 1.93.08 2.89.3-.33 0-.68-.02-1.06-.03-8.28-.26-14.88.75-23.97 2.51 2.41-.64 4.85-1.16 7.28-1.59 4.87-.86 9.91-1.45 14.86-1.19Zm-26.53 22.13c.03 1.71.04 3.43 0 5.14-.04 1.27-.11 2.55-.24 3.82 0-.73.02-1.46.04-2.19.05-2.26.12-4.51.22-6.77h-.02Zm6.73 27.85c.2-.1.4-.21.58-.33 1.82-.17 3.82-.24 5.94-.34-.86.11-1.72.24-2.58.33-1.27.14-2.61.31-3.93.34h-.01ZM534.48 85.44c-3.52-8.38-7.07-16.75-10.5-25.17-.63-1.54-1.25-3.09-1.86-4.65-.31-.8-.65-1.6-.87-2.43-.04-.17-.17-.24-.31-.25.1-.2 0-.51-.29-.53-1.59-.08-3.18-.22-4.78-.25-1.96-.03-3.91.13-5.84.42-.31.05-.31.38-.13.56-.03.06-.05.14-.04.22.23 1.54.63 3.06 1.16 4.53.13.35.27.7.41 1.06l-2.68 6.18c-.11.03-.2.09-.25.22-.67 1.9-1.52 3.73-2.34 5.56a536.85 536.85 0 0 1-3.9 8.45c-2.64 5.64-5.34 11.25-7.91 16.93-.44.97-.88 1.94-1.29 2.93-.2.48-.47 1-.55 1.52v.05c-.02.12.02.26.16.34 1.19.73 2.41 1.41 3.66 2.05 1.2.62 2.45 1.25 3.76 1.61.43.12.62-.55.19-.67-1.13-.31-2.2-.83-3.24-1.36 1.09.36 2.1.69 2.75.93 2.82 1.01 2.38 1.1 4.3-3.75 2.1-1.09 4.34-1.96 6.53-2.79 4.35-1.64 8.8-3.03 13.27-4.29.82 2.01 1.77 3.97 2.72 5.92.35.83.62 1.45.79 1.82.22.42.45.8.69 1.15.17.33.33.67.5 1 .42.8.84 1.63 1.4 2.35.23.29.6 0 .55-.31 1.53-.02 3.06-.07 4.58-.27.92-.12 1.82-.32 2.71-.54 1.39-.27 3.85-1.11 3.74-1.42-.67-1.96-1.55-3.87-2.34-5.78-1.57-3.78-3.16-7.56-4.75-11.33v-.01Zm-11.65-26.16c1.54 3.81 3.12 7.6 4.7 11.4 2.94 7.05 5.91 14.09 8.87 21.13l-1.06-2.17c-2.71-5.51-5.2-11.19-7.41-16.87l-6.65-17.15c-.65-1.45-.55-2.19-.93-2.53.09 0 .18.01.28.02a.29.29 0 0 0-.04.26c.52 2.02 1.47 3.98 2.25 5.91h-.01Zm-6.58 13.58c.05-.15.09-.31.14-.46 1.41 3.92 2.88 7.9 4.39 11.87-3.22.52-6.38 1.25-9.46 2.14.55-1.22 1.05-2.46 1.53-3.7 1.24-3.24 2.37-6.53 3.39-9.85h.01Zm-.23-20c.36 0 .73.03 1.09.05-2.15.1-5.18.33-5.87.74-.24.15-.41.3-.53.45-.06-.29-.13-.58-.18-.88 1.82-.26 3.65-.39 5.49-.35v-.01Zm-.09 18.72c-.49 1.67-1.05 3.33-1.6 4.97-1.07 3.19-2.19 6.38-3.57 9.46-.09.21-.19.43-.29.65-.25.07-.5.14-.74.22 2.53-6.16 4.61-11.29 6.2-15.3Zm-6.34 25.16c4.97-2.38 9.37-4.1 14.02-5.27l.26.64c-4.8 1.35-9.63 2.8-14.28 4.63Zm20.17 6.76c.33.23.68.42 1.04.56h-.33c-.12 0-.21.06-.26.13-.15-.23-.31-.45-.45-.7v.01ZM226.57 91.75c-3.55-4.74-6.68-9.11-9.31-12.99 9.2-15.25 10.05-17.81 10.35-18.38.17-.34 1.09-2.27.64-2.53-1.13-.65-1.03-.65-2.97-1.71-1.19-.65-3.04-1.61-4.53-2.12-1.71-.59-1.24-.36-3 2.77-.06.1-.11.2-.17.3-.75 1.02-1.48 2.05-2.2 3.09-1.88 2.71-3.73 5.45-5.69 8.1-3.68-4.91-6.88-8.76-9.51-11.43-.15-.15-.3-.29-.46-.42-1.27-1.28-7.24 3.53-7.93 5.58-.09.09-.19.16-.28.25-.27.26.03.64.33.58.19.65.5 1.29.94 1.91 3.85 5.06 7.19 9.76 9.94 14-1.23 2.61-3.06 5-4.67 7.38l-2.28 3.33c-.5.66-.93 1.23-1.29 1.69-.67.93-2.09 2.61-2.3 3.87-.51.85-1.16 1.84-1.29 2.83-.06.44.61.63.67.19.01-.08.04-.15.06-.22 1.36 1.08 2.76 2.11 4.19 3.11 1.3.91 2.62 1.85 4.04 2.56.21.1.4 0 .48-.17.24.07.48.14.72.2.44.1.62-.57.19-.67-2.02-.48-3.77-1.57-5.23-3.02-.47-.46-.9-.96-1.32-1.46 1.74 1.35 4.2 2.89 5.89 4.14 1.39 1.03 2.85-2.27 4.22-4.2 1.86-2.64 3.96-5.86 5.52-8.29l10.39 14.51c.67.81 1.14 1.21 1.57 1.36-.05.24.12.51.41.4 1.53-.58 3.05-1.19 4.54-1.87 1.52-.69 3.06-1.45 4.36-2.5a.28.28 0 0 0 .12-.23c1.66-1.1.81-1.74-1.41-4.91-1.13-1.58-1.71-2.36-3.7-5.01l-.03-.02Zm2.41 6.54c.56 1.15 1.19 2.52 1.11 3.81-.06.04-.12.07-.17.1-.03-.88-.55-2.66-.94-3.91Zm-16.51-32.73c1.86-2.65 3.65-5.35 5.57-7.95.4-.55.81-1.13 1.26-1.66.19-.18.38-.33.56-.45.18.03.36.08.55.13l-8.05 10.11.12-.18h-.01ZM192.7 95.48c.79-1.37 1.66-2.69 2.54-4 1.19-1.79 2.4-3.56 3.61-5.33-.04.09-.09.17-.13.26-.1.22.03.41.2.49-2.47 3.42-4.89 6.73-6.4 9.28.21.24.4.48.63.75-.24.07-.4.36-.17.56.4.33.72.77 1.05 1.17.09.11.18.21.27.32-.84-.61-1.66-1.24-2.47-1.88.24-.57.58-1.11.87-1.61v-.01Zm7.46-10.32c.47-.81.98-1.59 1.49-2.37.31-.48.64-.95.96-1.43.26-.29.52-.56.75-.79-.99 1.48-2.09 3.03-3.2 4.59Zm10.03-16.22s-.03-.05-.05-.07c.22-.29.43-.59.64-.89-.2.32-.4.65-.58.96h-.01ZM371.54 87.96c-.01-.08-.01-.16-.03-.23-.06-.38-.58-.29-.66.03-.3-.05-.6-.08-.81-.11-1.14-.15-2.29-.19-3.44-.2 1.04-.09 2.09-.18 3.14-.23.45-.02.45-.72 0-.7-6.57.35-13.14 1.23-19.65 2.11-1.53.21-3.05.42-4.57.68-.01 0-.02.01-.04.01-.04-3.33-.13-6.66-.24-9.99-.19-5.7-.4-11.41-.88-17.1-.13-1.51-.23-3.07-.49-4.58 0-.25 0-.48-.02-.68-.06-1.19-.04-2.61-.68-2.78-.16-.07-.72-.16-1.5-.24.22-.17.16-.62-.2-.63-1.19-.04-2.39.09-3.57.23-1.2.14-2.41.32-3.59.6-.16-.1-.41-.06-.5.12-.06.02-.13.03-.19.05-.35.1-.29.55-.03.66-.26.6-.19 2.27-.21 3-.02.66-.66 33.73-.9 40.3-.03.65.06 1.12.04 1.45-.16 3.05.87 4.96 6.34 3.93 1.09-.08 2.75-.77 5.36-1.43 4.13-1.04 5.78-1.52 6.2-1.65 6.43-1.69 6.78-1.97 11.72-2.43.55-.05 4.8-.38 6.03-.3.64.04 1.19.07 1.65.1.09 0 .16-.03.24-.05.1.27.56.33.66-.02.39-1.32.61-2.71.78-4.08.2-1.61.29-3.24.15-4.86.24.03.52-.23.38-.53-.09-.2-.27-.33-.49-.43v-.02Zm-.63.56c.07.57.11 1.14.11 1.71-.21-.99-.53-1.71-.95-1.87.22.03.44.06.65.11.06.01.12.04.19.05Zm-25.41 1.73c1.54-.36 3.1-.64 4.66-.89-1.61.37-3.18.77-4.66 1.2v-.31Zm-.86-7.37c-.07-1.37-.16-2.75-.25-4.12-.21-3.13-.45-6.27-.79-9.4.02-2.25.08-4.31.13-6.11.16 2.08.29 4.16.4 6.24.23 4.46.38 8.93.5 13.39h.01Zm-.94-4c.16 2.41.29 4.83.39 7.24.06 1.6.14 3.22.09 4.83-.15.05-.32.09-.47.14V78.88h-.01ZM483.72 92.83c-3.05-2.28-6.22-4.4-9.38-6.51 8.86-6.49 13.49-12.95 13.73-19.23.04-.76 0-1.5-.13-2.2-.67-3.82-3.5-6.68-8.39-8.48.13.04.27.08.4.13 3.92 1.39 7.74 4.23 8.5 8.56.34 1.95-.05 3.96-.98 5.69-.21.4.39.75.6.35 1.86-3.46 1.46-7.55-.97-10.63-3.53-4.47-9.76-5.88-15.16-6.16-2.32-.12-4.64-.04-6.95.19-6 .32-12.71 1.68-17.63 3.21-.37.11-.67.23-.92.35-.2-.17-.62.02-.57.37v.03c-.64.68-.18 1.64.48 3.21.38.91.67 1.89 1.15 2.58.32.76.68 1.51 1.13 2.19.14.21.38.19.53.07.19-.02.38-.05.57-.08v1.57c-.06.06-.1.13-.11.23-.27 4.18-.34 8.38-.48 12.57l-.3 9.03c-.24 3.91-.44 6.77-.46 7.26-.05.88-.11 1.95.07 2.81-.01.22-.02.43-.04.65 0 .11-.02.23-.03.35 0 .05-.03.27-.01.16-.05.4.5.59.64.28.05.04.12.08.2.08 1.75.13 3.5.28 5.25.3 1.69.02 3.38-.12 5.06-.32.08.23.36.39.55.15.06-.08.11-.17.16-.26.18-.09.24-.32.18-.48.05-.2.1-.4.13-.6.16-.86.25-1.74.33-2.62.11-1.17.17-2.34.23-3.51.15-.01.32-.03.52-.04.36-.03 1.73-.15 2.06-.15.39 0 .7-.02.95-.04 1.76 1.11 3.45 2.35 5.14 3.55 2.83 2.01 5.64 4.04 8.47 6.04 1.42 1 2.85 2 4.29 2.97.1.06.19.07.27.04.08 0 .17-.02.25-.1 1.61-1.56 3.15-3.18 4.6-4.88.75-.88 1.49-1.78 2.15-2.73.01.01.03.02.04.03.34.3.83-.2.49-.49-2.16-1.9-4.34-3.76-6.64-5.48l.03-.01Zm-6.38-3.65a55.72 55.72 0 0 0-4-2.13c.14-.1.26-.19.4-.29 1.2.81 2.4 1.61 3.6 2.42Zm-20.1 11.78c.67-.37 1.23-.91 1.67-1.6-.11.5-.24 1-.38 1.49-.43.04-.86.08-1.29.11Zm2.38-37.24c1.34-.31 2.56-.52 3.71-.69-1.03.19-2.04.41-3.04.65-.14-.07-.34-.02-.45.11-.07.02-.15.04-.22.05v-.13.01Zm.04.84c.07-.02.14-.03.2-.05.34 1.66.41 3.41.5 5.09.17 2.9.24 5.81.28 8.71l.03 3.17c-.17.07-.34.14-.51.2-.06-4.96-.21-10.58-.51-17.12h.01Zm16.04 5.62c-1.16 2.25-3.06 4.1-5.02 5.66-2.8 2.23-5.99 3.97-9.3 5.35-.01-3.56-.09-7.12-.27-10.67-.1-2.04-.16-4.16-.57-6.18 3.3-.78 6.72-1.36 10.1-1.1 1.85.14 4.23.59 5.32 2.29.92 1.43.46 3.24-.26 4.65Zm.85-.18c.6-1.37.9-2.92.28-4.32-.67-1.52-2.2-2.32-3.76-2.74.46.1.89.21 1.29.37 1.74.67 2.69 1.88 2.93 3.21.2 1.13-.05 2.25-.74 3.47V70Zm-27.47-4.14c-.12-.19-.23-.38-.34-.57.74.42.85.36.99.41v.08c-.22.03-.43.06-.65.08Zm11.21 30.46c-.08 1.08-.16 2.17-.33 3.24-.05.35-.11.69-.2 1.03 0 .04-.02.07-.03.11-.15.02-.3.04-.45.05.45-1.64.76-3.36.79-5.07.03-.29.08-.57.1-.89-.03-.31-.03-.47.24-.57-.04.69-.07 1.39-.12 2.08v.02Zm5.6-2.47c.48.11.92.52 2.49 1.72-.46-.32-.92-.65-1.38-.97-.37-.25-.73-.5-1.1-.75h-.01Zm21.23 7.24a70.76 70.76 0 0 1-4.37 4.63c-.14-.09-.27-.19-.4-.28.19-.09.37-.24.55-.47.87-1.14 5.43-5.51 5.49-7.45.31.26.62.53.92.79-.67.97-1.42 1.88-2.19 2.77v.01Z",fill:"currentColor",transform:"translate(-144.023 -51.76)"})]}),Lq9=({style:u,size:B="small",withText:C})=>c0("div",{className:`ExcalidrawLogo is-${B}`,style:u,children:[d(Qq9,{}),C&&d(Gq9,{})]}),V$u=({icon:u,shortcut:B,children:C})=>{let F=aZ();return c0(m1,{children:[d("div",{className:"welcome-screen-menu-item__icon",children:u}),d("div",{className:"welcome-screen-menu-item__text",children:C}),B&&!F.editor.isMobile&&d("div",{className:"welcome-screen-menu-item__shortcut",children:B})]})};V$u.displayName="WelcomeScreenMenuItemContent";var GL0=({onSelect:u,children:B,icon:C,shortcut:F,className:U="",...D})=>d("button",{...D,type:"button",className:`welcome-screen-menu-item ${U}`,onClick:u,children:d(V$u,{icon:C,shortcut:F,children:B})});GL0.displayName="WelcomeScreenMenuItem";var oU1=({children:u,href:B,icon:C,shortcut:F,className:U="",...D})=>d("a",{...D,className:`welcome-screen-menu-item ${U}`,href:B,target:"_blank",rel:"noreferrer",children:d(V$u,{icon:C,shortcut:F,children:u})});oU1.displayName="WelcomeScreenMenuItemLink";var hN=({children:u})=>{let{WelcomeScreenCenterTunnel:B}=oQ();return d(B.In,{children:d("div",{className:"welcome-screen-center",children:u||c0(m1,{children:[d(j$u,{}),d(R$u,{children:r0("welcomeScreen.defaults.center_heading")}),c0(l$u,{children:[d(m$u,{}),d(f$u,{})]})]})})})};hN.displayName="Center";var j$u=({children:u})=>d("div",{className:"welcome-screen-center__logo excalifont welcome-screen-decor",children:u||d(Lq9,{withText:!0})});j$u.displayName="Logo";var R$u=({children:u})=>d("div",{className:"welcome-screen-center__heading welcome-screen-decor excalifont",children:u});R$u.displayName="Heading";var l$u=({children:u})=>d("div",{className:"welcome-screen-menu",children:u});l$u.displayName="Menu";var f$u=()=>{let u=eL();return d(GL0,{onSelect:()=>u.executeAction(K$u),shortcut:"?",icon:xn0,children:r0("helpDialog.title")})};f$u.displayName="MenuItemHelp";var m$u=()=>{let u=LM(),B=eL();return u.viewModeEnabled?null:d(GL0,{onSelect:()=>B.executeAction(n_u),shortcut:_K("loadScene"),icon:Vn0,children:r0("buttons.load")})};m$u.displayName="MenuItemLoadScene";var bU1=({onSelect:u})=>{let{t:B}=$K();return d(GL0,{shortcut:null,onSelect:u,icon:SRu,children:B("labels.liveCollaboration")})};bU1.displayName="MenuItemLiveCollaborationTrigger";hN.Logo=j$u;hN.Heading=R$u;hN.Menu=l$u;hN.MenuItem=GL0;hN.MenuItemLink=oU1;hN.MenuItemHelp=f$u;hN.MenuItemLoadScene=m$u;hN.MenuItemLiveCollaborationTrigger=bU1;var h$u=({children:u})=>{let{WelcomeScreenMenuHintTunnel:B}=oQ();return d(B.In,{children:c0("div",{className:"excalifont welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--menu",children:[xk3,d("div",{className:"welcome-screen-decor-hint__label",children:u||r0("welcomeScreen.defaults.menuHint")})]})})};h$u.displayName="MenuHint";var y$u=({children:u})=>{let{WelcomeScreenToolbarHintTunnel:B}=oQ();return d(B.In,{children:c0("div",{className:"excalifont welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--toolbar",children:[d("div",{className:"welcome-screen-decor-hint__label",children:u||r0("welcomeScreen.defaults.toolbarHint")}),Vk3]})})};y$u.displayName="ToolbarHint";var _$u=({children:u})=>{let{WelcomeScreenHelpHintTunnel:B}=oQ();return d(B.In,{children:c0("div",{className:"excalifont welcome-screen-decor welcome-screen-decor-hint welcome-screen-decor-hint--help",children:[d("div",{children:u||r0("welcomeScreen.defaults.helpHint")}),vk3]})})};_$u.displayName="HelpHint";var $$u=(u)=>d(m1,{children:u.children||c0(m1,{children:[d(hN,{}),d(h$u,{}),d(y$u,{}),d(_$u,{})]})});$$u.displayName="WelcomeScreen";$$u.Center=hN;$$u.Hints={MenuHint:h$u,ToolbarHint:y$u,HelpHint:_$u};var Wq9=({isCollaborating:u,onSelect:B,...C})=>{let F=LM(),U=F.width<830;return c0(hd,{...C,className:j3("collab-button",{active:u}),type:"button",onSelect:B,style:{position:"relative",width:U?void 0:"auto"},title:r0("labels.liveCollaboration"),children:[U?nk3:r0("labels.share"),F.collaborators.size>0&&d("div",{className:"CollabButton-collaborators",children:F.collaborators.size})]})};Wq9.displayName="LiveCollaborationTrigger";var Nt5=dU1.default((u,B,C)=>{if(y2.DEV||y2.MODE===hQ.TEST||window?.DEBUG_FRACTIONAL_INDICES){let F=fv(u.map((U)=>({...U})));Cs0(F,{shouldThrow:y2.DEV||y2.MODE===hQ.TEST,includeBoundTextValidation:!0,reconciliationContext:{localElements:B,remoteElements:C}})}},60000,{leading:!0,trailing:!1});var Yq9=({children:u,icon:B})=>{let{TTDDialogTriggerTunnel:C}=oQ(),F=iz();return d(C.In,{children:c0(vC.Item,{onSelect:()=>{CC("ai","dialog open","ttd"),F({openDialog:{name:"ttd",tab:"text-to-diagram"}})},icon:B??$T3,children:[u??r0("labels.textToDiagram"),d(vC.Item.Badge,{children:"AI"})]})})};Yq9.displayName="TTDDialogTrigger";Kq9();var Sq9=(u)=>{let{onChange:B,initialData:C,excalidrawAPI:F,isCollaborating:U=!1,onPointerUpdate:D,renderTopRightUI:Z,langCode:X=T50.code,viewModeEnabled:M,zenModeEnabled:K,gridModeEnabled:Q,libraryReturnUrl:G,theme:W,name:q,renderCustomStats:P,onPaste:w,detectScroll:N=!0,handleKeyboardGlobally:k=!1,onLibraryChange:x,autoFocus:v=!1,generateIdForFile:R,onLinkOpen:j,generateLinkForSelection:l,onPointerDown:y,onPointerUp:h,onScrollChange:_,onDuplicate:$,children:m,validateEmbeddable:p,renderEmbeddable:i,aiEnabled:t,showDeprecatedFonts:a}=u,o=u.UIOptions?.canvasActions,u0={...u.UIOptions,canvasActions:{...Rju.canvasActions,...o},tools:{image:u.UIOptions?.tools?.image??!0}};return o?.export&&(u0.canvasActions.export.saveFileToDisk=o.export?.saveFileToDisk??Rju.canvasActions.export.saveFileToDisk),u0.canvasActions.toggleTheme===null&&typeof W>"u"&&(u0.canvasActions.toggleTheme=!0),do0.useEffect(()=>{(async()=>{await Promise.resolve().then(() => (bE1(),DH9))})();let n=(B0)=>{typeof B0.scale=="number"&&B0.scale!==1&&B0.preventDefault()};return document.addEventListener("touchmove",n,{passive:!1}),()=>{document.removeEventListener("touchmove",n)}},[]),d(zH9,{store:xN,children:d(MH9,{langCode:X,theme:W,children:d(Jq9,{onChange:B,initialData:C,excalidrawAPI:F,isCollaborating:U,onPointerUpdate:D,renderTopRightUI:Z,langCode:X,viewModeEnabled:M,zenModeEnabled:K,gridModeEnabled:Q,libraryReturnUrl:G,theme:W,name:q,renderCustomStats:P,UIOptions:u0,onPaste:w,detectScroll:N,handleKeyboardGlobally:k,onLibraryChange:x,autoFocus:v,generateIdForFile:R,onLinkOpen:j,generateLinkForSelection:l,onPointerDown:y,onPointerUp:h,onScrollChange:_,onDuplicate:$,validateEmbeddable:p,renderEmbeddable:i,aiEnabled:t!==!1,showDeprecatedFonts:a,children:m})})})},Oq9=(u,B)=>{if(u.children!==B.children)return!1;let{initialData:C,UIOptions:F={},...U}=u,{initialData:D,UIOptions:Z={},...X}=B,M=Object.keys(F),K=Object.keys(Z);return M.length!==K.length?!1:M.every((Q)=>Q==="canvasActions"?Object.keys(F.canvasActions).every((G)=>G==="export"&&F?.canvasActions?.export&&Z?.canvasActions?.export?F.canvasActions.export.saveFileToDisk===Z.canvasActions.export.saveFileToDisk:F?.canvasActions?.[G]===Z?.canvasActions?.[G]):F[Q]===Z[Q])&&uJ(U,X)},Pq9=do0.default.memo(Sq9,Oq9);Pq9.displayName="Excalidraw";window.EXCALIDRAW_ASSET_PATH="https://gstack-render.localhost/excalidraw-assets/";var wq9='Helvetica, "Liberation Sans", Arial, "Hiragino Kaku Gothic ProN", "Noto Sans CJK JP", "Microsoft YaHei", "Apple Color Emoji", "Segoe UI Emoji", "Noto Color Emoji", sans-serif';Zku.initialize({startOnLoad:!1,securityLevel:"strict",theme:"neutral",fontFamily:wq9,htmlLabels:!1,flowchart:{htmlLabels:!1}});window.__renderMermaid=async(u,B)=>{if(!/^[A-Za-z][\w-]*$/.test(u))throw Error(`invalid mermaid render id: ${u}`);let{svg:C}=await Zku.render(u,B);return C};window.__mermaidToExcalidraw=async(u)=>{let{elements:B,files:C}=await _vu(u),U={type:"excalidraw",version:2,source:"gstack-diagram-render",elements:JL0(B),appState:{viewBackgroundColor:"#ffffff"},files:C??{}};return JSON.stringify(U)};window.__excalidrawToSvg=async(u)=>{let B=JSON.parse(u);if(!Array.isArray(B.elements))throw Error("excalidraw scene has no elements array");let C=await kQ0({elements:B.elements,appState:{...B.appState??{},exportBackground:!0},files:B.files??null,exportPadding:16});return new XMLSerializer().serializeToString(C)};window.__rasterize=async(u,B)=>{if(!(B>0&&B<=1e4))throw Error(`targetWidthPx out of range: ${B}`);let C=new Blob([u],{type:"image/svg+xml;charset=utf-8"}),F=URL.createObjectURL(C);try{let U=new Image;await new Promise((Q,G)=>{U.onload=()=>Q(),U.onerror=()=>G(Error("SVG image decode failed (malformed SVG or foreignObject content)")),U.src=F});let D=U.naturalWidth||800,Z=U.naturalHeight||600,X=B/D,M=document.createElement("canvas");M.width=Math.round(D*X),M.height=Math.round(Z*X);let K=M.getContext("2d");if(!K)throw Error("2d canvas context unavailable");return K.fillStyle="#ffffff",K.fillRect(0,0,M.width,M.height),K.drawImage(U,0,0,M.width,M.height),M.toDataURL("image/png")}finally{URL.revokeObjectURL(F)}};window.__mountForScreenshot=(u,B)=>{document.getElementById("raster-stage")?.remove();let C=document.createElement("div");C.id="raster-stage",C.style.cssText=`display:inline-block;background:#fff;width:${B}px`,C.innerHTML=u;let F=C.querySelector("svg");if(F)F.setAttribute("width",String(B)),F.removeAttribute("height"),F.style.height="auto";return document.body.appendChild(C),`mounted:${B}`};window.__downscaleRaster=async(u,B,C)=>{if(!(B>0&&B<=1e4))throw Error(`targetWidthPx out of range: ${B}`);let F=new Image;await new Promise((M,K)=>{F.onload=()=>M(),F.onerror=()=>K(Error("image decode failed")),F.src=u});let U=B/(F.naturalWidth||B),D=document.createElement("canvas");D.width=Math.round(F.naturalWidth*U),D.height=Math.round(F.naturalHeight*U);let Z=D.getContext("2d");if(!Z)throw Error("2d canvas context unavailable");Z.drawImage(F,0,0,D.width,D.height);let X=C==="image/jpeg"?"image/jpeg":"image/png";return X==="image/jpeg"?D.toDataURL(X,0.9):D.toDataURL(X)};window.__probeImage=async(u)=>{let B=new Image;return await new Promise((C,F)=>{B.onload=()=>C(),B.onerror=()=>F(Error("image decode failed")),B.src=u}),JSON.stringify({width:B.naturalWidth,height:B.naturalHeight})};window.__bundleInfo={name:"gstack-diagram-render",deps:{"@excalidraw/excalidraw":"0.18.0","@excalidraw/mermaid-to-excalidraw":"1.1.2",mermaid:"11.12.2",react:"18.3.1","react-dom":"18.3.1"}};var tU1=document.getElementById("status");if(tU1)tU1.textContent="ready";var Tb0=document.createElement("div");Tb0.id="done";Tb0.textContent="ready";Tb0.style.cssText="position:absolute;left:-9999px";document.body.appendChild(Tb0); diff --git a/lib/diagram-render/src/entry.ts b/lib/diagram-render/src/entry.ts index c92ba1ab0..c9e98707e 100644 --- a/lib/diagram-render/src/entry.ts +++ b/lib/diagram-render/src/entry.ts @@ -34,6 +34,7 @@ declare global { __mermaidToExcalidraw: (text: string) => Promise; __excalidrawToSvg: (sceneJson: string) => Promise; __rasterize: (svgText: string, targetWidthPx: number) => Promise; + __downscaleRaster: (dataUri: string, targetWidthPx: number, mime: string) => Promise; __mountForScreenshot: (svgText: string, targetWidthPx: number) => string; __probeImage: (src: string) => Promise; EXCALIDRAW_ASSET_PATH?: string; @@ -152,6 +153,37 @@ window.__mountForScreenshot = (svgText: string, targetWidthPx: number): string = return `mounted:${targetWidthPx}`; }; +/** + * Downscale a raster image (data URI) to targetWidthPx, preserving aspect. + * Re-encodes in the requested mime — JPEG photos stay JPEG (q0.9); PNG-encoding + * a photo would bloat it past the original. Data URIs are same-origin, so the + * canvas never taints. + */ +window.__downscaleRaster = async ( + dataUri: string, + targetWidthPx: number, + mime: string, +): Promise => { + if (!(targetWidthPx > 0 && targetWidthPx <= 10000)) { + throw new Error(`targetWidthPx out of range: ${targetWidthPx}`); + } + const img = new Image(); + await new Promise((resolve, reject) => { + img.onload = () => resolve(); + img.onerror = () => reject(new Error("image decode failed")); + img.src = dataUri; + }); + const scale = targetWidthPx / (img.naturalWidth || targetWidthPx); + const canvas = document.createElement("canvas"); + canvas.width = Math.round(img.naturalWidth * scale); + canvas.height = Math.round(img.naturalHeight * scale); + const ctx = canvas.getContext("2d"); + if (!ctx) throw new Error("2d canvas context unavailable"); + ctx.drawImage(img, 0, 0, canvas.width, canvas.height); + const outMime = mime === "image/jpeg" ? "image/jpeg" : "image/png"; + return outMime === "image/jpeg" ? canvas.toDataURL(outMime, 0.9) : canvas.toDataURL(outMime); +}; + /** Probe intrinsic dimensions of an image (data URI or URL). Returns JSON. */ window.__probeImage = async (src: string): Promise => { const img = new Image();