From 11ec4a2208bfbf24027d182ef65badb6f824d1d4 Mon Sep 17 00:00:00 2001 From: Bryan Helmkamp Date: Tue, 21 Apr 2026 14:44:14 -0400 Subject: [PATCH] feat(runs): prepend fabro auth login to blank-slate quick-start on github-auth servers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On a GitHub-auth-only server, `fabro repo init` fails for a fresh CLI because no credential is present yet, so the onboarding hint was wrong for those installs. Fetch /auth/config alongside the board query and, when `methods` contains "github", prefix the quick-start with `fabro auth login`. The copy-to-clipboard target is derived from the same list so it stays in sync. Falls open to the prior two-line hint if the config call fails — the blank slate must not gate on that request. Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/fabro-web/app/routes/runs.tsx | 41 +- .../fabro-spa/assets/assets/entry-gdjqj332.js | 2402 +++++++++++++++++ .../fabro-spa/assets/assets/entry-gxmwegzd.js | 2402 ----------------- lib/crates/fabro-spa/assets/index.html | 2 +- 4 files changed, 2430 insertions(+), 2417 deletions(-) create mode 100644 lib/crates/fabro-spa/assets/assets/entry-gdjqj332.js delete mode 100644 lib/crates/fabro-spa/assets/assets/entry-gxmwegzd.js diff --git a/apps/fabro-web/app/routes/runs.tsx b/apps/fabro-web/app/routes/runs.tsx index 5e184ec42..01559f73f 100644 --- a/apps/fabro-web/app/routes/runs.tsx +++ b/apps/fabro-web/app/routes/runs.tsx @@ -20,7 +20,7 @@ import { import { CSS } from "@dnd-kit/utilities"; import { ciConfig, columnStatusDisplay, deriveCiStatus, mapRunListItem } from "../data/runs"; import type { CiStatus, CheckRun, CheckStatus, RunItem, RunWithStatus, ColumnStatus } from "../data/runs"; -import { apiPaginatedJson } from "../api"; +import { apiPaginatedJson, getAuthConfig } from "../api"; import { EmptyState } from "../components/state"; import type { PaginatedBoardRunList } from "@qltysh/fabro-api-client"; @@ -110,11 +110,19 @@ export function buildBoardColumns(response: BoardRunsResponse): Column[] { } export async function loader({ request }: any) { - const response = await apiPaginatedJson< - PaginatedBoardRunList["data"][number], - { columns: BoardRunsResponse["columns"] } - >("/boards/runs", { request }); - return { columns: buildBoardColumns(response) }; + const [response, authConfig] = await Promise.all([ + apiPaginatedJson< + PaginatedBoardRunList["data"][number], + { columns: BoardRunsResponse["columns"] } + >("/boards/runs", { request }), + // Failure here only affects the blank-slate quick-start hint. + // Default to no auth step rather than blocking the page. + getAuthConfig().catch(() => ({ methods: [] as string[] })), + ]); + return { + columns: buildBoardColumns(response), + hasGitHubAuth: authConfig.methods.includes("github"), + }; } function boardLifecycleStatusLabel(run: Pick): string | null { @@ -578,8 +586,6 @@ function TerminalLine({ prompt, command }: { prompt: string; command: string }) ); } -const GETTING_STARTED_COMMANDS = "fabro repo init && fabro run hello"; - function CopyButton({ text }: { text: string }) { const [copied, setCopied] = useState(false); @@ -610,7 +616,12 @@ function CopyButton({ text }: { text: string }) { ); } -function RunsLandingEmpty() { +function RunsLandingEmpty({ hasGitHubAuth }: { hasGitHubAuth: boolean }) { + const quickStartCommands = [ + hasGitHubAuth ? "fabro auth login" : null, + "fabro repo init", + "fabro run hello", + ].filter((command): command is string => command !== null); return (
@@ -625,10 +636,11 @@ function RunsLandingEmpty() {
- - + {quickStartCommands.map((command) => ( + + ))}
- +
@@ -672,6 +684,7 @@ function RunsLandingEmpty() { export default function Runs({ loaderData }: any) { const initialColumns = loaderData.columns; + const hasGitHubAuth: boolean = loaderData.hasGitHubAuth === true; const allRepos = [ ...new Set( initialColumns.flatMap((col: Column) => col.items.map((item: RunItem) => String(item.repo))), @@ -816,7 +829,7 @@ export default function Runs({ loaderData }: any) { ))} {totalRuns === 0 ? ( - + ) : filteredRuns === 0 ? (
{totalRuns === 0 ? ( - + ) : filteredRuns === 0 ? (
{(function(){function Z(y,Y0){Object.defineProperty(z.prototype,y,{get:function(){console.warn("%s(...) is deprecated in plain JavaScript React classes. %s",Y0[0],Y0[1])}})}function Y(y){if(y===null||typeof y!=="object")return null;return y=B1&&y[B1]||y["@@iterator"],typeof y==="function"?y:null}function Q(y,Y0){y=(y=y.constructor)&&(y.displayName||y.name)||"ReactClass";var F0=y+"."+Y0;R0[F0]||(console.error("Can't call %s on a component that is not yet mounted. This is a no-op, but it might indicate a bug in your application. Instead, assign to `this.state` directly or define a `state = {};` class property with the desired state in the %s component.",Y0,y),R0[F0]=!0)}function z(y,Y0,F0){this.props=y,this.context=Y0,this.refs=n5,this.updater=F0||C1}function q(){}function B(y,Y0,F0){this.props=y,this.context=Y0,this.refs=n5,this.updater=F0||C1}function W(){}function $(y){return""+y}function U(y){try{$(y);var Y0=!1}catch(k0){Y0=!0}if(Y0){Y0=console;var F0=Y0.error,L0=typeof Symbol==="function"&&Symbol.toStringTag&&y[Symbol.toStringTag]||y.constructor.name||"Object";return F0.call(Y0,"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.",L0),$(y)}}function M(y){if(y==null)return null;if(typeof y==="function")return y.$$typeof===t6?null:y.displayName||y.name||null;if(typeof y==="string")return y;switch(y){case z0:return"Fragment";case q0:return"Profiler";case f:return"StrictMode";case i0:return"Suspense";case H0:return"SuspenseList";case L1:return"Activity"}if(typeof y==="object")switch(typeof y.tag==="number"&&console.error("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),y.$$typeof){case n:return"Portal";case M0:return y.displayName||"Context";case N0:return(y._context.displayName||"Context")+".Consumer";case I0:var Y0=y.render;return y=y.displayName,y||(y=Y0.displayName||Y0.name||"",y=y!==""?"ForwardRef("+y+")":"ForwardRef"),y;case l0:return Y0=y.displayName||null,Y0!==null?Y0:M(y.type)||"Memo";case t0:Y0=y._payload,y=y._init;try{return M(y(Y0))}catch(F0){}}return null}function w(y){if(y===z0)return"<>";if(typeof y==="object"&&y!==null&&y.$$typeof===t0)return"<...>";try{var Y0=M(y);return Y0?"<"+Y0+">":"<...>"}catch(F0){return"<...>"}}function O(){var y=W1.A;return y===null?null:y.getOwner()}function _(){return Error("react-stack-top-frame")}function F(y){if(w4.call(y,"key")){var Y0=Object.getOwnPropertyDescriptor(y,"key").get;if(Y0&&Y0.isReactWarning)return!1}return y.key!==void 0}function P(y,Y0){function F0(){P6||(P6=!0,console.error("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)",Y0))}F0.isReactWarning=!0,Object.defineProperty(y,"key",{get:F0,configurable:!0})}function R(){var y=M(this.type);return c4[y]||(c4[y]=!0,console.error("Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.")),y=this.props.ref,y!==void 0?y:null}function v(y,Y0,F0,L0,k0,Y1){var x0=F0.ref;return y={$$typeof:$0,type:y,key:Y0,props:F0,_owner:L0},(x0!==void 0?x0:null)!==null?Object.defineProperty(y,"ref",{enumerable:!1,get:R}):Object.defineProperty(y,"ref",{enumerable:!1,value:null}),y._store={},Object.defineProperty(y._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:0}),Object.defineProperty(y,"_debugInfo",{configurable:!1,enumerable:!1,writable:!0,value:null}),Object.defineProperty(y,"_debugStack",{configurable:!1,enumerable:!1,writable:!0,value:k0}),Object.defineProperty(y,"_debugTask",{configurable:!1,enumerable:!1,writable:!0,value:Y1}),Object.freeze&&(Object.freeze(y.props),Object.freeze(y)),y}function L(y,Y0){return Y0=v(y.type,Y0,y.props,y._owner,y._debugStack,y._debugTask),y._store&&(Y0._store.validated=y._store.validated),Y0}function T(y){C(y)?y._store&&(y._store.validated=1):typeof y==="object"&&y!==null&&y.$$typeof===t0&&(y._payload.status==="fulfilled"?C(y._payload.value)&&y._payload.value._store&&(y._payload.value._store.validated=1):y._store&&(y._store.validated=1))}function C(y){return typeof y==="object"&&y!==null&&y.$$typeof===$0}function E(y){var Y0={"=":"=0",":":"=2"};return"$"+y.replace(/[=:]/g,function(F0){return Y0[F0]})}function b(y,Y0){return typeof y==="object"&&y!==null&&y.key!=null?(U(y.key),E(""+y.key)):Y0.toString(36)}function S(y){switch(y.status){case"fulfilled":return y.value;case"rejected":throw y.reason;default:switch(typeof y.status==="string"?y.then(W,W):(y.status="pending",y.then(function(Y0){y.status==="pending"&&(y.status="fulfilled",y.value=Y0)},function(Y0){y.status==="pending"&&(y.status="rejected",y.reason=Y0)})),y.status){case"fulfilled":return y.value;case"rejected":throw y.reason}}throw y}function j(y,Y0,F0,L0,k0){var Y1=typeof y;if(Y1==="undefined"||Y1==="boolean")y=null;var x0=!1;if(y===null)x0=!0;else switch(Y1){case"bigint":case"string":case"number":x0=!0;break;case"object":switch(y.$$typeof){case $0:case n:x0=!0;break;case t0:return x0=y._init,j(x0(y._payload),Y0,F0,L0,k0)}}if(x0){x0=y,k0=k0(x0);var Q1=L0===""?"."+b(x0,0):L0;return w1(k0)?(F0="",Q1!=null&&(F0=Q1.replace(Z7,"$&/")+"/"),j(k0,Y0,F0,"",function(O5){return O5})):k0!=null&&(C(k0)&&(k0.key!=null&&(x0&&x0.key===k0.key||U(k0.key)),F0=L(k0,F0+(k0.key==null||x0&&x0.key===k0.key?"":(""+k0.key).replace(Z7,"$&/")+"/")+Q1),L0!==""&&x0!=null&&C(x0)&&x0.key==null&&x0._store&&!x0._store.validated&&(F0._store.validated=2),k0=F0),Y0.push(k0)),1}if(x0=0,Q1=L0===""?".":L0+":",w1(y))for(var j0=0;j0 import('./MyComponent')) + +Did you accidentally put curly braces around the import?`,Y0),"default"in Y0||console.error(`lazy: Expected the result of a dynamic import() call. Instead received: %s + +Your code should look like: + const MyComponent = lazy(() => import('./MyComponent'))`,Y0),Y0.default;throw y._result}function k(){var y=W1.H;return y===null&&console.error(`Invalid hook call. Hooks can only be called inside of the body of a function component. This could happen for one of the following reasons: +1. You might have mismatching versions of React and the renderer (such as React DOM) +2. You might be breaking the Rules of Hooks +3. You might have more than one copy of React in the same app +See https://react.dev/link/invalid-hook-call for tips about how to debug and fix this problem.`),y}function o(){W1.asyncTransitions--}function X0(y){if(N4===null)try{var Y0=("require"+Math.random()).slice(0,7);N4=(YU&&YU[Y0]).call(YU,"timers").setImmediate}catch(F0){N4=function(L0){$2===!1&&($2=!0,typeof MessageChannel>"u"&&console.error("This browser does not have a MessageChannel implementation, so enqueuing tasks via await act(async () => ...) will fail. Please file an issue at https://github.com/facebook/react/issues if you encounter this warning."));var k0=new MessageChannel;k0.port1.onmessage=L0,k0.port2.postMessage(void 0)}}return N4(y)}function W0(y){return 1 ...) without await. This could lead to unexpected testing behaviour, interleaving multiple act calls and mixing their scopes. You should - await act(async () => ...);"))}),{then:function(j0,O5){k0=!0,x0.then(function(K5){if(e(Y0,F0),F0===0){try{Z0(L0),X0(function(){return c(K5,j0,O5)})}catch(e5){W1.thrownErrors.push(e5)}if(0 ...)"))}),W1.actQueue=null),0W1.recentlyCreatedOwnerStacks++;return v(y,k0,L0,O(),j0?Error("react-stack-top-frame"):x2,j0?S1(w(y)):V6)},_a.createRef=function(){var y={current:null};return Object.seal(y),y},_a.forwardRef=function(y){y!=null&&y.$$typeof===l0?console.error("forwardRef requires a render function but received a `memo` component. Instead of forwardRef(memo(...)), use memo(forwardRef(...))."):typeof y!=="function"?console.error("forwardRef requires a render function but was given %s.",y===null?"null":typeof y):y.length!==0&&y.length!==2&&console.error("forwardRef render functions accept exactly two parameters: props and ref. %s",y.length===1?"Did you forget to use the ref parameter?":"Any additional parameter will be undefined."),y!=null&&y.defaultProps!=null&&console.error("forwardRef render functions do not support defaultProps. Did you accidentally pass a React component?");var Y0={$$typeof:I0,render:y},F0;return Object.defineProperty(Y0,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(L0){F0=L0,y.name||y.displayName||(Object.defineProperty(y,"name",{value:L0}),y.displayName=L0)}}),Y0},_a.isValidElement=C,_a.lazy=function(y){y={_status:-1,_result:y};var Y0={$$typeof:t0,_payload:y,_init:s},F0={name:"lazy",start:-1,end:-1,value:null,owner:null,debugStack:Error("react-stack-top-frame"),debugTask:console.createTask?console.createTask("lazy()"):null};return y._ioInfo=F0,Y0._debugInfo=[{awaited:F0}],Y0},_a.memo=function(y,Y0){y==null&&console.error("memo: The first argument must be a component. Instead received: %s",y===null?"null":typeof y),Y0={$$typeof:l0,type:y,compare:Y0===void 0?null:Y0};var F0;return Object.defineProperty(Y0,"displayName",{enumerable:!1,configurable:!0,get:function(){return F0},set:function(L0){F0=L0,y.name||y.displayName||(Object.defineProperty(y,"name",{value:L0}),y.displayName=L0)}}),Y0},_a.startTransition=function(y){var Y0=W1.T,F0={};F0._updatedFibers=new Set,W1.T=F0;try{var L0=y(),k0=W1.S;k0!==null&&k0(F0,L0),typeof L0==="object"&&L0!==null&&typeof L0.then==="function"&&(W1.asyncTransitions++,L0.then(o,o),L0.then(W,v5))}catch(Y1){v5(Y1)}finally{Y0===null&&F0._updatedFibers&&(y=F0._updatedFibers.size,F0._updatedFibers.clear(),10{(function(){function Z(){if(E=!1,g){var c=Fa.unstable_now();o=c;var Z0=!0;try{Z:{T=!1,C&&(C=!1,S(s),s=-1),L=!0;var $0=v;try{Y:{B(c);for(R=Q(_);R!==null&&!(R.expirationTime>c&&$());){var n=R.callback;if(typeof n==="function"){R.callback=null,v=R.priorityLevel;var z0=n(R.expirationTime<=c);if(c=Fa.unstable_now(),typeof z0==="function"){R.callback=z0,B(c),Z0=!0;break Y}R===Q(_)&&z(_),B(c)}else z(_);R=Q(_)}if(R!==null)Z0=!0;else{var f=Q(F);f!==null&&U(W,f.startTime-c),Z0=!1}}break Z}finally{R=null,v=$0,L=!1}Z0=void 0}}finally{Z0?X0():g=!1}}}function Y(c,Z0){var $0=c.length;c.push(Z0);Z:for(;0<$0;){var n=$0-1>>>1,z0=c[n];if(0>>1;nq(N0,$0))M0q(I0,N0)?(c[n]=I0,c[M0]=$0,n=M0):(c[n]=N0,c[q0]=$0,n=q0);else if(M0q(I0,$0))c[n]=I0,c[M0]=$0,n=M0;else break Z}}return Z0}function q(c,Z0){var $0=c.sortIndex-Z0.sortIndex;return $0!==0?$0:c.id-Z0.id}function B(c){for(var Z0=Q(F);Z0!==null;){if(Z0.callback===null)z(F);else if(Z0.startTime<=c)z(F),Z0.sortIndex=Z0.expirationTime,Y(_,Z0);else break;Z0=Q(F)}}function W(c){if(C=!1,B(c),!T)if(Q(_)!==null)T=!0,g||(g=!0,X0());else{var Z0=Q(F);Z0!==null&&U(W,Z0.startTime-c)}}function $(){return E?!0:Fa.unstable_now()-oc||125n?(c.sortIndex=$0,Y(F,c),Q(_)===null&&c===Q(F)&&(C?(S(s),s=-1):C=!0,U(W,$0-n))):(c.sortIndex=z0,Y(_,c),T||L||(T=!0,g||(g=!0,X0()))),c},Fa.unstable_shouldYield=$,Fa.unstable_wrapCallback=function(c){var Z0=v;return function(){var $0=v;v=Z0;try{return c.apply(this,arguments)}finally{v=$0}}},typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var mI=D3((Aa)=>{var mF=h(J0());(function(){function Z(){}function Y(w){return""+w}function Q(w,O,_){var F=3` tag.%s',_),typeof w==="string"&&typeof O==="object"&&O!==null&&typeof O.as==="string"){_=O.as;var F=z(_,O.crossOrigin);$.d.L(w,_,{crossOrigin:F,integrity:typeof O.integrity==="string"?O.integrity:void 0,nonce:typeof O.nonce==="string"?O.nonce:void 0,type:typeof O.type==="string"?O.type:void 0,fetchPriority:typeof O.fetchPriority==="string"?O.fetchPriority:void 0,referrerPolicy:typeof O.referrerPolicy==="string"?O.referrerPolicy:void 0,imageSrcSet:typeof O.imageSrcSet==="string"?O.imageSrcSet:void 0,imageSizes:typeof O.imageSizes==="string"?O.imageSizes:void 0,media:typeof O.media==="string"?O.media:void 0})}},Aa.preloadModule=function(w,O){var _="";typeof w==="string"&&w||(_+=" The `href` argument encountered was "+q(w)+"."),O!==void 0&&typeof O!=="object"?_+=" The `options` argument encountered was "+q(O)+".":O&&("as"in O)&&typeof O.as!=="string"&&(_+=" The `as` option encountered was "+q(O.as)+"."),_&&console.error('ReactDOM.preloadModule(): Expected two arguments, a non-empty `href` string and, optionally, an `options` object with an `as` property valid for a `` tag.%s',_),typeof w==="string"&&(O?(_=z(O.as,O.crossOrigin),$.d.m(w,{as:typeof O.as==="string"&&O.as!=="script"?O.as:void 0,crossOrigin:_,integrity:typeof O.integrity==="string"?O.integrity:void 0})):$.d.m(w))},Aa.requestFormReset=function(w){$.d.r(w)},Aa.unstable_batchedUpdates=function(w,O){return w(O)},Aa.useFormState=function(w,O,_){return W().useFormState(w,O,_)},Aa.useFormStatus=function(){return W().useHostTransitionStatus()},Aa.version="19.2.4",typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<"u"&&typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop==="function"&&__REACT_DEVTOOLS_GLOBAL_HOOK__.registerInternalModuleStop(Error())})()});var b3=D3((VQ0,uI)=>{var Pa=h(mI());uI.exports=Pa});var pI=D3((Va)=>{var a1=h(gI()),aQ=h(J0()),uF=h(b3());(function(){function Z(J,X){for(J=J.memoizedState;J!==null&&0=X.length)return G;var H=X[K],N=T2(J)?J.slice():E1({},J);return N[H]=Y(J[H],X,K+1,G),N}function Q(J,X,K){if(X.length!==K.length)console.warn("copyWithRename() expects paths of the same length");else{for(var G=0;G_8?console.error("Unexpected pop."):(X!==__[_8]&&console.error("Unexpected Fiber popped."),J.current=O_[_8],O_[_8]=null,__[_8]=null,_8--)}function W0(J,X,K){_8++,O_[_8]=J.current,__[_8]=K,J.current=X}function e(J){return J===null&&console.error("Expected host context to exist. This error is likely caused by a bug in React. Please file an issue."),J}function c(J,X){W0(I9,X,J),W0(aq,J,J),W0(E9,null,J);var K=X.nodeType;switch(K){case 9:case 11:K=K===9?"#document":"#fragment",X=(X=X.documentElement)?(X=X.namespaceURI)?VD(X):j8:j8;break;default:if(K=X.tagName,X=X.namespaceURI)X=VD(X),X=RD(X,K);else switch(K){case"svg":X=lQ;break;case"math":X=sG;break;default:X=j8}}K=K.toLowerCase(),K=NT(null,K),K={context:X,ancestorInfo:K},X0(E9,J),W0(E9,K,J)}function Z0(J){X0(E9,J),X0(aq,J),X0(I9,J)}function $0(){return e(E9.current)}function n(J){J.memoizedState!==null&&W0(t$,J,J);var X=e(E9.current),K=J.type,G=RD(X.context,K);K=NT(X.ancestorInfo,K),G={context:G,ancestorInfo:K},X!==G&&(W0(aq,J,J),W0(E9,G,J))}function z0(J){aq.current===J&&(X0(E9,J),X0(aq,J)),t$.current===J&&(X0(t$,J),hK._currentValue=IY)}function f(){}function q0(){if(sq===0){eD=console.log,Zb=console.info,Yb=console.warn,Jb=console.error,Qb=console.group,Xb=console.groupCollapsed,zb=console.groupEnd;var J={configurable:!0,enumerable:!0,value:f,writable:!0};Object.defineProperties(console,{info:J,log:J,warn:J,error:J,group:J,groupCollapsed:J,groupEnd:J})}sq++}function N0(){if(sq--,sq===0){var J={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:E1({},J,{value:eD}),info:E1({},J,{value:Zb}),warn:E1({},J,{value:Yb}),error:E1({},J,{value:Jb}),group:E1({},J,{value:Qb}),groupCollapsed:E1({},J,{value:Xb}),groupEnd:E1({},J,{value:zb})})}0>sq&&console.error("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}function M0(J){var X=Error.prepareStackTrace;if(Error.prepareStackTrace=void 0,J=J.stack,Error.prepareStackTrace=X,J.startsWith(`Error: react-stack-top-frame +`)&&(J=J.slice(29)),X=J.indexOf(` +`),X!==-1&&(J=J.slice(X+1)),X=J.indexOf("react_stack_bottom_frame"),X!==-1&&(X=J.lastIndexOf(` +`,X)),X!==-1)J=J.slice(0,X);else return"";return J}function I0(J){if(F_===void 0)try{throw Error()}catch(K){var X=K.stack.trim().match(/\n( *(at )?)/);F_=X&&X[1]||"",qb=-1)":-1A||I[N]!==a[A]){var i=` +`+I[N].replace(" at new "," at ");return J.displayName&&i.includes("")&&(i=i.replace("",J.displayName)),typeof J==="function"&&P_.set(J,i),i}while(1<=N&&0<=A);break}}}finally{A_=!1,U0.H=G,N0(),Error.prepareStackTrace=K}return I=(I=J?J.displayName||J.name:"")?I0(I):"",typeof J==="function"&&P_.set(J,I),I}function H0(J,X){switch(J.tag){case 26:case 27:case 5:return I0(J.type);case 16:return I0("Lazy");case 13:return J.child!==X&&X!==null?I0("Suspense Fallback"):I0("Suspense");case 19:return I0("SuspenseList");case 0:case 15:return i0(J.type,!1);case 11:return i0(J.type.render,!1);case 1:return i0(J.type,!0);case 31:return I0("Activity");default:return""}}function l0(J){try{var X="",K=null;do{X+=H0(J,K);var G=J._debugInfo;if(G)for(var H=G.length-1;0<=H;H--){var N=G[H];if(typeof N.name==="string"){var A=X;Z:{var{name:V,env:D,debugLocation:I}=N;if(I!=null){var a=M0(I),i=a.lastIndexOf(` +`),p=i===-1?a:a.slice(i+1);if(p.indexOf(V)!==-1){var K0=` +`+p;break Z}}K0=I0(V+(D?" ["+D+"]":""))}X=A+K0}}K=J,J=J.return}while(J);return X}catch(T0){return` +Error generating stack: `+T0.message+` +`+T0.stack}}function t0(J){return(J=J?J.displayName||J.name:"")?I0(J):""}function L1(){if(T4===null)return null;var J=T4._debugOwner;return J!=null?s(J):null}function B1(){if(T4===null)return"";var J=T4;try{var X="";switch(J.tag===6&&(J=J.return),J.tag){case 26:case 27:case 5:X+=I0(J.type);break;case 13:X+=I0("Suspense");break;case 19:X+=I0("SuspenseList");break;case 31:X+=I0("Activity");break;case 30:case 0:case 15:case 1:J._debugOwner||X!==""||(X+=t0(J.type));break;case 11:J._debugOwner||X!==""||(X+=t0(J.type.render))}for(;J;)if(typeof J.tag==="number"){var K=J;J=K._debugOwner;var G=K._debugStack;if(J&&G){var H=M0(G);H!==""&&(X+=` +`+H)}}else if(J.debugStack!=null){var N=J.debugStack;(J=J.owner)&&N&&(X+=` +`+M0(N))}else break;var A=X}catch(V){A=` +Error generating stack: `+V.message+` +`+V.stack}return A}function R0(J,X,K,G,H,N,A){var V=T4;C1(J);try{return J!==null&&J._debugTask?J._debugTask.run(X.bind(null,K,G,H,N,A)):X(K,G,H,N,A)}finally{C1(V)}throw Error("runWithFiberInDEV should never be called in production. This is a bug in React.")}function C1(J){U0.getCurrentStack=J===null?null:B1,_3=!1,T4=J}function Q5(J){return typeof Symbol==="function"&&Symbol.toStringTag&&J[Symbol.toStringTag]||J.constructor.name||"Object"}function n5(J){try{return N5(J),!1}catch(X){return!0}}function N5(J){return""+J}function w1(J,X){if(n5(J))return console.error("The provided `%s` attribute is an unsupported type %s. This value must be coerced to a string before using it here.",X,Q5(J)),N5(J)}function t6(J,X){if(n5(J))return console.error("The provided `%s` CSS property is an unsupported type %s. This value must be coerced to a string before using it here.",X,Q5(J)),N5(J)}function W1(J){if(n5(J))return console.error("Form field values (value, checked, defaultValue, or defaultChecked props) must be strings, not %s. This value must be coerced to a string before using it here.",Q5(J)),N5(J)}function w4(J){if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u")return!1;var X=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(X.isDisabled)return!0;if(!X.supportsFiber)return console.error("The installed version of React DevTools is too old and will not work with the current version of React. Please update React DevTools. https://react.dev/link/react-devtools"),!0;try{MQ=X.inject(J),F7=X}catch(K){console.error("React instrumentation encountered an error: %o.",K)}return X.checkDCE?!0:!1}function S1(J){if(typeof kl==="function"&&xl(J),F7&&typeof F7.setStrictMode==="function")try{F7.setStrictMode(MQ,J)}catch(X){F3||(F3=!0,console.error("React instrumentation encountered an error: %o",X))}}function P6(J){return J>>>=0,J===0?32:31-(fl(J)/hl|0)|0}function e2(J){var X=J&42;if(X!==0)return X;switch(J&-J){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 J&261888;case 262144:case 524288:case 1048576:case 2097152:return J&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return J&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return console.error("Should have found matching lanes. This is a bug in React."),J}}function c4(J,X,K){var G=J.pendingLanes;if(G===0)return 0;var H=0,N=J.suspendedLanes,A=J.pingedLanes;J=J.warmLanes;var V=G&134217727;return V!==0?(G=V&~N,G!==0?H=e2(G):(A&=V,A!==0?H=e2(A):K||(K=V&~J,K!==0&&(H=e2(K))))):(V=G&~N,V!==0?H=e2(V):A!==0?H=e2(A):K||(K=G&~J,K!==0&&(H=e2(K)))),H===0?0:X!==0&&X!==H&&(X&N)===0&&(N=H&-H,K=X&-X,N>=K||N===32&&(K&4194048)!==0)?X:H}function x2(J,X){return(J.pendingLanes&~(J.suspendedLanes&~J.pingedLanes)&X)===0}function V6(J,X){switch(J){case 1:case 2:case 4:case 8:case 64:return X+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 X+5000;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return console.error("Should have found matching lanes. This is a bug in React."),-1}}function R6(){var J=ZG;return ZG<<=1,(ZG&62914560)===0&&(ZG=4194304),J}function Z7(J){for(var X=[],K=0;31>K;K++)X.push(J);return X}function v5(J,X){J.pendingLanes|=X,X!==268435456&&(J.suspendedLanes=0,J.pingedLanes=0,J.warmLanes=0)}function $2(J,X,K,G,H,N){var A=J.pendingLanes;J.pendingLanes=K,J.suspendedLanes=0,J.pingedLanes=0,J.warmLanes=0,J.expiredLanes&=K,J.entangledLanes&=K,J.errorRecoveryDisabledLanes&=K,J.shellSuspendCounter=0;var{entanglements:V,expirationTimes:D,hiddenUpdates:I}=J;for(K=A&~K;0"u")return null;try{return J.activeElement||J.body}catch(X){return J.body}}function S0(J){return J.replace(cl,function(X){return"\\"+X.charCodeAt(0).toString(16)+" "})}function c0(J,X){X.checked===void 0||X.defaultChecked===void 0||Ub||(console.error("%s contains an input of type %s with both checked and defaultChecked props. Input elements must be either controlled or uncontrolled (specify either the checked prop, or the defaultChecked prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",L1()||"A component",X.type),Ub=!0),X.value===void 0||X.defaultValue===void 0||Gb||(console.error("%s contains an input of type %s with both value and defaultValue props. Input elements must be either controlled or uncontrolled (specify either the value prop, or the defaultValue prop, but not both). Decide between using a controlled or uncontrolled input element and remove one of these props. More info: https://react.dev/link/controlled-components",L1()||"A component",X.type),Gb=!0)}function r0(J,X,K,G,H,N,A,V){if(J.name="",A!=null&&typeof A!=="function"&&typeof A!=="symbol"&&typeof A!=="boolean"?(w1(A,"type"),J.type=A):J.removeAttribute("type"),X!=null)if(A==="number"){if(X===0&&J.value===""||J.value!=X)J.value=""+t(X)}else J.value!==""+t(X)&&(J.value=""+t(X));else A!=="submit"&&A!=="reset"||J.removeAttribute("value");X!=null?d0(J,A,t(X)):K!=null?d0(J,A,t(K)):G!=null&&J.removeAttribute("value"),H==null&&N!=null&&(J.defaultChecked=!!N),H!=null&&(J.checked=H&&typeof H!=="function"&&typeof H!=="symbol"),V!=null&&typeof V!=="function"&&typeof V!=="symbol"&&typeof V!=="boolean"?(w1(V,"name"),J.name=""+t(V)):J.removeAttribute("name")}function J1(J,X,K,G,H,N,A,V){if(N!=null&&typeof N!=="function"&&typeof N!=="symbol"&&typeof N!=="boolean"&&(w1(N,"type"),J.type=N),X!=null||K!=null){if(!(N!=="submit"&&N!=="reset"||X!==void 0&&X!==null)){P0(J);return}K=K!=null?""+t(K):"",X=X!=null?""+t(X):K,V||X===J.value||(J.value=X),J.defaultValue=X}G=G!=null?G:H,G=typeof G!=="function"&&typeof G!=="symbol"&&!!G,J.checked=V?J.checked:!!G,J.defaultChecked=!!G,A!=null&&typeof A!=="function"&&typeof A!=="symbol"&&typeof A!=="boolean"&&(w1(A,"name"),J.name=A),P0(J)}function d0(J,X,K){X==="number"&&y0(J.ownerDocument)===J||J.defaultValue===""+K||(J.defaultValue=""+K)}function p1(J,X){X.value==null&&(typeof X.children==="object"&&X.children!==null?aQ.Children.forEach(X.children,function(K){K==null||typeof K==="string"||typeof K==="number"||typeof K==="bigint"||Hb||(Hb=!0,console.error("Cannot infer the option value of complex children. Pass a `value` prop or use a plain string as children to