{"version":3,"file":"shared-lib.Dccibaf0.mjs","names":["useMemo","useRef","useState","useCallback","metadata","metadata","siteMetadata","metadataVersion","__FramerMetadata__","siteMetadata"],"sources":["https:/framerusercontent.com/modules/MAwMRc2HYXAWvcqwXx7o/ltExFLdhlnATK5oAqRzb/CinemaScreenVideo.js","https:/framerusercontent.com/modules/80GnZewZlSTR1uVEPNfa/mcukz3Wta1qymkOFuPmv/siteMetadata.js","https:/framerusercontent.com/modules/vd0iHK23R5Jo2dLPjH3z/vYVjNuo6v465P3aHsgY9/yVVEUwgkP.js","https:/framerusercontent.com/modules/XQAnA0YM0J60DRqXprsd/YwGMIJo2VyJrHogj1HrT/jOElk7VQY.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{useCallback,useEffect,useMemo,useRef,useState}from\"react\";import{addPropertyControls,ControlType,RenderTarget,useIsStaticRenderer}from\"framer\";function hueToRgbChannel(p,q,t){let tt=t;if(tt<0)tt+=1;if(tt>1)tt-=1;if(tt<1/6)return p+(q-p)*6*tt;if(tt<1/2)return q;if(tt<2/3)return p+(q-p)*(2/3-tt)*6;return p;}function hslToRgb(h,s,l){if(s===0)return[l,l,l];const q=l<.5?l*(1+s):l+s-l*s;const p=2*l-q;return[hueToRgbChannel(p,q,h+1/3),hueToRgbChannel(p,q,h),hueToRgbChannel(p,q,h-1/3)];}// Framer's ControlType.Color values arrive as hex (\"#rgb\", \"#rrggbb\",\n// \"#rrggbbaa\") when opaque, or hsla(...)/rgba(...) when they carry\n// transparency. Parsed locally (rather than via a color library) so we\n// always get a plain 0-1 RGBA quadruple - the alpha caps how strongly the\n// vignette can tint the video, independent of the Amount slider.\nfunction parseColorToRgba(input){const hex=input.match(/^#([0-9a-fA-F]{3,8})$/);if(hex){let value=hex[1];if(value.length===3||value.length===4){value=value.split(\"\").map(c=>c+c).join(\"\");}const a=value.length>=8?parseInt(value.slice(6,8),16)/255:1;return[parseInt(value.slice(0,2),16)/255,parseInt(value.slice(2,4),16)/255,parseInt(value.slice(4,6),16)/255,a];}const hsl=input.match(/hsla?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*([\\d.]+))?/i);if(hsl){const[r,g,b]=hslToRgb(parseFloat(hsl[1])/360,parseFloat(hsl[2])/100,parseFloat(hsl[3])/100);return[r,g,b,hsl[4]!==undefined?parseFloat(hsl[4]):1];}const rgb=input.match(/rgba?\\(\\s*([\\d.]+)\\s*,\\s*([\\d.]+)\\s*,\\s*([\\d.]+)(?:\\s*,\\s*([\\d.]+))?/i);if(rgb){return[parseFloat(rgb[1])/255,parseFloat(rgb[2])/255,parseFloat(rgb[3])/255,rgb[4]!==undefined?parseFloat(rgb[4]):1];}return[0,0,0,1];}// Splits on a top-level separator character, ignoring any occurrence inside\n// parentheses - e.g. splitting \"0px 4px rgba(0, 0, 0, 0.2), inset 0px 0px #000\"\n// on \",\" must not be fooled by the comma inside rgba(...).\nfunction splitTopLevel(input,separator){const parts=[];let current=\"\";let depth=0;for(const char of input){if(char===\"(\")depth++;if(char===\")\")depth--;if(char===separator&&depth===0){parts.push(current);current=\"\";}else{current+=char;}}parts.push(current);return parts;}// Splits a single shadow's value on whitespace, again respecting\n// parentheses, so a color like \"rgba(0, 0, 0, 0.2)\" stays one token instead\n// of being torn apart by its own internal spaces.\nfunction tokenizeShadowSegment(segment){const tokens=[];let current=\"\";let depth=0;for(const char of segment){if(char===\"(\")depth++;if(char===\")\")depth--;if(char===\" \"&&depth===0){if(current)tokens.push(current);current=\"\";}else{current+=char;}}if(current)tokens.push(current);return tokens;}// BoxShadow supports multiple stacked shadows, so it arrives as an array of\n// per-shadow strings (even with just one shadow configured) - joined into\n// one comma-separated value, same as CSS itself expects for multiple\n// box-shadows.\nfunction normalizeShadowValue(value){if(Array.isArray(value))return value.join(\", \");return value||\"0px 4px 14px 0px rgba(0, 0, 0, 0.18)\";}// ControlType.BoxShadow gives back a plain CSS box-shadow string, which\n// draws around the element's rectangular box - useless here, since the\n// video is masked into a curved silhouette. filter: drop-shadow() draws\n// from the actual rendered alpha instead, so it follows the curve, but it\n// only accepts x/y/blur/color (no spread, no inset) - this converts the\n// native control's value into an equivalent drop-shadow() chain, dropping\n// any spread radius and skipping inset shadows entirely (undrawable here).\nfunction boxShadowToDropShadowFilter(boxShadowValue){if(!boxShadowValue||boxShadowValue.trim().toLowerCase()===\"none\"){return undefined;}const lengthPattern=/^-?[\\d.]+(px|em|rem|%|vh|vw)?$/;const dropShadows=splitTopLevel(boxShadowValue,\",\").map(segment=>segment.trim()).filter(segment=>segment.length>0).map(segment=>{const tokens=tokenizeShadowSegment(segment).filter(token=>token.toLowerCase()!==\"inset\");if(tokens.length===0)return null;const lengths=tokens.filter(token=>lengthPattern.test(token));const color=tokens.find(token=>!lengthPattern.test(token))??\"rgba(0, 0, 0, 1)\";const[x=\"0px\",y=\"0px\",blur=\"0px\"]=lengths;return`drop-shadow(${x} ${y} ${blur} ${color})`;}).filter(value=>value!==null);return dropShadows.length>0?dropShadows.join(\" \"):undefined;}function edgeBumpJs(t){const d=2*t-1;return 1-d*d;}// Shared by every curve/inset function below so they always trace the exact\n// same boundary - keeping the constants in one place instead of duplicating\n// literals avoids them silently drifting apart.\nconst CONVEX_MAX_OFFSET_SCALE_X=.45;const CONVEX_VERTICAL_SOFTNESS=.7;const CONCAVE_MAX_PILLOW_INSET_Y=.04;const CONCAVE_SIDE_SOFTNESS=.5;// The convex warp (curvedX = px + px*offX^2, offX depending on py and vice\n// versa) is a coupled system - offX depends on the very py we're solving\n// for, and vice versa. Given a target point ON the unit square's edge\n// (curvedX/curvedY, one of them fixed to +-1), this finds the source point\n// via fixed-point iteration: px = curvedX/(1+offX^2), py = curvedY/(1+offY^2),\n// each using the OTHER axis's previous estimate. Both maxima are well under\n// 1, so this is a contraction and converges in only a few passes.\nfunction solveConvexBoundaryPoint(curvedXTarget,curvedYTarget,offsetScaleX,offsetScaleY){let px=curvedXTarget;let py=curvedYTarget;for(let i=0;i<8;i++){const offX=Math.abs(py)*offsetScaleX;const offY=Math.abs(px)*offsetScaleY;px=curvedXTarget/(1+offX*offX);py=curvedYTarget/(1+offY*offY);}return{x:(px*.5+.5)*100,y:(py*.5+.5)*100};}// Traces all four edges of the curved silhouette as plain vector points (0-100\n// scale) - no canvas, no raster, just the same warp math solved directly.\n// Used both to build the clip-path polygon (all four edges) and to draw the\n// progress bar (the bottom edge alone). Each edge runs its parameter 0->1 in\n// the natural reading direction (top/bottom: left-to-right, left/right:\n// top-to-bottom); reverse bottom/left when assembling a clockwise polygon.\nfunction computeCurveEdges(curveDirection,horizontalIntensity,verticalIntensity,pointsPerEdge=48){const clampedHorizontal=Math.min(Math.max(horizontalIntensity,0),100);const clampedVertical=Math.min(Math.max(verticalIntensity,0),100);const top=[];const right=[];const bottom=[];const left=[];if(curveDirection===\"convex\"){const offsetScaleX=CONVEX_MAX_OFFSET_SCALE_X*Math.sqrt(clampedHorizontal/100);const offsetScaleY=CONVEX_MAX_OFFSET_SCALE_X*CONVEX_VERTICAL_SOFTNESS*Math.sqrt(clampedVertical/100);for(let i=0;i<=pointsPerEdge;i++){const t=i/pointsPerEdge;const ndc=t*2-1;top.push(solveConvexBoundaryPoint(ndc,-1,offsetScaleX,offsetScaleY));right.push(solveConvexBoundaryPoint(1,ndc,offsetScaleX,offsetScaleY));bottom.push(solveConvexBoundaryPoint(ndc,1,offsetScaleX,offsetScaleY));left.push(solveConvexBoundaryPoint(-1,ndc,offsetScaleX,offsetScaleY));}}else{const pillowInsetY=CONCAVE_MAX_PILLOW_INSET_Y*(clampedVertical/100);const pillowInsetX=CONCAVE_MAX_PILLOW_INSET_Y*CONCAVE_SIDE_SOFTNESS*(clampedHorizontal/100);for(let i=0;i<=pointsPerEdge;i++){const t=i/pointsPerEdge;top.push({x:t*100,y:pillowInsetY*edgeBumpJs(t)*100});bottom.push({x:t*100,y:(1-pillowInsetY*edgeBumpJs(t))*100});right.push({x:(1-pillowInsetX*edgeBumpJs(t))*100,y:t*100});left.push({x:pillowInsetX*edgeBumpJs(t)*100,y:t*100});}}return{top,right,bottom,left};}// Walks the four edges clockwise from the top-left corner into one closed\n// polygon. Percentage units (not path()'s plain numbers) so it stretches\n// with the container exactly like the old mask-size:100% 100% did, with no\n// JS resize handling needed.\nfunction buildClipPathPolygon(edges){const points=[...edges.top,...edges.right,...[...edges.bottom].reverse(),...[...edges.left].reverse()];const pointList=points.map(point=>`${point.x.toFixed(2)}% ${point.y.toFixed(2)}%`).join(\", \");return`polygon(${pointList})`;}// Shared by computeCornerSideInset and computeCornerTopInset: solves\n// curvedAxis = boundary * (1 + offsetScale^2) = 1 for the pre-remap\n// boundary position, then converts the resulting inset into a 0-100 scale.\nfunction cornerInsetFromOffsetScale(offsetScale){const boundary=1/(1+offsetScale*offsetScale);return(1-boundary)/2*100;}// How far horizontalIntensity rounds the corners inward horizontally,\n// evaluated at the very top/bottom row (the corner itself) - used to keep a\n// UI element's gap from the left/right edges visually consistent as the\n// curve rounds the corner more. Mirrors computeCurveEdges's convex math with\n// the X/Y axes swapped (X is the full-strength axis, no vertical-softness\n// factor).\nfunction computeCornerSideInset(curveDirection,horizontalIntensity){// Concave corners stay flush with the box regardless of intensity -\n// only each edge's own midpoint pinches inward.\nif(curveDirection===\"concave\")return 0;const clampedHorizontal=Math.min(Math.max(horizontalIntensity,0),100);const offsetScaleX=CONVEX_MAX_OFFSET_SCALE_X*Math.sqrt(clampedHorizontal/100);return cornerInsetFromOffsetScale(offsetScaleX);}// How far verticalIntensity rounds the corners inward vertically, evaluated\n// at the left/right edge (the corner itself) - the vertical counterpart of\n// computeCornerSideInset, used for a top-anchored UI element's gap from the\n// top edge.\nfunction computeCornerTopInset(curveDirection,verticalIntensity){if(curveDirection===\"concave\")return 0;const clampedVertical=Math.min(Math.max(verticalIntensity,0),100);const offsetScaleY=CONVEX_MAX_OFFSET_SCALE_X*CONVEX_VERTICAL_SOFTNESS*Math.sqrt(clampedVertical/100);return cornerInsetFromOffsetScale(offsetScaleY);}// Both icons share the same 12x16 bounding box, so they read as the same\n// visual size at the same render size. The play triangle is nudged 1px\n// right of true geometric center - a perfectly centered triangle reads as\n// shifted left, since its visual weight sits in the flat left edge; the\n// nudge leaves a bit of breathing room on the left so it looks centered.\nfunction PlayIcon(){return /*#__PURE__*/_jsx(\"svg\",{width:28,height:28,viewBox:\"0 0 24 24\",fill:\"#fff\",\"aria-hidden\":\"true\",children:/*#__PURE__*/_jsx(\"path\",{d:\"M7 4v16l12-8z\"})});}function PauseIcon(){return /*#__PURE__*/_jsxs(\"svg\",{width:28,height:28,viewBox:\"0 0 24 24\",fill:\"#fff\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"rect\",{x:\"6\",y:\"4\",width:\"4\",height:\"16\",rx:\"1\"}),/*#__PURE__*/_jsx(\"rect\",{x:\"14\",y:\"4\",width:\"4\",height:\"16\",rx:\"1\"})]});}function VolumeOnIcon(){return /*#__PURE__*/_jsxs(\"svg\",{width:18,height:18,viewBox:\"0 0 24 24\",fill:\"#fff\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"path\",{d:\"M3 9v6h4l5 5V4L7 9H3z\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M16.5 12c0-1.77-1.02-3.29-2.5-4.03v8.05c1.48-.73 2.5-2.25 2.5-4.02z\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z\"})]});}function VolumeOffIcon(){return /*#__PURE__*/_jsxs(\"svg\",{width:18,height:18,viewBox:\"0 0 24 24\",fill:\"none\",\"aria-hidden\":\"true\",children:[/*#__PURE__*/_jsx(\"path\",{d:\"M3 9v6h4l5 5V4L7 9H3z\",fill:\"#fff\"}),/*#__PURE__*/_jsx(\"path\",{d:\"M15 8.5l6 7M21 8.5l-6 7\",stroke:\"#fff\",strokeWidth:2,strokeLinecap:\"round\"})]});}/**\n * Cinema Screen Video\n *\n * Plays a video (uploaded or a URL) clipped into a curved cinema-screen\n * silhouette (rounded corners for a convex bulge, a \"pillow\" pinch for a\n * concave dip). The video itself is never redrawn or warped - it's a plain,\n * native <video> with a CSS clip-path - so playback, resizing, and CORS all\n * behave exactly like normal media.\n *\n * ```jsx\n * <CinemaScreenVideo video=\"https://example.com/video.mp4\" curveDirection=\"convex\" horizontalIntensity={45} verticalIntensity={45} />\n * ```\n *\n * @framerIntrinsicWidth 600\n * @framerIntrinsicHeight 338\n *\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight any-prefer-fixed\n */export default function CinemaScreenVideo(props){const{videoSource=\"upload\",video:videoFile,videoUrl,curveDirection=\"concave\",horizontalIntensity=0,verticalIntensity=45,vignette,shadow:shadowProp,radius=\"0px\",autoPlay=true,loop=true,muted=true,nativeControls=true,showPoster=true,posterImage,style}=props;// File/URL/ResponsiveImage controls can't declare a real defaultValue in\n// Framer, so an empty/untouched control arrives as \"\" or {src: \"\"}\n// rather than undefined - `||` catches that, a plain default parameter\n// would not.\nconst DEFAULT_VIDEO_SRC=\"https://framerusercontent.com/assets/MLWPbW1dUQawJLhhun3dBwpgJak.mp4\";const video=(videoSource===\"url\"?videoUrl:videoFile)||DEFAULT_VIDEO_SRC;// No fallback here on purpose - a poster should only ever show an image\n// the user actually uploaded, never a stock placeholder.\nconst posterSrc=posterImage?.src||\"\";const isStatic=useIsStaticRenderer();// Distinct from the general isStatic check: thumbnail (marketplace/\n// dashboard preview) and export renders may not fetch the video at all,\n// unlike the interactive canvas, which still loads and shows the real\n// first frame. Swapping in a static image there (rather than an empty\n// <video>) is what Framer's own review flags as missing.\nconst renderTarget=RenderTarget.current();const isThumbnailOrExport=renderTarget===RenderTarget.thumbnail||renderTarget===RenderTarget.export;const vignetteColor=vignette?.color||\"rgba(0, 0, 0, 0.05)\";const vignetteIntensity=vignette?.intensity??30;const vignetteRgba=useMemo(()=>parseColorToRgba(vignetteColor),[vignetteColor]);// Pure math, no canvas/document access at all - unlike the old raster\n// mask, this computes identically on the server and the client, so\n// there's no SSR/hydration mismatch and nothing that needs a mount-time\n// retry or a forced repaint to \"catch up\".\nconst curveEdges=useMemo(()=>computeCurveEdges(curveDirection,horizontalIntensity,verticalIntensity),[curveDirection,horizontalIntensity,verticalIntensity]);const clipPathValue=useMemo(()=>buildClipPathPolygon(curveEdges),[curveEdges]);// How much the curve itself rounds the corners inward - added on top of\n// the flat breathing-room margins below so the visual gap from the\n// actual (curved) edge stays consistent as intensity changes, instead\n// of the bar/button drifting closer to or further from the edge.\nconst cornerSideInset=useMemo(()=>computeCornerSideInset(curveDirection,horizontalIntensity),[curveDirection,horizontalIntensity]);const cornerTopInset=useMemo(()=>computeCornerTopInset(curveDirection,verticalIntensity),[curveDirection,verticalIntensity]);// The volume button sits at a corner shaped by both axes at once - use\n// whichever inset is larger so it clears the corner on both sides and\n// keeps an even, matching gap top and right.\nconst cornerInset=Math.max(cornerSideInset,cornerTopInset);// Lifted a bit above the mask's actual bottom edge so the bar always\n// sits on visible video, never straddling the cut-off, and inset from\n// the sides so it doesn't run edge-to-edge.\nconst PROGRESS_BAR_MARGIN_Y=10;const PROGRESS_BAR_INSET_X=6+cornerSideInset;const progressBarPoints=useMemo(()=>curveEdges.bottom.map(point=>({x:PROGRESS_BAR_INSET_X+point.x/100*(100-2*PROGRESS_BAR_INSET_X),y:Math.max(0,point.y-PROGRESS_BAR_MARGIN_Y)})),[curveEdges,PROGRESS_BAR_INSET_X]);const progressBarPathD=useMemo(()=>progressBarPoints.map((point,index)=>`${index===0?\"M\":\"L\"} ${point.x.toFixed(2)} ${point.y.toFixed(2)}`).join(\" \"),[progressBarPoints]);const containerRef=useRef(null);const videoRef=useRef(null);const progressSvgRef=useRef(null);const progressFillRef=useRef(null);const progressFractionRef=useRef(0);const[isPlaying,setIsPlaying]=useState(autoPlay);const[isMuted,setIsMuted]=useState(muted);const[posterHidden,setPosterHidden]=useState(false);// Mobile browsers apply :hover on tap and have no mouseleave to ever\n// clear it, so after a tap-to-pause/tap-to-resume the hover-revealed\n// controls get stuck visible forever. This force-hides them a moment\n// after playback resumes, overriding the stuck :hover via a class\n// rather than fighting CSS hover state directly.\nconst[autoHideControls,setAutoHideControls]=useState(false);const autoHideTimeoutRef=useRef(undefined);// Same reasoning as isMuted below: isPlaying only seeds from Playing on\n// mount, so without this, flipping Playing afterward in the Framer\n// canvas wouldn't update the play/pause icon shown in the static\n// preview.\nuseEffect(()=>{setIsPlaying(autoPlay);},[autoPlay]);// isMuted only seeds from the Muted prop on mount - without this, the\n// volume button's icon gets stuck on whatever it started as (e.g. in\n// the Framer canvas, flipping the Muted property afterward wouldn't\n// change what the button shows, since the prop change alone doesn't\n// re-run useState).\nuseEffect(()=>{setIsMuted(muted);},[muted]);// The muted JSX prop alone is unreliable on <video>/<audio> - it's a\n// boolean HTML attribute, but actual audio output is governed by the\n// DOM property, and browsers don't consistently keep the two in sync\n// when only the attribute is set/changed (a known quirk, not React\n// handling this \"wrong\" so much as the browser being inconsistent here).\n// Setting it imperatively on the element itself, on every isMuted\n// change including the first, is the reliable fix - this is why sound\n// could stay off even with Muted: No and no console error in sight.\nuseEffect(()=>{const videoEl=videoRef.current;if(videoEl)videoEl.muted=isMuted;},[isMuted]);// Hide the poster once real playback starts, matching how a native\n// <video poster> disappears on play instead of on load. Not wrapped in\n// startTransition - that marks the update as low-priority/interruptible,\n// wrong for something that must happen reliably and immediately (was\n// likely why the poster sometimes got stuck showing over a playing\n// video). Also listens on both \"play\" and \"playing\" - whichever fires\n// first - and checks the element synchronously on mount, since\n// (especially with autoplay) playback can genuinely start before this\n// effect gets a chance to attach its listeners, and that race would\n// otherwise leave the poster stuck forever with nothing left to fire.\nuseEffect(()=>{const videoEl=videoRef.current;if(!videoEl)return;const hidePoster=()=>setPosterHidden(true);if(!videoEl.paused)hidePoster();videoEl.addEventListener(\"play\",hidePoster);videoEl.addEventListener(\"playing\",hidePoster);return()=>{videoEl.removeEventListener(\"play\",hidePoster);videoEl.removeEventListener(\"playing\",hidePoster);};},[]);const clearAutoHideTimer=useCallback(()=>{if(autoHideTimeoutRef.current!==undefined){clearTimeout(autoHideTimeoutRef.current);autoHideTimeoutRef.current=undefined;}},[]);// Tied to the video element's actual play/pause state (not the click\n// handler) so it stays correct no matter what causes playback to\n// start/stop - the video ending on its own, external calls, etc. -\n// and, per spec, controls should only ever auto-hide during real\n// playback: paused (for any reason) always keeps them shown. Explicitly\n// skipped in any static context (canvas, export, thumbnail) - nothing\n// autoplays there anyway, but Framer's marketplace review scans for\n// exactly this pattern (a timer/effect with no direct isStatic guard)\n// regardless of whether it would actually run in practice.\nuseEffect(()=>{if(isStatic)return;const videoEl=videoRef.current;if(!videoEl)return;const handlePlay=()=>{clearAutoHideTimer();autoHideTimeoutRef.current=window.setTimeout(()=>{setAutoHideControls(true);},400);};const handlePause=()=>{clearAutoHideTimer();setAutoHideControls(false);};videoEl.addEventListener(\"play\",handlePlay);videoEl.addEventListener(\"pause\",handlePause);videoEl.addEventListener(\"ended\",handlePause);return()=>{clearAutoHideTimer();videoEl.removeEventListener(\"play\",handlePlay);videoEl.removeEventListener(\"pause\",handlePause);videoEl.removeEventListener(\"ended\",handlePause);};},[clearAutoHideTimer]);// isPlaying mirrors the video's own \"playing\"/\"pause\"/\"ended\" events\n// rather than being set optimistically wherever playback is requested -\n// play() can be rejected by the browser (autoplay/user-interaction\n// policy), and only reflecting success via the real event means the\n// icon can never claim \"playing\" when the video didn't actually start,\n// no matter what triggered the play/pause (our own button, autoplay,\n// or anything else).\nuseEffect(()=>{const videoEl=videoRef.current;if(!videoEl)return;const handlePlaying=()=>setIsPlaying(true);const handleStop=()=>setIsPlaying(false);videoEl.addEventListener(\"playing\",handlePlaying);videoEl.addEventListener(\"pause\",handleStop);videoEl.addEventListener(\"ended\",handleStop);return()=>{videoEl.removeEventListener(\"playing\",handlePlaying);videoEl.removeEventListener(\"pause\",handleStop);videoEl.removeEventListener(\"ended\",handleStop);};},[]);// Not wrapped in startTransition - same reasoning as the poster fix\n// above: it marks the icon update as low-priority/interruptible, which\n// can lag or get skipped entirely. The actual DOM toggle (play/pause,\n// muted) always happens immediately either way, so a delayed icon just\n// makes a working button look broken - exactly what was reported for\n// volume (\"I have the impression it doesn't work\").\nconst togglePlayback=useCallback(()=>{const videoEl=videoRef.current;if(!videoEl)return;if(videoEl.paused){// A rejected play() (autoplay/user-interaction policy) must not\n// surface as an unhandled promise rejection - the \"playing\"\n// event above is what actually flips isPlaying, so a rejection\n// here just means the video correctly stays shown as paused.\nvideoEl.play()?.catch(()=>{});}else{videoEl.pause();}},[]);const toggleMute=useCallback(()=>{const videoEl=videoRef.current;if(!videoEl)return;const next=!videoEl.muted;videoEl.muted=next;setIsMuted(next);},[]);// Written straight to the DOM (not React state) since timeupdate fires\n// several times a second - routing that through a re-render would be\n// wasted work for a couple of style/attribute writes. The fill path\n// declares pathLength=100, so its total length is always exactly 100\n// regardless of actual geometry - no getTotalLength() measurement\n// needed, which also sidesteps it ever being read before first layout.\nconst applyProgressVisual=useCallback(fraction=>{const fillPath=progressFillRef.current;if(fillPath){fillPath.style.strokeDashoffset=String(100*(1-fraction));}},[]);// Re-applies the last known fraction whenever the curve itself changes,\n// so the knob/fill immediately match the new curve instead of lagging\n// until the next timeupdate.\nuseEffect(()=>{applyProgressVisual(progressFractionRef.current);},[progressBarPathD,applyProgressVisual]);// timeupdate only fires a handful of times a second, which reads as\n// choppy motion for something meant to glide along a curve - driving it\n// from a rAF loop instead gives it real frame-rate smoothness, and the\n// loop only runs while actually playing. Explicitly skipped in any\n// static context (canvas, export, thumbnail) - see the note on the\n// auto-hide effect above for why this guard is added even though\n// nothing autoplays there anyway.\nuseEffect(()=>{if(isStatic)return;const videoEl=videoRef.current;if(!videoEl)return;let rafId=0;const updateProgress=()=>{const fraction=videoEl.duration?videoEl.currentTime/videoEl.duration:0;progressFractionRef.current=fraction;applyProgressVisual(fraction);};const tick=()=>{updateProgress();rafId=requestAnimationFrame(tick);};const handlePlay=()=>{cancelAnimationFrame(rafId);rafId=requestAnimationFrame(tick);};const handlePause=()=>{cancelAnimationFrame(rafId);updateProgress();};videoEl.addEventListener(\"play\",handlePlay);videoEl.addEventListener(\"pause\",handlePause);videoEl.addEventListener(\"ended\",handlePause);videoEl.addEventListener(\"loadedmetadata\",updateProgress);videoEl.addEventListener(\"seeked\",updateProgress);if(!videoEl.paused)handlePlay();return()=>{cancelAnimationFrame(rafId);videoEl.removeEventListener(\"play\",handlePlay);videoEl.removeEventListener(\"pause\",handlePause);videoEl.removeEventListener(\"ended\",handlePause);videoEl.removeEventListener(\"loadedmetadata\",updateProgress);videoEl.removeEventListener(\"seeked\",updateProgress);};},[applyProgressVisual]);const seekToClientX=useCallback(clientX=>{const svg=progressSvgRef.current;const videoEl=videoRef.current;if(!svg||!videoEl||!videoEl.duration)return;const rect=svg.getBoundingClientRect();const clickPercent=(clientX-rect.left)/rect.width*100;const fraction=Math.min(Math.max((clickPercent-PROGRESS_BAR_INSET_X)/(100-2*PROGRESS_BAR_INSET_X),0),1);videoEl.currentTime=fraction*videoEl.duration;progressFractionRef.current=fraction;applyProgressVisual(fraction);},[applyProgressVisual,PROGRESS_BAR_INSET_X]);// Pointer capture (not window-level add/removeEventListener) scopes the\n// whole drag to this element: once captured, it keeps receiving\n// pointermove/pointerup/pointercancel for that pointer even if it moves\n// outside the element's bounds, so there's no global listener that a\n// missed pointerup (unmount mid-drag, a canceled interaction) could\n// leave dangling - the browser releases capture on its own if the\n// element is removed from the DOM.\nconst handleProgressPointerDown=useCallback(event=>{event.stopPropagation();event.currentTarget.setPointerCapture(event.pointerId);seekToClientX(event.clientX);},[seekToClientX]);const handleProgressPointerMove=useCallback(event=>{if(event.currentTarget.hasPointerCapture(event.pointerId)){seekToClientX(event.clientX);}},[seekToClientX]);const handleProgressPointerEnd=useCallback(event=>{if(event.currentTarget.hasPointerCapture(event.pointerId)){event.currentTarget.releasePointerCapture(event.pointerId);}},[]);// The Framer canvas always previews the actual media, paused - the\n// Poster setting only affects real (non-static) playback. Also\n// requires an actual uploaded image - Poster: Yes with nothing\n// uploaded should show the video, not a stock placeholder.\nconst showPosterOverlay=showPoster&&Boolean(posterSrc)&&!posterHidden&&!isStatic;const vignetteBackground=useMemo(()=>{if(!vignette)return undefined;const[r,g,b,a]=vignetteRgba;const clampedIntensity=Math.min(Math.max(vignetteIntensity,0),100);const innerStop=Math.max(0,100-clampedIntensity);return`radial-gradient(ellipse at center, transparent ${innerStop}%, rgba(${Math.round(r*255)}, ${Math.round(g*255)}, ${Math.round(b*255)}, ${a}) 100%)`;// vignette itself is only checked for presence here (the actual\n// values used are the derived primitives below), so depending on\n// it directly would recompute every render, since Framer hands\n// back a fresh object reference each time.\n// eslint-disable-next-line react-hooks/exhaustive-deps\n},[Boolean(vignette),vignetteIntensity,vignetteRgba]);// clip-path (not mask-image) - a plain vector polygon, computed straight\n// from the curve math with no canvas/raster step. Percentage points\n// mean it stretches with the container on its own, same as the old\n// mask-size:100% 100% did. Being layout-adjacent clipping rather than a\n// separate paint-only compositing layer, it doesn't share mask-image's\n// \"browser computed the style but never repainted it\" failure mode.\nconst clipPathStyle={clipPath:clipPathValue,WebkitClipPath:clipPathValue};const shadow=normalizeShadowValue(shadowProp);// drop-shadow (not box-shadow) because it's computed from the actual\n// rendered alpha, not the element's rectangular box - so it follows the\n// curved silhouette instead of drawing a shadow around a plain\n// rectangle. The native Shadow control gives back a box-shadow string,\n// so it's converted rather than applied directly.\nconst shadowFilter=useMemo(()=>boxShadowToDropShadowFilter(shadow),[shadow]);// Clicking to toggle playback (and the pointer cursor advertising it)\n// only makes sense when Controls is Show - with it Hide, there's no\n// affordance at all, so a click shouldn't secretly do something.\nconst isInteractive=nativeControls&&!isStatic;// Not in this TS lib's CSSProperties typings - kept as a separately\n// typed object so spreading it doesn't trigger an excess-property\n// error the way a literal key would.\nconst containerQueryStyle={containerType:\"size\"};return /*#__PURE__*/_jsxs(\"div\",{ref:containerRef,className:`csv-root${autoHideControls?\" csv-auto-hide\":\"\"}`,onMouseEnter:()=>setAutoHideControls(false),style:{position:\"relative\",width:\"100%\",height:\"100%\",// Not hidden: a drop-shadow needs room outside the box to\n// render at all, and every visual layer is already\n// constrained to the curve by the mask or to 0-100% by its\n// own positioning, so nothing relies on clipping here.\noverflow:\"visible\",cursor:isInteractive?\"pointer\":\"default\",// Lets descendants use cqmin units - a length based on\n// whichever of width/height is smaller, so a single value\n// gives the same pixel gap on both axes regardless of the\n// component's aspect ratio (plain % can't: top/bottom\n// percentages resolve against height, left/right against\n// width, which only match on a square box).\n...containerQueryStyle,...style},onClick:isInteractive?togglePlayback:undefined,onKeyDown:isInteractive?event=>{if(event.key===\"Enter\"||event.key===\" \"){event.preventDefault();togglePlayback();}}:undefined,role:isInteractive?\"button\":undefined,tabIndex:isInteractive?0:undefined,\"aria-label\":isInteractive?isPlaying?\"Pause video\":\"Play video\":undefined,children:[/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",inset:0,filter:shadowFilter},children:/*#__PURE__*/_jsxs(\"div\",{style:{position:\"absolute\",inset:0,// border-radius alone won't clip anything without\n// overflow: hidden - safe to add here (unlike on\n// the root) since nothing above this wrapper needs\n// its overflow to bleed out.\nborderRadius:radius,overflow:\"hidden\",...clipPathStyle},children:[isThumbnailOrExport?// Thumbnail/export renders may never actually fetch\n// the video, unlike the interactive canvas - an\n// <video> left to its own devices there can render\n// as fully transparent (the bug behind the blank\n// dashboard preview). Show the uploaded poster, or\n// failing that a plain dark panel, instead.\nposterSrc?/*#__PURE__*/_jsx(\"img\",{src:posterSrc,srcSet:posterImage?.srcSet,alt:posterImage?.alt??\"\",style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\"}}):/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",inset:0,background:\"#000\"}}):/*#__PURE__*/_jsx(\"video\",{ref:videoRef,src:video,autoPlay:autoPlay&&!isStatic,loop:loop,muted:isMuted,playsInline:true,preload:\"auto\",style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\"}}),showPosterOverlay&&/*#__PURE__*/_jsx(\"img\",{src:posterSrc,srcSet:posterImage?.srcSet,alt:posterImage?.alt??\"\",style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit:\"cover\",pointerEvents:\"none\"}}),vignetteBackground&&/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",style:{position:\"absolute\",inset:0,background:vignetteBackground,pointerEvents:\"none\"}}),nativeControls&&/*#__PURE__*/_jsx(\"div\",{\"aria-hidden\":\"true\",className:\"csv-progress\",style:{position:\"absolute\",left:0,right:0,bottom:0,height:\"30%\",background:\"linear-gradient(to top, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0))\",pointerEvents:\"none\"}})]})}),nativeControls&&/*#__PURE__*/_jsx(\"button\",{type:\"button\",className:\"csv-hover-btn\",onClick:event=>{event.stopPropagation();togglePlayback();},\"aria-label\":isPlaying?\"Pause\":\"Play\",style:{position:\"absolute\",top:\"50%\",left:\"50%\",transform:\"translate(-50%, -50%)\",display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:14,borderRadius:999,background:\"rgba(0, 0, 0, 0.35)\",border:\"none\",backdropFilter:\"blur(8px)\",WebkitBackdropFilter:\"blur(8px)\",cursor:\"pointer\"},children:isPlaying?/*#__PURE__*/_jsx(PauseIcon,{}):/*#__PURE__*/_jsx(PlayIcon,{})}),nativeControls&&/*#__PURE__*/_jsx(\"svg\",{ref:progressSvgRef,viewBox:\"0 0 100 100\",preserveAspectRatio:\"none\",style:{position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",overflow:\"visible\",// The <svg> root is a replaced element and hit-tests\n// its whole box even where nothing is drawn - kept\n// permanently non-interactive so it never shadows\n// the play/pause button. Only the <g> below (a\n// plain container, not a replaced element) toggles\n// pointer-events, and only where it's actually\n// stroked.\npointerEvents:\"none\"},children:/*#__PURE__*/_jsxs(\"g\",{className:\"csv-progress\",children:[/*#__PURE__*/_jsx(\"path\",{d:progressBarPathD,fill:\"none\",stroke:\"transparent\",strokeWidth:6,onClick:event=>event.stopPropagation(),onPointerDown:handleProgressPointerDown,onPointerMove:handleProgressPointerMove,onPointerUp:handleProgressPointerEnd,onPointerCancel:handleProgressPointerEnd,style:{cursor:\"pointer\"}}),/*#__PURE__*/_jsx(\"path\",{d:progressBarPathD,fill:\"none\",stroke:\"rgba(255, 255, 255, 0.3)\",strokeWidth:.6,pointerEvents:\"none\"}),/*#__PURE__*/_jsx(\"path\",{ref:progressFillRef,d:progressBarPathD,fill:\"none\",stroke:\"#fff\",strokeWidth:.6,pointerEvents:\"none\",pathLength:100,style:{strokeDasharray:\"100 100\",strokeDashoffset:100}})]})}),nativeControls&&/*#__PURE__*/_jsx(\"button\",{type:\"button\",className:\"csv-hover-btn\",onClick:event=>{event.stopPropagation();toggleMute();},\"aria-label\":isMuted?\"Unmute\":\"Mute\",style:{position:\"absolute\",// cqmin (not %) so the gap is the same actual pixel\n// distance on both axes - plain top/right percentages\n// resolve against height and width respectively,\n// which only match on a square box. The value itself\n// is a baseline plus the curve's own corner\n// rounding (the larger of the two insets), so the\n// gap stays visually consistent as intensity\n// changes instead of drifting toward the\n// now-rounded corner.\ntop:`${4+cornerInset}cqmin`,right:`${4+cornerInset}cqmin`,display:\"flex\",alignItems:\"center\",justifyContent:\"center\",padding:10,borderRadius:999,background:\"rgba(0, 0, 0, 0.35)\",border:\"none\",backdropFilter:\"blur(8px)\",WebkitBackdropFilter:\"blur(8px)\",cursor:\"pointer\"},children:isMuted?/*#__PURE__*/_jsx(VolumeOffIcon,{}):/*#__PURE__*/_jsx(VolumeOnIcon,{})}),nativeControls&&/*#__PURE__*/_jsx(\"style\",{children:`\n                    .csv-hover-btn, .csv-progress {\n                        opacity: ${isStatic?1:0};\n                        pointer-events: none;\n                        transition: opacity 0.15s ease;\n                    }\n                    .csv-root:hover .csv-hover-btn, .csv-root:hover .csv-progress {\n                        opacity: 1;\n                        pointer-events: auto;\n                    }\n                    /* Scoped to touch/no-hover devices only - the stuck\n                    :hover-after-tap bug this works around doesn't exist on\n                    real pointer devices, where :hover already correctly\n                    tracks whether the mouse is actually over the player. */\n                    @media (hover: none) {\n                        .csv-root.csv-auto-hide .csv-hover-btn, .csv-root.csv-auto-hide .csv-progress {\n                            opacity: 0 !important;\n                            pointer-events: none !important;\n                        }\n                    }\n                `})]});}addPropertyControls(CinemaScreenVideo,{videoSource:{type:ControlType.Enum,title:\"Source\",options:[\"upload\",\"url\"],optionTitles:[\"Upload\",\"URL\"],defaultValue:\"upload\",displaySegmentedControl:true},video:{type:ControlType.File,title:\"Video\",allowedFileTypes:[\"mp4\",\"webm\",\"mov\"],hidden:props=>props.videoSource!==\"upload\"},videoUrl:{type:ControlType.String,title:\"URL\",placeholder:\"https://example.com/video.mp4\",hidden:props=>props.videoSource!==\"url\"},showPoster:{type:ControlType.Boolean,title:\"Poster\",defaultValue:true},posterImage:{type:ControlType.ResponsiveImage,title:\"Image\",hidden:props=>!props.showPoster},curveDirection:{type:ControlType.Enum,title:\"Curve\",options:[\"convex\",\"concave\"],optionTitles:[\"Convex\",\"Concave\"],defaultValue:\"concave\",displaySegmentedControl:true},horizontalIntensity:{type:ControlType.Number,title:\"Horizontal\",defaultValue:0,min:0,max:100,step:1},verticalIntensity:{type:ControlType.Number,title:\"Vertical\",defaultValue:45,min:0,max:100,step:1},vignette:{type:ControlType.Object,title:\"Vignette\",icon:\"effect\",optional:true,defaultValue:{intensity:30,color:\"rgba(0, 0, 0, 0.05)\"},controls:{intensity:{type:ControlType.Number,title:\"Amount\",defaultValue:30,min:0,max:100,step:1},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"rgba(0, 0, 0, 0.05)\"}}},shadow:{type:ControlType.BoxShadow,title:\"Shadow\",defaultValue:\"0px 4px 14px 0px rgba(0, 0, 0, 0.18)\"},radius:{type:ControlType.BorderRadius,title:\"Radius\",defaultValue:\"0px\"},autoPlay:{type:ControlType.Boolean,title:\"Playing\",defaultValue:true},loop:{type:ControlType.Boolean,title:\"Loop\",defaultValue:true},nativeControls:{type:ControlType.Boolean,title:\"Controls\",enabledTitle:\"Show\",disabledTitle:\"Hide\",defaultValue:true},muted:{type:ControlType.Boolean,title:\"Muted\",defaultValue:true}});CinemaScreenVideo.displayName=\"Cinema Screen Video\";\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"CinemaScreenVideo\",\"slots\":[],\"annotations\":{\"framerIntrinsicHeight\":\"338\",\"framerIntrinsicWidth\":\"600\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerSupportedLayoutHeight\":\"any-prefer-fixed\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./CinemaScreenVideo.map","// Generated by Framer (a520bf1)\nexport default function metadata(params,activeLocale){return{robots:\"max-image-preview:large\",socialImage:\"https://framerusercontent.com/assets/OAwGZM7X2QAfJbksxocsUEcGqmg.jpg\",title:\"Cinema Screen Video\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","// Generated by Framer (0116799)\nimport siteMetadata from\"#framer/local/siteMetadata/siteMetadata/siteMetadata.js\";export default function metadata(params,activeLocale){return{breakpoints:[{hash:\"di6ive\",mediaQuery:\"(min-width: 1200px)\"},{hash:\"p4lyht\",mediaQuery:\"(min-width: 810px) and (max-width: 1199.98px)\"},{hash:\"zwo88j\",mediaQuery:\"(max-width: 809.98px)\"}],description:siteMetadata(params,activeLocale).description,elements:{},robots:\"max-image-preview:large\",serializationId:\"framer-fHhaZ\",title:siteMetadata(params,activeLocale).title||\"Home\",viewport:\"width=device-width\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}","// Generated by Framer (e1541bb)\nimport siteMetadata from\"#framer/local/siteMetadata/siteMetadata/siteMetadata.js\";export default function metadata(params,activeLocale){return{breakpoints:[{hash:\"fxx22j\",mediaQuery:\"(min-width: 1200px)\"},{hash:\"1ryiduf\",mediaQuery:\"(min-width: 810px) and (max-width: 1199.98px)\"},{hash:\"zarvgk\",mediaQuery:\"(max-width: 809.98px)\"}],description:siteMetadata(params,activeLocale).description,elements:{},robots:\"max-image-preview:large\",serializationId:\"framer-2KU8l\",title:siteMetadata(params,activeLocale).title||\"Preview\",viewport:\"width=device-width\"};}export const metadataVersion=1;\nexport const __FramerMetadata__ = {\"exports\":{\"metadataVersion\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"default\":{\"type\":\"function\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],"mappings":"qOAA+M,SAAS,EAAgB,EAAE,EAAE,EAAE,CAAC,IAAI,EAAG,EAAmH,OAA9G,EAAG,IAAE,GAAI,GAAK,EAAG,GAAE,IAAS,EAAG,EAAE,EAAS,GAAG,EAAE,GAAG,EAAE,EAAM,EAAG,EAAE,EAAS,EAAK,EAAG,EAAE,EAAS,GAAG,EAAE,IAAI,EAAE,EAAE,GAAI,EAAS,CAAE,CAAC,SAAS,GAAS,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAM,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAQ,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAgB,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAgB,EAAE,EAAE,CAAC,EAAE,EAAgB,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAE,CAKniB,SAAS,GAAiB,EAAM,CAAC,IAAM,EAAI,EAAM,MAAM,uBAAuB,EAAE,GAAG,EAAI,CAAC,IAAI,EAAM,EAAI,IAAM,EAAM,SAAS,GAAG,EAAM,SAAS,KAAG,EAAM,EAAM,MAAM,EAAE,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,IAAM,EAAE,EAAM,QAAQ,EAAE,SAAS,EAAM,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAM,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,SAAS,EAAM,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,SAAS,EAAM,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,CAAE,CAAC,IAAM,EAAI,EAAM,MAAM,yEAAyE,EAAE,GAAG,EAAI,CAAC,GAAK,CAAC,EAAE,EAAE,GAAG,GAAS,WAAW,EAAI,EAAE,EAAE,IAAI,WAAW,EAAI,EAAE,EAAE,IAAI,WAAW,EAAI,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAI,KAAK,IAAA,GAA6B,EAAnB,WAAW,EAAI,EAAE,CAAG,CAAE,CAAC,IAAM,EAAI,EAAM,MAAM,uEAAuE,EAAgI,OAA3H,EAAW,CAAC,WAAW,EAAI,EAAE,EAAE,IAAI,WAAW,EAAI,EAAE,EAAE,IAAI,WAAW,EAAI,EAAE,EAAE,IAAI,EAAI,KAAK,IAAA,GAA6B,EAAnB,WAAW,EAAI,EAAE,CAAG,EAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAE,CAGl1B,SAAS,EAAc,EAAM,EAAU,CAAC,IAAM,EAAM,CAAC,EAAM,EAAQ,GAAO,EAAM,EAAE,IAAI,IAAM,KAAQ,EAAU,IAAO,KAAI,IAAW,IAAO,KAAI,IAAW,IAAO,GAAW,IAAQ,GAAG,EAAM,KAAK,CAAO,EAAE,EAAQ,IAAS,GAAS,EAA2B,OAApB,EAAM,KAAK,CAAO,EAAS,CAAM,CAG7Q,SAAS,EAAsB,EAAQ,CAAC,IAAM,EAAO,CAAC,EAAM,EAAQ,GAAO,EAAM,EAAE,IAAI,IAAM,KAAQ,EAAY,IAAO,KAAI,IAAW,IAAO,KAAI,IAAW,IAAO,KAAK,IAAQ,GAAM,GAAQ,EAAO,KAAK,CAAO,EAAE,EAAQ,IAAS,GAAS,EAAuC,OAA7B,GAAQ,EAAO,KAAK,CAAO,EAAS,CAAO,CAInS,SAAS,GAAqB,EAAM,CAAiD,OAA7C,MAAM,QAAQ,CAAK,EAAS,EAAM,KAAK,IAAI,EAAS,GAAO,sCAAuC,CAO1I,SAAS,GAA4B,EAAe,CAAC,GAAG,CAAC,GAAgB,EAAe,KAAK,CAAC,CAAC,YAAY,IAAI,OAAQ,OAAkB,IAAM,EAAc,iCAAuC,EAAY,EAAc,EAAe,GAAG,CAAC,CAAC,IAAI,GAAS,EAAQ,KAAK,CAAC,CAAC,CAAC,OAAO,GAAS,EAAQ,OAAO,CAAC,CAAC,CAAC,IAAI,GAAS,CAAC,IAAM,EAAO,EAAsB,CAAO,CAAC,CAAC,OAAO,GAAO,EAAM,YAAY,IAAI,OAAO,EAAE,GAAG,EAAO,SAAS,EAAE,OAAO,KAAK,IAAM,EAAQ,EAAO,OAAO,GAAO,EAAc,KAAK,CAAK,CAAC,EAAQ,EAAM,EAAO,KAAK,GAAO,CAAC,EAAc,KAAK,CAAK,CAAC,GAAG,mBAAwB,CAAC,EAAE,MAAM,EAAE,MAAM,EAAK,OAAO,EAAQ,MAAM,eAAe,EAAE,GAAG,EAAE,GAAG,EAAK,GAAG,EAAM,EAAG,CAAC,CAAC,CAAC,OAAO,GAAO,IAAQ,IAAI,EAAE,OAAO,EAAY,OAAO,EAAE,EAAY,KAAK,GAAG,EAAE,IAAA,EAAU,CAAC,SAAS,EAAW,EAAE,CAAC,IAAM,EAAE,EAAE,EAAE,EAAE,MAAO,GAAE,EAAE,CAAE,CAU9yB,SAAS,EAAyB,EAAc,EAAc,EAAa,EAAa,CAAC,IAAI,EAAG,EAAkB,EAAG,EAAc,IAAI,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,IAAM,EAAK,KAAK,IAAI,CAAE,EAAE,EAAmB,EAAK,KAAK,IAAI,CAAE,EAAE,EAAa,EAAG,GAAe,EAAE,EAAK,GAAM,EAAG,GAAe,EAAE,EAAK,EAAM,CAAC,MAAM,CAAC,GAAG,EAAG,GAAG,IAAI,IAAI,GAAG,EAAG,GAAG,IAAI,GAAG,CAAE,CAM3U,SAAS,GAAkB,EAAe,EAAoB,EAAkB,EAAc,GAAG,CAAC,IAAM,EAAkB,KAAK,IAAI,KAAK,IAAI,EAAoB,CAAC,EAAE,GAAG,EAAQ,EAAgB,KAAK,IAAI,KAAK,IAAI,EAAkB,CAAC,EAAE,GAAG,EAAQ,EAAI,CAAC,EAAQ,EAAM,CAAC,EAAQ,EAAO,CAAC,EAAQ,EAAK,CAAC,EAAE,GAAG,IAAiB,SAAS,CAAC,IAAM,EAAa,EAA0B,KAAK,KAAK,EAAkB,GAAG,EAAQ,EAAa,EAA0B,EAAyB,KAAK,KAAK,EAAgB,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAc,IAAI,CAAyB,IAAM,EAAtB,EAAE,EAA0B,EAAE,EAAE,EAAI,KAAK,EAAyB,EAAI,GAAG,EAAa,CAAY,CAAC,EAAE,EAAM,KAAK,EAAyB,EAAE,EAAI,EAAa,CAAY,CAAC,EAAE,EAAO,KAAK,EAAyB,EAAI,EAAE,EAAa,CAAY,CAAC,EAAE,EAAK,KAAK,EAAyB,GAAG,EAAI,EAAa,CAAY,CAAC,CAAE,CAAC,KAAK,CAAC,IAAM,EAAyC,EAAgB,IAA5C,EAAuD,EAAa,EAA2B,GAAuB,EAAkB,KAAK,IAAI,IAAI,EAAE,EAAE,GAAG,EAAc,IAAI,CAAC,IAAM,EAAE,EAAE,EAAc,EAAI,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,EAAa,EAAW,CAAC,EAAE,GAAG,CAAC,EAAE,EAAO,KAAK,CAAC,EAAE,EAAE,IAAI,GAAG,EAAE,EAAa,EAAW,CAAC,GAAG,GAAG,CAAC,EAAE,EAAM,KAAK,CAAC,GAAG,EAAE,EAAa,EAAW,CAAC,GAAG,IAAI,EAAE,EAAE,GAAG,CAAC,EAAE,EAAK,KAAK,CAAC,EAAE,EAAa,EAAW,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,CAAC,CAAE,CAAC,CAAC,MAAM,CAAC,MAAI,QAAM,SAAO,MAAI,CAAE,CAI1zC,SAAS,GAAqB,EAAM,CAAsM,MAAM,WAApF,CAAzG,GAAG,EAAM,IAAI,GAAG,EAAM,MAAM,GAAG,CAAC,GAAG,EAAM,MAAM,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,EAAM,IAAI,CAAC,CAAC,QAAQ,CAAwB,CAAC,CAAC,IAAI,GAAO,GAAG,EAAM,EAAE,QAAQ,CAAC,EAAE,IAAI,EAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAA+B,EAAE,EAAG,CAGxQ,SAAS,EAA2B,EAAY,CAA8C,OAAO,EAArC,GAAG,EAAE,EAAY,IAAgC,EAAE,GAAI,CAMvH,SAAS,GAAuB,EAAe,EAAoB,CAEwH,OAAxL,IAAiB,UAAiB,EAA6J,EAAlE,EAA0B,KAAK,KAAhG,KAAK,IAAI,KAAK,IAAI,EAAoB,CAAC,EAAE,GAA4E,EAAE,GAAG,CAAgD,CAAE,CAI3O,SAAS,GAAsB,EAAe,EAAkB,CAA+M,OAA3M,IAAiB,UAAiB,EAAgL,EAAzF,EAA0B,EAAyB,KAAK,KAAvH,KAAK,IAAI,KAAK,IAAI,EAAkB,CAAC,EAAE,GAAmG,EAAE,GAAG,CAAgD,CAAE,CAK/T,SAAS,IAAU,CAAC,OAAoB,EAAK,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,YAAY,KAAK,OAAO,cAAc,OAAO,SAAsB,EAAK,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,IAAW,CAAC,OAAoB,EAAM,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,YAAY,KAAK,OAAO,cAAc,OAAO,SAAS,CAAc,EAAK,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,KAAK,GAAG,GAAG,CAAC,EAAe,EAAK,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,MAAM,IAAI,OAAO,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,IAAc,CAAC,OAAoB,EAAM,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,YAAY,KAAK,OAAO,cAAc,OAAO,SAAS,CAAc,EAAK,OAAO,CAAC,EAAE,uBAAuB,CAAC,EAAe,EAAK,OAAO,CAAC,EAAE,qEAAqE,CAAC,EAAe,EAAK,OAAO,CAAC,EAAE,sGAAsG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,SAAS,IAAe,CAAC,OAAoB,EAAM,MAAM,CAAC,MAAM,GAAG,OAAO,GAAG,QAAQ,YAAY,KAAK,OAAO,cAAc,OAAO,SAAS,CAAc,EAAK,OAAO,CAAC,EAAE,wBAAwB,KAAK,MAAM,CAAC,EAAe,EAAK,OAAO,CAAC,EAAE,0BAA0B,OAAO,OAAO,YAAY,EAAE,cAAc,OAAO,CAAC,CAAC,CAAC,CAAC,CAAE,CAkBnrC,SAAwB,EAAkB,EAAM,CAAC,GAAK,CAAC,cAAY,SAAS,MAAM,EAAU,WAAS,iBAAe,UAAU,sBAAoB,EAAE,oBAAkB,GAAG,WAAS,OAAO,GAAW,SAAO,MAAM,WAAS,GAAK,OAAK,GAAK,QAAM,GAAK,iBAAe,GAAK,aAAW,GAAK,cAAY,SAAO,EAIzM,GAAO,IAAc,MAAM,EAAS,IAAY,uEAE/I,EAAU,GAAa,KAAK,GAAS,EAAS,GAAoB,EAKlE,EAAa,EAAa,QAAQ,EAAQ,EAAoB,IAAe,EAAa,WAAW,IAAe,EAAa,OAAa,EAAc,GAAU,OAAO,sBAA4B,EAAkB,GAAU,WAAW,GAAS,EAAaA,MAAY,GAAiB,CAAa,EAAE,CAAC,CAAa,CAAC,EAIjU,EAAWA,MAAY,GAAkB,EAAe,EAAoB,CAAiB,EAAE,CAAC,EAAe,EAAoB,CAAiB,CAAC,EAAQ,EAAcA,MAAY,GAAqB,CAAU,EAAE,CAAC,CAAU,CAAC,EAIpO,EAAgBA,MAAY,GAAuB,EAAe,CAAmB,EAAE,CAAC,EAAe,CAAmB,CAAC,EAAQ,EAAeA,MAAY,GAAsB,EAAe,CAAiB,EAAE,CAAC,EAAe,CAAiB,CAAC,EAGxP,EAAY,KAAK,IAAI,EAAgB,CAAc,EAGpB,EAAqB,EAAE,EAAsB,EAAkBA,MAAY,EAAW,OAAO,IAAI,IAAQ,CAAC,EAAE,EAAqB,EAAM,EAAE,KAAK,IAAI,EAAE,GAAsB,EAAE,KAAK,IAAI,EAAE,EAAM,EAAE,EAAqB,CAAC,EAAE,EAAE,CAAC,EAAW,CAAoB,CAAC,EAAQ,EAAiBA,MAAY,EAAkB,KAAK,EAAM,IAAQ,GAAG,IAAQ,EAAE,IAAI,IAAI,GAAG,EAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAM,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAiB,CAAC,EAAQ,GAAaC,EAAO,IAAI,EAAQ,EAASA,EAAO,IAAI,EAAQ,GAAeA,EAAO,IAAI,EAAQ,GAAgBA,EAAO,IAAI,EAAQ,EAAoBA,EAAO,CAAC,EAAO,CAAC,EAAU,GAAcC,EAAS,CAAQ,EAAO,CAAC,EAAQ,IAAYA,EAAS,CAAK,EAAO,CAAC,GAAa,IAAiBA,EAAS,EAAK,EAKzvB,CAAC,GAAiB,GAAqBA,EAAS,EAAK,EAAQ,EAAmBD,EAAO,IAAA,EAAS,EAIrG,MAAc,CAAC,EAAa,CAAQ,CAAE,EAAE,CAAC,CAAQ,CAAC,EAKlD,MAAc,CAAC,GAAW,CAAK,CAAE,EAAE,CAAC,CAAK,CAAC,EAQ1C,MAAc,CAAC,IAAM,EAAQ,EAAS,QAAW,IAAQ,EAAQ,MAAM,EAAQ,EAAE,CAAC,CAAO,CAAC,EAU1F,MAAc,CAAC,IAAM,EAAQ,EAAS,QAAQ,GAAG,CAAC,EAAQ,OAAO,IAAM,MAAe,GAAgB,EAAI,EAA6H,OAAvH,EAAQ,QAAO,EAAW,EAAE,EAAQ,iBAAiB,OAAO,CAAU,EAAE,EAAQ,iBAAiB,UAAU,CAAU,MAAY,CAAC,EAAQ,oBAAoB,OAAO,CAAU,EAAE,EAAQ,oBAAoB,UAAU,CAAU,CAAE,CAAE,EAAE,CAAC,CAAC,EAAE,IAAM,EAAmBE,MAAgB,CAAI,EAAmB,UAAU,IAAA,KAAW,aAAa,EAAmB,OAAO,EAAE,EAAmB,QAAQ,IAAA,GAAW,EAAE,CAAC,CAAC,EASngB,MAAc,CAAC,GAAG,EAAS,OAAO,IAAM,EAAQ,EAAS,QAAQ,GAAG,CAAC,EAAQ,OAAO,IAAM,MAAe,CAAC,EAAmB,EAAE,EAAmB,QAAQ,EAAO,eAAe,CAAC,EAAoB,EAAI,CAAE,EAAE,GAAG,CAAE,EAAQ,MAAgB,CAAC,EAAmB,EAAE,EAAoB,EAAK,CAAE,EAA0I,OAAxI,EAAQ,iBAAiB,OAAO,CAAU,EAAE,EAAQ,iBAAiB,QAAQ,CAAW,EAAE,EAAQ,iBAAiB,QAAQ,CAAW,MAAY,CAAC,EAAmB,EAAE,EAAQ,oBAAoB,OAAO,CAAU,EAAE,EAAQ,oBAAoB,QAAQ,CAAW,EAAE,EAAQ,oBAAoB,QAAQ,CAAW,CAAE,CAAE,EAAE,CAAC,CAAkB,CAAC,EAO9mB,MAAc,CAAC,IAAM,EAAQ,EAAS,QAAQ,GAAG,CAAC,EAAQ,OAAO,IAAM,MAAkB,EAAa,EAAI,EAAQ,MAAe,EAAa,EAAK,EAA8I,OAA5I,EAAQ,iBAAiB,UAAU,CAAa,EAAE,EAAQ,iBAAiB,QAAQ,CAAU,EAAE,EAAQ,iBAAiB,QAAQ,CAAU,MAAY,CAAC,EAAQ,oBAAoB,UAAU,CAAa,EAAE,EAAQ,oBAAoB,QAAQ,CAAU,EAAE,EAAQ,oBAAoB,QAAQ,CAAU,CAAE,CAAE,EAAE,CAAC,CAAC,EAMvc,IAAM,EAAeA,MAAgB,CAAC,IAAM,EAAQ,EAAS,QAAY,IAAkB,EAAQ,OAInG,EAAQ,KAAK,CAAC,EAAE,UAAU,CAAC,CAAC,EAAQ,EAAQ,MAAM,EAAG,EAAE,CAAC,CAAC,EAAQ,GAAWA,MAAgB,CAAC,IAAM,EAAQ,EAAS,QAAQ,GAAG,CAAC,EAAQ,OAAO,IAAM,EAAK,CAAC,EAAQ,MAAM,EAAQ,MAAM,EAAK,GAAW,CAAI,CAAE,EAAE,CAAC,CAAC,EAM3M,EAAoBA,EAAY,GAAU,CAAC,IAAM,EAAS,GAAgB,QAAW,IAAU,EAAS,MAAM,iBAAiB,OAAO,KAAK,EAAE,EAAS,EAAG,EAAE,CAAC,CAAC,EAGnK,MAAc,CAAC,EAAoB,EAAoB,OAAO,CAAE,EAAE,CAAC,EAAiB,CAAmB,CAAC,EAOxG,MAAc,CAAC,GAAG,EAAS,OAAO,IAAM,EAAQ,EAAS,QAAQ,GAAG,CAAC,EAAQ,OAAO,IAAI,EAAM,EAAQ,MAAmB,CAAC,IAAM,EAAS,EAAQ,SAAS,EAAQ,YAAY,EAAQ,SAAS,EAAE,EAAoB,QAAQ,EAAS,EAAoB,CAAQ,CAAE,EAAQ,MAAS,CAAC,EAAe,EAAE,EAAM,sBAAsB,CAAI,CAAE,EAAQ,MAAe,CAAC,qBAAqB,CAAK,EAAE,EAAM,sBAAsB,CAAI,CAAE,EAAQ,MAAgB,CAAC,qBAAqB,CAAK,EAAE,EAAe,CAAE,EAAsR,OAApR,EAAQ,iBAAiB,OAAO,CAAU,EAAE,EAAQ,iBAAiB,QAAQ,CAAW,EAAE,EAAQ,iBAAiB,QAAQ,CAAW,EAAE,EAAQ,iBAAiB,iBAAiB,CAAc,EAAE,EAAQ,iBAAiB,SAAS,CAAc,EAAM,EAAQ,QAAO,EAAW,MAAY,CAAC,qBAAqB,CAAK,EAAE,EAAQ,oBAAoB,OAAO,CAAU,EAAE,EAAQ,oBAAoB,QAAQ,CAAW,EAAE,EAAQ,oBAAoB,QAAQ,CAAW,EAAE,EAAQ,oBAAoB,iBAAiB,CAAc,EAAE,EAAQ,oBAAoB,SAAS,CAAc,CAAE,CAAE,EAAE,CAAC,CAAmB,CAAC,EAAE,IAAM,EAAcA,EAAY,GAAS,CAAC,IAAM,EAAI,GAAe,QAAc,EAAQ,EAAS,QAAQ,GAAG,CAAC,GAAK,CAAC,GAAS,CAAC,EAAQ,SAAS,OAAO,IAAM,EAAK,EAAI,sBAAsB,EAAQ,GAAc,EAAQ,EAAK,MAAM,EAAK,MAAM,IAAU,EAAS,KAAK,IAAI,KAAK,KAAK,EAAa,IAAuB,IAAI,EAAE,GAAsB,CAAC,EAAE,CAAC,EAAE,EAAQ,YAAY,EAAS,EAAQ,SAAS,EAAoB,QAAQ,EAAS,EAAoB,CAAQ,CAAE,EAAE,CAAC,EAAoB,CAAoB,CAAC,EAOljD,GAA0BA,EAAY,GAAO,CAAC,EAAM,gBAAgB,EAAE,EAAM,cAAc,kBAAkB,EAAM,SAAS,EAAE,EAAc,EAAM,OAAO,CAAE,EAAE,CAAC,CAAa,CAAC,EAAQ,GAA0BA,EAAY,GAAO,CAAI,EAAM,cAAc,kBAAkB,EAAM,SAAS,GAAG,EAAc,EAAM,OAAO,CAAG,EAAE,CAAC,CAAa,CAAC,EAAQ,GAAyBA,EAAY,GAAO,CAAI,EAAM,cAAc,kBAAkB,EAAM,SAAS,GAAG,EAAM,cAAc,sBAAsB,EAAM,SAAS,CAAG,EAAE,CAAC,CAAC,EAI3f,GAAkB,GAAY,EAAQ,GAAY,CAAC,IAAc,CAAC,EAAe,GAAmBH,MAAY,CAAC,GAAG,CAAC,EAAS,OAAiB,GAAK,CAAC,EAAE,EAAE,EAAE,GAAG,EAAiI,MAAM,kDAAvC,KAAK,IAAI,EAAE,IAAvE,KAAK,IAAI,KAAK,IAAI,EAAkB,CAAC,EAAE,GAAmD,CAAmE,EAAE,UAAU,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAKrb,EAAE,CAAC,EAAQ,EAAU,EAAkB,CAAY,CAAC,EAM9C,GAAc,CAAC,SAAS,EAAc,eAAe,CAAa,EAAQ,EAAO,GAAqB,EAAU,EAKhH,GAAaA,MAAY,GAA4B,CAAM,EAAE,CAAC,CAAM,CAAC,EAGrE,EAAc,GAAgB,CAAC,EAGY,OAAoB,EAAM,MAAM,CAAC,IAAI,GAAa,UAAU,WAAW,GAAiB,iBAAiB,KAAK,iBAAiB,EAAoB,EAAK,EAAE,MAAM,CAAC,SAAS,WAAW,MAAM,OAAO,OAAO,OAI1P,SAAS,UAAU,OAAO,EAAc,UAAU,UAJvB,cAAc,OAUlB,GAAG,CAAK,EAAE,QAAQ,EAAc,EAAe,IAAA,GAAU,UAAU,EAAc,GAAO,EAAI,EAAM,MAAM,SAAS,EAAM,MAAM,OAAK,EAAM,eAAe,EAAE,EAAe,EAAG,EAAE,IAAA,GAAU,KAAK,EAAc,SAAS,IAAA,GAAU,SAAS,EAAc,EAAE,IAAA,GAAU,aAAa,EAAc,EAAU,cAAc,aAAa,IAAA,GAAU,SAAS,CAAc,EAAK,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,OAAO,EAAY,EAAE,SAAsB,EAAM,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,MAAM,EAIhgB,aAAa,EAAO,SAAS,SAAS,GAAG,EAAa,EAAE,SAAS,CAAC,EAMlE,EAAuB,EAAK,MAAM,CAAC,IAAI,EAAU,OAAO,GAAa,OAAO,IAAI,GAAa,KAAK,GAAG,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,UAAU,OAAO,CAAC,CAAC,EAAe,EAAK,MAAM,CAAC,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,WAAW,MAAM,CAAC,CAAC,EAAe,EAAK,QAAQ,CAAC,IAAI,EAAS,IAAI,EAAM,SAAS,GAAU,CAAC,EAAc,OAAK,MAAM,EAAQ,YAAY,GAAK,QAAQ,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,UAAU,OAAO,CAAC,CAAC,EAAE,IAAgC,EAAK,MAAM,CAAC,IAAI,EAAU,OAAO,GAAa,OAAO,IAAI,GAAa,KAAK,GAAG,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,UAAU,QAAQ,cAAc,MAAM,CAAC,CAAC,EAAE,IAAiC,EAAK,MAAM,CAAC,cAAc,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,WAAW,GAAmB,cAAc,MAAM,CAAC,CAAC,EAAE,GAA6B,EAAK,MAAM,CAAC,cAAc,OAAO,UAAU,eAAe,MAAM,CAAC,SAAS,WAAW,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,MAAM,WAAW,iEAAiE,cAAc,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAA6B,EAAK,SAAS,CAAC,KAAK,SAAS,UAAU,gBAAgB,QAAQ,GAAO,CAAC,EAAM,gBAAgB,EAAE,EAAe,CAAE,EAAE,aAAa,EAAU,QAAQ,OAAO,MAAM,CAAC,SAAS,WAAW,IAAI,MAAM,KAAK,MAAM,UAAU,wBAAwB,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,QAAQ,GAAG,aAAa,IAAI,WAAW,sBAAsB,OAAO,OAAO,eAAe,YAAY,qBAAqB,YAAY,OAAO,SAAS,EAAE,SAAgC,EAAvB,EAA4B,GAAgC,GAAtB,CAAC,CAAgC,CAAC,CAAC,EAAE,GAA6B,EAAK,MAAM,CAAC,IAAI,GAAe,QAAQ,cAAc,oBAAoB,OAAO,MAAM,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,SAAS,UAO50D,cAAc,MAAM,EAAE,SAAsB,EAAM,IAAI,CAAC,UAAU,eAAe,SAAS,CAAc,EAAK,OAAO,CAAC,EAAE,EAAiB,KAAK,OAAO,OAAO,cAAc,YAAY,EAAE,QAAQ,GAAO,EAAM,gBAAgB,EAAE,cAAc,GAA0B,cAAc,GAA0B,YAAY,GAAyB,gBAAgB,GAAyB,MAAM,CAAC,OAAO,SAAS,CAAC,CAAC,EAAe,EAAK,OAAO,CAAC,EAAE,EAAiB,KAAK,OAAO,OAAO,2BAA2B,YAAY,GAAG,cAAc,MAAM,CAAC,EAAe,EAAK,OAAO,CAAC,IAAI,GAAgB,EAAE,EAAiB,KAAK,OAAO,OAAO,OAAO,YAAY,GAAG,cAAc,OAAO,WAAW,IAAI,MAAM,CAAC,gBAAgB,UAAU,iBAAiB,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAA6B,EAAK,SAAS,CAAC,KAAK,SAAS,UAAU,gBAAgB,QAAQ,GAAO,CAAC,EAAM,gBAAgB,EAAE,GAAW,CAAE,EAAE,aAAa,EAAQ,SAAS,OAAO,MAAM,CAAC,SAAS,WASn6B,IAAI,GAAG,EAAE,EAAY,OAAO,MAAM,GAAG,EAAE,EAAY,OAAO,QAAQ,OAAO,WAAW,SAAS,eAAe,SAAS,QAAQ,GAAG,aAAa,IAAI,WAAW,sBAAsB,OAAO,OAAO,eAAe,YAAY,qBAAqB,YAAY,OAAO,SAAS,EAAE,SAA8B,EAArB,EAA0B,GAAoC,GAAtB,CAAC,CAAoC,CAAC,CAAC,EAAE,GAA6B,EAAK,QAAQ,CAAC,SAAS;;mCAEzX,KAAa;;;;;;;;;;;;;;;;;;iBAkB/B,CAAC,CAAC,CAAC,CAAC,CAAE,6BA5QiC,IAAiE,IAAqF,EAyBxM,EAA0B,IAAU,EAAyB,GAAS,EAA2B,IAAU,EAAsB,GAmP/G,EAAoB,EAAkB,CAAC,YAAY,CAAC,KAAK,EAAY,KAAK,MAAM,SAAS,QAAQ,CAAC,SAAS,KAAK,EAAE,aAAa,CAAC,SAAS,KAAK,EAAE,aAAa,SAAS,wBAAwB,EAAI,EAAE,MAAM,CAAC,KAAK,EAAY,KAAK,MAAM,QAAQ,iBAAiB,CAAC,MAAM,OAAO,KAAK,EAAE,OAAO,GAAO,EAAM,cAAc,QAAQ,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,MAAM,YAAY,gCAAgC,OAAO,GAAO,EAAM,cAAc,KAAK,EAAE,WAAW,CAAC,KAAK,EAAY,QAAQ,MAAM,SAAS,aAAa,EAAI,EAAE,YAAY,CAAC,KAAK,EAAY,gBAAgB,MAAM,QAAQ,OAAO,GAAO,CAAC,EAAM,UAAU,EAAE,eAAe,CAAC,KAAK,EAAY,KAAK,MAAM,QAAQ,QAAQ,CAAC,SAAS,SAAS,EAAE,aAAa,CAAC,SAAS,SAAS,EAAE,aAAa,UAAU,wBAAwB,EAAI,EAAE,oBAAoB,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE,kBAAkB,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,KAAK,SAAS,SAAS,GAAK,aAAa,CAAC,UAAU,GAAG,MAAM,qBAAqB,EAAE,SAAS,CAAC,UAAU,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,EAAE,MAAM,CAAC,KAAK,EAAY,MAAM,MAAM,QAAQ,aAAa,qBAAqB,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,EAAY,UAAU,MAAM,SAAS,aAAa,sCAAsC,EAAE,OAAO,CAAC,KAAK,EAAY,aAAa,MAAM,SAAS,aAAa,KAAK,EAAE,SAAS,CAAC,KAAK,EAAY,QAAQ,MAAM,UAAU,aAAa,EAAI,EAAE,KAAK,CAAC,KAAK,EAAY,QAAQ,MAAM,OAAO,aAAa,EAAI,EAAE,eAAe,CAAC,KAAK,EAAY,QAAQ,MAAM,WAAW,aAAa,OAAO,cAAc,OAAO,aAAa,EAAI,EAAE,MAAM,CAAC,KAAK,EAAY,QAAQ,MAAM,QAAQ,aAAa,EAAI,CAAC,CAAC,EAAE,EAAkB,YAAY,yBC3QtzD,SAAwBI,EAAS,EAAO,EAAa,CAAC,MAAM,CAAC,OAAO,0BAA0B,YAAY,uEAAuE,MAAM,qBAAqB,CAAE,mBCA5H,SAAwBC,EAAS,EAAO,EAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,SAAS,WAAW,qBAAqB,EAAE,CAAC,KAAK,SAAS,WAAW,+CAA+C,EAAE,CAAC,KAAK,SAAS,WAAW,uBAAuB,CAAC,EAAE,YAAYC,EAAa,EAAO,CAAY,CAAC,CAAC,YAAY,SAAS,CAAC,EAAE,OAAO,0BAA0B,gBAAgB,eAAe,MAAMA,EAAa,EAAO,CAAY,CAAC,CAAC,OAAO,OAAO,SAAS,oBAAoB,CAAE,qBAAtd,EAAoeC,EAAgB,EACxjBC,EAAqB,CAAC,QAAU,CAAC,QAAU,CAAC,KAAO,WAAW,YAAc,CAAC,sBAAwB,GAAG,CAAC,EAAE,gBAAkB,CAAC,KAAO,WAAW,YAAc,CAAC,sBAAwB,GAAG,CAAC,EAAE,mBAAqB,CAAC,KAAO,UAAU,CAAC,CAAC,KCDjK,SAAwB,EAAS,EAAO,EAAa,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,KAAK,SAAS,WAAW,qBAAqB,EAAE,CAAC,KAAK,UAAU,WAAW,+CAA+C,EAAE,CAAC,KAAK,SAAS,WAAW,uBAAuB,CAAC,EAAE,YAAYC,EAAa,EAAO,CAAY,CAAC,CAAC,YAAY,SAAS,CAAC,EAAE,OAAO,0BAA0B,gBAAgB,eAAe,MAAMA,EAAa,EAAO,CAAY,CAAC,CAAC,OAAO,UAAU,SAAS,oBAAoB,CAAE,qBAA1d,EAAwe,EAAgB,EAC5jB,EAAqB,CAAC,QAAU,CAAC,gBAAkB,CAAC,KAAO,WAAW,YAAc,CAAC,sBAAwB,GAAG,CAAC,EAAE,QAAU,CAAC,KAAO,WAAW,YAAc,CAAC,sBAAwB,GAAG,CAAC,EAAE,mBAAqB,CAAC,KAAO,UAAU,CAAC,CAAC"}