{"version":3,"file":"TabController.DaTD_3bX.mjs","names":["useState","p","React.useMemo","useState","useRef"],"sources":["https:/framerusercontent.com/modules/wiX07jCo5ywRdmsMoRWA/CxDrzgdQNem0tFfttQIs/HoverSwapIcon.js","https:/framerusercontent.com/modules/cNEPJLfxMMOvLzKShZCE/aRwWirMCVgbpA4OC2bJW/TabController.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType}from\"framer\";import{motion}from\"framer-motion\";import{useState}from\"react\";function srcOf(v){if(!v)return undefined;if(typeof v===\"string\")return v;return v.src||v.srcSet||undefined;}/**\n * Swaps a black & white icon for its colour version on hover,\n * with a springy scale-up.\n *\n * @framerSupportedLayoutWidth any\n * @framerSupportedLayoutHeight any\n * @framerIntrinsicWidth 161\n * @framerIntrinsicHeight 161\n */export default function HoverSwapIcon(props){const{bwImage,colorImage,bwUrl,colorUrl,link,openInNewTab=true,hoverScale=1.1,stiffness=400,damping=14,mass=.6,fadeDuration=.18,objectFit=\"contain\"}=props;const[hovered,setHovered]=useState(false);const bwSrc=srcOf(bwImage)||bwUrl;const colorSrc=srcOf(colorImage)||colorUrl;const imgStyle={position:\"absolute\",inset:0,width:\"100%\",height:\"100%\",objectFit,display:\"block\",userSelect:\"none\",pointerEvents:\"none\"};const content=/*#__PURE__*/_jsxs(motion.div,{onHoverStart:()=>setHovered(true),onHoverEnd:()=>setHovered(false),animate:{scale:hovered?hoverScale:1},transition:{type:\"spring\",stiffness,damping,mass},style:{position:\"relative\",width:\"100%\",height:\"100%\",cursor:link?\"pointer\":\"default\",willChange:\"transform\"},children:[colorSrc&&/*#__PURE__*/_jsx(motion.img,{src:colorSrc,alt:\"\",draggable:false,animate:{opacity:hovered?1:0},transition:{duration:fadeDuration,ease:\"easeOut\"},style:imgStyle}),bwSrc&&/*#__PURE__*/_jsx(motion.img,{src:bwSrc,alt:\"\",draggable:false,animate:{opacity:hovered?0:1},transition:{duration:fadeDuration,ease:\"easeOut\"},style:imgStyle})]});if(!link)return content;return /*#__PURE__*/_jsx(\"a\",{href:link,target:openInNewTab?\"_blank\":\"_self\",rel:openInNewTab?\"noopener noreferrer\":undefined,style:{display:\"block\",width:\"100%\",height:\"100%\",textDecoration:\"none\"},children:content});}addPropertyControls(HoverSwapIcon,{bwImage:{type:ControlType.Image,title:\"Default\"},colorImage:{type:ControlType.Image,title:\"Hover\"},bwUrl:{type:ControlType.String,title:\"Default URL\",defaultValue:\"\"},colorUrl:{type:ControlType.String,title:\"Hover URL\",defaultValue:\"\"},link:{type:ControlType.Link,title:\"Link\"},openInNewTab:{type:ControlType.Boolean,title:\"New Tab\",defaultValue:true},hoverScale:{type:ControlType.Number,title:\"Scale\",defaultValue:1.1,min:1,max:1.5,step:.01},stiffness:{type:ControlType.Number,title:\"Stiffness\",defaultValue:400,min:50,max:1e3,step:10},damping:{type:ControlType.Number,title:\"Damping\",defaultValue:14,min:1,max:60,step:1},mass:{type:ControlType.Number,title:\"Mass\",defaultValue:.6,min:.1,max:3,step:.1},fadeDuration:{type:ControlType.Number,title:\"Fade\",defaultValue:.18,min:0,max:1,step:.01,unit:\"s\"},objectFit:{type:ControlType.Enum,title:\"Fit\",defaultValue:\"contain\",options:[\"contain\",\"cover\",\"fill\"],optionTitles:[\"Contain\",\"Cover\",\"Fill\"]}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"HoverSwapIcon\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"any\",\"framerContractVersion\":\"1\",\"framerIntrinsicWidth\":\"161\",\"framerSupportedLayoutWidth\":\"any\",\"framerIntrinsicHeight\":\"161\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./HoverSwapIcon.map","// TabController\n// Renders an N-item nav (work / about / contact / anything you add) — laid out\n// horizontally or stacked vertically, labels optionally rotated to any angle,\n// with an indicator on the top/bottom/left/right of the active label.\n//\n// Each item can do one of three things when clicked (per-item \"Action\" control):\n//\n//   • Swap View  — the original behaviour. Cross-fades content panels that live\n//     elsewhere on the page, found in the DOM by their Framer layer name\n//     (data-framer-name), scoped to the current breakpoint. Nothing unmounts, so\n//     there is no page-reload flash. URL sync uses a HASH (#about) because every\n//     view lives on the SAME Framer page — pushing a real path would 404 on a\n//     hard refresh.\n//\n//   • Go to Page — renders a real <a href>, so the item navigates to another\n//     Framer page (\"/\", \"/about2\", …) or an external URL. Real anchors keep the\n//     link crawlable and let Framer's router handle it.\n//\n//   • Scroll To  — smooth-scrolls to a layer on the current page, found by its\n//     Framer layer name (e.g. \"Footer\"). Used for things like a contact section\n//     that lives at the bottom of the page rather than on its own page.\n//\n// Items are configured through the numbered slots in the property panel\n// (Item Count + \"1. Label\", \"2. Label\", …). There is also an Items array control\n// for anyone who prefers it; if it has entries it wins over the slots.\n//\n// The active item is resolved from the URL: a Go-to-Page item whose href matches\n// the current pathname wins, otherwise the hash is used, otherwise item 0.\n//\n// The indicator can be the built-in dot OR any component/stack dropped into the\n// \"Custom Dot\" slot. It can also flip 180° when it moves.\nimport{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import*as React from\"react\";import{useState,useEffect,useRef,useLayoutEffect}from\"react\";import{addPropertyControls,ControlType}from\"framer\";// How many numbered item slots the property panel exposes.\nconst MAX_ITEMS=5;const slug=s=>String(s||\"\").trim().toLowerCase().replace(/[^a-z0-9]+/g,\"-\").replace(/^-+|-+$/g,\"\");// \"/about2/\", \"/about2?x=1\" and \"/about2\" all normalise to \"/about2\" so the\n// active-item match doesn't depend on how the URL happens to be written.\nconst normPath=p=>{const bare=String(p||\"\").split(\"?\")[0].split(\"#\")[0].replace(/\\/+$/,\"\");return bare===\"\"?\"/\":bare;};const isExternal=href=>/^([a-z][a-z0-9+.-]*:|\\/\\/)/i.test(href||\"\");/**\n * @framerSupportedLayoutWidth auto\n * @framerSupportedLayoutHeight auto\n */export default function TabController(props){const{items,itemCount=2,workLabel=\"work\",aboutLabel=\"about\",workViewName=\"WorkView\",aboutViewName=\"AboutView\",navDirection=\"horizontal\",navAlign=\"start\",labelAngle=0,dotPosition=\"top\",dotColor=\"rgb(87, 92, 255)\",dotSize=8,customIndicator,indicatorWidth=16,indicatorHeight=16,flipOnArrive=false,moveMs=450,flipMs=300,flipDelayPct=0,textColor=\"rgb(185, 187, 193)\",activeTextColor=\"rgb(15, 15, 16)\",fontFamily=\"Inter, sans-serif\",fontSize=17,fontWeight=400,letterSpacing=0,itemGap=32,dotGap=6,crossfadeMs=450}=props;// The numbered slots are read dynamically (item1Label, item1Action, …). A\n// flat signature string lets useMemo/useEffect depend on their VALUES rather\n// than on a freshly-built array that changes identity every render.\nconst p=props;const slotSig=Array.from({length:MAX_ITEMS},(_,i)=>{const n=i+1;return[p[`item${n}Label`],p[`item${n}Action`],p[`item${n}Href`],p[`item${n}Layer`],p[`item${n}Block`]].join(\"|\");}).join(\"~\");// Build the tab list: Items array → numbered slots → legacy Work/About.\nconst tabs=React.useMemo(()=>{const fromArray=(items||[]).filter(i=>i&&i.label);if(fromArray.length){return fromArray.map(i=>({label:i.label,action:i.action||\"view\",viewName:i.viewName||i.label,href:i.href||\"\",scrollTarget:i.scrollTarget||i.viewName||i.label,scrollBlock:i.scrollBlock||\"start\",hash:slug(i.hash||i.label)}));}const count=Math.max(1,Math.min(MAX_ITEMS,itemCount||0));const slots=[];for(let n=1;n<=count;n++){const label=p[`item${n}Label`];if(!label)continue;// One \"Layer\" field serves both the Swap View panel name and the\n// Scroll To target — an item is only ever one or the other.\nconst layer=p[`item${n}Layer`]||label;slots.push({label,action:p[`item${n}Action`]||\"page\",viewName:layer,href:p[`item${n}Href`]||\"\",scrollTarget:layer,scrollBlock:p[`item${n}Block`]||\"start\",hash:slug(label)});}if(slots.length)return slots;const legacy=(label,viewName)=>({label,action:\"view\",viewName,href:\"\",scrollTarget:viewName,scrollBlock:\"start\",hash:slug(label)});return[legacy(workLabel,workViewName),legacy(aboutLabel,aboutViewName)];// eslint-disable-next-line react-hooks/exhaustive-deps\n},[items,itemCount,slotSig,workLabel,aboutLabel,workViewName,aboutViewName]);// Stable dependency for effects that only care about WHAT the tabs are.\nconst tabsKey=tabs.map(t=>`${t.action}:${t.hash}:${t.href}:${t.viewName}`).join(\",\");// Only run the panel crossfade machinery if at least one item actually uses\n// it. Otherwise findViews() would spin for 40 frames looking for panels that\n// were never meant to exist on this page.\nconst hasViewTabs=tabs.some(t=>t.action===\"view\");const isVertical=navDirection===\"vertical\";// The move uses cubic-bezier(0.22, 1, 0.36, 1) — a heavily front-loaded\n// curve. The dot is visually AT the new label after roughly the first 40% of\n// moveMs; the remaining 60% is an imperceptible settle. Delaying the flip by\n// the FULL moveMs therefore reads as \"arrive, sit still, then flip\".\n// flipDelayPct is the share of the move (0-100%) to wait before flipping, so\n// 0 = flips together with the travel, no dead time at all.\nconst flipDelay=Math.round(moveMs*flipDelayPct/100);const[active,setActive]=useState(0);const rootRef=useRef(null);// wrapRefs = the layout boxes (used for indicator placement + flex layout)\n// textRefs = the actual rotated labels (used only for measurement)\nconst wrapRefs=useRef([]);const textRefs=useRef([]);const[boxes,setBoxes]=useState([]);const[pos,setPos]=useState({x:0,y:0});const[rot,setRot]=useState(0);const firstRender=useRef(true);// --- custom indicator slot ---\nconst customNodes=(Array.isArray(customIndicator)?customIndicator:[customIndicator]).filter(Boolean);const hasCustom=customNodes.length>0;const indW=hasCustom?indicatorWidth:dotSize;const indH=hasCustom?indicatorHeight:dotSize;// Find a layer by its Framer name, staying inside the ACTIVE breakpoint.\n//\n// Framer renders EVERY breakpoint (desktop/tablet/phone) into the DOM and\n// hides the inactive ones with CSS, so a document-wide querySelector would\n// happily return the DESKTOP node while the phone layout is on screen. To\n// stay inside the active breakpoint we walk UP from this controller and\n// return the first ancestor that contains the target; the other breakpoints'\n// copies live in sibling branches and can't be picked up.\nconst findByName=name=>{if(!name)return null;const sel=`[data-framer-name=\"${name}\"]`;let node=rootRef.current?.parentElement||null;while(node){const hit=node.querySelector(sel);if(hit)return hit;node=node.parentElement;}return document.querySelector(sel);};// Same walk, but only accepts an ancestor that contains ALL the panels — so\n// we never act on a half-found (potentially cross-breakpoint) result.\nconst findViews=()=>{const sels=tabs.filter(t=>t.action===\"view\").map(t=>`[data-framer-name=\"${t.viewName}\"]`);if(!sels.length)return[];let node=rootRef.current?.parentElement||null;while(node){const found=sels.map(s=>node.querySelector(s));if(found.every(Boolean))return found;node=node.parentElement;}return sels.map(s=>document.querySelector(s));};const paintView=(el,isActive)=>{if(!el)return;// Per-element scratch storage for the crossfade we may have running.\nconst store=el;// Cancel any Framer \"Appear\"/scroll effect attached to the PANEL ROOT\n// ITSELF (NOT its children). The root's own WAAPI animation, if present,\n// would override the inline opacity we set below and pin the panel. We\n// deliberately do NOT pass { subtree: true } here — the inner layers of\n// each view have their own Appear/scroll animations (the ✦ effects in\n// Framer), and cancelling those would revert every animated layer to its\n// starting opacity of 0, leaving the panel blank.\nel.getAnimations?.().forEach(a=>a.cancel());if(store.__tabRaf)cancelAnimationFrame(store.__tabRaf);if(store.__tabTimer)clearTimeout(store.__tabTimer);// IMPORTANT: we do NOT drive the crossfade with a CSS `transition`.\n// In Framer's rendered output the opacity transition on these panels\n// frequently never advances — its currentTime stays pinned at 0 whenever\n// the frame pipeline is throttled (the tab/window is occluded, or the\n// hidden panel sits under content-visibility). Instead we tween opacity\n// ourselves with requestAnimationFrame and GUARANTEE the final state\n// with a setTimeout that fires even when frames don't.\nel.style.transition=\"none\";el.style.pointerEvents=isActive?\"auto\":\"none\";el.style.zIndex=isActive?\"2\":\"1\";const to=isActive?1:0;const from=parseFloat(el.style.opacity||getComputedStyle(el).opacity)||0;if(crossfadeMs<=0||from===to){el.style.opacity=String(to);return;}const start=typeof performance!==\"undefined\"?performance.now():Date.now();const tick=now=>{const t=Math.min(1,(now-start)/crossfadeMs);// easeInOutQuad\nconst eased=t<.5?2*t*t:1-Math.pow(-2*t+2,2)/2;el.style.opacity=String(from+(to-from)*eased);if(t<1){store.__tabRaf=requestAnimationFrame(tick);}else{store.__tabRaf=null;el.style.opacity=String(to);}};store.__tabRaf=requestAnimationFrame(tick);store.__tabTimer=setTimeout(()=>{el.style.opacity=String(to);store.__tabTimer=null;},crossfadeMs+60);};// `index` is an index into `tabs`; map it onto the view-only subset so the\n// right panel lights up even when link/scroll items are mixed in.\nconst applyTab=index=>{if(!hasViewTabs)return;const viewIndex=tabs.filter(t=>t.action===\"view\").findIndex(t=>t===tabs[index]);// Retry a few frames in case the views mount slightly after this\n// component. Only paint once ALL panels are resolved.\nlet tries=0;const run=()=>{const views=findViews();if(!views.every(Boolean)&&tries<40){tries++;requestAnimationFrame(run);return;}views.forEach((el,i)=>paintView(el,i===viewIndex));};run();};const scrollToTab=tab=>{const el=findByName(tab.scrollTarget||tab.label);if(!el)return;el.scrollIntoView({behavior:\"smooth\",block:tab.scrollBlock||\"start\"});};// Resolve the active item from the URL. A Go-to-Page item whose href matches\n// the current pathname wins (so the nav highlights correctly on /about2),\n// otherwise fall back to the hash used by Swap View items.\nconst tabFromLocation=()=>{if(typeof window===\"undefined\")return 0;const path=normPath(window.location.pathname);let best=-1;let bestLen=-1;tabs.forEach((t,i)=>{if(t.action!==\"page\"||!t.href||isExternal(t.href))return;const h=normPath(t.href);if(h===path&&h.length>bestLen){best=i;bestLen=h.length;}});if(best>=0)return best;const h=window.location.hash.replace(/^#/,\"\");if(h){const i=tabs.findIndex(t=>t.action===\"view\"&&t.hash===h);if(i>=0)return i;}return 0;};// Initial state (restored from the URL) + browser back/forward handling\nuseEffect(()=>{if(typeof window===\"undefined\")return;const initial=tabFromLocation();setActive(initial);applyTab(initial);const onPop=()=>{const t=tabFromLocation();setActive(t);applyTab(t);};window.addEventListener(\"popstate\",onPop);window.addEventListener(\"hashchange\",onPop);return()=>{window.removeEventListener(\"popstate\",onPop);window.removeEventListener(\"hashchange\",onPop);};// eslint-disable-next-line react-hooks/exhaustive-deps\n},[tabsKey]);// Re-apply whenever the active tab changes; also trigger the 180° flip.\nuseEffect(()=>{if(firstRender.current){firstRender.current=false;return;}applyTab(active);if(flipOnArrive)setRot(r=>r+180);// eslint-disable-next-line react-hooks/exhaustive-deps\n},[active]);// --- rotated-label layout ---\n// A CSS rotation does NOT change an element's layout box, so rotated labels\n// would overlap each other and get clipped by the auto-sized frame. We\n// measure each label at its natural (unrotated) size — offsetWidth/Height are\n// unaffected by transforms — and give its WRAPPER the size of the rotated\n// bounding box: w' = |w·cos| + |h·sin|, h' = |w·sin| + |h·cos|.\nconst measure=()=>{const rad=labelAngle*Math.PI/180;const c=Math.abs(Math.cos(rad));const s=Math.abs(Math.sin(rad));const next=tabs.map((_,i)=>{const el=textRefs.current[i];if(!el)return{w:0,h:0};const w=el.offsetWidth;const h=el.offsetHeight;return{w:Math.ceil(w*c+h*s),h:Math.ceil(w*s+h*c)};});setBoxes(prev=>prev.length===next.length&&prev.every((b,i)=>b.w===next[i].w&&b.h===next[i].h)?prev:next);};useLayoutEffect(()=>{measure();// Web fonts land after first paint and change the text metrics, so\n// re-measure once they're ready.\nconst fonts=document.fonts;if(fonts?.ready)fonts.ready.then(()=>measure()).catch(()=>{});// eslint-disable-next-line react-hooks/exhaustive-deps\n},[tabsKey,labelAngle,fontSize,fontFamily,fontWeight,letterSpacing]);// Position the indicator against the ACTIVE label's layout box, on the\n// chosen side. offsetLeft/offsetTop are read from the live DOM, so this\n// works identically in a row or a column and at any label angle.\nuseLayoutEffect(()=>{const el=wrapRefs.current[active];if(!el)return;let x=0;let y=0;switch(dotPosition){case\"top\":x=el.offsetLeft+el.offsetWidth/2-indW/2;y=el.offsetTop-dotGap-indH;break;case\"bottom\":x=el.offsetLeft+el.offsetWidth/2-indW/2;y=el.offsetTop+el.offsetHeight+dotGap;break;case\"left\":x=el.offsetLeft-dotGap-indW;y=el.offsetTop+el.offsetHeight/2-indH/2;break;case\"right\":x=el.offsetLeft+el.offsetWidth+dotGap;y=el.offsetTop+el.offsetHeight/2-indH/2;break;}setPos({x,y});},[active,dotPosition,navDirection,navAlign,fontSize,itemGap,tabsKey,boxes,labelAngle,indW,indH,dotGap]);const go=index=>{if(index===active)return;setActive(index);applyTab(index);if(typeof window!==\"undefined\"){// Only change the hash, keeping the current path — so a refresh\n// reloads this same page and restores the tab instead of 404ing.\nwindow.history.pushState({tab:index},\"\",`#${tabs[index].hash}`);}};const handleClick=(index,e)=>{const tab=tabs[index];// Legacy event handlers still fire for the first two items.\nif(index===0)props.onWorkClick?.();if(index===1)props.onAboutClick?.();if(tab.action===\"page\"){// Let the real <a href> navigate. If the href points at the page\n// we're already on, don't reload — just glide back to the top.\nif(typeof window!==\"undefined\"&&tab.href&&!isExternal(tab.href)&&normPath(tab.href)===normPath(window.location.pathname)){e.preventDefault();setActive(index);window.scrollTo({top:0,behavior:\"smooth\"});}return;}e.preventDefault();if(tab.action===\"scroll\"){setActive(index);scrollToTab(tab);return;}go(index);};const labelStyle=index=>({appearance:\"none\",background:\"none\",border:\"none\",padding:0,margin:0,cursor:\"pointer\",whiteSpace:\"nowrap\",textDecoration:\"none\",position:\"absolute\",left:\"50%\",top:\"50%\",transform:`translate(-50%, -50%) rotate(${labelAngle}deg)`,transformOrigin:\"center center\",fontFamily,fontSize,fontWeight,letterSpacing,lineHeight:1.2,color:active===index?activeTextColor:textColor,transition:\"color 0.3s ease\"});// Reserve space on the indicator's side so it never overlaps the labels or\n// gets clipped by the auto-sized frame.\nconst reserve={paddingTop:dotPosition===\"top\"?indH+dotGap:0,paddingBottom:dotPosition===\"bottom\"?indH+dotGap:0,paddingLeft:dotPosition===\"left\"?indW+dotGap:0,paddingRight:dotPosition===\"right\"?indW+dotGap:0};// Outer div travels to the active label; inner div does the 180° flip.\nconst indicator=/*#__PURE__*/_jsx(\"div\",{style:{position:\"absolute\",top:0,left:0,width:indW,height:indH,transform:`translate(${pos.x}px, ${pos.y}px)`,transition:`transform ${moveMs}ms cubic-bezier(0.22, 1, 0.36, 1)`,pointerEvents:\"none\"},children:/*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",transform:`rotate(${rot}deg)`,transition:flipOnArrive?`transform ${flipMs}ms cubic-bezier(0.22, 1, 0.36, 1) ${flipDelay}ms`:undefined},children:hasCustom?customNodes.map((child,i)=>/*#__PURE__*/React.isValidElement(child)?/*#__PURE__*/React.cloneElement(child,{key:i,style:{...child.props?.style,width:\"100%\",height:\"100%\"}}):child):/*#__PURE__*/_jsx(\"div\",{style:{width:\"100%\",height:\"100%\",borderRadius:\"50%\",backgroundColor:dotColor}})})});return /*#__PURE__*/_jsxs(\"div\",{ref:rootRef,style:{position:\"relative\",display:\"inline-flex\",flexDirection:isVertical?\"column\":\"row\",// Cross-axis alignment: in a column this is the horizontal edge\n// the labels line up on; in a row we keep them optically centred.\nalignItems:isVertical?navAlign===\"start\"?\"flex-start\":navAlign===\"end\"?\"flex-end\":\"center\":\"center\",gap:itemGap,...reserve,...props.style},children:[indicator,tabs.map((tab,i)=>{const common={style:labelStyle(i),onClick:e=>handleClick(i,e),children:tab.label};return /*#__PURE__*/_jsx(\"div\",{ref:el=>{wrapRefs.current[i]=el;},style:{position:\"relative\",flex:\"0 0 auto\",// Before the first measurement (and during SSR) fall\n// back to intrinsic sizing so labels are never\n// invisible.\nwidth:boxes[i]?.w||undefined,height:boxes[i]?.h||undefined},children:tab.action===\"page\"?// A real anchor: crawlable, middle-clickable, and\n// handled by Framer's router for internal paths.\n/*#__PURE__*/_jsx(\"a\",{ref:el=>{textRefs.current[i]=el;},href:tab.href||\"#\",...common}):/*#__PURE__*/_jsx(\"button\",{ref:el=>{textRefs.current[i]=el;},type:\"button\",...common})},`${tab.hash}-${i}`);})]});}// Numbered item slots. Built in a loop so adding a slot is a one-line change.\nconst slotControls=()=>{const out={};for(let n=1;n<=MAX_ITEMS;n++){const off=p=>!!p.items?.length||(p.itemCount??2)<n;out[`item${n}Label`]={type:ControlType.String,title:`${n}. Label`,defaultValue:\"\",placeholder:\"WORK\",hidden:off};out[`item${n}Action`]={type:ControlType.Enum,title:\" \",options:[\"page\",\"scroll\",\"view\"],optionTitles:[\"Page\",\"Scroll\",\"View\"],defaultValue:\"page\",displaySegmentedControl:true,hidden:off};out[`item${n}Href`]={type:ControlType.String,title:\" \",defaultValue:\"\",placeholder:\"/about2\",hidden:p=>off(p)||p[`item${n}Action`]!==\"page\"};out[`item${n}Layer`]={type:ControlType.String,title:\" \",defaultValue:\"\",placeholder:\"Footer\",hidden:p=>off(p)||p[`item${n}Action`]!==\"scroll\"&&p[`item${n}Action`]!==\"view\"};out[`item${n}Block`]={type:ControlType.Enum,title:\" \",options:[\"start\",\"center\",\"end\"],optionTitles:[\"Top\",\"Middle\",\"Bottom\"],defaultValue:\"start\",displaySegmentedControl:true,hidden:p=>off(p)||p[`item${n}Action`]!==\"scroll\"};}return out;};addPropertyControls(TabController,{itemCount:{type:ControlType.Number,title:\"Items\",defaultValue:2,min:1,max:MAX_ITEMS,step:1,displayStepper:true,hidden:p=>!!p.items?.length},...slotControls(),items:{type:ControlType.Array,title:\"Items (adv)\",control:{type:ControlType.Object,controls:{label:{type:ControlType.String,title:\"Label\",defaultValue:\"new tab\"},action:{type:ControlType.Enum,title:\"Action\",options:[\"page\",\"scroll\",\"view\"],optionTitles:[\"Go to Page\",\"Scroll To\",\"Swap View\"],defaultValue:\"page\"},href:{type:ControlType.String,title:\"Page\",defaultValue:\"\",placeholder:\"/about2\",hidden:p=>p.action!==\"page\"},viewName:{type:ControlType.String,title:\"Layer\",defaultValue:\"\",placeholder:\"Footer\",hidden:p=>p.action===\"page\"},scrollBlock:{type:ControlType.Enum,title:\"Align\",options:[\"start\",\"center\",\"end\"],optionTitles:[\"Top\",\"Middle\",\"Bottom\"],defaultValue:\"start\",displaySegmentedControl:true,hidden:p=>p.action!==\"scroll\"},hash:{type:ControlType.String,title:\"Hash\",defaultValue:\"\",hidden:p=>p.action!==\"view\"}}},defaultValue:[],description:\"Optional. Overrides the numbered slots above.\"},workLabel:{type:ControlType.String,title:\"Work Label\",defaultValue:\"work\",hidden:p=>!!p.items?.length||!!p.item1Label},aboutLabel:{type:ControlType.String,title:\"About Label\",defaultValue:\"about\",hidden:p=>!!p.items?.length||!!p.item1Label},workViewName:{type:ControlType.String,title:\"Work Layer\",defaultValue:\"WorkView\",hidden:p=>!!p.items?.length||!!p.item1Label},aboutViewName:{type:ControlType.String,title:\"About Layer\",defaultValue:\"AboutView\",hidden:p=>!!p.items?.length||!!p.item1Label},navDirection:{type:ControlType.Enum,title:\"Direction\",options:[\"horizontal\",\"vertical\"],optionTitles:[\"Row\",\"Stack\"],defaultValue:\"horizontal\",displaySegmentedControl:true},navAlign:{type:ControlType.Enum,title:\"Align\",options:[\"start\",\"center\",\"end\"],optionTitles:[\"Left\",\"Center\",\"Right\"],defaultValue:\"start\",displaySegmentedControl:true,hidden:p=>p.navDirection!==\"vertical\"},labelAngle:{type:ControlType.Number,title:\"Text Angle\",defaultValue:0,min:-180,max:180,step:1,unit:\"\\xb0\",description:\"-90 reads bottom-to-top, 90 reads top-to-bottom.\"},dotPosition:{type:ControlType.Enum,title:\"Dot Position\",options:[\"top\",\"bottom\",\"left\",\"right\"],optionTitles:[\"Top\",\"Bottom\",\"Left\",\"Right\"],defaultValue:\"top\",displaySegmentedControl:true},customIndicator:{type:ControlType.ComponentInstance,title:\"Custom Dot\"},indicatorWidth:{type:ControlType.Number,title:\"Custom W\",defaultValue:16,min:4,max:200,step:1,unit:\"px\",hidden:p=>!p.customIndicator},indicatorHeight:{type:ControlType.Number,title:\"Custom H\",defaultValue:16,min:4,max:200,step:1,unit:\"px\",hidden:p=>!p.customIndicator},dotColor:{type:ControlType.Color,title:\"Dot Color\",defaultValue:\"rgb(87, 92, 255)\",hidden:p=>!!p.customIndicator},dotSize:{type:ControlType.Number,title:\"Dot Size\",defaultValue:8,min:4,max:40,step:1,unit:\"px\",hidden:p=>!!p.customIndicator},flipOnArrive:{type:ControlType.Boolean,title:\"Flip 180\\xb0\",defaultValue:false},flipMs:{type:ControlType.Number,title:\"Flip Speed\",defaultValue:300,min:100,max:1e3,step:50,unit:\"ms\",hidden:p=>!p.flipOnArrive},flipDelayPct:{type:ControlType.Number,title:\"Flip Start\",description:\"0% = flips while moving. 100% = waits for the full move.\",defaultValue:0,min:0,max:100,step:5,unit:\"%\",hidden:p=>!p.flipOnArrive},moveMs:{type:ControlType.Number,title:\"Move Speed\",defaultValue:450,min:100,max:1500,step:50,unit:\"ms\"},textColor:{type:ControlType.Color,title:\"Text\",defaultValue:\"rgb(185, 187, 193)\"},activeTextColor:{type:ControlType.Color,title:\"Active Text\",defaultValue:\"rgb(15, 15, 16)\"},fontFamily:{type:ControlType.String,title:\"Font\",defaultValue:\"Inter, sans-serif\"},fontSize:{type:ControlType.Number,title:\"Font Size\",defaultValue:17,min:8,max:64,step:1,unit:\"px\"},fontWeight:{type:ControlType.Number,title:\"Weight\",defaultValue:400,min:100,max:900,step:100},letterSpacing:{type:ControlType.Number,title:\"Letter Spacing\",defaultValue:0,min:-5,max:20,step:.1,unit:\"px\"},itemGap:{type:ControlType.Number,title:\"Item Gap\",defaultValue:32,min:0,max:120,step:1,unit:\"px\"},dotGap:{type:ControlType.Number,title:\"Dot Gap\",defaultValue:6,min:0,max:40,step:1,unit:\"px\"},crossfadeMs:{type:ControlType.Number,title:\"Crossfade\",defaultValue:450,min:0,max:1500,step:50,unit:\"ms\"},onWorkClick:{type:ControlType.EventHandler,title:\"Work Click\"},onAboutClick:{type:ControlType.EventHandler,title:\"About Click\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TabController\",\"slots\":[\"customIndicator\"],\"annotations\":{\"framerSupportedLayoutWidth\":\"auto\",\"framerContractVersion\":\"1\",\"framerSupportedLayoutHeight\":\"auto\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TabController.map"],"mappings":"0RAA2K,SAAS,EAAM,EAAE,CAAK,KAAmD,OAA7B,OAAO,GAAI,SAAgB,EAAS,EAAE,KAAK,EAAE,QAAQ,IAAA,EAAU,CAQnR,SAAwB,EAAc,EAAM,CAAC,GAAK,CAAC,UAAQ,aAAW,QAAM,WAAS,OAAK,eAAa,GAAK,aAAW,IAAI,YAAU,IAAI,UAAQ,GAAG,OAAK,GAAG,eAAa,IAAI,YAAU,WAAW,EAAW,CAAC,EAAQ,GAAYA,EAAS,EAAK,EAAQ,EAAM,EAAM,CAAO,GAAG,EAAY,EAAS,EAAM,CAAU,GAAG,EAAe,EAAS,CAAC,SAAS,WAAW,MAAM,EAAE,MAAM,OAAO,OAAO,OAAO,YAAU,QAAQ,QAAQ,WAAW,OAAO,cAAc,MAAM,EAAQ,EAAqB,EAAM,EAAO,IAAI,CAAC,iBAAiB,EAAW,EAAI,EAAE,eAAe,EAAW,EAAK,EAAE,QAAQ,CAAC,MAAM,EAAQ,EAAW,CAAC,EAAE,WAAW,CAAC,KAAK,SAAS,YAAU,UAAQ,MAAI,EAAE,MAAM,CAAC,SAAS,WAAW,MAAM,OAAO,OAAO,OAAO,OAAO,EAAK,UAAU,UAAU,WAAW,WAAW,EAAE,SAAS,CAAC,GAAuB,EAAK,EAAO,IAAI,CAAC,IAAI,EAAS,IAAI,GAAG,UAAU,GAAM,QAAQ,CAAC,QAAQ,IAAW,EAAE,WAAW,CAAC,SAAS,EAAa,KAAK,SAAS,EAAE,MAAM,CAAQ,CAAC,EAAE,GAAoB,EAAK,EAAO,IAAI,CAAC,IAAI,EAAM,IAAI,GAAG,UAAU,GAAM,QAAQ,CAAC,QAAQ,GAAW,EAAE,WAAW,CAAC,SAAS,EAAa,KAAK,SAAS,EAAE,MAAM,CAAQ,CAAC,CAAC,CAAC,CAAC,EAA0B,OAApB,EAAwC,EAAK,IAAI,CAAC,KAAK,EAAK,OAAO,EAAa,SAAS,QAAQ,IAAI,EAAa,sBAAsB,IAAA,GAAU,MAAM,CAAC,QAAQ,QAAQ,MAAM,OAAO,OAAO,OAAO,eAAe,MAAM,EAAE,SAAS,CAAO,CAAC,EAAhO,CAAkO,iBAR3xC,IAAoD,IAAkC,IAA4B,EAQ0qC,EAAoB,EAAc,CAAC,QAAQ,CAAC,KAAK,EAAY,MAAM,MAAM,SAAS,EAAE,WAAW,CAAC,KAAK,EAAY,MAAM,MAAM,OAAO,EAAE,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,cAAc,aAAa,EAAE,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,EAAE,EAAE,KAAK,CAAC,KAAK,EAAY,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC,KAAK,EAAY,QAAQ,MAAM,UAAU,aAAa,EAAI,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,IAAI,IAAI,EAAE,IAAI,IAAI,KAAK,GAAG,EAAE,UAAU,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,IAAI,IAAI,GAAG,IAAI,IAAI,KAAK,EAAE,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,GAAG,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,IAAI,IAAI,EAAE,IAAI,EAAE,KAAK,IAAI,KAAK,GAAG,EAAE,UAAU,CAAC,KAAK,EAAY,KAAK,MAAM,MAAM,aAAa,UAAU,QAAQ,CAAC,UAAU,QAAQ,MAAM,EAAE,aAAa,CAAC,UAAU,QAAQ,MAAM,CAAC,CAAC,CAAC,KC6BvyE,SAAwB,EAAc,EAAM,CAAC,GAAK,CAAC,QAAM,YAAU,EAAE,YAAU,OAAO,aAAW,QAAQ,eAAa,WAAW,gBAAc,YAAY,eAAa,aAAa,WAAS,QAAQ,aAAW,EAAE,cAAY,MAAM,WAAS,mBAAmB,UAAQ,EAAE,kBAAgB,kBAAe,GAAG,mBAAgB,GAAG,gBAAa,GAAM,SAAO,IAAI,UAAO,IAAI,gBAAa,EAAE,aAAU,qBAAqB,mBAAgB,kBAAkB,aAAW,oBAAoB,WAAS,GAAG,aAAW,IAAI,gBAAc,EAAE,UAAQ,GAAG,SAAO,EAAE,cAAY,KAAK,EAGriBC,EAAE,EACF,EAAKC,MAAkB,CAAC,IAAM,GAAW,GAAO,CAAC,EAAA,CAAG,OAAO,GAAG,GAAG,EAAE,KAAK,EAAE,GAAG,EAAU,OAAQ,OAAO,EAAU,IAAI,IAAI,CAAC,MAAM,EAAE,MAAM,OAAO,EAAE,QAAQ,OAAO,SAAS,EAAE,UAAU,EAAE,MAAM,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,EAAE,aAAa,QAAQ,KAAK,EAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,EAAG,IAAM,EAAM,KAAK,IAAI,EAAE,KAAK,IAAI,EAAU,GAAW,CAAC,CAAC,EAAQ,EAAM,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAM,IAAI,CAAC,IAAM,EAAMD,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,EAAM,SAEhd,IAAM,EAAMA,EAAE,OAAO,EAAE,SAAS,EAAM,EAAM,KAAK,CAAC,QAAM,OAAOA,EAAE,OAAO,EAAE,UAAU,OAAO,SAAS,EAAM,KAAKA,EAAE,OAAO,EAAE,QAAQ,GAAG,aAAa,EAAM,YAAYA,EAAE,OAAO,EAAE,SAAS,QAAQ,KAAK,EAAK,CAAK,CAAC,CAAC,CAAE,CAAC,GAAG,EAAM,OAAO,OAAO,EAAM,IAAM,GAAQ,EAAM,KAAY,CAAC,QAAM,OAAO,OAAO,WAAS,KAAK,GAAG,aAAa,EAAS,YAAY,QAAQ,KAAK,EAAK,CAAK,CAAC,GAAG,MAAM,CAAC,EAAO,EAAU,CAAY,EAAE,EAAO,EAAW,CAAa,CAAC,CAC1b,EAAE,CAAC,EAAM,EAJmB,MAAM,KAAK,CAAC,OAAO,CAAS,GAAG,EAAE,IAAI,CAAC,IAAM,EAAE,EAAE,EAAE,MAAM,CAACA,EAAE,OAAO,EAAE,QAAQA,EAAE,OAAO,EAAE,SAASA,EAAE,OAAO,EAAE,OAAOA,EAAE,OAAO,EAAE,QAAQA,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAE,CAAC,CAAC,CAAC,KAAK,GAIpL,EAAQ,EAAU,EAAW,EAAa,CAAa,CAAC,EACrE,EAAQ,EAAK,IAAI,GAAG,GAAG,EAAE,OAAO,GAAG,EAAE,KAAK,GAAG,EAAE,KAAK,GAAG,EAAE,UAAU,CAAC,CAAC,KAAK,GAAG,EAG7E,GAAY,EAAK,KAAK,GAAG,EAAE,SAAS,MAAM,EAAQ,EAAW,IAAe,WAM5E,GAAU,KAAK,MAAM,EAAO,GAAa,GAAG,EAAO,CAAC,EAAO,GAAWE,EAAS,CAAC,EAAQ,EAAQC,EAAO,IAAI,EAE3G,EAASA,EAAO,CAAC,CAAC,EAAQ,EAASA,EAAO,CAAC,CAAC,EAAO,CAAC,EAAM,IAAUD,EAAS,CAAC,CAAC,EAAO,CAAC,EAAI,IAAQA,EAAS,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAO,CAAC,GAAI,IAAQA,EAAS,CAAC,EAAQ,EAAYC,EAAO,EAAI,EAClL,GAAa,MAAM,QAAQ,CAAe,EAAE,EAAgB,CAAC,CAAe,EAAA,CAAG,OAAO,OAAO,EAAQ,EAAU,EAAY,OAAO,EAAQ,EAAK,EAAU,GAAe,EAAc,EAAK,EAAU,GAAgB,EAQrN,GAAW,GAAM,CAAC,GAAG,CAAC,EAAK,OAAO,KAAK,IAAM,EAAI,sBAAsB,EAAK,IAAQ,EAAK,EAAQ,SAAS,eAAe,KAAK,KAAM,GAAK,CAAC,IAAM,EAAI,EAAK,cAAc,CAAG,EAAE,GAAG,EAAI,OAAO,EAAI,EAAK,EAAK,aAAc,CAAC,OAAO,SAAS,cAAc,CAAG,CAAE,EAE1P,OAAc,CAAC,IAAM,EAAK,EAAK,OAAO,GAAG,EAAE,SAAS,MAAM,CAAC,CAAC,IAAI,GAAG,sBAAsB,EAAE,SAAS,GAAG,EAAE,GAAG,CAAC,EAAK,OAAO,MAAM,CAAC,EAAE,IAAI,EAAK,EAAQ,SAAS,eAAe,KAAK,KAAM,GAAK,CAAC,IAAM,EAAM,EAAK,IAAI,GAAG,EAAK,cAAc,CAAC,CAAC,EAAE,GAAG,EAAM,MAAM,OAAO,EAAE,OAAO,EAAM,EAAK,EAAK,aAAc,CAAC,OAAO,EAAK,IAAI,GAAG,SAAS,cAAc,CAAC,CAAC,CAAE,EAAQ,IAAW,EAAG,IAAW,CAAC,GAAG,CAAC,EAAG,OACtY,IAAM,EAAM,EAOZ,EAAG,gBAAgB,CAAC,CAAC,QAAQ,GAAG,EAAE,OAAO,CAAC,EAAK,EAAM,UAAS,qBAAqB,EAAM,QAAQ,EAAK,EAAM,YAAW,aAAa,EAAM,UAAU,EAOpJ,EAAG,MAAM,WAAW,OAAO,EAAG,MAAM,cAAc,EAAS,OAAO,OAAO,EAAG,MAAM,OAAO,EAAS,IAAI,IAAI,IAAM,EAAG,KAAmB,EAAK,WAAW,EAAG,MAAM,SAAS,iBAAiB,CAAE,CAAC,CAAC,OAAO,GAAG,EAAE,GAAG,GAAa,GAAG,IAAO,EAAG,CAAC,EAAG,MAAM,QAAQ,OAAO,CAAE,EAAE,MAAO,CAAC,IAAM,EAAM,OAAO,YAAc,IAAY,YAAY,IAAI,EAAE,KAAK,IAAI,EAAQ,EAAK,GAAK,CAAC,IAAM,EAAE,KAAK,IAAI,GAAG,EAAI,GAAO,CAAW,EAC1Y,EAAM,EAAE,GAAG,EAAE,EAAE,EAAE,GAAW,GAAG,EAAE,IAAE,EAAG,EAAE,EAAG,MAAM,QAAQ,OAAO,GAAM,EAAG,GAAM,CAAK,EAAK,EAAE,EAAG,EAAM,SAAS,sBAAsB,CAAI,GAAQ,EAAM,SAAS,KAAK,EAAG,MAAM,QAAQ,OAAO,CAAE,EAAG,EAAE,EAAM,SAAS,sBAAsB,CAAI,EAAE,EAAM,WAAW,eAAe,CAAC,EAAG,MAAM,QAAQ,OAAO,CAAE,EAAE,EAAM,WAAW,IAAK,EAAE,EAAY,EAAE,CAAE,EAElV,EAAS,GAAO,CAAC,GAAG,CAAC,GAAY,OAAO,IAAM,EAAU,EAAK,OAAO,GAAG,EAAE,SAAS,MAAM,CAAC,CAAC,UAAU,GAAG,IAAI,EAAK,EAAM,EAExH,EAAM,EAAQ,MAAQ,CAAC,IAAM,EAAM,GAAU,EAAE,GAAG,CAAC,EAAM,MAAM,OAAO,GAAG,EAAM,GAAG,CAAC,IAAQ,sBAAsB,CAAG,EAAE,MAAO,CAAC,EAAM,SAAS,EAAG,IAAI,GAAU,EAAG,IAAI,CAAS,CAAC,CAAE,EAAE,EAAI,CAAE,EAAQ,GAAY,GAAK,CAAC,IAAM,EAAG,GAAW,EAAI,cAAc,EAAI,KAAK,EAAM,GAAU,EAAG,eAAe,CAAC,SAAS,SAAS,MAAM,EAAI,aAAa,OAAO,CAAC,CAAE,EAGtV,MAAoB,CAAC,GAAU,IAAS,OAAY,MAAO,GAAE,IAAM,EAAK,EAAS,EAAO,SAAS,QAAQ,EAAM,EAAK,GAAO,EAAQ,GAAqK,GAAlK,EAAK,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,QAAQ,CAAC,EAAE,MAAM,EAAW,EAAE,IAAI,EAAE,OAAO,IAAM,EAAE,EAAS,EAAE,IAAI,EAAK,IAAI,GAAM,EAAE,OAAO,IAAS,EAAK,EAAE,EAAQ,EAAE,OAAQ,CAAC,EAAK,GAAM,EAAE,OAAO,EAAK,IAAM,EAAE,EAAO,SAAS,KAAK,QAAQ,KAAK,EAAE,EAAE,GAAG,EAAE,CAAC,IAAM,EAAE,EAAK,UAAU,GAAG,EAAE,SAAS,QAAQ,EAAE,OAAO,CAAC,EAAE,GAAG,GAAG,EAAE,OAAO,CAAE,CAAC,MAAO,EAAE,EAC7c,MAAc,CAAC,GAAU,IAAS,OAAY,OAAO,IAAM,EAAQ,EAAgB,EAAE,EAAU,CAAO,EAAE,EAAS,CAAO,EAAE,IAAM,MAAU,CAAC,IAAM,EAAE,EAAgB,EAAE,EAAU,CAAC,EAAE,EAAS,CAAC,CAAE,EAAwF,OAAtF,EAAO,iBAAiB,WAAW,CAAK,EAAE,EAAO,iBAAiB,aAAa,CAAK,MAAY,CAAC,EAAO,oBAAoB,WAAW,CAAK,EAAE,EAAO,oBAAoB,aAAa,CAAK,CAAE,CAC7X,EAAE,CAAC,CAAO,CAAC,EACX,MAAc,CAAC,GAAG,EAAY,QAAQ,CAAC,EAAY,QAAQ,GAAM,MAAO,CAAC,EAAS,CAAM,EAAK,IAAa,GAAO,GAAG,EAAE,GAAG,CACzH,EAAE,CAAC,CAAM,CAAC,EAMV,IAAM,OAAY,CAAC,IAAM,EAAI,EAAW,KAAK,GAAG,IAAU,EAAE,KAAK,IAAI,KAAK,IAAI,CAAG,CAAC,EAAQ,EAAE,KAAK,IAAI,KAAK,IAAI,CAAG,CAAC,EAAQ,EAAK,EAAK,KAAK,EAAE,IAAI,CAAC,IAAM,EAAG,EAAS,QAAQ,GAAG,GAAG,CAAC,EAAG,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,IAAM,EAAE,EAAG,YAAkB,EAAE,EAAG,aAAa,MAAM,CAAC,EAAE,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,KAAK,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,CAAE,CAAC,EAAE,GAAS,GAAM,EAAK,SAAS,EAAK,QAAQ,EAAK,OAAO,EAAE,IAAI,EAAE,IAAI,EAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAK,EAAE,CAAC,CAAC,EAAE,EAAK,CAAI,CAAE,EAAE,MAAoB,CAAC,GAAQ,EAEhb,IAAM,EAAM,SAAS,MAAS,GAAO,OAAM,EAAM,MAAM,SAAS,GAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CACvF,EAAE,CAAC,EAAQ,EAAW,EAAS,EAAW,EAAW,CAAa,CAAC,EAGnE,MAAoB,CAAC,IAAM,EAAG,EAAS,QAAQ,GAAQ,GAAG,CAAC,EAAG,OAAO,IAAI,EAAE,EAAM,EAAE,EAAE,OAAO,EAAP,CAAoB,IAAI,MAAM,EAAE,EAAG,WAAW,EAAG,YAAY,EAAE,EAAK,EAAE,EAAE,EAAG,UAAU,EAAO,EAAK,MAAM,IAAI,SAAS,EAAE,EAAG,WAAW,EAAG,YAAY,EAAE,EAAK,EAAE,EAAE,EAAG,UAAU,EAAG,aAAa,EAAO,MAAM,IAAI,OAAO,EAAE,EAAG,WAAW,EAAO,EAAK,EAAE,EAAG,UAAU,EAAG,aAAa,EAAE,EAAK,EAAE,MAAM,IAAI,QAAQ,EAAE,EAAG,WAAW,EAAG,YAAY,EAAO,EAAE,EAAG,UAAU,EAAG,aAAa,EAAE,EAAK,EAAE,KAAM,CAAC,GAAO,CAAC,IAAE,GAAC,CAAC,CAAE,EAAE,CAAC,EAAO,EAAY,EAAa,EAAS,EAAS,EAAQ,EAAQ,EAAM,EAAW,EAAK,EAAK,CAAM,CAAC,EAAE,IAAM,GAAG,GAAO,CAAI,IAAQ,IAAc,EAAU,CAAK,EAAE,EAAS,CAAK,EAAY,IAAS,QAExqB,EAAO,QAAQ,UAAU,CAAC,IAAI,CAAK,EAAE,GAAG,IAAI,EAAK,EAAM,CAAC,MAAM,EAAG,EAAQ,IAAa,EAAM,IAAI,CAAC,IAAM,EAAI,EAAK,GACzC,GAApE,IAAQ,GAAE,EAAM,cAAc,EAAK,IAAQ,GAAE,EAAM,eAAe,EAAK,EAAI,SAAS,OAAO,CAEpF,IAAS,QAAa,EAAI,MAAM,CAAC,EAAW,EAAI,IAAI,GAAG,EAAS,EAAI,IAAI,IAAI,EAAS,EAAO,SAAS,QAAQ,IAAG,EAAE,eAAe,EAAE,EAAU,CAAK,EAAE,EAAO,SAAS,CAAC,IAAI,EAAE,SAAS,QAAQ,CAAC,GAAG,MAAO,CAAoB,GAAnB,EAAE,eAAe,EAAK,EAAI,SAAS,SAAS,CAAC,EAAU,CAAK,EAAE,GAAY,CAAG,EAAE,MAAO,CAAC,GAAG,CAAK,CAAE,EAAQ,GAAW,IAAQ,CAAC,WAAW,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,EAAE,OAAO,EAAE,OAAO,UAAU,WAAW,SAAS,eAAe,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI,MAAM,UAAU,gCAAgC,EAAW,MAAM,gBAAgB,gBAAgB,aAAW,WAAS,aAAW,gBAAc,WAAW,IAAI,MAAM,IAAS,EAAM,GAAgB,GAAU,WAAW,iBAAiB,GAEptB,GAAQ,CAAC,WAAW,IAAc,MAAM,EAAK,EAAO,EAAE,cAAc,IAAc,SAAS,EAAK,EAAO,EAAE,YAAY,IAAc,OAAO,EAAK,EAAO,EAAE,aAAa,IAAc,QAAQ,EAAK,EAAO,CAAC,EACxM,GAAuB,EAAK,MAAM,CAAC,MAAM,CAAC,SAAS,WAAW,IAAI,EAAE,KAAK,EAAE,MAAM,EAAK,OAAO,EAAK,UAAU,aAAa,EAAI,EAAE,MAAM,EAAI,EAAE,KAAK,WAAW,aAAa,EAAO,mCAAmC,cAAc,MAAM,EAAE,SAAsB,EAAK,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,UAAU,UAAU,GAAI,MAAM,WAAW,GAAa,aAAa,GAAO,oCAAoC,GAAU,IAAI,IAAA,EAAS,EAAE,SAAS,EAAU,EAAY,KAAK,EAAM,IAAiB,EAAqB,CAAK,EAAe,EAAmB,EAAM,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,EAAM,OAAO,MAAM,MAAM,OAAO,OAAO,MAAM,CAAC,CAAC,EAAE,CAAK,EAAe,EAAK,MAAM,CAAC,MAAM,CAAC,MAAM,OAAO,OAAO,OAAO,aAAa,MAAM,gBAAgB,CAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,OAAoB,EAAM,MAAM,CAAC,IAAI,EAAQ,MAAM,CAAC,SAAS,WAAW,QAAQ,cAAc,cAAc,EAAW,SAAS,MAE72B,WAAW,EAAW,IAAW,QAAQ,aAAa,IAAW,MAAM,WAAW,SAAS,SAAS,IAAI,EAAQ,GAAG,GAAQ,GAAG,EAAM,KAAK,EAAE,SAAS,CAAC,GAAU,EAAK,KAAK,EAAI,IAAI,CAAC,IAAM,EAAO,CAAC,MAAM,GAAW,CAAC,EAAE,QAAQ,GAAG,GAAY,EAAE,CAAC,EAAE,SAAS,EAAI,KAAK,EAAE,OAAoB,EAAK,MAAM,CAAC,IAAI,GAAI,CAAC,EAAS,QAAQ,GAAG,CAAG,EAAE,MAAM,CAAC,SAAS,WAAW,KAAK,WAGtW,MAAM,EAAM,EAAE,EAAE,GAAG,IAAA,GAAU,OAAO,EAAM,EAAE,EAAE,GAAG,IAAA,EAAS,EAAE,SAAS,EAAI,SAAS,OAErE,EAAK,IAAI,CAAC,IAAI,GAAI,CAAC,EAAS,QAAQ,GAAG,CAAG,EAAE,KAAK,EAAI,MAAM,IAAI,GAAG,CAAM,CAAC,EAAe,EAAK,SAAS,CAAC,IAAI,GAAI,CAAC,EAAS,QAAQ,GAAG,CAAG,EAAE,KAAK,SAAS,GAAG,CAAM,CAAC,CAAC,EAAE,GAAG,EAAI,KAAK,GAAG,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,CAAE,gCA1FnJ,IAA4B,IAAiH,EAC/L,EAAU,EAAQ,EAAK,GAAG,OAAO,GAAG,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,QAAQ,cAAc,GAAG,CAAC,CAAC,QAAQ,WAAW,EAAE,EAE7G,EAAS,GAAG,CAAC,IAAM,EAAK,OAAO,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,OAAO,EAAE,EAAE,OAAO,IAAO,GAAG,IAAI,CAAK,EAAQ,EAAW,GAAM,8BAA8B,KAAK,GAAM,EAAE,EAwFnL,MAAiB,CAAC,IAAM,EAAI,CAAC,EAAE,IAAI,IAAI,EAAE,EAAE,GAAG,EAAU,IAAI,CAAC,IAAM,EAAI,GAAG,CAAC,CAAC,EAAE,OAAO,SAAS,EAAE,WAAW,GAAG,EAAE,EAAI,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,GAAG,EAAE,SAAS,aAAa,GAAG,YAAY,OAAO,OAAO,CAAG,EAAE,EAAI,OAAO,EAAE,SAAS,CAAC,KAAK,EAAY,KAAK,MAAM,IAAI,QAAQ,CAAC,OAAO,SAAS,MAAM,EAAE,aAAa,CAAC,OAAO,SAAS,MAAM,EAAE,aAAa,OAAO,wBAAwB,GAAK,OAAO,CAAG,EAAE,EAAI,OAAO,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,IAAI,aAAa,GAAG,YAAY,UAAU,OAAO,GAAG,EAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,MAAM,EAAE,EAAI,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,IAAI,aAAa,GAAG,YAAY,SAAS,OAAO,GAAG,EAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,UAAU,EAAE,OAAO,EAAE,WAAW,MAAM,EAAE,EAAI,OAAO,EAAE,QAAQ,CAAC,KAAK,EAAY,KAAK,MAAM,IAAI,QAAQ,CAAC,QAAQ,SAAS,KAAK,EAAE,aAAa,CAAC,MAAM,SAAS,QAAQ,EAAE,aAAa,QAAQ,wBAAwB,GAAK,OAAO,GAAG,EAAI,CAAC,GAAG,EAAE,OAAO,EAAE,WAAW,QAAQ,CAAE,CAAC,OAAO,CAAI,EAAE,EAAoB,EAAc,CAAC,UAAU,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,EAAE,IAAI,EAAE,IAAI,EAAU,KAAK,EAAE,eAAe,GAAK,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,MAAM,EAAE,GAAG,EAAa,EAAE,MAAM,CAAC,KAAK,EAAY,MAAM,MAAM,cAAc,QAAQ,CAAC,KAAK,EAAY,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,SAAS,EAAE,OAAO,CAAC,KAAK,EAAY,KAAK,MAAM,SAAS,QAAQ,CAAC,OAAO,SAAS,MAAM,EAAE,aAAa,CAAC,aAAa,YAAY,WAAW,EAAE,aAAa,MAAM,EAAE,KAAK,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,GAAG,YAAY,UAAU,OAAO,GAAG,EAAE,SAAS,MAAM,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,QAAQ,aAAa,GAAG,YAAY,SAAS,OAAO,GAAG,EAAE,SAAS,MAAM,EAAE,YAAY,CAAC,KAAK,EAAY,KAAK,MAAM,QAAQ,QAAQ,CAAC,QAAQ,SAAS,KAAK,EAAE,aAAa,CAAC,MAAM,SAAS,QAAQ,EAAE,aAAa,QAAQ,wBAAwB,GAAK,OAAO,GAAG,EAAE,SAAS,QAAQ,EAAE,KAAK,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,GAAG,OAAO,GAAG,EAAE,SAAS,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE,YAAY,+CAA+C,EAAE,UAAU,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,OAAO,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,cAAc,aAAa,QAAQ,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,WAAW,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,KAAK,EAAY,OAAO,MAAM,cAAc,aAAa,YAAY,OAAO,GAAG,CAAC,CAAC,EAAE,OAAO,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,CAAC,KAAK,EAAY,KAAK,MAAM,YAAY,QAAQ,CAAC,aAAa,UAAU,EAAE,aAAa,CAAC,MAAM,OAAO,EAAE,aAAa,aAAa,wBAAwB,EAAI,EAAE,SAAS,CAAC,KAAK,EAAY,KAAK,MAAM,QAAQ,QAAQ,CAAC,QAAQ,SAAS,KAAK,EAAE,aAAa,CAAC,OAAO,SAAS,OAAO,EAAE,aAAa,QAAQ,wBAAwB,GAAK,OAAO,GAAG,EAAE,eAAe,UAAU,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,EAAE,IAAI,KAAK,IAAI,IAAI,KAAK,EAAE,KAAK,IAAO,YAAY,kDAAkD,EAAE,YAAY,CAAC,KAAK,EAAY,KAAK,MAAM,eAAe,QAAQ,CAAC,MAAM,SAAS,OAAO,OAAO,EAAE,aAAa,CAAC,MAAM,SAAS,OAAO,OAAO,EAAE,aAAa,MAAM,wBAAwB,EAAI,EAAE,gBAAgB,CAAC,KAAK,EAAY,kBAAkB,MAAM,YAAY,EAAE,eAAe,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,CAAC,EAAE,eAAe,EAAE,gBAAgB,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,CAAC,EAAE,eAAe,EAAE,SAAS,CAAC,KAAK,EAAY,MAAM,MAAM,YAAY,aAAa,mBAAmB,OAAO,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,eAAe,EAAE,aAAa,CAAC,KAAK,EAAY,QAAQ,MAAM,YAAe,aAAa,EAAK,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,KAAK,KAAK,OAAO,GAAG,CAAC,EAAE,YAAY,EAAE,aAAa,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,YAAY,2DAA2D,aAAa,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,aAAa,aAAa,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,GAAG,KAAK,IAAI,EAAE,UAAU,CAAC,KAAK,EAAY,MAAM,MAAM,OAAO,aAAa,oBAAoB,EAAE,gBAAgB,CAAC,KAAK,EAAY,MAAM,MAAM,cAAc,aAAa,iBAAiB,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,OAAO,aAAa,mBAAmB,EAAE,SAAS,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,WAAW,CAAC,KAAK,EAAY,OAAO,MAAM,SAAS,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,GAAG,EAAE,cAAc,CAAC,KAAK,EAAY,OAAO,MAAM,iBAAiB,aAAa,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAY,OAAO,MAAM,WAAW,aAAa,GAAG,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,KAAK,IAAI,EAAE,OAAO,CAAC,KAAK,EAAY,OAAO,MAAM,UAAU,aAAa,EAAE,IAAI,EAAE,IAAI,GAAG,KAAK,EAAE,KAAK,IAAI,EAAE,YAAY,CAAC,KAAK,EAAY,OAAO,MAAM,YAAY,aAAa,IAAI,IAAI,EAAE,IAAI,KAAK,KAAK,GAAG,KAAK,IAAI,EAAE,YAAY,CAAC,KAAK,EAAY,aAAa,MAAM,YAAY,EAAE,aAAa,CAAC,KAAK,EAAY,aAAa,MAAM,aAAa,CAAC,CAAC"}