{"version":3,"file":"ParticleSystem.D-BAbWby.mjs","names":["useRef","useState","useCallback"],"sources":["https:/framerusercontent.com/modules/oQZaJDi5N4RvfM85wrmF/6wVAO73hQ6VtjuiLRvUb/ParticleSystem.js"],"sourcesContent":["// Interactive particle-image component with mouse repulsion effect\nimport{jsx as _jsx}from\"react/jsx-runtime\";import{useRef,useEffect,useState,useCallback}from\"react\";import{addPropertyControls,ControlType,useIsStaticRenderer}from\"framer\";/**\n * Interactive Particle Image\n * \n * Particles are repelled by mouse cursor and spring back to original positions\n *\n * @framerSupportedLayoutWidth fixed\n * @framerSupportedLayoutHeight fixed\n */export default function ParticleImage(props){const canvasRef=useRef(null);const containerRef=useRef(null);const particlesRef=useRef([]);const animationFrameRef=useRef();const mouseRef=useRef({x:-1e3,y:-1e3});const prevMouseRef=useRef({x:-1e3,y:-1e3});const mouseVelocityRef=useRef({vx:0,vy:0,speed:0});const isMouseDownRef=useRef(false);const mouseDownTimeRef=useRef(0);const[dimensions,setDimensions]=useState({width:800,height:600});const isStatic=useIsStaticRenderer();const{image={src:\"https://framerusercontent.com/images/GfGkADagM4KEibNcIiRUWlfrR0.jpg\",alt:\"Particle source image\"},particleSize=3,particleDensity=2,repulsionRadius=120,repulsionStrength=50,springStrength=.05,backgroundColor=\"transparent\",style={}}=props;// Handle responsive sizing\nuseEffect(()=>{const container=containerRef.current;if(!container)return;const updateSize=()=>{const rect=container.getBoundingClientRect();const width=Math.max(100,Math.floor(rect.width));const height=Math.max(100,Math.floor(rect.height));// Use the actual container dimensions without scaling\nsetDimensions({width,height});};updateSize();const resizeObserver=new ResizeObserver(updateSize);resizeObserver.observe(container);return()=>resizeObserver.disconnect();},[]);// Sample image and create particles\nconst createParticles=useCallback(async imageSrc=>{return new Promise(resolve=>{const img=new Image;img.crossOrigin=\"anonymous\";img.onload=()=>{const canvas=document.createElement(\"canvas\");const ctx=canvas.getContext(\"2d\");if(!ctx){resolve([]);return;}canvas.width=dimensions.width;canvas.height=dimensions.height;// Calculate proper scaling to fit and center image\nconst imgAspect=img.width/img.height;const canvasAspect=dimensions.width/dimensions.height;let drawWidth,drawHeight,offsetX=0,offsetY=0;if(imgAspect>canvasAspect){drawWidth=dimensions.width;drawHeight=dimensions.width/imgAspect;offsetY=(dimensions.height-drawHeight)/2;}else{drawHeight=dimensions.height;drawWidth=dimensions.height*imgAspect;offsetX=(dimensions.width-drawWidth)/2;}ctx.drawImage(img,offsetX,offsetY,drawWidth,drawHeight);const imageData=ctx.getImageData(0,0,dimensions.width,dimensions.height);const particles=[];// Sample every nth pixel based on density - only within image bounds\nconst startX=Math.max(0,Math.floor(offsetX));const endX=Math.min(dimensions.width,Math.ceil(offsetX+drawWidth));const startY=Math.max(0,Math.floor(offsetY));const endY=Math.min(dimensions.height,Math.ceil(offsetY+drawHeight));for(let y=startY;y<endY;y+=particleDensity){for(let x=startX;x<endX;x+=particleDensity){const i=(y*dimensions.width+x)*4;const r=imageData.data[i];const g=imageData.data[i+1];const b=imageData.data[i+2];const a=imageData.data[i+3];// Only create particles for visible pixels\nif(a>10){// Add more significant randomness to break the grid pattern and create natural clustering\nconst randomOffsetX=(Math.random()-.5)*particleDensity*1.5;const randomOffsetY=(Math.random()-.5)*particleDensity*1.5;const finalX=x+randomOffsetX;const finalY=y+randomOffsetY;// More varied particle sizes based on distance from center and randomness\nconst centerX=dimensions.width/2;const centerY=dimensions.height/2;const distanceFromCenter=Math.sqrt((finalX-centerX)**2+(finalY-centerY)**2);const maxDistance=Math.sqrt(centerX**2+centerY**2);const distanceRatio=distanceFromCenter/maxDistance;// Particles get smaller towards edges and have more variation - made edge particles 50% smaller\nconst sizeVariation=.5+Math.random()*1// 0.5x to 1.5x variation\n;const distanceEffect=.35+(1-distanceRatio)*.65// Smaller near edges, larger near center\n;const baseSize=particleSize*sizeVariation*distanceEffect;particles.push({x:finalX,y:finalY,originalX:finalX,originalY:finalY,vx:0,vy:0,color:`rgba(${r}, ${g}, ${b}, ${a/255})`,size:baseSize,originalSize:baseSize,alpha:a/255,isBeingAttracted:false,attractionStartTime:0,isDispersing:false,disperseStartTime:0,disperseAngle:0,disperseSpeed:0,// Add emergence animation properties\nisEmerging:true,emergenceStartTime:Date.now(),emergenceDelay:Math.random()*500,emergenceProgress:0});}}}resolve(particles);};img.onerror=()=>resolve([]);img.src=imageSrc;});},[dimensions.width,dimensions.height,particleDensity,particleSize]);// Initialize particles when image or dimensions change\nuseEffect(()=>{if(isStatic)return;let mounted=true;const init=async()=>{const particles=await createParticles(image.src);if(mounted){particlesRef.current=particles;}};init();return()=>{mounted=false;};},[image.src,createParticles,isStatic]);// Animation loop\nuseEffect(()=>{if(isStatic)return;let mounted=true;const animate=()=>{if(!mounted)return;const canvas=canvasRef.current;if(!canvas){animationFrameRef.current=requestAnimationFrame(animate);return;}const ctx=canvas.getContext(\"2d\");if(!ctx){animationFrameRef.current=requestAnimationFrame(animate);return;}// Clear canvas\nctx.clearRect(0,0,dimensions.width,dimensions.height);// Set background if not transparent\nif(backgroundColor!==\"transparent\"){ctx.fillStyle=backgroundColor;ctx.fillRect(0,0,dimensions.width,dimensions.height);}const mouse=mouseRef.current;const particles=particlesRef.current;const mouseVelocity=mouseVelocityRef.current;const currentTime=Date.now();// Check if mouse has stopped moving (velocity is very low)\nconst mouseHasStopped=mouseVelocity.speed<.1// Reduced from 0.5 to 0.1 for less sensitivity\n;// Update and draw particles\nparticles.forEach(particle=>{// Declare particleAlpha at the start to avoid block-scoped variable errors\nlet particleAlpha=particle.alpha;// Handle emergence animation\nif(particle.isEmerging){const timeSinceStart=currentTime-particle.emergenceStartTime;if(timeSinceStart>particle.emergenceDelay){const animationTime=timeSinceStart-particle.emergenceDelay;const animationDuration=1e3// 1 second animation\n;if(animationTime<animationDuration){// Ease out cubic for smooth deceleration\nconst progress=1-Math.pow(1-animationTime/animationDuration,3);particle.emergenceProgress=progress;// Calculate center of canvas\nconst centerX=dimensions.width/2;const centerY=dimensions.height/2;// Interpolate from center to final position\nparticle.x=centerX+(particle.originalX-centerX)*progress;particle.y=centerY+(particle.originalY-centerY)*progress;// Scale up during emergence\nparticle.size=particle.originalSize*progress;}else{// Animation complete\nparticle.isEmerging=false;particle.x=particle.originalX;particle.y=particle.originalY;particle.size=particle.originalSize;particle.emergenceProgress=1;}}else{// Still waiting for delay - keep at center, invisible\nconst centerX=dimensions.width/2;const centerY=dimensions.height/2;particle.x=centerX;particle.y=centerY;particle.size=0;return;// Skip drawing this particle\n}}else{// Normal particle behavior after emergence\n// Calculate distance to mouse\nconst dx=particle.x-mouse.x;const dy=particle.y-mouse.y;const distance=Math.sqrt(dx*dx+dy*dy);// Handle mouse down attraction - only nearest particles\nif(isMouseDownRef.current&&distance<repulsionRadius*.8&&!particle.isDispersing){if(!particle.isBeingAttracted){particle.isBeingAttracted=true;particle.attractionStartTime=Date.now();}// Attract particles to mouse center with distance-based force\nconst attractionForce=.15*(1-distance/(repulsionRadius*.8))// Reduced and distance-based\n;const dirX=-dx/(distance+1);const dirY=-dy/(distance+1);particle.vx+=dirX*attractionForce;particle.vy+=dirY*attractionForce;}else if(!isMouseDownRef.current&&particle.isBeingAttracted){// Mouse released - staggered retreat to original position\nparticle.isBeingAttracted=false;// Calculate how far the particle has been displaced from its original position\nconst displacementDx=particle.x-particle.originalX;const displacementDy=particle.y-particle.originalY;const displacement=Math.sqrt(displacementDx*displacementDx+displacementDy*displacementDy);// Stagger based on displacement - particles pulled further take longer to return\nconst maxDisplacement=repulsionRadius*.8;const displacementRatio=Math.min(displacement/maxDisplacement,1);const staggerDelay=displacementRatio*300// 0-300ms delay based on displacement\n;// Reset particle size immediately on mouse up\nparticle.size=particle.originalSize;setTimeout(()=>{// Gentle spring back to original position\nconst springDx=particle.originalX-particle.x;const springDy=particle.originalY-particle.y;particle.vx=springDx*.05;particle.vy=springDy*.05;},staggerDelay);}// Apply repulsion force when mouse is near (but not when mouse is down)\nif(!isMouseDownRef.current&&distance<repulsionRadius&&distance>0){const force=(repulsionRadius-distance)/repulsionRadius;const repelForce=force*repulsionStrength*.01;// Calculate push direction away from mouse\nconst pushX=dx/distance*repelForce;const pushY=dy/distance*repelForce;particle.vx+=pushX;particle.vy+=pushY;// Instead of dispersing, particles fade and shrink when being pushed\nif(force>.2){// Calculate how far the particle is being pushed from its original position\nconst pushDistance=Math.sqrt((particle.x-particle.originalX)**2+(particle.y-particle.originalY)**2);const maxPushDistance=repulsionRadius*.8;const pushRatio=Math.min(pushDistance/maxPushDistance,1);// Reduce size and fade based on how far they're pushed - more aggressive shrinking and fading\nparticle.size=particle.originalSize*(1-pushRatio*.9);particleAlpha=particle.alpha*(1-pushRatio*.9);}}// Handle dispersing particles\nif(particle.isDispersing){const disperseTime=Date.now()-particle.disperseStartTime;const disperseDuration=1e3// 1 second dispersion\n;if(disperseTime<disperseDuration){const progress=disperseTime/disperseDuration;// Move particle in dispersion direction\nconst disperseDistance=particle.disperseSpeed*progress*50;particle.x=particle.originalX+Math.cos(particle.disperseAngle)*disperseDistance;particle.y=particle.originalY+Math.sin(particle.disperseAngle)*disperseDistance;// Scale down and fade out\nconst fadeProgress=Math.pow(progress,2)// Quadratic fade for more dramatic effect\n;particle.size=particle.originalSize*(1-fadeProgress);}else{// Reset particle after dispersion\nparticle.isDispersing=false;particle.x=particle.originalX;particle.y=particle.originalY;particle.size=particle.originalSize;}}// Apply spring force back to original position\nif(!particle.isBeingAttracted){const springDx=particle.originalX-particle.x;const springDy=particle.originalY-particle.y;particle.vx+=springDx*springStrength*.12;particle.vy+=springDy*springStrength*.12;}// Apply damping\nparticle.vx*=.94;particle.vy*=.94;// Update position\nparticle.x+=particle.vx;particle.y+=particle.vy;// Particles shrink when close to the edge of the circle field\nif(distance<repulsionRadius&&distance>0){const edgeDistance=repulsionRadius-distance;const edgeEffect=Math.max(0,edgeDistance/(repulsionRadius*.3));const sizeMultiplier=Math.max(.3,1-edgeEffect*.6);particle.size=particle.originalSize*sizeMultiplier;}else{// Return to original size when not being affected\nparticle.size=particle.originalSize;}}// Calculate distance to mouse for visibility check\nconst dx=particle.x-mouse.x;const dy=particle.y-mouse.y;const distance=Math.sqrt(dx*dx+dy*dy);// Feathered hiding of particles near the edge of the circle\nconst exclusionRadius=repulsionRadius*.35;const featherRadius=repulsionRadius*.7// Extended feather zone to fade before halfway point\n;if(distance<featherRadius){if(distance<exclusionRadius){// Completely hide particles in the core exclusion zone\nparticleAlpha=0;}else{// Gradually fade particles in the feather zone - more aggressive fading\nconst featherProgress=(distance-exclusionRadius)/(featherRadius-exclusionRadius);// Use a power curve to make particles fade more quickly\nconst fadeMultiplier=Math.pow(featherProgress,.5);particleAlpha=particle.alpha*fadeMultiplier;}}// Draw particle only if it has opacity and size\nif(particleAlpha>0&&particle.size>0){ctx.globalAlpha=particleAlpha;ctx.fillStyle=particle.color;ctx.beginPath();ctx.arc(particle.x,particle.y,particle.size/2,0,Math.PI*2);ctx.fill();ctx.globalAlpha=1;}});animationFrameRef.current=requestAnimationFrame(animate);};animationFrameRef.current=requestAnimationFrame(animate);return()=>{mounted=false;if(animationFrameRef.current){cancelAnimationFrame(animationFrameRef.current);}};},[isStatic,dimensions.width,dimensions.height,backgroundColor,repulsionRadius,repulsionStrength,springStrength]);// Mouse tracking\nconst handleMouseMove=useCallback(e=>{if(!canvasRef.current)return;const rect=canvasRef.current.getBoundingClientRect();const scaleX=dimensions.width/rect.width;const scaleY=dimensions.height/rect.height;const newMousePos={x:(e.clientX-rect.left)*scaleX,y:(e.clientY-rect.top)*scaleY};// Calculate mouse velocity\nconst prevMouse=prevMouseRef.current;const vx=newMousePos.x-prevMouse.x;const vy=newMousePos.y-prevMouse.y;const speed=Math.sqrt(vx*vx+vy*vy);// Smooth the velocity\nmouseVelocityRef.current={vx:mouseVelocityRef.current.vx*.8+vx*.2,vy:mouseVelocityRef.current.vy*.8+vy*.2,speed:mouseVelocityRef.current.speed*.8+speed*.2};prevMouseRef.current=mouseRef.current;mouseRef.current=newMousePos;},[dimensions.width,dimensions.height]);const handleMouseLeave=useCallback(()=>{mouseRef.current={x:-1e3,y:-1e3};prevMouseRef.current={x:-1e3,y:-1e3};mouseVelocityRef.current={vx:0,vy:0,speed:0};isMouseDownRef.current=false;},[]);const handleMouseDown=useCallback(()=>{isMouseDownRef.current=true;mouseDownTimeRef.current=Date.now();},[]);const handleMouseUp=useCallback(()=>{isMouseDownRef.current=false;},[]);// Static fallback\nif(isStatic){return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...style,width:\"100%\",height:\"100%\",background:backgroundColor,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",borderRadius:8,overflow:\"hidden\"},children:/*#__PURE__*/_jsx(\"img\",{src:image.src,alt:image.alt,style:{width:\"100%\",height:\"100%\",objectFit:\"contain\"}})});}return /*#__PURE__*/_jsx(\"div\",{ref:containerRef,style:{...style,width:\"100%\",height:\"100%\",position:\"relative\"},children:/*#__PURE__*/_jsx(\"canvas\",{ref:canvasRef,width:dimensions.width,height:dimensions.height,style:{width:\"100%\",height:\"100%\",display:\"block\"},onMouseMove:handleMouseMove,onMouseLeave:handleMouseLeave,onMouseDown:handleMouseDown,onMouseUp:handleMouseUp,\"aria-label\":\"Interactive particle image\",role:\"img\"})});}addPropertyControls(ParticleImage,{image:{type:ControlType.ResponsiveImage,title:\"Image\"},particleSize:{type:ControlType.Number,title:\"Particle Size\",defaultValue:3,min:1,max:10,step:.5},particleDensity:{type:ControlType.Number,title:\"Density\",defaultValue:2,min:2,max:10,step:1,unit:\"px\"},repulsionRadius:{type:ControlType.Number,title:\"Repulsion Radius\",defaultValue:960,min:50,max:300,step:10,unit:\"px\"},repulsionStrength:{type:ControlType.Number,title:\"Repulsion Strength\",defaultValue:50,min:10,max:200,step:5},springStrength:{type:ControlType.Number,title:\"Spring Strength\",defaultValue:.05,min:.01,max:.2,step:.01},backgroundColor:{type:ControlType.Color,title:\"Background\",defaultValue:\"transparent\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"ParticleImage\",\"slots\":[],\"annotations\":{\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"fixed\",\"framerSupportedLayoutWidth\":\"fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./ParticleSystem.map"],"mappings":"uMAQG,SAAwB,EAAc,EAAM,CAAC,IAAM,EAAUA,EAAO,IAAI,EAAQ,EAAaA,EAAO,IAAI,EAAQ,EAAaA,EAAO,CAAC,CAAC,EAAQ,EAAkBA,EAAO,EAAQ,EAASA,EAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAQ,EAAaA,EAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,EAAQ,EAAiBA,EAAO,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,EAAQ,EAAeA,EAAO,EAAK,EAAQ,EAAiBA,EAAO,CAAC,EAAO,CAAC,EAAW,GAAeC,EAAS,CAAC,MAAM,IAAI,OAAO,GAAG,CAAC,EAAQ,EAAS,EAAoB,EAAO,CAAC,QAAM,CAAC,IAAI,sEAAsE,IAAI,uBAAuB,EAAE,eAAa,EAAE,kBAAgB,EAAE,kBAAgB,IAAI,oBAAkB,GAAG,iBAAe,IAAI,kBAAgB,cAAc,QAAM,CAAC,GAAG,EACptB,MAAc,CAAC,IAAM,EAAU,EAAa,QAAQ,GAAG,CAAC,EAAU,OAAO,IAAM,MAAe,CAAC,IAAM,EAAK,EAAU,sBAAsB,EAAQ,EAAM,KAAK,IAAI,IAAI,KAAK,MAAM,EAAK,KAAK,CAAC,EAAQ,EAAO,KAAK,IAAI,IAAI,KAAK,MAAM,EAAK,MAAM,CAAC,EAC9O,EAAc,CAAC,QAAM,QAAM,CAAC,CAAE,EAAE,EAAW,EAAE,IAAM,EAAe,IAAI,eAAe,CAAU,EAAoC,OAAlC,EAAe,QAAQ,CAAS,MAAY,EAAe,WAAW,CAAE,EAAE,CAAC,CAAC,EAC7K,IAAM,EAAgBC,EAAY,KAAM,IAAkB,IAAI,QAAQ,GAAS,CAAC,IAAM,EAAI,IAAI,MAAM,EAAI,YAAY,YAAY,EAAI,WAAW,CAAC,IAAM,EAAO,SAAS,cAAc,QAAQ,EAAQ,EAAI,EAAO,WAAW,IAAI,EAAE,GAAG,CAAC,EAAI,CAAC,EAAQ,CAAC,CAAC,EAAE,MAAO,CAAC,EAAO,MAAM,EAAW,MAAM,EAAO,OAAO,EAAW,OACpT,IAAM,EAAU,EAAI,MAAM,EAAI,OAAa,EAAa,EAAW,MAAM,EAAW,OAAW,EAAU,EAAW,EAAQ,EAAE,EAAQ,EAAK,EAAU,GAAc,EAAU,EAAW,MAAM,EAAW,EAAW,MAAM,EAAU,GAAS,EAAW,OAAO,GAAY,IAAQ,EAAW,EAAW,OAAO,EAAU,EAAW,OAAO,EAAU,GAAS,EAAW,MAAM,GAAW,GAAG,EAAI,UAAU,EAAI,EAAQ,EAAQ,EAAU,CAAU,EAAE,IAAM,EAAU,EAAI,aAAa,EAAE,EAAE,EAAW,MAAM,EAAW,MAAM,EAAQ,EAAU,CAAC,EAC1gB,EAAO,KAAK,IAAI,EAAE,KAAK,MAAM,CAAO,CAAC,EAAQ,EAAK,KAAK,IAAI,EAAW,MAAM,KAAK,KAAK,EAAQ,CAAS,CAAC,EAAQ,EAAO,KAAK,IAAI,EAAE,KAAK,MAAM,CAAO,CAAC,EAAQ,EAAK,KAAK,IAAI,EAAW,OAAO,KAAK,KAAK,EAAQ,CAAU,CAAC,EAAE,IAAI,IAAI,EAAE,EAAO,EAAE,EAAK,GAAG,EAAiB,IAAI,IAAI,EAAE,EAAO,EAAE,EAAK,GAAG,EAAgB,CAAC,IAAM,GAAG,EAAE,EAAW,MAAM,GAAG,EAAQ,EAAE,EAAU,KAAK,GAAS,EAAE,EAAU,KAAK,EAAE,GAAS,EAAE,EAAU,KAAK,EAAE,GAAS,EAAE,EAAU,KAAK,EAAE,GACtc,GAAG,EAAE,GAAG,CACR,IAAM,GAAe,KAAK,OAAO,EAAE,IAAI,EAAgB,IAAU,GAAe,KAAK,OAAO,EAAE,IAAI,EAAgB,IAAU,EAAO,EAAE,EAAoB,EAAO,EAAE,EAC5J,EAAQ,EAAW,MAAM,EAAQ,EAAQ,EAAW,OAAO,EAAuI,EAA5G,KAAK,MAAM,EAAO,IAAU,GAAG,EAAO,IAAU,CAA2F,EAAtE,KAAK,KAAK,GAAS,EAAE,GAAS,CAAoD,EAC7O,EAAc,GAAG,KAAK,OAAO,EAAE,EAC9B,EAAe,KAAK,EAAE,GAAe,IACrC,EAAS,EAAa,EAAc,EAAe,EAAU,KAAK,CAAC,EAAE,EAAO,EAAE,EAAO,UAAU,EAAO,UAAU,EAAO,GAAG,EAAE,GAAG,EAAE,MAAM,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAS,aAAa,EAAS,MAAM,EAAE,IAAI,iBAAiB,GAAM,oBAAoB,EAAE,aAAa,GAAM,kBAAkB,EAAE,cAAc,EAAE,cAAc,EACnV,WAAW,GAAK,mBAAmB,KAAK,IAAI,EAAE,eAAe,KAAK,OAAO,EAAE,IAAI,kBAAkB,CAAC,CAAC,CAAE,CAAC,CAAE,EAAQ,CAAS,CAAE,EAAE,EAAI,YAAY,EAAQ,CAAC,CAAC,EAAE,EAAI,IAAI,CAAS,CAAC,EAAI,CAAC,EAAW,MAAM,EAAW,OAAO,EAAgB,CAAY,CAAC,EAChP,MAAc,CAAC,GAAG,EAAS,OAAO,IAAI,EAAQ,GAAgI,OAAP,SAAhG,CAAC,IAAM,EAAU,MAAM,EAAgB,EAAM,GAAG,EAAK,IAAS,EAAa,QAAQ,EAAW,EAAE,CAAK,MAAY,CAAC,EAAQ,EAAM,CAAE,EAAE,CAAC,EAAM,IAAI,EAAgB,CAAQ,CAAC,EAC/O,MAAc,CAAC,GAAG,EAAS,OAAO,IAAI,EAAQ,GAAW,MAAY,CAAC,GAAG,CAAC,EAAQ,OAAO,IAAM,EAAO,EAAU,QAAQ,GAAG,CAAC,EAAO,CAAC,EAAkB,QAAQ,sBAAsB,CAAO,EAAE,MAAO,CAAC,IAAM,EAAI,EAAO,WAAW,IAAI,EAAE,GAAG,CAAC,EAAI,CAAC,EAAkB,QAAQ,sBAAsB,CAAO,EAAE,MAAO,CAChT,EAAI,UAAU,EAAE,EAAE,EAAW,MAAM,EAAW,MAAM,EACjD,IAAkB,gBAAe,EAAI,UAAU,EAAgB,EAAI,SAAS,EAAE,EAAE,EAAW,MAAM,EAAW,MAAM,GAAG,IAAM,EAAM,EAAS,QAAc,EAAU,EAAa,QAAc,EAAc,EAAiB,QAAc,EAAY,KAAK,IAAI,EAC5O,EAAc,MAEpC,EAAU,QAAQ,GAAU,CAC5B,IAAI,EAAc,EAAS,MAC3B,GAAG,EAAS,WAAW,CAAC,IAAM,EAAe,EAAY,EAAS,mBAAmB,GAAG,EAAe,EAAS,eAAe,CAAC,IAAM,EAAc,EAAe,EAAS,eAAqB,EAAkB,IAClN,GAAG,EAAc,EAAkB,CACpC,IAAM,EAAS,GAAW,EAAE,EAAc,IAAkB,EAAG,EAAS,kBAAkB,EAC1F,IAAM,EAAQ,EAAW,MAAM,EAAQ,EAAQ,EAAW,OAAO,EACjE,EAAS,EAAE,GAAS,EAAS,UAAU,GAAS,EAAS,EAAS,EAAE,GAAS,EAAS,UAAU,GAAS,EACzG,EAAS,KAAK,EAAS,aAAa,CAAS,KAC7C,GAAS,WAAW,GAAM,EAAS,EAAE,EAAS,UAAU,EAAS,EAAE,EAAS,UAAU,EAAS,KAAK,EAAS,aAAa,EAAS,kBAAkB,CAAG,KAAK,CAC7J,IAAM,EAAQ,EAAW,MAAM,EAAQ,EAAQ,EAAW,OAAO,EAAE,EAAS,EAAE,EAAQ,EAAS,EAAE,EAAQ,EAAS,KAAK,EAAE,MACzH,CAAC,KAAK,CAEN,IAAM,EAAG,EAAS,EAAE,EAAM,EAAQ,EAAG,EAAS,EAAE,EAAM,EAAQ,EAAS,KAAK,KAAK,EAAG,EAAG,EAAG,CAAE,EAC5F,GAAG,EAAe,SAAS,EAAS,EAAgB,IAAI,CAAC,EAAS,aAAa,CAAK,EAAS,mBAAkB,EAAS,iBAAiB,GAAK,EAAS,oBAAoB,KAAK,IAAI,GACpL,IAAM,EAAgB,KAAK,EAAE,GAAU,EAAgB,KAChD,EAAK,CAAC,GAAI,EAAS,GAAS,EAAK,CAAC,GAAI,EAAS,GAAG,EAAS,IAAI,EAAK,EAAgB,EAAS,IAAI,EAAK,CAAgB,MAAM,GAAG,CAAC,EAAe,SAAS,EAAS,iBAAiB,CACzL,EAAS,iBAAiB,GAC1B,IAAM,EAAe,EAAS,EAAE,EAAS,UAAgB,EAAe,EAAS,EAAE,EAAS,UAAgB,EAAa,KAAK,KAAK,EAAe,EAAe,EAAe,CAAc,EACxL,EAAgB,EAAgB,GAA0E,EAA/C,KAAK,IAAI,EAAa,EAAgB,CAAsC,EAAE,IAE/I,EAAS,KAAK,EAAS,aAAa,eAAe,CACnD,IAAM,EAAS,EAAS,UAAU,EAAS,EAAQ,EAAS,EAAS,UAAU,EAAS,EAAE,EAAS,GAAG,EAAS,IAAI,EAAS,GAAG,EAAS,GAAI,EAAE,CAAY,CAAE,CAC5J,GAAG,CAAC,EAAe,SAAS,EAAS,GAAiB,EAAS,EAAE,CAAC,IAAM,GAAO,EAAgB,GAAU,EAAsB,EAAW,EAAM,EAAkB,IAC5J,EAAM,EAAG,EAAS,EAAiB,EAAM,EAAG,EAAS,EAC3D,GADsE,EAAS,IAAI,EAAM,EAAS,IAAI,EACnG,EAAM,GAAG,CACZ,IAAM,EAAa,KAAK,MAAM,EAAS,EAAE,EAAS,YAAY,GAAG,EAAS,EAAE,EAAS,YAAY,CAAC,EAAQ,EAAgB,EAAgB,GAAS,EAAU,KAAK,IAAI,EAAa,EAAgB,CAAC,EACpM,EAAS,KAAK,EAAS,cAAc,EAAE,EAAU,IAAI,EAAc,EAAS,OAAO,EAAE,EAAU,GAAI,CAAC,CACpG,GAAG,EAAS,aAAa,CAAC,IAAM,EAAa,KAAK,IAAI,EAAE,EAAS,kBAAwB,EAAiB,IACzG,GAAG,EAAa,EAAiB,CAAC,IAAM,EAAS,EAAa,EACzD,EAAiB,EAAS,cAAc,EAAS,GAAG,EAAS,EAAE,EAAS,UAAU,KAAK,IAAI,EAAS,aAAa,EAAE,EAAiB,EAAS,EAAE,EAAS,UAAU,KAAK,IAAI,EAAS,aAAa,EAAE,EACzM,IAAM,EAAsB,GAAS,EACpC,EAAS,KAAK,EAAS,cAAc,EAAE,EAAc,KACtD,GAAS,aAAa,GAAM,EAAS,EAAE,EAAS,UAAU,EAAS,EAAE,EAAS,UAAU,EAAS,KAAK,EAAS,YAAc,CAC7H,GAAG,CAAC,EAAS,iBAAiB,CAAC,IAAM,EAAS,EAAS,UAAU,EAAS,EAAQ,EAAS,EAAS,UAAU,EAAS,EAAE,EAAS,IAAI,EAAS,EAAe,IAAI,EAAS,IAAI,EAAS,EAAe,GAAI,CAG3M,GAFA,EAAS,IAAI,IAAI,EAAS,IAAI,IAC9B,EAAS,GAAG,EAAS,GAAG,EAAS,GAAG,EAAS,GAC1C,EAAS,GAAiB,EAAS,EAAE,CAAC,IAAM,EAAa,EAAgB,EAAe,EAAW,KAAK,IAAI,EAAE,GAAc,EAAgB,GAAG,EAAQ,EAAe,KAAK,IAAI,GAAG,EAAE,EAAW,EAAE,EAAE,EAAS,KAAK,EAAS,aAAa,CAAe,KACzP,GAAS,KAAK,EAAS,YAAc,CACrC,IAAM,EAAG,EAAS,EAAE,EAAM,EAAQ,EAAG,EAAS,EAAE,EAAM,EAAQ,EAAS,KAAK,KAAK,EAAG,EAAG,EAAG,CAAE,EACtF,EAAgB,EAAgB,IAAU,EAAc,EAAgB,GAC7E,GAAG,EAAS,EAAe,GAAG,EAAS,EACxC,EAAc,MAAO,CAErB,IAAM,IADiB,EAAS,IAAkB,EAAc,KAClB,GAAI,EAAc,EAAS,MAAM,CAAe,CAC3F,EAAc,GAAG,EAAS,KAAK,IAAG,EAAI,YAAY,EAAc,EAAI,UAAU,EAAS,MAAM,EAAI,UAAU,EAAE,EAAI,IAAI,EAAS,EAAE,EAAS,EAAE,EAAS,KAAK,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,EAAI,KAAK,EAAE,EAAI,YAAY,EAAG,CAAC,EAAE,EAAkB,QAAQ,sBAAsB,CAAO,CAAE,EAA2D,MAAzD,GAAkB,QAAQ,sBAAsB,CAAO,MAAY,CAAC,EAAQ,GAAS,EAAkB,SAAS,qBAAqB,EAAkB,OAAO,CAAG,CAAE,EAAE,CAAC,EAAS,EAAW,MAAM,EAAW,OAAO,EAAgB,EAAgB,EAAkB,CAAc,CAAC,EAC1hB,IAAM,EAAgBA,EAAY,GAAG,CAAC,GAAG,CAAC,EAAU,QAAQ,OAAO,IAAM,EAAK,EAAU,QAAQ,sBAAsB,EAAQ,EAAO,EAAW,MAAM,EAAK,MAAY,EAAO,EAAW,OAAO,EAAK,OAAa,EAAY,CAAC,GAAG,EAAE,QAAQ,EAAK,MAAM,EAAO,GAAG,EAAE,QAAQ,EAAK,KAAK,CAAM,EACrR,EAAU,EAAa,QAAc,EAAG,EAAY,EAAE,EAAU,EAAQ,EAAG,EAAY,EAAE,EAAU,EAAQ,EAAM,KAAK,KAAK,EAAG,EAAG,EAAG,CAAE,EAC5I,EAAiB,QAAQ,CAAC,GAAG,EAAiB,QAAQ,GAAG,GAAG,EAAG,GAAG,GAAG,EAAiB,QAAQ,GAAG,GAAG,EAAG,GAAG,MAAM,EAAiB,QAAQ,MAAM,GAAG,EAAM,EAAE,EAAE,EAAa,QAAQ,EAAS,QAAQ,EAAS,QAAQ,CAAY,EAAE,CAAC,EAAW,MAAM,EAAW,MAAM,CAAC,EAAQ,EAAiBA,MAAgB,CAAC,EAAS,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAa,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAiB,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAe,QAAQ,EAAM,EAAE,CAAC,CAAC,EAAQ,EAAgBA,MAAgB,CAAC,EAAe,QAAQ,GAAK,EAAiB,QAAQ,KAAK,IAAI,CAAE,EAAE,CAAC,CAAC,EAAQ,EAAcA,MAAgB,CAAC,EAAe,QAAQ,EAAM,EAAE,CAAC,CAAC,EAC7R,OAAxV,EAA8B,EAAK,MAAM,CAAC,IAAI,EAAa,MAAM,CAAC,GAAG,EAAM,MAAM,OAAO,OAAO,OAAO,WAAW,EAAgB,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,aAAa,EAAE,SAAS,QAAQ,EAAE,SAAsB,EAAK,MAAM,CAAC,IAAI,EAAM,IAAI,IAAI,EAAM,IAAI,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,UAAU,SAAS,CAAC,CAAC,CAAC,CAAC,EAAuB,EAAK,MAAM,CAAC,IAAI,EAAa,MAAM,CAAC,GAAG,EAAM,MAAM,OAAO,OAAO,OAAO,SAAS,UAAU,EAAE,SAAsB,EAAK,SAAS,CAAC,IAAI,EAAU,MAAM,EAAW,MAAM,OAAO,EAAW,OAAO,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,QAAQ,OAAO,EAAE,YAAY,EAAgB,aAAa,EAAiB,YAAY,EAAgB,UAAU,EAAc,aAAa,6BAA6B,KAAK,KAAK,CAAC,CAAC,CAAC,CAAE,iBA1E/tB,IAAyD,IAAwE,EA0E+lB,EAAoB,EAAc,CAAC,MAAM,CAAC,KAAK,EAAY,gBAAgB,MAAM,OAAO,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,gBAAgB,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,EAAE,gBAAgB,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,gBAAgB,CAAC,KAAK,EAAY,OAAO,MAAM,mBAAmB,aAAa,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,GAAG,KAAK,IAAI,EAAE,kBAAkB,CAAC,KAAK,EAAY,OAAO,MAAM,qBAAqB,aAAa,GAAG,IAAI,GAAG,IAAI,IAAI,KAAK,CAAC,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,kBAAkB,aAAa,IAAI,IAAI,IAAI,IAAI,GAAG,KAAK,GAAG,EAAE,gBAAgB,CAAC,KAAK,EAAY,MAAM,MAAM,aAAa,aAAa,aAAa,CAAC,CAAC"}