PageSourceSearch

https://optops.ai/assets/index-DWE9W5bF.js

js optops.ai collected 2026-10-05 12:22:04 UTC 1,063,015 bytes, 4,704 lines download raw bytes

vendor: 7,654 bytes, line 1
1(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))l(d);new MutationObserver(d=>{for(const h of d)if(h.type==="childList")for(const m of h.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&l(m)}).observe(document,{childList:!0,subtree:!0});function o(d){const h={};return d.integrity&&(h.integrity=d.integrity),d.referrerPolicy&&(h.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?h.credentials="include":d.crossOrigin==="anonymous"?h.credentials="omit":h.credentials="same-origin",h}function l(d){if(d.ep)return;d.ep=!0;const h=o(d);fetch(d.href,h)}})();function Ox(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var nu={exports:{}},Li={};var ly;function _j(){if(ly)return Li;ly=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.fragment");function o(l,d,h){var m=null;if(h!==void 0&&(m=""+h),d.key!==void 0&&(m=""+d.key),"key"in d){h={};for(var p in d)p!=="key"&&(h[p]=d[p])}else h=d;return d=h.ref,{$$typeof:n,type:l,key:m,ref:d!==void 0?d:null,props:h}}return Li.Fragment=s,Li.jsx=o,Li.jsxs=o,Li}var cy;function Vj(){return cy||(cy=1,nu.exports=_j()),nu.exports}var a=Vj(),au={exports:{}},he={};var dy;function Lj(){if(dy)return he;dy=1;var n=Symbol.for("react.transitional.element"),s=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),l=Symbol.for("react.strict_mode"),d=Symbol.for("react.profiler"),h=Symbol.for("react.consumer"),m=Symbol.for("react.context"),p=Symbol.for("react.forward_ref"),f=Symbol.for("react.suspense"),g=Symbol.for("react.memo"),b=Symbol.for("react.lazy"),x=Symbol.for("react.activity"),w=Symbol.iterator;function S(k){return k===null||typeof k!="object"?null:(k=w&&k[w]||k["@@iterator"],typeof k=="function"?k:null)}var T={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},O=Object.assign,D={};function E(k,q,H){this.props=k,this.context=q,this.refs=D,this.updater=H||T}E.prototype.isReactComponent={},E.prototype.setState=function(k,q){if(typeof k!="object"&&typeof k!="function"&&k!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,k,q,"setState")},E.prototype.forceUpdate=function(k){this.updater.enqueueForceUpdate(this,k,"forceUpdate")};function P(){}P.prototype=E.prototype;function I(k,q,H){this.props=k,this.context=q,this.refs=D,this.updater=H||T}var F=I.prototype=new P;F.constructor=I,O(F,E.prototype),F.isPureReactComponent=!0;var W=Array.isArray;function Z(){}var X={H:null,A:null,T:null,S:null},J=Object.prototype.hasOwnProperty;function Q(k,q,H){var Y=H.ref;return{$$typeof:n,type:k,key:q,ref:Y!==void 0?Y:null,props:H}}function ue(k,q){return Q(k.type,q,k.props)}function fe(k){return typeof k=="object"&&k!==null&&k.$$typeof===n}function je(k){var q={"=":"=0",":":"=2"};return"$"+k.replace(/[=:]/g,function(H){return q[H]})}var Re=/\/+/g;function Ie(k,q){return typeof k=="object"&&k!==null&&k.key!=null?je(""+k.key):q.toString(36)}function Xe(k){switch(k.status){case"fulfilled":return k.value;case"rejected":throw k.reason;default:switch(typeof k.status=="string"?k.then(Z,Z):(k.status="pending",k.then(function(q){k.status==="pending"&&(k.status="fulfilled",k.value=q)},function(q){k.status==="pending"&&(k.status="rejected",k.reason=q)})),k.status){case"fulfilled":return k.value;case"rejected":throw k.reason}}throw k}function B(k,q,H,Y,ee){var le=typeof k;(le==="undefined"||le==="boolean")&&(k=null);var de=!1;if(k===null)de=!0;else switch(le){case"bigint":case"string":case"number":de=!0;break;case"object":switch(k.$$typeof){case n:case s:de=!0;break;case b:return de=k._init,B(de(k._payload),q,H,Y,ee)}}if(de)return ee=ee(k),de=Y===""?"."+Ie(k,0):Y,W(ee)?(H="",de!=null&&(H=de.replace(Re,"$&/")+"/"),B(ee,q,H,"",function(Ft){return Ft})):ee!=null&&(fe(ee)&&(ee=ue(ee,H+(ee.key==null||k&&k.key===ee.key?"":(""+ee.key).replace(Re,"$&/")+"/")+de)),q.push(ee)),1;de=0;var Ne=Y===""?".":Y+":";if(W(k))for(var ke=0;ke<k.length;ke++)Y=k[ke],le=Ne+Ie(Y,ke),de+=B(Y,q,H,le,ee);else if(ke=S(k),typeof ke=="function")for(k=ke.call(k),ke=0;!(Y=k.next()).done;)Y=Y.value,le=Ne+Ie(Y,ke++),de+=B(Y,q,H,le,ee);else if(le==="object"){if(typeof k.then=="function")return B(Xe(k),q,H,Y,ee);throw q=String(k),Error("Objects are not valid as a React child (found: "+(q==="[object Object]"?"object with keys {"+Object.keys(k).join(", ")+"}":q)+"). If you meant to render a collection of children, use an array instead.")}return de}function V(k,q,H){if(k==null)return k;var Y=[],ee=0;return B(k,Y,"","",function(le){return q.call(H,le,ee++)}),Y}function $(k){if(k._status===-1){var q=k._result;q=q(),q.then(function(H){(k._status===0||k._status===-1)&&(k._status=1,k._result=H)},function(H){(k._status===0||k._status===-1)&&(k._status=2,k._result=H)}),k._status===-1&&(k._status=0,k._result=q)}if(k._status===1)return k._result.default;throw k._result}var oe=typeof reportError=="function"?reportError:function(k){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var q=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof k=="object"&&k!==null&&typeof k.message=="string"?String(k.message):String(k),error:k});if(!window.dispatchEvent(q))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",k);return}console.error(k)},L={map:V,forEach:function(k,q,H){V(k,function(){q.apply(this,arguments)},H)},count:function(k){var q=0;return V(k,function(){q++}),q},toArray:function(k){return V(k,function(q){return q})||[]},only:function(k){if(!fe(k))throw Error("React.Children.only expected to receive a single React element child.");return k}};return he.Activity=x,he.Children=L,he.Component=E,he.Fragment=o,he.Profiler=d,he.PureComponent=I,he.StrictMode=l,he.Suspense=f,he.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=X,he.__COMPILER_RUNTIME={__proto__:null,c:function(k){return X.H.useMemoCache(k)}},he.cache=function(k){return function(){return k.apply(null,arguments)}},he.cacheSignal=function(){return null},he.cloneElement=function(k,q,H){if(k==null)throw Error("The argument must be a React element, but you passed "+k+".");var Y=O({},k.props),ee=k.key;if(q!=null)for(le in q.key!==void 0&&(ee=""+q.key),q)!J.call(q,le)||le==="key"||le==="__self"||le==="__source"||le==="ref"&&q.ref===void 0||(Y[le]=q[le]);var le=arguments.length-2;if(le===1)Y.children=H;else if(1<le){for(var de=Array(le),Ne=0;Ne<le;Ne++)de[Ne]=arguments[Ne+2];Y.children=de}return Q(k.type,ee,Y)},he.createContext=function(k){return k={$$typeof:m,_currentValue:k,_currentValue2:k,_threadCount:0,Provider:null,Consumer:null},k.Provider=k,k.Consumer={$$typeof:h,_context:k},k},he.createElement=function(k,q,H){var Y,ee={},le=null;if(q!=null)for(Y in q.key!==void 0&&(le=""+q.key),q)J.call(q,Y)&&Y!=="key"&&Y!=="__self"&&Y!=="__source"&&(ee[Y]=q[Y]);var de=arguments.length-2;if(de===1)ee.children=H;else if(1<de){for(var Ne=Array(de),ke=0;ke<de;ke++)Ne[ke]=arguments[ke+2];ee.children=Ne}if(k&&k.defaultProps)for(Y in de=k.defaultProps,de)ee[Y]===void 0&&(ee[Y]=de[Y]);return Q(k,le,ee)},he.createRef=function(){return{current:null}},he.forwardRef=function(k){return{$$typeof:p,render:k}},he.isValidElement=fe,he.lazy=function(k){return{$$typeof:b,_payload:{_status:-1,_result:k},_init:$}},he.memo=function(k,q){return{$$typeof:g,type:k,compare:q===void 0?null:q}},he.startTransition=function(k){var q=X.T,H={};X.T=H;try{var Y=k(),ee=X.S;
vendor: 10,131 bytes, line 1
1ee!==null&&ee(H,Y),typeof Y=="object"&&Y!==null&&typeof Y.then=="function"&&Y.then(Z,oe)}catch(le){oe(le)}finally{q!==null&&H.types!==null&&(q.types=H.types),X.T=q}},he.unstable_useCacheRefresh=function(){return X.H.useCacheRefresh()},he.use=function(k){return X.H.use(k)},he.useActionState=function(k,q,H){return X.H.useActionState(k,q,H)},he.useCallback=function(k,q){return X.H.useCallback(k,q)},he.useContext=function(k){return X.H.useContext(k)},he.useDebugValue=function(){},he.useDeferredValue=function(k,q){return X.H.useDeferredValue(k,q)},he.useEffect=function(k,q){return X.H.useEffect(k,q)},he.useEffectEvent=function(k){return X.H.useEffectEvent(k)},he.useId=function(){return X.H.useId()},he.useImperativeHandle=function(k,q,H){return X.H.useImperativeHandle(k,q,H)},he.useInsertionEffect=function(k,q){return X.H.useInsertionEffect(k,q)},he.useLayoutEffect=function(k,q){return X.H.useLayoutEffect(k,q)},he.useMemo=function(k,q){return X.H.useMemo(k,q)},he.useOptimistic=function(k,q){return X.H.useOptimistic(k,q)},he.useReducer=function(k,q,H){return X.H.useReducer(k,q,H)},he.useRef=function(k){return X.H.useRef(k)},he.useState=function(k){return X.H.useState(k)},he.useSyncExternalStore=function(k,q,H){return X.H.useSyncExternalStore(k,q,H)},he.useTransition=function(){return X.H.useTransition()},he.version="19.2.3",he}var uy;function gh(){return uy||(uy=1,au.exports=Lj()),au.exports}var j=gh();const ge=Ox(j);var su={exports:{}},Gi={},iu={exports:{}},ou={};var hy;function Gj(){return hy||(hy=1,(function(n){function s(B,V){var $=B.length;B.push(V);e:for(;0<$;){var oe=$-1>>>1,L=B[oe];if(0<d(L,V))B[oe]=V,B[$]=L,$=oe;else break e}}function o(B){return B.length===0?null:B[0]}function l(B){if(B.length===0)return null;var V=B[0],$=B.pop();if($!==V){B[0]=$;e:for(var oe=0,L=B.length,k=L>>>1;oe<k;){var q=2*(oe+1)-1,H=B[q],Y=q+1,ee=B[Y];if(0>d(H,$))Y<L&&0>d(ee,H)?(B[oe]=ee,B[Y]=$,oe=Y):(B[oe]=H,B[q]=$,oe=q);else if(Y<L&&0>d(ee,$))B[oe]=ee,B[Y]=$,oe=Y;else break e}}return V}function d(B,V){var $=B.sortIndex-V.sortIndex;return $!==0?$:B.id-V.id}if(n.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var h=performance;n.unstable_now=function(){return h.now()}}else{var m=Date,p=m.now();n.unstable_now=function(){return m.now()-p}}var f=[],g=[],b=1,x=null,w=3,S=!1,T=!1,O=!1,D=!1,E=typeof setTimeout=="function"?setTimeout:null,P=typeof clearTimeout=="function"?clearTimeout:null,I=typeof setImmediate<"u"?setImmediate:null;function F(B){for(var V=o(g);V!==null;){if(V.callback===null)l(g);else if(V.startTime<=B)l(g),V.sortIndex=V.expirationTime,s(f,V);else break;V=o(g)}}function W(B){if(O=!1,F(B),!T)if(o(f)!==null)T=!0,Z||(Z=!0,je());else{var V=o(g);V!==null&&Xe(W,V.startTime-B)}}var Z=!1,X=-1,J=5,Q=-1;function ue(){return D?!0:!(n.unstable_now()-Q<J)}function fe(){if(D=!1,Z){var B=n.unstable_now();Q=B;var V=!0;try{e:{T=!1,O&&(O=!1,P(X),X=-1),S=!0;var $=w;try{t:{for(F(B),x=o(f);x!==null&&!(x.expirationTime>B&&ue());){var oe=x.callback;if(typeof oe=="function"){x.callback=null,w=x.priorityLevel;var L=oe(x.expirationTime<=B);if(B=n.unstable_now(),typeof L=="function"){x.callback=L,F(B),V=!0;break t}x===o(f)&&l(f),F(B)}else l(f);x=o(f)}if(x!==null)V=!0;else{var k=o(g);k!==null&&Xe(W,k.startTime-B),V=!1}}break e}finally{x=null,w=$,S=!1}V=void 0}}finally{V?je():Z=!1}}}var je;if(typeof I=="function")je=function(){I(fe)};else if(typeof MessageChannel<"u"){var Re=new MessageChannel,Ie=Re.port2;Re.port1.onmessage=fe,je=function(){Ie.postMessage(null)}}else je=function(){E(fe,0)};function Xe(B,V){X=E(function(){B(n.unstable_now())},V)}n.unstable_IdlePriority=5,n.unstable_ImmediatePriority=1,n.unstable_LowPriority=4,n.unstable_NormalPriority=3,n.unstable_Profiling=null,n.unstable_UserBlockingPriority=2,n.unstable_cancelCallback=function(B){B.callback=null},n.unstable_forceFrameRate=function(B){0>B||125<B?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):J=0<B?Math.floor(1e3/B):5},n.unstable_getCurrentPriorityLevel=function(){return w},n.unstable_next=function(B){switch(w){case 1:case 2:case 3:var V=3;break;default:V=w}var $=w;w=V;try{return B()}finally{w=$}},n.unstable_requestPaint=function(){D=!0},n.unstable_runWithPriority=function(B,V){switch(B){case 1:case 2:case 3:case 4:case 5:break;default:B=3}var $=w;w=B;try{return V()}finally{w=$}},n.unstable_scheduleCallback=function(B,V,$){var oe=n.unstable_now();switch(typeof $=="object"&&$!==null?($=$.delay,$=typeof $=="number"&&0<$?oe+$:oe):$=oe,B){case 1:var L=-1;break;case 2:L=250;break;case 5:L=1073741823;break;case 4:L=1e4;break;default:L=5e3}return L=$+L,B={id:b++,callback:V,priorityLevel:B,startTime:$,expirationTime:L,sortIndex:-1},$>oe?(B.sortIndex=$,s(g,B),o(f)===null&&B===o(g)&&(O?(P(X),X=-1):O=!0,Xe(W,$-oe))):(B.sortIndex=L,s(f,B),T||S||(T=!0,Z||(Z=!0,je()))),B},n.unstable_shouldYield=ue,n.unstable_wrapCallback=function(B){var V=w;return function(){var $=w;w=V;try{return B.apply(this,arguments)}finally{w=$}}}})(ou)),ou}var my;function Hj(){return my||(my=1,iu.exports=Gj()),iu.exports}var ru={exports:{}},xt={};var py;function Kj(){if(py)return xt;py=1;var n=gh();function s(f){var g="https://react.dev/errors/"+f;if(1<arguments.length){g+="?args[]="+encodeURIComponent(arguments[1]);for(var b=2;b<arguments.length;b++)g+="&args[]="+encodeURIComponent(arguments[b])}return"Minified React error #"+f+"; visit "+g+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function o(){}var l={d:{f:o,r:function(){throw Error(s(522))},D:o,C:o,L:o,m:o,X:o,S:o,M:o},p:0,findDOMNode:null},d=Symbol.for("react.portal");function h(f,g,b){var x=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:d,key:x==null?null:""+x,children:f,containerInfo:g,implementation:b}}var m=n.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function p(f,g){if(f==="font")return"";if(typeof g=="string")return g==="use-credentials"?g:""}return xt.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=l,xt.createPortal=function(f,g){var b=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!g||g.nodeType!==1&&g.nodeType!==9&&g.nodeType!==11)throw Error(s(299));return h(f,g,null,b)},xt.flushSync=function(f){var g=m.T,b=l.p;try{if(m.T=null,l.p=2,f)return f()}finally{m.T=g,l.p=b,l.d.f()}},xt.preconnect=function(f,g){typeof f=="string"&&(g?(g=g.crossOrigin,g=typeof g=="string"?g==="use-credentials"?g:"":void 0):g=null,l.d.C(f,g))},xt.prefetchDNS=function(f){typeof f=="string"&&l.d.D(f)},xt.preinit=function(f,g){if(typeof f=="string"&&g&&typeof g.as=="string"){var b=g.as,x=p(b,g.crossOrigin),w=typeof g.integrity=="string"?g.integrity:void 0,S=typeof g.fetchPriority=="string"?g.fetchPriority:void 0;b==="style"?l.d.S(f,typeof g.precedence=="string"?g.precedence:void 0,{crossOrigin:x,integrity:w,fetchPriority:S}):b==="script"&&l.d.X(f,{crossOrigin:x,integrity:w,fetchPriority:S,nonce:typeof g.nonce=="string"?g.nonce:void 0})}},xt.preinitModule=function(f,g){if(typeof f=="string")if(typeof g=="object"&&g!==null){if(g.as==null||g.as==="script"){var b=p(g.as,g.crossOrigin);l.d.M(f,{crossOrigin:b,integrity:typeof g.integrity=="string"?g.integrity:void 0,nonce:typeof g.nonce=="string"?g.nonce:void 0})}}else g==null&&l.d.M(f)},xt.preload=function(f,g){if(typeof f=="string"&&typeof g=="object"&&g!==null&&typeof g.as=="string"){var b=g.as,x=p(b,g.crossOrigin);l.d.L(f,b,{crossOrigin:x,integrity:typeof g.integrity=="string"?g.integrity:void 0,nonce:typeof g.nonce=="string"?g.nonce:void 0,type:typeof g.type=="string"?g.type:void 0,fetchPriority:typeof g.fetchPriority=="string"?g.fetchPriority:void 0,referrerPolicy:typeof g.referrerPolicy=="string"?g.referrerPolicy:void 0,imageSrcSet:typeof g.imageSrcSet=="string"?g.imageSrcSet:void 0,imageSizes:typeof g.imageSizes=="string"?g.imageSizes:void 0,media:typeof g.media=="string"?g.media:void 0})}},xt.preloadModule=function(f,g){if(typeof f=="string")if(g){var b=p(g.as,g.crossOrigin);l.d.m(f,{as:typeof g.as=="string"&&g.as!=="script"?g.as:void 0,crossOrigin:b,integrity:typeof g.integrity=="string"?g.integrity:void 0})}else l.d.m(f)},xt.requestFormReset=function(f){l.d.r(f)},xt.unstable_batchedUpdates=function(f,g){return f(g)},xt.useFormState=function(f,g,b){return m.H.useFormState(f,g,b)},xt.useFormStatus=function(){return m.H.useHostTransitionStatus()},xt.version="19.2.3",xt}var fy;function Fj(){if(fy)return ru.exports;fy=1;function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),ru.exports=Kj(),ru.exports}var gy;function Wj(){if(gy)return Gi;gy=1;var n=Hj(),s=gh(),o=Fj();function l(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var i=2;i<arguments.length;i++)t+="&args[]="+encodeURIComponent(arguments[i])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function d(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function h(e){var t=e,i=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(i=t.return),e=t.return;while(e)}return t.tag===3?i:null}function m(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function p(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function f(e){if(h(e)!==e)throw Error(l(188))}function g(e){var t=e.alternate;if(!t){if(t=h(e),t===null)throw Error(l(188));return t!==e?null:e}for(var i=e,r=t;;){var c=i.return;if(c===null)break;var u=c.alternate;if(u===null){if(r=c.return,r!==null){i=r;continue}break}if(c.child===u.child){for(u=c.child;u;){if(u===i)return f(c),e;if(u===r)return f(c),t;u=u.sibling}throw Error(l(188))}if(i.return!==r.return)i=c,r=u;
vendor: 4,253 bytes, lines 1-5
1else{for(var y=!1,v=c.child;v;){if(v===i){y=!0,i=c,r=u;break}if(v===r){y=!0,r=c,i=u;break}v=v.sibling}if(!y){for(v=u.child;v;){if(v===i){y=!0,i=u,r=c;break}if(v===r){y=!0,r=u,i=c;break}v=v.sibling}if(!y)throw Error(l(189))}}if(i.alternate!==r)throw Error(l(190))}if(i.tag!==3)throw Error(l(188));return i.stateNode.current===i?e:t}function b(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=b(e),t!==null)return t;e=e.sibling}return null}var x=Object.assign,w=Symbol.for("react.element"),S=Symbol.for("react.transitional.element"),T=Symbol.for("react.portal"),O=Symbol.for("react.fragment"),D=Symbol.for("react.strict_mode"),E=Symbol.for("react.profiler"),P=Symbol.for("react.consumer"),I=Symbol.for("react.context"),F=Symbol.for("react.forward_ref"),W=Symbol.for("react.suspense"),Z=Symbol.for("react.suspense_list"),X=Symbol.for("react.memo"),J=Symbol.for("react.lazy"),Q=Symbol.for("react.activity"),ue=Symbol.for("react.memo_cache_sentinel"),fe=Symbol.iterator;function je(e){return e===null||typeof e!="object"?null:(e=fe&&e[fe]||e["@@iterator"],typeof e=="function"?e:null)}var Re=Symbol.for("react.client.reference");function Ie(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===Re?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case O:return"Fragment";case E:return"Profiler";case D:return"StrictMode";case W:return"Suspense";case Z:return"SuspenseList";case Q:return"Activity"}if(typeof e=="object")switch(e.$$typeof){case T:return"Portal";case I:return e.displayName||"Context";case P:return(e._context.displayName||"Context")+".Consumer";case F:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case X:return t=e.displayName||null,t!==null?t:Ie(e.type)||"Memo";case J:t=e._payload,e=e._init;try{return Ie(e(t))}catch{}}return null}var Xe=Array.isArray,B=s.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,V=o.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,$={pending:!1,data:null,method:null,action:null},oe=[],L=-1;function k(e){return{current:e}}function q(e){0>L||(e.current=oe[L],oe[L]=null,L--)}function H(e,t){L++,oe[L]=e.current,e.current=t}var Y=k(null),ee=k(null),le=k(null),de=k(null);function Ne(e,t){switch(H(le,t),H(ee,e),H(Y,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?Dg(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=Dg(t),e=zg(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}q(Y),H(Y,e)}function ke(){q(Y),q(ee),q(le)}function Ft(e){e.memoizedState!==null&&H(de,e);var t=Y.current,i=zg(t,e.type);t!==i&&(H(ee,e),H(Y,i))}function Be(e){ee.current===e&&(q(Y),q(ee)),de.current===e&&(q(de),Ui._currentValue=$)}var Fn,Xs;function Ta(e){if(Fn===void 0)try{throw Error()}catch(i){var t=i.stack.trim().match(/\n( *(at )?)/);Fn=t&&t[1]||"",Xs=-1<i.stack.indexOf(`
2    at`)?" (<anonymous>)":-1<i.stack.indexOf("@")?"@unknown:0:0":""}return`
3`+Fn+e+Xs}var Bl=!1;function _l(e,t){if(!e||Bl)return"";Bl=!0;var i=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var K=function(){throw Error()};if(Object.defineProperty(K.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(K,[])}catch(U){var M=U}Reflect.construct(e,[],K)}else{try{K.call()}catch(U){M=U}e.call(K.prototype)}}else{try{throw Error()}catch(U){M=U}(K=e())&&typeof K.catch=="function"&&K.catch(function(){})}}catch(U){if(U&&M&&typeof U.stack=="string")return[U.stack,M.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var c=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,"name");c&&c.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=r.DetermineComponentFrameRoot(),y=u[0],v=u[1];if(y&&v){var N=y.split(`
4`),R=v.split(`
5`);for(c=r=0;r<N.length&&!N[r].includes("DetermineComponentFrameRoot");)r++;for(;c<R.length&&!R[c].includes("DetermineComponentFrameRoot");)c++;if(r===N.length||c===R.length)for(r=N.length-1,c=R.length-1;1<=r&&0<=c&&N[r]!==R[c];)c--;for(;1<=r&&0<=c;
vendor: 1,475 bytes, lines 5-8
5r--,c--)if(N[r]!==R[c]){if(r!==1||c!==1)do if(r--,c--,0>c||N[r]!==R[c]){var _=`
6`+N[r].replace(" at new "," at ");return e.displayName&&_.includes("<anonymous>")&&(_=_.replace("<anonymous>",e.displayName)),_}while(1<=r&&0<=c);break}}}finally{Bl=!1,Error.prepareStackTrace=i}return(i=e?e.displayName||e.name:"")?Ta(i):""}function y0(e,t){switch(e.tag){case 26:case 27:case 5:return Ta(e.type);case 16:return Ta("Lazy");case 13:return e.child!==t&&t!==null?Ta("Suspense Fallback"):Ta("Suspense");case 19:return Ta("SuspenseList");case 0:case 15:return _l(e.type,!1);case 11:return _l(e.type.render,!1);case 1:return _l(e.type,!0);case 31:return Ta("Activity");default:return""}}function rm(e){try{var t="",i=null;do t+=y0(e,i),i=e,e=e.return;while(e);return t}catch(r){return`
7Error generating stack: `+r.message+`
8`+r.stack}}var Vl=Object.prototype.hasOwnProperty,Ll=n.unstable_scheduleCallback,Gl=n.unstable_cancelCallback,b0=n.unstable_shouldYield,x0=n.unstable_requestPaint,Rt=n.unstable_now,v0=n.unstable_getCurrentPriorityLevel,lm=n.unstable_ImmediatePriority,cm=n.unstable_UserBlockingPriority,No=n.unstable_NormalPriority,w0=n.unstable_LowPriority,dm=n.unstable_IdlePriority,j0=n.log,k0=n.unstable_setDisableYieldValue,Js=null,Mt=null;function Wn(e){if(typeof j0=="function"&&k0(e),Mt&&typeof Mt.setStrictMode=="function")try{Mt.setStrictMode(Js,e)}catch{}}var qt=Math.clz32?Math.clz32:S0,N0=Math.log,T0=Math.LN2;function S0(e){return e>>>=0,e===0?32:31-(N0(e)/T0|0)|0}
vendor: 8,673 bytes, line 8
8var To=256,So=262144,Ao=4194304;function Sa(e){var t=e&42;if(t!==0)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return e&261888;case 262144:case 524288:case 1048576:case 2097152:return e&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return e&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function Co(e,t,i){var r=e.pendingLanes;if(r===0)return 0;var c=0,u=e.suspendedLanes,y=e.pingedLanes;e=e.warmLanes;var v=r&134217727;return v!==0?(r=v&~u,r!==0?c=Sa(r):(y&=v,y!==0?c=Sa(y):i||(i=v&~e,i!==0&&(c=Sa(i))))):(v=r&~u,v!==0?c=Sa(v):y!==0?c=Sa(y):i||(i=r&~e,i!==0&&(c=Sa(i)))),c===0?0:t!==0&&t!==c&&(t&u)===0&&(u=c&-c,i=t&-t,u>=i||u===32&&(i&4194048)!==0)?t:c}function $s(e,t){return(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)===0}function A0(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function um(){var e=Ao;return Ao<<=1,(Ao&62914560)===0&&(Ao=4194304),e}function Hl(e){for(var t=[],i=0;31>i;i++)t.push(e);return t}function Qs(e,t){e.pendingLanes|=t,t!==268435456&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function C0(e,t,i,r,c,u){var y=e.pendingLanes;e.pendingLanes=i,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=i,e.entangledLanes&=i,e.errorRecoveryDisabledLanes&=i,e.shellSuspendCounter=0;var v=e.entanglements,N=e.expirationTimes,R=e.hiddenUpdates;for(i=y&~i;0<i;){var _=31-qt(i),K=1<<_;v[_]=0,N[_]=-1;var M=R[_];if(M!==null)for(R[_]=null,_=0;_<M.length;_++){var U=M[_];U!==null&&(U.lane&=-536870913)}i&=~K}r!==0&&hm(e,r,0),u!==0&&c===0&&e.tag!==0&&(e.suspendedLanes|=u&~(y&~t))}function hm(e,t,i){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-qt(t);e.entangledLanes|=t,e.entanglements[r]=e.entanglements[r]|1073741824|i&261930}function mm(e,t){var i=e.entangledLanes|=t;for(e=e.entanglements;i;){var r=31-qt(i),c=1<<r;c&t|e[r]&t&&(e[r]|=t),i&=~c}}function pm(e,t){var i=t&-t;return i=(i&42)!==0?1:Kl(i),(i&(e.suspendedLanes|t))!==0?0:i}function Kl(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function Fl(e){return e&=-e,2<e?8<e?(e&134217727)!==0?32:268435456:8:2}function fm(){var e=V.p;return e!==0?e:(e=window.event,e===void 0?32:ty(e.type))}function gm(e,t){var i=V.p;try{return V.p=e,t()}finally{V.p=i}}var Yn=Math.random().toString(36).slice(2),mt="__reactFiber$"+Yn,Nt="__reactProps$"+Yn,Ja="__reactContainer$"+Yn,Wl="__reactEvents$"+Yn,O0="__reactListeners$"+Yn,E0="__reactHandles$"+Yn,ym="__reactResources$"+Yn,Zs="__reactMarker$"+Yn;function Yl(e){delete e[mt],delete e[Nt],delete e[Wl],delete e[O0],delete e[E0]}function $a(e){var t=e[mt];if(t)return t;for(var i=e.parentNode;i;){if(t=i[Ja]||i[mt]){if(i=t.alternate,t.child!==null||i!==null&&i.child!==null)for(e=Bg(e);e!==null;){if(i=e[mt])return i;e=Bg(e)}return t}e=i,i=e.parentNode}return null}function Qa(e){if(e=e[mt]||e[Ja]){var t=e.tag;if(t===5||t===6||t===13||t===31||t===26||t===27||t===3)return e}return null}function ei(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e.stateNode;throw Error(l(33))}function Za(e){var t=e[ym];return t||(t=e[ym]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function rt(e){e[Zs]=!0}var bm=new Set,xm={};function Aa(e,t){es(e,t),es(e+"Capture",t)}function es(e,t){for(xm[e]=t,e=0;e<t.length;e++)bm.add(t[e])}var D0=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),vm={},wm={};function z0(e){return Vl.call(wm,e)?!0:Vl.call(vm,e)?!1:D0.test(e)?wm[e]=!0:(vm[e]=!0,!1)}function Oo(e,t,i){if(z0(t))if(i===null)e.removeAttribute(t);else{switch(typeof i){case"undefined":case"function":case"symbol":e.removeAttribute(t);return;case"boolean":var r=t.toLowerCase().slice(0,5);if(r!=="data-"&&r!=="aria-"){e.removeAttribute(t);return}}e.setAttribute(t,""+i)}}function Eo(e,t,i){if(i===null)e.removeAttribute(t);else{switch(typeof i){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(t);return}e.setAttribute(t,""+i)}}function Tn(e,t,i,r){if(r===null)e.removeAttribute(i);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":e.removeAttribute(i);return}e.setAttributeNS(t,i,""+r)}}function Wt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function jm(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function R0(e,t,i){var r=Object.getOwnPropertyDescriptor(e.constructor.prototype,t);if(!e.hasOwnProperty(t)&&typeof r<"u"&&typeof r.get=="function"&&typeof r.set=="function"){var c=r.get,u=r.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return c.call(this)},set:function(y){i=""+y,u.call(this,y)}}),Object.defineProperty(e,t,{enumerable:r.enumerable}),{getValue:function(){return i},setValue:function(y){i=""+y},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Xl(e){if(!e._valueTracker){var t=jm(e)?"checked":"value";e._valueTracker=R0(e,t,""+e[t])}}function km(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var i=t.getValue(),r="";return e&&(r=jm(e)?e.checked?"true":"false":e.value),e=r,e!==i?(t.setValue(e),!0):!1}function Do(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}var M0=/[\n"\\]/g;function Yt(e){return e.replace(M0,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function Jl(e,t,i,r,c,u,y,v){e.name="",y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"?e.type=y:e.removeAttribute("type"),t!=null?y==="number"?(t===0&&e.value===""||e.value!=t)&&(e.value=""+Wt(t)):e.value!==""+Wt(t)&&(e.value=""+Wt(t)):y!=="submit"&&y!=="reset"||e.removeAttribute("value"),t!=null?$l(e,y,Wt(t)):i!=null?$l(e,y,Wt(i)):r!=null&&e.removeAttribute("value"),c==null&&u!=null&&(e.defaultChecked=!!u),c!=null&&(e.checked=c&&typeof c!="function"&&typeof c!="symbol"),v!=null&&typeof v!="function"&&typeof v!="symbol"&&typeof v!="boolean"?e.name=""+Wt(v):e.removeAttribute("name")}function Nm(e,t,i,r,c,u,y,v){if(u!=null&&typeof u!="function"&&typeof u!="symbol"&&typeof u!="boolean"&&(e.type=u),t!=null||i!=null){if(!(u!=="submit"&&u!=="reset"||t!=null)){Xl(e);return}i=i!=null?""+Wt(i):"",t=t!=null?""+Wt(t):i,v||t===e.value||(e.value=t),e.defaultValue=t}r=r??c,r=typeof r!="function"&&typeof r!="symbol"&&!!r,e.checked=v?e.checked:!!r,e.defaultChecked=!!r,y!=null&&typeof y!="function"&&typeof y!="symbol"&&typeof y!="boolean"&&(e.name=y),Xl(e)}function $l(e,t,i){t==="number"&&Do(e.ownerDocument)===e||e.defaultValue===""+i||(e.defaultValue=""+i)}function ts(e,t,i,r){if(e=e.options,t){t={};for(var c=0;c<i.length;c++)t["$"+i[c]]=!0;for(i=0;i<e.length;i++)c=t.hasOwnProperty("$"+e[i].value),e[i].selected!==c&&(e[i].selected=c),c&&r&&(e[i].defaultSelected=!0)}else{for(i=""+Wt(i),t=null,c=0;c<e.length;c++){if(e[c].value===i){e[c].selected=!0,r&&(e[c].defaultSelected=!0);return}t!==null||e[c].disabled||(t=e[c])}t!==null&&(t.selected=!0)}}function Tm(e,t,i){if(t!=null&&(t=""+Wt(t),t!==e.value&&(e.value=t),i==null)){e.defaultValue!==t&&(e.defaultValue=t);return}e.defaultValue=i!=null?""+Wt(i):""}function Sm(e,t,i,r){if(t==null){if(r!=null){if(i!=null)throw Error(l(92));if(Xe(r)){if(1<r.length)throw Error(l(93));r=r[0]}i=r}i==null&&(i=""),t=i}i=Wt(t),e.defaultValue=i,r=e.textContent,r===i&&r!==""&&r!==null&&(e.value=r),Xl(e)}function ns(e,t){if(t){var i=e.firstChild;
vendor: 4,140 bytes, line 8
8if(i&&i===e.lastChild&&i.nodeType===3){i.nodeValue=t;return}}e.textContent=t}var q0=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function Am(e,t,i){var r=t.indexOf("--")===0;i==null||typeof i=="boolean"||i===""?r?e.setProperty(t,""):t==="float"?e.cssFloat="":e[t]="":r?e.setProperty(t,i):typeof i!="number"||i===0||q0.has(t)?t==="float"?e.cssFloat=i:e[t]=(""+i).trim():e[t]=i+"px"}function Cm(e,t,i){if(t!=null&&typeof t!="object")throw Error(l(62));if(e=e.style,i!=null){for(var r in i)!i.hasOwnProperty(r)||t!=null&&t.hasOwnProperty(r)||(r.indexOf("--")===0?e.setProperty(r,""):r==="float"?e.cssFloat="":e[r]="");for(var c in t)r=t[c],t.hasOwnProperty(c)&&i[c]!==r&&Am(e,c,r)}else for(var u in t)t.hasOwnProperty(u)&&Am(e,u,t[u])}function Ql(e){if(e.indexOf("-")===-1)return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var P0=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode
8-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),I0=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function zo(e){return I0.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}function Sn(){}var Zl=null;function ec(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var as=null,ss=null;function Om(e){var t=Qa(e);if(t&&(e=t.stateNode)){var i=e[Nt]||null;e:switch(e=t.stateNode,t.type){case"input":if(Jl(e,i.value,i.defaultValue,i.defaultValue,i.checked,i.defaultChecked,i.type,i.name),t=i.name,i.type==="radio"&&t!=null){for(i=e;i.parentNode;)i=i.parentNode;for(i=i.querySelectorAll('input[name="'+Yt(""+t)+'"][type="radio"]'),t=0;t<i.length;t++){var r=i[t];if(r!==e&&r.form===e.form){var c=r[Nt]||null;if(!c)throw Error(l(90));Jl(r,c.value,c.defaultValue,c.defaultValue,c.checked,c.defaultChecked,c.type,c.name)}}for(t=0;t<i.length;t++)r=i[t],r.form===e.form&&km(r)}break e;case"textarea":Tm(e,i.value,i.defaultValue);break e;case"select":t=i.value,t!=null&&ts(e,!!i.multiple,t,!1)}}}var tc=!1;function Em(e,t,i){if(tc)return e(t,i);tc=!0;try{var r=e(t);return r}finally{if(tc=!1,(as!==null||ss!==null)&&(xr(),as&&(t=as,e=ss,ss=as=null,Om(t),e)))for(t=0;t<e.length;t++)Om(e[t])}}function ti(e,t){var i=e.stateNode;if(i===null)return null;var r=i[Nt]||null;if(r===null)return null;i=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(e=e.type,r=!(e==="button"||e==="input"||e==="select"||e==="textarea")),e=!r;break e;default:e=!1}if(e)return null;if(i&&typeof i!="function")throw Error(l(231,t,typeof i));return i}var An=!(typeof window>"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),nc=!1;if(An)try{var ni={};Object.defineProperty(ni,"passive",{get:function(){nc=!0}}),window.addEventListener("test",ni,ni),window.removeEventListener("test",ni,ni)}catch{nc=!1}var Xn=null,ac=null,Ro=null;function Dm(){if(Ro)return Ro;var e,t=ac,i=t.length,r,c="value"in Xn?Xn.value:Xn.textContent,u=c.length;for(e=0;e<i&&t[e]===c[e];e++);var y=i-e;for(r=1;r<=y&&t[i-r]===c[u-r];r++);return Ro=c.slice(e,1<r?1-r:void 0)}function Mo(e){var t=e.keyCode;return"charCode"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function qo(){return!0}function zm(){return!1}function Tt(e){function t(i,r,c,u,y){this._reactName=i,this._targetInst=c,this.type=r,this.nativeEvent=u,this.target=y,this.currentTarget=null;for(var v in e)e.hasOwnProperty(v)&&(i=e[v],this[v]=i?i(u):u[v]);return this.isDefaultPrevented=(u.defaultPrevented!=null?u.defaultPrevented:u.returnValue===!1)?qo:zm,this.isPropagationStopped=zm,this}return x(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var i=this.nativeEvent;i&&(i.preventDefault?i.preventDefault():typeof i.returnValue!="unknown"&&(i.returnValue=!1),this.isDefaultPrevented=qo)},stopPropagation:function(){var i=this.nativeEvent;i&&(i.stopPropagation?i.stopPropagation():typeof i.cancelBubble!="unknown"&&(i.cancelBubble=!0),this.isPropagationStopped=qo)},persist:function(){},isPersistent:qo}),t}var Ca={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Po=Tt(Ca),ai=x({},Ca,{view:0,detail:0}),U0=Tt(ai),sc,ic,si,Io=x({},ai,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:rc,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==si&&(si&&e.type==="mousemove"?(sc=e.screenX-si.screenX,ic=e.screenY-si.screenY):ic=sc=0,si=e),sc)},movementY:function(e){return"movementY"in e?e.movementY:ic}}),Rm=Tt(Io),B0=x({},Io,{dataTransfer:0}),_0=Tt(B0),V0=x({},ai,{relatedTarget:0}),oc=Tt(V0),L0=x({},Ca,{animationName:0,elapsedTime:0,pseudoElement:0}),G0=Tt(L0),H0=x({},Ca,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),K0=Tt(H0),F0=x({},Ca,{data:0}),Mm=Tt(F0),W0={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Y0={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},X0={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function J0(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=X0[e])?!!t[e]:!1}function rc(){return J0}var $0=x({},ai,{key:function(e){if(e.key){var t=W0[e.key]||e.key;if(t!=="Unidentified")return t}
vendor: 5,186 bytes, line 8
8return e.type==="keypress"?(e=Mo(e),e===13?"Enter":String.fromCharCode(e)):e.type==="keydown"||e.type==="keyup"?Y0[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:rc,charCode:function(e){return e.type==="keypress"?Mo(e):0},keyCode:function(e){return e.type==="keydown"||e.type==="keyup"?e.keyCode:0},which:function(e){return e.type==="keypress"?Mo(e):e.type==="keydown"||e.type==="keyup"?e.keyCode:0}}),Q0=Tt($0),Z0=x({},Io,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),qm=Tt(Z0),e1=x({},ai,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:rc}),t1=Tt(e1),n1=x({},Ca,{propertyName:0,elapsedTime:0,pseudoElement:0}),a1=Tt(n1),s1=x({},Io,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),i1=Tt(s1),o1=x({},Ca,{newState:0,oldState:0}),r1=Tt(o1),l1=[9,13,27,32],lc=An&&"CompositionEvent"in window,ii=null;An&&"documentMode"in document&&(ii=document.documentMode);var c1=An&&"TextEvent"in window&&!ii,Pm=An&&(!lc||ii&&8<ii&&11>=ii),Im=" ",Um=!1;function Bm(e,t){switch(e){case"keyup":return l1.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function _m(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var is=!1;function d1(e,t){switch(e){case"compositionend":return _m(t);case"keypress":return t.which!==32?null:(Um=!0,Im);case"textInput":return e=t.data,e===Im&&Um?null:e;default:return null}}function u1(e,t){if(is)return e==="compositionend"||!lc&&Bm(e,t)?(e=Dm(),Ro=ac=Xn=null,is=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Pm&&t.locale!=="ko"?null:t.data;default:return null}}var h1={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Vm(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t==="input"?!!h1[e.type]:t==="textarea"}function Lm(e,t,i,r){as?ss?ss.push(r):ss=[r]:as=r,t=Sr(t,"onChange"),0<t.length&&(i=new Po("onChange","change",null,i,r),e.push({event:i,listeners:t}))}var oi=null,ri=null;function m1(e){Tg(e,0)}function Uo(e){var t=ei(e);if(km(t))return e}function Gm(e,t){if(e==="change")return t}var Hm=!1;if(An){var cc;if(An){var dc="oninput"in document;if(!dc){var Km=document.createElement("div");Km.setAttribute("oninput","return;"),dc=typeof Km.oninput=="function"}cc=dc}else cc=!1;Hm=cc&&(!document.documentMode||9<document.documentMode)}function Fm(){oi&&(oi.detachEvent("onpropertychange",Wm),ri=oi=null)}function Wm(e){if(e.propertyName==="value"&&Uo(ri)){var t=[];Lm(t,ri,e,ec(e)),Em(m1,t)}}function p1(e,t,i){e==="focusin"?(Fm(),oi=t,ri=i,oi.attachEvent("onpropertychange",Wm)):e==="focusout"&&Fm()}function f1(e){if(e==="selectionchange"||e==="keyup"||e==="keydown")return Uo(ri)}function g1(e,t){if(e==="click")return Uo(t)}function y1(e,t){if(e==="input"||e==="change")return Uo(t)}function b1(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var Pt=typeof Object.is=="function"?Object.is:b1;function li(e,t){if(Pt(e,t))return!0;if(typeof e!="object"||e===null||typeof t!="object"||t===null)return!1;var i=Object.keys(e),r=Object.keys(t);if(i.length!==r.length)return!1;for(r=0;r<i.length;r++){var c=i[r];if(!Vl.call(t,c)||!Pt(e[c],t[c]))return!1}return!0}function Ym(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Xm(e,t){var i=Ym(e);e=0;for(var r;i;){if(i.nodeType===3){if(r=e+i.textContent.length,e<=t&&r>=t)return{node:i,offset:t-e};e=r}e:{for(;i;){if(i.nextSibling){i=i.nextSibling;break e}i=i.parentNode}i=void 0}i=Ym(i)}}function Jm(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Jm(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function $m(e){e=e!=null&&e.ownerDocument!=null&&e.ownerDocument.defaultView!=null?e.ownerDocument.defaultView:window;for(var t=Do(e.document);t instanceof e.HTMLIFrameElement;){try{var i=typeof t.contentWindow.location.href=="string"}catch{i=!1}if(i)e=t.contentWindow;else break;t=Do(e.document)}return t}function uc(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}var x1=An&&"documentMode"in document&&11>=document.documentMode,os=null,hc=null,ci=null,mc=!1;function Qm(e,t,i){var r=i.window===i?i.document:i.nodeType===9?i:i.ownerDocument;mc||os==null||os!==Do(r)||(r=os,"selectionStart"in r&&uc(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focu
vendor: 14,651 bytes, line 8
8sNode:r.focusNode,focusOffset:r.focusOffset}),ci&&li(ci,r)||(ci=r,r=Sr(hc,"onSelect"),0<r.length&&(t=new Po("onSelect","select",null,t,i),e.push({event:t,listeners:r}),t.target=os)))}function Oa(e,t){var i={};return i[e.toLowerCase()]=t.toLowerCase(),i["Webkit"+e]="webkit"+t,i["Moz"+e]="moz"+t,i}var rs={animationend:Oa("Animation","AnimationEnd"),animationiteration:Oa("Animation","AnimationIteration"),animationstart:Oa("Animation","AnimationStart"),transitionrun:Oa("Transition","TransitionRun"),transitionstart:Oa("Transition","TransitionStart"),transitioncancel:Oa("Transition","TransitionCancel"),transitionend:Oa("Transition","TransitionEnd")},pc={},Zm={};An&&(Zm=document.createElement("div").style,"AnimationEvent"in window||(delete rs.animationend.animation,delete rs.animationiteration.animation,delete rs.animationstart.animation),"TransitionEvent"in window||delete rs.transitionend.transition);function Ea(e){if(pc[e])return pc[e];if(!rs[e])return e;var t=rs[e],i;for(i in t)if(t.hasOwnProperty(i)&&i in Zm)return pc[e]=t[i];return e}var ep=Ea("animationend"),tp=Ea("animationiteration"),np=Ea("animationstart"),v1=Ea("transitionrun"),w1=Ea("transitionstart"),j1=Ea("transitioncancel"),ap=Ea("transitionend"),sp=new Map,fc="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");fc.push("scrollEnd");function rn(e,t){sp.set(e,t),Aa(t,[e])}var Bo=typeof reportError=="function"?reportError:function(e){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof e=="object"&&e!==null&&typeof e.message=="string"?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",e);return}console.error(e)},Xt=[],ls=0,gc=0;function _o(){for(var e=ls,t=gc=ls=0;t<e;){var i=Xt[t];Xt[t++]=null;var r=Xt[t];Xt[t++]=null;var c=Xt[t];Xt[t++]=null;var u=Xt[t];if(Xt[t++]=null,r!==null&&c!==null){var y=r.pending;y===null?c.next=c:(c.next=y.next,y.next=c),r.pending=c}u!==0&&ip(i,c,u)}}function Vo(e,t,i,r){Xt[ls++]=e,Xt[ls++]=t,Xt[ls++]=i,Xt[ls++]=r,gc|=r,e.lanes|=r,e=e.alternate,e!==null&&(e.lanes|=r)}function yc(e,t,i,r){return Vo(e,t,i,r),Lo(e)}function Da(e,t){return Vo(e,null,null,t),Lo(e)}function ip(e,t,i){e.lanes|=i;var r=e.alternate;r!==null&&(r.lanes|=i);for(var c=!1,u=e.return;u!==null;)u.childLanes|=i,r=u.alternate,r!==null&&(r.childLanes|=i),u.tag===22&&(e=u.stateNode,e===null||e._visibility&1||(c=!0)),e=u,u=u.return;return e.tag===3?(u=e.stateNode,c&&t!==null&&(c=31-qt(i),e=u.hiddenUpdates,r=e[c],r===null?e[c]=[t]:r.push(t),t.lane=i|536870912),u):null}function Lo(e){if(50<Di)throw Di=0,Sd=null,Error(l(185));for(var t=e.return;t!==null;)e=t,t=e.return;return e.tag===3?e.stateNode:null}var cs={};function k1(e,t,i,r){this.tag=e,this.key=i,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function It(e,t,i,r){return new k1(e,t,i,r)}function bc(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Cn(e,t){var i=e.alternate;return i===null?(i=It(e.tag,t,e.key,e.mode),i.elementType=e.elementType,i.type=e.type,i.stateNode=e.stateNode,i.alternate=e,e.alternate=i):(i.pendingProps=t,i.type=e.type,i.flags=0,i.subtreeFlags=0,i.deletions=null),i.flags=e.flags&65011712,i.childLanes=e.childLanes,i.lanes=e.lanes,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,t=e.dependencies,i.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},i.sibling=e.sibling,i.index=e.index,i.ref=e.ref,i.refCleanup=e.refCleanup,i}function op(e,t){e.flags&=65011714;var i=e.alternate;return i===null?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=i.childLanes,e.lanes=i.lanes,e.child=i.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=i.memoizedProps,e.memoizedState=i.memoizedState,e.updateQueue=i.updateQueue,e.type=i.type,t=i.dependencies,e.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function Go(e,t,i,r,c,u){var y=0;if(r=e,typeof e=="function")bc(e)&&(y=1);else if(typeof e=="string")y=Cj(e,i,Y.current)?26:e==="html"||e==="head"||e==="body"?27:5;else e:switch(e){case Q:return e=It(31,i,t,c),e.elementType=Q,e.lanes=u,e;case O:return za(i.children,c,u,t);case D:y=8,c|=24;break;case E:return e=It(12,i,t,c|2),e.elementType=E,e.lanes=u,e;case W:return e=It(13,i,t,c),e.elementType=W,e.lanes=u,e;case Z:return e=It(19,i,t,c),e.elementType=Z,e.lanes=u,e;default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case I:y=10;break e;case P:y=9;break e;case F:y=11;break e;case X:y=14;break e;case J:y=16,r=null;break e}y=29,i=Error(l(130,e===null?"null":typeof e,"")),r=null}return t=It(y,i,t,c),t.elementType=e,t.type=r,t.lanes=u,t}function za(e,t,i,r){return e=It(7,e,r,t),e.lanes=i,e}function xc(e,t,i){return e=It(6,e,null,t),e.lanes=i,e}function rp(e){var t=It(18,null,null,0);return t.stateNode=e,t}function vc(e,t,i){return t=It(4,e.children!==null?e.children:[],e.key,t),t.lanes=i,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var lp=new WeakMap;function Jt(e,t){if(typeof e=="object"&&e!==null){var i=lp.get(e);return i!==void 0?i:(t={value:e,source:t,stack:rm(t)},lp.set(e,t),t)}return{value:e,source:t,stack:rm(t)}}var ds=[],us=0,Ho=null,di=0,$t=[],Qt=0,Jn=null,bn=1,xn="";function On(e,t){ds[us++]=di,ds[us++]=Ho,Ho=e,di=t}function cp(e,t,i){$t[Qt++]=bn,$t[Qt++]=xn,$t[Qt++]=Jn,Jn=e;var r=bn;e=xn;var c=32-qt(r)-1;r&=~(1<<c),i+=1;var u=32-qt(t)+c;if(30<u){var y=c-c%5;u=(r&(1<<y)-1).toString(32),r>>=y,c-=y,bn=1<<32-qt(t)+c|i<<c|r,xn=u+e}else bn=1<<u|i<<c|r,xn=e}function wc(e){e.return!==null&&(On(e,1),cp(e,1,0))}function jc(e){for(;e===Ho;)Ho=ds[--us],ds[us]=null,di=ds[--us],ds[us]=null;for(;e===Jn;)Jn=$t[--Qt],$t[Qt]=null,xn=$t[--Qt],$t[Qt]=null,bn=$t[--Qt],$t[Qt]=null}function dp(e,t){$t[Qt++]=bn,$t[Qt++]=xn,$t[Qt++]=Jn,bn=t.id,xn=t.overflow,Jn=e}var pt=null,_e=null,we=!1,$n=null,Zt=!1,kc=Error(l(519));function Qn(e){var t=Error(l(418,1<arguments.length&&arguments[1]!==void 0&&arguments[1]?"text":"HTML",""));throw ui(Jt(t,e)),kc}function up(e){var t=e.stateNode,i=e.type,r=e.memoizedProps;switch(t[mt]=e,t[Nt]=r,i){case"dialog":be("cancel",t),be("close",t);break;case"iframe":case"object":case"embed":be("load",t);break;case"video":case"audio":for(i=0;i<Ri.length;i++)be(Ri[i],t);break;case"source":be("error",t);break;case"img":case"image":case"link":be("error",t),be("load",t);break;case"details":be("toggle",t);break;case"input":be("invalid",t),Nm(t,r.value,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name,!0);break;case"select":be("invalid",t);break;case"textarea":be("invalid",t),Sm(t,r.value,r.defaultValue,r.children)}i=r.children,typeof i!="string"&&typeof i!="number"&&typeof i!="bigint"||t.textContent===""+i||r.suppressHydrationWarning===!0||Og(t.textContent,i)?(r.popover!=null&&(be("beforetoggle",t),be("toggle",t)),r.onScroll!=null&&be("scroll",t),r.onScrollEnd!=null&&be("scrollend",t),r.onClick!=null&&(t.onclick=Sn),t=!0):t=!1,t||Qn(e,!0)}function hp(e){for(pt=e.return;pt;)switch(pt.tag){case 5:case 31:case 13:Zt=!1;return;case 27:case 3:Zt=!0;return;default:pt=pt.return}}function hs(e){if(e!==pt)return!1;if(!we)return hp(e),we=!0,!1;var t=e.tag,i;if((i=t!==3&&t!==27)&&((i=t===5)&&(i=e.type,i=!(i!=="form"&&i!=="button")||Vd(e.type,e.memoizedProps)),i=!i),i&&_e&&Qn(e),hp(e),t===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(l(317));_e=Ug(e)}else if(t===31){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(l(317));_e=Ug(e)}else t===27?(t=_e,ha(e.type)?(e=Fd,Fd=null,_e=e):_e=t):_e=pt?tn(e.stateNode.nextSibling):null;return!0}function Ra(){_e=pt=null,we=!1}function Nc(){var e=$n;return e!==null&&(Ot===null?Ot=e:Ot.push.apply(Ot,e),$n=null),e}function ui(e){$n===null?$n=[e]:$n.push(e)}var Tc=k(null),Ma=null,En=null;function Zn(e,t,i){H(Tc,t._currentValue),t._currentValue=i}function Dn(e){e._currentValue=Tc.current,q(Tc)}function Sc(e,t,i){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===i)break;e=e.return}}function Ac(e,t,i,r){var c=e.child;for(c!==null&&(c.return=e);c!==null;){var u=c.dependencies;if(u!==null){var y=c.child;u=u.firstContext;e:for(;u!==null;){var v=u;u=c;for(var N=0;N<t.length;N++)if(v.context===t[N]){u.lanes|=i,v=u.alternate,v!==null&&(v.lanes|=i),Sc(u.return,i,e),r||(y=null);break e}u=v.next}}else if(c.tag===18){if(y=c.return,y===null)throw Error(l(341));y.lanes|=i,u=y.alternate,u!==null&&(u.lanes|=i),Sc(y,i,e),y=null}else y=c.child;if(y!==null)y.return=c;else for(y=c;y!==null;){if(y===e){y=null;break}if(c=y.sibling,c!==null){c.return=y.return,y=c;break}y=y.return}c=y}}function ms(e,t,i,r){e=null;for(var c=t,u=!1;c!==null;){if(!u){if((c.flags&524288)!==0)u=!0;else if((c.flags&262144)!==0)break}if(c.tag===10){var y=c.alternate;if(y===null)throw Error(l(387));if(y=y.memoizedProps,y!==null){var v=c.type;Pt(c.pendingProps.value,y.value)||(e!==null?e.push(v):e=[v])}}else if(c===de.current){if(y=c.alternate,y===null)throw Error(l(387));y.memoizedState.memoizedState!==c.memoizedState.memoizedState&&(e!==null?e.push(Ui):e=[Ui])}c=c.return}e!==null&&Ac(t,e,i,r),t.flags|=262144}function Ko(e){for(e=e.firstContext;e!==null;){if(!Pt(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function qa(e){Ma=e,En=null,e=e.dependencies,e!==null&&(e.firstContext=null)}function ft(e){return mp(Ma,e)}function Fo(e,t){return Ma===null&&qa(e),mp(e,t)}function mp(e,t){var i=t._currentValue;if(t={context:t,memoizedValue:i,next:null},En===null){if(e===null)throw Error(l(308));En=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else En=En.next=t;return i}var N1=typeof AbortController<"u"?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(i,r){e.push(r)}};this.abort=function(){t.aborted=!0,e.forEach(function(i){return i()})}},T1=n.unstable_scheduleCallback,S1=n.unstable_NormalPriority,et={$$typeof:I,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Cc(){return{controller:new N1,data:new Map,refCount:0}}function hi(e){e.refCount--,e.refCount===0&&T1(S1,function(){e.controller.abort()})}var mi=null,Oc=0,ps=0,fs=null;function A1(e,t){if(mi===null){var i=mi=[];Oc=0,ps=zd(),fs={status:"pending",value:void 0,then:function(r){i.push(r)}}}return Oc++,t.then(pp,pp),t}function pp(){if(--Oc===0&&mi!==null){fs!==null&&(fs.status="fulfilled");var e=mi;mi=null,ps=0,fs=null;for(var t=0;t<e.length;t++)(0,e[t])()}}function C1(e,t){var i=[],r={status:"pending",value:null,reason:null,then:function(c){i.push(c)}};return e.then(function(){r.status="fulfilled",r.value=t;for(var c=0;c<i.length;c++)(0,i[c])(t)},function(c){for(r.status="rejected",r.reason=c,c=0;c<i.length;c++)(0,i[c])(void 0)}),r}var fp=B.S;B.S=function(e,t){Zf=Rt(),typeof t=="object"&&t!==null&&typeof t.then=="function"&&A1(e,t),fp!==null&&fp(e,t)};var Pa=k(null);function Ec(){var e=Pa.current;return e!==null?e:Ue.pooledCache}function Wo(e,t){t===null?H(Pa,Pa.current):H(Pa,t.pool)}function gp(){var e=Ec();return e===null?null:{parent:et._currentValue,pool:e}}var gs=Error(l(460)),Dc=Error(l(474)),Yo=Error(l(542)),Xo={then:function(){}};function yp(e){return e=e.status,e==="fulfilled"||e==="rejected"}function bp(e,t,i){switch(i=e[i],i===void 0?e.push(t):i!==t&&(t.then(Sn,Sn),t=i),t.status){case"fulfilled":return t.value;case"rejected":throw e=t.reason,vp(e),e;default:if(typeof t.status=="string")t.then(Sn,Sn);else{if(e=Ue,e!==null&&100<e.shellSuspendCounter)throw Error(l(482));e=t,e.status="pending",e.then(function(r){if(t.status==="pending"){var c=t;c.status="fulfilled",c.value=r}},function(r){if(t.status==="pending"){var c=t;c.status="rejected",c.reason=r}})}switch(t.status){case"fulfilled":return t.value;case"rejected":throw e=t.reason,vp(e),e}throw Ua=t,gs}}function Ia(e){try{var t=e._init;return t(e._payload)}catch(i){throw i!==null&&typeof i=="object"&&typeof i.then=="function"?(Ua=i,gs):i}}var Ua=null;function xp(){if(Ua===null)throw Error(l(459));var e=Ua;return Ua=null,e}function vp(e){if(e===gs||e===Yo)throw Error(l(483))}var ys=null,pi=0;function Jo(e){var t=pi;return pi+=1,ys===null&&(ys=[]),bp(ys,e,t)}function fi(e,t){t=t.props.ref,e.ref=t!==void 0?t:null}function $o(e,t){throw t.$$typeof===w?Error(l(525)):(e=Object.prototype.toString.call(t),Error(l(31,e==="[object Object]"?"object with keys {"+Object.keys(t).join(", ")+"}":e)))}function wp(e){function t(C,A){if(e){var z=C.deletions;z===null?(C.deletions=[A],C.flags|=16):z.push(A)}}function i(C,A){if(!e)return null;for(;A!==null;)t(C,A),A=A.sibling;return null}function r(C){for(var A=new Map;C!==null;)C.key!==null?A.set(C.key,C):A.set(C.index,C),C=C.sibling;return A}function c(C,A){return C=Cn(C,A),C.index=0,C.sibling=null,C}function u(C,A,z){return C.index=z,e?(z=C.alternate,z!==null?(z=z.index,z<A?(C.flags|=67108866,A):z):(C.flags|=67108866,A)):(C.flags|=1048576,A)}function y(C){return e&&C.alternate===null&&(C.flags|=67108866),C}function v(C,A,z,G){return A===null||A.tag!==6?(A=xc(z,C.mode,G),A.return=C,A):(A=c(A,z),A.return=C,A)}function N(C,A,z,G){var re=z.type;return re===O?_(C,A,z.props.children,G,z.key):A!==null&&(A.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===J&&Ia(re)===A.type)?(A=c(A,z.props),fi(A,z),A.return=C,A):(A=Go(z.type,z.key,z.props,null,C.mode,G),fi(A,z),A.return=C,A)}function R(C,A,z,G){return A===null||A.tag!==4||A.stateNode.containerInfo!==z.containerInfo||A.stateNode.implementation!==z.implementation?(A=vc(z,C.mode,G),A.return=C,A):(A
vendor: 5,238 bytes, line 8
8=c(A,z.children||[]),A.return=C,A)}function _(C,A,z,G,re){return A===null||A.tag!==7?(A=za(z,C.mode,G,re),A.return=C,A):(A=c(A,z),A.return=C,A)}function K(C,A,z){if(typeof A=="string"&&A!==""||typeof A=="number"||typeof A=="bigint")return A=xc(""+A,C.mode,z),A.return=C,A;if(typeof A=="object"&&A!==null){switch(A.$$typeof){case S:return z=Go(A.type,A.key,A.props,null,C.mode,z),fi(z,A),z.return=C,z;case T:return A=vc(A,C.mode,z),A.return=C,A;case J:return A=Ia(A),K(C,A,z)}if(Xe(A)||je(A))return A=za(A,C.mode,z,null),A.return=C,A;if(typeof A.then=="function")return K(C,Jo(A),z);if(A.$$typeof===I)return K(C,Fo(C,A),z);$o(C,A)}return null}function M(C,A,z,G){var re=A!==null?A.key:null;if(typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint")return re!==null?null:v(C,A,""+z,G);if(typeof z=="object"&&z!==null){switch(z.$$typeof){case S:return z.key===re?N(C,A,z,G):null;case T:return z.key===re?R(C,A,z,G):null;case J:return z=Ia(z),M(C,A,z,G)}if(Xe(z)||je(z))return re!==null?null:_(C,A,z,G,null);if(typeof z.then=="function")return M(C,A,Jo(z),G);if(z.$$typeof===I)return M(C,A,Fo(C,z),G);$o(C,z)}return null}function U(C,A,z,G,re){if(typeof G=="string"&&G!==""||typeof G=="number"||typeof G=="bigint")return C=C.get(z)||null,v(A,C,""+G,re);if(typeof G=="object"&&G!==null){switch(G.$$typeof){case S:return C=C.get(G.key===null?z:G.key)||null,N(A,C,G,re);case T:return C=C.get(G.key===null?z:G.key)||null,R(A,C,G,re);case J:return G=Ia(G),U(C,A,z,G,re)}if(Xe(G)||je(G))return C=C.get(z)||null,_(A,C,G,re,null);if(typeof G.then=="function")return U(C,A,z,Jo(G),re);if(G.$$typeof===I)return U(C,A,z,Fo(A,G),re);$o(A,G)}return null}function te(C,A,z,G){for(var re=null,Se=null,ae=A,pe=A=0,ve=null;ae!==null&&pe<z.length;pe++){ae.index>pe?(ve=ae,ae=null):ve=ae.sibling;var Ae=M(C,ae,z[pe],G);if(Ae===null){ae===null&&(ae=ve);break}e&&ae&&Ae.alternate===null&&t(C,ae),A=u(Ae,A,pe),Se===null?re=Ae:Se.sibling=Ae,Se=Ae,ae=ve}if(pe===z.length)return i(C,ae),we&&On(C,pe),re;if(ae===null){for(;pe<z.length;pe++)ae=K(C,z[pe],G),ae!==null&&(A=u(ae,A,pe),Se===null?re=ae:Se.sibling=ae,Se=ae);return we&&On(C,pe),re}for(ae=r(ae);pe<z.length;pe++)ve=U(ae,C,pe,z[pe],G),ve!==null&&(e&&ve.alternate!==null&&ae.delete(ve.key===null?pe:ve.key),A=u(ve,A,pe),Se===null?re=ve:Se.sibling=ve,Se=ve);return e&&ae.forEach(function(ya){return t(C,ya)}),we&&On(C,pe),re}function ce(C,A,z,G){if(z==null)throw Error(l(151));for(var re=null,Se=null,ae=A,pe=A=0,ve=null,Ae=z.next();ae!==null&&!Ae.done;pe++,Ae=z.next()){ae.index>pe?(ve=ae,ae=null):ve=ae.sibling;var ya=M(C,ae,Ae.value,G);if(ya===null){ae===null&&(ae=ve);break}e&&ae&&ya.alternate===null&&t(C,ae),A=u(ya,A,pe),Se===null?re=ya:Se.sibling=ya,Se=ya,ae=ve}if(Ae.done)return i(C,ae),we&&On(C,pe),re;if(ae===null){for(;!Ae.done;pe++,Ae=z.next())Ae=K(C,Ae.value,G),Ae!==null&&(A=u(Ae,A,pe),Se===null?re=Ae:Se.sibling=Ae,Se=Ae);return we&&On(C,pe),re}for(ae=r(ae);!Ae.done;pe++,Ae=z.next())Ae=U(ae,C,pe,Ae.value,G),Ae!==null&&(e&&Ae.alternate!==null&&ae.delete(Ae.key===null?pe:Ae.key),A=u(Ae,A,pe),Se===null?re=Ae:Se.sibling=Ae,Se=Ae);return e&&ae.forEach(function(Bj){return t(C,Bj)}),we&&On(C,pe),re}function Pe(C,A,z,G){if(typeof z=="object"&&z!==null&&z.type===O&&z.key===null&&(z=z.props.children),typeof z=="object"&&z!==null){switch(z.$$typeof){case S:e:{for(var re=z.key;A!==null;){if(A.key===re){if(re=z.type,re===O){if(A.tag===7){i(C,A.sibling),G=c(A,z.props.children),G.return=C,C=G;break e}}else if(A.elementType===re||typeof re=="object"&&re!==null&&re.$$typeof===J&&Ia(re)===A.type){i(C,A.sibling),G=c(A,z.props),fi(G,z),G.return=C,C=G;break e}i(C,A);break}else t(C,A);A=A.sibling}z.type===O?(G=za(z.props.children,C.mode,G,z.key),G.return=C,C=G):(G=Go(z.type,z.key,z.props,null,C.mode,G),fi(G,z),G.return=C,C=G)}return y(C);case T:e:{for(re=z.key;A!==null;){if(A.key===re)if(A.tag===4&&A.stateNode.containerInfo===z.containerInfo&&A.stateNode.implementation===z.implementation){i(C,A.sibling),G=c(A,z.children||[]),G.return=C,C=G;break e}else{i(C,A);break}else t(C,A);A=A.sibling}G=vc(z,C.mode,G),G.return=C,C=G}return y(C);case J:return z=Ia(z),Pe(C,A,z,G)}if(Xe(z))return te(C,A,z,G);if(je(z)){if(re=je(z),typeof re!="function")throw Error(l(150));return z=re.call(z),ce(C,A,z,G)}if(typeof z.then=="function")return Pe(C,A,Jo(z),G);if(z.$$typeof===I)return Pe(C,A,Fo(C,z),G);$o(C,z)}return typeof z=="string"&&z!==""||typeof z=="number"||typeof z=="bigint"?(z=""+z,A!==null&&A.tag===6?(i(C,A.sibling),G=c(A,z),G.return=C,C=G):(i(C,A),G=xc(z,C.mode,G),G.return=C,C=G),y(C)):i(C,A)}return function(C,A,z,G){try{pi=0;var re=Pe(C,A,z,G);return ys=null,re}catch(ae){if(ae===gs||ae===Yo)throw ae;var Se=It(29,ae,null,C.mode);return Se.lanes=G,Se.return=C,Se}}}var Ba=wp(!0),jp=wp(!1),ea=!1;function zc(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Rc(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function ta(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function na(e,t,i){var r=e.updateQueue;if(r===null)return null;
vendor: 4,677 bytes, line 8
8if(r=r.shared,(Oe&2)!==0){var c=r.pending;return c===null?t.next=t:(t.next=c.next,c.next=t),r.pending=t,t=Lo(e),ip(e,null,i),t}return Vo(e,r,t,i),Lo(e)}function gi(e,t,i){if(t=t.updateQueue,t!==null&&(t=t.shared,(i&4194048)!==0)){var r=t.lanes;r&=e.pendingLanes,i|=r,t.lanes=i,mm(e,i)}}function Mc(e,t){var i=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,i===r)){var c=null,u=null;if(i=i.firstBaseUpdate,i!==null){do{var y={lane:i.lane,tag:i.tag,payload:i.payload,callback:null,next:null};u===null?c=u=y:u=u.next=y,i=i.next}while(i!==null);u===null?c=u=t:u=u.next=t}else c=u=t;i={baseState:r.baseState,firstBaseUpdate:c,lastBaseUpdate:u,shared:r.shared,callbacks:r.callbacks},e.updateQueue=i;return}e=i.lastBaseUpdate,e===null?i.firstBaseUpdate=t:e.next=t,i.lastBaseUpdate=t}var qc=!1;function yi(){if(qc){var e=fs;if(e!==null)throw e}}function bi(e,t,i,r){qc=!1;var c=e.updateQueue;ea=!1;var u=c.firstBaseUpdate,y=c.lastBaseUpdate,v=c.shared.pending;if(v!==null){c.shared.pending=null;var N=v,R=N.next;N.next=null,y===null?u=R:y.next=R,y=N;var _=e.alternate;_!==null&&(_=_.updateQueue,v=_.lastBaseUpdate,v!==y&&(v===null?_.firstBaseUpdate=R:v.next=R,_.lastBaseUpdate=N))}if(u!==null){var K=c.baseState;y=0,_=R=N=null,v=u;do{var M=v.lane&-536870913,U=M!==v.lane;if(U?(xe&M)===M:(r&M)===M){M!==0&&M===ps&&(qc=!0),_!==null&&(_=_.next={lane:0,tag:v.tag,payload:v.payload,callback:null,next:null});e:{var te=e,ce=v;M=t;var Pe=i;switch(ce.tag){case 1:if(te=ce.payload,typeof te=="function"){K=te.call(Pe,K,M);break e}K=te;break e;case 3:te.flags=te.flags&-65537|128;case 0:if(te=ce.payload,M=typeof te=="function"?te.call(Pe,K,M):te,M==null)break e;K=x({},K,M);break e;case 2:ea=!0}}M=v.callback,M!==null&&(e.flags|=64,U&&(e.flags|=8192),U=c.callbacks,U===null?c.callbacks=[M]:U.push(M))}else U={lane:M,tag:v.tag,payload:v.payload,callback:v.callback,next:null},_===null?(R=_=U,N=K):_=_.next=U,y|=M;if(v=v.next,v===null){if(v=c.shared.pending,v===null)break;U=v,v=U.next,U.next=null,c.lastBaseUpdate=U,c.shared.pending=null}}while(!0);_===null&&(N=K),c.baseState=N,c.firstBaseUpdate=R,c.lastBaseUpdate=_,u===null&&(c.shared.lanes=0),ra|=y,e.lanes=y,e.memoizedState=K}}function kp(e,t){if(typeof e!="function")throw Error(l(191,e));e.call(t)}function Np(e,t){var i=e.callbacks;if(i!==null)for(e.callbacks=null,e=0;e<i.length;e++)kp(i[e],t)}var bs=k(null),Qo=k(0);function Tp(e,t){e=_n,H(Qo,e),H(bs,t),_n=e|t.baseLanes}function Pc(){H(Qo,_n),H(bs,bs.current)}function Ic(){_n=Qo.current,q(bs),q(Qo)}var Ut=k(null),en=null;function aa(e){var t=e.alternate;H(Je,Je.current&1),H(Ut,e),en===null&&(t===null||bs.current!==null||t.memoizedState!==null)&&(en=e)}function Uc(e){H(Je,Je.current),H(Ut,e),en===null&&(en=e)}function Sp(e){e.tag===22?(H(Je,Je.current),H(Ut,e),en===null&&(en=e)):sa()}function sa(){H(Je,Je.current),H(Ut,Ut.current)}function Bt(e){q(Ut),en===e&&(en=null),q(Je)}var Je=k(0);function Zo(e){for(var t=e;t!==null;){if(t.tag===13){var i=t.memoizedState;if(i!==null&&(i=i.dehydrated,i===null||Hd(i)||Kd(i)))return t}else if(t.tag===19&&(t.memoizedProps.revealOrder==="forwards"||t.memoizedProps.revealOrder==="backwards"||t.memoizedProps.revealOrder==="unstable_legacy-backwards"||t.memoizedProps.revealOrder==="together")){if((t.flags&128)!==0)return t}else if(t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}var zn=0,me=null,Me=null,tt=null,er=!1,xs=!1,_a=!1,tr=0,xi=0,vs=null,O1=0;function Fe(){throw Error(l(321))}function Bc(e,t){if(t===null)return!1;for(var i=0;i<t.length&&i<e.length;i++)if(!Pt(e[i],t[i]))return!1;return!0}function _c(e,t,i,r,c,u){return zn=u,me=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,B.H=e===null||e.memoizedState===null?df:td,_a=!1,u=i(r,c),_a=!1,xs&&(u=Cp(t,i,r,c)),Ap(e),u}function Ap(e){B.H=ji;var t=Me!==null&&Me.next!==null;if(zn=0,tt=Me=me=null,er=!1,xi=0,vs=null,t)throw Error(l(300));e===null||nt||(e=e.dependencies,e!==null&&Ko(e)&&(nt=!0))}function Cp(e,t,i,r){me=e;var c=0;do{if(xs&&(vs=null),xi=0,xs=!1,25<=c)throw Error(l(301));if(c+=1,tt=Me=null,e.updateQueue!=null){var u=e.updateQueue;u.lastEffect=null,u.events=null,u.stores=null,u.memoCache!=null&&(u.memoCache.index=0)}B.H=uf,u=t(i,r)}while(xs);return u}function E1(){var e=B.H,t=e.useState()[0];return t=typeof t.then=="function"?vi(t):t,e=e.useState()[0],(Me!==null?Me.memoizedState:null)!==e&&(me.flags|=1024),t}function Vc(){var e=tr!==0;return tr=0,e}function Lc(e,t,i){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~i}function Gc(e){if(er){for(e=e.memoizedState;e!==null;){var t=e.queue;
vendor: 4,267 bytes, line 8
8t!==null&&(t.pending=null),e=e.next}er=!1}zn=0,tt=Me=me=null,xs=!1,xi=tr=0,vs=null}function vt(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return tt===null?me.memoizedState=tt=e:tt=tt.next=e,tt}function $e(){if(Me===null){var e=me.alternate;e=e!==null?e.memoizedState:null}else e=Me.next;var t=tt===null?me.memoizedState:tt.next;if(t!==null)tt=t,Me=e;else{if(e===null)throw me.alternate===null?Error(l(467)):Error(l(310));Me=e,e={memoizedState:Me.memoizedState,baseState:Me.baseState,baseQueue:Me.baseQueue,queue:Me.queue,next:null},tt===null?me.memoizedState=tt=e:tt=tt.next=e}return tt}function nr(){return{lastEffect:null,events:null,stores:null,memoCache:null}}function vi(e){var t=xi;return xi+=1,vs===null&&(vs=[]),e=bp(vs,e,t),t=me,(tt===null?t.memoizedState:tt.next)===null&&(t=t.alternate,B.H=t===null||t.memoizedState===null?df:td),e}function ar(e){if(e!==null&&typeof e=="object"){if(typeof e.then=="function")return vi(e);if(e.$$typeof===I)return ft(e)}throw Error(l(438,String(e)))}function Hc(e){var t=null,i=me.updateQueue;if(i!==null&&(t=i.memoCache),t==null){var r=me.alternate;r!==null&&(r=r.updateQueue,r!==null&&(r=r.memoCache,r!=null&&(t={data:r.data.map(function(c){return c.slice()}),index:0})))}if(t==null&&(t={data:[],index:0}),i===null&&(i=nr(),me.updateQueue=i),i.memoCache=t,i=t.data[t.index],i===void 0)for(i=t.data[t.index]=Array(e),r=0;r<e;r++)i[r]=ue;return t.index++,i}function Rn(e,t){return typeof t=="function"?t(e):t}function sr(e){var t=$e();return Kc(t,Me,e)}function Kc(e,t,i){var r=e.queue;if(r===null)throw Error(l(311));r.lastRenderedReducer=i;var c=e.baseQueue,u=r.pending;if(u!==null){if(c!==null){var y=c.next;c.next=u.next,u.next=y}t.baseQueue=c=u,r.pending=null}if(u=e.baseState,c===null)e.memoizedState=u;else{t=c.next;var v=y=null,N=null,R=t,_=!1;do{var K=R.lane&-536870913;if(K!==R.lane?(xe&K)===K:(zn&K)===K){var M=R.revertLane;if(M===0)N!==null&&(N=N.next={lane:0,revertLane:0,gesture:null,action:R.action,hasEagerState:R.hasEagerState,eagerState:R.eagerState,next:null}),K===ps&&(_=!0);else if((zn&M)===M){R=R.next,M===ps&&(_=!0);continue}else K={lane:0,revertLane:R.revertLane,gesture:null,action:R.action,hasEagerState:R.hasEagerState,eagerState:R.eagerState,next:null},N===null?(v=N=K,y=u):N=N.next=K,me.lanes|=M,ra|=M;K=R.action,_a&&i(u,K),u=R.hasEagerState?R.eagerState:i(u,K)}else M={lane:K,revertLane:R.revertLane,gesture:R.gesture,action:R.action,hasEagerState:R.hasEagerState,eagerState:R.eagerState,next:null},N===null?(v=N=M,y=u):N=N.next=M,me.lanes|=K,ra|=K;R=R.next}while(R!==null&&R!==t);if(N===null?y=u:N.next=v,!Pt(u,e.memoizedState)&&(nt=!0,_&&(i=fs,i!==null)))throw i;e.memoizedState=u,e.baseState=y,e.baseQueue=N,r.lastRenderedState=u}return c===null&&(r.lanes=0),[e.memoizedState,r.dispatch]}function Fc(e){var t=$e(),i=t.queue;if(i===null)throw Error(l(311));i.lastRenderedReducer=e;var r=i.dispatch,c=i.pending,u=t.memoizedState;if(c!==null){i.pending=null;var y=c=c.next;do u=e(u,y.action),y=y.next;while(y!==c);Pt(u,t.memoizedState)||(nt=!0),t.memoizedState=u,t.baseQueue===null&&(t.baseState=u),i.lastRenderedState=u}return[u,r]}function Op(e,t,i){var r=me,c=$e(),u=we;if(u){if(i===void 0)throw Error(l(407));i=i()}else i=t();var y=!Pt((Me||c).memoizedState,i);if(y&&(c.memoizedState=i,nt=!0),c=c.queue,Xc(zp.bind(null,r,c,e),[e]),c.getSnapshot!==t||y||tt!==null&&tt.memoizedState.tag&1){if(r.flags|=2048,ws(9,{destroy:void 0},Dp.bind(null,r,c,i,t),null),Ue===null)throw Error(l(349));u||(zn&127)!==0||Ep(r,t,i)}return i}function Ep(e,t,i){e.flags|=16384,e={getSnapshot:t,value:i},t=me.updateQueue,t===null?(t=nr(),me.updateQueue=t,t.stores=[e]):(i=t.stores,i===null?t.stores=[e]:i.push(e))}function Dp(e,t,i,r){t.value=i,t.getSnapshot=r,Rp(t)&&Mp(e)}function zp(e,t,i){return i(function(){Rp(t)&&Mp(e)})}function Rp(e){var t=e.getSnapshot;e=e.value;try{var i=t();return!Pt(e,i)}catch{return!0}}function Mp(e){var t=Da(e,2);t!==null&&Et(t,e,2)}function Wc(e){var t=vt();if(typeof e=="function"){var i=e;if(e=i(),_a){Wn(!0);try{i()}finally{Wn(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:Rn,lastRenderedState:e},t}function qp(e,t,i,r){return e.baseState=i,Kc(e,Me,typeof r=="function"?r:Rn)}
vendor: 7,806 bytes, line 8
8function D1(e,t,i,r,c){if(rr(e))throw Error(l(485));if(e=t.action,e!==null){var u={payload:c,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(y){u.listeners.push(y)}};B.T!==null?i(!0):u.isTransition=!1,r(u),i=t.pending,i===null?(u.next=t.pending=u,Pp(t,u)):(u.next=i.next,t.pending=i.next=u)}}function Pp(e,t){var i=t.action,r=t.payload,c=e.state;if(t.isTransition){var u=B.T,y={};B.T=y;try{var v=i(c,r),N=B.S;N!==null&&N(y,v),Ip(e,t,v)}catch(R){Yc(e,t,R)}finally{u!==null&&y.types!==null&&(u.types=y.types),B.T=u}}else try{u=i(c,r),Ip(e,t,u)}catch(R){Yc(e,t,R)}}function Ip(e,t,i){i!==null&&typeof i=="object"&&typeof i.then=="function"?i.then(function(r){Up(e,t,r)},function(r){return Yc(e,t,r)}):Up(e,t,i)}function Up(e,t,i){t.status="fulfilled",t.value=i,Bp(t),e.state=i,t=e.pending,t!==null&&(i=t.next,i===t?e.pending=null:(i=i.next,t.next=i,Pp(e,i)))}function Yc(e,t,i){var r=e.pending;if(e.pending=null,r!==null){r=r.next;do t.status="rejected",t.reason=i,Bp(t),t=t.next;while(t!==r)}e.action=null}function Bp(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function _p(e,t){return t}function Vp(e,t){if(we){var i=Ue.formState;if(i!==null){e:{var r=me;if(we){if(_e){t:{for(var c=_e,u=Zt;c.nodeType!==8;){if(!u){c=null;break t}if(c=tn(c.nextSibling),c===null){c=null;break t}}u=c.data,c=u==="F!"||u==="F"?c:null}if(c){_e=tn(c.nextSibling),r=c.data==="F!";break e}}Qn(r)}r=!1}r&&(t=i[0])}}return i=vt(),i.memoizedState=i.baseState=t,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:_p,lastRenderedState:t},i.queue=r,i=rf.bind(null,me,r),r.dispatch=i,r=Wc(!1),u=ed.bind(null,me,!1,r.queue),r=vt(),c={state:t,dispatch:null,action:e,pending:null},r.queue=c,i=D1.bind(null,me,c,u,i),c.dispatch=i,r.memoizedState=e,[t,i,!1]}function Lp(e){var t=$e();return Gp(t,Me,e)}function Gp(e,t,i){if(t=Kc(e,t,_p)[0],e=sr(Rn)[0],typeof t=="object"&&t!==null&&typeof t.then=="function")try{var r=vi(t)}catch(y){throw y===gs?Yo:y}else r=t;t=$e();var c=t.queue,u=c.dispatch;return i!==t.memoizedState&&(me.flags|=2048,ws(9,{destroy:void 0},z1.bind(null,c,i),null)),[r,u,e]}function z1(e,t){e.action=t}function Hp(e){var t=$e(),i=Me;if(i!==null)return Gp(t,i,e);$e(),t=t.memoizedState,i=$e();var r=i.queue.dispatch;return i.memoizedState=e,[t,r,!1]}function ws(e,t,i,r){return e={tag:e,create:i,deps:r,inst:t,next:null},t=me.updateQueue,t===null&&(t=nr(),me.updateQueue=t),i=t.lastEffect,i===null?t.lastEffect=e.next=e:(r=i.next,i.next=e,e.next=r,t.lastEffect=e),e}function Kp(){return $e().memoizedState}function ir(e,t,i,r){var c=vt();me.flags|=e,c.memoizedState=ws(1|t,{destroy:void 0},i,r===void 0?null:r)}function or(e,t,i,r){var c=$e();r=r===void 0?null:r;var u=c.memoizedState.inst;Me!==null&&r!==null&&Bc(r,Me.memoizedState.deps)?c.memoizedState=ws(t,u,i,r):(me.flags|=e,c.memoizedState=ws(1|t,u,i,r))}function Fp(e,t){ir(8390656,8,e,t)}function Xc(e,t){or(2048,8,e,t)}function R1(e){me.flags|=4;var t=me.updateQueue;if(t===null)t=nr(),me.updateQueue=t,t.events=[e];else{var i=t.events;i===null?t.events=[e]:i.push(e)}}function Wp(e){var t=$e().memoizedState;return R1({ref:t,nextImpl:e}),function(){if((Oe&2)!==0)throw Error(l(440));return t.impl.apply(void 0,arguments)}}function Yp(e,t){return or(4,2,e,t)}function Xp(e,t){return or(4,4,e,t)}function Jp(e,t){if(typeof t=="function"){e=e();var i=t(e);return function(){typeof i=="function"?i():t(null)}}if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function $p(e,t,i){i=i!=null?i.concat([e]):null,or(4,4,Jp.bind(null,t,e),i)}function Jc(){}function Qp(e,t){var i=$e();t=t===void 0?null:t;var r=i.memoizedState;return t!==null&&Bc(t,r[1])?r[0]:(i.memoizedState=[e,t],e)}function Zp(e,t){var i=$e();t=t===void 0?null:t;var r=i.memoizedState;if(t!==null&&Bc(t,r[1]))return r[0];if(r=e(),_a){Wn(!0);try{e()}finally{Wn(!1)}}return i.memoizedState=[r,t],r}function $c(e,t,i){return i===void 0||(zn&1073741824)!==0&&(xe&261930)===0?e.memoizedState=t:(e.memoizedState=i,e=tg(),me.lanes|=e,ra|=e,i)}function ef(e,t,i,r){return Pt(i,t)?i:bs.current!==null?(e=$c(e,i,r),Pt(e,t)||(nt=!0),e):(zn&42)===0||(zn&1073741824)!==0&&(xe&261930)===0?(nt=!0,e.memoizedState=i):(e=tg(),me.lanes|=e,ra|=e,t)}function tf(e,t,i,r,c){var u=V.p;V.p=u!==0&&8>u?u:8;var y=B.T,v={};B.T=v,ed(e,!1,t,i);try{var N=c(),R=B.S;if(R!==null&&R(v,N),N!==null&&typeof N=="object"&&typeof N.then=="function"){var _=C1(N,r);wi(e,t,_,Lt(e))}else wi(e,t,r,Lt(e))}catch(K){wi(e,t,{then:function(){},status:"rejected",reason:K},Lt())}finally{V.p=u,y!==null&&v.types!==null&&(y.types=v.types),B.T=y}}function M1(){}function Qc(e,t,i,r){if(e.tag!==5)throw Error(l(476));var c=nf(e).queue;tf(e,c,t,$,i===null?M1:function(){return af(e),i(r)})}function nf(e){var t=e.memoizedState;if(t!==null)return t;t={memoizedState:$,baseState:$,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Rn,lastRenderedState:$},next:null};var i={};return t.next={memoizedState:i,baseState:i,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Rn,lastRenderedState:i},next:null},e.memoizedState=t,e=e.alternate,e!==null&&(e.memoizedState=t),t}function af(e){var t=nf(e);t.next===null&&(t=e.alternate.memoizedState),wi(e,t.next.queue,{},Lt())}function Zc(){return ft(Ui)}function sf(){return $e().memoizedState}function of(){return $e().memoizedState}function q1(e){for(var t=e.return;t!==null;){switch(t.tag){case 24:case 3:var i=Lt();e=ta(i);var r=na(t,e,i);r!==null&&(Et(r,t,i),gi(r,t,i)),t={cache:Cc()},e.payload=t;return}t=t.return}}function P1(e,t,i){var r=Lt();i={lane:r,revertLane:0,gesture:null,action:i,hasEagerState:!1,eagerState:null,next:null},rr(e)?lf(t,i):(i=yc(e,t,i,r),i!==null&&(Et(i,e,r),cf(i,t,r)))}function rf(e,t,i){var r=Lt();wi(e,t,i,r)}function wi(e,t,i,r){var c={lane:r,revertLane:0,gesture:null,action:i,hasEagerState:!1,eagerState:null,next:null};if(rr(e))lf(t,c);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var y=t.lastRenderedState,v=u(y,i);if(c.hasEagerState=!0,c.eagerState=v,Pt(v,y))return Vo(e,t,c,0),Ue===null&&_o(),!1}catch{}if(i=yc(e,t,c,r),i!==null)return Et(i,e,r),cf(i,t,r),!0}return!1}function ed(e,t,i,r){if(r={lane:2,revertLane:zd(),gesture:null,action:r,hasEagerState:!1,eagerState:null,next:null},rr(e)){if(t)throw Error(l(479))}else t=yc(e,i,r,2),t!==null&&Et(t,e,2)}function rr(e){var t=e.alternate;return e===me||t!==null&&t===me}function lf(e,t){xs=er=!0;var i=e.pending;i===null?t.next=t:(t.next=i.next,i.next=t),e.pending=t}function cf(e,t,i){if((i&4194048)!==0){var r=t.lanes;r&=e.pendingLanes,i|=r,t.lanes=i,mm(e,i)}}var ji={readContext:ft,use:ar,useCallback:Fe,useContext:Fe,useEffect:Fe,useImperativeHandle:Fe,useLayoutEffect:Fe,useInsertionEffect:Fe,useMemo:Fe,useReducer:Fe,useRef:Fe,useState:Fe,useDebugValue:Fe,useDeferredValue:Fe,useTransition:Fe,useSyncExternalStore:Fe,useId:Fe,useHostTransitionStatus:Fe,useFormState:Fe,useActionState:Fe,useOptimistic:Fe,useMemoCache:Fe,useCacheRefresh:Fe};ji.useEffectEvent=Fe;var df={readContext:ft,use:ar,useCallback:function(e,t){return vt().memoizedState=[e,t===void 0?null:t],e},useContext:ft,useEffect:Fp,useImperativeHandle:function(e,t,i){i=i!=null?i.concat([e]):null,ir(4194308,4,Jp.bind(null,t,e),i)},useLayoutEffect:function(e,t){return ir(4194308,4,e,t)},useInsertionEffect:function(e,t){ir(4,2,e,t)},useMemo:function(e,t){var i=vt();t=t===void 0?null:t;var r=e();if(_a){Wn(!0);try{e()}finally{Wn(!1)}}return i.memoizedState=[r,t],r},useReducer:function(e,t,i){var r=vt();if(i!==void 0){var c=i(t);if(_a){Wn(!0);try{i(t)}finally{Wn(!1)}}}else c=t;return r.memoizedState=r.baseState=c,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:c},r.queue=e,e=e.dispatch=P1.bind(null,me,e),[r.memoizedState,e]}
vendor: 6,687 bytes, line 8
8,useRef:function(e){var t=vt();return e={current:e},t.memoizedState=e},useState:function(e){e=Wc(e);var t=e.queue,i=rf.bind(null,me,t);return t.dispatch=i,[e.memoizedState,i]},useDebugValue:Jc,useDeferredValue:function(e,t){var i=vt();return $c(i,e,t)},useTransition:function(){var e=Wc(!1);return e=tf.bind(null,me,e.queue,!0,!1),vt().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,i){var r=me,c=vt();if(we){if(i===void 0)throw Error(l(407));i=i()}else{if(i=t(),Ue===null)throw Error(l(349));(xe&127)!==0||Ep(r,t,i)}c.memoizedState=i;var u={value:i,getSnapshot:t};return c.queue=u,Fp(zp.bind(null,r,u,e),[e]),r.flags|=2048,ws(9,{destroy:void 0},Dp.bind(null,r,u,i,t),null),i},useId:function(){var e=vt(),t=Ue.identifierPrefix;if(we){var i=xn,r=bn;i=(r&~(1<<32-qt(r)-1)).toString(32)+i,t="_"+t+"R_"+i,i=tr++,0<i&&(t+="H"+i.toString(32)),t+="_"}else i=O1++,t="_"+t+"r_"+i.toString(32)+"_";return e.memoizedState=t},useHostTransitionStatus:Zc,useFormState:Vp,useActionState:Vp,useOptimistic:function(e){var t=vt();t.memoizedState=t.baseState=e;var i={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=i,t=ed.bind(null,me,!0,i),i.dispatch=t,[e,t]},useMemoCache:Hc,useCacheRefresh:function(){return vt().memoizedState=q1.bind(null,me)},useEffectEvent:function(e){var t=vt(),i={impl:e};return t.memoizedState=i,function(){if((Oe&2)!==0)throw Error(l(440));return i.impl.apply(void 0,arguments)}}},td={readContext:ft,use:ar,useCallback:Qp,useContext:ft,useEffect:Xc,useImperativeHandle:$p,useInsertionEffect:Yp,useLayoutEffect:Xp,useMemo:Zp,useReducer:sr,useRef:Kp,useState:function(){return sr(Rn)},useDebugValue:Jc,useDeferredValue:function(e,t){var i=$e();return ef(i,Me.memoizedState,e,t)},useTransition:function(){var e=sr(Rn)[0],t=$e().memoizedState;return[typeof e=="boolean"?e:vi(e),t]},useSyncExternalStore:Op,useId:sf,useHostTransitionStatus:Zc,useFormState:Lp,useActionState:Lp,useOptimistic:function(e,t){var i=$e();return qp(i,Me,e,t)},useMemoCache:Hc,useCacheRefresh:of};td.useEffectEvent=Wp;var uf={readContext:ft,use:ar,useCallback:Qp,useContext:ft,useEffect:Xc,useImperativeHandle:$p,useInsertionEffect:Yp,useLayoutEffect:Xp,useMemo:Zp,useReducer:Fc,useRef:Kp,useState:function(){return Fc(Rn)},useDebugValue:Jc,useDeferredValue:function(e,t){var i=$e();return Me===null?$c(i,e,t):ef(i,Me.memoizedState,e,t)},useTransition:function(){var e=Fc(Rn)[0],t=$e().memoizedState;return[typeof e=="boolean"?e:vi(e),t]},useSyncExternalStore:Op,useId:sf,useHostTransitionStatus:Zc,useFormState:Hp,useActionState:Hp,useOptimistic:function(e,t){var i=$e();return Me!==null?qp(i,Me,e,t):(i.baseState=e,[e,i.queue.dispatch])},useMemoCache:Hc,useCacheRefresh:of};uf.useEffectEvent=Wp;function nd(e,t,i,r){t=e.memoizedState,i=i(r,t),i=i==null?t:x({},t,i),e.memoizedState=i,e.lanes===0&&(e.updateQueue.baseState=i)}var ad={enqueueSetState:function(e,t,i){e=e._reactInternals;var r=Lt(),c=ta(r);c.payload=t,i!=null&&(c.callback=i),t=na(e,c,r),t!==null&&(Et(t,e,r),gi(t,e,r))},enqueueReplaceState:function(e,t,i){e=e._reactInternals;var r=Lt(),c=ta(r);c.tag=1,c.payload=t,i!=null&&(c.callback=i),t=na(e,c,r),t!==null&&(Et(t,e,r),gi(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var i=Lt(),r=ta(i);r.tag=2,t!=null&&(r.callback=t),t=na(e,r,i),t!==null&&(Et(t,e,i),gi(t,e,i))}};function hf(e,t,i,r,c,u,y){return e=e.stateNode,typeof e.shouldComponentUpdate=="function"?e.shouldComponentUpdate(r,u,y):t.prototype&&t.prototype.isPureReactComponent?!li(i,r)||!li(c,u):!0}function mf(e,t,i,r){e=t.state,typeof t.componentWillReceiveProps=="function"&&t.componentWillReceiveProps(i,r),typeof t.UNSAFE_componentWillReceiveProps=="function"&&t.UNSAFE_componentWillReceiveProps(i,r),t.state!==e&&ad.enqueueReplaceState(t,t.state,null)}function Va(e,t){var i=t;if("ref"in t){i={};for(var r in t)r!=="ref"&&(i[r]=t[r])}if(e=e.defaultProps){i===t&&(i=x({},i));for(var c in e)i[c]===void 0&&(i[c]=e[c])}return i}function pf(e){Bo(e)}function ff(e){console.error(e)}function gf(e){Bo(e)}function lr(e,t){try{var i=e.onUncaughtError;i(t.value,{componentStack:t.stack})}catch(r){setTimeout(function(){throw r})}}function yf(e,t,i){try{var r=e.onCaughtError;r(i.value,{componentStack:i.stack,errorBoundary:t.tag===1?t.stateNode:null})}catch(c){setTimeout(function(){throw c})}}function sd(e,t,i){return i=ta(i),i.tag=3,i.payload={element:null},i.callback=function(){lr(e,t)},i}function bf(e){return e=ta(e),e.tag=3,e}function xf(e,t,i,r){var c=i.type.getDerivedStateFromError;if(typeof c=="function"){var u=r.value;e.payload=function(){return c(u)},e.callback=function(){yf(t,i,r)}}var y=i.stateNode;y!==null&&typeof y.componentDidCatch=="function"&&(e.callback=function(){yf(t,i,r),typeof c!="function"&&(la===null?la=new Set([this]):la.add(this));var v=r.stack;this.componentDidCatch(r.value,{componentStack:v!==null?v:""})})}function I1(e,t,i,r,c){if(i.flags|=32768,r!==null&&typeof r=="object"&&typeof r.then=="function"){if(t=i.alternate,t!==null&&ms(t,i,c,!0),i=Ut.current,i!==null){switch(i.tag){case 31:case 13:return en===null?vr():i.alternate===null&&We===0&&(We=3),i.flags&=-257,i.flags|=65536,i.lanes=c,r===Xo?i.flags|=16384:(t=i.updateQueue,t===null?i.updateQueue=new Set([r]):t.add(r),Od(e,r,c)),!1;case 22:return i.flags|=65536,r===Xo?i.flags|=16384:(t=i.updateQueue,t===null?(t={transitions:null,markerInstances:null,retryQueue:new Set([r])},i.updateQueue=t):(i=t.retryQueue,i===null?t.retryQueue=new Set([r]):i.add(r)),Od(e,r,c)),!1}throw Error(l(435,i.tag))}return Od(e,r,c),vr(),!1}if(we)return t=Ut.current,t!==null?((t.flags&65536)===0&&(t.flags|=256),t.flags|=65536,t.lanes=c,r!==kc&&(e=Error(l(422),{cause:r}),ui(Jt(e,i)))):(r!==kc&&(t=Error(l(423),{cause:r}),ui(Jt(t,i))),e=e.current.alternate,e.flags|=65536,c&=-c,e.lanes|=c,r=Jt(r,i),c=sd(e.stateNode,r,c),Mc(e,c),We!==4&&(We=2)),!1;var u=Error(l(520),{cause:r});if(u=Jt(u,i),Ei===null?Ei=[u]:Ei.push(u),We!==4&&(We=2),t===null)return!0;r=Jt(r,i),i=t;do{switch(i.tag){case 3:return i.flags|=65536,e=c&-c,i.lanes|=e,e=sd(i.stateNode,r,e),Mc(i,e),!1;case 1:if(t=i.type,u=i.stateNode,(i.flags&128)===0&&(typeof t.getDerivedStateFromError=="function"||u!==null&&typeof u.componentDidCatch=="function"&&(la===null||!la.has(u))))return i.flags|=65536,c&=-c,i.lanes|=c,c=bf(c),xf(c,e,i,r),Mc(i,c),!1}i=i.return}while(i!==null);return!1}var id=Error(l(461)),nt=!1;function gt(e,t,i,r){t.child=e===null?jp(t,null,i,r):Ba(t,e.child,i,r)}function vf(e,t,i,r,c){i=i.render;var u=t.ref;if("ref"in r){var y={};for(var v in r)v!=="ref"&&(y[v]=r[v])}else y=r;return qa(t),r=_c(e,t,i,y,u,c),v=Vc(),e!==null&&!nt?(Lc(e,t,c),Mn(e,t,c)):(we&&v&&wc(t),t.flags|=1,gt(e,t,r,c),t.child)}
vendor: 13,100 bytes, line 8
8function wf(e,t,i,r,c){if(e===null){var u=i.type;return typeof u=="function"&&!bc(u)&&u.defaultProps===void 0&&i.compare===null?(t.tag=15,t.type=u,jf(e,t,u,r,c)):(e=Go(i.type,null,r,t,t.mode,c),e.ref=t.ref,e.return=t,t.child=e)}if(u=e.child,!md(e,c)){var y=u.memoizedProps;if(i=i.compare,i=i!==null?i:li,i(y,r)&&e.ref===t.ref)return Mn(e,t,c)}return t.flags|=1,e=Cn(u,r),e.ref=t.ref,e.return=t,t.child=e}function jf(e,t,i,r,c){if(e!==null){var u=e.memoizedProps;if(li(u,r)&&e.ref===t.ref)if(nt=!1,t.pendingProps=r=u,md(e,c))(e.flags&131072)!==0&&(nt=!0);else return t.lanes=e.lanes,Mn(e,t,c)}return od(e,t,i,r,c)}function kf(e,t,i,r){var c=r.children,u=e!==null?e.memoizedState:null;if(e===null&&t.stateNode===null&&(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),r.mode==="hidden"){if((t.flags&128)!==0){if(u=u!==null?u.baseLanes|i:i,e!==null){for(r=t.child=e.child,c=0;r!==null;)c=c|r.lanes|r.childLanes,r=r.sibling;r=c&~u}else r=0,t.child=null;return Nf(e,t,u,i,r)}if((i&536870912)!==0)t.memoizedState={baseLanes:0,cachePool:null},e!==null&&Wo(t,u!==null?u.cachePool:null),u!==null?Tp(t,u):Pc(),Sp(t);else return r=t.lanes=536870912,Nf(e,t,u!==null?u.baseLanes|i:i,i,r)}else u!==null?(Wo(t,u.cachePool),Tp(t,u),sa(),t.memoizedState=null):(e!==null&&Wo(t,null),Pc(),sa());return gt(e,t,c,i),t.child}function ki(e,t){return e!==null&&e.tag===22||t.stateNode!==null||(t.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null}),t.sibling}function Nf(e,t,i,r,c){var u=Ec();return u=u===null?null:{parent:et._currentValue,pool:u},t.memoizedState={baseLanes:i,cachePool:u},e!==null&&Wo(t,null),Pc(),Sp(t),e!==null&&ms(e,t,r,!0),t.childLanes=c,null}function cr(e,t){return t=ur({mode:t.mode,children:t.children},e.mode),t.ref=e.ref,e.child=t,t.return=e,t}function Tf(e,t,i){return Ba(t,e.child,null,i),e=cr(t,t.pendingProps),e.flags|=2,Bt(t),t.memoizedState=null,e}function U1(e,t,i){var r=t.pendingProps,c=(t.flags&128)!==0;if(t.flags&=-129,e===null){if(we){if(r.mode==="hidden")return e=cr(t,r),t.lanes=536870912,ki(null,e);if(Uc(t),(e=_e)?(e=Ig(e,Zt),e=e!==null&&e.data==="&"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:Jn!==null?{id:bn,overflow:xn}:null,retryLane:536870912,hydrationErrors:null},i=rp(e),i.return=t,t.child=i,pt=t,_e=null)):e=null,e===null)throw Qn(t);return t.lanes=536870912,null}return cr(t,r)}var u=e.memoizedState;if(u!==null){var y=u.dehydrated;if(Uc(t),c)if(t.flags&256)t.flags&=-257,t=Tf(e,t,i);else if(t.memoizedState!==null)t.child=e.child,t.flags|=128,t=null;else throw Error(l(558));else if(nt||ms(e,t,i,!1),c=(i&e.childLanes)!==0,nt||c){if(r=Ue,r!==null&&(y=pm(r,i),y!==0&&y!==u.retryLane))throw u.retryLane=y,Da(e,y),Et(r,e,y),id;vr(),t=Tf(e,t,i)}else e=u.treeContext,_e=tn(y.nextSibling),pt=t,we=!0,$n=null,Zt=!1,e!==null&&dp(t,e),t=cr(t,r),t.flags|=4096;return t}return e=Cn(e.child,{mode:r.mode,children:r.children}),e.ref=t.ref,t.child=e,e.return=t,e}function dr(e,t){var i=t.ref;if(i===null)e!==null&&e.ref!==null&&(t.flags|=4194816);else{if(typeof i!="function"&&typeof i!="object")throw Error(l(284));(e===null||e.ref!==i)&&(t.flags|=4194816)}}function od(e,t,i,r,c){return qa(t),i=_c(e,t,i,r,void 0,c),r=Vc(),e!==null&&!nt?(Lc(e,t,c),Mn(e,t,c)):(we&&r&&wc(t),t.flags|=1,gt(e,t,i,c),t.child)}function Sf(e,t,i,r,c,u){return qa(t),t.updateQueue=null,i=Cp(t,r,i,c),Ap(e),r=Vc(),e!==null&&!nt?(Lc(e,t,u),Mn(e,t,u)):(we&&r&&wc(t),t.flags|=1,gt(e,t,i,u),t.child)}function Af(e,t,i,r,c){if(qa(t),t.stateNode===null){var u=cs,y=i.contextType;typeof y=="object"&&y!==null&&(u=ft(y)),u=new i(r,u),t.memoizedState=u.state!==null&&u.state!==void 0?u.state:null,u.updater=ad,t.stateNode=u,u._reactInternals=t,u=t.stateNode,u.props=r,u.state=t.memoizedState,u.refs={},zc(t),y=i.contextType,u.context=typeof y=="object"&&y!==null?ft(y):cs,u.state=t.memoizedState,y=i.getDerivedStateFromProps,typeof y=="function"&&(nd(t,i,y,r),u.state=t.memoizedState),typeof i.getDerivedStateFromProps=="function"||typeof u.getSnapshotBeforeUpdate=="function"||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(y=u.state,typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount(),y!==u.state&&ad.enqueueReplaceState(u,u.state,null),bi(t,r,u,c),yi(),u.state=t.memoizedState),typeof u.componentDidMount=="function"&&(t.flags|=4194308),r=!0}else if(e===null){u=t.stateNode;var v=t.memoizedProps,N=Va(i,v);u.props=N;var R=u.context,_=i.contextType;y=cs,typeof _=="object"&&_!==null&&(y=ft(_));var K=i.getDerivedStateFromProps;_=typeof K=="function"||typeof u.getSnapshotBeforeUpdate=="function",v=t.pendingProps!==v,_||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(v||R!==y)&&mf(t,u,r,y),ea=!1;var M=t.memoizedState;u.state=M,bi(t,r,u,c),yi(),R=t.memoizedState,v||M!==R||ea?(typeof K=="function"&&(nd(t,i,K,r),R=t.memoizedState),(N=ea||hf(t,i,N,r,M,R,y))?(_||typeof u.UNSAFE_componentWillMount!="function"&&typeof u.componentWillMount!="function"||(typeof u.componentWillMount=="function"&&u.componentWillMount(),typeof u.UNSAFE_componentWillMount=="function"&&u.UNSAFE_componentWillMount()),typeof u.componentDidMount=="function"&&(t.flags|=4194308)):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=R),u.props=r,u.state=R,u.context=y,r=N):(typeof u.componentDidMount=="function"&&(t.flags|=4194308),r=!1)}else{u=t.stateNode,Rc(e,t),y=t.memoizedProps,_=Va(i,y),u.props=_,K=t.pendingProps,M=u.context,R=i.contextType,N=cs,typeof R=="object"&&R!==null&&(N=ft(R)),v=i.getDerivedStateFromProps,(R=typeof v=="function"||typeof u.getSnapshotBeforeUpdate=="function")||typeof u.UNSAFE_componentWillReceiveProps!="function"&&typeof u.componentWillReceiveProps!="function"||(y!==K||M!==N)&&mf(t,u,r,N),ea=!1,M=t.memoizedState,u.state=M,bi(t,r,u,c),yi();var U=t.memoizedState;y!==K||M!==U||ea||e!==null&&e.dependencies!==null&&Ko(e.dependencies)?(typeof v=="function"&&(nd(t,i,v,r),U=t.memoizedState),(_=ea||hf(t,i,_,r,M,U,N)||e!==null&&e.dependencies!==null&&Ko(e.dependencies))?(R||typeof u.UNSAFE_componentWillUpdate!="function"&&typeof u.componentWillUpdate!="function"||(typeof u.componentWillUpdate=="function"&&u.componentWillUpdate(r,U,N),typeof u.UNSAFE_componentWillUpdate=="function"&&u.UNSAFE_componentWillUpdate(r,U,N)),typeof u.componentDidUpdate=="function"&&(t.flags|=4),typeof u.getSnapshotBeforeUpdate=="function"&&(t.flags|=1024)):(typeof u.componentDidUpdate!="function"||y===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||y===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=U),u.props=r,u.state=U,u.context=N,r=_):(typeof u.componentDidUpdate!="function"||y===e.memoizedProps&&M===e.memoizedState||(t.flags|=4),typeof u.getSnapshotBeforeUpdate!="function"||y===e.memoizedProps&&M===e.memoizedState||(t.flags|=1024),r=!1)}return u=r,dr(e,t),r=(t.flags&128)!==0,u||r?(u=t.stateNode,i=r&&typeof i.getDerivedStateFromError!="function"?null:u.render(),t.flags|=1,e!==null&&r?(t.child=Ba(t,e.child,null,c),t.child=Ba(t,null,i,c)):gt(e,t,i,c),t.memoizedState=u.state,e=t.child):e=Mn(e,t,c),e}function Cf(e,t,i,r){return Ra(),t.flags|=256,gt(e,t,i,r),t.child}var rd={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function ld(e){return{baseLanes:e,cachePool:gp()}}function cd(e,t,i){return e=e!==null?e.childLanes&~i:0,t&&(e|=Vt),e}function Of(e,t,i){var r=t.pendingProps,c=!1,u=(t.flags&128)!==0,y;if((y=u)||(y=e!==null&&e.memoizedState===null?!1:(Je.current&2)!==0),y&&(c=!0,t.flags&=-129),y=(t.flags&32)!==0,t.flags&=-33,e===null){if(we){if(c?aa(t):sa(),(e=_e)?(e=Ig(e,Zt),e=e!==null&&e.data!=="&"?e:null,e!==null&&(t.memoizedState={dehydrated:e,treeContext:Jn!==null?{id:bn,overflow:xn}:null,retryLane:536870912,hydrationErrors:null},i=rp(e),i.return=t,t.child=i,pt=t,_e=null)):e=null,e===null)throw Qn(t);return Kd(e)?t.lanes=32:t.lanes=536870912,null}var v=r.children;return r=r.fallback,c?(sa(),c=t.mode,v=ur({mode:"hidden",children:v},c),r=za(r,c,i,null),v.return=t,r.return=t,v.sibling=r,t.child=v,r=t.child,r.memoizedState=ld(i),r.childLanes=cd(e,y,i),t.memoizedState=rd,ki(null,r)):(aa(t),dd(t,v))}var N=e.memoizedState;if(N!==null&&(v=N.dehydrated,v!==null)){if(u)t.flags&256?(aa(t),t.flags&=-257,t=ud(e,t,i)):t.memoizedState!==null?(sa(),t.child=e.child,t.flags|=128,t=null):(sa(),v=r.fallback,c=t.mode,r=ur({mode:"visible",children:r.children},c),v=za(v,c,i,null),v.flags|=2,r.return=t,v.return=t,r.sibling=v,t.child=r,Ba(t,e.child,null,i),r=t.child,r.memoizedState=ld(i),r.childLanes=cd(e,y,i),t.memoizedState=rd,t=ki(null,r));else if(aa(t),Kd(v)){if(y=v.nextSibling&&v.nextSibling.dataset,y)var R=y.dgst;y=R,r=Error(l(419)),r.stack="",r.digest=y,ui({value:r,source:null,stack:null}),t=ud(e,t,i)}else if(nt||ms(e,t,i,!1),y=(i&e.childLanes)!==0,nt||y){if(y=Ue,y!==null&&(r=pm(y,i),r!==0&&r!==N.retryLane))throw N.retryLane=r,Da(e,r),Et(y,e,r),id;Hd(v)||vr(),t=ud(e,t,i)}else Hd(v)?(t.flags|=192,t.child=e.child,t=null):(e=N.treeContext,_e=tn(v.nextSibling),pt=t,we=!0,$n=null,Zt=!1,e!==null&&dp(t,e),t=dd(t,r.children),t.flags|=4096);return t}return c?(sa(),v=r.fallback,c=t.mode,N=e.child,R=N.sibling,r=Cn(N,{mode:"hidden",children:r.children}),r.subtreeFlags=N.subtreeFlags&65011712,R!==null?v=Cn(R,v):(v=za(v,c,i,null),v.flags|=2),v.return=t,r.return=t,r.sibling=v,t.child=r,ki(null,r),r=t.child,v=e.child.memoizedState,v===null?v=ld(i):(c=v.cachePool,c!==null?(N=et._currentValue,c=c.parent!==N?{parent:N,pool:N}:c):c=gp(),v={baseLanes:v.baseLanes|i,cachePool:c}),r.memoizedState=v,r.childLanes=cd(e,y,i),t.memoizedState=rd,ki(e.child,r)):(aa(t),i=e.child,e=i.sibling,i=Cn(i,{mode:"visible",children:r.children}),i.return=t,i.sibling=null,e!==null&&(y=t.deletions,y===null?(t.deletions=[e],t.flags|=16):y.push(e)),t.child=i,t.memoizedState=null,i)}function dd(e,t){return t=ur({mode:"visible",children:t},e.mode),t.return=e,e.child=t}function ur(e,t){return e=It(22,e,null,t),e.lanes=0,e}function ud(e,t,i){return Ba(t,e.child,null,i),e=dd(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function Ef(e,t,i){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),Sc(e.return,t,i)}function hd(e,t,i,r,c,u){var y=e.memoizedState;y===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:i,tailMode:c,treeForkCount:u}:(y.isBackwards=t,y.rendering=null,y.renderingStartTime=0,y.last=r,y.tail=i,y.tailMode=c,y.treeForkCount=u)}function Df(e,t,i){var r=t.pendingProps,c=r.revealOrder,u=r.tail;r=r.children;var y=Je.current,v=(y&2)!==0;if(v?(y=y&1|2,t.flags|=128):y&=1,H(Je,y),gt(e,t,r,i),r=we?di:0,!v&&e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&Ef(e,i,t);else if(e.tag===19)Ef(e,i,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}switch(c){case"forwards":for(i=t.child,c=null;i!==null;)e=i.alternate,e!==null&&Zo(e)===null&&(c=i),i=i.sibling;i=c,i===null?(c=t.child,t.child=null):(c=i.sibling,i.sibling=null),hd(t,!1,c,i,u,r);break;case"backwards":case"unstable_legacy-backwards":for(i=null,c=t.child,t.child=null;c!==null;){if(e=c.alternate,e!==null&&Zo(e)===null){t.child=c;break}e=c.sibling,c.sibling=i,i=c,c=e}hd(t,!0,i,null,u,r);break;case"together":hd(t,!1,null,null,void 0,r);break;default:t.memoizedState=null}return t.child}function Mn(e,t,i){if(e!==null&&(t.dependencies=e.dependencies),ra|=t.lanes,(i&t.childLanes)===0)if(e!==null){if(ms(e,t,i,!1),(i&t.childLanes)===0)return null}else return null;if(e!==null&&t.child!==e.child)throw Error(l(153));if(t.child!==null){for(e=t.child,i=Cn(e,e.pendingProps),t.child=i,i.return=t;e.sibling!==null;)e=e.sibling,i=i.sibling=Cn(e,e.pendingProps),i.return=t;i.sibling=null}return t.child}function md(e,t){return(e.lanes&t)!==0?!0:(e=e.dependencies,!!(e!==null&&Ko(e)))}function B1(e,t,i){switch(t.tag){case 3:Ne(t,t.stateNode.containerInfo),Zn(t,et,e.memoizedState.cache),Ra();break;case 27:case 5:Ft(t);break;case 4:Ne(t,t.stateNode.containerInfo);break;case 10:Zn(t,t.type,t.memoizedProps.value);break;case 31:if(t.memoizedState!==null)return t.flags|=128,Uc(t),null;break;case 13:var r=t.memoizedState;if(r!==null)return r.dehydrated!==null?(aa(t),t.flags|=128,null):(i&t.child.childLanes)!==0?Of(e,t,i):(aa(t),e=Mn(e,t,i),e!==null?e.sibling:null);aa(t);break;case 19:var c=(e.flags&128)!==0;if(r=(i&t.childLanes)!==0,r||(ms(e,t,i,!1),r=(i&t.childLanes)!==0),c){if(r)return Df(e,t,i);t.flags|=128}if(c=t.memoizedState,c!==null&&(c.rendering=null,c.tail=null,c.lastEffect=null),H(Je,Je.current),r)break;return null;case 22:return t.lanes=0,kf(e,t,i,t.pendingProps);case 24:Zn(t,et,e.memoizedState.cache)}return Mn(e,t,i)}function zf(e,t,i){if(e!==null)if(e.memoizedProps!==t.pendingProps)nt=!0;else{if(!md(e,i)&&(t.flags&128)===0)return nt=!1,B1(e,t,i);nt=(e.flags&131072)!==0}
vendor: 6,322 bytes, line 8
8else nt=!1,we&&(t.flags&1048576)!==0&&cp(t,di,t.index);switch(t.lanes=0,t.tag){case 16:e:{var r=t.pendingProps;if(e=Ia(t.elementType),t.type=e,typeof e=="function")bc(e)?(r=Va(e,r),t.tag=1,t=Af(null,t,e,r,i)):(t.tag=0,t=od(null,t,e,r,i));else{if(e!=null){var c=e.$$typeof;if(c===F){t.tag=11,t=vf(null,t,e,r,i);break e}else if(c===X){t.tag=14,t=wf(null,t,e,r,i);break e}}throw t=Ie(e)||e,Error(l(306,t,""))}}return t;case 0:return od(e,t,t.type,t.pendingProps,i);case 1:return r=t.type,c=Va(r,t.pendingProps),Af(e,t,r,c,i);case 3:e:{if(Ne(t,t.stateNode.containerInfo),e===null)throw Error(l(387));r=t.pendingProps;var u=t.memoizedState;c=u.element,Rc(e,t),bi(t,r,null,i);var y=t.memoizedState;if(r=y.cache,Zn(t,et,r),r!==u.cache&&Ac(t,[et],i,!0),yi(),r=y.element,u.isDehydrated)if(u={element:r,isDehydrated:!1,cache:y.cache},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){t=Cf(e,t,r,i);break e}else if(r!==c){c=Jt(Error(l(424)),t),ui(c),t=Cf(e,t,r,i);break e}else for(e=t.stateNode.containerInfo,e.nodeType===9?e=e.body:e=e.nodeName==="HTML"?e.ownerDocument.body:e,_e=tn(e.firstChild),pt=t,we=!0,$n=null,Zt=!0,i=jp(t,null,r,i),t.child=i;i;)i.flags=i.flags&-3|4096,i=i.sibling;else{if(Ra(),r===c){t=Mn(e,t,i);break e}gt(e,t,r,i)}t=t.child}return t;case 26:return dr(e,t),e===null?(i=Gg(t.type,null,t.pendingProps,null))?t.memoizedState=i:we||(i=t.type,e=t.pendingProps,r=Ar(le.current).createElement(i),r[mt]=t,r[Nt]=e,yt(r,i,e),rt(r),t.stateNode=r):t.memoizedState=Gg(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return Ft(t),e===null&&we&&(r=t.stateNode=_g(t.type,t.pendingProps,le.current),pt=t,Zt=!0,c=_e,ha(t.type)?(Fd=c,_e=tn(r.firstChild)):_e=c),gt(e,t,t.pendingProps.children,i),dr(e,t),e===null&&(t.flags|=4194304),t.child;case 5:return e===null&&we&&((c=r=_e)&&(r=fj(r,t.type,t.pendingProps,Zt),r!==null?(t.stateNode=r,pt=t,_e=tn(r.firstChild),Zt=!1,c=!0):c=!1),c||Qn(t)),Ft(t),c=t.type,u=t.pendingProps,y=e!==null?e.memoizedProps:null,r=u.children,Vd(c,u)?r=null:y!==null&&Vd(c,y)&&(t.flags|=32),t.memoizedState!==null&&(c=_c(e,t,E1,null,null,i),Ui._currentValue=c),dr(e,t),gt(e,t,r,i),t.child;case 6:return e===null&&we&&((e=i=_e)&&(i=gj(i,t.pendingProps,Zt),i!==null?(t.stateNode=i,pt=t,_e=null,e=!0):e=!1),e||Qn(t)),null;case 13:return Of(e,t,i);case 4:return Ne(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Ba(t,null,r,i):gt(e,t,r,i),t.child;case 11:return vf(e,t,t.type,t.pendingProps,i);case 7:return gt(e,t,t.pendingProps,i),t.child;case 8:return gt(e,t,t.pendingProps.children,i),t.child;case 12:return gt(e,t,t.pendingProps.children,i),t.child;case 10:return r=t.pendingProps,Zn(t,t.type,r.value),gt(e,t,r.children,i),t.child;case 9:return c=t.type._context,r=t.pendingProps.children,qa(t),c=ft(c),r=r(c),t.flags|=1,gt(e,t,r,i),t.child;case 14:return wf(e,t,t.type,t.pendingProps,i);case 15:return jf(e,t,t.type,t.pendingProps,i);case 19:return Df(e,t,i);case 31:return U1(e,t,i);case 22:return kf(e,t,i,t.pendingProps);case 24:return qa(t),r=ft(et),e===null?(c=Ec(),c===null&&(c=Ue,u=Cc(),c.pooledCache=u,u.refCount++,u!==null&&(c.pooledCacheLanes|=i),c=u),t.memoizedState={parent:r,cache:c},zc(t),Zn(t,et,c)):((e.lanes&i)!==0&&(Rc(e,t),bi(t,null,null,i),yi()),c=e.memoizedState,u=t.memoizedState,c.parent!==r?(c={parent:r,cache:r},t.memoizedState=c,t.lanes===0&&(t.memoizedState=t.updateQueue.baseState=c),Zn(t,et,r)):(r=u.cache,Zn(t,et,r),r!==c.cache&&Ac(t,[et],i,!0))),gt(e,t,t.pendingProps.children,i),t.child;case 29:throw t.pendingProps}throw Error(l(156,t.tag))}function qn(e){e.flags|=4}function pd(e,t,i,r,c){if((t=(e.mode&32)!==0)&&(t=!1),t){if(e.flags|=16777216,(c&335544128)===c)if(e.stateNode.complete)e.flags|=8192;else if(ig())e.flags|=8192;else throw Ua=Xo,Dc}else e.flags&=-16777217}function Rf(e,t){if(t.type!=="stylesheet"||(t.state.loading&4)!==0)e.flags&=-16777217;else if(e.flags|=16777216,!Yg(t))if(ig())e.flags|=8192;else throw Ua=Xo,Dc}function hr(e,t){t!==null&&(e.flags|=4),e.flags&16384&&(t=e.tag!==22?um():536870912,e.lanes|=t,Ts|=t)}function Ni(e,t){if(!we)switch(e.tailMode){case"hidden":t=e.tail;for(var i=null;t!==null;)t.alternate!==null&&(i=t),t=t.sibling;i===null?e.tail=null:i.sibling=null;break;case"collapsed":i=e.tail;for(var r=null;i!==null;)i.alternate!==null&&(r=i),i=i.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ve(e){var t=e.alternate!==null&&e.alternate.child===e.child,i=0,r=0;if(t)for(var c=e.child;c!==null;)i|=c.lanes|c.childLanes,r|=c.subtreeFlags&65011712,r|=c.flags&65011712,c.return=e,c=c.sibling;else for(c=e.child;c!==null;)i|=c.lanes|c.childLanes,r|=c.subtreeFlags,r|=c.flags,c.return=e,c=c.sibling;return e.subtreeFlags|=r,e.childLanes=i,t}function _1(e,t,i){var r=t.pendingProps;switch(jc(t),t.tag){case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return Ve(t),null;case 1:return Ve(t),null;case 3:return i=t.stateNode,r=null,e!==null&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),Dn(et),ke(),i.pendingContext&&(i.context=i.pendingContext,i.pendingContext=null),(e===null||e.child===null)&&(hs(t)?qn(t):e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,Nc())),Ve(t),null;case 26:var c=t.type,u=t.memoizedState;return e===null?(qn(t),u!==null?(Ve(t),Rf(t,u)):(Ve(t),pd(t,c,null,r,i))):u?u!==e.memoizedState?(qn(t),Ve(t),Rf(t,u)):(Ve(t),t.flags&=-16777217):(e=e.memoizedProps,e!==r&&qn(t),Ve(t),pd(t,c,e,r,i)),null;case 27:if(Be(t),i=le.current,c=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==r&&qn(t);else{if(!r){if(t.stateNode===null)throw Error(l(166));return Ve(t),null}e=Y.current,hs(t)?up(t):(e=_g(c,r,i),t.stateNode=e,qn(t))}return Ve(t),null;case 5:if(Be(t),c=t.type,e!==null&&t.stateNode!=null)e.memoizedProps!==r&&qn(t);else{if(!r){if(t.stateNode===null)throw Error(l(166));return Ve(t),null}if(u=Y.current,hs(t))up(t);else{var y=Ar(le.current);switch(u){case 1:u=y.createElementNS("http://www.w3.org/2000/svg",c);break;case 2:u=y.createElementNS("http://www.w3.org/1998/Math/MathML",c);break;default:switch(c){case"svg":u=y.createElementNS("http://www.w3.org/2000/svg",c);break;case"math":u=y.createElementNS("http://www.w3.org/1998/Math/MathML",c);break;case"script":u=y.createElement("div"),u.innerHTML="<script><\/script>",u=u.removeChild(u.firstChild);break;
vendor: 25,911 bytes, line 8
8case"select":u=typeof r.is=="string"?y.createElement("select",{is:r.is}):y.createElement("select"),r.multiple?u.multiple=!0:r.size&&(u.size=r.size);break;default:u=typeof r.is=="string"?y.createElement(c,{is:r.is}):y.createElement(c)}}u[mt]=t,u[Nt]=r;e:for(y=t.child;y!==null;){if(y.tag===5||y.tag===6)u.appendChild(y.stateNode);else if(y.tag!==4&&y.tag!==27&&y.child!==null){y.child.return=y,y=y.child;continue}if(y===t)break e;for(;y.sibling===null;){if(y.return===null||y.return===t)break e;y=y.return}y.sibling.return=y.return,y=y.sibling}t.stateNode=u;e:switch(yt(u,c,r),c){case"button":case"input":case"select":case"textarea":r=!!r.autoFocus;break e;case"img":r=!0;break e;default:r=!1}r&&qn(t)}}return Ve(t),pd(t,t.type,e===null?null:e.memoizedProps,t.pendingProps,i),null;case 6:if(e&&t.stateNode!=null)e.memoizedProps!==r&&qn(t);else{if(typeof r!="string"&&t.stateNode===null)throw Error(l(166));if(e=le.current,hs(t)){if(e=t.stateNode,i=t.memoizedProps,r=null,c=pt,c!==null)switch(c.tag){case 27:case 5:r=c.memoizedProps}e[mt]=t,e=!!(e.nodeValue===i||r!==null&&r.suppressHydrationWarning===!0||Og(e.nodeValue,i)),e||Qn(t,!0)}else e=Ar(e).createTextNode(r),e[mt]=t,t.stateNode=e}return Ve(t),null;case 31:if(i=t.memoizedState,e===null||e.memoizedState!==null){if(r=hs(t),i!==null){if(e===null){if(!r)throw Error(l(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(l(557));e[mt]=t}else Ra(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ve(t),e=!1}else i=Nc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=i),e=!0;if(!e)return t.flags&256?(Bt(t),t):(Bt(t),null);if((t.flags&128)!==0)throw Error(l(558))}return Ve(t),null;case 13:if(r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(c=hs(t),r!==null&&r.dehydrated!==null){if(e===null){if(!c)throw Error(l(318));if(c=t.memoizedState,c=c!==null?c.dehydrated:null,!c)throw Error(l(317));c[mt]=t}else Ra(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;Ve(t),c=!1}else c=Nc(),e!==null&&e.memoizedState!==null&&(e.memoizedState.hydrationErrors=c),c=!0;if(!c)return t.flags&256?(Bt(t),t):(Bt(t),null)}return Bt(t),(t.flags&128)!==0?(t.lanes=i,t):(i=r!==null,e=e!==null&&e.memoizedState!==null,i&&(r=t.child,c=null,r.alternate!==null&&r.alternate.memoizedState!==null&&r.alternate.memoizedState.cachePool!==null&&(c=r.alternate.memoizedState.cachePool.pool),u=null,r.memoizedState!==null&&r.memoizedState.cachePool!==null&&(u=r.memoizedState.cachePool.pool),u!==c&&(r.flags|=2048)),i!==e&&i&&(t.child.flags|=8192),hr(t,t.updateQueue),Ve(t),null);case 4:return ke(),e===null&&Pd(t.stateNode.containerInfo),Ve(t),null;case 10:return Dn(t.type),Ve(t),null;case 19:if(q(Je),r=t.memoizedState,r===null)return Ve(t),null;if(c=(t.flags&128)!==0,u=r.rendering,u===null)if(c)Ni(r,!1);else{if(We!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(u=Zo(e),u!==null){for(t.flags|=128,Ni(r,!1),e=u.updateQueue,t.updateQueue=e,hr(t,e),t.subtreeFlags=0,e=i,i=t.child;i!==null;)op(i,e),i=i.sibling;return H(Je,Je.current&1|2),we&&On(t,r.treeForkCount),t.child}e=e.sibling}r.tail!==null&&Rt()>yr&&(t.flags|=128,c=!0,Ni(r,!1),t.lanes=4194304)}else{if(!c)if(e=Zo(u),e!==null){if(t.flags|=128,c=!0,e=e.updateQueue,t.updateQueue=e,hr(t,e),Ni(r,!0),r.tail===null&&r.tailMode==="hidden"&&!u.alternate&&!we)return Ve(t),null}else 2*Rt()-r.renderingStartTime>yr&&i!==536870912&&(t.flags|=128,c=!0,Ni(r,!1),t.lanes=4194304);r.isBackwards?(u.sibling=t.child,t.child=u):(e=r.last,e!==null?e.sibling=u:t.child=u,r.last=u)}return r.tail!==null?(e=r.tail,r.rendering=e,r.tail=e.sibling,r.renderingStartTime=Rt(),e.sibling=null,i=Je.current,H(Je,c?i&1|2:i&1),we&&On(t,r.treeForkCount),e):(Ve(t),null);case 22:case 23:return Bt(t),Ic(),r=t.memoizedState!==null,e!==null?e.memoizedState!==null!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?(i&536870912)!==0&&(t.flags&128)===0&&(Ve(t),t.subtreeFlags&6&&(t.flags|=8192)):Ve(t),i=t.updateQueue,i!==null&&hr(t,i.retryQueue),i=null,e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(i=e.memoizedState.cachePool.pool),r=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(r=t.memoizedState.cachePool.pool),r!==i&&(t.flags|=2048),e!==null&&q(Pa),null;case 24:return i=null,e!==null&&(i=e.memoizedState.cache),t.memoizedState.cache!==i&&(t.flags|=2048),Dn(et),Ve(t),null;case 25:return null;case 30:return null}throw Error(l(156,t.tag))}function V1(e,t){switch(jc(t),t.tag){case 1:return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Dn(et),ke(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 26:case 27:case 5:return Be(t),null;case 31:if(t.memoizedState!==null){if(Bt(t),t.alternate===null)throw Error(l(340));Ra()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 13:if(Bt(t),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(l(340));Ra()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return q(Je),null;case 4:return ke(),null;case 10:return Dn(t.type),null;case 22:case 23:return Bt(t),Ic(),e!==null&&q(Pa),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 24:return Dn(et),null;case 25:return null;default:return null}}function Mf(e,t){switch(jc(t),t.tag){case 3:Dn(et),ke();break;case 26:case 27:case 5:Be(t);break;case 4:ke();break;case 31:t.memoizedState!==null&&Bt(t);break;case 13:Bt(t);break;case 19:q(Je);break;case 10:Dn(t.type);break;case 22:case 23:Bt(t),Ic(),e!==null&&q(Pa);break;case 24:Dn(et)}}function Ti(e,t){try{var i=t.updateQueue,r=i!==null?i.lastEffect:null;if(r!==null){var c=r.next;i=c;do{if((i.tag&e)===e){r=void 0;var u=i.create,y=i.inst;r=u(),y.destroy=r}i=i.next}while(i!==c)}}catch(v){ze(t,t.return,v)}}function ia(e,t,i){try{var r=t.updateQueue,c=r!==null?r.lastEffect:null;if(c!==null){var u=c.next;r=u;do{if((r.tag&e)===e){var y=r.inst,v=y.destroy;if(v!==void 0){y.destroy=void 0,c=t;var N=i,R=v;try{R()}catch(_){ze(c,N,_)}}}r=r.next}while(r!==u)}}catch(_){ze(t,t.return,_)}}function qf(e){var t=e.updateQueue;if(t!==null){var i=e.stateNode;try{Np(t,i)}catch(r){ze(e,e.return,r)}}}function Pf(e,t,i){i.props=Va(e.type,e.memoizedProps),i.state=e.memoizedState;try{i.componentWillUnmount()}catch(r){ze(e,t,r)}}function Si(e,t){try{var i=e.ref;if(i!==null){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;case 30:r=e.stateNode;break;default:r=e.stateNode}typeof i=="function"?e.refCleanup=i(r):i.current=r}}catch(c){ze(e,t,c)}}function vn(e,t){var i=e.ref,r=e.refCleanup;if(i!==null)if(typeof r=="function")try{r()}catch(c){ze(e,t,c)}finally{e.refCleanup=null,e=e.alternate,e!=null&&(e.refCleanup=null)}else if(typeof i=="function")try{i(null)}catch(c){ze(e,t,c)}else i.current=null}function If(e){var t=e.type,i=e.memoizedProps,r=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":i.autoFocus&&r.focus();break e;case"img":i.src?r.src=i.src:i.srcSet&&(r.srcset=i.srcSet)}}catch(c){ze(e,e.return,c)}}function fd(e,t,i){try{var r=e.stateNode;cj(r,e.type,i,t),r[Nt]=t}catch(c){ze(e,e.return,c)}}function Uf(e){return e.tag===5||e.tag===3||e.tag===26||e.tag===27&&ha(e.type)||e.tag===4}function gd(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Uf(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.tag===27&&ha(e.type)||e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function yd(e,t,i){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?(i.nodeType===9?i.body:i.nodeName==="HTML"?i.ownerDocument.body:i).insertBefore(e,t):(t=i.nodeType===9?i.body:i.nodeName==="HTML"?i.ownerDocument.body:i,t.appendChild(e),i=i._reactRootContainer,i!=null||t.onclick!==null||(t.onclick=Sn));else if(r!==4&&(r===27&&ha(e.type)&&(i=e.stateNode,t=null),e=e.child,e!==null))for(yd(e,t,i),e=e.sibling;e!==null;)yd(e,t,i),e=e.sibling}function mr(e,t,i){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?i.insertBefore(e,t):i.appendChild(e);else if(r!==4&&(r===27&&ha(e.type)&&(i=e.stateNode),e=e.child,e!==null))for(mr(e,t,i),e=e.sibling;e!==null;)mr(e,t,i),e=e.sibling}function Bf(e){var t=e.stateNode,i=e.memoizedProps;try{for(var r=e.type,c=t.attributes;c.length;)t.removeAttributeNode(c[0]);yt(t,r,i),t[mt]=e,t[Nt]=i}catch(u){ze(e,e.return,u)}}var Pn=!1,at=!1,bd=!1,_f=typeof WeakSet=="function"?WeakSet:Set,lt=null;function L1(e,t){if(e=e.containerInfo,Bd=Mr,e=$m(e),uc(e)){if("selectionStart"in e)var i={start:e.selectionStart,end:e.selectionEnd};else e:{i=(i=e.ownerDocument)&&i.defaultView||window;var r=i.getSelection&&i.getSelection();if(r&&r.rangeCount!==0){i=r.anchorNode;var c=r.anchorOffset,u=r.focusNode;r=r.focusOffset;try{i.nodeType,u.nodeType}catch{i=null;break e}var y=0,v=-1,N=-1,R=0,_=0,K=e,M=null;t:for(;;){for(var U;K!==i||c!==0&&K.nodeType!==3||(v=y+c),K!==u||r!==0&&K.nodeType!==3||(N=y+r),K.nodeType===3&&(y+=K.nodeValue.length),(U=K.firstChild)!==null;)M=K,K=U;for(;;){if(K===e)break t;if(M===i&&++R===c&&(v=y),M===u&&++_===r&&(N=y),(U=K.nextSibling)!==null)break;K=M,M=K.parentNode}K=U}i=v===-1||N===-1?null:{start:v,end:N}}else i=null}i=i||{start:0,end:0}}else i=null;for(_d={focusedElem:e,selectionRange:i},Mr=!1,lt=t;lt!==null;)if(t=lt,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,lt=e;else for(;lt!==null;){switch(t=lt,u=t.alternate,e=t.flags,t.tag){case 0:if((e&4)!==0&&(e=t.updateQueue,e=e!==null?e.events:null,e!==null))for(i=0;i<e.length;i++)c=e[i],c.ref.impl=c.nextImpl;break;case 11:case 15:break;case 1:if((e&1024)!==0&&u!==null){e=void 0,i=t,c=u.memoizedProps,u=u.memoizedState,r=i.stateNode;try{var te=Va(i.type,c);e=r.getSnapshotBeforeUpdate(te,u),r.__reactInternalSnapshotBeforeUpdate=e}catch(ce){ze(i,i.return,ce)}}break;case 3:if((e&1024)!==0){if(e=t.stateNode.containerInfo,i=e.nodeType,i===9)Gd(e);else if(i===1)switch(e.nodeName){case"HEAD":case"HTML":case"BODY":Gd(e);break;default:e.textContent=""}}break;case 5:case 26:case 27:case 6:case 4:case 17:break;default:if((e&1024)!==0)throw Error(l(163))}if(e=t.sibling,e!==null){e.return=t.return,lt=e;break}lt=t.return}}function Vf(e,t,i){var r=i.flags;switch(i.tag){case 0:case 11:case 15:Un(e,i),r&4&&Ti(5,i);break;case 1:if(Un(e,i),r&4)if(e=i.stateNode,t===null)try{e.componentDidMount()}catch(y){ze(i,i.return,y)}else{var c=Va(i.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(c,t,e.__reactInternalSnapshotBeforeUpdate)}catch(y){ze(i,i.return,y)}}r&64&&qf(i),r&512&&Si(i,i.return);break;case 3:if(Un(e,i),r&64&&(e=i.updateQueue,e!==null)){if(t=null,i.child!==null)switch(i.child.tag){case 27:case 5:t=i.child.stateNode;break;case 1:t=i.child.stateNode}try{Np(e,t)}catch(y){ze(i,i.return,y)}}break;case 27:t===null&&r&4&&Bf(i);case 26:case 5:Un(e,i),t===null&&r&4&&If(i),r&512&&Si(i,i.return);break;case 12:Un(e,i);break;case 31:Un(e,i),r&4&&Hf(e,i);break;case 13:Un(e,i),r&4&&Kf(e,i),r&64&&(e=i.memoizedState,e!==null&&(e=e.dehydrated,e!==null&&(i=$1.bind(null,i),yj(e,i))));break;case 22:if(r=i.memoizedState!==null||Pn,!r){t=t!==null&&t.memoizedState!==null||at,c=Pn;var u=at;Pn=r,(at=t)&&!u?Bn(e,i,(i.subtreeFlags&8772)!==0):Un(e,i),Pn=c,at=u}break;case 30:break;default:Un(e,i)}}function Lf(e){var t=e.alternate;t!==null&&(e.alternate=null,Lf(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&Yl(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Ge=null,St=!1;function In(e,t,i){for(i=i.child;i!==null;)Gf(e,t,i),i=i.sibling}function Gf(e,t,i){if(Mt&&typeof Mt.onCommitFiberUnmount=="function")try{Mt.onCommitFiberUnmount(Js,i)}catch{}switch(i.tag){case 26:at||vn(i,t),In(e,t,i),i.memoizedState?i.memoizedState.count--:i.stateNode&&(i=i.stateNode,i.parentNode.removeChild(i));break;case 27:at||vn(i,t);var r=Ge,c=St;ha(i.type)&&(Ge=i.stateNode,St=!1),In(e,t,i),qi(i.stateNode),Ge=r,St=c;break;case 5:at||vn(i,t);case 6:if(r=Ge,c=St,Ge=null,In(e,t,i),Ge=r,St=c,Ge!==null)if(St)try{(Ge.nodeType===9?Ge.body:Ge.nodeName==="HTML"?Ge.ownerDocument.body:Ge).removeChild(i.stateNode)}catch(u){ze(i,t,u)}else try{Ge.removeChild(i.stateNode)}catch(u){ze(i,t,u)}break;case 18:Ge!==null&&(St?(e=Ge,qg(e.nodeType===9?e.body:e.nodeName==="HTML"?e.ownerDocument.body:e,i.stateNode),Rs(e)):qg(Ge,i.stateNode));break;case 4:r=Ge,c=St,Ge=i.stateNode.containerInfo,St=!0,In(e,t,i),Ge=r,St=c;break;case 0:case 11:case 14:case 15:ia(2,i,t),at||ia(4,i,t),In(e,t,i);break;case 1:at||(vn(i,t),r=i.stateNode,typeof r.componentWillUnmount=="function"&&Pf(i,t,r)),In(e,t,i);break;case 21:In(e,t,i);break;case 22:at=(r=at)||i.memoizedState!==null,In(e,t,i),at=r;break;default:In(e,t,i)}}function Hf(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null))){e=e.dehydrated;try{Rs(e)}catch(i){ze(t,t.return,i)}}}function Kf(e,t){if(t.memoizedState===null&&(e=t.alternate,e!==null&&(e=e.memoizedState,e!==null&&(e=e.dehydrated,e!==null))))try{Rs(e)}catch(i){ze(t,t.return,i)}}function G1(e){switch(e.tag){case 31:case 13:case 19:var t=e.stateNode;return t===null&&(t=e.stateNode=new _f),t;case 22:return e=e.stateNode,t=e._retryCache,t===null&&(t=e._retryCache=new _f),t;default:throw Error(l(435,e.tag))}}function pr(e,t){var i=G1(e);t.forEach(function(r){if(!i.has(r)){i.add(r);var c=Q1.bind(null,e,r);r.then(c,c)}})}function At(e,t){var i=t.deletions;if(i!==null)for(var r=0;r<i.length;r++){var c=i[r],u=e,y=t,v=y;e:for(;v!==null;){switch(v.tag){case 27:if(ha(v.type)){Ge=v.stateNode,St=!1;break e}break;case 5:Ge=v.stateNode,St=!1;break e;case 3:case 4:Ge=v.stateNode.containerInfo,St=!0;break e}v=v.return}if(Ge===null)throw Error(l(160));Gf(u,y,c),Ge=null,St=!1,u=c.alternate,u!==null&&(u.return=null),c.return=null}if(t.subtreeFlags&13886)for(t=t.child;t!==null;)Ff(t,e),t=t.sibling}var ln=null;function Ff(e,t){var i=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:At(t,e),Ct(e),r&4&&(ia(3,e,e.return),Ti(3,e),ia(5,e,e.return));break;case 1:At(t,e),Ct(e),r&512&&(at||i===null||vn(i,i.return)),r&64&&Pn&&(e=e.updateQueue,e!==null&&(r=e.callbacks,r!==null&&(i=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=i===null?r:i.concat(r))));break;case 26:var c=ln;if(At(t,e),Ct(e),r&512&&(at||i===null||vn(i,i.return)),r&4){var u=i!==null?i.memoizedState:null;if(r=e.memoizedState,i===null)if(r===null)if(e.stateNode===null){e:{r=e.type,i=e.memoizedProps,c=c.ownerDocument||c;t:switch(r){case"title":u=c.getElementsByTagName("title")[0],(!u||u[Zs]||u[mt]||u.namespaceURI==="http://www.w3.org/2000/svg"||u.hasAttribute("itemprop"))&&(u=c.createElement(r),c.head.insertBefore(u,c.querySelector("head > title"))),yt(u,r,i),u[mt]=e,rt(u),r=u;break e;case"link":var y=Fg("link","href",c).get(r+(i.href||""));if(y){for(var v=0;v<y.length;v++)if(u=y[v],u.getAttribute("href")===(i.href==null||i.href===""?null:i.href)&&u.getAttribute("rel")===(i.rel==null?null:i.rel)&&u.getAttribute("title")===(i.title==null?null:i.title)&&u.getAttribute("crossorigin")===(i.crossOrigin==null?null:i.crossOrigin)){y.splice(v,1);break t}}u=c.createElement(r),yt(u,r,i),c.head.appendChild(u);break;case"meta":if(y=Fg("meta","content",c).get(r+(i.content||""))){for(v=0;v<y.length;v++)if(u=y[v],u.getAttribute("content")===(i.content==null?null:""+i.content)&&u.getAttribute("name")===(i.name==null?null:i.name)&&u.getAttribute("property")===(i.property==null?null:i.property)&&u.getAttribute("http-equiv")===(i.httpEquiv==null?null:i.httpEquiv)&&u.getAttribute("charset")===(i.charSet==null?null:i.charSet)){y.splice(v,1);break t}}u=c.createElement(r),yt(u,r,i),c.head.appendChild(u);break;default:throw Error(l(468,r))}u[mt]=e,rt(u),r=u}e.stateNode=r}else Wg(c,e.type,e.stateNode);else e.stateNode=Kg(c,r,e.memoizedProps);else u!==r?(u===null?i.stateNode!==null&&(i=i.stateNode,i.parentNode.removeChild(i)):u.count--,r===null?Wg(c,e.type,e.stateNode):Kg(c,r,e.memoizedProps)):r===null&&e.stateNode!==null&&fd(e,e.memoizedProps,i.memoizedProps)}break;case 27:At(t,e),Ct(e),r&512&&(at||i===null||vn(i,i.return)),i!==null&&r&4&&fd(e,e.memoizedProps,i.memoizedProps);break;case 5:if(At(t,e),Ct(e),r&512&&(at||i===null||vn(i,i.return)),e.flags&32){c=e.stateNode;try{ns(c,"")}catch(te){ze(e,e.return,te)}}r&4&&e.stateNode!=null&&(c=e.memoizedProps,fd(e,c,i!==null?i.memoizedProps:c)),r&1024&&(bd=!0);break;case 6:if(At(t,e),Ct(e),r&4){if(e.stateNode===null)throw Error(l(162));r=e.memoizedProps,i=e.stateNode;try{i.nodeValue=r}catch(te){ze(e,e.return,te)}}break;case 3:if(Er=null,c=ln,ln=Cr(t.containerInfo),At(t,e),ln=c,Ct(e),r&4&&i!==null&&i.memoizedState.isDehydrated)try{Rs(t.containerInfo)}catch(te){ze(e,e.return,te)}bd&&(bd=!1,Wf(e));break;case 4:r=ln,ln=Cr(e.stateNode.containerInfo),At(t,e),Ct(e),ln=r;break;case 12:At(t,e),Ct(e);break;case 31:At(t,e),Ct(e),r&4&&(r=e.updateQueue,r!==null&&(e.updateQueue=null,pr(e,r)));break;case 13:At(t,e),Ct(e),e.child.flags&8192&&e.memoizedState!==null!=(i!==null&&i.memoizedState!==null)&&(gr=Rt()),r&4&&(r=e.updateQueue,r!==null&&(e.updateQueue=null,pr(e,r)));break;case 22:c=e.memoizedState!==null;var N=i!==null&&i.memoizedState!==null,R=Pn,_=at;if(Pn=R||c,at=_||N,At(t,e),at=_,Pn=R,Ct(e),r&8192)e:for(t=e.stateNode,t._visibility=c?t._visibility&-2:t._visibility|1,c&&(i===null||N||Pn||at||La(e)),i=null,t=e;;){if(t.tag===5||t.tag===26){if(i===null){N=i=t;try{if(u=N.stateNode,c)y=u.style,typeof y.setProperty=="function"?y.setProperty("display","none","important"):y.display="none";else{v=N.stateNode;var K=N.memoizedProps.style,M=K!=null&&K.hasOwnProperty("display")?K.display:null;v.style.display=M==null||typeof M=="boolean"?"":(""+M).trim()}}catch(te){ze(N,N.return,te)}}}else if(t.tag===6){if(i===null){N=t;try{N.stateNode.nodeValue=c?"":N.memoizedProps}catch(te){ze(N,N.return,te)}}}else if(t.tag===18){if(i===null){N=t;try{var U=N.stateNode;c?Pg(U,!0):Pg(N.stateNode,!1)}catch(te){ze(N,N.return,te)}}}else if((t.tag!==22&&t.tag!==23||t.memoizedState===null||t===e)&&t.child!==null){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;t.sibling===null;){if(t.return===null||t.return===e)break e;i===t&&(i=null),t=t.return}i===t&&(i=null),t.sibling.return=t.return,t=t.sibling}r&4&&(r=e.updateQueue,r!==null&&(i=r.retryQueue,i!==null&&(r.retryQueue=null,pr(e,i))));break;case 19:At(t,e),Ct(e),r&4&&(r=e.updateQueue,r!==null&&(e.updateQueue=null,pr(e,r)));break;case 30:break;case 21:break;default:At(t,e),Ct(e)}}function Ct(e){var t=e.flags;if(t&2){try{for(var i,r=e.return;r!==null;){if(Uf(r)){i=r;break}r=r.return}if(i==null)throw Error(l(160));switch(i.tag){case 27:var c=i.stateNode,u=gd(e);mr(e,u,c);break;case 5:var y=i.stateNode;i.flags&32&&(ns(y,""),i.flags&=-33);var v=gd(e);mr(e,v,y);break;case 3:case 4:var N=i.stateNode.containerInfo,R=gd(e);yd(e,R,N);break;default:throw Error(l(161))}}catch(_){ze(e,e.return,_)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function Wf(e){if(e.subtreeFlags&1024)for(e=e.child;e!==null;){var t=e;Wf(t),t.tag===5&&t.flags&1024&&t.stateNode.reset(),e=e.sibling}}function Un(e,t){if(t.subtreeFlags&8772)for(t=t.child;t!==null;)Vf(e,t.alternate,t),t=t.sibling}function La(e){for(e=e.child;e!==null;){var t=e;switch(t.tag){case 0:case 11:case 14:case 15:ia(4,t,t.return),La(t);break;case 1:vn(t,t.return);var i=t.stateNode;typeof i.componentWillUnmount=="function"&&Pf(t,t.return,i),La(t);break;case 27:qi(t.stateNode);case 26:case 5:vn(t,t.return),La(t);break;case 22:t.memoizedState===null&&La(t);break;case 30:La(t);break;default:La(t)}e=e.sibling}}function Bn(e,t,i){for(i=i&&(t.subtreeFlags&8772)!==0,t=t.child;t!==null;){var r=t.alternate,c=e,u=t,y=u.flags;switch(u.tag){case 0:case 11:case 15:Bn(c,u,i),Ti(4,u);break;case 1:if(Bn(c,u,i),r=u,c=r.stateNode,typeof c.componentDidMount=="function")try{c.componentDidMount()}catch(R){ze(r,r.return,R)}if(r=u,c=r.updateQueue,c!==null){var v=r.stateNode;try{var N=c.shared.hiddenCallbacks;if(N!==null)for(c.shared.hiddenCallbacks=null,c=0;c<N.length;c++)kp(N[c],v)}catch(R){ze(r,r.return,R)}}i&&y&64&&qf(u),Si(u,u.return);break;case 27:Bf(u);case 26:case 5:Bn(c,u,i),i&&r===null&&y&4&&If(u),Si(u,u.return);break;case 12:Bn(c,u,i);break;case 31:Bn(c,u,i),i&&y&4&&Hf(c,u);break;case 13:Bn(c,u,i),i&&y&4&&Kf(c,u);break;case 22:u.memoizedState===null&&Bn(c,u,i),Si(u,u.return);break;case 30:break;default:Bn(c,u,i)}t=t.sibling}}function xd(e,t){var i=null;e!==null&&e.memoizedState!==null&&e.memoizedState.cachePool!==null&&(i=e.memoizedState.cachePool.pool),e=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(e=t.memoizedState.cachePool.pool),e!==i&&(e!=null&&e.refCount++,i!=null&&hi(i))}function vd(e,t){e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&hi(e))}function cn(e,t,i,r){if(t.subtreeFlags&10256)for(t=t.child;t!==null;)Yf(e,t,i,r),t=t.sibling}function Yf(e,t,i,r){var c=t.flags;switch(t.tag){case 0:case 11:case 15:cn(e,t,i,r),c&2048&&Ti(9,t);break;case 1:cn(e,t,i,r);break;case 3:cn(e,t,i,r),c&2048&&(e=null,t.alternate!==null&&(e=t.alternate.memoizedState.cache),t=t.memoizedState.cache,t!==e&&(t.refCount++,e!=null&&hi(e)));break;case 12:if(c&2048){cn(e,t,i,r),e=t.stateNode;try{var u=t.memoizedProps,y=u.id,v=u.onPostCommit;typeof v=="function"&&v(y,t.alternate===null?"mount":"update",e.passiveEffectDuration,-0)}catch(N){ze(t,t.return,N)}}else cn(e,t,i,r);break;case 31:cn(e,t,i,r);break;case 13:cn(e,t,i,r);break;case 23:break;case 22:u=t.stateNode,y=t.alternate,t.memoizedState!==null?u._visibility&2?cn(e,t,i,r):Ai(e,t):u._visibility&2?cn(e,t,i,r):(u._visibility|=2,js(e,t,i,r,(t.subtreeFlags&10256)!==0||!1)),c&2048&&xd(y,t);break;case 24:cn(e,t,i,r),c&2048&&vd(t.alternate,t);break;default:cn(e,t,i,r)}}function js(e,t,i,r,c){for(c=c&&((t.subtreeFlags&10256)!==0||!1),t=t.child;t!==null;){var u=e,y=t,v=i,N=r,R=y.flags;switch(y.tag){case 0:case 11:case 15:js(u,y,v,N,c),Ti(8,y);break;case 23:break;case 22:var _=y.stateNode;y.memoizedState!==null?_._visibility&2?js(u,y,v,N,c):Ai(u,y):(_._visibility|=2,js(u,y,v,N,c)),c&&R&2048&&xd(y.alternate,y);break;case 24:js(u,y,v,N,c),c&&R&2048&&vd(y.alternate,y);break;default:js(u,y,v,N,c)}t=t.sibling}}function Ai(e,t){if(t.subtreeFlags&10256)for(t=t.child;t!==null;){var i=e,r=t,c=r.flags;switch(r.tag){case 22:Ai(i,r),c&2048&&xd(r.alternate,r);break;case 24:Ai(i,r),c&2048&&vd(r.alternate,r);break;default:Ai(i,r)}t=t.sibling}}var Ci=8192;function ks(e,t,i){if(e.subtreeFlags&Ci)for(e=e.child;e!==null;)Xf(e,t,i),e=e.sibling}function Xf(e,t,i){switch(e.tag){case 26:ks(e,t,i),e.flags&Ci&&e.memoizedState!==null&&Oj(i,ln,e.memoizedState,e.memoizedProps);break;case 5:ks(e,t,i);break;case 3:case 4:var r=ln;ln=Cr(e.stateNode.containerInfo),ks(e,t,i),ln=r;break;case 22:e.memoizedState===null&&(r=e.alternate,r!==null&&r.memoizedState!==null?(r=Ci,Ci=16777216,ks(e,t,i),Ci=r):ks(e,t,i));break;default:ks(e,t,i)}}function Jf(e){var t=e.alternate;if(t!==null&&(e=t.child,e!==null)){t.child=null;do t=e.sibling,e.sibling=null,e=t;while(e!==null)}}function Oi(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var i=0;i<t.length;i++){var r=t[i];lt=r,Qf(r,e)}Jf(e)}if(e.subtreeFlags&10256)for(e=e.child;e!==null;)$f(e),e=e.sibling}function $f(e){switch(e.tag){case 0:case 11:case 15:Oi(e),e.flags&2048&&ia(9,e,e.return);break;case 3:Oi(e);break;case 12:Oi(e);break;case 22:var t=e.stateNode;e.memoizedState!==null&&t._visibility&2&&(e.return===null||e.return.tag!==13)?(t._visibility&=-3,fr(e)):Oi(e);break;default:Oi(e)}}function fr(e){var t=e.deletions;if((e.flags&16)!==0){if(t!==null)for(var i=0;i<t.length;i++){var r=t[i];lt=r,Qf(r,e)}Jf(e)}for(e=e.child;e!==null;){switch(t=e,t.tag){case 0:case 11:case 15:ia(8,t,t.return),fr(t);break;case 22:i=t.stateNode,i._visibility&2&&(i._visibility&=-3,fr(t));break;default:fr(t)}e=e.sibling}}function Qf(e,t){for(;lt!==null;){var i=lt;switch(i.tag){case 0:case 11:case 15:ia(8,i,t);break;case 23:case 22:if(i.memoizedState!==null&&i.memoizedState.cachePool!==null){var r=i.memoizedState.cachePool.pool;r!=null&&r.refCount++}break;case 24:hi(i.memoizedState.cache)}if(r=i.child,r!==null)r.return=i,lt=r;else e:for(i=e;lt!==null;){r=lt;var c=r.sibling,u=r.return;if(Lf(r),r===i){lt=null;break e}if(c!==null){c.return=u,lt=c;break e}lt=u}}}var H1={getCacheForType:function(e){var t=ft(et),i=t.data.get(e);return i===void 0&&(i=e(),t.data.set(e,i)),i},cacheSignal:function(){return ft(et).controller.signal}},K1=typeof WeakMap=="function"?WeakMap:Map,Oe=0,Ue=null,ye=null,xe=0,De=0,_t=null,oa=!1,Ns=!1,wd=!1,_n=0,We=0,ra=0,Ga=0,jd=0,Vt=0,Ts=0,Ei=null,Ot=null,kd=!1,gr=0,Zf=0,yr=1/0,br=null,la=null,ot=0,ca=null,Ss=null,Vn=0,Nd=0,Td=null,eg=null,Di=0,Sd=null;function Lt(){return(Oe&2)!==0&&xe!==0?xe&-xe:B.T!==null?zd():fm()}function tg(){if(Vt===0)if((xe&536870912)===0||we){var e=So;So<<=1,(So&3932160)===0&&(So=262144),Vt=e}else Vt=536870912;return e=Ut.current,e!==null&&(e.flags|=32),Vt}function Et(e,t,i){(e===Ue&&(De===2||De===9)||e.cancelPendingCommit!==null)&&(As(e,0),da(e,xe,Vt,!1)),Qs(e,i),((Oe&2)===0||e!==Ue)&&(e===Ue&&((Oe&2)===0&&(Ga|=i),We===4&&da(e,xe,Vt,!1)),wn(e))}function ng(e,t,i){if((Oe&6)!==0)throw Error(l(327));var r=!i&&(t&127)===0&&(t&e.expiredLanes)===0||$s(e,t),c=r?Y1(e,t):Cd(e,t,!0),u=r;do{if(c===0){Ns&&!r&&da(e,t,0,!1);break}else{if(i=e.current.alternate,u&&!F1(i)){c=Cd(e,t,!1),u=!1;continue}if(c===2){if(u=t,e.errorRecoveryDisabledLanes&u)var y=0;else y=e.pendingLanes&-536870913,y=y!==0?y:y&536870912?536870912:0;if(y!==0){t=y;e:{var v=e;c=Ei;var N=v.current.memoizedState.isDehydrated;if(N&&(As(v,y).flags|=256),y=Cd(v,y,!1),y!==2){if(wd&&!N){v.errorRecoveryDisabledLanes|=u,Ga|=u,c=4;break e}u=Ot,Ot=c,u!==null&&(Ot===null?Ot=u:Ot.push.apply(Ot,u))}c=y}if(u=!1,c!==2)continue}}if(c===1){As(e,0),da(e,t,0,!0);break}e:{switch(r=e,u=c,u){case 0:case 1:throw Error(l(345));case 4:if((t&4194048)!==t)break;case 6:da(r,t,Vt,!oa);break e;case 2:Ot=null;break;case 3:case 5:break;default:throw Error(l(329))}
vendor: 15,506 bytes, line 8
8if((t&62914560)===t&&(c=gr+300-Rt(),10<c)){if(da(r,t,Vt,!oa),Co(r,0,!0)!==0)break e;Vn=t,r.timeoutHandle=Rg(ag.bind(null,r,i,Ot,br,kd,t,Vt,Ga,Ts,oa,u,"Throttled",-0,0),c);break e}ag(r,i,Ot,br,kd,t,Vt,Ga,Ts,oa,u,null,-0,0)}}break}while(!0);wn(e)}function ag(e,t,i,r,c,u,y,v,N,R,_,K,M,U){if(e.timeoutHandle=-1,K=t.subtreeFlags,K&8192||(K&16785408)===16785408){K={stylesheets:null,count:0,imgCount:0,imgBytes:0,suspenseyImages:[],waitingForImages:!0,waitingForViewTransition:!1,unsuspend:Sn},Xf(t,u,K);var te=(u&62914560)===u?gr-Rt():(u&4194048)===u?Zf-Rt():0;if(te=Ej(K,te),te!==null){Vn=u,e.cancelPendingCommit=te(ug.bind(null,e,t,u,i,r,c,y,v,N,_,K,null,M,U)),da(e,u,y,!R);return}}ug(e,t,u,i,r,c,y,v,N)}function F1(e){for(var t=e;;){var i=t.tag;if((i===0||i===11||i===15)&&t.flags&16384&&(i=t.updateQueue,i!==null&&(i=i.stores,i!==null)))for(var r=0;r<i.length;r++){var c=i[r],u=c.getSnapshot;c=c.value;try{if(!Pt(u(),c))return!1}catch{return!1}}if(i=t.child,t.subtreeFlags&16384&&i!==null)i.return=t,t=i;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function da(e,t,i,r){t&=~jd,t&=~Ga,e.suspendedLanes|=t,e.pingedLanes&=~t,r&&(e.warmLanes|=t),r=e.expirationTimes;for(var c=t;0<c;){var u=31-qt(c),y=1<<u;r[u]=-1,c&=~y}i!==0&&hm(e,i,t)}function xr(){return(Oe&6)===0?(zi(0),!1):!0}function Ad(){if(ye!==null){if(De===0)var e=ye.return;else e=ye,En=Ma=null,Gc(e),ys=null,pi=0,e=ye;for(;e!==null;)Mf(e.alternate,e),e=e.return;ye=null}}function As(e,t){var i=e.timeoutHandle;i!==-1&&(e.timeoutHandle=-1,hj(i)),i=e.cancelPendingCommit,i!==null&&(e.cancelPendingCommit=null,i()),Vn=0,Ad(),Ue=e,ye=i=Cn(e.current,null),xe=t,De=0,_t=null,oa=!1,Ns=$s(e,t),wd=!1,Ts=Vt=jd=Ga=ra=We=0,Ot=Ei=null,kd=!1,(t&8)!==0&&(t|=t&32);var r=e.entangledLanes;if(r!==0)for(e=e.entanglements,r&=t;0<r;){var c=31-qt(r),u=1<<c;t|=e[c],r&=~u}return _n=t,_o(),i}function sg(e,t){me=null,B.H=ji,t===gs||t===Yo?(t=xp(),De=3):t===Dc?(t=xp(),De=4):De=t===id?8:t!==null&&typeof t=="object"&&typeof t.then=="function"?6:1,_t=t,ye===null&&(We=1,lr(e,Jt(t,e.current)))}function ig(){var e=Ut.current;return e===null?!0:(xe&4194048)===xe?en===null:(xe&62914560)===xe||(xe&536870912)!==0?e===en:!1}function og(){var e=B.H;return B.H=ji,e===null?ji:e}function rg(){var e=B.A;return B.A=H1,e}function vr(){We=4,oa||(xe&4194048)!==xe&&Ut.current!==null||(Ns=!0),(ra&134217727)===0&&(Ga&134217727)===0||Ue===null||da(Ue,xe,Vt,!1)}function Cd(e,t,i){var r=Oe;Oe|=2;var c=og(),u=rg();(Ue!==e||xe!==t)&&(br=null,As(e,t)),t=!1;var y=We;e:do try{if(De!==0&&ye!==null){var v=ye,N=_t;switch(De){case 8:Ad(),y=6;break e;case 3:case 2:case 9:case 6:Ut.current===null&&(t=!0);var R=De;if(De=0,_t=null,Cs(e,v,N,R),i&&Ns){y=0;break e}break;default:R=De,De=0,_t=null,Cs(e,v,N,R)}}W1(),y=We;break}catch(_){sg(e,_)}while(!0);return t&&e.shellSuspendCounter++,En=Ma=null,Oe=r,B.H=c,B.A=u,ye===null&&(Ue=null,xe=0,_o()),y}function W1(){for(;ye!==null;)lg(ye)}function Y1(e,t){var i=Oe;Oe|=2;var r=og(),c=rg();Ue!==e||xe!==t?(br=null,yr=Rt()+500,As(e,t)):Ns=$s(e,t);e:do try{if(De!==0&&ye!==null){t=ye;var u=_t;t:switch(De){case 1:De=0,_t=null,Cs(e,t,u,1);break;case 2:case 9:if(yp(u)){De=0,_t=null,cg(t);break}t=function(){De!==2&&De!==9||Ue!==e||(De=7),wn(e)},u.then(t,t);break e;case 3:De=7;break e;case 4:De=5;break e;case 7:yp(u)?(De=0,_t=null,cg(t)):(De=0,_t=null,Cs(e,t,u,7));break;case 5:var y=null;switch(ye.tag){case 26:y=ye.memoizedState;case 5:case 27:var v=ye;if(y?Yg(y):v.stateNode.complete){De=0,_t=null;var N=v.sibling;if(N!==null)ye=N;else{var R=v.return;R!==null?(ye=R,wr(R)):ye=null}break t}}De=0,_t=null,Cs(e,t,u,5);break;case 6:De=0,_t=null,Cs(e,t,u,6);break;case 8:Ad(),We=6;break e;default:throw Error(l(462))}}X1();break}catch(_){sg(e,_)}while(!0);return En=Ma=null,B.H=r,B.A=c,Oe=i,ye!==null?0:(Ue=null,xe=0,_o(),We)}function X1(){for(;ye!==null&&!b0();)lg(ye)}function lg(e){var t=zf(e.alternate,e,_n);e.memoizedProps=e.pendingProps,t===null?wr(e):ye=t}function cg(e){var t=e,i=t.alternate;switch(t.tag){case 15:case 0:t=Sf(i,t,t.pendingProps,t.type,void 0,xe);break;case 11:t=Sf(i,t,t.pendingProps,t.type.render,t.ref,xe);break;case 5:Gc(t);default:Mf(i,t),t=ye=op(t,_n),t=zf(i,t,_n)}e.memoizedProps=e.pendingProps,t===null?wr(e):ye=t}function Cs(e,t,i,r){En=Ma=null,Gc(t),ys=null,pi=0;var c=t.return;try{if(I1(e,c,t,i,xe)){We=1,lr(e,Jt(i,e.current)),ye=null;return}}catch(u){if(c!==null)throw ye=c,u;We=1,lr(e,Jt(i,e.current)),ye=null;return}t.flags&32768?(we||r===1?e=!0:Ns||(xe&536870912)!==0?e=!1:(oa=e=!0,(r===2||r===9||r===3||r===6)&&(r=Ut.current,r!==null&&r.tag===13&&(r.flags|=16384))),dg(t,e)):wr(t)}function wr(e){var t=e;do{if((t.flags&32768)!==0){dg(t,oa);return}e=t.return;var i=_1(t.alternate,t,_n);if(i!==null){ye=i;return}if(t=t.sibling,t!==null){ye=t;return}ye=t=e}while(t!==null);We===0&&(We=5)}function dg(e,t){do{var i=V1(e.alternate,e);if(i!==null){i.flags&=32767,ye=i;return}if(i=e.return,i!==null&&(i.flags|=32768,i.subtreeFlags=0,i.deletions=null),!t&&(e=e.sibling,e!==null)){ye=e;return}ye=e=i}while(e!==null);We=6,ye=null}function ug(e,t,i,r,c,u,y,v,N){e.cancelPendingCommit=null;do jr();while(ot!==0);if((Oe&6)!==0)throw Error(l(327));if(t!==null){if(t===e.current)throw Error(l(177));if(u=t.lanes|t.childLanes,u|=gc,C0(e,i,u,y,v,N),e===Ue&&(ye=Ue=null,xe=0),Ss=t,ca=e,Vn=i,Nd=u,Td=c,eg=r,(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?(e.callbackNode=null,e.callbackPriority=0,Z1(No,function(){return gg(),null})):(e.callbackNode=null,e.callbackPriority=0),r=(t.flags&13878)!==0,(t.subtreeFlags&13878)!==0||r){r=B.T,B.T=null,c=V.p,V.p=2,y=Oe,Oe|=4;try{L1(e,t,i)}finally{Oe=y,V.p=c,B.T=r}}ot=1,hg(),mg(),pg()}}function hg(){if(ot===1){ot=0;var e=ca,t=Ss,i=(t.flags&13878)!==0;if((t.subtreeFlags&13878)!==0||i){i=B.T,B.T=null;var r=V.p;V.p=2;var c=Oe;Oe|=4;try{Ff(t,e);var u=_d,y=$m(e.containerInfo),v=u.focusedElem,N=u.selectionRange;if(y!==v&&v&&v.ownerDocument&&Jm(v.ownerDocument.documentElement,v)){if(N!==null&&uc(v)){var R=N.start,_=N.end;if(_===void 0&&(_=R),"selectionStart"in v)v.selectionStart=R,v.selectionEnd=Math.min(_,v.value.length);else{var K=v.ownerDocument||document,M=K&&K.defaultView||window;if(M.getSelection){var U=M.getSelection(),te=v.textContent.length,ce=Math.min(N.start,te),Pe=N.end===void 0?ce:Math.min(N.end,te);!U.extend&&ce>Pe&&(y=Pe,Pe=ce,ce=y);var C=Xm(v,ce),A=Xm(v,Pe);if(C&&A&&(U.rangeCount!==1||U.anchorNode!==C.node||U.anchorOffset!==C.offset||U.focusNode!==A.node||U.focusOffset!==A.offset)){var z=K.createRange();z.setStart(C.node,C.offset),U.removeAllRanges(),ce>Pe?(U.addRange(z),U.extend(A.node,A.offset)):(z.setEnd(A.node,A.offset),U.addRange(z))}}}}for(K=[],U=v;U=U.parentNode;)U.nodeType===1&&K.push({element:U,left:U.scrollLeft,top:U.scrollTop});for(typeof v.focus=="function"&&v.focus(),v=0;v<K.length;v++){var G=K[v];G.element.scrollLeft=G.left,G.element.scrollTop=G.top}}Mr=!!Bd,_d=Bd=null}finally{Oe=c,V.p=r,B.T=i}}e.current=t,ot=2}}function mg(){if(ot===2){ot=0;var e=ca,t=Ss,i=(t.flags&8772)!==0;if((t.subtreeFlags&8772)!==0||i){i=B.T,B.T=null;var r=V.p;V.p=2;var c=Oe;Oe|=4;try{Vf(e,t.alternate,t)}finally{Oe=c,V.p=r,B.T=i}}ot=3}}function pg(){if(ot===4||ot===3){ot=0,x0();var e=ca,t=Ss,i=Vn,r=eg;(t.subtreeFlags&10256)!==0||(t.flags&10256)!==0?ot=5:(ot=0,Ss=ca=null,fg(e,e.pendingLanes));var c=e.pendingLanes;if(c===0&&(la=null),Fl(i),t=t.stateNode,Mt&&typeof Mt.onCommitFiberRoot=="function")try{Mt.onCommitFiberRoot(Js,t,void 0,(t.current.flags&128)===128)}catch{}if(r!==null){t=B.T,c=V.p,V.p=2,B.T=null;try{for(var u=e.onRecoverableError,y=0;y<r.length;y++){var v=r[y];u(v.value,{componentStack:v.stack})}}finally{B.T=t,V.p=c}}(Vn&3)!==0&&jr(),wn(e),c=e.pendingLanes,(i&261930)!==0&&(c&42)!==0?e===Sd?Di++:(Di=0,Sd=e):Di=0,zi(0)}}function fg(e,t){(e.pooledCacheLanes&=t)===0&&(t=e.pooledCache,t!=null&&(e.pooledCache=null,hi(t)))}function jr(){return hg(),mg(),pg(),gg()}function gg(){if(ot!==5)return!1;var e=ca,t=Nd;Nd=0;var i=Fl(Vn),r=B.T,c=V.p;try{V.p=32>i?32:i,B.T=null,i=Td,Td=null;var u=ca,y=Vn;if(ot=0,Ss=ca=null,Vn=0,(Oe&6)!==0)throw Error(l(331));var v=Oe;if(Oe|=4,$f(u.current),Yf(u,u.current,y,i),Oe=v,zi(0,!1),Mt&&typeof Mt.onPostCommitFiberRoot=="function")try{Mt.onPostCommitFiberRoot(Js,u)}catch{}return!0}finally{V.p=c,B.T=r,fg(e,t)}}function yg(e,t,i){t=Jt(i,t),t=sd(e.stateNode,t,2),e=na(e,t,2),e!==null&&(Qs(e,2),wn(e))}function ze(e,t,i){if(e.tag===3)yg(e,e,i);else for(;t!==null;){if(t.tag===3){yg(t,e,i);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof r.componentDidCatch=="function"&&(la===null||!la.has(r))){e=Jt(i,e),i=bf(2),r=na(t,i,2),r!==null&&(xf(i,r,t,e),Qs(r,2),wn(r));break}}t=t.return}}function Od(e,t,i){var r=e.pingCache;if(r===null){r=e.pingCache=new K1;var c=new Set;r.set(t,c)}else c=r.get(t),c===void 0&&(c=new Set,r.set(t,c));c.has(i)||(wd=!0,c.add(i),e=J1.bind(null,e,t,i),t.then(e,e))}function J1(e,t,i){var r=e.pingCache;r!==null&&r.delete(t),e.pingedLanes|=e.suspendedLanes&i,e.warmLanes&=~i,Ue===e&&(xe&i)===i&&(We===4||We===3&&(xe&62914560)===xe&&300>Rt()-gr?(Oe&2)===0&&As(e,0):jd|=i,Ts===xe&&(Ts=0)),wn(e)}function bg(e,t){t===0&&(t=um()),e=Da(e,t),e!==null&&(Qs(e,t),wn(e))}function $1(e){var t=e.memoizedState,i=0;t!==null&&(i=t.retryLane),bg(e,i)}function Q1(e,t){var i=0;switch(e.tag){case 31:case 13:var r=e.stateNode,c=e.memoizedState;c!==null&&(i=c.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(l(314))}r!==null&&r.delete(t),bg(e,i)}function Z1(e,t){return Ll(e,t)}var kr=null,Os=null,Ed=!1,Nr=!1,Dd=!1,ua=0;function wn(e){e!==Os&&e.next===null&&(Os===null?kr=Os=e:Os=Os.next=e),Nr=!0,Ed||(Ed=!0,tj())}function zi(e,t){if(!Dd&&Nr){Dd=!0;do for(var i=!1,r=kr;r!==null;){if(e!==0){var c=r.pendingLanes;if(c===0)var u=0;else{var y=r.suspendedLanes,v=r.pingedLanes;u=(1<<31-qt(42|e)+1)-1,u&=c&~(y&~v),u=u&201326741?u&201326741|1:u?u|2:0}u!==0&&(i=!0,jg(r,u))}else u=xe,u=Co(r,r===Ue?u:0,r.cancelPendingCommit!==null||r.timeoutHandle!==-1),(u&3)===0||$s(r,u)||(i=!0,jg(r,u));r=r.next}while(i);Dd=!1}}function ej(){xg()}function xg(){Nr=Ed=!1;var e=0;ua!==0&&uj()&&(e=ua);for(var t=Rt(),i=null,r=kr;r!==null;){var c=r.next,u=vg(r,t);u===0?(r.next=null,i===null?kr=c:i.next=c,c===null&&(Os=i)):(i=r,(e!==0||(u&3)!==0)&&(Nr=!0)),r=c}ot!==0&&ot!==5||zi(e),ua!==0&&(ua=0)}function vg(e,t){for(var i=e.suspendedLanes,r=e.pingedLanes,c=e.expirationTimes,u=e.pendingLanes&-62914561;0<u;){var y=31-qt(u),v=1<<y,N=c[y];N===-1?((v&i)===0||(v&r)!==0)&&(c[y]=A0(v,t)):N<=t&&(e.expiredLanes|=v),u&=~v}if(t=Ue,i=xe,i=Co(e,e===t?i:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),r=e.callbackNode,i===0||e===t&&(De===2||De===9)||e.cancelPendingCommit!==null)return r!==null&&r!==null&&Gl(r),e.callbackNode=null,e.callbackPriority=0;if((i&3)===0||$s(e,i)){if(t=i&-i,t===e.callbackPriority)return t;switch(r!==null&&Gl(r),Fl(i)){case 2:case 8:i=cm;break;case 32:i=No;break;case 268435456:i=dm;break;default:i=No}return r=wg.bind(null,e),i=Ll(i,r),e.callbackPriority=t,e.callbackNode=i,t}return r!==null&&r!==null&&Gl(r),e.callbackPriority=2,e.callbackNode=null,2}function wg(e,t){if(ot!==0&&ot!==5)return e.callbackNode=null,e.callbackPriority=0,null;var i=e.callbackNode;if(jr()&&e.callbackNode!==i)return null;var r=xe;return r=Co(e,e===Ue?r:0,e.cancelPendingCommit!==null||e.timeoutHandle!==-1),r===0?null:(ng(e,r,t),vg(e,Rt()),e.callbackNode!=null&&e.callbackNode===i?wg.bind(null,e):null)}function jg(e,t){if(jr())return null;ng(e,t,!0)}function tj(){mj(function(){(Oe&6)!==0?Ll(lm,ej):xg()})}function zd(){if(ua===0){var e=ps;e===0&&(e=To,To<<=1,(To&261888)===0&&(To=256)),ua=e}return ua}function kg(e){return e==null||typeof e=="symbol"||typeof e=="boolean"?null:typeof e=="function"?e:zo(""+e)}function Ng(e,t){var i=t.ownerDocument.createElement("input");return i.name=t.name,i.value=t.value,e.id&&i.setAttribute("form",e.id),t.parentNode.insertBefore(i,t),e=new FormData(e),i.parentNode.removeChild(i),e}function nj(e,t,i,r,c){if(t==="submit"&&i&&i.stateNode===c){var u=kg((c[Nt]||null).action),y=r.submitter;y&&(t=(t=y[Nt]||null)?kg(t.formAction):y.getAttribute("formAction"),t!==null&&(u=t,y=null));var v=new Po("action","action",null,r,c);e.push({event:v,listeners:[{instance:null,listener:function(){if(r.defaultPrevented){if(ua!==0){var N=y?Ng(c,y):new FormData(c);Qc(i,{pending:!0,data:N,method:c.method,action:u},null,N)}}else typeof u=="function"&&(v.preventDefault(),N=y?Ng(c,y):new FormData(c),Qc(i,{pending:!0,data:N,method:c.method,action:u},u,N))},currentTarget:c}]})}}for(var Rd=0;Rd<fc.length;Rd++){var Md=fc[Rd],aj=Md.toLowerCase(),sj=Md[0].toUpperCase()+Md.slice(1);rn(aj,"on"+sj)}rn(ep,"onAnimationEnd"),rn(tp,"onAnimationIteration"),rn(np,"onAnimationStart"),rn("dblclick","onDoubleClick"),rn("focusin","onFocus"),rn("focusout","onBlur"),rn(v1,"onTransitionRun"),rn(w1,"onTransitionStart"),rn(j1,"onTransitionCancel"),rn(ap,"onTransitionEnd"),es("onMouseEnter",["mouseout","mouseover"]),es("onMouseLeave",["mouseout","mouseover"]),es("onPointerEnter",["pointerout","pointerover"]),es("onPointerLeave",["pointerout","pointerover"]),Aa("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),Aa("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),Aa("onBeforeInput",["compositionend","keypress","textInput","paste"]),Aa("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),Aa("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),Aa("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Ri="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),ij=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(Ri));function Tg(e,t){t=(t&4)!==0;for(var i=0;i<e.length;i++){var r=e[i],c=r.event;r=r.listeners;e:{var u=void 0;if(t)for(var y=r.length-1;0<=y;y--){var v=r[y],N=v.instance,R=v.currentTarget;if(v=v.listener,N!==u&&c.isPropagationStopped())break e;u=v,c.currentTarget=R;try{u(c)}catch(_){Bo(_)}c.currentTarget=null,u=N}else for(y=0;y<r.length;y++){if(v=r[y],N=v.instance,R=v.currentTarget,v=v.listener,N!==u&&c.isPropagationStopped())break e;u=v,c.currentTarget=R;try{u(c)}catch(_){Bo(_)}c.currentTarget=null,u=N}}}}function be(e,t){var i=t[Wl];i===void 0&&(i=t[Wl]=new Set);var r=e+"__bubble";i.has(r)||(Sg(t,e,2,!1),i.add(r))}function qd(e,t,i){var r=0;t&&(r|=4),Sg(i,e,r,t)}var Tr="_reactListening"+Math.random().toString(36).slice(2);function Pd(e){if(!e[Tr]){e[Tr]=!0,bm.forEach(function(i){i!=="selectionchange"&&(ij.has(i)||qd(i,!1,e),qd(i,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Tr]||(t[Tr]=!0,qd("selectionchange",!1,t))}}function Sg(e,t,i,r){switch(ty(t)){case 2:var c=Rj;break;case 8:c=Mj;break;default:c=$d}i=c.bind(null,t,i,e),c=void 0,!nc||t!=="touchstart"&&t!=="touchmove"&&t!=="wheel"||(c=!0),r?c!==void 0?e.addEventListener(t,i,{capture:!0,passive:c}):e.addEventListener(t,i,!0):c!==void 0?e.addEventListener(t,i,{passive:c}):e.addEventListener(t,i,!1)}function Id(e,t,i,r,c){var u=r;if((t&1)===0&&(t&2)===0&&r!==null)e:for(;;){if(r===null)return;var y=r.tag;if(y===3||y===4){var v=r.stateNode.containerInfo;
vendor: 2,649 bytes, line 8
8if(v===c)break;if(y===4)for(y=r.return;y!==null;){var N=y.tag;if((N===3||N===4)&&y.stateNode.containerInfo===c)return;y=y.return}for(;v!==null;){if(y=$a(v),y===null)return;if(N=y.tag,N===5||N===6||N===26||N===27){r=u=y;continue e}v=v.parentNode}}r=r.return}Em(function(){var R=u,_=ec(i),K=[];e:{var M=sp.get(e);if(M!==void 0){var U=Po,te=e;switch(e){case"keypress":if(Mo(i)===0)break e;case"keydown":case"keyup":U=Q0;break;case"focusin":te="focus",U=oc;break;case"focusout":te="blur",U=oc;break;case"beforeblur":case"afterblur":U=oc;break;case"click":if(i.button===2)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":U=Rm;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":U=_0;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":U=t1;break;case ep:case tp:case np:U=G0;break;case ap:U=a1;break;case"scroll":case"scrollend":U=U0;break;case"wheel":U=i1;break;case"copy":case"cut":case"paste":U=K0;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":U=qm;break;case"toggle":case"beforetoggle":U=r1}var ce=(t&4)!==0,Pe=!ce&&(e==="scroll"||e==="scrollend"),C=ce?M!==null?M+"Capture":null:M;ce=[];for(var A=R,z;A!==null;){var G=A;if(z=G.stateNode,G=G.tag,G!==5&&G!==26&&G!==27||z===null||C===null||(G=ti(A,C),G!=null&&ce.push(Mi(A,G,z))),Pe)break;A=A.return}0<ce.length&&(M=new U(M,te,null,i,_),K.push({event:M,listeners:ce}))}}if((t&7)===0){e:{if(M=e==="mouseover"||e==="pointerover",U=e==="mouseout"||e==="pointerout",M&&i!==Zl&&(te=i.relatedTarget||i.fromElement)&&($a(te)||te[Ja]))break e;if((U||M)&&(M=_.window===_?_:(M=_.ownerDocument)?M.defaultView||M.parentWindow:window,U?(te=i.relatedTarget||i.toElement,U=R,te=te?$a(te):null,te!==null&&(Pe=h(te),ce=te.tag,te!==Pe||ce!==5&&ce!==27&&ce!==6)&&(te=null)):(U=null,te=R),U!==te)){if(ce=Rm,G="onMouseLeave",C="onMouseEnter",A="mouse",(e==="pointerout"||e==="pointerover")&&(ce=qm,G="onPointerLeave",C="onPointerEnter",A="pointer"),Pe=U==null?M:ei(U),z=te==null?M:ei(te),M=new ce(G,A+"leave",U,i,_),M.target=Pe,M.relatedTarget=z,G=null,$a(_)===R&&(ce=new ce(C,A+"enter",te,i,_),ce.target=z,ce.relatedTarget=Pe,G=ce),Pe=G,U&&te)t:{for(ce=oj,C=U,A=te,z=0,G=C;G;G=ce(G))z++;G=0;for(var re=A;re;re=ce(re))G++;for(;0<z-G;)C=ce(C),z--;for(;0<G-z;)A=ce(A),G--;for(;z--;){if(C===A||A!==null&&C===A.alternate){ce=C;break t}C=ce(C),A=ce(A)}ce=null}else ce=null;U!==null&&Ag(K,M,U,ce,!1),te!==null&&Pe!==null&&Ag(K,Pe,te,ce,!0)}}
vendor: 5,189 bytes, lines 8-9
8e:{if(M=R?ei(R):window,U=M.nodeName&&M.nodeName.toLowerCase(),U==="select"||U==="input"&&M.type==="file")var Se=Gm;else if(Vm(M))if(Hm)Se=y1;else{Se=f1;var ae=p1}else U=M.nodeName,!U||U.toLowerCase()!=="input"||M.type!=="checkbox"&&M.type!=="radio"?R&&Ql(R.elementType)&&(Se=Gm):Se=g1;if(Se&&(Se=Se(e,R))){Lm(K,Se,i,_);break e}ae&&ae(e,M,R),e==="focusout"&&R&&M.type==="number"&&R.memoizedProps.value!=null&&$l(M,"number",M.value)}switch(ae=R?ei(R):window,e){case"focusin":(Vm(ae)||ae.contentEditable==="true")&&(os=ae,hc=R,ci=null);break;case"focusout":ci=hc=os=null;break;case"mousedown":mc=!0;break;case"contextmenu":case"mouseup":case"dragend":mc=!1,Qm(K,i,_);break;case"selectionchange":if(x1)break;case"keydown":case"keyup":Qm(K,i,_)}var pe;if(lc)e:{switch(e){case"compositionstart":var ve="onCompositionStart";break e;case"compositionend":ve="onCompositionEnd";break e;case"compositionupdate":ve="onCompositionUpdate";break e}ve=void 0}else is?Bm(e,i)&&(ve="onCompositionEnd"):e==="keydown"&&i.keyCode===229&&(ve="onCompositionStart");ve&&(Pm&&i.locale!=="ko"&&(is||ve!=="onCompositionStart"?ve==="onCompositionEnd"&&is&&(pe=Dm()):(Xn=_,ac="value"in Xn?Xn.value:Xn.textContent,is=!0)),ae=Sr(R,ve),0<ae.length&&(ve=new Mm(ve,e,null,i,_),K.push({event:ve,listeners:ae}),pe?ve.data=pe:(pe=_m(i),pe!==null&&(ve.data=pe)))),(pe=c1?d1(e,i):u1(e,i))&&(ve=Sr(R,"onBeforeInput"),0<ve.length&&(ae=new Mm("onBeforeInput","beforeinput",null,i,_),K.push({event:ae,listeners:ve}),ae.data=pe)),nj(K,e,R,i,_)}Tg(K,t)})}function Mi(e,t,i){return{instance:e,listener:t,currentTarget:i}}function Sr(e,t){for(var i=t+"Capture",r=[];e!==null;){var c=e,u=c.stateNode;if(c=c.tag,c!==5&&c!==26&&c!==27||u===null||(c=ti(e,i),c!=null&&r.unshift(Mi(e,c,u)),c=ti(e,t),c!=null&&r.push(Mi(e,c,u))),e.tag===3)return r;e=e.return}return[]}function oj(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5&&e.tag!==27);return e||null}function Ag(e,t,i,r,c){for(var u=t._reactName,y=[];i!==null&&i!==r;){var v=i,N=v.alternate,R=v.stateNode;if(v=v.tag,N!==null&&N===r)break;v!==5&&v!==26&&v!==27||R===null||(N=R,c?(R=ti(i,u),R!=null&&y.unshift(Mi(i,R,N))):c||(R=ti(i,u),R!=null&&y.push(Mi(i,R,N)))),i=i.return}y.length!==0&&e.push({event:t,listeners:y})}var rj=/\r\n?/g,lj=/\u0000|\uFFFD/g;function Cg(e){return(typeof e=="string"?e:""+e).replace(rj,`
9`).replace(lj,"")}function Og(e,t){return t=Cg(t),Cg(e)===t}function qe(e,t,i,r,c,u){switch(i){case"children":typeof r=="string"?t==="body"||t==="textarea"&&r===""||ns(e,r):(typeof r=="number"||typeof r=="bigint")&&t!=="body"&&ns(e,""+r);break;case"className":Eo(e,"class",r);break;case"tabIndex":Eo(e,"tabindex",r);break;case"dir":case"role":case"viewBox":case"width":case"height":Eo(e,i,r);break;case"style":Cm(e,r,u);break;case"data":if(t!=="object"){Eo(e,"data",r);break}case"src":case"href":if(r===""&&(t!=="a"||i!=="href")){e.removeAttribute(i);break}if(r==null||typeof r=="function"||typeof r=="symbol"||typeof r=="boolean"){e.removeAttribute(i);break}r=zo(""+r),e.setAttribute(i,r);break;case"action":case"formAction":if(typeof r=="function"){e.setAttribute(i,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}else typeof u=="function"&&(i==="formAction"?(t!=="input"&&qe(e,t,"name",c.name,c,null),qe(e,t,"formEncType",c.formEncType,c,null),qe(e,t,"formMethod",c.formMethod,c,null),qe(e,t,"formTarget",c.formTarget,c,null)):(qe(e,t,"encType",c.encType,c,null),qe(e,t,"method",c.method,c,null),qe(e,t,"target",c.target,c,null)));if(r==null||typeof r=="symbol"||typeof r=="boolean"){e.removeAttribute(i);break}r=zo(""+r),e.setAttribute(i,r);break;case"onClick":r!=null&&(e.onclick=Sn);break;case"onScroll":r!=null&&be("scroll",e);break;case"onScrollEnd":r!=null&&be("scrollend",e);break;case"dangerouslySetInnerHTML":if(r!=null){if(typeof r!="object"||!("__html"in r))throw Error(l(61));if(i=r.__html,i!=null){if(c.children!=null)throw Error(l(60));e.innerHTML=i}}break;case"multiple":e.multiple=r&&typeof r!="function"&&typeof r!="symbol";break;case"muted":e.muted=r&&typeof r!="function"&&typeof r!="symbol";break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":break;case"autoFocus":break;case"xlinkHref":if(r==null||typeof r=="function"||typeof r=="boolean"||typeof r=="symbol"){e.removeAttribute("xlink:href");break}i=zo(""+r),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",i);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":r!=null&&typeof r!="function"&&typeof r!="symbol"?e.setAttribute(i,""+r):e.removeAttribute(i);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInl
9ine":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":r&&typeof r!="function"&&typeof r!="symbol"?e.setAttribute(i,""):e.removeAttribute(i);break;case"capture":case"download":r===!0?e.setAttribute(i,""):r!==!1&&r!=null&&typeof r!="function"&&typeof r!="symbol"?e.setAttribute(i,r):e.removeAttribute(i);break;case"cols":case"rows":case"size":case"span":r!=null&&typeof r!="function"&&typeof r!="symbol"&&!isNaN(r)&&1<=r?e.setAttribute(i,r):e.removeAttribute(i);break;case"rowSpan":case"start":r==null||typeof r=="function"||typeof r=="symbol"||isNaN(r)?e.removeAttribute(i):e.setAttribute(i,r);break;case"popover":be("beforetoggle",e),be("toggle",e),Oo(e,"popover",r);break;case"xlinkActuate":Tn(e,"http://www.w3.org/1999/xlink","xlink:actuate",r);break;case"xlinkArcrole":Tn(e,"http://www.w3.org/1999/xlink","xlink:arcrole",r);break;case"xlinkRole":Tn(e,"http://www.w3.org/1999/xlink","xlink:role",r);break;case"xlinkShow":Tn(e,"http://www.w3.org/1999/xlink","xlink:show",r);break;case"xlinkTitle":Tn(e,"http://www.w3.org/1999/xlink","xlink:title",r);break;case"xlinkType":Tn(e,"http://www.w3.org/1999/xlink","xlink:type",r);break;case"xmlBase":Tn(e,"http://www.w3.org/XML/1998/namespace","xml:base",r);break;case"xmlLang":Tn(e,"http://www.w3.org/XML/1998/namespace","xml:lang",r);break;case"xmlSpace":Tn(e,"http://www.w3.org/XML/1998/namespace","xml:space",r);break;case"is":Oo(e,"is",r);break;case"innerText":case"textContent":break;default:(!(2<i.length)||i[0]!=="o"&&i[0]!=="O"||i[1]!=="n"&&i[1]!=="N")&&(i=P0.get(i)||i,Oo(e,i,r))}}function Ud(e,t,i,r,c,u){switch(i){case"style":Cm(e,r,u);break;case"dangerouslySetInnerHTML":if(r!=null){if(typeof r!="object"||!("__html"in r))throw Error(l(61));if(i=r.__html,i!=null){if(c.children!=null)throw Error(l(60));e.innerHTML=i}}break;case"children":typeof r=="string"?ns(e,r):(typeof r=="number"||typeof r=="bigint")&&ns(e,""+r);break;case"onScroll":r!=null&&be("scroll",e);break;case"onScrollEnd":r!=null&&be("scrollend",e);break;case"onClick":r!=null&&(e.onclick=Sn);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":break;case"innerText":case"textContent":break;default:if(!xm.hasOwnProperty(i))e:{if(i[0]==="o"&&i[1]==="n"&&(c=i.endsWith("Capture"),t=i.slice(2,c?i.length-7:void 0),u=e[Nt]||null,u=u!=null?u[i]:null,typeof u=="function"&&e.removeEventListener(t,u,c),typeof r=="function")){typeof u!="function"&&u!==null&&(i in e?e[i]=null:e.hasAttribute(i)&&e.removeAttribute(i)),e.addEventListener(t,r,c);break e}i in e?e[i]=r:r===!0?e.setAttribute(i,""):Oo(e,i,r)}}}function yt(e,t,i){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":be("error",e),be("load",e);var r=!1,c=!1,u;for(u in i)if(i.hasOwnProperty(u)){var y=i[u];if(y!=null)switch(u){case"src":r=!0;break;case"srcSet":c=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(l(137,t));default:qe(e,t,u,y,i,null)}}c&&qe(e,t,"srcSet",i.srcSet,i,null),r&&qe(e,t,"src",i.src,i,null);return;case"input":be("invalid",e);var v=u=y=c=null,N=null,R=null;for(r in i)if(i.hasOwnProperty(r)){var _=i[r];if(_!=null)switch(r){case"name":c=_;break;case"type":y=_;break;case"checked":N=_;break;case"defaultChecked":R=_;break;case"value":u=_;break;case"defaultValue":v=_;break;case"children":case"dangerouslySetInnerHTML":if(_!=null)throw Error(l(137,t));break;default:qe(e,t,r,_,i,null)}}Nm(e,u,v,N,R,y,c,!1);return;case"select":be("invalid",e),r=y=u=null;for(c in i)if(i.hasOwnProperty(c)&&(v=i[c],v!=null))switch(c){case"value":u=v;break;case"defaultValue":y=v;break;case"multiple":r=v;default:qe(e,t,c,v,i,null)}t=u,i=y,e.multiple=!!r,t!=null?ts(e,!!r,t,!1):i!=null&&ts(e,!!r,i,!0);return;case"textarea":be("invalid",e),u=c=r=null;for(y in i)if(i.hasOwnProperty(y)&&(v=i[y],v!=null))switch(y){case"value":r=v;break;case"defaultValue":c=v;break;case"children":u=v;break;case"dangerouslySetInnerHTML":if(v!=null)throw Error(l(91));break;default:qe(e,t,y,v,i,null)}Sm(e,r,c,u);return;case"option":for(N in i)i.hasOwnProperty(N)&&(r=i[N],r!=null)&&(N==="selected"?e.selected=r&&typeof r!="function"&&typeof r!="symbol":qe(e,t,N,r,i,null));return;case"dialog":be("beforetoggle",e),be("toggle",e),be("cancel",e),be("close",e);break;case"iframe":case"object":be("load",e);break;case"video":case"audio":for(r=0;r<Ri.length;r++)be(Ri[r],e);break;case"image":be("error",e),be("load",e);break;case"details":be("toggle",e);break;case"embed":case"source":case"link":be("error",e),be("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(R in i)if(i.hasOwnProperty(R)&&(r=i[R],r!=null))switch(R){case"children":case"dangerouslySetInnerHTML":throw Error(l(137,t));default:qe(e,t,R,r,i,null)}return;default:if(Ql(t)){for(_ in i)i.hasOwnProperty(_)&&(r=i[_],r!==void 0&&Ud(e,t,_,r,i,void 0));return}}for(v in i)i.hasOwnProperty(v)&&(r=i[v],r!=null&&qe(e,t,v,r,i,null))}function cj(e,t,i,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var c=null,u=null,y=null,v=null,N=null,R=null,_=null;for(U in i){var K=i[U];if(i.hasOwnProperty(U)&&K!=null)switch(U){case"checked":break;case"value":break;case"defaultValue":N=K;default:r.hasOwnProperty(U)||qe(e,t,U,null,r,K)}}for(var M in r){var U=r[M];if(K=i[M],r.hasOwnProperty(M)&&(U!=null||K!=null))switch(M){case"type":u=U;break;case"name":c=U;break;case"checked":R=U;break;case"defaultChecked":_=U;break;case"value":y=U;break;case"defaultValue":v=U;break;case"children":case"dangerouslySetInnerHTML":if(U!=null)throw Error(l(137,t));break;default:U!==K&&qe(e,t,M,U,r,K)}}Jl(e,y,v,N,R,_,u,c);return;case"select":U=y=v=M=null;for(u in i)if(N=i[u],i.hasOwnProperty(u)&&N!=null)switch(u){case"value":break;case"multiple":U=N;default:r.hasOwnProperty(u)||qe(e,t,u,null,r,N)}for(c in r)if(u=r[c],N=i[c],r.hasOwnProperty(c)&&(u!=null||N!=null))switch(c){case"value":M=u;break;case"defaultValue":v=u;break;case"multiple":y=u;default:u!==N&&qe(e,t,c,u,r,N)}t=v,i=y,r=U,M!=null?ts(e,!!i,M,!1):!!r!=!!i&&(t!=null?ts(e,!!i,t,!0):ts(e,!!i,i?[]:"",!1));return;case"textarea":U=M=null;for(v in i)if(c=i[v],i.hasOwnProperty(v)&&c!=null&&!r.hasOwnProperty(v))switch(v){case"value":break;case"children":break;default:qe(e,t,v,null,r,c)}for(y in r)if(c=r[y],u=i[y],r.hasOwnProperty(y)&&(c!=null||u!=null))switch(y){case"value":M=c;break;case"defaultValue":U=c;break;case"children":break;case"dangerouslySetInnerHTML":if(c!=null)throw Error(l(91));break;default:c!==u&&qe(e,t,y,c,r,u)}Tm(e,M,U);return;case"option":for(var te in i)M=i[te],i.hasOwnProperty(te)&&M!=null&&!r.hasOwnProperty(te)&&(te==="selected"?e.selected=!1:qe(e,t,te,null,r,M));for(N in r)M=r[N],U=i[N],r.hasOwnProperty(N)&&M!==U&&(M!=null||U!=null)&&(N==="selected"?e.selected=M&&typeof M!="function"&&typeof M!="symbol":qe(e,t,N,M,r,U));return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var ce in 
vendor: 4,879 bytes, line 9
9i)M=i[ce],i.hasOwnProperty(ce)&&M!=null&&!r.hasOwnProperty(ce)&&qe(e,t,ce,null,r,M);for(R in r)if(M=r[R],U=i[R],r.hasOwnProperty(R)&&M!==U&&(M!=null||U!=null))switch(R){case"children":case"dangerouslySetInnerHTML":if(M!=null)throw Error(l(137,t));break;default:qe(e,t,R,M,r,U)}return;default:if(Ql(t)){for(var Pe in i)M=i[Pe],i.hasOwnProperty(Pe)&&M!==void 0&&!r.hasOwnProperty(Pe)&&Ud(e,t,Pe,void 0,r,M);for(_ in r)M=r[_],U=i[_],!r.hasOwnProperty(_)||M===U||M===void 0&&U===void 0||Ud(e,t,_,M,r,U);return}}for(var C in i)M=i[C],i.hasOwnProperty(C)&&M!=null&&!r.hasOwnProperty(C)&&qe(e,t,C,null,r,M);for(K in r)M=r[K],U=i[K],!r.hasOwnProperty(K)||M===U||M==null&&U==null||qe(e,t,K,M,r,U)}function Eg(e){switch(e){case"css":case"script":case"font":case"img":case"image":case"input":case"link":return!0;default:return!1}}function dj(){if(typeof performance.getEntriesByType=="function"){for(var e=0,t=0,i=performance.getEntriesByType("resource"),r=0;r<i.length;r++){var c=i[r],u=c.transferSize,y=c.initiatorType,v=c.duration;if(u&&v&&Eg(y)){for(y=0,v=c.responseEnd,r+=1;r<i.length;r++){var N=i[r],R=N.startTime;if(R>v)break;var _=N.transferSize,K=N.initiatorType;_&&Eg(K)&&(N=N.responseEnd,y+=_*(N<v?1:(v-R)/(N-R)))}if(--r,t+=8*(u+y)/(c.duration/1e3),e++,10<e)break}}if(0<e)return t/e/1e6}return navigator.connection&&(e=navigator.connection.downlink,typeof e=="number")?e:5}var Bd=null,_d=null;function Ar(e){return e.nodeType===9?e:e.ownerDocument}function Dg(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function zg(e,t){if(e===0)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return e===1&&t==="foreignObject"?0:e}function Vd(e,t){return e==="textarea"||e==="noscript"||typeof t.children=="string"||typeof t.children=="number"||typeof t.children=="bigint"||typeof t.dangerouslySetInnerHTML=="object"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var Ld=null;function uj(){var e=window.event;return e&&e.type==="popstate"?e===Ld?!1:(Ld=e,!0):(Ld=null,!1)}var Rg=typeof setTimeout=="function"?setTimeout:void 0,hj=typeof clearTimeout=="function"?clearTimeout:void 0,Mg=typeof Promise=="function"?Promise:void 0,mj=typeof queueMicrotask=="function"?queueMicrotask:typeof Mg<"u"?function(e){return Mg.resolve(null).then(e).catch(pj)}:Rg;function pj(e){setTimeout(function(){throw e})}function ha(e){return e==="head"}function qg(e,t){var i=t,r=0;do{var c=i.nextSibling;if(e.removeChild(i),c&&c.nodeType===8)if(i=c.data,i==="/$"||i==="/&"){if(r===0){e.removeChild(c),Rs(t);return}r--}else if(i==="$"||i==="$?"||i==="$~"||i==="$!"||i==="&")r++;else if(i==="html")qi(e.ownerDocument.documentElement);else if(i==="head"){i=e.ownerDocument.head,qi(i);for(var u=i.firstChild;u;){var y=u.nextSibling,v=u.nodeName;u[Zs]||v==="SCRIPT"||v==="STYLE"||v==="LINK"&&u.rel.toLowerCase()==="stylesheet"||i.removeChild(u),u=y}}else i==="body"&&qi(e.ownerDocument.body);i=c}while(i);Rs(t)}function Pg(e,t){var i=e;e=0;do{var r=i.nextSibling;if(i.nodeType===1?t?(i._stashedDisplay=i.style.display,i.style.display="none"):(i.style.display=i._stashedDisplay||"",i.getAttribute("style")===""&&i.removeAttribute("style")):i.nodeType===3&&(t?(i._stashedText=i.nodeValue,i.nodeValue=""):i.nodeValue=i._stashedText||""),r&&r.nodeType===8)if(i=r.data,i==="/$"){if(e===0)break;e--}else i!=="$"&&i!=="$?"&&i!=="$~"&&i!=="$!"||e++;i=r}while(i)}function Gd(e){var t=e.firstChild;for(t&&t.nodeType===10&&(t=t.nextSibling);t;){var i=t;switch(t=t.nextSibling,i.nodeName){case"HTML":case"HEAD":case"BODY":Gd(i),Yl(i);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if(i.rel.toLowerCase()==="stylesheet")continue}e.removeChild(i)}}function fj(e,t,i,r){for(;e.nodeType===1;){var c=i;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&(e.nodeName!=="INPUT"||e.type!=="hidden"))break}else if(r){if(!e[Zs])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if(u=e.getAttribute("rel"),u==="stylesheet"&&e.hasAttribute("data-precedence"))break;if(u!==c.rel||e.getAttribute("href")!==(c.href==null||c.href===""?null:c.href)||e.getAttribute("crossorigin")!==(c.crossOrigin==null?null:c.crossOrigin)||e.getAttribute("title")!==(c.title==null?null:c.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(u=e.getAttribute("src"),(u!==(c.src==null?null:c.src)||e.getAttribute("type")!==(c.type==null?null:c.type)||e.getAttribute("crossorigin")!==(c.crossOrigin==null?null:c.crossOrigin))&&u&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else if(t==="input"&&e.type==="hidden"){var u=c.name==null?null:""+c.name;if(c.type==="hidden"&&e.getAttribute("name")===u)return e}else return e;if(e=tn(e.nextSibling),e===null)break}return null}function gj(e,t,i){if(t==="")return null;for(;
vendor: 5,925 bytes, line 9
9e.nodeType!==3;)if((e.nodeType!==1||e.nodeName!=="INPUT"||e.type!=="hidden")&&!i||(e=tn(e.nextSibling),e===null))return null;return e}function Ig(e,t){for(;e.nodeType!==8;)if((e.nodeType!==1||e.nodeName!=="INPUT"||e.type!=="hidden")&&!t||(e=tn(e.nextSibling),e===null))return null;return e}function Hd(e){return e.data==="$?"||e.data==="$~"}function Kd(e){return e.data==="$!"||e.data==="$?"&&e.ownerDocument.readyState!=="loading"}function yj(e,t){var i=e.ownerDocument;if(e.data==="$~")e._reactRetry=t;else if(e.data!=="$?"||i.readyState!=="loading")t();else{var r=function(){t(),i.removeEventListener("DOMContentLoaded",r)};i.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}function tn(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t==="$"||t==="$!"||t==="$?"||t==="$~"||t==="&"||t==="F!"||t==="F")break;if(t==="/$"||t==="/&")return null}}return e}var Fd=null;function Ug(e){e=e.nextSibling;for(var t=0;e;){if(e.nodeType===8){var i=e.data;if(i==="/$"||i==="/&"){if(t===0)return tn(e.nextSibling);t--}else i!=="$"&&i!=="$!"&&i!=="$?"&&i!=="$~"&&i!=="&"||t++}e=e.nextSibling}return null}function Bg(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var i=e.data;if(i==="$"||i==="$!"||i==="$?"||i==="$~"||i==="&"){if(t===0)return e;t--}else i!=="/$"&&i!=="/&"||t++}e=e.previousSibling}return null}function _g(e,t,i){switch(t=Ar(i),e){case"html":if(e=t.documentElement,!e)throw Error(l(452));return e;case"head":if(e=t.head,!e)throw Error(l(453));return e;case"body":if(e=t.body,!e)throw Error(l(454));return e;default:throw Error(l(451))}}function qi(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);Yl(e)}var nn=new Map,Vg=new Set;function Cr(e){return typeof e.getRootNode=="function"?e.getRootNode():e.nodeType===9?e:e.ownerDocument}var Ln=V.d;V.d={f:bj,r:xj,D:vj,C:wj,L:jj,m:kj,X:Tj,S:Nj,M:Sj};function bj(){var e=Ln.f(),t=xr();return e||t}function xj(e){var t=Qa(e);t!==null&&t.tag===5&&t.type==="form"?af(t):Ln.r(e)}var Es=typeof document>"u"?null:document;function Lg(e,t,i){var r=Es;if(r&&typeof t=="string"&&t){var c=Yt(t);c='link[rel="'+e+'"][href="'+c+'"]',typeof i=="string"&&(c+='[crossorigin="'+i+'"]'),Vg.has(c)||(Vg.add(c),e={rel:e,crossOrigin:i,href:t},r.querySelector(c)===null&&(t=r.createElement("link"),yt(t,"link",e),rt(t),r.head.appendChild(t)))}}function vj(e){Ln.D(e),Lg("dns-prefetch",e,null)}function wj(e,t){Ln.C(e,t),Lg("preconnect",e,t)}function jj(e,t,i){Ln.L(e,t,i);var r=Es;if(r&&e&&t){var c='link[rel="preload"][as="'+Yt(t)+'"]';t==="image"&&i&&i.imageSrcSet?(c+='[imagesrcset="'+Yt(i.imageSrcSet)+'"]',typeof i.imageSizes=="string"&&(c+='[imagesizes="'+Yt(i.imageSizes)+'"]')):c+='[href="'+Yt(e)+'"]';var u=c;switch(t){case"style":u=Ds(e);break;case"script":u=zs(e)}nn.has(u)||(e=x({rel:"preload",href:t==="image"&&i&&i.imageSrcSet?void 0:e,as:t},i),nn.set(u,e),r.querySelector(c)!==null||t==="style"&&r.querySelector(Pi(u))||t==="script"&&r.querySelector(Ii(u))||(t=r.createElement("link"),yt(t,"link",e),rt(t),r.head.appendChild(t)))}}function kj(e,t){Ln.m(e,t);var i=Es;if(i&&e){var r=t&&typeof t.as=="string"?t.as:"script",c='link[rel="modulepreload"][as="'+Yt(r)+'"][href="'+Yt(e)+'"]',u=c;switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":u=zs(e)}if(!nn.has(u)&&(e=x({rel:"modulepreload",href:e},t),nn.set(u,e),i.querySelector(c)===null)){switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(i.querySelector(Ii(u)))return}r=i.createElement("link"),yt(r,"link",e),rt(r),i.head.appendChild(r)}}}function Nj(e,t,i){Ln.S(e,t,i);var r=Es;if(r&&e){var c=Za(r).hoistableStyles,u=Ds(e);t=t||"default";var y=c.get(u);if(!y){var v={loading:0,preload:null};if(y=r.querySelector(Pi(u)))v.loading=5;else{e=x({rel:"stylesheet",href:e,"data-precedence":t},i),(i=nn.get(u))&&Wd(e,i);var N=y=r.createElement("link");rt(N),yt(N,"link",e),N._p=new Promise(function(R,_){N.onload=R,N.onerror=_}),N.addEventListener("load",function(){v.loading|=1}),N.addEventListener("error",function(){v.loading|=2}),v.loading|=4,Or(y,t,r)}y={type:"stylesheet",instance:y,count:1,state:v},c.set(u,y)}}}function Tj(e,t){Ln.X(e,t);var i=Es;if(i&&e){var r=Za(i).hoistableScripts,c=zs(e),u=r.get(c);u||(u=i.querySelector(Ii(c)),u||(e=x({src:e,async:!0},t),(t=nn.get(c))&&Yd(e,t),u=i.createElement("script"),rt(u),yt(u,"link",e),i.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},r.set(c,u))}}function Sj(e,t){Ln.M(e,t);var i=Es;if(i&&e){var r=Za(i).hoistableScripts,c=zs(e),u=r.get(c);u||(u=i.querySelector(Ii(c)),u||(e=x({src:e,async:!0,type:"module"},t),(t=nn.get(c))&&Yd(e,t),u=i.createElement("script"),rt(u),yt(u,"link",e),i.head.appendChild(u)),u={type:"script",instance:u,count:1,state:null},r.set(c,u))}}function Gg(e,t,i,r){var c=(c=le.current)?Cr(c):null;if(!c)throw Error(l(446));switch(e){case"meta":case"title":return null;case"style":return typeof i.precedence=="string"&&typeof i.href=="string"?(t=Ds(i.href),i=Za(c).hoistableStyles,r=i.get(t),r||(r={type:"style",instance:null,count:0,state:null},i.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if(i.rel==="stylesheet"&&typeof i.href=="string"&&typeof i.precedence=="string"){e=Ds(i.href);var u=Za(c).hoistableStyles,y=u.get(e);if(y||(c=c.ownerDocument||c,y={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,y),(u=c.querySelector(Pi(e)))&&!u._p&&(y.instance=u,y.state.loading=5),nn.has(e)||(i={rel:"preload",as:"style",href:i.href,crossOrigin:i.crossOrigin,integrity:i.integrity,media:i.media,hrefLang:i.hrefLang,referrerPolicy:i.referrerPolicy},nn.set(e,i),u||Aj(c,e,i,y.state))),t&&r===null)throw Error(l(528,""));return y}if(t&&r!==null)throw Error(l(529,""));return null;case"script":return t=i.async,i=i.src,typeof i=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?
vendor: 4,581 bytes, line 9
9(t=zs(i),i=Za(c).hoistableScripts,r=i.get(t),r||(r={type:"script",instance:null,count:0,state:null},i.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(l(444,e))}}function Ds(e){return'href="'+Yt(e)+'"'}function Pi(e){return'link[rel="stylesheet"]['+e+"]"}function Hg(e){return x({},e,{"data-precedence":e.precedence,precedence:null})}function Aj(e,t,i,r){e.querySelector('link[rel="preload"][as="style"]['+t+"]")?r.loading=1:(t=e.createElement("link"),r.preload=t,t.addEventListener("load",function(){return r.loading|=1}),t.addEventListener("error",function(){return r.loading|=2}),yt(t,"link",i),rt(t),e.head.appendChild(t))}function zs(e){return'[src="'+Yt(e)+'"]'}function Ii(e){return"script[async]"+e}function Kg(e,t,i){if(t.count++,t.instance===null)switch(t.type){case"style":var r=e.querySelector('style[data-href~="'+Yt(i.href)+'"]');if(r)return t.instance=r,rt(r),r;var c=x({},i,{"data-href":i.href,"data-precedence":i.precedence,href:null,precedence:null});return r=(e.ownerDocument||e).createElement("style"),rt(r),yt(r,"style",c),Or(r,i.precedence,e),t.instance=r;case"stylesheet":c=Ds(i.href);var u=e.querySelector(Pi(c));if(u)return t.state.loading|=4,t.instance=u,rt(u),u;r=Hg(i),(c=nn.get(c))&&Wd(r,c),u=(e.ownerDocument||e).createElement("link"),rt(u);var y=u;return y._p=new Promise(function(v,N){y.onload=v,y.onerror=N}),yt(u,"link",r),t.state.loading|=4,Or(u,i.precedence,e),t.instance=u;case"script":return u=zs(i.src),(c=e.querySelector(Ii(u)))?(t.instance=c,rt(c),c):(r=i,(c=nn.get(u))&&(r=x({},i),Yd(r,c)),e=e.ownerDocument||e,c=e.createElement("script"),rt(c),yt(c,"link",r),e.head.appendChild(c),t.instance=c);case"void":return null;default:throw Error(l(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(r=t.instance,t.state.loading|=4,Or(r,i.precedence,e));return t.instance}function Or(e,t,i){for(var r=i.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),c=r.length?r[r.length-1]:null,u=c,y=0;y<r.length;y++){var v=r[y];if(v.dataset.precedence===t)u=v;else if(u!==c)break}u?u.parentNode.insertBefore(e,u.nextSibling):(t=i.nodeType===9?i.head:i,t.insertBefore(e,t.firstChild))}function Wd(e,t){e.crossOrigin==null&&(e.crossOrigin=t.crossOrigin),e.referrerPolicy==null&&(e.referrerPolicy=t.referrerPolicy),e.title==null&&(e.title=t.title)}function Yd(e,t){e.crossOrigin==null&&(e.crossOrigin=t.crossOrigin),e.referrerPolicy==null&&(e.referrerPolicy=t.referrerPolicy),e.integrity==null&&(e.integrity=t.integrity)}var Er=null;function Fg(e,t,i){if(Er===null){var r=new Map,c=Er=new Map;c.set(i,r)}else c=Er,r=c.get(i),r||(r=new Map,c.set(i,r));if(r.has(e))return r;for(r.set(e,null),i=i.getElementsByTagName(e),c=0;c<i.length;c++){var u=i[c];if(!(u[Zs]||u[mt]||e==="link"&&u.getAttribute("rel")==="stylesheet")&&u.namespaceURI!=="http://www.w3.org/2000/svg"){var y=u.getAttribute(t)||"";y=e+y;var v=r.get(y);v?v.push(u):r.set(y,[u])}}return r}function Wg(e,t,i){e=e.ownerDocument||e,e.head.insertBefore(i,t==="title"?e.querySelector("head > title"):null)}function Cj(e,t,i){if(i===1||t.itemProp!=null)return!1;switch(e){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;return t.rel==="stylesheet"?(e=t.disabled,typeof t.precedence=="string"&&e==null):!0;case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function Yg(e){return!(e.type==="stylesheet"&&(e.state.loading&3)===0)}function Oj(e,t,i,r){if(i.type==="stylesheet"&&(typeof r.media!="string"||matchMedia(r.media).matches!==!1)&&(i.state.loading&4)===0){if(i.instance===null){var c=Ds(r.href),u=t.querySelector(Pi(c));if(u){t=u._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(e.count++,e=Dr.bind(e),t.then(e,e)),i.state.loading|=4,i.instance=u,rt(u);return}u=t.ownerDocument||t,r=Hg(r),(c=nn.get(c))&&Wd(r,c),u=u.createElement("link"),rt(u);var y=u;y._p=new Promise(function(v,N){y.onload=v,y.onerror=N}),yt(u,"link",r),i.instance=u}e.stylesheets===null&&(e.stylesheets=new Map),e.stylesheets.set(i,t),(t=i.state.preload)&&(i.state.loading&3)===0&&(e.count++,i=Dr.bind(e),t.addEventListener("load",i),t.addEventListener("error",i))}}var Xd=0;function Ej(e,t){return e.stylesheets&&e.count===0&&Rr(e,e.stylesheets),0<e.count||0<e.imgCount?function(i){var r=setTimeout(function(){if(e.stylesheets&&Rr(e,e.stylesheets),e.unsu
vendor: 11,711 bytes, line 9
9spend){var u=e.unsuspend;e.unsuspend=null,u()}},6e4+t);0<e.imgBytes&&Xd===0&&(Xd=62500*dj());var c=setTimeout(function(){if(e.waitingForImages=!1,e.count===0&&(e.stylesheets&&Rr(e,e.stylesheets),e.unsuspend)){var u=e.unsuspend;e.unsuspend=null,u()}},(e.imgBytes>Xd?50:800)+t);return e.unsuspend=i,function(){e.unsuspend=null,clearTimeout(r),clearTimeout(c)}}:null}function Dr(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Rr(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}}var zr=null;function Rr(e,t){e.stylesheets=null,e.unsuspend!==null&&(e.count++,zr=new Map,t.forEach(Dj,e),zr=null,Dr.call(e))}function Dj(e,t){if(!(t.state.loading&4)){var i=zr.get(e);if(i)var r=i.get(null);else{i=new Map,zr.set(e,i);for(var c=e.querySelectorAll("link[data-precedence],style[data-precedence]"),u=0;u<c.length;u++){var y=c[u];(y.nodeName==="LINK"||y.getAttribute("media")!=="not all")&&(i.set(y.dataset.precedence,y),r=y)}r&&i.set(null,r)}c=t.instance,y=c.getAttribute("data-precedence"),u=i.get(y)||r,u===r&&i.set(null,c),i.set(y,c),this.count++,r=Dr.bind(this),c.addEventListener("load",r),c.addEventListener("error",r),u?u.parentNode.insertBefore(c,u.nextSibling):(e=e.nodeType===9?e.head:e,e.insertBefore(c,e.firstChild)),t.state.loading|=4}}var Ui={$$typeof:I,Provider:null,Consumer:null,_currentValue:$,_currentValue2:$,_threadCount:0};function zj(e,t,i,r,c,u,y,v,N){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=Hl(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Hl(0),this.hiddenUpdates=Hl(null),this.identifierPrefix=r,this.onUncaughtError=c,this.onCaughtError=u,this.onRecoverableError=y,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=N,this.incompleteTransitions=new Map}function Xg(e,t,i,r,c,u,y,v,N,R,_,K){return e=new zj(e,t,i,y,N,R,_,K,v),t=1,u===!0&&(t|=24),u=It(3,null,null,t),e.current=u,u.stateNode=e,t=Cc(),t.refCount++,e.pooledCache=t,t.refCount++,u.memoizedState={element:r,isDehydrated:i,cache:t},zc(u),e}function Jg(e){return e?(e=cs,e):cs}function $g(e,t,i,r,c,u){c=Jg(c),r.context===null?r.context=c:r.pendingContext=c,r=ta(t),r.payload={element:i},u=u===void 0?null:u,u!==null&&(r.callback=u),i=na(e,r,t),i!==null&&(Et(i,e,t),gi(i,e,t))}function Qg(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var i=e.retryLane;e.retryLane=i!==0&&i<t?i:t}}function Jd(e,t){Qg(e,t),(e=e.alternate)&&Qg(e,t)}function Zg(e){if(e.tag===13||e.tag===31){var t=Da(e,67108864);t!==null&&Et(t,e,67108864),Jd(e,67108864)}}function ey(e){if(e.tag===13||e.tag===31){var t=Lt();t=Kl(t);var i=Da(e,t);i!==null&&Et(i,e,t),Jd(e,t)}}var Mr=!0;function Rj(e,t,i,r){var c=B.T;B.T=null;var u=V.p;try{V.p=2,$d(e,t,i,r)}finally{V.p=u,B.T=c}}function Mj(e,t,i,r){var c=B.T;B.T=null;var u=V.p;try{V.p=8,$d(e,t,i,r)}finally{V.p=u,B.T=c}}function $d(e,t,i,r){if(Mr){var c=Qd(r);if(c===null)Id(e,t,r,qr,i),ny(e,r);else if(Pj(c,e,t,i,r))r.stopPropagation();else if(ny(e,r),t&4&&-1<qj.indexOf(e)){for(;c!==null;){var u=Qa(c);if(u!==null)switch(u.tag){case 3:if(u=u.stateNode,u.current.memoizedState.isDehydrated){var y=Sa(u.pendingLanes);if(y!==0){var v=u;for(v.pendingLanes|=2,v.entangledLanes|=2;y;){var N=1<<31-qt(y);v.entanglements[1]|=N,y&=~N}wn(u),(Oe&6)===0&&(yr=Rt()+500,zi(0))}}break;case 31:case 13:v=Da(u,2),v!==null&&Et(v,u,2),xr(),Jd(u,2)}if(u=Qd(r),u===null&&Id(e,t,r,qr,i),u===c)break;c=u}c!==null&&r.stopPropagation()}else Id(e,t,r,null,i)}}function Qd(e){return e=ec(e),Zd(e)}var qr=null;function Zd(e){if(qr=null,e=$a(e),e!==null){var t=h(e);if(t===null)e=null;else{var i=t.tag;if(i===13){if(e=m(t),e!==null)return e;e=null}else if(i===31){if(e=p(t),e!==null)return e;e=null}else if(i===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return qr=e,null}function ty(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(v0()){case lm:return 2;case cm:return 8;case No:case w0:return 32;case dm:return 268435456;default:return 32}default:return 32}}var eu=!1,ma=null,pa=null,fa=null,Bi=new Map,_i=new Map,ga=[],qj="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function ny(e,t){switch(e){case"focusin":case"focusout":ma=null;break;case"dragenter":case"dragleave":pa=null;break;case"mouseover":case"mouseout":fa=null;break;case"pointerover":case"pointerout":Bi.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":_i.delete(t.pointerId)}}function Vi(e,t,i,r,c,u){return e===null||e.nativeEvent!==u?(e={blockedOn:t,domEventName:i,eventSystemFlags:r,nativeEvent:u,targetContainers:[c]},t!==null&&(t=Qa(t),t!==null&&Zg(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,c!==null&&t.indexOf(c)===-1&&t.push(c),e)}function Pj(e,t,i,r,c){switch(t){case"focusin":return ma=Vi(ma,e,t,i,r,c),!0;case"dragenter":return pa=Vi(pa,e,t,i,r,c),!0;case"mouseover":return fa=Vi(fa,e,t,i,r,c),!0;case"pointerover":var u=c.pointerId;return Bi.set(u,Vi(Bi.get(u)||null,e,t,i,r,c)),!0;case"gotpointercapture":return u=c.pointerId,_i.set(u,Vi(_i.get(u)||null,e,t,i,r,c)),!0}return!1}function ay(e){var t=$a(e.target);if(t!==null){var i=h(t);if(i!==null){if(t=i.tag,t===13){if(t=m(i),t!==null){e.blockedOn=t,gm(e.priority,function(){ey(i)});return}}else if(t===31){if(t=p(i),t!==null){e.blockedOn=t,gm(e.priority,function(){ey(i)});return}}else if(t===3&&i.stateNode.current.memoizedState.isDehydrated){e.blockedOn=i.tag===3?i.stateNode.containerInfo:null;return}}}e.blockedOn=null}function Pr(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var i=Qd(e.nativeEvent);if(i===null){i=e.nativeEvent;var r=new i.constructor(i.type,i);Zl=r,i.target.dispatchEvent(r),Zl=null}else return t=Qa(i),t!==null&&Zg(t),e.blockedOn=i,!1;t.shift()}return!0}function sy(e,t,i){Pr(e)&&i.delete(t)}function Ij(){eu=!1,ma!==null&&Pr(ma)&&(ma=null),pa!==null&&Pr(pa)&&(pa=null),fa!==null&&Pr(fa)&&(fa=null),Bi.forEach(sy),_i.forEach(sy)}function Ir(e,t){e.blockedOn===t&&(e.blockedOn=null,eu||(eu=!0,n.unstable_scheduleCallback(n.unstable_NormalPriority,Ij)))}var Ur=null;function iy(e){Ur!==e&&(Ur=e,n.unstable_scheduleCallback(n.unstable_NormalPriority,function(){Ur===e&&(Ur=null);for(var t=0;t<e.length;t+=3){var i=e[t],r=e[t+1],c=e[t+2];if(typeof r!="function"){if(Zd(r||i)===null)continue;break}var u=Qa(i);u!==null&&(e.splice(t,3),t-=3,Qc(u,{pending:!0,data:c,method:i.method,action:r},r,c))}}))}function Rs(e){function t(N){return Ir(N,e)}ma!==null&&Ir(ma,e),pa!==null&&Ir(pa,e),fa!==null&&Ir(fa,e),Bi.forEach(t),_i.forEach(t);for(var i=0;i<ga.length;i++){var r=ga[i];r.blockedOn===e&&(r.blockedOn=null)}for(;0<ga.length&&(i=ga[0],i.blockedOn===null);)ay(i),i.blockedOn===null&&ga.shift();if(i=(e.ownerDocument||e).$$reactFormReplay,i!=null)for(r=0;r<i.length;r+=3){var c=i[r],u=i[r+1],y=c[Nt]||null;if(typeof u=="function")y||iy(i);else if(y){var v=null;if(u&&u.hasAttribute("formAction")){if(c=u,y=u[Nt]||null)v=y.formAction;else if(Zd(c)!==null)continue}else v=y.action;typeof v=="function"?i[r+1]=v:(i.splice(r,3),r-=3),iy(i)}}}function oy(){function e(u){u.canIntercept&&u.info==="react-transition"&&u.intercept({handler:function(){return new Promise(function(y){return c=y})},focusReset:"manual",scroll:"manual"})}function t(){c!==null&&(c(),c=null),r||setTimeout(i,20)}function i(){if(!r&&!navigation.transition){var u=navigation.currentEntry;u&&u.url!=null&&navigation.navigate(u.url,{state:u.getState(),info:"react-transition",history:"replace"})}}if(typeof navigation=="object"){var r=!1,c=null;return navigation.addEventListener("navigate",e),navigation.addEventListener("navigatesuccess",t),navigation.addEventListener("navigateerror",t),setTimeout(i,100),function(){r=!0,navigation.removeEventListener("navigate",e),navigation.removeEventListener("navigatesuccess",t),navigation.removeEventListener("navigateerror",t),c!==null&&(c(),c=null)}}}function tu(e){this._internalRoot=e}Br.prototype.render=tu.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(l(409));var i=t.current,r=Lt();$g(i,r,e,t,null,null)},Br.prototype.unmount=tu.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;$g(e.current,2,null,e,null,null),xr(),t[Ja]=null}};function Br(e){this._internalRoot=e}Br.prototype.unstable_scheduleHydration=function(e){if(e){var t=fm();e={blockedOn:null,target:e,priority:t};for(var i=0;i<ga.length&&t!==0&&t<ga[i].priority;i++);ga.splice(i,0,e),i===0&&ay(e)}};var ry=s.version;if(ry!=="19.2.3")throw Error(l(527,ry,"19.2.3"));V.findDOMNode=function(e){var t=e._reactInternals;if(t===void 0)throw typeof e.render=="function"?Error(l(188)):(e=Object.keys(e).join(","),Error(l(268,e)));return e=g(t),e=e!==null?b(e):null,e=e===null?null:e.stateNode,e};var Uj={bundleType:0,version:"19.2.3",rendererPackageName:"react-dom",currentDispatcherRef:B,reconcilerVersion:"19.2.3"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"){var _r=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!_r.isDisabled&&_r.supportsFiber)try{Js=_r.inject(Uj),Mt=_r}catch{}}return Gi.createRoot=function(e,t){if(!d(e))throw Error(l(299));var i=!1,r="",c=pf,u=ff,y=gf;return t!=null&&(t.unstable_strictMode===!0&&(i=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onUncaughtError!==void 0&&(c=t.onUncaughtError),t.onCaughtError!==void 0&&(u=t.onCaughtError),t.onRecoverableError!==void 0&&(y=t.onRecoverableError)),t=Xg(e,1,!1,null,null,i,r,null,c,u,y,oy),e[Ja]=t.current,Pd(e),new tu(t)},Gi.hydrateRoot=function(e,t,i){if(!d(e))throw Error(l(299));var r=!1,c="",u=pf,y=ff,v=gf,N=null;return i!=null&&(i.unstable_strictMode===!0&&(r=!0),i.identifierPrefix!==void 0&&(c=i.identifierPrefix),i.onUncaughtError!==void 0&&(u=i.onUncaughtError),i.onCaughtError!==void 0&&(y=i.onCaughtError),i.onRecoverableError!==void 0&&(v=i.onRecoverableError),i.formState!==void 0&&(N=i.formState)),t=Xg(e,1,!0,t,i??null,r,c,N,u,y,v,oy),t.context=Jg(null),i=t.current,r=Lt(),r=Kl(r),c=ta(r),c.callback=null,na(i,c,r),i=r,t.current.lanes=i,Qs(t,i),wn(t),e[Ja]=t.current,Pd(e),new Br(t)},Gi.version="19.2.3",Gi}var yy;
9function Yj(){if(yy)return su.exports;yy=1;function n(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(n)}catch(s){console.error(s)}}return n(),su.exports=Wj(),su.exports}var Xj=Yj(),by={},Jj="@vercel/analytics",$j="1.6.1",Qj=()=>{window.va||(window.va=function(...s){(window.vaq=window.vaq||[]).push(s)})};function Ex(){return typeof window<"u"}function Dx(){try{const n="production"}catch{}return"production"}function Zj(n="auto"){if(n==="auto"){window.vam=Dx();return}window.vam=n}function ek(){return(Ex()?window.vam:Dx())||"production"}function Hu(){return ek()==="development"}function tk(n){return n.scriptSrc?n.scriptSrc:Hu()?"https://va.vercel-scripts.com/v1/script.debug.js":n.basePath?`${n.basePath}/insights/script.js`:"/_vercel/insights/script.js"}function nk(n={debug:!0}){var s;if(!Ex())return;Zj(n.mode),Qj(),n.beforeSend&&((s=window.va)==null||s.call(window,"beforeSend",n.beforeSend));const o=tk(n);if(document.head.querySelector(`script[src*="${o}"]`))return;const l=document.createElement("script");l.src=o,l.defer=!0,l.dataset.sdkn=Jj+(n.framework?`/${n.framework}`:""),l.dataset.sdkv=$j,n.disableAutoTrack&&(l.dataset.disableAutoTrack="1"),n.endpoint?l.dataset.endpoint=n.endpoint:n.basePath&&(l.dataset.endpoint=`${n.basePath}/insights`),n.dsn&&(l.dataset.dsn=n.dsn),l.onerror=()=>{const d=Hu()?"Please check if any ad blockers are enabled and try again.":"Be sure to enable Web Analytics for your project and deploy again. See https://vercel.com/docs/analytics/quickstart for more information.";console.log(`[Vercel Web Analytics] Failed to load script from ${o}. ${d}`)},Hu()&&n.debug===!1&&(l.dataset.debug="false"),document.head.appendChild(l)}function ak({route:n,path:s}){var o;(o=window.va)==null||o.call(window,"pageview",{route:n,path:s})}function sk(){if(!(typeof process>"u"||typeof by>"u"))return by.REACT_APP_VERCEL_OBSERVABILITY_BASEPATH}function ik(n){return j.useEffect(()=>{var s;n.beforeSend&&((s=window.va)==null||s.call(window,"beforeSend",n.beforeSend))},[n.beforeSend]),j.useEffect(()=>{nk({framework:n.framework||"react",basePath:n.basePath??sk(),...n.route!==void 0&&{disableAutoTrack:!0},...n})},[]),j.useEffect(()=>{n.route&&n.path&&ak({route:n.route,path:n.path})},[n.route,n.path]),null}var xy="popstate";function ok(n={}){function s(l,d){let{pathname:h,search:m,hash:p}=l.location;return Ku("",{pathname:h,search:m,hash:p},d.state&&d.state.usr||null,d.state&&d.state.key||"default")}function o(l,d){return typeof d=="string"?d:io(d)}
9return lk(s,o,null,n)}function Ke(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function on(n,s){if(!n){typeof console<"u"&&console.warn(s);try{throw new Error(s)}catch{}}}function rk(){return Math.random().toString(36).substring(2,10)}function vy(n,s){return{usr:n.state,key:n.key,idx:s}}function Ku(n,s,o=null,l){return{pathname:typeof n=="string"?n:n.pathname,search:"",hash:"",...typeof s=="string"?Gs(s):s,state:o,key:s&&s.key||l||rk()}}function io({pathname:n="/",search:s="",hash:o=""}){return s&&s!=="?"&&(n+=s.charAt(0)==="?"?s:"?"+s),o&&o!=="#"&&(n+=o.charAt(0)==="#"?o:"#"+o),n}function Gs(n){let s={};if(n){let o=n.indexOf("#");o>=0&&(s.hash=n.substring(o),n=n.substring(0,o));let l=n.indexOf("?");l>=0&&(s.search=n.substring(l),n=n.substring(0,l)),n&&(s.pathname=n)}return s}function lk(n,s,o,l={}){let{window:d=document.defaultView,v5Compat:h=!1}=l,m=d.history,p="POP",f=null,g=b();g==null&&(g=0,m.replaceState({...m.state,idx:g},""));function b(){return(m.state||{idx:null}).idx}function x(){p="POP";let D=b(),E=D==null?null:D-g;g=D,f&&f({action:p,location:O.location,delta:E})}function w(D,E){p="PUSH";let P=Ku(O.location,D,E);g=b()+1;let I=vy(P,g),F=O.createHref(P);try{m.pushState(I,"",F)}catch(W){if(W instanceof DOMException&&W.name==="DataCloneError")throw W;d.location.assign(F)}h&&f&&f({action:p,location:O.location,delta:1})}function S(D,E){p="REPLACE";let P=Ku(O.location,D,E);g=b();let I=vy(P,g),F=O.createHref(P);m.replaceState(I,"",F),h&&f&&f({action:p,location:O.location,delta:0})}function T(D){return ck(D)}let O={get action(){return p},get location(){return n(d,m)},listen(D){if(f)throw new Error("A history only accepts one active listener");return d.addEventListener(xy,x),f=D,()=>{d.removeEventListener(xy,x),f=null}},createHref(D){return s(d,D)},createURL:T,encodeLocation(D){let E=T(D);return{pathname:E.pathname,search:E.search,hash:E.hash}},push:w,replace:S,go(D){return m.go(D)}};return O}function ck(n,s=!1){let o="http://localhost";
9typeof window<"u"&&(o=window.location.origin!=="null"?window.location.origin:window.location.href),Ke(o,"No window.location.(origin|href) available to create URL");let l=typeof n=="string"?n:io(n);return l=l.replace(/ $/,"%20"),!s&&l.startsWith("//")&&(l=o+l),new URL(l,o)}function zx(n,s,o="/"){return dk(n,s,o,!1)}function dk(n,s,o,l){let d=typeof s=="string"?Gs(s):s,h=Hn(d.pathname||"/",o);if(h==null)return null;let m=Rx(n);uk(m);let p=null;for(let f=0;p==null&&f<m.length;++f){let g=jk(h);p=vk(m[f],g,l)}return p}function Rx(n,s=[],o=[],l="",d=!1){let h=(m,p,f=d,g)=>{let b={relativePath:g===void 0?m.path||"":g,caseSensitive:m.caseSensitive===!0,childrenIndex:p,route:m};if(b.relativePath.startsWith("/")){if(!b.relativePath.startsWith(l)&&f)return;Ke(b.relativePath.startsWith(l),`Absolute route path "${b.relativePath}" nested under path "${l}" is not valid. An absolute child route path must start with the combined path of all its parent routes.`),b.relativePath=b.relativePath.slice(l.length)}let x=Gn([l,b.relativePath]),w=o.concat(b);m.children&&m.children.length>0&&(Ke(m.index!==!0,`Index routes must not have child routes. Please remove all child routes from route path "${x}".`),Rx(m.children,s,w,x,f)),!(m.path==null&&!m.index)&&s.push({path:x,score:bk(x,m.index),routesMeta:w})};return n.forEach((m,p)=>{if(m.path===""||!m.path?.includes("?"))h(m,p);else for(let f of Mx(m.path))h(m,p,!0,f)}),s}function Mx(n){let s=n.split("/");if(s.length===0)return[];let[o,...l]=s,d=o.endsWith("?"),h=o.replace(/\?$/,"");if(l.length===0)return d?[h,""]:[h];let m=Mx(l.join("/")),p=[];return p.push(...m.map(f=>f===""?h:[h,f].join("/"))),d&&p.push(...m),p.map(f=>n.startsWith("/")&&f===""?"/":f)}function uk(n){n.sort((s,o)=>s.score!==o.score?o.score-s.score:xk(s.routesMeta.map(l=>l.childrenIndex),o.routesMeta.map(l=>l.childrenIndex)))}var hk=/^:[\w-]+$/,mk=3,pk=2,fk=1,gk=10,yk=-2,wy=n=>n==="*";function bk(n,s){let o=n.split("/"),l=o.length;return o.some(wy)&&(l+=yk),s&&(l+=pk),o.filter(d=>!wy(d)).reduce((d,h)=>d+(hk.test(h)?mk:h===""?fk:gk),l)}function xk(n,s){return n.length===s.length&&n.slice(0,-1).every((l,d)=>l===s[d])?n[n.length-1]-s[s.length-1]:0}function vk(n,s,o=!1){let{routesMeta:l}=n,d={},h="/",m=[];for(let p=0;p<l.length;++p){let f=l[p],g=p===l.length-1,b=h==="/"?s:s.slice(h.length)||"/",x=fl({path:f.relativePath,caseSensitive:f.caseSensitive,end:g},b),w=f.route;if(!x&&g&&o&&!l[l.length-1].route.index&&(x=fl({path:f.relativePath,caseSensitive:f.caseSensitive,end:!1},b)),!x)return null;
9Object.assign(d,x.params),m.push({params:d,pathname:Gn([h,x.pathname]),pathnameBase:Sk(Gn([h,x.pathnameBase])),route:w}),x.pathnameBase!=="/"&&(h=Gn([h,x.pathnameBase]))}return m}function fl(n,s){typeof n=="string"&&(n={path:n,caseSensitive:!1,end:!0});let[o,l]=wk(n.path,n.caseSensitive,n.end),d=s.match(o);if(!d)return null;let h=d[0],m=h.replace(/(.)\/+$/,"$1"),p=d.slice(1);return{params:l.reduce((g,{paramName:b,isOptional:x},w)=>{if(b==="*"){let T=p[w]||"";m=h.slice(0,h.length-T.length).replace(/(.)\/+$/,"$1")}const S=p[w];return x&&!S?g[b]=void 0:g[b]=(S||"").replace(/%2F/g,"/"),g},{}),pathname:h,pathnameBase:m,pattern:n}}function wk(n,s=!1,o=!0){on(n==="*"||!n.endsWith("*")||n.endsWith("/*"),`Route path "${n}" will be treated as if it were "${n.replace(/\*$/,"/*")}" because the \`*\` character must always follow a \`/\` in the pattern. To get rid of this warning, please change the route path to "${n.replace(/\*$/,"/*")}".`);let l=[],d="^"+n.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(m,p,f)=>(l.push({paramName:p,isOptional:f!=null}),f?"/?([^\\/]+)?":"/([^\\/]+)")).replace(/\/([\w-]+)\?(\/|$)/g,"(/$1)?$2");return n.endsWith("*")?(l.push({paramName:"*"}),d+=n==="*"||n==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):o?d+="\\/*$":n!==""&&n!=="/"&&(d+="(?:(?=\\/|$))"),[new RegExp(d,s?void 0:"i"),l]}function jk(n){try{return n.split("/").map(s=>decodeURIComponent(s).replace(/\//g,"%2F")).join("/")}catch(s){return on(!1,`The URL path "${n}" could not be decoded because it is a malformed URL segment. This is probably due to a bad percent encoding (${s}).`),n}}function Hn(n,s){if(s==="/")return n;if(!n.toLowerCase().startsWith(s.toLowerCase()))return null;let o=s.endsWith("/")?s.length-1:s.length,l=n.charAt(o);return l&&l!=="/"?null:n.slice(o)||"/"}var qx=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,kk=n=>qx.test(n);function Nk(n,s="/"){let{pathname:o,search:l="",hash:d=""}=typeof n=="string"?Gs(n):n,h;if(o)if(kk(o))h=o;else{if(o.includes("//")){let m=o;o=o.replace(/\/\/+/g,"/"),on(!1,`Pathnames cannot have embedded double slashes - normalizing ${m} -> ${o}`)}o.startsWith("/")?h=jy(o.substring(1),"/"):h=jy(o,s)}else h=s;return{pathname:h,search:Ak(l),hash:Ck(d)}}function jy(n,s){let o=s.replace(/\/+$/,"").split("/");return n.split("/").forEach(d=>{d===".."?o.length>1&&o.pop():d!=="."&&o.push(d)}),o.length>1?o.join("/"):"/"}function lu(n,s,o,l){return`Cannot include a '${n}' character in a manually specified \`to.${s}\` field [${JSON.stringify(l)}].  Please separate it out to the \`to.${o}\` field. Alternatively you may provide the full path as a string in <Link to="..."> and the router will parse it for you.`}function Tk(n){return n.filter((s,o)=>o===0||s.route.path&&s.route.path.length>0)}function yh(n){let s=Tk(n);return s.map((o,l)=>l===s.length-1?o.pathname:o.pathnameBase)}function bh(n,s,o,l=!1){let d;typeof n=="string"?d=Gs(n):(d={...n},Ke(!d.pathname||!d.pathname.includes("?"),lu("?","pathname","search",d)),Ke(!d.pathname||!d.pathname.includes("#"),lu("#","pathname","hash",d)),Ke(!d.search||!d.search.includes("#"),lu("#","search","hash",d)));let h=n===""||d.pathname==="",m=h?"/":d.pathname,p;if(m==null)p=o;else{let x=s.length-1;if(!l&&m.startsWith("..")){let w=m.split("/");for(;w[0]==="..";)w.shift(),x-=1;d.pathname=w.join("/")}p=x>=0?s[x]:"/"}let f=Nk(d,p),g=m&&m!=="/"&&m.endsWith("/"),b=(h||m===".")&&o.endsWith("/");return!f.pathname.endsWith("/")&&(g||b)&&(f.pathname+="/"),f}var Gn=n=>n.join("/").replace(/\/\/+/g,"/"),Sk=n=>n.replace(/\/+$/,"").replace(/^\/*/,"/"),Ak=n=>!n||n==="?"?"":n.startsWith("?")?n:"?"+n,Ck=n=>!n||n==="#"?"":n.startsWith("#")?n:"#"+n,Ok=class{constructor(n,s,o,l=!1){this.status=n,this.statusText=s||"",this.internal=l,o instanceof Error?(this.data=o.toString(),this.error=o):this.data=o}};function Ek(n){return n!=null&&typeof n.status=="number"&&typeof n.statusText=="string"&&typeof n.internal=="boolean"&&"data"in n}function Dk(n){return n.map(s=>s.route.path).filter(Boolean).join("/").replace(/\/\/*/g,"/")||"/"}var Px=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Ix(n,s){let o=n;if(typeof o!="string"||!qx.test(o))return{absoluteURL:void 0,isExternal:!1,to:o};let l=o,d=!1;if(Px)try{let h=new URL(window.location.href),m=o.startsWith("//")?new URL(h.protocol+o):new URL(o),p=Hn(m.pathname,s);m.origin===h.origin&&p!=null?o=p+m.search+m.hash:d=!0}catch{on(!1,`<Link to="${o}">
9 contains an invalid URL which will probably break when clicked - please update to a valid URL path.`)}return{absoluteURL:l,isExternal:d,to:o}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");var Ux=["POST","PUT","PATCH","DELETE"];new Set(Ux);var zk=["GET",...Ux];new Set(zk);var Hs=j.createContext(null);Hs.displayName="DataRouter";var Al=j.createContext(null);Al.displayName="DataRouterState";var Rk=j.createContext(!1),Bx=j.createContext({isTransitioning:!1});Bx.displayName="ViewTransition";var Mk=j.createContext(new Map);Mk.displayName="Fetchers";var qk=j.createContext(null);qk.displayName="Await";var Ht=j.createContext(null);Ht.displayName="Navigation";var fo=j.createContext(null);fo.displayName="Location";var fn=j.createContext({outlet:null,matches:[],isDataRoute:!1});fn.displayName="Route";var xh=j.createContext(null);xh.displayName="RouteError";var _x="REACT_ROUTER_ERROR",Pk="REDIRECT",Ik="ROUTE_ERROR_RESPONSE";function Uk(n){if(n.startsWith(`${_x}:${Pk}:{`))try{let s=JSON.parse(n.slice(28));if(typeof s=="object"&&s&&typeof s.status=="number"&&typeof s.statusText=="string"&&typeof s.location=="string"&&typeof s.reloadDocument=="boolean"&&typeof s.replace=="boolean")return s}catch{}}function Bk(n){if(n.startsWith(`${_x}:${Ik}:{`))try{let s=JSON.parse(n.slice(40));if(typeof s=="object"&&s&&typeof s.status=="number"&&typeof s.statusText=="string")return new Ok(s.status,s.statusText,s.data)}catch{}}function _k(n,{relative:s}={}){Ke(Ks(),"useHref() may be used only in the context of a <Router> component.");let{basename:o,navigator:l}=j.useContext(Ht),{hash:d,pathname:h,search:m}=go(n,{relative:s}),p=h;return o!=="/"&&(p=h==="/"?o:Gn([o,h])),l.createHref({pathname:p,search:m,hash:d})}function Ks(){return j.useContext(fo)!=null}function gn(){return Ke(Ks(),"useLocation() may be used only in the context of a <Router> component."),j.useContext(fo).location}var Vx="You should call navigate() in a React.useEffect(), not when your component is first rendered.";function Lx(n){j.useContext(Ht).static||j.useLayoutEffect(n)}function Gx(){let{isDataRoute:n}=j.useContext(fn);return n?e2():Vk()}function Vk(){Ke(Ks(),"useNavigate() may be used only in the context of a <Router> component.");let n=j.useContext(Hs),{basename:s,navigator:o}=j.useContext(Ht),{matches:l}=j.useContext(fn),{pathname:d}=gn(),h=JSON.stringify(yh(l)),m=j.useRef(!1);return Lx(()=>{m.current=!0}),j.useCallback((f,g={})=>{if(on(m.current,Vx),!m.current)return;if(typeof f=="number"){o.go(f);return}let b=bh(f,JSON.parse(h),d,g.relative==="path");n==null&&s!=="/"&&(b.pathname=b.pathname==="/"?s:Gn([s,b.pathname])),(g.replace?o.replace:o.push)(b,g.state,g)},[s,o,h,d,n])}j.createContext(null);function Lk(){let{matches:n}=j.useContext(fn),s=n[n.length-1];return s?s.params:{}}function go(n,{relative:s}={}){let{matches:o}=j.useContext(fn),{pathname:l}=gn(),d=JSON.stringify(yh(o));return j.useMemo(()=>bh(n,JSON.parse(d),l,s==="path"),[n,d,l,s])}function Gk(n,s){return Hx(n,s)}function Hx(n,s,o,l,d){Ke(Ks(),"useRoutes() may be used only in the context of a <Router> component.");let{navigator:h}=j.useContext(Ht),{matches:m}=j.useContext(fn),p=m[m.length-1],f=p?p.params:{},g=p?p.pathname:"/",b=p?p.pathnameBase:"/",x=p&&p.route;{let P=x&&x.path||"";Fx(g,!x||P.endsWith("*")||P.endsWith("*?"),`You rendered descendant <Routes> (or called \`useRoutes()\`) at "${g}" (under <Route path="${P}">) but the parent route path has no trailing "*". This means if you navigate deeper, the parent won't match anymore and therefore the child routes will never render.
10
11Please change the parent <Route path="${P}"> to <Route path="${P==="/"?"*":`${P}/*`}">.`)}let w=gn(),S;if(s){let P=typeof s=="string"?Gs(s):s;Ke(b==="/"||P.pathname?.startsWith(b),`When overriding the location using \`<Routes location>\` or \`useRoutes(routes, location)\`, the location pathname must begin with the portion of the URL pathname that was matched by all parent routes. The current pathname base is "${b}" but pathname "${P.pathname}" was given in the \`location\` prop.`),S=P}else S=w;let T=S.pathname||"/",O=T;if(b!=="/"){let P=b.replace(/^\//,"").split("/");O="/"+T.replace(/^\//,"").split("/").slice(P.length).join("/")}let D=zx(n,{pathname:O});on(x||D!=null,`No routes matched location "${S.pathname}${S.search}${S.hash}" `),on(D==null||D[D.length-1].route.element!==void 0||D[D.length-1].route.Component!==void 0||D[D.length-1].route.lazy!==void 0,`Matched leaf route at location "${S.pathname}${S.search}${S.hash}" does not have an element or Component. This means it will render an <Outlet /> with a null value by default resulting in an "empty" page.`);let E=Yk(D&&D.map(P=>Object.assign({},P,{params:Object.assign({},f,P.params),pathname:Gn([b,h.encodeLocation?h.encodeLocation(P.pathname.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:P.pathname]),pathnameBase:P.pathnameBase==="/"?b:Gn([b,h.encodeLocation?h.encodeLocation(P.pathnameBase.replace(/\?/g,"%3F").replace(/#/g,"%23")).pathname:P.pathnameBase])})),m,o,l,d);return s&&E?j.createElement(fo.Provider,{value:{location:{pathname:"/",search:"",hash:"",state:null,key:"default",...S},navigationType:"POP"}},E):E}function Hk(){let n=Zk(),s=Ek(n)?`${n.status} ${n.statusText}`:n instanceof Error?n.message:JSON.stringify(n),o=n instanceof Error?n.stack:null,l="rgba(200,200,200, 0.5)",d={padding:"0.5rem",backgroundColor:l},h={padding:"2px 4px",backgroundColor:l},m=null;return console.error("Error handled by React Router default ErrorBoundary:",n),m=j.createElement(j.Fragment,null,j.createElement("p",null,"💿 Hey developer 👋"),j.createElement("p",null,"You can provide a way better UX than this when your app throws errors by providing your own ",j.createElement("code",{style:h},"ErrorBoundary")," or"," ",j.createElement("code",{style:h},"errorElement")," prop on your route.")),j.createElement(j.Fragment,null,j.createElement("h2",null,"Unexpected Application 
11Error!"),j.createElement("h3",{style:{fontStyle:"italic"}},s),o?j.createElement("pre",{style:d},o):null,m)}var Kk=j.createElement(Hk,null),Kx=class extends j.Component{constructor(n){super(n),this.state={location:n.location,revalidation:n.revalidation,error:n.error}}static getDerivedStateFromError(n){return{error:n}}static getDerivedStateFromProps(n,s){return s.location!==n.location||s.revalidation!=="idle"&&n.revalidation==="idle"?{error:n.error,location:n.location,revalidation:n.revalidation}:{error:n.error!==void 0?n.error:s.error,location:s.location,revalidation:n.revalidation||s.revalidation}}componentDidCatch(n,s){this.props.onError?this.props.onError(n,s):console.error("React Router caught the following error during render",n)}render(){let n=this.state.error;if(this.context&&typeof n=="object"&&n&&"digest"in n&&typeof n.digest=="string"){const o=Bk(n.digest);o&&(n=o)}let s=n!==void 0?j.createElement(fn.Provider,{value:this.props.routeContext},j.createElement(xh.Provider,{value:n,children:this.props.component})):this.props.children;return this.context?j.createElement(Fk,{error:n},s):s}};Kx.contextType=Rk;var cu=new WeakMap;function Fk({children:n,error:s}){let{basename:o}=j.useContext(Ht);if(typeof s=="object"&&s&&"digest"in s&&typeof s.digest=="string"){let l=Uk(s.digest);if(l){let d=cu.get(s);if(d)throw d;let h=Ix(l.location,o);if(Px&&!cu.get(s))if(h.isExternal||l.reloadDocument)window.location.href=h.absoluteURL||h.to;else{const m=Promise.resolve().then(()=>window.__reactRouterDataRouter.navigate(h.to,{replace:l.replace}));throw cu.set(s,m),m}return j.createElement("meta",{httpEquiv:"refresh",content:`0;url=${h.absoluteURL||h.to}`})}}return n}function Wk({routeContext:n,match:s,children:o}){let l=j.useContext(Hs);return l&&l.static&&l.staticContext&&(s.route.errorElement||s.route.ErrorBoundary)&&(l.staticContext._deepestRenderedBoundaryId=s.route.id),j.createElement(fn.Provider,{value:n},o)}function Yk(n,s=[],o=null,l=null,d=null){if(n==null){if(!o)return null;if(o.errors)n=o.matches;else if(s.length===0&&!o.initialized&&o.matches.length>0)n=o.matches;else return null}let h=n,m=o?.errors;if(m!=null){let b=h.findIndex(x=>x.route.id&&m?.[x.route.id]!==void 0);Ke(b>=0,`Could not find a matching route for errors on route IDs: ${Object.keys(m).join(",")}`),h=h.slice(0,Math.min(h.length,b+1))}let p=!1,f=-1;if(o)for(let b=0;b<h.length;b++){let x=h[b];if((x.route.HydrateFallback||x.route.hydrateFallbackElement)&&(f=b),x.route.id){let{loaderData:w,errors:S}=o,T=x.route.loader&&!w.hasOwnProperty(x.route.id)&&(!S||S[x.route.id]===void 0);if(x.route.lazy||T){p=!0,f>=0?h=h.slice(0,f+1):h=[h[0]];break}}}let g=o&&l?(b,x)=>{l(b,{location:o.location,params:o.matches?.[0]?.params??{},unstable_pattern:Dk(o.matches),errorInfo:x})}:void 0;return h.reduceRight((b,x,w)=>{let S,T=!1,O=null,D=null;o&&(S=m&&x.route.id?m[x.route.id]:void 0,O=x.route.errorElement||Kk,p&&(f<0&&w===0?(Fx("route-fallback",!1,"No `HydrateFallback` element provided to render during initial hydration"),T=!0,D=null):f===w&&(T=!0,D=x.route.hydrateFallbackElement||null)));let E=s.concat(h.slice(0,w+1)),P=()=>{let I;return S?I=O:T?I=D:x.route.Component?I=j.createElement(x.route.Component,null):x.route.element?I=x.route.element:I=b,j.createElement(Wk,{match:x,routeContext:{outlet:b,matches:E,isDataRoute:o!=null},children:I})};return o&&(x.route.ErrorBoundary||x.route.errorElement||w===0)?j.createElement(Kx,{location:o.location,revalidation:o.revalidation,component:O,error:S,children:P(),routeContext:{outlet:null,matches:E,isDataRoute:!0},onError:g}):P()},null)}function vh(n){return`${n} must be used within a data router.  See https://reactrouter.com/en/main/routers/picking-a-router.`}function Xk(n){let s=j.useContext(Hs);return Ke(s,vh(n)),s}function Jk(n){let s=j.useContext(Al);return Ke(s,vh(n)),s}function $k(n){let s=j.useContext(fn);return Ke(s,vh(n)),s}function wh(n){let s=$k(n),o=s.matches[s.matches.length-1];return Ke(o.route.id,`${n} can only be used on routes that contain a unique "id"`),o.route.id}function Qk(){return wh("useRouteId")}function Zk(){let n=j.useContext(xh),s=Jk("useRouteError"),o=wh("useRouteError");return n!==void 0?n:s.errors?.[o]}function e2(){let{router:n}=Xk("useNavigate"),s=wh("useNavigate"),o=j.useRef(!1);return Lx(()=>{o.current=!0}),j.useCallback(async(d,h={})=>{on(o.current,Vx),o.current&&(typeof d=="number"?await n.navigate(d):await n.navigate(d,{fromRouteId:s,...h}))},[n,s])}var ky={};function Fx(n,s,o){!s&&!ky[n]&&(ky[n]=!0,on(!1,o))}j.memo(t2);function t2({routes:n,future:s,state:o,onError:l}){return Hx(n,void 0,o,l,s)}function Hi({to:n,replace:s,state:o,relative:l}){Ke(Ks(),"<Navigate> may be used only in the context of a <Router> component.");let{static:d}=j.useContext(Ht);on(!d,"<Navigate> must not be used on the initial render in a <StaticRouter>. This is a no-op, but you should modify your code so the <Navigate> is only ever rendered in response to some user interaction or state change.");let{matches:h}=j.useContext(fn),{pathname:m}=gn(),p=Gx(),f=bh(n,yh(h),m,l==="path"),g=JSON.stringify(f);return j.useEffect(()=>{p(JSON.parse(g),{replace:s,state:o,relative:l})},[p,g,l,s,o]),null}function Te(n){Ke(!1,"A <Route> is only ever to be used as the child of <Routes> element, never rendered directly. Please wrap your <Route> in a <Routes>.")}function n2({basename:n="/",children:s=null,location:o,navigationType:l="POP",navigator:d,static:h=!1,unstable_useTransitions:m}){Ke(!Ks(),"You cannot render a <Router> inside another <Router>. You should never have more than one in your app.");let p=n.replace(/^\/*/,"/"),f=j.useMemo(()=>({basename:p,navigator:d,static:h,unstable_useTransitions:m,future:{}}),[p,d,h,m]);
11typeof o=="string"&&(o=Gs(o));let{pathname:g="/",search:b="",hash:x="",state:w=null,key:S="default"}=o,T=j.useMemo(()=>{let O=Hn(g,p);return O==null?null:{location:{pathname:O,search:b,hash:x,state:w,key:S},navigationType:l}},[p,g,b,x,w,S,l]);return on(T!=null,`<Router basename="${p}"> is not able to match the URL "${g}${b}${x}" because it does not start with the basename, so the <Router> won't render anything.`),T==null?null:j.createElement(Ht.Provider,{value:f},j.createElement(fo.Provider,{children:s,value:T}))}function a2({children:n,location:s}){return Gk(Fu(n),s)}function Fu(n,s=[]){let o=[];return j.Children.forEach(n,(l,d)=>{if(!j.isValidElement(l))return;let h=[...s,d];if(l.type===j.Fragment){o.push.apply(o,Fu(l.props.children,h));return}Ke(l.type===Te,`[${typeof l.type=="string"?l.type:l.type.name}] is not a <Route> component. All component children of <Routes> must be a <Route> or <React.Fragment>`),Ke(!l.props.index||!l.props.children,"An index route cannot have child routes.");let m={id:l.props.id||h.join("-"),caseSensitive:l.props.caseSensitive,element:l.props.element,Component:l.props.Component,index:l.props.index,path:l.props.path,middleware:l.props.middleware,loader:l.props.loader,action:l.props.action,hydrateFallbackElement:l.props.hydrateFallbackElement,HydrateFallback:l.props.HydrateFallback,errorElement:l.props.errorElement,ErrorBoundary:l.props.ErrorBoundary,hasErrorBoundary:l.props.hasErrorBoundary===!0||l.props.ErrorBoundary!=null||l.props.errorElement!=null,shouldRevalidate:l.props.shouldRevalidate,handle:l.props.handle,lazy:l.props.lazy};l.props.children&&(m.children=Fu(l.props.children,h)),o.push(m)}),o}var sl="get",il="application/x-www-form-urlencoded";function Cl(n){return typeof HTMLElement<"u"&&n instanceof HTMLElement}function s2(n){return Cl(n)&&n.tagName.toLowerCase()==="button"}function i2(n){return Cl(n)&&n.tagName.toLowerCase()==="form"}function o2(n){return Cl(n)&&n.tagName.toLowerCase()==="input"}function r2(n){return!!(n.metaKey||n.altKey||n.ctrlKey||n.shiftKey)}function l2(n,s){return n.button===0&&(!s||s==="_self")&&!r2(n)}var Vr=null;function c2(){if(Vr===null)try{new FormData(document.createElement("form"),0),Vr=!1}catch{Vr=!0}return Vr}var d2=new Set(["application/x-www-form-urlencoded","multipart/form-data","text/plain"]);function du(n){return n!=null&&!d2.has(n)?(on(!1,`"${n}" is not a valid \`encType\` for \`<Form>\`/\`<fetcher.Form>\` and will default to "${il}"`),null):n}function u2(n,s){let o,l,d,h,m;if(i2(n)){let p=n.getAttribute("action");l=p?Hn(p,s):null,o=n.getAttribute("method")||sl,d=du(n.getAttribute("enctype"))||il,h=new FormData(n)}else if(s2(n)||o2(n)&&(n.type==="submit"||n.type==="image")){let p=n.form;if(p==null)throw new Error('Cannot submit a <button> or <input type="submit"> without a <form>');let f=n.getAttribute("formaction")||p.getAttribute("action");if(l=f?Hn(f,s):null,o=n.getAttribute("formmethod")||p.getAttribute("method")||sl,d=du(n.getAttribute("formenctype"))||du(p.getAttribute("enctype"))||il,h=new FormData(p,n),!c2()){let{name:g,type:b,value:x}=n;if(b==="image"){let w=g?`${g}.`:"";h.append(`${w}x`,"0"),h.append(`${w}y`,"0")}else g&&h.append(g,x)}}else{if(Cl(n))throw new Error('Cannot submit element that is not <form>, <button>, or <input type="submit|image">');o=sl,l=null,d=il,m=n}return h&&d==="text/plain"&&(m=h,h=void 0),{action:l,method:o.toLowerCase(),encType:d,formData:h,body:m}}Object.getOwnPropertyNames(Object.prototype).sort().join("\0");function jh(n,s){if(n===!1||n===null||typeof n>"u")throw new Error(s)}function h2(n,s,o,l){let d=typeof n=="string"?new URL(n,typeof window>"u"?"server://singlefetch/":window.location.origin):n;return o?d.pathname.endsWith("/")?d.pathname=`${d.pathname}_.${l}`:d.pathname=`${d.pathname}.${l}`:d.pathname==="/"?d.pathname=`_root.${l}`:s&&Hn(d.pathname,s)==="/"?d.pathname=`${s.replace(/\/$/,"")}/_root.${l}`:d.pathname=`${d.pathname.replace(/\/$/,"")}.${l}`,d}async function m2(n,s){if(n.id in s)return s[n.id];try{let o=await import(n.module);return s[n.id]=o,o}catch(o){return console.error(`Error loading route module \`${n.module}\`, reloading page...`),console.error(o),window.__reactRouterContext&&window.__reactRouterContext.
11isSpaMode,window.location.reload(),new Promise(()=>{})}}function p2(n){return n==null?!1:n.href==null?n.rel==="preload"&&typeof n.imageSrcSet=="string"&&typeof n.imageSizes=="string":typeof n.rel=="string"&&typeof n.href=="string"}async function f2(n,s,o){let l=await Promise.all(n.map(async d=>{let h=s.routes[d.route.id];if(h){let m=await m2(h,o);return m.links?m.links():[]}return[]}));return x2(l.flat(1).filter(p2).filter(d=>d.rel==="stylesheet"||d.rel==="preload").map(d=>d.rel==="stylesheet"?{...d,rel:"prefetch",as:"style"}:{...d,rel:"prefetch"}))}function Ny(n,s,o,l,d,h){let m=(f,g)=>o[g]?f.route.id!==o[g].route.id:!0,p=(f,g)=>o[g].pathname!==f.pathname||o[g].route.path?.endsWith("*")&&o[g].params["*"]!==f.params["*"];return h==="assets"?s.filter((f,g)=>m(f,g)||p(f,g)):h==="data"?s.filter((f,g)=>{let b=l.routes[f.route.id];if(!b||!b.hasLoader)return!1;if(m(f,g)||p(f,g))return!0;if(f.route.shouldRevalidate){let x=f.route.shouldRevalidate({currentUrl:new URL(d.pathname+d.search+d.hash,window.origin),currentParams:o[0]?.params||{},nextUrl:new URL(n,window.origin),nextParams:f.params,defaultShouldRevalidate:!0});if(typeof x=="boolean")return x}return!0}):[]}function g2(n,s,{includeHydrateFallback:o}={}){return y2(n.map(l=>{let d=s.routes[l.route.id];if(!d)return[];let h=[d.module];return d.clientActionModule&&(h=h.concat(d.clientActionModule)),d.clientLoaderModule&&(h=h.concat(d.clientLoaderModule)),o&&d.hydrateFallbackModule&&(h=h.concat(d.hydrateFallbackModule)),d.imports&&(h=h.concat(d.imports)),h}).flat(1))}function y2(n){return[...new Set(n)]}function b2(n){let s={},o=Object.keys(n).sort();for(let l of o)s[l]=n[l];return s}function x2(n,s){let o=new Set;return new Set(s),n.reduce((l,d)=>{let h=JSON.stringify(b2(d));return o.has(h)||(o.add(h),l.push({key:h,link:d})),l},[])}function Wx(){let n=j.useContext(Hs);return jh(n,"You must render this element inside a <DataRouterContext.Provider> element"),n}function v2(){let n=j.useContext(Al);return jh(n,"You must render this element inside a <DataRouterStateContext.Provider> element"),n}var kh=j.createContext(void 0);kh.displayName="FrameworkContext";function Yx(){let n=j.useContext(kh);return jh(n,"You must render this element inside a <HydratedRouter> element"),n}function w2(n,s){let o=j.useContext(kh),[l,d]=j.useState(!1),[h,m]=j.useState(!1),{onFocus:p,onBlur:f,onMouseEnter:g,onMouseLeave:b,onTouchStart:x}=s,w=j.useRef(null);j.useEffect(()=>{if(n==="render"&&m(!0),n==="viewport"){let O=E=>{E.forEach(P=>{m(P.isIntersecting)})},D=new IntersectionObserver(O,{threshold:.5});return w.current&&D.observe(w.current),()=>{D.disconnect()}}},[n]),j.useEffect(()=>{if(l){let O=setTimeout(()=>{m(!0)},100);return()=>{clearTimeout(O)}}},[l]);let S=()=>{d(!0)},T=()=>{d(!1),m(!1)};return o?n!=="intent"?[h,w,{}]:[h,w,{onFocus:Ki(p,S),onBlur:Ki(f,T),onMouseEnter:Ki(g,S),onMouseLeave:Ki(b,T),onTouchStart:Ki(x,S)}]:[!1,w,{}]}function Ki(n,s){return o=>{n&&n(o),o.defaultPrevented||s(o)}}function j2({page:n,...s}){let{router:o}=Wx(),l=j.useMemo(()=>zx(o.routes,n,o.basename),[o.routes,n,o.basename]);return l?j.createElement(N2,{page:n,matches:l,...s}):null}function k2(n){let{manifest:s,routeModules:o}=Yx(),[l,d]=j.useState([]);return j.useEffect(()=>{let h=!1;return f2(n,s,o).then(m=>{h||d(m)}
11),()=>{h=!0}},[n,s,o]),l}function N2({page:n,matches:s,...o}){let l=gn(),{future:d,manifest:h,routeModules:m}=Yx(),{basename:p}=Wx(),{loaderData:f,matches:g}=v2(),b=j.useMemo(()=>Ny(n,s,g,h,l,"data"),[n,s,g,h,l]),x=j.useMemo(()=>Ny(n,s,g,h,l,"assets"),[n,s,g,h,l]),w=j.useMemo(()=>{if(n===l.pathname+l.search+l.hash)return[];let O=new Set,D=!1;if(s.forEach(P=>{let I=h.routes[P.route.id];!I||!I.hasLoader||(!b.some(F=>F.route.id===P.route.id)&&P.route.id in f&&m[P.route.id]?.shouldRevalidate||I.hasClientLoader?D=!0:O.add(P.route.id))}),O.size===0)return[];let E=h2(n,p,d.unstable_trailingSlashAwareDataRequests,"data");return D&&O.size>0&&E.searchParams.set("_routes",s.filter(P=>O.has(P.route.id)).map(P=>P.route.id).join(",")),[E.pathname+E.search]},[p,d.unstable_trailingSlashAwareDataRequests,f,l,h,b,s,n,m]),S=j.useMemo(()=>g2(x,h),[x,h]),T=k2(x);return j.createElement(j.Fragment,null,w.map(O=>j.createElement("link",{key:O,rel:"prefetch",as:"fetch",href:O,...o})),S.map(O=>j.createElement("link",{key:O,rel:"modulepreload",href:O,...o})),T.map(({key:O,link:D})=>j.createElement("link",{key:O,nonce:o.nonce,...D})))}function T2(...n){return s=>{n.forEach(o=>{typeof o=="function"?o(s):o!=null&&(o.current=s)})}}var S2=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";try{S2&&(window.__reactRouterVersion="7.12.0")}catch{}function A2({basename:n,children:s,unstable_useTransitions:o,window:l}){let d=j.useRef();d.current==null&&(d.current=ok({window:l,v5Compat:!0}));let h=d.current,[m,p]=j.useState({action:h.action,location:h.location}),f=j.useCallback(g=>{o===!1?p(g):j.startTransition(()=>p(g))},[o]);return j.useLayoutEffect(()=>h.listen(f),[h,f]),j.createElement(n2,{basename:n,children:s,location:m.location,navigationType:m.action,navigator:h,unstable_useTransitions:o})}var Xx=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,ie=j.forwardRef(function({onClick:s,discover:o="render",prefetch:l="none",relative:d,reloadDocument:h,replace:m,state:p,target:f,to:g,preventScrollReset:b,viewTransition:x,unstable_defaultShouldRevalidate:w,...S},T){let{basename:O,unstable_useTransitions:D}=j.useContext(Ht),E=typeof g=="string"&&Xx.test(g),P=Ix(g,O);g=P.to;let I=_k(g,{relative:d}),[F,W,Z]=w2(l,S),X=D2(g,{replace:m,state:p,target:f,preventScrollReset:b,relative:d,viewTransition:x,unstable_defaultShouldRevalidate:w,unstable_useTransitions:D});function J(ue){s&&s(ue),ue.defaultPrevented||X(ue)}let Q=j.createElement("a",{...S,...Z,href:P.absoluteURL||I,onClick:P.isExternal||h?s:J,ref:T2(T,W),target:f,"data-discover":!E&&o==="render"?"true":void 0});return F&&!E?j.createElement(j.Fragment,null,Q,j.createElement(j2,{page:I})):Q});ie.displayName="Link";var C2=j.forwardRef(function({"aria-current":s="page",caseSensitive:o=!1,className:l="",end:d=!1,style:h,to:m,viewTransition:p,children:f,...g},b){let x=go(m,{relative:g.relative}),w=gn(),S=j.useContext(Al),{navigator:T,basename:O}=j.useContext(Ht),D=S!=null&&P2(x)&&p===!0,E=T.encodeLocation?T.encodeLocation(x).pathname:x.pathname,P=w.pathname,I=S&&S.navigation&&S.navigation.location?S.navigation.location.pathname:null;o||(P=P.toLowerCase(),I=I?I.toLowerCase():null,E=E.toLowerCase()),I&&O&&(I=Hn(I,O)||I);const F=E!=="/"&&E.endsWith("/")?E.length-1:E.length;let W=P===E||!d&&P.startsWith(E)&&P.charAt(F)==="/",Z=I!=null&&(I===E||!d&&I.startsWith(E)&&I.charAt(E.length)==="/"),X={isActive:W,isPending:Z,isTransitioning:D},J=W?s:void 0,Q;typeof l=="function"?Q=l(X):Q=[l,W?"active":null,Z?"pending":null,D?"transitioning":null].filter(Boolean).join(" ");let ue=typeof h=="function"?h(X):h;return j.createElement(ie,{...g,"aria-current":J,className:Q,ref:b,style:ue,to:m,viewTransition:p},typeof f=="function"?f(X):f)});C2.displayName="NavLink";var O2=j.forwardRef(({discover:n="render",fetcherKey:s,navigate:o,reloadDocument:l,replace:d,state:h,method:m=sl,action:p,onSubmit:f,relative:g,preventScrollReset:b,viewTransition:x,unstable_defaultShouldRevalidate:w,...S},T)=>{let{unstable_useTransitions:O}=j.useContext(Ht),D=M2(),E=q2(p,{relative:g}),P=m.toLowerCase()==="get"?"get":"post",I=typeof p=="string"&&Xx.test(p),F=W=>{if(f&&f(W),W.defaultPrevented)return;W.preventDefault();let Z=W.nativeEvent.submitter,X=Z?.getAttribute("formmethod")||m,J=()=>D(Z||W.currentTarget,{fetcherKey:s,method:X,navigate:o,replace:d,state:h,relative:g,preventScrollReset:b,viewTransition:x,unstable_defaultShouldRevalidate:w});O&&o!==!1?j.startTransition(()=>J()):J()};return j.createElement("form",{ref:T,method:P,action:E,onSubmit:l?f:F,...S,"data-discover":!I&&n==="render"?"true":void 0})});O2.displayName="Form";function E2(n){return`${n} must be used within a data router.  See https://reactrouter.com/en/main/routers/picking-a-router.`}function Jx(n){let s=j.useContext(Hs);return Ke(s,E2(n)),s}function D2(n,{target:s,replace:o,state:l,preventScrollReset:d,relative:h,viewTransition:m,unstable_defaultShouldRevalidate:p,unstable_useTransitions:f}={}){let g=Gx(),b=gn(),x=go(n,{relative:h});return j.useCallback(w=>{if(l2(w,s)){w.preventDefault();let S=o!==void 0?o:io(b)===io(x),T=()=>g(n,{replace:S,state:l,preventScrollReset:d,relative:h,viewTransition:m,unstable_defaultShouldRevalidate:p});f?j.startTransition(()=>T()):T()}},[b,g,x,o,l,s,n,d,h,m,p,f])}var z2=0,R2=()=>`__${String(++z2)}__`;function M2(){let{router:n}=Jx("useSubmit"),{basename:s}=j.useContext(Ht),o=Qk(),l=n.fetch,d=n.navigate;return j.useCallback(async(h,m={})=>{let{action:p,method:f,encType:g,formData:b,body:x}=u2(h,s);if(m.navigate===!1){let w=m.fetcherKey||R2();await l(w,o,m.action||p,{unstable_defaultShouldRevalidate:m.unstable_defaultShouldRevalidate,preventScrollReset:m.preventScrollReset,formData:b,body:x,formMethod:m.method||f,formEncType:m.encType||g,flushSync:m.flushSync})}else await d(m.action||p,{unstable_defaultShouldRevalidate:m.unstable_defaultShouldRevalidate,preventScrollReset:m.preventScrollReset,formData:b,body:x,formMethod:m.method||f,formEncType:m.encType||g,replace:m.replace,state:m.state,fromRouteId:o,flushSync:m.flushSync,viewTransition:m.viewTransition})},[l,d,s,o])}function q2(n,{relative:s}={}){let{basename:o}=j.useContext(Ht),l=j.useContext(fn);Ke(l,"useFormAction must be used inside a RouteContext");let[d]=l.matches.slice(-1),h={...go(n||".",{relative:s})},m=gn();if(n==null){h.search=m.search;let p=new URLSearchParams(h.search),f=p.getAll("index");if(f.some(b=>b==="")){p.delete("index"),f.filter(x=>
11x).forEach(x=>p.append("index",x));let b=p.toString();h.search=b?`?${b}`:""}}return(!n||n===".")&&d.route.index&&(h.search=h.search?h.search.replace(/^\?/,"?index&"):"?index"),o!=="/"&&(h.pathname=h.pathname==="/"?o:Gn([o,h.pathname])),io(h)}function P2(n,{relative:s}={}){let o=j.useContext(Bx);Ke(o!=null,"`useViewTransitionState` must be used within `react-router-dom`'s `RouterProvider`.  Did you accidentally import `RouterProvider` from `react-router`?");let{basename:l}=Jx("useViewTransitionState"),d=go(n,{relative:s});if(!o.isTransitioning)return!1;let h=Hn(o.currentLocation.pathname,l)||o.currentLocation.pathname,m=Hn(o.nextLocation.pathname,l)||o.nextLocation.pathname;return fl(d.pathname,m)!=null||fl(d.pathname,h)!=null}const Nh=j.createContext({});function wa(n){const s=j.useRef(null);return s.current===null&&(s.current=n()),s.current}const $x=typeof window<"u",Ol=$x?j.useLayoutEffect:j.useEffect,El=j.createContext(null);function Th(n,s){n.indexOf(s)===-1&&n.push(s)}function Dl(n,s){const o=n.indexOf(s);o>-1&&n.splice(o,1)}const mn=(n,s,o)=>o>s?s:o<n?n:o;let oo=()=>{};const Kn={},Qx=n=>/^-?(?:\d+(?:\.\d+)?|\.\d+)$/u.test(n);function Zx(n){return typeof n=="object"&&n!==null}const ev=n=>/^0[^.\s]+$/u.test(n);function Sh(n){let s;return()=>(s===void 0&&(s=n()),s)}const Dt=n=>n,I2=(n,s)=>o=>s(n(o)),yo=(...n)=>n.reduce(I2),Xa=(n,s,o)=>{const l=s-n;return l===0?1:(o-n)/l};class Ah{constructor(){this.subscriptions=[]}add(s){return Th(this.subscriptions,s),()=>Dl(this.subscriptions,s)}notify(s,o,l){const d=this.subscriptions.length;if(d)if(d===1)this.subscriptions[0](s,o,l);else for(let h=0;h<d;h++){const m=this.subscriptions[h];m&&m(s,o,l)}}getSize(){return this.subscriptions.length}clear(){this.subscriptions.length=0}}const kn=n=>n*1e3,sn=n=>n/1e3;function Ch(n,s){return s?n*(1e3/s):0}const U2=(n,s,o)=>{const l=s-n;return((o-n)%l+l)%l+n},tv=(n,s,o)=>(((1-3*o+3*s)*n+(3*o-6*s))*n+3*s)*n,B2=1e-7,_2=12;function V2(n,s,o,l,d){let h,m,p=0;do m=s+(o-s)/2,h=tv(m,l,d)-n,h>0?o=m:s=m;while(Math.abs(h)>B2&&++p<_2);return m}function bo(n,s,o,l){if(n===s&&o===l)return Dt;const d=h=>V2(h,0,1,n,o);return h=>h===0||h===1?h:tv(d(h),s,l)}const nv=n=>s=>s<=.5?n(2*s)/2:(2-n(2*(1-s)))/2,av=n=>s=>1-n(1-s),sv=bo(.33,1.53,.69,.99),Oh=av(sv),iv=nv(Oh),ov=n=>(n*=2)<1?.5*Oh(n):.5*(2-Math.pow(2,-10*(n-1))),Eh=n=>1-Math.sin(Math.acos(n)),rv=av(Eh),lv=nv(Eh),L2=bo(.42,0,1,1),G2=bo(0,0,.58,1),cv=bo(.42,0,.58,1),dv=n=>Array.isArray(n)&&typeof n[0]!="number";function uv(n,s){return dv(n)?n[U2(0,n.length,s)]:n}const hv=n=>Array.isArray(n)&&typeof n[0]=="number",H2={linear:Dt,easeIn:L2,easeInOut:cv,easeOut:G2,circIn:Eh,circInOut:lv,circOut:rv,backIn:Oh,backInOut:iv,backOut:sv,anticipate:ov},K2=n=>typeof n=="string",Ty=n=>{if(hv(n)){oo(n.length===4);const[s,o,l,d]=n;return bo(s,o,l,d)}else if(K2(n))return H2[n];return n},Lr=["setup","read","resolveKeyframes","preUpdate","update","preRender","render","postRender"];function F2(n,s){let o=new Set,l=new Set,d=!1,h=!1;const m=new WeakSet;let p={delta:0,timestamp:0,isProcessing:!1};function f(b){m.has(b)&&(g.schedule(b),n()),b(p)}const g={schedule:(b,x=!1,w=!1)=>{const T=w&&d?o:l;return x&&m.add(b),T.has(b)||T.add(b),b},cancel:b=>{l.delete(b),m.delete(b)},process:b=>{if(p=b,d){h=!0;return}d=!0,[o,l]=[l,o],o.forEach(f),o.clear(),d=!1,h&&(h=!1,g.process(b))}};return g}const W2=40;function mv(n,s){let o=!1,l=!0;const d={delta:0,timestamp:0,isProcessing:!1},h=()=>o=!0,m=Lr.reduce((I,F)=>(I[F]=F2(h),I),{}),{setup:p,read:f,resolveKeyframes:g,preUpdate:b,update:x,preRender:w,render:S,postRender:T}=m,O=()=>{const I=Kn.useManualTiming?d.timestamp:performance.now();o=!1,Kn.useManualTiming||(d.delta=l?1e3/60:Math.max(Math.min(I-d.timestamp,W2),1)),d.timestamp=I,d.isProcessing=!0,p.process(d),f.process(d),g.process(d),b.process(d),x.process(d),w.process(d),S.process(d),T.process(d),d.isProcessing=!1,o&&s&&(l=!1,n(O))},D=()=>{o=!0,l=!0,d.isProcessing||n(O)};return{schedule:Lr.reduce((I,F)=>{const W=m[F];return I[F]=(Z,X=!1,J=!1)=>(o||D(),W.schedule(Z,X,J)),I},{}),cancel:I=>{for(let F=0;F<Lr.length;F++)m[Lr[F]].cancel(I)},state:d,steps:m}}const{schedule:Ee,cancel:pn,state:ct,steps:uu}=mv(typeof requestAnimationFrame<"u"?requestAnimationFrame:Dt,!0);let ol;function Y2(){ol=void 0}const jt={now:()=>(ol===void 0&&jt.set(ct.isProcessing||Kn.useManualTiming?ct.timestamp:performance.now()),ol),set:n=>{ol=n,queueMicrotask(Y2)}},pv=n=>s=>typeof s=="string"&&s.startsWith(n),fv=pv("--"),X2=pv("var(--"),Dh=n=>X2(n)?J2.test(n.split("/*")[0].trim()):!1,J2=/var\(--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)$/iu;
vendor: 26,019 bytes, line 11
11function Sy(n){return typeof n!="string"?!1:n.split("/*")[0].includes("var(--")}const Fs={test:n=>typeof n=="number",parse:parseFloat,transform:n=>n},ro={...Fs,transform:n=>mn(0,1,n)},Gr={...Fs,default:1},eo=n=>Math.round(n*1e5)/1e5,zh=/-?(?:\d+(?:\.\d+)?|\.\d+)/gu;function $2(n){return n==null}const Q2=/^(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))$/iu,Rh=(n,s)=>o=>!!(typeof o=="string"&&Q2.test(o)&&o.startsWith(n)||s&&!$2(o)&&Object.prototype.hasOwnProperty.call(o,s)),gv=(n,s,o)=>l=>{if(typeof l!="string")return l;const[d,h,m,p]=l.match(zh);return{[n]:parseFloat(d),[s]:parseFloat(h),[o]:parseFloat(m),alpha:p!==void 0?parseFloat(p):1}},Z2=n=>mn(0,255,n),hu={...Fs,transform:n=>Math.round(Z2(n))},Fa={test:Rh("rgb","red"),parse:gv("red","green","blue"),transform:({red:n,green:s,blue:o,alpha:l=1})=>"rgba("+hu.transform(n)+", "+hu.transform(s)+", "+hu.transform(o)+", "+eo(ro.transform(l))+")"};function eN(n){let s="",o="",l="",d="";return n.length>5?(s=n.substring(1,3),o=n.substring(3,5),l=n.substring(5,7),d=n.substring(7,9)):(s=n.substring(1,2),o=n.substring(2,3),l=n.substring(3,4),d=n.substring(4,5),s+=s,o+=o,l+=l,d+=d),{red:parseInt(s,16),green:parseInt(o,16),blue:parseInt(l,16),alpha:d?parseInt(d,16)/255:1}}const Wu={test:Rh("#"),parse:eN,transform:Fa.transform},xo=n=>({test:s=>typeof s=="string"&&s.endsWith(n)&&s.split(" ").length===1,parse:parseFloat,transform:s=>`${s}${n}`}),xa=xo("deg"),Nn=xo("%"),ne=xo("px"),tN=xo("vh"),nN=xo("vw"),Ay={...Nn,parse:n=>Nn.parse(n)/100,transform:n=>Nn.transform(n*100)},Ps={test:Rh("hsl","hue"),parse:gv("hue","saturation","lightness"),transform:({hue:n,saturation:s,lightness:o,alpha:l=1})=>"hsla("+Math.round(n)+", "+Nn.transform(eo(s))+", "+Nn.transform(eo(o))+", "+eo(ro.transform(l))+")"},it={test:n=>Fa.test(n)||Wu.test(n)||Ps.test(n),parse:n=>Fa.test(n)?Fa.parse(n):Ps.test(n)?Ps.parse(n):Wu.parse(n),transform:n=>typeof n=="string"?n:n.hasOwnProperty("red")?Fa.transform(n):Ps.transform(n),getAnimatableNone:n=>{const s=it.parse(n);return s.alpha=0,it.transform(s)}},aN=/(?:#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\))/giu;function sN(n){return isNaN(n)&&typeof n=="string"&&(n.match(zh)?.length||0)+(n.match(aN)?.length||0)>0}const yv="number",bv="color",iN="var",oN="var(",Cy="${}",rN=/var\s*\(\s*--(?:[\w-]+\s*|[\w-]+\s*,(?:\s*[^)(\s]|\s*\((?:[^)(]|\([^)(]*\))*\))+\s*)\)|#[\da-f]{3,8}|(?:rgb|hsl)a?\((?:-?[\d.]+%?[,\s]+){2}-?[\d.]+%?\s*(?:[,/]\s*)?(?:\b\d+(?:\.\d+)?|\.\d+)?%?\)|-?(?:\d+(?:\.\d+)?|\.\d+)/giu;function lo(n){const s=n.toString(),o=[],l={color:[],number:[],var:[]},d=[];let h=0;const p=s.replace(rN,f=>(it.test(f)?(l.color.push(h),d.push(bv),o.push(it.parse(f))):f.startsWith(oN)?(l.var.push(h),d.push(iN),o.push(f)):(l.number.push(h),d.push(yv),o.push(parseFloat(f))),++h,Cy)).split(Cy);return{values:o,split:p,indexes:l,types:d}}function xv(n){return lo(n).values}function vv(n){const{split:s,types:o}=lo(n),l=s.length;return d=>{let h="";for(let m=0;m<l;m++)if(h+=s[m],d[m]!==void 0){const p=o[m];p===yv?h+=eo(d[m]):p===bv?h+=it.transform(d[m]):h+=d[m]}return h}}const lN=n=>typeof n=="number"?0:it.test(n)?it.getAnimatableNone(n):n;function cN(n){const s=xv(n);return vv(n)(s.map(lN))}const ja={test:sN,parse:xv,createTransformer:vv,getAnimatableNone:cN};function mu(n,s,o){return o<0&&(o+=1),o>1&&(o-=1),o<1/6?n+(s-n)*6*o:o<1/2?s:o<2/3?n+(s-n)*(2/3-o)*6:n}function dN({hue:n,saturation:s,lightness:o,alpha:l}){n/=360,s/=100,o/=100;let d=0,h=0,m=0;if(!s)d=h=m=o;else{const p=o<.5?o*(1+s):o+s-o*s,f=2*o-p;d=mu(f,p,n+1/3),h=mu(f,p,n),m=mu(f,p,n-1/3)}return{red:Math.round(d*255),green:Math.round(h*255),blue:Math.round(m*255),alpha:l}}function gl(n,s){return o=>o>0?s:n}const He=(n,s,o)=>n+(s-n)*o,pu=(n,s,o)=>{const l=n*n,d=o*(s*s-l)+l;return d<0?0:Math.sqrt(d)},uN=[Wu,Fa,Ps],hN=n=>uN.find(s=>s.test(n));function Oy(n){const s=hN(n);if(!s)return!1;let o=s.parse(n);return s===Ps&&(o=dN(o)),o}const Ey=(n,s)=>{const o=Oy(n),l=Oy(s);if(!o||!l)return gl(n,s);const d={...o};return h=>(d.red=pu(o.red,l.red,h),d.green=pu(o.green,l.green,h),d.blue=pu(o.blue,l.blue,h),d.alpha=He(o.alpha,l.alpha,h),Fa.transform(d))},Yu=new Set(["none","hidden"]);function mN(n,s){return Yu.has(n)?o=>o<=0?n:s:o=>o>=1?s:n}function pN(n,s){return o=>He(n,s,o)}function Mh(n){return typeof n=="number"?pN:typeof n=="string"?Dh(n)?gl:it.test(n)?Ey:yN:Array.isArray(n)?wv:typeof n=="object"?it.test(n)?Ey:fN:gl}function wv(n,s){const o=[...n],l=o.length,d=n.map((h,m)=>Mh(h)(h,s[m]));return h=>{for(let m=0;m<l;m++)o[m]=d[m](h);return o}}function fN(n,s){const o={...n,...s},l={};for(const d in o)n[d]!==void 0&&s[d]!==void 0&&(l[d]=Mh(n[d])(n[d],s[d]));return d=>{for(const h in l)o[h]=l[h](d);return o}}function gN(n,s){const o=[],l={color:0,var:0,number:0};for(let d=0;d<s.values.length;d++){const h=s.types[d],m=n.indexes[h][l[h]],p=n.values[m]??0;o[d]=p,l[h]++}return o}const yN=(n,s)=>{const o=ja.createTransformer(s),l=lo(n),d=lo(s);return l.indexes.var.length===d.indexes.var.length&&l.indexes.color.length===d.indexes.color.length&&l.indexes.number.length>=d.indexes.number.length?Yu.has(n)&&!d.values.length||Yu.has(s)&&!l.values.length?mN(n,s):yo(wv(gN(l,d),d.values),o):gl(n,s)};function jv(n,s,o){return typeof n=="number"&&typeof s=="number"&&typeof o=="number"?He(n,s,o):Mh(n)(n,s)}const bN=n=>{const s=({timestamp:o})=>n(o);return{start:(o=!0)=>Ee.update(s,o),stop:()=>pn(s),now:()=>ct.isProcessing?ct.timestamp:jt.now()}},kv=(n,s,o=10)=>{let l="";const d=Math.max(Math.round(s/o),2);for(let h=0;h<d;h++)l+=Math.round(n(h/(d-1))*1e4)/1e4+", ";return`linear(${l.substring(0,l.length-2)})`},yl=2e4;function qh(n){let s=0;const o=50;let l=n.next(s);for(;!l.done&&s<yl;)s+=o,l=n.next(s);return s>=yl?1/0:s}function Nv(n,s=100,o){const l=o({...n,keyframes:[0,s]}),d=Math.min(qh(l),yl);return{type:"keyframes",ease:h=>l.next(d*h).value/s,duration:sn(d)}}const xN=5;function Tv(n,s,o){const l=Math.max(s-xN,0);return Ch(o-n(l),s-l)}const Ye={stiffness:100,damping:10,mass:1,velocity:0,duration:800,bounce:.3,visualDuration:.3,restSpeed:{granular:.01,default:2},restDelta:{granular:.005,default:.5},minDuration:.01,maxDuration:10,minDamping:.05,maxDamping:1},fu=.001;function vN({duration:n=Ye.duration,bounce:s=Ye.bounce,velocity:o=Ye.velocity,mass:l=Ye.mass}){let d,h,m=1-s;m=mn(Ye.minDamping,Ye.maxDamping,m),n=mn(Ye.minDuration,Ye.maxDuration,sn(n)),m<1?(d=g=>{const b=g*m,x=b*n,w=b-o,S=Xu(g,m),T=Math.exp(-x);return fu-w/S*T},h=g=>{const x=g*m*n,w=x*o+o,S=Math.pow(m,2)*Math.pow(g,2)*n,T=Math.exp(-x),O=Xu(Math.pow(g,2),m);return(-d(g)+fu>0?-1:1)*((w-S)*T)/O}):(d=g=>{const b=Math.exp(-g*n),x=(g-o)*n+1;return-fu+b*x},h=g=>{const b=Math.exp(-g*n),x=(o-g)*(n*n);return b*x});const p=5/n,f=jN(d,h,p);if(n=kn(n),isNaN(f))return{stiffness:Ye.stiffness,damping:Ye.damping,duration:n};{const g=Math.pow(f,2)*l;return{stiffness:g,damping:m*2*Math.sqrt(l*g),duration:n}}}const wN=12;function jN(n,s,o){let l=o;for(let d=1;d<wN;d++)l=l-n(l)/s(l);return l}function Xu(n,s){return n*Math.sqrt(1-s*s)}const kN=["duration","bounce"],NN=["stiffness","damping","mass"];function Dy(n,s){return s.some(o=>n[o]!==void 0)}function TN(n){let s={velocity:Ye.velocity,stiffness:Ye.stiffness,damping:Ye.damping,mass:Ye.mass,isResolvedFromDuration:!1,...n};if(!Dy(n,NN)&&Dy(n,kN))if(n.visualDuration){const o=n.visualDuration,l=2*Math.PI/(o*1.2),d=l*l,h=2*mn(.05,1,1-(n.bounce||0))*Math.sqrt(d);s={...s,mass:Ye.mass,stiffness:d,damping:h}}else{const o=vN(n);s={...s,...o,mass:Ye.mass},s.isResolvedFromDuration=!0}return s}function co(n=Ye.visualDuration,s=Ye.bounce){const o=typeof n!="object"?{visualDuration:n,keyframes:[0,1],bounce:s}:n;let{restSpeed:l,restDelta:d}=o;const h=o.keyframes[0],m=o.keyframes[o.keyframes.length-1],p={done:!1,value:h},{stiffness:f,damping:g,mass:b,duration:x,velocity:w,isResolvedFromDuration:S}=TN({...o,velocity:-sn(o.velocity||0)}),T=w||0,O=g/(2*Math.sqrt(f*b)),D=m-h,E=sn(Math.sqrt(f/b)),P=Math.abs(D)<5;l||(l=P?Ye.restSpeed.granular:Ye.restSpeed.default),d||(d=P?Ye.restDelta.granular:Ye.restDelta.default);let I;if(O<1){const W=Xu(E,O);I=Z=>{const X=Math.exp(-O*E*Z);return m-X*((T+O*E*D)/W*Math.sin(W*Z)+D*Math.cos(W*Z))}}else if(O===1)I=W=>m-Math.exp(-E*W)*(D+(T+E*D)*W);else{const W=E*Math.sqrt(O*O-1);I=Z=>{const X=Math.exp(-O*E*Z),J=Math.min(W*Z,300);return m-X*((T+O*E*D)*Math.sinh(J)+W*D*Math.cosh(J))/W}}const F={calculatedDuration:S&&x||null,next:W=>{const Z=I(W);if(S)p.done=W>=x;else{let X=W===0?T:0;O<1&&(X=W===0?kn(T):Tv(I,W,Z));const J=Math.abs(X)<=l,Q=Math.abs(m-Z)<=d;p.done=J&&Q}return p.value=p.done?m:Z,p},toString:()=>{const W=Math.min(qh(F),yl),Z=kv(X=>F.next(W*X).value,W,30);return W+"ms "+Z},toTransition:()=>{}};return F}co.applyToOptions=n=>{const s=Nv(n,100,co);return n.ease=s.ease,n.duration=kn(s.duration),n.type="keyframes",n};function Ju({keyframes:n,velocity:s=0,power:o=.8,timeConstant:l=325,bounceDamping:d=10,bounceStiffness:h=500,modifyTarget:m,min:p,max:f,restDelta:g=.5,restSpeed:b}){const x=n[0],w={done:!1,value:x},S=J=>p!==void 0&&J<p||f!==void 0&&J>f,T=J=>p===void 0?f:f===void 0||Math.abs(p-J)<Math.abs(f-J)?p:f;let O=o*s;const D=x+O,E=m===void 0?D:m(D);E!==D&&(O=E-x);const P=J=>-O*Math.exp(-J/l),I=J=>E+P(J),F=J=>{const Q=P(J),ue=I(J);w.done=Math.abs(Q)<=g,w.value=w.done?E:ue};let W,Z;const X=J=>{S(w.value)&&(W=J,Z=co({keyframes:[w.value,T(w.value)],velocity:Tv(I,J,w.value),damping:d,stiffness:h,restDelta:g,restSpeed:b}))};return X(0),{calculatedDuration:null,next:J=>{let Q=!1;return!Z&&W===void 0&&(Q=!0,F(J),X(J)),W!==void 0&&J>=W?Z.next(J-W):(!Q&&F(J),w)}}}function SN(n,s,o){const l=[],d=o||Kn.mix||jv,h=n.length-1;for(let m=0;m<h;m++){let p=d(n[m],n[m+1]);if(s){const f=Array.isArray(s)?s[m]||Dt:s;p=yo(f,p)}l.push(p)}return l}function Ph(n,s,{clamp:o=!0,ease:l,mixer:d}={}){const h=n.length;if(oo(h===s.length),h===1)return()=>s[0];if(h===2&&s[0]===s[1])return()=>s[1];const m=n[0]===n[1];n[0]>n[h-1]&&(n=[...n].reverse(),s=[...s].reverse());const p=SN(s,l,d),f=p.length,g=b=>{if(m&&b<n[0])return s[0];let x=0;if(f>1)for(;x<n.length-2&&!(b<n[x+1]);x++);const w=Xa(n[x],n[x+1],b);return p[x](w)};return o?b=>g(mn(n[0],n[h-1],b)):g}function Sv(n,s){const o=n[n.length-1];for(let l=1;l<=s;l++){const d=Xa(0,s,l);n.push(He(o,1,d))}}function Ih(n){const s=[0];return Sv(s,n.length-1),s}function AN(n,s){return n.map(o=>o*s)}function CN(n,s){return n.map(()=>s||cv).splice(0,n.length-1)}function to({duration:n=300,keyframes:s,times:o,ease:l="easeInOut"}){const d=dv(l)?l.map(Ty):Ty(l),h={done:!1,value:s[0]},m=AN(o&&o.length===s.length?o:Ih(s),n),p=Ph(m,s,{ease:Array.isArray(d)?d:CN(s,d)});return{calculatedDuration:n,next:f=>(h.value=p(f),h.done=f>=n,h)}}const ON=n=>n!==null;function Uh(n,{repeat:s,repeatType:o="loop"},l,d=1){const h=n.filter(ON),p=d<0||s&&o!=="loop"&&s%2===1?0:h.length-1;return!p||l===void 0?h[p]:l}const EN={decay:Ju,inertia:Ju,tween:to,keyframes:to,spring:co};function Av(n){typeof n.type=="string"&&(n.type=EN[n.type])}class Bh{constructor(){this.updateFinished()}get finished(){return this._finished}updateFinished(){this._finished=new Promise(s=>{this.resolve=s})}notifyFinished(){this.resolve()}then(s,o){return this.finished.then(s,o)}}const DN=n=>n/100;class _h extends Bh{constructor(s){super(),this.state="idle",this.startTime=null,this.isStopped=!1,this.currentTime=0,this.holdTime=null,this.playbackSpeed=1,this.stop=()=>{const{motionValue:o}=this.options;o&&o.updatedAt!==jt.now()&&this.tick(jt.now()),this.isStopped=!0,this.state!=="idle"&&(this.teardown(),this.options.onStop?.())},this.options=s,this.initAnimation(),this.play(),s.autoplay===!1&&this.pause()}initAnimation(){const{options:s}=this;Av(s);const{type:o=to,repeat:l=0,repeatDelay:d=0,repeatType:h,velocity:m=0}=s;let{keyframes:p}=s;const f=o||to;f!==to&&typeof p[0]!="number"&&(this.mixKeyframes=yo(DN,jv(p[0],p[1])),p=[0,100]);const g=f({...s,keyframes:p});h==="mirror"&&(this.mirroredGenerator=f({...s,keyframes:[...p].reverse(),velocity:-m})),g.calculatedDuration===null&&(g.calculatedDuration=qh(g));const{calculatedDuration:b}=g;this.calculatedDuration=b,this.resolvedDuration=b+d,this.totalDuration=this.resolvedDuration*(l+1)-d,this.generator=g}updateTime(s){const o=Math.round(s-this.startTime)*this.playbackSpeed;this.holdTime!==null?this.currentTime=this.holdTime:this.currentTime=o}tick(s,o=!1){const{generator:l,totalDuration:d,mixKeyframes:h,mirroredGenerator:m,resolvedDuration:p,calculatedDuration:f}=this;if(this.startTime===null)return l.next(0);const{delay:g=0,keyframes:b,repeat:x,repeatType:w,repeatDelay:S,type:T,onUpdate:O,finalKeyframe:D}=this.options;this.speed>0?this.startTime=Math.min(this.startTime,s):this.speed<0&&(this.startTime=Math.min(s-d/this.speed,this.startTime)),o?this.currentTime=s:this.updateTime(s);const E=this.currentTime-g*(this.playbackSpeed>=0?1:-1),P=this.playbackSpeed>=0?E<0:E>d;this.currentTime=Math.max(E,0),this.state==="finished"&&this.holdTime===null&&(this.currentTime=d);let I=this.currentTime,F=l;if(x){const J=Math.min(this.currentTime,d)/p;let Q=Math.floor(J),ue=J%1;!ue&&J>=1&&(ue=1),ue===1&&Q--,Q=Math.min(Q,x+1),Q%2&&(w==="reverse"?(ue=1-ue,S&&(ue-=S/p)):w==="mirror"&&(F=m)),I=mn(0,1,ue)*p}const W=P?{done:!1,value:b[0]}:F.next(I);h&&(W.value=h(W.value));let{done:Z}=W;!P&&f!==null&&(Z=this.playbackSpeed>=0?this.currentTime>=d:this.currentTime<=0);const X=this.holdTime===null&&(this.state==="finished"||this.state==="running"&&Z);return X&&T!==Ju&&(W.value=Uh(b,this.options,D,this.speed)),O&&O(W.value),X&&this.finish(),W}then(s,o){return this.finished.then(s,o)}get duration(){return sn(this.calculatedDuration)}get iterationDuration(){const{delay:s=0}=this.options||{};return this.duration+sn(s)}get time(){return sn(this.currentTime)}set time(s){s=kn(s),this.currentTime=s,this.startTime===null||this.holdTime!==null||this.playbackSpeed===0?this.holdTime=s:this.driver&&(this.startTime=this.driver.now()-s/this.playbackSpeed),this.driver?.start(!1)}get speed(){return this.playbackSpeed}set speed(s){this.updateTime(jt.now());const o=this.playbackSpeed!==s;this.playbackSpeed=s,o&&(this.time=sn(this.currentTime))}play(){if(this.isStopped)return;const{driver:s=bN,startTime:o}=this.options;this.driver||(this.driver=s(d=>this.tick(d))),this.options.onPlay?.();const l=this.driver.now();this.state==="finished"?(this.updateFinished(),this.startTime=l):this.holdTime!==null?this.startTime=l-this.holdTime:this.startTime||(this.startTime=o??l),this.state==="finished"&&this.speed<0&&(this.startTime+=this.calculatedDuration),this.holdTime=null,this.state="running",this.driver.start()}pause(){this.state="paused",this.updateTime(jt.now()),this.holdTime=this.currentTime}complete(){this.state!=="running"&&this.play(),this.state="finished",this.holdTime=null}finish(){this.notifyFinished(),this.teardown(),this.state="finished",this.options.onComplete?.()}cancel(){this.holdTime=null,this.startTime=0,this.tick(0),this.teardown(),this.options.onCancel?.()}teardown(){this.state="idle",this.stopDriver(),this.startTime=this.holdTime=null}stopDriver(){this.driver&&(this.driver.stop(),this.driver=void 0)}sample(s){return this.startTime=0,this.tick(s,!0)}attachTimeline(s){return this.options.allowFlatten&&(this.options.type="keyframes",this.options.ease="linear",this.initAnimation()),this.driver?.stop(),s.observe(this)}}function zN(n){for(let s=1;s<n.length;s++)n[s]??(n[s]=n[s-1])}const Wa=n=>n*180/Math.PI,$u=n=>{const s=Wa(Math.atan2(n[1],n[0]));return Qu(s)},RN={x:4,y:5,translateX:4,translateY:5,scaleX:0,scaleY:3,scale:n=>(Math.abs(n[0])+Math.abs(n[3]))/2,rotate:$u,rotateZ:$u,skewX:n=>Wa(Math.atan(n[1])),skewY:n=>Wa(Math.atan(n[2])),skew:n=>(Math.abs(n[1])+Math.abs(n[2]))/2},Qu=n=>(n=n%360,n<0&&(n+=360),n),zy=$u,Ry=n=>Math.sqrt(n[0]*n[0]+n[1]*n[1]),My=n=>Math.sqrt(n[4]*n[4]+n[5]*n[5]),MN={x:12,y:13,z:14,translateX:12,translateY:13,translateZ:14,scaleX:Ry,scaleY:My,scale:n=>(Ry(n)+My(n))/2,rotateX:n=>Qu(Wa(Math.atan2(n[6],n[5]))),rotateY:n=>Qu(Wa(Math.atan2(-n[2],n[0]))),rotateZ:zy,rotate:zy,skewX:n=>Wa(Math.atan(n[4])),skewY:n=>Wa(Math.atan(n[1])),skew:n=>(Math.abs(n[1])+Math.abs(n[4]))/2};function Zu(n){return n.includes("scale")?1:0}function eh(n,s){if(!n||n==="none")return Zu(s);const o=n.match(/^matrix3d\(([-\d.e\s,]+)\)$/u);let l,d;if(o)l=MN,d=o;else{const p=n.match(/^matrix\(([-\d.e\s,]+)\)$/u);l=RN,d=p}if(!d)return Zu(s);const h=l[s],m=d[1].split(",").map(PN);return typeof h=="function"?h(m):m[h]}const qN=(n,s)=>{const{transform:o="none"}=getComputedStyle(n);return eh(o,s)};function PN(n){return parseFloat(n.trim())}const Ws=["transformPerspective","x","y","z","translateX","translateY","translateZ","scale","scaleX","scaleY","rotate","rotateX","rotateY","rotateZ","skew","skewX","skewY"],Ys=new Set(Ws),qy=n=>n===Fs||n===ne,IN=new Set(["x","y","z"]),UN=Ws.filter(n=>!IN.has(n));function BN(n){const s=[];return UN.forEach(o=>{const l=n.getValue(o);l!==void 0&&(s.push([o,l.get()]),l.set(o.startsWith("scale")?1:0))}),s}const va={width:({x:n},{paddingLeft:s="0",paddingRight:o="0"})=>n.max-n.min-parseFloat(s)-parseFloat(o),height:({y:n},{paddingTop:s="0",paddingBottom:o="0"})=>n.max-n.min-parseFloat(s)-parseFloat(o),top:(n,{top:s})=>parseFloat(s),left:(n,{left:s})=>parseFloat(s),bottom:({y:n},{top:s})=>parseFloat(s)+(n.max-n.min),right:({x:n},{left:s})=>parseFloat(s)+(n.max-n.min),x:(n,{transform:s})=>eh(s,"x"),y:(n,{transform:s})=>eh(s,"y")};va.translateX=va.x;va.translateY=va.y;const Ya=new Set;let th=!1,nh=!1,ah=!1;function Cv(){if(nh){const n=Array.from(Ya).filter(l=>l.needsMeasurement),s=new Set(n.map(l=>l.element)),o=new Map;s.forEach(l=>{const d=BN(l);d.length&&(o.set(l,d),l.render())}),n.forEach(l=>l.measureInitialState()),s.forEach(l=>{l.render();const d=o.get(l);d&&d.forEach(([h,m])=>{l.getValue(h)?.set(m)})}),n.forEach(l=>l.measureEndState()),n.forEach(l=>{l.suspendedScrollY!==void 0&&window.scrollTo(0,l.suspendedScrollY)})}nh=!1,th=!1,Ya.forEach(n=>n.complete(ah)),Ya.clear()}function Ov(){Ya.forEach(n=>{n.readKeyframes(),n.needsMeasurement&&(nh=!0)})}function _N(){ah=!0,Ov(),Cv(),ah=!1}class Vh{constructor(s,o,l,d,h,m=!1){this.state="pending",this.isAsync=!1,this.needsMeasurement=!1,this.unresolvedKeyframes=[...s],this.onComplete=o,this.name=l,this.motionValue=d,this.element=h,this.isAsync=m}scheduleResolve(){this.state="scheduled",this.isAsync?(Ya.add(this),th||(th=!0,Ee.read(Ov),Ee.resolveKeyframes(Cv))):(this.readKeyframes(),this.complete())}readKeyframes(){const{unresolvedKeyframes:s,name:o,element:l,motionValue:d}=this;if(s[0]===null){const h=d?.get(),m=s[s.length-1];if(h!==void 0)s[0]=h;else if(l&&o){const p=l.readValue(o,m);p!=null&&(s[0]=p)}s[0]===void 0&&(s[0]=m),d&&h===void 0&&d.set(s[0])}zN(s)}setFinalKeyframe(){}measureInitialState(){}renderEndStyles(){}measureEndState(){}complete(s=!1){this.state="complete",this.onComplete(this.unresolvedKeyframes,this.finalKeyframe,s),Ya.delete(this)}cancel(){this.state==="scheduled"&&(Ya.delete(this),this.state="pending")}resume(){this.state==="pending"&&this.scheduleResolve()}}const VN=n=>n.startsWith("--");function LN(n,s,o){VN(s)?n.style.setProperty(s,o):n.style[s]=o}const Ev=Sh(()=>window.ScrollTimeline!==void 0),GN={};function HN(n,s){const o=Sh(n);return()=>GN[s]??o()}const Dv=HN(()=>{try{document.createElement("div").animate({opacity:0},{easing:"linear(0, 1)"})}catch{return!1}return!0},"linearEasing"),Qi=([n,s,o,l])=>`cubic-bezier(${n}, ${s}, ${o}, ${l})`,Py={linear:"linear",ease:"ease",easeIn:"ease-in",easeOut:"ease-out",easeInOut:"ease-in-out",circIn:Qi([0,.65,.55,1]),circOut:Qi([.55,0,1,.45]),backIn:Qi([.31,.01,.66,-.59]),backOut:Qi([.33,1.53,.69,.99])};function zv(n,s){if(n)return typeof n=="function"?Dv()?kv(n,s):"ease-out":hv(n)?Qi(n):Array.isArray(n)?n.map(o=>zv(o,s)||Py.easeOut):Py[n]}function KN(n,s,o,{delay:l=0,duration:d=300,repeat:h=0,repeatType:m="loop",ease:p="easeOut",times:f}={},g=void 0){const b={[s]:o};f&&(b.offset=f);const x=zv(p,d);Array.isArray(x)&&(b.easing=x);const w={delay:l,duration:d,easing:Array.isArray(x)?"linear":x,fill:"both",iterations:h+1,direction:m==="reverse"?"alternate":"normal"};return g&&(w.pseudoElement=g),n.animate(b,w)}function Lh(n){return typeof n=="function"&&"applyToOptions"in n}function FN({type:n,...s}){return Lh(n)&&Dv()?n.applyToOptions(s):(s.duration??(s.duration=300),s.ease??(s.ease="easeOut"),s)}class WN extends Bh{constructor(s){if(super(),this.finishedTime=null,this.isStopped=!1,this.manualStartTime=null,!s)return;const{element:o,name:l,keyframes:d,pseudoElement:h,allowFlatten:m=!1,finalKeyframe:p,onComplete:f}=s;this.isPseudoElement=!!h,this.allowFlatten=m,this.options=s,oo(typeof s.type!="string");const g=FN(s);this.animation=KN(o,l,d,g,h),g.autoplay===!1&&this.animation.pause(),this.animation.onfinish=()=>{if(this.finishedTime=this.time,!h){const b=Uh(d,this.options,p,this.speed);this.updateMotionValue?this.updateMotionValue(b):LN(o,l,b),this.animation.cancel()}f?.(),this.notifyFinished()}}play(){this.isStopped||(this.manualStartTime=null,this.animation.play(),this.state==="finished"&&this.updateFinished())}pause(){this.animation.pause()}complete(){this.animation.finish?.()}cancel(){try{this.animation.cancel()}catch{}}stop(){if(this.isStopped)return;this.isStopped=!0;const{state:s}=this;s==="idle"||s==="finished"||(this.updateMotionValue?this.updateMotionValue():this.commitStyles(),this.isPseudoElement||this.cancel())}commitStyles(){this.isPseudoElement||this.animation.commitStyles?.()}get duration(){const s=this.animation.effect?.getComputedTiming?.().duration||0;return sn(Number(s))}get iterationDuration(){const{delay:s=0}=this.options||{};return this.duration+sn(s)}get time(){return sn(Number(this.animation.currentTime)||0)}set time(s){this.manualStartTime=null,this.finishedTime=null,this.animation.currentTime=kn(s)}get speed(){return this.animation.playbackRate}set speed(s){s<0&&(this.finishedTime=null),this.animation.playbackRate=s}get state(){return this.finishedTime!==null?"finished":this.animation.playState}get startTime(){return this.manualStartTime??Number(this.animation.startTime)}set startTime(s){this.manualStartTime=this.animation.startTime=s}attachTimeline({timeline:s,observe:o}){return this.allowFlatten&&this.animation.effect?.updateTiming({easing:"linear"}),this.animation.onfinish=null,s&&Ev()?(this.animation.timeline=s,Dt):o(this)}}const Rv={anticipate:ov,backInOut:iv,circInOut:lv};function YN(n){return n in Rv}function XN(n){typeof n.ease=="string"&&YN(n.ease)&&(n.ease=Rv[n.ease])}const gu=10;class JN extends WN{constructor(s){XN(s),Av(s),super(s),s.startTime!==void 0&&(this.startTime=s.startTime),this.options=s}updateMotionValue(s){const{motionValue:o,onUpdate:l,onComplete:d,element:h,...m}=this.options;if(!o)return;if(s!==void 0){o.set(s);return}const p=new _h({...m,autoplay:!1}),f=Math.max(gu,jt.now()-this.startTime),g=mn(0,gu,f-gu);o.setWithVelocity(p.sample(Math.max(0,f-g)).value,p.sample(f).value,g),p.stop()}}const Iy=(n,s)=>s==="zIndex"?!1:!!(typeof n=="number"||Array.isArray(n)||typeof n=="string"&&(ja.test(n)||n==="0")&&!n.startsWith("url("));function $N(n){const s=n[0];if(n.length===1)return!0;for(let o=0;o<n.length;o++)if(n[o]!==s)return!0}function QN(n,s,o,l){const d=n[0];if(d===null)return!1;if(s==="display"||s==="visibility")return!0;const h=n[n.length-1],m=Iy(d,s),p=Iy(h,s);return!m||!p?!1:$N(n)||(o==="spring"||Lh(o))&&l}function sh(n){n.duration=0,n.type="keyframes"}const ZN=new Set(["opacity","clipPath","filter","transform"]),eT=Sh(()=>Object.hasOwnProperty.call(Element.prototype,"animate"));function tT(n){const{motionValue:s,name:o,repeatDelay:l,repeatType:d,damping:h,type:m}=n;if(!(s?.owner?.current instanceof HTMLElement))return!1;const{onUpdate:f,transformTemplate:g}=s.owner.getProps();return eT()&&o&&ZN.has(o)&&(o!=="transform"||!g)&&!f&&!l&&d!=="mirror"&&h!==0&&m!=="inertia"}const nT=40;class aT extends Bh{constructor({autoplay:s=!0,delay:o=0,type:l="keyframes",repeat:d=0,repeatDelay:h=0,repeatType:m="loop",keyframes:p,name:f,motionValue:g,element:b,...x}){super(),this.stop=()=>{this._animation&&(this._animation.stop(),this.stopTimeline?.()),this.keyframeResolver?.cancel()},this.createdAt=jt.now();const w={autoplay:s,delay:o,type:l,repeat:d,repeatDelay:h,repeatType:m,name:f,motionValue:g,element:b,...x},S=b?.KeyframeResolver||Vh;this.keyframeResolver=new S(p,(T,O,D)=>this.onKeyframesResolved(T,O,w,!D),f,g,b),this.keyframeResolver?.scheduleResolve()}onKeyframesResolved(s,o,l,d){this.keyframeResolver=void 0;const{name:h,type:m,velocity:p,delay:f,isHandoff:g,onUpdate:b}=l;this.resolvedAt=jt.now(),QN(s,h,m,p)||((Kn.instantAnimations||!f)&&b?.(Uh(s,l,o)),s[0]=s[s.length-1],sh(l),l.repeat=0);const w={startTime:d?this.resolvedAt?this.resolvedAt-this.createdAt>nT?this.resolvedAt:this.createdAt:this.createdAt:void 0,finalKeyframe:o,...l,keyframes:s},S=!g&&tT(w),T=w.motionValue?.owner?.current,O=S?new JN({...w,element:T}):new _h(w);O.finished.then(()=>{this.notifyFinished()}).catch(Dt),this.pendingTimeline&&(this.stopTimeline=O.attachTimeline(this.pendingTimeline),this.pendingTimeline=void 0),this._animation=O}get finished(){return this._animation?this.animation.finished:this._finished}then(s,o){return this.finished.finally(s).then(()=>{})}get animation(){return this._animation||(this.keyframeResolver?.resume(),_N()),this._animation}get duration(){return this.animation.duration}get iterationDuration(){return this.animation.iterationDuration}get time(){return this.animation.time}set time(s){this.animation.time=s}get speed(){return this.animation.speed}get state(){return this.animation.state}set speed(s){this.animation.speed=s}get startTime(){return this.animation.startTime}attachTimeline(s){return this._animation?this.stopTimeline=this.animation.attachTimeline(s):this.pendingTimeline=s,()=>this.stop()}play(){this.animation.play()}pause(){this.animation.pause()}complete(){this.animation.complete()}cancel(){this._animation&&this.animation.cancel(),this.keyframeResolver?.cancel()}}class sT{constructor(s){this.stop=()=>
vendor: 9,352 bytes, line 11
11this.runAll("stop"),this.animations=s.filter(Boolean)}get finished(){return Promise.all(this.animations.map(s=>s.finished))}getAll(s){return this.animations[0][s]}setAll(s,o){for(let l=0;l<this.animations.length;l++)this.animations[l][s]=o}attachTimeline(s){const o=this.animations.map(l=>l.attachTimeline(s));return()=>{o.forEach((l,d)=>{l&&l(),this.animations[d].stop()})}}get time(){return this.getAll("time")}set time(s){this.setAll("time",s)}get speed(){return this.getAll("speed")}set speed(s){this.setAll("speed",s)}get state(){return this.getAll("state")}get startTime(){return this.getAll("startTime")}get duration(){return Uy(this.animations,"duration")}get iterationDuration(){return Uy(this.animations,"iterationDuration")}runAll(s){this.animations.forEach(o=>o[s]())}play(){this.runAll("play")}pause(){this.runAll("pause")}cancel(){this.runAll("cancel")}complete(){this.runAll("complete")}}function Uy(n,s){let o=0;for(let l=0;l<n.length;l++){const d=n[l][s];d!==null&&d>o&&(o=d)}return o}class iT extends sT{then(s,o){return this.finished.finally(s).then(()=>{})}}function Mv(n,s,o,l=0,d=1){const h=Array.from(n).sort((g,b)=>g.sortNodePosition(b)).indexOf(s),m=n.size,p=(m-1)*l;return typeof o=="function"?o(h,m):d===1?h*l:p-h*l}const oT=/^var\(--(?:([\w-]+)|([\w-]+), ?([a-zA-Z\d ()%#.,-]+))\)/u;function rT(n){const s=oT.exec(n);if(!s)return[,];const[,o,l,d]=s;return[`--${o??l}`,d]}function qv(n,s,o=1){const[l,d]=rT(n);if(!l)return;const h=window.getComputedStyle(s).getPropertyValue(l);if(h){const m=h.trim();return Qx(m)?parseFloat(m):m}return Dh(d)?qv(d,s,o+1):d}const lT={type:"spring",stiffness:500,damping:25,restSpeed:10},cT=n=>({type:"spring",stiffness:550,damping:n===0?2*Math.sqrt(550):30,restSpeed:10}),dT={type:"keyframes",duration:.8},uT={type:"keyframes",ease:[.25,.1,.35,1],duration:.3},hT=(n,{keyframes:s})=>s.length>2?dT:Ys.has(n)?n.startsWith("scale")?cT(s[1]):lT:uT,mT=n=>n!==null;function pT(n,{repeat:s,repeatType:o="loop"},l){const d=n.filter(mT),h=s&&o!=="loop"&&s%2===1?0:d.length-1;return d[h]}function Gh(n,s){return n?.[s]??n?.default??n}function fT({when:n,delay:s,delayChildren:o,staggerChildren:l,staggerDirection:d,repeat:h,repeatType:m,repeatDelay:p,from:f,elapsed:g,...b}){return!!Object.keys(b).length}const Hh=(n,s,o,l={},d,h)=>m=>{const p=Gh(l,n)||{},f=p.delay||l.delay||0;let{elapsed:g=0}=l;g=g-kn(f);const b={keyframes:Array.isArray(o)?o:[null,o],ease:"easeOut",velocity:s.getVelocity(),...p,delay:-g,onUpdate:w=>{s.set(w),p.onUpdate&&p.onUpdate(w)},onComplete:()=>{m(),p.onComplete&&p.onComplete()},name:n,motionValue:s,element:h?void 0:d};fT(p)||Object.assign(b,hT(n,b)),b.duration&&(b.duration=kn(b.duration)),b.repeatDelay&&(b.repeatDelay=kn(b.repeatDelay)),b.from!==void 0&&(b.keyframes[0]=b.from);let x=!1;if((b.type===!1||b.duration===0&&!b.repeatDelay)&&(sh(b),b.delay===0&&(x=!0)),(Kn.instantAnimations||Kn.skipAnimations)&&(x=!0,sh(b),b.delay=0),b.allowFlatten=!p.type&&!p.ease,x&&!h&&s.get()!==void 0){const w=pT(b.keyframes,p);if(w!==void 0){Ee.update(()=>{b.onUpdate(w),b.onComplete()});return}}return p.isSync?new _h(b):new aT(b)};function By(n){const s=[{},{}];return n?.values.forEach((o,l)=>{s[0][l]=o.get(),s[1][l]=o.getVelocity()}),s}function Kh(n,s,o,l){if(typeof s=="function"){const[d,h]=By(l);s=s(o!==void 0?o:n.custom,d,h)}if(typeof s=="string"&&(s=n.variants&&n.variants[s]),typeof s=="function"){const[d,h]=By(l);s=s(o!==void 0?o:n.custom,d,h)}return s}function Ls(n,s,o){const l=n.getProps();return Kh(l,s,o!==void 0?o:l.custom,n)}const Pv=new Set(["width","height","top","left","right","bottom",...Ws]),_y=30,gT=n=>!isNaN(parseFloat(n)),no={current:void 0};class yT{constructor(s,o={}){this.canTrackVelocity=null,this.events={},this.updateAndNotify=l=>{const d=jt.now();if(this.updatedAt!==d&&this.setPrevFrameValue(),this.prev=this.current,this.setCurrent(l),this.current!==this.prev&&(this.events.change?.notify(this.current),this.dependents))for(const h of this.dependents)h.dirty()},this.hasAnimated=!1,this.setCurrent(s),this.owner=o.owner}setCurrent(s){this.current=s,this.updatedAt=jt.now(),this.canTrackVelocity===null&&s!==void 0&&(this.canTrackVelocity=gT(this.current))}setPrevFrameValue(s=this.current){this.prevFrameValue=s,this.prevUpdatedAt=this.updatedAt}onChange(s){return this.on("change",s)}on(s,o){this.events[s]||(this.events[s]=new Ah);const l=this.events[s].add(o);return s==="change"?()=>{l(),Ee.read(()=>{this.events.change.getSize()||this.stop()})}:l}clearListeners(){for(const s in this.events)this.events[s].clear()}attach(s,o){this.passiveEffect=s,this.stopPassiveEffect=o}set(s){this.passiveEffect?this.passiveEffect(s,this.updateAndNotify):this.updateAndNotify(s)}setWithVelocity(s,o,l){this.set(o),this.prev=void 0,this.prevFrameValue=s,this.prevUpdatedAt=this.updatedAt-l}jump(s,o=!0){this.updateAndNotify(s),this.prev=s,this.prevUpdatedAt=this.prevFrameValue=void 0,o&&this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}dirty(){this.events.change?.notify(this.current)}addDependent(s){this.dependents||(this.dependents=new Set),this.dependents.add(s)}removeDependent(s){this.dependents&&this.dependents.delete(s)}get(){return no.current&&no.current.push(this),this.current}getPrevious(){return this.prev}getVelocity(){const s=jt.now();if(!this.canTrackVelocity||this.prevFrameValue===void 0||s-this.updatedAt>_y)return 0;const o=Math.min(this.updatedAt-this.prevUpdatedAt,_y);return Ch(parseFloat(this.current)-parseFloat(this.prevFrameValue),o)}start(s){return this.stop(),new Promise(o=>{this.hasAnimated=!0,this.animation=s(o),this.events.animationStart&&this.events.animationStart.notify()}).then(()=>{this.events.animationComplete&&this.events.animationComplete.notify(),this.clearAnimation()})}stop(){this.animation&&(this.animation.stop(),this.events.animationCancel&&this.events.animationCancel.notify()),this.clearAnimation()}isAnimating(){return!!this.animation}clearAnimation(){delete this.animation}destroy(){this.dependents?.clear(),this.events.destroy?.notify(),this.clearListeners(),this.stop(),this.stopPassiveEffect&&this.stopPassiveEffect()}}function hn(n,s){return new yT(n,s)}const ih=n=>Array.isArray(n);function bT(n,s,o){n.hasValue(s)?n.getValue(s).set(o):n.addValue(s,hn(o))}function xT(n){return ih(n)?n[n.length-1]||0:n}function vT(n,s){const o=Ls(n,s);let{transitionEnd:l={},transition:d={},...h}=o||{};h={...h,...l};for(const m in h){const p=xT(h[m]);bT(n,m,p)}}const dt=n=>!!(n&&n.getVelocity);function wT(n){return!!(dt(n)&&n.add)}function oh(n,s){const o=n.getValue("willChange");if(wT(o))return o.add(s);if(!o&&Kn.WillChange){const l=new Kn.WillChange("auto");n.addValue("willChange",l),l.add(s)}}function Fh(n){return n.replace(/([A-Z])/g,s=>`-${s.toLowerCase()}`)}const jT="framerAppearId",Iv="data-"+Fh(jT);function Uv(n){return n.props[Iv]}function kT({protectedKeys:n,needsAnimating:s},o){const l=n.hasOwnProperty(o)&&s[o]!==!0;return s[o]=!1,l}function Wh(n,s,{delay:o=0,transitionOverride:l,type:d}={}){let{transition:h=n.getDefaultTransition(),transitionEnd:m,...p}=s;l&&(h=l);const f=[],g=d&&n.animationState&&n.animationState.getState()[d];for(const b in p){const x=n.getValue(b,n.latestValues[b]??null),w=p[b];if(w===void 0||g&&kT(g,b))continue;const S={delay:o,...Gh(h||{},b)},T=x.get();if(T!==void 0&&!x.isAnimating&&!Array.isArray(w)&&w===T&&!S.velocity)continue;let O=!1;if(window.MotionHandoffAnimation){const E=Uv(n);if(E){const P=window.MotionHandoffAnimation(E,b,Ee);P!==null&&(S.startTime=P,O=!0)}}oh(n,b),x.start(Hh(b,x,w,n.shouldReduceMotion&&Pv.has(b)?{type:!1}:S,n,O));const D=x.animation;D&&f.push(D)}return m&&Promise.all(f).then(()=>{Ee.update(()=>{m&&vT(n,m)})}),f}function rh(n,s,o={}){const l=Ls(n,s,o.type==="exit"?n.presenceContext?.custom:void 0);let{transition:d=n.getDefaultTransition()||{}}=l||{};o.transitionOverride&&(d=o.transitionOverride);const h=l?()=>Promise.all(Wh(n,l,o)):()=>Promise.resolve(),m=n.variantChildren&&n.variantChildren.size?(f=0)=>{const{delayChildren:g=0,staggerChildren:b,staggerDirection:x}=d;return NT(n,s,f,g,b,x,o)}:()=>Promise.resolve(),{when:p}=d;if(p){const[f,g]=p==="beforeChildren"?[h,m]:[m,h];return f().then(()=>g())}else return Promise.all([h(),m(o.delay)])}function NT(n,s,o=0,l=0,d=0,h=1,m){const p=[];for(const f of n.variantChildren)f.notify("AnimationStart",s),p.push(rh(f,s,{...m,delay:o+(typeof l=="function"?0:l)+Mv(n.variantChildren,f,l,d,h)}).then(()=>f.notify("AnimationComplete",s)));return Promise.all(p)}function TT(n,s,o={}){n.notify("AnimationStart",s);let l;if(Array.isArray(s)){const d=s.map(h=>rh(n,h,o));l=Promise.all(d)}else if(typeof s=="string")l=rh(n,s,o);else{const d=typeof s=="function"?Ls(n,s,o.custom):s;l=Promise.all(Wh(n,d,o))}return l.then(()=>{n.notify("AnimationComplete",s)})}const ST={test:n=>n==="auto",parse:n=>n},Bv=n=>s=>s.test(n),_v=[Fs,ne,Nn,xa,nN,tN,ST],Vy=n=>_v.find(Bv(n));function AT(n){return typeof n=="number"?n===0:n!==null?n==="none"||n==="0"||ev(n):!0}const CT=new Set(["brightness","contrast","saturate","opacity"]);function OT(n){const[s,o]=n.slice(0,-1).split("(");if(s==="drop-shadow")return n;const[l]=o.match(zh)||[];if(!l)return n;const d=o.replace(l,"");let h=CT.has(s)?1:0;return l!==o&&(h*=100),s+"("+h+d+")"}const ET=/\b([a-z-]*)\(.*?\)/gu,lh={...ja,getAnimatableNone:n=>{const s=n.match(ET);return s?s.map(OT).join(" "):n}},Ly={...Fs,transform:Math.round}
vendor: 3,157 bytes, line 11
11,DT={rotate:xa,rotateX:xa,rotateY:xa,rotateZ:xa,scale:Gr,scaleX:Gr,scaleY:Gr,scaleZ:Gr,skew:xa,skewX:xa,skewY:xa,distance:ne,translateX:ne,translateY:ne,translateZ:ne,x:ne,y:ne,z:ne,perspective:ne,transformPerspective:ne,opacity:ro,originX:Ay,originY:Ay,originZ:ne},Yh={borderWidth:ne,borderTopWidth:ne,borderRightWidth:ne,borderBottomWidth:ne,borderLeftWidth:ne,borderRadius:ne,radius:ne,borderTopLeftRadius:ne,borderTopRightRadius:ne,borderBottomRightRadius:ne,borderBottomLeftRadius:ne,width:ne,maxWidth:ne,height:ne,maxHeight:ne,top:ne,right:ne,bottom:ne,left:ne,inset:ne,insetBlock:ne,insetBlockStart:ne,insetBlockEnd:ne,insetInline:ne,insetInlineStart:ne,insetInlineEnd:ne,padding:ne,paddingTop:ne,paddingRight:ne,paddingBottom:ne,paddingLeft:ne,paddingBlock:ne,paddingBlockStart:ne,paddingBlockEnd:ne,paddingInline:ne,paddingInlineStart:ne,paddingInlineEnd:ne,margin:ne,marginTop:ne,marginRight:ne,marginBottom:ne,marginLeft:ne,marginBlock:ne,marginBlockStart:ne,marginBlockEnd:ne,marginInline:ne,marginInlineStart:ne,marginInlineEnd:ne,backgroundPositionX:ne,backgroundPositionY:ne,...DT,zIndex:Ly,fillOpacity:ro,strokeOpacity:ro,numOctaves:Ly},zT={...Yh,color:it,backgroundColor:it,outlineColor:it,fill:it,stroke:it,borderColor:it,borderTopColor:it,borderRightColor:it,borderBottomColor:it,borderLeftColor:it,filter:lh,WebkitFilter:lh},Vv=n=>zT[n];function Lv(n,s){let o=Vv(n);return o!==lh&&(o=ja),o.getAnimatableNone?o.getAnimatableNone(s):void 0}const RT=new Set(["auto","none","0"]);function MT(n,s,o){let l=0,d;for(;l<n.length&&!d;){const h=n[l];typeof h=="string"&&!RT.has(h)&&lo(h).values.length&&(d=n[l]),l++}if(d&&o)for(const h of s)n[h]=Lv(o,d)}class qT extends Vh{constructor(s,o,l,d,h){super(s,o,l,d,h,!0)}readKeyframes(){const{unresolvedKeyframes:s,element:o,name:l}=this;if(!o||!o.current)return;super.readKeyframes();for(let b=0;b<s.length;b++){let x=s[b];if(typeof x=="string"&&(x=x.trim(),Dh(x))){const w=qv(x,o.current);w!==void 0&&(s[b]=w),b===s.length-1&&(this.finalKeyframe=x)}}if(this.resolveNoneKeyframes(),!Pv.has(l)||s.length!==2)return;const[d,h]=s,m=Vy(d),p=Vy(h),f=Sy(d),g=Sy(h);if(f!==g&&va[l]){this.needsMeasurement=!0;return}if(m!==p)if(qy(m)&&qy(p))for(let b=0;b<s.length;b++){const x=s[b];typeof x=="string"&&(s[b]=parseFloat(x))}else va[l]&&(this.needsMeasurement=!0)}resolveNoneKeyframes(){const{unresolvedKeyframes:s,name:o}=this,l=[];for(let d=0;d<s.length;d++)(s[d]===null||AT(s[d]))&&l.push(d);l.length&&MT(s,l,o)}measureInitialState(){const{element:s,unresolvedKeyframes:o,name:l}=this;if(!s||!s.current)return;l==="height"&&(this.suspendedScrollY=window.pageYOffset),this.measuredOrigin=va[l](s.measureViewportBox(),window.getComputedStyle(s.current)),o[0]=this.measuredOrigin;const d=o[o.length-1];d!==void 0&&s.getValue(l,d).jump(d,!1)}measureEndState(){const{element:s,name:o,unresolvedKeyframes:l}=this;if(!s||!s.current)return;const d=s.getValue(o);d&&d.jump(this.measuredOrigin,!1);const h=l.length-1,m=l[h];l[h]=va[o](s.measureViewportBox(),window.getComputedStyle(s.current)),m!==null&&this.finalKeyframe===void 0&&(this.finalKeyframe=m),this.removedTransforms?.length&&this.removedTransforms.forEac
vendor: 6,033 bytes, line 11
11h(([p,f])=>{s.getValue(p).set(f)}),this.resolveNoneKeyframes()}}function zl(n,s,o){if(n==null)return[];if(n instanceof EventTarget)return[n];if(typeof n=="string"){let l=document;const d=o?.[n]??l.querySelectorAll(n);return d?Array.from(d):[]}return Array.from(n).filter(l=>l!=null)}const Gv=(n,s)=>s&&typeof n=="number"?s.transform(n):n;function bl(n){return Zx(n)&&"offsetHeight"in n}const{schedule:Xh}=mv(queueMicrotask,!1),un={x:!1,y:!1};function Hv(){return un.x||un.y}function PT(n){return n==="x"||n==="y"?un[n]?null:(un[n]=!0,()=>{un[n]=!1}):un.x||un.y?null:(un.x=un.y=!0,()=>{un.x=un.y=!1})}function Kv(n,s){const o=zl(n),l=new AbortController,d={passive:!0,...s,signal:l.signal};return[o,d,()=>l.abort()]}function Gy(n){return!(n.pointerType==="touch"||Hv())}function IT(n,s,o={}){const[l,d,h]=Kv(n,o),m=p=>{if(!Gy(p))return;const{target:f}=p,g=s(f,p);if(typeof g!="function"||!f)return;const b=x=>{Gy(x)&&(g(x),f.removeEventListener("pointerleave",b))};f.addEventListener("pointerleave",b,d)};return l.forEach(p=>{p.addEventListener("pointerenter",m,d)}),h}const Fv=(n,s)=>s?n===s?!0:Fv(n,s.parentElement):!1,Jh=n=>n.pointerType==="mouse"?typeof n.button!="number"||n.button<=0:n.isPrimary!==!1,UT=new Set(["BUTTON","INPUT","SELECT","TEXTAREA","A"]);function Wv(n){return UT.has(n.tagName)||n.isContentEditable===!0}const rl=new WeakSet;function Hy(n){return s=>{s.key==="Enter"&&n(s)}}function yu(n,s){n.dispatchEvent(new PointerEvent("pointer"+s,{isPrimary:!0,bubbles:!0}))}const BT=(n,s)=>{const o=n.currentTarget;if(!o)return;const l=Hy(()=>{if(rl.has(o))return;yu(o,"down");const d=Hy(()=>{yu(o,"up")}),h=()=>yu(o,"cancel");o.addEventListener("keyup",d,s),o.addEventListener("blur",h,s)});o.addEventListener("keydown",l,s),o.addEventListener("blur",()=>o.removeEventListener("keydown",l),s)};function Ky(n){return Jh(n)&&!Hv()}function _T(n,s,o={}){const[l,d,h]=Kv(n,o),m=p=>{const f=p.currentTarget;if(!Ky(p))return;rl.add(f);const g=s(f,p),b=(S,T)=>{window.removeEventListener("pointerup",x),window.removeEventListener("pointercancel",w),rl.has(f)&&rl.delete(f),Ky(S)&&typeof g=="function"&&g(S,{success:T})},x=S=>{b(S,f===window||f===document||o.useGlobalTarget||Fv(f,S.target))},w=S=>{b(S,!1)};window.addEventListener("pointerup",x,d),window.addEventListener("pointercancel",w,d)};return l.forEach(p=>{(o.useGlobalTarget?window:p).addEventListener("pointerdown",m,d),bl(p)&&(p.addEventListener("focus",g=>BT(g,d)),!Wv(p)&&!p.hasAttribute("tabindex")&&(p.tabIndex=0))}),h}function Rl(n){return Zx(n)&&"ownerSVGElement"in n}const ll=new WeakMap;let cl;const Yv=(n,s,o)=>(l,d)=>d&&d[0]?d[0][n+"Size"]:Rl(l)&&"getBBox"in l?l.getBBox()[s]:l[o],VT=Yv("inline","width","offsetWidth"),LT=Yv("block","height","offsetHeight");function GT({target:n,borderBoxSize:s}){ll.get(n)?.forEach(o=>{o(n,{get width(){return VT(n,s)},get height(){return LT(n,s)}})})}function HT(n){n.forEach(GT)}function KT(){typeof ResizeObserver>"u"||(cl=new ResizeObserver(HT))}function FT(n,s){cl||KT();const o=zl(n);return o.forEach(l=>{let d=ll.get(l);d||(d=new Set,ll.set(l,d)),d.add(s),cl?.observe(l)}),()=>{o.forEach(l=>{const d=ll.get(l);d?.delete(s),d?.size||cl?.unobserve(l)})}}const dl=new Set;let Is;function WT(){Is=()=>{const n={get width(){return window.innerWidth},get height(){return window.innerHeight}};dl.forEach(s=>s(n))},window.addEventListener("resize",Is)}function YT(n){return dl.add(n),Is||WT(),()=>{dl.delete(n),!dl.size&&typeof Is=="function"&&(window.removeEventListener("resize",Is),Is=void 0)}}function XT(n,s){return typeof n=="function"?YT(n):FT(n,s)}function Xv(n,s){let o;const l=()=>{const{currentTime:d}=s,m=(d===null?0:d.value)/100;o!==m&&n(m),o=m};return Ee.preUpdate(l,!0),()=>pn(l)}function Jv(n){return Rl(n)&&n.tagName==="svg"}function JT(...n){const s=!Array.isArray(n[0]),o=s?0:-1,l=n[0+o],d=n[1+o],h=n[2+o],m=n[3+o],p=Ph(d,h,m);return s?p(l):p}const $T=[..._v,it,ja],QT=n=>$T.find(Bv(n)),Fy=()=>({translate:0,scale:1,origin:0,originPoint:0}),Us=()=>({x:Fy(),y:Fy()}),Wy=()=>({min:0,max:0}),st=()=>({x:Wy(),y:Wy()}),xl={current:null},$h={current:!1},ZT=typeof window<"u";function $v(){if($h.current=!0,!!ZT)if(window.matchMedia){const n=window.matchMedia("(prefers-reduced-motion)"),s=()=>xl.current=n.matches;n.addEventListener("change",s),s()}else xl.current=!1}const uo=new WeakMap;function Ml(n){return n!==null&&typeof n=="object"&&typeof n.start=="function"}function ho(n){return typeof n=="string"||Array.isArray(n)}const Qh=["animate","whileInView","whileFocus","whileHover","whileTap","whileDrag","exit"],Zh=["initial",...Qh];function ql(n){return Ml(n.animate)||Zh.some(s=>ho(n[s]))}function Qv(n){return!!(ql(n)||n.variants)}function eS(n,s,o){for(const l in s){const d=s[l],h=o[l];if(dt(d))n.addValue(l,d);else if(dt(h))n.addValue(l,hn(d,{owner:n}));else if(h!==d)if(n.hasValue(l)){const m=n.getValue(l);m.liveStyle===!0?m.jump(d):m.hasAnimated||m.set(d)}else{const m=n.getStaticValue(l);n.addValue(l,hn(m!==void 0?m:d,{owner:n}))}}for(const l in o)s[l]===void 0&&n.removeValue(l);return s}const Yy=["AnimationStart","AnimationComplete","Update","BeforeLayoutMeasure","LayoutMeasure","LayoutAnimationStart","LayoutAnimationComplete"];let vl={};function Zv(n){vl=n}function tS(){return vl}class ew{scrapeMotionValuesFromProps(s,o,l){return{}}constructor({parent:s,props:o,presenceContext:l,reducedMotionConfig:d,blockInitialAnimation:h,visualState:m},p={}){this.current=null,this.children=new Set,this.isVariantNode=!1,this.isControllingVariants=!1,this.shouldReduceMotion=null,this.values=new Map,this.KeyframeResolver=Vh,this.features={},this.valueSubscriptions=new Map,this.prevMotionValues={},this.events={},this.propEventSubscriptions={},this.notifyUpdate=()=>this.notify("Update",this.latestValues),this.render=()=>{this.current&&(this.triggerBuild(),this.renderInstance(this.current,this.renderState,this.props.style,this.projection))},this.renderScheduledAt=0,this.scheduleRender=()=>{const w=jt.now();this.renderScheduledAt<w&&(this.renderScheduledAt=w,Ee.render(this.render,!1,!0))};
vendor: 9,949 bytes, line 11
11const{latestValues:f,renderState:g}=m;this.latestValues=f,this.baseTarget={...f},this.initialValues=o.initial?{...f}:{},this.renderState=g,this.parent=s,this.props=o,this.presenceContext=l,this.depth=s?s.depth+1:0,this.reducedMotionConfig=d,this.options=p,this.blockInitialAnimation=!!h,this.isControllingVariants=ql(o),this.isVariantNode=Qv(o),this.isVariantNode&&(this.variantChildren=new Set),this.manuallyAnimateOnMount=!!(s&&s.current);const{willChange:b,...x}=this.scrapeMotionValuesFromProps(o,{},this);for(const w in x){const S=x[w];f[w]!==void 0&&dt(S)&&S.set(f[w])}}mount(s){this.current=s,uo.set(s,this),this.projection&&!this.projection.instance&&this.projection.mount(s),this.parent&&this.isVariantNode&&!this.isControllingVariants&&(this.removeFromVariantTree=this.parent.addVariantChild(this)),this.values.forEach((o,l)=>this.bindToMotionValue(l,o)),this.reducedMotionConfig==="never"?this.shouldReduceMotion=!1:this.reducedMotionConfig==="always"?this.shouldReduceMotion=!0:($h.current||$v(),this.shouldReduceMotion=xl.current),this.parent?.addChild(this),this.update(this.props,this.presenceContext)}unmount(){this.projection&&this.projection.unmount(),pn(this.notifyUpdate),pn(this.render),this.valueSubscriptions.forEach(s=>s()),this.valueSubscriptions.clear(),this.removeFromVariantTree&&this.removeFromVariantTree(),this.parent?.removeChild(this);for(const s in this.events)this.events[s].clear();for(const s in this.features){const o=this.features[s];o&&(o.unmount(),o.isMounted=!1)}this.current=null}addChild(s){this.children.add(s),this.enteringChildren??(this.enteringChildren=new Set),this.enteringChildren.add(s)}removeChild(s){this.children.delete(s),this.enteringChildren&&this.enteringChildren.delete(s)}bindToMotionValue(s,o){this.valueSubscriptions.has(s)&&this.valueSubscriptions.get(s)();const l=Ys.has(s);l&&this.onBindTransform&&this.onBindTransform();const d=o.on("change",m=>{this.latestValues[s]=m,this.props.onUpdate&&Ee.preRender(this.notifyUpdate),l&&this.projection&&(this.projection.isTransformDirty=!0),this.scheduleRender()});let h;typeof window<"u"&&window.MotionCheckAppearSync&&(h=window.MotionCheckAppearSync(this,s,o)),this.valueSubscriptions.set(s,()=>{d(),h&&h(),o.owner&&o.stop()})}sortNodePosition(s){return!this.current||!this.sortInstanceNodePosition||this.type!==s.type?0:this.sortInstanceNodePosition(this.current,s.current)}updateFeatures(){let s="animation";for(s in vl){const o=vl[s];if(!o)continue;const{isEnabled:l,Feature:d}=o;if(!this.features[s]&&d&&l(this.props)&&(this.features[s]=new d(this)),this.features[s]){const h=this.features[s];h.isMounted?h.update():(h.mount(),h.isMounted=!0)}}}triggerBuild(){this.build(this.renderState,this.latestValues,this.props)}measureViewportBox(){return this.current?this.measureInstanceViewportBox(this.current,this.props):st()}getStaticValue(s){return this.latestValues[s]}setStaticValue(s,o){this.latestValues[s]=o}update(s,o){(s.transformTemplate||this.props.transformTemplate)&&this.scheduleRender(),this.prevProps=this.props,this.props=s,this.prevPresenceContext=this.presenceContext,this.presenceContext=o;for(let l=0;l<Yy.length;l++){const d=Yy[l];this.propEventSubscriptions[d]&&(this.propEventSubscriptions[d](),delete this.propEventSubscriptions[d]);const h="on"+d,m=s[h];m&&(this.propEventSubscriptions[d]=this.on(d,m))}this.prevMotionValues=eS(this,this.scrapeMotionValuesFromProps(s,this.prevProps||{},this),this.prevMotionValues),this.handleChildMotionValue&&this.handleChildMotionValue()}getProps(){return this.props}getVariant(s){return this.props.variants?this.props.variants[s]:void 0}getDefaultTransition(){return this.props.transition}getTransformPagePoint(){return this.props.transformPagePoint}getClosestVariantNode(){return this.isVariantNode?this:this.parent?this.parent.getClosestVariantNode():void 0}addVariantChild(s){const o=this.getClosestVariantNode();if(o)return o.variantChildren&&o.variantChildren.add(s),()=>o.variantChildren.delete(s)}addValue(s,o){const l=this.values.get(s);o!==l&&(l&&this.removeValue(s),this.bindToMotionValue(s,o),this.values.set(s,o),this.latestValues[s]=o.get())}removeValue(s){this.values.delete(s);const o=this.valueSubscriptions.get(s);o&&(o(),this.valueSubscriptions.delete(s)),delete this.latestValues[s],this.removeValueFromRenderState(s,this.renderState)}hasValue(s){return this.values.has(s)}getValue(s,o){if(this.props.values&&this.props.values[s])return this.props.values[s];let l=this.values.get(s);return l===void 0&&o!==void 0&&(l=hn(o===null?void 0:o,{owner:this}),this.addValue(s,l)),l}readValue(s,o){let l=this.latestValues[s]!==void 0||!this.current?this.latestValues[s]:this.getBaseTargetFromProps(this.props,s)??this.readValueFromInstance(this.current,s,this.options);return l!=null&&(typeof l=="string"&&(Qx(l)||ev(l))?l=parseFloat(l):!QT(l)&&ja.test(o)&&(l=Lv(s,o)),this.setBaseTarget(s,dt(l)?l.get():l)),dt(l)?l.get():l}setBaseTarget(s,o){this.baseTarget[s]=o}getBaseTarget(s){const{initial:o}=this.props;let l;if(typeof o=="string"||typeof o=="object"){const h=Kh(this.props,o,this.presenceContext?.custom);h&&(l=h[s])}if(o&&l!==void 0)return l;const d=this.getBaseTargetFromProps(this.props,s);return d!==void 0&&!dt(d)?d:this.initialValues[s]!==void 0&&l===void 0?void 0:this.baseTarget[s]}on(s,o){return this.events[s]||(this.events[s]=new Ah),this.events[s].add(o)}notify(s,...o){this.events[s]&&this.events[s].notify(...o)}scheduleRenderMicrotask(){Xh.render(this.render)}}class tw extends ew{constructor(){super(...arguments),this.KeyframeResolver=qT}sortInstanceNodePosition(s,o){return s.compareDocumentPosition(o)&2?1:-1}getBaseTargetFromProps(s,o){const l=s.style;return l?l[o]:void 0}removeValueFromRenderState(s,{vars:o,style:l}){delete o[s],delete l[s]}handleChildMotionValue(){this.childSubscription&&(this.childSubscription(),delete this.childSubscription);const{children:s}=this.props;dt(s)&&(this.childSubscription=s.on("change",o=>{this.current&&(this.current.textContent=`${o}`)}))}}class Na{constructor(s){this.isMounted=!1,this.node=s}update(){}}function nw({top:n,left:s,right:o,bottom:l}){return{x:{min:s,max:o},y:{min:n,max:l}}}function nS({x:n,y:s}){return{top:s.min,right:n.max,bottom:s.max,left:n.min}}function aS(n,s){if(!s)return n;const o=s({x:n.left,y:n.top}),l=s({x:n.right,y:n.bottom});return{top:o.y,left:o.x,bottom:l.y,right:l.x}}function bu(n){return n===void 0||n===1}function ch({scale:n,scaleX:s,scaleY:o}){return!bu(n)||!bu(s)||!bu(o)}function Ka(n){return ch(n)||aw(n)||n.z||n.rotate||n.rotateX||n.rotateY||n.skewX||n.skewY}function aw(n){return Xy(n.x)||Xy(n.y)}function Xy(n){return n&&n!=="0%"}function wl(n,s,o){const l=n-o,d=s*l;return o+d}function Jy(n,s,o,l,d){return d!==void 0&&(n=wl(n,d,l)),wl(n,o,l)+s}function dh(n,s=0,o=1,l,d){n.min=Jy(n.min,s,o,l,d),n.max=Jy(n.max,s,o,l,d)}function sw(n,{x:s,y:o}){dh(n.x,s.translate,s.scale,s.originPoint),dh(n.y,o.translate,o.scale,o.originPoint)}const $y=.999999999999,Qy=1.0000000000001;function sS(n,s,o,l=!1){const d=o.length;if(!d)return;s.x=s.y=1;let h,m;for(let p=0;p<d;p++){h=o[p],m=h.projectionDelta;const{visualElement:f}=h.options;f&&f.props.style&&f.props.style.display==="contents"||(l&&h.options.layoutScroll&&h.scroll&&h!==h.root&&_s(n,{x:-h.scroll.offset.x,y:-h.scroll.offset.y}),m&&(s.x*=m.x.scale,s.y*=m.y.scale,sw(n,m)),l&&Ka(h.latestValues)&&_s(n,h.latestValues))}s.x<Qy&&s.x>$y&&(s.x=1),s.y<Qy&&s.y>$y&&(s.y=1)}function Bs(n,s){n.min=n.min+s,n.max=n.max+s}function Zy(n,s,o,l,d=.5){const h=He(n.min,n.max,d);dh(n,s,o,h,l)}function _s(n,s){Zy(n.x,s.x,s.scaleX,s.scale,s.originX),Zy(n.y,s.y,s.scaleY,s.scale,s.originY)}function iw(n,s){return nw(aS(n.getBoundingClientRect(),s))}function iS(n,s,o){const l=iw(n,o),{scroll:d}=s;return d&&(Bs(l.x,d.offset.x),Bs(l.y,d.offset.y)),l}const oS={x:"translateX",y:"translateY",z:"translateZ",transformPerspective:"perspective"},rS=Ws.length;function lS(n,s,o){let l="",d=!0;for(let h=0;h<rS;h++){const m=Ws[h],p=n[m];if(p===void 0)continue;let f=!0;if(typeof p=="number")f=p===(m.startsWith("scale")?1:0);else{const g=parseFloat(p);f=m.startsWith("scale")?g===1:g===0}if(!f||o){const g=Gv(p,Yh[m]);if(!f){d=!1;const b=oS[m]||m;l+=`${b}(${g}) `}o&&(s[m]=g)}}return l=l.trim(),o?l=o(s,d?"":l):d&&(l="none"),l}function em(n,s,o){const{style:l,vars:d,transformOrigin:h}=n;let m=!1,p=!1;for(const f in s){const g=s[f];if(Ys.has(f)){m=!0;continue}else if(fv(f)){d[f]=g;continue}else{const b=Gv(g,Yh[f]);f.startsWith("origin")?(p=!0,h[f]=b):l[f]=b}}if(s.transform||(m||o?l.transform=lS(s,n.transform,o):l.transform&&(l.transform="none")),p){const{originX:f="50%",originY:g="50%",originZ:b=0}=h;l.transformOrigin=`${f} ${g} ${b}`}}function ow(n,{style:s,vars:o},l,d){const h=n.style;let m;for(m in s)h[m]=s[m];d?.applyProjectionStyles(h,l);for(m in o)h.setProperty(m,o[m])}function eb(n,s){return s.max===s.min?0:n/(s.max-s.min)*100}const Fi={correct:(n,s)=>{if(!s.target)return n;if(typeof n=="string")if(ne.test(n))n=parseFloat(n);else return n;const o=eb(n,s.target.x),l=eb(n,s.target.y);return`${o}% ${l}%`}},cS={correct:(n,{treeScale:s,projectionDelta:o})=>{const l=n,d=ja.parse(n);if(d.length>5)return l;const h=ja.createTransformer(n),m=typeof d[0]!="number"?1:0,p=o.x.scale*s.x,f=o.y.scale*s.y;d[0+m]/=p,d[1+m]/=f;const g=He(p,f,.5);return typeof d[2+m]=="number"&&(d[2+m]/=g),typeof d[3+m]=="number"&&(d[3+m]/=g),h(d)}},uh={borderRadius:{...Fi,applyTo:["borderTopLeftRadius","borderTopRightRadius","borderBottomLeftRadius","borderBottomRightRadius"]},borderTopLeftRadius:Fi,borderTopRightRadius:Fi,borderBottomLeftRadius:Fi,borderBottomRightRadius:Fi,boxShadow:cS};function rw(n,{layout:s,layoutId:o}){return Ys.has(n)||n.startsWith("origin")||(s||o!==void 0)&&(!!uh[n]||n==="opacity")}function tm(n,s,o){const l=n.style,d=s?.style,h={};if(!l)return h;for(const m in l)(dt(l[m])||d&&dt(d[m])||rw(m,n)||o?.getValue(m)?.liveStyle!==void 0)&&(h[m]=l[m]);return h}function dS(n){return window.getComputedStyle(n)}
vendor: 4,757 bytes, line 11
11class lw extends tw{constructor(){super(...arguments),this.type="html",this.renderInstance=ow}readValueFromInstance(s,o){if(Ys.has(o))return this.projection?.isProjecting?Zu(o):qN(s,o);{const l=dS(s),d=(fv(o)?l.getPropertyValue(o):l[o])||0;return typeof d=="string"?d.trim():d}}measureInstanceViewportBox(s,{transformPagePoint:o}){return iw(s,o)}build(s,o,l){em(s,o,l.transformTemplate)}scrapeMotionValuesFromProps(s,o,l){return tm(s,o,l)}}function uS(n,s){return n in s}class hS extends ew{constructor(){super(...arguments),this.type="object"}readValueFromInstance(s,o){if(uS(o,s)){const l=s[o];if(typeof l=="string"||typeof l=="number")return l}}getBaseTargetFromProps(){}removeValueFromRenderState(s,o){delete o.output[s]}measureInstanceViewportBox(){return st()}build(s,o){Object.assign(s.output,o)}renderInstance(s,{output:o}){Object.assign(s,o)}sortInstanceNodePosition(){return 0}}const mS={offset:"stroke-dashoffset",array:"stroke-dasharray"},pS={offset:"strokeDashoffset",array:"strokeDasharray"};function fS(n,s,o=1,l=0,d=!0){n.pathLength=1;const h=d?mS:pS;n[h.offset]=`${-l}`,n[h.array]=`${s} ${o}`}const gS=["offsetDistance","offsetPath","offsetRotate","offsetAnchor"];function cw(n,{attrX:s,attrY:o,attrScale:l,pathLength:d,pathSpacing:h=1,pathOffset:m=0,...p},f,g,b){if(em(n,p,g),f){n.style.viewBox&&(n.attrs.viewBox=n.style.viewBox);return}n.attrs=n.style,n.style={};const{attrs:x,style:w}=n;x.transform&&(w.transform=x.transform,delete x.transform),(w.transform||x.transformOrigin)&&(w.transformOrigin=x.transformOrigin??"50% 50%",delete x.transformOrigin),w.transform&&(w.transformBox=b?.transformBox??"fill-box",delete x.transformBox);for(const S of gS)x[S]!==void 0&&(w[S]=x[S],delete x[S]);s!==void 0&&(x.x=s),o!==void 0&&(x.y=o),l!==void 0&&(x.scale=l),d!==void 0&&fS(x,d,h,m,!1)}const dw=new Set(["baseFrequency","diffuseConstant","kernelMatrix","kernelUnitLength","keySplines","keyTimes","limitingConeAngle","markerHeight","markerWidth","numOctaves","targetX","targetY","surfaceScale","specularConstant","specularExponent","stdDeviation","tableValues","viewBox","gradientTransform","pathLength","startOffset","textLength","lengthAdjust"]),uw=n=>typeof n=="string"&&n.toLowerCase()==="svg";function yS(n,s,o,l){ow(n,s,void 0,l);for(const d in s.attrs)n.setAttribute(dw.has(d)?d:Fh(d),s.attrs[d])}function hw(n,s,o){const l=tm(n,s,o);for(const d in n)if(dt(n[d])||dt(s[d])){const h=Ws.indexOf(d)!==-1?"attr"+d.charAt(0).toUpperCase()+d.substring(1):d;l[h]=n[d]}return l}class mw extends tw{constructor(){super(...arguments),this.type="svg",this.isSVGTag=!1,this.measureInstanceViewportBox=st}getBaseTargetFromProps(s,o){return s[o]}readValueFromInstance(s,o){if(Ys.has(o)){const l=Vv(o);return l&&l.default||0}return o=dw.has(o)?o:Fh(o),s.getAttribute(o)}scrapeMotionValuesFromProps(s,o,l){return hw(s,o,l)}build(s,o,l){cw(s,o,this.isSVGTag,l.transformTemplate,l.style)}renderInstance(s,o,l,d){yS(s,o,l,d)}mount(s){this.isSVGTag=uw(s.tagName),super.mount(s)}}const bS=Zh.length;function pw(n){if(!n)return;if(!n.isControllingVariants){const o=n.parent?pw(n.parent)||{}:{};return n.props.initial!==void 0&&(o.initial=n.props.initial),o}const s={};for(let o=0;o<bS;o++){const l=Zh[o],d=n.props[l];(ho(d)||d===!1)&&(s[l]=d)}return s}function fw(n,s){if(!Array.isArray(s))return!1;const o=s.length;if(o!==n.length)return!1;for(let l=0;l<o;l++)if(s[l]!==n[l])return!1;return!0}const xS=[...Qh].reverse(),vS=Qh.length;function wS(n){return s=>Promise.all(s.map(({animation:o,options:l})=>TT(n,o,l)))}function jS(n){let s=wS(n),o=tb(),l=!0;const d=f=>(g,b)=>{const x=Ls(n,b,f==="exit"?n.presenceContext?.custom:void 0);if(x){const{transition:w,transitionEnd:S,...T}=x;g={...g,...T,...S}}return g};function h(f){s=f(n)}function m(f){const{props:g}=n,b=pw(n.parent)||{},x=[],w=new Set;let S={},T=1/0;for(let D=0;D<vS;D++){const E=xS[D],P=o[E],I=g[E]!==void 0?g[E]:b[E],F=ho(I),W=E===f?P.isActive:null;W===!1&&(T=D);let Z=I===b[E]&&I!==g[E]&&F;if(Z&&l&&n.manuallyAnimateOnMount&&(Z=!1),P.protectedKeys={...S},!P.isActive&&W===null||!I&&!P.prevProp||Ml(I)||typeof I=="boolean")continue;const X=kS(P.prevProp,I);let J=X||E===f&&P.isActive&&!Z&&F||D>T&&F,Q=!1;const ue=Array.isArray(I)?I:[I];let fe=ue.reduce(d(E),{});W===!1&&(fe={});const{prevResolvedValues:je={}}=P,Re={...je,...fe},Ie=V=>{J=!0,w.has(V)&&(Q=!0,w.delete(V)),P.needsAnimating[V]=!0;const $=n.getValue(V);$&&($.liveStyle=!1)};for(const V in Re){const $=fe[V],oe=je[V];if(S.hasOwnProperty(V))continue;let L=!1;ih($)&&ih(oe)?L=!fw($,oe):L=$!==oe,L?$!=null?Ie(V):w.add(V):$!==void 0&&w.has(V)?Ie(V):P.protectedKeys[V]=!0}P.prevProp=I,P.prevResolvedValues=fe,P.isActive&&(S={...S,...fe}),l&&n.blockInitialAnimation&&(J=!1);const Xe=Z&&X;J&&(!Xe||Q)&&x.push(...ue.map(V=>{const $={type:E}
vendor: 59,145 bytes, lines 11-19
11;if(typeof V=="string"&&l&&!Xe&&n.manuallyAnimateOnMount&&n.parent){const{parent:oe}=n,L=Ls(oe,V);if(oe.enteringChildren&&L){const{delayChildren:k}=L.transition||{};$.delay=Mv(oe.enteringChildren,n,k)}}return{animation:V,options:$}}))}if(w.size){const D={};if(typeof g.initial!="boolean"){const E=Ls(n,Array.isArray(g.initial)?g.initial[0]:g.initial);E&&E.transition&&(D.transition=E.transition)}w.forEach(E=>{const P=n.getBaseTarget(E),I=n.getValue(E);I&&(I.liveStyle=!0),D[E]=P??null}),x.push({animation:D})}let O=!!x.length;return l&&(g.initial===!1||g.initial===g.animate)&&!n.manuallyAnimateOnMount&&(O=!1),l=!1,O?s(x):Promise.resolve()}function p(f,g){if(o[f].isActive===g)return Promise.resolve();n.variantChildren?.forEach(x=>x.animationState?.setActive(f,g)),o[f].isActive=g;const b=m(f);for(const x in o)o[x].protectedKeys={};return b}return{animateChanges:m,setActive:p,setAnimateFunction:h,getState:()=>o,reset:()=>{o=tb()}}}function kS(n,s){return typeof s=="string"?s!==n:Array.isArray(s)?!fw(s,n):!1}function Ha(n=!1){return{isActive:n,protectedKeys:{},needsAnimating:{},prevResolvedValues:{}}}function tb(){return{animate:Ha(!0),whileInView:Ha(),whileHover:Ha(),whileTap:Ha(),whileDrag:Ha(),whileFocus:Ha(),exit:Ha()}}function nb(n,s){n.min=s.min,n.max=s.max}function dn(n,s){nb(n.x,s.x),nb(n.y,s.y)}function ab(n,s){n.translate=s.translate,n.scale=s.scale,n.originPoint=s.originPoint,n.origin=s.origin}const gw=1e-4,NS=1-gw,TS=1+gw,yw=.01,SS=0-yw,AS=0+yw;function kt(n){return n.max-n.min}function CS(n,s,o){return Math.abs(n-s)<=o}function sb(n,s,o,l=.5){n.origin=l,n.originPoint=He(s.min,s.max,n.origin),n.scale=kt(o)/kt(s),n.translate=He(o.min,o.max,n.origin)-n.originPoint,(n.scale>=NS&&n.scale<=TS||isNaN(n.scale))&&(n.scale=1),(n.translate>=SS&&n.translate<=AS||isNaN(n.translate))&&(n.translate=0)}function ao(n,s,o,l){sb(n.x,s.x,o.x,l?l.originX:void 0),sb(n.y,s.y,o.y,l?l.originY:void 0)}function ib(n,s,o){n.min=o.min+s.min,n.max=n.min+kt(s)}function OS(n,s,o){ib(n.x,s.x,o.x),ib(n.y,s.y,o.y)}function ob(n,s,o){n.min=s.min-o.min,n.max=n.min+kt(s)}function jl(n,s,o){ob(n.x,s.x,o.x),ob(n.y,s.y,o.y)}function rb(n,s,o,l,d){return n-=s,n=wl(n,1/o,l),d!==void 0&&(n=wl(n,1/d,l)),n}function ES(n,s=0,o=1,l=.5,d,h=n,m=n){if(Nn.test(s)&&(s=parseFloat(s),s=He(m.min,m.max,s/100)-m.min),typeof s!="number")return;let p=He(h.min,h.max,l);n===h&&(p-=s),n.min=rb(n.min,s,o,p,d),n.max=rb(n.max,s,o,p,d)}function lb(n,s,[o,l,d],h,m){ES(n,s[o],s[l],s[d],s.scale,h,m)}const DS=["x","scaleX","originX"],zS=["y","scaleY","originY"];function cb(n,s,o,l){lb(n.x,s,DS,o?o.x:void 0,l?l.x:void 0),lb(n.y,s,zS,o?o.y:void 0,l?l.y:void 0)}function db(n){return n.translate===0&&n.scale===1}function bw(n){return db(n.x)&&db(n.y)}function ub(n,s){return n.min===s.min&&n.max===s.max}function RS(n,s){return ub(n.x,s.x)&&ub(n.y,s.y)}function hb(n,s){return Math.round(n.min)===Math.round(s.min)&&Math.round(n.max)===Math.round(s.max)}function xw(n,s){return hb(n.x,s.x)&&hb(n.y,s.y)}function mb(n){return kt(n.x)/kt(n.y)}function pb(n,s){return n.translate===s.translate&&n.scale===s.scale&&n.originPoint===s.originPoint}function an(n){return[n("x"),n("y")]}function MS(n,s,o){let l="";const d=n.x.translate/s.x,h=n.y.translate/s.y,m=o?.z||0;if((d||h||m)&&(l=`translate3d(${d}px, ${h}px, ${m}px) `),(s.x!==1||s.y!==1)&&(l+=`scale(${1/s.x}, ${1/s.y}) `),o){const{transformPerspective:g,rotate:b,rotateX:x,rotateY:w,skewX:S,skewY:T}=o;g&&(l=`perspective(${g}px) ${l}`),b&&(l+=`rotate(${b}deg) `),x&&(l+=`rotateX(${x}deg) `),w&&(l+=`rotateY(${w}deg) `),S&&(l+=`skewX(${S}deg) `),T&&(l+=`skewY(${T}deg) `)}const p=n.x.scale*s.x,f=n.y.scale*s.y;return(p!==1||f!==1)&&(l+=`scale(${p}, ${f})`),l||"none"}const vw=["TopLeft","TopRight","BottomLeft","BottomRight"],qS=vw.length,fb=n=>typeof n=="string"?parseFloat(n):n,gb=n=>typeof n=="number"||ne.test(n);function PS(n,s,o,l,d,h){d?(n.opacity=He(0,o.opacity??1,IS(l)),n.opacityExit=He(s.opacity??1,0,US(l))):h&&(n.opacity=He(s.opacity??1,o.opacity??1,l));for(let m=0;m<qS;m++){const p=`border${vw[m]}Radius`;let f=yb(s,p),g=yb(o,p);if(f===void 0&&g===void 0)continue;f||(f=0),g||(g=0),f===0||g===0||gb(f)===gb(g)?(n[p]=Math.max(He(fb(f),fb(g),l),0),(Nn.test(g)||Nn.test(f))&&(n[p]+="%")):n[p]=g}(s.rotate||o.rotate)&&(n.rotate=He(s.rotate||0,o.rotate||0,l))}function yb(n,s){return n[s]!==void 0?n[s]:n.borderRadius}const IS=ww(0,.5,rv),US=ww(.5,.95,Dt);function ww(n,s,o){return l=>l<n?0:l>s?1:o(Xa(n,s,l))}function jw(n,s,o){const l=dt(n)?n:hn(n);return l.start(Hh("",l,s,o)),l.animation}function mo(n,s,o,l={passive:!0}){return n.addEventListener(s,o,l),()=>n.removeEventListener(s,o)}const BS=(n,s)=>n.depth-s.depth;class _S{constructor(){this.children=[],this.isDirty=!1}add(s){Th(this.children,s),this.isDirty=!0}remove(s){Dl(this.children,s),this.isDirty=!0}forEach(s){this.isDirty&&this.children.sort(BS),this.isDirty=!1,this.children.forEach(s)}}function VS(n,s){const o=jt.now(),l=({timestamp:d})=>{const h=d-o;h>=s&&(pn(l),n(h-s))};return Ee.setup(l,!0),()=>pn(l)}function ul(n){return dt(n)?n.get():n}class LS{constructor(){this.members=[]}add(s){Th(this.members,s),s.scheduleRender()}remove(s){if(Dl(this.members,s),s===this.prevLead&&(this.prevLead=void 0),s===this.lead){const o=this.members[this.members.length-1];o&&this.promote(o)}}relegate(s){const o=this.members.findIndex(d=>s===d);if(o===0)return!1;let l;for(let d=o;d>=0;d--){const h=this.members[d];if(h.isPresent!==!1){l=h;break}}return l?(this.promote(l),!0):!1}promote(s,o){const l=this.lead;if(s!==l&&(this.prevLead=l,this.lead=s,s.show(),l)){l.instance&&l.scheduleRender(),s.scheduleRender(),s.resumeFrom=l,o&&(s.resumeFrom.preserveOpacity=!0),l.snapshot&&(s.snapshot=l.snapshot,s.snapshot.latestValues=l.animationValues||l.latestValues),s.root&&s.root.isUpdating&&(s.isLayoutDirty=!0);const{crossfade:d}=s.options;d===!1&&l.hide()}}exitAnimationComplete(){this.members.forEach(s=>{const{options:o,resumingFrom:l}=s;o.onExitComplete&&o.onExitComplete(),l&&l.options.onExitComplete&&l.options.onExitComplete()})}scheduleRender(){this.members.forEach(s=>{s.instance&&s.scheduleRender(!1)})}removeLeadSnapshot(){this.lead&&this.lead.snapshot&&(this.lead.snapshot=void 0)}}const hl={hasAnimatedSinceResize:!0,hasEverUpdated:!1},xu=["","X","Y","Z"],GS=1e3;let HS=0;function vu(n,s,o,l){const{latestValues:d}=s;d[n]&&(o[n]=d[n],s.setStaticValue(n,0),l&&(l[n]=0))}function kw(n){if(n.hasCheckedOptimisedAppear=!0,n.root===n)return;const{visualElement:s}=n.options;if(!s)return;const o=Uv(s);if(window.MotionHasOptimisedAnimation(o,"transform")){const{layout:d,layoutId:h}=n.options;window.MotionCancelOptimisedAnimation(o,"transform",Ee,!(d||h))}const{parent:l}=n;l&&!l.hasCheckedOptimisedAppear&&kw(l)}function Nw({attachResizeListener:n,defaultParent:s,measureScroll:o,checkIsScrollRoot:l,resetTransform:d}){return class{constructor(m={},p=s?.()){this.id=HS++,this.animationId=0,this.animationCommitId=0,this.children=new Set,this.options={},this.isTreeAnimating=!1,this.isAnimationBlocked=!1,this.isLayoutDirty=!1,this.isProjectionDirty=!1,this.isSharedProjectionDirty=!1,this.isTransformDirty=!1,this.updateManuallyBlocked=!1,this.updateBlockedByResize=!1,this.isUpdating=!1,this.isSVG=!1,this.needsReset=!1,this.shouldResetTransform=!1,this.hasCheckedOptimisedAppear=!1,this.treeScale={x:1,y:1},this.eventHandlers=new Map,this.hasTreeAnimated=!1,this.layoutVersion=0,this.updateScheduled=!1,this.scheduleUpdate=()=>this.update(),this.projectionUpdateScheduled=!1,this.checkUpdateFailed=()=>{this.isUpdating&&(this.isUpdating=!1,this.clearAllSnapshots())},this.updateProjection=()=>{this.projectionUpdateScheduled=!1,this.nodes.forEach(WS),this.nodes.forEach($S),this.nodes.forEach(QS),this.nodes.forEach(YS)},this.resolvedRelativeTargetAt=0,this.linkedParentVersion=0,this.hasProjected=!1,this.isVisible=!0,this.animationProgress=0,this.sharedNodes=new Map,this.latestValues=m,this.root=p?p.root||p:this,this.path=p?[...p.path,p]:[],this.parent=p,this.depth=p?p.depth+1:0;for(let f=0;f<this.path.length;f++)this.path[f].shouldResetTransform=!0;this.root===this&&(this.nodes=new _S)}addEventListener(m,p){return this.eventHandlers.has(m)||this.eventHandlers.set(m,new Ah),this.eventHandlers.get(m).add(p)}notifyListeners(m,...p){const f=this.eventHandlers.get(m);f&&f.notify(...p)}hasListeners(m){return this.eventHandlers.has(m)}mount(m){if(this.instance)return;this.isSVG=Rl(m)&&!Jv(m),this.instance=m;const{layoutId:p,layout:f,visualElement:g}=this.options;if(g&&!g.current&&g.mount(m),this.root.nodes.add(this),this.parent&&this.parent.children.add(this),this.root.hasTreeAnimated&&(f||p)&&(this.isLayoutDirty=!0),n){let b,x=0;const w=()=>this.root.updateBlockedByResize=!1;Ee.read(()=>{x=window.innerWidth}),n(m,()=>{const S=window.innerWidth;S!==x&&(x=S,this.root.updateBlockedByResize=!0,b&&b(),b=VS(w,250),hl.hasAnimatedSinceResize&&(hl.hasAnimatedSinceResize=!1,this.nodes.forEach(vb)))})}p&&this.root.registerSharedNode(p,this),this.options.animate!==!1&&g&&(p||f)&&this.addEventListener("didUpdate",({delta:b,hasLayoutChanged:x,hasRelativeLayoutChanged:w,layout:S})=>{if(this.isTreeAnimationBlocked()){this.target=void 0,this.relativeTarget=void 0;return}const T=this.options.transition||g.getDefaultTransition()||aA,{onLayoutAnimationStart:O,onLayoutAnimationComplete:D}=g.getProps(),E=!this.targetLayout||!xw(this.targetLayout,S),P=!x&&w;if(this.options.layoutRoot||this.resumeFrom||P||x&&(E||!this.currentAnimation)){this.resumeFrom&&(this.resumingFrom=this.resumeFrom,this.resumingFrom.resumingFrom=void 0);const I={...Gh(T,"layout"),onPlay:O,onComplete:D};(g.shouldReduceMotion||this.options.layoutRoot)&&(I.delay=0,I.type=!1),this.startAnimation(I),this.setAnimationOrigin(b,P)}else x||vb(this),this.isLead()&&this.options.onExitComplete&&this.options.onExitComplete();this.targetLayout=S})}unmount(){this.options.layoutId&&this.willUpdate(),this.root.nodes.remove(this);const m=this.getStack();m&&m.remove(this),this.parent&&this.parent.children.delete(this),this.instance=void 0,this.eventHandlers.clear(),pn(this.updateProjection)}blockUpdate(){this.updateManuallyBlocked=!0}unblockUpdate(){this.updateManuallyBlocked=!1}isUpdateBlocked(){return this.updateManuallyBlocked||this.updateBlockedByResize}isTreeAnimationBlocked(){return this.isAnimationBlocked||this.parent&&this.parent.isTreeAnimationBlocked()||!1}startUpdate(){this.isUpdateBlocked()||(this.isUpdating=!0,this.nodes&&this.nodes.forEach(ZS),this.animationId++)}getTransformTemplate(){const{visualElement:m}=this.options;return m&&m.getProps().transformTemplate}willUpdate(m=!0){if(this.root.hasTreeAnimated=!0,this.root.isUpdateBlocked()){this.options.onExitComplete&&this.options.onExitComplete();return}if(window.MotionCancelOptimisedAnimation&&!this.hasCheckedOptimisedAppear&&kw(this),!this.root.isUpdating&&this.root.startUpdate(),this.isLayoutDirty)return;this.isLayoutDirty=!0;for(let b=0;b<this.path.length;b++){const x=this.path[b];x.shouldResetTransform=!0,x.updateScroll("snapshot"),x.options.layoutRoot&&x.willUpdate(!1)}const{layoutId:p,layout:f}=this.options;if(p===void 0&&!f)return;const g=this.getTransformTemplate();this.prevTransformTemplateValue=g?g(this.latestValues,""):void 0,this.updateSnapshot(),m&&this.notifyListeners("willUpdate")}update(){if(this.updateScheduled=!1,this.isUpdateBlocked()){this.unblockUpdate(),this.clearAllSnapshots(),this.nodes.forEach(bb);return}if(this.animationId<=this.animationCommitId){this.nodes.forEach(xb);return}this.animationCommitId=this.animationId,this.isUpdating?(this.isUpdating=!1,this.nodes.forEach(JS),this.nodes.forEach(KS),this.nodes.forEach(FS)):this.nodes.forEach(xb),this.clearAllSnapshots();const p=jt.now();ct.delta=mn(0,1e3/60,p-ct.timestamp),ct.timestamp=p,ct.isProcessing=!0,uu.update.process(ct),uu.preRender.process(ct),uu.render.process(ct),ct.isProcessing=!1}didUpdate(){this.updateScheduled||(this.updateScheduled=!0,Xh.read(this.scheduleUpdate))}clearAllSnapshots(){this.nodes.forEach(XS),this.sharedNodes.forEach(eA)}scheduleUpdateProjection(){this.projectionUpdateScheduled||(this.projectionUpdateScheduled=!0,Ee.preRender(this.updateProjection,!1,!0))}scheduleCheckAfterUnmount(){Ee.postRender(()=>{this.isLayoutDirty?this.root.didUpdate():this.root.checkUpdateFailed()})}updateSnapshot(){this.snapshot||!this.instance||(this.snapshot=this.measure(),this.snapshot&&!kt(this.snapshot.measuredBox.x)&&!kt(this.snapshot.measuredBox.y)&&(this.snapshot=void 0))}updateLayout(){if(!this.instance||(this.updateScroll(),!(this.options.alwaysMeasureLayout&&this.isLead())&&!this.isLayoutDirty))return;if(this.resumeFrom&&!this.resumeFrom.instance)for(let f=0;f<this.path.length;f++)this.path[f].updateScroll();const m=this.layout;this.layout=this.measure(!1),this.layoutVersion++,this.layoutCorrected=st(),this.isLayoutDirty=!1,this.projectionDelta=void 0,this.notifyListeners("measure",this.layout.layoutBox);const{visualElement:p}=this.options;p&&p.notify("LayoutMeasure",this.layout.layoutBox,m?m.layoutBox:void 0)}updateScroll(m="measure"){let p=!!(this.options.layoutScroll&&this.instance);if(this.scroll&&this.scroll.animationId===this.root.animationId&&this.scroll.phase===m&&(p=!1),p&&this.instance){const f=l(this.instance);this.scroll={animationId:this.root.animationId,phase:m,isRoot:f,offset:o(this.instance),wasRoot:this.scroll?this.scroll.isRoot:f}}}resetTransform(){if(!d)return;const m=this.isLayoutDirty||this.shouldResetTransform||this.options.alwaysMeasureLayout,p=this.projectionDelta&&!bw(this.projectionDelta),f=this.getTransformTemplate(),g=f?f(this.latestValues,""):void 0,b=g!==this.prevTransformTemplateValue;m&&this.instance&&(p||Ka(this.latestValues)||b)&&(d(this.instance,g),this.shouldResetTransform=!1,this.scheduleRender())}measure(m=!0){const p=this.measurePageBox();let f=this.removeElementScroll(p);return m&&(f=this.removeTransform(f)),sA(f),{animationId:this.root.animationId,measuredBox:p,layoutBox:f,latestValues:{},source:this.id}}measurePageBox(){const{visualElement:m}=this.options;if(!m)return st();const p=m.measureViewportBox();if(!(this.scroll?.wasRoot||this.path.some(iA))){const{scroll:g}=this.root;g&&(Bs(p.x,g.offset.x),Bs(p.y,g.offset.y))}return p}removeElementScroll(m){const p=st();if(dn(p,m),this.scroll?.wasRoot)return p;for(let f=0;f<this.path.length;f++){const g=this.path[f],{scroll:b,options:x}=g;g!==this.root&&b&&x.layoutScroll&&(b.wasRoot&&dn(p,m),Bs(p.x,b.offset.x),Bs(p.y,b.offset.y))}return p}applyTransform(m,p=!1){const f=st();dn(f,m);for(let g=0;g<this.path.length;g++){const b=this.path[g];!p&&b.options.layoutScroll&&b.scroll&&b!==b.root&&_s(f,{x:-b.scroll.offset.x,y:-b.scroll.offset.y}),Ka(b.latestValues)&&_s(f,b.latestValues)}return Ka(this.latestValues)&&_s(f,this.latestValues),f}removeTransform(m){const p=st();dn(p,m);for(let f=0;f<this.path.length;f++){const g=this.path[f];if(!g.instance||!Ka(g.latestValues))continue;ch(g.latestValues)&&g.updateSnapshot();const b=st(),x=g.measurePageBox();dn(b,x),cb(p,g.latestValues,g.snapshot?g.snapshot.layoutBox:void 0,b)}return Ka(this.latestValues)&&cb(p,this.latestValues),p}setTargetDelta(m){this.targetDelta=m,this.root.scheduleUpdateProjection(),this.isProjectionDirty=!0}setOptions(m){this.options={...this.options,...m,crossfade:m.crossfade!==void 0?m.crossfade:!0}}clearMeasurements(){this.scroll=void 0,this.layout=void 0,this.snapshot=void 0,this.prevTransformTemplateValue=void 0,this.targetDelta=void 0,this.target=void 0,this.isLayoutDirty=!1}forceRelativeParentToResolveTarget(){this.relativeParent&&this.relativeParent.resolvedRelativeTargetAt!==ct.timestamp&&this.relativeParent.resolveTargetDelta(!0)}resolveTargetDelta(m=!1){const p=this.getLead();this.isProjectionDirty||(this.isProjectionDirty=p.isProjectionDirty),this.isTransformDirty||(this.isTransformDirty=p.isTransformDirty),this.isSharedProjectionDirty||(this.isSharedProjectionDirty=p.isSharedProjectionDirty);const f=!!this.resumingFrom||this!==p;if(!(m||f&&this.isSharedProjectionDirty||this.isProjectionDirty||this.parent?.isProjectionDirty||this.attemptToResolveRelativeTarget||this.root.updateBlockedByResize))return;const{layout:b,layoutId:x}=this.options;if(!this.layout||!(b||x))return;this.resolvedRelativeTargetAt=ct.timestamp;const w=this.getClosestProjectingParent();w&&this.linkedParentVersion!==w.layoutVersion&&!w.options.layoutRoot&&this.removeRelativeTarget(),!this.targetDelta&&!this.relativeTarget&&(w&&w.layout?this.createRelativeTarget(w,this.layout.layoutBox,w.layout.layoutBox):this.removeRelativeTarget()),!(!this.relativeTarget&&!this.targetDelta)&&(this.target||(this.target=st(),this.targetWithTransforms=st()),this.relativeTarget&&this.relativeTargetOrigin&&this.relativeParent&&this.relativeParent.target?(this.forceRelativeParentToResolveTarget(),OS(this.target,this.relativeTarget,this.relativeParent.target)):this.targetDelta?(this.resumingFrom?this.target=this.applyTransform(this.layout.layoutBox):dn(this.target,this.layout.layoutBox),sw(this.target,this.targetDelta)):dn(this.target,this.layout.layoutBox),this.attemptToResolveRelativeTarget&&(this.attemptToResolveRelativeTarget=!1,w&&!!w.resumingFrom==!!this.resumingFrom&&!w.options.layoutScroll&&w.target&&this.animationProgress!==1?this.createRelativeTarget(w,this.target,w.target):this.relativeParent=this.relativeTarget=void 0))}getClosestProjectingParent(){if(!(!this.parent||ch(this.parent.latestValues)||aw(this.parent.latestValues)))return this.parent.isProjecting()?this.parent:this.parent.getClosestProjectingParent()}isProjecting(){return!!((this.relativeTarget||this.targetDelta||this.options.layoutRoot)&&this.layout)}createRelativeTarget(m,p,f){this.relativeParent=m,this.linkedParentVersion=m.layoutVersion,this.forceRelativeParentToResolveTarget(),this.relativeTarget=st(),this.relativeTargetOrigin=st(),jl(this.relativeTargetOrigin,p,f),dn(this.relativeTarget,this.relativeTargetOrigin)}removeRelativeTarget(){this.relativeParent=this.relativeTarget=void 0}calcProjection(){const m=this.getLead(),p=!!this.resumingFrom||this!==m;let f=!0;if((this.isProjectionDirty||this.parent?.isProjectionDirty)&&(f=!1),p&&(this.isSharedProjectionDirty||this.isTransformDirty)&&(f=!1),this.resolvedRelativeTargetAt===ct.timestamp&&(f=!1),f)return;const{layout:g,layoutId:b}=this.options;if(this.isTreeAnimating=!!(this.parent&&this.parent.isTreeAnimating||this.currentAnimation||this.pendingAnimation),this.isTreeAnimating||(this.targetDelta=this.relativeTarget=void 0),!this.layout||!(g||b))return;dn(this.layoutCorrected,this.layout.layoutBox);const x=this.treeScale.x,w=this.treeScale.y;sS(this.layoutCorrected,this.treeScale,this.path,p),m.layout&&!m.target&&(this.treeScale.x!==1||this.treeScale.y!==1)&&(m.target=m.layout.layoutBox,m.targetWithTransforms=st());const{target:S}=m;if(!S){this.prevProjectionDelta&&(this.createProjectionDeltas(),this.scheduleRender());return}!this.projectionDelta||!this.prevProjectionDelta?this.createProjectionDeltas():(ab(this.prevProjectionDelta.x,this.projectionDelta.x),ab(this.prevProjectionDelta.y,this.projectionDelta.y)),ao(this.projectionDelta,this.layoutCorrected,S,this.latestValues),(this.treeScale.x!==x||this.treeScale.y!==w||!pb(this.projectionDelta.x,this.prevProjectionDelta.x)||!pb(this.projectionDelta.y,this.prevProjectionDelta.y))&&(this.hasProjected=!0,this.scheduleRender(),this.notifyListeners("projectionUpdate",S))}hide(){this.isVisible=!1}show(){this.isVisible=!0}scheduleRender(m=!0){if(this.options.visualElement?.scheduleRender(),m){const p=this.getStack();p&&p.scheduleRender()}this.resumingFrom&&!this.resumingFrom.instance&&(this.resumingFrom=void 0)}createProjectionDeltas(){this.prevProjectionDelta=Us(),this.projectionDelta=Us(),this.projectionDeltaWithTransform=Us()}setAnimationOrigin(m,p=!1){const f=this.snapshot,g=f?f.latestValues:{},b={...this.latestValues},x=Us();(!this.relativeParent||!this.relativeParent.options.layoutRoot)&&(this.relativeTarget=this.relativeTargetOrigin=void 0),this.attemptToResolveRelativeTarget=!p;const w=st(),S=f?f.source:void 0,T=this.layout?this.layout.source:void 0,O=S!==T,D=this.getStack(),E=!D||D.members.length<=1,P=!!(O&&!E&&this.options.crossfade===!0&&!this.path.some(nA));this.animationProgress=0;let I;this.mixTargetDelta=F=>{const W=F/1e3;wb(x.x,m.x,W),wb(x.y,m.y,W),this.setTargetDelta(x),this.relativeTarget&&this.relativeTargetOrigin&&this.layout&&this.relativeParent&&this.relativeParent.layout&&(jl(w,this.layout.layoutBox,this.relativeParent.layout.layoutBox),tA(this.relativeTarget,this.relativeTargetOrigin,w,W),I&&RS(this.relativeTarget,I)&&(this.isProjectionDirty=!1),I||(I=st()),dn(I,this.relativeTarget)),O&&(this.animationValues=b,PS(b,g,this.latestValues,W,P,E)),this.root.scheduleUpdateProjection(),this.scheduleRender(),this.animationProgress=W},this.mixTargetDelta(this.options.layoutRoot?1e3:0)}startAnimation(m){this.notifyListeners("animationStart"),this.currentAnimation?.stop(),this.resumingFrom?.currentAnimation?.stop(),this.pendingAnimation&&(pn(this.pendingAnimation),this.pendingAnimation=void 0),this.pendingAnimation=Ee.update(()=>{hl.hasAnimatedSinceResize=!0,this.motionValue||(this.motionValue=hn(0)),this.currentAnimation=jw(this.motionValue,[0,1e3],{...m,velocity:0,isSync:!0,onUpdate:p=>{this.mixTargetDelta(p),m.onUpdate&&m.onUpdate(p)},onStop:()=>{},onComplete:()=>{m.onComplete&&m.onComplete(),this.completeAnimation()}}),this.resumingFrom&&(this.resumingFrom.currentAnimation=this.currentAnimation),this.pendingAnimation=void 0})}completeAnimation(){this.resumingFrom&&(this.resumingFrom.currentAnimation=void 0,this.resumingFrom.preserveOpacity=void 0);const m=this.getStack();m&&m.exitAnimationComplete(),this.resumingFrom=this.currentAnimation=this.animationValues=void 0,this.notifyListeners("animationComplete")}finishAnimation(){this.currentAnimation&&(this.mixTargetDelta&&this.mixTargetDelta(GS),this.currentAnimation.stop()),this.completeAnimation()}applyTransformsToTarget(){const m=this.getLead();let{targetWithTransforms:p,target:f,layout:g,latestValues:b}=m;if(!(!p||!f||!g)){if(this!==m&&this.layout&&g&&Tw(this.options.animationType,this.layout.layoutBox,g.layoutBox)){f=this.target||st();const x=kt(this.layout.layoutBox.x);f.x.min=m.target.x.min,f.x.max=f.x.min+x;const w=kt(this.layout.layoutBox.y);f.y.min=m.target.y.min,f.y.max=f.y.min+w}dn(p,f),_s(p,b),ao(this.projectionDeltaWithTransform,this.layoutCorrected,p,b)}}registerSharedNode(m,p){this.sharedNodes.has(m)||this.sharedNodes.set(m,new LS),this.sharedNodes.get(m).add(p);const g=p.options.initialPromotionConfig;p.promote({transition:g?g.transition:void 0,preserveFollowOpacity:g&&g.shouldPreserveFollowOpacity?g.shouldPreserveFollowOpacity(p):void 0})}isLead(){const m=this.getStack();return m?m.lead===this:!0}getLead(){const{layoutId:m}=this.options;return m?this.getStack()?.lead||this:this}getPrevLead(){const{layoutId:m}=this.options;return m?this.getStack()?.prevLead:void 0}getStack(){const{layoutId:m}=this.options;if(m)return this.root.sharedNodes.get(m)}promote({needsReset:m,transition:p,preserveFollowOpacity:f}={}){const g=this.getStack();g&&g.promote(this,f),m&&(this.projectionDelta=void 0,this.needsReset=!0),p&&this.setOptions({transition:p})}relegate(){const m=this.getStack();return m?m.relegate(this):!1}resetSkewAndRotation(){const{visualElement:m}=this.options;if(!m)return;let p=!1;const{latestValues:f}=m;if((f.z||f.rotate||f.rotateX||f.rotateY||f.rotateZ||f.skewX||f.skewY)&&(p=!0),!p)return;const g={};f.z&&vu("z",m,g,this.animationValues);for(let b=0;b<xu.length;b++)vu(`rotate${xu[b]}`,m,g,this.animationValues),vu(`skew${xu[b]}`,m,g,this.animationValues);m.render();for(const b in g)m.setStaticValue(b,g[b]),this.animationValues&&(this.animationValues[b]=g[b]);m.scheduleRender()}applyProjectionStyles(m,p){if(!this.instance||this.isSVG)return;if(!this.isVisible){m.visibility="hidden";return}const f=this.getTransformTemplate();if(this.needsReset){this.needsReset=!1,m.visibility="",m.opacity="",m.pointerEvents=ul(p?.pointerEvents)||"",m.transform=f?f(this.latestValues,""):"none";return}const g=this.getLead();if(!this.projectionDelta||!this.layout||!g.target){this.options.layoutId&&(m.opacity=this.latestValues.opacity!==void 0?this.latestValues.opacity:1,m.pointerEvents=ul(p?.pointerEvents)||""),this.hasProjected&&!Ka(this.latestValues)&&(m.transform=f?f({},""):"none",this.hasProjected=!1);return}m.visibility="";const b=g.animationValues||g.latestValues;this.applyTransformsToTarget();let x=MS(this.projectionDeltaWithTransform,this.treeScale,b);f&&(x=f(b,x)),m.transform=x;const{x:w,y:S}=this.projectionDelta;m.transformOrigin=`${w.origin*100}% ${S.origin*100}% 0`,g.animationValues?m.opacity=g===this?b.opacity??this.latestValues.opacity??1:this.preserveOpacity?this.latestValues.opacity:b.opacityExit:m.opacity=g===this?b.opacity!==void 0?b.opacity:"":b.opacityExit!==void 0?b.opacityExit:0;for(const T in uh){if(b[T]===void 0)continue;const{correct:O,applyTo:D,isCSSVariable:E}=uh[T],P=x==="none"?b[T]:O(b[T],g);if(D){const I=D.length;for(let F=0;F<I;F++)m[D[F]]=P}else E?this.options.visualElement.renderState.vars[T]=P:m[T]=P}this.options.layoutId&&(m.pointerEvents=g===this?ul(p?.pointerEvents)||"":"none")}clearSnapshot(){this.resumeFrom=this.snapshot=void 0}resetTree(){this.root.nodes.forEach(m=>m.currentAnimation?.stop()),this.root.nodes.forEach(bb),this.root.sharedNodes.clear()}}}function KS(n){n.updateLayout()}function FS(n){const s=n.resumeFrom?.snapshot||n.snapshot;if(n.isLead()&&n.layout&&s&&n.hasListeners("didUpdate")){const{layoutBox:o,measuredBox:l}=n.layout,{animationType:d}=n.options,h=s.source!==n.layout.source;d==="size"?an(b=>{const x=h?s.measuredBox[b]:s.layoutBox[b],w=kt(x);x.min=o[b].min,x.max=x.min+w}):Tw(d,s.layoutBox,o)&&an(b=>{const x=h?s.measuredBox[b]:s.layoutBox[b],w=kt(o[b]);x.max=x.min+w,n.relativeTarget&&!n.currentAnimation&&(n.isProjectionDirty=!0,n.relativeTarget[b].max=n.relativeTarget[b].min+w)});const m=Us();ao(m,o,s.layoutBox);const p=Us();h?ao(p,n.applyTransform(l,!0),s.measuredBox):ao(p,o,s.layoutBox);const f=!bw(m);let g=!1;if(!n.resumeFrom){const b=n.getClosestProjectingParent();if(b&&!b.resumeFrom){const{snapshot:x,layout:w}=b;if(x&&w){const S=st();jl(S,s.layoutBox,x.layoutBox);const T=st();jl(T,o,w.layoutBox),xw(S,T)||(g=!0),b.options.layoutRoot&&(n.relativeTarget=T,n.relativeTargetOrigin=S,n.relativeParent=b)}}}n.notifyListeners("didUpdate",{layout:o,snapshot:s,delta:p,layoutDelta:m,hasLayoutChanged:f,hasRelativeLayoutChanged:g})}else if(n.isLead()){const{onExitComplete:o}=n.options;o&&o()}n.options.transition=void 0}function WS(n){n.parent&&(n.isProjecting()||(n.isProjectionDirty=n.parent.isProjectionDirty),n.isSharedProjectionDirty||(n.isSharedProjectionDirty=!!(n.isProjectionDirty||n.parent.isProjectionDirty||n.parent.isSharedProjectionDirty)),n.isTransformDirty||(n.isTransformDirty=n.parent.isTransformDirty))}function YS(n){n.isProjectionDirty=n.isSharedProjectionDirty=n.isTransformDirty=!1}function XS(n){n.clearSnapshot()}function bb(n){n.clearMeasurements()}function xb(n){n.isLayoutDirty=!1}function JS(n){const{visualElement:s}=n.options;s&&s.getProps().onBeforeLayoutMeasure&&s.notify("BeforeLayoutMeasure"),n.resetTransform()}function vb(n){n.finishAnimation(),n.targetDelta=n.relativeTarget=n.target=void 0,n.isProjectionDirty=!0}function $S(n){n.resolveTargetDelta()}function QS(n){n.calcProjection()}function ZS(n){n.resetSkewAndRotation()}function eA(n){n.removeLeadSnapshot()}function wb(n,s,o){n.translate=He(s.translate,0,o),n.scale=He(s.scale,1,o),n.origin=s.origin,n.originPoint=s.originPoint}function jb(n,s,o,l){n.min=He(s.min,o.min,l),n.max=He(s.max,o.max,l)}function tA(n,s,o,l){jb(n.x,s.x,o.x,l),jb(n.y,s.y,o.y,l)}function nA(n){return n.animationValues&&n.animationValues.opacityExit!==void 0}const aA={duration:.45,ease:[.4,0,.1,1]},kb=n=>typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().includes(n),Nb=kb("applewebkit/")&&!kb("chrome/")?Math.round:Dt;function Tb(n){n.min=Nb(n.min),n.max=Nb(n.max)}function sA(n){Tb(n.x),Tb(n.y)}function Tw(n,s,o){return n==="position"||n==="preserve-aspect"&&!CS(mb(s),mb(o),.2)}function iA(n){return n!==n.root&&n.scroll?.wasRoot}const oA=Nw({attachResizeListener:(n,s)=>mo(n,"resize",s),measureScroll:()=>({x:document.documentElement.scrollLeft||document.body?.scrollLeft||0,y:document.documentElement.scrollTop||document.body?.scrollTop||0}),checkIsScrollRoot:()=>!0}),wu={current:void 0},Sw=Nw({measureScroll:n=>({x:n.scrollLeft,y:n.scrollTop}),defaultParent:()=>{if(!wu.current){const n=new oA({});n.mount(window),n.setOptions({layoutScroll:!0}),wu.current=n}return wu.current},resetTransform:(n,s)=>{n.style.transform=s!==void 0?s:"none"},checkIsScrollRoot:n=>window.getComputedStyle(n).position==="fixed"}),Pl=j.createContext({transformPagePoint:n=>n,isStatic:!1,reducedMotion:"never"});function Sb(n,s){if(typeof n=="function")return n(s);n!=null&&(n.current=s)}function rA(...n){return s=>{let o=!1;const l=n.map(d=>{const h=Sb(d,s);return!o&&typeof h=="function"&&(o=!0),h});if(o)return()=>{for(let d=0;d<l.length;d++){const h=l[d];typeof h=="function"?h():Sb(n[d],null)}}}}function lA(...n){return j.useCallback(rA(...n),n)}class cA extends j.Component{getSnapshotBeforeUpdate(s){const o=this.props.childRef.current;if(o&&s.isPresent&&!this.props.isPresent){const l=o.offsetParent,d=bl(l)&&l.offsetWidth||0,h=bl(l)&&l.offsetHeight||0,m=this.props.sizeRef.current;m.height=o.offsetHeight||0,m.width=o.offsetWidth||0,m.top=o.offsetTop,m.left=o.offsetLeft,m.right=d-m.width-m.left,m.bottom=h-m.height-m.top}return null}componentDidUpdate(){}render(){return this.props.children}}function dA({children:n,isPresent:s,anchorX:o,anchorY:l,root:d}){const h=j.useId(),m=j.useRef(null),p=j.useRef({width:0,height:0,top:0,left:0,right:0,bottom:0}),{nonce:f}=j.useContext(Pl),g=n.props?.ref??n?.ref,b=lA(m,g);return j.useInsertionEffect(()=>{const{width:x,height:w,top:S,left:T,right:O,bottom:D}=p.current;if(s||!m.current||!x||!w)return;const E=o==="left"?`left: ${T}`:`right: ${O}`,P=l==="bottom"?`bottom: ${D}`:`top: ${S}`;m.current.dataset.motionPopId=h;const I=document.createElement("style");f&&(I.nonce=f);const F=d??document.head;return F.appendChild(I),I.sheet&&I.sheet.insertRule(`
12          [data-motion-pop-id="${h}"] {
13            position: absolute !important;
14            width: ${x}px !important;
15            height: ${w}px !important;
16            ${E}px !important;
17            ${P}px !important;
18          }
19        `),()=>{F.contains(I)&&F.removeChild(I)}},[s]),a.jsx(cA,{isPresent:s,childRef:m,sizeRef:p,children:j.cloneElement(n,{ref:b})})}const uA=({children:n,initial:s,isPresent:o,onExitComplete:l,custom:d,presenceAffectsLayout:h,mode:m,anchorX:p,anchorY:f,root:g})=>{const b=wa(hA),x=j.useId();let w=!0,S=j.useMemo(()=>(w=!1,{id:x,initial:s,isPresent:o,custom:d,onExitComplete:T=>{b.set(T,!0);for(const O of b.values())if(!O)return;l&&l()},register:T=>(b.set(T,!1),()=>b.delete(T))}),[o,b,l]);return h&&w&&(S={...S}),j.useMemo(()=>{b.forEach((T,O)=>b.set(O,!1))},[o]),j.useEffect(()=>{!o&&!b.size&&l&&l()},[o]),m==="popLayout"&&(n=a.jsx(dA,{isPresent:o,anchorX:p,anchorY:f,root:g,children:n})),a.jsx(El.Provider,{value:S,children:n})};function hA(){return new Map}function Aw(n=!0){const s=j.useContext(El);if(s===null)return[!0,null];const{isPresent:o,onExitComplete:l,register:d}=s,h=j.useId();j.useEffect(()=>{if(n)return d(h)},[n]);const m=j.useCallback(()=>n&&l&&l(h),[h,l,n]);return!o&&l?[!1,m]:[!0]}const Hr=n=>n.key||"";function Ab(n){const s=[];return j.Children.forEach(n,o=>{j.isValidElement(o)&&s.push(o)}),s}const zt=({children:n,custom:s,initial:o=!0,onExitComplete:l,presenceAffectsLayout:d=!0,mode:h="sync",propagate:m=!1,anchorX:p="left",anchorY:f="top",root:g})=>{const[b,x]=Aw(m),w=j.useMemo(()=>Ab(n),[n]),S=m&&!b?[]:w.map(Hr),T=j.useRef(!0),O=j.useRef(w),D=wa(()=>new Map),E=j.useRef(new Set),[P,I]=j.useState(w),[F,W]=j.useState(w);Ol(()=>{T.current=!1,O.current=w;for(let J=0;J<F.length;J++){const Q=Hr(F[J]);S.includes(Q)?(D.delete(Q),E.current.delete(Q)):D.get(Q)!==!0&&D.set(Q,!1)}},[F,S.length,S.join("-")]);const Z=[];if(w!==P){let J=[...w];for(let Q=0;Q<F.length;Q++){const ue=F[Q],fe=Hr(ue);S.includes(fe)||(J.splice(Q,0,ue),Z.push(ue))}return h==="wait"&&Z.length&&(J=Z),W(Ab(J)),I(w),null}const{forceRender:X}=j.useContext(Nh);return a.jsx(a.Fragment,{children:F.map(J=>{const Q=Hr(J),ue=m&&!b?!1:w===F||S.includes(Q),fe=()=>{if(E.current.has(Q))return;if(E.current.add(Q),D.has(Q))D.set(Q,!0);else return;let je=!0;D.forEach(Re=>{Re||(je=!1)}),je&&(X?.(),W(O.current),m&&x?.(),l&&l())};return a.jsx(uA,{isPresent:ue,initial:!T.current||o?void 0:!1,custom:s,presenceAffectsLayout:d,mode:h,root:g,onExitComplete:ue?void 0:fe,anchorX:p,anchorY:f,children:J},Q)})})},Cw=j.createContext({strict:!1}),Cb={animation:["animate","variants","whileHover","whileTap","exit","whileInView","whileFocus","whileDrag"],exit:["exit"],drag:["drag","dragControls"],focus:["whileFocus"],hover:["whileHover","onHoverStart","onHoverEnd"],tap:["whileTap","onTap","onTapStart","onTapCancel"],pan:["onPan","onPanStart","onPanSessionStart","onPanEnd"],inView:["whileInView","onViewportEnter","onViewportLeave"],layout:["layout","layoutId"]};let Ob=!1;function mA(){if(Ob)return;const n={};for(const s in Cb)n[s]={isEnabled:o=>Cb[s].some(l=>!!o[l])};Zv(n),Ob=!0}function Ow(){return mA(),tS()}function pA(n){const s=Ow();for(const o in n)s[o]={...s[o],...n[o]};Zv(s)}const fA=new Set(["animate","exit","variants","initial","style","values","variants","transition","transformTemplate","custom","inherit","onBeforeLayoutMeasure","onAnimationStart","onAnimationComplete","onUpdate","onDragStart","onDrag","onDragEnd","onMeasureDragConstraints","onDirectionLock","onDragTransitionEnd","_dragX","_dragY","onHoverStart","onHoverEnd","onViewportEnter","onViewportLeave","globalTapTarget","ignoreStrict","viewport"]);function kl(n){return n.startsWith("while")||n.startsWith("drag")&&n!=="draggable"||n.startsWith("layout")||n.startsWith("onTap")||n.startsWith("onPan")||n.startsWith("onLayout")||fA.has(n)}let Ew=n=>!kl(n);function gA(n){typeof n=="function"&&(Ew=s=>s.startsWith("on")?!kl(s):n(s))}try{gA(require("@emotion/is-prop-valid").default)}catch{}function yA(n,s,o){const l={};for(const d in n)d==="values"&&typeof n.values=="object"||(Ew(d)||o===!0&&kl(d)||!s&&!kl(d)||n.draggable&&d.startsWith("onDrag"))&&(l[d]=n[d]);return l}const Il=j.createContext({});function bA(n,s){if(ql(n)){const{initial:o,animate:l}=n;return{initial:o===!1||ho(o)?o:void 0,animate:ho(l)?l:void 0}}return n.inherit!==!1?s:{}}function xA(n){const{initial:s,animate:o}=bA(n,j.useContext(Il));return j.useMemo(()=>({initial:s,animate:o}),[Eb(s),Eb(o)])}function Eb(n){return Array.isArray(n)?n.join(" "):n}const nm=()=>({style:{},transform:{},transformOrigin:{},vars:{}});function Dw(n,s,o){for(const l in s)!dt(s[l])&&!rw(l,o)&&(n[l]=s[l])}function vA({transformTemplate:n},s){return j.useMemo(()=>{const o=nm();return em(o,s,n),Object.assign({},o.vars,o.style)},[s])}function wA(n,s){const o=n.style||{},l={};return Dw(l,o,n),Object.assign(l,vA(n,s)),l}function jA(n,s){const o={},l=wA(n,s);return n.drag&&n.dragListener!==!1&&(o.draggable=!1,l.userSelect=l.WebkitUserSelect=l.WebkitTouchCallout="none",l.touchAction=n.drag===!0?"none":`pan-${n.drag==="x"?"y":"x"}`),n.tabIndex===void 0&&(n.onTap||n.onTapStart||n.whileTap)&&(o.tabIndex=0),o.style=l,o}const zw=()=>({...nm(),attrs:{}});function kA(n,s,o,l){const d=j.useMemo(()=>{const h=zw();return cw(h,s,uw(l),n.transformTemplate,n.style),{...h.attrs,style:{...h.style}}},[s]);if(n.style){const h={};Dw(h,n.style,n),d.style={...h,...d.style}}return d}const NA=["animate","circle","defs","desc","ellipse","g","image","line","filter","marker","mask","metadata","path","pattern","polygon","polyline","rect","stop","switch","symbol","svg","text","tspan","use","view"];function am(n){return typeof n!="string"||n.includes("-")?!1:!!(NA.indexOf(n)>-1||/[A-Z]/u.test(n))}function TA(n,s,o,{latestValues:l},d,h=!1,m){const f=(m??am(n)?kA:jA)(s,l,d,n),g=yA(s,typeof n=="string",h),b=n!==j.Fragment?{...g,...f,ref:o}:{},{children:x}=s,w=j.useMemo(()=>dt(x)?x.get():x,[x]);return j.createElement(n,{...b,children:w})}function SA({scrapeMotionValuesFromProps:n,createRenderState:s},o,l,d){return{latestValues:AA(o,l,d,n),renderState:s()}}function AA(n,s,o,l){const d={},h=l(n,{});for(const w in h)d[w]=ul(h[w]);let{initial:m,animate:p}=n;const f=ql(n),g=Qv(n);s&&g&&!f&&n.inherit!==!1&&(m===void 0&&(m=s.initial),p===void 0&&(p=s.animate));let b=o?o.initial===!1:!1;b=b||m===!1;const x=b?p:m;if(x&&typeof x!="boolean"&&!Ml(x)){const w=Array.isArray(x)?x:[x];for(let S=0;S<w.length;S++){const T=Kh(n,w[S]);if(T){const{transitionEnd:O,transition:D,...E}=T;for(const P in E){let I=E[P];if(Array.isArray(I)){const F=b?I.length-1:0;I=I[F]}I!==null&&(d[P]=I)}for(const P in O)d[P]=O[P]}}}return d}const Rw=n=>(s,o)=>{const l=j.useContext(Il),d=j.useContext(El),h=()=>SA(n,s,l,d);return o?h():wa(h)},CA=Rw({scrapeMotionValuesFromProps:tm,createRenderState:nm}),OA=Rw({scrapeMotionValuesFromProps:hw,createRenderState:zw}),EA=Symbol.for("motionComponentSymbol");function DA(n,s,o){const l=j.useRef(o);j.useInsertionEffect(()=>{l.current=o});const d=j.useRef(null);return j.useCallback(h=>{h&&n.onMount?.(h),s&&(h?s.mount(h):s.unmount());const m=l.current;if(typeof m=="function")if(h){const p=m(h);typeof p=="function"&&(d.current=p)}else d.current?(d.current(),d.current=null):m(h);else m&&(m.current=h)},[s])}const Mw=j.createContext({});function Zi(n){return n&&typeof n=="object"&&Object.prototype.hasOwnProperty.call(n,"current")}function zA(n,s,o,l,d,h){const{visualElement:m}=j.useContext(Il),p=j.useContext(Cw),f=j.useContext(El),g=j.useContext(Pl).reducedMotion,b=j.useRef(null);l=l||p.renderer,!b.current&&l&&(b.current=l(n,{visualState:s,parent:m,props:o,presenceContext:f,blockInitialAnimation:f?f.initial===!1:!1,reducedMotionConfig:g,isSVG:h}));const x=b.current,w=j.useContext(Mw);x&&!x.projection&&d&&(x.type==="html"||x.type==="svg")&&RA(b.current,o,d,w);const S=j.useRef(!1);j.useInsertionEffect(()=>{x&&S.current&&x.update(o,f)});const T=o[Iv],O=j.useRef(!!T&&!window.MotionHandoffIsComplete?.(T)&&window.MotionHasOptimisedAnimation?.(T));return Ol(()=>{x&&(S.current=!0,window.MotionIsMounted=!0,x.updateFeatures(),x.scheduleRenderMicrotask(),O.current&&x.animationState&&x.animationState.animateChanges())}),j.useEffect(()=>{x&&(!O.current&&x.animationState&&x.animationState.animateChanges(),O.current&&(queueMicrotask(()=>{window.MotionHandoffMarkAsComplete?.(T)}),O.current=!1),x.enteringChildren=void 0)}),x}function RA(n,s,o,l){const{layoutId:d,layout:h,drag:m,dragConstraints:p,layoutScroll:f,layoutRoot:g,layoutCrossfade:b}=s;n.projection=new o(n.latestValues,s["data-framer-portal-id"]?void 0:qw(n.parent)),n.projection.setOptions({layoutId:d,layout:h,alwaysMeasureLayout:!!m||p&&Zi(p),visualElement:n,animationType:typeof h=="string"?h:"both",initialPromotionConfig:l,crossfade:b,layoutScroll:f,layoutRoot:g})}function qw(n){if(n)return n.options.allowProjection!==!1?n.projection:qw(n.parent)}function ju(n,{forwardMotionProps:s=!1,type:o}={},l,d){l&&pA(l);const h=o?o==="svg":am(n),m=h?OA:CA;function p(g,b){let x;const w={...j.useContext(Pl),...g,layoutId:MA(g)},{isStatic:S}=w,T=xA(g),O=m(g,S);if(!S&&$x){qA();const D=PA(w);x=D.MeasureLayout,T.visualElement=zA(n,O,w,d,D.ProjectionNode,h)}return a.jsxs(Il.Provider,{value:T,children:[x&&T.visualElement?a.jsx(x,{visualElement:T.visualElement,...w}):null,TA(n,g,DA(O,T.visualElement,b),O,S,s,h)]})}p.displayName=`motion.${typeof n=="string"?n:`create(${n.displayName??n.name??""})`}`;const f=j.forwardRef(p);return f[EA]=n,f}function MA({layoutId:n}){const s=j.useContext(Nh).id;return s&&n!==void 0?s+"-"+n:n}function qA(n,s){j.useContext(Cw).strict}function PA(n){const s=Ow(),{drag:o,layout:l}=s;if(!o&&!l)return{};const d={...o,...l};return{MeasureLayout:o?.isEnabled(n)||l?.isEnabled(n)?d.MeasureLayout:void 0,ProjectionNode:d.ProjectionNode}}function IA(n,s){if(typeof Proxy>"u")return ju;const o=new Map,l=(h,m)=>ju(h,m,n,s),d=(h,m)=>l(h,m);return new Proxy(d,{get:(h,m)=>m==="create"?l:(o.has(m)||o.set(m,ju(m,void 0,n,s)),o.get(m))})}const UA=(n,s)=>s.isSVG??am(n)?new mw(s):new lw(s,{allowProjection:n!==j.Fragment});class BA extends Na{constructor(s){super(s),s.animationState||(s.animationState=jS(s))}updateAnimationControlsSubscription(){const{animate:s}=this.node.getProps();Ml(s)&&(this.unmountControls=s.subscribe(this.node))}mount(){this.updateAnimationControlsSubscription()}update(){const{animate:s}=this.node.getProps(),{animate:o}=this.node.prevProps||{};s!==o&&this.updateAnimationControlsSubscription()}unmount(){this.node.animationState.reset(),this.unmountControls?.()}}let _A=0;class VA extends Na{constructor(){super(...arguments),this.id=_A++}update(){if(!this.node.presenceContext)return;const{isPresent:s,onExitComplete:o}=this.node.presenceContext,{isPresent:l}=this.node.prevPresenceContext||{};if(!this.node.animationState||s===l)return;const d=this.node.animationState.setActive("exit",!s);o&&!s&&d.then(()=>{o(this.id)})}mount(){const{register:s,onExitComplete:o}=this.node.presenceContext||{};o&&o(this.id),s&&(this.unmount=s(this.id))}unmount(){}}const LA={animation:{Feature:BA},exit:{Feature:VA}};function vo(n){return{point:{x:n.pageX,y:n.pageY}}}const GA=n=>s=>Jh(s)&&n(s,vo(s));function so(n,s,o,l){return mo(n,s,GA(o),l)}const Pw=({current:n})=>n?n.ownerDocument.defaultView:null,Db=(n,s)=>Math.abs(n-s);function HA(n,s){const o=Db(n.x,s.x),l=Db(n.y,s.y);return Math.sqrt(o**2+l**2)}const zb=new Set(["auto","scroll"]);class Iw{constructor(s,o,{transformPagePoint:l,contextWindow:d=window,dragSnapToOrigin:h=!1,distanceThreshold:m=3,element:p}={}){if(this.startEvent=null,this.lastMoveEvent=null,this.lastMoveEventInfo=null,this.handlers={},this.contextWindow=window,this.scrollPositions=new Map,this.removeScrollListeners=null,this.onElementScroll=S=>{this.handleScroll(S.target)},this.onWindowScroll=()=>{this.handleScroll(window)},this.updatePoint=()=>{if(!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const S=Nu(this.lastMoveEventInfo,this.history),T=this.startEvent!==null,O=HA(S.offset,{x:0,y:0})>=this.distanceThreshold;if(!T&&!O)return;const{point:D}=S,{timestamp:E}=ct;this.history.push({...D,timestamp:E});const{onStart:P,onMove:I}=this.handlers;T||(P&&P(this.lastMoveEvent,S),this.startEvent=this.lastMoveEvent),I&&I(this.lastMoveEvent,S)},this.handlePointerMove=(S,T)=>{this.lastMoveEvent=S,this.lastMoveEventInfo=ku(T,this.transformPagePoint),Ee.update(this.updatePoint,!0)},this.handlePointerUp=(S,T)=>{this.end();const{onEnd:O,onSessionEnd:D,resumeAnimation:E}=this.handlers;if((this.dragSnapToOrigin||!this.startEvent)&&E&&E(),!(this.lastMoveEvent&&this.lastMoveEventInfo))return;const P=Nu(S.type==="pointercancel"?this.lastMoveEventInfo:ku(T,this.transformPagePoint),this.history);this.startEvent&&O&&O(S,P),D&&D(S,P)},!Jh(s))return;this.dragSnapToOrigin=h,this.handlers=o,this.transformPagePoint=l,this.distanceThreshold=m,this.contextWindow=d||window;const f=vo(s),g=ku(f,this.transformPagePoint),{point:b}=g,{timestamp:x}=ct;this.history=[{...b,timestamp:x}];const{onSessionStart:w}=o;w&&w(s,Nu(g,this.history)),this.removeListeners=yo(so(this.contextWindow,"pointermove",this.handlePointerMove),so(this.contextWindow,"pointerup",this.handlePointerUp),so(this.contextWindow,"pointercancel",this.handlePointerUp)),p&&this.startScrollTracking(p)}startScrollTracking(s){let o=s.parentElement;for(;o;){const l=getComputedStyle(o);(zb.has(l.overflowX)||zb.has(l.overflowY))&&this.scrollPositions.set(o,{x:o.scrollLeft,y:o.scrollTop}),o=o.parentElement}this.scrollPositions.set(window,{x:window.scrollX,y:window.scrollY}),window.addEventListener("scroll",this.onElementScroll,{capture:!0,passive:!0}),window.addEventListener("scroll",this.onWindowScroll,{passive:!0}),this.removeScrollListeners=()=>{window.removeEventListener("scroll",this.onElementScroll,{capture:!0}),window.removeEventListener("scroll",this.onWindowScroll)}}handleScroll(s){const o=this.scrollPositions.get(s);if(!o)return;const l=s===window,d=l?{x:window.scrollX,y:window.scrollY}:{x:s.scrollLeft,y:s.scrollTop},h={x:d.x-o.x,y:d.y-o.y};h.x===0&&h.y===0||(l?this.lastMoveEventInfo&&(this.lastMoveEventInfo.point.x+=h.x,this.lastMoveEventInfo.point.y+=h.y):this.history.length>0&&(this.history[0].x-=h.x,this.history[0].y-=h.y),this.scrollPositions.set(s,d),Ee.update(this.updatePoint,!0))}updateHandlers(s){this.handlers=s}end(){this.removeListeners&&this.removeListeners(),this.removeScrollListeners&&this.removeScrollListeners(),this.scrollPositions.clear(),pn(this.updatePoint)}}function ku(n,s){return s?{point:s(n.point)}:n}function Rb(n,s){return{x:n.x-s.x,y:n.y-s.y}}function Nu({point:n},s){return{point:n,delta:Rb(n,Uw(s)),offset:Rb(n,KA(s)),velocity:FA(s,.1)}}function KA(n){return n[0]}function Uw(n){return n[n.length-1]}function FA(n,s){if(n.length<2)return{x:0,y:0};let o=n.length-1,l=null;const d=Uw(n);for(;o>=0&&(l=n[o],!(d.timestamp-l.timestamp>kn(s)));)o--;if(!l)return{x:0,y:0};const h=sn(d.timestamp-l.timestamp);if(h===0)return{x:0,y:0};const m={x:(d.x-l.x)/h,y:(d.y-l.y)/h};return m.x===1/0&&(m.x=0),m.y===1/0&&(m.y=0),m}function WA(n,{min:s,max:o},l){return s!==void 0&&n<s?n=l?He(s,n,l.min):Math.max(n,s):o!==void 0&&n>o&&(n=l?He(o,n,l.max):Math.min(n,o)),n}function Mb(n,s,o){return{min:s!==void 0?n.min+s:void 0,max:o!==void 0?n.max+o-(n.max-n.min):void 0}}function YA(n,{top:s,left:o,bottom:l,right:d}){return{x:Mb(n.x,o,d),y:Mb(n.y,s,l)}}function qb(n,s){let o=s.min-n.min,l=s.max-n.max;return s.max-s.min<n.max-n.min&&([o,l]=[l,o]),{min:o,max:l}}function XA(n,s){return{x:qb(n.x,s.x),y:qb(n.y,s.y)}}function JA(n,s){let o=.5;const l=kt(n),d=kt(s);return d>l?o=Xa(s.min,s.max-l,n.min):l>d&&(o=Xa(n.min,n.max-d,s.min)),mn(0,1,o)}function $A(n,s){const o={};return s.min!==void 0&&(o.min=s.min-n.min),s.max!==void 0&&(o.max=s.max-n.min),o}const hh=.35;function QA(n=hh){return n===!1?n=0:n===!0&&(n=hh),{x:Pb(n,"left","right"),y:Pb(n,"top","bottom")}}function Pb(n,s,o){return{min:Ib(n,s),max:Ib(n,o)}}function Ib(n,s){return typeof n=="number"?n:n[s]||0}const ZA=new WeakMap;class eC{constructor(s){this.openDragLock=null,this.isDragging=!1,this.currentDirection=null,this.originPoint={x:0,y:0},this.constraints=!1,this.hasMutatedConstraints=!1,this.elastic=st(),this.latestPointerEvent=null,this.latestPanInfo=null,this.visualElement=s}start(s,{snapToCursor:o=!1,distanceThreshold:l}={}){const{presenceContext:d}=this.visualElement;if(d&&d.isPresent===!1)return;const h=x=>{o?(this.stopAnimation(),this.snapToCursor(vo(x).point)):this.pauseAnimation()},m=(x,w)=>{this.stopAnimation();const{drag:S,dragPropagation:T,onDragStart:O}=this.getProps();if(S&&!T&&(this.openDragLock&&this.openDragLock(),this.openDragLock=PT(S),!this.openDragLock))return;this.latestPointerEvent=x,this.latestPanInfo=w,this.isDragging=!0,this.currentDirection=null,this.resolveConstraints(),this.visualElement.projection&&(this.visualElement.projection.isAnimationBlocked=!0,this.visualElement.projection.target=void 0),an(E=>{let P=this.getAxisMotionValue(E).get()||0;if(Nn.test(P)){const{projection:I}=this.visualElement;if(I&&I.layout){const F=I.layout.layoutBox[E];F&&(P=kt(F)*(parseFloat(P)/100))}}this.originPoint[E]=P}),O&&Ee.postRender(()=>O(x,w)),oh(this.visualElement,"transform");const{animationState:D}=this.visualElement;D&&D.setActive("whileDrag",!0)},p=(x,w)=>{this.latestPointerEvent=x,this.latestPanInfo=w;const{dragPropagation:S,dragDirectionLock:T,onDirectionLock:O,onDrag:D}=this.getProps();if(!S&&!this.openDragLock)return;const{offset:E}=w;if(T&&this.currentDirection===null){this.currentDirection=tC(E),this.currentDirection!==null&&O&&O(this.currentDirection);return}this.updateAxis("x",w.point,E),this.updateAxis("y",w.point,E),this.visualElement.render(),D&&D(x,w)},f=(x,w)=>{this.latestPointerEvent=x,this.latestPanInfo=w,this.stop(x,w),this.latestPointerEvent=null,this.latestPanInfo=null},g=()=>an(x=>this.getAnimationState(x)==="paused"&&this.getAxisMotionValue(x).animation?.play()),{dragSnapToOrigin:b}=this.getProps();this.panSession=new Iw(s,{onSessionStart:h,onStart:m,onMove:p,onSessionEnd:f,resumeAnimation:g},{transformPagePoint:this.visualElement.getTransformPagePoint(),dragSnapToOrigin:b,distanceThreshold:l,contextWindow:Pw(this.visualElement),element:this.visualElement.current})}stop(s,o){const l=s||this.latestPointerEvent,d=o||this.latestPanInfo,h=this.isDragging;if(this.cancel(),!h||!d||!l)return;const{velocity:m}=d;this.startAnimation(m);const{onDragEnd:p}=this.getProps();p&&Ee.postRender(()=>p(l,d))}cancel(){this.isDragging=!1;const{projection:s,animationState:o}=this.visualElement;s&&(s.isAnimationBlocked=!1),this.endPanSession();const{dragPropagation:l}=this.getProps();!l&&this.openDragLock&&(this.openDragLock(),this.openDragLock=null),o&&o.setActive("whileDrag",!1)}endPanSession(){this.panSession&&this.panSession.end(),this.panSession=void 0}updateAxis(s,o,l){const{drag:d}=this.getProps();if(!l||!Kr(s,d,this.currentDirection))return;const h=this.getAxisMotionValue(s);let m=this.originPoint[s]+l[s];this.constraints&&this.constraints[s]&&(m=WA(m,this.constraints[s],this.elastic[s])),h.set(m)}resolveConstraints(){const{dragConstraints:s,dragElastic:o}=this.getProps(),l=this.visualElement.projection&&!this.visualElement.projection.layout?this.visualElement.projection.measure(!1):this.visualElement.projection?.layout,d=this.constraints;s&&Zi(s)?this.constraints||(this.constraints=this.resolveRefConstraints()):s&&l?this.constraints=YA(l.layoutBox,s):this.constraints=!1,this.elastic=QA(o),d!==this.constraints&&l&&this.constraints&&!this.hasMutatedConstraints&&an(h=>{this.constraints!==!1&&this.getAxisMotionValue(h)&&(this.constraints[h]=$A(l.layoutBox[h],this.constraints[h]))})}resolveRefConstraints(){const{dragConstraints:s,onMeasureDragConstraints:o}=this.getProps();if(!s||!Zi(s))return!1;const l=s.current,{projection:d}=this.visualElement;if(!d||!d.layout)return!1;const h=iS(l,d.root,this.visualElement.getTransformPagePoint());let m=XA(d.layout.layoutBox,h);if(o){const p=o(nS(m));this.hasMutatedConstraints=!!p,p&&(m=nw(p))}return m}startAnimation(s){const{drag:o,dragMomentum:l,dragElastic:d,dragTransition:h,dragSnapToOrigin:m,onDragTransitionEnd:p}=this.getProps(),f=this.constraints||{},g=an(b=>{if(!Kr(b,o,this.currentDirection))return;let x=f&&f[b]||{};m&&(x={min:0,max:0});const w=d?200:1e6,S=d?40:1e7,T={type:"inertia",velocity:l?s[b]:0,bounceStiffness:w,bounceDamping:S,timeConstant:750,restDelta:1,restSpeed:10,...h,...x};return this.startAxisValueAnimation(b,T)});return Promise.all(g).then(p)}startAxisValueAnimation(s,o){const l=this.getAxisMotionValue(s);return oh(this.visualElement,s),l.start(Hh(s,l,0,o,this.visualElement,!1))}stopAnimation(){an(s=>this.getAxisMotionValue(s).stop())}pauseAnimation(){an(s=>this.getAxisMotionValue(s).animation?.pause())}getAnimationState(s){return this.getAxisMotionValue(s).animation?.state}getAxisMotionValue(s){const o=`_drag${s.toUpperCase()}`,l=this.visualElement.getProps(),d=l[o];return d||this.visualElement.getValue(s,(l.initial?l.initial[s]:void 0)||0)}snapToCursor(s){an(o=>{const{drag:l}=this.getProps();if(!Kr(o,l,this.currentDirection))return;const{projection:d}=this.visualElement,h=this.getAxisMotionValue(o);if(d&&d.layout){const{min:m,max:p}=d.layout.layoutBox[o],f=h.get()||0;h.set(s[o]-He(m,p,.5)+f)}})}scalePositionWithinConstraints(){if(!this.visualElement.current)return;const{drag:s,dragConstraints:o}=this.getProps(),{projection:l}=this.visualElement;if(!Zi(o)||!l||!this.constraints)return;this.stopAnimation();const d={x:0,y:0};an(m=>{const p=this.getAxisMotionValue(m);if(p&&this.constraints!==!1){const f=p.get();d[m]=JA({min:f,max:f},this.constraints[m])}});const{transformTemplate:h}=this.visualElement.getProps();this.visualElement.current.style.transform=h?h({},""):"none",l.root&&l.root.updateScroll(),l.updateLayout(),this.resolveConstraints(),an(m=>{if(!Kr(m,s,null))return;const p=this.getAxisMotionValue(m),{min:f,max:g}=this.constraints[m];p.set(He(f,g,d[m]))})}addListeners(){if(!this.visualElement.current)return;ZA.set(this.visualElement,this);const s=this.visualElement.current,o=so(s,"pointerdown",f=>{const{drag:g,dragListener:b=!0}=this.getProps(),x=f.target,w=x!==s&&Wv(x);g&&b&&!w&&this.start(f)}),l=()=>{const{dragConstraints:f}=this.getProps();Zi(f)&&f.current&&(this.constraints=this.resolveRefConstraints())},{projection:d}=this.visualElement,h=d.addEventListener("measure",l);d&&!d.layout&&(d.root&&d.root.updateScroll(),d.updateLayout()),Ee.read(l);const m=mo(window,"resize",()=>this.scalePositionWithinConstraints()),p=d.addEventListener("didUpdate",(({delta:f,hasLayoutChanged:g})=>{this.isDragging&&g&&(an(b=>{const x=this.getAxisMotionValue(b);x&&(this.originPoint[b]+=f[b].translate,x.set(x.get()+f[b].translate))}),this.visualElement.render())}));return()=>{m(),o(),h(),p&&p()}}getProps(){const s=this.visualElement.getProps(),{drag:o=!1,dragDirectionLock:l=!1,dragPropagation:d=!1,dragConstraints:h=!1,dragElastic:m=hh,dragMomentum:p=!0}=s;return{...s,drag:o,dragDirectionLock:l,dragPropagation:d,dragConstraints:h,dragElastic:m,dragMomentum:p}}}function Kr(n,s,o){return(s===!0||s===n)&&(o===null||o===n)}function tC(n,s=10){let o=null;return Math.abs(n.y)>s?o="y":Math.abs(n.x)>s&&(o="x"),o}class nC extends Na{constructor(s){super(s),this.removeGroupControls=Dt,this.removeListeners=Dt,this.controls=new eC(s)}mount(){const{dragControls:s}=this.node.getProps();s&&(this.removeGroupControls=s.subscribe(this.controls)),this.removeListeners=this.controls.addListeners()||Dt}update(){const{dragControls:s}=this.node.getProps(),{dragControls:o}=this.node.prevProps||{};s!==o&&(this.removeGroupControls(),s&&(this.removeGroupControls=s.subscribe(this.controls)))}unmount(){this.removeGroupControls(),this.removeListeners(),this.controls.endPanSession()}}const Ub=n=>(s,o)=>{n&&Ee.postRender(()=>n(s,o))};class aC extends Na{constructor(){super(...arguments),this.removePointerDownListener=Dt}onPointerDown(s){this.session=new Iw(s,this.createPanHandlers(),{transformPagePoint:this.node.getTransformPagePoint(),contextWindow:Pw(this.node)})}createPanHandlers(){const{onPanSessionStart:s,onPanStart:o,onPan:l,onPanEnd:d}=this.node.getProps();return{onSessionStart:Ub(s),onStart:Ub(o),onMove:l,onEnd:(h,m)=>{delete this.session,d&&Ee.postRender(()=>d(h,m))}}}mount(){this.removePointerDownListener=so(this.node.current,"pointerdown",s=>this.onPointerDown(s))}update(){this.session&&this.session.updateHandlers(this.createPanHandlers())}unmount(){this.removePointerDownListener(),this.session&&this.session.end()}}let Tu=!1;class sC extends j.Component{componentDidMount(){const{visualElement:s,layoutGroup:o,switchLayoutGroup:l,layoutId:d}=this.props,{projection:h}=s;h&&(o.group&&o.group.add(h),l&&l.register&&d&&l.register(h),Tu&&h.root.didUpdate(),h.addEventListener("animationComplete",()=>{this.safeToRemove()}),h.setOptions({...h.options,onExitComplete:()=>this.safeToRemove()})),hl.hasEverUpdated=!0}getSnapshotBeforeUpdate(s){const{layoutDependency:o,visualElement:l,drag:d,isPresent:h}=this.props,{projection:m}=l;return m&&(m.isPresent=h,Tu=!0,d||s.layoutDependency!==o||o===void 0||s.isPresent!==h?m.willUpdate():this.safeToRemove(),s.isPresent!==h&&(h?m.promote():m.relegate()||Ee.postRender(()=>{const p=m.getStack();(!p||!p.members.length)&&this.safeToRemove()}))),null}componentDidUpdate(){const{projection:s}=this.props.visualElement;s&&(s.root.didUpdate(),Xh.postRender(()=>{!s.currentAnimation&&s.isLead()&&this.safeToRemove()}))}componentWillUnmount(){const{visualElement:s,layoutGroup:o,switchLayoutGroup:l}=this.props,{projection:d}=s;Tu=!0,d&&(d.scheduleCheckAfterUnmount(),o&&o.group&&o.group.remove(d),l&&l.deregister&&l.deregister(d))}safeToRemove(){const{safeToRemove:s}=this.props;s&&s()}render(){return null}}function Bw(n){const[s,o]=Aw(),l=j.useContext(Nh);return a.jsx(sC,{...n,layoutGroup:l,switchLayoutGroup:j.useContext(Mw),isPresent:s,safeToRemove:o})}const iC={pan:{Feature:aC},drag:{Feature:nC,ProjectionNode:Sw,MeasureLayout:Bw}};function Bb(n,s,o){const{props:l}=n;n.animationState&&l.whileHover&&n.animationState.setActive("whileHover",o==="Start");const d="onHover"+o,h=l[d];h&&Ee.postRender(()=>h(s,vo(s)))}class oC extends Na{mount(){const{current:s}=this.node;s&&(this.unmount=IT(s,(o,l)=>(Bb(this.node,l,"Start"),d=>Bb(this.node,d,"End"))))}unmount(){}}class rC extends Na{constructor(){super(...arguments),this.isActive=!1}onFocus(){let s=!1;try{s=this.node.current.matches(":focus-visible")}catch{s=!0}!s||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!0),this.isActive=!0)}onBlur(){!this.isActive||!this.node.animationState||(this.node.animationState.setActive("whileFocus",!1),this.isActive=!1)}mount(){this.unmount=yo(mo(this.node.current,"focus",()=>this.onFocus()),mo(this.node.current,"blur",()=>this.onBlur()))}unmount(){}}function _b(n,s,o){const{props:l}=n;if(n.current instanceof HTMLButtonElement&&n.current.disabled)return;n.animationState&&l.whileTap&&n.animationState.setActive("whileTap",o==="Start");const d="onTap"+(o==="End"?"":o),h=l[d];h&&Ee.postRender(()=>h(s,vo(s)))}class lC extends Na{mount(){const{current:s}=this.node;s&&(this.unmount=_T(s,(o,l)=>(_b(this.node,l,"Start"),(d,{success:h})=>_b(this.node,d,h?"End":"Cancel")),{useGlobalTarget:this.node.props.globalTapTarget}))}unmount(){}}const mh=new WeakMap,Su=new WeakMap,cC=n=>{const s=mh.get(n.target);s&&s(n)},dC=n=>{n.forEach(cC)};function uC({root:n,...s}){const o=n||document;Su.has(o)||Su.set(o,{});const l=Su.get(o),d=JSON.stringify(s);return l[d]||(l[d]=new IntersectionObserver(dC,{root:n,...s})),l[d]}function hC(n,s,o){const l=uC(s);return mh.set(n,o),l.observe(n),()=>{mh.delete(n),l.unobserve(n)}}const mC={some:0,all:1};class pC extends Na{constructor(){super(...arguments),this.hasEnteredView=!1,this.isInView=!1}startObserver(){this.unmount();const{viewport:s={}}=this.node.getProps(),{root:o,margin:l,amount:d="some",once:h}=s,m={root:o?o.current:void 0,rootMargin:l,threshold:typeof d=="number"?d:mC[d]},p=f=>{const{isIntersecting:g}=f;if(this.isInView===g||(this.isInView=g,h&&!g&&this.hasEnteredView))return;g&&(this.hasEnteredView=!0),this.node.animationState&&this.node.animationState.setActive("whileInView",g);const{onViewportEnter:b,onViewportLeave:x}=this.node.getProps(),w=g?b:x;w&&w(f)};return hC(this.node.current,m,p)}mount(){this.startObserver()}update(){if(typeof IntersectionObserver>"u")return;const{props:s,prevProps:o}=this.node;["amount","margin","root"].some(fC(s,o))&&this.startObserver()}unmount(){}}function fC({viewport:n={}},{viewport:s={}}={}){return o=>n[o]!==s[o]}const gC={inView:{Feature:pC},tap:{Feature:lC},focus:{Feature:rC},hover:{Feature:oC}},yC={layout:{ProjectionNode:Sw,MeasureLayout:Bw}},bC={...LA,...gC,...iC,...yC},se=IA(bC,UA),xC=50,Vb=()=>({current:0,offset:[],progress:0,scrollLength:0,targetOffset:0,targetLength:0,containerLength:0,velocity:0}),vC=()=>({time:0,x:Vb(),y:Vb()}),wC={x:{length:"Width",position:"Left"},y:{length:"Height",position:"Top"}};
19function Lb(n,s,o,l){const d=o[s],{length:h,position:m}=wC[s],p=d.current,f=o.time;d.current=n[`scroll${m}`],d.scrollLength=n[`scroll${h}`]-n[`client${h}`],d.offset.length=0,d.offset[0]=0,d.offset[1]=d.scrollLength,d.progress=Xa(0,d.scrollLength,d.current);const g=l-f;d.velocity=g>xC?0:Ch(d.current-p,g)}function jC(n,s,o){Lb(n,"x",s,o),Lb(n,"y",s,o),s.time=o}function kC(n,s){const o={x:0,y:0};let l=n;for(;l&&l!==s;)if(bl(l))o.x+=l.offsetLeft,o.y+=l.offsetTop,l=l.offsetParent;else if(l.tagName==="svg"){const d=l.getBoundingClientRect();l=l.parentElement;const h=l.getBoundingClientRect();o.x+=d.left-h.left,o.y+=d.top-h.top}else if(l instanceof SVGGraphicsElement){const{x:d,y:h}=l.getBBox();o.x+=d,o.y+=h;let m=null,p=l.parentNode;for(;!m;)p.tagName==="svg"&&(m=p),p=l.parentNode;l=m}else break;return o}const ph={start:0,center:.5,end:1};function Gb(n,s,o=0){let l=0;if(n in ph&&(n=ph[n]),typeof n=="string"){const d=parseFloat(n);n.endsWith("px")?l=d:n.endsWith("%")?n=d/100:n.endsWith("vw")?l=d/100*document.documentElement.clientWidth:n.endsWith("vh")?l=d/100*document.documentElement.clientHeight:n=d}return typeof n=="number"&&(l=s*n),o+l}const NC=[0,0];function TC(n,s,o,l){let d=Array.isArray(n)?n:NC,h=0,m=0;return typeof n=="number"?d=[n,n]:typeof n=="string"&&(n=n.trim(),n.includes(" ")?d=n.split(" "):d=[n,ph[n]?n:"0"]),h=Gb(d[0],o,l),m=Gb(d[1],s),h-m}const SC={All:[[0,0],[1,1]]},AC={x:0,y:0};function CC(n){return"getBBox"in n&&n.tagName!=="svg"?n.getBBox():{width:n.clientWidth,height:n.clientHeight}}function OC(n,s,o){const{offset:l=SC.All}=o,{target:d=n,axis:h="y"}=o,m=h==="y"?"height":"width",p=d!==n?kC(d,n):AC,f=d===n?{width:n.scrollWidth,height:n.scrollHeight}:CC(d),g={width:n.clientWidth,height:n.clientHeight};s[h].offset.length=0;let b=!s[h].interpolate;const x=l.length;for(let w=0;w<x;w++){const S=TC(l[w],g[m],f[m],p[h]);!b&&S!==s[h].interpolatorOffsets[w]&&(b=!0),s[h].offset[w]=S}b&&(s[h].interpolate=Ph(s[h].offset,Ih(l),{clamp:!1}),s[h].interpolatorOffsets=[...s[h].offset]),s[h].progress=mn(0,1,s[h].interpolate(s[h].current))}function EC(n,s=n,o){if(o.x.targetOffset=0,o.y.targetOffset=0,s!==n){let l=s;for(;l&&l!==n;)o.x.targetOffset+=l.offsetLeft,o.y.targetOffset+=l.offsetTop,l=l.offsetParent}o.x.targetLength=s===n?s.scrollWidth:s.clientWidth,o.y.targetLength=s===n?s.scrollHeight:s.clientHeight,o.x.containerLength=n.clientWidth,o.y.containerLength=n.clientHeight}function DC(n,s,o,l={}){return{measure:d=>{EC(n,l.target,o),jC(n,o,d),(l.offset||l.target)&&OC(n,o,l)},notify:()=>s(o)}}const Wi=new WeakMap,Hb=new WeakMap,Au=new WeakMap,Kb=n=>n===document.scrollingElement?window:n;function _w(n,{container:s=document.scrollingElement,...o}={}){if(!s)return Dt;let l=Au.get(s);l||(l=new Set,Au.set(s,l));const d=vC(),h=DC(s,n,d,o);if(l.add(h),!Wi.has(s)){const p=()=>{for(const x of l)x.measure(ct.timestamp);Ee.preUpdate(f)},f=()=>{for(const x of l)x.notify()},g=()=>Ee.read(p);Wi.set(s,g);const b=Kb(s);window.addEventListener("resize",g,{passive:!0}),s!==document.documentElement&&Hb.set(s,XT(s,g)),b.addEventListener("scroll",g,{passive:!0}),g()}const m=Wi.get(s);return Ee.read(m,!1,!0),()=>{pn(m);const p=Au.get(s);if(!p||(p.delete(h),p.size))return;const f=Wi.get(s);Wi.delete(s),f&&(Kb(s).removeEventListener("scroll",f),Hb.get(s)?.(),window.removeEventListener("resize",f))}}const Fb=new Map;function zC(n){const s={value:0},o=_w(l=>{s.value=l[n.axis].progress*100},n);return{currentTime:s,cancel:o}}function Vw({source:n,container:s,...o}){const{axis:l}=o;n&&(s=n);const d=Fb.get(s)??new Map;Fb.set(s,d);const h=o.target??"self",m=d.get(h)??{},p=l+(o.offset??[]).join(",");return m[p]||(m[p]=!o.target&&Ev()?new ScrollTimeline({source:s,axis:l}):zC({container:s,...o})),m[p]}function RC(n,s){const o=Vw(s);return n.attachTimeline({timeline:s.target?void 0:o,observe:l=>(l.pause(),Xv(d=>{l.time=l.iterationDuration*d},o))})}function MC(n){return n.length===2}function qC(n,s){return MC(n)?_w(o=>{n(o[s.axis].progress,o)},s):Xv(n,Vw(s))}function PC(n,{axis:s="y",container:o=document.scrollingElement,...l}={}){if(!o)return Dt;const d={axis:s,container:o,...l};return typeof n=="function"?qC(n,d):RC(n,d)}const IC=()=>({scrollX:hn(0),scrollY:hn(0),scrollXProgress:hn(0),scrollYProgress:hn(0)}),Fr=n=>n?!n.current:!1;function Lw({container:n,target:s,...o}={}){const l=wa(IC),d=j.useRef(null),h=j.useRef(!1),m=j.useCallback(()=>(d.current=PC((p,{x:f,y:g})=>{l.scrollX.set(f.current),l.scrollXProgress.set(f.progress),l.scrollY.set(g.current),l.scrollYProgress.set(g.progress)},{...o,container:n?.current||void 0,target:s?.current||void 0}),()=>{d.current?.()}),[n,s,JSON.stringify(o.offset)]);return Ol(()=>{if(h.current=!1,Fr(n)||Fr(s)){h.current=!0;return}else return m()},[m]),j.useEffect(()=>{if(h.current)return oo(!Fr(n)),oo(!Fr(s)),m()},[m]),l}function UC(n){const s=wa(()=>hn(n)),{isStatic:o}=j.useContext(Pl);if(o){const[,l]=j.useState(n);j.useEffect(()=>s.on("change",l),[])}return s}function Gw(n,s){const o=UC(s()),l=()=>o.set(s());return l(),Ol(()=>{const d=()=>Ee.preRender(l,!1,!0),h=n.map(m=>m.on("change",d));return()=>{h.forEach(m=>m()),pn(l)}}),o}function BC(n){no.current=[],n();const s=Gw(no.current,n);return no.current=void 0,s}function ml(n,s,o,l){if(typeof n=="function")return BC(n);if(o!==void 0&&!Array.isArray(o)&&typeof s!="function")return _C(n,s,o,l);const m=typeof s=="function"?s:JT(s,o,l);return Array.isArray(n)?Wb(n,m):Wb([n],([p])=>m(p))}function Wb(n,s){const o=wa(()=>[]);return Gw(n,()=>{o.length=0;const l=n.length;for(let d=0;d<l;d++)o[d]=n[d].get();return s(o)})}function _C(n,s,o,l){const d=wa(()=>Object.keys(o)),h=wa(()=>({}));for(const m of d)h[m]=ml(n,s,o[m],l);return h}
19function yn(){!$h.current&&$v();const[n]=j.useState(xl.current);return n}function sm(n){return typeof n=="object"&&!Array.isArray(n)}function Hw(n,s,o,l){return n==null?[]:typeof n=="string"&&sm(s)?zl(n,o,l):n instanceof NodeList?Array.from(n):Array.isArray(n)?n.filter(d=>d!=null):[n]}function VC(n,s,o){return n*(s+1)}function Yb(n,s,o,l){return typeof s=="number"?s:s.startsWith("-")||s.startsWith("+")?Math.max(0,n+parseFloat(s)):s==="<"?o:s.startsWith("<")?Math.max(0,o+parseFloat(s.slice(1))):l.get(s)??n}function LC(n,s,o){for(let l=0;l<n.length;l++){const d=n[l];d.at>s&&d.at<o&&(Dl(n,d),l--)}}function GC(n,s,o,l,d,h){LC(n,d,h);for(let m=0;m<s.length;m++)n.push({value:s[m],at:He(d,h,l[m]),easing:uv(o,m)})}function HC(n,s){for(let o=0;o<n.length;o++)n[o]=n[o]/(s+1)}function KC(n,s){return n.at===s.at?n.value===null?1:s.value===null?-1:0:n.at-s.at}const FC="easeInOut";function WC(n,{defaultTransition:s={},...o}={},l,d){const h=s.duration||.3,m=new Map,p=new Map,f={},g=new Map;let b=0,x=0,w=0;for(let S=0;S<n.length;S++){const T=n[S];if(typeof T=="string"){g.set(T,x);continue}else if(!Array.isArray(T)){g.set(T.name,Yb(x,T.at,b,g));continue}let[O,D,E={}]=T;E.at!==void 0&&(x=Yb(x,E.at,b,g));let P=0;const I=(F,W,Z,X=0,J=0)=>{const Q=YC(F),{delay:ue=0,times:fe=Ih(Q),type:je=s.type||"keyframes",repeat:Re,repeatType:Ie,repeatDelay:Xe=0,...B}=W;let{ease:V=s.ease||"easeOut",duration:$}=W;const oe=typeof ue=="function"?ue(X,J):ue,L=Q.length,k=Lh(je)?je:d?.[je||"keyframes"];if(L<=2&&k){let ee=100;if(L===2&&$C(Q)){const Ne=Q[1]-Q[0];ee=Math.abs(Ne)}const le={...s,...B};$!==void 0&&(le.duration=kn($));const de=Nv(le,ee,k);V=de.ease,$=de.duration}$??($=h);const q=x+oe;fe.length===1&&fe[0]===0&&(fe[1]=1);const H=fe.length-Q.length;if(H>0&&Sv(fe,H),Q.length===1&&Q.unshift(null),Re){$=VC($,Re);const ee=[...Q],le=[...fe];V=Array.isArray(V)?[...V]:[V];const de=[...V];for(let Ne=0;Ne<Re;Ne++){Q.push(...ee);for(let ke=0;ke<ee.length;ke++)fe.push(le[ke]+(Ne+1)),V.push(ke===0?"linear":uv(de,ke-1))}HC(fe,Re)}const Y=q+$;GC(Z,Q,V,fe,q,Y),P=Math.max(oe+$,P),w=Math.max(Y,w)};if(dt(O)){const F=Xb(O,p);I(D,E,Jb("default",F))}else{const F=Hw(O,D,l,f),W=F.length;for(let Z=0;Z<W;Z++){D=D,E=E;const X=F[Z],J=Xb(X,p);for(const Q in D)I(D[Q],XC(E,Q),Jb(Q,J),Z,W)}}b=x,x+=P}return p.forEach((S,T)=>{for(const O in S){const D=S[O];D.sort(KC);const E=[],P=[],I=[];for(let X=0;X<D.length;X++){const{at:J,value:Q,easing:ue}=D[X];E.push(Q),P.push(Xa(0,w,J)),I.push(ue||"easeOut")}P[0]!==0&&(P.unshift(0),E.unshift(E[0]),I.unshift(FC)),P[P.length-1]!==1&&(P.push(1),E.push(null)),m.has(T)||m.set(T,{keyframes:{},transition:{}});const F=m.get(T);F.keyframes[O]=E;const{type:W,...Z}=s;F.transition[O]={...Z,duration:w,ease:I,times:P,...o}}}),m}function Xb(n,s){return!s.has(n)&&s.set(n,{}),s.get(n)}function Jb(n,s){return s[n]||(s[n]=[]),s[n]}function YC(n){return Array.isArray(n)?n:[n]}function XC(n,s){return n&&n[s]?{...n,...n[s]}:{...n}}const JC=n=>typeof n=="number",$C=n=>n.every(JC);function QC(n){const s={presenceContext:null,props:{},visualState:{renderState:{transform:{},transformOrigin:{},style:{},vars:{},attrs:{}},latestValues:{}}},o=Rl(n)&&!Jv(n)?new mw(s):new lw(s);o.mount(n),uo.set(n,o)}function ZC(n){const s={presenceContext:null,props:{},visualState:{renderState:{output:{}},latestValues:{}}},o=new hS(s);o.mount(n),uo.set(n,o)}function e5(n,s){return dt(n)||typeof n=="number"||typeof n=="string"&&!sm(s)}function Kw(n,s,o,l){const d=[];if(e5(n,s))d.push(jw(n,sm(s)&&s.default||s,o&&(o.default||o)));else{if(n==null)return d;const h=Hw(n,s,l),m=h.length;for(let p=0;p<m;p++){const f=h[p],g=f instanceof Element?QC:ZC;uo.has(f)||g(f);const b=uo.get(f),x={...o};"delay"in x&&typeof x.delay=="function"&&(x.delay=x.delay(p,m)),d.push(...Wh(b,{...s,transition:x},{}))}}return d}function t5(n,s,o){const l=[];return WC(n,s,o,{spring:co}).forEach(({keyframes:h,transition:m},p)=>{l.push(...Kw(p,h,m))}),l}function n5(n){return Array.isArray(n)&&n.some(Array.isArray)}function a5(n){function s(o,l,d){let h=[],m;if(n5(o))h=t5(o,l,n);else{const{onComplete:f,...g}=d||{};typeof f=="function"&&(m=f),h=Kw(o,l,g,n)}const p=new iT(h);return m&&p.finished.then(m),p}return s}const s5=a5(),i5={some:0,all:1};function o5(n,s,{root:o,margin:l,amount:d="some"}={}){const h=zl(n),m=new WeakMap,p=g=>{g.forEach(b=>{const x=m.get(b.target);if(b.isIntersecting!==!!x)if(b.isIntersecting){const w=s(b.target,b);typeof w=="function"?m.set(b.target,w):f.unobserve(b.target)}else typeof x=="function"&&(x(b),m.delete(b.target))})},f=new IntersectionObserver(p,{root:o,rootMargin:l,threshold:typeof d=="number"?d:i5[d]});return h.forEach(g=>f.observe(g)),()=>f.disconnect()}function r5(n,{root:s,margin:o,amount:l,once:d=!1,initial:h=!1}={}){const[m,p]=j.useState(h);return j.useEffect(()=>{if(!n.current||d&&m)return;const f=()=>(p(!0),d?void 0:()=>p(!1)),g={root:s&&s.current||void 0,margin:o,amount:l};return o5(n.current,f,g)},[s,n,o,d,l]),m}const Fw="optops-theme",l5=()=>
19{if(typeof window>"u")return"light";const n=window.localStorage.getItem(Fw);return n==="light"||n==="dark"?n:"light"},c5=()=>{const[n,s]=j.useState(l5);return j.useEffect(()=>{const l=document.documentElement;n==="light"?(l.classList.add("theme-light"),l.classList.remove("theme-dark")):(l.classList.add("theme-dark"),l.classList.remove("theme-light")),window.localStorage.setItem(Fw,n)},[n]),{theme:n,setTheme:s,toggleTheme:()=>{s(l=>l==="light"?"dark":"light")}}},fh=({className:n=""})=>{const{theme:s,toggleTheme:o}=c5(),l=s==="light";return a.jsxs("button",{type:"button",onClick:o,className:`theme-toggle inline-flex items-center gap-1.5 ${n}`,role:"switch","aria-checked":l,"aria-label":l?"Switch to dark mode":"Switch to light mode",children:[a.jsx("span",{className:`material-symbols-outlined text-[16px] ${l?"text-primary":"text-slate-300"}`,children:"light_mode"}),a.jsx("span",{className:"theme-toggle__track relative inline-flex h-5 w-9 items-center rounded-full bg-white/5 border border-white/10 transition-colors",children:a.jsx("span",{className:`theme-toggle__thumb inline-block h-4 w-4 rounded-full bg-white shadow transition-transform ${l?"translate-x-1":"translate-x-4"}`})}),a.jsx("span",{className:`material-symbols-outlined text-[16px] ${l?"text-slate-300":"text-primary"}`,children:"dark_mode"})]})},ut="https://calendar.app.google/upofhNxihr6KyhXp6",Nl=[{path:"/live-migration",icon:"move_up",label:"Live Migration",blurb:"Move running pods across nodes, zero downtime"},{path:"/spot-automation",icon:"bolt",label:"Spot Automation",blurb:"State-preserving rescue when interruptions hit"},{path:"/node-consolidation",icon:"balance",label:"Node Consolidation",blurb:"Autonomous bin-packing with never-lose-money gates"},{path:"/pod-rightsizing",icon:"content_cut",label:"Pod Rightsizing",blurb:"Continuous rightsizing with OOM spike protection"},{path:"/finops-visibility",icon:"payments",label:"FinOps Visibility",blurb:"Real-time cost visibility, savings you can audit"}
19,{path:"/hpc",icon:"memory",label:"HPC & AI Data Centers",blurb:"Turn idle accelerators into sellable capacity",badge:"New"},{path:"/security",icon:"shield_lock",label:"Security & Trust",blurb:"Read-only default, decisions made in your cluster"}],Cu=[{heading:"Kubernetes Optimization",paths:["/node-consolidation","/pod-rightsizing","/spot-automation","/live-migration"]},{heading:"Visibility & Trust",paths:["/finops-visibility","/security"]},{heading:"HPC & AI",paths:["/hpc"]}],d5=Object.fromEntries(Nl.map(n=>[n.path,n])),u5=({page:n,onNavigate:s})=>a.jsxs(ie,{to:n.path,className:"flex items-start gap-3 px-3 py-2.5 rounded-lg hover:bg-white/5 transition-colors",onClick:s,children:[a.jsx("span",{className:"w-8 h-8 rounded-lg bg-primary/10 flex items-center justify-center text-primary shrink-0 mt-0.5",children:a.jsx("span",{className:"material-symbols-outlined text-lg",children:n.icon})}),a.jsxs("span",{className:"min-w-0",children:[a.jsxs("span",{className:"flex items-center gap-2 text-sm font-bold text-white",children:[n.label,n.badge&&a.jsx("span",{className:"px-1.5 py-0.5 rounded bg-primary/10 border border-primary/30 text-[9px] uppercase font-bold text-primary",children:n.badge})]}),a.jsx("span",{className:"block text-xs text-slate-400 mt-0.5 leading-snug",children:n.blurb})]})]}),Ou=({group:n,onNavigate:s})=>a.jsxs("div",{children:[a.jsx("p",{className:"px-3 mb-1.5 text-[10px] font-bold uppercase tracking-widest text-slate-500",children:n.heading}),n.paths.map(o=>a.jsx(u5,{page:d5[o],onNavigate:s},o))]}),Ww=()=>{const[n,s]=j.useState(null),[o,l]=j.useState(!1);return a.jsxs(a.Fragment,{children:[a.jsx("header",{className:"sticky top-0 z-50 w-full border-b border-white/5 bg-background-dark/80 backdrop-blur-md",children:a.jsxs("div",{className:"max-w-7xl mx-auto px-6 h-16 flex items-center justify-between",children:[a.jsxs(ie,{to:"/",className:"flex items-center gap-3 hover:opacity-80 transition-opacity",children:[a.jsx("img",{src:"/logo.png",alt:"OptOps Logo",className:"w-14 h-14 rounded-xl object-cover dark-logo"}),a.jsx("img",{src:"/logo-light.png",alt:"OptOps Logo",className:"w-14 h-14 rounded-xl object-cover light-logo"}),a.jsx("span",{className:"text-2xl font-extrabold tracking-tight text-white",children:"OptOps.Ai"})]}),a.jsxs("nav",{className:"hidden md:flex items-center gap-4",children:[a.jsx("a",{href:"/#how-it-works",className:"text-sm font-semibold text-slate-300 hover:text-primary transition-colors",children:"How it Works"}),a.jsxs("div",{className:"relative py-4",onMouseEnter:()=>s("features"),onMouseLeave:()=>s(null),children:[a.jsxs("button",{type:"button",className:"text-sm font-semibold text-slate-300 hover:text-primary transition-colors flex items-center gap-1",children:["Platform ",a.jsx("span",{className:"text-[10px] text-slate-500",children:"▾"})]}),a.jsxs("div",{className:`absolute top-full left-1/2 -translate-x-1/2 w-[780px] max-w-[calc(100vw-3rem)] bg-surface-dark border border-white/10 rounded-2xl shadow-2xl z-50 overflow-hidden transition-all duration-200 ${n==="features"?"opacity-100 pointer-events-auto translate-y-0":"opacity-0 pointer-events-none -translate-y-2"}`,children:[a.jsxs("div",{className:"grid grid-cols-[1.1fr_1.1fr_0.9fr] gap-2 p-4",children:[a.jsx(Ou,{group:Cu[0],onNavigate:()=>s(null)}),a.jsxs("div",{className:"flex flex-col gap-4",children:[a.jsx(Ou,{group:Cu[1],onNavigate:()=>s(null)}),a.jsx(Ou,{group:Cu[2],onNavigate:()=>s(null)})]}),a.jsxs("div",{className:"bg-primary/5 border border-primary/20 rounded-xl p-4 flex flex-col",children:[a.jsx("p",{className:"text-[10px] font-bold uppercase tracking-widest text-primary mb-2",children:"Case study"}),a.jsx("p",{className:"text-sm font-bold text-white leading-snug mb-1.5",children:"60% Kubernetes cost cut in 30 days"}),a.jsx("p",{className:"text-xs text-slate-400 leading-relaxed flex-1",children:"443 optimization cycles on a live media-tech cluster — zero incidents."}),a.jsx(ie,{to:"/case-studies",className:"text-xs font-bold text-primary hover:underline mt-3",onClick:()=>s(null),children:"Read the case study →"}),a.jsx("a",{href:ut,className:"mt-3 bg-primary text-white text-center text-xs font-bold px-4 py-2.5 rounded-lg neon-glow hover:brightness-110 transition-all",children:"Book a Demo"})]})]}),a.jsxs("div",{className:"flex items-center justify-between gap-4 px-6 py-3 border-t border-white/10 bg-white/[0.02]",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("span",{className:"text-[10px] font-bold uppercase tracking-widest text-slate-500",children:"Runs on"}),a.jsx("img",{src:"/logos/aws.svg",alt:"AWS",className:"platform-logo h-4 w-auto"}),a.jsx("img",{src:"/logos/gcp.svg",alt:"Google Cloud",className:"platform-logo h-4 w-auto"}),a.jsx("img",{src:"/logos/azure.svg",alt:"Azure",className:"platform-logo h-4 w-auto"})]}),a.jsxs("div",{className:"flex items-center gap-5",children:[a.jsx(ie,{to:"/resources/get-started",className:"text-xs font-semibold text-slate-300 hover:text-primary transition-colors",onClick:()=>s(null),children:"How to get started"}),a.jsx(ie,{to:"/resources/key-platform-features",className:"text-xs font-semibold text-slate-300 hover:text-primary transition-colors",onClick:()=>s(null),children:"Key platform features"})]})]})]})]}),a.jsxs("div",{className:"relative py-4",onMouseEnter:()=>s("resources"),onMouseLeave:()=>s(null),children:[a.jsxs("button",{type:"button",className:"text-sm font-semibold text-slate-300 hover:text-primary transition-colors flex items-center gap-1",children:["Resources ",a.jsx("span",{className:"text-[10px] text-slate-500",children:"▾"})]}),a.jsxs("div",{className:`absolute top-full left-0 w-72 bg-surface-dark border border-white/10 rounded-xl shadow-2xl p-2 z-50 transition-all duration-200 ${n==="resources"?"opacity-100 pointer-events-auto translate-y-0":"opacity-0 pointer-events-none -translate-y-2"}`,children:[a.jsxs(ie,{to:"/resources/get-started",className:"block px-4 py-3 rounded-lg hover:bg-white/5 transition-colors",onClick:()=>s(null),children:[a.jsx("span",{className:"block text-sm font-bold text-white",children:"How To Get Started"}),a.jsx("span",{className:"block text-xs text-slate-400 mt-0.5",children:"Setup guide and onboarding walkthrough"})]}),a.jsxs(ie,{to:"/resources/key-platform-features",className:"block px-4 py-3 rounded-lg hover:bg-white/5 transition-colors",onClick:()=>s(null),children:[a.jsx("span",{className:"block text-sm font-bold text-white",children:"Key Platform Features"}),a.jsx("span",{className:"block text-xs text-slate-400 mt-0.5",children:"Full capability overview of the platform"})]}),a.jsxs(ie,{to:"/resources/blogs",className:"block px-4 py-3 rounded-lg hover:bg-white/5 transition-colors",onClick:()=>s(null),children:[a.jsx("span",{className:"block text-sm font-bold text-white",children:"Blogs"}),a.jsx("span",{className:"block text-xs text-slate-400 mt-0.5",children:"Insights, updates, and cost-optimization playbooks"})]}),a.jsxs("a",{href:"/#cli",className:"block px-4 py-3 rounded-lg hover:bg-white/5 transition-colors",onClick:()=>s(null),children:[a.jsx("span",{className:"block text-sm font-bold text-white",children:"Free CLI Analyzer"}),a.jsx("span",{className:"block text-xs text-slate-400 mt-0.5",children:"One command shows what your cluster is wasting"})]})]})]}),a.jsxs("div",{className:"relative py-4",onMouseEnter:()=>s("company"),onMouseLeave:()=>s(null),children:[a.jsxs("button",{type:"button",className:"text-sm font-semibold text-slate-300 hover:text-primary transition-colors flex items-center gap-1",children:["Company ",a.jsx("span",{className:"text-[10px] text-slate-500",children:"▾"})]}),a.jsxs("div",{className:`absolute top-full left-0 w-64 bg-surface-dark border border-white/10 rounded-xl shadow-2xl p-2 z-50 transition-all duration-200 ${n==="company"?"opacity-100 pointer-events-auto translate-y-0":"opacity-0 pointer-events-none -translate-y-2"}`,children:[a.jsx(ie,{to:"/company/about",className:"block px-4 py-3 rounded-lg hover:bg-white/5 transition-colors",onClick:()=>s(null),children:a.jsx("span",{className:"block text-sm font-bold text-white",children:"About Us"})}),a.jsx(ie,{to:"/company/contact-us",className:"block px-4 py-3 rounded-lg hover:bg-white/5 transition-colors",onClick:()=>s(null),children:a.jsx("span",{className:"block text-sm font-bold text-white",children:"Contact Us"})})]})]}),a.jsx(ie,{to:"/company/partner-program",className:"text-sm font-semibold blink-purple transition-colors",children:"Partner Program"}),a.jsx(ie,{to:"/case-studies",className:"text-sm font-semibold text-slate-300 hover:text-primary transition-colors",children:"Case Studies"})]}),a.jsxs("div",{className:"hidden md:flex items-center gap-2",children:[a.jsx("a",{href:"https://console.optops.ai/login",className:"bg-primary neon-glow px-4 py-1.5 rounded-lg text-xs font-bold text-white hover:brightness-110 transition-all",children:"Sign Up / Sign In"}),a.jsx("a",{href:ut,className:"px-4 py-1.5 rounded-lg text-xs font-bold text-white border border-white/10 hover:bg-white/5 transition-all",children:"Book a Demo"}),a.jsx(fh,{className:"shrink-0"})]}),a.jsxs("div",{className:"flex md:hidden items-center gap-2",children:[a.jsx(fh,{className:"shrink-0"}),a.jsx("button",{type:"button",onClick:()=>l(d=>!d),className:"h-9 w-9 rounded-lg border border-white/10 bg-white/5 hover:bg-white/10 transition-colors flex items-center justify-center","aria-label":o?"Close menu":"Open menu",children:a.jsx("span",{className:"material-symbols-outlined text-white",children:o?"close"
19:"menu"})})]})]})}),o&&a.jsx("div",{className:"md:hidden w-full border-b border-white/5 bg-background-dark/95 backdrop-blur-md",children:a.jsxs("div",{className:"max-w-7xl mx-auto px-6 py-4 flex flex-col gap-4 text-sm",children:[a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx("a",{href:"/#how-it-works",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"How it Works"}),a.jsx(ie,{to:"/case-studies",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Case Studies"})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx("span",{className:"text-xs uppercase tracking-widest text-slate-500",children:"Platform"}),a.jsx("a",{href:"/#features",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Platform Overview"}),Nl.map(d=>a.jsx(ie,{to:d.path,onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:d.label},d.path))]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx("span",{className:"text-xs uppercase tracking-widest text-slate-500",children:"Resources"}),a.jsx(ie,{to:"/resources/get-started",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"How To Get Started"}),a.jsx(ie,{to:"/resources/key-platform-features",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Key Platform Features"}),a.jsx(ie,{to:"/resources/blogs",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Blogs"}),a.jsx("a",{href:"/#cli",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Free CLI Analyzer"})]}),a.jsxs("div",{className:"flex flex-col gap-2",children:[a.jsx("span",{className:"text-xs uppercase tracking-widest text-slate-500",children:"Company"}),a.jsx(ie,{to:"/company/about",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"About Us"}),a.jsx(ie,{to:"/company/contact-us",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Contact Us"}),a.jsx(ie,{to:"/company/partner-program",onClick:()=>l(!1),className:"text-slate-300 hover:text-primary transition-colors",children:"Partner Program"})]}),a.jsxs("div",{className:"flex flex-col gap-3 pt-2 border-t border-white/10",children:[a.jsx("a",{href:"https://console.optops.ai/login",className:"bg-primary text-white px-4 py-2 rounded-lg font-bold text-center",children:"Sign Up / Sign In"}),a.jsx("a",{href:ut,className:"border border-white/10 text-white px-4 py-2 rounded-lg font-bold text-center",children:"Book a Demo"})]})]})})]})},Yw=()=>a.jsx("footer",{className:"border-t border-white/5 py-12 bg-background-dark w-full",children:a.jsxs("div",{className:"max-w-7xl mx-auto px-6 flex flex-col md:flex-row justify-between items-center gap-8",children:[a.jsxs("div",{className:"flex flex-row items-center flex-nowrap shrink-0 gap-4 md:gap-5",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("img",{src:"/logo.png",alt:"OptOps Logo",className:"w-8 h-8 rounded object-cover dark-logo"}),a.jsx("img",{src:"/logo-light.png",alt:"OptOps Logo",className:"w-8 h-8 rounded object-cover light-logo"}),a.jsx("span",{className:"font-bold text-white tracking-tight",children:"OptOps.Ai"})]}),a.jsx("div",{className:"h-6 w-[1px] footer-divider"}),a.jsx("img",{src:"/nvidia-inception-program-badge-rgb-for-screen.svg",alt:"NVIDIA Inception Member",className:"h-11 w-auto object-contain opacity-80 hover:opacity-100 transition-opacity"})]}),a.jsxs("div",{className:"flex flex-wrap gap-6 text-sm text-slate-400 items-center",children:[a.jsx(ie,{to:"/live-migration",className:"hover:text-primary transition-colors",children:"Live Migration"}),a.jsx(ie,{to:"/resources/key-platform-features",className:"hover:text-primary transition-colors",children:"Platform Features"}),a.jsx(ie,{to:"/case-studies",className:"hover:text-primary transition-colors",children:"Case Studies"}),a.jsx(ie,{to:"/resources",className:"hover:text-primary transition-colors",children:"Resources"}),a.jsx(ie,{to:"/company",className:"hover:text-primary transition-colors",children:"Company"}),a.jsx("a",{href:"https://console.optops.ai/login",className:"hover:text-primary transition-colors",children:"Sign Up / Sign In"}),a.jsx("a",{href:ut,className:"hover:text-primary transition-colors",children:"Book a Demo"}),a.jsx(ie,{to:"/privacy-policy",className:"hover:text-primary transition-colors",children:"Privacy Policy"}),a.jsx(ie,{to:"/terms-of-service",className:"hover:text-primary transition-colors",children:"Terms of Service"}),a.jsx("a",{href:"https://www.linkedin.com/company/optopsai/",target:"_blank",rel:"noopener noreferrer",className:"hover:text-primary transition-colors",children:"LinkedIn"})]}),a.jsxs("div",{className:"text-xs text-slate-500",children:["© ",new Date().getFullYear()," OptOps. All rights reserved."]})]})}),$b=typeof window>"u"?ge.useEffect:ge.useLayoutEffect,Ce=({value:n,format:s,duration:o=1.2,startOnView:l=!0,className:d=""})=>{const h=ge.useRef(null),m=r5(h,{once:!0,margin:"-40px"}),p=yn(),f=ge.useRef(s),g=ge.useRef(null);return $b(()=>{f.current=s}),$b(()=>{const b=h.current;if(!b)return;const x=O=>
19f.current?f.current(O):Math.round(O).toLocaleString(),w=O=>{g.current=O,b.textContent=x(O)};if(p){w(n);return}if(l&&!m){g.current===null&&w(0);return}const S=g.current===null?l?0:n:g.current;if(S===n){w(n);return}const T=s5(S,n,{duration:o,ease:[.16,1,.3,1],onUpdate:O=>{g.current=O,b.textContent=x(O)},onComplete:()=>w(n)});return()=>T.stop()},[n,m,p,l,o]),a.jsx("span",{ref:h,className:d,children:s?s(n):Math.round(n).toLocaleString()})},h5=()=>{const[n,s]=j.useState(()=>typeof document<"u"&&document.documentElement.classList.contains("theme-light"));return j.useEffect(()=>{const o=document.documentElement,l=()=>s(o.classList.contains("theme-light"));l();const d=new MutationObserver(l);return d.observe(o,{attributes:!0,attributeFilter:["class"]}),()=>d.disconnect()},[]),n},Wr=[{id:"steady",duration:1500},{id:"interrupt",duration:1500},{id:"checkpoint",duration:1500},{id:"transfer",duration:1500},{id:"restore",duration:1e3},{id:"drain",duration:1500}],m5={steady:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)",opacity:1},interrupt:{borderColor:["rgba(245, 158, 11, 0.7)","rgba(245, 158, 11, 0.2)","rgba(245, 158, 11, 0.7)","rgba(245, 158, 11, 0.25)"],backgroundColor:"rgba(41, 25, 33, 1)",opacity:1},checkpoint:{borderColor:"rgba(245, 158, 11, 0.5)",backgroundColor:"rgba(39, 23, 33, 1)",opacity:1},transfer:{borderColor:"rgba(239, 68, 68, 0.4)",backgroundColor:"rgba(39, 19, 36, 1)",opacity:1},restore:{borderColor:"rgba(255, 255, 255, 0.08)",backgroundColor:"rgba(28, 16, 34, 1)",opacity:.55},drain:{borderColor:"rgba(255, 255, 255, 0.06)",backgroundColor:"rgba(28, 16, 34, 1)",opacity:.35}},p5={steady:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)",boxShadow:"0 0 0 0 rgba(34, 197, 94, 0)"},interrupt:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)",boxShadow:"0 0 0 0 rgba(34, 197, 94, 0)"},checkpoint:{borderColor:"rgba(175, 37, 244, 0.35)",backgroundColor:"rgba(28, 16, 34, 1)",boxShadow:"0 0 0 0 rgba(34, 197, 94, 0)"},transfer:{borderColor:"rgba(175, 37, 244, 0.5)",backgroundColor:"rgba(35, 17, 45, 1)",boxShadow:"0 0 0 0 rgba(34, 197, 94, 0)"},restore:{borderColor:"rgba(34, 197, 94, 0.7)",backgroundColor:"rgba(28, 27, 38, 1)",boxShadow:["0 0 0 0 rgba(34, 197, 94, 0.4)","0 0 0 12px rgba(34, 197, 94, 0)"]},drain:{borderColor:"rgba(34, 197, 94, 0.45)",backgroundColor:"rgba(28, 25, 37, 1)",boxShadow:"0 0 0 0 rgba(34, 197, 94, 0)"}},f5={steady:{left:"4%",opacity:1,scale:1,backgroundColor:"rgba(57, 20, 76, 1)",borderColor:"rgba(175, 37, 244, 0.5)"},interrupt:{left:"4%",opacity:1,scale:1,backgroundColor:"rgba(57, 20, 76, 1)",borderColor:"rgba(175, 37, 244, 0.5)"},checkpoint:{left:"4%",opacity:1,scale:1,backgroundColor:"rgba(47, 40, 58, 1)",borderColor:"rgba(148, 163, 184, 0.55)"},transfer:{left:"52%",opacity:1,scale:1,backgroundColor:"rgba(47, 40, 58, 1)",borderColor:"rgba(148, 163, 184, 0.55)"},restore:{left:"52%",opacity:1,scale:[1,1.07,1],backgroundColor:"rgba(57, 20, 76, 1)",borderColor:"rgba(34, 197, 94, 0.7)"},drain:{left:"52%",opacity:1,scale:1,backgroundColor:"rgba(57, 20, 76, 1)",borderColor:"rgba(175, 37, 244, 0.5)"}},g5={steady:{borderColor:"rgba(15, 23, 42, 0.14)",backgroundColor:"rgba(255, 255, 255, 1)",opacity:1},interrupt:{borderColor:["rgba(217, 119, 6, 0.8)","rgba(217, 119, 6, 0.3)","rgba(217, 119, 6, 0.8)","rgba(217, 119, 6, 0.35)"],backgroundColor:"rgba(254, 246, 232, 1)",opacity:1},checkpoint:{borderColor:"rgba(217, 119, 6, 0.6)",backgroundColor:"rgba(254, 248, 237, 1)",opacity:1},transfer:{borderColor:"rgba(220, 38, 38, 0.5)",backgroundColor:"rgba(254, 240, 240, 1)",opacity:1},restore:{borderColor:"rgba(15, 23, 42, 0.10)",backgroundColor:"rgba(255, 255, 255, 1)",opacity:.55},drain:{borderColor:"rgba(15, 23, 42, 0.08)",backgroundColor:"rgba(255, 255, 255, 1)",opacity:.35}},y5={steady:{borderColor:"rgba(15, 23, 42, 0.14)",backgroundColor:"rgba(255, 255, 255, 1)",boxShadow:"0 0 0 0 rgba(22, 163, 74, 0)"},interrupt:{borderColor:"rgba(15, 23, 42, 0.14)",backgroundColor:"rgba(255, 255, 255, 1)",boxShadow:"0 0 0 0 rgba(22, 163, 74, 0)"},checkpoint:{borderColor:"rgba(175, 37, 244, 0.4)",backgroundColor:"rgba(255, 255, 255, 1)",boxShadow:"0 0 0 0 rgba(22, 163, 74, 0)"},transfer:{borderColor:"rgba(175, 37, 244, 0.55)",backgroundColor:"rgba(249, 242, 254, 1)",boxShadow:"0 0 0 0 rgba(22, 163, 74, 0)"},restore:{borderColor:"rgba(22, 163, 74, 0.7)",backgroundColor:"rgba(240, 251, 244, 1)",boxShadow:["0 0 0 0 rgba(22, 163, 74, 0.35)","0 0 0 12px rgba(22, 163, 74, 0)"]},drain:{borderColor:"rgba(22, 163, 74, 0.5)",backgroundColor:"rgba(243, 252, 246, 1)",boxShadow:"0 0 0 0 rgba(22, 163, 74, 0)"}},b5={steady:{left:"4%",opacity:1,scale:1,backgroundColor:"rgba(246, 235, 254, 1)",borderColor:"rgba(175, 37, 244, 0.55)"},interrupt:{left:"4%",opacity:1,scale:1,backgroundColor:"rgba(246, 235, 254, 1)",borderColor:"rgba(175, 37, 244, 0.55)"},checkpoint:{left:"4%",opacity:1,scale:1,backgroundColor:"rgba(240, 242, 246, 1)",borderColor:"rgba(100, 116, 139, 0.6)"},transfer:{left:"52%",opacity:1,scale:1,backgroundColor:"rgba(240, 242, 246, 1)",borderColor:"rgba(100, 116, 139, 0.6)"},restore:{left:"52%",opacity:1,scale:[1,1.07,1],backgroundColor:"rgba(246, 235, 254, 1)",borderColor:"rgba(22, 163, 74, 0.7)"},drain:{left:"52%",opacity:1,scale:1,backgroundColor:"rgba(246, 235, 254, 1)",borderColor:"rgba(175, 37, 244, 0.55)"}},x5={steady:"Running · healthy",interrupt:"Reclaim in ~120s",checkpoint:"CRIU checkpointing pod state",transfer:"Streaming state to node-b",restore:"Workload moved off",drain:"Drained · terminating"},v5={steady:"Restore target · standby",interrupt:"Restore target · standby",checkpoint:"Restore target ready",transfer:"Receiving checkpoint",restore:"Pod restored · same IP",drain:"Ru
19nning · healthy"},w5=[{label:"Checkpoint",phases:["checkpoint"]},{label:"Transfer",phases:["transfer"]},{label:"Restore",phases:["restore","drain"]}],Xw=()=>{const n=yn(),s=h5(),o=s?g5:m5,l=s?y5:p5,d=s?b5:f5,[h,m]=j.useState(14203),[p,f]=j.useState(0),[g,b]=j.useState(0),x=n?"drain":Wr[p].id;return j.useEffect(()=>{if(n)return;const w=setInterval(()=>{m(S=>S+Math.floor(1+Math.random()*9))},400);return()=>clearInterval(w)},[n]),j.useEffect(()=>{if(n)return;const w=setTimeout(()=>{p===Wr.length-1&&b(S=>S+1),f((p+1)%Wr.length)},Wr[p].duration);return()=>clearTimeout(w)},[p,n]),a.jsxs("div",{className:"glass-card rounded-2xl p-6 w-full",children:[a.jsxs("div",{className:"flex items-center justify-between mb-5",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg",children:"deployed_code"}),a.jsx("span",{className:"text-sm font-bold text-white",children:"checkout-svc"})]}),a.jsxs("div",{className:"flex items-center gap-2 bg-green-500/10 border border-green-500/20 px-2.5 py-1 rounded-full",children:[a.jsx("span",{className:`w-2 h-2 rounded-full bg-green-500${n?"":" animate-pulse"}`}),a.jsx("span",{className:"text-[10px] font-bold text-green-400 uppercase tracking-widest",children:"TCP Established"})]})]}),a.jsxs("div",{className:"relative grid grid-cols-2 gap-4 mb-4",children:[a.jsxs(se.div,{className:"border rounded-xl p-3 h-36 sm:h-28",initial:!1,animate:o[x],transition:x==="interrupt"?{borderColor:{duration:1.4,times:[0,.33,.66,1]},default:{duration:.4}}:{duration:.4},children:[a.jsx("p",{className:"text-[10px] font-bold uppercase tracking-wider text-slate-300",children:"node-a · spot"}),a.jsx("p",{className:"text-[10px] text-slate-400 mt-0.5",children:x5[x]}),a.jsx(zt,{children:(x==="interrupt"||x==="checkpoint"||x==="transfer")&&a.jsxs(se.div,{className:"mt-1.5 inline-flex items-center gap-1 rounded-md border border-amber-500/40 bg-amber-500/10 px-1.5 py-0.5",initial:{opacity:0,y:-3},animate:{opacity:1,y:0},exit:{opacity:0},transition:{duration:.3},children:[a.jsx("span",{className:"material-symbols-outlined text-amber-400 text-xs",children:"warning"}),a.jsx("span",{className:"text-[9px] font-bold uppercase tracking-wide text-amber-300 leading-tight",children:"Spot interruption notice"})]})})]}),a.jsxs(se.div,{className:"border rounded-xl p-3 h-36 sm:h-28",initial:!1,animate:l[x],transition:x==="restore"?{boxShadow:{duration:.9},default:{duration:.4}}:{duration:.4},children:[a.jsx("p",{className:"text-[10px] font-bold uppercase tracking-wider text-slate-300",children:"node-b · replacement"}),a.jsx("p",{className:"text-[10px] text-slate-400 mt-0.5",children:v5[x]})]}),a.jsx(zt,{children:x==="transfer"&&a.jsx(se.div,{className:"pointer-events-none absolute bottom-[1.7rem] left-[6%] right-[10%] border-t-2 border-dashed border-green-500/40",initial:{opacity:0}
19,animate:{opacity:1},exit:{opacity:0},transition:{duration:.25}})}),a.jsx(zt,{initial:!1,children:a.jsxs(se.div,{className:"absolute bottom-3 flex items-center gap-1.5 whitespace-nowrap border rounded-lg px-2.5 py-1.5 backdrop-blur-sm",initial:{opacity:0,left:"4%"},animate:d[x],exit:{opacity:0,transition:{duration:.45}},transition:{left:{duration:1.3,ease:"easeInOut"},scale:{duration:.7},default:{duration:.4}},children:[a.jsx("span",{className:`w-1.5 h-1.5 rounded-full bg-green-500${n?"":" animate-pulse"}`}),a.jsx("span",{className:"material-symbols-outlined text-primary text-sm",children:"deployed_code"}),a.jsx("span",{className:"text-[10px] font-bold text-white",children:"pod · 10.0.4.17"}),(x==="checkpoint"||x==="transfer")&&a.jsx("span",{className:"w-3 h-3 rounded-full border-2 border-slate-400/30 border-t-slate-200 animate-spin"})]},g)})]}),a.jsx("div",{className:"flex items-center justify-center gap-2 mb-4 font-mono text-[10px] uppercase tracking-widest","aria-hidden":"true",children:w5.map((w,S)=>a.jsxs(ge.Fragment,{children:[S>0&&a.jsx("span",{className:"text-slate-600",children:"→"}),a.jsx("span",{className:`transition-colors duration-300 ${w.phases.includes(x)?"text-primary font-bold":"text-slate-500"}`,children:w.label})]},w.label))}),a.jsxs("div",{className:"flex items-center justify-between border-t border-white/5 pt-4",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold",children:"Requests served"}),a.jsx("p",{className:"text-xl font-black text-white tabular-nums",children:a.jsx(Ce,{value:h,startOnView:!1,duration:.3})})]}),a.jsxs("div",{className:"text-right",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold",children:"During migration"}),a.jsx("p",{className:"text-xl font-black text-green-400",children:"0 dropped"})]})]})]})},Yr=[{id:"steady",duration:2e3},{id:"plan",duration:1700},{id:"migrate",duration:3e3},{id:"shutdown",duration:2600},{id:"hold",duration:2400}],Ul={steady:0,plan:1,migrate:2,shutdown:3,hold:4},j5=[{id:"node-01",keeper:!0},{id:"node-02",keeper:!0},{id:"node-03",keeper:!0},{id:"node-04",keeper:!1},{id:"node-05",keeper:!1},{id:"node-06",keeper:!1}],Qb=["rgba(175, 37, 244, 0.55)","rgba(96, 165, 250, 0.5)","rgba(34, 197, 94, 0.5)","rgba(232, 121, 249, 0.5)"],k5={steady:"6 nodes · avg 38% utilized",plan:"consolidation plan computed",migrate:"packing workloads onto fewer nodes",shutdown:"powering down emptied nodes",hold:"3 nodes · same workloads · ~90% utilized"},N5=[{label:"Plan",phases:["plan"]},{label:"Migrate",phases:["migrate"]},{label:"Shut down",phases:["shutdown","hold"]}],T5=(n,s)=>{const o=Ul[s];return n?o>=2?{borderColor:"rgba(34, 197, 94, 0.55)",backgroundColor:"rgba(34, 197, 94, 0.05)",opacity:1}:o===1?{borderColor:"rgba(175, 37, 244, 0.65)",backgroundColor:"rgba(175, 37, 244, 0.05)",opacity:1}:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)",opacity:1}:o>=3?{borderColor:"rgba(255, 255, 255, 0.06)",backgroundColor:"rgba(28, 16, 34, 1)",opacity:.35}:o===2?{borderColor:"rgba(239, 68, 68, 0.45)",backgroundColor:"rgba(239, 68, 68, 0.05)",opacity:1}:o===1?{borderColor:"rgba(245, 158, 11, 0.5)",backgroundColor:"rgba(245, 158, 11, 0.05)",opacity:1}:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)",opacity:1}},S5=(n,s)=>{const o=Ul[s];return n?o>=2?90:o===1?42:38:o>=3?0:o>=2?8:38},A5=({node:n,phase:s,cycle:o})=>{const l=Ul[s],d=n.keeper,h=S5(d,s),m=d&&l>=2,p=!d&&l>=3,f=d?[0,1,2,3]:[0,1];return a.jsxs(se.div,{className:`relative border rounded-lg p-2 flex flex-col ${s==="plan"&&d?"border-dashed":""}`,initial:!1,animate:T5(d,s),transition:{duration:.5},children:[a.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[a.jsx("span",{className:"text-[8px] sm:text-[9px] font-mono text-slate-400 truncate",children:n.id}),a.jsx("span",{className:`w-1.5 h-1.5 rounded-full ${p?"bg-slate-600":m?"bg-green-500":"bg-slate-500"}`})]}),a.jsx("div",{className:"flex-1 flex flex-wrap content-start gap-1 min-h-[34px]",children:f.map(g=>{const b=d&&g>=2,x=d?g<2?!0:l>=2:l<2;return a.jsx(se.span,{className:"w-2.5 h-2.5 rounded-[3px] border border-white/10",initial:!1,animate:{o
19pacity:x?1:0,scale:x?1:.4,x:b&&l<2?8:0,backgroundColor:Qb[g%Qb.length]},transition:{duration:.4,delay:b&&l>=2?.25+g*.15:0}},g)})}),a.jsx(zt,{children:p&&a.jsx(se.div,{className:"absolute inset-0 flex items-center justify-center",initial:{opacity:0},animate:{opacity:1},exit:{opacity:0},transition:{duration:.4},children:a.jsx("span",{className:"material-symbols-outlined text-slate-500 text-lg",children:"power_settings_new"})})}),a.jsx(zt,{children:!d&&s==="shutdown"&&a.jsx(se.span,{className:"absolute -top-2 left-1/2 -translate-x-1/2 text-[9px] font-bold text-green-400 whitespace-nowrap",initial:{opacity:0,y:6},animate:{opacity:1,y:-8},exit:{opacity:0,y:-16},transition:{duration:.9},children:"-$104/mo"},`${o}-${n.id}`)}),a.jsxs("div",{className:"mt-1.5",children:[a.jsx("div",{className:"h-1 rounded-full bg-white/5 overflow-hidden",children:a.jsx(se.div,{className:"h-full rounded-full",initial:!1,animate:{width:`${h}%`,backgroundColor:m?"rgba(34, 197, 94, 0.8)":!d&&l>=2?"rgba(239, 68, 68, 0.6)":"rgba(175, 37, 244, 0.6)"},transition:{duration:.7}})}),a.jsxs("span",{className:"text-[8px] font-mono text-slate-500 mt-0.5 block",children:[h,"%"]})]})]})},Jw=()=>{const n=yn(),[s,o]=j.useState(0),[l,d]=j.useState(0),h=n?"hold":Yr[s].id,m=Ul[h]>=3;return j.useEffect(()=>{if(n)return;const p=setTimeout(()=>{s===Yr.length-1&&d(f=>f+1),o((s+1)%Yr.length)},Yr[s].duration);return()=>clearTimeout(p)},[s,n]),a.jsxs("div",{className:"glass-card rounded-2xl p-5 sm:p-6 w-full",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg",children:"dns"}),a.jsx("span",{className:"text-sm font-bold text-white",children:"Cluster consolidation"})]}),a.jsx(zt,{children:m&&a.jsxs(se.div,{className:"flex items-center gap-1.5 bg-green-500/10 border border-green-500/20 px-2.5 py-1 rounded-full",initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.9},transition:{duration:.4},children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"savings"}),a.jsx("span",{className:"text-xs font-black text-green-400 tabular-nums",children:a.jsx(Ce,{value:312,startOnView:!1,duration:1.1,format:p=>`-$${Math.round(p)}/mo`})})]})})]}),a.jsx("div",{className:"relative h-[150px] sm:h-[128px] mb-4",children:a.jsx(zt,{initial:!1,children:a.jsx(se.div,{className:"absolute inset-0 grid grid-cols-3 sm:grid-cols-6 gap-2",initial:{opacity:0}
19,animate:{opacity:1},exit:{opacity:0},transition:{duration:.5},children:j5.map(p=>a.jsx(A5,{node:p,phase:h,cycle:l},p.id))},l)})}),a.jsx("div",{className:"flex items-center justify-center gap-2 mb-3 font-mono text-[10px] uppercase tracking-widest","aria-hidden":"true",children:N5.map((p,f)=>a.jsxs(ge.Fragment,{children:[f>0&&a.jsx("span",{className:"text-slate-600",children:"→"}),a.jsx("span",{className:`transition-colors duration-300 ${p.phases.includes(h)?"text-primary font-bold":"text-slate-500"}`,children:p.label})]},p.label))}),a.jsx("div",{className:"border-t border-white/5 pt-3 text-center",children:a.jsx("p",{className:"text-[11px] font-mono text-slate-400",children:k5[h]})})]})},Vs="npx optops@latest analyze",C5=[["Nodes","6"],["CPU capacity","48.0 cores"],["Memory capacity","192 GiB"],["Provider","AWS · us-east-1"],["Capacity mix","100% on-demand"]],O5=[{label:"CPU",pct:7,detail:"3.4 cores used of 48.0 cores · 28.2 cores requested (59% of capacity)"},{label:"Memory",pct:13,detail:"25 GiB used of 192 GiB · 86 GiB requested (45% of capacity)"}],E5=[["Current est. spend","$1547–$1682/mo"],["Rightsizing headroom","$1009/mo"],["Spot-conversion headroom","$235–$424/mo"]],D5="$1245–$1433/mo",z5=55,R5=12e3,Yi={scanning:420,scanned:1500,snapshot:340,utilization:420,savings:520},Zb=["typing","scanning","scanned","snapshot","utilization","savings","done"],ex=["⠋","⠙","⠹","⠸","⠼","⠴","⠦","⠧","⠇","⠏"],Xr=(n,s)=>Zb.indexOf(n)>=Zb.indexOf(s),M5=()=>{const n=yn(),s=j.useRef(null),o=j.useRef([]),[l,d]=j.useState(n?"done":"idle"),[h,m]=j.useState(n?Vs.length:0),[p,f]=j.useState(0),[g,b]=j.useState(!1),x=()=>{o.current.forEach(clearTimeout),o.current=[]},w=j.useCallback(()=>{x(),m(0),d("typing");let D=0;const E=(P,I)=>{D+=P,o.current.push(setTimeout(I,D))};for(let P=1;P<=Vs.length;P+=1)E(z5,()=>m(P));E(Yi.scanning,()=>d("scanning")),E(Yi.scanned,()=>d("scanned")),E(Yi.snapshot,()=>d("snapshot")),E(Yi.utilization,()=>d("utilization")),E(Yi.savings,()=>d("savings")),E(600,()=>d("done"))},[]);j.useEffect(()=>{if(l!=="done"||n)return;const D=setTimeout(()=>w(),R5);return()=>clearTimeout(D)},[l,n,w]),j.useEffect(()=>{if(n||!s.current)return;const D=s.current,E=new IntersectionObserver(P=>{P.some(I=>I.isIntersecting)&&(E.disconnect(),w())},{threshold:.35});return E.observe(D),()=>E.disconnect()},[w,n]),j.useEffect(()=>x,[]),j.useEffect(()=>{if(l!=="scanning")return;const D=setInterval(()=>f(E=>E+1),80);return()=>clearInterval(D)},[l]);const S=async()=>{try{await navigator.clipboard.writeText(Vs),b(!0),setTimeout(()=>b(!1),1800)}catch{}},T=l!=="idle",O=l==="typing"||l==="scanning";return a.jsx("div",{ref:s,className:"w-full",children:a.jsxs("div",{className:"rounded-2xl overflow-hidden border border-primary/25 bg-[#0b0611] shadow-[0_30px_90px_-30px_rgba(175,37,244,0.55)]",children:[a.jsxs("div",{className:"flex items-center gap-2 px-4 h-11 bg-[#ffffff0a] border-b border-[#ffffff1a]",children:[a.jsx("span",{className:"w-3 h-3 rounded-full bg-[#e0605a]"}),a.jsx("span",{className:"w-3 h-3 rounded-full bg-[#e0b34f]"}),a.jsx("span",{className:"w-3 h-3 rounded-full bg-[#4fb06a]"}),a.jsx("span",{className:"ml-3 text-xs font-mono text-[#64748b]",children:"optops analyze"}),a.jsxs("button",{onClick:S,className:"ml-auto flex items-center gap-1.5 text-xs font-bold text-[#94a3b8] hover:text-primary transition-colors","aria-label":"Copy the optops command",children:[a.jsx("span",{className:"material-symbols-outlined text-sm",children:g?"check":"content_copy"}),g?"Copied":"Copy"]})]}),a.jsxs("div",{className:"p-5 md:p-6 font-mono text-[12.5px] md:text-[13px] leading-relaxed text-[#cbd5e1] min-h-[520px] md:min-h-[560px]",children:[T&&a.jsxs("div",{children:[a.jsx("span",{className:"text-primary font-bold",children:"$"})," ",a.jsx("span",{className:"text-[#f8fafc]",children:Vs.slice(0,h)}),O&&a.jsx("span",{className:"inline-block w-[7px] h-[15px] -mb-[2px] bg-primary animate-pulse"})]}),l==="scanning"&&a.jsxs("div",{className:"mt-4 text-[#94a3b8]",children:[a.jsx("span",{className:"text-primary",children:ex[p%ex.length]})," ","Reading cluster…"]}),Xr(l,"scanned")&&l!=="scanning"&&a.jsxs("div",{className:"mt-4 text-[#4fb06a]",children:["✓ ",a.jsx("span",{className:"text-[#e2e8f0]",children:"Cluster scanned"})]}),a.jsxs("div",{className:"mt-5 space-y-4",children:[Xr(l,"snapshot")&&a.jsx(Eu,{title:"Cluster Snapshot",children:C5.map(([D,E])=>a.jsx(tx,{label:D,value:E},D))}),Xr(l,"utilization")&&a.jsx(Eu,{title:"Utilization",children:O5.map((D,E)=>a.jsxs("div",{className:E?"mt-4":"",children:[a.jsx("div",{className:"text-[#e2e8f0]",children:D.label}),a.jsxs("div",{className:"flex items-center gap-3 mt-1.5",children:[a.jsx(q5,{pct:D.pct,animate:!n}),a.jsxs("span",{className:"text-[#f8fafc] shrink-0",children:[D.pct,"% used"]})]}),a.jsx("div",{className:"text-[#64748b] mt-1.5 text-[11.5px] md:text-xs",children:D.detail})]},D.label))}),Xr(l,"savings")&&a.jsxs(Eu,{title:"Estimated optops Savings",accent:!0,children:[E5.map(([D,E])=>a.jsx(tx,{label:D,value:E},D)),a.jsx("div",{className:"h-px bg-[#ffffff1a] my-3"}),a.jsxs("div",{className:"flex items-baseline justify-between gap-4 flex-wrap",children:[a.jsx("span",{className:"text-primary font-bold",children:"Est. total savings"}),a.jsx("span",{className:"text-primary font-bold whitespace-nowrap",children:D5})]}),a.jsxs("p",{className:"text-[#64748b] mt-3 text-[11px] md:text-[11.5px] leading-relaxed",children:["Estimate from public list prices — not a quote. Basis: usage scaled to a ~70% ceiling. Detail: ",a.jsx("span",{className:"text-[#94a3b8]",children:"optops analyze --explain"}),"."]})]})]})]})]})})},Eu=({title:n,accent:s=!1,children:o})=>a.jsxs(se.div,{initial:{opacity:0,y:8}
19,animate:{opacity:1,y:0},transition:{duration:.35,ease:"easeOut"},className:`relative rounded-lg border px-4 pt-5 pb-4 ${s?"border-primary/40 bg-primary/[0.06]":"border-[#ffffff1a]"}`,children:[a.jsx("span",{className:`absolute -top-2 left-3 px-2 bg-[#0b0611] text-[11px] tracking-wide ${s?"text-primary":"text-[#64748b]"}`,children:n}),o]}),tx=({label:n,value:s})=>a.jsxs("div",{className:"flex items-baseline justify-between gap-4 py-[3px]",children:[a.jsx("span",{className:"text-[#94a3b8]",children:n}),a.jsx("span",{className:"text-[#f8fafc] text-right whitespace-nowrap",children:s})]}),q5=({pct:n,animate:s})=>a.jsx("span",{className:"flex-1 h-2 rounded-full bg-[#ffffff1a] overflow-hidden",children:a.jsx(se.span,{className:"block h-full rounded-full bg-primary",initial:s?{width:0}:!1,animate:{width:`${n}%`},transition:{duration:.7,ease:"easeOut",delay:.15}})}),nx=()=>{const[n,s]=j.useState(!1),o=async()=>{try{await navigator.clipboard.writeText(Vs),s(!0),setTimeout(()=>s(!1),1800)}catch{}};return a.jsxs("button",{onClick:o,className:"group inline-flex items-center gap-3 bg-white/5 border border-primary/30 rounded-xl px-5 py-4 font-mono text-sm md:text-base text-white hover:border-primary/60 hover:bg-white/[0.07] transition-colors neon-glow","aria-label":"Copy the optops command to your clipboard",children:[a.jsx("span",{className:"text-primary font-bold",children:"$"}),a.jsx("span",{children:Vs}),a.jsx("span",{className:"material-symbols-outlined text-base text-slate-400 group-hover:text-primary transition-colors",children:n?"check":"content_copy"}),a.jsx("span",{className:"sr-only",children:n?"Copied to clipboard":""})]})},P5=[{question:"What is OptOps and who is it for?",answer:"OptOps is an autonomous Kubernetes cost-optimization platform built for DevOps, platform, and FinOps teams running EKS, GKE, AKS, or any CNCF-compliant cluster. It consolidates nodes, automates spot, and rightsizes pods continuously — and on AWS it uses container live migration to do it without disrupting running workloads (early access on GKE and AKS)."},{question:"Does OptOps make changes to my infrastructure?",answer:"Only when you tell it to — and you ramp into it. OptOps starts in read-only analysis mode. Shadow mode then shows you every action it would take — every rightsize, consolidation, and migration — before anything is enabled. From there you switch on automation per capability and per cluster, at your own pace."},{question:"How does OptOps access my Kubernetes cluster?",answer:"A lightweight in-cluster agent collects metadata and utilization metrics. Sensitive data such as secrets and environment variables are never collected — and optimization decisions are made inside your cluster, not on our SaaS."},{question:"What kind of cost savings can I expect?",answer:"Teams typically see a 30–70% reduction in Kubernetes infrastructure costs depending on current overprovisioning, and most see 30–40% in the first month. Savings estimates are shown clearly before any action is taken — and realized savings are reported separately from remaining opportunity, never netted together."},{question:"Does OptOps replace my autoscaler or FinOps tools?",answer:"It can work alongside Cluster Autoscaler and Karpenter, or take over node optimization when you're ready. The OptOps node engine stays stock-Karpenter-compatible, so there's no lock-in: if you ever leave OptOps, you leave with working Karpenter — not a proprietary controller. A guided Cluster Autoscaler to Karpenter migration with preflight checks, a canary node, and rollback is available in early access."},{question:"What happens to stateful workloads during a migration?",answer:"Every workload is checked for migration eligibility first — OptOps only live-migrates what it can move safely, and tells you honestly when it can't. Databases get extra care: application-consistent handling for Postgres, MongoDB, and MySQL is part of the stateful-safety engineering behind every move."},{question:"Is OptOps safe for regulated or enterprise environments?",answer:"Yes. OptOps is designed for BFSI, fintech, gov-tech, and enterprise environments. It starts read-only, collects no secrets, keeps decision-making inside your cluster, and g
19ives you full auditability. The platform has completed an independent third-party security assessment, and ISO certification is in progress."}],ht=({children:n})=>a.jsxs("div",{className:"bg-background-dark font-display text-white min-h-screen flex flex-col",children:[a.jsx(Ww,{}),a.jsxs("main",{className:"flex-1 flex flex-col items-center relative",children:[a.jsxs("div",{className:"absolute top-0 left-1/2 -translate-x-1/2 w-full h-[400px] pointer-events-none overflow-hidden -z-10",children:[a.jsx("div",{className:"absolute -top-48 left-1/4 w-96 h-96 bg-primary/10 blur-[120px] rounded-full"}),a.jsx("div",{className:"absolute top-0 right-1/4 w-96 h-96 bg-purple-600/5 blur-[120px] rounded-full"})]}),n]}),a.jsx(Yw,{})]}),I5=typeof window>"u"?!1:{opacity:0,y:24},bt=({children:n,delay:s=0,className:o=""})=>a.jsx(se.div,{className:o,initial:I5,whileInView:{opacity:1,y:0},viewport:{once:!0,margin:"-80px"},transition:{duration:.6,delay:s,ease:"easeOut"},children:n}),Jr=[{id:"steady",duration:2200},{id:"plan",duration:1700},{id:"pack",duration:3e3},{id:"tune",duration:2600},{id:"hold",duration:2600}],wo={steady:0,plan:1,pack:2,tune:3,hold:4},$w={A:"rgba(175, 37, 244, 0.6)",B:"rgba(96, 165, 250, 0.55)",C:"rgba(34, 197, 94, 0.5)",D:"rgba(232, 121, 249, 0.55)"},Qw=[{id:"gpu-0",keeper:!0,before:["A","A"],arrives:["A"],watts:412,utilBefore:34},{id:"gpu-1",keeper:!0,before:["B","B"],arrives:["B"],watts:405,utilBefore:31},{id:"gpu-2",keeper:!0,before:["C","C"],arrives:["C"],watts:418,utilBefore:29},{id:"gpu-3",keeper:!0,before:["D","D"],arrives:["D"],watts:409,utilBefore:33},{id:"gpu-4",keeper:!1,before:["A","B"],arrives:[],watts:411,utilBefore:30},{id:"gpu-5",keeper:!1,before:["C","D"],arrives:[],watts:408,utilBefore:28}],U5=7,Zw=118,B5=.93,_5={steady:"6 GPUs · 12 MIG slices scattered · avg 31% SM utilisation",plan:"packing plan computed · every move risk-scored before it runs",pack:"slices packed onto 4 GPUs — freed cards still draw idle power",tune:"clocks tuned · freed GPUs released as sellable capacity",hold:"same jobs on 4 GPUs · 2 sellable · 38% less energy"},V5=[{label:"Plan",phases:["plan"]},{label:"Pack",phases:["pack"]},{label:"Tune & sell",phases:["tune","hold"]}],L5=(n,s)=>{const o=wo[s];return n?o>=3?{borderColor:"rgba(34, 197, 94, 0.5)",backgroundColor:"rgba(34, 197, 94, 0.04)"}:o>=1?{borderColor:"rgba(175, 37, 244, 0.6)",backgroundColor:"rgba(175, 37, 244, 0.05)"}:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)"}:o>=3?{borderColor:"rgba(34, 197, 94, 0.65)",backgroundColor:"rgba(34, 197, 94, 0.07)"}:o===2?{borderColor:"rgba(245, 158, 11, 0.5)",backgroundColor:"rgba(245, 158, 11, 0.05)"}:o===1?{borderColor:"rgba(245, 158, 11, 0.5)",backgroundColor:"rgba(28, 16, 34, 1)"}:{borderColor:"rgba(255, 255, 255, 0.1)",backgroundColor:"rgba(28, 16, 34, 1)"}},G5=(n,s)=>{const o=wo[s];return n.keeper?o>=2?68+n.before.length*4+n.arrives.length*4:n.utilBefore:o>=2?0:n.utilBefore},e0=(n,s)=>{const o=wo[s];return n.keeper?o>=3?Math.round(n.watts*B5):n.watts:o>=3?0:o===2?Zw:n.watts},H5=n=>Qw.reduce((s,o)=>s+e0(o,n),0),K5=({gpu:n,phase:s})=>{const o=wo[s],l=G5(n,s),d=e0(n,s),h=!n.keeper&&o>=3,m=n.keeper?[...n.before.map(p=>({tenant:p,arriving:!1})),...n.arrives.map(p=>({tenant:p,arriving:!0}))]:n.before.map(p=>({tenant:p,arriving:!1}));return a.jsxs(se.div,{className:`relative border rounded-xl p-2.5 sm:p-3 flex flex-col ${s==="plan"?"border-dashed":""}`,initial:!1,animate:L5(n.keeper,s),transition:{duration:.5},children:[a.jsxs("div",{className:"flex items-center justify-between mb-2",children:[a.jsx("span",{className:"text-[10px] sm:text-[11px] font-mono font-bold text-slate-300 truncate",children:n.id}),a.jsx("span",{className:`w-2 h-2 rounded-full ${h?"bg-green-400":l>50?"bg-green-500":"bg-slate-500"}`})]}),a.jsx("div",{className:"grid grid-cols-7 gap-[3px] mb-2.5",children:Array.from({length:U5},(p,f)=>{const g=m[f],b=g?g.arriving?o>=2:n.keeper||o<2:!1;return a.jsx(se.span,{className:"h-5 sm:h-6 rounded-[3px] border border-white/10",initial:!1,animate:{opacity:b?1:g?.15:.3,scale:b?1:.75,backgroundColor:g&&b?$w[g.tenant]:"rgba(255, 255, 255, 0.04)"},transition:{duration:.4,delay:g?.arriving&&o>=2?.3+f*.12:0}},f)})}),a.jsxs("div",{children:[a.jsx("div",{className:"h-1.5 rounded-full bg-white/5 overflow-hidden",children:a.jsx(se.div,{className:"h-full rounded-full",initial:!1,animate:{width:`${l}%`,backgroundColor:l>50?"rgba(34, 197, 94, 0.8)":!n.keeper&&o>=2?"rgba(245, 158, 11, 0.6)":"rgba(175, 37, 244, 0.6)"},transition:{duration:.7}})}),a.jsxs("div",{className:"flex items-center justify-between mt-1",children:[a.jsxs("span",{className:"text-[10px] font-mono text-slate-400 tabular-nums",children:[l,"% SM"]}),a.jsx("span",{className:`text-[10px] font-mono tabular-nums ${d===0?"text-green-400 font-bold":d===Zw?"text-amber-400":"text-slate-400"}`,children:d===0?"0 W":`${d} W`})]})]}),a.jsx(zt,{children:h&&a.jsx(se.div,{className:"absolute inset-0 flex items-center justify-center rounded-xl",initial:{opacity:0}
19,animate:{opacity:1},exit:{opacity:0},transition:{duration:.4},children:a.jsx("span",{className:"px-2 py-1 rounded-md bg-green-500/15 border border-green-500/40 text-[10px] font-black uppercase tracking-[0.15em] text-green-400",children:"Sellable"})})})]})},F5=()=>{const n=yn(),[s,o]=j.useState(0),[l,d]=j.useState(0),h=n?"hold":Jr[s].id,m=wo[h];return j.useEffect(()=>{if(n)return;const p=setTimeout(()=>{s===Jr.length-1&&d(f=>f+1),o((s+1)%Jr.length)},Jr[s].duration);return()=>clearTimeout(p)},[s,n]),a.jsxs("div",{className:"glass-card rounded-2xl p-5 sm:p-6 w-full",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-x-3 gap-y-2 mb-5",children:[a.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-xl",children:"memory"}),a.jsx("span",{className:"text-sm sm:text-base font-bold text-white truncate",children:"GPU fleet optimization"})]}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(zt,{children:m>=3&&a.jsxs(se.div,{className:"flex items-center gap-1.5 bg-green-500/10 border border-green-500/20 px-2.5 py-1 rounded-full",initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},exit:{opacity:0,scale:.9},transition:{duration:.4},children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"sell"}),a.jsx("span",{className:"text-xs font-black text-green-400 whitespace-nowrap",children:"2 GPUs freed"})]})}),a.jsxs("div",{className:"flex items-center gap-1.5 bg-white/5 border border-white/10 px-2.5 py-1 rounded-full",children:[a.jsx("span",{className:"material-symbols-outlined text-amber-400 text-sm",children:"bolt"}),a.jsx("span",{className:"text-xs font-black text-white tabular-nums whitespace-nowrap",children:a.jsx(Ce,{value:H5(h),startOnView:!1,duration:.9,format:p=>`${(p/1e3).toFixed(2)} kW`})})]})]})]}),a.jsx("div",{className:"relative h-[334px] sm:h-[224px] mb-4",children:a.jsx(zt,{initial:!1,children:a.jsx(se.div,{className:"absolute inset-0 grid grid-cols-2 sm:grid-cols-3 gap-2.5",initial:{opacity:0}
19,animate:{opacity:1},exit:{opacity:0},transition:{duration:.5},children:Qw.map(p=>a.jsx(K5,{gpu:p,phase:h},p.id))},l)})}),a.jsxs("div",{className:"flex items-center justify-center gap-x-4 gap-y-1.5 mb-4 flex-wrap","aria-hidden":"true",children:[Object.entries($w).map(([p,f])=>a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-[3px] border border-white/10",style:{backgroundColor:f}}),a.jsxs("span",{className:"text-[10px] font-mono text-slate-400",children:["tenant ",p]})]},p)),a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-[3px] border border-white/10 bg-white/5"}),a.jsx("span",{className:"text-[10px] font-mono text-slate-400",children:"free slot"})]})]}),a.jsx("div",{className:"flex items-center justify-center gap-2.5 mb-3 font-mono text-[11px] uppercase tracking-widest","aria-hidden":"true",children:V5.map((p,f)=>a.jsxs(ge.Fragment,{children:[f>0&&a.jsx("span",{className:"text-slate-600",children:"→"}),a.jsx("span",{className:`transition-colors duration-300 ${p.phases.includes(h)?"text-primary font-bold":"text-slate-500"}`,children:p.label})]},p.label))}),a.jsx("div",{className:"border-t border-white/5 pt-3 text-center",children:a.jsx("p",{className:"text-xs font-mono text-slate-300",children:_5[h]})})]})},W5=1e3,ax={today:{label:"Today",caption:"idle draw and untuned clocks burn the envelope",segments:{serving:420,burn:310,cooling:210,headroom:60}},tuned:{label:"Tuned",caption:"same envelope — more serving compute, 280 kW freed to sell",segments:{serving:470,burn:90,cooling:160,headroom:280}}},sx=[{key:"serving",label:"Serving compute",color:"rgba(175, 37, 244, 0.7)",text:"text-white"},{key:"burn",label:"Idle + untuned burn",color:"rgba(245, 158, 11, 0.6)",text:"text-amber-400"},{key:"cooling",label:"Cooling overhead",color:"rgba(148, 163, 184, 0.35)",text:"text-slate-400"},{key:"headroom",label:"Sellable headroom",color:"rgba(34, 197, 94, 0.45)",text:"text-green-400"}],Y5=()=>{const n=yn(),[s,o]=j.useState("today"),l=n?"tuned":s,d=ax[l];return j.useEffect(()=>{if(n)return;const h=setTimeout(()=>{o(m=>m==="today"?"tuned":"today")},3600);return()=>clearTimeout(h)},[s,n]),a.jsxs("div",{className:"glass-card rounded-2xl p-5 sm:p-6 w-full",children:[a.jsxs("div",{className:"flex items-center justify-between gap-2 mb-5",children:[a.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg",children:"bolt"}),a.jsx("span",{className:"text-sm font-bold text-white truncate",children:"Facility power envelope"})]}),a.jsx("span",{className:"text-[10px] font-mono uppercase tracking-widest text-slate-500 whitespace-nowrap",children:"grid cap · 1.0 MW · fixed"})]}),a.jsxs("div",{className:"flex items-center gap-2 mb-3","aria-hidden":"true",children:[Object.entries(ax).map(([h,m])=>a.jsx("span",{className:`px-2 py-0.5 rounded font-mono text-[10px] uppercase tracking-widest border transition-colors duration-300 ${l===h?h==="tuned"?"border-green-500/40 bg-green-500/10 text-green-400 font-bold":"border-primary/40 bg-primary/10 text-primary font-bold":"border-white/10 text-slate-500"}`,children:m.label},h)),a.jsx("span",{className:"text-[11px] font-mono text-slate-400 ml-1 hidden sm:inline",children:d.caption})]}),a.jsxs("div",{className:"relative",children:[a.jsx("div",{className:"h-10 rounded-lg overflow-hidden flex gap-[2px] bg-white/5 border border-white/10 p-[2px]",children:sx.map(h=>a.jsx(se.div,{className:`h-full rounded-[5px] min-w-0 ${h.key==="headroom"?"border border-dashed border-green-500/60":""}`,initial:!1,animate:{width:`${d.segments[h.key]/W5*100}%`,backgroundColor:h.color},transition:{duration:.9,ease:[.16,1,.3,1]}},h.key))}),a.jsx("div",{className:"absolute -right-px -top-1.5 -bottom-1.5 border-r-2 border-dashed border-slate-500/60","aria-hidden":"true"})]}),a.jsx("div",{className:"grid grid-cols-2 sm:grid-cols-4 gap-x-4 gap-y-2 mt-4",children:sx.map(h=>a.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[a.jsx("span",{className:`w-2.5 h-2.5 rounded-[3px] shrink-0 border ${h.key==="headroom"?"border-dashed border-green-500/60":"border-white/10"}`,style:{backgroundColor:h.color}}),a.jsxs("div",{className:"min-w-0",children:[a.jsx("p",{className:"text-[10px] text-slate-400 leading-tight truncate",children:h.label}),a.jsx("p",{className:`text-xs font-black tabular-nums ${h.text}`,children:a.jsx(Ce,{value:d.segments[h.key],startOnView:!1,duration:.9,format:m=>`${Math.round(m)} kW`})})]})]},h.key))}),a.jsx("div",{className:"border-t border-white/5 pt-3 mt-4 text-center",children:a.jsx("p",{className:"text-[10px] text-slate-500",children:"Illustrative split for a 1 MW hall — actual gains depend on workload mix and are measured per deployment."})})]})},Du=[32,28,35,31],X5=2200,J5=()=>{const n=yn(),[s,o]=j.useState(0),l=n?Du[0]:Du[s];return j.useEffect(()=>{if(n)return;const d=setTimeout(()=>
19o(h=>(h+1)%Du.length),X5);return()=>clearTimeout(d)},[s,n]),a.jsxs("div",{className:"glass-card rounded-2xl p-5 sm:p-6 w-full h-full flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between gap-2 mb-5",children:[a.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg",children:"monitor_heart"}),a.jsx("span",{className:"text-sm font-bold text-white truncate",children:"One H100, as your metrics see it"})]}),a.jsx("span",{className:"px-2 py-0.5 rounded bg-amber-500/10 border border-amber-500/30 font-mono text-[10px] uppercase tracking-widest text-amber-400 whitespace-nowrap",children:"the idle gap"})]}),a.jsxs("div",{className:"flex-1 flex flex-col justify-center gap-6",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[a.jsx("span",{className:"text-xs text-slate-400",children:"Allocated to tenants"}),a.jsx("span",{className:"text-xs font-black text-white tabular-nums",children:"100%"})]}),a.jsx("div",{className:"h-7 rounded-lg bg-white/5 border border-white/10 p-[2px]",children:a.jsx("div",{className:"h-full w-full rounded-[5px]",style:{backgroundColor:"rgba(175, 37, 244, 0.6)"}})}),a.jsx("p",{className:"text-[10px] font-mono text-slate-500 mt-1",children:"scheduler view · card handed out whole · “busy”"})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center justify-between mb-1.5",children:[a.jsx("span",{className:"text-xs text-slate-400",children:"Actually computing (SM-active)"}),a.jsx("span",{className:"text-xs font-black text-green-400 tabular-nums",children:a.jsx(Ce,{value:l,startOnView:!1,duration:1.4,format:d=>`${Math.round(d)}%`})})]}),a.jsxs("div",{className:"h-7 rounded-lg bg-white/5 border border-white/10 p-[2px] flex gap-[2px]",children:[a.jsx(se.div,{className:"h-full rounded-[5px] shrink-0",initial:!1,animate:{width:`${l}%`},transition:{duration:1.4,ease:[.16,1,.3,1]},style:{backgroundColor:"rgba(34, 197, 94, 0.6)"}}),a.jsx("div",{className:"h-full rounded-[5px] flex-1 flex items-center justify-center overflow-hidden",style:{backgroundImage:"repeating-linear-gradient(45deg, rgba(245, 158, 11, 0.28) 0 6px, rgba(245, 158, 11, 0.06) 6px 12px)"},children:a.jsx("span",{className:"text-[9px] font-mono uppercase tracking-widest text-amber-400 whitespace-nowrap px-2",children:"idle — burned CapEx"})})]}),a.jsx("p",{className:"text-[10px] font-mono text-slate-500 mt-1",children:"silicon view · model parked in VRAM · barely computing"})]})]}),a.jsx("div",{className:"border-t border-white/5 pt-3 mt-5",children:a.jsxs("p",{className:"text-[11px] text-slate-400 leading-relaxed",children:["A GPU can hold a model in VRAM while doing almost no computing — allocation says busy, the silicon is idle. That gap is ",a.jsx("span",{className:"text-white font-bold",children:"$25–40K per H100 per year"}),a.jsx("span",{className:"text-slate-500",children:" (Introl, 2025)"}),"."]})})]})},zu=[{label:"Your accelerators",icon:"memory"},{label:"Air-gapped deployment",icon:"cloud_off"},{label:"Optimization engine",icon:"neurology"},{label:"Risk-scored recs",icon:"fact_check"},{label:"You approve",icon:"how_to_reg",gate:!0},{label:"OptOps acts",icon:"bolt",terminal:!0}],$5=850,Q5=2400,Z5=(n,s)=>n==="pending"?"border-white/10 bg-white/[0.03] text-slate-500":n==="active"?s.gate?"border-primary bg-primary/15 text-white shadow-[0_0_16px_rgba(175,37,244,0.35)]":"border-primary/70 bg-primary/10 text-white":s.terminal?"border-green-500/50 bg-green-500/10 text-green-400":s.gate?"border-primary/50 bg-primary/10 text-primary":"border-primary/30 bg-primary/5 text-slate-300",e4=()=>{const n=yn(),[s,o]=j.useState(0),l=n?zu.length:s;return j.useEffect(()=>{if(n)return;const d=s===zu.length,h=setTimeout(()=>o(d?0:s+1),d?Q5:$5);return()=>clearTimeout(h)},[s,n]),a.jsxs("div",{className:"glass-card rounded-2xl p-6 sm:p-7 w-full",children:[a.jsxs("div",{className:"flex items-center justify-between gap-2 mb-5",children:[a.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg",children:"conveyor_belt"}),a.jsx("span",{className:"text-sm font-bold text-white truncate",children:"How a change actually ships"})]}),a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-widest text-slate-500 
19whitespace-nowrap",children:"no hidden automation"})]}),a.jsx("div",{className:"flex flex-col md:flex-row md:items-center gap-1.5 md:gap-2",children:zu.map((d,h)=>{const m=h<l?"done":h===l?"active":"pending",p=h>0&&h<=l;return a.jsxs(ge.Fragment,{children:[h>0&&a.jsx("span",{className:`material-symbols-outlined text-base shrink-0 self-center rotate-90 md:rotate-0 transition-colors duration-300 ${p?"text-primary":"text-slate-600"} ${h===l&&!n?"animate-pulse":""}`,"aria-hidden":"true",children:"arrow_forward"}),a.jsxs("div",{className:`flex md:flex-col items-center md:justify-center gap-2 md:gap-1.5 px-3 py-2 md:py-3 rounded-xl border md:flex-1 md:min-w-0 transition-all duration-300 ${Z5(m,d)}`,children:[a.jsx("span",{className:"material-symbols-outlined text-lg shrink-0",children:d.terminal&&m==="done"?"check_circle":d.icon}),a.jsx("span",{className:"font-mono text-[10px] sm:text-[11px] md:text-center leading-tight whitespace-nowrap md:whitespace-normal",children:d.label})]})]},d.label)})}),a.jsx("div",{className:"border-t border-white/5 pt-3 mt-5 text-center",children:a.jsx("p",{className:"text-[11px] font-mono text-slate-400",children:"write access exists only for approved changes — scoped per action, temporary, revocable, fully logged"})})]})},t4=[{icon:"verified_user",label:"Read-only & sovereign"},{icon:"cloud_off",label:"Air-gap capable"},{icon:"handshake",label:"Pay on verified gains"},{icon:"timer",label:"Installs in minutes"}],n4=[{value:"30–50%",tone:"text-amber-400",label:"typical GPU utilisation in AI clusters",source:"NVIDIA, 2026"},{value:"$25–40K",tone:"text-amber-400",label:"per H100 — idle capacity burns CapEx",source:"Introl"},{value:"#1",tone:"text-white",label:"power is becoming the binding constraint on data-centre buildout",source:"Goldman Sachs"},{value:"~2×",tone:"text-white",label:"data-centre electricity consumption by 2030 — 485 → ~950 TWh",source:"IEA"}],a4=[{icon:"view_in_ar",title:"Accelerators allocated whole",text:"Many scheduling setups allocate an entire GPU per job — leaving unused compute and memory capacity stranded."},{icon:"trending_up",title:"Provisioned for peak",text:"Tenants reserve for peak demand and sit idle off-peak. The buffer becomes permanent waste."},{icon:"memory_alt",title:"“Loaded” ≠ “active”",text:"A GPU can hold a model in VRAM while doing almost no computing. Allocation metrics say busy — the silicon is idle."}],s4=["DCGM","Grafana","Run:ai","Kueue","NVIDIA DRA"],i4=["Something that safely tunes power and packs MIG — continuously","Right-sizing that adapts as tenant jobs change","Reclaiming idle GPUs without killing running jobs","Execution — not another utilisation dashboard"],o4=[{icon:"grid_view",title:"MIG packing & fractionalisation",text:"Slice and pack GPUs so multiple tenants and jobs share one card safely — more workloads per accelerator."},{icon:"content_cut",title:"Right-size memory & compute",text:"Match VRAM and SM allocation to what jobs actually use — not the whole 80 GB card."},{icon:"speed",title:"Real SM-utilisation uplift",text:"Lift actual compute activity, not just allocation — turn “loaded” GPUs into working ones."},{icon:"bolt",title:"Power & clock tuning",text:"Tune GPU power caps and clocks to each workload — large energy savings with no loss on the jobs that matter."},{icon:"device_thermostat",title:"Power-aware scheduling",text:"Place and pack jobs to run inside your power and thermal budget — never blow the cap."},{icon:"pause_circle",title:"Safe preemption + checkpointing",text:"Pause lower-priority jobs to free GPUs for paying demand, then resume exactly where they stopped — no recomputation, no lost hours.",badge:"Design-partner beta"}],r4=[{icon:"rocket_launch",title:"Deploy",timing:"Air-gap ready",text:"Read-only agent, air-gapped deployment. Sits alongside your HPC stack — no infrastructure changes to start."},{icon:"monitoring",title:"Analyze",timing:"First scan",text:"Reads DCGM and accelerator telemetry — real SM and memory utilisation and power draw, per GPU and per job."},{icon:"lightbulb",title:"Advise",timing:"Ongoing",text:"MIG packing, power and clock tuning, and right-sizing recommendations — each tagged with ROI and a confidence score."},{icon:"savings",title:"Save",timing:"First week",text:"Apply safely under your policies and SLAs. Up to 30–38% more efficiency from the fleet you already own."}],l4=[{icon:"visibility_lock",title:"Read-only by default",text:"The agent needs no write access to deliver value — monitoring reads metrics, specs and usage only."},{icon:"verified",title:"Confidence score on every change",text:"Each recommendation carries a risk score; nothing low-confidence is ever proposed for automation."},{icon:"how_to_reg",title:"Human approval workflow",text:"You approve every change. Write access is scoped per action, temporary, revocable and fully logged."},{icon:"undo",title:"One-click rollback",text:"Any applied change can be reverted instantly — production safety is the architecture, not a feature."},{icon:"cloud_off",title:"On-prem & air-gap capable",text:"Runs fully inside sovereign, air-gapped environments — built for national labs and residency-bound compute."},{icon:"lock",title:"Data never leaves your cluster",text:"Only infrastru
19cture telemetry is read — never tenant applications, models, or data."}],c4=[{value:"30–38%",label:"energy saved",detail:"power/clock tuning + MIG packing, measured in deployment"},{value:"MIG + spot",label:"demonstrated live",detail:"autonomous right-sizing of jobs on real GPUs"},{value:"National HPC",label:"supercomputing deployment",detail:"accelerator/HPC proof with an authorised national supercomputing programme"}],d4=[{icon:"storefront",title:"More sellable capacity",text:"Pack + right-size → more tenants per GPU → more revenue from the same fleet. No new hardware."},{icon:"electric_bolt",title:"Reclaimed power headroom",text:"Efficiency frees watts → deploy and sell more compute inside the same envelope. For a power-bound facility, efficiency is capacity."},{icon:"event_upcoming",title:"Defer the next buildout",text:"Get more from installed accelerators before the next multi-million-dollar cluster — better ROIC per rack."}],u4=[{badge:"Live",badgeClass:"bg-green-500/10 border-green-500/30 text-green-400",title:"Kubernetes + GPU",period:"Today",items:["MIG packing, power & clock tuning","Right-sizing + spot placement","Delivering 30–38% efficiency","Live with customers"]},{badge:"Beta",badgeClass:"bg-primary/10 border-primary/30 text-primary",title:"HPC & GPU cloud",period:"Now",items:["Preemption + checkpointing (beta)","National supercomputing deployment","S
19overeign / on-prem / air-gapped","Multi-tenant, SLA-aware"]},{badge:"Vision",badgeClass:"bg-white/5 border-white/15 text-slate-400",title:"AI tokens & inference",period:"2027+",items:["Inference & token-cost optimization","GPU-fleet & AI-workload orchestration","Policy- and intent-driven","The optimization layer for all compute"]}],h4=[{title:"Beta on your cluster",text:"Preemption + checkpointing + power optimization on a scoped slice of your fleet — measure the real gain before you commit."},{title:"Opportunity report",text:"An infrastructure analysis that identifies high-impact optimization opportunities and quantifies potential savings in dollars and watts."},{title:"Deep-dive + commercials",text:"Power-consumption and accelerator-optimization detail, and a pay-on-verified-gains model agreed in writing before anything begins."}],jn=({index:n,eyebrow:s,title:o,sub:l})=>a.jsxs(bt,{className:"text-center mb-10",children:[a.jsxs("p",{className:"font-mono text-[11px] uppercase tracking-[0.3em] text-primary mb-3",children:[n," · ",s]}),a.jsx("h2",{className:"text-2xl md:text-4xl font-black text-white mb-3",children:o}),l&&a.jsx("p",{className:"text-slate-400 text-sm max-w-2xl mx-auto",children:l})]}),$r=({tinted:n=!1,children:s})=>a.jsx("div",{className:`w-full ${n?"bg-primary/5 border-y border-white/5":""}`,children:s}),t0=()=>a.jsxs(a.Fragment,{children:[a.jsxs("section",{className:"w-full relative overflow-hidden pt-24 pb-14",children:[a.jsxs("div",{className:"absolute inset-0 pointer-events-none","aria-hidden":"true",children:[a.jsx("div",{className:"hero-dotgrid absolute inset-0"}),a.jsx("div",{className:"absolute -top-32 left-[15%] w-[560px] h-[320px] bg-primary/10 blur-[110px] rounded-full"}),a.jsx("div",{className:"absolute top-16 right-[8%] w-64 h-64 bg-purple-600/10 blur-[100px] rounded-full"})]}),a.jsxs("div",{className:"max-w-7xl w-full mx-auto px-6 grid grid-cols-1 lg:grid-cols-2 gap-10 lg:gap-12 items-center relative",children:[a.jsxs("div",{className:"text-center lg:text-left",children:[a.jsx("p",{className:"text-xs font-bold text-primary uppercase tracking-[0.2em] mb-4",children:"For HPC & AI Data Centers"}),a.jsxs("h1",{className:"text-4xl md:text-5xl font-black tracking-tight text-white leading-[1.08] mb-5",children:["Turn idle accelerators into"," ",a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:"sellable capacity."})]}),a.jsxs("p",{className:"text-slate-400 leading-relaxed text-lg max-w-xl mx-auto lg:mx-0 mb-8",children:["OptOps reads real GPU telemetry, packs MIG slices, tunes power and clocks, and reclaims idle silicon — up to ",a.jsx("span",{className:"text-white font-bold",children:"30–38% more efficiency"})," from the fleet you already own, without buying a single new accelerator."]}),a.jsxs("div",{className:"flex flex-wrap justify-center lg:justify-start gap-4 mb-8",children:[a.jsx("a",{href:ut,className:"bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Book a Demo"}),a.jsx(ie,{to:"/bookdemo",className:"bg-white/5 border border-white/10 text-white px-8 py-4 rounded-xl font-bold hover:bg-white/10 transition-colors",children:"Get an Opportunity Report"})]}),a.jsx("div",{className:"flex flex-wrap justify-center lg:justify-start gap-2",children:t4.map(n=>a.jsxs("span",{className:"flex items-center gap-1.5 px-3 py-1.5 rounded-full bg-white/5 border border-white/10 text-xs font-semibold text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-sm",children:n.icon}),n.label]},n.label))})]}),a.jsx(bt,{delay:.15,children:a.jsx(F5,{})})]})]}),a.jsx($r,{tinted:!0,children:a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"01",eyebrow:"The problem",title:a.jsx(a.Fragment,{children:"Your fleet is half idle. The meter isn’t."}),sub:"Compute demand is exploding and power is the new ceiling. You can’t buy your way out — accelerators are scarce and the grid is capped. The only fast lever is getting more from the fleet you already own."}),a.jsx(bt,{children:a.jsx("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-3 mb-8",children:n4.map(n=>a.jsxs("div",{className:"glass-card rounded-2xl p-5 flex flex-col hover:border-primary/30 transition-colors",children:[a.jsx("p",{className:`text-2xl md:text-3xl font-black tabular-nums mb-2 ${n.tone}`,children:n.value}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed flex-1",children:n.label}),a.jsxs("p",{className:"text-[10px] font-mono text-slate-500 mt-3 uppercase tracking-wider",children:["— ",n.source]})]},n.label))})}),a.jsx(bt,{delay:.1,children:a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-3 items-stretch",children:[a.jsx("div",{className:"lg:col-span-2",children:a.jsx(J5,{})}),a.jsx("div",{className:"flex flex-col gap-3",children:a4.map((n,s)=>a.jsxs("div",{className:"glass-card rounded-2xl p-4 flex-1 flex items-start gap-3",children:[a.jsx("div",{className:"w-9 h-9 rounded-lg bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-xl",children:n.icon})}),a.jsxs("div",{className:"min-w-0",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsxs("span",{className:"text-[10px] font-mono text-slate-500",children:["0",s+1]}),a.jsx("h3",{className:"text-sm font-bold text-white",children:n.title})]}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed",children:n.text})]})]},n.title))})]})})]})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"02",eyebrow:"Why today’s tools fall short",title:"Everyone can see idle GPUs. The hard part is safely eliminating the waste.",sub:"Your stack already measures utilisation and places jobs — and idle stays high. Seeing waste and safely removing it are two different jobs."}),a.jsx(bt,{children:a.jsxs("div",{className:"glass-card rounded-2xl overflow-hidden",children:[a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-[1fr_auto_1fr]",children:[a.jsxs("div",{className:"p-8 md:p-10",children:[a.jsx("p",{className:"text-xs font-bold uppercase tracking-widest text-slate-500 mb-5",children:"What you already have"}),a.jsx("div",{className:"flex flex-wrap gap-2 mb-5",children:s4.map(n=>a.jsx("span",{className:"px-3 py-1.5 rounded-lg bg-white/5 border border-white/10 text-sm font-mono text-slate-300",children:n},n))}),a.jsxs("p",{className:"text-slate-400 text-sm leading-relaxed",children:["They monitor, allocate and orchestrate — but the ",a.jsx("span",{className:"text-white font-bold",children:"optimization loop"})," is still missing."]})]}),a.jsxs("div",{className:"hidden md:flex flex-col items-center justify-center px-0 relative","aria-hidden":"true",children:[a.jsx("div",{className:"absolute inset-y-8 left-1/2 w-px bg-gradient-to-b from-transparent via-white/15 to-transparent"}),a.jsx("span",{className:"relative w-10 h-10 rounded-full bg-surface-dark border border-primary/40 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined text-lg",children:"arrow_forward"})})]}),a.jsxs("div",{className:"p-8 md:p-10 border-t md:border-t-0 border-white/5",children:[a.jsx("p",{className:"text-xs font-bold uppercase tracking-widest text-primary mb-5",children:"What’s still missing"}),a.jsx("ul",{className:"space-y-3.5",children:i4.map(n=>a.jsxs("li",{className:"flex items-start gap-3",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg shrink-0 mt-0.5",children:"arrow_forward"}),a.jsx("span",{className:"text-slate-300 text-sm leading-relaxed",children:n})]},n))})]})]}),a.jsxs("div",{className:"bg-primary/10 border-t border-primary/20 px-8 py-4 flex flex-col sm:flex-row items-center justify-center gap-2 text-center",children:[a.jsx("span",{className:"font-mono text-[10px] uppercase tracking-[0.25em] text-primary font-bold",children:"The gap we close"}),a.jsx("span",{className:"hidden sm:inline text-slate-500",children:"—"}),a.jsxs("span",{className:"text-sm text-slate-300",children:["the same Analyze → Advise → Act engine, ",a.jsx("span",{className:"text-white font-bold",children:"GPU-aware"}),"."]})]})]})})]}),a.jsx($r,{tinted:!0,children:a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"03",eyebrow:"Accelerator optimization",title:"The levers that turn idle silicon into revenue",sub:"Every lever is risk-scored, opt-in, and applied under your policies and SLAs — with zero risk to running jobs."}),a.jsx(bt,{children:a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:o4.map((n,s)=>a.jsxs("article",{className:"group relative glass-card rounded-2xl p-6 hover:border-primary/40 hover:-translate-y-1 transition-all duration-300 flex flex-col",children:[a.jsx("div",{className:"h-1 w-10 rounded-full bg-gradient-to-r from-primary to-accent-purple opacity-50 group-hover:opacity-100 group-hover:w-16 transition-all duration-300 mb-5"}),a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"w-11 h-11 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined text-2xl",children:n.icon})}),n.badge?a.jsx("span",{className:"px-2 py-1 rounded bg-primary/10 border border-primary/30 text-[10px] uppercase font-bold text-primary",children:n.badge}):a.jsxs("span",{className:"text-2xl font-black text-white/10",children:["0",s+1]})]}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed flex-1",children:n.text})]},n.title))})})]})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"04",eyebrow:"Power & efficiency",title:"Power is your ceiling. We raise it.",sub:"For a power-bound data center, efficiency is capacity — every watt saved is a watt you can sell."}),a.jsx(bt,{children:a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-4 items-stretch",children:[a.jsx("div",{className:"lg:col-span-2",children:a.jsx(Y5,{})}),a.jsxs("div",{className:"flex flex-col gap-4",children:[a.jsxs("div",{className:"glass-card rounded-2xl p-6 flex-1 flex flex-col justify-center hover:border-green-500/30 transition-colors",children:[a.jsx("p",{className:"text-4xl font-black text-green-400 tabular-nums mb-2",children:"30–38%"}),a.jsx("p",{className:"text-white font-bold text-sm mb-1",children:"less energy"}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed",children:"Measured in deployment — from power/clock tuning + MIG packing."})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-6 flex-1 flex flex-col justify-center hover:border-primary/30 transition-colors",children:[a.jsx("p",{className:"text-4xl font-black text-white tabular-nums mb-2",children:a.jsx(Ce,{value:41,format:n=>`~${Math.round(n)}%`})}),a.jsx("p",{className:"text-white font-bold text-sm mb-1",children:"of AI-cluster power goes to accelerators"}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed",children:"And they keep drawing it even when idle (research, 2026) — tuning GPU power is the single biggest efficiency lever you have."})]})]})]})})]}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"05",eyebrow:"How it works",title:"Air-gapped in. Savings out.",sub:"Sits alongside your stack, on-prem or air-gapped. Automation is opt-in, under your policies."}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-3 mb-8",children:r4.map((n,s)=>a.jsx(bt,{delay:s*.08,children:a.jsxs("div",{className:"relative glass-card rounded-2xl p-5 h-full hover:border-primary/30 transition-colors",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsx("div",{className:"w-9 h-9 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined text-xl",children:n.icon})}),a.jsx("span",{className:"text-2xl font-black text-white/10",children:s+1})]}),a.jsx("h3",{className:"text-base font-bold text-white mb-0.5",children:n.title}),a.jsx("p",{className:"text-[10px] font-mono uppercase tracking-widest text-primary mb-2",children:n.timing}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed",children:n.text})]})},n.title))}),a.jsx(bt,{delay:.1,children:a.jsx(e4,{})}),a.jsx(bt,{delay:.15,children:a.jsxs("div",{className:"glass-card rounded-2xl p-6 mt-4 grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-green-500/10 flex items-center justify-center text-green-400 shrink-0",children:a.jsx("span",{className:"material-symbols-outlined",children:"account_tree"})}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsx("h3",{className:"text-base font-bold text-white",children:"Slurm-native, today"}),a.jsx("span",{className:"px-2 py-0.5 rounded bg-green-500/10 border border-green-500/30 text-[10px] uppercase font-bold text-green-400",children:"Live"})]}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"We started where the world’s GPUs actually run — the scheduler behind virtually every supercomputer and national research cluster."})]})]}),a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined",children:"hub"})}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex items-center gap-2 mb-1",children:[a.jsx("h3",{className:"text-base font-bold text-white",children:"Kubernetes GPU, next"}),a.jsx("span",{className:"px-2 py-0.5 rounded bg-primary/10 border border-primary/30 text-[10px] uppercase font-bold text-primary",children:"In development"})]}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"The same engine, extending to K8s GPU fleets — backed by our production-proven Kubernetes platform. Design partners get first access."})]})]})]})})]}),a.jsx($r,{tinted:!0,children:a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"06",eyebrow:"Safe & sovereign",title:"Built to protect production — and your data.",sub:a.jsx(a.Fragment,{children:"The first question every operator asks: “what if this touches a tenant’s job — or their data?” The architecture is the answer."})}),a.jsx(bt,{children:a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:l4.map(n=>a.jsxs("article",{className:"glass-card rounded-2xl p-6 hover:border-primary/30 hover:-translate-y-0.5 transition-all duration-300",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:n.icon})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:n.text})]},n.title))})})]})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"07",eyebrow:"Proof",title:"Real GPUs. Real power savings."}),a.jsx(bt,{children:a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-3 mb-6",children:c4.map(n=>a.jsxs("div",{className:"glass-card rounded-2xl p-6 text-center hover:border-primary/30 transition-colors",children:[a.jsx("p",{className:"text-3xl md:text-4xl font-black text-primary tabular-nums mb-1",children:n.value}),a.jsx("p",{className:"text-white font-bold text-sm uppercase tracking-wider mb-2",children:n.label}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed",children:n.detail})]},n.label))})}),a.jsx(bt,{delay:.1,children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 border-l-4 border-l-primary flex items-start gap-4",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-2xl shrink-0 mt-0.5",children:"fact_check"}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs font-bold uppercase tracking
19-widest text-primary mb-3",children:"Where we actually are — the honest version"}),a.jsx("p",{className:"text-slate-300 text-sm leading-relaxed",children:"Live and proven on Kubernetes + GPU, delivering real accelerator utilisation and power savings today. Deployed with an authorised national supercomputing programme as our accelerator/HPC proof. Preemption and checkpointing are in design-partner beta — we’d prove them on your cluster together, on your workloads, before you commit. We don’t overclaim a finished HPC product: we bring a proven engine and prove it on your fleet."})]})]})})]}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"08",eyebrow:"The economics",title:"Idle accelerators are unsold inventory.",sub:"For a data center that sells capacity, every point of utilisation is revenue. Sweat the asset."}),a.jsx(bt,{children:a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4 mb-6",children:d4.map(n=>a.jsxs("article",{className:"glass-card rounded-2xl p-6 hover:border-primary/30 hover:-translate-y-0.5 transition-all duration-300",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:n.icon})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:n.text})]},n.title))})}),a.jsx(bt,{delay:.1,children:a.jsx("div",{className:"glass-card rounded-2xl p-6 text-center border border-green-500/20",children:a.jsxs("p",{className:"text-sm text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-lg align-middle mr-2",children:"handshake"}),a.jsx("span",{className:"text-white font-bold",children:"Commercial model: pay on verified savings and gains."})," Our upside is tied to yours — no savings, no bill."]})})})]}),a.jsx($r,{tinted:!0,children:a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"09",eyebrow:"Roadmap",title:"GPU today. All compute tomorrow.",sub:"One engine, expanding — Kubernetes to GPU to HPC to every substrate that runs AI."}),a.jsx(bt,{children:a.jsxs("div",{className:"relative",children:[a.jsx("div",{className:"hidden md:block absolute top-1/2 left-[8%] right-[8%] h-px bg-gradient-to-r from-green-500/40 via-primary/40 to-white/15 pointer-events-none","aria-hidden":"true"}),a.jsx("div",{className:"relative grid grid-cols-1 md:grid-cols-3 gap-4",children:u4.map(n=>a.jsxs("article",{className:"glass-card rounded-2xl p-6 flex flex-col hover:border-primary/30 transition-colors",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("span",{className:"text-xs font-bold uppercase tracking-widest text-slate-500",children:n.period}),a.jsx("span",{className:`px-2 py-1 rounded border text-[10px] uppercase font-bold ${n.badgeClass}`,children:n.badge})]}),a.jsx("h3",{className:"text-lg font-bold text-white mb-4",children:n.title}),a.jsx("ul",{className:"space-y-2 flex-1",children:n.items.map(s=>a.jsxs("li",{className:"flex items-start gap-2 text-slate-400 text-xs leading-relaxed",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-sm shrink-0 mt-0.5",children:"check"}),s]},s))})]},n.title))})]})})]})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-16",children:[a.jsx(jn,{index:"10",eyebrow:"Next steps",title:a.jsx(a.Fragment,{children:"Let’s prove it on your cluster."})}),a.jsx(bt,{children:a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-6 items-stretch",children:[a.jsx("div",{className:"flex flex-col gap-4",children:h4.map((n,s)=>a.jsxs("div",{className:"glass-card rounded-2xl p-5 flex items-start gap-4 flex-1",children:[a.jsx("span",{className:"w-8 h-8 rounded-full bg-primary/10 border border-primary/30 text-primary font-black text-sm flex items-center justify-center shrink-0",children:s+1}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-base font-bold text-white mb-1",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:n.text})]})]},n.title))}),a.jsxs("div",{className:"glass-card rounded-2xl p-10 text-center relative overflow-hidden flex flex-col justify-center",children:[a.jsx("div",{className:"absolute -top-24 -left-24 w-64 h-64 bg-primary/10 rounded-full blur-[80px]"}),a.jsx("h3",{className:"text-2xl font-bold text-white mb-4 relative z-10",children:"See how much capacity is hiding in your fleet"}),a.jsx("p",{className:"text-slate-400 mb-8 max-w-md mx-auto relative z-10",children:"We’ll walk 
19your cluster view, resource footprint, and cost insights live — then scope a beta on a slice of your fleet and measure the real gain."}),a.jsxs("div",{className:"relative z-10",children:[a.jsx("a",{href:ut,className:"inline-block bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Book a Demo"}),a.jsxs("p",{className:"mt-4 text-sm text-slate-400",children:["or ",a.jsx(ie,{to:"/company/contact-us",className:"text-primary font-bold hover:underline",children:"contact us"})," — founder-led, operator-built"]})]})]})]})})]}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 pb-16 text-center",children:a.jsxs("p",{className:"text-slate-400 text-sm",children:["Running Kubernetes in the cloud too? The same engine does"," ",a.jsx(ie,{to:"/node-consolidation",className:"text-primary font-bold hover:underline",children:"node consolidation"}),","," ",a.jsx(ie,{to:"/spot-automation",className:"text-primary font-bold hover:underline",children:"spot automation"}),", and"," ",a.jsx(ie,{to:"/live-migration",className:"text-primary font-bold hover:underline",children:"live migration"}),"."]})})]}),m4=()=>a.jsx(ht,{children:a.jsx(t0,{})}),Kt=({eyebrow:n,title:s,subtitle:o,actions:l})=>a.jsxs("section",{className:"pt-28 pb-8 relative w-full overflow-hidden",children:[a.jsxs("div",{className:"absolute inset-0 pointer-events-none","aria-hidden":"true",children:[a.jsx("div",{className:"hero-dotgrid absolute inset-0"}),a.jsx("div",{className:"absolute -top-32 left-1/2 -translate-x-1/2 w-[640px] h-[320px] bg-primary/10 blur-[110px] rounded-full"}),a.jsx("div",{className:"absolute top-10 right-[12%] w-56 h-56 bg-purple-600/10 blur-[100px] rounded-full"})]}),a.jsxs("div",{className:"max-w-4xl mx-auto px-6 text-center relative",children:[n&&a.jsx("p",{className:"text-xs font-bold text-primary uppercase tracking-[0.08em] mb-3",children:n}),a.jsx("h1",{className:"text-4xl md:text-5xl font-black tracking-tight text-white leading-tight mb-4",children:s}),a.jsx("p",{className:"max-w-2xl mx-auto text-slate-400 leading-relaxed text-lg",children:o}),l&&a.jsx("div",{className:"flex flex-wrap justify-center gap-4 mt-8",children:l})]})]}),p4=[{title:"Eligibility check",text:"Every workload is scanned for migration eligibility first. OptOps only live-migrates what it can move safely — and tells you honestly when it can’t.",icon:"fact_check"},{title:"Checkpoint",text:"The running container is checkpointed with CRIU — memory, process tree, and open file descriptors captured in place. Databases get application-consistent safety handling as part of the checkpoint pipeline.",icon:"photo_camera"},{title:"Restore",text:"The pod resumes on the destination node exactly where it left off. On AWS, it keeps its pod IP — open TCP connections never notice the move.",icon:"restart_alt"}],f4=[{title:"Spot interruption rescue",text:"When the cloud reclaims a spot node, OptOps live-migrates the workload off it before the deadline — proven against real AWS FIS interruption drills, with rescue completing in as little as 33 seconds and the same pod IP on the other side.",icon:"bolt"},{title:"Disruption-free consolidation",text:"Bin-packing normally means evicting pods and hoping they reschedule cleanly. With live migration, consolidation moves workloads instead of killing them — so the savings never cost you an incident.",icon:"balance"},{title:"Stateful workloads, handled honestly",text:"Application-consistent safety engineering for Postgres, MongoDB, and MySQL is built into the migration pipeline. Workloads that can’t be moved safely are refused, not gambled with.",icon:"database"}],g4=[{platform:"Amazon EKS",logo:"/logos/aws.svg",state:"Available",connections:"Available — same pod IP, unbroken TCP",highlight:!0},{platform:"Google GKE",logo:"/logos/gcp.svg",state:"Early access",connections:"On the roadmap",highlight:!1},{platform:"Azure AKS",logo:"/logos/azure.svg",state:"Early access",connections:"On the roadmap",highlight:!1}],n0=({embedded:n=!1}={})=>{const s=n?ge.Fragment:ht;return a.jsxs(s,{children:[a.jsx(Kt,{eyebrow:"Container Live Migration",title:"Move running pods. Drop nothing.",subtitle:"OptOps checkpoints eligible workloads with CRIU and restores them on another node — memory, process state, and on AWS even the pod IP and open TCP sessions come along.",actions:a.jsxs(a.Fragment,{children:[a.jsx("a",{href:ut,className:"bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"See it live — Book a Demo"}),a.jsx("a",{href:"https://console.optops.ai/login",className:"bg-white/5 border border-white/10 text-white px-8 py-4 rounded-xl font-bold hover:bg-white/10 transition-colors",children:"Sign Up / Sign In"})]})}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-8",children:a.jsx(Xw,{})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-10",children:"How a live migration works"}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:p4.map((o,l)=>a.jsxs("article",{className:"glass-card rounded-2xl p-6",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:o.icon})}),a.jsxs("span",{className:"text-xs font-bold uppercase tracking-widest text-slate-500",children:["Step ",l+1]})]}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:o.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:o.text})]},o.title))})]}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-10",children:"Why it changes the economics"}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:f4.map(o=>a.jsxs("article",{className:"glass-card rounded-2xl p-6 hover:border-primary/30 transition-colors",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:o.icon})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:o.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:o.text})]},o.title))})]}),a.jsxs("section",{className:"w-full max-w-4xl mx-auto px-6 py-12",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-4",children:"Platform support"}),a.jsx("p",{className:"text-slate-400 text-center text-sm max-w-xl mx-auto mb-8",children:"We say exactly what works where. State preservation and connection preservation are different guarantees — here is the honest matrix."}),a.jsx("div",{className:"glass-card rounded-2xl overflow-hidden",children:a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full text-sm text-left",children:[a.jsx("thead",{children:a.jsxs("tr",{className:"border-b border-white/10 text-xs uppercase tracking-wider text-slate-500",children:[a.jsx("th",{className:"px-6 py-4 font-bold",children:"Platform"}),a.jsx("th",{className:"px-6 py-4 font-bold",children:"State-preserving migration"}),a.jsx("th",{className:"px-6 py-4 font-bold",children:"Connection preservation"})]})}),a.jsx("tbody",{children:g4.map(o=>a.jsxs("tr",{className:"border-b border-white/5 last:border-0",children:[a.jsx("td",{className:"px-6 py-4 font-bold text-white",children:a.jsxs("span",{className:"flex items-center gap-3",children:[a.jsx("img",{src:o.logo,alt:"",className:"platform-logo h-5 w-auto"}),o.platform]})}),a.jsx("td",{className:`px-6 py-4 ${o.highlight?"text-green-400 font-bold":"text-primary font-semibold"}`,children:o.state}),a.jsx("td",{className:`px-6 py-4 ${o.highlight?"text-green-400 font-bold":"text-slate-400"}`,children:o.connections})]},o.platform))})]})})}),a.jsx("p",{className:"text-xs text-slate-500 text-center mt-4",children:"Live migration applies to eligible workloads. GPU workloads and multi-container pods are not currently supported — eligibility is checked per workload before any move."})]}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-12 pb-20",children:a.jsxs("div",{className:"glass-card rounded-2xl p-10 text-center relative overflow-hidden",children:[a.jsx("div",{className:"absolute -top-24 -left-24 w-64 h-64 bg-primary/10 rounded-full blur-[80px]"}),a.jsx("h3",{className:"text-2xl font-bold text-white mb-4 relative z-10",children:"Watch a pod survive a node move"}),a.jsx("p",{className:"text-slate-400 mb-8 max-w-lg mx-auto relative z-10",children:"Book a demo and we'll live-migrate a running workload in front of you — counter ticking, connection open."}),a.jsx("a",{href:ut,className:"inline-block bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform relative z-10",children:"Book a Demo"})]})})]})},ka=({heading:n,sub:s,cards:o,cols:l=3})=>a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[n&&a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-3",children:n}),s&&a.jsx("p",{className:"text-slate-400 text-center text-sm max-w-2xl mx-auto mb-10",children:s}),n&&!s&&a.jsx("div",{className:"mb-7"}),a.jsx("div",{className:`grid grid-cols-1 gap-4 ${l===2?"md:grid-cols-2":"md:grid-cols-3"}`,children:o.map(d=>a.jsxs("article",{className:"glass-card rounded-2xl p-6 hover:border-primary/30 transition-colors flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:d.icon})}),d.badge&&a.jsx("span",{className:"px-2 py-1 rounded bg-primary/10 border border-primary/30 text-[10px] uppercase font-bold text-primary",children:d.badge})]}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:d.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed flex-1",children:d.text})]},d.title))})]}),y4=({heading:n,sub:s,steps:o})=>a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-3",children:n}),s&&a.jsx("p",{className:"text-slate-400 text-center text-sm max-w-2xl mx-auto mb-10",children:s}),!s&&a.jsx("div",{className:"mb-7"}),a.jsxs("div",{className:"relative",children:[a.jsx("div",{className:"hidden md:block absolute top-1/2 left-[8%] right-[8%] h-px bg-gradient-to-r from-primary/40 via-primary/25 to-green-500/40 pointer-events-none","aria-hidden":"true"}),a.jsx("div",{className:"relative grid grid-cols-1 md:grid-cols-3 gap-4",children:o.map((l,d)=>a.jsxs("article",{className:"glass-card rounded-2xl p-6",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-4",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:l.icon})}),a.jsxs("span",{className:"text-xs font-bold uppercase tracking-widest text-slate-500",children:["Step ",d+1]})]}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:l.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:l.text})]},l.title))})]})]}),jo=({eyebrow:n,title:s,subtitle:o,children:l,ctaTitle:d,ctaText:h,embedded:m=!1})=>{const p=m?ge.Fragment:ht;return a.jsxs(p,{children:[a.jsx(Kt,{eyebrow:n,title:s,subtitle:o,actions:a.jsxs(a.Fragment,{children:[a.jsx("a",{href:ut,className:"bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Book a Demo"}),a.jsx("a",{href:"https://console.optops.ai/login",className:"bg-white/5 border border-white/10 text-white px-8 py-4 rounded-xl font-bold hover:bg-white/10 transition-colors",children:"Sign Up / Sign In"})]})}),l,a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-12 pb-20",children:a.jsxs("div",{className:"glass-card rounded-2xl p-10 text-center relative overflow-hidden",children:[a.jsx("div",{className:"absolute -top-24 -left-24 w-64 h-64 bg-primary/10 rounded-full blur-[80px]"}),a.jsx("h3",{className:"text-2xl font-bold text-white mb-4 relative z-10",children:d}),a.jsx("p",{className:"text-slate-400 mb-8 max-w-lg mx-auto relative z-10",children:h}),a.jsx("a",{href:ut,className:"inline-block bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform relative z-10",children:"Book a Demo"})]})})]})},ix={drain:{label:"Typical drain",fillPct:75,fillClass:"bg-gradient-to-r from-red-600 to-red-500",fillLabel:"evict → reschedule → pull → cold start",fillCaption:"~90s of downtime, if rescheduling goes well",downtime:90,dropped:100,state:"Lost",stateClass:"text-red-400"},rescue:{label:"OptOps rescue",fillPct:27,fillClass:"bg-gradient-to-r from-primary to-fuchsia-600",fillLabel:"live migration",fillC
19aption:"memory, state & pod IP moved — rescue completed in 33s in real AWS FIS drills",downtime:0,dropped:0,state:"Preserved",stateClass:"text-green-400"}},b4=()=>{const[n,s]=j.useState("rescue"),o=ix[n];return a.jsxs("div",{className:"glass-card rounded-2xl p-6 md:p-8 w-full",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4 mb-8",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"font-bold text-white",children:"The 2-minute window"}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:"What happens between the interruption notice and the node vanishing"})]}),a.jsx("div",{className:"flex items-center gap-1 bg-background-dark p-1 rounded-lg border border-white/5",children:Object.entries(ix).map(([l,d])=>a.jsx("button",{onClick:()=>s(l),className:`px-3 py-1.5 rounded-md text-xs font-bold uppercase tracking-wide transition-colors ${n===l?"bg-primary text-white":"text-slate-400 hover:text-white"}`,children:d.label},l))})]}),a.jsxs("div",{className:"mb-2 flex justify-between text-[10px] font-bold uppercase tracking-wider text-slate-500",children:[a.jsx("span",{className:"text-red-400",children:"Interruption notice"}),a.jsx("span",{children:"node reclaimed · 120s"})]}),a.jsxs("div",{className:"relative h-12 bg-background-dark border border-white/10 rounded-lg overflow-hidden",children:[a.jsx(se.div,{className:`absolute inset-y-0 left-0 ${o.fillClass} flex items-center overflow-hidden`,animate:{width:`${o.fillPct}%`},transition:{duration:.8,ease:"easeInOut"},children:a.jsx("span",{className:"px-3 text-[10px] md:text-xs font-bold text-on-fill whitespace-nowrap",children:o.fillLabel})}),a.jsx("div",{className:"absolute inset-y-0 border-l border-dashed border-white/25",style:{left:"27%"}})]}),a.jsx("div",{className:"relative h-4",children:a.jsx("span",{className:"absolute text-[9px] font-bold text-slate-500",style:{left:"27%",transform:"translateX(-50%)"},children:"33s"})}),a.jsx("p",{className:"text-xs text-slate-500 mt-2 mb-8",children:o.fillCaption}),a.jsxs("div",{className:"grid grid-cols-3 gap-3 border-t border-white/5 pt-6",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold mb-1",children:"Downtime"}),a.jsx("p",{className:"text-xl md:text-2xl font-black text-white",children:a.jsx(Ce,{value:o.downtime,startOnView:!1,duration:.7,format:l=>`${Math.round(l)}s`})})]}),a.jsxs("div",{children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold mb-1",children:"Connections dropped"}),a.jsx("p",{className:"text-xl md:text-2xl font-black text-white",children:a.jsx(Ce,{value:o.dropped,startOnView:!1,duration:.7,format:l=>`${Math.round(l)}%`})})]}),a.jsxs("div",{children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold mb-1",children:"In-memory state"}),a.jsx("p",{className:`text-xl md:text-2xl font-black ${o.stateClass}`,children:o.state})]})]})]})},a0=({embedded:n=!1}={})=>a.jsxs(jo,{embedded:n,eyebrow:"Spot Automation",title:"Spot without the roulette.",subtitle:"Spot instances cut compute costs dramatically — if your workloads can survive the interruptions. OptOps rescues them with state intact, proven against real AWS interruption drills.",ctaTitle:"Watch a workload survive a spot reclaim",ctaText:"Book a demo and we'll fire a real interruption at a running workload — and you'll watch it keep serving.",children:[a.jsxs("section",{className:"w-full max-w-4xl mx-auto px-6 py-8",children:[a.jsx(b4,{}),a.jsx("p",{className:"text-xs text-slate-500 text-center mt-3",children:"Toggle it. That's the whole pitch."})]}),a.jsx(y4,{heading:"How a rescue works",sub:"Every other platform's spot story ends in drain-and-cold-restart. Ours ends with the workload still running.",steps:[{icon:"notifications_active",title:"The 2-minute notice arrives",text:"The cloud reclaims a spot node. Most tools start evicting pods and hoping they reschedule cleanly. OptOps starts a live migration instead."},{icon:"move_up",title:"The workload moves, running",text:"Memory and process state are checkpointed and restored on a healthy node — on AWS, the pod IP and open TCP connections come along."},{icon:"check_circle",title:"Nothing cold-restarts",text:"Long-lived connections, in-memory sessions, and half-finished work survive the reclaim. Your users never know it happened."}]}),a.jsx(ka,{heading:"And when spot runs dry",sub:"Interruptions aren't the only spot failure mode. Capacity crunches are handled too.",cards:[{icon:"hub",title:"Diversified pools",text:"Workloads spread across instance types and pools so a single reclaim wave never takes out a whole tier."},{icon:"alt_route",title:"Automatic on-demand fallback",text:"When spot capacity dries up, workloads land on on-demand automatically — no stranded pods, no paging anyone."},{icon:"electrical_services",title:"Stockout circuit breaker",text:"Repeated capacity errors trip a breaker that stops burning API calls on pools that keep refusing you."}]}),a.jsx(ka,{heading:"Trust, but verify",cards:[{icon:"science",title:"Run the drill yourself",text:"Fire a real AWS spot interruption at your own opt-in workload and watch the rescue preserve state. No other platform lets you test their spot story on your cluster."},{icon:"online_prediction",title:"Predictive rescue",text:"Rebalance-signal-driven rescue that starts moving workloads before the 2-minute warning even fires.",badge:"Early access"},{icon:"query_stats",title:"Know why spot refused you",text:"Quota and capacity root-cause insight tells you exactly why spot isn’t landing — with a link to the fix.",badge:"Early access"}]})]}),s0=({embedded:n=!1}
19={})=>a.jsxs(jo,{embedded:n,eyebrow:"Node Consolidation",title:"Fewer nodes. Same workloads. No drama.",subtitle:"An autonomous bin-packing engine that plans safe consolidations inside your cluster — and refuses to execute any plan that doesn't actually save you money.",ctaTitle:"See your cluster's ideal layout",ctaText:"Book a demo and we'll show you how many nodes your workloads actually need — and how OptOps gets there without an incident.",children:[a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-8",children:a.jsx(Jw,{})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-3",children:"Every plan clears the gates first"}),a.jsx("p",{className:"text-slate-400 text-center text-sm max-w-2xl mx-auto mb-10",children:"Consolidation only saves money if nothing breaks and the math holds. Both are checked before a single pod moves."}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-4 gap-3",children:[{icon:"radar",title:"Detect",text:"Real usage vs. current layout — find the cheaper packing your workloads fit into."},{icon:"fact_check",title:"Plan within rules",text:"PDBs, affinity, topology, and volumes respected at planning time, not discovered at execution."},{icon:"verified",title:"Gate on savings",text:"The never-lose-money gate: if a plan doesn't actually save money, it doesn't run."},{icon:"receipt_long",title:"Execute & audit",text:"A settle audit after execution confirms the savings actually landed."}].map((s,o)=>a.jsxs("div",{className:"relative glass-card rounded-2xl p-5",children:[a.jsxs("div",{className:"flex items-center justify-between mb-3",children:[a.jsx("div",{className:"w-9 h-9 rounded-lg bg-primary/10 flex items-center justify-center text-primary",children:a.jsx("span",{className:"material-symbols-outlined text-xl",children:s.icon})}),a.jsx("span",{className:"text-2xl font-black text-white/10",children:o+1})]}),a.jsx("h3",{className:"text-base font-bold text-white mb-1.5",children:s.title}),a.jsx("p",{className:"text-slate-400 text-xs leading-relaxed",children:s.text})]},s.title))})]}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 md:p-12 grid grid-cols-1 md:grid-cols-2 gap-10 items-center",children:[a.jsxs("div",{children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white mb-4",children:"Leave whenever you want. Really."}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-4",children:"The OptOps node engine stays stock-Karpenter-compatible. Your NodePools are real Karpenter NodePools — not a proprietary controller you'd have to rip out under pressure."}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"And on Google Cloud, you get the same engine — including the GCP provider upstream Karpenter never shipped. EKS and GKE, one brain."})]}),a.jsxs("div",{className:"terminal-panel rounded-xl font-mono text-xs leading-relaxed overflow-hidden border border-white/10",children:[a.jsxs("div",{className:"terminal-chrome flex items-center gap-1.5 px-4 py-2.5 border-b border-white/10",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-red-500/70"}),a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-amber-500/70"}),a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-green-500/70"}),a.jsx("span",{className:"ml-2 text-[10px] text-slate-500",children:"terminal"})]}),a.jsxs("div",{className:"p-5 overflow-x-auto",children:[a.jsx("p",{className:"text-slate-500",children:"$ helm uninstall optops"}),a.jsx("p",{className:"text-slate-300 mb-3",children:'release "optops" uninstalled'}),a.jsx("p",{className:"text-slate-500",children:"$ kubectl get nodepools"}),a.jsx("p",{className:"text-slate-300",children:"NAME      NODES   READY"}),a.jsxs("p",{className:"text-slate-300",children:["default   12      ",a.jsx("span",{className:"text-green-400",children:"True"})]}),a.jsx("p",{className:"text-primary mt-3",children:"▶ still Karpenter. still autoscaling."})]})]})]})}),a.jsx(ka,{heading:"Autonomy on your terms",cards:[{icon:"visibility",title:"Shadow mode first",text:"See every consolidation the engine would make — which nodes, which pods, how much saved — before any of it is enabled."},{icon:"tune",title:"Tunable from the console",text:"Aggressiveness, cooldowns, and disruption budgets are tunable per cluster from the dashboard — while every decision still executes inside your cluster."},{icon:"grid_view",title:"Whole-cluster re-solve",text:"One click to the mathematically cheapest layout for the entire cluster — with every safety gate still in the loop.",badge:"Early access"}]}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-6 text-center",children:a.jsxs("p",{className:"text-slate-400 text-sm",children:["Consolidation pairs with"," ",a.jsx(ie,{to:"/live-migration",className:"text-primary font-bold hover:underline",children:"container live migration"})," ","— that's what makes the moves disruption-free."]})})]}),x4=[{name:"web-api",usage:26,request:85},{name:"checkout",usage:34,request:90},{name:"search",usage:20,request:70},{name:"workers",usage:42,request:95},{name:"auth",usage:16,request:60}],v4=1.35,w4={static:{waste:2340,util:24},continuous:{waste:310,util:62}},j4=()=>{const[n,s]=j.useState("static"),o=w4[n];return a.jsxs("div",{className:"glass-card rounded-2xl p-6 md:p-8 w-full",children:[a.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4 mb-8",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"font-bold text-white",children:"Requested vs. actually used"}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:"web tier · 5 workloads · CPU"})]}),a.jsxs("div",{className:"flex items-center gap-1 bg-background-dark p-1 rounded-lg border border-white/5",children:[a.jsx("button",{onClick:()=>s("static"),className:`px-3 py-1.5 rounded-md text-xs font-bold uppercase tracking-wide transition-colors ${n==="static"?"bg-primary text-white":"text-slate-400 hover:text-white"}`,children:"Static requests"}),a.jsx("button",{onClick:()=>s("continuous"),className:`px-3 py-1.5 rounded-md text-xs font-bold uppercase tracking-wide transition-colors ${n==="continuous"?"bg-primary text-white":"text-slate-400 hover:text-white"}`,children:"OptOps continuous"})]})]}),a.jsx("div",{className:"flex items-end justify-between gap-3 h-44 mb-3",children:x4.map(l=>{const d=n==="static"?l.request:Math.round(l.usage*v4);return a.jsxs("div",{className:"flex-1 flex flex-col items-center justify-end h-full gap-2",children:[a.jsxs("div",{className:"relative w-full flex-1 flex items-end",children:[a.jsx(se.div,{className:"absolute bottom-0 w-full rounded-t-md border border-white/10 bg-slate-500/20",animate:{height:`${d}%`},transition:{duration:.7,ease:"easeInOut"}}),a.jsx("div",{className:"relative w-full rounded-t-md bg-primary z-10 mx-auto",style:{height:`${l.usage}%`,width:"55%",left:"22.5%"}})]}),a.jsx("span",{className:"text-[9px] md:text-[10px] font-bold text-slate-500 uppercase tracking-wide",children:l.name})]},l.name)})}),a.jsxs("div",{className:"flex items-center gap-4 text-[10px] text-slate-400 mb-8",children:[a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"w-2 h-2 rounded-sm bg-slate-500/40 border border-white/10"}),"Requested"]}),a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"w-2 h-2 rounded-sm bg-primary"}),"Actual usage"]})]}),a.jsxs("div",{className:"grid grid-cols-2 gap-3 border-t border-white/5 pt-6",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold mb-1",children:"Monthly waste (this tier)"}),a.jsx("p",{className:"text-xl md:text-2xl font-black text-white",children:a.jsx(Ce,{value:o.waste,startOnView:!1,duration:.7,format:l=>
19`$${Math.round(l).toLocaleString()}`})})]}),a.jsxs("div",{children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold mb-1",children:"Cluster CPU utilization"}),a.jsx("p",{className:`text-xl md:text-2xl font-black ${n==="continuous"?"text-green-400":"text-white"}`,children:a.jsx(Ce,{value:o.util,startOnView:!1,duration:.7,format:l=>`${Math.round(l)}%`})})]})]})]})},i0=({embedded:n=!1}={})=>a.jsxs(jo,{embedded:n,eyebrow:"Pod Rightsizing",title:"Requests that track reality.",subtitle:"Set-once-and-drift-forever is how clusters end up 3% utilized. OptOps rightsizes continuously from live usage — with a safety reflex for the spikes.",ctaTitle:"See what your workloads actually need",ctaText:"Book a demo and we'll profile a real cluster live — most teams find over half their requested CPU is never used.",children:[a.jsxs("section",{className:"w-full max-w-4xl mx-auto px-6 py-8",children:[a.jsx(j4,{}),a.jsx("p",{className:"text-xs text-slate-500 text-center mt-3",children:"The grey is what you pay for. The purple is what you use."})]}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 md:p-12 grid grid-cols-1 md:grid-cols-2 gap-10 items-center",children:[a.jsxs("div",{children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white mb-4",children:"A recommendation nobody applies saves nobody money."}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-4",children:"Most rightsizing tools produce a report. The report goes into a backlog. The backlog goes stale in a sprint — because workloads change faster than teams re-tune them."}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"OptOps closes the loop: requests are derived from live usage profiles per workload, keep adjusting as behavior changes, and — when you're ready — apply themselves."})]}),a.jsx("div",{className:"space-y-3",children:[{icon:"monitoring",title:"Continuous usage profiles",text:"Per-workload, from live metrics — not a point-in-time snapshot."},{icon:"content_cut",title:"Deployment-level precision",text:"CPU and memory tuned per deployment, savings shown before any change."},{icon:"receipt_long",title:"Auditable savings",text:"Realized savings tracked separately from remaining opportunity."}].map(s=>a.jsxs("div",{className:"flex items-start gap-4 bg-background-dark/60 border border-white/5 rounded-xl p-4",children:[a.jsx("div",{className:"w-9 h-9 rounded-lg bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-xl",children:s.icon})}),a.jsxs("div",{children:[a.jsx("h3",{className:"text-sm font-bold text-white",children:s.title}),a.jsx("p",{className:"text-xs text-slate-400 leading-relaxed mt-0.5",children:s.text})]})]},s.title))})]})}),a.jsx(ka,{heading:"Safety reflexes built in",cards:[{icon:"e911_emergency",title:"OOM spike protection",text:"A spike watcher reacts to memory pressure in seconds and scales the workload back up — so one OOM never becomes a crash loop."},{icon:"block",title:"Hard guardrails",text:"System namespaces are never touched, disruption budgets are respected, and every change is capped — no single adjustment can starve a workload."},{icon:"undo",title:"Reversible by design",text:"Every applied change is visible and revertible from the console, with the full history of what changed and why."}]}),a.jsx(ka,{heading:"Ramp into automation",cards:[{icon:"visibility",title:"Shadow mode first",text:"Watch every rightsize the engine would make before enabling anything. Turn on automation per workload, per namespace, or per cluster."},{icon:"speed",title:"Pick your risk appetite",text:"Conservative, Balanced, or Aggressive rightsizing profiles — choose how hard the optimizer pushes.",badge:"Early access"},{icon:"expand",title:"In-place resize",text:"OOM prevention with zero restarts — limits raised in place on the running pod the moment pressure spikes.",badge:"Coming soon"}]})]}
19),k4={standard:{efficiency:36.8,waste:56.3,monthlyCost:1162,riskLabel:"At Risk",riskTone:"risk",insight:"High waste concentration and weak workload efficiency.",pie:{excellent:2,good:4,fair:39,poor:55},namespaceCosts:[.32,.62,.21,.12,.09]},optops:{efficiency:82.4,waste:22.1,monthlyCost:464,riskLabel:"Healthy",riskTone:"good",insight:"Continuous rightsizing applied safely across workloads.",pie:{excellent:45,good:28,fair:22,poor:5},namespaceCosts:[.22,.38,.16,.1,.08]}},ox=["prod","dev","gmp-system","gitlab-runner","optops-system"],o0=70,N4=28,Ru=2*Math.PI*o0,T4={excellent:"#22c55e",good:"#a855f7",fair:"#f59e0b",poor:"#ef4444"},r0=({title:n})=>{const[s,o]=j.useState("standard"),l=k4[s],d=j.useMemo(()=>{let m=0;return["excellent","good","fair","poor"].map(p=>{const f=m;return m+=l.pie[p],{key:p,value:l.pie[p],offset:f,color:T4[p]}})},[l.pie]),h=s==="optops";return a.jsxs("div",{className:"glass-card rounded-2xl p-6 mt-6",children:[a.jsxs("div",{className:"flex flex-wrap justify-between items-center gap-4 mb-6",children:[a.jsxs("div",{children:[a.jsx("h3",{className:"font-bold text-white text-xl",children:n||"Cluster Monitoring"}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:"Cluster-01 (Production) · us-east-1 · 52 nodes"})]}),a.jsxs("div",{className:"flex items-center gap-3 bg-background-dark p-2 rounded-lg border border-white/5",children:[a.jsx("button",{onClick:()=>o("standard"),className:`text-xs font-bold uppercase px-3 py-1.5 rounded transition-colors ${h?"text-slate-500 hover:text-slate-300":"text-white bg-white/10"}`,children:"Standard"}),a.jsx("button",{onClick:()=>o(h?"standard":"optops"),className:`w-12 h-6 rounded-full p-1 transition-colors duration-300 relative flex items-center ${h?"bg-primary":"bg-slate-500"}`,children:a.jsx("div",{className:`w-4 h-4 bg-white rounded-full shadow-md transition-transform duration-300 ${h?"translate-x-6":"translate-x-0"}`})}),a.jsx("button",{onClick:()=>o("optops"),className:`text-xs font-bold uppercase px-3 py-1.5 rounded transition-colors ${h?"text-primary bg-primary/10 drop-shadow-[0_0_8px_rgba(175,37,244,0.5)]":"text-slate-500 hover:text-slate-300"}`,children:"OptOps AI"})]})]}),a.jsxs("div",{className:"grid grid-cols-2 md:grid-cols-4 gap-3 mb-6",children:[a.jsxs("div",{className:"bg-surface-dark border border-white/5 rounded-xl p-4",children:[a.jsx("span",{className:"text-xs text-slate-400 font-bold uppercase block",children:"Avg Efficiency"}),a.jsxs("strong",{className:"text-2xl font-black text-white mt-1 block",children:[a.jsx(Ce,{value:l.efficiency,format:m=>m.toFixed(1),duration:.7,startOnView:!1}),"%"]})]}),a.jsxs("div",{className:"bg-surface-dark border border-white/5 rounded-xl p-4",children:[a.jsx("span",{className:"text-xs text-slate-400 font-bold uppercase block",children:"Waste Score"}),a.jsxs("strong",{className:"text-2xl font-black text-white mt-1 block",children:[a.jsx(Ce,{value:l.waste,format:m=>m.toFixed(1),duration:.7,startOnView:!1}),"%"]})]}),a.jsxs("div",{className:"bg-surface-dark border border-white/5 rounded-xl p-4",children:[a.jsx("span",{className:"text-xs text-slate-400 font-bold uppercase block",children:"Monthly Cost"}),a.jsxs("strong",{className:"text-2xl font-black text-white mt-1 block",children:["$",a.jsx(Ce,{value:l.monthlyCost,format:m=>Math.round(m).toLocaleString(),duration:.7,startOnView:!1})]})]}),a.jsxs("div",{className:`border rounded-xl p-4 transition-colors duration-200 ${l.riskTone==="risk"?"bg-red-500/10 border-red-500/20":"bg-green-500/10 border-green-500/20"}`,children:[a.jsx("span",{className:"text-xs text-slate-400 font-bold uppercase block",children:"Risk Status"}),a.jsx("strong",{className:"text-2xl font-black mt-1 block",children:a.jsx(zt,{mode:"wait",initial:!1,children:a.jsx(se.span,{initial:{opacity:0,y:10},animate:{opacity:1,y:0},exit:{opacity:0,y:-10},transition:{duration:.2},className:`block ${l.riskTone==="risk"?"text-red-400":"text-green-400"}`,children:l.riskLabel},l.riskLabel)})})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{className:"bg-surface-dark border border-white/5 rounded-xl p-5",children:[a.jsx("h4",{className:"font-bold text-white text-sm mb-4",children:"Pod Efficiency Distribution"}),a.jsxs("div",{className:"grid grid-cols-[180px_1fr] items-center gap-4",children:[a.jsx("svg",{viewBox:"0 0 180 180",className:"w-[180px] h-[180px]",role:"img","aria-label":"Pod efficie
19ncy distribution donut chart",children:a.jsx("g",{transform:"rotate(-90 90 90)",children:d.map(m=>a.jsx(se.circle,{cx:"90",cy:"90",r:o0,fill:"none",stroke:m.color,strokeWidth:N4,initial:!1,animate:{strokeDasharray:`${m.value/100*Ru} ${(100-m.value)/100*Ru}`,strokeDashoffset:-(m.offset/100)*Ru},transition:{duration:.8,ease:"easeOut"}},m.key))})}),a.jsxs("ul",{className:"space-y-2 text-sm font-bold text-slate-300",children:[a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-green-500 inline-block"}),"Excellent: ",l.pie.excellent,"%"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-purple-500 inline-block"}),"Good: ",l.pie.good,"%"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-yellow-500 inline-block"}),"Fair: ",l.pie.fair,"%"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-red-500 inline-block"}),"Poor: ",l.pie.poor,"%"]})]})]})]}),a.jsxs("div",{className:"bg-surface-dark border border-white/5 rounded-xl p-5",children:[a.jsx("h4",{className:"font-bold text-white text-sm mb-1",children:"Cost by Namespace"}),a.jsx("p",{className:"text-xs text-slate-400 mb-4",children:l.insight}),a.jsx("div",{className:"h-[180px] border-t border-white/5 grid grid-cols-5 gap-2 items-end pt-4",children:l.namespaceCosts.map((m,p)=>a.jsxs("div",{className:"flex flex-col items-center gap-2 h-full justify-end",children:[a.jsx("div",{className:"w-full bg-gradient-to-t from-primary to-purple-400 rounded-t transition-all duration-500",style:{height:`${Math.round(m*100)}%`,minHeight:"16px"}}),a.jsx("span",{className:"text-[10px] text-slate-500 text-center leading-tight",children:ox[p]})]},ox[p]))})]})]})]})},l0=({embedded:n=!1}={})=>a.jsxs(jo,{embedded:n,eyebrow:"FinOps Visibility",title:"See every dollar. Trust every number.",subtitle:"Real-time Kubernetes cost visibility — with a reporting policy most vendors won't adopt: realized savings and remaining opportunity are never blended into one flattering number.",ctaTitle:"See your cluster's real cost breakdown",ctaText:"Book a demo and we'll connect a cluster read-only — you'll see cost per namespace and workload in minutes.",children:[a.jsxs("section",{className:"w-full max-w-5xl mx-auto px-6 py-8",children:[a.jsx(r0,{title:"Cost visibility, live"}),a.jsx("p",{className:"text-xs text-slate-500 text-center mt-3",children:"Flip the toggle — this is the before/after your CFO sees."})]}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 md:p-12 grid grid-cols-1 md:grid-cols-2 gap-10 items-center",children:[a.jsxs("div",{children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white mb-4",children:"Savings accounting you could hand to an auditor."}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-4",children:'This category has a numbers-inflation problem: "savings" dashboards that blend money already saved with money that might be saved, into one big flattering figure.'}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"OptOps reports them separately, always. Realized is realized. Opportunity is opportunity. They are never netted, never double-counted — and the methodology is visible."})]}),a.jsxs("div",{className:"bg-background-dark border border-white/10 rounded-xl p-6",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-widest text-slate-500 font-bold mb-5",children:"Savings statement · June"}),a.jsxs("div",{className:"flex items-baseline justify-between border-b border-white/5 pb-4 mb-4",children:[a.jsx("span",{className:"text-sm text-slate-300 font-semibold",children:"Realized savings"}),a.jsx("span",{className:"text-2xl font-black text-green-400",children:a.jsx(Ce,{value:12480,format:s=>`$${Math.round(s).toLocaleString()}`})})]}),a.jsxs("div",{className:"flex items-baseline justify-between border-b border-white/5 pb-4 mb-4",children:[a.jsx("span",{className:"text-sm text-slate-300 font-semibold",children:"Remaining opportunity"}),a.jsx("span",{className:"text-2xl font-black text-primary",children:a.jsx(Ce,{value:6120,format:s=>
19`$${Math.round(s).toLocaleString()}`})})]}),a.jsx("p",{className:"text-xs text-slate-500",children:"Reported separately. Never blended. That's the whole policy."})]})]})}),a.jsx(ka,{heading:"Visibility without the tagging project",cards:[{icon:"payments",title:"Cost by everything",text:"Track spend by cluster, namespace, workload, node type, and instance class — derived from the cluster itself, no tagging discipline required."},{icon:"hub",title:"Multi-cluster, one view",text:"Every cluster in a single dashboard, so platform teams stop stitching together per-cluster spreadsheets."},{icon:"bedtime",title:"Quick wins included",text:"Sleep schedules put dev and staging clusters to bed on a cron — often the fastest savings a team banks in week one."}]}),a.jsx(ka,{heading:"Shipping next",cards:[{icon:"query_stats",title:"Sub-second drill-down",text:"Drill from cluster to namespace to pod across weeks of cost history in under a second.",badge:"Early access"},{icon:"notifications_active",title:"Anomaly alerts",text:"Get told when spend jumps — before the invoice tells you.",badge:"Early access"},{icon:"trending_up",title:"Month-end forecasts",text:"Projected end-of-month spend per cluster, updated continuously.",badge:"Early access"}]}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-6 text-center",children:a.jsxs("p",{className:"text-slate-400 text-sm",children:["Want a number right now? Try the"," ",a.jsx(ie,{to:"/resources/roi-calculator",className:"text-primary font-bold hover:underline",children:"cost & carbon calculator"}),"."]})})]}),rx=[{key:"readonly",label:"Read-only",badge:"Default at install",tagline:"OptOps observes. Nothing changes.",can:["Collect metadata and utilization metrics","Compute cost breakdowns and savings estimates","Surface rightsizing and consolidation recommendations"],cannot:["Mutate any workload or node","Read secrets, env vars, or workload data"],chips:["get","list","watch"]},{key:"shadow",label:"Shadow mode",badge:"Prove it first",tagline:"OptOps plans every action — and shows you instead of acting.",can:["Plan real consolidations, rightsizes, and migrations","Show exactly what it would change, and the savings","Log every would-be action for review"],cannot:["Execute anything — plans are display-only"],chips:["get","list","watch","plan"]},{key:"autonomous",label:"Autonomous",badge:"Per capability, per cluster",tagline:"You flip each capability on. Guardrails stay in the loop.",can:["Execute rightsizing, consolidation, and spot automation you enabled","Rescue workloads off reclaimed spot nodes","Audit-log every action: what changed, when, and why"],cannot:["Run a plan that fails the never-lose-money gate","Violate PDBs, affinity rules, or system-namespace exclusions"],chips:["scoped write","PDB-aware","audit-logged"]}],S4=()=>{const[n,s]=j.useState("readonly"),o=rx.find(l=>l.key===n);return a.jsxs("div",{className:"glass-card rounded-2xl p-6 md:p-8 w-full",children:[a.jsx("div",{className:"grid grid-cols-3 gap-2 mb-8",children:rx.map((l,d)=>a.jsxs("button",{onClick:()=>s(l.key),className:`relative rounded-xl border p-3 md:p-4 text-left transition-colors ${n===l.key?"border-primary/60 bg-primary/10":"border-white/10 bg-white/5 hover:bg-white/10"}`,children:[a.jsxs("span",{className:"block text-[10px] font-bold uppercase tracking-widest text-slate-500 mb-1",children:["Stage ",d+1]}),a.jsx("span",{className:`block text-sm md:text-base font-bold ${n===l.key?"text-primary":"text-white"}`,children:l.label})]},l.key))}),a.jsx(zt,{mode:"wait",children:a.jsxs(se.div,{initial:{opacity:0,y:8},animate:{opacity:1,y:0},exit:{opacity:0,y:-8},transition:{duration:.25},children:[a.jsxs("div",{className:"flex flex-wrap items-center gap-3 mb-5",children:[a.jsx("span",{className:"px-2.5 py-1 rounded-full bg-primary/10 border border-primary/30 text-[10px] uppercase font-bold text-primary",children:o.badge}),a.jsx("p",{className:"text-sm text-slate-300 font-semibold",children:o.tagline})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4 mb-6",children:[a.jsxs("div",{className:"bg-background-dark/60 border border-white/5 rounded-xl p-5",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-green-400 font-bold mb-3",children:"OptOps can"}),a.jsx("ul",{className:"space-y-2.5",children:o.can.map(l=>a.jsxs("li",{className:"flex items-start gap-2.5 text-sm text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-base mt-0.5",children:"check_circle"}),l]},l))})]}),a.jsxs("div",{className:"bg-background-dark/60 border border-white/5 rounded-xl p-5",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-wider text-red-400 font-bold mb-3",children:"OptOps cannot"}),a.jsx("ul",{className:"space-y-2.5",children:o.cannot.map(l=>a.jsxs("li",{className:"flex items-start gap-2.5 text-sm text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-red-400 text-base mt-0.5",children:"cancel"}),l]},l))})]})]}),a.jsxs("div",{className:"flex flex-wrap items-center gap-2",children:[a.jsx("span",{className:"text-[10px] uppercase tracking-wider text-slate-500 font-bold mr-1",children:"Effective permissions:"}),o.chips.map(l=>a.jsx("span",{className:"px-2 py-1 rounded bg-white/5 border border-white/10 text-[10px] font-mono font-bold text-slate-300",children:l},l))]})]},o.key)})]})},c0=({embedded:n=!1}
19={})=>a.jsxs(jo,{embedded:n,eyebrow:"Security & Trust",title:"Built for clusters you're not allowed to break.",subtitle:"OptOps is designed for BFSI, gov-tech, and regulated environments — where trust has to be enforced by architecture, not promised in a slide deck.",ctaTitle:"Bring your security team to the demo",ctaText:"We'll walk through the agent's permissions, the data that leaves your cluster (metadata only), and the audit trail — question by question.",children:[a.jsxs("section",{className:"w-full max-w-4xl mx-auto px-6 py-8",children:[a.jsx(S4,{}),a.jsx("p",{className:"text-xs text-slate-500 text-center mt-3",children:"Click through the stages — this is exactly how a rollout goes."})]}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white text-center mb-3",children:"The data boundary"}),a.jsx("p",{className:"text-slate-400 text-center text-sm max-w-2xl mx-auto mb-10",children:"Your security review will ask. Here's the answer up front."}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[a.jsxs("div",{className:"glass-card rounded-2xl p-6 border-green-500/20",children:[a.jsxs("p",{className:"text-[10px] uppercase tracking-wider text-green-400 font-bold mb-4 flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-base",children:"outbound"}),"Collected (metadata only)"]}),a.jsx("ul",{className:"space-y-2.5",children:["Workload names, kinds, and resource requests/limits","CPU, memory, and utilization metrics","Node types, instance classes, and pricing signals"].map(s=>a.jsxs("li",{className:"flex items-start gap-2.5 text-sm text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-base mt-0.5",children:"check_circle"}),s]},s))})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-6 border-red-500/20",children:[a.jsxs("p",{className:"text-[10px] uppercase tracking-wider text-red-400 font-bold mb-4 flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-base",children:"block"}),"Never collected"]}),a.jsx("ul",{className:"space-y-2.5",children:["Secrets and ConfigMap contents","Environment variables","Application data, logs, or request payloads"].map(s=>a.jsxs("li",{className:"flex items-start gap-2.5 text-sm text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-red-400 text-base mt-0.5",children:"cancel"}),s]},s))})]})]}),a.jsxs("p",{className:"text-slate-400 text-sm text-center mt-6 max-w-2xl mx-auto",children:["And the decisions themselves? Made by the engine running ",a.jsx("span",{className:"text-white font-semibold",children:"inside your cluster"})," — not by a SaaS control plane reaching in from outside."]})]}),a.jsx(ka,{heading:"Verified, not asserted",cards:[{icon:"workspace_premium",title:"Independently assessed",text:"The platform has completed an independent third-party application security assessment, and ISO certification is in progress."},{icon:"fmd_bad",title:"Fail-open everywhere",text:"Every webhook is fail-open by design: if OptOps ever goes down, your cluster schedules exactly as it did before we arrived."},{icon:"history",title:"Full auditability",text:"Every action the platform takes is logged with what changed, when, and why — built for change-management and audit reviews."}]})]}),Mu=6,lx=[0,.15,.26,.56,.67,1],Qr=9,d0=typeof window<"u",cx=d0?{y:"110%"}:!1,dx={duration:.7,ease:[.16,1,.3,1]}
19,Xi="modern compute infrastructure. ",A4=()=>{const n=yn(),s=(o,l)=>n?void 0:{animate:o,transition:{duration:Mu,repeat:1/0,ease:"easeInOut",times:l}};return a.jsxs("h1",{className:"relative text-5xl md:text-7xl font-black tracking-tighter mb-6 leading-[1.1] text-white",children:[a.jsx("span",{className:"block overflow-hidden pb-[0.15em] -mb-[0.15em]",children:a.jsx(se.span,{className:"block",initial:n?!1:cx,animate:{y:"0%"},transition:{...dx,delay:.05},children:a.jsx(se.span,{className:"block",...s({y:[0,0,-Qr,-Qr,0,0]},lx),children:"Autonomous optimization for"})})}),!n&&a.jsx("span",{"aria-hidden":"true",className:"pointer-events-none absolute inset-x-0 top-1/2 -mt-1 flex justify-center overflow-hidden",children:a.jsx(se.span,{className:"block h-2 w-48 md:w-64 rounded-full bg-gradient-to-r from-primary via-fuchsia-400 to-accent-purple blur-[2px]",animate:{x:["-260%","-260%","260%","260%"],opacity:[0,0,1,1,0,0]},transition:{duration:Mu,repeat:1/0,ease:"easeInOut",times:[0,.24,.58,1],opacity:{duration:Mu,repeat:1/0,times:[0,.24,.3,.5,.58,1]}}})}),a.jsx("span",{className:"block overflow-hidden pb-[0.15em] -mb-[0.15em]",children:a.jsx(se.span,{className:"block",initial:n?!1:cx,animate:{y:"0%"},transition:{...dx,delay:.22},children:a.jsx(se.span,{className:"block",...s({y:[0,0,Qr,Qr,0,0]},lx),children:d0?a.jsxs("span",{className:"relative inline-block max-w-full",children:[a.jsx("span",{"aria-hidden":"true",className:"hero-bloom absolute inset-0 text-transparent select-none pointer-events-none",children:Xi}),a.jsx("span",{className:"md:hidden text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:Xi}),a.jsx("span",{className:"hidden md:inline-block overflow-hidden align-bottom pb-[0.15em] -mb-[0.15em]",children:a.jsxs(se.span,{className:"relative inline-block whitespace-nowrap",...s({x:["0%","0%","-100%","-100%"]},[0,.28,.54,1]),children:[a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:Xi}),a.jsx("span",{"aria-hidden":"true",className:"absolute left-full top-0 text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:Xi})]})})]}):a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:Xi})})})})]})},C4=[{src:"/nvidia-inception-program-badge-rgb-for-screen.svg",alt:"NVIDIA Inception Member",className:"h-16 md:h-20"},{src:"/logos/redington-v2.png",alt:"Redington",className:"h-11 md:h-14"},{src:"/logos/aws-partner-v2.png",darkSrc:"/logos/aws-partner-on-dark-v2.png",alt:"AWS Partner",className:"h-[4.5rem] md:h-[5.5rem]"},{src:"/logos/protean-v2.png",darkSrc:"/logos/protean-on-dark-v2.png",alt:"Protean eGov",className:"h-14 md:h-[4.5rem]"},{src:"/logos/bullet-v2.png",alt:"Bullet",className:"h-14 md:h-[4.5rem]"},{src:"/logos/creatortag-v2.png",darkSrc:"/logos/creatortag-on-dark-v2.png",alt:"CreatorTag",className:"h-9 md:h-11"}],O4=({partner:n,ariaHidden:s})=>{const o=s?"":n.alt,l=`partner-logo w-auto object-contain shrink-0 ${n.className}`;return n.darkSrc?a.jsxs(a.Fragment,{children:[a.jsx("img",{src:n.darkSrc,alt:o,loading:"lazy",className:`${l} dark-logo`}),a.jsx("img",{src:n.src,alt:"","aria-hidden":"true",loading:"lazy",className:`${l} light-logo`})]}):a.jsx("img",{src:n.src,alt:o,loading:"lazy",className:l})},ux=({ariaHidden:n=!1})=>a.jsx("div",{className:"flex items-center gap-12 md:gap-16 pr-12 md:pr-16 shrink-0","aria-hidden":n||void 0,children:C4.map(s=>a.jsx(O4,{partner:s,ariaHidden:n},s.src))}),E4=()=>a.jsx("div",{className:"partner-marquee relative overflow-hidden w-full max-w-5xl mx-auto",children:a.jsxs("div",{className:"partner-marquee-track flex w-max items-center",children:[a.jsx(ux,{}),a.jsx(ux,{ariaHidden:!0})]})}),Ji=[{company:"CreatorTag",logoDark:"/logos/creatortag-on-dark-v2.png",logoLight:"/logos/creatortag-v2.png",quote:"Our clusters were running at a fraction of what we were paying for, and we had no straightforward way to see it. OptOps showed us exactly where the waste was and cut our Kubernetes spend by around 60% — without a single production incident.",name:"Rohit Khanna",role:"Co-founder",initials:"RK"},{company:"Bullet",logoDark:"/logos/bullet-v2.png",logoLight:"/logos/bullet-v2.png",quote:"Streaming traffic is spiky, so we over-provisioned everything and just lived with the bill. OptOps rightsized against what our workloads actually use and packed the cluster down — the savings landed in the first month, and nothing about our delivery changed.",name:"Saurabh Kushwah",role:"Co-founder",initials:"SK"}],D4=8e3,z4=()=>{const n=yn(),[[s,o],l]=j.useState([0,1]),[d,h]=j.useState(!1),m=j.useCallback((g,b)=>{const x=Ji.length;l([(g+x)%x,b])},[]);j.useEffect(()=>{if(d||n||Ji.length<2)return;const g=setTimeout(()=>m(s+1,1),D4);return()=>clearTimeout(g)},[s,d,n,m]);const p=Ji[s],f=n?{}:{initial:{opacity:0,x:o*40}
19,animate:{opacity:1,x:0},exit:{opacity:0,x:o*-40},transition:{duration:.45,ease:[.16,1,.3,1]}};return a.jsxs("div",{className:"mx-auto w-full max-w-[1104px]",children:[a.jsxs("h2",{className:"mb-12 text-center text-3xl md:text-[32px] font-black leading-tight tracking-tight text-white",children:["What our"," ",a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:"customers say"})]}),a.jsxs("div",{className:"relative mx-auto grid min-h-[374px] w-full max-w-[746px] place-items-center",onMouseEnter:()=>h(!0),onMouseLeave:()=>h(!1),children:[a.jsx("div",{"aria-hidden":"true",className:"testimonial-stack col-start-1 row-start-1 h-[310px] w-full max-w-[746px] self-center rounded-[10px]"}),a.jsx("div",{className:"col-start-1 row-start-1 w-[calc(100%-66px)] max-w-[680px]",children:a.jsx(zt,{mode:"wait",initial:!1,children:a.jsx(se.article,{className:"testimonial-card min-h-[374px] overflow-hidden rounded-xl",...f,children:a.jsxs("div",{className:"flex h-full min-h-[374px] flex-col px-8 md:px-[51px] py-9 md:py-10",children:[a.jsxs("div",{className:"h-[35px]",children:[a.jsx("img",{src:p.logoDark,alt:`${p.company} logo`,className:"h-[35px] w-auto object-contain dark-logo"}),a.jsx("img",{src:p.logoLight,alt:"","aria-hidden":"true",className:"h-[35px] w-auto object-contain light-logo"})]}),a.jsxs("blockquote",{className:"testimonial-quote mt-auto text-lg md:text-[22px] leading-normal",children:["“",p.quote,"”"]}),a.jsxs("div",{className:"mt-auto flex items-center gap-4 pt-8",children:[a.jsx("span",{className:"flex h-[56px] w-[56px] shrink-0 items-center justify-center rounded-full bg-primary/15 border border-primary/30 text-primary font-black",children:p.initials}),a.jsxs("div",{children:[a.jsx("p",{className:"testimonial-name text-[17px] md:text-[18.6px] font-semibold leading-tight",children:p.name}),a.jsxs("p",{className:"testimonial-role text-sm md:text-[16.3px] leading-snug",children:[p.role,", ",p.company]})]})]})]})},p.name)})})]}),Ji.length>1&&a.jsxs("div",{className:"mt-10 flex items-center justify-center gap-1.5 p-1.5",children:[a.jsx("button",{type:"button","aria-label":"Previous testimonial",onClick:()=>{h(!0),m(s-1,-1)},className:"flex cursor-pointer items-center p-1.5 text-slate-500 transition-colors hover:text-primary",children:a.jsx("span",{className:"material-symbols-outlined text-[18px]",children:"arrow_back"})}),a.jsx("div",{className:"flex items-center gap-2 p-1.5",children:Ji.map((g,b)=>a.jsx("button",{type:"button","aria-label":`Go to testimonial ${b+1}`,"aria-current":b===s||void 0,onClick:()=>{h(!0),m(b,b>s?1:-1)},className:`block cursor-pointer rounded-full transition-all duration-300 ${b===s?"h-3 w-3 bg-primary":"h-2.5 w-2.5 bg-slate-500/50 hover:bg-slate-400"}`},g.name))}),a.jsx("button",{type:"button","aria-label":"Next testimonial",onClick:()=>{h(!0),m(s+1,1)},className:"flex cursor-pointer items-center p-1.5 text-slate-500 transition-colors hover:text-primary",children:a.jsx("span",{className:"material-symbols-outlined text-[18px]",children:"arrow_forward"})})]})]})},hx={"/live-migration":n0,"/spot-automation":a0,"/node-consolidation":s0,"/pod-rightsizing":i0,"/finops-visibility":l0,"/security":c0},R4=()=>{const n=yn(),[s,o]=j.useState(!1),l=ge.useRef(null),{scrollYProgress:d}=Lw({target:l,offset:["start 0.8","end 0.55"]}),h=()=>{window.location.href=ut},[m,p]=j.useState(null),[f,g]=j.useState("k8s"),b=T=>{p(m===T?null:T)},x=P5,w=[60,45,75,50,65,80],S=[30,25,40,30,35,45];return a.jsxs("div",{className:"bg-background-dark text-white font-display min-h-screen overflow-x-hidden transition-colors duration-300",children:[a.jsx(Ww,{}),a.jsxs("main",{className:"relative flex-1 flex flex-col items-center",children:[a.jsxs("div",{className:"absolute top-0 left-1/2 -translate-x-1/2 w-full h-[600px] pointer-events-none overflow-hidden -z-10",children:[a.jsx("div",{className:"absolute -top-48 left-1/4 w-96 h-96 bg-primary/20 blur-[120px] rounded-full"}),a.jsx("div",{className:"absolute top-0 right-1/4 w-96 h-96 bg-purple-600/10 blur-[120px] rounded-full"})]}),a.jsxs("section",{className:"max-w-7xl w-full px-6 pt-20 pb-16 text-center",children:[a.jsx(A4,{}),a.jsx("p",{className:"text-lg md:text-xl text-slate-400 max-w-2xl mx-auto mb-10",children:"OptOps continuously finds and safely removes waste across Kubernetes, GPUs and HPC, increasing utilization, reducing infrastru
19cture cost and unlocking capacity without adding hardware."}),a.jsxs("div",{className:"flex flex-wrap justify-center gap-4 mb-8",children:[a.jsx("button",{onClick:h,className:"bg-primary text-white px-8 py-4 rounded-xl font-bold text-lg neon-glow hover:scale-[1.02] transition-transform",children:"Book a Demo"}),a.jsx("a",{href:"https://console.optops.ai/login",className:"bg-white/5 border border-white/10 px-8 py-4 rounded-xl font-bold text-lg hover:bg-white/10 transition-all flex items-center gap-2 text-white",children:"Sign Up / Sign In"})]}),a.jsx("div",{className:"mb-16",children:a.jsx(E4,{})}),a.jsxs("div",{className:"mb-16 max-w-4xl mx-auto",children:[a.jsx("h2",{className:"text-2xl md:text-3xl font-black text-white mb-6",children:"The Complete Platform for Kubernetes  & HPC Resources  "}),a.jsxs("div",{className:"inline-flex items-center gap-1 bg-white/5 border border-white/10 rounded-xl p-1 mb-7",children:[a.jsxs("button",{type:"button",onClick:()=>g("k8s"),className:`flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-bold transition-colors ${f!=="hpc"?"bg-primary text-white":"text-slate-300 hover:text-primary"}`,children:[a.jsx("img",{src:"/kubernetes-mark.svg",alt:"",className:"h-4 w-4"}),"Kubernetes"]}),a.jsxs("button",{type:"button",onClick:()=>g("hpc"),className:`flex items-center gap-2 px-5 py-2.5 rounded-lg text-sm font-bold transition-colors ${f==="hpc"?"bg-primary text-white":"text-slate-300 hover:text-primary"}`,children:[a.jsx("span",{className:"material-symbols-outlined text-base",children:"memory"}),"HPC & AI Data Centers",a.jsx("span",{className:`px-1.5 py-0.5 rounded border text-[10px] uppercase font-bold ${f==="hpc"?"bg-white/15 border-white/30 text-white":"bg-primary/10 border-primary/30 text-primary"}`,children:"New"})]})]}),f!=="hpc"&&a.jsx("div",{className:"flex flex-wrap justify-center gap-2.5",children:Nl.filter(T=>T.path!=="/hpc").map(T=>a.jsxs("button",{type:"button",onClick:()=>g(f===T.path?"k8s":T.path),className:`flex items-center gap-2 px-4 py-2.5 rounded-xl border transition-colors group ${f===T.path?"bg-primary/10 border-primary/60":"bg-surface-dark border-white/10 hover:border-primary/40 hover:bg-white/10"}`,children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg",children:T.icon}),a.jsx("span",{className:`text-sm font-bold transition-colors ${f===T.path?"text-primary":"text-white group-hover:text-primary"}`,children:T.label})]},T.path))}),f!=="hpc"&&a.jsxs("div",{className:"mt-10 flex flex-col items-center gap-3",children:[a.jsx("p",{className:"text-xs font-bold uppercase tracking-widest text-slate-500",children:"See your waste in 60 seconds — no account, nothing installed"}),a.jsx(nx,{}),a.jsxs("a",{href:"#cli",className:"inline-flex items-center gap-1.5 text-xs font-bold text-primary hover:gap-2.5 transition-all",children:["See what it prints",a.jsx("span",{className:"material-symbols-outlined text-sm",children:"arrow_downward"})]})]})]})]}),f==="hpc"&&a.jsx(t0,{}),hx[f]&&ge.createElement(hx[f],{embedded:!0}),f==="k8s"&&a.jsxs(a.Fragment,{children:[a.jsx("section",{className:"max-w-7xl w-full px-6 pb-16 text-center",children:a.jsx("div",{className:"glass-panel p-2 rounded-2xl max-w-5xl mx-auto shadow-2xl relative",children:a.jsxs("div",{className:"bg-background-dark rounded-xl h-auto relative flex flex-col",children:[a.jsxs("div",{className:"p-6 border-b border-white/5 flex flex-wrap justify-between items-center gap-4 bg-surface-dark/50",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"bg-primary/20 p-2 rounded-lg",children:a.jsx("span",{className:"material-symbols-outlined text-primary",children:"hub"})}),a.jsxs("div",{children:[a.jsx("h3",{className:"font-bold text-white leading-none",children:"Cluster-01 (Production)"}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:"us-east-1 • 52 Nodes"})]})]}),a.jsxs("div",{className:"flex items-center gap-4 bg-background-dark p-2 rounded-lg border border-white/5",children:[a.jsx("span",{className:`text-xs font-bold uppercase transition-colors ${s?"text-slate-500":"text-white"}`,children:"Standard"}),a.jsx("button",{onClick:()=>o(!s),className:`w-12 h-6 rounded-full p-1 transition-colors duration-300 relative ${s?"bg-primary":"bg-slate-500"}`,children:a.jsx(se.div,{className:"w-4 h-4 bg-white rounded-full shadow-md",layout:!0,transition:{type:"spring",stiffness:700,damping:30},style:{justifySelf:s?"flex-end":"flex-start"}})}),a.jsx("span",{className:`text-xs font-bold uppercase transition-colors ${s?"text-primary drop-shadow-[0_0_8px_rgba(175,37,244,0.5)]":"text-slate-500"}`,children:"OptOps AI"})]})]}),a.jsxs("div",{className:"p-8 grid grid-cols-1 md:grid-cols-12 gap-6 text-left h-full overflow-y-auto",children:[a.jsxs("div",{className:"md:col-span-8 flex flex-col gap-6",children:[a.jsxs("div",{className:"flex flex-wrap gap-4",children:[a.jsxs(se.div,{animate:{borderColor:s?"rgba(34, 197, 94, 0.3)":"rgba(239, 68, 68, 0.3)",backgroundColor:s?"rgba(34, 197, 94, 0.05)":"rgba(239, 68, 68, 0.05)"},className:"border p-4 rounded-xl flex-1 bg-surface-dark transition-colors duration-500",children:[a.jsx("p",{className:"text-xs text-slate-400 font-bold uppercase tracking-wider mb-1",children:"Cluster Health"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx(se.p,{initial:{opacity:0,y:10}
19,animate:{opacity:1,y:0},className:`text-3xl font-black ${s?"text-green-400":"text-red-400"}`,children:s?"Healthy":"At Risk"},s?"healthy":"risk"),a.jsx(se.span,{animate:{rotate:0},className:`material-symbols-outlined ${s?"text-green-400":"text-red-400"}`,children:s?"check_circle":"warning"})]})]}),a.jsxs(se.div,{className:"bg-surface-dark border p-4 rounded-xl flex-1 border-white/5",children:[a.jsx("p",{className:"text-xs text-slate-400 font-bold uppercase tracking-wider mb-1",children:"Resource Slack (Waste)"}),a.jsxs("div",{className:"flex items-end gap-2",children:[a.jsx(se.p,{animate:{color:s?"#22c55e":"#b790cb"},className:"text-3xl font-black",children:s?"4.2%":"38.5%"}),a.jsx(se.span,{initial:{opacity:0},animate:{opacity:s?1:0},className:"text-xs text-green-400 font-bold mb-1.5 bg-green-400/10 px-1.5 py-0.5 rounded",children:"-34.3%"})]})]})]}),a.jsxs("div",{className:"bg-surface-dark/50 border border-white/5 p-6 rounded-xl flex-1 flex flex-col",children:[a.jsxs("div",{className:"flex items-center justify-between mb-6",children:[a.jsx("h4",{className:"font-bold text-sm text-white",children:"Pod CPU Requests vs Actual"}),a.jsxs("div",{className:"flex gap-4",children:[a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"w-2 h-2 rounded-full bg-slate-500"}),a.jsx("span",{className:"text-[10px] text-slate-400",children:"Request"})]}),a.jsxs("div",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"w-2 h-2 rounded-full bg-primary"}),a.jsx("span",{className:"text-[10px] text-slate-400",children:"Actual Usage"})]})]})]}),a.jsx("div",{className:"flex-1 flex items-end gap-2 h-32 md:h-auto min-h-[120px]",children:w.map((T,O)=>a.jsxs("div",{className:"flex-1 flex flex-col justify-end h-full relative group",children:[a.jsx(se.div,{className:"w-full bg-slate-700/30 rounded-t-sm absolute bottom-0",initial:{height:`${T}%`},animate:{height:s?`${S[O]+5}%`:`${T}%`,backgroundColor:s?"rgba(175, 37, 244, 0.1)":"rgba(100, 116, 139, 0.5)"},transition:{duration:.8,ease:"easeInOut",delay:O*.05}}),a.jsx(se.div,{className:"w-full bg-primary rounded-t-sm relative z-10",initial:{height:`${T*.4}%`},animate:{height:`${S[O]*(.8+Math.random()*.1)}%`},transition:{repeat:1/0,repeatType:"mirror",duration:2+Math.random(),ease:"easeInOut"}}),a.jsxs(se.div,{initial:{opacity:0,y:-10},animate:{opacity:s?0:1,y:s?-10:0},className:"absolute -top-6 left-1/2 -translate-x-1/2 text-[10px] font-bold text-slate-400 whitespace-nowrap hidden md:block",children:["$",(T*2.5).toFixed(0)]})]},O))})]})]}),a.jsxs("div",{className:"md:col-span-4 bg-surface-dark/50 border border-white/5 p-6 rounded-xl flex flex-col gap-4",children:[a.jsx("h4",{className:"font-bold text-sm text-white",children:"Live Optimizations"}),a.jsxs("div",{className:"space-y-3 relative",children:[a.jsx(zt,{children:s&&a.jsxs(se.div,{initial:{opacity:0}
19,animate:{opacity:1},exit:{opacity:0},className:"absolute inset-0 bg-background-dark/80 backdrop-blur-[2px] z-10 flex flex-col items-center justify-center text-center p-4 rounded-lg border border-green-500/20",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-4xl mb-2",children:"auto_fix"}),a.jsx("p",{className:"font-bold text-white",children:"Optimizations Applied"}),a.jsx("p",{className:"text-xs text-slate-400",children:"Rightsized, consolidated, and rescued — zero disruption."})]})}),a.jsxs(se.div,{layout:!0,className:"p-3 bg-white/5 rounded-lg border-l-2 border-primary",children:[a.jsx("p",{className:"text-[10px] font-bold text-primary mb-1",children:"DEPLOYMENT: AUTH-SVC"}),a.jsxs("div",{className:"flex justify-between text-xs text-slate-300",children:[a.jsx("span",{children:"CPU:"}),a.jsx("span",{className:"line-through text-slate-500",children:"500m"}),a.jsx("span",{className:"text-green-400 font-bold",children:"200m"})]}),a.jsxs("div",{className:"flex justify-between text-xs text-slate-300",children:[a.jsx("span",{children:"RAM:"}),a.jsx("span",{className:"line-through text-slate-500",children:"1Gi"}),a.jsx("span",{className:"text-green-400 font-bold",children:"512Mi"})]}),a.jsx("p",{className:"text-xs text-green-400 mt-1 font-bold text-right",children:"-$84/mo saved"})]}),a.jsxs(se.div,{layout:!0,className:"p-3 bg-white/5 rounded-lg border-l-2 border-primary/40",children:[a.jsx("p",{className:"text-[10px] font-bold text-slate-400 mb-1",children:"CONSOLIDATION PLAN"}),a.jsx("p",{className:"text-xs text-slate-300",children:"Savings gate cleared. Executing:"}),a.jsx("p",{className:"text-xs text-white font-medium mt-1",children:"Drain 2x c5.xlarge → repack"}),a.jsx("p",{className:"text-xs text-green-400 mt-1 font-bold text-right",children:"-$312/mo saved"})]}),a.jsxs(se.div,{layout:!0,className:"p-3 bg-white/5 rounded-lg border-l-2 border-green-400/60",children:[a.jsx("p",{className:"text-[10px] font-bold text-green-400 mb-1",children:"SPOT RESCUE: CART-SVC"}),a.jsx("p",{className:"text-xs text-slate-300",children:"Interruption notice received."}),a.jsx("p",{className:"text-xs text-white font-medium mt-1",children:"Live-migrated · same pod IP"}),a.jsx("p",{className:"text-xs text-green-400 mt-1 font-bold text-right",children:"0 connections dropped"})]})]}),a.jsxs("div",{className:"mt-auto pt-4 border-t border-white/5",children:[a.jsx("div",{className:"flex justify-between items-center",children:a.jsx("span",{className:"text-xs font-bold uppercase text-slate-500",children:"Est. Monthly Bill"})}),a.jsxs("div",{className:"flex items-end gap-2 mt-1",children:[a.jsxs(se.span,{className:"text-2xl font-black text-white",children:["$",a.jsx(Ce,{value:s?4250:6890,startOnView:!1,duration:.8})]}),a.jsx(se.span,{className:"text-xs text-red-400 mb-1.5",animate:{opacity:s?0:1},children:"(~$2.6k waste)"})]})]})]})]})]})})}),a.jsxs("section",{className:"max-w-7xl w-full px-6 pt-2 pb-8",children:[a.jsx("p",{className:"text-center text-[11px] uppercase tracking-widest text-slate-500 font-bold mb-7",children:"Runs on every major Kubernetes platform"}),a.jsxs("div",{className:"flex flex-wrap justify-center items-center gap-x-12 gap-y-6",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("img",{src:"/logos/aws.svg",alt:"Amazon Web Services",className:"platform-logo h-8 w-auto"}),a.jsx("span",{className:"text-sm font-bold text-slate-400",children:"EKS"})]}),a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("img",{src:"/logos/gcp.svg",alt:"Google Cloud",className:"platform-logo h-6 w-auto"}),a.jsx("span",{className:"text-sm font-bold text-slate-400",children:"GKE"})]}),a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("img",{src:"/logos/azure.svg",alt:"Microsoft Azure",className:"platform-logo h-8 w-auto"}),a.jsx("span",{className:"text-sm font-bold text-slate-400",children:"AKS"})]}),a.jsx("span",{className:"text-sm font-semibold text-slate-500",children:"+ any CNCF-compliant cluster"})]})]}),a.jsx("section",{id:"live-migration",className:"max-w-7xl w-full px-6 py-16",children:a.jsx(Gt,{children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 md:p-12 relative overflow-hidden",children:[a.jsx("div",{className:"absolute -top-24 -right-24 w-64 h-64 bg-primary/10 rounded-full blur-[80px]"}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-10 items-center relative z-10",children:[a.jsxs("div",{className:"text-left",children:[a.jsx("div",{className:"inline-block px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-bold uppercase tracking-widest mb-4",children:"Container Live Migration"}),a.jsxs("h2",{className:"text-3xl md:text-4xl font-black text-white mb-4 leading-tight",children:["Move running pods. ",a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-primary to-accent-purple",children:"Drop nothing."})]}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-6",children:"Consolidation and spot only save money if moving a pod doesn't mean killing it. OptOps checkpoints eligible workloads with CRIU and restores them on the destination node — memory and process state come along, and on AWS so do the pod IP and open TCP sessions."}),a.jsx("ul",{className:"space-y-3 text-sm text-slate-300 mb-8",children:["Memory and process state move with the pod — no cold restart","Same pod IP and unbroken TCP connections on AWS","State-preserving migration on GKE and AKS — early access","Database-aware safety engineering for Postgres, MongoDB, and MySQL","Per-workload eligibility checks — OptOps only migrates what it can move safely"].map(T=>a.jsxs("li",{className:"flex items-start gap-3",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-base mt-0.5",children:"check_circle"}),a.jsx("span",{children:T})]},T))}),a.jsxs(ie,{to:"/live-migration",className:"inline-flex items-center gap-2 text-primary font-bold hover:gap-3 transition-all",children:["Explore live migration ",a.jsx("span",{className:"material-symbols-outlined text-base",children:"arrow_forward"})]})]}),a.jsx(Xw,{})]})]})})}),a.jsx("section",{id:"how-it-works",className:"max-w-[960px] w-full pt-12 pb-4 px-6 text-center",children:a.jsxs(Gt,{children:[a.jsx("div",{className:"inline-block px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-bold uppercase tracking-widest mb-4",children:"Process"}),a.jsxs("h2",{className:"text-4xl md:text-5xl font-bold leading-tight tracking-tight mb-6 text-white",children:["Autonomy you ramp into, ",a.jsx("span",{className:"text-primary",children:"in three steps."})]}),a.jsx("p",{className:"text-slate-400 text-lg max-w-2xl mx-auto",children:"Start read-only. Watch in shadow mode. Then let it drive. You decide when OptOps goes from showing you the savings to capturing them autonomously."})]})}),a.jsx("section",{className:"max-w-[960px] w-full px-6 py-8",children:a.jsxs("div",{ref:l,className:"relative flex flex-col items-center",children:[a.jsx("div",{className:"absolute top-8 bottom-8 left-10 md:left-1/2 w-[2px] bg-white/5 md:-translate-x-1/2 hidden md:block"}),a.jsx(se.div,{className:"absolute top-8 bottom-8 left-10 md:left-1/2 w-[2px] origin-top bg-gradient-to-b from-primary via-primary/50 to-transparent md:-translate-x-1/2 hidden md:block",style:n?{scaleY:1}:{scaleY:d}}),a.jsx(qu,{reduceMotion:n,children:a.jsxs("div",{className:"relative flex flex-col md:flex-row items-center justify-between w-full mb-12 gap-8",children:[a.jsxs("div",{className:"flex-1 md:text-right text-center order-2 md:order-1",children:[a.jsx("h3",{className:"text-2xl font-bold text-white mb-2",children:"Install the full stack with one Helm command"}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"One chart brings up everything — agent, node engine, spot handler, and live migration. It starts read-only and every automation ships switched off, so nothing changes until you say so."})]}),a.jsx("div",{className:"z-10 order-1 md:order-2",children:a.jsx("div",{className:"w-16 h-16 rounded-full bg-background-dark border-4 border-primary flex items-center justify-center glow-effect shrink-0 overflow-hidden",children:a.jsx("span",{className:"material-symbols-outlined text-primary text-3xl",children:"hub"})})}),a.jsx("div",{className:"flex-1 order-3 w-full",children:a.jsx("div",{className:"glass-card p-6 rounded-xl",children:a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("div",{className:"w-8 h-8 rounded bg-primary/20 flex items-center justify-center",children:a.jsx("span",{className:"material-symbols-outlined text-primary text-sm",children:"terminal"})}),a.jsx("div",{className:"text-xs font-mono text-slate-300",children:"helm install optops-agent ..."})]})})})]})}),a.jsx(qu,{reduceMotion:n,children:a.jsxs("div",{className:"relative flex flex-col md:flex-row items-center justify-between w-full mb-12 gap-8",children:[a.jsx("div",{className:"flex-1 order-2 md:order-1 w-full relative group",children:a.jsxs("div",{className:"glass-card p-6 rounded-xl overflow-hidden relative",children:[a.jsx("div",{className:"absolute inset-0 bg-primary/5 group-hover:bg-primary/10 transition-colors"}),a.jsxs("div",{className:"space-y-4 relative z-10",children:[a.jsxs("div",{className:"flex justify-between items-center text-xs font-bold text-slate-400",children:[a.jsx("span",{children:"Live CPU Utilization"}),a.jsxs("div",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"w-2 h-2 rounded-full bg-green-500 animate-pulse"}),a.jsx("span",{className:"text-green-400",children:"Monitoring"})]})]}),a.jsxs("div",{className:"h-24 w-full bg-background-dark/50 rounded-lg border border-white/5 relative overflow-hidden flex items-end justify-between px-1",children:[Array.from({length:40}).map((T,O)=>a.jsx(se.div,{className:"w-1 bg-primary/40 rounded-t-sm",initial:{height:"20%"},animate:{height:[`${20+Math.random()*30}%`,`${40+Math.random()*50}%`,`${20+Math.random()*30}%`],backgroundColor:["rgba(175, 37, 244, 0.4)","rgba(175, 37, 244, 0.8)","rgba(175, 37, 244, 0.4)"]},transition:{duration:2,repeat:1/0,ease:"linear",delay:O*.05}},O)),a.jsx("div",{className:"absolute top-0 right-0 w-1/3 h-full bg-red-500/10 border-l border-red-500/20 flex items-center justify-center",children:a.jsx("span",{className:"text-[10px] font-bold text-red-400 uppercase tracking-widest -rotate-90",children:"Detected Waste"})})]}),a.jsxs("div",{className:"flex justify-between text-xs text-slate-400",children:[a.jsx("span",{children:"Node: ip-10-0-2-12"}),a.jsx("span",{className:"text-red-400 font-bold",children:"Low Utilization"})]})]})]})}),a.jsx("div",{className:"z-10 order-1 md:order-2",children:a.jsx("div",{className:"w-16 h-16 rounded-full bg-background-dark border-4 border-primary flex items-center justify-center glow-effect shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-primary text-3xl",children:"analytics"})})}),a.jsxs("div",{className:"flex-1 order-3 md:order-3 md:text-left text-center",children:[a.jsx("h3",{className:"text-2xl font-bold text-white mb-2",children:"Watch it think in shadow mode"}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"The engine cross-references live CPU and memory usage against requests to find oversized pods and underpacked nodes — and shadow mode shows you every rightsize, consolidation, and migration it would make before anything is enabled."})]})]})}),a.jsx(qu,{reduceMotion:n,children:a.jsxs("div",{className:"relative flex flex-col md:flex-row items-center justify-between w-full gap-8",children:[a.jsxs("div",{className:"flex-1 md:text-right text-center order-2 md:order-1",children:[a.jsx("h3",{className:"text-2xl font-bold text-white mb-2",children:"Turn on autonomous optimization"}),a.jsxs("p",{className:"text-slate-400 leading-relaxed",children:["Enable continuous rightsizing, node consolidation, and spot automation with live-migration rescue — capability by capability. Most teams see ",a.jsx("span",{className:"text-white font-bold bg-primary/30 px-2 py-0.5 rounded",children:"30–40%"})," lower bills in the first month."]})]}),a.jsx("div",{className:"z-10 order-1 md:order-2",children:a.jsx("div",{className:"w-16 h-16 rounded-full bg-primary flex items-center justify-center glow-effect shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-white text-3xl",children:"auto_fix_high"})})}),a.jsx("div",{className:"flex-1 order-3 w-full",children:a.jsxs(se.div,{className:"glass-card p-6 rounded-xl border-green-500/20 relative overflow-hidden group cursor-pointer",initial:"idle",whileInView:n?"idle":"active",viewport:{amount:.4},animate:"idle",children:[a.jsx("div",{className:"absolute inset-0 bg-green-500/5 group-hover:bg-green-500/10 transition-colors"}),a.jsxs("div",{className:"relative z-10",children:[a.jsxs("div",{className:"flex justify-between items-center mb-4",children:[a.jsx("span",{className:"text-xs font-bold text-slate-400 uppercase tracking-widest",children:"Monthly Cloud Bill"}),a.jsx(se.span,{className:"text-xs font-bold text-green-400 bg-green-500/10 px-2 py-0.5 rounded",variants:{idle:{opacity:.7},active:{opacity:1,scale:1.1}},children:"-40%"})]}),a.jsxs("div",{className:"space-y-4",children:[a.jsxs("div",{className:"space-y-1 opacity-50",children:[a.jsxs("div",{className:"flex justify-between text-xs",children:[a.jsx("span",{className:"text-slate-500",children:"Before"}),a.jsx("span",{className:"text-slate-400 line-through",children:"$12,500"})]}),a.jsx("div",{className:"h-2 w-full bg-slate-700 rounded-full overflow-hidden",children:a.jsx("div",{className:"h-full w-full bg-slate-500"})})]}),a.jsxs("div",{className:"space-y-1",children:[a.jsxs("div",{className:"flex justify-between text-xs font-bold",children:[a.jsx("span",{className:"text-white",children:"After Optimization"}),a.jsx(se.span,{className:"text-primary",variants:{idle:{opacity:.7,scale:1},active:{opacity:1,scale:[1,1.1,1],transition:{duration:1,repeat:1/0}}},children:"$7,500"})]}),a.jsx("div",{className:"h-2 w-full bg-slate-700 rounded-full overflow-hidden",children:a.jsx(se.div,{className:"h-full bg-gradient-to-r from-primary to-green-400",variants:{idle:{width:"100%"},active:{width:["100%","60%","60%","100%"],transition:{duration:3,times:[0,.3,.8,1],ease:"easeInOut",repeat:1/0}}}})})]}),a.jsxs("div",{className:"pt-2 border-t border-white/5 flex items-center gap-2 justify-end",children:[a.jsx("span",{className:"text-[10px] text-slate-500",children:"Annual Savings:"}),a.jsx("span",{className:"text-sm font-bold text-green-400",children:"$60,000"})]})]})]})]})})]})})]})}),a.jsx("section",{className:"max-w-7xl w-full px-6 py-20",children:a.jsx(Gt,{children:a.jsxs("div",{className:"glass-card rounded-2xl p-6 sm:p-10 grid grid-cols-1 lg:grid-cols-2 gap-10 items-center relative overflow-hidden",children:[a.jsx("div",{className:"absolute -top-24 -right-24 w-72 h-72 bg-primary/10 rounded-full blur-[90px] pointer-events-none"}),a.jsxs("div",{className:"relative z-10",children:[a.jsx("div",{className:"inline-block px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-bold uppercase tracking-widest mb-4",children:"Autonomous Consolidation"}),a.jsx("h2",{className:"text-3xl md:text-4xl font-black text-white mb-4",children:"Fewer nodes. Same workloads."}),a.jsx("p",{className:"text-slate-400 mb-6 leading-relaxed",children:"Most cluster
19s run far below capacity, paying for nodes that sit half-empty. OptOps continuously bin-packs pods onto fewer nodes and powers down the ones it drains — no dropped workloads, no manual rebalancing."}),a.jsxs("ul",{className:"space-y-3",children:[a.jsxs("li",{className:"flex items-start gap-3 text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg mt-0.5",children:"check_circle"}),a.jsx("span",{children:"Packs workloads to ~90% utilization before scaling down"})]}),a.jsxs("li",{className:"flex items-start gap-3 text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg mt-0.5",children:"check_circle"}),a.jsx("span",{children:"Drains and terminates emptied nodes automatically"})]}),a.jsxs("li",{className:"flex items-start gap-3 text-slate-300",children:[a.jsx("span",{className:"material-symbols-outlined text-primary text-lg mt-0.5",children:"check_circle"}),a.jsx("span",{children:"Every move is safety-gated and fully reversible"})]})]})]}),a.jsx("div",{className:"relative z-10",children:a.jsx(Jw,{})})]})})}),a.jsxs("section",{id:"spot",className:"max-w-7xl w-full px-6 py-16",children:[a.jsxs(Gt,{className:"text-center mb-14",children:[a.jsx("div",{className:"inline-block px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-bold uppercase tracking-widest mb-4",children:"Spot Automation"}),a.jsx("h2",{className:"text-3xl md:text-4xl font-black text-white mb-4",children:"Spot without the roulette."}),a.jsx("p",{className:"text-slate-400 max-w-2xl mx-auto",children:"Spot instances cut compute costs dramatically — if your workloads can survive the interruptions. OptOps makes them survivable."})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6 mb-16",children:[a.jsxs("div",{className:"glass-card rounded-2xl p-8 hover:border-primary/30 transition-colors",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:"move_up"})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:"Rescue, not restart"}),a.jsx("p",{className:"text-sm text-slate-400 leading-relaxed mb-6",children:"When the cloud reclaims a spot node, OptOps live-migrates your workload off it — same memory, same connections, same pod IP — proven against real AWS FIS interruption drills."}),a.jsx("span",{className:"px-2 py-1 rounded bg-white/5 border border-white/10 text-[10px] uppercase font-bold text-slate-300",children:"33s rescue · same pod IP"})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 hover:border-primary/30 transition-colors",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:"alt_route"})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:"When spot runs dry"}),a.jsx("p",{className:"text-sm text-slate-400 leading-relaxed mb-6",children:"Diversified spot pools, automatic on-demand fallback, and a stockout circuit breaker — a capacity crunch never strands your workloads."}),a.jsx("span",{className:"px-2 py-1 rounded bg-white/5 border border-white/10 text-[10px] uppercase font-bold text-slate-300",children:"Automatic fallback"})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 hover:border-primary/30 transition-colors",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:"query_stats"})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:"Know why, not just what"}),a.jsx("p",{className:"text-sm text-slate-400 leading-relaxed mb-6",children:"Quota and capacity root-cause insight tells you exactly why spot isn't landing — with a link to the fix. Plus rescue that starts moving workloads before the 2-minute warning even fires."}),a.jsx("span",{className:"px-2 py-1 rounded bg-primary/10 border border-primary/30 text-[10px] uppercase font-bold text-primary",children:"Early access"})]})]}),a.jsx("p",{className:"text-center mt-10",children:a.jsxs(ie,{to:"/resources/roi-calculator",className:"inline-flex items-center gap-2 text-primary font-bold hover:gap-3 transition-all",children:["Estimate your savings with the ROI calculator ",a.jsx("span",{className:"material-symbols-outlined text-base",children:"arrow_forward"})]})})]}),a.jsx("section",{id:"features",className:"bg-primary/5 py-20 w-full",children:a.jsxs("div",{className:"max-w-7xl mx-auto px-6",children:[a.jsxs(Gt,{className:"text-center mb-12",children:[a.jsx("h2",{className:"text-3xl md:text-4xl font-black text-white mb-4",children:"Built for Kubernetes. Extending to HPC."}),a.jsx("p",{className:"text-slate-400 max-w-2xl mx-auto",children:"One platform that finds the waste, executes the fix, and proves the savings — from cloud Kubernetes to GPU and HPC fleets. Seven capabilities, each with its own deep dive."})]}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:Nl.map(T=>a.jsxs(ie,{to:T.path,className:"flex items-center gap-4 p-5 rounded-xl bg-surface-dark border border-white/5 hover:border-primary/40 transition-colors group",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined",children:T.icon})}),a.jsxs("div",{className:"min-w-0",children:[a.jsxs("h3",{className:"text-base font-bold text-white group-hover:text-primary transition-colors flex items-center gap-2",children:[T.label,T.badge&&a.jsx("span",{className:"px-1.5 py-0.5 rounded bg-primary/10 border border-primary/30 text-[9px] uppercase font-bold text-primary",children:T.badge})]}),a.jsx("p",{className:"text-xs text-slate-400 leading-relaxed mt-0.5",children:T.blurb})]}),a.jsx("span",{className:"material-symbols-outlined text-slate-500 group-hover:text-primary group-hover:translate-x-0.5 transition-all ml-auto shrink-0",children:"arrow_forward"})]},T.path))})]})}),a.jsxs("section",{id:"trust",className:"max-w-7xl w-full px-6 py-20",children:[a.jsxs(Gt,{className:"text-center mb-14",children:[a.jsx("div",{className:"inline-block px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-bold uppercase tracking-widest mb-4",children:"Trust, Verified"}),a.jsx("h2",{className:"text-3xl md:text-4xl font-black text-white mb-4",children:"Don't take our word for it."}),a.jsx("p",{className:"text-slate-400 max-w-2xl mx-auto",children:"This category has a credibility problem: inflated savings claims and automation you're asked to trust blindly. We built the opposite — mechanisms you can verify yourself."})]}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6",children:[{title:"Run the drill yourself",desc:"Fire a real AWS spot interruption at your own opt-in workload and watch it survive with state intact. Self-service resilience drills, in your cluster.",icon:"science"},{title:"Shadow mode first",desc:"See every action OptOps would take — every rightsize, consolidation, and migration — before you let it act.",icon:"visibility"},{title:"Never-lose-money gates",desc:"Every consolidation plan must clear savings and safety gates before it executes. If a plan doesn't save money, it doesn't run.",icon:"verified"},{title:"Numbers you can audit",desc:"Realized savings and remaining opportunity are reported separately — never netted, never inflated, never double-counted.",icon:"receipt_long"}].map(T=>a.jsxs("div",{className:"glass-card rounded-2xl p-6 hover:border-primary/30 transition-colors",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:T.icon})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:T.title}),a.jsx("p",{className:"text-sm text-slate-400 leading-relaxed",children:T.desc})]},T.title))}),a.jsxs("div",{className:"mt-10 flex flex-wrap justify-center gap-x-8 gap-y-3 text-xs text-slate-400 font-semibold",children:[a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"check_circle"}),"Read-only by default"]}),a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"check_circle"}),"No secrets collected"]}),a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"check_circle"}),"Decisions made in your cluster"]}),a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"check_circle"}),"Independent third-party security assessment"]}),a.jsxs("span",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm",children:"check_circle"}),"ISO certification in progress"]})]})]}),a.jsxs("section",{id:"faq",className:"max-w-4xl w-full px-6 py-24",children:[a.jsxs(Gt,{className:"text-center mb-12",children:[a.jsx("div",{className:"inline-block px-3 py-1 rounded-full bg-primary/10 border border-primary/20 text-primary text-sm font-bold uppercase tracking-widest mb-4",children:"FAQ"}),a.jsx("h2",{className:"text-3xl font-black text-white",children:"Your Questions, Answered"})]}),a.jsx("div",{className:"space-y-4",children:x.map((T,O)=>a.jsxs("div",{className:"border border-white/10 rounded-xl overflow-hidden bg-surface-dark/50",children:[a.jsxs("button",{onClick:()=>b(O),className:"w-full flex items-center justify-between p-6 text-left hover:bg-white/5 transition-colors",children:[a.jsx("span",{className:"font-bold text-white",children:T.question}),a.jsx("span",{className:"material-symbols-outlined text-slate-400 transition-transform duration-300",style:{transform:m===O?"rotate(180deg)":"rotate(0deg)"},children:"expand_more"})]}),a.jsx("div",{className:`overflow-hidden transition-all duration-300 ${m===O?"max-h-96 opacity-100":"max-h-0 opacity-0"}`,children:a.jsx("div",{className:"p-6 pt-0 text-slate-400 text-sm leading-relaxed border-t border-white/5 mt-2",children:T.answer})})]},O))})]}),a.jsx("section",{id:"testimonials",className:"relative w-full overflow-hidden px-6 py-16 sm:px-10",children:a.jsx(Gt,{children:a.jsx(z4,{})})}),a.jsx("section",{id:"cli",className:"w-full bg-primary/5 border-y border-white/5 py-24",children:a.jsxs("div",{className:"max-w-5xl mx-auto px-6",children:[a.jsxs(Gt,{className:"text-center",children:[a.jsx("p",{className:"text-sm font-bold uppercase tracking-widest text-primary mb-4",children:"No account. No agent. Nothing installed."}),a.jsxs("h2",{className:"text-3xl md:text-5xl font-black text-white leading-tight mb-6",children:["See what your cluster is wasting ",a.jsx("br",{className:"hidden md:block"}),"with a single command. That's it."]}),a.jsx("p",{className:"text-lg text-slate-400 max-w-2xl mx-auto leading-relaxed mb-8",children:"The optops CLI reads your current kube-context, computes on your machine, and prints what the cluster costs today against what the same workloads would cost properly sized."})]}),a.jsxs(Gt,{delay:.1,className:"flex flex-col items-center",children:[a.jsx(nx,{}),a.jsx("div",{className:"flex flex-wrap justify-center gap-x-6 gap-y-2 mt-6 text-sm text-slate-400",children:["Read-only — five list calls, no writes","Runs locally"].map(T=>a.jsxs("span",{className:"flex items-center gap-1.5",children:[a.jsx("span",{className:"material-symbols-outlined text-sm text-primary",children:"check_circle"}),T]},T))})]}),a.jsxs(Gt,{delay:.2,className:"mt-12 max-w-3xl mx-auto",children:[a.jsx(M5,{}),a.jsx("p",{className:"text-center text-xs text-slate-500 mt-4",children:"Real output from a 6-node on-demand cluster whose pods request ~8× the CPU they use."})]})]})}),a.jsx("section",{className:"w-full bg-gradient-to-b from-surface-dark to-background-dark py-24 border-t border-white/5",children:a.jsxs("div",{className:"max-w-4xl mx-auto px-6 text-center",children:[a.jsxs(Gt,{children:[a.jsx("span",{className:"material-symbols-outlined text-center text-5xl text-red-500 mb-6 font-variation-settings-fill",children:"warning"}),a.jsxs("h2",{className:"text-3xl md:text-5xl font-black text-white mb-6 leading-tight",children:["A ",a.jsx("span",{className:"text-red-500",children:"$500"})," mistake becomes a ",a.jsx("br",{className:"hidden md:block"}),a.jsx("span",{className:"text-primary",children:"$15,000"})," annual problem."]}),a.jsx("p",{className:"text-xl text-slate-400 max-w-2xl mx-auto leading-relaxed",children:"By the time you spot waste on your monthly bill, you've already paid for it."})]}),a.jsxs(Gt,{delay:.15,children:[a.jsx("div",{className:"flex flex-wrap justify-center gap-4 mt-12 mb-4",children:[{value:60,format:T=>`${Math.round(T)}%`,label:"cost cut"},{value:30,format:T=>`${Math.round(T)} days`,label:"to get there"},{value:"0",label:"production incidents"}].map(T=>a.jsxs("div",{className:"bg-white/5 border border-white/10 rounded-xl px-6 py-4 min-w-[140px]",children:[a.jsx("p",{className:"text-2xl font-black text-white",children:typeof T.value=="number"?a.jsx(Ce,{value:T.value,format:T.format,duration:1.4}):T.value}),a.jsx("p",{className:"text-xs uppercase tracking-wider text-slate-400 font-bold mt-1",children:T.label})]},T.label))}),a.jsxs(ie,{to:"/case-studies",className:"inline-flex items-center gap-1.5 text-sm text-primary font-bold hover:gap-2.5 transition-all mb-12",children:["Read the case study ",a.jsx("span",{className:"material-symbols-outlined text-sm",children:"arrow_forward"})]}),a.jsxs("div",{className:"flex flex-wrap justify-center gap-4",children:[a.jsx("button",{onClick:h,className:"bg-primary text-white px-8 py-4 rounded-xl font-bold text-lg neon-glow hover:scale-[1.02] transition-transform",children:"Book a Demo"}),a.jsx(ie,{to:"/bookdemo",className:"bg-white/5 border border-white/10 px-8 py-4 rounded-xl font-bold text-lg hover:bg-white/10 transition-all text-white",children:"Get a Free Cluster Assessment"})]})]})]})})]})]}),a.jsx(Yw,{})]})},M4=typeof window>"u"?!1:{opacity:0,y:24},Gt=({children:n,delay:s=0,className:o=""})=>a.jsx(se.div,{className:o,initial:M4,whileInView:{opacity:1,y:0},viewport:{once:!0,margin:"-80px"},transition:{duration:.6,delay:s,ease:"easeOut"},children:n}),qu=({children:n,reduceMotion:s})=>{const o=ge.useRef(null),[l,d]=ge.useState(!1);ge.useEffect(()=>d(!0),[]);const{scrollYProgress:h}=Lw({target:o,offset:["start end","end start"]}),m=ml(h,[0,.5,1],[.9,1,.9]),p=ml(h,[0,.5,1],[.35,1,.35]),f=ml(h,[0,.5,1],[6,0,-6]),g=l&&!s;return a.jsx(se.div,{ref:o,style:g?{scale:m,opacity:p,rotateX:f,transformPerspective:1e3,willChange:"transform, opacity"}:void 0,children:n})};var Pu={exports:{}},Iu,mx;function q4(){if(mx)return Iu;mx=1;var n="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED";return Iu=n,Iu}var Uu,px;
19function P4(){if(px)return Uu;px=1;var n=q4();function s(){}function o(){}return o.resetWarningCache=s,Uu=function(){function l(m,p,f,g,b,x){if(x!==n){var w=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw w.name="Invariant Violation",w}}l.isRequired=l;function d(){return l}var h={array:l,bigint:l,bool:l,func:l,number:l,object:l,string:l,symbol:l,any:l,arrayOf:d,element:l,elementType:l,instanceOf:d,node:l,objectOf:d,oneOf:d,oneOfType:d,shape:d,exact:d,checkPropTypes:o,resetWarningCache:s};return h.PropTypes=h,h},Uu}var fx;function I4(){return fx||(fx=1,Pu.exports=P4()()),Pu.exports}var U4=I4();const Le=Ox(U4);function gx(n,s){var o=Object.keys(n);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(n);s&&(l=l.filter(function(d){return Object.getOwnPropertyDescriptor(n,d).enumerable})),o.push.apply(o,l)}return o}function yx(n){for(var s=1;s<arguments.length;s++){var o=arguments[s]!=null?arguments[s]:{};s%2?gx(Object(o),!0).forEach(function(l){u0(n,l,o[l])}):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(o)):gx(Object(o)).forEach(function(l){Object.defineProperty(n,l,Object.getOwnPropertyDescriptor(o,l))})}return n}function pl(n){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?pl=function(s){return typeof s}:pl=function(s){return s&&typeof Symbol=="function"&&s.constructor===Symbol&&s!==Symbol.prototype?"symbol":typeof s},pl(n)}function u0(n,s,o){return s in n?Object.defineProperty(n,s,{value:o,enumerable:!0,configurable:!0,writable:!0}):n[s]=o,n}function B4(n,s){if(n==null)return{};var o={},l=Object.keys(n),d,h;for(h=0;h<l.length;h++)d=l[h],!(s.indexOf(d)>=0)&&(o[d]=n[d]);return o}function _4(n,s){if(n==null)return{};var o=B4(n,s),l,d;if(Object.getOwnPropertySymbols){var h=Object.getOwnPropertySymbols(n);for(d=0;d<h.length;d++)l=h[d],!(s.indexOf(l)>=0)&&Object.prototype.propertyIsEnumerable.call(n,l)&&(o[l]=n[l])}return o}function V4(n,s){return L4(n)||G4(n,s)||H4(n,s)||K4()}function L4(n){if(Array.isArray(n))return n}function G4(n,s){var o=n&&(typeof Symbol<"u"&&n[Symbol.iterator]||n["@@iterator"]);if(o!=null){var l=[],d=!0,h=!1,m,p;try{for(o=o.call(n);!(d=(m=o.next()).done)&&(l.push(m.value),!(s&&l.length===s));d=!0);}catch(f){h=!0,p=f}finally{try{!d&&o.return!=null&&o.return()}finally{if(h)throw p}}return l}}
19function H4(n,s){if(n){if(typeof n=="string")return bx(n,s);var o=Object.prototype.toString.call(n).slice(8,-1);if(o==="Object"&&n.constructor&&(o=n.constructor.name),o==="Map"||o==="Set")return Array.from(n);if(o==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(o))return bx(n,s)}}function bx(n,s){(s==null||s>n.length)&&(s=n.length);for(var o=0,l=new Array(s);o<s;o++)l[o]=n[o];return l}function K4(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.
20In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}var wt=function(s,o,l){var d=!!l,h=ge.useRef(l);ge.useEffect(function(){h.current=l},[l]),ge.useEffect(function(){if(!d||!s)return function(){};var m=function(){h.current&&h.current.apply(h,arguments)};return s.on(o,m),function(){s.off(o,m)}},[d,o,s,h])},F4=function(s){var o=ge.useRef(s);return ge.useEffect(function(){o.current=s},[s]),o.current},Tl=function(s){return s!==null&&pl(s)==="object"},xx="[object Object]",W4=function n(s,o){if(!Tl(s)||!Tl(o))return s===o;var l=Array.isArray(s),d=Array.isArray(o);if(l!==d)return!1;var h=Object.prototype.toString.call(s)===xx,m=Object.prototype.toString.call(o)===xx;if(h!==m)return!1;if(!h&&!l)return s===o;var p=Object.keys(s),f=Object.keys(o);if(p.length!==f.length)return!1;for(var g={},b=0;b<p.length;b+=1)g[p[b]]=!0;for(var x=0;x<f.length;x+=1)g[f[x]]=!0;var w=Object.keys(g);if(w.length!==p.length)return!1;var S=s,T=o,O=function(E){return n(S[E],T[E])};return w.every(O)},Y4=function(s,o,l){return Tl(s)?Object.keys(s).reduce(function(d,h){var m=!Tl(o)||!W4(s[h],o[h]);return l.includes(h)?(m&&console.warn("Unsupported prop change: options.".concat(h," is not a mutable property.")),d):m?yx(yx({},d||{}),{},u0({},h,s[h])):d},null):null},h0=ge.createContext(null);h0.displayName="ElementsContext";var X4=function(s,o){if(!s)throw new Error("Could not find Elements context; You need to wrap the part of your app that ".concat(o," in an <Elements> provider."));return s};Le.any,Le.object;Le.func.isRequired;var m0=ge.createContext(null);m0.displayName="CheckoutSdkContext";var J4=function(s,o){if(!s)throw new Error("Could not find CheckoutProvider context; You need to wrap the part of your app that ".concat(o," in an <CheckoutProvider> provider."));return s},$4=ge.createContext(null);$4.displayName="CheckoutContext";Le.any,Le.shape({fetchClientSecret:Le.func.isRequired,elementsOptions:Le.object}).isRequired;var vx=function(s){var o=ge.useContext(m0),l=ge.useContext(h0);if(o&&l)throw new Error("You cannot wrap the part of your app that ".concat(s," in both <CheckoutProvider> and <Elements> providers."));return o?J4(o,s):X4(l,s)},Q4=["mode"],Z4=function(s){return s.charAt(0).toUpperCase()+s.slice(1)},Qe=function(s,o){var l="".concat(Z4(s),"Element"),d=function(f){var g=f.id,b=f.className,x=f.options,w=x===void 0?{}:x,S=f.onBlur,T=f.onFocus,O=f.onReady,D=f.onChange,E=f.onEscape,P=f.onClick,I=f.onLoadError,F=f.onLoaderStart,W=f.onNetworksChange,Z=f.onConfirm,X=f.onCancel,J=f.onShippingAddressChange,Q=f.onShippingRateChange,ue=f.onSavedPaymentMethodRemove,fe=f.onSavedPaymentMethodUpdate,je=vx("mounts <".concat(l,">")),Re="elements"in je?je.elements:null,Ie="checkoutSdk"in je?je.checkoutSdk:null,Xe=ge.useState(null),B=V4(Xe,2),V=B[0],$=B[1],oe=ge.useRef(null),L=ge.useRef(null);wt(V,"blur",S),wt(V,"focus",T),wt(V,"escape",E),wt(V,"click",P),wt(V,"loaderror",I),wt(V,"loaderstart",F),wt(V,"networkschange",W),wt(V,"confirm",Z),wt(V,"cancel",X),wt(V,"shippingaddresschange",J),wt(V,"shippingratechange",Q),wt(V,"savedpaymentmethodremove",ue),wt(V,"savedpaymentmethodupdate",fe),wt(V,"change",D);var k;O&&(s==="expressCheckout"?k=O:k=function(){O(V)}),wt(V,"ready",k),ge.useLayoutEffect(function(){if(oe.current===null&&L.current!==null&&(Re||Ie)){var H=null;if(Ie)switch(s){case"payment":H=Ie.createPaymentElement(w);break;case"address":if("mode"in w){var Y=w.mode,ee=_4(w,Q4);if(Y==="shipping")H=Ie.createShippingAddressElement(ee);else if(Y==="billing")H=Ie.createBillingAddressElement(ee);else throw new Error("Invalid options.mode. mode must be 'billing' or 'shipping'.")}else throw new Error("You must supply options.mode. mode must be 'billing' or 'shipping'.");break;case"expressCheckout":H=Ie.createExpressCheckoutElement(w);break;case"currencySelector":H=Ie.createCurrencySelectorElement();break;case"taxId":H=Ie.createTaxIdElement(w);break;default:throw new Error("Invalid Element type ".concat(l,". You must use either the <PaymentElement />
20, <AddressElement options={{mode: 'shipping'}} />, <AddressElement options={{mode: 'billing'}} />, or <ExpressCheckoutElement />."))}else Re&&(H=Re.create(s,w));oe.current=H,$(H),H&&H.mount(L.current)}},[Re,Ie,w]);var q=F4(w);return ge.useEffect(function(){if(oe.current){var H=Y4(w,q,["paymentRequest"]);H&&"update"in oe.current&&oe.current.update(H)}},[w,q]),ge.useLayoutEffect(function(){return function(){if(oe.current&&typeof oe.current.destroy=="function")try{oe.current.destroy(),oe.current=null}catch{}}},[]),ge.createElement("div",{id:g,className:b,ref:L})},h=function(f){vx("mounts <".concat(l,">"));var g=f.id,b=f.className;return ge.createElement("div",{id:g,className:b})},m=o?h:d;return m.propTypes={id:Le.string,className:Le.string,onChange:Le.func,onBlur:Le.func,onFocus:Le.func,onReady:Le.func,onEscape:Le.func,onClick:Le.func,onLoadError:Le.func,onLoaderStart:Le.func,onNetworksChange:Le.func,onConfirm:Le.func,onCancel:Le.func,onShippingAddressChange:Le.func,onShippingRateChange:Le.func,onSavedPaymentMethodRemove:Le.func,onSavedPaymentMethodUpdate:Le.func,options:Le.object},m.displayName=l,m.__elementType=s,m},Ze=typeof window>"u",e3=ge.createContext(null);e3.displayName="EmbeddedCheckoutProviderContext";Qe("auBankAccount",Ze);var t3=Qe("card",Ze);Qe("cardNumber",Ze);Qe("cardExpiry",Ze);Qe("cardCvc",Ze);Qe("fpxBank",Ze);Qe("iban",Ze);Qe("idealBank",Ze);Qe("p24Bank",Ze);Qe("epsBank",Ze);Qe("payment",Ze);Qe("expressCheckout",Ze);Qe("currencySelector",Ze);Qe("paymentRequestButton",Ze);Qe("linkAuthentication",Ze);Qe("address",Ze);Qe("shippingAddress",Ze);Qe("paymentMethodMessaging",Ze);Qe("affirmMessage",Ze);Qe("afterpayClearpayMessage",Ze);Qe("taxId",Ze);var Bu,wx;function n3(){if(wx)return Bu;wx=1;var n=Object.defineProperty,s=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,l=Object.prototype.hasOwnProperty,d=(L,k)=>{for(var q in k)n(L,q,{get:k[q],enumerable:!0})},h=(L,k,q,H)=>{if(k&&typeof k=="object"||typeof k=="function")for(let Y of o(k))!l.call(L,Y)&&Y!==q&&n(L,Y,{get:()=>k[Y],enumerable:!(H=s(k,Y))||H.enumerable});return L},m=L=>h(n({},"__esModule",{value:!0}),L),p=(L,k,q)=>new Promise((H,Y)=>{var ee=Ne=>{try{de(q.next(Ne))}catch(ke){Y(ke)}},le=Ne=>{try{de(q.throw(Ne))}catch(ke){Y(ke)}},de=Ne=>Ne.done?H(Ne.value):Promise.resolve(Ne.value).then(ee,le);de((q=q.apply(L,k)).next())}),f={};d(f,{SubmissionError:()=>F,appendExtraData:()=>Re,createClient:()=>V,getDefaultClient:()=>$,isSubmissionError:()=>I}),Bu=m(f);var g="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",b=/^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/;function x(L){L=String(L);for(var k,q,H,Y,ee="",le=0,de=L.length%3;le<L.length;){if((q=L.charCodeAt(le++))>255||(H=L.charCodeAt(le++))>255||(Y=L.charCodeAt(le++))>255)throw new TypeError("Failed to execute 'btoa' on 'Window': The string to be encoded contains characters outside of the Latin1 range.");k=q<<16|H<<8|Y,ee+=g.charAt(k>>18&63)+g.charAt(k>>12&63)+g.charAt(k>>6&63)+g.charAt(k&63)}return de?ee.slice(0,de-3)+"===".substring(de):ee}function w(L){if(L=String(L).replace(/[\t\n\f\r ]+/g,""),!b.test(L))throw new TypeError("Failed to execute 'atob' on 'Window': The string to be decoded is not correctly encoded.");L+="==".slice(2-(L.length&3));for(var k,q="",H,Y,ee=0;ee<L.length;)k=g.indexOf(L.charAt(ee++))<<18|g.indexOf(L.charAt(ee++))<<12|(H=g.indexOf(L.charAt(ee++)))<<6|(Y=g.indexOf(L.charAt(ee++))),q+=H===64?String.fromCharCode(k>>16&255):Y===64?String.fromCharCode(k>>16&255,k>>8&255):String.fromCharCode(k>>16&255,k>>8&255,k&255);return q}var S=()=>navigator.webdriver||!!document.documentElement.getAttribute(w("d2ViZHJpdmVy"))||!!window.callPhantom||!!window._phantom,T=class{constructor(){this.loadedAt=Date.now(),this.webdriver=S()}data(){return{loadedAt:this.loadedAt,webdriver:this.webdriver}}},O=class{constructor(L){this.kind="success",this.next=L.next}};function D(L){return"next"in L&&typeof L.next=="string"}var E=class{constructor(L,k){this.paymentIntentClientSecret=L,this.resubmitKey=k,this.kind="stripePluginPending"}};function P(L){if("stripe"in L&&"resubmitKey"in L&&typeof L.resubmitKey=="string"){let{stripe:k}=L;return typeof k=="object"&&k!=null&&"paymentIntentClientSecret"in k&&typeof k.paymentIntentClientSecret=="string"}return!1}function I(L){return L.kind==="error"}var F=class{constructor(...L){this.kind="error",this.formErrors=[],this.fieldErrors=new Map;var k;for(let q of L){if(!q.field){this.formErrors.push({code:q.code&&W(q.code)?q.code:"UNSPECIFIED",message:q.message});continue}let H=(k=this.fieldErrors.get(q.field))!=null?k:[];H.push({code:q.code&&X(q.code)?q.code:"UNSPECIFIED",message:q.message}),this.fieldErrors.set(q.field,H)}}getFormErrors(){return[...this.formErrors]}getFieldErrors(L){var k;return(k=this.fieldErrors.get(L))!=null?k:[]}getAllFieldErrors(){return Array.from(this.fieldErrors)}};function W(L){return L in Z}var Z={BLOCKED:"BLOCKED",EMPTY:"EMPTY",FILES_TOO_BIG:"FILES_TOO_BIG",FORM_NOT_FOUND:"FORM_NOT_FOUND",INACTIVE:"INACTIVE",NO_FILE_UPLOADS:"NO_FILE_UPLOADS",PROJECT_NOT_FOUND:"PROJECT_NOT_FOUND",TOO_MANY_FILES:"TOO_MANY_FILES"};function X(L){return L in J}var J={REQUIRED_FIELD_EMPTY:"REQUIRED_FIELD_EMPTY",REQUIRED_FIELD_MISSING:"REQUIRED_FIELD_MISSING",STRIPE_CLIENT_ERROR:"STRIPE_CLIENT_ERROR",STRIPE_SCA_ERROR:"STRIPE_SCA_ERROR",TYPE_EMAIL:"TYPE_EMAIL",TYPE_NUMERIC:"TYPE_NUMERIC",TYPE_TEXT:"TYPE_TEXT"};function Q(L){return"errors"in L&&Array.isArray(L.errors)&&L.errors.every(k=>typeof k.message=="string")||"error"in L&&typeof L.error=="string"}var ue="4.0.0",fe=L=>x(JSON.stringify(L)),je=L=>{let k=`@formspree/core@${ue}`;return L?`${L} ${k}`:k};function Re(L,k,q){L instanceof FormData?L.append(k,q):L[k]=q}function Ie(L){return L!==null&&typeof L=="object"}var Xe=class{constructor(L={}){this.project=L.project,this.stripe=L.stripe,typeof window<"u"&&(this.session=new T)}submitForm(L,k){return p(this,arguments,function*(q,H,Y={}){let ee=Y.endpoint||"https://formspree.io",le=this.project?`${ee}/p/${this.project}/f/${q}`:`${ee}/f/${q}`,de={Accept:"application/json","Formspree-Client":je(Y.clientName)};this.session&&(de["Formspree-Session-Data"]=fe(this.session.data())),H instanceof FormData||(de["Content-Type"]="application/json");function Ne(Ft){return p(this,null,function*(){try{let Be=yield(yield fetch(le,{method:"POST",mode:"cors",body:Ft instanceof FormData?Ft:JSON.stringify(Ft),headers:de})).json();if(Ie(Be)){if(Q(Be))return Array.isArray(Be.errors)?new F(...Be.errors):new F({message:Be.error});if(P(Be))return new E(Be.stripe.paymentIntentClientSecret,Be.resubmitKey);if(D(Be))return new O({next:Be.next})}return new F({message:"Unexpected response format"})}catch(Be){let Fn=Be instanceof Error?Be.message:`Unknown error while posting to Formspree: ${JSON.stringify(Be)}`;return new F({message:Fn})}})}if(this.stripe&&Y.createPaymentMethod){let Ft=yield Y.createPaymentMethod();if(Ft.error)return new F({code:"STRIPE_CLIENT_ERROR",field:"paymentMethod",message:"Error creating payment method"});Re(H,"paymentMethod",Ft.paymentMethod.id);let Be=yield Ne(H);if(Be.kind==="error")return Be;
20if(Be.kind==="stripePluginPending"){let Fn=yield this.stripe.handleCardAction(Be.paymentIntentClientSecret);if(Fn.error)return new F({code:"STRIPE_CLIENT_ERROR",field:"paymentMethod",message:"Stripe SCA error"});H instanceof FormData?H.delete("paymentMethod"):delete H.paymentMethod,Re(H,"paymentIntent",Fn.paymentIntent.id),Re(H,"resubmitKey",Be.resubmitKey);let Xs=yield Ne(H);return B(Xs),Xs}return Be}let ke=yield Ne(H);return B(ke),ke})}};function B(L){let{kind:k}=L;if(k!=="success"&&k!=="error")throw new Error(`Unexpected submission result (kind: ${k})`)}var V=L=>new Xe(L),$=()=>(oe||(oe=V()),oe),oe;return Bu}var im=n3(),a3=j.createContext({elements:null});function s3(){return j.useContext(a3)}var i3=ge.createContext(null);function o3(){return j.useContext(i3)??{client:im.getDefaultClient()}}var r3="3.0.0",l3=`@formspree/react@${r3}`;function c3(n,s={}){let o=o3(),{client:l=o.client,extraData:d,origin:h}=s,{elements:m}=s3(),{stripe:p}=l;return async function(f){let g=d3(f)?u3(f):f;if(typeof d=="object")for(let[w,S]of Object.entries(d)){let T;typeof S=="function"?T=await S():T=S,T!==void 0&&im.appendExtraData(g,w,T)}let b=m?.getElement(t3),x=p&&b?()=>p.createPaymentMethod({type:"card",card:b,billing_details:h3(g)}):void 0;return l.submitForm(n,g,{endpoint:h,clientName:l3,createPaymentMethod:x})}}function d3(n){return"preventDefault"in n&&typeof n.preventDefault=="function"}function u3(n){n.preventDefault();let s=n.currentTarget;if(s.tagName!="FORM")throw new Error("submit was triggered for a non-form element");return new FormData(s)}function h3(n){let s={address:m3(n)};for(let o of["name","email","phone"]){let l=n instanceof FormData?n.get(o):n[o];l&&typeof l=="string"&&(s[o]=l)}return s}function m3(n){let s={};for(let[o,l]of[["address_line1","line1"],["address_line2","line2"],["address_city","city"],["address_country","country"],["address_state","state"],["address_postal_code","postal_code"]]){let d=n instanceof FormData?n.get(o):n[o];d&&typeof d=="string"&&(s[l]=d)}return s}function p3(n,s={}){let[o,l]=j.useState(null),[d,h]=j.useState(null),[m,p]=j.useState(!1),[f,g]=j.useState(!1),b=c3(n,{client:s.client,extraData:s.data,origin:s.endpoint});return[{errors:o,result:d,submitting:m,succeeded:f},async function(x){p(!0);let w=await b(x);p(!1),im.isSubmissionError(w)?(l(w),g(!1)):(l(null),h(w),g(!0))},function(){l(null),h(null),p(!1),g(!1)}]}const f3=()=>{const[n,s]=j.useState({firstName:"",lastName:"",email:"",phone:"",platform:"",spend:"",message:""}),[o,l]=j.useState(!1),d=["AWS EKS","Google GKE","Azure AKS","Self-managed (Kops/Kubeadm)","OpenShift","Other"],h=["Less than $10,000","$10,000 - $50,000","$50,000 - $100,000","$100,000 - $500,000","$500,000+"],[m,p]=p3("mqeejvla");ge.useEffect(()=>{m.succeeded&&l(!0)},[m.succeeded]);const f=g=>{s({...n,[g.target.name]:g.target.value})};return o?a.jsxs("div",{className:"min-h-screen flex flex-col items-center justify-center p-6 bg-gradient-to-b from-background-dark to-surface-dark relative overflow-hidden",children:[a.jsxs("div",{className:"absolute top-0 left-0 w-full h-full overflow-hidden pointer-events-none",children:[a.jsx("div",{className:"absolute top-[-10%] left-[-10%] w-[40%] h-[40%] bg-primary/20 rounded-full blur-[100px]"}),a.jsx("div",{className:"absolute bottom-[-10%] right-[-10%] w-[40%] h-[40%] bg-accent-purple/20 rounded-full blur-[100px]"})]}),a.jsxs(se.div,{initial:{opacity:0,scale:.9},animate:{opacity:1,scale:1},className:"text-center w-full max-w-md relative z-10",children:[a.jsx("div",{className:"w-20 h-20 bg-green-500/10 rounded-full flex items-center justify-center mx-auto mb-6 ring-1 ring-green-500/20",children:a.jsx("span",{className:"material-symbols-outlined text-green-500 text-4xl",children:"check"})}),a.jsx("h2",{className:"text-3xl font-black text-white mb-4",children:"Request Received!"}),a.jsxs("p",{className:"text-slate-400 mb-8",children:["Thank you for your interest, ",a.jsx("span",{className:"text-white font-bold",children:n.firstName}),". Our team will review your request and reach out to you at ",a.jsx("span",{className:"text-primary font-bold",children:n.email})," within 24 hours to schedule your demo."]}),a.jsx(ie,{to:"/",className:"inline-block bg-white/5 hover:bg-white/10 text-white font-bold py-3 px-8 rounded-lg border border-white/10 transition-colors",children:"Back to Home"})]})]}):a.jsxs("div",{className:"min-h-screen bg-background-dark text-white font-sans selection:bg-primary/30 flex flex-col lg:flex-row relative",children:[a.jsx("div",{className:"absolute top-6 right-6 z-20",children:a.jsx(fh,{className:"shrink-0"})}),a.jsxs("div",{className:"lg:w-5/12 bg-surface-dark p-8 lg:p-12 flex flex-col justify-between border-b lg:border-b-0 lg:border-r border-white/5 relative overflow-hidden",children:[a.jsx("div",{className:"absolute top-0 right-0 w-96 h-96 bg-primary/5 rounded-full blur-[100px] pointer-events-none -translate-y-1/2 translate-x-1/2"}),a.jsxs("div",{className:"relative z-10",children:[a.jsxs(ie,{to:"/",className:"inline-flex items-center gap-3 mb-12 hover:opacity-80 transition-opacity",children:[a.jsx("img",{src:"/logo.png",alt:"OptOps Logo",className:"w-16 h-16 rounded-xl object-cover dark-logo"}),a.jsx("img",{src:"/logo-light.png",alt:"OptOps Logo",className:"w-16 h-16 rounded-xl object-cover light-logo"}),a.jsx("span",{className:"font-bold text-2xl tracking-tight",children:"OptOps.Ai"})]}),a.jsxs("h1",{className:"text-4xl lg:text-5xl font-black tracking-tight mb-6 leading-tight",children:["Schedule Your ",a.jsx("br",{}),a.jsx("span",{className:"text-primary",children:"Free Demo"})]}),a.jsx("p",{className:"text-slate-400 text-lg mb-8 leading-relaxed",children:"Fill out the form and we'll reach out within 24 hours to schedule a time that works for you."}),a.jsxs("div",{className:"space-y-6 mb-12",children:[a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-sm",children:"timer"})}),a.jsxs("div",{children:[a.jsx("h4",{className:"font-bold text-white",children:"30-minute personalized demo"}),a.jsx("p",{className:"text-sm text-slate-400",children:"Tailored walkthrough of our platform based on your specific needs."})]})]}),a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-sm",children:"bar_chart"})}),a.jsxs("div",{children:[a.jsx("h4",{className:"font-bold text-white",children:"Free Cluster Efficiency Assessment"}),a.jsx("p",{className:"text-sm text-slate-400",children:"Data-backed analysis of your current waste and savings potential."})]})]}),a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-sm",children:"lock"})}),a.jsxs("div",{children:[a.jsx("h4",{className:"font-bold text-white",children:"Read-only anal
20ysis—zero risk"}),a.jsx("p",{className:"text-sm text-slate-400",children:"We never take control of your infrastructure during the assessment."})]})]}),a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("div",{className:"w-8 h-8 rounded-full bg-primary/10 flex items-center justify-center text-primary shrink-0",children:a.jsx("span",{className:"material-symbols-outlined text-sm",children:"savings"})}),a.jsx("div",{children:a.jsx("h4",{className:"font-bold text-white",children:"See your savings potential instantly"})})]})]})]}),a.jsxs("div",{className:"relative z-10 pt-8 border-t border-white/5 space-y-4",children:[a.jsxs("div",{children:[a.jsx("p",{className:"text-xs font-bold text-slate-500 uppercase tracking-wider mb-1",children:"Email Us"}),a.jsx("a",{href:"mailto:[email protected]",className:"text-white hover:text-primary transition-colors font-medium",children:"[email protected]"}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:"Have questions? Our optimization experts are ready to help."})]}),a.jsxs("div",{children:[a.jsx("p",{className:"text-xs font-bold text-slate-500 uppercase tracking-wider mb-1",children:"Contact Team"}),a.jsx("a",{href:"tel:+919811577006",className:"text-white hover:text-primary transition-colors font-medium",children:"+91 98115 77006"}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:"(Mon–Fri, 10 AM–7 PM IST)"})]})]})]}),a.jsx("div",{className:"lg:w-7/12 p-8 lg:p-12 overflow-y-auto",children:a.jsxs("form",{onSubmit:p,className:"max-w-2xl mx-auto space-y-6",children:[a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"First Name"}),a.jsx("input",{type:"text",name:"firstName",required:!0,className:"w-full bg-surface-dark bg-opacity-50 border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all placeholder:text-slate-600",placeholder:"Jane",value:n.firstName,onChange:f})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"Last Name"}),a.jsx("input",{type:"text",name:"lastName",required:!0,className:"w-full bg-surface-dark bg-opacity-50 border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all placeholder:text-slate-600",placeholder:"Smith",value:n.lastName,onChange:f})]})]}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"Email"}),a.jsx("input",{type:"email",name:"email",required:!0,className:"w-full bg-surface-dark bg-opacity-50 border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all placeholder:text-slate-600",placeholder:"[email protected]",value:n.email,onChange:f})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"Phone"}),a.jsx("input",{type:"tel",name:"phone",required:!0,className:"w-full bg-surface-dark bg-opacity-50 border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all placeholder:text-slate-600",placeholder:"+1 (555) 000-0000",value:n.phone,onChange:f})]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"Which Kubernetes platform do you use?"}),a.jsxs("select",{name:"platform",required:!0,className:"w-full bg-surface-dark border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all appearance-none cursor-pointer",value:n.platform,onChange:f,children:[a.jsx("option",{value:"",disabled:!0,className:"text-slate-500",children:"Select your platform..."}),d.map(g=>a.jsx("option",{value:g,className:"bg-surface-dark",children:g},g))]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"Monthly Cloud Spend (Approx.)"}),a.jsxs("select",{name:"spend",required:!0,className:"w-full bg-surface-dark border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all appearance-none cursor-pointer",value:n.spend,onChange:f,children:[a.jsx("option",{value:"",disabled:!0,className:"text-slate-500",children:"Select range..."}),h.map(g=>a.jsx("option",{value:g,className:"bg-surface-dark",children:g},g))]})]}),a.jsxs("div",{className:"space-y-2",children:[a.jsx("label",{className:"text-sm font-bold text-slate-300 ml-1",children:"Your message (Optional)"}),a.jsx("textarea",{name:"message",rows:"4",className:"w-full bg-surface-dark border border-slate-700/50 rounded-lg px-4 py-3 text-white focus:outline-none focus:border-primary focus:ring-1 focus:ring-primary transition-all placeholder:text-slate-600 resize-none",placeholder:"Tell us about your current challenges...",value:n.message,onChange:f})]}),a.jsx("button",{type:"submit",disabled:m.submitting,className:"w-full bg-primary text-white font-bold py-4 rounded-xl text-lg hover:bg-opacity-90 transition-all neon-glow disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center gap-2 mt-4",children:m.submitting?a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"w-5 h-5 border-2 border-white/30 border-t-white rounded-full animate-spin"}),"Sending Request..."]}):"Schedule Demo"}),a.jsxs("div",{className:"mt-10 pt-8 border-t border-white/5",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-widest text-slate-500 font-bold mb-5",children:"What happens next"}),a.jsx("div",{className:"space-y-4",children:[{step:"1",title:"We reply within 24 hours",text:"A real engineer, not an email sequence."},{step:"2",title:"Read-only assessment",text:"One Helm command connects your cluster — nothing changes."},{step:"3",title:"Your savings report",text:"Exactly what you could save, shown before anything runs."}].map(g=>a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("span",{className:"w-8 h-8 rounded-full bg-primary/10 border border-primary/30 text-primary text-sm font-black flex items-center justify-center shrink-0",children:g.step}),a.jsxs("div",{children:[a.jsx("h4",{className:"text-sm font-bold text-white",children:g.title}),a.jsx("p",{className:"text-xs text-slate-400 mt-0.5",children:g.text})]})]},g.step))})]})]})})]})},g3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Case Study",title:"How an Emerging Media-Tech Company Cut Kubernetes Costs by 60% in 30 Days",subtitle:"A small production cluster — proof that the waste is real at every scale. No lock-in, no operational risk.",actions:a.jsx(ie,{to:"/bookdemo",className:"bg-primary text-white px-8 py-3 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Get Free Cluster Efficiency Assessment"})}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-[1.15fr_0.85fr] gap-6",children:[a.jsxs("article",{className:"glass-card rounded-2xl p-8",children:[a.jsx("h3",{className:"text-2xl font-bold text-white mb-4",children:"The Hidden Cost No One Talks About in Kubernetes"}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-6",children:"Everything looked stable. No crashes. No outages. No scaling incidents. But money was leaking silently. Like most fast-growing media-tech teams, workloads had been sized for theoretical peak demand. It felt safe. It felt responsible. It was costly."}),a.jsx("h3",{className:"text-2xl font-bold text-white mb-4",children:"The Real Problem: Overprovisioning Disguised as Stability"}),a.jsxs("ul",{className:"space-y-2 text-slate-400 mb-6",children:[a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-red-400 font-bold",children:"▲"})," CPU utilization: 3.3%"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-red-400 font-bold",children:"▲"})," 96.7% of allocated CPU sitting idle"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-red-400 font-bold",children:"▲"}
20)," 55% of pods operating below 40% efficiency"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-red-400 font-bold",children:"▲"})," No granular namespace-level cost visibility"]}),a.jsxs("li",{className:"flex items-center gap-2",children:[a.jsx("span",{className:"text-red-400 font-bold",children:"▲"})," No systematic rightsizing process"]})]}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"They were not overspending because of poor engineering. They were overspending because they could not see workload-level waste."})]}),a.jsxs("aside",{className:"glass-card rounded-2xl p-8",children:[a.jsx("h3",{className:"text-xl font-bold text-white mb-5",children:"Outcome Snapshot"}),a.jsx("div",{className:"grid grid-cols-2 gap-3 mb-6",children:[{label:"Cost Reduction",value:60,format:n=>`${Math.round(n)}%`},{label:"Monthly Savings",value:698,format:n=>`$${Math.round(n).toLocaleString("en-US")}`},{label:"Optimization Coverage",value:95,format:n=>`${Math.round(n)}%`},{label:"Projected Annual Savings",value:8376,format:n=>`$${Math.round(n).toLocaleString("en-US")}`}].map(n=>a.jsxs("div",{className:"bg-surface-dark border border-white/5 rounded-xl p-4",children:[a.jsx("span",{className:"text-[11px] text-slate-400 font-bold uppercase block",children:n.label}),a.jsx("strong",{className:"text-xl font-black text-primary mt-1 block",children:a.jsx(Ce,{value:n.value,format:n.format,duration:1.3})})]},n.label))}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"443 optimization cycles completed. Zero production incidents. Zero under-provisioning risk introduced."}),a.jsxs("div",{className:"mt-6 pt-6 border-t border-white/5",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-widest text-slate-500 font-bold mb-4",children:"Monthly cost"}),a.jsxs("div",{className:"space-y-3",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"flex justify-between text-xs mb-1.5",children:[a.jsx("span",{className:"text-slate-400",children:"Before"}),a.jsx("span",{className:"text-slate-300 font-bold",children:"$1,162"})]}),a.jsx("div",{className:"h-2.5 rounded-full bg-slate-500/30 w-full"})]}),a.jsxs("div",{children:[a.jsxs("div",{className:"flex justify-between text-xs mb-1.5",children:[a.jsx("span",{className:"text-slate-400",children:"With OptOps"}),a.jsx("span",{className:"text-green-400 font-bold",children:"$464"})]}),a.jsx("div",{className:"h-2.5 rounded-full bg-gradient-to-r from-primary to-green-400",style:{width:"40%"}})]})]})]})]})]})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-8",children:[a.jsxs("div",{className:"mb-4",children:[a.jsx("h2",{className:"text-3xl font-bold text-white",children:"Dashboard View"}),a.jsx("p",{className:"text-slate-400 mt-2",children:"Use the Standard vs OptOps toggle below to compare baseline waste against optimized performance."})]}),a.jsx(r0,{title:"Case Study Dashboard"})]}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8",children:[a.jsx("h3",{className:"text-2xl font-bold text-white mb-6",children:"Before vs After Comparison Table"}),a.jsx("div",{className:"overflow-x-auto",children:a.jsxs("table",{className:"w-full text-sm",children:[a.jsx("thead",{children:a.jsxs("tr",{className:"border-b border-white/10",children:[a.jsx("th",{className:"text-left py-3 px-4 text-slate-400 font-bold",children:"Metric"}),a.jsx("th",{className:"text-left py-3 px-4 text-slate-400 font-bold",children:"Before"}),a.jsx("th",{className:"text-left py-3 px-4 text-slate-400 font-bold",children:"After"})]})}),a.jsx("tbody",{className:"text-slate-300",children:[["Monthly Infrastructure Cost","$1,162","$464"],["Monthly Savings","--","$698"],["Cost Reduction","--","60%"],["Optimization Coverage","--","95%"]].map(([n,s,o])=>a.jsxs("tr",{className:"border-b border-white/5",children:[a.jsx("td",{className:"py-3 px-4 font-medium text-white",children:n}),a.jsx("td",{className:"py-3 px-4",children:s}),a.jsx("td",{className:"py-3 px-4 text-green-400 font-bold",children:o})]},n))})]})}),a.jsx("h3",{className:"text-2xl font-bold text-white mt-10 mb-4",children:"Why This Worked"}),a.jsxs("ol",{className:"list-decimal list-inside space-y-2 text-slate-400",children:[a.jsx("li",{children:"Adv
20isory-first approach with read-only deployment — trust before automation."}),a.jsx("li",{children:"Pod and namespace-aware Kubernetes intelligence."}),a.jsx("li",{children:"Continuous optimization cycles instead of one-time audits."}),a.jsx("li",{children:"Measurable ROI that engineering and finance both trust — realized savings reported separately from remaining opportunity."})]}),a.jsx("h3",{className:"text-2xl font-bold text-white mt-10 mb-4",children:"Ready to See Your Cluster Waste?"}),a.jsxs("p",{className:"text-slate-400 mb-2",children:[a.jsx("strong",{className:"text-white",children:"Website:"})," www.optops.ai"]}),a.jsxs("p",{className:"text-slate-400 mb-2",children:[a.jsx("strong",{className:"text-white",children:"Email:"})," [email protected]"]}),a.jsxs("p",{className:"text-slate-400 mb-6",children:[a.jsx("strong",{className:"text-white",children:"Phone:"})," +91 98115 77006"]}),a.jsx(ie,{to:"/bookdemo",className:"bg-primary text-white px-8 py-3 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform inline-block",children:"Get Free Assessment"})]})})]}),y3=[{title:"About Us",href:"/company/about",icon:"groups",description:"The internal tool that became a product — our story and mission."},{title:"Partner Program",href:"/company/partner-program",icon:"handshake",description:"Success-based revenue share for consultancies, DevOps providers, and MSPs."},{title:"Contact Us",href:"/company/contact-us",icon:"forum",description:"Talk to the team about demos, pricing, and implementation."}],b3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Company",title:"Build Efficient Cloud Infrastructure With Us",subtitle:"Learn about our mission, team values, and ecosystem partnerships."}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-4",children:y3.map(n=>a.jsxs(ie,{to:n.href,className:"glass-card rounded-2xl p-8 hover:border-primary/30 transition-colors group",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:n.icon})}),a.jsx("h3",{className:"text-xl font-bold text-white group-hover:text-primary transition-colors",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm mt-2 leading-relaxed",children:n.description})]},n.href))})})]}),x3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Company",title:"About OptOps",subtitle:"OptOps helps engineering teams eliminate Kubernetes waste through data-driven automation and safe optimization workflows."}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8",children:[a.jsx("h3",{className:"text-2xl font-bold text-white mb-4 text-center",children:"Origin Story of OptOps"}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-4",children:"OptOps didn’t start in a boardroom. It started from a real problem we faced while building and scaling a production platform used by thousands of creators. As our tech team scaled, our cloud costs started rising fast. It became harder to understand where the money was going and how to control it without slowing down development. Prince saw the team constantly balancing performance, speed, and cost, while Ashutosh began digging deeper to understand why spending kept increasing even when systems were running fine."}),a.jsx("p",{className:"text-slate-400 leading-relaxed",children:"Having worked as a Platform Engineer in large environments, Ashutosh knew this wasn’t unusual. Most teams don’t overspend because they are careless -- they overspend because cloud tooling is complex, visibility is limited, and optimization takes too much manual effort. Instead of buying another tool, we built our own. We created internal systems to track usage, find waste, and automate optimizations. What started as an in-house solution quickly reduced our cloud costs and evolved into a platform that could continuously monitor and optimize infrastructure."}),a.jsx("p",{className:"text-slate-400 leading-relaxed mt-4",children:"That internal project became OptOps.ai. When we saw the impact ourselves, we realized -- if we have this problem, thousands of other engineering teams do too. Today, OptOps exists for the same reason it was created: to help engineering teams reduce cloud costs, automate infrastru
20cture decisions, and move fast without losing control of their spend."}),a.jsx("p",{className:"text-slate-400 leading-relaxed mt-4",children:"We built OptOps from our own pain -- and that’s why we care deeply about solving yours."})]})}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 pb-20",children:a.jsxs("div",{className:"glass-panel rounded-2xl p-8 flex flex-col md:flex-row items-center gap-8 relative overflow-hidden",children:[a.jsx("div",{className:"absolute -right-24 -bottom-24 w-64 h-64 bg-green-500/10 rounded-full blur-[80px] pointer-events-none"}),a.jsxs("div",{className:"flex-1 text-center md:text-left",children:[a.jsx("h4",{className:"text-xl font-bold text-white mb-3",children:"NVIDIA Inception Member"}),a.jsxs("p",{className:"text-slate-400 leading-relaxed text-sm",children:["OptOps is proud to be a member of the ",a.jsx("strong",{children:"NVIDIA Inception program"}),". NVIDIA Inception is a program designed to nurture startups revolutionizing industries with technological advancements in AI, machine learning, and GPU-accelerated computing. Our membership helps us accelerate the development of our AI-driven Kubernetes optimization engine and access industry-leading support and resources."]})]}),a.jsxs("div",{className:"shrink-0 relative group",children:[a.jsx("div",{className:"absolute -inset-0.5 bg-gradient-to-r from-green-500 to-emerald-500 rounded-xl blur opacity-30 group-hover:opacity-60 transition duration-500 pointer-events-none"}),a.jsx("div",{className:"relative bg-white/5 border border-white/10 rounded-xl p-4 backdrop-blur-sm shadow-xl",children:a.jsx("img",{src:"/nvidia-inception-program-badge-rgb-for-screen.svg",alt:"NVIDIA Inception Member",className:"h-11 md:h-12 w-auto object-contain transition-transform duration-300 group-hover:scale-102"})})]})]})})]}),Zr=({title:n,subtitle:s,center:o=!1})=>a.jsxs("div",{className:`mb-12 ${o?"text-center mx-auto max-w-4xl":""}`,children:[a.jsx("h2",{className:"text-3xl md:text-4xl font-extrabold text-white tracking-tight mb-4",children:n}),s&&a.jsx("p",{className:`text-lg text-slate-400 ${o?"mx-auto":"max-w-3xl"}`,children:s})]}),v3=()=>a.jsxs(ht,{children:[a.jsx("section",{className:"relative pt-32 pb-20 px-6 overflow-hidden",children:a.jsxs("div",{className:"max-w-5xl mx-auto text-center relative z-10",children:[a.jsx("div",{className:"inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/5 border border-white/10 text-primary text-sm font-semibold mb-6",children:"OPTOPS PARTNER PROGRAM"}),a.jsxs("h1",{className:"text-5xl md:text-7xl font-extrabold text-white tracking-tight leading-tight mb-8",children:["Unlock New Revenue Streams with ",a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-primary to-purple-400",children:"OptOps"})]}),a.jsx("p",{className:"text-xl text-slate-400 mb-6 max-w-4xl mx-auto leading-relaxed",children:"Partnering with OptOps empowers you to deliver measurable Kubernetes cost reduction to clients from Day 1 — with zero production risk. Built on a purely success-based model where you earn a share of every dollar saved."}),a.jsxs("div",{className:"text-2xl md:text-3xl font-semibold text-white tracking-wide mb-10",children:["The future of DevOps is ",a.jsx("span",{className:"text-transparent bg-clip-text bg-gradient-to-r from-purple-400 to-indigo-400",children:"autonomous."})]}),a.jsxs("div",{className:"flex flex-col sm:flex-row items-center justify-center gap-4 mb-4",children:[a.jsx(ie,{to:"/bookdemo",className:"bg-primary text-white px-8 py-4 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform w-full sm:w-auto",children:"Apply to Partner Program →"}),a.jsx(ie,{to:"/company/contact-us",className:"bg-white/5 border border-white/10 text-white px-8 py-4 rounded-xl font-bold hover:bg-white/10 transition-colors w-full sm:w-auto",children:"Contact Partnerships"})]})]})}),a.jsx("section",{className:"py-22 border-t border-white/5 bg-background-dark/50",children:a.jsxs("div",{className:"max-w-7xl mx-auto px-6",children:[a.jsx(Zr,{title:"Why Partner With OptOps?",subtitle:"The OptOps Partner Program is built for consulting organizations, DevOps service providers, and managed service providers who want to elevate their client outcomes. Deliver tangible value while growing a sustainable cloud practice.",center:!0}),a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-16",children:[a.jsxs("div",{className:"glass-card rounded-2xl p-8 border border-white/5 hover:border-primary/20 transition-colors",children:[a.jsxs("div",{className:"text-xl font-bold text-white mb-3 flex items-center gap-2",children:[a.jsx("span",{className:"text-primary",children:"✓"})," Free Up Engineering"]}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"Stop burning expensive engineering cycles on manual cost optimization and infrastru
20cture tuning. OptOps automates the intelligence so teams can focus exclusively on shipping features and building value."})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 border border-white/5 hover:border-primary/20 transition-colors",children:[a.jsxs("div",{className:"text-xl font-bold text-white mb-3 flex items-center gap-2",children:[a.jsx("span",{className:"text-primary",children:"✓"})," Accelerate Time to Value"]}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"Deliver immediate ROI to your clients from Day 1. Our advisory-first assessment deploys in minutes and surfaces optimization opportunities quickly, building trust faster."})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 border border-white/5 hover:border-primary/20 transition-colors",children:[a.jsxs("div",{className:"text-xl font-bold text-white mb-3 flex items-center gap-2",children:[a.jsx("span",{className:"text-primary",children:"✓"})," Expand Service Offerings"]}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"Transform cost optimization from a one-off project into a continuous, managed service. OptOps continuously monitors environments, providing you with recurring touchpoints and ongoing advisory opportunities."})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 border border-white/5 hover:border-primary/20 transition-colors",children:[a.jsxs("div",{className:"text-xl font-bold text-white mb-3 flex items-center gap-2",children:[a.jsx("span",{className:"text-primary",children:"✓"})," De-Risk Client Deliveries"]}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:"Operating in complex environments carries risk. Our platform ensures you maintain complete control. No automated infrastructure takeovers—just accurate intelligence that your team reviews, approves, and implements."})]})]})]})}),a.jsx("section",{className:"pt-12 pb-6",children:a.jsx("div",{className:"max-w-4xl mx-auto px-6",children:a.jsx(Zr,{title:"Your Path as a Partner",subtitle:"A structured, transparent pathway to integrate OptOps into your business and drive continuous client success.",center:!0})})}),a.jsx("section",{className:"py-12 bg-white/[0.02] border-y border-white/5",children:a.jsx("div",{className:"max-w-4xl mx-auto px-6",children:a.jsx("div",{className:"glass-card p-8 md:p-12 rounded-3xl border border-white/5",children:a.jsx("div",{className:"space-y-8 relative before:absolute before:inset-0 before:ml-5 before:-translate-x-px md:before:mx-auto md:before:translate-x-0 before:h-full before:w-0.5 before:bg-gradient-to-b before:from-transparent before:via-primary/40 before:to-transparent",children:[{step:"1. Apply",text:"Submit your company profile for a prompt review of your business and technical capabilities."},{step:"2. Qualify",text:"Receive formal qualification decision and tailored access to the OptOps Partner Portal."},{step:"3. Enable",text:"Access positioning guides, proven playbooks, demo environments, and comprehensive sales engineering support."},{step:"4. Refer & Close",text:"Register opportunities seamlessly in the portal to secure attribution and collaborate heavily on closing robust deals."},{step:"5. Grow & Scale",text:"Expand your active client base and establish lasting, recurring value for the organizations you serve."}].map((n,s)=>a.jsxs("div",{className:"relative flex items-center justify-between md:justify-normal md:odd:flex-row-reverse group is-active",children:[a.jsx("div",{className:"flex items-center justify-center w-10 h-10 rounded-full border-2 border-primary/50 bg-surface-dark text-primary font-bold shrink-0 md:order-1 md:group-odd:-translate-x-1/2 md:group-even:translate-x-1/2",children:s+1}),a.jsxs("div",{className:"w-[calc(100%-4rem)] md:w-[calc(50%-2.5rem)] bg-white/5 p-5 rounded-xl border border-white/5 hover:border-primary/20 transition-colors",children:[a.jsx("div",{className:"font-bold text-white mb-1",children:n.step}),a.jsx("div",{className:"text-sm text-slate-400 leading-relaxed",children:n.text})]})]},s))})})})}),a.jsx("section",{className:"py-24",children:a.jsxs("div",{className:"max-w-7xl mx-auto px-6",children:[a.jsx(Zr,{title:"Who Belongs in This Program",subtitle:"Built for practitioners who operate at the edge of cloud cost optimization, valuing consistent outcomes and continuous delivery models.",center:!0}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6",children:[{name:"Service Partners",text:"Consulting organizations managing cloud infrastru
20cture who implement and direct operations confidently for their clients."},{name:"Reseller Partners",text:"Managed Service Providers (MSPs) dynamically bundling our platform directly into their proprietary managed portfolios."},{name:"Technology Partners",text:"Innovative ISVs and cloud platforms integrating powerful optimization capabilities into their own tools."},{name:"Consultant Partners",text:"Independent practitioners and cloud advisors recommending robust architectures as part of strategic FinOps engagements."},{name:"Training Partners",text:"Academies and professional platforms delivering cutting-edge, certified Kubernetes FinOps curriculum to the industry."},{name:"Affiliate Partners",text:"Community builders and DevOps content creators deeply advocating for efficient, modern infrastructure to engaged audiences."}].map((n,s)=>a.jsxs("div",{className:"glass-card p-8 rounded-2xl border border-white/5 hover:border-primary/20 transition-colors",children:[a.jsx("h4",{className:"text-xl font-bold text-white mb-3",children:n.name}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed",children:n.text})]},s))})]})}),a.jsx("section",{className:"py-24 border-t border-white/5 bg-background-dark/80",children:a.jsx("div",{className:"max-w-7xl mx-auto px-6",children:a.jsxs("div",{className:"mb-16",children:[a.jsx(Zr,{title:"The OptOps Partner Academy",subtitle:"A structured learning environment crafted to empower your team. Confidently lead architecture discussions, execute precise technical deployments, and deliver unquestionable long-term value.",center:!0}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6 mt-12",children:[{t:"Track 1: Foundation",d:"Covers core product architecture and engagement structures. Provides a robust baseline for new practitioners entering the ecosystem."},{t:"Track 2: Commercial Enablement",d:"Learn exactly how to position value, build highly compelling ROI models with real cluster data, and structure impactful proposals."},{t:"Track 3: Technical Mastery",d:"Deep agent deployment training across environments, comprehensively covering data flow, security models, and complex integration patterns."},{t:"Track 4: Client Delivery",d:"Master the four-phase engagement model entirely. Learn to fluently present assessments, guide optimizations, and run decisive client reviews."}].map((n,s)=>a.jsxs("div",{className:"p-8 rounded-2xl glass-card border border-white/5 hover:border-white/10 transition-colors flex flex-col justify-center",children:[a.jsx("h4",{className:"font-bold text-white text-lg mb-3",children:n.t}),a.jsx("p",{className:"text-sm text-slate-400 leading-relaxed",children:n.d})]},s))})]})})}),a.jsx("section",{className:"py-24 border-t border-white/5",children:a.jsxs("div",{className:"max-w-4xl mx-auto px-6 text-center",children:[a.jsx("h2",{className:"text-4xl md:text-5xl font-extrabold text-white mb-6 tracking-tight",children:"Build the Future of Cloud Infrastructure"}),a.jsx("p",{className:"text-xl text-slate-400 leading-relaxed mx-auto mb-10",children:"Join a thriving ecosystem of cloud professionals committed to eliminating waste and building a sustainable future for our environment."}),a.jsx(ie,{to:"/bookdemo",className:"bg-primary text-white px-10 py-4 rounded-xl font-bold text-lg hover:brightness-110 transition-all shadow-[0_0_20px_rgba(139,92,246,0.3)] inline-block",children:"Apply to Partner Program"})]})})]}),w3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Company",title:"Contact Us",subtitle:"Our team is ready to help with platform walkthroughs, pricing, and implementation planning.",actions:a.jsx("a",{href:ut,className:"bg-primary text-white px-8 py-3 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Schedule Demo"})}),a.jsxs("section",{className:"w-full max-w-4xl mx-auto px-6 py-12",children:[a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsxs("article",{className:"glass-card rounded-2xl p-8",children:[a.jsx("div",{className:"w-11 h-11 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:"mail"})}),a.jsx("h3",{className:"text-xl font-bold text-white mb-3",children:"Email"}),a.jsx("a",{href:"mailto:[email protected]",className:"text-primary hover:underline font-medium",children:"[email protected]"}),a.jsx("p",{className:"text-slate-400 mt-2 text-sm",children:"Have any questions? Our optimization experts are ready to help."})]}),a.jsxs("article",{className:"glass-card rounded-2xl p-8",children:[a.jsx("div",{className:"w-11 h-11 rounded-xl bg-primary/10 border border-primary/20 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:"call"})}),a.jsx("h3",{className:"text-xl font-bold text-white mb-3",children:"Phone"}),a.jsx("a",{href:"tel:+919811577006",className:"text-primary hover:underline font-medium",children:"+91 9811577006"}),a.jsx("p",{className:"text-slate-400 mt-2 text-sm",children:"Monday to Frid
20ay, 10 a.m. to 7 p.m. IST"})]})]}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 mt-6",children:[a.jsx("p",{className:"text-[10px] uppercase tracking-widest text-slate-500 font-bold mb-6",children:"What happens after you reach out"}),a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-3 gap-6",children:[{step:"1",title:"We reply within 24h",text:"A real engineer, not a sequence."},{step:"2",title:"Read-only assessment",text:"One Helm command, zero changes to your cluster."},{step:"3",title:"Your savings report",text:"What you could save, shown before anything runs."}].map(n=>a.jsxs("div",{className:"flex items-start gap-4",children:[a.jsx("span",{className:"w-8 h-8 rounded-full bg-primary/10 border border-primary/30 text-primary text-sm font-black flex items-center justify-center shrink-0",children:n.step}),a.jsxs("div",{children:[a.jsx("h4",{className:"text-sm font-bold text-white",children:n.title}),a.jsx("p",{className:"text-xs text-slate-400 mt-1",children:n.text})]})]},n.step))})]})]})]}),j3=[{title:"How To Get Started",href:"/resources/get-started",icon:"rocket_launch",description:"Follow the setup workflow and onboarding sequence."},{title:"Key Platform Features",href:"/resources/key-platform-features",icon:"grid_view",description:"The full capability overview: live migration, spot rescue, consolidation, rightsizing, and FinOps visibility."},{title:"Blogs",href:"/resources/blogs",icon:"library_books",description:"Insights, updates, and cost-optimization playbooks from the OptOps team."},{title:"ROI Calculator",href:"/resources/roi-calculator",icon:"calculate",description:"Model your cluster in 30 seconds — savings, payback, and the carbon that goes with it."},{title:"Free CLI Analyzer",href:"/#cli",icon:"terminal",description:"npx optops@latest analyze — read-only, runs locally, and prints what your cluster is wasting today.",anchor:!0}],k3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Resources",title:"Learn How OptOps Works",subtitle:"Documentation-style guides, capability overviews, and onboarding help for your Kubernetes optimization journey."}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:j3.map(n=>{const s=n.anchor?"a":ie,o=n.anchor?{href:n.href}:{to:n.href};return a.jsxs(s,{...o,className:"glass-card rounded-2xl p-8 hover:border-primary/30 transition-colors group",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:n.icon})}),a.jsx("h3",{className:"text-xl font-bold text-white group-hover:text-primary transition-colors",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm mt-2 leading-relaxed",children:n.description})]},n.href)})})})]}),N3=[{title:"Container Live Migration",text:"Move running pods between nodes without dropping a connection — memory and process state preserved via CRIU, with the same pod IP and unbroken TCP sessions on AWS.",href:"/live-migration"},{title:"State-Preserving Spot Rescue",text:"When a spot node is reclaimed, workloads are live-migrated off it before the deadline — proven against real AWS FIS interruption drills."},{title:"Autonomous Consolidation",text:"Bin-packing plans that respect PDBs, affinity, and volumes — gated so a plan only executes if it actually saves money."},{title:"Continuous Rightsizing",text:"Requests that track real usage, continuously, with OOM spike protection that scales workloads back up before kills bite."},{title:"Spot Automation & Resilience",text:"Diversified spot pools, automatic on-demand fallback, and a stockout circuit breaker for capacity crunches."},{title:"Karpenter-Grade GKE Engine",text:"The same autoscaling engine on AWS and Google Cloud — including the GCP provider upstream Karpenter never shipped. Stock-Karpenter compatible, no lock-in."},{title:"Real-Time FinOps Visibility",text:"Track cost by cluster, namespace, workload, node type, and instance class — no tagging required. Multi-cluster from a single dashboard."}
20,{title:"Sleep Schedules",text:"Dev and staging clusters that sleep when your team does — cron-based scale-down with one-click schedules."},{title:"Shadow Mode & Graduated Autonomy",text:"Start read-only, watch every planned action in shadow mode, then enable automation per capability and per cluster."},{title:"Honest Savings Reporting",text:"Realized savings and remaining opportunity reported separately — never netted, never inflated, never double-counted."},{title:"Console-Tunable In-Cluster Engine",text:"Tune the optimizer from the dashboard while every decision is made inside your cluster — not on our SaaS."},{title:"Enterprise-Grade Security",text:"Read-only by default, no secrets collected, full auditability. Independent third-party security assessment completed; ISO certification in progress."}],T3=["move_up","bolt","balance","content_cut","savings","cloud","payments","bedtime","visibility","receipt_long","tune","shield_lock"],S3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Platform",title:"Key Platform Features",subtitle:"Everything OptOps does to cut your Kubernetes bill autonomously — and the safety mechanisms that let you trust it."}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 py-12",children:[a.jsx("div",{className:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4",children:N3.map((n,s)=>a.jsxs("article",{className:"glass-card rounded-2xl p-6 hover:border-primary/30 transition-colors flex flex-col",children:[a.jsx("div",{className:"w-10 h-10 rounded-lg bg-primary/10 flex items-center justify-center mb-4 text-primary",children:a.jsx("span",{className:"material-symbols-outlined",children:T3[s]})}),a.jsx("h3",{className:"text-lg font-bold text-white mb-2",children:n.title}),a.jsx("p",{className:"text-slate-400 text-sm leading-relaxed flex-1",children:n.text}),n.href&&a.jsxs(ie,{to:n.href,className:"inline-flex items-center gap-1.5 text-primary text-sm font-bold mt-4 hover:gap-2.5 transition-all",children:["Learn more ",a.jsx("span",{className:"material-symbols-outlined text-sm",children:"arrow_forward"})]})]},n.title))}),a.jsxs("div",{className:"glass-card rounded-2xl p-8 mt-10",children:[a.jsx("h3",{className:"text-xl font-bold text-white mb-4",children:"How OptOps works, end to end"}),a.jsx("ul",{className:"space-y-3 text-slate-300 text-sm",children:["Install the full stack with one Helm command — agent, node engine, spot handler, and live migration, all default-off.","Collect read-only metrics and detect pod and node waste against real usage.","Watch every planned action in shadow mode before anything is enabled.","Turn on autonomous rightsizing, consolidation, and spot — capability by capability, with audit visibility throughout."].map(n=>a.jsxs("li",{className:"flex items-start gap-3",children:[a.jsx("span",{className:"material-symbols-outlined text-green-400 text-sm mt-0.5",children:"check_circle"}),n]},n))})]})]})]}),A3=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Resources",title:"How To Get Started",subtitle:"Install the OptOps agent in read-only mode and start receiving optimization insights within minutes.",actions:a.jsx(ie,{to:"/bookdemo",className:"bg-primary text-white px-8 py-3 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Talk to Solutions Team"})}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-6",children:[a.jsxs("article",{className:"glass-card rounded-2xl p-8",children:[a.jsx("h3",{className:"text-xl font-bold text-white mb-4",children:"Setup steps"}),a.jsx("ol",{className:"space-y-3 text-slate-300",children:["Install the full stack on one cluster with a single Helm command — agent, node engine, spot handler, and live migration, all default-off.","Validate metrics ingestion and baseline costs in read-only mode.","Watch shadow mode show every rightsize, consolidation, and migration it would make.","Enable autonomous optimization capability by capability, at your own pace."].map((n,s)=>a.jsxs("li",{className:"flex items-start gap-3",children:[a.jsx("span",{className:"w-6 h-6 rounded-full bg-primary/10 text-primary text-xs font-bold flex items-center justify-center shrink-0 mt-0.5",children:s+1}),n]},s))})]}),a.jsxs("article",{className:"glass-card rounded-2xl p-8",children:[a.jsx("h3",{className:"text-xl font-bold text-white mb-4",children:"One command, full stack"}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-4",children:"The install is genuinely this small — everything arrives default-off and read-only."}
20),a.jsxs("div",{className:"terminal-panel rounded-xl font-mono text-xs leading-relaxed overflow-hidden border border-white/10",children:[a.jsxs("div",{className:"terminal-chrome flex items-center gap-1.5 px-4 py-2.5 border-b border-white/10",children:[a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-red-500/70"}),a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-amber-500/70"}),a.jsx("span",{className:"w-2.5 h-2.5 rounded-full bg-green-500/70"}),a.jsx("span",{className:"ml-2 text-[10px] text-slate-500",children:"terminal"})]}),a.jsxs("div",{className:"p-5 overflow-x-auto",children:[a.jsx("p",{className:"text-slate-500",children:"$ helm install optops optops/optops-agent"}),a.jsxs("p",{className:"text-slate-300 mt-2",children:["✓ agent ",a.jsx("span",{className:"text-slate-500",children:"— metrics, read-only"})]}),a.jsxs("p",{className:"text-slate-300",children:["✓ node engine ",a.jsx("span",{className:"text-slate-500",children:"— Karpenter-grade, off"})]}),a.jsxs("p",{className:"text-slate-300",children:["✓ spot handler ",a.jsx("span",{className:"text-slate-500",children:"— rescue-ready, off"})]}),a.jsxs("p",{className:"text-slate-300",children:["✓ live migration ",a.jsx("span",{className:"text-slate-500",children:"— flag-gated, off"})]}),a.jsx("p",{className:"text-green-400 mt-2",children:"cluster connected · analyzing"})]})]}),a.jsx("p",{className:"text-xs text-slate-500 mt-4",children:"First cost breakdown appears in minutes. A walkthrough video is coming soon."})]})]})})]}),C3=`<div class="tldr-box">
21 <div class="tldr-label">The short version</div>
22 <ul class="tldr-list">
23 <li><strong>50-70% of the average Kubernetes cluster is waste,</strong> driven by routine over-provisioning that nobody comes back to clean up.</li>
24 <li><strong>Manual rightsizing, VPA, and FinOps dashboards each solve part of the problem</strong> but not the part that closes the loop between identifying waste and eliminating it.</li>
25 <li><strong>The fix needs three things together:</strong> workload-aware AI, production safety, and an action layer that runs through engineering's own CI/CD.</li>
26 </ul>
27 </div>
28
29<div class="post-body">
30
31 <p>
32 Run Kubernetes at any meaningful scale and your cluster is almost certainly burning money. By a significant margin. The number most teams find when they look is somewhere between 50% and 70% waste. For a company spending a million dollars a year on Kubernetes, that's five to seven hundred thousand dollars going somewhere it shouldn't. Every year.
33 </p>
34
35 <p>
36 That sounds like deliberate failure. It isn't. Nobody sets out to build a wasteful cluster. The waste is the predictable, almost inevitable byproduct of how engineering teams operate Kubernetes day-to-day. Once you see why it happens, the fix becomes obvious. So does why most "optimisation" tools haven't fixed it.
37 </p>
38
39 <div class="stat-callout">
40 <div class="stat-number">69%</div>
41 <div class="stat-label">of CPU purchased for Kubernetes goes unused, according to industry analysis of billions of containers across customer clusters.</div>
42 <div class="stat-source">SOURCE: INDUSTRY USAGE REPORT, 2024</div>
43 </div>
44
45 <h2>Where the waste comes from</h2>
46
47 <p>
48 Consider what happens. An engineer ships a new microservice. Before it goes live, they have to fill in two numbers in the YAML: a resource request (the minimum CPU and memory the cluster guarantees the pod) and a resource limit (the cap before things get throttled or killed). These numbers control how the scheduler places pods, how much capacity gets provisioned, and what your cloud provider charges you.
49 </p>
50
51 <p>
52 Those numbers are guesses. The engineer doesn't have a month of production traffic to calibrate against, so they estimate. Getting it wrong on the low side is loud: pods get throttled, services OOM-kill, customers see errors, somebody pages you at 2am. Getting it wrong on the high side is silent. The bill grows quietly, and nobody notices.
53 </p>
54
55 <p>
56 So engineers default high. Two times the actual need is common. Three times is normal. Five times happens more than people expect. Then the workload ships, the engineer moves on, and those numbers go invisible. Nobody comes back a month later to check them. Nobody revisits them after traffic patterns settle. They sit there. Forever.
57 </p>
58
59 <p>
60 What stands out is that nobody is being negligent here. Engineers over-provision because the operational logic is sound. The cost of throttling is immediate and visible. The cost of waste is buried in next month's cloud bill, which somebody else reviews, often weeks later. Rational behaviour at the individual level. Disastrous at the cluster level.
61 </p>
62
63 <div class="pull-quote">
64 "Engineers don't over-provision because they're sloppy. They over-provision because the system rewards being safe. The bill that arrives a month later is somebody else's problem."
65 </div>
66
67 <h2>Why one bad number per pod becomes a cluster-wide problem</h2>
68
69 <p>
70 The financial damage isn't linear. It compounds. Walk through what happens in a cluster running a few hundred microservices.
71 </p>
72
73 <p>
74 Pods request more than they need. The Kubernetes scheduler treats those requests as real and refuses to pack more pods onto a node than the requests allow. Even if real usage is a third of what's been claimed, the scheduler sees "full." More workloads come in. The cluster autoscaler spins up new nodes. Those new nodes also fill up with over-provisioned pods. The cluster grows. The bill grows. The actual computational throughput per dollar drops.
75 </p>
76
77 <div class="infographic">
78 <div class="infographic-title">Where waste compounds, the three layers</div>
79 <svg class="infographic-svg" viewBox="0 0 800 360" xmlns="http://www.w3.org/2000/svg">
80 
81 <defs>
82 <linearGradient id="podGrad" x1="0%" y1="0%" x2="100%" y2="0%">
83 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.15"/>
84 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.05"/>
85 </linearGradient>
86 <linearGradient id="nodeGrad" x1="0%" y1="0%" x2="100%" y2="0%">
87 <stop offset="0%" stop-color="#06B6D4" stop-opacity="0.15"/>
88 <stop offset="100%" stop-color="#06B6D4" stop-opacity="0.05"/>
89 </linearGradient>
90 <linearGradient id="commitGrad" x1="0%" y1="0%" x2="100%" y2="0%">
91 <stop offset="0%" stop-color="#D97706" stop-opacity="0.15"/>
92 <stop offset="100%" stop-color="#D97706" stop-opacity="0.05"/>
93 </linearGradient>
94 </defs>
95
96 <rect x="40" y="40" width="720" height="80" rx="8" fill="url(#podGrad)" stroke="#7C3AED" stroke-width="1.5" opacity="0.9"/>
97 <text x="60" y="68" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.5">LAYER 01, PODS</text>
98 <text x="60" y="92" font-family="Plus Jakarta Sans, sans-serif" font-size="15" font-weight="700" fill="#0E0E1A">Pods request 2-3× more CPU and memory than they use</text>
99 <text x="60" y="111" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Engineers over-size to be safe, then never revisit</text>
100
101 <line x1="400" y1="125" x2="400" y2="140" stroke="#8A8A9C" stroke-width="1.5"/>
102 <polygon points="395,138 400,148 405,138" fill="#8A8A9C"/>
103
104 <rect x="40" y="155" width="720" height="80" rx="8" fill="url(#nodeGrad)" stroke="#06B6D4" stroke-width="1.5" opacity="0.9"/>
105 <text x="60" y="183" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#06B6D4" letter-spacing="1.5">LAYER 02, NODES</text>
106 <text x="60" y="207" font-family="Plus Jakarta Sans, sans-serif" font-size="15" font-weight="700" fill="#0E0E1A">Bin-packing degrades, nodes look "full" while running at 30% real utilisation</text>
107 <text x="60" y="226" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Scheduler operates on inflated requests, autoscaler spins up extra capacity</text>
108
109 <line x1="400" y1="240" x2="400" y2="255" stroke="#8A8A9C" stroke-width="1.5"/>
110 <polygon points="395,253 400,263 405,253" fill="#8A8A9C"/>
111
112 <rect x="40" y="270" width="720" height="80" rx="8" fill="url(#commitGrad)" stroke="#D97706" stroke-width="1.5" opacity="0.9"/>
113 <text x="60" y="298" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.5">LAYER 03, COMMITMENTS</text>
114 <text x="60" y="322" font-family="Plus Jakarta Sans, sans-serif" font-size="15" font-weight="700" fill="#0E0E1A">RIs and Savings Plans cover the inflated capacity, locked into spend you don't need</text>
115 <text x="60" y="341" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">The waste at the bottom is paid for at the top, on a multi-year contract</text>
116 </svg>
117 <p class="infographic-caption">Each layer compounds the one above it. By the time the bill arrives, you're paying for two clusters' worth of capacity to do one cluster's worth of work.</p>
118 </div>
119
120 <p>
121 The cumulative effect is that the company is paying for two clusters' worth of capacity to do one cluster's worth of work. And because it's distributed across thousands of YAML files written by dozens of engineers over months or years, no single person has the authority or the time to fix it.
122 </p>
123
124 <h2>The three fixes everyone tries. And why they don't work.</h2>
125
126 <p>
127 When engineering leaders see the numbers for the first time, they reach for one of three solutions. None of them resolve the underlying problem. Worth understanding why.
128 </p>
129
130 <h3>Manual rightsizing</h3>
131
132 <p>
133 The most obvious answer: assign someone to go through every workload and set the request and limit numbers correctly. This works in theory and almost never works in practice. A typical cluster has hundreds of workloads, each with bursty traffic, dependency-driven memory patterns, and SLO requirements that vary by application tier. Sizing each one is a multi-week project. And the moment you finish, the workloads have changed, the traffic has shifted, and your numbers are stale.
134 </p>
135
136 <p>
137 Rightsizing is a continuous problem, not a project. Manual approaches treat it as a project. That's why every team that tries this gives up around week three.
138 </p>
139
140 <h3>The Kubernetes Vertical Pod Autoscaler (VPA)</h3>
141
142 <p>
143 Kubernetes ships with a built-in tool that's supposed to solve this: VPA. In principle, it continuously analyses pod usage and adjusts requests automatically. In practice, fewer than 1% of organisations run VPA in full automation in production. The reasons are technical and they're not subtle:
144 </p>
145
146 <ul>
147 <li><strong>VPA evicts pods to apply resource changes.</strong> That's a service disruption every time it acts. Unacceptable for production workloads.</li>
148 <li><strong>The recommendation algorithm uses an 8-day decaying histogram.</strong> Yesterday's traffic carries 50% weight. Four-day-old data carries 6%. By definition, VPA lags real traffic patterns badly.</li>
149 <li><strong>It can't distinguish workload types.</strong> The same algorithm runs on a stateless API, a database, and a batch job. Predictably bad results in at least two of those three.</li>
150 <li><strong>It conflicts with HPA.</strong> Most teams running horizontal scaling can't enable VPA without breaking the autoscaler they depend on.</li>
151 </ul>
152
153 <p>
154 So VPA usually gets deployed in recommendation-only mode, and the recommendations sit untouched because nobody trusts them enough to apply.
155 </p>
156
157 <h3>FinOps dashboards</h3>
158
159 <p>
160 The third path is buying a FinOps tool to surface waste across the cluster. These tools are excellent at one job: telling you where the waste is. Detailed cost breakdowns by team, namespace, workload. Reports for finance. Anomaly alerts.
161 </p>
162
163 <p>
164 The gap is simple: visibility isn't savings. A typical FinOps dashboard generates dozens to hundreds of optimisation recommendations every quarter, and most never get implemented. Engineering teams don't have the bandwidth to manually rightsize 400 pods, and the recommendations often lack the workload context engineers need to trust them. The dashboard surfaces the problem, the team agrees the problem is real, the cluster keeps wasting money.
165 </p>
166
167 <p>
168 We've written about this gap in more detail in <a href="/resources/blogs/finops-dashboards-dont-save-money">our comparison of OptOps.ai vs FinOps dashboards</a> if you want the deeper version.
169 </p>
170
171 <div class="infographic">
172 <div class="infographic-title">How the four approaches compare</div>
173 <table class="approach-table">
174 <thead>
175 <tr>
176 <th>What you need</th>
177 <th>Manual</th>
178 <th>VPA</th>
179 <th>FinOps Dashboards</th>
180 <th class="optops-col">OptOps.ai</th>
181 </tr>
182 </thead>
183 <tbody>
184 <tr>
185 <td class="feature">Workload-aware</td>
186 <td><span class="check-partial">~</span> Engineer-dependent</td>
187 <td><span class="check-bad">✕</span> Generic algorithm</td>
188 <td><span class="check-partial">~</span> Static thresholds</td>
189 <td class="optops"><span class="check-good">✓</span> Learns over time</td>
190 </tr>
191 <tr>
192 <td class="feature">Production-safe</td>
193 <td><span class="check-good">✓</span> Manual approval</td>
194 <td><span class="check-bad">✕</span> Evicts pods</td>
195 <td><span class="check-good">✓</span> Read-only</td>
196 <td class="optops"><span class="check-good">✓</span> Read-only by default</td>
197 </tr>
198 <tr>
199 <td class="feature">Scales beyond a few workloads</td>
200 <td><span class="check-bad">✕</span> Time-bound</td>
201 <td><span class="check-good">✓</span> Automated</td>
202 <td><span class="check-good">✓</span> Cluster-wide</td>
203 <td class="optops"><span class="check-good">✓</span> Cluster-wide</td>
204 </tr>
205 <tr>
206 <td class="feature">
206Closes the loop to action</td>
207 <td><span class="check-good">✓</span> If you have time</td>
208 <td><span class="check-partial">~</span> If you trust eviction</td>
209 <td><span class="check-bad">✕</span> Recommendations sit unused</td>
210 <td class="optops"><span class="check-good">✓</span> Through your CI/CD</td>
211 </tr>
212 </tbody>
213 </table>
214 <p class="infographic-caption">Each approach solves part of the problem. Only one solves all four parts at once.</p>
215 </div>
216
217 <div class="key-point">
218 <div class="key-point-label">The pattern across all three approaches</div>
219 <p>Manual rightsizing produces accurate fixes but doesn't scale. VPA scales but isn't safe enough for production. Dashboards produce visibility but no action. Each fixes part of the loop. None close it.</p>
220 </div>
221
222 <h2>What works</h2>
223
224 <p>
225 The reason over-provisioning persists isn't that engineering teams are careless. It's that solving it requires three things at once, and no existing tool delivers all three:
226 </p>
227
228 <ul>
229 <li><strong>Workload-aware intelligence.</strong> Recommendations sized to the specific traffic, burst, and SLO patterns of each workload. Not generic algorithms applied uniformly across stateless APIs, stateful databases, and batch jobs.</li>
230 <li><strong>Production safety.</strong> Read-only operation by default. No third-party process taking write actions on critical cluster
230s without explicit approval. SREs keep accountability. Engineers keep visibility.</li>
231 <li><strong>An action layer.</strong> A way to apply the recommendations through engineering's existing CI/CD and approval workflows, so changes don't sit in a backlog forever.</li>
232 </ul>
233
234 <p>
235 This is the gap <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">OptOps.ai</a> was built to close. The architecture is deliberately advisory-first: read-only collection at install, metadata-only (no secrets transmitted), no write access required. The AI continuously analyses workload behaviour and surfaces precise, sized recommendations, pod by pod, with ROI estimates attached. Engineers apply changes through their own CI/CD, with full visibility into what's being changed and why. The cluster gets leaner. The savings are real. The team stays in control.
236 </p>
237
238 <h2>What to do this week</h2>
239
240 <p>
241 If you haven't recently checked your cluster's actual utilisation against its provisioned capacity, the first move costs nothing and takes about an hour. Pull a snapshot of average CPU and memory utilisation across the cluster over the last 30 days. Compare it against average resource requests. The gap between those two numbers is your waste. In real percentage terms.
242 </p>
243
244 <p>
245 Most teams who do this are surprised. The number isn't 10% or 15%. It's usually 50% or higher. Once you see your own number, the question stops being "is this real" and becomes "what's the safest path to fix it."
246 </p>
247
248 <p>
249 </p>
250
251 </div>
252
253<div class="post-cta">
254 <h3>See exactly where your cluster is wasting money.</h3>
255 <p>OptOps.ai installs in 15 minutes. Read-only, metadata only. We'll show you your real waste within 24 hours. No commitment. No production risk.</p>
256 <div class="post-cta-buttons">
257 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
258 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
259 </div>
260 </div>
261
262<div class="faq-section">
263 <h2>Frequently asked questions</h2>
264
265 <div class="faq-item">
266 <div class="faq-q">
266What is Kubernetes over-provisioning?</div>
267 <p class="faq-a">Kubernetes over-provisioning is when pod resource requests for CPU and memory are set higher than what the workload uses. Engineers usually do this on purpose, sizing 2-3× above real usage as a safety buffer to avoid throttling or OOM kills. The trouble is they rarely come back to fix it once the workload settles into real production traffic. The buffer becomes permanent. The cluster pays for capacity it never touches.</p>
268 </div>
269
270 <div class="faq-item">
271 <div class="faq-q">How much of a typical Kubernetes cluster is wasted?</div>
272 <p class="faq-a">Industry data puts the number between 50% and 70%. <strong>Container telemetry studies spanning billions of containers have found 69% of purchased CPU goes unused.</strong> Multiple industry surveys land in the same range. For a company spending $1M a year on Kubernetes, that means $500K to $700K in waste annually.</p>
273 </div>
274
275 <div class="faq-item">
276 <div class="faq-q">Why don't engineering teams just rightsize their pods?</div>
277 <p class="faq-a">Manual rightsizing is slow, risky, and never finished. A typical cluster has hundreds of workloads with bursty traffic, and getting the request size wrong causes throttling or OOM kills in production. Engineers default to over-provisioning because <strong>the cost of getting it wrong on the low side is visible and immediate, while the cost of getting it wrong on the high side is buried in next month's cloud bill.</strong></p>
278 </div>
279
280 <div class="faq-item">
281 <div class="faq-q">Can the Kubernetes Vertical Pod Autoscaler (VPA) fix this?</div>
282 <p class="faq-a">VPA can recommend or apply resource adjustments, but very few teams run it in full automation in production. <strong>VPA evicts pods to apply changes</strong> (which causes service disruption), uses backward-looking algorithms with an 8-day window that lag real traffic, and conflicts with HPA. Most teams deploy VPA in recommendation-only mode, and the recommendations sit unused.</p>
283 </div>
284
285 <div class="faq-item">
286 <div class="faq-q">
286How does OptOps.ai solve Kubernetes over-provisioning?</div>
287 <p class="faq-a">OptOps.ai is an advisory-first AI for Kubernetes cost optimisation. It installs in 15 minutes with metadata-only collection, learns workload patterns over time, and surfaces precise, ROI-tagged rightsizing recommendations. <strong>Engineers apply changes through their own CI/CD. The AI never overrides production decisions.</strong> This closes the gap between knowing waste exists and eliminating it.</p>
288 </div>
289 </div>
290`,O3=`<div class="tldr-box">
291 <div class="tldr-label">The short version</div>
292 <ul class="tldr-list">
293 <li><strong>Advisory platforms recommend; autonomous platforms execute.</strong> Same goal, opposite philosophies about who owns the production decision.</li>
294 <li><strong>If you're in BFSI, government, healthcare, or any regulated industry,</strong> advisory is usually the only viable option. Autonomous tools struggle to pass security review.</li>
295 <li><strong>If you have a mature DevOps team and no compliance constraint,</strong> autonomous can work, but only if the architectural commitment matches your tolerance for self-healing infrastructure.</li>
296 </ul>
297 </div>
298
299<div class="post-body">
300
301 <p>
302 If you've been evaluating Kubernetes cost optimization tools, you've probably noticed something strange. Two platforms can claim to solve the same problem with the same outcome, "reduce your cloud bill by 50%", and feel completely different in a demo. One installs in 15 minutes and shows you a list of recommendations. The other walks you through configuring policies, eviction tolerances, and rollout windows. They both work. But they're not the same product.
303 </p>
304
305 <p>
306 The difference isn't features. It's philosophy. Every tool in this category sits on one of two architectural choices, and the choice determines almost everything else: how it installs, how it sells, who buys it, and whether it survives in your specific environment. Most teams don't realise they're making this choice until they've already deployed something that's the wrong fit. Then they spend a quarter trying to make it work, and another quarter unwinding it.
307 </p>
308
309 <p>
310 So let's put the choice on the table directly.
311 </p>
312
313 <h2>The two philosophies, plainly</h2>
314
315 <p>
316 <strong>Advisory platforms</strong> observe your cluster, learn the workload, and surface precise recommendations. The platform tells you what to change. Engineering decides whether and when to apply it, usually through the same CI/CD pipeline they use for everything else. The platform never takes a write action without explicit human approval.
317 </p>
318
319 <p>
320 <strong>Autonomous platforms</strong> observe your cluster, learn the workload, and execute changes directly. They replace scheduler decisions, adjust resource requests in real-time, evict pods to apply rightsizing, swap node types, manage spot instances. The platform doesn't ask. It acts. The trust contract reads roughly as "we know better than your engineers, and these are the receipts."
321 </p>
322
323 <div class="pull-quote">
324 "Advisory keeps engineering in the loop. Autonomous removes engineering from the loop. That's not a feature decision. It's a philosophy decision."
325 </div>
326
327 <p>
328 Both philosophies can deliver real savings. That's important. This isn't a case where one approach is right and the other is broken. It's a case where the two approaches optimise for fundamentally different things, and the right answer depends on your team, your industry, and how your organisation thinks about production safety.
329 </p>
330
331 <div class="infographic">
332 <div class="infographic-title">How decisions get made</div>
333 <svg class="infographic-svg" viewBox="0 0 800 320" xmlns="http://www.w3.org/2000/svg">
334 <defs>
335 <linearGradient id="advisoryGrad" x1="0%" y1="0%" x2="100%" y2="100%">
336 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.12"/>
337 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.04"/>
338 </linearGradient>
339 <linearGradient id="autoGrad" x1="0%" y1="0%" x2="100%" y2="100%">
340 <stop offset="0%" stop-color="#06B6D4" stop-opacity="0.12"/>
341 <stop offset="100%" stop-color="#06B6D4" stop-opacity="0.04"/>
342 </linearGradient>
343 </defs>
344
345 <rect x="20" y="20" width="370" height="280" rx="10" fill="url(#advisoryGrad)" stroke="#7C3AED" stroke-width="1.5"/>
346 <text x="40" y="50" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.5">ADVISORY MODEL</text>
347
348 <rect x="40" y="70" width="330" height="44" rx="6" fill="white" stroke="#D8D8E0" stroke-width="1"/>
349 <text x="56" y="91" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">1. AI observes the cluster (read-only)</text>
350 <text x="56" y="107" font-family="Plus Jakarta Sans, sans-serif" font-size="11" fill="#5C5C70">Metadata only. No write access.</text>
351
352 <line x1="205" y1="120" x2="205" y2="132" stroke="#7C3AED" stroke-width="1.5"/>
353 <polygon points="200,130 205,140 210,130" fill="#7C3AED"/>
354
355 <rect x="40" y="142" width="330" height="44" rx="6" fill="white" stroke="#D8D8E0" stroke-width="1"/>
356 <text x="56" y="163" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">2. AI surfaces sized recommendations</text>
357 <text x="56" y="179" font-family="Plus Jakarta Sans, sans-serif" font-size="11" fill="#5C5C70">ROI-tagged. Workload-aware.</text>
358
359 <line x1="205" y1="192" x2="205" y2="204" stroke="#7C3AED" stroke-width="1.5"/>
360 <polygon points="200,202 205,212 210,202" fill="#7C3AED"/>
361
362 <rect x="40" y="214" width="330" height="44" rx="6" fill="#F5F0FE" stroke="#7C3AED" stroke-width="1.5"/>
363 <text x="56" y="235" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="700" fill="#7C3AED">3. ENGINEER DECIDES &amp;
363 APPLIES</text>
364 <text x="56" y="251" font-family="Plus Jakarta Sans, sans-serif" font-size="11" fill="#5C5C70">Through your existing CI/CD &amp; approvals</text>
365
366 <text x="40" y="285" font-family="Plus Jakarta Sans, sans-serif" font-size="11.5" font-style="italic" fill="#5C5C70">Engineering stays accountable.</text>
367
368 <rect x="410" y="20" width="370" height="280" rx="10" fill="url(#autoGrad)" stroke="#06B6D4" stroke-width="1.5"/>
369 <text x="430" y="50" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#06B6D4" letter-spacing="1.5">AUTONOMOUS MODEL</text>
370
371 <rect x="430" y="70" width="330" height="44" rx="6" fill="white" stroke="#D8D8E0" stroke-width="1"/>
372 <text x="446" y="91" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">1. AI observes the cluster (write access)</text>
373 <text x="446" y="107" font-family="Plus Jakarta Sans, sans-serif" font-size="11" fill="#5C5C70">Configures policies up front.</text>
374
375 <line x1="595" y1="120" x2="595" y2="132" stroke="#06B6D4" stroke-width="1.5"/>
376 <polygon points="590,130 595,140 600,130" fill="#06B6D4"/>
377
378 <rect x="430" y="142" width="330" height="44" rx="6" fill="white" stroke="#D8D8E0" stroke-width="1"/>
379 <text x="446" y="163" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">2. AI evaluates against policy</text>
380 <text x="446" y="179" font-family="Plus Jakarta Sans, sans-serif" font-size="11" fill="#5C5C70">Within configured tolerances.</text>
381
382 <line x1="595" y1="192" x2="595" y2="204" stroke="#06B6D4" stroke-width="1.5"/>
383 <polygon points="590,202 595,212 600,202" fill="#06B6D4"/>
384
385 <rect x="430" y="214" width="330" height="44" rx="6" fill="#ECFDFF" stroke="#06B6D4" stroke-width="1.5"/>
386 <text x="446" y="235" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="700" fill="#06B6D4">3. PLATFORM EXECUTES DIRECTLY</text>
387 <text x="446" y="251" font-family="Plus Jakarta Sans, sans-serif" font-size="11" fill="#5C5C70">Evicts pods, swaps nodes, applies changes.</text>
388
389 <text x="430" y="285" font-family="Plus Jakarta Sans, sans-serif" font-size="11.5" font-style="italic" fill="#5C5C70">Platform owns the decision.</text>
390 </svg>
391 <p class="infographic-caption">Same observation. Same intelligence. Different decisions about who pulls the trigger.</p>
392 </div>
393
394 <h2>Where each one wins</h2>
395
396 <p>
397 The honest read: each philosophy wins in specific environments. Anyone who tells you one approach is universally better is selling you something.
398 </p>
399
400 <h3>Where autonomous wins</h3>
401
402 <p>
403 Autonomous platforms shine in a few specific scenarios. They're worth taking seriously when they fit.
404 </p>
405
406 <p>
407 The classic fit is a high-growth consumer SaaS company with strong DevOps maturity, low regulatory pressure, and a culture that's bought into self-healing infrastructure. Engineering teams there often want to delegate cost management entirely so they can focus on product. The autonomous platform takes the work off their plate. Savings show up. Nobody minds that the scheduler decisions are now made by a third-party tool. The trust contract works.
408 </p>
409
410 <p>
411 Autonomous also tends to be more mature on a few specific layers, GPU optimization for AI/ML workloads, aggressive spot instance management, multi-region failover patterns. If those layers dominate your spend, the autonomous platforms have spent more years tuning them. The advisory category is catching up but isn't there yet on every dimension.
412 </p>
413
414 <h3>Where advisory wins</h3>
415
416 <p>
417 The advisory model's home turf is anywhere production safety, audit requirements, or change-management discipline matter. Which is to say, most enterprise environments. And almost all regulated ones.
418 </p>
419
420 <p>
421 Banks, government agencies, and healthcare organisations don't get to choose whether engineers stay in the loop on production changes. Regulation requires it. Internal 
421change-management policies enforce it. SREs and security teams are accountable for what runs in production, and they will not, cannot, let a third-party tool make autonomous write actions on critical clusters. Every advisory-only conversation we have in BFSI starts with the same sentence: "We looked at the autonomous tools, but our security team blocked them." This isn't a maybe. It's a structural constraint.
422 </p>
423
424 <p>
425 Advisory also fits any team where SRE accountability matters more than maximum convenience. If your senior engineers are the ones who get paged when something breaks at 3am, they want to be the ones who decided to make the change at 3pm. That's not stubbornness. That's how production systems stay reliable.
426 </p>
427
428 <div class="pull-quote">
429 "Every advisory-only conversation we have in BFSI starts the same way: 'We looked at the autonomous tools, but our security team blocked them.' This isn't a preference. It's a structural constraint."
430 </div>
431
432 <h2>The decision framework</h2>
433
434 <p>
435 If you're trying to decide which approach fits your team, the question isn't "which tool is better." It's "which philosophy matches how my organisation operates." Five questions usually settle it.
436 </p>
437
438 <div class="infographic">
439 <div class="infographic-title">Five questions that settle the choice</div>
440 <table class="approach-table">
441 <thead>
442 <tr>
443 <th>Question</th>
444 <th>If yes, lean</th>
445 <th class="optops-col">Confidence</th>
446 </tr>
447 </thead>
448 <tbody>
449 <tr>
450 <td class="feature">Are you in BFSI, government, healthcare, or any regulated industry?</td>
451 <td class="advisory">Advisory</td>
452 <td>Very high. This usually settles it on its own.</td>
453 </tr>
454 <tr>
455 <td class="feature">Do your SRE or security teams have veto power on third-party tooling that takes write actions on production?</td>
456 <td class="advisory">Advisory</td>
457 <td>Very high. Autonomous tools get blocked here.</td>
458 </tr>
459 <tr>
460 <td class="feature">Do you have formal change-management requirements (CAB, ticket-based approvals)?</td>
461 <td class="advisory">Advisory</td>
462 <td>High. Autonomous tools fight the workflow.</td>
463 </tr>
464 <tr>
465 <td class="feature">Is GPU optimization or aggressive spot management your dominant cost driver today?</td>
466 <td>Autonomous</td>
467 <td>Medium. Autonomous platforms are more mature here, for now.</td>
468 </tr>
469 <tr>
470 <td class="feature">Do you want to fully delegate cost management without engineering review?</td>
471 <td>Autonomous</td>
472 <td>High. This is exactly what autonomous is built for.</td>
473 </tr>
474 </tbody>
475 </table>
476 <p class="infographic-caption">If you answered "yes" to any of the first three, advisory is almost certainly the right pick. The other two questions only matter if you cleared the first three.</p>
477 </div>
478
479 <h2>The trap most teams fall into</h2>
480
481 <p>
482 The most common evaluation mistake is treating "graduated mode" as a hedge. Some autonomous platforms market a path from read-only to full automation. The pitch is: start advisory, get comfortable, gradually let us take over. It sounds reasonable. It rarely works the way buyers expect.
483 </p>
484
485 <p>
486 The deeper issue is structural. The underlying architecture of every platform is optimised for one mode or the other. A platform built autonomous-first treats advisory mode as an on-ramp. The product gets better when you turn on automation. The roadmap is automation-led. Sales conversations push toward automation. Customer success metrics are tracked against automation rollout. If you're a regulated buyer who plans to stay in advisory mode forever, you're using the product against its design intent. You'll get the worst version of it.
487 </p>
488
489 <p>
490 A platform built advisory-first is the inverse. The architecture, the AI, the integrations, the customer success motion, all of it is designed around the assumption that engineering stays in the loop. Optional automation is available for teams that want it, but it's not the destination state. The product is good in the mode you're using it in.
491 </p>
492
493 <div class="key-point">
494 <div class="key-point-label">What to ask in evaluations</div>
495 <p>The right question isn't "do you support advisory mode?" Every tool will say yes. The right question is "what percentage of your customers run in advisory mode in production?" If the honest answer is 5-10%, the product is autonomous-first and you're an edge c
495ase. If it's 70-90%, the product is advisory-first and you're the core ICP. Buy accordingly.</p>
496 </div>
497
498 <h2>Where OptOps.ai fits</h2>
499
500 <p>
501 OptOps.ai is built advisory-first. Not as a stepping stone. As the architecture. The AI generates precise, ROI-tagged recommendations. Engineers apply them through their own CI/CD using Terraform, Karpenter, or whatever deployment tooling they already trust. Read-only by default. Metadata-only collection. No secrets transmitted. No write access required.
502 </p>
503
504 <p>
505 That commitment is why OptOps.ai works in environments where most autonomous platforms can't get past security review, banks, government, healthcare, and any team running mission-critical workloads at scale. We've written about <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">how OptOps.ai compares to other Kubernetes cost optimisation platforms</a> in more detail if you want the head-to-head version.
506 </p>
507
508 <p>
509 If you're in one of the regulated environments where this matters most, the choice is usually obvious once you see it framed correctly. If you're in the autonomous fit-zone described above, we'll be the first to tell you. Both approaches have a place. The mistake is thinking they're interchangeable.
510 </p>
511
512 </div>
513
514<div class="post-cta">
515 <h3>See OptOps.ai's advisory-first approach in 15 minutes.</h3>
516 <p>Read-only install. Metadata only. First recommendations within 24 hours. We'll show you exactly what advisory looks like in practice, no commitment, no production risk.</p>
517 <div class="post-cta-buttons">
518 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
519 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
520 </div>
521 </div>
522
523<div class="faq-section">
524 <h2>Frequently asked questions</h2>
525
526 <div class="faq-item">
527 <div class="faq-q">What's the difference between advisory and autonomous Kubernetes optimization?</div>
528 <p class="faq-a">Advisory Kubernetes optimization recommends precise actions and lets engineering teams apply them through their existing CI/CD and approval workflows. Autonomous Kubernetes optimization takes over execution directly, replacing scheduler decisions, provisioner logic, and resource sizing without requiring human approval for each change. <strong>Advisory platforms keep engineering in the loop. Autonomous platforms remove engineering from the loop.</strong> Both can deliver savings, but they're built on opposite philosophies about who should be in control of production.</p>
529 </div>
530
531 <div class="faq-item">
532 <div class="faq-q">Which approach is better for regulated industries like banking and government?</div>
533 <p class="faq-a"><strong>Advisory-first platforms are typically the only viable option in regulated environments.</strong> Banks, government agencies, and healthcare organisations operate under change-management discipline and audit requirements that don't allow third-party tools to take autonomous write actions on production clusters. Security review usually blocks tools that need write access. Advisory platforms work because they preserve approval workflows, audit trails, and engineering accountability while still delivering the optimisation intelligence.</p>
534 </div>
535
536 <div class="faq-item">
537 <div class="faq-q">When does autonomous Kubernetes optimization make sense?</div>
538 <p class="faq-a">Autonomous optimization fits best when engineering teams want to fully delegate cost management, when SLO requirements are flexible enough to tolerate some variance from autonomous decisions, and when the organisation has no regulatory or change-management constraint blocking autonomous tools from taking write actions. <strong>High-growth consumer SaaS companies with strong DevOps maturity and tolerance for self-healing infrastructure</strong> often pick autonomous platforms successfully.</p>
539 </div>
540
541 <div class="faq-item">
542 <div class="faq-q">Can I switch between advisory and autonomous later?</div>
543 <p class="faq-a">Some platforms offer a graduated mode where you start in advisory (read-only) and can later turn on autonomous features. <strong>The catch is that the underlying architecture is usually optimised for one mode or the other.</strong> A platform built autonomous-first will treat advisory mode as a stepping stone, not the destination. A platform built advisory-first treats it as the architecture. The question is less "can I switch" and more "which philosophy is the product designed around."</p>
544 </div>
545
546 <div class="faq-item">
547 <div class="faq-q">
547Does OptOps.ai support both modes?</div>
548 <p class="faq-a">OptOps.ai is advisory-first by design. The AI generates precise, ROI-tagged recommendations. Engineering teams apply them through their own CI/CD using tools like Terraform or Karpenter. <strong>Optional automation is available for teams that want it, but the architecture is built around the assumption that engineering should stay in control of production decisions.</strong> Read-only by default. Metadata-only collection. No write access required.</p>
549 </div>
550 </div>
551`,E3=`<div class="tldr-box">
552 <div class="tldr-label">The short version</div>
553 <ul class="tldr-list">
554 <li><strong>FinOps dashboards are visibility tools, not optimization tools.</strong> They show where waste is. They don't eliminate it.</li>
555 <li><strong>The reason recommendations sit unimplemented isn't laziness.</strong> Engineering teams don't have the bandwidth to manually rightsize hundreds of pods every quarter.</li>
556 <li><strong>The fix isn't a better dashboard.</strong> It's an action layer that sits on top of your dashboard and closes the loop from recommendation to deployment.</li>
557 </ul>
558 </div>
559
560<div class="post-body">
561
562 <p>
563 Walk into any engineering org that's been running Kubernetes for a couple of years and you'll find the same artefact. A FinOps dashboard, fully configured, beautifully tagged, generating reports nobody implements. Quarterly review meetings where someone presents the same waste numbers as last quarter. A Slack channel called <code>#cost-optimization</code> with three messages from six months ago. Cloud bills that keep going up.
564 </p>
565
566 <p>
567 This isn't a story about a bad dashboard. The dashboards in this category are good. They do exactly what they say. They show you where the waste is. They surface utilisation metrics, idle capacity, optimisation recommendations. The reports look great. Finance loves them. The CFO can finally see what AWS is being spent on.
568 </p>
569
570 <p>
571 And yet the bill keeps going up. Why?
572 </p>
573
574 <p>
575 Because visibility isn't savings. And nobody told you that when you bought the dashboard.
576 </p>
577
578 <h2>What dashboards do well, and why it's not enough</h2>
579
580 <p>
581 A modern FinOps dashboard is built to answer one question: where is the money going? The answer arrives in beautiful detail. Spend by team. Spend by namespace. Spend by workload. Idle node-hours. Underutilised pods. Cost anomalies when something spikes unexpectedly. For the finance team trying to allocate cloud costs across business units, this is exactly the right tool.
582 </p>
583
584 <p>
585 What dashboards aren't built to do is the second half of the job. Eliminating the waste they identify. That part requires somebody to read the recommendations, evaluate them against production constraints, prioritise them against the rest of engineering's roadmap, write the YAML changes, push them through CI/CD, and verify nothing broke. For every recommendation. Every quarter.
586 </p>
587
588 <p>
589 The math gets ugly fast. A typical mid-sized cluster generates dozens to hundreds of optimization recommendations per quarter. If each one takes an engineer 30-60 minutes of careful review and implementation, you're looking at a multi-week dedicated effort for a single quarter's backlog. And the recommendations don't stop coming. New workloads ship. Traffic patterns change. Yesterday's correctly-sized pod becomes today's over-provisioned one. The dashboard keeps producing recommendations. The backlog keeps growing.
590 </p>
591
592 <div class="pull-quote">
593 "Dashboards solve the discovery problem. They were never built to solve the implementation problem. The industry just kept selling them as if they did."
594 </div>
595
596 <h2>Why the recommendations sit unimplemented</h2>
597
598 <p>
599 When you ask engineering teams why dashboard recommendations don't get implemented, you don't hear "we don't care about cost." You hear something more specific.
600 </p>
601
602 <p>
603 The first answer is bandwidth. Engineering teams have roadmaps full of customer-facing work, reliability projects, infrastructure migrations, security commitments. Manual rightsizing is the kind of work that's important but never urgent. It always loses to whatever's on fire this week. So it slides. And slides. And slides.
604 </p>
605
606 <p>
607 The second answer is trust. Dashboard recommendations are usually generated by static algorithms looking at historical utilisation. The recommendation says "reduce this pod's memory request from 4GB to 1.2GB." But the engineer reading it knows things the dashboard doesn't. That this service has a quarterly batch job that legitimately needs the headroom. That the database client connection pool grows during traffic spikes. That last time someone rightsized this service aggressively, it OOM-killed during a Tuesday evening peak. So the engineer hesitates. And hesitation in production usually means doing nothing.
608 </p>
609
610 <p>
611 The third answer is structural. Dashboards weren't designed to integrate with how engineering ships changes. They produce a recommendation in a UI. To act on it, an engineer has to find the right manifest, edit it, get a code review, run CI, deploy. The dashboard exists in a different operational world from the deployment pipeline. Crossing the gap takes manual effort every single time, for every single recommendation.
612 </p>
613
614 <h2>The gap, visualised</h2>
615
616 <p>
617 The cost optimization process has three stages. Most teams have one of them solved. The expensive part is the stage in the middle that nobody owns.
618 </p>
619
620 <div class="infographic">
621 <div class="infographic-title">The three-stage gap most teams stall in</div>
622 <svg class="infographic-svg" viewBox="0 0 800 220" xmlns="http://www.w3.org/2000/svg">
623 <defs>
624 <linearGradient id="visGrad" x1="0%" y1="0%" x2="0%" y2="100%">
625 <stop offset="0%" stop-color="#06B6D4" stop-opacity="0.18"/>
626 <stop offset="100%" stop-color="#06B6D4" stop-opacity="0.05"/>
627 </linearGradient>
628 <pattern id="gapPattern" patternUnits="userSpaceOnUse" width="14" height="14" patternTransform="rotate(45)">
629 <rect width="14" height="14" fill="#FEF3C7"/>
630 <line x1="0" y1="0" x2="0" y2="14" stroke="#D97706" stroke-width="1.5" opacity="0.4"/>
631 </pattern>
632 <linearGradient id="actionGrad" x1="0%" y1="0%" x2="0%" y2="100%">
633 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.18"/>
634 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.05"/>
635 </linearGradient>
636 </defs>
637
638 <rect x="20" y="30" width="240" height="160" rx="10" fill="url(#visGrad)" stroke="#06B6D4" stroke-width="1.5"/>
639 <text x="40" y="60" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#06B6D4" letter-spacing="1.5">STAGE 01, SOLVED</text>
640 <text x="40" y="92" font-family="Plus Jakarta Sans, sans-serif" font-size="18" font-weight="800" fill="#0E0E1A">Visibility</text>
641 <text x="40" y="120" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Cost breakdowns, utilisation</text>
642 <text x="40" y="138" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">metrics, idle capacity, anomaly</text>
643 <text x="40" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">alerts, recommendations.</text>
644 <text x="40" y="180" font-family="Plus Jakarta Sans, sans-serif" font-size="12" font-style="italic" fill="#06B6D4">Dashboards do this well.</text>
645
646 <line x1="265" y1="110" x2="280" y2="110" stroke="#8A8A9C" stroke-width="1.5"/>
647 <polygon points="278,105 288,110 278,115" fill="#8A8A9C"/>
648
649 <rect x="290" y="30" width="240" height="160" rx="10" fill="url(#gapPattern)" stroke="#D97706" stroke-width="1.5" stroke-dasharray="6 4"/>
650 <text x="310" y="60" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.5">STAGE 02, STALLED</text>
651 <text x="310" y="92" font-family="Plus Jakarta Sans, sans-serif" font-size="18" font-weight="800" fill="#0E0E1A">The Gap</text>
652 <text x="310" y="120" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#2A2A3C">Recommendations age in the</text>
653 <text x="310" y="138" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#2A2A3C">backlog. Nobody owns the</text>
654 <text x="310" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#2A2A3C">implementation work.</text>
655 <text x="310" y="180" font-family="Plus Jakarta Sans, sans-serif" font-size="12" font-style="italic" fill="#D97706">This is where money is lost.</text>
656
657 <line x1="535" y1="110" x2="550" y2="110" stroke="#8A8A9C" stroke-width="1.5"/>
658 <polygon points="548,105 558,110 548,115" fill="#8A8A9C"/>
659
660 <rect x="560" y="30" width="220" height="160" rx="10" fill="url(#actionGrad)" stroke="#7C3AED" stroke-width="1.5"/>
661 <text x="580" y="60" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.5">STAGE 03, THE WIN</text>
662 <text x="580" y="92" font-family="Plus Jakarta Sans, sans-serif" font-size="18" font-weight="800" fill="#0E0E1A">Action</text>
663 <text x="580" y="120" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Changes ship through CI/CD.</text>
664 <text x="580" y="138" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Cluster gets leaner.</text>
665 <text x="580" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Bill goes down.</text>
666 <text x="580" y="180" font-family="Plus Jakarta Sans, sans-serif" font-size="12" font-style="italic" fill="#7C3AED">Most teams never get here.</text>
667 </svg>
668 <p class="infographic-caption">Stage 1 is a tooling problem you've already solved. Stage 3 is what you want. Stage 2, the gap in the middle, is where the savings live or die.</p>
669 </div>
670
671 <h2>What "an action layer" looks like</h2>
672
673 <p>
674 The fix for stage 2 isn't a better dashboard. It's a different category of tool entirely. Something that sits between the recommendation and the deployment, and does three specific things the dashboard was never built to do.
675 </p>
676
677 <p>
678 First, it has to produce recommendations engineers trust. That means workload-aware, not generic. The recommendation needs to understand that this service has bursty traffic, that one runs a JVM with garbage collection patterns, that another has a stateful component with memory pressure during specific business cycles. Static thresholds won't get there. The intelligence has to come from continuous observation and learning.
679 </p>
680
681 <p>
682 Second, it has to integrate with how engineering ships changes. Not a separate UI engineers have to remember to check. Not a CSV export they have to translate. The action layer needs to plug into Terraform, Karpenter, ArgoCD, or whatever deployment tooling already exists. Recommendations should arrive as code changes engineers can review and merge through their normal workflow.
683 </p>
684
685 <p>
686 Third, it has to be safe enough to use in production. Read-only by default. No write access required. No third-party process taking actions on critical cluster
686s. Engineering keeps full control of what gets applied and when. SREs stay accountable. The optimization layer never overrides production decisions.
687 </p>
688
689 <div class="key-point">
690 <div class="key-point-label">The mental model</div>
691 <p>Think of your FinOps dashboard as the monitoring layer for cost. Useful, necessary, not sufficient. The action layer is what sits on top, closing the loop from recommendation to deployment without engineering having to manually translate every insight into a YAML change. Most teams need both. Very few realise they're missing the second one.</p>
692 </div>
693
694 <h2>Where dashboards still belong in the stack</h2>
695
696 <p>
697 None of this is an argument against FinOps dashboards. Dashboards do what they were built for. They give finance teams the visibility they need for chargeback, showback, and budget allocation. They give engineering leaders a way to track cost as a first-class metric. They surface anomalies fast enough to catch a runaway workload before it costs you a month's salary.
698 </p>
699
700 <p>
701 The mistake is buying a dashboard and expecting savings. The dashboard isn't broken. It's just not designed for that job. If your team has dedicated FinOps capacity to manually implement recommendations every sprint, the dashboard plus disciplined process can deliver real outcomes. If your team doesn't have that capacity, and most don't, the dashboard alone will keep producing reports nobody acts on.
702 </p>
703
704 <p>
705 The honest read on this category is simple. Dashboards are visibility infrastructure. Optimization needs a different layer. We've written about <a href="/resources/blogs/finops-dashboards-dont-save-money">how OptOps.ai sits on top of FinOps dashboards</a> if you want the deeper version of how the two layers fit together.
706 </p>
707
708 </div>
709
710<div class="post-cta">
711 <h3>Keep your dashboard. Add the action layer.</h3>
712 <p>OptOps.ai installs in 15 minutes alongside your existing FinOps dashboard. Read-only, metadata only. We'll show you exactly which recommendations your dashboard surfaced that haven't moved your bill, and what closing the loop looks like.</p>
713 <div class="post-cta-buttons">
714 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
715 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
716 </div>
717 </div>
718
719<div class="faq-section">
720 <h2>Frequently asked questions</h2>
721
722 <div class="faq-item">
723 <div class="faq-q">What is a FinOps dashboard?</div>
724 <p class="faq-a">A FinOps dashboard is a cloud cost visibility tool that breaks down spend by team, namespace, workload, and resource type. It surfaces utilisation metrics, identifies idle capacity, and generates optimisation recommendations. <strong>Most of the established Kubernetes-focused FinOps dashboards take a similar shape: open-source or enterprise platforms that attribute spend by namespace and label, with cost data either Kubernetes-native or sitting alongside broader cloud monitoring.</strong> They're built primarily for finance reporting and engineering visibility, not for taking optimisation actions.</p>
725 </div>
726
727 <div class="faq-item">
728 <div class="faq-q">Why do FinOps dashboard recommendations sit unimplemented?</div>
729 <p class="faq-a">FinOps dashboards typically generate dozens to hundreds of optimisation recommendations every quarter, but require engineering teams to manually evaluate, prioritise, and implement each one. <strong>Engineering teams rarely have the bandwidth, the recommendations often lack workload-specific context engineers trust, and there's no native path from recommendation to deployment.</strong> So most dashboard recommendations age in the backlog while the cluster keeps wasting money.</p>
730 </div>
731
732 <div class="faq-item">
733 <div class="faq-q">Is a FinOps dashboard enough to reduce my Kubernetes cloud bill?</div>
734 <p class="faq-a">A FinOps dashboard is excellent for cost visibility, breaking down spend by namespace, team, and workload, and surfacing utilisation gaps. But <strong>a dashboard by itself doesn't implement changes.</strong> It produces recommendations that engineering teams have to translate into manifest changes, deploy through CI/CD, and verify in production. Most teams find that the gap between a dashboard surfacing waste and eliminating it requires either a dedicated FinOps headcount or an action-layer tool sitting on top.</p>
735 </div>
736
737 <div class="faq-item">
738 <div class="faq-q">Can I run OptOps.ai alongside my FinOps dashboard?</div>
739 <p class="faq-a">Yes. <strong>OptOps.ai is designed to complement existing FinOps dashboards, not replace them.</strong> Most teams keep their dashboard for cost visibility and finance reporting, and add OptOps.ai as the action layer that turns recommendations into implemented changes. OptOps.ai installs in 15 minutes alongside any existing tool, in advisory mode by default.</p>
740 </div>
741
742 <div class="faq-item">
743 <div class="faq-q">What's the difference between cost visibility and cost optimization?</div>
744 <p class="faq-a"><strong>Cost visibility tells you where money is being spent and where waste exists. Cost optimization reduces the spend</strong> by changing how resources are allocated. Most FinOps dashboards deliver visibility, they surface the problem clearly. Cost optimization requires either dedicated engineering effort to implement recommendations manually, or a tool that closes the loop from recommendation to deployment automatically. Visibility is necessary but not sufficient for savings.</p>
745 </div>
746 </div>
747`,D3=`<div class="tldr-box">
748 <div class="tldr-label">The short version</div>
749 <ul class="tldr-list">
750 <li><strong>BFSI Kubernetes clusters typically waste 40-60% of provisioned capacity</strong>, same range as the broader market, but driven by different causes.</li>
751 <li><strong>Most optimisation tools fail BFSI security review</strong> because they require write access, transmit workload metadata externally, or conflict with change-management discipline.</li>
752 <li><strong>The right architecture for BFSI optimisation is advisory-first:</strong> read-only collection, metadata-only telemetry, audit-friendly approval workflows, and zero production execution by the platform.</li>
753 </ul>
754 </div>
755
756<div class="post-body">
757
758 <p>
759 If you run platform engineering at a bank, you already know the shape of the problem. Cloud bills climbing quarter over quarter. CFO asking pointed questions about where the spend is going. Internal FinOps team producing dashboards full of optimisation opportunities. And almost none of it getting implemented, because the tools that promise to fix it can't pass your security review.
760 </p>
761
762 <p>
763 This isn't a case where the tools are bad. The market for Kubernetes cost optimisation is mature. There are real platforms doing real work. The mismatch is that most of them were built for high-growth consumer SaaS environments where the constraint is engineering bandwidth and the reward for moving fast is more important than the cost of moving wrong. BFSI runs on opposite priorities. The constraint is risk and audit. Moving wrong costs more than moving slow ever does.
764 </p>
765
766 <p>
767 So the question isn't "how do we adopt the tools that work elsewhere." It's "what does optimisation look like when compliance is the lead constraint." Different question. Different answer.
768 </p>
769
770 <h2>What's wasting money in BFSI clusters</h2>
771
772 <p>
773 BFSI Kubernetes waste tends to come from four places, and they're not the same as the consumer-SaaS waste pattern. Worth understanding each one separately because the right fix is different for each.
774 </p>
775
776 <h3>1. Conservative over-provisioning</h3>
777
778 <p>
779 Banks operate under SLO discipline that most consumer-SaaS companies would find absurd. A trading platform that's down for 90 seconds during market hours has a regulatory incident on its hands. A core banking system that throttles during EOD batch processing fails reconciliation. Engineering teams operating under that discipline make exactly the choice you'd make in their position: they over-provision aggressively. Two times what the workload needs is the floor. Three to four times is normal. Five times is not unusual for tier-zero workloads.
780 </p>
781
782 <p>
783 This is rational behaviour. It's also the largest single source of waste in most BFSI clusters. The fix isn't telling engineers to over-provision less. It's giving them tooling that lets them right-size with confidence, recommendations they can trust because the AI understands the workload's burst patterns, not just its averages.
784 </p>
785
786 <h3>2. Redundant capacity for HA and DR</h3>
787
788 <p>
789 Banks run multi-region active-active or active-passive architectures because regulators expect them to. Disaster recovery clusters mirror production at full capacity. High-availability tiers carry hot replicas. Cross-AZ redundancy is mandatory, not optional. None of this is waste in the strict sense, it's compliance, but a meaningful chunk of it is over-engineered relative to actual recovery requirements.
790 </p>
791
792 <p>
793 The optimization opportunity here isn't to reduce redundancy. It's to right-size the redundant capacity so it scales with the workload it's protecting, not with worst-case assumptions baked in three years ago. Most banks find 15-25% savings here once someone models it.
794 </p>
795
796 <h3>3. Idle dev and staging environments</h3>
797
798 <p>
799 Staging environments mirroring production at full capacity, running 24/7, used for maybe 6 hours a day. Multiple development clusters per team, never decommissioned. UAT environments provisioned for quarterly releases that take three days. The non-production footprint in BFSI is often 30-50% of the production footprint, and most of it sits idle most of the time.
800 </p>
801
802 <p>
803 This is the easiest waste to find and the hardest to fix politically. Engineering teams will resist anything that interferes with their dev environment availability. The right approach is automation that scales these environments down during off-hours and back up before they're needed, with engineering control over which environments are eligible.
804 </p>
805
806 <h3>4. Legacy migration patterns</h3>
807
808 <p>
809 Workloads that moved from VM-era infrastructure to Kubernetes often carry the same buffers they had on VMs. A service that was sized for a 32GB VM with headroom shows up in Kubernetes requesting 16GB per pod. Nobody re-baselined. The container is doing the same work the VM was doing, but the container infrastructure pays for the VM-era assumptions. This is invisible until someone goes looking for it.
810 </p>
811
812 <h2>Why most optimization tools don't work in BFSI</h2>
813
814 <p>
815 The waste is real and the savings are large. So why hasn't every bank already adopted a Kubernetes cost optimisation platform? Because most of the tools fail at the threshold most consumer-SaaS buyers don't even think about: security review.
816 </p>
817
818 <div class="infographic">
819 <div class="infographic-title">Why most optimization tools get blocked in BFSI</div>
820 <table class="approach-table">
821 <thead>
822 <tr>
823 <th>Constraint</th>
824 <th>Typical autonomous tool</th>
825 <th>Typical FinOps dashboard</th>
826 <th class="optops-col">What BFSI requires</th>
827 </tr>
828 </thead>
829 <tbody>
830 <tr>
831 <td class="feature">Write access to clusters</td>
832 <td>Required for execution</td>
833 <td>Not required</td>
834 <td class="optops">Forbidden in production</td>
835 </tr>
836 <tr>
837 <td class="feature">Workload metadata leaving the cluster</td>
838 <td>Often substantial telemetry</td>
839 <td>Often substantial telemetry</td>
840 <td class="optops">Metadata only, no secrets, regional residency</td>
841 </tr>
842 <tr>
843 <td class="feature">Change-management workflow</td>
844 <td>Bypassed by automation</td>
845 <td>Manual, separate from tool</td>
846 <td class="optops">Native flow through CAB or equivalent</td>
847 </tr>
848 <tr>
849 <td class="feature">Audit trail for changes</td>
850 <td>Tool-internal logs</td>
851 <td>Not applicable (no changes)</td>
852 <td class="optops">Engineering CI/CD logs as source of truth</td>
853 </tr>
854 <tr>
855 <td class="feature">Segregation of duties</td>
856 <td>Conflicts with single-tool execution</td>
857 <td>Preserved (no execution)</td>
858 <td class="optops">Preserved through advisory architecture</td>
859 </tr>
860 </tbody>
861 </table>
862 <p class="infographic-caption">The constraints aren't preferences. They're regulatory and audit requirements that determine whether a tool can run in production at all.</p>
863 </div>
864
865 <p>
866 The result is a category-wide gap. The autonomous tools that consumer-SaaS companies use happily are structurally incompatible with BFSI. The dashboard-only tools that BFSI security team
866s approve don't deliver savings on their own. So banks end up either using dashboards and not capturing the savings, or building internal optimisation programs that consume engineering capacity for years.
867 </p>
868
869 <div class="pull-quote">
870 "Most autonomous Kubernetes tools weren't designed to fail security review in BFSI. They just weren't designed to pass it. The compliance constraint wasn't an input to the architecture."
871 </div>
872
873 <h2>The advisory-first approach for BFSI</h2>
874
875 <p>
876 The architecture that works in BFSI is advisory-first by design. Not advisory as a stepping stone to autonomous. Advisory as the destination. This matters because the design choices that make a tool BFSI-ready are deep architectural commitments, not feature flags.
877 </p>
878
879 <p>
880 Five things to look for when evaluating optimisation tooling for a regulated environment:
881 </p>
882
883 <ul>
884 <li><strong>Read-only collection by default.</strong> The tool should never need write access to production clusters. Period. If write access is "optional but recommended," the tool was designed autonomous-first and you're using it against its design intent.</li>
885 <li><strong>Metadata-only telemetry.</strong> What leaves the cluster should be resource metrics and workload identifiers, not application data, secrets, or anything that triggers data residency concerns. Verify in the contract, not the marketing page.</li>
886 <li><strong>Recommendations as code, not a separate UI.</strong> The tool should produce changes that flow through your existing CI/CD as Terraform, Karpenter manifests, or equivalent. Engineering reviews and merges. Audit trails come from your version control, not the vendor's logs.</li>
887 <li><strong>No tool-side execution by default.</strong> In advisory mode the platform takes no write action against the cluster — every change is applied by your engineers through your normal deployment workflow until you explicitly enable automation.</li>
888 <li><strong>Regional or on-premises deployment options.</strong> For banks with strict data residency requirements, the tool's processing infrastructure has to support deployment in your region or, in some cases, fully on-premises. SaaS-only is a non-starter for some institutions.</li>
889 </ul>
890
891 <div class="key-point">
892 <div class="key-point-label">A useful evaluation question</div>
893 <p>Ask the vendor what percentage of their BFSI customers run their tool in autonomous mode versus advisory-only. If the answer is "most run autonomous eventually," the product is autonomous-first and you're buying a future migration project. If the answer is "almost all run advisory in production," the architecture matches your constraint set.</p>
894 </div>
895
896 <h2>What a BFSI optimization rollout looks like</h2>
897
898 <p>
899 The shape of an advisory-first optimisation programme in BFSI is different from what consumer-SaaS rollouts look like. Worth describing concretely so the timeline isn't a surprise.
900 </p>
901
902 <p>
903 Week one: install in advisory mode in a non-production environment. Validate the architecture with security and platform engineering. Confirm what data leaves the cluster, where it's processed, and how the audit trail works. This is the conversation that takes a week or two at a consumer-SaaS company and three to six weeks at a bank. Plan for the longer cycle.
904 </p>
905
906 <p>
907 Weeks three to six: extend to production observation. The AI starts learning workload patterns. First recommendations arrive within 24-48 hours, but the recommendations get materially better as the platform observes traffic across business cycles, month-end batch processing, quarter-end reconciliation, peak transaction periods. Don't act on recommendations from the first week. Wait for at least one full business cycle.
908 </p>
909
910 <p>
911 Weeks seven onwards: progressive implementation through your existing change-management workflow. Engineering reviews recommendations during normal sprint planning. Changes flow through CI/CD with the same approvals and audit trail as any other production change. The optimisation tool never touches production directly.
912 </p>
913
914 <p>
915 Most BFSI customers see meaningful savings within 60-90 days from initial install, with the curve continuing to compound over the next two to three quarters as the AI learns more workload patterns and engineering processes more recommendations through their normal workflow.
916 </p>
917
918 <h2>Where OptOps.ai fits</h2>
919
920 <p>
921 OptOps.ai is built for exactly this environment. Read-only by default. Metadata only, no secrets transmitted, no write access required. Recommendations flow through your existing CI/CD as code changes engineering reviews and merges. The platform never executes against production. Audit trails come from your version control, not ours.
922 </p>
923
924 <p>
925 We currently work with a major government contractor, and public-sector organisations are piloting our platform. The compliance-aware architecture is the reason. Banks evaluating optimisation tooling should look at <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">how OptOps.ai compares to other Kubernetes cost optimisation platforms</a> for the head-to-head version.
926 </p>
927
928 </div>
929
930<div class="post-cta">
931 <h3>Built for banks. Designed to pass security review.</h3>
932 <p>OptOps.ai installs in 15 minutes in advisory mode. Read-only collection. Metadata only. No write access required. Designed from day one for environments where compliance is the lead constraint.</p>
933 <div class="post-cta-buttons">
934 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
935 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
936 </div>
937 </div>
938
939<div class="faq-section">
940 <h2>Frequently asked questions</h2>
941
942 <div class="faq-item">
943 <div class="faq-q">Why is Kubernetes cost optimization different in BFSI environments?</div>
944 <p class="faq-a">Banking, financial services, and insurance environments operate under regulatory regimes, RBI guidelines in India, PCI-DSS, SOC 2, ISO 27001, GDPR, and similar, that c
944onstrain how third-party tools can interact with production infrastructure. <strong>Optimization tools that require write access to clusters typically fail security review.</strong> Tools that transmit workload metadata to external services trigger data residency concerns. And every change in production has to flow through formal change-management processes (CAB approvals, ticket-based workflows, audit trails). Kubernetes cost optimization in BFSI requires architectures designed around these constraints, not optimization tools retrofitted to work around them.</p>
945 </div>
946
947 <div class="faq-item">
948 <div class="faq-q">Can banks use autonomous Kubernetes optimization tools?</div>
949 <p class="faq-a"><strong>Most banks cannot use autonomous Kubernetes optimization tools in production.</strong> Autonomous tools require write access to clusters and take execution actions without explicit human approval, a pattern that conflicts with the change-management discipline, segregation-of-duties requirements, and audit obligations that BFSI organisations operate under. Some banks deploy autonomous tools in non-production environments for analysis, but production optimisation almost always runs on advisory-first architectures.</p>
950 </div>
951
952 <div class="faq-item">
953 <div class="faq-q">What are the biggest sources of Kubernetes waste in banking environments?</div>
954 <p class="faq-a"><strong>BFSI Kubernetes clusters typically waste 40-60% of provisioned capacity</strong>, driven by four main factors. First, conservative over-provisioning by engineering teams operating under strict SLO requirements. Second, redundant capacity for disaster recovery and high-availability architectures. Third, idle development and staging environments mirroring production. Fourth, legacy migration patterns where workloads sized for VM-era infrastructure carry the same buffers into Kubernetes deployments. Each source requires a different optimisation approach, but all are addressable without compromising compliance.</p>
955 </div>
956
957 <div class="faq-item">
958 <div class="faq-q">How do data residency requirements affect Kubernetes cost optimization?</div>
959 <p class="faq-a">Data residency rules require that customer data, regulated metadata, and workload-identifying information stay within specified geographic boundaries. <strong>Many Kubernetes optimization tools transmit telemetry, configuration, or workload metadata to external SaaS services for analysis</strong>, which can trigger data residency concerns even if no customer data is involved. BFSI buyers should evaluate tools on what data leaves the cluster, where it's processed, and whether the architecture supports regional or on-premises deployment for organisations with strict residency requirements.</p>
960 </div>
961
962 <div class="faq-item">
963 <div class="faq-q">Is OptOps.ai suitable for BFSI environments?</div>
964 <p class="faq-a">Yes. <strong>OptOps.ai is purpose-built for regulated environments.</strong> The architecture is read-only by default, collects metadata only (no secrets transmitted), and operates in advisory mode that preserves change-management workflows. There's no write access required to start, automation is strictly opt-in per capability, and operation is audit-friendly by design. We currently work with a major government contractor and public-sector organisations, alongside our work with regulated SaaS and BFSI prospects.</p>
965 </div>
966 </div>
967`,z3=`<div class="tldr-box">
968 <div class="tldr-label">The short version</div>
969 <ul class="tldr-list">
970 <li><strong>Engineers don't ignore cost recommendations because they don't care.</strong> They ignore them because the incentive structure punishes the work and rewards leaving things alone.</li>
971 <li><strong>Three things are usually broken at once:</strong> bandwidth (no time), trust (recommendations miss workload context), and incentives (cost isn't on engineering OKRs).</li>
972 <li><strong>Yelling at engineers won't fix this.</strong> Fixing the incentive structure, the trust gap, and the friction of acting on recommendations will.</li>
973 </ul>
974 </div>
975
976<div class="post-body">
977
978 <p>
979 A finance leader in a meeting last week. Frustrated. "Our cloud bill is up 40% year over year. We bought a FinOps tool. It generates dozens of recommendations every quarter. Engineering doesn't do anything with them. What's going on?"
980 </p>
981
982 <p>
983 The answer is in the room, but nobody wants to say it out loud. Engineering isn't ignoring the recommendations because they don't care. They're ignoring them because the system rewards exactly that behaviour. And until somebody fixes the system, the recommendations will keep sitting in the backlog while the bill keeps climbing.
984 </p>
985
986 <p>
987 Not "engineers are lazy." Not "we need to communicate the cost message better." The actual mechanics of why this keeps happening, in every organisation, across every industry. The pattern is the same.
988 </p>
989
990 <h2>Reason one: bandwidth that nobody is willing to defend</h2>
991
992 <p>
993 Engineering roadmaps are full. Customer features. Reliability work. Security commitments. Platform migrations. Whatever the company strategy demands. Every quarter, engineering leaders sit in planning meetings and prioritise. The work that ships is the work the business has agreed is most important.
994 </p>
995
996 <p>
997 What's almost never on that list: cost optimization. It's important but never urgent. It loses to whatever's on fire this week. It loses to whatever's customer-facing. It loses to anything with an SLO attached. It's the kind of work that everyone agrees should happen and nobody is willing to defend in roadmap planning.
998 </p>
999
1000 <p>
1001 So the FinOps dashboard generates 47 recommendations this quarter. The engineering team has 12 weeks of capacity. Which of the 47 makes it into the sprint? Usually zero. Maybe two if there's a CFO escalation. The other 45 roll over to next quarter. Where the cycle repeats.
1002 </p>
1003
1004 <p>
1005 This isn't a willpower problem. It's a math problem. And it doesn't get solved by engineering leaders trying harder to "make time for cost work." It gets solved by either reducing the cost of acting on a recommendation (so it fits inside other work) or making cost a first-class roadmap priority (so it gets defended like other priorities). Most companies do neither.
1006 </p>
1007
1008 <h2>Reason two: recommendations engineers don't trust</h2>
1009
1010 <p>
1011 This is the part FinOps tools don't like to admit. Most cost optimisation recommendations are generated by static algorithms looking at historical utilisation data. The recommendation says "reduce this pod's memory request from 4GB to 1.2GB." It looks like solid analysis. The engineer reading it knows things the algorithm doesn't.
1012 </p>
1013
1014 <p>
1015 They know this service has a quarterly batch job that legitimately spikes memory for a few hours. They know the database client connection pool grows during traffic peaks. They know last time someone aggressively rightsized this exact workload, it OOM-killed during a Tuesday evening market open and somebody had to get paged at 11pm. The recommendation is technically correct on the historical data. The engineer reading it knows the historical data isn't the whole picture.
1016 </p>
1017
1018 <p>
1019 So they hesitate. And hesitation in production usually means doing nothing. Because the cost of being wrong on the low side is visible, immediate, and falls on the engineer who applied the change. The cost of being wrong on the high side is invisible, gradual, and falls on a finance budget the engineer doesn't manage.
1020 </p>
1021
1022 <div class="pull-quote">
1023 "Engineers ignoring cost recommendations isn't a culture problem. It's the rational response to recommendations that don't reflect how engineers evaluate production risk."
1024 </div>
1025
1026 <p>
1027 The fix here isn't lecturing engineers about being more cost-conscious. It's giving them recommendations that understand workload context. Recommendations that account for the batch job, the connection pool, the burst patterns, the SLO tier. Recommendations the engineer reads and thinks "yes, this is right" instead of "the dashboard is missing something."
1028 </p>
1029
1030 <h2>Reason three: incentives that don't align with what's being asked</h2>
1031
1032 <p>
1033 This is the deepest part of the problem and the part finance teams understand least. Engineering performance is measured against three things in most organisations: features shipped, reliability outcomes, and team health metrics. Cloud cost is almost never one of them. There's no engineer at most companies whose performance review includes "reduced AWS spend by 12%."
1034 </p>
1035
1036 <p>
1037 So when a FinOps team sends recommendations to engineering, they're asking engineers to do work that isn't measured, doesn't show up in their performance review, doesn't get credit at promotion time, and carries production risk if it goes wrong. The rational response is to deprioritise it. Not because engineers don't care about the company's cost structure. Because the system has told them, through every signal that matters, that this isn't the work they're being paid to do.
1038 </p>
1039
1040 <p>
1041 The companies that move on this don't do it through better dashboards or louder Slack messages. They do it by changing what gets measured. Cloud cost shows up in engineering OKRs alongside reliability. Team-level dashboards include cost-per-customer-action or cost-per-deploy as first-class metrics. Engineers who reduce spend get recognised the same way engineers who improve latency get recognised. The system catches up to the message.
1042 </p>
1043
1044 <h2>What an honest fix looks like</h2>
1045
1046 <p>
1047 The pattern across all three reasons is the same: this isn't a culture problem, it's a structural problem. Engineers will act on cost recommendations when the recommendations are trustworthy, when acting on them doesn't cost a sprint, and when the work is counted toward what they're being measured on.
1048 </p>
1049
1050 <div class="infographic">
1051 <div class="infographic-title">What changes engineering behaviour on cost</div>
1052 <svg class="infographic-svg" viewBox="0 0 800 280" xmlns="http://www.w3.org/2000/svg">
1053 <defs>
1054 <linearGradient id="problemGrad" x1="0%" y1="0%" x2="100%" y2="0%">
1055 <stop offset="0%" stop-color="#FEF3C7" stop-opacity="0.6"/>
1056 <stop offset="100%" stop-color="#FEF3C7" stop-opacity="0.2"/>
1057 </linearGradient>
1058 <linearGradient id="fixGrad" x1="0%" y1="0%" x2="100%" y2="0%">
1059 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.18"/>
1060 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.05"/>
1061 </linearGradient>
1062 </defs>
1063
1064 <rect x="20" y="20" width="370" height="76" rx="8" fill="url(#problemGrad)" stroke="#D97706" stroke-width="1.5"/>
1065 <text x="40" y="48" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.2">PROBLEM 01, BANDWIDTH</text>
1066 <text x="40" y="72" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Engineering roadmaps are full</text>
1067 <text x="40" y="89" font-family="Plus Jakarta Sans, sans-serif" font-size="12" fill="#5C5C70">Cost work loses to features, reliability, security</text>
1068
1069 <line x1="395" y1="58" x2="410" y2="58" stroke="#7C3AED" stroke-width="2"/>
1070 <polygon points="408,53 418,58 408,63" fill="#7C3AED"/>
1071
1072 <rect x="420" y="20" width="360" height="76" rx="8" fill="url(#fixGrad)" stroke="#7C3AED" stroke-width="1.5"/>
1073 <text x="440" y="48" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.2">FIX</text>
1074 <text x="440" y="72" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Reduce cost-of-acting per recommendation</text>
1075 <text x="440" y="89" font-family="Plus Jakarta Sans, sans-serif" font-size="12" fill="#5C5C70">Code-level changes through existing CI/CD</text>
1076
1077 <rect x="20" y="110" width="370" height="76" rx="8" fill="url(#problemGrad)" stroke="#D97706" stroke-width="1.5"/>
1078 <text x="40" y="138" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.2">PROBLEM 02, TRUST</text>
1079 <text x="40" y="162" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Recommendations miss workload context</text>
1080 <text x="40" y="179" font-family="Plus Jakarta Sans, sans-serif" font-size="12" fill="#5C5C70">Static algorithms vs. real production patterns</text>
1081
1082 <line x1="395" y1="148" x2="410" y2="148" stroke="#7C3AED" stroke-width="2"/>
1083 <polygon points="408,143 418,148 408,153" fill="#7C3AED"/>
1084
1085 <rect x="420" y="110" width="360" height="76" rx="8" fill="url(#fixGrad)" stroke="#7C3AED" stroke-width="1.5"/>
1086 <text x="440" y="138" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.2">FIX</text>
1087 <text x="440" y="162" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Workload-aware AI that learns the patterns</text>
1088 <text x="440" y="179" font-family="Plus Jakarta Sans, sans-serif" font-size="12" fill="#5C5C70">Burst behaviour, SLO tier, batch cycles</text>
1089
1090 <rect x="20" y="200" width="370" height="76" rx="8" fill="url(#problemGrad)" stroke="#D97706" stroke-width="1.5"/>
1091 <text x="40" y="228" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.2">PROBLEM 03, INCENTIVES</text>
1092 <text x="40" y="252" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Cost work isn't on engineering OKRs</text>
1093 <text x="40" y="269" font-family="Plus Jakarta Sans, sans-serif" font-size="12" fill="#5C5C70">No credit for the work that gets done</text>
1094
1095 <line x1="395" y1="238" x2="410" y2="238" stroke="#7C3AED" stroke-width="2"/>
1096 <polygon points="408,233 418,238 408,243" fill="#7C3AED"/>
1097
1098 <rect x="420" y="200" width="360" height="76" rx="8" fill="url(#fixGrad)" stroke="#7C3AED" stroke-width="1.5"/>
1099 <text x="440" y="228" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.2">FIX</text>
1100 <text x="440" y="252" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Cost as a first-class engineering metric</text>
1101 <text x="440" y="269" font-family="Plus Jakarta Sans, sans-serif" font-size="12" fill="#5C5C70">In OKRs, dashboards, performance reviews</text>
1102 </svg>
1103 <p class="infographic-caption">Each problem requires a different fix. None of them are about engineers caring more. All of them are about the system catching up.</p>
1104 </div>
1105
1106 <p>
1107 The first two are tooling problems. The third one is an organisational problem. Tools can solve the first two. The third one is on leadership.
1108 </p>
1109
1110 <h2>What this looks like when it works</h2>
1111
1112 <p>
1113 The companies that have closed this gap have done a specific set of things. Not all at once, usually. But all of them eventually.
1114 </p>
1115
1116 <p>
1117 They've made cost a first-class metric in engineering dashboards. Not a quarterly report finance sends to the CTO. A live metric engineers see alongside latency and error rate, broken down by service and team. Visible to the people making the decisions.
1118 </p>
1119
1120 <p>
1121 They've put cost goals into team-level OKRs. Not "reduce cloud spend by 30%", that's too abstract. Specific things like "reduce cost-per-active-user by 15%" or "improve cluster utilization from 35% to 60%." Goals engineers can plan against and track.
1122 </p>
1123
1124 <p>
1125 They've invested in tooling that closes the trust gap. Workload-aware recommendations that engineers trust. Recommendations that arrive as code changes through normal CI/CD, not as PDF reports nobody reads. Read-only by default so the platform never overrides production decisions.
1126 </p>
1127
1128 <p>
1129 And they've stopped treating engineer behaviour as the problem. The conversations shifted from "why don't engineers care about cost" to "why have we made caring about cost so expensive for engineers." Different question. Different answer.
1130 </p>
1131
1132 <div class="key-point">
1133 <div class="key-point-label">A useful test</div>
1134 <p>If your FinOps team's recommendations consistently sit in the backlog, ask three questions before blaming engineering culture. (1) How many hours of engineering capacity does the average recommendation cost to implement? (2) What percentage of recommendations would the engineer who reads them would trust without further investigation? (3) Does cost optimization show up anywhere in engineering OKRs or performance reviews? If the answer to all three is "we don't really know," the gap isn't culture. It's structure.</p>
1135 </div>
1136
1137 <h2>Where OptOps.ai fits in this picture</h2>
1138
1139 <p>
1140 OptOps.ai doesn't change your incentive structure. That's an organisational decision, not a tooling decision. What it does is remove the practical friction that makes cost optimization expensive for engineering teams.
1141 </p>
1142
1143 <p>
1144 Recommendations arrive as workload-aware code changes engineers can review and merge through normal CI/CD. ROI is attached to every change so the impact of acting is visible. The trust gap closes because the AI understands workload context, burst patterns, SLO tiers, batch cycles. Read-only by default. Production decisions stay with engineering.
1145 </p>
1146
1147 <p>
1148 The cost of acting on a recommendation drops from "find the manifest, investigate the workload, calculate the safe range, write the change, get review, deploy, monitor" to "review the proposed PR, merge if it looks right." That's not a small change. That's the difference between recommendations sitting in a backlog forever and recommendations being applied during normal sprint work. We've written more about how this fits with <a href="/resources/blogs/finops-dashboards-dont-save-money">FinOps dashboards</a> if you want the deeper version.
1149 </p>
1150
1151 </div>
1152
1153<div class="post-cta">
1154 <h3>Make cost recommendations engineers act on.</h3>
1155 <p>OptOps.ai installs in 15 minutes. Recommendations arrive as workload-aware code changes through your existing CI/CD. Read-only by default. Engineering keeps full control of what gets applied.</p>
1156 <div class="post-cta-buttons">
1157 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
1158 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
1159 </div>
1160 </div>
1161
1162<div class="faq-section">
1163 <h2>Frequently asked questions</h2>
1164
1165 <div class="faq-item">
1166 <div class="faq-q">Why don't engineering teams act on cost optimization recommendations?</div>
1167 <p class="faq-a"><strong>It's almost never about awareness or laziness.</strong> The most common reasons are bandwidth (engineering roadmaps are full of customer-facing work), trust (recommendations from generic algorithms often miss workload context engineers know matters), risk (rightsizing wrong causes throttling or OOM kills in production, and that risk falls on the engineer who applied the change), and incentive misalignment (engineers are usually measured on shipping features and reliability, not on cost reduction). Until those structural issues are addressed, recommendations will keep sitting in the backlog.</p>
1168 </div>
1169
1170 <div class="faq-item">
1171 <div class="faq-q">How do you get engineering teams to care about cloud cost?</div>
1172 <p class="faq-a"><strong>Most engineering teams already care about cloud cost.</strong> They just don't have the time, the trustworthy recommendations, or the incentive structure to act on what they know. Three things change behaviour: making cost a first-class metric in engineering dashboards alongside latency and reliability, providing recommendations that are precise and workload-aware enough to trust, and adjusting team-level OKRs to include cost-efficiency goals so the work is recognised when it's done.</p>
1173 </div>
1174
1175 <div class="faq-item">
1176 <div class="faq-q">What's the role of FinOps in engineering teams?</div>
1177 <p class="faq-a">FinOps as a function helps bridge engineering and finance, providing cost visibility, driving accountability, and shaping organisational incentives. But <strong>FinOps teams typically don't ship code or modify production workloads.</strong> They produce reports and recommendations that engineering teams have to act on. The most effective FinOps programs combine strong reporting with tooling that makes acting on re
1177commendations easy and safe for engineers, closing the gap between insight and execution.</p>
1178 </div>
1179
1180 <div class="faq-item">
1181 <div class="faq-q">Are engineers responsible for cloud cost?</div>
1182 <p class="faq-a">In most organisations, engineering teams have the most leverage over cloud cost, they make the architectural decisions, write the resource specs, and ship the workloads, but they're rarely held formally accountable for cost outcomes. <strong>The incentive systems usually reward shipping features and maintaining reliability, not optimising spend.</strong> Until cloud cost shows up in engineering OKRs and team-level dashboards alongside other operational metrics, the responsibility tends to be diffused and the recommendations get ignored.</p>
1183 </div>
1184
1185 <div class="faq-item">
1186 <div class="faq-q">How does OptOps.ai change the engineering incentive structure?</div>
1187 <p class="faq-a"><strong>OptOps.ai doesn't change incentives directly</strong>, that's an organisational decision. What it does is remove the practical friction that makes cost optimization expensive for engineering teams. Recommendations arrive as workload-aware code changes engineers can review and merge through their normal CI/CD. ROI is attached to every change so impact is visible. The trust gap closes because the AI understands workload context. Engineers who want to optimise can. The cost of acting on a recommendation drops from hours of investigation to minutes of review.</p>
1188 </div>
1189 </div>
1190`,R3=`<div class="tldr-box">
1191 <div class="tldr-label">The short version</div>
1192 <ul class="tldr-list">
1193 <li><strong>VPA has four production-blocking problems:</strong> pod eviction on every change, an 8-day decaying histogram that lags real traffic, conflict with HPA, and no awareness of workload type.</li>
1194 <li><strong>Fewer than 1% of organisations</strong> run VPA in full automation in production. Most deploy it in recommendation-only mode and never act on the recommendations.</li>
1195 <li><strong>The alternative isn't a better VPA.</strong> It's workload-aware AI that learns over weeks, doesn't need to evict pods to apply changes, and doesn't conflict with HPA.</li>
1196 </ul>
1197 </div>
1198
1199<div class="post-body">
1200
1201 <p>
1202 Most engineers who run Kubernetes at scale have the same VPA story. They tried it. They ran it in recommendation-only mode. They looked at what it suggested. They went "huh, that's not quite right." And they never turned it on for production. The recommendations sat in the cluster forever, ignored by the team, accomplishing nothing except occasionally generating Prometheus alerts when something fell out of sync.
1203 </p>
1204
1205 <p>
1206 This isn't a story about VPA being a bad piece of software. It's well-engineered. The team that wrote it solved a hard problem and made the code freely available. The story is about why VPA's design, the choices that made sense when it was conceived in 2018, doesn't match how production Kubernetes is operated in 2026. The mismatch is fundamental. It doesn't get fixed by a config change.
1207 </p>
1208
1209 <p>
1210 Worth walking through what's broken, because the same patterns show up in any rightsizing tool that wasn't built for modern production constraints.
1211 </p>
1212
1213 <h2>What VPA does</h2>
1214
1215 <p>
1216 VPA has three modes, and the differences matter.
1217 </p>
1218
1219 <p>
1220 In <code>Off</code> mode, VPA observes resource consumption and writes recommendations to a custom resource called <code>VerticalPodAutoscaler</code>. Nothing changes in the cluster. Engineers can read the recommendations and apply them manually. This is how most teams run VPA.
1221 </p>
1222
1223 <p>
1224 In <code>Initial</code> mode, VPA sets resource requests when pods are first created, but doesn't modify them after. Useful for batch jobs and short-lived workloads. Rarely useful for long-running services.
1225 </p>
1226
1227 <p>
1228 In <code>Auto</code> mode, VPA continuously adjusts resource requests by evicting pods and recreating them with the new specs. This is the mode that delivers actual savings. It's also the mode that fewer than 1% of organisations run in production.
1229 </p>
1230
1231 <p>
1232 The reason that adoption number is so low is the technical core of this post. Worth understanding each blocking issue separately.
1233 </p>
1234
1235 <h2>Problem one: eviction is a production tax</h2>
1236
1237 <p>
1238 To apply a resource change, VPA evicts the pod and lets the deployment c
1238ontroller recreate it with the new specs. There's no in-place resize. There's no rolling adjustment. The pod gets killed. A new one starts up.
1239 </p>
1240
1241 <p>
1242 For a stateless API behind a load balancer with proper readiness probes, this is mostly fine. The new pod takes a few seconds to start. Traffic shifts to other replicas. Customers don't notice. For everything else, stateful workloads, slow-startup applications, services with warm caches, anything with connection-pool state, anything customers are connected to with long-lived sessions, eviction is a real cost.
1243 </p>
1244
1245 <pre><code># What VPA does to apply a change to a 4-replica deployment:
1246# Time Action
1247# 00:00 Evict pod-1 (3 replicas remaining, traffic shifts)
1248# 00:30 pod-1 recreated with new resources (4 replicas)
1249# 05:00 Evict pod-2 (3 replicas remaining)
1250# 05:30 pod-2 recreated
1251# 10:00 Evict pod-3
1252# 10:30 pod-3 recreated
1253# 15:00 Evict pod-4
1254# 15:30 pod-4 recreated
1255# Total: 4 service interruptions to apply one rightsizing decision</code></pre>
1256
1257 <p>
1258 For a workload with bursty traffic patterns or warm-up requirements (JVM applications, ML model servers, anything with significant cold-start cost), the eviction cycle erases most of the savings VPA was trying to deliver. Engineers measure this once, see the impact, and decide that automated rightsizing isn't worth it.
1259 </p>
1260
1261 <p>
1262 Kubernetes 1.27 introduced <code>InPlacePodVerticalScaling</code>, a feature that allows resource changes without pod recreation. It's still alpha as of mid-2026, hasn't been promoted to GA, and isn't enabled by default in any major managed Kubernetes service. VPA doesn't use it. Whenever it does become production-ready, the eviction problem will be smaller. It's not solved yet.
1263 </p>
1264
1265 <h2>Problem two: the algorithm lags real traffic</h2>
1266
1267 <p>
1268 VPA's recommendation algorithm uses a decaying histogram with a half-life of approximately 24 hours and an effective window of 8 days. Recent observations carry more weight than older ones, which sounds reasonable until you think about what that means in production.
1269 </p>
1270
1271 <div class="infographic">
1272 <div class="infographic-title">How VPA weights observations across an 8-day window</div>
1273 <svg class="infographic-svg" viewBox="0 0 800 240" xmlns="http://www.w3.org/2000/svg">
1274 <defs>
1275 <linearGradient id="weightGrad" x1="0%" y1="0%" x2="100%" y2="0%">
1276 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.7"/>
1277 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.05"/>
1278 </linearGradient>
1279 </defs>
1280 
1281 <line x1="60" y1="200" x2="740" y2="200" stroke="#8A8A9C" stroke-width="1.5"/>
1282 <line x1="60" y1="40" x2="60" y2="200" stroke="#8A8A9C" stroke-width="1.5"/>
1283 
1284 <path d="M 60 60 Q 200 80, 280 120 T 460 170 T 740 195" fill="none" stroke="#7C3AED" stroke-width="2.5"/>
1285 <path d="M 60 60 Q 200 80, 280 120 T 460 170 T 740 195 L 740 200 L 60 200 Z" fill="url(#weightGrad)"/>
1286 
1287 <line x1="145" y1="200" x2="145" y2="205" stroke="#8A8A9C" stroke-width="1"/>
1288 <text x="145" y="220" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="middle">Today</text>
1289 <text x="145" y="235" font-family="JetBrains Mono, monospace" font-size="10" fill="#7C3AED" text-anchor="middle" font-weight="700">100%</text>
1290 <line x1="230" y1="200" x2="230" y2="205" stroke="#8A8A9C" stroke-width="1"/>
1291 <text x="230" y="220" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="middle">Day -1</text>
1292 <text x="230" y="235" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="middle">~50%</text>
1293 <line x1="315" y1="200" x2="315" y2="205" stroke="#8A8A9C" stroke-width="1"/>
1294 <text x="315" y="220" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="middle">Day -2</text>
1295 <text x="315" y="235" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="middle">~25%</text>
1296 <line x1="485" y1="200" x2="485" y2="205" stroke="#8A8A9C" stroke-width="1"/>
1297 <text x="485" y="220" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="middle">Day -4</text>
1298 <text x="485" y="235" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="middle">~6%</text>
1299 <line x1="685" y1="200" x2="685" y2="205" stroke="#8A8A9C" stroke-width="1"/>
1300 <text x="685" y="220" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="middle">Day -8</text>
1301 <text x="685" y="235" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="middle">~0.4%</text>
1302 
1303 <text x="50" y="65" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="end">High weight</text>
1304 <text x="50" y="195" font-family="JetBrains Mono, monospace" font-size="11" fill="#5C5C70" text-anchor="end">Low weight</text>
1305 </svg>
1306 <p class="infographic-caption">Day -8 observations contribute roughly 0.4% to the recommendation. That's a problem if your most expensive workloads run on weekly or monthly cycles.</p>
1307 </div>
1308
1309 <p>
1310 A workload with weekly business cycles, most batch processing, end-of-week reconciliation jobs, scheduled reporting, weekend traffic patterns, has its peak observed once every 7 days. With an 8-day decay window weighting recent observations heavily, that peak is dramatically underweighted in the recommendation. Result: VPA recommends sizing that's adequate for a typical Tuesday afternoon and inadequate for the workload's actual peak. Apply that recommendation and you OOM-kill during peak. Apply a recommendation that doesn't match real traffic, get an outage, never trust VPA again.
1311 </p>
1312
1313 <p>
1314 The same problem applies to monthly cycles (financial close, regulatory reporting), quarterly cycles (planning, reviews), and any workload with traffic that varies on cycles longer than a week. VPA's algorithm structurally cannot account for them.
1315 </p>
1316
1317 <h2>Problem three: VPA conflicts with HPA</h2>
1318
1319 <p>
1320 The Horizontal Pod Autoscaler watches a metric, typically CPU utilisation, and adds or removes replicas to keep utilisation in a target range. VPA changes the resource requests that define what utilisation means. The two interact badly.
1321 </p>
1322
1323 <p>
1324 Concrete example. HPA is configured to maintain 70% CPU utilisation across pods. Each pod requests 1 CPU. Traffic causes utilisation to climb to 80%. HPA adds replicas to bring utilisation back down. Working correctly.
1325 </p>
1326
1327 <p>
1328 Now turn on VPA. VPA observes that pods are running hot and recommends increasing the request to 1.5 CPU. The request gets bumped. Now the same actual CPU usage appears as ~53% utilisation against the new request. HPA's target is 70%. So HPA decides there's headroom and removes replicas. Now fewer pods serve the same traffic, each one runs hotter, VPA recommends another bump. The cycle c
1328ontinues. Either the cluster oscillates or the autoscalers fight each other into a steady state that's worse than either alone.
1329 </p>
1330
1331 <p>
1332 The official Kubernetes documentation explicitly warns against using VPA and HPA together on CPU or memory metrics. In practice, this means most teams running HPA, which is the vast majority of teams running production Kubernetes, can't enable VPA at all without breaking the autoscaler they depend on. There are workarounds (using HPA only on custom metrics, restricting VPA to specific resources), but they're brittle and add operational complexity.
1333 </p>
1334
1335 <h2>Problem four: no workload awareness</h2>
1336
1337 <p>
1338 VPA applies the same algorithm to every pod. A stateless API gets the same treatment as a Postgres database, the same as a Spark batch job, the same as a Redis cache, the same as a JVM application with garbage collection patterns. The histogram doesn't care.
1339 </p>
1340
1341 <p>
1342 But the right resource sizing for each of these is fundamentally different. A stateless API can be sized close to its actual usage with confidence. A Postgres database needs significant memory headroom for buffers and connection state. A JVM application needs to account for heap allocation patterns and GC overhead. A batch job needs peak-period sizing because dropping resources mid-job will fail the job.
1343 </p>
1344
1345 <p>
1346 A rightsizing algorithm that doesn't distinguish workload types will produce recommendations that work for some workloads and fail for others. The engineer reading the recommendations has to know which is which. Which means the engineer has to know more about the workloads than the algorithm does. Which means the algorithm isn't saving them work.
1347 </p>
1348
1349 <div class="pull-quote">
1350 "VPA wasn't built badly. It was built for a world where every workload looked the same. That world doesn't exist in production."
1351 </div>
1352
1353 <h2>What better looks like</h2>
1354
1355 <p>
1356 The alternative to VPA isn't a better-tuned VPA. It's an architecturally different approach that fixes the four blocking problems individually.
1357 </p>
1358
1359 <div class="infographic">
1360 <div class="infographic-title">VPA vs. modern workload-aware rightsizing</div>
1361 <table class="approach-table">
1362 <thead>
1363 <tr>
1364 <th>Capability</th>
1365 <th>Kubernetes VPA</th>
1366 <th class="optops-col">Workload-aware AI (OptOps.ai)</th>
1367 </tr>
1368 </thead>
1369 <tbody>
1370 <tr>
1371 <td class="feature">Apply changes without disruption</td>
1372 <td>Eviction required</td>
1373 <td class="optops">No eviction. Changes flow through CI/CD.</td>
1374 </tr>
1375 <tr>
1376 <td class="feature">Observation window</td>
1377 <td>~8-day decay</td>
1378 <td class="optops">Weeks to months. Captures business cycles.</td>
1379 </tr>
1380 <tr>
1381 <td class="feature">Coexist with HPA</td>
1382 <td>Conflicts on CPU/memory</td>
1383 <td class="optops">Compatible. Recommendations respect HPA setup.</td>
1384 </tr>
1385 <tr>
1386 <td class="feature">Workload-type awareness</td>
1387 <td>Generic algorithm</td>
1388 <td class="optops">Stateful, JVM, batch, cache, distinguished.</td>
1389 </tr>
1390 <tr>
1391 <td class="feature">Burst pattern handling</td>
1392 <td>Underweighted in window</td>
1393 <td class="optops">Identified and preserved as headroom.</td>
1394 </tr>
1395 <tr>
1396 <td class="feature">Production deployment</td>
1397 <td>&lt;1% in full auto</td>
1398 <td class="optops">Read-only by default. Engineering applies through CI/CD.</td>
1399 </tr>
1400 <tr>
1401 <td class="feature">SLO awareness</td>
1402 <td>None</td>
1403 <td class="optops">SLO tier informs the recommendation buffer.</td>
1404 </tr>
1405 </tbody>
1406 </table>
1407 <p class="infographic-caption">VPA wasn't built for any of the constraints that matter in production. A modern alternative has to address all of them, not improve VPA at the margin.</p>
1408 </div>
1409
1410 <p>
1411 The architectural shift is meaningful. Instead of a built-in component that observes utilisation and evicts pods, you want a system that observes the cluster from outside (read-only), learns workload behaviour over weeks (long enough to capture business cycles), produces recommendations that distinguish workload types, and integrates with engineering's existing deployment pipeline (so changes flow through CI/CD without eviction).
1412 </p>
1413
1414 <p>
1415 That's the architecture <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">OptOps.ai is built around</a>. The AI observes the cluster continuously, learns the burst patterns, batch cycles, and SLO tiers of each workload, and produces sized recommendations engineers can review and apply through Terraform, Karpenter, or whatever deployment tooling the team already uses. No eviction. No HPA conflict. No 8-day window. The recommendations get materially better as the AI observes more business cycles.
1416 </p>
1417
1418 <h2>When VPA is still the right choice</h2>
1419
1420 <p>
1421 One honest note before closing: VPA in <code>Off</code> mode (recommendation-only) on stateless dev or staging workloads is a perfectly reasonable use case. If you have a low-criticality cluster running short-lived stateless services, want a free signal about resource sizing, and can implement recommendations manually when they look right, VPA does that job fine.
1422 </p>
1423
1424 <p>
1425 The argument isn't that VPA is bad. The argument is that VPA isn't sufficient for production rightsizing in environments where the four blocking problems matter. Which is most production environments.
1426 </p>
1427
1428 <div class="key-point">
1429 <div class="key-point-label">Quick decision framework</div>
1430 <p>If you're running stateless workloads in dev/staging and want a free utilisation signal: VPA in Off mode is fine. If you're trying to rightsize production workloads with weekly or longer business cycles, HPA on CPU/memory, or any meaningful operational risk from eviction: VPA is the wrong tool. Look at workload-aware alternatives that don't carry the architectural baggage.</p>
1431 </div>
1432
1433 </div>
1434
1435<div class="post-cta">
1436 <h3>Pod rightsizing without VPA's compromises.</h3>
1437 <p>OptOps.ai installs in 15 minutes. Read-only by default. Workload-aware AI that learns over weeks, respects HPA, distinguishes workload types, and applies through your CI/CD with no eviction.</p>
1438 <div class="post-cta-buttons">
1439 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
1440 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
1441 </div>
1442 </div>
1443
1444<div class="faq-section">
1445 <h2>Frequently asked questions</h2>
1446
1447 <div class="faq-item">
1448 <div class="faq-q">What is the Kubernetes Vertical Pod Autoscaler (VPA)?</div>
1449 <p class="faq-a">The Kubernetes Vertical Pod Autoscaler is a built-in component that observes pod resource consumption over time and either recommends or applies adjustments to CPU and memory requests and limits. <strong>VPA has three modes: Off (recommendations only, applied externally), Initial (sets requests on pod creation), and Auto (continuously adjusts pods in production by evicting and recreating them with new resource specs).</strong></p>
1450 </div>
1451
1452 <div class="faq-item">
1453 <div class="faq-q">Why doesn't VPA work for production Kubernetes rightsizing?</div>
1454 <p class="faq-a"><strong>VPA has four major limitations that prevent production adoption.</strong> First, it evicts pods to apply changes, causing service disruption that's unacceptable for most production workloads. Second, the recommendation algorithm uses an 8-day decaying histogram that lags real traffic patterns. Third, it conflicts with the Horizontal Pod Autoscaler (HPA), so teams using HPA can't enable VPA without breaking horizontal scaling. Fourth, it applies the same generic algorithm to every workload type, ignoring the differences between stateless APIs, stateful databases, and batch jobs. As a result, fewer than 1% of organisations run VPA in full automation in production.</p>
1455 </div>
1456
1457 <div class="faq-item">
1458 <div class="faq-q">What is the difference between VPA and HPA?</div>
1459 <p class="faq-a">Horizontal Pod Autoscaler (HPA) adds or removes pod replicas based on observed metrics like CPU utilisation or custom metrics. Vertical Pod Autoscaler (VPA) adjusts the resource requests and limits of individual pods. <strong>HPA scales out; VPA scales up.</strong> The two cannot be used together on the same workload because they conflict, VPA adjusts the resources HPA is measuring against, breaking HPA's scaling decisions. This is one of the main reasons VPA adoption is limited.</p>
1460 </div>
1461
1462 <div class="faq-item">
1463 <div class="faq-q">What are the alternatives to VPA for pod rightsizing?</div>
1464 <p class="faq-a">The main alternatives to VPA are <strong>workload-aware optimization platforms that use machine learning to re
1464commend resource changes without VPA's eviction model or HPA conflicts.</strong> These platforms typically install with read-only access, learn workload patterns over weeks rather than relying on 8-day windows, account for traffic bursts and SLO requirements, and produce recommendations that engineering teams apply through CI/CD rather than direct cluster modifications. OptOps.ai is one example of this category.</p>
1465 </div>
1466
1467 <div class="faq-item">
1468 <div class="faq-q">How does OptOps.ai handle pod rightsizing differently from VPA?</div>
1469 <p class="faq-a">OptOps.ai is read-only by default. <strong>The AI observes pod behaviour over weeks, learns workload-specific patterns including bursts and SLO requirements, and produces precise sized recommendations with ROI estimates.</strong> Engineers apply changes through their existing CI/CD using Terraform, Karpenter, or whatever deployment tooling they already use. There's no eviction. No conflict with HPA. No write access required. Recommendations get materially better as the AI observes more business cycles.</p>
1470 </div>
1471 </div>
1472`,M3=`<div class="tldr-box">
1473 <div class="tldr-label">The short version</div>
1474 <ul class="tldr-list">
1475 <li><strong>Government Kubernetes clusters often run at 20-35% utilisation</strong>, meaningfully worse than commercial environments, because procurement cycles size capacity for projected peaks years out.</li>
1476 <li><strong>The constraints that block commercial optimization tools are amplified in government:</strong> sovereignty rules, accreditation processes, sustainability mandates, and public spending accountability.</li>
1477 <li><strong>Advisory-first architectures with metadata-only collection</strong> are usually the only platforms that can pass government accreditation while still delivering meaningful savings.</li>
1478 </ul>
1479 </div>
1480
1481<div class="post-body">
1482
1483 <p>
1484 The conventional wisdom is that government infrastructure runs leaner than commercial because budgets are scrutinised. The actual data tells a different story. Government Kubernetes deployments are often the most over-provisioned in the entire market, with utilisation routinely sitting in the 20-35% range when commercial environments are landing at 40-50%. The gap isn't because public-sector engineers are less skilled. It's because the structural conditions that govern public-sector procurement and operations push hard in the opposite direction from commercial cost discipline.
1485 </p>
1486
1487 <p>
1488 For anyone working in or selling to government Kubernetes environments, the unique constraints matter. Tools and playbooks that deliver in commercial settings often fail in public-sector contexts for reasons that aren't visible from the outside. Worth understanding what's different.
1489 </p>
1490
1491 <h2>Why public-sector clusters waste more</h2>
1492
1493 <p>
1494 Three structural causes drive over-provisioning in government Kubernetes, and they're not the same causes as in commercial environments. Each one has a different fix.
1495 </p>
1496
1497 <h3>Procurement cycles that outrun usage</h3>
1498
1499 <p>
1500 Public-sector capacity gets procured through multi-year tenders. A government department signing a five-year cloud commitment in 2024 is sizing for projected workload in 2029, not what they're running today. The contract gets sized for the peak demand someone modelled three years before deployment, with safety buffers added at every approval layer. Two years later, actual demand looks nothing like the projection, usually significantly lower, but the capacity has already been committed and paid for.
1501 </p>
1502
1503 <p>
1504 The waste here isn't bad engineering. It's structural mismatch between procurement timeframes and how cloud workloads evolve. Fixing it requires either shorter procurement cycles (politically hard) or optimisation tooling that adapts capacity to actual usage within the procurement envelope.
1505 </p>
1506
1507 <h3>High reliability mandates with low capacity-failure tolerance</h3>
1508
1509 <p>
1510 A consumer SaaS company that has a brief outage during a traffic spike loses some money and gets a few angry tweets. A government department that fails to deliver a citizen-facing service has a parliamentary question to answer. The risk asymmetry is dramatic, and engineering teams in government respond rationally by sizing aggressively for hypothetical peaks. Three times the actual usage is normal. Five times happens. The buffer keeps existing because the political cost of removing it exceeds the visible financial cost of keeping it.
1511 </p>
1512
1513 <h3>Idle capacity with diffuse ownership</h3>
1514
1515 <p>
1516 A development environment in a commercial company eventually gets shut down because someone is held accountable for cloud spend. A development environment in a government department often runs for years past its useful life because no single person has clear authority to decommission it, and the cost gets diffused across budget lines that aren't directly visible. The result: government clusters carry significantly more idle non-production capacity than commercial environments at similar workload sizes.
1517 </p>
1518
1519 <h2>The constraint stack that blocks commercial tools</h2>
1520
1521 <p>
1522 Government environments operate under a stack of constraints that commercial Kubernetes optimisation tools typically don't account for. Each one independently can disqualify a tool from deployment. The combination disqualifies most of the market.
1523 </p>
1524
1525 <h3>Data sovereignty</h3>
1526
1527 <p>
1528 Many government workloads operate under sovereignty rules that require data, including operational metadata, to remain within specific national or regional jurisdictions. A Kubernetes optimisation tool that processes workload telemetry through a SaaS service hosted outside the sovereign region triggers immediate concerns, even if no citizen data is involved. Some agencies require the tool's processing infrastructure to run on-premises or in a sovereign cloud region. Most commercial tools don't offer that deployment option.
1529 </p>
1530
1531 <h3>Accreditation and certification</h3>
1532
1533 <p>
1534 Government cloud environments typically operate under formal accreditation regimes, FedRAMP in the US, IRAP in Australia, ISMS in India, BSI C5 in Germany, and equivalent frameworks elsewhere. Any tool that runs in these environments has to either hold the relevant accreditation itself or demonstrate that its operation doesn't compromise the accreditation of the underlying infrastru
1534cture. For a tool that takes write actions on production clusters, this is a high bar. For a tool that operates read-only with metadata-only collection, it's a meaningfully lower one.
1535 </p>
1536
1537 <h3>Sustainability and energy mandates</h3>
1538
1539 <p>
1540 Government IT increasingly operates under sustainability mandates, carbon reduction commitments, energy efficiency targets, green procurement preferences. Kubernetes optimisation in this context isn't just about cost. Reducing idle compute is also reducing carbon footprint. A 30% utilisation improvement translates directly into reduced energy consumption. Optimisation platforms that can document this benefit have a procurement advantage that commercial tools don't think to claim.
1541 </p>
1542
1543 <h3>Public spending accountability</h3>
1544
1545 <p>
1546 Every dollar of government cloud spend is, at least theoretically, subject to public scrutiny. Audits, parliamentary questions, freedom-of-information requests, the spending decision has to be defensible long after it was made. This shifts what counts as a good optimisation. A tool that delivers savings but can't produce a clear audit trail of what it changed and why is harder to deploy than a tool that delivers smaller savings with full documentation. The optimisation methodology becomes part of the procurement decision, not just the results.
1547 </p>
1548
1549 <div class="infographic">
1550 <div class="infographic-title">Why most commercial tools fail government accreditation</div>
1551 <table class="approach-table">
1552 <thead>
1553 <tr>
1554 <th>Constraint</th>
1555 <th>Typical commercial tool</th>
1556 <th class="optops-col">What government requires</th>
1557 </tr>
1558 </thead>
1559 <tbody>
1560 <tr>
1561 <td class="feature">Data sovereignty</td>
1562 <td>SaaS, often US- or EU-hosted</td>
1563 <td class="optops">Sovereign region or on-premises deployment</td>
1564 </tr>
1565 <tr>
1566 <td class="feature">Cluster access</td>
1567 <td>Write access often required</td>
1568 <td class="optops">Read-only, metadata only</td>
1569 </tr>
1570 <tr>
1571 <td class="feature">Accreditation</td>
1572 <td>Variable; often pending</td>
1573 <td class="optops">Operates within existing accredited boundary</td>
1574 </tr>
1575 <tr>
1576 <td class="feature">Audit trail</td>
1577 <td>Internal vendor logs</td>
1578 <td class="optops">Engineering CI/CD logs as source of truth</td>
1579 </tr>
1580 <tr>
1581 <td class="feature">Sustainability impact</td>
1582 <td>Cost-only framing</td>
1583 <td class="optops">Cost AND carbon/energy reduction</td>
1584 </tr>
1585 <tr>
1586 <td class="feature">Procurement model</td>
1587 <td>Per-CPU subscription</td>
1588 <td class="optops">Outcome-aligned, audit-friendly</td>
1589 </tr>
1590 </tbody>
1591 </table>
1592 <p class="infographic-caption">The constraint stack isn't a preference. Each item independently can disqualify a vendor. The combination disqualifies most of the commercial Kubernetes optimisation market.</p>
1593 </div>
1594
1595 <h2>What an advisory-first approach looks like in government</h2>
1596
1597 <p>
1598 The architecture that meets these constraints is advisory-first by design. Read-only operation. Metadata-only telemetry. Recommendations as code, applied through engineering's existing change-management workflow. No tool-side execution against production. Audit trails that come from the agency's own version control and CI/CD, not from a vendor's internal logs.
1599 </p>
1600
1601 <p>
1602 This isn't a feature checklist. It's an architectural commitment. A platform built advisory-first treats public-sector deployment as core, not as a special case. The deployment model, the data flows, the operational mode, and the customer success motion all assume the constraint stack from day one. A platform built autonomous-first and retrofitted with a "government mode" usually ends up working around its own architecture in ways that show up in operations.
1603 </p>
1604
1605 <p>
1606 Worth describing what an actual government Kubernetes optimisation rollout looks like, because it's different from commercial deployments.
1607 </p>
1608
1609 <p>
1610 Discovery and accreditation phase, typically 6-12 weeks. The agency's security and compliance teams review the architecture, validate that data flows respect sovereignty boundaries, and confirm the tool operates within the existing accredited environment. This is the conversation that takes a week at a startup and three months at a government agency. Plan accordingly.
1611 </p>
1612
1613 <p>
1614 Pilot deployment in a non-production environment, typically 4-8 weeks. The platform runs against a representative workload subset. Engineers observe the recommendations. Compliance teams validate the audit trail. Procurement validates the methodology. This phase isn't about whether the savings are real, it's about whether the deployment fits the operational and compliance envelope.
1615 </p>
1616
1617 <p>
1618 Production rollout, typically 3-6 months. Recommendations flow through engineering's existing change-management workflow at the pace the agency can absorb. Most government cluster
1618s see meaningful savings within the first quarter of production deployment, with the curve compounding as the AI observes more business cycles. The total timeline from initial engagement to demonstrated savings is typically 6-12 months. Slower than commercial. Worth it because the deployment sticks.
1619 </p>
1620
1621 <div class="pull-quote">
1622 "In commercial Kubernetes, optimisation is a 90-day initiative. In government Kubernetes, it's a year-long programme. Anyone selling a faster timeline doesn't understand the procurement and accreditation reality."
1623 </div>
1624
1625 <h2>What public-sector engagements tell us</h2>
1626
1627 <p>
1628 Public-sector organisations are currently piloting OptOps.ai, including agencies whose infrastructure supports government computing programmes. The constraint stack they operate under is comprehensive: sovereignty, accreditation, audit, sustainability, and public spending accountability all apply.
1629 </p>
1630
1631 <p>
1632 The engagement matters less because of any specific savings number and more because of what it demonstrates. An advisory-first platform with metadata-only collection can pass the operational and compliance review that disqualifies most commercial optimisation tools. The architecture isn't a marketing claim, it's the precondition for being deployable in this environment at all.
1633 </p>
1634
1635 <p>
1636 For other government agencies and public-sector organisations evaluating Kubernetes cost optimisation, the practical implications are:
1637 </p>
1638
1639 <ul>
1640 <li><strong>Start with the constraint stack, not the savings story.</strong> If a platform can't articulate how it handles sovereignty, accreditation, and audit, the savings number is irrelevant.</li>
1641 <li><strong>Verify the architecture, not the marketing.</strong> Read the technical documentation. Validate that the platform operates in the way the marketing says it does. Government deployments uncover gaps that commercial deployments never see.</li>
1642 <li><strong>Plan for the timeline.</strong> Six to twelve months from initial engagement to demonstrated production savings is normal. Anyone promising 30 days hasn't worked with government procurement.</li>
1643 <li><strong>Look for sustainability documentation.</strong> A platform that can quantify the carbon impact of its optimisations has a procurement advantage in agencies operating under green IT mandates.</li>
1644 </ul>
1645
1646 <h2>Where OptOps.ai fits</h2>
1647
1648 <p>
1649 OptOps.ai is built for environments where the constraint stack is the lead concern. Read-only by default. Metadata-only collection. No write access required. Recommendations flow through engineering's existing CI/CD with audit trails coming from the agency's own version control. Regional and on-premises deployment options for agencies with strict residency requirements.
1650 </p>
1651
1652 <p>
1653 Those pilots are currently underway. We're also working with a major government contractor in production. Government agencies and public-sector organisations evaluating Kubernetes cost optimisation should look at <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">how OptOps.ai compares to other Kubernetes cost optimisation platforms</a> for the architectural details, and the BFSI playbook covers similar compliance-aware ground.
1654 </p>
1655
1656 </div>
1657
1658<div class="post-cta">
1659 <h3>Built for environments where compliance leads.</h3>
1660 <p>OptOps.ai is currently being piloted in the public sector. Read-only by default. Metadata only. Sovereign and on-premises deployment options for agencies with strict residency requirements.</p>
1661 <div class="post-cta-buttons">
1662 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
1663 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
1664 </div>
1665 </div>
1666
1667<div class="faq-section">
1668 <h2>Frequently asked questions</h2>
1669
1670 <div class="faq-item">
1671 <div class="faq-q">How is Kubernetes cost optimization different in government?</div>
1672 <p class="faq-a"><strong>Government Kubernetes environments operate under constraints that don't apply in most commercial settings:</strong>
1672 data sovereignty rules requiring infrastructure in specific geographies, multi-year procurement cycles that limit how quickly tools can be adopted, formal accreditation processes for any vendor with cluster access, sustainability and energy mandates that change the optimisation goal beyond just cost, and public accountability for spending decisions. Tools designed for commercial Kubernetes adoption often struggle to fit these constraints without architectural changes.</p>
1673 </div>
1674
1675 <div class="faq-item">
1676 <div class="faq-q">What is sovereign cloud and why does it matter for Kubernetes?</div>
1677 <p class="faq-a">Sovereign cloud refers to cloud infrastructure that operates under specific national jurisdiction with guarantees about data residency, foreign government access, and regulatory accountability. Many governments require sensitive workloads to run on sovereign cloud, sometimes from a domestic provider, sometimes a regional region of a global provider with sovereign data controls. <strong>For Kubernetes optimization, this means the optimisation tool's data processing must also respect these boundaries:</strong> workload metadata cannot leave the sovereign jurisdiction, and the platform must support deployment options that match the underlying cloud architecture.</p>
1678 </div>
1679
1680 <div class="faq-item">
1681 <div class="faq-q">Why are government Kubernetes deployments often over-provisioned?</div>
1682 <p class="faq-a">Government Kubernetes deployments are typically over-provisioned for three structural reasons. <strong>First, procurement cycles run multi-year, so capacity gets sized for projected peak demand five years out rather than current usage.</strong> Second, public-sector teams operate under high reliability mandates with limited tolerance for capacity-related outages, leading to conservative sizing. Third, idle capacity in government environments rarely has clear ownership, so it persists indefinitely. The result is that government clusters often run at 20-35% utilisation while paying for capacity sized for hypothetical peaks that never materialise.</p>
1683 </div>
1684
1685 <div class="faq-item">
1686 <div class="faq-q">Can government agencies use commercial Kubernetes optimization tools?</div>
1687 <p class="faq-a">Government agencies can use commercial Kubernetes optimization tools, but the architectural constraints are stricter than in commercial settings. <strong>Tools that require write access to clusters typically fail accreditation.</strong> Tools that send workload metadata to external SaaS services trigger sovereignty concerns. Tools without on-premises or sovereign-region deployment options are non-starters for many agencies. Advisory-first platforms with metadata-only collection and read-only operation are often the only architectures that meet the constraint set.</p>
1688 </div>
1689
1690 <div class="faq-item">
1691 <div class="faq-q">How does OptOps.ai work in government environments?</div>
1692 <p class="faq-a">OptOps.ai is built for environments where compliance is the lead constraint. <strong>Public-sector agencies are currently piloting OptOps.ai.</strong> The architecture is read-only by default, collects metadata only with no secrets transmitted, and starts in advisory mode — the platform takes no write action unless a capability is explicitly enabled. Recommendations flow through engineering's existing CI/CD, preserving change-management workflows and audit trails. Regional deployment options are available for agencies with strict residency requirements.</p>
1693 </div>
1694 </div>
1695`,q3=`<div class="tldr-box">
1696 <div class="tldr-label">The short version</div>
1697 <ul class="tldr-list">
1698 <li><strong>The Kubernetes cost stack has three layers:</strong> pods (resource requests on workloads), nodes (the underlying compute), and cloud commitments (Reserved Instances, Savings Plans, Committed Use Discounts).</li>
1699 <li><strong>Each layer wastes differently and is owned by different teams.</strong> Engineers control pods. Platform teams control nodes. Finance and procurement control commitments. The misalignment is part of the problem.</li>
1700 <li><strong>The right order to optimise is bottom-up:</strong> pods first, nodes second, commitments third. Optimising commitments before pods locks in waste you'd rather have eliminated.</li>
1701 </ul>
1702 </div>
1703
1704<div class="post-body">
1705
1706 <p>
1707 Most conversations about Kubernetes cost optimisation collapse three different things into one. People talk about "rightsizing" without specifying whether they mean the pods or the nodes. They talk about "saving money" without distinguishing between reducing demand and changing how demand is priced. The result is teams that work on cost optimisation for months, deliver real improvements at one layer, and don't see the bill move because the layer below or above absorbed all the savings.
1708 </p>
1709
1710 <p>
1711 The cost stack matters. Once you can see the three layers clearly, what each one costs, how each one wastes, who owns each one, and how the layers interact, the optimisation strategy almost designs itself. This piece is the framework. Worth understanding before any specific optimisation work.
1712 </p>
1713
1714 <h2>The three layers, defined</h2>
1715
1716 <p>
1717 Kubernetes cost lives in three distinct places. Each one is a different kind of decision, made by a different team, with a different waste pattern.
1718 </p>
1719
1720 <div class="infographic">
1721 <div class="infographic-title">The Kubernetes cost stack</div>
1722 <svg class="infographic-svg" viewBox="0 0 800 380" xmlns="http://www.w3.org/2000/svg">
1723 <defs>
1724 <linearGradient id="podLayer" x1="0%" y1="0%" x2="100%" y2="0%">
1725 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.18"/>
1726 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.06"/>
1727 </linearGradient>
1728 <linearGradient id="nodeLayer" x1="0%" y1="0%" x2="100%" y2="0%">
1729 <stop offset="0%" stop-color="#06B6D4" stop-opacity="0.18"/>
1730 <stop offset="100%" stop-color="#06B6D4" stop-opacity="0.06"/>
1731 </linearGradient>
1732 <linearGradient id="commitLayer" x1="0%" y1="0%" x2="100%" y2="0%">
1733 <stop offset="0%" stop-color="#D97706" stop-opacity="0.18"/>
1734 <stop offset="100%" stop-color="#D97706" stop-opacity="0.06"/>
1735 </linearGradient>
1736 </defs>
1737
1738 <rect x="40" y="30" width="720" height="100" rx="10" fill="url(#podLayer)" stroke="#7C3AED" stroke-width="1.5"/>
1739 <text x="60" y="60" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.5">LAYER 01, PODS</text>
1740 <text x="60" y="86" font-family="Plus Jakarta Sans, sans-serif" font-size="17" font-weight="700" fill="#0E0E1A">Resource requests on individual workloads</text>
1741 <text x="60" y="108" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Owner: Engineering teams · Waste: 2-3× over-provisioning · Visible in: Pod manifests, deployment YAML</text>
1742
1743 <line x1="400" y1="138" x2="400" y2="155" stroke="#8A8A9C" stroke-width="1.5"/>
1744 <polygon points="395,153 400,163 405,153" fill="#8A8A9C"/>
1745
1746 <rect x="40" y="170" width="720" height="100" rx="10" fill="url(#nodeLayer)" stroke="#06B6D4" stroke-width="1.5"/>
1747 <text x="60" y="200" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#06B6D4" letter-spacing="1.5">LAYER 02, NODES</text>
1748 <text x="60" y="226" font-family="Plus Jakarta Sans, sans-serif" font-size="17" font-weight="700" fill="#0E0E1A">Underlying compute the cluster autoscaler provisions</text>
1749 <text x="60" y="248" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Owner: Platform team · Waste: Poor bin-packing, wrong instance types · Visible in: Cluster autoscaler logs, node pools</text>
1750
1751 <line x1="400" y1="278" x2="400" y2="295" stroke="#8A8A9C" stroke-width="1.5"/>
1752 <polygon points="395,293 400,303 405,293" fill="#8A8A9C"/>
1753
1754 <rect x="40" y="310" width="720" height="100" rx="10" fill="url(#commitLayer)" stroke="#D97706" stroke-width="1.5"/>
1755 <text x="60" y="340" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.5">LAYER 03, CLOUD COMMITMENTS</text>
1756 <text x="60" y="366" font-family="Plus Jakarta Sans, sans-serif" font-size="17" font-weight="700" fill="#0E0E1A">Reserved Instances, Savings Plans, Committed Use Discounts</text>
1757 <text x="60" y="388" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Owner: Finance · Waste: Over-commitment to capacity not needed · Visible in: Cloud billing, contracts</text>
1758 </svg>
1759 <p class="infographic-caption">Three layers, three owners, three different waste patterns. The interactions between them are where optimisation gets interesting.</p>
1760 </div>
1761
1762 <h2>Layer one: pods</h2>
1763
1764 <p>
1765 The pod layer is where engineers declare what their workloads need. Every pod manifest specifies resource requests (the minimum the cluster guarantees) and limits (the maximum before throttling kicks in). These numbers determine how Kubernetes places pods on nodes and ultimately how much capacity gets consumed.
1766 </p>
1767
1768 <p>
1769 The waste pattern at this layer is over-provisioning. Engineers writing pod specs usually don't have weeks of production data to size against. They estimate. And because under-sizing causes immediate visible problems (throttling, OOM kills, customer errors) while over-sizing causes invisible problems (a slightly higher bill at month-end), they consistently size high. Two times what's needed is normal. Three is common. Five times happens.
1770 </p>
1771
1772 <p>
1773 Pod-level waste is the largest single source of cost in most Kubernetes environments. It's also the most addressable, because it's the layer where engineers have direct control. The fix is rightsizing, adjusting requests to match actual workload behaviour. The challenge is doing it safely, at scale, and without breaking horizontal pod autoscaling.
1774 </p>
1775
1776 <p>
1777 We've written a longer piece on <a href="/resources/blogs/kubernetes-over-provisioning-hidden-cost">why over-provisioning persists at the pod layer</a> and what fixes it.
1778 </p>
1779
1780 <h2>Layer two: nodes</h2>
1781
1782 <p>
1783 Below the pod layer sits the node layer. Nodes are the actual compute instances, EC2 instances, GCE VMs, Azure VMs, that the cluster autoscaler provisions to satisfy pod resource requests. Pods are scheduled onto nodes based on their declared requests, and nodes are added or removed based on how full the cluster is.
1784 </p>
1785
1786 <p>
1787 Three waste patterns live at the node layer. First, poor bin-packing: nodes that look "full" because pods are over-provisioned, but run at 30% real utilisation. The cluster autoscaler keeps spinning up new nodes because the scheduler operates on declared requests, not actual usage. Second, wrong instance types: workloads running on general-purpose instances when they'd be cheaper on memory-optimised or compute-optimised instances. Third, missed spot/preemptible opportunities: stateless or fault-tolerant workloads running on full-priced on-demand instances when they'd run f
1787ine on spot at 60-80% lower cost.
1788 </p>
1789
1790 <p>
1791 The node layer is owned by the platform team, the engineers running the cluster, configuring autoscalers, and making decisions about node pools and instance families. The fix here is bin-packing optimisation, instance type selection, and spot strategy. It's harder than pod-level rightsizing because the decisions are cluster-wide rather than workload-specific.
1792 </p>
1793
1794 <h3>The interaction with layer one</h3>
1795
1796 <p>
1797 Node-level optimisation is bottlenecked by pod-level over-provisioning. If pods request 2× what they need, the scheduler places them as if they need 2× the capacity, and bin-packing degrades accordingly. Even the most sophisticated bin-packing algorithm can't fix a problem that originates in the layer above. This is why the right sequence is pods first, nodes second. Optimising nodes on top of over-provisioned pods produces marginal improvements. Optimising nodes on top of right-sized pods produces structural improvements.
1798 </p>
1799
1800 <h2>Layer three: cloud commitments</h2>
1801
1802 <p>
1803 Below the node layer sits the commitment layer. Reserved Instances on AWS. Savings Plans on AWS. Committed Use Discounts on GCP. Reservations on Azure. These are pricing agreements where the customer commits to a level of compute usage for one or three years in exchange for a discount of 20-60% off on-demand pricing. Commitments don't change what the cluster does. They change what the underlying compute costs.
1804 </p>
1805
1806 <p>
1807 The waste pattern at the commitment layer is over-commitment. A finance team modelling cloud spend for next year takes the current cluster size, projects growth, adds a buffer, and commits to that capacity for a multi-year term. Then the engineering team optimises pods and nodes, actual capacity demand drops 30%, and the company is locked into commitments for capacity it no longer needs. The discount on the unused capacity doesn't help if you're paying for capacity you can't use.
1808 </p>
1809
1810 <p>
1811 The opposite pattern, under-commitment, also wastes money. If the workload is stable and the company isn't taking advantage of available commitment discounts, it's paying on-demand prices for capacity that could be discounted by 30-50%. The right commitment level is a moving target that depends on what the optimised cluster needs.
1812 </p>
1813
1814 <h3>The interaction with layers one and two</h3>
1815
1816 <p>
1817 Commitments depend on what the cluster needs, which depends on how nodes are sized, which depends on how pods are sized. Optimising commitments before the upstream layers are settled is locking in a commitment based on inflated demand. This is why the sequence matters: pods first, nodes second, commitments third. Get the order wrong and you'll spend years unwinding the commitment decision.
1818 </p>
1819
1820 <h2>Why most teams optimise wrong</h2>
1821
1822 <p>
1823 The three-layer model makes the most common optimisation mistakes obvious. Worth listing them, because every Kubernetes shop has fallen into at least one of these.
1824 </p>
1825
1826 <p>
1827 <strong>Mistake one: optimising commitments first.</strong> A finance team sees a big AWS bill, signs Reserved Instances or Savings Plans to get a discount, and locks in capacity sized for current (over-provisioned) demand. Six months later when engineering optimises pods and nodes, the company is paying for committed capacity it doesn't need. This is the most expensive mistake because commitments are hard to unwind.
1828 </p>
1829
1830 <p>
1831 <strong>Mistake two: optimising nodes without pods.</strong> A platform team installs a sophisticated cluster autoscaler, configures instance type recommendations, and tunes bin-packing, without addressing the over-provisioned pod requests that are driving the underlying capacity demand. Marginal improvements at the node layer are eaten up by the pod layer's continuing over-provisioning.
1832 </p>
1833
1834 <p>
1835 <strong>Mistake three: optimising pods without measuring impact at the node layer.</strong> Engineers right-size pods successfully, freeing up capacity at the node layer, but the cluster autoscaler doesn't immediately recognise the freed capacity, or the node pool configuration prevents consolidation. Pod-level savings exist on paper but don't translate to actual node reduction. The bill doesn't move.
1836 </p>
1837
1838 <p>
1839 <strong>Mistake four: optimising one layer at a time without considering interactions.</strong> The three layers compound. Optimising pods reduces actual demand by 30%. Optimising nodes on top of right-sized pods reduces capacity by another 20%. Optimising commitments on top of right-sized capacity captures another 25% via discount. The cumulative impact is meaningfully larger than any single layer. Most teams capture only one layer's worth of savings because they don't see the stack.
1840 </p>
1841
1842 <div class="pull-quote">
1843 "Each layer's savings compound the next. Get the order right and you capture the full stack. Get it wrong and each layer cancels out the layer above it."
1844 </div>
1845
1846 <h2>The right sequence</h2>
1847
1848 <p>
1849 Bottom-up. Always.
1850 </p>
1851
1852 <h3>Step 1, Right-size the pods</h3>
1853
1854 <p>
1855 This is the layer with the largest waste, the most leverage on downstream layers, and the most direct ownership by engineering. Get a baseline of actual workload utilisation. Identify pods requesting significantly more than they use. Apply right-sizing recommendations through your normal CI/CD process, with engineering review of each change. Don't try to do this manually at scale, use a workload-aware tool that produces precise recommendations and integrates with deployment workflows.
1856 </p>
1857
1858 <p>
1859 The goal at the pod layer is to reduce declared resource requests to roughly 1.2-1.5× actual peak usage, with appropriate buffers for SLO-critical workloads. Most teams find 30-50% reduction in declared CPU and memory requests is achievable without compromising reliability.
1860 </p>
1861
1862 <h3>Step 2, Optimise the nodes</h3>
1863
1864 <p>
1865 Once pod demand is settled, the actual capacity requirement of the cluster becomes clear. Now node-level optimisation can produce real impact. Improve bin-packing so nodes carry more pods at higher utilisation. Choose instance types that match the workload mix (general-purpose, memory-optimised, or compute-optimised). Identify workloads suitable for spot or preemptible instances and migrate them.
1866 </p>
1867
1868 <p>
1869 The goal at the node layer is to push cluster utilisation from typical 30-40% up to 60-70% on the optimised cluster. Most teams find 15-25% additional savings here on top of the pod-level work.
1870 </p>
1871
1872 <h3>Step 3, Right-size the commitments</h3>
1873
1874 <p>
1875 With pods and nodes optimised, the actual baseline capacity requirement is now visible. Commitments can be sized correctly to that baseline rather than to the over-provisioned demand the cluster started with. For workloads with stable usage, commit to the baseline and capture the discount. For workloads with growth or seasonality, commit conservatively and use on-demand or spot for the variable portion.
1876 </p>
1877
1878 <p>
1879 The goal at the commitment layer is to capture 25-40% additional savings via discount on the optimised capacity baseline, without locking into commitments that exceed actual demand. Combined with the upstream layer savings, the total stack-level impact can reach 50-60% reduction in cloud spend.
1880 </p>
1881
1882 <div class="key-point">
1883 <div class="key-point-label">The compounding math</div>
1884 <p>Pod rightsizing reduces actual demand by ~30%. Node optimisation on top of that captures another ~20% via better bin-
1884packing and instance selection. Commitment optimisation on the right-sized baseline captures another ~25% via discount. The compound effect is 0.7 × 0.8 × 0.75 = 0.42, a 58% reduction from the original spend. Optimising one layer at a time captures only one of these multipliers. Optimising in the wrong order captures less than that.</p>
1885 </div>
1886
1887 <h2>Where OptOps.ai fits</h2>
1888
1889 <p>
1890 OptOps.ai produces recommendations across all three layers, sequenced correctly. Pod-level: workload-aware rightsizing recommendations that account for burst patterns, SLO tiers, and workload type. Node-level: bin-packing improvements, instance type recommendations, spot suitability analysis, applied once pod demand is settled. Commitment-level: visibility into the optimised capacity baseline so finance and procurement can make commitment decisions on right-sized demand rather than over-provisioned demand.
1891 </p>
1892
1893 <p>
1894 The architecture is read-only by default. Recommendations flow through engineering's existing CI/CD as code changes. The platform never takes write actions against production clusters. Engineers review and apply recommendations through their normal workflow, in the order that captures the compounding effects.
1895 </p>
1896
1897 <p>
1898 The deeper version of how this works in practice is on our <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">OptOps.ai vs other Kubernetes optimization platforms</a> page. The three-layer framework is also why advisory-first matters: each layer requires different review processes, and a tool that takes autonomous actions across all three layers is making decisions that should belong to different teams.
1899 </p>
1900
1901 </div>
1902
1903<div class="post-cta">
1904 <h3>Optimise the whole stack. In the right order.</h3>
1905 <p>OptOps.ai produces recommendations across pods, nodes, and cloud commitments, sequenced correctly so the savings compound. Read-only by default. Recommendations flow through your existing CI/CD.</p>
1906 <div class="post-cta-buttons">
1907 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
1908 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
1909 </div>
1910 </div>
1911
1912<div class="faq-section">
1913 <h2>Frequently asked questions</h2>
1914
1915 <div class="faq-item">
1916 <div class="faq-q">What are the layers of Kubernetes cost?</div>
1917 <p class="faq-a"><strong>Kubernetes cost has three distinct layers.</strong> The pod layer is the resource requests and limits engineers set on workloads. The node layer is the underlying compute the cluster autoscaler provisions to satisfy pod requests. The cloud commitment layer is the Reserved Instance, Savings Plan, or Committed Use Discount that locks in pricing for the underlying compute. Each layer has a different waste pattern, a different person responsible, and a different optimization approach.</p>
1918 </div>
1919
1920 <div class="faq-item">
1921 <div class="faq-q">What is the difference between pod-level and node-level Kubernetes optimization?</div>
1922 <p class="faq-a"><strong>Pod-level optimization is about right-sizing the resource requests engineers set on individual workloads</strong>, making sure pods don't ask for more CPU and memory than they need. Node-level optimization is about packing those pods efficiently onto the underlying compute nodes, improving bin-packing, choosing the right instance types, and using spot or preemptible instances where appropriate. Pod waste typically dominates in commercial environments. Node waste typically dominates in stable, mature production environments.</p>
1923 </div>
1924
1925 <div class="faq-item">
1926 <div class="faq-q">What is a Kubernetes cloud commitment and how does it affect cost?</div>
1927 <p class="faq-a"><strong>Cloud commitments, Reserved Instances on AWS, Savings Plans, Committed Use Discounts on GCP, Reservations on Azure, are pricing agreements</strong> where the customer commits to a level of compute usage in exchange for a discount of 20-60% off on-demand pricing. Commitments don't change how Kubernetes operates; they change what the underlying compute costs. The waste pattern is over-committing to capacity that the optimised cluster doesn't need, locking the organisation into spend on resources it would rather scale down.</p>
1928 </div>
1929
1930 <div class="faq-item">
1931 <div class="faq-q">Should I optimize pods, nodes, or commitments first?</div>
1932 <p class="faq-a"><strong>The right order is pods first, nodes second, commitments third.</strong>
1932 Optimizing pods reduces actual resource demand. Once pod demand is right-sized, node-level optimization can pack the reduced demand more efficiently and choose appropriate instance types. Once both pod and node layers are optimized, the actual capacity requirement becomes clear, and cloud commitments can be sized correctly without locking in waste. Optimizing commitments before pods and nodes typically results in committing to capacity that's larger than needed, which is harder to unwind than the original over-provisioning.</p>
1933 </div>
1934
1935 <div class="faq-item">
1936 <div class="faq-q">How does OptOps.ai handle the three cost layers?</div>
1937 <p class="faq-a">OptOps.ai produces recommendations across all three layers. <strong>Pod-level: workload-aware rightsizing recommendations for CPU and memory requests. Node-level: bin-packing improvements, instance type recommendations, and spot/preemptible suitability. Commitment-level: visibility into the right-sized capacity baseline so commitment decisions can be made without locking in waste.</strong> The recommendations are sequenced, pod optimization first, then node-level once pod demand is settled, then commitment guidance once both upstream layers are optimised.</p>
1938 </div>
1939 </div>
1940`,P3=`<div class="post-body">
1941
1942 <span class="voice-marker">PRINCE</span>
1943
1944 <p>I was running an $8 million company. Most of the work was on AWS, Kubernetes clusters, the standard sprawl of services around them, all of it growing as the company grew. The kind of infrastructure where you stop thinking about the line items and just trust that the platform team has it under control.</p>
1945
1946 <p>The bill came in one Monday and I noticed something odd. It wasn't just up, it was up by a number that didn't match anything we'd done that month. No new product launch. No traffic spike. No migration. Just a bill that had quietly grown 40% over the previous quarter while I'd been looking at customer metrics, hiring decisions, board prep, every other thing a CEO is supposed to be looking at.</p>
1947
1948 <p>That sounds minor. It wasn't. When you're running an $8 million company, a 40% jump on cloud spend isn't a line item you adjust at quarter-end. It's the difference between hiring two engineers and hiring zero. It's whether the runway forecast you showed the board last month was real or fiction. It's a hole in the budget that nobody told you was forming until it was already there.</p>
1949
1950 <p>I asked the platform team what was happening. They told me the truth: the bill was high because the cluster was over-provisioned, and they'd been meaning to do something about it, but they were stretched thin. The recommendations had been sitting in the FinOps dashboard for months. Nobody had time to act on them.</p>
1951
1952 <p>I was furious. Not at the platform team, they were doing the right thing for the company, prioritising customer features over backend cost work. I was furious at the situation. We were paying for capacity we didn't need. The tools that were supposed to surface this had surfaced it. And the system as a whole had no path from "we know where the waste is" to "the waste goes away."</p>
1953
1954 <p>That weekend, I called Ashutosh.</p>
1955
1956 <span class="voice-marker">ASHUTOSH</span>
1957
1958 <p>Prince and I had been friends for years. We'd worked together on and off, talked about building something together for longer than either of us would admit. When he called me that Saturday, I was expecting him to vent about his bill, which he did, briefly, and then move on to whatever else was bothering him that week.</p>
1959
1960 <p>What happened was different. He described the situation: the bill, the dashboard recommendations, the platform team that didn't have bandwidth, the gap between identifying waste and eliminating it. And then he said the thing I'd been waiting for somebody to say.</p>
1961
1962 <p>"This isn't a problem with our company. Every Kubernetes shop has this exact problem. Why does nobody have a real solution?"</p>
1963
1964 <div class="pull-quote">
1965 "This isn't a problem with our company. Every Kubernetes shop has this exact problem. Why does nobody have a real solution?"
1966 </div>
1967
1968 <p>I'd been thinking about this for a year. Maybe two. I'd worked with enough Kubernetes infrastru
1968cture to know exactly the gap Prince was describing. The dashboards were good. The recommendations were technically correct. The implementation cost was so high that nothing got done. And the autonomous tools that promised to fix it required a level of trust most teams couldn't afford to give a third-party platform on production.</p>
1969
1970 <p>I told Prince something I'd been keeping to myself: I thought there was a billion-dollar idea sitting in this exact gap. Workload-aware AI that produced recommendations engineering teams could trust. Recommendations that flowed through normal CI/CD. Read-only by default, no platform taking write actions on production. The intelligence layer separated from the execution layer.</p>
1971
1972 <p>It wasn't a new idea in the abstract. The autonomous platforms had a piece of it. The dashboards had a piece of it. But nobody had built the architecture as the destination state, advisory-first as the philosophy, not as a stepping stone to autonomous. The space was wide open.</p>
1973
1974 <span class="voice-marker">PRINCE</span>
1975
1976 <p>Ashutosh built a prototype in three weeks. Read-only collection from a Kubernetes cluster. Workload-aware analysis. Recommendations that respected SLO tiers, burst patterns, batch cycles, the things engineers care about when they're deciding whether to act on a recommendation.</p>
1977
1978 <p>We installed it on the cluster I'd been complaining about. The one that had blindsided me with the bill. We let it run for two weeks while I went back to running the rest of the company.</p>
1979
1980 <p>When we looked at the recommendations together, two things hit me at once. The first was that the analysis was sharper than anything our existing tools had produced. Not vaguer "this pod might be over-provisioned." Specific: "this pod is requesting 4 GB of memory, peak observed usage is 1.2 GB, 95th percentile is 1.6 GB, you can right-size to 2 GB with safety margin and capture this much per month." The kind of recommendation an engineer reads and immediately knows is right.</p>
1981
1982 <p>The second thing that hit me was the size of the opportunity. Across the cluster, the recommendations added up to something close to a 60% reduction in our cloud bill. Sixty percent. On infrastructure we'd built carefully, with a competent team, using all the tools the cloud provider gives you.</p>
1983
1984 <div class="key-moment">
1985 <div class="key-moment-label">The realisation</div>
1986 <p>If our company, well-funded, technically competent, paying attention, had 60% waste in our cluster, every other Kubernetes shop in the world had something similar. The optimisation opportunity wasn't a niche. It was the entire market.</p>
1987 </div>
1988
1989 <p>I went back to the platform team with the recommendations. We implemented them over the next month, carefully, through normal change-management. The cluster utilisation went from somewhere in the 30s to somewhere in the 60s. The bill dropped exactly as the model had predicted. Nobody had to make a heroic engineering effort. Nobody had to take execution risk. The recommendations were precise enough that implementation was almost mechanical.</p>
1990
1991 <p>
1991That's when I knew this wasn't a side project. This was the company.</p>
1992
1993 <h2>The decision to leave</h2>
1994
1995 <p>I'd built a company before. I knew what it took. I knew how brutal it was. I knew that walking away from something that worked to start something new, even something with this kind of upside, wasn't a casual decision.</p>
1996
1997 <p>I called Ashutosh again. Different conversation this time. We talked about what it would take. Capital. Runway. The first hires. The first design partners. The kind of customers who would help us build the platform versus the kind who would slow us down. The compliance-heavy ICPs that nobody else was serving well. The long timeline to get into BFSI and government, and why those were the right segments anyway.</p>
1998
1999 <p>Ashutosh went full-time first, in January 2026. He'd been working on the platform part-time while still at his previous role. I followed shortly after, transitioning from the previous company. We registered OptOps.ai. Set up shop in Gurugram, proximity to BFSI customers in the NCR, talent depth from Flipkart, Paytm, Razorpay alumni networks, capital efficiency at roughly a quarter of the Bay Area burn rate.</p>
2000
2001 <p>By March we had a working product. By April we had our first design partners. By the time we launched publicly in November 2025, sorry, the company technically launched then; the journey started months earlier, we already had a clear picture of who we served and why.</p>
2002
2003 <span class="voice-marker">ASHUTOSH</span>
2004
2005 <p>The first paying customer was a major government contractor. Not the kind of logo most early-stage startups would expect to land. We landed it because the architecture we'd built, read-only, metadata-only, no write access, recommendations through CI/CD, happened to fit exactly the constraint stack that government and BFSI buyers operate under. Most autonomous tools fail security review in those environments. We were designed to pass.</p>
2006
2007 <p>The second paying customer followed within months. Both serving as design partners while we matured the platform. A public-sector pilot followed shortly after, and the pipeline grew faster than we expected.</p>
2008
2009 <p>None of that came from clever sales motion. It came from the same recognition Prince had on that first cluster. When teams running Kubernetes at scale saw what advisory-first AI could do, workload-aware, SLO-respecting, deployable in environments where autonomous tools were blocked, the pitch was almost unnecessary. They got it immediately because they'd been feeling the gap.</p>
2010
2011 <h2>What we believe now</h2>
2012
2013 <span class="voice-marker">PRINCE</span>
2014
2015 <p>Most cost optimisation companies start with a cost optimisation thesis. We started with a frustration thesis. The frustration was real, the gap was real, and the architecture that fit the gap was different enough from what existed that we could see the shape of a category around it.</p>
2016
2017 <p>Three things we believe now that we didn't fully believe when we started:</p>
2018
2019 <p><strong>Advisory-first is the destination, not a stepping stone.</strong> Some of our customers will eventually want more automation. We'll add it. But the architecture we lead with is the architecture that fits the buyers we care about most, regulated industries, compliance-heavy environments, teams where engineering accountability for production matters more than maximum convenience. We're not trying to convert advisory customers into autonomous customers. We're trying to be the best advisory-first platform in the market.</p>
2020
2021 <p><strong>The gap between recommendation and action is the whole game.</strong> Every cost optimisation tool generates recommendations. The ones that capture savings are the ones that make acting on the recommendation cheap enough that it happens. That's what the integration with CI/CD is. That's what the precision in the recommendation is. That's what the workload-awareness is. The recommendation isn't the product. The cost-of-acting is the product.</p>
2022
2023 <p><strong>Climate matters more than we realised.</strong> When we started, we talked about cost. The deeper we got, the more we realised that aggressive Kubernetes optimisation is also aggressive carbon reduction. Every pod we right-size is compute that doesn't run. Every node we eliminate is energy that isn't consumed. We didn't set out to be a climate company. The math says we kind of are.</p>
2024
2025 <h2>What's next</h2>
2026
2027 <span class="voice-marker">ASHUTOSH</span>
2028
2029 <p>We're 18 months in as a building entity, six months in as a launched company. The technology is real, the customers are real, the pipeline is real. What we're building toward over the next two years is platform depth, better workload awareness across more workload types, deeper integration with the deployment tooling our customers already use, expansion into the layers above and below pod-level optimisation.</p>
2030
2031 <p>We're also building toward category leadership in advisory-first specifically. The market is converging, autonomous-first vendors are bolting on advisory modes, and there's going to be confusion about what advisory means. We want to be the platform that defines what real advisory-first looks like, deployed at scale, in environments other categories can't reach.</p>
2032
2033 <span class="voice-marker">PRINCE</span>
2034
2035 <p>Looking back at that Monday morning when the AWS bill blindsided me, the one that started all of this, I'm still occasionally amazed that nobody else in our 
2035company saw what was coming. We had a competent team. We had good tools. We had budget visibility that most companies would envy. And we still got blindsided.</p>
2036
2037 <p>The lesson worth carrying away from this is simple. If our company missed it, your company is missing it. Probably worse. The 60% number wasn't an outlier, it was fairly average for a Kubernetes shop that hasn't aggressively optimised. The waste isn't visible until somebody who knows where to look comes looking. And in most companies, nobody is looking, because the people who could look are busy doing other things that the business prioritises.</p>
2038
2039 <p>That's the gap OptOps.ai exists to close. It's not glamorous work. It's not the most exciting category in tech. But it's real, and it matters, and we've built the company we wished had existed when we needed it.</p>
2040
2041 <p>If you're feeling the same gap we felt, bills climbing, dashboards full of recommendations nobody acts on, optimisation tools that don't fit your environment, we'd be glad to talk. The product is read-only by default, installs in 15 minutes, and either delivers a real recommendation set on your actual cluster or tells you we can't help. Both are useful answers.</p>
2042
2043 <p>Thanks for reading.</p>
2044
2045 <p style="font-family:var(--font-display);font-style:italic;color:var(--text-muted);">Prince &amp; Ashutosh</p>
2046
2047 </div>
2048
2049<div class="post-cta">
2050 <h3>See what your cluster is wasting.</h3>
2051 <p>OptOps.ai installs in 15 minutes. Read-only by default. We'll show you exactly where the waste is, and what closing the gap would look like in your environment specifically.</p>
2052 <div class="post-cta-buttons">
2053 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
2054 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
2055 </div>
2056 </div>
2057`,I3=`<div class="tldr-box">
2058 <div class="tldr-label">The short version</div>
2059 <ul class="tldr-list">
2060 <li><strong>Three categories: FinOps dashboards, autonomous platforms, advisory-first AI.</strong> Each solves a different version of the problem with a different trade-off.</li>
2061 <li><strong>Most organisations need two of the three.</strong> A dashboard for visibility plus an action layer to capture savings.</li>
2062 <li><strong>The right category depends on three things:</strong> regulatory environment, tolerance for autonomous tools in production, and which engineering team is buying.</li>
2063 </ul>
2064 </div>
2065
2066<div class="post-body">
2067
2068 <p>Anyone evaluating Kubernetes cost optimization in 2026 walks into a market that looks confusing on the surface and is fairly clean once you see the structure. The vendors aren't all competing for the same buyer. They're not all solving the same problem. They're not even using the same definition of "cost optimization." Once you can see the three categories, picking the right one stops being a mystery.</p>
2069
2070 <p>Worth saying upfront: this is written by a vendor in this space, OptOps.ai, which sits in the advisory-first category. We've tried to write it the way an honest analyst would, acknowledging where each category wins and where the trade-offs sit. If you read this and conclude that an autonomous platform is right for your environment, that's a good outcome. The wrong tool deployed in the wrong environment helps nobody.</p>
2071
2072 <h2>The three categories</h2>
2073
2074 <p>Every Kubernetes cost optimization tool sits in one of three categories. The differences aren't features. They're philosophies, different answers to "who should be making the optimization decisions in production."</p>
2075
2076 <div class="infographic">
2077 <div class="infographic-title">The market in one diagram</div>
2078 <svg class="infographic-svg" viewBox="0 0 800 320" xmlns="http://www.w3.org/2000/svg">
2079 <defs>
2080 <linearGradient id="dashGrad" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#06B6D4" stop-opacity="0.15"/><stop offset="100%" stop-color="#06B6D4" stop-opacity="0.04"/></linearGradient>
2081 <linearGradient id="autoGrad2" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#D97706" stop-opacity="0.15"/><stop offset="100%" stop-color="#D97706" stop-opacity="0.04"/></linearGradient>
2082 <linearGradient id="advGrad" x1="0%" y1="0%" x2="0%" y2="100%"><stop offset="0%" stop-color="#7C3AED" stop-opacity="0.18"/><stop offset="100%" stop-color="#7C3AED" stop-opacity="0.05"/></linearGradient>
2083 </defs>
2084 <rect x="20" y="40" width="245" height="240" rx="10" fill="url(#dashGrad)" stroke="#06B6D4" stroke-width="1.5"/>
2085 <text x="42" y="72" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#06B6D4" letter-spacing="1.4">CATEGORY 01</text>
2086 <text x="42" y="100" font-family="Plus Jakarta Sans, sans-serif" font-size="20" font-weight="800" fill="#0E0E1A">FinOps</text>
2087 <text x="42" y="124" font-family="Plus Jakarta Sans, sans-serif" font-size="20" font-weight="800" fill="#0E0E1A">Dashboards</text>
2088 <text x="42" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Visibility, reporting,</text>
2089 <text x="42" y="174" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">recommendations.</text>
2090 <text x="42" y="208" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Owns: cost visibility</text>
2091 <text x="42" y="226" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">No execution layer.</text>
2092 <text x="42" y="262" font-family="Plus Jakarta Sans, sans-serif" font-size="11" font-style="italic" fill="#06B6D4">Necessary, not sufficient.</text>
2093 <rect x="277" y="40" width="245" height="240" rx="10" fill="url(#autoGrad2)" stroke="#D97706" stroke-width="1.5"/>
2094 <text x="299" y="72" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#D97706" letter-spacing="1.4">CATEGORY 02</text>
2095 <text x="299" y="100" font-family="Plus Jakarta Sans, sans-serif" font-size="20" font-weight="800" fill="#0E0E1A">Autonomous</text>
2096 <text x="299" y="124" font-family="Plus Jakarta Sans, sans-serif" font-size="20" font-weight="800" fill="#0E0E1A">Platforms</text>
2097 <text x="299" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Direct execution on</text>
2098 <text x="299" y="174" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">production clusters.</text>
2099 <text x="299" y="208" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Owns: the decision</text>
2100 <text x="299" y="226" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Engineering delegates.</text>
2101 <text x="299" y="262" font-family="Plus Jakarta Sans, sans-serif" font-size="11" font-style="italic" fill="#D97706">Convenience-first.</text>
2102 <rect x="535" y="40" width="245" height="240" rx="10" fill="url(#advGrad)" stroke="#7C3AED" stroke-width="2"/>
2103 <text x="557" y="72" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.4">CATEGORY 03</text>
2104 <text x="557" y="100" font-family="Plus Jakarta Sans, sans-serif" font-size="20" font-weight="800" fill="#0E0E1A">Advisory-first</text>
2105 <text x="557" y="124" font-family="Plus Jakarta Sans, sans-serif" font-size="20" font-weight="800" fill="#0E0E1A">AI</text>
2106 <text x="557" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Workload-aware</text>
2107 <text x="557" y="174" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">recommendations.</text>
2108 <text x="557" y="208" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Owns: the intelligence</text>
2109 <text x="557" y="226" font-family="Plus Jakarta Sans, sans-serif" font-size="13" fill="#5C5C70">Engineering applies via CI/CD.</text>
2110 <text x="557" y="262" font-family="Plus Jakarta Sans, sans-serif" font-size="11" font-style="italic" fill="#7C3AED">Control-first.</text>
2111 </svg>
2112 <p class="infographic-caption">Three categories, three philosophies. Most organisations need a tool from category one plus a tool from either category two or three.</p>
2113 </div>
2114
2115 <h2>Category one: FinOps dashboards</h2>
2116
2117 <p>The oldest category. Dashboards observe the cluster, attribute spend to teams and workloads, surface utilisation gaps, and produce optimization recommendations. Built primarily for finance reporting and engineering visibility, not for taking action.</p>
2118
2119 <p>The strength is high-quality reporting. A modern FinOps dashboard breaks down spend by namespace, team, label, workload, and resource type. It attributes shared resources accurately. It surfaces anomalies fast enough to catch a runaway workload. It produces the artefacts finance teams need for chargeback, showback, and budget allocation.</p>
2120
2121 <p>The weakness is that dashboards don't reduce spend. They identify where reduction is possible. The implementation work, translating recommendations into manifest changes, deploying through CI/CD, verifying nothing broke, sits with engineering, who usually doesn't have the bandwidth. We've written more on <a href="/resources/blogs/finops-dashboards-dont-save-money">why dashboards don't save money on their own</a>.</p>
2122
2123 <h3>What to look for in this category</h3>
2124
2125 <div class="vendor-card">
2126 <span class="vendor-tag tag-dashboard">FinOps Dashboard</span>
2127 <h4>Profile of a strong dashboard</h4>
2128 <p>Some platforms in this category lean Kubernetes-native with strong workload-level attribution and idle-resource identification. Others are enterprise-grade FinOps suites that treat Kubernetes as one of several workload types, with cross-cloud reporting and governance. A third group sits inside an existing observability stack so cost data lives next to performance metrics. The newer entrants are developer-friendly, faster to deploy, and weighted toward mid-market teams.</p>
2129 <p class="fit-line"><strong>Fits:</strong> Teams that need cost reporting, attribution, and showback, with engineering already owning the implementation work that follows.</p>
2130 </div>
2131
2132 <h2>Category two: autonomous optimization platforms</h2>
2133
2134 <p>Built on the philosophy that engineering teams are best served by delegating cost management to a platform that handles execution directly. These tools install with cluster access, learn workload patterns, and take optimization actions, adju
2134sting pod resources, choosing instance types, managing spot, evicting and rescheduling pods, without engineering review of each change.</p>
2135
2136 <p>The strength is convenience. For teams who want to take cost work off the engineering backlog entirely, autonomous platforms deliver. The savings are real, the operational burden is low, and the platform improves over time as it learns the cluster.</p>
2137
2138 <p>The trade-off is that engineering gives up some control over production decisions. The platform decides when pods get evicted, which instance types get used, when spot replaces on-demand. For teams in environments where this works, typically high-growth consumer SaaS with mature DevOps and low regulatory pressure, autonomous is the right architecture. For environments where it doesn't, autonomous tools usually get blocked in security review.</p>
2139
2140 <h3>What to look for in this category</h3>
2141
2142 <div class="vendor-card">
2143 <span class="vendor-tag tag-autonomous">Autonomous Platform</span>
2144 <h4>Profile of an autonomous platform</h4>
2145 <p>The more mature platforms in this category focus on node-level optimization, picking instance types, managing spot, and improving bin-packing, often with increasingly capable pod rightsizing layered on top. Newer entrants take an application-level angle, tuning workload parameters and configurations in addition to resource requests. Most are autonomous-first by design and treat read-only as an on-ramp rather than a destination. GPU and AI workload support is where the strongest platforms differentiate today.</p>
2146 <p class="fit-line"><strong>Fits:</strong> Mid-to-large engineering teams with mature DevOps practices and no compliance constraint blocking write access on production clusters.</p>
2147 </div>
2148
2149 <h2>Category three: advisory-first AI</h2>
2150
2151 <p>Built on the opposite philosophy. The platform observes the cluster (read-only), learns workload patterns, and produces precise recommendations, but never takes execution actions. Engineering applies the changes through their existing CI/CD using whatever deployment tooling they already use. The platform owns the intelligence layer; engineering owns the production decision.</p>
2152
2153 <p>The strength is control. Read-only operation means no third-party process is taking write actions on critical cluster
2153s. Recommendations flow through engineering's normal change-management workflow, preserving audit trails and approval processes. Production safety is structural, not configurable.</p>
2154
2155 <p>The trade-off is that engineering still has to act on the recommendations, though the cost of acting is much lower than it would be without the AI, because the recommendations are precise, ROI-tagged, and integrated with the deployment pipeline. For environments where autonomous tools are blocked or where engineering accountability matters more than maximum convenience, advisory-first is usually the right architecture.</p>
2156
2157 <h3>What this category looks like</h3>
2158
2159 <div class="vendor-card">
2160 <span class="vendor-tag tag-advisory">Advisory-first AI</span>
2161 <h4>OptOps.ai</h4>
2162 <p>Advisory-first AI for Kubernetes cost optimization, built specifically for environments where compliance is the lead constraint. Read-only by default. Metadata-only collection. Recommendations flow through engineering's existing CI/CD as Terraform, Karpenter, or equivalent. No write access required. Designed from day one for BFSI, government, healthcare, and regulated SaaS environments. Public-sector organisations are currently evaluating the platform.</p>
2163 <p class="fit-line"><strong>Fits:</strong> Regulated industries, compliance-heavy environments, and any team that needs cost optimization without giving up production control.</p>
2164 </div>
2165
2166 <p>The advisory-first category is newer than the other two and currently has fewer vendors. We expect that to change as more buyers in regulated environments need Kubernetes cost optimization that fits their architectural constraints, and as some autonomous-first vendors retrofit advisory modes that aren't quite as deep as a platform built advisory-first from the start. The architectural difference between "advisory mode bolted on" and "advisory architecture as the destination" is meaningful and shows up in operations.</p>
2167
2168 <h2>Side-by-side comparison</h2>
2169
2170 <div class="infographic">
2171 <div class="infographic-title">How the three categories compare</div>
2172 <table class="approach-table">
2173 <thead>
2174 <tr><th>What you need</th><th>FinOps Dashboards</th><th>Autonomous Platforms</th><th class="optops-col">Advisory-first AI</th></tr>
2175 </thead>
2176 <tbody>
2177 <tr><td class="feature">Cost visibility</td><td>Excellent</td><td>Good (secondary)</td><td class="optops">Good (secondary)</td></tr>
2178 <tr><td class="feature">Closes the loop to action</td><td>No</td><td>Yes (platform acts)</td><td class="optops">Yes (engineering applies via CI/CD)</td></tr>
2179 <tr><td class="feature">Production safety</td><td>Read-only</td><td>Variable; write access required</td><td class="optops">Read-only by default</td></tr>
2180 <tr><td class="feature">Passes BFSI/government review</td><td>Usually yes</td><td>Usually no</td><td class="optops">Designed to pass</td></tr>
2181 <tr><td class="feature">Engineering retains control</td><td>Yes</td><td>No (delegated)</td><td class="optops">Yes</td></tr>
2182 <tr><td class="feature">Operational burden</td><td>Heavy</td><td>Light</td><td class="optops">Light</td></tr>
2183 <tr><td class="feature">GPU and aggressive spot</td><td>Visibility only</td><td>Most mature</td><td class="optops">Less mature; improving</td></tr>
2184 </tbody>
2185 </table>
2186 <p class="infographic-caption">No category dominates on every dimension. The right choice depends on which constraints bind in your environment.</p>
2187 </div>
2188
2189 <h2>How to choose</h2>
2190
2191 <p>Five questions usually settle which category fits. Worth walking through them in order, because each one narrows the field.</p>
2192
2193 <ol>
2194 <li><strong>Are you in a regulated industry (BFSI, government, healthcare)?</strong> If yes: advisory-first is almost certainly the right category. Autonomous platforms struggle with security review.</li>
2195 <li><strong>Do you already have a FinOps dashboard?</strong> If yes: you don't need another dashboard. You need an action layer.</li>
2196 <li><strong>Do your security or SRE teams have veto power on third-party tools that take write actions on production?</strong> If yes: autonomous is likely blocked. Advisory-first is the path.</li>
2197 <li><strong>Is GPU optimization or aggressive spot management your dominant cost driver today?</strong> If yes: autonomous platforms have more mature capabilities.</li>
2198 <li><strong>Do you want to delegate cost management entirely or keep engineering in the loop?</strong> Delegate: autonomous. Stay in the loop: advisory.</li>
2199 </ol>
2200
2201 <div class="key-point">
2202 <div class="key-point-label">A useful evaluation question</div>
2203 <p>Whatever vendor you're talking to, ask what percentage of their customers run their tool in advisory mode versus autonomous in production. If the honest answer for an autonomous-first platform is "most run autonomous within 90 days," you'll be using the product against its design intent if you want to stay advisory. If the honest answer for an advisory-first platform is "almost all run advisory in production," the architecture matches your constraint set. The number tells you what the product is optimised for, regardless of marketing.</p>
2204 </div>
2205
2206 <h2>The honest summary</h2>
2207
2208 <p>Most organisations need two of the three categories. A FinOps dashboard for visibility, attribution, and reporting, that's table stakes. Plus an action layer (autonomous or advisory) that closes the loop from recommendation to deployment. Pick one or the other based on your constraint stack, not on whichever vendor has the louder demo.</p>
2209
2210 <p>A few practical notes that don't fit neatly into any category but matter when evaluating:</p>
2211
2212 <ul>
2213 <li><strong>Don't over-index on case studies in environments unlike yours.</strong> An autonomous platform's success at a Series D consumer SaaS company tells you almost nothing about how 
2213it'll perform in a bank. Look for proof points in environments structurally similar to yours.</li>
2214 <li><strong>Verify the install model.</strong> Ask specifically about your cloud provider, region, and compliance regime.</li>
2215 <li><strong>Test the recommendation quality on your own cluster.</strong> Generic claims about savings percentages are worth less than actual recommendations on your actual workloads.</li>
2216 <li><strong>Plan for the procurement timeline that fits your environment.</strong> Commercial deployments can move in 30-60 days. BFSI and government deployments usually take 6-12 months.</li>
2217 </ul>
2218
2219 <p>We've written more about <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">how OptOps.ai compares to specific platforms</a> and how the advisory-first architecture differs from <a href="/resources/blogs/finops-dashboards-dont-save-money">FinOps dashboards</a> for buyers who want the head-to-head detail. The right tool is the one that fits your constraints. We'll be the first to tell you when that's not us.</p>
2220
2221 </div>
2222
2223<div class="post-cta">
2224 <h3>See where OptOps.ai fits in your stack.</h3>
2225 <p>Advisory-first AI for Kubernetes cost optimization. Read-only by default. Designed for environments where compliance is the lead constraint, and engineering teams who want to keep production control.</p>
2226 <div class="post-cta-buttons">
2227 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
2228 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
2229 </div>
2230 </div>
2231
2232<div class="faq-section">
2233 <h2>Frequently asked questions</h2>
2234 <div class="faq-item">
2235 <div class="faq-q">What are the main categories of Kubernetes cost optimization tools?</div>
2236 <p class="faq-a"><strong>There are three.</strong> FinOps dashboards provide visibility but leave action to engineering. Autonomous platforms install with cluster access and execute optimisation directly. Advisory-first AI platforms such as OptOps.ai generate workload-aware recommendations that engineering teams apply through their own CI/CD.</p>
2237 </div>
2238 <div class="faq-item">
2239 <div class="faq-q">What's the best Kubernetes cost optimization tool?</div>
2240 <p class="faq-a"><strong>It depends on your environment.</strong> For visibility and attribution, the mature FinOps dashboards do the job well. For autonomous optimisation in environments without compliance constraints, the established platforms in that category are the usual choices. For regulated industries such as BFSI, government, and healthcare, advisory-first platforms like OptOps.ai are typically the only architectures that meet the constraint set.</p>
2241 </div>
2242 <div class="faq-item">
2243 <div class="faq-q">When should I look beyond a FinOps dashboard?</div>
2244 <p class="faq-a">When you already have visibility and the recommendations are sitting unused. <strong>Dashboards identify waste. They don't remove it.</strong> If engineering doesn't have the bandwidth to translate recommendations into manifest changes and ship them, the next step is an action layer, either autonomous or advisory-first, depending on what your environment allows.</p>
2245 </div>
2246 <div class="faq-item">
2247 <div class="faq-q">Autonomous or advisory-first, which one fits?</div>
2248 <p class="faq-a">The choice between autonomous and advisory architectures is the most consequential decision in this category. <strong>If security, SRE, or change-management teams have veto power on third-party write access to production, autonomous tools usually get blocked in review and advisory-first is the path.</strong> If those constraints don't bind and you want to delegate cost management entirely, autonomous platforms reduce operational burden the most.</p>
2249 </div>
2250 <div class="faq-item">
2251 <div class="faq-q">How do I choose between Kubernetes cost optimization tools?</div>
2252 <p class="faq-a">Five questions settle it. <strong>Are you in a regulated industry? Do you already have a FinOps dashboard? Do security or SRE teams have veto power on third-party write actions? Is GPU or spot management your dominant driver? Do you want to delegate cost management or stay in control?</strong></p>
2253 </div>
2254 </div>
2255`,U3=`<div class="tldr-box">
2256 <div class="tldr-label">The short version</div>
2257 <ul class="tldr-list">
2258 <li><strong>Cloud providers ship cost visibility, not cost reduction.</strong> Billing dashboards, basic recommendations, and commitment management are well-built. Aggressive workload-level optimisation is conspicuously missing.</li>
2259 <li><strong>The reason isn't engineering capability.</strong> It's incentive alignment. Cloud providers earn revenue when customers consume more compute. Aggressive cost reduction reduces consumption. The math doesn't favour shipping a great optimiser.</li>
2260 <li><strong>The third-party Kubernetes optimisation market exists for exactly this reason.</strong> Specialist platforms whose entire business model is reducing your bill have a structural advantage providers can't match.</li>
2261 </ul>
2262 </div>
2263
2264<div class="post-body">
2265
2266 <p>Every team running production Kubernetes eventually asks the same question. They've spent eighteen months building a cluster on a major cloud provider. The bill is climbing. They look at the cost tools the provider ships natively, billing dashboards, usage explorers, recommender services, advisor platforms, and they wonder why none of these tools seem to reduce the bill in any meaningful way.</p>
2267
2268 <p>The pattern is universal. The cost dashboards are beautifully built. They show spend with great precision. They surface idle resources. They flag commitment opportunities. They produce reports the finance team finds useful. And yet the bill keeps growing, and the optimisation tools the cloud provider ships seem to nibble at the edges rather than going after the bulk of the waste.</p>
2269
2270 <p>
2270This is not a story about cloud providers being lazy or technically deficient. The companies running the major hyperscalers have some of the best engineering talent on the planet. If they wanted to ship a Kubernetes cost optimiser that aggressively cut customer bills by 50%, they could. They have all the data. They have the engineers. They have the infrastructure. They could ship it next quarter.</p>
2271
2272 <p>They don't. And the reason isn't conspiracy. It's economics, and once you see it, the entire third-party Kubernetes cost optimisation market makes sense.</p>
2273
2274 <h2>What cloud providers ship</h2>
2275
2276 <p>To make the argument concretely, worth being specific about what hyperscalers do and don't ship in the cost optimisation space. Every major cloud provider, without naming them, ships some version of the following toolkit.</p>
2277
2278 <p><strong>Billing dashboards.</strong> Detailed cost breakdowns by service, account, region, and tag. Usage analytics. Anomaly detection. Cost allocation rules for organisations with chargeback or showback requirements. These tools are universally good. They give finance teams what they need.</p>
2279
2280 <p><strong>Commitment recommenders.</strong> Tools that analyse historical usage and recommend Reserved Instances, Savings Plans, or Committed Use Discounts. The math is straightforward, look at usage stability, recommend a commitment level that captures discount without over-committing. Cloud providers have a strong incentive to ship these because commitments lock customers in for one to three years, which is excellent for predictable revenue.</p>
2281
2282 <p><strong>Advisor and recommender services.</strong> Tools that surface opportunities to right-size workloads, identify idle resources, suggest instance type changes. The recommendations are generic, the algorithms are basic, and the implementation is left to the customer. These services exist primarily to demonstrate that the provider offers cost tooling, not to capture meaningful savings.</p>
2283
2284 <p><strong>First-party service optimisation.</strong> Recommendations specific to managed services the provider sells, managed databases, managed Kubernetes control planes, serverless platforms, ML services. These are typically well-built because optimising them often involves migrating customers to higher-margin first-party services rather than reducing total spend.</p>
2285
2286 <p>What's missing from this list is telling. <strong>Aggressive cluster-level Kubernetes cost optimisation.</strong> Workload-aware pod rightsizing that captures 30-50% savings. Cross-cluster bin-packing optimisation. Multi-account or multi-cluster orchestration. These are the optimisations that move the bill meaningfully, and they're conspicuously absent from cloud provider native toolkits.</p>
2287
2288 <h2>The structural reason</h2>
2289
2290 <p>The honest framing is straightforward. Cloud providers earn revenue when customers consume more compute. Their entire commercial model is built on usage-based pricing, every CPU hour, every GB of memory, every gigabyte of storage moves the revenue line. The provider's incentive is to make consumption easy, attractive, and sticky. Optimisation tools that aggressively reduce consumption work against that incentive.</p>
2291
2292 <p>This isn't a sinister observation. It's a banal one. Companies optimise for what compensates them. A company whose revenue depends on consumption ships tools calibrated to maintain consumption while keeping customers from leaving. They will absolutely ship enough optimisation tooling to prevent customer churn, if the bill gets too high, customers shop alternatives, and that's worse for the provider than offering some optimisation. So providers offer enough cost tooling to keep customers reasonably content. They don't offer the aggressive optimisation that would meaningfully cut bills.</p>
2293
2294 <div class="pull-quote">
2295 "Cloud providers ship enough cost tooling to keep customers from leaving. They don't ship the optimisation that would maximally reduce spend. The two are different products."
2296 </div>
2297
2298 <p>The clearest tell is in the optimisation depth at different layers. Cloud providers build excellent commitment recommenders because commitments lock in revenue for years. They build adequate idle-resource detectors because customers complain about idle waste. They build minimal pod-level rightsizing tools because workload-aware optimisation in Kubernetes is the layer where 30-50% savings live, and shipping a great tool there would meaningfully reduce provider revenue.</p>
2299
2300 <p>This explains the market gap that third-party Kubernetes cost optimisation platforms occupy. The reason platforms like OptOps.ai exist alongside the broader category of third-party tools is that hyperscalers structurally cannot ship the depth of optimisation specialised platforms can. Even if they tried, the commercial incentive points the wrong direction. The third-party market exists because there's a real opportunity that the natural players in the space won't capture.</p>
2301
2302 <h2>The visualisation</h2>
2303
2304 <div class="infographic">
2305 <div class="infographic-title">Where cloud providers invest vs. where the savings live</div>
2306 <svg class="infographic-svg" viewBox="0 0 800 320" xmlns="http://www.w3.org/2000/svg">
2307 <defs>
2308 <linearGradient id="csInvest" x1="0%" y1="0%" x2="100%" y2="0%">
2309 <stop offset="0%" stop-color="#06B6D4" stop-opacity="0.45"/>
2310 <stop offset="100%" stop-color="#06B6D4" stop-opacity="0.10"/>
2311 </linearGradient>
2312 <linearGradient id="actualSavings" x1="0%" y1="0%" x2="100%" y2="0%">
2313 <stop offset="0%" stop-color="#7C3AED" stop-opacity="0.55"/>
2314 <stop offset="100%" stop-color="#7C3AED" stop-opacity="0.15"/>
2315 </linearGradient>
2316 </defs>
2317
2318 <text x="40" y="40" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#5C5C70" letter-spacing="1.4">CLOUD PROVIDER INVESTMENT</text>
2319
2320 <text x="40" y="76" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Billing dashboards</text>
2321 <rect x="240" y="62" width="500" height="22" rx="4" fill="url(#csInvest)" stroke="#06B6D4" stroke-width="1"/>
2322 <text x="745" y="78" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="end">Heavy investment</text>
2323
2324 <text x="40" y="116" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Commitment recommenders</text>
2325 <rect x="240" y="102" width="450" height="22" rx="4" fill="url(#csInvest)" stroke="#06B6D4" stroke-width="1"/>
2326 <text x="695" y="118" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="end">Heavy investment</text>
2327
2328 <text x="40" y="156" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Generic advisor services</text>
2329 <rect x="240" y="142" width="220" height="22" rx="4" fill="url(#csInvest)" stroke="#06B6D4" stroke-width="1"/>
2330 <text x="465" y="158" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="start">Moderate</text>
2331
2332 <text x="40" y="196" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Workload-level rightsizing</text>
2333 <rect x="240" y="182" width="60" height="22" rx="4" fill="url(#csInvest)" stroke="#06B6D4" stroke-width="1"/>
2334 <text x="305" y="198" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="start">Minimal</text>
2335
2336 <text x="40" y="236" font-family="Plus Jakarta Sans, sans-serif" font-size="13" font-weight="600" fill="#0E0E1A">Cluster bin-packing AI</text>
2337 <rect x="240" y="222" width="40" height="22" rx="4" fill="url(#csInvest)" stroke="#06B6D4" stroke-width="1"/>
2338 <text x="285" y="238" font-family="JetBrains Mono, monospace" font-size="10" fill="#5C5C70" text-anchor="start">Minimal</text>
2339
2340 <line x1="40" y1="270" x2="760" y2="270" stroke="#D8D8E0" stroke-width="1"/>
2341 <text x="40" y="294" font-family="JetBrains Mono, monospace" font-size="11" font-weight="700" fill="#7C3AED" letter-spacing="1.4">WHERE SAVINGS ACTUALLY LIVE</text>
2342 <text x="40" y="312" font-family="Plus Jakarta Sans, sans-serif" font-size="12.5" fill="#5C5C70">Workload rightsizing + cluster bin-packing = 60-80% of total Kubernetes savings opportunity</text>
2343 </svg>
2344 <p class="infographic-caption">The layers where the most savings live are the layers where cloud providers invest the least. The market gap is structural, not accidental.</p>
2345 </div>
2346
2347 <h2>Where this leaves you</h2>
2348
2349 <p>
2349The practical implication for any team running production Kubernetes is straightforward. The cost optimisation strategy can't rely on cloud-provider-native tools alone. Those tools are useful, even necessary, for billing visibility, commitment management, and basic anomaly detection. They cover roughly 20-40% of the optimisation opportunity. The remaining 60-80% sits in workload-level and cluster-level optimisation that the providers don't deeply build.</p>
2350
2351 <p>This isn't a problem with any specific cloud provider. It's a structural pattern across all of them. Whether you're on the largest hyperscaler, the second-largest, the third, or any of the smaller regional clouds, the same dynamic plays out. The provider ships enough optimisation tooling to retain you. The depth that would meaningfully cut your bill comes from third-party platforms whose business model is aligned with your cost reduction goal.</p>
2352
2353 <h3>What hyperscaler tools do well</h3>
2354
2355 <ul>
2356 <li><strong>Cost visibility and attribution</strong> across services and accounts</li>
2357 <li><strong>Commitment management</strong>, Reserved Instance, Savings Plan, or equivalent recommendations</li>
2358 <li><strong>Anomaly detection</strong> for runaway workloads or unexpected spend</li>
2359 <li><strong>First-party service optimisation</strong>, managed databases, serverless tuning, container service efficiency</li>
2360 <li><strong>Cross-account visibility</strong> for organisations with complex billing structures</li>
2361 </ul>
2362
2363 <h3>What they don't do well</h3>
2364
2365 <ul>
2366 <li><strong>Workload-aware pod rightsizing</strong>, generic recommendations, no SLO awareness, no burst pattern handling</li>
2367 <li><strong>Cluster-level bin-packing optimisation</strong>, the provider doesn't have visibility into your scheduling priorities</li>
2368 <li><strong>Multi-cloud cost optimisation</strong>, by definition, providers optimise for keeping you on their cloud</li>
2369 <li><strong>Cross-cluster orchestration</strong> for organisations running heterogeneous Kubernetes environments</li>
2370 <li><strong>Aggressive savings capture</strong>, the depth of optimisation that would cut bills by 40-60%</li>
2371 </ul>
2372
2373 <h2>The combined approach</h2>
2374
2375 <p>The right strategy for most teams running production Kubernetes at scale is layered. Use the cloud provider's native cost tools for what they do well, billing visibility, commitment management, anomaly detection. Add a third-party Kubernetes cost optimisation platform for the workload and cluster-level depth that providers don't build. The two layers complement each other rather than competing.</p>
2376
2377 <div class="infographic">
2378 <div class="infographic-title">Cloud-native vs third-party: complementary, not competing</div>
2379 <table class="approach-table">
2380 <thead>
2381 <tr><th>What you need</th><th>Cloud provider tools</th><th class="optops-col">Third-party Kubernetes optimiser</th></tr>
2382 </thead>
2383 <tbody>
2384 <tr><td class="feature">Billing visibility &amp; attribution</td><td>Excellent</td><td class="optops">Secondary focus</td></tr>
2385 <tr><td class="feature">Commitment recommendations</td><td>Excellent</td><td class="optops">Visibility only; defers to provider</td></tr>
2386 <tr><td class="feature">Anomaly detection</td><td>Good</td><td class="optops">Good</td></tr>
2387 <tr><td class="feature">First-party service optimisation</td><td>Excellent</td><td class="optops">Out of scope</td></tr>
2388 <tr><td class="feature">Workload-aware pod rightsizing</td><td>Generic, basic</td><td class="optops">Workload-aware, ML-driven</td></tr>
2389 <tr><td class="feature">Cluster bin-packing intelligence</td><td>Limited</td><td class="optops">
2389Deep, cross-workload</td></tr>
2390 <tr><td class="feature">Multi-cloud optimisation</td><td>By design, single-cloud</td><td class="optops">Cloud-agnostic</td></tr>
2391 <tr><td class="feature">Aggressive bill reduction</td><td>Calibrated to retention</td><td class="optops">Calibrated to maximum savings</td></tr>
2392 </tbody>
2393 </table>
2394 <p class="infographic-caption">The two layers solve different problems. Cloud providers handle the billing layer. Third-party optimisers handle the workload layer.</p>
2395 </div>
2396
2397 <div class="key-point">
2398 <div class="key-point-label">A useful mental model</div>
2399 <p>Think of cloud-provider cost tools as the equivalent of your bank's monthly statement. The bank gives you accurate visibility into where your money went. They don't help you spend less, that's not their commercial alignment. If you want to spend less, you bring in a financial advisor whose job is helping you optimise. The cloud cost stack works the same way. The bank statement matters. The advisor matters more for moving the number.</p>
2400 </div>
2401
2402 <h2>Where OptOps.ai fits</h2>
2403
2404 <p>OptOps.ai sits in the third-party Kubernetes optimiser layer described above. We don't compete with cloud-provider native cost tools, we complement them. Customers keep their billing dashboards for visibility and commitment management, and add OptOps.ai for the workload-level and cluster-level optimisation that delivers the meaningful savings.</p>
2405
2406 <p>The architecture is read-only by default. Metadata-only collection. No write access required. Recommendations flow through engineering's existing CI/CD as code changes. We work across cloud providers, multi-cloud is a feature, not a complication. We've written more about <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">how OptOps.ai compares to other Kubernetes cost optimisation platforms</a> for the head-to-head version.</p>
2407
2408 <p>The reason third-party Kubernetes cost optimisation platforms exist isn't competitive landscape gymnastics. It's that the cloud providers structurally cannot ship the depth of optimisation that specialist platforms can. The misalignment is built into the commercial model. Once you see that clearly, the question stops being "why don't my cloud provider's tools work" and becomes "what's the right complement to add on top."</p>
2409
2410 </div>
2411
2412<div class="post-cta">
2413 <h3>The optimisation layer your cloud provider won't ship.</h3>
2414 <p>OptOps.ai is the workload-aware Kubernetes cost optimisation platform that complements your cloud-provider native tools. Read-only by default. Metadata only. Multi-cloud by design. Built to capture the savings cloud providers don't.</p>
2415 <div class="post-cta-buttons">
2416 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
2417 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
2418 </div>
2419 </div>
2420
2421<div class="faq-section">
2422 <h2>Frequently asked questions</h2>
2423
2424 <div class="faq-item">
2425 <div class="faq-q">Why don't cloud providers offer comprehensive Kubernetes cost optimization?</div>
2426 <p class="faq-a">Cloud providers offer cost visibility tools, billing dashboards, usage explorers, recommender services, but rarely offer aggressive cost reduction platforms. <strong>The structural reason is incentive alignment. Cloud providers earn revenue when customers consume more compute. Aggressive cost optimization reduces consumption.</strong> While providers offer enough optimization tooling to keep customers from leaving, they have no commercial incentive to deliver the level of cost reduction a third-party platform whose entire business model is reducing your bill can deliver. It's not a conspiracy, it's basic economics.</p>
2427 </div>
2428
2429 <div class="faq-item">
2430 <div class="faq-q">Are cloud provider native cost tools enough?</div>
2431 <p class="faq-a">Cloud provider native cost tools are sufficient for visibility, billing analysis, and basic recommendations on commitment purchases (Reserved Instances, Savings Plans). <strong>They're typically not sufficient for aggressive Kubernetes cost optimization at the pod and node level</strong>, which requires workload-aware analysis, cluster-level rightsizing intelligence, and cross-account or multi-cluster orchestration. Most teams running production Kubernetes find that native tools cover 20-40% of the optimization opportunity and third-party platforms are needed to capture the rest.</p>
2432 </div>
2433
2434 <div class="faq-item">
2435 <div class="faq-q">What is the difference between cloud provider cost tools and third-party Kubernetes optimizers?</div>
2436 <p class="faq-a">
2436Cloud provider cost tools focus on the billing layer, visibility, attribution, commitment management, anomaly detection, and on first-party services like managed databases. <strong>Third-party Kubernetes optimizers focus on the workload layer, pod rightsizing, node optimization, cluster-level bin-packing, multi-cloud cost management.</strong> Cloud provider tools are necessary; third-party tools provide the depth on Kubernetes specifically that cloud providers don't typically build.</p>
2437 </div>
2438
2439 <div class="faq-item">
2440 <div class="faq-q">Will cloud providers eventually build comprehensive cost optimization?</div>
2441 <p class="faq-a">Cloud providers continue to incrementally improve their cost tooling, but <strong>a comprehensive cost optimization platform that aggressively reduces customer bills runs counter to provider revenue incentives.</strong> As long as cloud providers earn margin on consumption, the optimization tools they ship will be calibrated to retain customers (avoid churn) rather than to maximally reduce spend. Third-party platforms exist precisely because their commercial alignment is opposite, they earn when customers spend less.</p>
2442 </div>
2443
2444 <div class="faq-item">
2445 <div class="faq-q">Should I use hyperscaler cost tools or a third-party Kubernetes optimizer?</div>
2446 <p class="faq-a"><strong>Use both.</strong> Hyperscaler cost tools are excellent at billing visibility, commitment management, and first-party service optimization. Third-party Kubernetes optimizers like OptOps.ai handle the workload-level optimization that hyperscalers don't deeply build for. The two layers complement each other, visibility from the cloud provider, action layer from the third-party platform.</p>
2447 </div>
2448 </div>
2449`,B3=`<div class="tldr-box">
2450 <div class="tldr-label">The short version</div>
2451 <ul class="tldr-list">
2452 <li><strong>Reported HPC utilisation measures allocation, not consumption.</strong> A cluster can report 95% utilised while the hardware inside those allocations sits half idle.</li>
2453 <li><strong>The evidence is measured, not anecdotal.</strong> Across 118,276 jobs on Perlmutter, mean peak GPU memory utilisation was 28.64%, and more than a third of jobs never exceeded 15%.</li>
2454 <li><strong>The fix starts with a join.</strong> Combine scheduler records with device telemetry, compare requested against consumed per job, and the recoverable capacity shows itself.</li>
2455 </ul>
2456 </div>
2457
2458<div class="post-body">
2459
2460 <p>
2461 Ask a supercomputing centre how well its machines are used and you will get a number in the eighties or nineties.
2462 </p>
2463
2464 <p>
2465 India’s government reports exactly that for the National Supercomputing Mission. In December 2025 it stated that 37 supercomputers totalling 40 petaflops had been deployed, and that most run at over 81% capacity, with few exceeding 95%.
2466 </p>
2467
2468 <p>
2469 There is something worth noticing in that sentence. Four months earlier, in August 2025, the government reported the same 37 systems and the same 40 petaflops, but described utilisation as over 85%, with many systems exceeding 95%. Identical hardware. A lower number and a quieter adjective.
2470 </p>
2471
2472 <p>
2473 More importantly, no official source anywhere defines what the percentage measures.
2474 </p>
2475
2476 <p>
2477 That matters more than the figure itself, because in high performance computing there are two very different questions hiding behind the word utilisation, and they produce very different answers.
2478 </p>
2479
2480 <h2>What HPC utilization figures actually measure</h2>
2481
2482 <p>
2483 Batch schedulers were built to answer one question well. Is the machine busy?
2484 </p>
2485
2486 <p>
2487 A job requests four nodes and eight GPUs for six hours. The scheduler grants it, marks those resources occupied, and reports them as utilised for the full window.
2488 </p>
2489
2490 <p>
2491 If the job finishes its real work in ninety minutes and spends the remaining four and a half hours writing checkpoints to a slow filesystem, the scheduler still reports six hours. If it requested eight GPUs and only ever saturated two, that is still eight GPUs reported busy.
2492 </p>
2493
2494 <p>
2495 This is allocation. It tells you the hardware was handed out and did not sit unclaimed in the queue. It says nothing about what happened inside the allocation once the job started.
2496 </p>
2497
2498 <p>
2499 Consumption is the other question, and answering it requires different instrumentation entirely.
2500 </p>
2501
2502 <p>
2503 Researchers from Boston University and Lawrence Berkeley National Laboratory studied this directly on Perlmutter, the supercomputer at NERSC. Analysing 118,276 jobs from July 2024 by combining GPU telemetry with scheduler job records, they found that compute utilisation was generally well balanced across most jobs, while memory utilisation stayed consistently low in over 50% of workloads.
2504 </p>
2505
2506 <div class="stat-callout">
2507 <div class="stat-number">28.64%</div>
2508 <div class="stat-label">mean peak GPU memory utilisation across 118,276 jobs on Perlmutter, against 71.77% mean peak GPU utilisation. 37.12% of jobs never exceeded 15% memory utilisation at any point in their run.</div>
2509 <div class="stat-source">SOURCE: PEARC ’25, GPU UTILIZATION ANALYSIS ON PERLMUTTER, JULY 2025</div>
2510 </div>
2511
2512 <p>
2513 None of that is a scheduling failure. The jobs ran, the allocations were honoured, and the utilisation dashboard looked healthy. The hardware was still doing less than it could.
2514 </p>
2515
2516 <h2>Four places the waste actually sits</h2>
2517
2518 <h3>Over-requested allocations</h3>
2519
2520 <p>
2521 The person submitting a job <a href="/resources/blogs/slurm-gpu-allocation-over-requesting">declares resources in advance</a>, before knowing exactly how the run will behave. Under-request, and the job dies at hour nine of a twelve-hour run, losing everything. Over-request, and nothing bad happens to them at all.
2522 </p>
2523
2524 <p>
2525 Anyone who has lost three days of work to an out-of-memory kill requests generously forever afterwards. That is rational, and n
2525o amount of internal messaging changes it, because the person bearing the cost of the failure is not the person bearing the cost of the padding.
2526 </p>
2527
2528 <h3>Idle time inside a live allocation</h3>
2529
2530 <p>
2531 Long jobs are not uniformly busy. There are data staging phases, checkpoint writes, barrier waits where the fastest ranks sit blocked until the slowest arrives, and post-processing steps that use one core out of a hundred and twenty-eight.
2532 </p>
2533
2534 <p>
2535 NVIDIA’s engineering teams treated this as a measurable quantity rather than an accepted cost. On their internal research clusters they built a dedicated GPU idle waste metric, joining device telemetry with scheduler job metadata, and reported reducing GPU waste from roughly 5.5% to about 1%.
2536 </p>
2537
2538 <p>
2539 That is one organisation’s internal result rather than an industry benchmark. What travels is the method: define the metric, set a baseline, rank workloads by how much waste each one causes, then go and talk to the teams responsible for the largest.
2540 </p>
2541
2542 <h3>Memory reserved and never touched</h3>
2543
2544 <p>
2545 The Perlmutter finding again, and the largest recoverable category in most GPU clusters.
2546 </p>
2547
2548 <p>
2549 Memory is the resource users are most conservative about, because memory failures are abrupt and unrecoverable. So it gets padded harder than anything else. It is also frequently the constraint that determines how many jobs can share a node, which means over-reservation here blocks more work than over-reservation anywhere else.
2550 </p>
2551
2552 <h3>Wall-clock padding</h3>
2553
2554 <p>
2555 Users request twelve hours for a job that takes four, because a job killed at the time limit loses everything.
2556 </p>
2557
2558 <p>
2559 Schedulers use requested duration for backfill decisions. Slurm’s own documentation is explicit that reasonably accurate time limits matter for backfill scheduling to work well, because the expected start time of pending jobs depends on when running jobs are expected to finish.
2560 </p>
2561
2562 <p>
2563 So inflated time limits degrade packing efficiency across the entire queue. One user’s caution slows everyone else down, and nothing in a utilisation report shows it.
2564 </p>
2565
2566 <h2>Why HPC waste is not cloud waste with different vocabulary</h2>
2567
2568 <p>
2569 This is where the analogy most people reach for breaks down.
2570 </p>
2571
2572 <p>
2573 In the cloud, waste has a legible price. Idle capacity appears on a monthly invoice. Somebody in finance can see it. The feedback loop is slow and indirect, but it exists.
2574 </p>
2575
2576 <p>
2577 On-premise HPC has no such loop. The hardware is capital expenditure, already purchased and already depreciating. Whether it runs at 40% or 90% effective utilisation, this month costs the same. Nothing appears anywhere to indicate that anything is wrong.
2578 </p>
2579
2580 <p>
2581 The cost surfaces in three other currencies.
2582 </p>
2583
2584 <p>
2585 <strong>Queue time.</strong> The real price is paid by researchers waiting for allocation. When jobs occupy more hardware than they need for longer than they need it, the queue lengthens and work that would have run this week runs next month. That is a research output cost, and it is invisible in any financial system.
2586 </p>
2587
2588 <p>
2589 <strong>Deferred capability.</strong> A centre running efficiently serves more science on the same hardware. A centre carrying substantial invisible waste needs its next procurement earlier, which in a <a href="/resources/blogs/sovereign-compute-infrastructure-cost-optimization">national programme</a> means competing for capital that has other claims on it.
2590 </p>
2591
2592 <p>
2593 <strong>Power and cooling.</strong> Occupied nodes draw power regardless of whether the accelerators inside them are doing useful work. For large systems this is a significant operating line and, increasingly, a reported sustainability metric.
2594 </p>
2595
2596 <p>
2597 There is a fourth consequence that is harder to quantify and matters more. When a centre reports high utilisation and requests expansion funding, and a reviewer later discovers that effective hardware usage was materially lower, the next funding conversation gets harder. Not through hostility. Through arithmetic.
2598 </p>
2599
2600 <h2>The measurement problem underneath all of this</h2>
2601
2602 <p>
2603 This persists not because HPC operators are careless, but because the standard instrumentation answers the wrong question and the tooling that answers the right one has to be assembled deliberately.
2604 </p>
2605
2606 <div class="pull-quote">
2607 "The scheduler knows what was allocated. Device telemetry knows what the hardware did. Neither one alone can tell you the difference."
2608 </div>
2609
2610 <p>
2611 Both the NVIDIA work and the Perlmutter analysis had to join the two, and that join is not something most centres have set up.
2612 </p>
2613
2614 <p>
2615 There is a second trap waiting for teams that do start measuring. The utilization percentage most people quote is defined by NVIDIA’s own management library as the share of time over the sample period during which one or more kernels was executing. It is a presence signal, not a capacity measure. A single small kernel produces the same reading as a job saturating the device.
2616 </p>
2617
2618 <p>
2619 Build an efficiency programme on that number and you will reach confident conclusions that are wrong.
2620 </p>
2621
2622 <h2>What to measure instead</h2>
2623
2624 <p>
2625 Five metrics that describe reality rather than bookkeeping.
2626 </p>
2627
2628 <p>
2629 <strong>Requested against consumed, per job.</strong> For CPU, memory and GPU separately. The ratio is the finding.
2630 </p>
2631
2632 <p>
2633 <strong><a href="/resources/blogs/gpu-utilization-metrics-dcgm-mig">GPU idle time within allocations</a>.</strong> The share of allocated GPU seconds during which the device did no meaningful work. This requires device telemetry joined to job records, and it is the single most valuable number a centre can start producing.
2634 </p>
2635
2636 <p>
2637 <strong>Memory high-water mark against memory requested.</strong> Given that memory is the most padded resource and often the binding constraint on node sharing, this ratio usually reveals the largest recoverable capacity.
2638 </p>
2639
2640 <p>
2641 <strong>Wall-clock requested against wall-clock used.</strong> Aggregate across the queue rather than per job. It tells you how much backfill efficiency is being lost to caution.
2642 </p>
2643
2644 <p>
2645 <strong>Spatial balance within multi-GPU jobs.</strong> Whether all devices in an allocation are doing comparable work. The Perlmutter analysis found imbalance both within and across nodes, and reported that utilisation imbalance was more pronounced than memory imbalance.
2646 </p>
2647
2648 <p>
2649 None of these require changing how anybody works. They require joining two data sources most centres already generate, and then looking at the result honestly.
2650 </p>
2651
2652 <h2>Where to start</h2>
2653
2654 <p>
2655 If you operate an HPC or GPU cluster and want to know whether this applies to you, the fastest useful exercise takes an afternoon.
2656 </p>
2657
2658 <p>
2659 Take the twenty largest jobs from last month by node hours. For each, compare requested resources against actual consumption using whatever telemetry you already collect, then compare requested wall clock against actual runtime.
2660 </p>
2661
2662 <p>
2663 If requests sit close to consumption, your centre is genuinely efficient and you should spend your attention elsewhere. If there is a consistent multiple between them, you have found capacity you already own and are already paying to power.
2664 </p>
2665
2666 <p>
2667 The second outcome is far more common, and it does not mean anybody did anything wrong. It means the incentive structure produced exactly what it rewards, and nobody has been asked to look.
2668 </p>
2669
2670 <p>
2671 <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure. The same engine works across <a href="/resources/blogs/slurm-vs-kubernetes-gpu-scheduling-cost">Kubernetes</a> in the cloud and HPC and GPU compute on premise. It is <a href="/security">read-only by default</a>, which is why it deploys in environments that write-access tools cannot enter.
2672 </p>
2673
2674 <h2>References</h2>
2675
2676 <ul>
2677 <li>Press Information Bureau, Government of India. <a href="https://www.pib.gov.in/PressReleasePage.aspx?PRID=2201437" target="_blank" rel="noopener noreferrer">National Supercomputing Mission deployment and utilisation, Lok Sabha reply, 10 December 2025</a>.</li>
2678 <li>Press Information Bureau, Government of India. <a href="https://www.pib.gov.in/PressReleasePage.aspx?PRID=2158517" target="_blank" rel="noopener noreferrer">NSM status, Lok Sabha reply, 20 August 2025</a>.</li>
2679 <li>Sencan, E., Kulkarni, D., Coskun, A., Konate, K. <a href="https://www.bu.edu/peaclab/files/2025/07/GPU_Utilization_Analysis_PEARC25.pdf" target="_blank" rel="noopener noreferrer">“Analyzing GPU Utilization in HPC Workloads: Insights from Large-Scale Systems.”</a> PEARC ’25, July 2025. DOI 10.1145/3708035.3736010.</li>
2680 <li>NVIDIA Technical Blog. <a href="https://developer.nvidia.com/blog/making-gpu-clusters-more-efficient-with-nvidia-data-center-monitoring/" target="_blank" rel="noopener noreferrer">“Making GPU Clusters More Efficient with NVIDIA Data Center Monitoring Tools.”</a> 25 November 2025.</li>
2681 <li>SchedMD. <a href="https://slurm.schedmd.com/sched_config.html" target="_blank" rel="noopener noreferrer">
2681Slurm Scheduling Configuration Guide</a>.</li>
2682 <li>NVIDIA. <a href="https://docs.nvidia.com/datacenter/dcgm/latest/dcgm-api/dcgm-api-field-ids.html" target="_blank" rel="noopener noreferrer">DCGM API field documentation</a>.</li>
2683 </ul>
2684
2685 </div>
2686
2687<div class="post-cta">
2688 <h3>Find the capacity you already own</h3>
2689 <p>OptOps joins scheduler records with device telemetry and shows you requested against consumed, per job, across your cluster. Read-only by default, air-gap capable. We'll run the twenty-largest-jobs exercise with you and put a number on it.</p>
2690 <div class="post-cta-buttons">
2691 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
2692 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
2693 </div>
2694 </div>
2695
2696<div class="faq-section">
2697 <h2>Frequently asked questions</h2>
2698
2699 <div class="faq-item">
2700 <div class="faq-q">Why are GPU clusters underutilized?</div>
2701 <p class="faq-a">Because users must declare resource requirements before a job runs and the consequences are asymmetric. <strong>Under-requesting kills a job and destroys hours of work, while over-requesting produces no visible penalty.</strong> Padding is therefore rational for each individual even though it degrades throughput for everyone. Idle periods inside long allocations, such as checkpoint writes and barrier waits, add further unused capacity.</p>
2702 </div>
2703
2704 <div class="faq-item">
2705 <div class="faq-q">What is a good GPU utilization rate for an HPC cluster?</div>
2706 <p class="faq-a">There is no universal target, and any single number should be treated sceptically. <strong>What matters is the ratio between requested and consumed resources rather than allocation percentage.</strong> Research on Perlmutter at NERSC found mean peak GPU memory utilisation of 28.64% across more than 118,000 jobs, with 37.12% of jobs never exceeding 15% memory utilisation.</p>
2707 </div>
2708
2709 <div class="faq-item">
2710 <div class="faq-q">Is HPC waste the same as cloud waste?</div>
2711 <p class="faq-a">No. <strong>Cloud waste appears on a monthly invoice, giving finance a visible signal. On-premise HPC hardware is already capitalised, so inefficiency produces no financial line item.</strong> The cost surfaces instead as longer queue times for researchers, earlier procurement cycles, and power drawn by nodes doing little useful work.</p>
2712 </div>
2713
2714 <div class="faq-item">
2715 <div class="faq-q">How do you measure GPU idle time in a cluster?</div>
2716 <p class="faq-a">By <strong>joining device telemetry with scheduler job metadata</strong>, since neither source answers the question alone. The scheduler records what was allocated and the telemetry records what the hardware did. NVIDIA’s published work used exactly this approach, tagging GPU activity with job context so that per-job idle waste became calculable.</p>
2717 </div>
2718
2719 <div class="faq-item">
2720 <div class="faq-q">Does the standard GPU utilization percentage show real efficiency?</div>
2721 <p class="faq-a">No, and this is a common misreading. <strong>NVIDIA defines that figure as the proportion of time during the sample period in which one or more kernels was executing.</strong> A single small kernel produces the same reading as a fully saturated device. SM activity, SM occupancy and memory bandwidth metrics give a far more accurate picture.</p>
2722 </div>
2723
2724 <div class="faq-item">
2725 <div class="faq-q">How do you reduce HPC infrastructure costs without buying less hardware?</div>
2726 <p class="faq-a">By <strong>recovering capacity that is allocated but unused.</strong> That means measuring requested against consumed resources per job, identifying systematic over-requesting, and reducing wall-clock padding to improve backfill efficiency. Because the hardware is already paid for, recovered capacity converts directly into additional throughput rather than a lower invoice.</p>
2727 </div>
2728 </div>
2729`,_3=`<div class="tldr-box">
2730 <div class="tldr-label">The short version</div>
2731 <ul class="tldr-list">
2732 <li><strong>Over-requesting is rational, not careless.</strong> Under-request and the job dies, losing days of work. Over-request and nothing visible happens. Given that payoff, padding is the correct individual decision.</li>
2733 <li><strong>The queue pays the price.</strong> Inflated time limits degrade Slurm's backfill scheduling for everyone, invisibly.</li>
2734 <li><strong>Guidance doesn't change behaviour. Defaults and visibility do.</strong> Five interventions that actually shift how people request resources.</li>
2735 </ul>
2736 </div>
2737
2738<div class="post-body">
2739
2740 <p>
2741 Every HPC centre has a version of the same conversation. Someone in operations notices that jobs are reserving far more than they use. They send a message asking people to be more accurate with their requests. Nothing changes. Six months later they send it again.
2742 </p>
2743
2744 <p>
2745 The message fails for a reason worth understanding, because it explains why most attempts at this go nowhere.
2746 </p>
2747
2748 <p>
2749 Over-requesting is not a knowledge problem. Most researchers know roughly what their jobs need. They pad anyway, and given how the incentives are arranged, they are right to.
2750 </p>
2751
2752 <h2>The asymmetry that drives everything</h2>
2753
2754 <p>
2755 Consider the two ways a resource request can be wrong.
2756 </p>
2757
2758 <p>
2759 Request too little, and the job dies. Out of memory nine hours into a twelve-hour run, or terminated at the time limit just before the final checkpoint writes. Days of work gone. The researcher resubmits, waits in the queue again, and explains the delay to a supervisor or a funder.
2760 </p>
2761
2762 <p>
2763 Request too much, and nothing happens. The job runs. The results arrive. Nobody sends a message. The cost lands on a shared resource that no individual is accountable for, spread thinly across everyone else as slightly longer queue times.
2764 </p>
2765
2766 <div class="pull-quote">
2767 "Anyone who has lost three days to a memory failure will over-request for the rest of their career, and n
2767o amount of internal communication changes that, because the communication does not change the payoff."
2768 </div>
2769
2770 <p>
2771 Anyone who has looked at <a href="/resources/blogs/pod-rightsizing-vpa-not-enough">container resource requests in Kubernetes</a> will recognise this exactly. <a href="/resources/blogs/slurm-vs-kubernetes-gpu-scheduling-cost">Same mechanism, different vocabulary</a>.
2772 </p>
2773
2774 <h2>What it costs, beyond the obvious</h2>
2775
2776 <p>
2777 Two effects. The second is worse than most people assume.
2778 </p>
2779
2780 <p>
2781 <strong>Hardware held and unused.</strong> A job holding eight accelerators while genuinely using two occupies six devices that could have run other work. Multiply that across a queue and the effective capacity of the cluster drops well below what was purchased.
2782 </p>
2783
2784 <p>
2785 <strong>Degraded scheduling for everyone else.</strong> This is the expensive one and it is almost never discussed.
2786 </p>
2787
2788 <p>
2789 Batch schedulers fill gaps by starting smaller jobs when they can finish before a larger reserved job is due to begin. That calculation depends on how long each job says it will run. Slurm’s own documentation states the point plainly: because the expected start time of pending jobs depends on when running jobs are expected to complete, reasonably accurate time limits are important for backfill scheduling to work well.
2790 </p>
2791
2792 <p>
2793 So a job that reserves twelve hours and finishes in four does not merely waste eight hours of hardware. It caused the scheduler to make eight hours of decisions based on information that was wrong, keeping other jobs out of gaps they would have fitted into. Time padding degrades throughput across the entire queue, and it does so invisibly.
2794 </p>
2795
2796 <h2>Why nobody notices</h2>
2797
2798 <p>
2799 The instrumentation most centres run answers a different question from the one that matters.
2800 </p>
2801
2802 <p>
2803 Schedulers record what was allocated. They know a job asked for eight accelerators and held them for twelve hours, and they <a href="/resources/blogs/hpc-cost-optimization-gpu-cluster-utilization">report that as utilisation</a>. What they cannot see is what the hardware did inside that window. A device reserved and idle looks identical to a device reserved and saturated.
2804 </p>
2805
2806 <p>
2807 Getting the real picture means combining scheduler records with <a href="/resources/blogs/gpu-utilization-metrics-dcgm-mig">hardware telemetry</a>, which is a deliberate exercise most centres have never set up. Neither data source answers the question alone.
2808 </p>
2809
2810 <p>
2811 NVIDIA’s engineering teams did exactly this on their internal research clusters, defining a specific measure of GPU idle waste and tracking it rather than relying on general dashboards. They reported bringing GPU waste down from roughly 5.5% to about 1%.
2812 </p>
2813
2814 <p>
2815 That is one organisation’s internal result, not an industry benchmark. What travels is the approach. They measured a clear baseline, ranked workloads by how much waste each one caused, and worked directly with the teams responsible for the largest.
2816 </p>
2817
2818 <h2>Five things that actually change behaviour</h2>
2819
2820 <p>
2821 Since asking people to be more accurate does not work, the useful interventions change either what happens by default or what people can see without effort.
2822 </p>
2823
2824 <h3>Show researchers their own numbers</h3>
2825
2826 <p>
2827 Most users have never seen a comparison between what they requested and what they used. Not because they are uninterested, but because producing it takes effort and nobody has done it for them.
2828 </p>
2829
2830 <p>
2831 A monthly summary sent to each user, showing requested against actual consumption for their jobs, shifts behaviour more reliably than any policy document. People are not defending their padding. They have simply never been shown it.
2832 </p>
2833
2834 <h3>Set defaults from observed data</h3>
2835
2836 <p>
2837 If typical memory consumption on a partition sits well below the default allocation, lower the default. Researchers who genuinely need more will ask for it. The ones who were accepting whatever the default happened to be stop consuming capacity they never needed.
2838 </p>
2839
2840 <p>
2841 Defaults do more work than policies, because they require nobody to do anything.
2842 </p>
2843
2844 <h3>Match hardware to workload</h3>
2845
2846 <p>
2847 In a mixed cluster, a request that does not specify what kind of accelerator it needs can land a small inference task on your most capable hardware, while a large training job queues behind it.
2848 </p>
2849
2850 <p>
2851 Configuring the scheduler so jobs can request appropriate hardware, and steering light workloads away from premium devices by default, recovers meaningful capacity in any centre running more than one generation of hardware.
2852 </p>
2853
2854 <h3>Separate short jobs from long ones</h3>
2855
2856 <p>
2857 Short and long jobs interact badly in a shared queue. Separating them, with tighter time limits on the short queue, gives the scheduler far more room to fill gaps efficie
2857ntly.
2858 </p>
2859
2860 <p>
2861 It also reduces the incentive to pad, because a job that fits the short queue gets scheduled sooner. That rewards accurate estimation rather than penalising inaccuracy, which is the right way round.
2862 </p>
2863
2864 <h3>Partition devices where workloads are genuinely small</h3>
2865
2866 <p>
2867 Modern accelerators can be <a href="/resources/blogs/gpu-utilization-metrics-dcgm-mig">divided into smaller isolated instances</a>, each with a dedicated slice of memory and compute. For inference, development sessions, notebooks and data preparation, this turns one device serving one small job into several.
2868 </p>
2869
2870 <p>
2871 It suits clusters with a clear population of small jobs, and adds unhelpful complexity to clusters that mostly run large training. Look at the actual distribution of job sizes before deciding.
2872 </p>
2873
2874 <h2>What good sizing looks like</h2>
2875
2876 <p>
2877 Sizing well means working from observed behaviour rather than from peaks, averages, or the memory of one bad experience.
2878 </p>
2879
2880 <p>
2881 <strong>Memory</strong> should be set from the observed high-water mark across recent runs of the same workload, plus a deliberate margin. Not the largest value ever recorded, and not the mean.
2882 </p>
2883
2884 <p>
2885 <strong>Accelerator count</strong> should reflect what the job can actually keep busy. A four-device job where one is saturated and three sit idle usually means the workload is not parallelising the way its author assumed. That is worth knowing regardless of cost.
2886 </p>
2887
2888 <p>
2889 <strong>Time limits</strong> should come from observed runtime plus a margin, and are best handled through partition defaults rather than left to individual judgement. Padding here is cheap for one person and expensive for everyone.
2890 </p>
2891
2892 <div class="key-point">
2893 <div class="key-point-label">The goal, stated honestly</div>
2894 <p>The goal is not minimum allocation. A cluster pushed toward zero headroom fails jobs, and losing user trust costs far more than any efficiency gain is worth. The goal is removing padding that exists because nobody measured, while keeping the headroom workloads genuinely need.</p>
2895 </div>
2896
2897 <h2>Where this usually ends up</h2>
2898
2899 <p>
2900 Centres that run this exercise tend to find the same shape of answer. A minority of workloads account for most of the over-requesting, and they are usually large recurring jobs whose resource specification was written once, years ago, and copied ever since.
2901 </p>
2902
2903 <p>
2904 That is good news. It means this is tractable without asking everybody to change how they work. Revisit the twenty largest recurring workloads and you will have recovered most of the available capacity.
2905 </p>
2906
2907 <p>
2908 And because the hardware is <a href="/resources/blogs/sovereign-compute-infrastructure-cost-optimization">already bought and already drawing power</a>, recovered capacity does not reduce a bill. It becomes additional research output on the same installed base.
2909 </p>
2910
2911 <p>
2912 <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure. The same engine works across Kubernetes in the cloud and HPC and GPU compute on premise, learning how each workload actually behaves and producing sized recommendations rather than applying static rules. Read-only by default.
2913 </p>
2914
2915 <h2>References</h2>
2916
2917 <ul>
2918 <li>NVIDIA Technical Blog. <a href="https://developer.nvidia.com/blog/making-gpu-clusters-more-efficient-with-nvidia-data-center-monitoring/" target="_blank" rel="noopener noreferrer">“Making GPU Clusters More Efficient with NVIDIA Data Center Monitoring Tools.”</a> 25 November 2025.</li>
2919 <li>SchedMD. <a href="https://slurm.schedmd.com/sched_config.html" target="_blank" rel="noopener noreferrer">Slurm Scheduling Configuration Guide, backfill scheduling</a>.</li>
2920 <li>SchedMD. <a href="https://slurm.schedmd.com/faq.html" target="_blank" rel="noopener noreferrer">Slurm Frequently Asked Questions, time limits and backfill</a>.</li>
2921 </ul>
2922
2923 </div>
2924
2925<div class="post-cta">
2926 <h3>Show every researcher their own numbers</h3>
2927 <p>OptOps produces the requested-against-consumed comparison automatically, per job and per user, from telemetry you already generate. Read-only by default. See what your twenty largest recurring workloads are actually holding.</p>
2928 <div class="post-cta-buttons">
2929 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
2930 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
2931 </div>
2932 </div>
2933
2934<div class="faq-section">
2935 <h2>Frequently asked questions</h2>
2936
2937 <div class="faq-item">
2938 <div class="faq-q">Why do researchers over-request GPUs?</div>
2939 <p class="faq-a">Because the consequences are asymmetric. <strong>
2939A job that under-requests dies and destroys hours or days of work, while a job that over-requests simply runs with no visible penalty</strong> for the person who submitted it. The cost is absorbed by the shared queue rather than by the individual, so padding stays rational even when users understand its effect.</p>
2940 </div>
2941
2942 <div class="faq-item">
2943 <div class="faq-q">How do you reduce GPU over-allocation in a shared cluster?</div>
2944 <p class="faq-a">By <strong>changing defaults and visibility rather than by issuing guidance.</strong> Showing researchers a regular comparison of what they requested against what they used, setting partition defaults from observed consumption, separating short jobs from long ones, and matching workloads to appropriate hardware all shift behaviour. Guidance alone does not, because it leaves the underlying incentives unchanged.</p>
2945 </div>
2946
2947 <div class="faq-item">
2948 <div class="faq-q">Does over-requesting time affect other users?</div>
2949 <p class="faq-a">Yes, more than most people expect. <strong>Slurm’s documentation notes that backfill scheduling depends on reasonably accurate time limits</strong>, since the expected start time of pending jobs is calculated from when running jobs are expected to finish. Inflated time limits cause the scheduler to leave gaps unfilled, reducing throughput across the whole queue rather than only for the padded job.</p>
2950 </div>
2951
2952 <div class="faq-item">
2953 <div class="faq-q">Why do cluster utilisation reports look healthy when there is waste?</div>
2954 <p class="faq-a">Because they usually <strong>measure allocation rather than consumption.</strong> A scheduler records that a job reserved eight devices for twelve hours and reports that as utilisation, with no visibility into what the hardware did during that window. A reserved idle device is indistinguishable from a reserved busy one without separate hardware telemetry.</p>
2955 </div>
2956
2957 <div class="faq-item">
2958 <div class="faq-q">What is the fastest way to find over-allocation?</div>
2959 <p class="faq-a"><strong>Look at the largest recurring workloads first, ranked by total hardware hours rather than by percentage inefficiency.</strong> Waste concentrates in a small number of big jobs whose resource specifications were set once and never revisited. Fixing those recovers most of the available capacity without changing how anyone else works.</p>
2960 </div>
2961
2962 <div class="faq-item">
2963 <div class="faq-q">Does improving cluster efficiency reduce costs?</div>
2964 <p class="faq-a">On owned hardware it usually does not reduce spending, because the equipment is already purchased and depreciating. <strong>The return appears as additional capacity on the same installed base:</strong> more jobs served, shorter queue waits, and procurement cycles that can be deferred.</p>
2965 </div>
2966 </div>
2967`,V3=`<div class="tldr-box">
2968 <div class="tldr-label">The short version</div>
2969 <ul class="tldr-list">
2970 <li><strong>Sovereign compute cannot use cloud cost tools.</strong> Telemetry can't leave the environment, many clusters are air-gapped, and there is no invoice to optimize against.</li>
2971 <li><strong>The waste is real but denominated differently.</strong> It appears as queue time, deferred capability, power draw, and earlier procurement — not as a monthly bill.</li>
2972 <li><strong>Optimization has to run inside the environment,</strong> read-only by default, and report in capacity terms: node hours recovered, jobs served, procurement deferred.</li>
2973 </ul>
2974 </div>
2975
2976<div class="post-body">
2977
2978 <p>
2979 There is a category of compute that the cloud cost management industry has quietly ignored.
2980 </p>
2981
2982 <p>
2983 It is growing quickly. India’s IndiaAI Mission was approved by the Union Cabinet in March 2024 with a total outlay of ₹10,371.92 crore, roughly 1.25 billion dollars over five years, and compute capacity is its largest single pillar. As of March 2026 the government reported more than 38,000 GPUs onboarded through the mission’s common compute facility, a figure officially stated as 38,231. Separately, the National Supercomputing Mission had deployed 37 supercomputers totalling 40 petaflops as of December 2025.
2984 </p>
2985
2986 <div class="stat-callout">
2987 <div class="stat-number">38,231</div>
2988 <div class="stat-label">GPUs onboarded through the IndiaAI Mission's common compute facility as of March 2026 — with comparable sovereign programmes running across the Gulf, Africa and Southeast Asia.</div>
2989 <div class="stat-source">SOURCE: PRESS INFORMATION BUREAU, GOVERNMENT OF INDIA, MARCH 2026</div>
2990 </div>
2991
2992 <p>
2993 Comparable programmes are running across the Gulf, and data localisation requirements are driving similar builds across Africa and Southeast Asia.
2994 </p>
2995
2996 <p>
2997 None of this infrastructure can use the tools that manage cloud cost, and the reason is not technical readiness. It is architectural.
2998 </p>
2999
3000 <h2>What sovereign compute actually means</h2>
3001
3002 <p>
3003 The term gets used loosely, so it is worth being precise.
3004 </p>
3005
3006 <p>
3007 Sovereign compute is infrastructure where the physical location of the hardware, the jurisdiction governing the data, and the chain of control over operations are all deliberately constrained. Typically this means the hardware sits in-country, the data never leaves national boundaries, and no foreign entity holds operational control over the systems.
3008 </p>
3009
3010 <p>
3011 In practice it covers national supercomputing facilities, government AI compute programmes, defence and intelligence infrastructure, central bank and financial regulator systems, and increasingly the on-premise estates that <a href="/resources/blogs/kubernetes-cost-optimization-bfsi-playbook">regulated enterprises build</a> because their data cannot go anywhere else.
3012 </p>
3013
3014 <p>
3015 The common thread is not secrecy. It is that the normal assumptions of cloud operations do not hold.
3016 </p>
3017
3018 <h2>Four assumptions that break</h2>
3019
3020 <h3>That telemetry can leave the environment</h3>
3021
3022 <p>
3023 Almost every cloud cost platform works by shipping metrics to a vendor’s infrastructure, analysing them there, and returning recommendations through a hosted console.
3024 </p>
3025
3026 <p>
3027 For sovereign environments this is frequently a non-starter, and the objection is not about how sensitive utilisation metrics look in isolation. Aggregate infrastructure telemetry from a national facility reveals capacity, workload patterns, procurement cycles and operational tempo. That is strategically meaningful regardless of how mundane any individual data point appears.
3028 </p>
3029
3030 <p>
3031 Anything requiring an outbound connection to a vendor’s cloud is excluded before the technical evaluation begins.
3032 </p>
3033
3034 <h3>That the environment is connected at all</h3>
3035
3036 <p>
3037 A significant share of this infrastructure is air-gapped or sits behind one-way data diodes. There is no outbound path to license-check, no telemetry pipeline, no automatic updates, and no possibility of a hosted control plane.
3038 </p>
3039
3040 <p>
3041 Software that assumes connectivity does not degrade gracefully in these environments. It simply does not run.
3042 </p>
3043
3044 <h3>That waste shows up as a bill</h3>
3045
3046 <p>
3047 This is the deepest difference and the one that most changes what optimisation has to mean.
3048 </p>
3049
3050 <p>
3051 Cloud cost optimisation is built on a feedback loop. Consumption produces an invoice, the invoice creates pressure, the pressure funds the work. Sovereign infrastructure is capital expenditure. The hardware was procured, commissioned and depreciated. Whether it runs at 40% or 90% effective efficiency, this month costs exactly the same.
3052 </p>
3053
3054 <p>
3055 So there is no invoice to react to, and every tool built around bill analysis has nothing to analyse.
3056 </p>
3057
3058 <p>
3059 The cost is real, just denominated differently. It appears as queue time for researchers who cannot get allocation, as capability a national programme cannot deliver on hardware it already owns, as power drawn by nodes doing little useful work, and as procurement cycles arriving earlier than they needed to. For a mission with a fixed multi-year budget, that last one is the expensive currency. Capacity recovered from existing systems is capacity that does not have to be bought again.
3060 </p>
3061
3062 <h3>That write access is a technical question</h3>
3063
3064 <p>
3065 In commercial cloud environments, granting a management platform permission to change infrastructure is a risk assessment. In sovereign environments it is frequently a policy prohibition, and policy does not yield to arguments about how reliable the automation is.
3066 </p>
3067
3068 <p>
3069 Separation of duties requirements in most <a href="/resources/blogs/kubernetes-cost-optimization-government-public-sector">government change-management frameworks</a> are explicit that the party proposing a change cannot be the party executing it without authorisation. An autonomous optimiser collapses those roles by design. During an audit, attributing a production change to an optimiser is not an acceptable answer.
3070 </p>
3071
3072 <h2>What optimisation has to look like instead</h2>
3073
3074 <p>
3075 Take those four constraints seriously and the shape of a workable approach follows directly.
3076 </p>
3077
3078 <p>
3079 <strong>Analysis runs where the data is.</strong> Telemetry is collected, processed and turned into recommendations inside the customer’s environment. Nothing about workload behaviour crosses the boundary. This has to be decided early, because retrofitting it into a hosted platform is close to a rewrite.
3080 </p>
3081
3082 <p>
3083 <strong>It works disconnected.</strong> No outbound calls as a condition of functioning. No hosted control plane holding state the cluster depends on.
3084 </p>
3085
3086 <p>
3087 <strong><a href="/security">Read-only</a> is the default posture.</strong> The system observes and recommends. Humans decide. Where changes are applied, the permission is scoped to that specific approved action, time-bound and revocable, with the audit trail landing in systems the operator already runs rather than 
3087in a vendor console.
3088 </p>
3089
3090 <p>
3091 <strong>Value is expressed in capacity, not currency.</strong> A recommendation that says a change saves a certain number of dollars per month is meaningless when the hardware is already bought. The useful framing is node hours recovered, queue time reduced, additional jobs served on the same installed base. That is what a facility director reports upward, and it is what determines whether the next procurement can be deferred.
3092 </p>
3093
3094 <p>
3095 <strong>It handles heterogeneous hardware.</strong> Sovereign estates accumulate. Systems arrive in procurement waves years apart, mixing accelerator generations, interconnects and schedulers. Anything assuming a uniform fleet fails on contact.
3096 </p>
3097
3098 <h2>The thing nobody wants to say out loud</h2>
3099
3100 <p>
3101 Facilities of this kind report utilisation figures in the eighties and nineties, and those numbers are honest. They are also, almost always, measuring <a href="/resources/blogs/hpc-cost-optimization-gpu-cluster-utilization">allocation rather than consumption</a>.
3102 </p>
3103
3104 <p>
3105 India’s own reporting illustrates how soft these numbers can be. In August 2025 the government described NSM systems as running at over 85% capacity with many exceeding 95%. In December 2025, with the same 37 systems and the same 40 petaflops installed, the reported figure was over 81% with few exceeding 95%. No official source defines what the percentage measures.
3106 </p>
3107
3108 <p>
3109 That distinction matters because a job requesting eight GPUs and saturating two still registers as eight GPUs occupied, and a twelve-hour allocation finishing its real work in four still registers twelve hours used. Research analysing more than 118,000 jobs on the Perlmutter system at NERSC found mean peak GPU memory utilisation of 28.64%, with over half of workloads showing consistently low memory utilisation, even though compute utilisation was generally well balanced.
3110 </p>
3111
3112 <p>
3113 This creates an uncomfortable dynamic for facility operators. Reporting high utilisation is how expansion funding gets justified. Investigating effective utilisation risks producing a number that complicates that case.
3114 </p>
3115
3116 <div class="key-point">
3117 <div class="key-point-label">The honest position</div>
3118 <p>These are different metrics answering different questions, and both are worth having. A facility that can demonstrate it recovered 20% more throughput from existing hardware is making a stronger argument for expansion, not a weaker one, because it is showing stewardship of capital already committed. Reviewers respond to that. The alternative, where a reviewer discovers the gap independently, is considerably worse.</p>
3119 </div>
3120
3121 <h2>What this means if you operate one of these facilities</h2>
3122
3123 <p>
3124 Three things worth doing regardless of what tooling you eventually adopt.
3125 </p>
3126
3127 <p>
3128 <strong>Measure consumption, not just allocation.</strong> Join scheduler records with <a href="/resources/blogs/gpu-utilization-metrics-dcgm-mig">device telemetry</a> and produce a <a href="/resources/blogs/slurm-gpu-allocation-over-requesting">requested-against-consumed figure per job</a>. Most facilities have both data sources already and have never joined them.
3129 </p>
3130
3131 <p>
3132 <strong>Establish the access position before evaluating anything.</strong> Decide what a third-party system would be permitted to see, whether anything may leave the environment, and whether write access is available at all. Answering this first eliminates whole categories of tooling before anyone spends a quarter on a pilot that was never deployable.
3133 </p>
3134
3135 <p>
3136 <strong>Express efficiency in mission terms.</strong> Node hours recovered and jobs served translate into research output and deferred procurement. Currency saved does not, when nobody is paying a monthly bill.
3137 </p>
3138
3139 <h2>Why this matters beyond any single facility</h2>
3140
3141 <p>
3142 National compute programmes are funded on the argument that domestic AI and scientific capability depends on domestic infrastructure. That argument is sound. It also carries an obligation, because a mission with a fixed budget that runs its hardware inefficiently delivers less capability than the funding was meant to buy.
3143 </p>
3144
3145 <p>
3146 Efficiency in this context is not a cost-saving exercise. It is how much science and how much national capability gets produced per unit of capital already spent. That is a different c
3146onversation from cloud cost management, and it needs different tools, a different security model, and a different definition of what a good result looks like.
3147 </p>
3148
3149 <p>
3150 <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure, built for environments where write access to production is not available. Analysis runs inside your environment, the default posture is read-only, and the same engine covers Kubernetes in the cloud and HPC and GPU compute on premise. OptOps is a DPIIT-recognised startup and a member of the NVIDIA Inception programme.
3151 </p>
3152
3153 <h2>References</h2>
3154
3155 <ul>
3156 <li>Press Information Bureau, Government of India. <a href="https://www.pib.gov.in/PressReleaseIframePage.aspx?PRID=2012355" target="_blank" rel="noopener noreferrer">Cabinet approves IndiaAI Mission, 7 March 2024</a>.</li>
3157 <li>Press Information Bureau, Government of India. <a href="https://www.pib.gov.in/PressReleasePage.aspx?PRID=2245069" target="_blank" rel="noopener noreferrer">IndiaAI compute capacity, Lok Sabha reply, 25 March 2026</a>.</li>
3158 <li>Press Information Bureau, Government of India. <a href="https://www.pib.gov.in/PressReleasePage.aspx?PRID=2201437" target="_blank" rel="noopener noreferrer">National Supercomputing Mission status, Lok Sabha reply, 10 December 2025</a>.</li>
3159 <li>Press Information Bureau, Government of India. <a href="https://www.pib.gov.in/PressReleasePage.aspx?PRID=2158517" target="_blank" rel="noopener noreferrer">NSM status, Lok Sabha reply, 20 August 2025</a>.</li>
3160 <li>Sencan, E., Kulkarni, D., Coskun, A., Konate, K. <a href="https://www.bu.edu/peaclab/files/2025/07/GPU_Utilization_Analysis_PEARC25.pdf" target="_blank" rel="noopener noreferrer">“Analyzing GPU Utilization in HPC Workloads: Insights from Large-Scale Systems.”</a> PEARC ’25, July 2025. DOI 10.1145/3708035.3736010.</li>
3161 </ul>
3162
3163 </div>
3164
3165<div class="post-cta">
3166 <h3>Built for the environments cloud tools cannot enter</h3>
3167 <p>OptOps runs entirely inside your environment — on-prem, air-gapped, read-only by default — and reports efficiency in capacity terms: node hours recovered, jobs served, procurement deferred. Deployed with an authorised national supercomputing programme.</p>
3168 <div class="post-cta-buttons">
3169 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
3170 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
3171 </div>
3172 </div>
3173
3174<div class="faq-section">
3175 <h2>Frequently asked questions</h2>
3176
3177 <div class="faq-item">
3178 <div class="faq-q">What is sovereign compute?</div>
3179 <p class="faq-a">Infrastructure where <strong>the physical location of the hardware, the jurisdiction governing the data, and operational control are all deliberately constrained</strong>, typically requiring that hardware sits in-country and that no foreign entity holds operational control. It covers national supercomputing facilities, government AI compute programmes, defence systems, and regulated enterprise estates built on-premise because data residency requirements prevent using public cloud.</p>
3180 </div>
3181
3182 <div class="faq-item">
3183 <div class="faq-q">Why can sovereign clusters not use cloud cost optimization tools?</div>
3184 <p class="faq-a">Most cloud cost platforms <strong>send telemetry to vendor-hosted infrastructure for analysis, which is frequently prohibited outright.</strong> Many sovereign environments are also air-gapped, so software requiring outbound connectivity cannot function. Additionally, these tools are built to analyse invoices, and capital-funded on-premise infrastructure does not generate one.</p>
3185 </div>
3186
3187 <div class="faq-item">
3188 <div class="faq-q">How do air-gapped clusters get optimized?</div>
3189 <p class="faq-a"><strong>Analysis has to run entirely inside the environment</strong>, with telemetry collected, processed and converted into recommendations locally and nothing crossing the boundary. The system must function without outbound connectivity or a hosted control plane, and recommendations should surface through interfaces the operator already runs rather than a vendor console.</p>
3190 </div>
3191
3192 <div class="faq-item">
3193 <div class="faq-q">
3193Does data residency affect infrastructure cost management?</div>
3194 <p class="faq-a">Substantially. <strong>Where residency rules apply, any tool that transmits telemetry to external infrastructure is excluded regardless of technical merit.</strong> This narrows the available options to systems designed for in-environment analysis, which is a small subset of the cloud cost management market.</p>
3195 </div>
3196
3197 <div class="faq-item">
3198 <div class="faq-q">How do you measure ROI on infrastructure that is already paid for?</div>
3199 <p class="faq-a"><strong>In capacity rather than currency.</strong> Because the hardware is capitalised, efficiency gains do not reduce a monthly bill. The meaningful measures are node hours recovered, reduction in queue wait times, additional jobs served on the same installed base, and procurement cycles deferred. For a fixed-budget programme, deferred procurement is usually the largest single benefit.</p>
3200 </div>
3201
3202 <div class="faq-item">
3203 <div class="faq-q">Why do government facilities report high utilisation but still have waste?</div>
3204 <p class="faq-a">Because <strong>reported utilisation usually measures allocation rather than consumption, and published figures rarely define which.</strong> A job holding eight GPUs while saturating two counts as eight GPUs occupied. Research on more than 118,000 jobs at NERSC found mean peak GPU memory utilisation of 28.64%, with memory utilisation staying low in over half of workloads.</p>
3205 </div>
3206 </div>
3207`,L3=`<div class="tldr-box">
3208 <div class="tldr-label">The short version</div>
3209 <ul class="tldr-list">
3210 <li><strong>The nvidia-smi utilization number is a duty cycle, not an efficiency measure.</strong> A single tiny kernel produces the same reading as a job saturating the device.</li>
3211 <li><strong>DCGM profiling fields answer the real question:</strong> SM activity, SM occupancy, memory bandwidth activity, and memory used against memory allocated.</li>
3212 <li><strong>The value is in the join.</strong> Telemetry tied to scheduler job IDs makes per-job idle waste calculable — NVIDIA cut internal GPU waste from roughly 5.5% to about 1% this way.</li>
3213 </ul>
3214 </div>
3215
3216<div class="post-body">
3217
3218 <p>
3219 Most teams running GPU infrastructure track utilization. Far fewer are tracking what they think they are tracking.
3220 </p>
3221
3222 <p>
3223 The number almost everyone starts with comes from <code>nvidia-smi</code>, and it is genuinely useful for what it was designed to do. It is also probably the most misread metric in accelerated computing, and building an efficiency programme on it produces confident conclusions that are wrong.
3224 </p>
3225
3226 <h2>What the utilization number actually means</h2>
3227
3228 <p>
3229 When <code>nvidia-smi</code> reports GPU utilization at 100%, most people read it as the device working at full capacity.
3230 </p>
3231
3232 <p>
3233 NVIDIA’s own management library defines it differently. The figure is the percentage of time over the past sample period during which one or more kernels was executing on the GPU.
3234 </p>
3235
3236 <p>
3237 That is the whole definition. It is a duty cycle, a presence signal averaged over time. It says a kernel was running. It says nothing about how much of the hardware that kernel was using.
3238 </p>
3239
3240 <div class="pull-quote">
3241 "A single tiny kernel occupying a fraction of the available streaming multiprocessors produces the same reading as a job saturating every SM on the card. Both show high utilization. One is holding an expensive device hostage."
3242 </div>
3243
3244 <p>
3245 This is why teams reach a strange impasse. Utilization dashboards look healthy. Queue times are long. Researchers complain they cannot get allocation. Everything appears busy and nothing appears to be the problem.
3246 </p>
3247
3248 <h2>What to measure instead</h2>
3249
3250 <p>
3251 NVIDIA Data Center GPU Manager exposes device telemetry at a granularity that answers the actual question. Three profiling fields carry most of the value.
3252 </p>
3253
3254 <h3>SM activity and SM occupancy</h3>
3255
3256 <p>
3257 <code>DCGM_FI_PROF_SM_ACTIVE</code> reports the ratio of cycles during which an SM has at least one warp assigned. <code>DCGM_FI_PROF_SM_OCCUPANCY</code> reports the ratio of warps resident on an SM against the maximum it supports.
3258 </p>
3259
3260 <p>
3261 Together these describe how much of the GPU’s compute capability was engaged rather than whether anything at all was running. A job with high busy-time but low SM activity is exactly the profile the basic utilization number hides. This distinction is the single most useful thing DCGM gives you.
3262 </p>
3263
3264 <h3>Memory bandwidth activity</h3>
3265
3266 <p>
3267 <code>DCGM_FI_PROF_DRAM_ACTIVE</code> reports the ratio of cycles during which the device memory interface is actively sending or receiving data.
3268 </p>
3269
3270 <p>
3271 Many workloads are bound by memory bandwidth rather than compute. If bandwidth is saturated while SM activity is modest, the job is behaving normally and there is no waste to re
3271cover. Without this metric you would misdiagnose it as inefficiency and go looking for a problem that does not exist.
3272 </p>
3273
3274 <h3>Memory used against memory allocated</h3>
3275
3276 <p>
3277 Consistently the largest source of recoverable capacity in GPU clusters.
3278 </p>
3279
3280 <p>
3281 Researchers from Boston University and Lawrence Berkeley National Laboratory analysed 118,276 jobs on Perlmutter at NERSC, combining DCGM telemetry sampled every ten seconds with scheduler job records. Mean peak GPU utilisation across those jobs was 71.77%. Mean peak GPU memory utilisation was 28.64%. More than a third of jobs, 37.12%, never exceeded 15% memory utilisation at any point.
3282 </p>
3283
3284 <p>
3285 Memory is padded harder than anything else because memory failures are abrupt and unrecoverable. It is also frequently the constraint determining how many jobs can share a device, which means over-reservation here blocks more work than over-reservation anywhere else.
3286 </p>
3287
3288 <h3>Per-device balance within a multi-GPU job</h3>
3289
3290 <p>
3291 A four-GPU job where one device works and three idle is common and rarely noticed, because aggregate metrics average it away. The Perlmutter study found spatial imbalance both within nodes and across nodes in the same job, and reported that utilisation imbalance was more pronounced than memory imbalance.
3292 </p>
3293
3294 <p>
3295 This is usually worth surfacing to the researcher rather than to operations. It often means the workload is not parallelising the way its author believed, which is a correctness and performance issue as much as a cost one.
3296 </p>
3297
3298 <h2>Joining telemetry to jobs, which is where it gets useful</h2>
3299
3300 <p>
3301 Device metrics on their own tell you the fleet is inefficient. They cannot tell you <a href="/resources/blogs/slurm-gpu-allocation-over-requesting">which job, which user</a> or which workload pattern is responsible, and without that you cannot act.
3302 </p>
3303
3304 <p>
3305 The join is the hard part and the part worth building. DCGM Exporter supports associating GPU metrics with scheduler job identifiers, which is what makes per-job idle waste calculable at all.
3306 </p>
3307
3308 <p>
3309 NVIDIA’s own engineering teams took exactly this approach on their internal research clusters. They aligned real-time DCGM telemetry with Slurm job metadata to build a unified view of how workloads actually consumed GPU resources. Slurm provided data at five-minute granularity, coarser than the DCGM fields, but sufficient for the join. On top of that they defined a dedicated GPU idle waste metric to establish a baseline and measure movement, then worked directly with the teams whose workflows drove the highest idle impact. The reported result was a reduction in GPU waste from roughly 5.5% to about 1%.
3310 </p>
3311
3312 <p>
3313 That is one organisation’s internal result rather than an industry benchmark. Three things about the programme are worth copying regardless of your environment.
3314 </p>
3315
3316 <p>
3317 They <strong>defined a specific metric</strong> rather than watching general dashboards, which meant improvement could be measured rather than asserted. They <strong>went to the users</strong> whose jobs caused the most waste instead of broadcasting policy to everyone. And they <strong>built self-serve tooling</strong> so improvements scaled beyond the people running the analysis.
3318 </p>
3319
3320 <div class="key-point">
3321 <div class="key-point-label">Implementation note</div>
3322 <p>NVIDIA's primary indicator in that work was the device-level utilization field, with a stated intention to move toward graphics engine activity as a more precise signal. If you are building this now, consider starting where they are heading rather than where they began.</p>
3323 </div>
3324
3325 <h2>MIG, and when partitioning genuinely helps</h2>
3326
3327 <p>
3328 Multi-Instance GPU splits a supported physical card into isolated instances, each with dedicated compute and memory resources. The isolation is enforced in hardware: NVIDIA’s documentation describes each partition’s processors as having separate and isolated paths through the entire memory system, including crossbar ports, L2 cache banks, memory controllers and DRAM address buses.
3329 </p>
3330
3331 <p>
3332 That hardware isolation is the meaningful difference from time-slicing approaches.
3333 </p>
3334
3335 <p>
3336 Where MIG earns its keep is straightforward: workloads too small to justify a whole device. Inference serving, development and debugging sessions, notebook environments, preprocessing and data preparation, and CI pipelines for model code. Each routinely occupies a full high-end accelerator while using a fraction of it.
3337 </p>
3338
3339 <p>
3340 Where it does not help is equally clear. Large training runs need the full device. Any workload needing peak memory bandwidth suffers, since a partition receives a proportional slice. Jobs with widely varying resource needs do not fit fixed partition profiles well.
3341 </p>
3342
3343 <p>
3344 There is also a real operational cost. Profiles are chosen from a predefined set and configured ahead of time, so the split has to be planned against your workload mix. Reconfiguring requires draining the device first, since instances cannot be deleted while workloads are running on them. Scheduler integration adds complexity, because your <a href="/resources/blogs/slurm-vs-kubernetes-gpu-scheduling-cost">scheduler must understand instance types</a> as distinct resources.
3345 </p>
3346
3347 <p>
3348 The honest summary is that MIG is powerful in a cluster with a clear population of small jobs, and unhelpful overhead in a cluster that mostly runs large training. Look at the job size distribution before deciding.
3349 </p>
3350
3351 <p>
3352 MPS is the lighter alternative worth knowing about. It allows concurrent kernels from multiple processes without hardware isolation. NVIDIA’s documentation is explicit that MPS does not provide error isolation between clients, and that scheduling hardware, memory bandwidth, caches and capacity are all shared. That suits cooperative workloads from a single team but does not give the fault isolation a shared multi-tenant environment needs.
3353 </p>
3354
3355 <h2>A practical starting sequence</h2>
3356
3357 <p>
3358 If you are building this from nothing, the order that produces useful answers fastest:
3359 </p>
3360
3361 <p>
3362 <strong>Deploy DCGM Exporter with job mapping enabled.</strong>
3362 Without job context you get fleet-level numbers you cannot act on.
3363 </p>
3364
3365 <p>
3366 <strong>Define one idle waste metric and record a baseline.</strong> One clear metric everybody agrees on beats a dashboard of twenty nobody reads. You cannot demonstrate improvement without a baseline set before you started.
3367 </p>
3368
3369 <p>
3370 <strong>Rank workloads by absolute waste, not by percentage.</strong> A job running at 20% efficiency on four GPUs for an hour matters far less than one running at 60% on sixty-four GPUs for three days. Percentages mislead about where the recoverable capacity actually sits.
3371 </p>
3372
3373 <p>
3374 <strong>Talk to the top five.</strong> Waste concentrates. A small number of large recurring workloads usually account for most of it, and their owners are generally glad to know, because inefficiency in their job is also slowing their own research.
3375 </p>
3376
3377 <p>
3378 <strong>Then look at partitioning.</strong> MIG is a good answer to a question you should have measured first. Deciding on it before understanding your job size distribution is guessing with extra steps.
3379 </p>
3380
3381 <h2>The point of all this</h2>
3382
3383 <p>
3384 None of these measurements make anything faster on their own. They tell you where <a href="/resources/blogs/hpc-cost-optimization-gpu-cluster-utilization">hardware you already own</a> is doing less than it could.
3385 </p>
3386
3387 <p>
3388 In a cloud environment that translates into a smaller invoice. On <a href="/resources/blogs/sovereign-compute-infrastructure-cost-optimization">owned infrastructure</a> it translates into more jobs served, shorter queues, and a procurement cycle you can defer. Both are worth having. Only one of them shows up in a finance system, which is precisely why the other goes unmeasured for years.
3389 </p>
3390
3391 <p>
3392 <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure. The engine reads real telemetry across Kubernetes, HPC and GPU compute, learns how each workload actually behaves, and produces sized recommendations with cost and confidence attached. Read-only by default. OptOps is a member of the NVIDIA Inception programme.
3393 </p>
3394
3395 <h2>References</h2>
3396
3397 <ul>
3398 <li>NVIDIA. <a href="https://docs.nvidia.com/datacenter/dcgm/latest/dcgm-api/dcgm-api-field-ids.html" target="_blank" rel="noopener noreferrer">DCGM API field identifiers documentation</a>.</li>
3399 <li>NVIDIA. <a href="https://docs.nvidia.com/datacenter/dcgm/latest/user-guide/feature-overview.html" target="_blank" rel="noopener noreferrer">DCGM feature overview</a>.</li>
3400 <li>NVIDIA. <a href="https://docs.nvidia.com/datacenter/tesla/mig-user-guide/index.html" target="_blank" rel="noopener noreferrer">Multi-Instance GPU User Guide</a>.</li>
3401 <li>NVIDIA Technical Blog. <a href="https://developer.nvidia.com/blog/making-gpu-clusters-more-efficient-with-nvidia-data-center-monitoring/" target="_blank" rel="noopener noreferrer">“Making GPU Clusters More Efficient with NVIDIA Data Center Monitoring Tools.”</a> 25 November 2025.</li>
3402 <li>Sencan, E., Kulkarni, D., Coskun, A., Konate, K. <a href="https://www.bu.edu/peaclab/files/2025/07/GPU_Utilization_Analysis_PEARC25.pdf" target="_blank" rel="noopener noreferrer">“Analyzing GPU Utilization in HPC Workloads: Insights from Large-Scale Systems.”</a> PEARC ’25, July 2025. DOI 10.1145/3708035.3736010.</li>
3403 </ul>
3404
3405 </div>
3406
3407<div class="post-cta">
3408 <h3>Per-job idle waste, without building the join yourself</h3>
3409 <p>OptOps reads DCGM telemetry and scheduler records, joins them, and surfaces SM activity, memory high-water marks, and idle waste per job and per user — the metrics this post is about, produced continuously. Read-only by default.</p>
3410 <div class="post-cta-buttons">
3411 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
3412 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
3413 </div>
3414 </div>
3415
3416<div class="faq-section">
3417 <h2>Frequently asked questions</h2>
3418
3419 <div class="faq-item">
3420 <div class="faq-q">How do you measure GPU utilization accurately?</div>
3421 <p class="faq-a">Not with the basic utilization percentage, which NVIDIA defines as the share of time during which one or more kernels was executing. <strong>Accurate measurement requires SM activity and occupancy, memory bandwidth activity, and memory used against memory allocated.</strong> These are available as DCGM profiling fields rather than from summary output.</p>
3422 </div>
3423
3424 <div class="faq-item">
3425 <div class="faq-q">What does DCGM measure?</div>
3426 <p class="faq-a">NVIDIA Data Center GPU Manager exposes detailed device telemetry organised into fields, including <strong>SM activity and occupancy, memory bandwidth activity, memory consumption, power draw, temperature and error states.</strong> DCGM Exporter makes these available to monitoring systems and supports associating metrics with scheduler job identifiers.</p>
3427 </div>
3428
3429 <div class="faq-item">
3430 <div class="faq-q">Is nvidia-smi GPU utilization accurate?</div>
3431 <p class="faq-a">It is accurate for what it reports, which is whether any kernel was executing during a sampling interval. <strong>
3431It is not a measure of efficiency.</strong> A single small kernel produces the same reading as a workload saturating the device, so a GPU showing 100% utilization may be doing very little useful work.</p>
3432 </div>
3433
3434 <div class="faq-item">
3435 <div class="faq-q">What is Multi-Instance GPU (MIG)?</div>
3436 <p class="faq-a">A capability that <strong>partitions a supported physical GPU into isolated instances</strong>, each with dedicated compute and memory resources. NVIDIA’s documentation describes each partition as having separate and isolated paths through the memory system, including cache banks, memory controllers and DRAM address buses. It suits inference, development and preprocessing workloads that cannot use a full device.</p>
3437 </div>
3438
3439 <div class="faq-item">
3440 <div class="faq-q">When should you not use MIG?</div>
3441 <p class="faq-a"><strong>For large training runs needing the full device, for workloads requiring peak memory bandwidth, and for jobs whose resource needs vary widely</strong> and do not fit fixed partition profiles. MIG also adds operational overhead, since profiles are configured in advance and reconfiguration requires draining workloads off the device first.</p>
3442 </div>
3443
3444 <div class="faq-item">
3445 <div class="faq-q">What is the difference between GPU compute and memory utilization?</div>
3446 <p class="faq-a">Compute utilization describes how much streaming multiprocessor capacity is engaged, while memory utilization describes how much device memory is in use. <strong>They move independently.</strong> Research on more than 118,000 jobs at NERSC found mean peak GPU utilisation of 71.77% against mean peak memory utilisation of 28.64%, meaning memory is usually where recoverable capacity sits.</p>
3447 </div>
3448 </div>
3449`,G3=`<div class="tldr-box">
3450 <div class="tldr-label">The short version</div>
3451 <ul class="tldr-list">
3452 <li><strong>Most organisations run both Slurm and Kubernetes</strong> — usually without deciding to — and nobody can answer a simple question about total cost across the two.</li>
3453 <li><strong>The waste patterns differ.</strong> Kubernetes waste is continuous and quiet; Slurm waste is episodic and better documented. The fixes do not transfer.</li>
3454 <li><strong>Make them comparable:</strong> GPU hours as the unit, device telemetry as the truth, workload class — batch against service — as the grouping. Then fix the largest absolute waste first, wherever it lives.</li>
3455 </ul>
3456 </div>
3457
3458<div class="post-body">
3459
3460 <p>
3461 Organisations rarely choose between Slurm and Kubernetes. They end up with both, usually without deciding to.
3462 </p>
3463
3464 <p>
3465 The pattern repeats often enough to be predictable. A research or data science group has run Slurm for years on hardware predating the current platform team. The platform team standardised on Kubernetes for everything else. Then AI workloads arrived, which sit cleanly in neither camp, and now training runs on Slurm while inference serves from Kubernetes, and nobody can answer a simple question about total cost across the two.
3466 </p>
3467
3468 <p>
3469 That question is worth answering, because the waste patterns are different in each and the fixes do not transfer.
3470 </p>
3471
3472 <h2>Why both exist, and why neither is wrong</h2>
3473
3474 <p>
3475 Slurm and Kubernetes were built for different workload shapes, and the differences are structural rather than a matter of maturity.
3476 </p>
3477
3478 <p>
3479 Slurm is a batch scheduler. Work arrives as jobs with defined resource requirements and finite duration, waits in a queue, runs to completion and releases its resources. It assumes a fixed pool of hardware and its job is to allocate that pool fairly and efficiently over time.
3480 </p>
3481
3482 <p>
3483 Kubernetes is a service orchestrator. Work is long-running, expected to stay up, and scaled horizontally in response to demand. It assumes elastic capacity and its job is to keep declared state true.
3484 </p>
3485
3486 <p>
3487 The clearest difference is how each handles a distributed job that needs several nodes at once.
3488 </p>
3489
3490 <p>
3491 Slurm allocates the whole set together. Kubernetes, by default, does not. The Kubernetes project’s own enhancement proposal for gang scheduling states the position directly: since version 1.0, the scheduler has treated the pod as the unit of scheduling, and each pod is an independent decision.
3492 </p>
3493
3494 <p>
3495 The practical consequence is the one that costs money. Submit a four-node distributed training job to Kubernetes and you can end up with three pods running and a fourth pending because no node has free GPUs. The three that started sit blocked at a synchronisation barrier, holding accelerators and doing nothing, until either the fourth arrives or somebody notices.
3496 </p>
3497
3498 <p>
3499 That single difference explains much of why serious distributed training still runs on Slurm.
3500 </p>
3501
3502 <p>
3503 Two clarifications worth having, because the terminology causes genuine confusion.
3504 </p>
3505
3506 <p>
3507 First, add-on schedulers do provide all-or-nothing semantics on Kubernetes. Volcano, Kueue, the upstream scheduler-plugins coscheduling plugin and NVIDIA’s KAI Scheduler all address this. A native in-tree API is also arriving, introduced in Kubernetes v1.36, so this is an actively moving area rather than a settled limitation.
3508 </p>
3509
3510 <p>
3511 Second, the phrase “gang scheduling” means different things in the two communities. In Kubernetes it means all-or-nothing scheduling of a set of pods. Slurm uses the same phrase for a separate feature involving time-slicing between suspended jobs. The contrast drawn here is between Slurm’s all-or-nothing allocation and Kubernetes default per-pod scheduling, which is a real difference regardless of what either feature is called.
3512 </p>
3513
3514 <h2>Two schedulers, two different waste patterns</h2>
3515
3516 <h3>How Kubernetes wastes GPUs</h3>
3517
3518 <p>
3519 Waste in Kubernetes is continuous and quiet. <a href="/resources/blogs/pod-rightsizing-vpa-not-enough">A pod declares resource requests</a>, gets scheduled, and holds those resources for as long as it runs, which for a service is indefinitely. <a href="/resources/blogs/kubernetes-over-provisioning-hidden-cost">Nothing triggers a review</a>. There is no completion event, no job record, no natural moment at which anyone compares requested against used.
3520 </p>
3521
3522 <p>
3523 Inference services are the common offender. A model server sized for peak traffic holds a full accelerator through the overnight trough. Development namespaces are worse, since notebook pods hold GPUs for the length of a working day while executing code for a few minutes of it.
3524 </p>
3525
3526 <h3>How Slurm wastes GPUs</h3>
3527
3528 <p>
3529 Waste in Slurm is episodic and, in one important respect, easier to find. Every job produces an accounting record with a requested allocation and an actual runtime. The evidence is there, whether or not anyone looks.
3530 </p>
3531
3532 <p>
3533 The pattern is <a href="/resources/blogs/slurm-gpu-allocation-over-requesting">over-requesting driven by asymmetric failure</a>. Under-request and the job dies losing days of work. Over-request and nothing visible happens. Add time-limit padding, which degrades backfill efficiency across the whole queue, and idle periods inside long allocations during checkpoint writes and barrier waits.
3534 </p>
3535
3536 <p>
3537 Slurm’s documentation is explicit that backfill scheduling depends on reasonably accurate time limits, because the expected start time of pending jobs is calculated from when running jobs are expected to complete. Inflated limits therefore cost throughput for everyone, not just the padded job.
3538 </p>
3539
3540 <h3>The consequence for tooling</h3>
3541
3542 <p>
3543 <a href="/resources/blogs/reading-kubernetes-cost-stack">Kubernetes cost tooling</a> assumes continuous telemetry against long-lived objects and an elastic underlying pool. Slurm analysis is job-oriented and assumes fixed capacity where the meaningful currency is queue time rather than money.
3544 </p>
3545
3546 <p>
3547 A tool built for one produces confused output on the other. Which is why organisations running both typically run two sets of tools and reconcile nothing.
3548 </p>
3549
3550 <h2>Making cost comparable across both</h2>
3551
3552 <p>
3553 The unifying question is the same in both environments even though the mechanics differ. What was <a href="/resources/blogs/hpc-cost-optimization-gpu-cluster-utilization">allocated, what was consumed</a>, and what is the gap?
3554 </p>
3555
3556 <p>
3557 Four things to establish.
3558 </p>
3559
3560 <p>
3561 <strong>A single unit of account.</strong> GPU hours and node hours work across both. Currency does not, because in a mixed estate the Kubernetes side is often cloud-billed while the Slurm side runs on capitalised hardware. Comparing a monthly invoice against depreciated capital expenditure produces a meaningless number. Compare capacity first, then apply cost models separately if you need currency.
3562 </p>
3563
3564 <p>
3565 <strong>Consistent utilisation semantics.</strong> This is where most attempts fail. Kubernetes reports requests against usage per container. Slurm reports allocation against runtime per job. Neither says what the accelerator actually did. <a href="/resources/blogs/gpu-utilization-metrics-dcgm-mig">Device telemetry is the common denominator</a> that makes them comparable, because it measures hardware behaviour independent of which scheduler asked for it.
3566 </p>
3567
3568 <p>
3569 <strong>Workload classification, not scheduler classification.</strong> The useful split is batch against service, not Slurm against Kubernetes. A batch training job has the same economics whether it runs under Slurm or as a Kubernetes Job. A long-running inference service has the same economics either way. Grouping by workload shape makes the numbers mean something.
3570 </p>
3571
3572 <p>
3573 <strong>Honest boundary accounting.</strong> Data movement between the two environments has real cost, especially where the Kubernetes side is in cloud and the Slurm side is on premise. Egress is easy to overlook and occasionally exceeds the compute savings from any placement decision.
3574 </p>
3575
3576 <h2>Where workloads should actually run</h2>
3577
3578 <p>
3579 Once you can see both, placement becomes a question you can answer rather than an accident of history.
3580 </p>
3581
3582 <p>
3583 <strong>Runs better on Slurm:</strong> multi-node distributed training needing all-or-nothing allocation, long-running simulation, anything requiring tightly coupled interconnect performance, and workloads with an established queue and fair-share policy that users understand.
3584 </p>
3585
3586 <p>
3587 <strong>Runs better on Kubernetes:</strong> inference serving with variable demand, anything needing autoscaling, workloads that must integrate with service meshes or standard CI and CD, and mixed workloads where GPU work is one component of a larger application.
3588 </p>
3589
3590 <p>
3591 <strong>Genuinely ambiguous:</strong> batch inference, model evaluation pipelines, and hyperparameter sweeps. These run acceptably on either, and the deciding factors are usually where the data already sits and which team owns the pipeline rather than anything technical.
3592 </p>
3593
3594 <div class="pull-quote">
3595 "The problem is not having two schedulers. The problem is having no view across them."
3596 </div>
3597
3598 <p>
3599 One caution worth stating plainly. Consolidating onto a single scheduler is a large migration with an uncertain payoff, and it is frequently proposed for reasons of tidiness rather than economics. Running both is a legitimate steady state.
3600 </p>
3601
3602 <h2>What to do with a mixed estate</h2>
3603
3604 <p>
3605 <strong>Instrument the hardware, not the scheduler.</strong> Device-level telemetry gives you one truth about what accelerators did. Scheduler records tell you who asked for what. Join them on both sides and you have comparable numbers for the first time.
3606 </p>
3607
3608 <p>
3609 <strong>Report in capacity terms.</strong> GPU hours allocated, GPU hours consumed, and the gap between them, split by workload class. This single view usually reveals that one side of the estate is materially worse than the other, and it is not always the side people expect.
3610 </p>
3611
3612 <p>
3613 <strong>Fix the largest absolute waste first, wherever it lives.</strong>
3613 Not the worst percentage. A training job at 60% efficiency on sixty-four GPUs for three days wastes far more than a notebook at 5% on one card. Percentages consistently point at the wrong target.
3614 </p>
3615
3616 <p>
3617 <strong>Keep the safety model consistent.</strong> Whatever changes get made, apply them the same way in both environments. <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">Recommendations reviewed by a human</a>, changes scoped and reversible, and an audit trail in systems you already run. A cost programme that causes one incident does not get corrected. It gets cancelled.
3618 </p>
3619
3620 <h2>The underlying point</h2>
3621
3622 <p>
3623 Slurm and Kubernetes look like different worlds and are usually owned by different teams with different vocabularies. Underneath, the economics are identical.
3624 </p>
3625
3626 <p>
3627 Someone declares what a workload needs before it runs. The declaration is padded because under-requesting fails loudly and over-requesting fails silently. Nobody revisits the declaration because nothing prompts them to. The gap between declared and consumed is where the money and the capacity go.
3628 </p>
3629
3630 <p>
3631 That is one problem wearing two sets of clothes. Recognising it as one problem is what makes it possible to measure the whole estate with a single question, rather than running two programmes that never reconcile.
3632 </p>
3633
3634 <p>
3635 <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure, built to work across substrates rather than within one. The same engine reads real workload behaviour on Kubernetes in the cloud and on HPC and GPU compute on premise, producing sized recommendations with cost and confidence attached. Read-only by default, so it deploys where write-access tools cannot.
3636 </p>
3637
3638 <h2>References</h2>
3639
3640 <ul>
3641 <li>Kubernetes Enhancement Proposal 4671. <a href="https://github.com/kubernetes/enhancements/blob/master/keps/sig-scheduling/4671-gang-scheduling/README.md" target="_blank" rel="noopener noreferrer">Gang Scheduling</a>.</li>
3642 <li>SchedMD. <a href="https://slurm.schedmd.com/sched_config.html" target="_blank" rel="noopener noreferrer">Slurm Scheduling Configuration Guide, backfill scheduling</a>.</li>
3643 <li>SchedMD. <a href="https://slurm.schedmd.com/sbatch.html" target="_blank" rel="noopener noreferrer">Slurm sbatch documentation, node allocation behaviour</a>.</li>
3644 <li>SchedMD. <a href="https://slurm.schedmd.com/gang_scheduling.html" target="_blank" rel="noopener noreferrer">Slurm Gang Scheduling documentation (time-slicing feature)</a>.</li>
3645 </ul>
3646
3647 </div>
3648
3649<div class="post-cta">
3650 <h3>One view across the whole estate</h3>
3651 <p>OptOps reads device telemetry and scheduler records on both sides — Slurm and Kubernetes — and reports allocated against consumed in the same units, split by workload class. Read-only by default. See which side of your estate is actually worse.</p>
3652 <div class="post-cta-buttons">
3653 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
3654 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
3655 </div>
3656 </div>
3657
3658<div class="faq-section">
3659 <h2>Frequently asked questions</h2>
3660
3661 <div class="faq-item">
3662 <div class="faq-q">Should we use Slurm or Kubernetes for AI workloads?</div>
3663 <p class="faq-a">It depends on workload shape rather than on which is better. <strong>Slurm suits multi-node distributed training because it allocates the full set of nodes together. Kubernetes suits inference serving and anything needing autoscaling</strong> or integration with standard service tooling. Many organisations run both, which is a reasonable steady state.</p>
3664 </div>
3665
3666 <div class="faq-item">
3667 <div class="faq-q">Can you run Slurm and Kubernetes on the same cluster?</div>
3668 <p class="faq-a">Both can operate within one organisation and there are integration approaches that let them share hardware pools, though most estates keep them on separate hardware with different teams. <strong>The practical difficulty is rarely coexistence itself.</strong> It is that neither system reports in terms the other can be compared against, so nobody has a view of total cost or utilisation across both.</p>
3669 </div>
3670
3671 <div class="faq-item">
3672 <div class="faq-q">What is gang scheduling and why does Kubernetes lack it by default?</div>
3673 <p class="faq-a">Gang scheduling, in Kubernetes terminology, guarantees that all c
3673omponents of a distributed job start together or none start. <strong>The Kubernetes scheduler has treated the pod as the unit of scheduling since version 1.0</strong>, so a multi-pod training job can partially start, leaving running pods blocked at a synchronisation barrier while holding GPUs. Add-on schedulers including Volcano, Kueue and the coscheduling plugin provide the capability, and a native API was introduced in Kubernetes v1.36.</p>
3674 </div>
3675
3676 <div class="faq-item">
3677 <div class="faq-q">How do you compare infrastructure cost across Slurm and Kubernetes?</div>
3678 <p class="faq-a"><strong>Use GPU hours and node hours as the common unit rather than currency</strong>, since one side is often cloud-billed while the other runs on capitalised hardware. Use device telemetry as the shared source of truth for what hardware actually did, because scheduler-native metrics are not comparable. Group by workload class, batch against service, rather than by scheduler.</p>
3679 </div>
3680
3681 <div class="faq-item">
3682 <div class="faq-q">Which scheduler wastes more GPU capacity?</div>
3683 <p class="faq-a">Neither inherently, but the waste behaves differently. <strong>Kubernetes waste is continuous and largely invisible</strong>, since long-running services hold resources indefinitely with no event prompting review. <strong>Slurm waste is episodic and better documented</strong>, because every job produces an accounting record showing requested against actual usage. The Slurm variety is easier to find if anyone looks.</p>
3684 </div>
3685
3686 <div class="faq-item">
3687 <div class="faq-q">Is it worth consolidating onto a single scheduler?</div>
3688 <p class="faq-a">Usually not for cost reasons alone. <strong>Consolidation is a substantial migration with uncertain payoff</strong>, and it is often proposed for architectural tidiness rather than economics. Running both is a legitimate steady state. The real problem in most mixed estates is the absence of a unified view of utilisation, which can be solved without migrating anything.</p>
3689 </div>
3690 </div>
3691`,H3=`<div class="tldr-box">
3692 <div class="tldr-label">The short version</div>
3693 <ul class="tldr-list">
3694 <li><strong>Commitments are sized against observed spend.</strong> If your clusters were running padded resource requests when the baseline was measured, you have committed to capacity you do not need, for one to three years.</li>
3695 <li><strong>Optimize after committing and you can save nothing.</strong> Consumption drops below the committed floor, you pay the shortfall anyway, and the invoice does not move for the remainder of the term.</li>
3696 <li><strong>The fix costs nothing and it is a sequencing decision.</strong> Audit utilization before you sign, size the new commitment against optimized consumption rather than current consumption, and this single ordering choice is frequently worth more than the tooling.</li>
3697 </ul>
3698 </div>
3699
3700<div class="post-body">
3701
3702 <h2>How the mechanism actually works</h2>
3703
3704 <p>
3705  Every major cloud provider sells the same basic bargain. Commit to a level of spend or a quantity of compute for one or three years, and pay meaningfully less per unit than you would on demand. The instruments have different names and different flexibility profiles. Reserved Instances, Savings Plans, Committed Use Discounts, Reservations. The economics underneath are the same.
3706 </p>
3707
3708 <p>
3709  The question that decides everything is how the commitment level gets chosen.
3710 </p>
3711
3712 <p>
3713  It gets chosen by looking at what you currently spend.
3714 </p>
3715
3716 <p>
3717  That is a reasonable procedure and it is where the trap is set. Because in a Kubernetes estate, what you currently spend is not a measurement of what you need. It is a measurement of what your workloads asked for.
3718 </p>
3719
3720 <h2>Why Kubernetes makes this worse than plain virtual machines</h2>
3721
3722 <p>
3723  On a fleet of manually provisioned servers, the gap between what is provisioned and what is needed is visible to whoever provisions them. Somebody chose that instance count. Somebody could choose differently.
3724 </p>
3725
3726 <p>
3727  Kubernetes removes that person from the loop, which is the entire point of it, and in doing so removes the last human who might have noticed.
3728 </p>
3729
3730 <p>
3731  Here is the chain. An engineer declares CPU and memory requests for a 
3731workload. Those requests are <a href="/resources/blogs/kubernetes-over-provisioning-hidden-cost">padded, and the padding never gets revisited</a>, because under-requesting fails loudly and over-requesting fails silently. The scheduler treats those requests as genuine demand, because it has no way to know otherwise. The cluster autoscaler reads the resulting pressure and provisions nodes to satisfy it. Those nodes run, bill, and appear in your usage data.
3732 </p>
3733
3734 <p>
3735  Now finance pulls twelve months of usage to size a commitment. What they are looking at is not demand. It is padding, faithfully converted into infrastructure by a system doing exactly what it was told.
3736 </p>
3737
3738 <p>
3739  At the moment of signature, that padding stops being a configuration value that anyone could change on a Tuesday afternoon. It becomes a contractual liability with a term attached.
3740 </p>
3741
3742 <h2>The trap, in sequence</h2>
3743
3744 <p>
3745  The sequence matters more than any individual step.
3746 </p>
3747
3748 <p>
3749  <strong>Step one.</strong> Clusters run with padded requests. Normal, and near universal.
3750 </p>
3751
3752 <p>
3753  <strong>Step two.</strong> The autoscaler provisions to match. Also normal.
3754 </p>
3755
3756 <p>
3757  <strong>Step three.</strong> Finance sizes a one or three year commitment against the observed baseline. Entirely reasonable, given the data available.
3758 </p>
3759
3760 <p>
3761  <strong>Step four.</strong> The platform team runs an optimization program. Consumption falls.
3762 </p>
3763
3764 <p>
3765  <strong>Step five.</strong> Consumption is now below the committed floor. The commitment is take-or-pay. You are billed for the floor regardless.
3766 </p>
3767
3768 <p>
3769  Every step is defensible. The outcome is that a successful program produces no financial result, and the team that ran it looks like it failed.
3770 </p>
3771
3772 <p>
3773  The second-order damage is worse than the first. That team will find it much harder to fund the next program, because everyone in the room remembers that the last one did not show up on the bill.
3774 </p>
3775
3776 <div class="pull-quote">
3777  "The savings were real. They had also already been spent, eighteen months earlier, by somebody who was not in the room."
3778 </div>
3779
3780 <h2>The two numbers people confuse</h2>
3781
3782 <p>
3783  Any conversation about commitments involves two metrics that sound similar and mean opposite things.
3784 </p>
3785
3786 <p>
3787  <strong>Coverage</strong> is the proportion of your eligible usage that a commitment is covering. High coverage means you are paying discounted rates on most of what you run.
3788 </p>
3789
3790 <p>
3791  <strong>Utilization</strong> is the proportion of your commitment that you are actually consuming. High utilization means you are using what you bought.
3792 </p>
3793
3794 <p>
3795  Optimization pushes these in opposite directions. Cut consumption and coverage rises, which looks good, while utilization falls, which is where the money leaks. A <a href="/resources/blogs/finops-dashboards-dont-save-money">dashboard showing 98% coverage</a> can sit directly above a commitment you are underusing by a third, and both numbers are accurate.
3796 </p>
3797
3798 <p>
3799  Track both. If you only track one, track utilization, because that is the one that turns into a payment for nothing.
3800 </p>
3801
3802 <h2>The audit to run before you sign</h2>
3803
3804 <p>
3805  This is a short exercise and it is the highest-return hour available in cloud cost management.
3806 </p>
3807
3808 <p>
3809  <strong>Establish the request-to-usage ratio at P95 across the estate.</strong> Not average. Average smooths away exactly the burst behavior that the headroom is supposed to cover, which makes over-provisioning look justified.
3810 </p>
3811
3812 <p>
3813  <strong>Model the post-optimization baseline.</strong> If a first pass would remove a meaningful share of provisioned capacity, that is the number your commitment should be sized against, not today's.
3814 </p>
3815
3816 <p>
3817  <strong>Check the renewal calendar against the optimization calendar.</strong> If a commitment renews inside the window where you plan to do efficiency work, you have a sequencing conflict, and it is far cheaper to resolve it now than to discover it later.
3818 </p>
3819
3820 <p>
3821  <strong>Separate the durable floor from the elastic layer.</strong> There is almost always a genuine baseline that will exist in any sce
3821nario, and on an owned estate <a href="/resources/blogs/finops-private-cloud-data-center-cost-optimization">the same question has no invoice to answer it</a>. Commit confidently to that. Leave the layer above it uncommitted until you know its real shape.
3822 </p>
3823
3824 <p>
3825  <strong>Write down who owns the decision.</strong> In most organizations, the commitment is signed by finance using data produced by engineering, with neither party fully accountable for the assumption connecting the two. That gap is where the money goes.
3826 </p>
3827
3828 <h2>If you are already inside a commitment</h2>
3829
3830 <p>
3831  Most organizations reading this are mid-term, which is a different problem with a smaller set of options. They are still worth knowing.
3832 </p>
3833
3834 <p>
3835  <strong>Do the efficiency work anyway, and measure it in capacity terms.</strong> Your consumption falling below the floor does not make the work worthless. It makes the benefit deferred to renewal rather than immediate. Track it in node hours and CPU hours, and keep any changes <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">reviewed and reversible</a>, so the result is documented even while the invoice is flat, and make sure finance understands this before you start rather than after.
3836 </p>
3837
3838 <p>
3839  <strong>Redirect freed capacity rather than releasing it.</strong> If you are going to pay for the floor regardless, the cheapest compute available to you is the capacity you have already committed to. Workloads scheduled for future migration, batch jobs, non-production environments and new services can all be moved onto it. Under-consumption is a waste. Under-consumption you deliberately fill is a discount.
3840 </p>
3841
3842 <p>
3843  <strong>Use whatever flexibility the instrument gives you.</strong> Some commitment types allow changes to instance family, region or configuration within the term. Understand exactly which levers your specific agreements permit before assuming you have none.
3844 </p>
3845
3846 <p>
3847  <strong>Start the renewal conversation early and with your own numbers.</strong> Arriving at a renewal with a documented optimized baseline changes the negotiation completely, because you can argue for a level that reflects reality instead of accepting a proposal sized from historical spend.
3848 </p>
3849
3850 <h2>Sizing the next one properly</h2>
3851
3852 <p>
3853  When the renewal does come, three principles.
3854 </p>
3855
3856 <p>
3857  <strong>Size against optimized consumption, not current consumption.</strong> This is the entire lesson and it is worth restating plainly, because it is the step that everyone skips.
3858 </p>
3859
3860 <p>
3861  <strong>Consider shorter terms while the estate is still moving.</strong> A three year commitment on a workload mix that is actively changing is a bet on stability you may 
3861not have. The per-unit discount on a longer term is real, and it is not free.
3862 </p>
3863
3864 <p>
3865  <strong>Ladder the commitments.</strong> Multiple overlapping agreements with staggered end dates give you a decision point every few months instead of one enormous decision every three years. It costs a little in blended rate and it buys a great deal of optionality.
3866 </p>
3867
3868 <h2>Where this sits in the wider picture</h2>
3869
3870 <p>
3871  Kubernetes cost lives in <a href="/resources/blogs/reading-kubernetes-cost-stack">three distinct layers, each with its own waste pattern and its own owner</a>. Pods, nodes, and commitments.
3872 </p>
3873
3874 <p>
3875  Most efficiency programs work the pod layer, because that is where the tooling is and where the engineering feels productive. The commitment layer sits above both, it is where the largest single-decision sums live, and it is owned by people who are usually not in the same meeting.
3876 </p>
3877
3878 <p>
3879  That is the structural problem. Not a technical one. The layer with the most money in it is the layer with the least engineering attention, and the decision gets made annually by people working from data that engineering produced without knowing what it would be used for.
3880 </p>
3881
3882 <p>
3883  The fix is not a tool. It is putting the utilization number in front of whoever signs, before they sign.
3884 </p>
3885
3886 <p>
3887  <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure, covering Kubernetes in the cloud and HPC and GPU compute on premise. It reads real workload behavior and produces sized recommendations with cost and confidence attached, which is what a defensible pre-commitment baseline is made of. Read-only by default, so it deploys where write-access tools cannot.
3888 </p>
3889
3890 <h2>References</h2>
3891
3892 <ul>
3893  <li>FinOps Foundation. <a href="https://data.finops.org/" target="_blank" rel="noopener noreferrer">State of FinOps 2026</a>. Sixth annual practitioner survey, 1,192 respondents representing more than US$83 billion in annual cloud spend.</li>
3894  <li>FinOps Foundation. <a href="https://www.finops.org/" target="_blank" rel="noopener noreferrer">Rate optimization and commitment-based discounts</a>.</li>
3895  <li>Provider documentation for the specific instrument you hold, since terms, flexibility and exchange rules differ materially between them.</li>
3896 </ul>
3897
3898 </div>
3899
3900<div class="post-cta">
3901 <h3>Know the number before you sign</h3>
3902 <p>OptOps produces a read-only utilization picture across your clusters, including the request-to-usage gap at P95 that a commitment should actually be sized against. Free Cluster Efficiency Assessment, roughly thirty minutes to a first waste map, report yours either way.</p>
3903 <div class="post-cta-buttons">
3904 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
3905 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
3906 </div>
3907 </div>
3908
3909<div class="faq-section">
3910 <h2>Frequently asked questions</h2>
3911
3912 <div class="faq-item">
3913 <div class="faq-q">Should you buy Reserved Instances before or after optimizing Kubernetes?</div>
3914 <p class="faq-a"><strong>Always optimize first, or at minimum model the optimized baseline before committing.</strong> Commitments are sized against observed spend, so committing while clusters run padded resource requests locks that padding into a one to three year contract. Optimize afterward and consumption falls below the committed floor, where you pay the shortfall regardless. The sequencing decision costs nothing and is frequently worth more than the optimization tooling itself.</p>
3915 </div>
3916
3917 <div class="faq-item">
3918 <div class="faq-q">What happens if you use less than your Savings Plan or Committed Use Discount commitment?</div>
3919 <p class="faq-a"><strong>You pay for the committed level regardless of what you consume.</strong> These are take-or-pay instruments. Under-consumption is not refunded and generally does not roll forward. This is why a successful efficiency program can produce no change on the invoice for the remainder of a commitment term, which is a common and demoralizing outcome for the team that ran it.</p>
3920 </div>
3921
3922 <div class="faq-item">
3923 <div class="faq-q">Why does Kubernetes make commitment sizing harder?</div>
3924 <p class="faq-a"><strong>Because the autoscaler converts padded resource requests into real provisioned nodes, and those nodes become the observed baseline.</strong>
3924 On manually provisioned infrastructure a human chooses the instance count and could choose differently. In Kubernetes that human is removed from the loop by design, so nobody is positioned to notice that the baseline reflects what workloads asked for rather than what they need.</p>
3925 </div>
3926
3927 <div class="faq-item">
3928 <div class="faq-q">What is the difference between commitment coverage and commitment utilization?</div>
3929 <p class="faq-a"><strong>Coverage is the share of your usage that a commitment covers. Utilization is the share of your commitment that you actually consume.</strong> Optimization pushes them in opposite directions: coverage rises while utilization falls. A dashboard can show excellent coverage above a commitment you are underusing by a third, with both figures accurate. Utilization is the one that turns into payment for nothing.</p>
3930 </div>
3931
3932 <div class="faq-item">
3933 <div class="faq-q">How do you size a cloud commitment correctly?</div>
3934 <p class="faq-a"><strong>Size it against modeled post-optimization consumption rather than current consumption</strong>, separate the durable baseline that will exist in any scenario from the elastic layer above it, and commit confidently only to the first. Consider shorter terms while the workload mix is still changing, and ladder multiple agreements with staggered end dates so you get a decision point every few months rather than one large decision every three years.</p>
3935 </div>
3936
3937 <div class="faq-item">
3938 <div class="faq-q">Can you do anything if you are already committed above your actual usage?</div>
3939 <p class="faq-a">Yes, though the options are narrower. <strong>Redirect workloads onto the capacity you are paying for regardless</strong>, since committed capacity you deliberately fill is effectively the cheapest compute available to you. Continue the efficiency work but measure it in capacity terms rather than currency, and agree with finance in advance that the benefit lands at renewal. Then arrive at that renewal with a documented optimized baseline rather than accepting a level sized from historical spend.</p>
3940 </div>
3941 </div>
3942`,K3=`<div class="tldr-box">
3943 <div class="tldr-label">The short version</div>
3944 <ul class="tldr-list">
3945 <li><strong>Kubernetes breaks allocation by design.</strong> The whole value of it is that workloads stop mapping to machines. That is also precisely what makes per-team cost attribution hard.</li>
3946 <li><strong>Three buckets, not one.</strong> Directly attributable cost, shared cost, and idle cost. Most allocation projects handle the first, argue about the second, and quietly hide the third.</li>
3947 <li><strong>Allocate on requests, not usage.</strong> This is the single highest-leverage decision in the whole exercise, because it is the only version that makes over-provisioning cost the team doing it.</li>
3948 </ul>
3949 </div>
3950
3951<div class="post-body">
3952
3953 <h2>Why the abstraction is the problem</h2>
3954
3955 <p>
3956  The point of a container orchestrator is that a workload no longer corresponds to a machine. Pods land wherever there is room, move when the scheduler decides they should, share nodes with unrelated workloads, and scale up and down without anybody provisioning anything.
3957 </p>
3958
3959 <p>
3960  That is the entire value proposition, and it works.
3961 </p>
3962
3963 <p>
3964  It also means the object you are billed for, a node, has no stable relationship to the object you want to charge for, a team's workload. A node might host eleven pods from six teams during one hour and a different set the next. The cloud provider bills you for the node.
3965 </p>
3966
3967 <p>
3968  Everything difficult about Kubernetes cost allocation follows from that one mismatch.
3969 </p>
3970
3971 <h2>Three buckets</h2>
3972
3973 <p>
3974  Any honest allocation model separates cluster spend into three categories, and the difficulty rises sharply as you go down the list.
3975 </p>
3976
3977 <p>
3978  <strong>Directly attributable cost.</strong> A pod ran, it consumed a share of a node for a period, and it belongs to an identifiable workload owned by an identifiable team. This is the straightforward portion and it is where most tooling stops.
3979 </p>
3980
3981 <p>
3982  <strong>Shared cost.</strong> The ingress controller, the service mesh, the monitoring stack, the logging pipeline, the certificate manager, the DNS layer, the control plane itself. Everyone uses these. Nobody owns them. They are frequently a larger share of cluster spend than anyone expects.
3983 </p>
3984
3985 <p>
3986  <strong>Idle cost.</strong> The gap between what nodes cost and what pods consumed. Unused capacity inside a running node, headroom kept deliberately for burst, and capacity the autoscaler provisioned in anticipation of demand that did not arrive. This is the bucket that has no natural owner at all.
3987 </p>
3988
3989 <p>
3990  The third bucket is where allocation projects go to die, because it is the one where the technical question and the political question are the same question.
3991 </p>
3992
3993 <h2>Namespaces and labels, and what each can carry</h2>
3994
3995 <p>
3996  There are two mechanisms available and they behave differently.
3997 </p>
3998
3999 <p>
4000  <strong>Namespaces</strong> are a hard boundary. They carry quotas and policy, they are difficult to fake, and they map cleanly onto a cost owner if your namespace design happens to match your organizational structure. It usually does not. Namespaces were designed around isolation and access control, not around who pays.
4001 </p>
4002
4003 <p>
4004  <strong>Labels</strong> are flexible and can carry any dimension you like: team, product, environment, cost center. They are also optional, silently omitted, frequently misspelled, and impossible to enforce retroactively. A label taxonomy that is 80% complete produces an allocation report that is 80% complete, and the missing 20% is never randomly distributed. It is concentrated in the oldest workloads, which are usually the most expensive ones.
4005 </p>
4006
4007 <p>
4008  The practical answer is both, with enforcement. Use namespaces for the hard boundary, labels for the dimensions namespaces cannot express, and an admission policy that rejects workloads missing required labels. That last part is the only thing that actually works, and it has to be introduced with warning periods rather than dropped on people.
4009 </p>
4010
4011 <h2>The decision that changes behavior</h2>
4012
4013 <p>
4014  Here is the part that matters more than the tooling.
4015 </p>
4016
4017 <p>
4018  Once you can attribute cost, you have to decide what you attribute it against. There are two candidates and they produce opposite incentives.
4019 </p>
4020
4021 <p>
4022  <strong>Allocate on usage</strong> and a team is charged for what its workloads actually consumed. This feels fair and it is what most teams instinctively choose.
4023 </p>
4024
4025 <p>
4026  <strong>Allocate on requests</strong> and a team is charged for what its workloads reserved, whether they used it or not.
4027 </p>
4028
4029 <p>
4030  Allocating on usage means padding is free. A team can request four times what it needs, hold that capacity out of the schedulable pool so nobody else can use it, and pay only for the fraction it consumes. The cost of that padding lands in the idle bucket, which is to say it lands on everybody.
4031 </p>
4032
4033 <p>
4034  Allocating on requests means padding has a price, and the price lands on whoever set the number.
4035 </p>
4036
4037 <p>
4038  This is the only mechanism in the entire discipline that fixes the underlying asymmetry rather than reporting on it. The structural problem with over-provisioning is that <a href="/resources/blogs/kubernetes-over-provisioning-hidden-cost">under-requesting fails loudly while over-requesting fails silently</a>. Allocating on requests gives over-requesting a consequence for the first time.
4039 </p>
4040
4041 <p>
4042  The CNCF's research on cloud native financial management points the same way. In its practitioner microsurvey, 45% named a lack of awareness and responsibility at individual and team level as a driver of overspend, and 68% said individual and team awareness and self-discipline were the most effective means of controlling it. Both findings describe a behavioral problem, and <a href="/resources/blogs/finops-dashboards-dont-save-money">a report handed to a team with no mechanism attached</a> does not change behavior. A line item does.
4043 </p>
4044
4045 <p>
4046  One caution. Allocating on requests only works if teams can act on it. If resource requests are set by a platform team, or locked by a policy, or buried in a Helm chart nobody owns, then charging a team for them is charging them for a decision they cannot make. Fix the ownership before you fix the accounting.
4047 </p>
4048
4049 <div class="pull-quote">
4050  "Allocating on usage tells teams what they spent. Allocating on requests tells them what they reserved and did not use. Only one of those changes anything."
4051 </div>
4052
4053 <h2>Dealing with shared and idle cost</h2>
4054
4055 <p>
4056  Four approaches, and there is no correct answer, only an answer you can defend.
4057 </p>
4058
4059 <p>
4060  <strong>Split evenly across teams.</strong> Simple, transparent, and unfair in an obvious way that everyone can see and therefore argue about productively. Works when teams are roughly comparable in size.
4061 </p>
4062
4063 <p>
4064  <strong>Distribute proportionally to attributed spend.</strong> The most common choice. Big consumers carry more of the shared load. Reasonable, and it means shared costs grow for a team as its direct costs grow, which is at least directionally sensible.
4065 </p>
4066
4067 <p>
4068  <strong>Absorb centrally into a platform budget.</strong> Cleanest politically, and it removes the argument entirely. It also means nobody has any incentive to reduce shared or idle cost, which over a couple of years is how the platform budget becomes the largest unexplained line in infrastructure.
4069 </p>
4070
4071 <p>
4072  <strong>Charge idle to the team whose requests caused it.</strong> The most accurate and the hardest to implement, because you need to distinguish idle capacity caused by padding from headroom that exists for legitimate burst or resilience reasons. Worth aiming at. Not worth blocking the project on.
4073 </p>
4074
4075 <p>
4076  Pick one, write down why, and revisit it annually. The failure mode is not choosing badly. It is not choosing, and letting the model be decided implicitly by whatever the tooling defaulted to.
4077 </p>
4078
4079 <h2>Showback before chargeback, always</h2>
4080
4081 <p>
4082  <strong>Showback</strong> reports cost to teams without moving money. <strong>Chargeback</strong> moves money between budgets.
4083 </p>
4084
4085 <p>
4086  Run showback for at least two quarters first. The reason is not political caution. It is that your allocation model will be wrong in ways you cannot predict, and the only way to discover that is to publish the numbers and let teams argue with them. Every one of those arguments is a bug report on your model.
4087 </p>
4088
4089 <p>
4090  Move to chargeback only when the numbers have stopped being disputed. Chargeback with a model people do not trust generates enormous organizational friction and produces no efficiency gain, because teams spend their energy contesting the allocation rather than reducing consumption.
4091 </p>
4092
4093 <p>
4094  In regulated environments the calculus shifts slightly, because <a href="/resources/blogs/kubernetes-cost-optimization-bfsi-playbook">cost attribution is frequently a compliance requirement</a> rather than an efficiency measure. Even then, showback first.
4095 </p>
4096
4097 <h2>Where the standards are</h2>
4098
4099 <p>
4100  The FinOps Open Cost and Usage Specification exists to normalize cost and usage data across providers so that spend can be compared rather than reconciled by hand.
4101 </p>
4102
4103 <p>
4104  For this problem specifically, it is worth knowing where things stand. In the FinOps Foundation's 2026 practitioner survey, allocation ranked as the top prioritized capability across every technology category the survey covered, and granular shared cost and container allocation appeared explicitly on the list of tooling capabilities practitioners want and cannot currently buy.
4105 </p>
4106
4107 <p>
4108  That is a useful signal. If this feels harder than it should be, that is not a failure of your team. It is a gap in the tooling market that the people who build these tools have now acknowledged in writing.
4109 </p>
4110
4111 <h2>What to do first</h2>
4112
4113 <p>
4114  <strong>Fix ownership before accounting.</strong> Establish who owns each namespace and each workload, by name. <a href="/resources/blogs/engineering-ignores-cost-optimization-recommendations">Recommendations without a named owner</a> do not get acted on. Allocation without ownership produces a report nobody acts on.
4115 </p>
4116
4117 <p>
4118  <strong>Enforce a minimal label taxonomy.</strong> Three or four dimensions, not fifteen. Team, product, environment, cost center. Enforce at admission with a warning period first.
4119 </p>
4120
4121 <p>
4122  <strong>Publish the three buckets separately from day one.</strong> Directly attributed, shared, idle. Showing idle cost as its own line is often the single most useful output of the entire exercise, because it makes the invisible bucket visible and it is usually much larger than people guess.
4123 </p>
4124
4125 <p>
4126  <strong>Decide requests versus usage deliberately, and say why.</strong> Do not let the tool decide it for you by default.
4127 </p>
4128
4129 <p>
4130  <strong>Run showback for two quarters before moving money.</strong>
4131 </p>
4132
4133 <h2>The underlying point</h2>
4134
4135 <p>
4136  Cost allocation is not really an accounting exercise. It is an incentive exercise wearing accounting clothes.
4137 </p>
4138
4139 <p>
4140  The measurement is worth having on its own terms, and it feeds directly into <a href="/resources/blogs/reading-kubernetes-cost-stack">how the node and commitment layers above it get sized</a>. But the reason to do it is that Kubernetes removed the feedback loop between the person who sets a resource number and the cost of that number, and allocation is the only mechanism available for putting it back.
4141 </p>
4142
4143 <p>
4144  Which means the question to ask about any allocation model is not whether it is accurate. It is whether anyone's behavior would change if they read it.
4145 </p>
4146
4147 <p>
4148  <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure, covering Kubernetes in the cloud and HPC and GPU compute on premise. It reads real workload behavior and reports requested against consumed at the workload level, which is the gap most allocation models cannot see. Read-only by default, so it deploys where write-access tools cannot.
4149 </p>
4150
4151 <h2>References</h2>
4152
4153 <ul>
4154  <li>FinOps Foundation. <a href="https://data.finops.org/" target="_blank" rel="noopener noreferrer">State of FinOps 2026</a>. Sixth annual practitioner survey, 1,192 respondents representing more than US$83 billion in annual cloud spend.</li>
4155  <li>FinOps Foundation. <a href="https://focus.finops.org/" target="_blank" rel="noopener noreferrer">FinOps Open Cost and Usage Specification (FOCUS)</a>.</li>
4156  <li>Cloud Native Computing Foundation. Cloud Native FinOps and Cloud Financial Management Microsurvey.</li>
4157 </ul>
4158
4159 </div>
4160
4161<div class="post-cta">
4162 <h3>See the bucket nobody owns</h3>
4163 <p>OptOps reports requested against consumed at the workload level, which is what turns idle cost from an unexplained residual into a line item with a cause. Read-only by default. Free Cluster Efficiency Assessment, report yours either way.</p>
4164 <div class="post-cta-buttons">
4165 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
4166 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
4167 </div>
4168 </div>
4169
4170<div class="faq-section">
4171 <h2>Frequently asked questions</h2>
4172
4173 <div class="faq-item">
4174 <div class="faq-q">How do you allocate Kubernetes costs to teams?</div>
4175 <p class="faq-a"><strong>Split cluster spend into three buckets: directly attributable, shared, and idle.</strong> Attribute the first using namespaces for hard boundaries and enforced labels for dimensions namespaces cannot express. Distribute shared cost by a rule you write down and can defend, most commonly proportional to attributed spend. Publish idle cost as its own line rather than folding it into the others, since it is usually larger than teams expect and hiding it removes any reason to reduce it.</p>
4176 </div>
4177
4178 <div class="faq-item">
4179 <div class="faq-q">Should Kubernetes costs be allocated on resource requests or actual usage?</div>
4180 <p class="faq-a"><strong>On requests, in almost every case.</strong> Allocating on usage makes over-provisioning free: a team can reserve four times what it needs, hold that capacity out of the schedulable pool, and pay only for what it consumes, with the difference landing on everyone. Allocating on requests gives padding a price and puts it on whoever set the number. The exception is where teams cannot actually change their resource requests, in which case fix the ownership first.</p>
4181 </div>
4182
4183 <div class="faq-item">
4184 <div class="faq-q">What is the difference between showback and chargeback?</div>
4185 <p class="faq-a"><strong>Showback reports cost to teams without moving money. Chargeback moves money between budgets.</strong> Run showback for at least two quarters first, because your allocation model will be wrong in ways you cannot anticipate and team disputes are the only way to find out. Chargeback on a model people do not trust generates friction without eff
4185iciency, since teams contest the allocation instead of reducing consumption.</p>
4186 </div>
4187
4188 <div class="faq-item">
4189 <div class="faq-q">How do you handle shared costs like ingress, monitoring and logging?</div>
4190 <p class="faq-a">Four defensible options: <strong>split evenly, distribute proportionally to attributed spend, absorb centrally into a platform budget, or charge idle back to the team whose requests caused it.</strong> Proportional distribution is the most common. Central absorption is cleanest politically but removes any incentive to reduce shared cost, which is how a platform budget becomes the largest unexplained infrastructure line within a few years.</p>
4191 </div>
4192
4193 <div class="faq-item">
4194 <div class="faq-q">Why is Kubernetes cost allocation so difficult?</div>
4195 <p class="faq-a"><strong>Because the object you are billed for, a node, has no stable relationship to the object you want to charge for, a team's workload.</strong> Pods land wherever there is room, share nodes with unrelated workloads, and move when the scheduler decides. That decoupling is the entire value of an orchestrator and it is also exactly what makes per-team attribution hard. Every difficulty in this area traces back to that single mismatch.</p>
4196 </div>
4197
4198 <div class="faq-item">
4199 <div class="faq-q">Do namespaces or labels work better for cost allocation?</div>
4200 <p class="faq-a"><strong>Both, with enforcement.</strong> Namespaces are a hard boundary that carries quotas and policy and is difficult to fake, but they were designed for isolation rather than for billing and rarely match organizational structure. Labels can carry any dimension but are optional, frequently omitted and impossible to apply retroactively. The only approach that holds is an admission policy that rejects workloads missing required labels, introduced with a warning period.</p>
4201 </div>
4202 </div>
4203`,F3=`<div class="tldr-box">
4204 <div class="tldr-label">The short version</div>
4205 <ul class="tldr-list">
4206 <li><strong>Two minutes is the documented warning, and it is not a guarantee.</strong> AWS issues a Spot interruption notice two minutes before it stops or terminates an instance, on a best-effort basis. Instances can be reclaimed before the warning arrives.</li>
4207 <li><strong>The right question is restart cost, not stateless versus stateful.</strong> How long does this workload take to become useful again, and what happens to in-flight work while it is gone? That single number decides placement better than any architectural label.</li>
4208 <li><strong>Diversification determines your interruption rate more than anything else you control.</strong> One instance type in one availability zone is the most fragile possible shape and it is also the default most teams end up with.</li>
4209 </ul>
4210 </div>
4211
4212<div class="post-body">
4213
4214 <h2>What the signals actually promise</h2>
4215
4216 <p>
4217  There are two, they mean different things, and conflating them is the most common source of bad spot architecture.
4218 </p>
4219
4220 <p>
4221  <strong>The rebalance recommendation</strong> is a risk signal. It tells you an instance is at elevated risk of interruption. It can arrive well before the interruption notice, or it can arrive at the same moment, and AWS is explicit that it is emitted on a best-effort basis. It is not a deadline. Treating it as one causes teams to thrash their fleets, replacing instances that were never going to be reclaimed.
4222 </p>
4223
4224 <p>
4225  <strong>The interruption notice</strong>
4225 is the actual warning. AWS issues it two minutes before it stops or terminates the instance. This is your bounded shutdown window.
4226 </p>
4227
4228 <p>
4229  Two important qualifications on that two minutes.
4230 </p>
4231
4232 <p>
4233  First, it is best effort. AWS states plainly that an instance can be interrupted before the warning is made available. Any design that assumes the two minutes will always arrive is a design with an unhandled case in it.
4234 </p>
4235
4236 <p>
4237  Second, it does not apply to hibernation. If you configure hibernation as the interruption behavior, you receive a notice but no two-minute window, because the hibernation process begins immediately.
4238 </p>
4239
4240 <p>
4241  The practical consequence is that two minutes is your planning budget and zero is your worst case. Build for the second and use the first.
4242 </p>
4243
4244 <h2>Restart cost is the metric that matters</h2>
4245
4246 <p>
4247  Replace the stateless-versus-stateful question with a measurable one.
4248 </p>
4249
4250 <p>
4251  <strong>Restart cost</strong> is how long a workload takes to become useful again after it is killed, plus whatever happens to work in flight during that window. It is a property you can measure rather than a category you argue about.
4252 </p>
4253
4254 <p>
4255  Four bands, and the placement decision follows directly.
4256 </p>
4257
4258 <p>
4259  <strong>Low restart cost.</strong> Seconds to become useful, no in-flight work lost. These are also usually the workloads whose <a href="/resources/blogs/kubernetes-over-provisioning-hidden-cost">resource requests are most obviously padded</a>. Stateless API replicas behind a load balancer, most worker pods pulling from a durable queue, CI runners. Spot is straightforwardly correct here and the discount is nearly free.
4260 </p>
4261
4262 <p>
4263  <strong>Medium restart cost.</strong> Tens of seconds to a few minutes. Services with substantial warm-up, JVM applications with slow class loading, anything that populates a large in-memory cache before it can serve. Spot works with enough replicas, enough diversification, and a genuine over-provision buffer so the fleet can absorb a loss without dipping below capacity.
4264 </p>
4265
4266 <p>
4267  <strong>High restart cost.</strong> Long-running work that loses progress. Training jobs without checkpointing, long batch computations, data processing that has to restart from the beginning. Spot is viable only with checkpointing, and without checkpointing it is a bad trade regardless of the discount, because the expected cost of lost work exceeds the saving.
4268 </p>
4269
4270 <p>
4271  <strong>Critical restart cost.</strong> Anything where restarting is itself the incident. Stateful databases with local storage, singleton controllers, workloads holding long-lived connections that cannot be reestablished transparently. Keep these on on-demand capacity, and put them on a dedicated pool so a bin-packing decision cannot quietly move them. This is precisely the case for <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">changes that are reviewed and reversible rather than autonomous</a>.
4272 </p>
4273
4274 <p>
4275  Notice that this classification cuts across the architectural one. Plenty of nominally stateless services have high restart cost because of warm-up. Plenty of nominally stateful workloads have low restart cost because their state is durable and external.
4276 </p>
4277
4278 <h2>Diversification is the whole game</h2>
4279
4280 <p>
4281  If you change one thing about how you run spot, change this.
4282 </p>
4283
4284 <p>
4285  Interruptions happen when a specific capacity pool runs short, where a pool is roughly an instance type in an availability zone. Concentrate your fleet into one pool and you have made your interruption rate a function of a single market. Spread it across many pools and a shortage in one becomes a partial event you absorb rather than an outage you survive.
4286 </p>
4287
4288 <p>
4289  Most teams end up concentrated by accident rather than by choice. A node pool gets defined with one instance type because that was the type someone benchmarked, and it never gets revisited. The fix is to define pools around resource shape, roughly this much CPU and memory in this architecture, and let many instance families satisfy it.
4290 </p>
4291
4292 <p>
4293  Two practical notes. Older and less fashionable instance families are frequently both cheaper and less contended, because everyone else is competing for the current generation. And track y
4293our interruption rate per pool over time, then remove the pools that are chronically reclaimed. That data is available and almost nobody looks at it.
4294 </p>
4295
4296 <div class="pull-quote">
4297  "Two minutes is your planning budget. Zero is your worst case. Design for the second and spend the first."
4298 </div>
4299
4300 <h2>What has to be true before anything goes on spot</h2>
4301
4302 <p>
4303  None of this is exotic and all of it is skipped.
4304 </p>
4305
4306 <p>
4307  <strong>Pod disruption budgets that reflect reality.</strong> These are what stop a drain from taking out more replicas than the service can survive. Set them deliberately rather than accepting whatever a chart shipped with, and size the workloads themselves from <a href="/resources/blogs/pod-rightsizing-vpa-not-enough">observed behavior rather than defaults</a>. A disruption budget so strict that nothing can ever be evicted is its own failure mode, because it blocks routine maintenance too.
4308 </p>
4309
4310 <p>
4311  <strong>Health checks that mean something.</strong> If readiness returns true before the workload can actually serve, replacement capacity will be added to the load balancer while it is still warming up, and you will conclude that spot caused an outage that your health check caused.
4312 </p>
4313
4314 <p>
4315  <strong>A drain path that has been tested under load.</strong> Not reasoned about. Tested. AWS provides fault injection tooling that will interrupt a Spot Instance on demand for exactly this purpose. Run it during a busy period with the handler active and measure whether in-flight requests actually complete.
4316 </p>
4317
4318 <p>
4319  <strong>Something watching for the signal.</strong> If nothing polls instance metadata and no event rule exists, the two minutes are spent doing nothing at all. AWS recommends checking for interruption notices every five seconds.
4320 </p>
4321
4322 <p>
4323  <strong>A floor of on-demand capacity.</strong> Decide the minimum capacity that must exist regardless of spot availability, and hold it on on-demand. Alarm when the fleet approaches that floor, because that is the signal that your diversification has run out.
4324 </p>
4325
4326 <h2>The state problem, and what actually moves it</h2>
4327
4328 <p>
4329  Everything above is standard practice. It is also why the high and critical restart bands stay off spot: within a two-minute window you can drain a stateless replica gracefully, and you cannot relocate a running process without losing what is in its memory.
4330 </p>
4331
4332 <p>
4333  That constraint is a property of the tooling rather than a law of nature. Checkpoint and restore techniques, which capture the full state of a running process including memory and open connections and reconstruct it elsewhere, change what is possible inside a two-minute window. The Linux checkpoint/restore work that underpins this is mature and open source, and it is the mechanism behind live migration of running containers between nodes.
4334 </p>
4335
4336 <p>
4337  Where it applies, the calculation changes. A workload that could not previously tolerate interruption becomes one that can be moved rather than killed, which moves it down a restart-cost band and into spot eligibility.
4338 </p>
4339
4340 <p>
4341  We build this, so treat the framing with appropriate skepticism and test it against your own workloads rather than taking our word for it. The honest position is that it widens the set of workloads that can use spot capacity. It does not make everything safe to interrupt, and anything holding a strong durability guarantee should still stay on dedicated capacity.
4342 </p>
4343
4344 <h2>A sane target</h2>
4345
4346 <p>
4347  There is no correct spot ratio, but there is a sane way to arrive at one.
4348 </p>
4349
4350 <p>
4351  Start with the low restart cost workloads only. Get the drain path, the signal handling and the diversification right on those, where the cost of being wrong is small. Measure your actual interruption rate for a quarter rather than reasoning about it.
4352 </p>
4353
4354 <p>
4355  Then move up one band at a time, and review the ratio against interruption history rather than against anxiety. Most estates find that a substantial share of compute could sit on spot and does not, purely because nobody did the first step.
4356 </p>
4357
4358 <p>
4359  One interaction worth flagging. Moving workloads onto spot reduces your on-demand consumption, which reduces the baseline your <a href="/resources/blogs/kubernetes-reserved-instances-savings-plans-commitment-trap">commitments were sized against</a>. If you are inside a commitment term, a large spot migration can push you below the committed floor and produce no saving at all. Sequence the two together, or you will do excellent work for no financial result.
4360 </p>
4361
4362 <h2>The underlying point</h2>
4363
4364 <p>
4365  Spot is usually framed as a risk decision, and it is really a measurement decision.
4366 </p>
4367
4368 <p>
4369  The teams that use it well are not braver. They have measured restart cost per workload, diversified their capacity pools, tested the drain path under load, and know their actual interruption rate rather than their imagined one. Everything after that is arithmetic.
4370 </p>
4371
4372 <p>
4373  The teams that avoid it entirely are usually not protecting themselves from interruption. They are protecting themselves from not knowing what would happen, which is a different problem with a much cheaper solution.
4374 </p>
4375
4376 <p>
4377  <strong>About OptOps.</strong>
4377 OptOps is the optimization layer for enterprise infrastructure, covering Kubernetes in the cloud and HPC and GPU compute on premise. It classifies workloads by restart cost, keeps high-cost workloads off interruptible capacity, and supports state-preserving relocation for the ones in between. Read-only by default, so it deploys where write-access tools cannot.
4378 </p>
4379
4380 <h2>References</h2>
4381
4382 <ul>
4383  <li>Amazon Web Services. <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html" target="_blank" rel="noopener noreferrer">Best practices for Amazon EC2 Spot</a>.</li>
4384  <li>Amazon Web Services. <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-instance-termination-notices.html" target="_blank" rel="noopener noreferrer">Spot Instance interruption notices</a>.</li>
4385  <li>Amazon Web Services. <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/rebalance-recommendations.html" target="_blank" rel="noopener noreferrer">EC2 instance rebalance recommendations</a>.</li>
4386  <li>Amazon Web Services. <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/prepare-for-interruptions.html" target="_blank" rel="noopener noreferrer">Prepare for Spot Instance interruptions</a>.</li>
4387  <li>Amazon Web Services. <a href="https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/initiate-a-spot-instance-interruption.html" target="_blank" rel="noopener noreferrer">Initiate a Spot Instance interruption for testing</a>.</li>
4388 </ul>
4389
4390 </div>
4391
4392<div class="post-cta">
4393 <h3>Know your restart cost before you know your spot ratio</h3>
4394 <p>OptOps classifies every workload by restart cost from observed behavior, so the spot decision is made from measurement rather than from architectural labels. Read-only by default. Free Cluster Efficiency Assessment, report yours either way.</p>
4395 <div class="post-cta-buttons">
4396 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
4397 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
4398 </div>
4399 </div>
4400
4401<div class="faq-section">
4402 <h2>Frequently asked questions</h2>
4403
4404 <div class="faq-item">
4405 <div class="faq-q">Can you run production workloads on spot instances?</div>
4406 <p class="faq-a"><strong>Yes, for workloads whose restart cost is low enough to absorb an interruption.</strong> The useful question is not stateless versus stateful but how long a workload takes to become useful again after being killed and what happens to in-flight work meanwhile. Stateless replicas behind a load balancer and queue-driven workers are straightforward. Databases with local storage and singleton controllers should stay on dedicated capacity.</p>
4407 </div>
4408
4409 <div class="faq-item">
4410 <div class="faq-q">How much warning do you get before a spot instance is terminated?</div>
4411 <p class="faq-a"><strong>AWS issues a Spot Instance interruption notice two minutes before it stops or terminates the instance, on a best-effort basis.</strong> A separate rebalance recommendation may arrive earlier as a risk signal, but it carries no guaranteed interval and can arrive at the same time. Instances can be interrupted before any warning is made available, and configuring hibernation removes the two-minute window entirely because hibernation begins immediately.</p>
4412 </div>
4413
4414 <div class="faq-item">
4415 <div class="faq-q">How do you reduce spot interruption rates in Kubernetes?</div>
4416 <p class="faq-a"><strong>Diversify across many instance types and availability zones</strong>, since interruptions happen when a specific capacity pool runs short. Define node pools around resource shape rather than a single instance type. Older instance families are often both cheaper and less contended. Track interruption rate per pool over time and remove pools that are chronically reclaimed, which is data most teams have and never examine.</p>
4417 </div>
4418
4419 <div class="faq-item">
4420 <div class="faq-q">What is the difference between a rebalance recommendation and an interruption notice?</div>
4421 <p class="faq-a"><strong>The rebalance recommendation is a risk signal; the interruption notice is a deadline.</strong> The recommendation says an instance is at elevated risk and is the cue to pre-launch replacement capacity. The notice says the instance will be stopped or terminated in two minutes and is the cue to execute a bounded shutdown. Treating the recommendation as a deadline causes unnecessary fleet churn.</p>
4422 </div>
4423
4424 <div class="faq-item">
4425 <div class="faq-q">How do you test that your spot interruption handling works?</div>
4426 <p class="faq-a"><strong>Run a controlled interruption rather than reasoning about it.</strong> AWS provides fault injection tooling that will issue a real interruption to a Spot Instance on demand. Run it during a busy period with your handler active and measure whether in-flight requests actually complete and whether replacement capacity becomes ready before the old instance leaves. Untested drain paths are the most common cause of incidents blamed on spot.</p>
4427 </div>
4428
4429 <div class="faq-item">
4430 <div class="faq-q">Does moving workloads to spot affect Reserved Instance or Savings Plan commitments?</div>
4431 <p class="faq-a"><strong>Yes, and it can eliminate the saving entirely.</strong> Moving workloads onto spot reduces on-demand consumption, which is the consumption your commitments were sized against. If you are inside a commitment term, a large spot migration can push consumption below the committed floor, where you pay the shortfall regardless. Sequence the two decisions together rather than running them as separate programs.</p>
4432 </div>
4433 </div>
4434`,W3=`<div class="tldr-box">
4435 <div class="tldr-label">The short version</div>
4436 <ul class="tldr-list">
4437 <li><strong>FinOps has definitively expanded past the cloud.</strong> In the FinOps Foundation's 2026 practitioner survey, 57% of practices manage private cloud, up 18 points in a year, and 48% manage data center, up 12.</li>
4438 <li><strong>Almost nobody is optimizing on-premise yet.</strong> For data center spend, practitioners rank workload optimization fifth, behind allocation, planning, forecasting and reporting. Teams are still establishing what they own.</li>
4439 <li><strong>The cloud playbook does not transfer</strong>, because it assumes an invoice, elastic capacity, write access and hourly pricing. Measure capacity rather than currency, use device telemetry as the source of truth, and apply a cost model afterward.</li>
4440 </ul>
4441 </div>
4442
4443<div class="post-body">
4444
4445 <h2>The scope shift is not a consolidation story</h2>
4446
4447 <p>
4448  The expectation for most of the last decade was that on-premise infrastru
4448cture would shrink toward irrelevance and the interesting cost problems would all be cloud problems.
4449 </p>
4450
4451 <p>
4452  That is not what happened. The estate went hybrid and stayed hybrid. Regulated workloads did not move. Data gravity kept large datasets where they were. And the arrival of accelerated computing pushed a great deal of new capital expenditure back into owned hardware, because at sustained high utilization, buying accelerators is frequently cheaper than renting them.
4453 </p>
4454
4455 <p>
4456  So the discipline that learned to manage the cloud half is now being handed the other half, and the other half is often larger.
4457 </p>
4458
4459 <h2>Where teams actually are with it</h2>
4460
4461 <p>
4462  Here is the finding worth sitting with, because the obvious interpretation is wrong.
4463 </p>
4464
4465 <p>
4466  The obvious interpretation is that organizations have started optimizing their on-premise estates. They have not.
4467 </p>
4468
4469 <p>
4470  When the 2026 survey asked which capabilities practitioners are prioritizing for data center spend, the answer came back in this order: allocation, then planning and estimating, then forecasting and budgeting, then data ingestion and reporting. Workload optimization ranks fifth.
4471 </p>
4472
4473 <p>
4474  Compare that to how cloud went. In cloud, optimization was the opening move, because the invoice made waste impossible to ignore and there was an obvious lever to pull. On premise there is no invoice, so there is no forcing function, so teams are a full maturity cycle back. They are trying to establish what they own, what it cost, and which part of the business should carry it.
4475 </p>
4476
4477 <p>
4478  That sequencing is correct, incidentally. You cannot optimize what you cannot see, and <a href="/resources/blogs/finops-dashboards-dont-save-money">a report handed to a team with no mechanism to act on it</a> does not change anything either. But it does mean that most organizations reporting that they now manage data center spend are, in practice, at the accounting stage rather than the efficiency stage.
4479 </p>
4480
4481 <h2>Four assumptions that fail at the boundary</h2>
4482
4483 <p>
4484  Point a cloud cost tool at an on-premise cluster and it will produce output. The output will be confidently wrong, which is more dangerous than no output, because somebody will put it in a board pack.
4485 </p>
4486
4487 <p>
4488  Four things break.
4489 </p>
4490
4491 <h3>There is no invoice</h3>
4492
4493 <p>
4494  The entire cloud cost feedback loop starts with a monthly bill that attributes spend to resources. On premise, the money was spent years ago as capital expenditure, and it is now being recognized as depreciation on a schedule that has no relationship to what the hardware is doing this week.
4495 </p>
4496
4497 <p>
4498  There is no event that says "this node was idle in August and it cost you." The signal that drives every cloud cost workflow simply does not fire.
4499 </p>
4500
4501 <h3>Capacity is not elastic</h3>
4502
4503 <p>
4504  In cloud, the remedy for over-provisioning is to provision less. The saving is immediate and real, because you stop paying for the capacity the moment you stop using it.
4505 </p>
4506
4507 <p>
4508  On premise, provisioning less does not save anything. The hardware is already bought, already racked, already drawing power. Freeing up capacity produces a different asset: headroom. That headroom is only worth money if you can do something with it, which means either deferring the next purchase, absorbing a workload that would otherwise have gone to cloud, or making it available to another team or tenant.
4509 </p>
4510
4511 <p>
4512  This is not a smaller problem than the cloud version. It is a different one, and it has a different economic case that has to be argued rather than shown on a bill.
4513 </p>
4514
4515 <h3>The tool often cannot act</h3>
4516
4517 <p>
4518  In cloud, a third-party controller with write access is a manageable conversation for most commercial organizations. In the environments where a great deal of on-premise compute actually lives, banking, healthcare, defense, government and research, it frequently is not grantable at all.
4519 </p>
4520
4521 <p>
4522  This is the constraint that eliminates whole categories of tooling before an evaluation begins. It is covered in more depth in <a href="/resources/blogs/sovereign-compute-infrastru
4522cture-cost-optimization">what national and regulated infrastructure runs into</a>, which is the extreme version of the same problem.
4523 </p>
4524
4525 <h3>The unit of account is wrong</h3>
4526
4527 <p>
4528  Cloud cost tooling prices in hours of a named instance type. That works because the provider publishes a rate and bills against it.
4529 </p>
4530
4531 <p>
4532  A depreciating asset does not have an hourly rate. It has an acquisition cost, a useful life, a power draw, a cooling overhead, a share of facility cost, a maintenance contract, and a utilization profile. Turning that into a defensible per-hour number is possible, and we will get to how, but it is a modeling exercise rather than a lookup.
4533 </p>
4534
4535 <div class="pull-quote">
4536  "The cloud taught a generation of teams to optimize what they could see on an invoice. On premise, there is no invoice, and most of the estate has never been looked at."
4537 </div>
4538
4539 <h2>What to measure instead</h2>
4540
4541 <p>
4542  The useful question is identical in both environments. What was allocated, what was consumed, and what is the gap? Only the instrumentation differs.
4543 </p>
4544
4545 <p>
4546  <strong>Measure capacity, not currency, at least to begin with.</strong> Node hours and GPU hours are comparable across cloud and on-premise. Currency is not, because one side is billed monthly and the other is a depreciating asset. Establish the capacity picture first, then apply cost models to it. Comparing a cloud invoice directly against depreciated capital expenditure produces a number that means nothing and will not survive its first challenge from finance.
4547 </p>
4548
4549 <p>
4550  <strong>Use device telemetry as the source of truth.</strong> Scheduler records tell you what somebody asked for. They do not tell you what the hardware did. On the accelerator side specifically, this gap is enormous, and <a href="/resources/blogs/hpc-cost-optimization-gpu-cluster-utilization">a cluster reporting high utilization can still be substantially idle</a> precisely because the number being reported measures allocation rather than work. Use <a href="/resources/blogs/gpu-utilization-metrics-dcgm-mig">device telemetry rather than scheduler records</a> wherever the hardware exposes it.
4551 </p>
4552
4553 <p>
4554  <strong>Group by workload class, not by platform.</strong> A batch training job has the same economics whether it runs under a batch scheduler or as a container. A long-running service has the same economics either way. It is more useful to <a href="/resources/blogs/slurm-vs-kubernetes-gpu-scheduling-cost">group by workload class rather than by scheduler</a> than to maintain two separate cost programs that never reconcile.
4555 </p>
4556
4557 <p>
4558  <strong>Account for the boundary honestly.</strong> Data movement between environments has real cost, and in hybrid estates it is routinely larger than the compute savings from any placement decision. Egress is the item most often left out of a cloud-versus-on-premise comparison, and leaving it out is usually what makes the comparison come out the way the author wanted.
4559 </p>
4560
4561 <h2>Building a defensible internal rate</h2>
4562
4563 <p>
4564  At some point somebody will ask what an hour on your own hardware costs, and the answer needs to survive scrutiny.
4565 </p>
4566
4567 <p>
4568  The components are not controversial. Acquisition cost amortized over the useful life you actually use, not the accounting life. Power, at your real tariff rather than a national average. Cooling, usually expressed as a facility efficiency multiplier on power. Facility cost, whether that is rack space, colocation or a share of a building. Support and maintenance contracts. And the personnel cost of operating the thing, which is left out far more often than it should be.
4569 </p>
4570
4571 <p>
4572  Divide the annual total by the hours the asset is actually available, not by the hours in a year, and you have a rate.
4573 </p>
4574
4575 <p>
4576  Two cautions. First, be explicit about whether your rate is per available hour or per consumed hour, because the two differ by exactly the amount of the problem you are trying to measure, and quoting one while meaning the other is the most common error in these models. Second, agree the model with finance before you publish a number that depends on it. The same argument applies here as applies to cloud savings: a figure finance did not agree to in advance is not a figure, it is a slide.
4577 </p>
4578
4579 <h2>The FOCUS gap</h2>
4580
4581 <p>
4582  The FinOps Open Cost and Usage Specification exists to normalize cost and usage data so that spend can be compared across providers rather than reconciled by hand.
4583 </p>
4584
4585 <p>
4586  It is worth knowing where it currently stands for this problem. In the 2026 survey, the areas practitioners most want FOCUS to expand into are AI workloads and data center, which is a direct signal that hybrid estates cannot currently be normalized. Adoption is growing but the coverage that would let you put cloud and on-premise into one comparable dataset is not there yet.
4587 </p>
4588
4589 <p>
4590  Practically, that means anyone doing this today is building the normalization layer themselves. Worth knowing before you scope the project.
4591 </p>
4592
4593 <h2>Three ways this goes wrong</h2>
4594
4595 <p>
4596  <strong>Comparing capex against a cloud invoice.</strong> The single most common error, and it produces whatever answer the person doing the comparison already wanted. Compare capacity first. Apply cost models second, with the model written down.
4597 </p>
4598
4599 <p>
4600  <strong>Treating a high utilization number as the answer.</strong>
4600 Utilization figures on on-premise clusters are usually honest and usually measuring the wrong thing, because they report allocation rather than work performed. A cluster can report utilization in the nineties with a large share of its accelerators doing nothing.
4601 </p>
4602
4603 <p>
4604  <strong>Assuming your cloud tooling will follow you.</strong> It will connect, it will produce charts, and the charts will be wrong for the four reasons above. This is worse than having no tooling, because the output looks authoritative.
4605 </p>
4606
4607 <h2>A ninety-day sequence</h2>
4608
4609 <p>
4610  If you are starting from nothing on the on-premise side, the order matters more than the tooling.
4611 </p>
4612
4613 <p>
4614  First, inventory. What hardware exists, what it cost, when it was bought, and what it is nominally for. This is frequently harder than it sounds and it is frequently where the project stalls.
4615 </p>
4616
4617 <p>
4618  Second, instrument. Get device-level telemetry flowing for CPU, memory and accelerators. Read-only. No changes to anything yet.
4619 </p>
4620
4621 <p>
4622  Third, establish the allocated-versus-consumed gap by workload class. Do not act on it. Just publish it, because the number itself usually changes the conversation.
4623 </p>
4624
4625 <p>
4626  Fourth, agree the cost model with finance and turn the capacity gap into a currency figure they will stand behind.
4627 </p>
4628
4629 <p>
4630  Only then optimize, and when you do, apply the same safety discipline you would in cloud: changes <a href="/resources/blogs/advisory-vs-autonomous-kubernetes-optimization">reviewed by a human, scoped and reversible</a>, with an audit trail. A cost program that causes one incident does not get corrected. It gets canceled.
4631 </p>
4632
4633 <h2>The underlying point</h2>
4634
4635 <p>
4636  Kubernetes cost lives in <a href="/resources/blogs/reading-kubernetes-cost-stack">three distinct layers, each with its own waste pattern</a>. The on-premise estate has the same structure and one crucial difference: no layer of it generates a monthly bill.
4637 </p>
4638
4639 <p>
4640  The mechanism producing the waste is identical in both places. Somebody declares what a workload needs before it runs. The declaration is padded, because under-requesting fails loudly and over-requesting fails silently. And then it is <a href="/resources/blogs/kubernetes-over-provisioning-hidden-cost">padding that never gets revisited</a>, because nothing prompts a review.
4641 </p>
4642
4643 <p>
4644  In cloud, the invoice eventually prompts the review. On premise, nothing does. That is the entire difference, and it is why the half of the estate nobody bills for is usually the half with the most waste in it.
4645 </p>
4646
4647 <p>
4648  <strong>About OptOps.</strong> OptOps is the optimization layer for enterprise infrastructure, built to work across substrates rather than within one. The same engine reads real workload behavior on Kubernetes in the cloud and on HPC and GPU compute on premise, producing sized recommendations with cost and confidence attached. Read-only by default, so it deploys where write-access tools cannot.
4649 </p>
4650
4651 <h2>References</h2>
4652
4653 <ul>
4654  <li>FinOps Foundation. <a href="https://data.finops.org/" target="_blank" rel="noopener noreferrer">State of FinOps 2026</a>. Sixth annual practitioner survey, 1,192 respondents representing more than US$83 billion in annual cloud spend. Published under Attribution 4.0 International.</li>
4655  <li>FinOps Foundation. <a href="https://focus.finops.org/" target="_blank" rel="noopener noreferrer">FinOps Open Cost and Usage Specification (FOCUS)</a>.</li>
4656  <li>FinOps Foundation. <a href="https://www.finops.org/wg/finops-for-data-center-practical-cost-modeling-focus-alignment/" target="_blank" rel="noopener noreferrer">FinOps for Data Center: Practical Cost Modeling and FOCUS Alignment</a>.</li>
4657  <li>FinOps Foundation. <a href="https://www.finops.org/insights/mission-update/" target="_blank" rel="noopener noreferrer">Mission update, 2026</a>.</li>
4658 </ul>
4659
4660 </div>
4661
4662<div class="post-cta">
4663 <h3>One view across the whole estate</h3>
4664 <p>OptOps reads device telemetry on both sides of the boundary, cloud and on premise, and reports allocated against consumed in the same units, split by workload class. Read-only by default. See which half of your estate is actually worse.</p>
4665 <div class="post-cta-buttons">
4666 <a href="/bookdemo" class="btn btn-primary">Book a demo <span class="btn-arrow">→</span></a>
4667 <a href="/bookdemo" class="btn btn-secondary">Get a free Cluster Efficiency Assessment</a>
4668 </div>
4669 </div>
4670
4671<div class="faq-section">
4672 <h2>Frequently asked questions</h2>
4673
4674 <div class="faq-item">
4675 <div class="faq-q">
4675Does FinOps apply to on-premise and private cloud infrastructure?</div>
4676 <p class="faq-a">Yes, and the scope expanded sharply in 2026. <strong>The FinOps Foundation's 2026 practitioner survey found 57% of practices managing private cloud and 48% managing data center spend</strong>, up 18 and 12 points respectively year on year. The Foundation also updated its mission in 2026 from managing the value of cloud to managing the value of technology, which reflects the same shift.</p>
4677 </div>
4678
4679 <div class="faq-item">
4680 <div class="faq-q">Why do cloud cost tools not work on-premise?</div>
4681 <p class="faq-a"><strong>Four assumptions built into them fail: there is no monthly invoice, capacity is fixed rather than elastic, write access to production is often not permitted, and the unit of account is a depreciating asset rather than an hourly instance price.</strong> The tools will still connect and produce output. The output is not reliable, which is more dangerous than having no tooling at all.</p>
4682 </div>
4683
4684 <div class="faq-item">
4685 <div class="faq-q">How do you calculate the cost of an on-premise node hour or GPU hour?</div>
4686 <p class="faq-a"><strong>Amortize the acquisition cost over the useful life, then add power at your real tariff, cooling as a facility efficiency multiplier, facility or rack cost, support contracts and operating personnel cost.</strong> Divide the annual total by the hours the asset is actually available rather than by the hours in a year. State explicitly whether your rate is per available hour or per consumed hour, since the two differ by exactly the amount of waste you are trying to measure.</p>
4687 </div>
4688
4689 <div class="faq-item">
4690 <div class="faq-q">How do you compare cloud cost against on-premise cost fairly?</div>
4691 <p class="faq-a"><strong>Compare capacity first, in node hours and GPU hours, and apply cost models afterward.</strong> Comparing a cloud invoice directly against depreciated capital expenditure produces a meaningless number. Include data movement between the two environments, since egress is routinely larger than the compute difference and is the item most often omitted from these comparisons.</p>
4692 </div>
4693
4694 <div class="faq-item">
4695 <div class="faq-q">What should a private cloud FinOps program measure first?</div>
4696 <p class="faq-a"><strong>Allocation before optimization.</strong> In the 2026 survey, practitioners ranked workload optimization fifth for data center spend, behind allocation, planning and estimating, forecasting and budgeting, and reporting. The practical sequence is inventory, then read-only instrumentation, then the allocated-versus-consumed gap by workload class, then a cost model agreed with finance, and only then optimization.</p>
4697 </div>
4698
4699 <div class="faq-item">
4700 <div class="faq-q">Does FOCUS cover data center and AI spend yet?</div>
4701 <p class="faq-a">Not fully. <strong>Data center and AI workloads are the two areas practitioners most want the specification to expand into</strong>, according to the 2026 survey, which is a direct signal that hybrid estates cannot currently be normalized into one comparable dataset. Adoption is growing, but teams doing this today are building the normalization layer themselves. ---</p>
4702 </div>
4703 </div>
4704`,el={January:0,February:1,March:2,April:3,May:4,June:5,July:6,August:7,September:8,October:9,November:10,December:11},jx=n=>{let s=/^(\w+) (\d{1,2}), (\d{4})$/.exec(n||"");return s&&el[s[1]]!==void 0?new Date(+s[3],el[s[1]],+s[2]).getTime():(s=/^(\w+) (\d{4})$/.exec(n||""),s&&el[s[1]]!==void 0?new Date(+s[2],el[s[1]],1).getTime():0)},om=[{slug:"kubernetes-reserved-instances-savings-plans-commitment-trap",title:"The Kubernetes commitment trap: why Reserved Instances and Savings Plans can cancel your savings.",titleHtml:'The Kubernetes commitment trap: <span class="accent">why Reserved Instances and Savings Plans can cancel your savings.</span>',eyebrow:"FinOps · Commitments",deck:"The most expensive Kubernetes decision most organizations make is not made by an engineer. It is made in a procurement meeting, one to three years before anyone notices, and no amount of optimization afterward can undo it.",description:"Reserved Instances and Savings Plans get sized against padded consumption. Why optimizing after you commit can save nothing, and how to sequence it properly.",author:"By Prince Khanna, Co-founder & CEO",date:"August 18, 2026",readTime:"9 min read",body:H3},{slug:"kubernetes-cost-allocation-showback-chargeback",title:"Kubernetes cost allocation in shared clusters: showback, chargeback, and the part that never allocates.",titleHtml:'Kubernetes cost allocation in shared clusters: <span class="accent">showback, chargeback, and the part that never allocates.</span>
4704',eyebrow:"FinOps · Allocation",deck:"Kubernetes was designed to make the boundary between a workload and a machine disappear. It succeeded. Now finance wants that boundary back, and the honest answer is that a meaningful share of your cluster cost belongs to nobody in particular.",description:"Kubernetes breaks per-team attribution by design. The three buckets of cluster cost, why to allocate on requests not usage, and showback before chargeback.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"August 25, 2026",readTime:"10 min read",body:K3},{slug:"production-kubernetes-spot-instances",title:"Running production Kubernetes on spot without gambling.",titleHtml:'Running production Kubernetes on spot <span class="accent">without gambling.</span>',eyebrow:"Technical · Spot & Interruption",deck:"Spot capacity is the largest discount in cloud infrastructure and the least used. The reason is not that teams do not know about it — the standard advice quietly excludes almost everything anyone actually runs.",description:"The two-minute spot warning is best-effort, not a guarantee. Why restart cost beats stateless-vs-stateful, and how diversification sets your interruption rate.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"September 1, 2026",readTime:"10 min read",body:F3},{slug:"finops-private-cloud-data-center-cost-optimization",title:"FinOps for private cloud and data center: why the cloud playbook does not transfer.",titleHtml:'FinOps for private cloud and data center: <span class="accent">why the cloud playbook does not transfer.</span>',eyebrow:"FinOps · Hybrid Estate",deck:"Over half of FinOps practices now manage private cloud and nearly half manage data center. Almost none of them are optimizing it yet. What breaks when you point cloud cost tooling at hardware you already own, and what to measure instead.",description:"57% of FinOps practices now manage private cloud and almost none optimize it. What breaks when cloud cost tooling meets owned hardware, and what to measure.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"September 8, 2026",readTime:"11 min read",body:W3},{slug:"hpc-cost-optimization-gpu-cluster-utilization",title:"The HPC utilization problem: why a cluster at 95% can still be half idle.",titleHtml:'The HPC utilization problem: <span class="accent">why a cluster at 95% can still be half idle.</span>',eyebrow:"HPC · Pillar Post",deck:"Supercomputing centres report utilisation in the eighties and nineties, and the numbers are honest. They are also measuring the wrong thing. Where GPU waste actually hides, why nobody sees it, and the five metrics that describe reality rather than bookkeeping.",description:"HPC clusters report utilisation above 80% while the hardware inside those allocations sits underused. Where GPU waste hides, and what to measure instead.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"July 14, 2026",readTime:"9 min read",body:B3},{slug:"slurm-gpu-allocation-over-requesting",title:"Why researchers over-request GPUs, and what to do about it.",titleHtml:'Why researchers over-request GPUs, <span class="accent">and what to do about it.</span>',eyebrow:"HPC · Cluster Efficiency",deck:"Every HPC centre sends the same message asking people to request resources accurately. Nothing changes, and six months later they send it again. The message fails for a reason worth understanding — and the fixes that work change defaults and visibility, not policy.",description:"Researchers over-request GPUs because failure is asymmetric. Why the usual fixes fail, what it costs the queue, and the changes that actually shift behaviour.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"July 21, 2026",readTime:"7 min read",body:_3},{slug:"sovereign-compute-infrastructure-cost-optimization",title:"Sovereign compute economics: why national AI infrastructure cannot use cloud cost tools.",titleHtml:'Sovereign compute economics: <span class="accent">why national AI infrastructure cannot use cloud cost tools.</span>',eyebrow:"Sovereign Compute · Policy & Infrastructure",deck:"National AI programmes are building compute at extraordinary pace — and n
4704one of it can use the tools that manage cloud cost. Four assumptions that break in sovereign environments, and what optimisation has to look like instead.",description:"National AI infrastructure cannot use cloud cost tools. Why sovereign and air-gapped clusters need a different optimisation model, and what changes in practice.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"July 28, 2026",readTime:"9 min read",body:V3},{slug:"gpu-utilization-metrics-dcgm-mig",title:"Measuring GPU idle waste: what DCGM tells you that nvidia-smi does not.",titleHtml:'Measuring GPU idle waste: <span class="accent">what DCGM tells you that nvidia-smi does not.</span>',eyebrow:"Technical · GPU Observability",deck:"The utilization number almost everyone tracks is probably the most misread metric in accelerated computing. What it actually measures, the DCGM fields that answer the real question, and how to make per-job idle waste calculable.",description:"The GPU utilization number most teams track does not measure efficiency. What DCGM actually reports, which metrics matter, and how to find real idle waste.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"August 4, 2026",readTime:"8 min read",body:L3},{slug:"slurm-vs-kubernetes-gpu-scheduling-cost",title:"One estate, two schedulers: optimizing Kubernetes and Slurm together.",titleHtml:'One estate, two schedulers: <span class="accent">optimizing Kubernetes and Slurm together.</span>',eyebrow:"Technical · Multi-Scheduler",deck:"Organisations rarely choose between Slurm and Kubernetes — they end up with both, and nobody can answer a simple question about total cost across the two. Why the waste patterns differ, why gang scheduling matters, and how to build one view across the estate.",description:"Most organisations end up running both Slurm and Kubernetes. Why each waste pattern differs, why gang scheduling matters, and how to compare cost across them.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"August 11, 2026",readTime:"9 min read",body:G3},{slug:"kubernetes-over-provisioning-hidden-cost",title:"The hidden cost of Kubernetes over-provisioning. Why 60% of your cluster spend is probably waste.",titleHtml:'The hidden cost of Kubernetes <span class="accent">over-provisioning.</span> Why 60% of your cluster spend is probably waste.',eyebrow:"Kubernetes Cost · Pillar Post",deck:"Half of what you're paying for Kubernetes is sitting idle. This piece walks through how that happens, why the obvious fixes fall short, and what teams running production at scale do about it.",description:"The average Kubernetes cluster wastes 50 to 70% of what it costs to run. We look at why over-provisioning happens, what it costs, and what removes it.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"February 2026",readTime:"9 min read",body:C3},{slug:"advisory-vs-autonomous-kubernetes-optimization",title:"Advisory vs. autonomous Kubernetes optimization. Which approach fits your team?",titleHtml:'Advisory vs. autonomous Kubernetes optimization. <span class="accent">Which approach fits your team?</span>',eyebrow:"Buyer's Guide · Decision Framework",deck:"Every Kubernetes cost optimization platform on the market is built on one of two opposing philosophies. Pick the wrong one and the tool either gets blocked in security review or quietly stops being used. Inside, a framework for choosing right.",description:"Advisory or autonomous? The two philosophies behind every Kubernetes cost optimization platform, and a clear framework for choosing the one that fits how your team works.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"March 2026",readTime:"8 min read",body:O3},{slug:"finops-dashboards-dont-save-money",title:"Why FinOps dashboards don't save you money. And what does.",titleHtml:`Why FinOps dashboards <span class="accent">don't save you money.</span> And what does.`,eyebrow:"FinOps · Pain Piece",deck:"Your FinOps dashboard is doing exactly what it was built to do. Showing you where Kubernetes waste lives. The reason your bill isn't going down has nothing to do with the dashboard. It's the part the dashboard was never designed to handle.",description:"FinOps dashboards are excellent at showing where Kubernetes w
4704aste lives. They're terrible at eliminating it. We unpack why the gap exists, and what closes it.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"March 2026",readTime:"7 min read",body:E3},{slug:"kubernetes-cost-optimization-bfsi-playbook",title:"Kubernetes cost optimization for BFSI. A compliance-aware playbook.",titleHtml:'Kubernetes cost optimization for BFSI. <span class="accent">A compliance-aware playbook.</span>',eyebrow:"BFSI · Compliance Playbook",deck:"Banks and financial services run some of the most sophisticated Kubernetes infrastructure in the world, and pay some of the worst Kubernetes bills. The reason isn't engineering skill. It's that most optimisation tools were built for environments where compliance isn't the lead constraint.",description:"A practical playbook for reducing Kubernetes cloud spend in banking, financial services, and insurance, without breaking change-management discipline, audit requirements, or your security review.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"April 2026",readTime:"9 min read",body:D3},{slug:"engineering-ignores-cost-optimization-recommendations",title:"The real reason your engineering team ignores cost optimization recommendations.",titleHtml:'The real reason your engineering team <span class="accent">ignores cost optimization recommendations.</span>',eyebrow:"Opinion · Engineering Culture",deck:"Not laziness, not lack of awareness, and not bad attitude. The cause is the incentive structure your organisation built, plus recommendations that don't match how engineers evaluate risk. Inside, the honest version written by someone who has been on both sides.",description:"Not laziness. Not lack of awareness. It's an incentive structure that punishes optimization work. The honest explanation, and what fixes it.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"April 2026",readTime:"7 min read",body:z3},{slug:"pod-rightsizing-vpa-not-enough",title:"Pod rightsizing done right. Why VPA isn't enough, and what to use instead.",titleHtml:`Pod rightsizing done right. <span class="accent">Why VPA isn't enough, and what to use instead.</span>`,eyebrow:"Technical · Pod Rightsizing",deck:"The Kubernetes Vertical Pod Autoscaler is built into Kubernetes for a reason. It's also why almost nobody uses it in production. A technical breakdown of what VPA does, where it fails, and what to use when you need pod rightsizing that works.",description:"The Kubernetes Vertical Pod Autoscaler is built into Kubernetes for a reason. It's also the wrong tool for production rightsizing in most environments. A technical breakdown, and what works better.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"April 2026",readTime:"9 min read",body:R3},{slug:"kubernetes-cost-optimization-government-public-sector",title:"Kubernetes cost optimization in government and public sector. What's different.",titleHtml:`Kubernetes cost optimization in government and public sector. <span class="accent">What's different.</span>`,eyebrow:"Government · Public Sector",deck:"Government Kubernetes deployments don't operate under the same constraints as commercial infrastructure. The optimisation playbook that works for a Series B SaaS company can fail in a public-sector context for reasons that aren't immediately obvious. What changes, and what teams running cloud at scale in government need.",description:"Government Kubernetes deployments have different constraints than commercial environments: sovereignty rules, procurement cycles, sustainability mandates. What changes about cost optimization in the public sector.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"April 2026",readTime:"9 min read",body:M3},{slug:"reading-kubernetes-cost-stack",title:"Reading the Kubernetes cost stack. Pods, nodes, and cloud commitments.",titleHtml:'Reading the Kubernetes cost stack. <span class="accent">Pods, nodes, and cloud commitments.</span>',eyebrow:"Educational · Pillar Piece",deck:"Kubernetes cost lives in three distinct layers, each with its own waste pattern, its own owner, and its own optimisation approach. Most teams attack one layer at a time and miss the compounding effects. A way to read the whole stack.",description:"Kubernetes cost lives in three distinct layers, each with its own waste pattern and its own optimization approach. How to read the stack, and why most teams only fix one layer at a time.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"February 2026",readTime:"10 min read",body:q3},{slug:"founder-pivot-cloud-bill-built-company",title:"The founder pivot. How watching our cloud bill blow up built a company.",titleHtml:'The founder pivot. <span class="accent">How watching our cloud bill blow up built a company.</span>',eyebrow:"Founder Story · Origin",deck:"A blindside AWS bill. A co-founder who saw what nobody else was seeing. A 60% drop that nobody believed was real until it was. The story of how OptOps.ai started, written by the people it happened to.",description:"The story behind OptOps.ai. A blindside cloud bill, a co-founder's billion-dollar idea, a 60% drop, and the moment we realised this wasn't a side project. It was the company.",author:"By Prince Khanna & Ashutosh Dubey",role:"Co-founders, OptOps.ai",date:"January 2026",readTime:"8 min read",body:P3},{slug:"field-guide-kubernetes-cost-optimization-tools-2026",title:"A field guide to Kubernetes cost optimization tools. 2026 edition.",titleHtml:'A field guide to <span class="accent">Kubernetes cost optimization tools.</span> 2026 edition.',eyebrow:"Buyer's Guide · 2026 Edition",deck:"The market has consolidated into three categories, each built on a different philosophy. This guide covers what each one does, who builds in it, and which environments f
4704it. Written by a vendor in this space, but kept as straight as we can manage.",description:"A buyer's guide to Kubernetes cost optimization platforms covering FinOps dashboards, autonomous platforms, and advisory-first AI. Categories, capabilities, and how to choose the right fit.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"May 2026",readTime:"12 min read",body:I3},{slug:"cloud-providers-dont-offer-real-cost-optimizers",title:"Why your cloud providers don't offer real cost optimizers.",titleHtml:`Why your cloud providers <span class="accent">don't offer real cost optimizers.</span>`,eyebrow:"Industry Analysis · Opinion",deck:"Hyperscalers ship billing dashboards, advisor services, and recommender tools. They don't ship platforms that meaningfully cut your bill. There is a structural reason, and it isn't a conspiracy. It's basic economics.",description:"Hyperscalers ship cost dashboards, advisor services, and recommender tools. They don't ship platforms that meaningfully reduce your bill. The structural reason is economics, not conspiracy.",author:"By Ashutosh Dubey, Co-founder & CTO",date:"May 2026",readTime:"9 min read",body:U3}].sort((n,s)=>jx(s.date)-jx(n.date)),Y3=n=>om.find(s=>s.slug===n),X3=[1,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,1,1,0,0,0,1,0,0,1,0,0,0,0,0,0,1,0,0,1],J3=()=>{const[n,...s]=om;return a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Resources",title:"OptOps Blog",subtitle:"Insights, playbooks, and field notes on infrastructure cost optimization — Kubernetes, HPC, and GPU compute — written by the team building OptOps.ai."}),a.jsx("section",{className:"w-full max-w-6xl mx-auto px-6 pb-8",children:a.jsx(ie,{to:`/resources/blogs/${n.slug}`,className:"block glass-card rounded-2xl p-8 md:p-10 hover:border-primary/40 transition-all group",children:a.jsxs("div",{className:"flex flex-col md:flex-row md:items-end md:justify-between gap-6",children:[a.jsxs("div",{className:"max-w-2xl",children:[a.jsxs("div",{className:"inline-flex items-center gap-2.5 mb-4",children:[a.jsx("span",{className:"block w-6 h-px bg-primary"}),a.jsxs("span",{className:"text-[10px] font-bold text-primary uppercase tracking-[0.16em]",children:["Featured · ",n.eyebrow]})]}),a.jsx("h2",{className:"text-3xl md:text-4xl font-black tracking-tight text-white leading-tight mb-4 group-hover:text-primary transition-colors",children:n.title}),a.jsx("p",{className:"text-slate-400 leading-relaxed mb-5 text-base md:text-lg",children:n.deck}),a.jsxs("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1 font-mono text-xs text-slate-500",children:[a.jsx("span",{children:n.author}),a.jsx("span",{className:"opacity-50",children:"·"}),a.jsx("span",{children:n.date}),a.jsx("span",{className:"opacity-50",children:"·"}),a.jsx("span",{children:n.readTime})]})]}),a.jsxs("div",{className:"flex flex-col items-center gap-4 shrink-0 self-center",children:[a.jsx("div",{className:"hidden md:grid grid-cols-6 gap-1.5","aria-hidden":"true",children:X3.map((o,l)=>a.jsx("div",{className:`w-5 h-5 rounded ${o?"bg-primary/70 shadow-[0_0_8px_rgba(175,37,244,0.45)]":"bg-white/5 border border-white/10"}`},l))}),a.jsx("p",{className:"hidden md:block text-[9px] font-mono uppercase tracking-widest text-slate-500 text-center max-w-[190px]",children:"the lit ones do the work. you pay for all of them."}),a.jsxs("span",{className:"inline-flex items-center gap-2 text-sm font-bold text-primary group-hover:translate-x-1 transition-transform whitespace-nowrap",children:["Read article",a.jsx("span",{"aria-hidden":"true",children:"→"})]})]})]})})}),a.jsxs("section",{className:"w-full max-w-6xl mx-auto px-6 pb-24",children:[a.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[a.jsx("span",{className:"block w-6 h-px bg-primary"}),a.jsx("span",{className:"text-[10px] font-bold text-primary uppercase tracking-[0.16em]",children:"All posts"})]}),a.jsx("div",{className:"grid md:grid-cols-2 lg:grid-cols-3 gap-5",children:s.map(o=>a.jsxs(ie,{to:`/resources/blogs/${o.slug}`,className:"glass-card rounded-2xl p-6 hover:border-primary/40 hover:bg-white/5 transition-all group flex flex-col",children:[a.jsx("p",{className:"text-[10px] font-bold text-primary uppercase tracking-[0.14em] mb-3",children:o.eyebrow}),a.jsx("h3",{className:"text-lg font-bold text-white leading-snug mb-3 group-hover:text-primary transition-colors",children:o.title}),a.jsx("p",{className:"text-sm text-slate-400 leading-relaxed mb-5 line-clamp-3 flex-1",children:o.deck}),a.jsxs("div",{className:"flex items-center justify-between mt-auto pt-4 border-t border-white/5",children:[a.jsxs("span",{className:"text-xs font-mono text-slate-500",children:[o.date," · ",o.readTime]}),a.jsx("span",{className:"text-sm font-bold text-primary group-hover:translate-x-1 transition-transform",children:"→"})]})]},o.slug))})]})]})},kx="https://optops.ai",$3={title:"OptOps — Autonomous Optimization for Kubernetes, GPU & HP
4704C",description:"OptOps continuously finds and safely removes infrastructure waste across Kubernetes, GPU and HPC — cutting cost by up to 60% with autonomous consolidation, container live migration, and pod rightsizing. Read-only by default, advisory-first."},Q3={"/":$3,"/bookdemo":{title:"Book a Demo — OptOps",description:"See OptOps cut a Kubernetes bill live: autonomous consolidation, spot rescue, and container live migration — with zero dropped connections on AWS."},"/live-migration":{title:"Container Live Migration for Kubernetes — OptOps",description:"Move running pods between nodes without dropping a connection. CRIU checkpoint/restore with memory, state, and — on AWS — the same pod IP and unbroken TCP sessions."},"/spot-automation":{title:"Kubernetes Spot Automation & Interruption Rescue — OptOps",description:"Run production on spot without fear: state-preserving interruption rescue proven on real AWS drills, diversified pools, automatic on-demand fallback, and a stockout circuit breaker."},"/node-consolidation":{title:"Autonomous Node Consolidation for Kubernetes — OptOps",description:"Bin-packing that respects PDBs, affinity, and volumes — and refuses to execute unless it actually saves money. A Karpenter-grade engine on EKS and GKE, with no lock-in."},"/pod-rightsizing":{title:"Continuous Kubernetes Pod Rightsizing — OptOps",description:"Requests that track real usage, continuously, with OOM spike protection and hard guardrails. Start in shadow mode, then let it drive."},"/finops-visibility":{title:"Kubernetes FinOps & Cost Visibility — OptOps",description:"Real-time cost by cluster, namespace, and workload — no tagging required — with savings accounting you can audit: realized and opportunity, never blended."},"/hpc":{title:"GPU & HPC Optimization for AI Data Centers — OptOps",description:"Turn idle accelerators into sellable capacity: MIG packing, power and clock tuning, right-sizing, and safe preemption with checkpointing. Read-only by default, air-gap capable — 30–38% more efficiency from the fleet you already own."},"/security":{title:"Security & Trust — OptOps",description:"Read-only by default, no secrets collected, decisions made inside your cluster, fail-open everywhere. Independently security-assessed; ISO certification in progress."},"/case-studies":{title:"Case Studies — OptOps",description:"How a media-tech company cut Kubernetes costs 60% in 30 days with OptOps — with zero production incidents."},"/company":{title:"Company — OptOps",description:"Learn about the OptOps mission, team, and ecosystem partnerships."},"/company/about":{title:"About Us — OptOps",description:"OptOps started as an internal tool to cut our own Kubernetes bill — and became an autonomous cost-optimization platform. NVIDIA Inception member."},"/company/partner-program":{title:"Partner Program — OptOps",description:"Deliver measurable Kubernetes cost reduction to your clients with a success-based revenue share. Built for consultancies, DevOps providers, and MSPs."},"/company/contact-us":{title:"Contact Us — OptOps",description:"Talk to the OptOps team about autonomous Kubernetes cost optimization."},"/resources":{title:"Resources — OptOps",description:"Guides, capability overviews, and onboarding help for your Kubernetes optimization journey."},"/resources/key-platform-features":{title:"Key Platform Features — OptOps",description:"Live migration, spot rescue, autonomous consolidation, continuous rightsizing, FinOps visibility, and the safety mechanisms that let you trust them."},"/resources/get-started":{title:"How To Get Started — OptOps",description:"Install the full OptOps stack with one Helm command, watch shadow mode, then enable autonomous optimization at your own pace."},"/resources/blogs":{title:"Blog — OptOps",description:"Playbooks and field notes on infrastructure cost optimization, from Kubernetes in the cloud to HPC and GPU clusters on premise. From the OptOps team."},"/resources/roi-calculator":{title:"ROI Calculator — OptOps",description:"Estimate how much of your Kubernetes spend OptOps can recover, and the carbon that goes with it."},"/privacy-policy":{title:"Privacy Policy — OptOps",description:"How OptOps collects, uses, and protects your data."},"/terms-of-service":{title:"Terms of Service — OptOps",description:"The terms that govern your use of OptOps."}},Z3=n=>Q3[n.replace(/\/+$/,"")||"/"]||null,Ms=(n,s,o)=>
4704{let l=document.head.querySelector(n);l||(l=s(),document.head.appendChild(l)),l.setAttribute("content",o)},_u=n=>()=>{const s=document.createElement("meta");return s.setAttribute("name",n),s},Vu=n=>()=>{const s=document.createElement("meta");return s.setAttribute("property",n),s},p0=({title:n,description:s,path:o})=>{if(typeof document>"u")return;document.title=n,Ms('meta[name="description"]',_u("description"),s),Ms('meta[property="og:title"]',Vu("og:title"),n),Ms('meta[property="og:description"]',Vu("og:description"),s),Ms('meta[property="og:url"]',Vu("og:url"),`${kx}${o}`),Ms('meta[name="twitter:title"]',_u("twitter:title"),n),Ms('meta[name="twitter:description"]',_u("twitter:description"),s);let l=document.head.querySelector('link[rel="canonical"]');l||(l=document.createElement("link"),l.setAttribute("rel","canonical"),document.head.appendChild(l)),l.setAttribute("href",`${kx}${o}`)},eO=()=>{const{pathname:n}=gn();j.useEffect(()=>{const s=Z3(n);s&&p0({title:s.title,description:s.description,path:n==="/"?"/":n.replace(/\/+$/,"")})},[n])},tO=()=>a.jsxs("section",{className:"w-full max-w-3xl mx-auto px-6 py-24 text-center",children:[a.jsx("p",{className:"text-xs font-bold text-primary uppercase tracking-[0.12em] mb-3",children:"Resources · Blog"}),a.jsx("h1",{className:"text-4xl md:text-5xl font-black tracking-tight text-white mb-4",children:"Post not found"}),a.jsx("p",{className:"text-slate-400 mb-8",children:"We couldn't find the article you were looking for."}),a.jsx(ie,{to:"/resources/blogs",className:"inline-block bg-primary neon-glow px-5 py-2.5 rounded-lg text-sm font-bold text-white hover:brightness-110 transition-all",children:"Back to all posts"})]}),nO=()=>{const{slug:n}=Lk(),s=Y3(n);if(j.useEffect(()=>{s&&p0({title:`${s.title} — OptOps`,description:s.description||s.deck,path:`/resources/blogs/${s.slug}`})},[s]),j.useEffect(()=>{window.scrollTo({top:0,behavior:"instant"})},[n]),!s)return a.jsx(ht,{children:a.jsx(tO,{})});const o=om.filter(l=>l.slug!==s.slug).slice(0,3);return a.jsxs(ht,{children:[a.jsxs("article",{className:"w-full max-w-3xl mx-auto px-6 pt-16 pb-20",children:[a.jsxs("nav",{className:"text-xs font-mono text-slate-500 tracking-widest mb-10",children:[a.jsx(ie,{to:"/",className:"hover:text-primary transition-colors",children:"Home"}),a.jsx("span",{className:"mx-2 opacity-50",children:"/"}),a.jsx(ie,{to:"/resources/blogs",className:"hover:text-primary transition-colors",children:"Blog"}),a.jsx("span",{className:"mx-2 opacity-50",children:"/"}),a.jsx("span",{className:"text-slate-400",children:s.eyebrow.split("·")[0].trim()})]}),a.jsxs("div",{className:"inline-flex items-center gap-2.5 mb-5",children:[a.jsx("span",{className:"block w-6 h-px bg-primary"}),a.jsx("span",{className:"text-xs font-bold text-primary uppercase tracking-[0.14em]",children:s.eyebrow})]}),a.jsx("h1",{className:"text-4xl md:text-5xl lg:text-[54px] font-black tracking-tight text-white leading-[1.08] mb-6",dangerouslySetInnerHTML:{__html:s.titleHtml.replace(/class="accent"/g,'class="bg-gradient-to-r from-primary to-fuchsia-400 bg-clip-text text-transparent"')}}),a.jsx("p",{className:"text-lg md:text-xl text-slate-400 leading-relaxed mb-8 max-w-2xl",children:s.deck}),a.jsxs("div",{className:"flex flex-wrap items-center gap-x-4 gap-y-2 font-mono text-xs tracking-wide text-slate-500 pb-8 border-b border-white/10",children:[a.jsx("span",{className:"text-slate-400 font-semibold",children:s.author}),s.role&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"opacity-50",children:"·"}),a.jsx("span",{children:s.role})]}),a.jsx("span",{className:"opacity-50",children:"·"}),a.jsx("span",{children:s.date}),s.readTime&&a.jsxs(a.Fragment,{children:[a.jsx("span",{className:"opacity-50",children:"·"}),a.jsx("span",{children:s.readTime})]})]}),a.jsx("div",{className:"blog-article mt-10",dangerouslySetInnerHTML:{__html:s.body}
4704})]}),o.length>0&&a.jsx("section",{className:"w-full max-w-5xl mx-auto px-6 pb-24",children:a.jsxs("div",{className:"border-t border-white/10 pt-12",children:[a.jsx("h2",{className:"text-xs font-bold text-primary uppercase tracking-[0.14em] mb-6",children:"Keep reading"}),a.jsx("div",{className:"grid md:grid-cols-3 gap-4",children:o.map(l=>a.jsxs(ie,{to:`/resources/blogs/${l.slug}`,className:"glass-card rounded-2xl p-5 hover:border-primary/40 hover:bg-white/5 transition-all group",children:[a.jsx("p",{className:"text-[10px] font-bold text-primary uppercase tracking-[0.12em] mb-3",children:l.eyebrow}),a.jsx("h3",{className:"text-base font-bold text-white leading-snug mb-2 group-hover:text-primary transition-colors",children:l.title}),a.jsx("p",{className:"text-xs text-slate-500 font-mono",children:l.readTime})]},l.slug))})]})})]})};const aO=n=>n.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),sO=n=>n.replace(/^([A-Z])|[\s-_]+(\w)/g,(s,o,l)=>l?l.toUpperCase():o.toLowerCase()),Nx=n=>{const s=sO(n);return s.charAt(0).toUpperCase()+s.slice(1)},f0=(...n)=>n.filter((s,o,l)=>!!s&&s.trim()!==""&&l.indexOf(s)===o).join(" ").trim(),iO=n=>{for(const s in n)if(s.startsWith("aria-")||s==="role"||s==="title")return!0};var oO={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const rO=j.forwardRef(({color:n="currentColor",size:s=24,strokeWidth:o=2,absoluteStrokeWidth:l,className:d="",children:h,iconNode:m,...p},f)=>j.createElement("svg",{ref:f,...oO,width:s,height:s,stroke:n,strokeWidth:l?Number(o)*24/Number(s):o,className:f0("lucide",d),...!h&&!iO(p)&&{"aria-hidden":"true"},...p},[...m.map(([g,b])=>j.createElement(g,b)),...Array.isArray(h)?h:[h]]));const ko=(n,s)=>{const o=j.forwardRef(({className:l,...d},h)=>j.createElement(rO,{ref:h,iconNode:s,className:f0(`lucide-${aO(Nx(n))}`,`lucide-${n}`,l),...d}));return o.displayName=Nx(n),o};const lO=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],cO=ko("arrow-right",lO);const dO=[["path",{d:"M19 17h2c.6 0 1-.4 1-1v-3c0-.9-.7-1.7-1.5-1.9C18.7 10.6 16 10 16 10s-1.3-1.4-2.2-2.3c-.5-.4-1.1-.7-1.8-.7H5c-.6 0-1.1.4-1.4.9l-1.4 2.9A3.7 3.7 0 0 0 2 12v4c0 .6.4 1 1 1h2",key:"5owen"}],["circle",{cx:"7",cy:"17",r:"2",key:"u2ysq9"}],["path",{d:"M9 17h6",key:"r8uit2"}],["circle",{cx:"17",cy:"17",r:"2",key:"axvx0g"}]],uO=ko("car",dO);const hO=[["path",{d:"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8",key:"5wwlr5"}],["path",{d:"M3 10a2 2 0 0 1 .709-1.528l7-6a2 2 0 0 1 2.582 0l7 6A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z",key:"r6nss1"}]],mO=ko("house",hO);const pO=[["path",{d:"M11 20A7 7 0 0 1 9.8 6.1C15.5 5 17 4.48 19 2c1 2 2 4.18 2 8 0 5.5-4.78 10-10 10Z",key:"nnexq3"}],["path",{d:"M2 21c0-3 1.85-5.36 5.08-6C9.5 14.52 12 13 13 12",key:"mt58a7"}]],fO=ko("leaf",pO);const gO=[["path",{d:"m17 14 3 3.3a1 1 0 0 1-.7 1.7H4.7a1 1 0 0 1-.7-1.7L7 14h-.3a1 1 0 0 1-.7-1.7L9 9h-.2A1 1 0 0 1 8 7.3L12 3l4 4.3a1 1 0 0 1-.8 1.7H15l3 3.3a1 1 0 0 1-.7 1.7H17Z",key:"cpyugq"}],["path",{d:"M12 22v-3",key:"kmzjlo"}]],yO=ko("tree-pine",gO),Tx=.65,bO=.55,xO=.05,Sx=8760,vO=.008,Ax=.5,g0=.08,wO=21,jO=4.6,kO=10500,qs={AWS:{pue:1.135,gridKgPerKwh:.35,dollarPerVcpuMonth:35},Azure:{pue:1.18,gridKgPerKwh:.3,dollarPerVcpuMonth:32},GCP:{pue:1.1,gridKgPerKwh:.12,dollarPerVcpuMonth:30},Other:{pue:1.4,gridKgPerKwh:.45,dollarPerVcpuMonth:38}},po=new Intl.NumberFormat("en-US",{maximumFractionDigits:0}),NO=new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:1}),$i=n=>`$${po.format(Math.round(n))}`,ba=n=>po.format(Math.round(n)),Cx=n=>NO.format(Math.round(n)),Sl=(n,s,o)=>Math.min(o,Math.max(s,n)),TO=()=>{const[n,s]=j.useState(5e4),[o,l]=j.useState(8),[d,h]=j.useState(35),[m,p]=j.useState("AWS"),[f,g]=j.useState(!1),b=j.useMemo(()=>{const w=d/100,{pue:S,gridKgPerKwh:T,dollarPerVcpuMonth:O}=qs[m],D=o*O,E=Math.max(1,n/D),P=1-w/Tx,I=Sl(P,xO,bO),F=n*I,W=F*12,Z=n-F,X=E*I,J=Ax+(1-Ax)*w,Q=o*Sx*vO*J*S,ue=X*Q,fe=ue*T,je=fe/1e3,Re=fe/wO,Ie=je/jO,Xe=ue/kO,B=X*o*Sx,V=W*g0,$=Math.max(1,W-V),oe=Sl(Math.round(V/$*365),7,365),L=W/Math.max(1,V);return{impliedNodes:E,costPerNodeMonth:D,savingsRate:I,monthlySavings:F,annualSavings:W,optimisedMonthly:Z,nodesReleased:X,kwhPerNodeYear:Q,annualKwh:ue,annualCo2Kg:fe,annualCo2T:je,trees:Re,cars:Ie,homes:Xe,v
4704cpuHours:B,paybackDays:oe,roi:L}},[n,o,d,m]),x=Math.round(b.savingsRate*100);return a.jsxs(ht,{children:[a.jsxs("section",{className:"w-full max-w-5xl mx-auto px-6 pt-20 pb-6",children:[a.jsxs("div",{className:"flex items-center gap-2 mb-3",children:[a.jsx("span",{className:"inline-block w-1.5 h-1.5 rounded-full bg-primary animate-pulse"}),a.jsx("span",{className:"text-[11px] font-mono text-slate-500 uppercase tracking-[0.2em]",children:"Live estimator"})]}),a.jsx("h1",{className:"text-3xl md:text-4xl font-bold tracking-tight text-white",children:"Cost & carbon calculator"}),a.jsx("p",{className:"text-slate-400 text-sm mt-3 max-w-2xl",children:"Move the sliders. Savings come from the utilisation gap (current vs. 65% target). Cluster size, energy, and carbon are derived from the same numbers, so the figures stay internally consistent."})]}),a.jsxs("section",{className:"w-full max-w-5xl mx-auto px-6 pb-20",children:[a.jsxs("div",{className:"grid lg:grid-cols-5 gap-px bg-white/10 rounded-2xl overflow-hidden border border-white/10",children:[a.jsxs("div",{className:"lg:col-span-2 bg-background-dark p-6 md:p-8",children:[a.jsx(Lu,{label:"Monthly Kubernetes spend",value:$i(n),children:a.jsx("input",{type:"range",min:5e3,max:1e6,step:1e3,value:n,onChange:w=>s(Number(w.target.value)),className:"w-full accent-fuchsia-500"})}),a.jsx(Lu,{label:"vCPU per node",value:`${o}`,children:a.jsx("div",{className:"grid grid-cols-4 gap-1.5 mt-1",children:[4,8,16,32].map(w=>a.jsx("button",{type:"button",onClick:()=>l(w),className:`px-2 py-1.5 rounded text-xs font-semibold transition-colors ${o===w?"bg-white/15 text-white":"bg-white/5 text-slate-400 hover:bg-white/10 hover:text-white"}`,children:w},w))})}),a.jsxs(Lu,{label:"Current CPU utilisation",value:`${d}%`,children:[a.jsx("input",{type:"range",min:5,max:75,step:1,value:d,onChange:w=>h(Number(w.target.value)),className:"w-full accent-fuchsia-500"}),a.jsx(SO,{current:d,target:Tx*100})]}),a.jsxs("div",{className:"mt-2",children:[a.jsx("div",{className:"text-[11px] font-mono text-slate-500 uppercase tracking-wider mb-2",children:"Provider"}),a.jsx("div",{className:"grid grid-cols-4 gap-1.5",children:Object.keys(qs).map(w=>a.jsx("button",{type:"button",onClick:()=>p(w),className:`px-2 py-2 rounded text-xs font-semibold transition-colors ${m===w?"bg-primary text-white":"bg-white/5 text-slate-400 hover:bg-white/10 hover:text-white"}`,children:w},w))}),a.jsxs("p",{className:"text-[10px] font-mono text-slate-600 mt-2 tabular-nums",children:["PUE ",qs[m].pue.toFixed(2)," · grid ",qs[m].gridKgPerKwh.toFixed(2)," kgCO₂e/kWh · $",qs[m].dollarPerVcpuMonth,"/vCPU·mo"]})]}),a.jsxs("div",{className:"mt-6 pt-4 border-t border-white/5",children:[a.jsx("div",{className:"text-[10px] font-mono text-slate-500 uppercase tracking-wider mb-2",children:"Implied cluster"}),a.jsxs("div",{className:"grid grid-cols-2 gap-3 text-sm",children:[a.jsxs("div",{children:[a.jsxs("div",{className:"text-white font-semibold tabular-nums",children:["~",po.format(Math.round(b.impliedNodes))]}),a.jsx("div",{className:"text-[11px] text-slate-500",children:"nodes"})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-white font-semibold tabular-nums",children:$i(b.costPerNodeMonth)}),a.jsx("div",{className:"text-[11px] text-slate-500",children:"/ node / month"})]})]})]})]}),a.jsxs("div",{className:"lg:col-span-3 bg-background-dark p-6 md:p-8",children:[a.jsxs("div",{className:"flex items-center gap-4 mb-6",children:[a.jsxs("div",{className:"flex-1",children:[a.jsx("div",{className:"text-[11px] font-mono text-slate-500 uppercase tracking-wider mb-1",children:"Today"}),a.jsx("div",{className:"text-2xl md:text-3xl font-bold text-slate-400 line-through tabular-nums",children:a.jsx(Ce,{value:n,format:$i,duration:.5,startOnView:!1})}),a.jsx("div",{className:"text-[11px] text-slate-600 mt-1",children:"/ month"})]}),a.jsx(cO,{className:"w-5 h-5 text-primary shrink-0"}),a.jsxs("div",{className:"flex-1",children:[a.jsx("div",{className:"text-[11px] font-mono text-primary uppercase tracking-wider mb-1",children:"With OptOps"}),a.jsx("div",{className:"text-2xl md:text-3xl font-bold text-white tabular-nums",children:a.jsx(Ce,{value:b.optimisedMonthly,format:$i,duration:.5,startOnView:!1})}),a.jsx("div",{className:"text-[11px] text-slate-500 mt-1",children:"/ month"})]})]}),a.jsxs("div",{className:"border-t border-white/10 pt-5 mb-5",children:[a.jsxs("div",{className:"flex items-baseline gap-3 flex-wrap",children:[a.jsx("div",{className:"text-4xl md:text-5xl font-bold text-white tabular-nums tracking-tight",children:a.jsx(Ce,{value:b.annualSavings,format:$i,duration:.5,startOnView:!1})}),a.jsx("div",{className:"text-sm text-slate-500",children:"/ year recovered"})]}),a.jsxs("div",{className:"mt-2 inline-flex items-center gap-2 px-2.5 py-1 rounded-full bg-primary/10 border border-primary/20",children:[a.jsx("span",{className:"block w-1.5 h-1.5 rounded-full bg-primary"}),a.jsxs("span",{className:"text-xs font-semibold text-primary tabular-nums",children:[a.jsx(Ce,{value:x,format:ba,duration:.5,startOnView:!1}),"% off your bill · ~",a.jsx(Ce,{value:b.nodesReleased,format:ba,duration:.5,startOnView:!1})," of ",a.jsx(Ce,{value:b.impliedNodes,format:ba,duration:.5,startOnView:!1})," nodes released"]})]})]}),a.jsxs("dl",{className:"grid grid-cols-2 gap-y-3 gap-x-6 text-sm",children:[a.jsx(tl,{label:"Payback",value:a.jsxs(a.Fragment,{children:[a.jsx(Ce,{value:b.paybackDays,format:ba,duration:.5,startOnView:!1})," days"]})}),a.jsx(tl,{label:"ROI",value:a.jsxs(a.Fragment,{children:[a.jsx(Ce,{value:b.roi,format:w=>w.toFixed(1),duration:.5,startOnView:!1}),"×"]})}),a.jsx(tl,{label:"vCPU-hours avoided",value:a.jsxs(a.Fragment,{children:[a.jsx(Ce,{value:b.vcpuHours,format:Cx,duration:.5,startOnView:!1}),"/yr"]})}),a.jsx(tl,{label:"Energy avoided",value:a.jsxs(a.Fragment,{children:[a.jsx(Ce,{value:b.annualKwh,format:Cx,duration:.5,startOnView:!1})," kWh/yr"]})})]})]})]}),a.jsxs("div",{className:"mt-6 rounded-2xl overflow-hidden border border-emerald-500/20 bg-gradient-to-br from-emerald-500/[0.06] via-emerald-500/[0.02] to-transparent",children:[a.jsxs("div",{className:"p-6 md:p-7 border-b border-emerald-500/10 flex items-center justify-between gap-4 flex-wrap",children:[a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("span",{className:"flex items-center justify-center w-9 h-9 rounded-lg bg-emerald-500/10 border border-emerald-500/30",children:a.jsx(fO,{className:"w-4 h-4 text-emerald-400"})}),a.jsxs("div",{children:[a.jsx("div",{className:"text-[11px] font-mono text-emerald-400 uppercase tracking-[0.2em]",children:"Carbon impact"}),a.jsx("div",{className:"text-white font-semibold text-sm mt-0.5",children:"CO₂e avoided per year on a leaner cluster"})]})]}),a.jsxs("div",{className:"text-right",children:[a.jsxs("div",{className:"text-3xl md:text-4xl font-bold text-emerald-400 tabular-nums tracking-tight leading-none",children:[a.jsx(Ce,{value:b.annualCo2T<1?b.annualCo2Kg:b.annualCo2T,format:ba,duration:.5,startOnView:!1},b.annualCo2T<1?"kg":"t"),a.jsx("span",{className:"text-lg md:text-xl text-emerald-500/70 ml-1.5 font-semibold",children:b.annualCo2T<1?"kg":"t"})]}),a.jsx("div",{className:"text-[11px] text-emerald-500/80 mt-1 font-mono uppercase tracking-wider",children:"CO₂e / year"})]})]}),a.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-3 gap-px bg-emerald-500/10",children:[a.jsx(Gu,{icon:a.jsx(yO,{className:"w-4 h-4"}),value:a.jsx(Ce,{value:b.trees,format:ba,duration:.5,startOnView:!1}),label:"tree-years of CO₂ absorption"}),a.jsx(Gu,{icon:a.jsx(uO,{className:"w-4 h-4"}),value:a.jsx(Ce,{value:b.cars,format:ba,duration:.5,startOnView:!1}),label:"cars off the road for a year"}),a.jsx(Gu,{icon:a.jsx(mO,{className:"w-4 h-4"}),value:a.jsx(Ce,{value:b.homes,format:ba,duration:.5,startOnView:!1}),label:"homes powered for a year"})]})]}),a.jsxs("div",{className:"mt-8 flex flex-col md:flex-row md:items-center md:justify-between gap-4 pt-6 border-t border-white/5",children:[a.jsxs("button",{type:"button",onClick:()=>g(w=>!w),className:"text-xs font-mono text-slate-500 hover:text-slate-300 transition-colors text-left",children:[f?"▾":"▸"," how the math works"]}),a.jsxs("div",{className:"flex items-center gap-3",children:[a.jsx("a",{href:ut,className:"text-sm font-semibold text-white bg-primary px-4 py-2 rounded-lg neon-glow hover:brightness-110 transition-all",children:"Book a walkthrough"}),a.jsx("a",{href:"https://console.optops.ai/login",className:"text-sm font-semibold text-slate-300 hover:text-white transition-colors",children:"Free cluster assessment →"})]})]}),f&&a.jsx(AO,{calc:b,provider:m})]})]})},Lu=({label:n,value:s,children:o})=>a.jsxs("div",{className:"mb-6",children:[a.jsxs("div",{className:"flex items-baseline justify-between mb-2",children:[a.jsx("span",{className:"text-[11px] font-mono text-slate-500 uppercase tracking-wider",children:n}),a.jsx("span",{className:"text-white font-mono text-sm tabular-nums",children:s})]}),o]}),tl=({label:n,value:s})=>a.jsxs("div",{className:"flex items-baseline justify-between border-b border-white/5 pb-2",children:[a.jsx("dt",{className:"text-slate-500",children:n}),a.jsx("dd",{className:"text-white font-semibold tabular-nums",children:s})]}),SO=({current:n,target:s})=>{const o=Sl(s,0,100),l=Sl(n,0,100);return a.jsxs("div",{className:"mt-5 relative h-1.5 bg-white/5 rounded-full overflow-visible",children:[a.jsx("div",{className:"absolute top-0 left-0 h-full bg-gradient-to-r from-amber-500/40 to-fuchsia-500/60 rounded-full transition-all",style:{width:`${l}%`}}),a.jsx("div",{className:"absolute top-1/2 -translate-y-1/2 w-0.5 h-3 bg-emerald-400 rounded-full",style:{left:`${o}%`}}),a.jsx("div",{className:"absolute -top-5 text-[9px] font-mono text-emerald-400 tracking-wider whitespace-nowrap",style:{left:`${o}%`,transform:"translateX(-50%)"},children:"65% target"})]})},Gu=({icon:n,value:s,label:o})=>a.jsxs("div",{className:"bg-background-dark p-5 md:p-6",children:[a.jsx("div",{className:"flex items-center gap-2 mb-3 text-emerald-400/80",children:n}),a.jsx("div",{className:"text-2xl md:text-3xl font-bold text-emerald-300 tabular-nums tracking-tight",children:s}),a.jsx("div",{className:"text-xs text-slate-500 mt-1 leading-tight",children:o})]}),AO=({calc:n,provider:s})=>{const o=qs[s];return a.jsxs("div",{className:"mt-6 grid md:grid-cols-2 gap-6 text-xs text-slate-400 leading-relaxed",children:[a.jsxs("div",{children:[a.jsx("div",{className:"text-[11px] font-mono text-slate-500 uppercase tracking-wider mb-3",children:"Cluster & savings model"}),a.jsx(nl,{children:"nodes = monthly_spend / (vCPU × $/vCPU·mo)"}),a.jsxs("p",{className:"mt-2 tabular-nums",children:["For ",a.jsx("strong",{className:"text-white",children:s}),", $",o.dollarPerVcpuMonth,"/vCPU·month is the average on-demand rate across general-purpose families. Everything downstream uses this implied cluster, so a $50K bill with 8-vCPU nodes is ~",po.format(Math.round(n.impl
4704iedNodes))," nodes."]}),a.jsx(nl,{className:"mt-3",children:"savings_rate = clamp(0.05, 0.55, 1 − u / 0.65)"}),a.jsx("p",{className:"mt-2",children:"Industry surveys (Sysdig, CNCF) put typical cluster utilisation at 13–25%. Rightsizing toward a 65% target releases the gap; capped at 55% so the model doesn't promise more than is realistic in practice."}),a.jsxs("p",{className:"mt-3",children:["Payback assumes platform pricing at ",Math.round(g0*100),"% of recovered savings."]})]}),a.jsxs("div",{children:[a.jsx("div",{className:"text-[11px] font-mono text-slate-500 uppercase tracking-wider mb-3",children:"Carbon model"}),a.jsx(nl,{children:"kWh/node·yr = vCPU × 8760 × 0.008 × (0.5 + 0.5·u) × PUE"}),a.jsxs("p",{className:"mt-2",children:["Server power: ~8 Wh per vCPU-hour under load (SPECpower-derived). Idle draw is ~50% of peak, so a node at utilisation ",a.jsx("code",{className:"text-white",children:"u"})," draws ",a.jsx("code",{className:"text-white",children:"0.5 + 0.5·u"})," of peak power. PUE accounts for cooling and datacenter overhead."]}),a.jsx(nl,{className:"mt-3",children:"CO₂e = nodes_released × kWh/node·yr × grid_intensity"}),a.jsxs("p",{className:"mt-2 tabular-nums",children:["For ",a.jsx("strong",{className:"text-white",children:s}),": PUE ",o.pue.toFixed(3),", grid ",o.gridKgPerKwh.toFixed(2)," kgCO₂e/kWh (provider sustainability disclosures, 2024). One released node ≈ ",po.format(Math.round(n.kwhPerNodeYear))," kWh/yr at current settings."]}),a.jsx("p",{className:"mt-3 text-slate-500",children:"Tree, car, home equivalents use US EPA Greenhouse Gas Equivalencies: 21 kg CO₂/tree-year, 4.6 t CO₂e/car-year, 10,500 kWh/home-year."})]})]})},nl=({children:n,className:s=""})=>a.jsx("pre",{className:`bg-white/5 border border-white/10 rounded px-3 py-2 text-[11px] text-slate-200 font-mono leading-relaxed whitespace-pre-wrap ${s}`,children:n}),CO=()=>{const{pathname:n}=gn();return n==="/resources/roi-calculator"||n==="/bookdemo"?null:a.jsx(ie,{to:"/resources/roi-calculator","aria-label":"Calculate ROI",className:"fixed top-20 right-3.5 md:right-4 z-40 inline-flex items-center gap-1.5 px-3 py-1.5 rounded-md bg-primary text-white text-[11px] md:text-xs font-bold tracking-wide border border-white/10 hover:brightness-110 active:scale-95 transition-all duration-150",style:{boxShadow:"0 0 12px rgba(175, 37, 244, 0.35)"},children:"Calculate ROI"})},al=({to:n})=>(ge.useEffect(()=>{window.location.replace(n)},[n]),a.jsxs("div",{className:"min-h-screen flex flex-col items-center justify-center gap-4 bg-background-dark text-white",children:[a.jsx("span",{className:"w-8 h-8 border-2 border-white/20 border-t-primary rounded-full animate-spin"}),a.jsxs("p",{className:"text-slate-400",children:["Redirecting to booking… If nothing happens,"," ",a.jsx("a",{href:n,className:"text-primary underline",children:"click here"}),"."]})]})),OO=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Legal",title:"Privacy Policy",subtitle:"Last updated: January 05, 2026"}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 space-y-6 text-slate-400 leading-relaxed",children:[a.jsx("p",{children:"This Privacy Policy explains how OptOps.AI Group (“OptOps AI”, “Company”, “we”, “our”, or “us”) collects, uses, discloses, and protects personal information when you access or use our websites, platforms, and services (collectively, the “Services”). OptOps AI is committed to protecting your privacy and handling your personal data in a transparent and secure manner, in accordance with applicable data protection laws."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"1. Scope of This Privacy Policy"}),a.jsx("p",{children:"This Privacy Policy applies to the processing of Personal Data that we collect when you:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"Visit our website (“Website”);"}),a.jsx("li",{children:"Use the OptOps AI Referral Platform;"}),a.jsx("li",{children:"Use the OptOps AI Cloud Services as a customer or authorized user;"}),a.jsx("li",{children:"Communicate with us regarding our products or services by email, phone, in person, or otherwise."})]}),a.jsx("p",{children:"This Privacy Policy does not apply to data that our customers upload or provide to the OptOps AI Cloud Services for processing (“Customer Data”). We process such data solely as a processor on behalf of our customers, and such processing is governed by the applicable Terms of Service and customer agreements. If you have questions about how a customer uses your data, please contact that customer directly."}),a.jsx("p",{children:"By using the Services, you acknowledge that you have read and understood this Privacy Policy."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"2. Controller Information"}),a.jsx("p",{children:"OptOps AI is the controller of your Personal Data under this Privacy Policy. Where applicable, for customers or users located in India or procuring OptOps AI Cloud Services from India, the controller is OptOps AI, an entity incorporated in India."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"3. Interpretation and Definitions"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"Interpretation"}),a.jsx("p",{children:"Words with capitalized initials have meanings defined below, regardless of whether they appear in singular or plural form."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"Definitions"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsxs("li",{children:[a.jsx("strong",{children:"You:"})," the individual accessing or using the Services, or the legal entity on whose behalf such individual is acting."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Affiliate:"})," an entity that controls, is controlled by, or is under common control with a party."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Account:"})," a unique account created for access to the Services."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Website:"})," the OptOps AI website identified at the relevant domain."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Services:"})," the Website, dashboards, and OptOps AI Cloud Services."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Service Provider:"})," any third party that processes data on behalf of the Company."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Personal Data:"})," any information relating to an identified or identifiable individual."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Cookies:"})," small files placed on your device to enhance website functionality and analytics."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Device:"})," any device capable of accessing the Services."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Usage Data:"})," data collected automatically through the use of the Services."]})]}),a.jsx("p",{children:"Other terms not defined herein shall have the meaning assigned under applicable data protection laws."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"4. Personal Data We Collect"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"4.1 Personal Data You Provide Directly"}),a.jsx("p",{children:"We may collect the following categories of Personal Data when you use the Services:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"Name and contact details (email address, phone number, mailing address);"}),a.jsx("li",{children:"Account credentials (username and password);"}),a.jsx("li",{children:"Professional information (employer, designation);"}),a.jsx("li",{children:"Payment and billing information;"}),a.jsx("li",{children:"Communications and content you submit through forms, messages, or uploads;"}),a.jsx("li",{children:"Any other information you voluntarily provide."})]}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"4.2 Usage Data"}),a.jsx("p",{children:"Usage Data is collected automatically and may include:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"IP address, browser type and version;"}),a.jsx("li",{children:"Pages visited, time and date of visits, time spent on pages;"}),a.jsx("li",{children:"Device identifiers, operating system, and diagnostic data."})]}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"4.3 Personal Data from Third Parties"}),a.jsx("p",{children:"We may receive Personal Data from third-party sources such as referral partners, event organizers, social media platforms, data providers, and publicly available sources, and combine it with information you provide to us."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"5. Cookies and Tracking Technologies"}),a.jsx("p",{children:"We use cookies and similar technologies (such as pixels, tags, and scripts) to:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"Operate and improve the Services;"}),a.jsx("li",{children:"Analyze usage and performance;"}),a.jsx("li",{children:"Provide relevant content and marketing communications."})]}),a.jsx("p",{children:"We may use third-party analytics tools such as Google Analytics. You can manage cookie preferences through your browser settings or our cookie preference tools, where available."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"6. How We Use Personal Data"}),a.jsx("p",{children:"We use Personal Data for the following purposes:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"To provide, operate, and maintain the Services;"}),a.jsx("li",{children:"To manage user accounts and registrations;"}),a.jsx("li",{children:"To perform contractual obligations;"}),a.jsx("li",{children:"To communicate with you regarding updates, security notices, and service-related information;"}),a.jsx("li",{children:"To send marketing and promotional communications, where permitted;"}),a.jsx("li",{children:"To respond to inquiries and manage requests;"}),a.jsx("li",{children:"To comply with legal and regulatory obligations;"}),a.jsx("li",{children:"To protect the rights, property, and safety of the Company and others;"}),a.jsx("li",{children:"To support corporate transactions such as mergers or acquisitions;"}),a.jsx("li",{children:"For any other purpose with your consent or as permitted by law."})]}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"7. Sharing and Disclosure of Personal Data"}),a.jsx("p",{children:"We may share your Personal Data in the following circumstances:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"With Service Providers performing services on our behalf;"}),a.jsx("li",{children:"With Affiliates for internal business purposes;"}),a.jsx("li",{children:"With Business Partners for joint offerings or promotions;"}),a.jsx("li",{children:"With Authorities when required by law or legal process;"}),a.jsx("li",{children:"For Business Transfers such as mergers, acquisitions, or asset sales;"}),a.jsx("li",{children:"To Protect Legal Rights or prevent fraud or security issues."})]}),a.jsx("p",{children:"All third parties are required to protect Personal Data and use it only for authorized purposes."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"8. Data Retention"}),a.jsx("p",{children:"We retain Personal Data only for as long as necessary to fulfill the purposes described 
4704in this Privacy Policy, unless a longer retention period is required or permitted by law. Retention periods are determined based on the nature, sensitivity, and legal requirements applicable to the data."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"9. International Data Transfers"}),a.jsx("p",{children:"Your Personal Data may be transferred to and processed in countries outside your jurisdiction. We implement appropriate safeguards to ensure your data remains protected in accordance with this Privacy Policy and applicable laws."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"10. Your Choices and Rights"}),a.jsx("p",{children:"You may:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"Opt out of marketing communications at any time;"}),a.jsx("li",{children:"Manage cookie preferences through browser or website settings;"}),a.jsx("li",{children:"Request access, correction, or deletion of your Personal Data;"}),a.jsx("li",{children:"Withdraw consent where processing is based on consent."})]}),a.jsx("p",{children:"Some features of the Services may be unavailable if you choose not to provide certain information."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"11. Legal Bases for Processing"}),a.jsx("p",{children:"We process Personal Data based on one or more of the following legal bases:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"Performance of a contract;"}),a.jsx("li",{children:"Compliance with legal obligations;"}),a.jsx("li",{children:"Legitimate business interests;"}),a.jsx("li",{children:"Your consent, where required by law."})]}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"12. GDPR Rights (Where Applicable)"}),a.jsx("p",{children:"If you are subject to the GDPR, you have the right to:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsx("li",{children:"Access your Personal Data;"}),a.jsx("li",{children:"Request rectification or erasure;"}),a.jsx("li",{children:"Restrict or object to processing;"}),a.jsx("li",{children:"Request data portability;"}),a.jsx("li",{children:"Lodge a complaint with a supervisory authority."})]}),a.jsx("p",{children:"We will respond to verified requests within 30 days."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"13. Automated Decision-Making"}),a.jsx("p",{children:"We do not engage in automated decision-making or profiling that produces legal or similarly significant effects on individuals."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"14. Third-Party Links"}),a.jsx("p",{children:"Our Services may contain links to third-party websites. We are not responsible for the privacy practices or content of those websites and encourage you to review their privacy policies."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"15. Changes to This Privacy Policy"}),a.jsx("p",{children:"We may update this Privacy Policy periodically. Changes become effective when posted on the Website. We encourage you to review this Privacy Policy regularly."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"16. Contact Us"}),a.jsx("p",{children:"If you have any questions about this Privacy Policy or wish to exercise your rights, please contact us at:"}),a.jsxs("p",{children:["Email: ",a.jsx("a",{href:"mailto:[email protected]",className:"text-primary hover:underline",children:"[email protected]"})]})]})})]}),EO=()=>a.jsxs(ht,{children:[a.jsx(Kt,{eyebrow:"Legal",title:"Terms of Service",subtitle:"Effective Date: January 6, 2026"}),a.jsx("section",{className:"w-full max-w-4xl mx-auto px-6 py-12",children:a.jsxs("div",{className:"glass-card rounded-2xl p-8 space-y-6 text-slate-400 leading-relaxed",children:[a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"1. Introduction; Acceptance; Binding Effect"}),a.jsx("p",{children:"OptOps AI and its affiliates (collectively or individually, as applicable, “OptOps AI,” “we,” “our,” or “us”) provide products and services through one or more websites, applications, dashboards, mobile versions thereof, and any successor platforms (collectively, the “Services”). These Terms of Service (“Terms of Service” or “Terms”) govern Customer’s access to and use of the Services."}),a.jsx("p",{children:"By accessing or using the Services, or by clicking “I Agree” or similar assent during onboarding, registration, or ordering, you acknowledge that you have read, understood, and agree to be legally bound by these Terms of Service and the applicable Order Form. These Terms of Service, together with each Order Form, constitute a legally binding agreement (“Agreement”) between the applicable OptOps AI contracting entity and the customer identified in the Order Form (“Customer”)."}),a.jsx("p",{children:"If you are accessing or using the Services on behalf of a company or other legal entity, you represent and warrant that you have full legal authority to bind such entity to this Agreement, and you guarantee compliance by such entity with these Terms. The Services may be used solely for Customer’s internal business purposes and not for the benefit of any third party except as expressly permitted herein."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"2. Modifications to the Terms"}),a.jsx("p",{children:"OptOps AI reserves the right, at any time, to change, update, add to, or remove portions of these Terms of Service. Any such changes will be effective upon posting updated Terms within the Services with a revised effective date. Customer is responsible for reviewing the Terms periodically. Continued use of the Services following presentation of updated Terms for acceptance constitutes acceptance. Failure to accept updated Terms may result in suspension or termination of this Agreement and the Services without liability to OptOps AI."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"3. Definitions"}),a.jsx("p",{children:"As used in this Agreement:"}),a.jsxs("ul",{className:"list-disc pl-6 space-y-2",children:[a.jsxs("li",{children:[a.jsx("strong",{children:"Access Credentials"})," means usernames, passwords, authentication keys, tokens, and security procedures through which Users access the Services."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Admin User"})," means Customer employees or contractors authorized to manage accounts and issue Access Credentials."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"OptOps AI Contracting Party"})," means (a) the OptOps AI legal entity identified in the applicable Order Form, or (b) if no entity is identified, the OptOps AI entity designated by OptOps AI."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"OptOps AI Technology"}
4704)," means all software, source and object code, scripts, artificial intelligence systems, neural networks, APIs, workflows, methodologies, processes, templates, tools, algorithms, formulas, diagrams, interfaces, know-how, trade secrets, designs, inventions, Documentation, and all enhancements, updates, derivative works, and Intellectual Property Rights therein."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Customer Inputs"})," means all data, content, information, text, images, videos, audio, or other materials uploaded, submitted, or provided by Customer or its Users through the Services."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Documentation"})," means written or electronic materials describing the features, functionality, and use of the Services."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Intellectual Property Rights"})," means all worldwide rights in copyrights, trademarks, service marks, trade dress, trade secrets, patents, designs, moral rights, and other proprietary rights, whether registered or unregistered."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Order Form"})," means any written or electronic ordering document, subscription selection, or purchase confirmation accepted by Customer and OptOps AI, including upgrades and renewals."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"Updates"})," means upgrades, enhancements, bug fixes, maintenance releases, additions, and modifications made generally available during the Term."]}),a.jsxs("li",{children:[a.jsx("strong",{children:"User"})," means any individual authorized by Customer to access the Services using Access Credentials."]})]}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"4. Services"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"4.1 Provision of Services"}),a.jsx("p",{children:"Subject to Customer’s compliance with this Agreement and payment of all applicable fees, OptOps AI shall make the Services available to Customer during the applicable Term."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"4.2 Customer Systems and Connectivity"}),a.jsx("p",{children:"Customer acknowledges that access to the Services depends on telecommunications, internet connectivity, hardware, and software not provided by OptOps AI. Customer is solely responsible for procuring, maintaining, and securing such systems and for all c
4704osts and risks associated therewith. OptOps AI shall not be responsible for any loss, corruption, or interruption of data or communications arising from Customer systems or connectivity."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"4.3 Modifications and Updates"}),a.jsx("p",{children:"OptOps AI may enhance, improve, modify, or discontinue portions of the Services from time to time. Updates are provided as part of the Services unless otherwise stated, and certain new features or functionality may be subject to additional fees."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"5. Access Grant; Licenses; Ownership"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"5.1 Access Grant"}),a.jsx("p",{children:"Subject to this Agreement, OptOps AI grants Customer a limited, non-exclusive, non- transferable, non-sublicensable, revocable, worldwide right to permit its Users to access and use the Services solely for Customer’s internal business purposes during the Term. Customer is responsible for all acts and omissions of its Users."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"5.2 Customer Inputs"}),a.jsx("p",{children:"Customer retains all right, title, and interest in and to Customer Inputs. Customer grants OptOps AI a non-exclusive, royalty-free license to access, use, process, and copy Customer Inputs solely as necessary to provide the Services. Customer is solely responsible for maintaining backups of Customer Inputs. OptOps AI shall not be liable for loss, corruption, or unauthorized disclosure of Customer Inputs except as expressly required by applicable Indian law."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"5.3 Users and Accounts"}),a.jsx("p",{children:"Customer, through its Admin Users, may authorize Users to access the Services. Customer is responsible for safeguarding Access Credentials and for all activity occurring under Customer accounts. Customer shall promptly notify OptOps AI of any unauthorized access or security breach."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"5.4 Service Level Agreement"}),a.jsx("p",{children:"If applicable, service levels are set forth in the Service Level Agreement and are incorporated herein by reference. Customer’s sole and exclusive remedies for any failure to meet service levels are those expressly stated in the Service Level Agreement."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"5.5 Ownership"}),a.jsx("p",{children:"The Services, OptOps AI Technology, analytics, Documentation, and all related Intellectual Property Rights are and shall remain the exclusive property of OptOps AI and its licensors. The Services are licensed, not sold. All rights not expressly granted are reserved by OptOps AI."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"5.6 Marketing"}),a.jsx("p",{children:"OptOps AI may identify Customer as a customer and may use Customer’s name and logo in marketing materials. Customer may publicly reference its use of the Services."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"6. Data Collection; Analytics; Feedback"}),a.jsx("p",{children:"OptOps AI may collect anonymized and aggregated usage data and analytics relating to the operation and use of the Services (“OptOps AI Analytics”). Such analytics do not include Customer Inputs or personally identifiable information. OptOps AI may use such analytics for business purposes, including improving the Services and enforcing rights."}),a.jsx("p",{children:"Customer hereby assigns to OptOps AI all rights in any feedback, suggestions, or recommendations provided regarding the Services."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"7. Customer Responsibilities"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"a. Access Credentials."}),a.jsx("p",{children:"Customer shall be responsible for all acts and omissions of its Users and for all activities carried out through Customer’s accounts. Customer agrees to: (i) maintain the confidentiality and security of all access credentials (“Access Credentials”) and ensure that no User disclose
4704s or shares such Access Credentials with any third party; and (ii) ensure that Access Credentials are used only by authorized Users."}),a.jsx("p",{children:"Customer shall promptly notify OptOps AI of any unauthorized use of Access Credentials or any known or suspected breach of security, including as may be required under applicable data protection laws. OptOps AI reserves the right to take such actions as it reasonably deems necessary to protect the security and integrity of the Services and Customer’s accounts, including suspending or terminating access for Customer or any User, resetting passwords, or requesting additional information to verify account activity."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"b. Use Guidelines."}),a.jsx("p",{children:"Customer shall use the Services in compliance with all applicable laws of India, including without limitation the Information Technology Act, 2000, and the rules, regulations, guidelines, and notifications issued thereunder, as amended from time to time, and solely for Customer’s internal business purposes as contemplated under this Agreement. Customer shall not, directly or indirectly:"}),a.jsxs("ol",{className:"list-decimal pl-6 space-y-2",children:[a.jsx("li",{children:"license, sublicense, sell, resell, rent, lease, assign, transfer, distribute, time-share, or otherwise commercially exploit the Services or make them available to any third party, except as expressly permitted under this Agreement;"}),a.jsx("li",{children:"interfere with, disrupt, or compromise the integrity, security, or performance of the Services or any servers or networks connected thereto, or violate any applicable network policies or regulations;"}),a.jsx("li",{children:"attempt to gain unauthorized access to the Services, the OptOps AI technology (“OptOps AI Technology”), or any related systems or networks;"}),a.jsx("li",{children:"remove, alter, or obscure any proprietary notices, trademarks, or intellectual property notices associated with the Services;"}),a.jsx("li",{children:"use the Services in violation of any applicable law, rule, regulation, or guideline in force in India, or any contractual obligation binding on Customer;"}),a.jsx("li",{children:"probe, scan, test, stress test, or conduct penetration testing of any system or network associated with the Services without OptOps AI’s prior written consent, or otherwise attempt to breach security or authentication measures;"}),a.jsx("li",{children:"copy, modify, adapt, translate, distribute, disassemble, decompile, reverse engineer, decode, or otherwise attempt to derive any source code, object code, or software from the Services or OptOps AI Technology, or take any action inconsistent with Customer’s acknowledgment that all right, title, and interest in the OptOps AI Technology and all related intellectual property rights vest exclusively with OptOps AI;"}),a.jsx("li",{children:"access or use the Services or OptOps AI Technology for competitive analysis, benchmarking, development of a competing product or service, or for any purpose that results in a commercial disadvantage to OptOps AI; or"}),a.jsxs("li",{children:["use the Services to:",a.jsxs("ol",{className:"list-[lower-alpha] pl-6 mt-2 space-y-2",children:[a.jsx("li",{children:"transmit spam or unsolicited commercial communications in violation of applicable law;"}),a.jsx("li",{children:"store, transmit, or process content that is infringing, obscene, defamatory, threatening, unlawful, harmful, abusive, malicious, or otherwise prohibited under applicable law, including content that violates the privacy or intellectual property rights of any third party or is harmful to minors; or"}),a.jsx("li",{children:"upload, transmit, store, or distribute viruses, malware, worms, Trojan horses, or any other malicious code or software that may damage, disrupt, or compromise the Services, OptOps AI systems, or third-party systems."})]})]})]}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"8. Fees; Payment; Taxes"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"a. Fees."}),a.jsx("p",{children:"If Customer elects to use or upgrade to a paid version of the Services, Customer shall pay the applicable fees to the relevant OptOps AI contracting entity as set forth in the applicable Order Form, in accordance with the payment schedule specified therein. Unless otherwise stated in an Order Form, all invoiced amounts are payable within thirty (30) days from the invoice date. Except as expressly provided herein or in an applicable Order Form, all fees are non-refundable, payable in XXXXXX, and exclusive of all applicable sales, use, value-ad
4704ded, withholding, or similar taxes. Any amounts not paid when due shall accrue interest at the rate of eighteen percent (18.0%) per month or the maximum rate permitted by applicable law, whichever is lower, from the due date until paid."}),a.jsx("p",{children:"Customer further acknowledges that the Services include functionality designed to integrate with multiple cloud-computing and cloud-storage providers used by Customer. As a result, OptOps AI may incur third-party charges on Customer’s behalf. Customer agrees that any such third-party fees or charges incurred by OptOps AI on Customer’s behalf shall be the sole responsibility of Customer, and OptOps AI shall have no obligation to pay or assume responsibility for such amounts."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"b. Taxes."}),a.jsx("p",{children:"All payments made by Customer to OptOps AI shall be made free and clear of, and without any deduction or withholding for, any taxes. Any taxes imposed on payments to OptOps AI, other than taxes based on OptOps AI’s net income, shall be Customer’s sole responsibility. Upon reasonable request, Customer shall provide OptOps AI with official receipts or other documentation issued by the applicable taxing authority evidencing payment of such taxes."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"c. Free Services."}),a.jsx("p",{children:"If Customer accesses or uses the Services on a free-of-charge basis, including under a free version, promotional offer, proof-of-concept, trial period, or similar arrangement (“Free Services”), such Free Services are provided “as is” and “as available,” without any representations or warranties of any kind, whether express, implied, statutory, or otherwise. OptOps AI expressly disclaims all warranties, including, without limitation, any implied warranties of merchantability, non-infringement, or fitness for a particular purpose."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"9. Confidentiality and Data Protection"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"a. Confidential Information."}),a.jsx("p",{children:"During the Term, each party (the “Disclosing Party”) may disclose to the other party (the “Receiving Party”) certain non-public, confidential, or proprietary information relating to the Disclosing Party’s business, operations, technology, finances, customers, employees, plans, strategies, or data, whether disclosed orally, visually, electronically, or in writing, that is: (i) marked or designated as confidential; (ii) identified as confidential at the time of disclosure; or (iii) which, by its nature or the circumstances of disclosure, ought reasonably to be understood as confidential (collectively, “Confidential Information”). For the avoidance of doubt, the Services and the OptOps AI technology constitute Confidential Information of OptOps AI, and all data, inputs, and information provided by or on behalf of Customer, including any Personal Data (as defined below), constitute Confidential Information of Customer."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"b. Personal Data and DPDP Act Compliance."}),a.jsx("p",{children:"To the extent Confidential Information includes personal data or digital personal data as defined under the Digital Personal Data Protection Act, 2023 (“DPDP Act”), the parties agree as follows:"}),a.jsxs("ol",{className:"list-[lower-roman] pl-6 space-y-2",children:[a.jsx("li",{children:"Each party shall comply with its respective obligations under the DPDP Act and any rules, notifications, or guidance issued thereunder, as amended from time to time."}),a.jsx("li",{children:"Customer represents that it has obtained all necessary consents, notices, and lawful bases required under the DPDP Act for the collection, processing, and sharing of such personal data with OptOps AI for purposes of this Agreement."}),a.jsx("li",{children:"OptOps AI shall process personal data solely in accordance with Customer’s lawful instructions, this Agreement, and shall implement reasonable technical and organizational measures to protect personal data against unauthorized access, loss, or disclosure."}),a.jsx("li",{children:"Each party shall promptly notify the other upon becoming aware of any personal data breach, as defined under the DPDP Act, affecting Confidential Information, and shall reasonably cooperate to comply with any statutory reporting or remediation obligations."})]}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"c. Protection and Use of Confidential Information."}),a.jsx("p",{children:"The Receiving Party shall:"}),a.jsxs("ol",{className:"list-[lower-roman] pl-6 space-y-2",children:[a.jsx("li",{children:"use the Confidential Information solely for purposes expressly permitted under this Agreement;"}),a.jsx("li",{children:"disclose Confidential Information only to its employees, contractors, or professional advisors who have a legitimate need to know for purposes of this Agreement and who are bound by confidentiality obligations no less protective than those set forth herein; and"}),a.jsx("li",{children:"protect the Confidential Information using the same degree of care it applies to its own confidential information of a similar nature, and in any event, no less than reasonable care."})]}),a.jsx("p",{children:"The Receiving Party shall promptly notify the Disclosing Party of any unauthorized access, use, disclosure, or loss of Confidential Information, including any incident requiring notification under applicable law, including the DPDP Act."}),a.jsx("p",{children:"The parties acknowledge that unauthorized disclosure or misuse of Confidential Information may cause irreparable harm. Accordingly, the Disclosing Party shall be entitled to seek injunctive relief, specific performance, or other equitable remedies available under applicable Indian law, including the Specific Relief Act, 1963, in addition to any other remedies available at law."}),a.jsx("p",{children:"The confidentiality obligations under this Section shall survive termination or expiration of this Agreement:"}),a.jsx("p",{children:"(A) for trade secrets, for so long as such information continues to qualify as a trade secret under applicable law; and"}),a.jsx("p",{children:"(B) for all other Confidential Information, during the Term and for five (5) years thereafter."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"d. Exceptions."}),a.jsx("p",{children:"The obligations under this Section shall not apply to Confidential Information that the Receiving Party can demonstrate by written records:"}),a.jsxs("ol",{className:"list-[lower-roman] pl-6 space-y-2",children:[a.jsx("li",{children:"was lawfully known to the Receiving Party without restriction prior to disclosure;"}),a.jsx("li",{children:"was rightfully received from a third party without breach of any confidentiality obligation;"}),a.jsx("li",{children:"becomes publicly available through no fault of the Receiving Party; or"}),a.jsx("li",{children:"was independently developed without use of or reference to the Confidential Information."})]}),a.jsx("p",{children:"Disclosure of Confidential Information may be made where required by applicable law, regulation, or order of a court, tribunal, or governmental authority, provided that, to the extent legally permissible, the Receiving Party provides prompt written notice to the Disclosing Party and cooperates in good faith to limit the scope of such disclosure."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"e. Return or Destruction."}),a.jsx("p",{children:"Upon written request of the Disclosing Party or upon termination or expiration of this Agreement, the Receiving Party shall promptly destroy or permanently erase all Confidential Information, including personal data, in its possession or control, except for copies retained in routine backup or disaster recovery systems, which shall remain subject to this Agreement. Upon request, the Receiving Party shall certify compliance in writing."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"f. Confidentiality of Agreement."}),a.jsx("p",{children:"Neither party shall disclose the terms of this Agreement, any Order Form, or any amendment thereto, except to its legal counsel, auditors, or professional advisors under a duty of confidentiality, or:"}),a.jsxs("ol",{className:"list-[lower-roman] pl-6 space-y-2",children:[a.jsx("li",{children:"as required by applicable law;"}),a.jsx("li",{children:"pursuant to a mutually agreed public announcement;"}),a.jsx("li",{children:"in connection with a bona fide corporate transaction or financing, subject to appropriate confidentiality protections; or"}),a.jsx("li",{children:"as otherwise expressly permitted under this Agreement."})]}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"10. Warranties; Disclaimers"}),a.jsx("p",{children:"OptOps AI warrants that the Services will materially conform to the Documentation. Except as expressly stated, the Services are provided “as is” and OptOps AI disclaims all other warranties to the maximum extent permitted under applicable Indian law."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"11. Indemnification"}),a.jsx("p",{children:"Customer shall defend, indemnify, and hold harmless OptOps AI from claims arising out of Customer’s breach of this Agreement or misuse of the Services. OptOps AI shall indemnify Customer against third-party intellectual property infringement claims relating to the Services, subject to the remedies provided herein."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"12. Limitation of Liability"}),a.jsx("p",{children:"To the maximum extent permitted under Indian law, neither party shall be liable for indirect, incidental, special, or consequential damages. OptOps AI’s aggregate liability shall not exceed the fees paid by Customer in the twelve (12) months preceding the event giving rise to the claim."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"13. Term and Termination"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"a. Term."}),a.jsx("p",{children:"The initial term of each Order Form shall commence on the effective date specified therein and shall continue for: (i) one (1) year, or (ii) such other period as expressly set forth in the applicable Order Form (the “Initial Term”). Each Order Form shall automatically renew for successive one (1) year periods (or such other renewal term specified in the Order Form) unless either party provides written notice of non-renewal at least sixty (60) days prior to the expiration of the then-current term."}),a.jsx("p",{children:"Unless otherwise agreed in writing, this Agreement shall automatically expire upon the expiration or termination of all active Order Forms. The Initial Term together with any renew
4704al terms shall collectively be referred to as the “Term.”"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"b. Termination for Cause."}),a.jsx("p",{children:"In the event of a material breach of this Agreement by a party (the “Breaching Party”), the non-breaching party (the “Non-Breaching Party”) may terminate this Agreement and any affected Order Form by providing written notice specifying the nature of the breach. If such breach is capable of cure and is not cured within thirty (30) days from receipt of such notice, the termination shall become effective upon expiration of the cure period. If the breach is not capable of cure, termination shall be effective immediately upon receipt of notice."}),a.jsx("p",{children:"Notwithstanding anything to the contrary, where Customer is using any Free Services, OptOps AI may terminate such Free Services and/or this Agreement at any time, with or without cause, and with or without prior notice."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"c. Termination Upon Insolvency."}),a.jsx("p",{children:"Either party may terminate this Agreement immediately upon written notice if the other party:"}),a.jsxs("ol",{className:"list-[lower-roman] pl-6 space-y-2",children:[a.jsx("li",{children:"becomes insolvent or is unable to pay its debts as they fall due;"}),a.jsx("li",{children:"becomes subject to any insolvency, liquidation, resolution, or similar proceeding under the Insolvency and Bankruptcy Code, 2016, or any applicable law, and such proceeding is not stayed or dismissed within ninety (90) days;"}),a.jsx("li",{children:"ceases or substantially discontinues its business operations; or"}),a.jsx("li",{children:"has a receiver, administrator, or similar authority appointed over its assets or business."})]}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"d. Suspension of Services."}),a.jsx("p",{children:"OptOps AI may suspend or restrict Customer’s or any User’s access to the Services, in whole or in part, upon written or electronic notice, if:"}),a.jsxs("ol",{className:"list-[lower-roman] pl-6 space-y-2",children:[a.jsx("li",{children:"OptOps AI reasonably determines that suspension is necessary to prevent a threat to the security, integrity, or availability of the Services, provided that access shall be restored promptly upon resolution of such threat;"}),a.jsx("li",{children:"Customer breaches any representation, warranty, or obligation under this Agreement; or"}),a.jsx("li",{children:"any undisputed payment due under an Order Form remains unpaid for thirty (30) days after its due date."})]}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"e. Outstanding Fees and Refunds."}),a.jsx("p",{children:"Termination or expiration of this Agreement shall not relieve Customer of its obligation to pay any fees accrued or payable prior to the effective date of termination."}),a.jsx("p",{children:"If Customer terminates this Agreement pursuant to Section 11(b) or 11(c), OptOps AI shall refund any prepaid fees on a pro-rata basis for the unused portion of the then-current subscription term under the terminated Order Form(s)."}),a.jsx("p",{children:"If OptOps AI terminates this Agreement pursuant to Sections 11(b), 11(c), or 11(d), all outstanding amounts payable by Customer under this Agreement and any Order Form shall become immediately due and payable."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"f. Effect of Expiration or Termination."}),a.jsx("p",{children:"i. Upon expiration or termination of this Agreement or any Order Form:"}),a.jsx("p",{children:"all rights granted to Customer and its Users to access and use the Services shall immediately cease;"}),a.jsx("p",{children:"ii. Customer and its Users shall promptly discontinue all use of the Services; and"}),a.jsx("p",{children:"iii. each party shall comply with its obligations regarding return or destruction of Confidential Information in accordance with this Agreement."}),a.jsx("p",{children:"For clarity, Customer’s right to use the Services is governed by both this Agreement and the applicable Order Form. Upon expiration or termination of an Order Form, Customer’s right to use the Services under such Order Form shall automatically terminate, irrespective of whether this Agreement remains in effect."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"g. Survival."}),a.jsx("p",{children:"All provisions of this Agreement which by their nature are intended to survive expiration or termination, including but not limited to provisions relating to fees, confidentiality, data protection, intellectual property, limitation of liability, indemnification, governing law, dispute resolution, and survival, shall survive termination or expiration of this Agreement to the extent necessary to give them effect."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"14. Reseller Orders"}),a.jsx("p",{children:"If Customer purchases the Services through an authorized reseller, reseller-specific provisions apply as set forth herein. Customer remains responsible for its use of the Services."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"15. Governing Law and Jurisdiction"}),a.jsx("p",{children:"This Agreement shall be governed by and construed in accordance with the laws of India. The courts at Gurugram, Haryana, shall have exclusive jurisdiction."}),a.jsx("h3",{className:"text-xl font-bold text-white mt-8 mb-4",children:"16. General"}),a.jsx("h4",{className:"text-lg font-bold text-slate-300",children:"a. Dispute Resolution and Jurisdiction"}),a.jsx("p",{children:"These Terms shall be governed by, construed and enforced in accordance with the laws of India. You hereby consent and submit that the Courts of Gurugram, Haryana, India shall have the exclusive jurisdiction for any action arising out of these Terms. If any provision of these Terms are held to be invalid, unlawful, void, or for any reason unenforceable, then that provision shall be deemed severable for this agreement and shall not affect the validity and enforceability of any remaining provisions. This would still be considered as a complete agreement between the parties relating to the matters contained herein."}),a.jsx("p",{children:"In case of dispute between you and the , you undertake not to involve the Company and you agree to resolve the dispute amongst your self and the brand. Neither the Company nor its representative shall act as a mediator for any dispute between you and the brand."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"b. Severability."}),a.jsx("p",{children:"If any provision of this Agreement is, for any reason, held to be invalid or unenforceable, the other provisions of this Agreement will remain enforceable, and the invalid or unenforceable provision 
4704will be deemed modified so that it is valid and enforceable to the maximum extent permitted by law."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"c. Waiver; Remedies."}),a.jsx("p",{children:"Any waiver or failure to enforce any provision of this Agreement on one occasion will not be deemed a waiver of any other provision or of such provision on any other occasion. Other than as expressly stated herein, the remedies provided herein are in addition to, and not exclusive of, any other remedies of a party at law or in equity."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"d. Entire Agreement."}),a.jsx("p",{children:"To the maximum extent permitted by applicable law, this Agreement, including all Order Forms and together with the Service Level Agreement, schedules, annexes, and documents referenced herein, constitute the entire agreement between the parties as to its subject matter, and supersede all previous and contemporaneous agreements, proposals or representations, written or oral, concerning the subject matter of this Agreement. No representation, undertaking or promise shall be taken to have been given or be implied from anything said or written in negotiations between the parties prior to this Agreement except as expressly stated in this Agreement. Except as provided in this Agreement, no modification, amendment, or waiver of any provision of this Agreement (including any Order Form) shall be effective unless in writing and signed by both parties (which may include electronic signatures and/or acceptance of such amendments or waivers via a “click-through” or other similar form of electronic acceptance as provided in herein). Customer acknowledges and agrees that its agreement hereunder is not contingent upon the delivery of any future functionality or features not specified herein or in an Order Form or dependent upon any oral or written, public or private comments made by OptOps AI with respect to future functionality or features for the Services. In the event of any conflict between the provisions in these Terms of Service and any Order Form, the terms of such Order Form shall prevail. No terms or conditions stated in a Customer purchase order or in any other Customer order documentation shall be incorporated into or form any part of this Agreement, and all such terms or conditions shall be null and void."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"e. No Assignment."}),a.jsx("p",{children:"Neither party will assign, subcontract, delegate, or otherwise transfer this Agreement, or its rights and obligations herein, without obtaining the prior written consent of the other party, and any attempted assignment, subcontract, delegation, or transfer in violation of the foregoing will be null and void; provided, however, that either party may assign this Agreement in connection with a merger, acquisition, reorganization or change of control, including without limitation a sale of all or substantially all of its assets, stock or business to which this Agreement relates. The terms of this Agreement will be binding upon the parties and their respective successors and permitted assigns."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"f. Force Majeure."}),a.jsx("p",{children:"Any delay in the performance of any duties or obligations of either party (except the payment of money owed) will not be considered a breach of this Agreement if such delay is caused by a civil disturbance, war, terrorist attack, embargo, government action or restriction, act of God, sabotage, fluctuation or non-availability of electrical power, labor dispute, shortage of materials, fire, earthquake, flood, pandemic, or any other event beyond the control of such party, provided that such party uses reasonable efforts, under the circumstances, to notify the other party of the cause of such delay and to resume performance as soon as possible. If an event of force majeure prevents OptOps AI from providing the Services for thirty (30) days, Customer may cancel this Agreement and receive a refund of pre-paid fees paid for that period of time for which services are not provided."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"g. Independent Contractors."}),a.jsx("p",{children:"OptOps AI’s relationship to Customer is that of an independent contractor, and neither party is an agent or partner of the other. Neither party will have, and will not represent to any third party that it has, any authority to act on behalf of the other."}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"h. Notices."}),a.jsx("p",{children:"All notices provided by OptOps AI to Customer under this Agreement may be delivered in writing (a) by electronic mail to the electronic mail address provided by Customer when signing up for the Services; or (b) delivered by registered or certified mail, postage prepaid, return receipt requested or by nationally recognized overnight courier service. All notices provided by Customer to OptOps AI under this Agreement may be delivered in writing (i) by electronic mail XXXXX; or (ii) delivered by registered or certified mail, postage prepaid, return receipt requested or by nationally recognized overnight courier service to the service address of:"}),a.jsxs("address",{className:"not-italic block mt-2",children:["OptOps Ai Private Ltd",a.jsx("br",{}),"82, Sector 44, Gurugram",a.jsx("br",{}),"122001"]}),a.jsx("h4",{className:"text-lg font-bold text-slate-300 mt-4",children:"i. Construction."}),a.jsx("p",{children:"The titles of the sections of this Agreement are for convenience of reference only and are not to be considered in construing this Agreement. Unless the context of this Agreement clearly requires otherwise: (i) references to the plural include the singular, the singular the plural, and the part the whole, (ii) “or” has the inclusive meaning frequently identified with the phrase “and/or,” (iii) “including” has the inclusive meaning frequently identified with the phrase “including but not limited to” or “including without limitation,” (iv) references to “hereunder,” “herein” or “hereof” relate to this Agreement as a whole, and (v) references to “Sections” or “Subsections” in this Agreement refer to sections and subsections of this Agreement. Any reference in this Agreement to any statute, rule, regulation or agreement, including this Agreement, shall be deemed to include such statute, rule, regulation or agreement as it may be modified, varied, amended or supplemented from time to time. The parties agree that this Agreement shall be fairly interpreted in accordance with its terms without any strict construction in favor of or against either party and that ambiguities shall not be interpreted against the drafting party."})]})})]}),DO=()=>(j.useEffect(()=>{document.title="Page Not Found — OptOps";let n=document.head.querySelector('meta[name="robots"]');return n||(n=document.createElement("meta"),n.setAttribute("name","robots"),document.head.appendChild(n)),n.setAttribute("content","noindex"),()=>{n.parentNode&&n.parentNode.removeChild(n)}},[]),a.jsx(ht,{children:a.jsx(Kt,{eyebrow:"404",title:"This page doesn't exist",subt
4704itle:"The page you're looking for was moved, renamed, or never provisioned. Unlike your cluster capacity, we can't overprovision URLs.",actions:a.jsxs(a.Fragment,{children:[a.jsx(ie,{to:"/",className:"bg-primary text-white px-8 py-3 rounded-xl font-bold neon-glow hover:scale-[1.02] transition-transform",children:"Back to Home"}),a.jsx("a",{href:ut,className:"bg-white/5 border border-white/10 text-white px-8 py-3 rounded-xl font-bold hover:bg-white/10 transition-colors",children:"Book a Demo"})]})})})),zO=()=>{const{pathname:n,hash:s}=gn();return j.useEffect(()=>{s||window.scrollTo(0,0)},[n,s]),null};function RO(){return eO(),a.jsxs(a.Fragment,{children:[a.jsx(zO,{}),a.jsxs(a2,{children:[a.jsx(Te,{path:"/",element:a.jsx(R4,{})}),a.jsx(Te,{path:"/bookdemo",element:a.jsx(f3,{})}),a.jsx(Te,{path:"/book",element:a.jsx(al,{to:ut})}),a.jsx(Te,{path:"/demo",element:a.jsx(al,{to:ut})}),a.jsx(Te,{path:"/schedule",element:a.jsx(al,{to:ut})}),a.jsx(Te,{path:"/book-demo",element:a.jsx(al,{to:ut})}),a.jsx(Te,{path:"/case-studies",element:a.jsx(g3,{})}),a.jsx(Te,{path:"/live-migration",element:a.jsx(n0,{})}),a.jsx(Te,{path:"/spot-automation",element:a.jsx(a0,{})}),a.jsx(Te,{path:"/node-consolidation",element:a.jsx(s0,{})}),a.jsx(Te,{path:"/pod-rightsizing",element:a.jsx(i0,{})}),a.jsx(Te,{path:"/finops-visibility",element:a.jsx(l0,{})}),a.jsx(Te,{path:"/hpc",element:a.jsx(m4,{})}),a.jsx(Te,{path:"/security",element:a.jsx(c0,{})}),a.jsx(Te,{path:"/contact-sales",element:a.jsx(Hi,{to:"/bookdemo",replace:!0})}),a.jsx(Te,{path:"/partner-portal",element:a.jsx(Hi,{to:"/company/partner-program",replace:!0})}),a.jsx(Te,{path:"/company",element:a.jsx(b3,{})}),a.jsx(Te,{path:"/company/about",element:a.jsx(x3,{})}),a.jsx(Te,{path:"/company/careers",element:a.jsx(Hi,{to:"/company",replace:!0})}),a.jsx(Te,{path:"/company/newsroom",element:a.jsx(Hi,{to:"/company",replace:!0})}),a.jsx(Te,{path:"/company/partner-program",element:a.jsx(v3,{})}),a.jsx(Te,{path:"/company/contact-us",element:a.jsx(w3,{})}),a.jsx(Te,{path:"/resources",element:a.jsx(k3,{})}),a.jsx(Te,{path:"/resources/what-we-do",element:a.jsx(Hi,{to:"/resources/key-platform-features",replace:!0})}),a.jsx(Te,{path:"/resources/key-platform-features",element:a.jsx(S3,{})}),a.jsx(Te,{path:"/resources/get-started",element:a.jsx(A3,{})}),a.jsx(Te,{path:"/resources/blogs",element:a.jsx(J3,{})}),a.jsx(Te,{path:"/resources/blogs/:slug",element:a.jsx(nO,{})}),a.jsx(Te,{path:"/resources/roi-calculator",element:a.jsx(TO,{})}),a.jsx(Te,{path:"/privacy-policy",element:a.jsx(OO,{})}),a.jsx(Te,{path:"/terms-of-service",element:a.jsx(EO,{})}),a.jsx(Te,{path:"*",element:a.jsx(DO,{})})]}),a.jsx(CO,{})]})}function MO(){return a.jsxs(A2,{children:[a.jsx(RO,{}),a.jsx(ik,{})]})}Xj.createRoot(document.getElementById("root")).render(a.jsx(j.StrictMode,{children:a.jsx(MO,{})}));

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.